mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-04-02 19:42:05 -04:00
Added the combo and proc systems Added scripts for most weaponskill and spells as well as some abilities and status effects Added support for multihit attacks Added AbilityState for abilities Added hiteffects that change based on an attack's parameters Added positionals Changed how targeting works for battlecommands Fixed bug that occurred when moving or swapping hotbar commands Fixed bug that occurred when losing status effects
126 lines
4.9 KiB
C#
126 lines
4.9 KiB
C#
using FFXIVClassic.Common;
|
|
using System;
|
|
using System.IO;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
namespace FFXIVClassic_Map_Server.packets.send.actor.battle
|
|
{
|
|
class BattleActionX10Packet
|
|
{
|
|
public const ushort OPCODE = 0x013A;
|
|
public const uint PACKET_SIZE = 0xD8;
|
|
|
|
public static SubPacket BuildPacket(uint sourceActorId, uint animationId, ushort commandId, BattleAction[] actionList, ref int listOffset)
|
|
{
|
|
byte[] data = new byte[PACKET_SIZE - 0x20];
|
|
|
|
using (MemoryStream mem = new MemoryStream(data))
|
|
{
|
|
using (BinaryWriter binWriter = new BinaryWriter(mem))
|
|
{
|
|
int max;
|
|
if (actionList.Length - listOffset <= 10)
|
|
max = actionList.Length - listOffset;
|
|
else
|
|
max = 10;
|
|
|
|
binWriter.Write((UInt32)sourceActorId);
|
|
binWriter.Write((UInt32)animationId);
|
|
|
|
//Missing... last value is float, string in here as well?
|
|
|
|
binWriter.Seek(0x20, SeekOrigin.Begin);
|
|
binWriter.Write((UInt32)max); //Num actions
|
|
binWriter.Write((UInt16)commandId);
|
|
binWriter.Write((UInt16)0x810); //?
|
|
|
|
//binWriter.Seek(0x20, SeekOrigin.Begin);
|
|
for (int i = 0; i < max; i++)
|
|
binWriter.Write((UInt32)actionList[listOffset + i].targetId);
|
|
|
|
binWriter.Seek(0x50, SeekOrigin.Begin);
|
|
for (int i = 0; i < max; i++)
|
|
binWriter.Write((UInt16)actionList[listOffset + i].amount);
|
|
|
|
binWriter.Seek(0x64, SeekOrigin.Begin);
|
|
for (int i = 0; i < max; i++)
|
|
binWriter.Write((UInt16)actionList[listOffset + i].worldMasterTextId);
|
|
|
|
binWriter.Seek(0x78, SeekOrigin.Begin);
|
|
for (int i = 0; i < max; i++)
|
|
binWriter.Write((UInt32)actionList[listOffset + i].effectId);
|
|
|
|
binWriter.Seek(0xA0, SeekOrigin.Begin);
|
|
for (int i = 0; i < max; i++)
|
|
binWriter.Write((Byte)actionList[listOffset + i].param);
|
|
|
|
binWriter.Seek(0xAA, SeekOrigin.Begin);
|
|
for (int i = 0; i < max; i++)
|
|
binWriter.Write((Byte)actionList[listOffset + i].hitNum);
|
|
|
|
listOffset += max;
|
|
}
|
|
}
|
|
|
|
return new SubPacket(OPCODE, sourceActorId, data);
|
|
}
|
|
|
|
public static SubPacket BuildPacket(uint sourceActorId, uint animationId, ushort commandId, List<BattleAction> actionList, ref int listOffset)
|
|
{
|
|
byte[] data = new byte[PACKET_SIZE - 0x20];
|
|
|
|
using (MemoryStream mem = new MemoryStream(data))
|
|
{
|
|
using (BinaryWriter binWriter = new BinaryWriter(mem))
|
|
{
|
|
int max;
|
|
if (actionList.Count - listOffset <= 10)
|
|
max = actionList.Count - listOffset;
|
|
else
|
|
max = 10;
|
|
|
|
binWriter.Write((UInt32)sourceActorId);
|
|
binWriter.Write((UInt32)animationId);
|
|
|
|
//Missing... last value is float, string in here as well?
|
|
|
|
binWriter.Seek(0x20, SeekOrigin.Begin);
|
|
binWriter.Write((UInt32)max); //Num actions
|
|
binWriter.Write((UInt16)commandId);
|
|
binWriter.Write((UInt16)0x810); //?
|
|
|
|
//binWriter.Seek(0x20, SeekOrigin.Begin);
|
|
for (int i = 0; i < max; i++)
|
|
binWriter.Write((UInt32)actionList[listOffset + i].targetId);
|
|
|
|
binWriter.Seek(0x50, SeekOrigin.Begin);
|
|
for (int i = 0; i < max; i++)
|
|
binWriter.Write((UInt16)actionList[listOffset + i].amount);
|
|
|
|
binWriter.Seek(0x64, SeekOrigin.Begin);
|
|
for (int i = 0; i < max; i++)
|
|
binWriter.Write((UInt16)actionList[listOffset + i].worldMasterTextId);
|
|
|
|
binWriter.Seek(0x78, SeekOrigin.Begin);
|
|
for (int i = 0; i < max; i++)
|
|
binWriter.Write((UInt32)actionList[listOffset + i].effectId);
|
|
|
|
binWriter.Seek(0xA0, SeekOrigin.Begin);
|
|
for (int i = 0; i < max; i++)
|
|
binWriter.Write((Byte)actionList[listOffset + i].param);
|
|
|
|
binWriter.Seek(0xAA, SeekOrigin.Begin);
|
|
for (int i = 0; i < max; i++)
|
|
binWriter.Write((Byte)actionList[listOffset + i].hitNum);
|
|
|
|
listOffset += max;
|
|
}
|
|
}
|
|
|
|
return new SubPacket(OPCODE, sourceActorId, data);
|
|
}
|
|
|
|
}
|
|
}
|