Finished check command as well as gearsets and switching between classes. Property changes still have to be written though.

This commit is contained in:
Filip Maj 2016-03-12 02:52:34 -05:00
parent 44e5430fdc
commit e851c767df
16 changed files with 222 additions and 58 deletions

View File

@ -641,7 +641,7 @@ namespace FFXIVClassic_Lobby_Server
player.getInventory(Inventory.MELDREQUEST).initList(getInventory(player, 0, Inventory.MELDREQUEST));
player.getInventory(Inventory.LOOT).initList(getInventory(player, 0, Inventory.LOOT));
player.getEquipment().SetEquipment(getEquipment(player));
player.getEquipment().SetEquipment(getEquipment(player, player.charaWork.parameterSave.state_mainSkill[0]));
}
catch (MySqlException e)
{ Console.WriteLine(e); }
@ -653,9 +653,9 @@ namespace FFXIVClassic_Lobby_Server
}
public static List<Tuple<ushort, InventoryItem>> getEquipment(Player player)
public static InventoryItem[] getEquipment(Player player, ushort classId)
{
List<Tuple<ushort, InventoryItem>> equipment = new List<Tuple<ushort, InventoryItem>>();
InventoryItem[] equipment = new InventoryItem[player.getEquipment().GetCapacity()];
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
{
@ -666,21 +666,22 @@ namespace FFXIVClassic_Lobby_Server
string query = @"
SELECT
equipSlot,
itemSlot
itemId
FROM characters_inventory_equipment
WHERE characterId = @charId ORDER BY equipSlot";
WHERE characterId = @charId AND classId = @classId ORDER BY equipSlot";
MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.Parameters.AddWithValue("@charId", player.actorId);
cmd.Parameters.AddWithValue("@classId", classId);
using (MySqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
ushort equipSlot = reader.GetUInt16(0);
ushort itemSlot = reader.GetUInt16(1);
InventoryItem item = player.getInventory(Inventory.NORMAL).getItem(itemSlot);
equipment.Add(new Tuple<ushort, InventoryItem>(equipSlot, item));
ulong uniqueItemId = reader.GetUInt16(1);
InventoryItem item = player.getInventory(Inventory.NORMAL).getItemById(uniqueItemId);
equipment[equipSlot] = item;
}
}
}
@ -695,7 +696,7 @@ namespace FFXIVClassic_Lobby_Server
return equipment;
}
public static void equipItem(Player player, ushort equipSlot, ushort itemSlot)
public static void equipItem(Player player, ushort equipSlot, ulong uniqueItemId)
{
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
@ -706,16 +707,17 @@ namespace FFXIVClassic_Lobby_Server
string query = @"
INSERT INTO characters_inventory_equipment
(characterId, equipSlot, itemSlot)
(characterId, classId, equipSlot, itemId)
VALUES
(@characterId, @equipSlot, @itemSlot)
ON DUPLICATE KEY UPDATE itemSlot=@itemSlot;
(@characterId, @classId, @equipSlot, @uniqueItemId)
ON DUPLICATE KEY UPDATE itemId=@uniqueItemId;
";
MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.Parameters.AddWithValue("@characterId", player.actorId);
cmd.Parameters.AddWithValue("@classId", player.charaWork.parameterSave.state_mainSkill[0]);
cmd.Parameters.AddWithValue("@equipSlot", equipSlot);
cmd.Parameters.AddWithValue("@itemSlot", itemSlot);
cmd.Parameters.AddWithValue("@uniqueItemId", uniqueItemId);
cmd.ExecuteNonQuery();
}
@ -740,11 +742,12 @@ namespace FFXIVClassic_Lobby_Server
string query = @"
DELETE FROM characters_inventory_equipment
WHERE characterId = @characterId AND equipSlot = @equipSlot;
WHERE characterId = @characterId AND classId = @classId AND equipSlot = @equipSlot;
";
MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.Parameters.AddWithValue("@characterId", player.actorId);
cmd.Parameters.AddWithValue("@classId", player.charaWork.parameterSave.state_mainSkill[0]);
cmd.Parameters.AddWithValue("@equipSlot", equipSlot);
cmd.ExecuteNonQuery();

