From e851c767dfe40f762118887c4001e22b4e560030 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sat, 12 Mar 2016 02:52:34 -0500 Subject: [PATCH] Finished check command as well as gearsets and switching between classes. Property changes still have to be written though. --- FFXIVClassic Map Server/Database.cs | 31 +++++---- FFXIVClassic Map Server/Program.cs | 8 --- FFXIVClassic Map Server/Server.cs | 2 + .../actors/chara/player/Equipment.cs | 67 ++++++++++++++++--- .../actors/chara/player/Inventory.cs | 12 +++- .../actors/chara/player/Player.cs | 57 ++++++++++++++-- .../dataobjects/InventoryItem.cs | 32 +++++++-- FFXIVClassic Map Server/lua/LuaEngine.cs | 5 ++ .../inventory/InventoryBeginChangePacket.cs | 10 ++- .../inventory/InventoryEndChangePacket.cs | 5 ++ .../Actor/inventory/InventoryListX01Packet.cs | 9 ++- .../Actor/inventory/InventoryListX08Packet.cs | 9 ++- .../Actor/inventory/InventoryListX16Packet.cs | 9 ++- .../inventory/InventorySetBeginPacket.cs | 11 ++- .../Actor/inventory/InventorySetEndPacket.cs | 9 ++- .../utils/ActorPropertyPacketUtil.cs | 4 +- 16 files changed, 222 insertions(+), 58 deletions(-) diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs index 8bc8e090..7de94e0d 100644 --- a/FFXIVClassic Map Server/Database.cs +++ b/FFXIVClassic Map Server/Database.cs @@ -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> getEquipment(Player player) + public static InventoryItem[] getEquipment(Player player, ushort classId) { - List> equipment = new List>(); + 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(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(); diff --git a/FFXIVClassic Map Server/Program.cs b/FFXIVClassic Map Server/Program.cs index 1ce41162..5c9cc061 100644 --- a/FFXIVClassic Map Server/Program.cs +++ b/FFXIVClassic Map Server/Program.cs @@ -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; diff --git a/FFXIVClassic Map Server/Server.cs b/FFXIVClassic Map Server/Server.cs index aaef19c6..b33904de 100644 --- a/FFXIVClassic Map Server/Server.cs +++ b/FFXIVClassic Map Server/Server.cs @@ -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(); } } } diff --git a/FFXIVClassic Map Server/actors/chara/player/Equipment.cs b/FFXIVClassic Map Server/actors/chara/player/Equipment.cs index 5543f154..c036d4a3 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Equipment.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Equipment.cs @@ -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 items = new List(); + 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 slotsToUpdate = new List(); @@ -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> toEquip) + public void SetEquipment(InventoryItem[] toEquip) { List slotsToUpdate = new List(); - 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; + } + } } diff --git a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs index 869dd436..07f1e336 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs @@ -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)); diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 7ed6cf47..29884a76 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -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 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 lParams = LuaUtils.createLuaParamList(parameters); diff --git a/FFXIVClassic Map Server/dataobjects/InventoryItem.cs b/FFXIVClassic Map Server/dataobjects/InventoryItem.cs index 74117b4a..a916018d 100644 --- a/FFXIVClassic Map Server/dataobjects/InventoryItem.cs +++ b/FFXIVClassic Map Server/dataobjects/InventoryItem.cs @@ -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); diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs index 387b9c05..59e7a782 100644 --- a/FFXIVClassic Map Server/lua/LuaEngine.cs +++ b/FFXIVClassic Map Server/lua/LuaEngine.cs @@ -42,6 +42,7 @@ namespace FFXIVClassic_Map_Server.lua ((ScriptLoaderBase)script.Options.ScriptLoader).ModulePaths = new string[] { "./scripts/?", "./scripts/?.lua" }; script.Globals["getStaticActor"] = (Func)Server.getStaticActors; script.Globals["getWorldMaster"] = (Func)Server.getServer().GetWorldManager().GetActor; + script.Globals["getItemGamedata"] = (Func)Server.getItemGamedata; script.DoFile(luaPath); DynValue result = script.Call(script.Globals["onInstantiate"], target); List 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)Server.getStaticActors; script.Globals["getWorldMaster"] = (Func)Server.getServer().GetWorldManager().GetActor; + script.Globals["getItemGamedata"] = (Func)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)Server.getStaticActors; script.Globals["getWorldMaster"] = (Func)Server.getServer().GetWorldManager().GetActor; + script.Globals["getItemGamedata"] = (Func)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)Server.getStaticActors; script.Globals["getWorldMaster"] = (Func)Server.getServer().GetWorldManager().GetActor; + script.Globals["getItemGamedata"] = (Func)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)Server.getStaticActors; script.Globals["getWorldMaster"] = (Func)Server.getServer().GetWorldManager().GetActor; + script.Globals["getItemGamedata"] = (Func)Server.getItemGamedata; script.DoFile(FILEPATH_PLAYER); //Run Script diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryBeginChangePacket.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryBeginChangePacket.cs index 862f0eea..34728dc1 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryBeginChangePacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryBeginChangePacket.cs @@ -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); } } } diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryEndChangePacket.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryEndChangePacket.cs index 6d031497..b0266b3c 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryEndChangePacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryEndChangePacket.cs @@ -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]); diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX01Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX01Packet.cs index 75231726..af0e1ce8 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX01Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX01Packet.cs @@ -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); } } diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX08Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX08Packet.cs index 591cc519..9be456a7 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX08Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX08Packet.cs @@ -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 items, ref int listOffset) + public static SubPacket buildPacket(uint playerActorId, List items, ref int listOffset) + { + return buildPacket(playerActorId, playerActorId, items, ref listOffset); + } + + public static SubPacket buildPacket(uint sourceActorId, uint targetActorId, List 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); } } } diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX16Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX16Packet.cs index 741f9ab6..cd60c041 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX16Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX16Packet.cs @@ -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 items, ref int listOffset) + public static SubPacket buildPacket(uint playerActorId, List items, ref int listOffset) + { + return buildPacket(playerActorId, playerActorId, items, ref listOffset); + } + + public static SubPacket buildPacket(uint sourceActorId, uint targetActorId, List 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); } } } diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetBeginPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetBeginPacket.cs index a8246a2a..b7828c92 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetBeginPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetBeginPacket.cs @@ -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); } } diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetEndPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetEndPacket.cs index a13a48e2..16ae71c0 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetEndPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetEndPacket.cs @@ -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]); } } diff --git a/FFXIVClassic Map Server/utils/ActorPropertyPacketUtil.cs b/FFXIVClassic Map Server/utils/ActorPropertyPacketUtil.cs index 25b5e0e8..8a06abf3 100644 --- a/FFXIVClassic Map Server/utils/ActorPropertyPacketUtil.cs +++ b/FFXIVClassic Map Server/utils/ActorPropertyPacketUtil.cs @@ -37,12 +37,12 @@ namespace FFXIVClassic_Map_Server.utils } } - public BasePacket done() + public List done() { currentActorPropertyPacket.addTarget(); currentActorPropertyPacket.setIsMore(false); subPackets.Add(currentActorPropertyPacket.buildPacket(playerActorId, forActor.actorId)); - return BasePacket.createPacket(subPackets, true, false); + return subPackets; } }