From 1f3cd8eaf3fd5abaeb32b282316e17ac439026d6 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sat, 13 Feb 2016 16:33:33 -0500 Subject: [PATCH] Added the two new datatypes to get the inventory commands to parse properly. --- FFXIVClassic Map Server/Database.cs | 4 +- .../actors/chara/player/Player.cs | 15 ++-- FFXIVClassic Map Server/common/Utils.cs | 12 ++++ FFXIVClassic Map Server/dataobjects/Item.cs | 9 +-- FFXIVClassic Map Server/lua/LuaUtils.cs | 68 ++++++++++++++++++- 5 files changed, 93 insertions(+), 15 deletions(-) diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs index 88e8ad1c..cd7cf087 100644 --- a/FFXIVClassic Map Server/Database.cs +++ b/FFXIVClassic Map Server/Database.cs @@ -509,7 +509,7 @@ namespace FFXIVClassic_Lobby_Server uint uniqueId = reader.GetUInt32(0); uint itemId = reader.GetUInt32(1); int quantity = reader.GetInt32(2); - uint slot = reader.GetUInt32(3); + ushort slot = reader.GetUInt16(3); bool isUntradeable = reader.GetBoolean(4); byte qualityNumber = reader.GetByte(5); @@ -576,7 +576,7 @@ namespace FFXIVClassic_Lobby_Server cmd.Parameters.AddWithValue("@durability", durability); cmd.ExecuteNonQuery(); - insertedItem = new Item((uint)cmd.LastInsertedId, itemId, quantity, (uint)player.inventories[type].getNextEmptySlot(), isUntradeable, quality, durability, 0, 0, 0, 0, 0, 0); + insertedItem = new Item((uint)cmd.LastInsertedId, itemId, quantity, (ushort)player.inventories[type].getNextEmptySlot(), isUntradeable, quality, durability, 0, 0, 0, 0, 0, 0); } catch (MySqlException e) { Console.WriteLine(e); } diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 02cc4817..5828ec44 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -431,14 +431,15 @@ namespace FFXIVClassic_Map_Server.Actors queuePacket(InventoryBeginChangePacket.buildPacket(actorId)); inventories[Inventory.NORMAL].sendFullInventory(); + inventories[Inventory.CURRANCY].sendFullInventory(); #region equipsetup - EquipmentListX08Packet initialEqupmentPacket = new EquipmentListX08Packet(); - initialEqupmentPacket.setItem(EquipmentListX08Packet.SLOT_BODY, 5); - initialEqupmentPacket.setItem(EquipmentListX08Packet.SLOT_HEAD, 3); - initialEqupmentPacket.setItem(EquipmentListX08Packet.SLOT_UNDERSHIRT, 6); - initialEqupmentPacket.setItem(EquipmentListX08Packet.SLOT_UNDERGARMENT, 7); - initialEqupmentPacket.setItem(EquipmentListX08Packet.SLOT_MAINHAND, 2); - initialEqupmentPacket.setItem(EquipmentListX08Packet.SLOT_LEGS, 8); + // EquipmentListX08Packet initialEqupmentPacket = new EquipmentListX08Packet(); + // initialEqupmentPacket.setItem(EquipmentListX08Packet.SLOT_BODY, 5); + // initialEqupmentPacket.setItem(EquipmentListX08Packet.SLOT_HEAD, 3); + // initialEqupmentPacket.setItem(EquipmentListX08Packet.SLOT_UNDERSHIRT, 6); + // initialEqupmentPacket.setItem(EquipmentListX08Packet.SLOT_UNDERGARMENT, 7); + // initialEqupmentPacket.setItem(EquipmentListX08Packet.SLOT_MAINHAND, 2); + // initialEqupmentPacket.setItem(EquipmentListX08Packet.SLOT_LEGS, 8); //Equip Init // playerSession.queuePacket(InventorySetBeginPacket.buildPacket(actorId, 0x23, InventorySetBeginPacket.CODE_EQUIPMENT), true, false); diff --git a/FFXIVClassic Map Server/common/Utils.cs b/FFXIVClassic Map Server/common/Utils.cs index e63f14c2..eb7ea239 100644 --- a/FFXIVClassic Map Server/common/Utils.cs +++ b/FFXIVClassic Map Server/common/Utils.cs @@ -67,6 +67,18 @@ namespace FFXIVClassic_Lobby_Server.common return unixTimeStamp; } + public static ulong swapEndian(ulong input) + { + return ((0x00000000000000FF) & (input >> 56) | + (0x000000000000FF00) & (input >> 40) | + (0x0000000000FF0000) & (input >> 24) | + (0x00000000FF000000) & (input >> 8) | + (0x000000FF00000000) & (input << 8) | + (0x0000FF0000000000) & (input << 24) | + (0x00FF000000000000) & (input << 40) | + (0xFF00000000000000) & (input << 56)); + } + public static uint swapEndian(uint input) { return ((input >> 24) & 0xff) | diff --git a/FFXIVClassic Map Server/dataobjects/Item.cs b/FFXIVClassic Map Server/dataobjects/Item.cs index fb088c11..b1d10ddb 100644 --- a/FFXIVClassic Map Server/dataobjects/Item.cs +++ b/FFXIVClassic Map Server/dataobjects/Item.cs @@ -12,7 +12,7 @@ namespace FFXIVClassic_Map_Server.dataobjects public uint uniqueId; public uint itemId; public int quantity = 1; - public uint slot; + public ushort slot; public bool isUntradeable = false; public byte quality = 1; @@ -27,7 +27,7 @@ namespace FFXIVClassic_Map_Server.dataobjects public byte materia5 = 0; //Bare Minimum - public Item(uint id, uint itemId, uint slot) + public Item(uint id, uint itemId, ushort slot) { this.uniqueId = id; this.itemId = itemId; @@ -35,7 +35,7 @@ namespace FFXIVClassic_Map_Server.dataobjects this.slot = slot; } - public Item(uint uniqueId, uint itemId, int quantity, uint slot, bool isUntradeable, byte qualityNumber, uint durability, ushort spiritbind, byte materia1, byte materia2, byte materia3, byte materia4, byte materia5) + public Item(uint uniqueId, uint itemId, int quantity, ushort slot, bool isUntradeable, byte qualityNumber, uint durability, ushort spiritbind, byte materia1, byte materia2, byte materia3, byte materia4, byte materia5) { this.uniqueId = uniqueId; this.itemId = itemId; @@ -64,8 +64,9 @@ namespace FFXIVClassic_Map_Server.dataobjects binWriter.Write((UInt32)0x00000000); binWriter.Write((Int32)quantity); binWriter.Write((UInt32)itemId); - binWriter.Write((UInt32)slot); + binWriter.Write((UInt16)slot); + binWriter.Write((UInt16)0x0000); binWriter.Write((UInt32)0x00000000); binWriter.Write((UInt32)0x00000000); binWriter.Write((UInt32)0x00000000); diff --git a/FFXIVClassic Map Server/lua/LuaUtils.cs b/FFXIVClassic Map Server/lua/LuaUtils.cs index 1904d984..afbb3c4d 100644 --- a/FFXIVClassic Map Server/lua/LuaUtils.cs +++ b/FFXIVClassic Map Server/lua/LuaUtils.cs @@ -14,7 +14,23 @@ namespace FFXIVClassic_Map_Server { class LuaUtils { - + + public class Type7Param + { + public uint actorId; + public byte unknown; + public byte slot; + public byte inventoryType; + + public Type7Param(uint actorId, byte unknown, byte slot, byte inventoryType) + { + this.actorId = actorId; + this.unknown = unknown; + this.slot = slot; + this.inventoryType = inventoryType; + } + } + public static List readLuaParams(BinaryReader reader) { List luaParams = new List(); @@ -55,7 +71,18 @@ namespace FFXIVClassic_Map_Server break; case 0x6: //Actor (By Id) value = Utils.swapEndian(reader.ReadUInt32()); - break; + break; + case 0x7: //Weird one used for inventory + uint type7ActorId = Utils.swapEndian(reader.ReadUInt32()); + byte type7Unknown = reader.ReadByte(); + byte type7Slot = reader.ReadByte(); + byte type7InventoryType = reader.ReadByte(); + value = new Type7Param(type7ActorId, type7Unknown, type7Slot, type7InventoryType); + break; + case 0x9: //Two Longs (only storing first one) + value = Utils.swapEndian(reader.ReadUInt64()); + reader.ReadUInt64(); + break; case 0xC: //Byte value = reader.ReadByte(); break; @@ -106,6 +133,17 @@ namespace FFXIVClassic_Map_Server case 0x6: //Actor (By Id) writer.Write((UInt32)Utils.swapEndian((UInt32)l.value)); break; + case 0x7: //Weird one used for inventory + Type7Param type7 = (Type7Param)l.value; + writer.Write((UInt32)Utils.swapEndian((UInt32)type7.actorId)); + writer.Write((Byte)type7.unknown); + writer.Write((Byte)type7.slot); + writer.Write((Byte)type7.inventoryType); + break; + case 0x9: //Two Longs (only storing first one) + writer.Write((UInt64)Utils.swapEndian((UInt64)l.value)); + writer.Write((UInt64)0); + break; case 0xC: //Byte writer.Write((Byte)l.value); break; @@ -165,6 +203,17 @@ namespace FFXIVClassic_Map_Server case 0x6: //Actor (By Id) value = Utils.swapEndian(reader.ReadUInt32()); break; + case 0x7: //Weird one used for inventory + uint type7ActorId = Utils.swapEndian(reader.ReadUInt32()); + byte type7Unknown = reader.ReadByte(); + byte type7Slot = reader.ReadByte(); + byte type7InventoryType = reader.ReadByte(); + value = new Type7Param(type7ActorId, type7Unknown, type7Slot, type7InventoryType); + break; + case 0x9: //Two Longs (only storing first one) + value = Utils.swapEndian(reader.ReadUInt64()); + reader.ReadUInt64(); + break; case 0xC: //Byte value = reader.ReadByte(); break; @@ -290,6 +339,14 @@ namespace FFXIVClassic_Map_Server { luaParams.Add(new LuaParam(0x6, ((Actor)o).actorId)); } + else if (o is Type7Param) + { + luaParams.Add(new LuaParam(0x7, (Type7Param)o)); + } + else if (o is ulong) + { + luaParams.Add(new LuaParam(0x9, (ulong)o)); + } else if (o is byte) { luaParams.Add(new LuaParam(0xC, (byte)o)); @@ -338,9 +395,16 @@ namespace FFXIVClassic_Map_Server case 0x6: //Actor (By Id) dumpString += String.Format("0x{0:X}", (uint)lParams[i].value); break; + case 0x7: //Weird one used for inventory + Type7Param type7Param = ((Type7Param)lParams[i].value); + dumpString += String.Format("Type7 Param: (0x{0:X}, 0x{1:X}, 0x{2:X}, 0x{3:X})", type7Param.actorId, type7Param.unknown, type7Param.slot, type7Param.inventoryType); + break; case 0xC: //Byte dumpString += String.Format("0x{0:X}", (byte)lParams[i].value); break; + case 0x9: //Long (+ 8 bytes ignored) + dumpString += String.Format("0x{0:X}", (ulong)lParams[i].value); + break; case 0x1B: //Short? dumpString += String.Format("0x{0:X}", (ushort)lParams[i].value); break;