View File

@ -23,14 +23,6 @@ namespace FFXIVClassic_Lobby_Server
#endif
bool startServer = true;
Utils.FFXIVLoginStringDecodeBinary("C:\\Program Files (x86)\\SquareEnix\\FINAL FANTASY XIV\\ffxivlogin.exe");
Console.WriteLine(Utils.FFXIVLoginStringDecode(new byte[]{0x6F, 0xD6, 0x3C, 0xD6, 0x20, 0x81, 0x3F, 0x06, 0x36, 0x78, 0xD3, 0xAE, 0xDB, 0x4E, 0x08, 0xF1, 0x7D, 0xAE, 0x90, 0x43, 0x18, 0x70, 0x32, 0x08, 0x6B, 0x75, 0x98, 0xA1, 0x51, 0x15, 0xA9, 0xF7, 0x74, 0xB3, 0x6F, 0x10, 0xEA, 0x76, 0x34, 0x0B, 0x7E, 0x2D, 0xD2, 0xAC, 0xD7, 0xC3, 0xD3, 0xC1, 0x4D, 0x96, 0xED, 0xD4, 0xCC, 0x5E, 0x0D, 0xF5, 0x7E, 0x35, 0x99, 0xB9, 0x57, 0x38, 0x51, 0x79, 0x39, 0x3F, 0x08, 0xFB, 0xE8, 0xEE, 0x25, 0x4F, 0xAE, 0xE2, 0xFC, 0x7E, 0x2A, 0x72, 0x34, 0x57, 0x7E}));
Console.WriteLine(Utils.ByteArrayToHex(Utils.FFXIVLoginStringEncode(0xd018, "http://141.117.163.26/login/")));
return;
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("---------FFXIV 1.0 Map Server---------");
Console.ForegroundColor = ConsoleColor.Gray;

View File

@ -478,6 +478,7 @@ namespace FFXIVClassic_Lobby_Server
{
Player p = client.getActor();
p.graphicChange(slot, wId, eId, vId, cId);
p.sendAppearance();
}
else
{
@ -485,6 +486,7 @@ namespace FFXIVClassic_Lobby_Server
{
Player p = entry.Value.getActor();
p.graphicChange(slot, wId, eId, vId, cId);
p.sendAppearance();
}
}
}

View File

@ -38,6 +38,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
private InventoryItem[] list;
private Inventory normalInventory;
private bool writeToDB = true;
public Equipment(Player ownerPlayer, Inventory normalInventory, ushort capacity, ushort code)
{
owner = ownerPlayer;
@ -55,6 +57,38 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
return null;
}
public void SendCheckEquipmentToPlayer(Player toPlayer)
{
List<InventoryItem> items = new List<InventoryItem>();
for (ushort i = 0; i < list.Length; i++)
{
if (list[i] != null)
{
InventoryItem equipItem = new InventoryItem(list[i], i);
items.Add(equipItem);
}
}
toPlayer.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, toPlayer.actorId, 0x23, Inventory.EQUIPMENT_OTHERPLAYER));
int currentIndex = 0;
while (true)
{
if (items.Count - currentIndex >= 16)
toPlayer.queuePacket(InventoryListX16Packet.buildPacket(owner.actorId, toPlayer.actorId, items, ref currentIndex));
else if (items.Count - currentIndex > 1)
toPlayer.queuePacket(InventoryListX08Packet.buildPacket(owner.actorId, toPlayer.actorId, items, ref currentIndex));
else if (items.Count - currentIndex == 1)
{
toPlayer.queuePacket(InventoryListX01Packet.buildPacket(owner.actorId, toPlayer.actorId, items[currentIndex]));
currentIndex++;
}
else
break;
}
toPlayer.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId, toPlayer.actorId));
}
public void SendFullEquipment(bool doClear)
{
List<ushort> slotsToUpdate = new List<ushort>();
@ -78,13 +112,13 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
for (int i = 0; i < slots.Length; i++)
{
InventoryItem item = normalInventory.getItem(itemSlots[i]);
InventoryItem item = normalInventory.getItemBySlot(itemSlots[i]);
if (item == null)
continue;
Database.equipItem(owner, slots[i], itemSlots[i]);
list[slots[i]] = normalInventory.getItem(itemSlots[i]);
list[slots[i]] = normalInventory.getItemBySlot(itemSlots[i]);
}
owner.queuePacket(InventoryBeginChangePacket.buildPacket(owner.actorId));
@ -92,19 +126,20 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
owner.queuePacket(InventoryEndChangePacket.buildPacket(owner.actorId));
}
public void SetEquipment(List<Tuple<ushort, InventoryItem>> toEquip)
public void SetEquipment(InventoryItem[] toEquip)
{
List<ushort> slotsToUpdate = new List<ushort>();
for (int i = 0; i < toEquip.Count; i++)
for (ushort i = 0; i < toEquip.Length; i++)
{
slotsToUpdate.Add(toEquip[i].Item1);
list[toEquip[i].Item1] = toEquip[i].Item2;
}
if (toEquip[i] != null)
slotsToUpdate.Add(i);
}
list = toEquip;
}
public void Equip(ushort slot, ushort invSlot)
{
InventoryItem item = normalInventory.getItem(invSlot);
InventoryItem item = normalInventory.getItemBySlot(invSlot);
if (item == null)
return;
@ -117,7 +152,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
if (slot >= list.Length)
return;
Database.equipItem(owner, slot, item.slot);
if (writeToDB)
Database.equipItem(owner, slot, item.uniqueId);
owner.queuePacket(InventoryBeginChangePacket.buildPacket(owner.actorId));
@ -135,12 +171,18 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
list[slot] = item;
}
public void ToggleDBWrite(bool flag)
{
writeToDB = flag;
}
public void Unequip(ushort slot)
{
if (slot >= list.Length)
return;
Database.unequipItem(owner, slot);
if (writeToDB)
Database.unequipItem(owner, slot);
owner.queuePacket(InventoryBeginChangePacket.buildPacket(owner.actorId));
@ -189,5 +231,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
}
public int GetCapacity()
{
return list.Length;
}
}
}

View File

@ -41,7 +41,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
list = itemsFromDB;
}
public InventoryItem getItem(ushort slot)
public InventoryItem getItemBySlot(ushort slot)
{
if (slot < list.Count)
return list[slot];
@ -49,6 +49,16 @@ namespace FFXIVClassic_Map_Server.actors.chara.player
return null;
}
public InventoryItem getItemById(ulong itemId)
{
foreach (InventoryItem item in list)
{
if (item.uniqueId == itemId)
return item;
}
return null;
}
public void RefreshItem(InventoryItem item)
{
owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode));

View File

@ -409,7 +409,7 @@ namespace FFXIVClassic_Map_Server.Actors
propPacketUtil.addProperty("playerWork.birthdayDay");
propPacketUtil.addProperty("playerWork.initialTown");
return propPacketUtil.done();
return BasePacket.createPacket(propPacketUtil.done(), true, false);
}
public void sendZoneInPackets(WorldManager world, ushort spawnType)
@ -683,8 +683,7 @@ namespace FFXIVClassic_Map_Server.Actors
public void graphicChange(uint slot, uint graphicId)
{
appearanceIds[slot] = graphicId;
broadcastPacket(createAppearancePacket(actorId), true);
appearanceIds[slot] = graphicId;
}
public void graphicChange(uint slot, uint weapId, uint equipId, uint variantId, uint colorId)
@ -702,11 +701,35 @@ namespace FFXIVClassic_Map_Server.Actors
(equipId & 0x3FF) << 10 |
(mixedVariantId & 0x3FF);
appearanceIds[slot] = graphicId;
broadcastPacket(createAppearancePacket(actorId), true);
appearanceIds[slot] = graphicId;
}
public void sendAppearance()
{
broadcastPacket(createAppearancePacket(actorId), true);
}
public InventoryItem[] getGearset(ushort classId)
{
return Database.getEquipment(this, classId);
}
public void doClassChange(byte classId)
{
charaWork.parameterSave.state_mainSkill[0] = classId;
ActorPropertyPacketUtil propertyBuilder = new ActorPropertyPacketUtil("charaWork/stateForAll", this, actorId);
propertyBuilder.addProperty("charaWork.parameterSave.state_mainSkill[0]");
propertyBuilder.addProperty("charaWork.parameterSave.state_mainSkillLevel");
List<SubPacket> packets = propertyBuilder.done();
foreach (SubPacket packet in packets)
broadcastPacket(packet, true);
Log.info("Class change request to: " + classId);
}
public void graphicChange(int slot, InventoryItem invItem)
{
if (invItem == null)
@ -747,11 +770,35 @@ namespace FFXIVClassic_Map_Server.Actors
return null;
}
public Actor getActorInInstance(uint actorId)
{
foreach (Actor a in playerSession.actorInstanceList)
{
if (a.actorId == actorId)
return a;
}
return null;
}
public Equipment getEquipment()
{
return equipment;
}
public void examinePlayer(Actor examinee)
{
Player toBeExamined;
if (examinee is Player)
toBeExamined = (Player)examinee;
else
return;
queuePacket(InventoryBeginChangePacket.buildPacket(toBeExamined.actorId, actorId));
toBeExamined.getEquipment().SendCheckEquipmentToPlayer(this);
queuePacket(InventoryEndChangePacket.buildPacket(toBeExamined.actorId, actorId));
}
public void runEventFunction(string functionName, params object[] parameters)
{
List<LuaParam> lParams = LuaUtils.createLuaParamList(parameters);

View File

@ -10,7 +10,7 @@ namespace FFXIVClassic_Map_Server.dataobjects
{
class InventoryItem
{
public uint uniqueId;
public ulong uniqueId;
public uint itemId;
public int quantity = 1;
public ushort slot;
@ -32,13 +32,34 @@ namespace FFXIVClassic_Map_Server.dataobjects
{
this.uniqueId = id;
this.itemId = itemId;
this.quantity = quantity;
this.quantity = 1;
this.slot = slot;
Item gItem = Server.getItemGamedata(id);
Item gItem = Server.getItemGamedata(itemId);
itemType = gItem.isExclusive ? (byte)0x3 : (byte)0x0;
}
//For check command
public InventoryItem(InventoryItem item, ushort equipSlot)
{
this.uniqueId = item.uniqueId;
this.itemId = item.itemId;
this.quantity = item.quantity;
this.slot = equipSlot;
this.itemType = item.itemType;
this.quality = item.quality;
this.durability = item.durability;
this.spiritbind = item.spiritbind;
this.materia1 = item.materia1;
this.materia2 = item.materia2;
this.materia3 = item.materia3;
this.materia4 = item.materia4;
this.materia5 = item.materia5;
}
public InventoryItem(uint uniqueId, uint itemId, int quantity, ushort slot, byte itemType, byte qualityNumber, int durability, ushort spiritbind, byte materia1, byte materia2, byte materia3, byte materia4, byte materia5)
{
this.uniqueId = uniqueId;
@ -64,13 +85,12 @@ namespace FFXIVClassic_Map_Server.dataobjects
{
using (BinaryWriter binWriter = new BinaryWriter(mem))
{
binWriter.Write((UInt32)uniqueId);
binWriter.Write((UInt32)0x00000000);
binWriter.Write((UInt64)uniqueId);
binWriter.Write((Int32)quantity);
binWriter.Write((UInt32)itemId);
binWriter.Write((UInt16)slot);
binWriter.Write((UInt16)0x0000);
binWriter.Write((UInt16)0x0001);
binWriter.Write((UInt32)0x00000000);
binWriter.Write((UInt32)0x00000000);
binWriter.Write((UInt32)0x00000000);

View File

@ -42,6 +42,7 @@ namespace FFXIVClassic_Map_Server.lua
((ScriptLoaderBase)script.Options.ScriptLoader).ModulePaths = new string[] { "./scripts/?", "./scripts/?.lua" };
script.Globals["getStaticActor"] = (Func<string, Actor>)Server.getStaticActors;
script.Globals["getWorldMaster"] = (Func<Actor>)Server.getServer().GetWorldManager().GetActor;
script.Globals["getItemGamedata"] = (Func<uint, Item>)Server.getItemGamedata;
script.DoFile(luaPath);
DynValue result = script.Call(script.Globals["onInstantiate"], target);
List<LuaParam> lparams = LuaUtils.createLuaParamList(result);
@ -77,6 +78,7 @@ namespace FFXIVClassic_Map_Server.lua
((ScriptLoaderBase)script.Options.ScriptLoader).ModulePaths = new string[] { "./scripts/?", "./scripts/?.lua" };
script.Globals["getStaticActor"] = (Func<string, Actor>)Server.getStaticActors;
script.Globals["getWorldMaster"] = (Func<Actor>)Server.getServer().GetWorldManager().GetActor;
script.Globals["getItemGamedata"] = (Func<uint, Item>)Server.getItemGamedata;
script.DoFile(luaPath);
//Have to do this to combine LuaParams
@ -113,6 +115,7 @@ namespace FFXIVClassic_Map_Server.lua
((ScriptLoaderBase)script.Options.ScriptLoader).ModulePaths = new string[] { "./scripts/?", "./scripts/?.lua" };
script.Globals["getStaticActor"] = (Func<string, Actor>)Server.getStaticActors;
script.Globals["getWorldMaster"] = (Func<Actor>)Server.getServer().GetWorldManager().GetActor;
script.Globals["getItemGamedata"] = (Func<uint, Item>)Server.getItemGamedata;
script.DoFile(luaPath);
//Have to do this to combine LuaParams
@ -144,6 +147,7 @@ namespace FFXIVClassic_Map_Server.lua
((ScriptLoaderBase)script.Options.ScriptLoader).ModulePaths = new string[] { "./scripts/?", "./scripts/?.lua" };
script.Globals["getStaticActor"] = (Func<string, Actor>)Server.getStaticActors;
script.Globals["getWorldMaster"] = (Func<Actor>)Server.getServer().GetWorldManager().GetActor;
script.Globals["getItemGamedata"] = (Func<uint, Item>)Server.getItemGamedata;
script.DoFile(luaPath);
//Run Script
@ -159,6 +163,7 @@ namespace FFXIVClassic_Map_Server.lua
((ScriptLoaderBase)script.Options.ScriptLoader).ModulePaths = new string[] { "./scripts/?", "./scripts/?.lua" };
script.Globals["getStaticActor"] = (Func<string, Actor>)Server.getStaticActors;
script.Globals["getWorldMaster"] = (Func<Actor>)Server.getServer().GetWorldManager().GetActor;
script.Globals["getItemGamedata"] = (Func<uint, Item>)Server.getItemGamedata;
script.DoFile(FILEPATH_PLAYER);
//Run Script

View File

@ -12,9 +12,17 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory
public const ushort OPCODE = 0x016D;
public const uint PACKET_SIZE = 0x28;
public static SubPacket buildPacket(uint sourceActorId, uint targetActorId)
{
byte[] data = new byte[8];
data[0] = 2;
return new SubPacket(OPCODE, sourceActorId, targetActorId, data);
}
public static SubPacket buildPacket(uint playerActorID)
{
return new SubPacket(OPCODE, playerActorID, playerActorID, new byte[8]);
byte[] data = new byte[8];
return new SubPacket(OPCODE, playerActorID, playerActorID, data);
}
}
}

View File

@ -12,6 +12,11 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory
public const ushort OPCODE = 0x016E;
public const uint PACKET_SIZE = 0x28;
public static SubPacket buildPacket(uint sourceActorId, uint targetActorId)
{
return new SubPacket(OPCODE, sourceActorId, targetActorId, new byte[8]);
}
public static SubPacket buildPacket(uint playerActorID)
{
return new SubPacket(OPCODE, playerActorID, playerActorID, new byte[8]);

View File

@ -14,7 +14,12 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.inventory
public const ushort OPCODE = 0x0148;
public const uint PACKET_SIZE = 0x90;
public static SubPacket buildPacket(uint playerActorID, InventoryItem item)
public static SubPacket buildPacket(uint playerActorId, InventoryItem item)
{
return buildPacket(playerActorId, playerActorId, item);
}
public static SubPacket buildPacket(uint sourceActorId, uint targetActorId, InventoryItem item)
{
byte[] data = new byte[PACKET_SIZE - 0x20];
@ -26,7 +31,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.inventory
}
}
return new SubPacket(OPCODE, playerActorID, playerActorID, data);
return new SubPacket(OPCODE, sourceActorId, targetActorId, data);
}
}

View File

@ -14,7 +14,12 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.inventory
public const ushort OPCODE = 0x0149;
public const uint PACKET_SIZE = 0x3A8;
public static SubPacket buildPacket(uint playerActorID, List<InventoryItem> items, ref int listOffset)
public static SubPacket buildPacket(uint playerActorId, List<InventoryItem> items, ref int listOffset)
{
return buildPacket(playerActorId, playerActorId, items, ref listOffset);
}
public static SubPacket buildPacket(uint sourceActorId, uint targetActorId, List<InventoryItem> items, ref int listOffset)
{
byte[] data = new byte[PACKET_SIZE - 0x20];
@ -39,7 +44,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.inventory
}
}
return new SubPacket(OPCODE, playerActorID, playerActorID, data);
return new SubPacket(OPCODE, sourceActorId, targetActorId, data);
}
}
}

View File

@ -14,7 +14,12 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.inventory
public const ushort OPCODE = 0x014A;
public const uint PACKET_SIZE = 0x720;
public static SubPacket buildPacket(uint playerActorID, List<InventoryItem> items, ref int listOffset)
public static SubPacket buildPacket(uint playerActorId, List<InventoryItem> items, ref int listOffset)
{
return buildPacket(playerActorId, playerActorId, items, ref listOffset);
}
public static SubPacket buildPacket(uint sourceActorId, uint targetActorId, List<InventoryItem> items, ref int listOffset)
{
byte[] data = new byte[PACKET_SIZE - 0x20];
@ -36,7 +41,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.inventory
}
}
return new SubPacket(OPCODE, playerActorID, playerActorID, data);
return new SubPacket(OPCODE, sourceActorId, targetActorId, data);
}
}
}

View File

@ -13,7 +13,12 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory
public const ushort OPCODE = 0x0146;
public const uint PACKET_SIZE = 0x28;
public static SubPacket buildPacket(uint playerActorID, ushort size, ushort code)
public static SubPacket buildPacket(uint playerActorId, ushort size, ushort code)
{
return buildPacket(playerActorId, playerActorId, size, code);
}
public static SubPacket buildPacket(uint sourceActorId, uint targetActorId, ushort size, ushort code)
{
byte[] data = new byte[8];
@ -21,13 +26,13 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory
{
using (BinaryWriter binWriter = new BinaryWriter(mem))
{
binWriter.Write((UInt32)playerActorID);
binWriter.Write((UInt32)sourceActorId);
binWriter.Write((UInt16)size);
binWriter.Write((UInt16)code);
}
}
return new SubPacket(OPCODE, playerActorID, playerActorID, data);
return new SubPacket(OPCODE, sourceActorId, targetActorId, data);
}
}

View File

@ -13,9 +13,14 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory
public const ushort OPCODE = 0x0147;
public const uint PACKET_SIZE = 0x28;
public static SubPacket buildPacket(uint playerActorID)
public static SubPacket buildPacket(uint playerActorId)
{
return new SubPacket(OPCODE, playerActorID, playerActorID, new byte[8]);
return new SubPacket(OPCODE, playerActorId, playerActorId, new byte[8]);
}
public static SubPacket buildPacket(uint sourceActorId, uint targetActorID)
{
return new SubPacket(OPCODE, sourceActorId, targetActorID, new byte[8]);
}
}

View File

@ -37,12 +37,12 @@ namespace FFXIVClassic_Map_Server.utils
}
}
public BasePacket done()
public List<SubPacket> done()
{
currentActorPropertyPacket.addTarget();
currentActorPropertyPacket.setIsMore(false);
subPackets.Add(currentActorPropertyPacket.buildPacket(playerActorId, forActor.actorId));
return BasePacket.createPacket(subPackets, true, false);
return subPackets;
}
}