From d2ac603efa6cb97a6575f063785617768547a047 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sun, 21 Feb 2016 14:06:23 -0500 Subject: [PATCH] Renamed the "Item" object to InventoryItem. Began writing the Item object that will be used to store game data items. --- FFXIVClassic Map Server/Database.cs | 119 ++++++++- .../FFXIVClassic Map Server.csproj | 2 +- .../actors/chara/player/Equipment.cs | 33 +-- .../actors/chara/player/Inventory.cs | 33 +-- .../dataobjects/InventoryItem.cs | 107 +++++++++ FFXIVClassic Map Server/dataobjects/Item.cs | 226 +++++++++++------- .../Actor/inventory/EquipmentListX08Packet.cs | 2 +- .../Actor/inventory/EquipmentListX16Packet.cs | 2 +- .../Actor/inventory/EquipmentListX32Packet.cs | 2 +- .../Actor/inventory/EquipmentListX64Packet.cs | 2 +- .../Actor/inventory/InventoryItemEndPacket.cs | 2 +- .../Actor/inventory/InventoryItemPacket.cs | 2 +- .../Actor/inventory/InventoryListX01Packet.cs | 2 +- .../Actor/inventory/InventoryListX08Packet.cs | 2 +- .../Actor/inventory/InventoryListX16Packet.cs | 2 +- .../Actor/inventory/InventoryListX32Packet.cs | 2 +- .../Actor/inventory/InventoryListX64Packet.cs | 2 +- 17 files changed, 400 insertions(+), 142 deletions(-) create mode 100644 FFXIVClassic Map Server/dataobjects/InventoryItem.cs diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs index f685a9e5..f3fe7fa7 100644 --- a/FFXIVClassic Map Server/Database.cs +++ b/FFXIVClassic Map Server/Database.cs @@ -459,6 +459,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)); } catch (MySqlException e) { Console.WriteLine(e); } @@ -470,9 +471,115 @@ namespace FFXIVClassic_Lobby_Server } - public static List getInventory(Player player, uint slotOffset, uint type) + public static List> getEquipment(Player player) { - List items = new List(); + List> equipment = new List>(); + + 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))) + { + try + { + conn.Open(); + + string query = @" + SELECT + equipSlot, + itemSlot + FROM characters_inventory_equipment + WHERE characterId = @charId ORDER BY equipSlot"; + + MySqlCommand cmd = new MySqlCommand(query, conn); + cmd.Parameters.AddWithValue("@charId", player.actorId); + + 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)); + } + } + } + catch (MySqlException e) + { Console.WriteLine(e); } + finally + { + conn.Dispose(); + } + } + + return equipment; + } + + public static void equipItem(Player player, ushort equipSlot, ushort itemSlot) + { + + 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))) + { + try + { + conn.Open(); + + string query = @" + INSERT INTO characters_inventory_equipment + (characterId, equipSlot, itemSlot) + VALUES + (@characterId, @equipSlot, @itemSlot) + ON DUPLICATE KEY UPDATE itemSlot=@itemSlot; + "; + + MySqlCommand cmd = new MySqlCommand(query, conn); + cmd.Parameters.AddWithValue("@characterId", player.actorId); + cmd.Parameters.AddWithValue("@equipSlot", equipSlot); + cmd.Parameters.AddWithValue("@itemSlot", itemSlot); + + cmd.ExecuteNonQuery(); + } + catch (MySqlException e) + { Console.WriteLine(e); } + finally + { + conn.Dispose(); + } + } + + } + + public static void unequipItem(Player player, ushort equipSlot) + { + + 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))) + { + try + { + conn.Open(); + + string query = @" + DELETE FROM characters_inventory_equipment + WHERE characterId = @characterId AND equipSlot = @equipSlot; + "; + + MySqlCommand cmd = new MySqlCommand(query, conn); + cmd.Parameters.AddWithValue("@characterId", player.actorId); + cmd.Parameters.AddWithValue("@equipSlot", equipSlot); + + cmd.ExecuteNonQuery(); + } + catch (MySqlException e) + { Console.WriteLine(e); } + finally + { + conn.Dispose(); + } + } + + } + + public static List getInventory(Player player, uint slotOffset, uint type) + { + List items = new List(); 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))) { @@ -525,7 +632,7 @@ namespace FFXIVClassic_Lobby_Server byte materia4 = reader.GetByte(11); byte materia5 = reader.GetByte(12); - items.Add(new Item(uniqueId, itemId, quantity, slot, isUntradeable, qualityNumber, durability, spiritBind, materia1, materia2, materia3, materia4, materia5)); + items.Add(new InventoryItem(uniqueId, itemId, quantity, slot, isUntradeable, qualityNumber, durability, spiritBind, materia1, materia2, materia3, materia4, materia5)); } } } @@ -540,9 +647,9 @@ namespace FFXIVClassic_Lobby_Server return items; } - public static Item addItem(Player player, uint itemId, int quantity, byte quality, bool isUntradeable, uint durability, ushort type) + public static InventoryItem addItem(Player player, uint itemId, int quantity, byte quality, bool isUntradeable, uint durability, ushort type) { - Item insertedItem = null; + InventoryItem insertedItem = null; 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))) { @@ -581,7 +688,7 @@ namespace FFXIVClassic_Lobby_Server cmd.ExecuteNonQuery(); cmd2.ExecuteNonQuery(); - insertedItem = new Item((uint)cmd.LastInsertedId, itemId, quantity, (ushort)player.getInventory(type).getNextEmptySlot(), isUntradeable, quality, durability, 0, 0, 0, 0, 0, 0); + insertedItem = new InventoryItem((uint)cmd.LastInsertedId, itemId, quantity, (ushort)player.getInventory(type).getNextEmptySlot(), isUntradeable, quality, durability, 0, 0, 0, 0, 0, 0); } catch (MySqlException e) { Console.WriteLine(e); } diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index 119442b4..e283d0da 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -98,7 +98,7 @@ - + diff --git a/FFXIVClassic Map Server/actors/chara/player/Equipment.cs b/FFXIVClassic Map Server/actors/chara/player/Equipment.cs index d2795664..0d0955fc 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Equipment.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Equipment.cs @@ -1,4 +1,5 @@ -using FFXIVClassic_Map_Server.Actors; +using FFXIVClassic_Lobby_Server; +using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.packets.send.actor.inventory; using FFXIVClassic_Map_Server.packets.send.Actor.inventory; @@ -34,7 +35,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player private Player owner; private ushort inventoryCapacity; private ushort inventoryCode; - private Item[] list; + private InventoryItem[] list; private Inventory normalInventory; public Equipment(Player ownerPlayer, Inventory normalInventory, ushort capacity, ushort code) @@ -42,11 +43,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.player owner = ownerPlayer; inventoryCapacity = capacity; inventoryCode = code; - list = new Item[inventoryCapacity]; + list = new InventoryItem[inventoryCapacity]; this.normalInventory = normalInventory; } - public Item GetItemAtSlot(ushort slot) + public InventoryItem GetItemAtSlot(ushort slot) { if (slot < list.Length) return list[slot]; @@ -65,25 +66,27 @@ namespace FFXIVClassic_Map_Server.actors.chara.player slotsToUpdate.Add(i); } - SendEquipmentPackets(slotsToUpdate); + owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); + SendEquipmentPackets(slotsToUpdate); + owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); } - public void SetEquipment(List> toEquip) + public void SetEquipment(List> toEquip) { List slotsToUpdate = new List(); for (int i = 0; i < toEquip.Count; i++) { slotsToUpdate.Add(toEquip[i].Item1); list[toEquip[i].Item1] = toEquip[i].Item2; - } - - SendEquipmentPackets(slotsToUpdate); + } } - public void Equip(ushort slot, Item item) + public void Equip(ushort slot, InventoryItem item) { if (slot >= list.Length) - return; + return; + + Database.equipItem(owner, slot, item.slot); owner.queuePacket(InventoryBeginChangePacket.buildPacket(owner.actorId)); @@ -106,6 +109,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player if (slot >= list.Length) return; + Database.unequipItem(owner, slot); + owner.queuePacket(InventoryBeginChangePacket.buildPacket(owner.actorId)); normalInventory.RefreshItem(list[slot]); @@ -119,7 +124,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player list[slot] = null; } - private void SendEquipmentPackets(ushort equipSlot, Item item) + private void SendEquipmentPackets(ushort equipSlot, InventoryItem item) { if (item == null) owner.queuePacket(InventoryRemoveX01Packet.buildPacket(owner.actorId, equipSlot)); @@ -129,7 +134,6 @@ namespace FFXIVClassic_Map_Server.actors.chara.player private void SendEquipmentPackets(List slotsToUpdate) { - owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); int currentIndex = 0; @@ -145,14 +149,13 @@ namespace FFXIVClassic_Map_Server.actors.chara.player owner.queuePacket(EquipmentListX08Packet.buildPacket(owner.actorId, list, slotsToUpdate, ref currentIndex)); else if (slotsToUpdate.Count - currentIndex == 1) { - owner.queuePacket(EquipmentListX01Packet.buildPacket(owner.actorId, slotsToUpdate[currentIndex], list[currentIndex].slot)); + owner.queuePacket(EquipmentListX01Packet.buildPacket(owner.actorId, slotsToUpdate[currentIndex], list[slotsToUpdate[currentIndex]].slot)); currentIndex++; } else break; } - owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); } } diff --git a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs index aeebdc9f..3c3a5f29 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs @@ -21,11 +21,12 @@ namespace FFXIVClassic_Map_Server.actors.chara.player public const ushort CURRANCY = 0x0063; //Max 0x140 public const ushort KEYITEMS = 0x0064; //Max 0x500 public const ushort EQUIPMENT = 0x00FE; //Max 0x23 + public const ushort EQUIPMENT_OTHERPLAYER = 0x00F9; //Max 0x23 private Player owner; private ushort inventoryCapacity; private ushort inventoryCode; - private List list; + private List list; public Inventory(Player ownerPlayer, ushort capacity, ushort code) { @@ -35,12 +36,12 @@ namespace FFXIVClassic_Map_Server.actors.chara.player } #region Inventory Management - public void initList(List itemsFromDB) + public void initList(List itemsFromDB) { list = itemsFromDB; } - public Item getItem(ushort slot) + public InventoryItem getItem(ushort slot) { if (slot < list.Count) return list[slot]; @@ -48,21 +49,21 @@ namespace FFXIVClassic_Map_Server.actors.chara.player return null; } - public void RefreshItem(Item item) + public void RefreshItem(InventoryItem item) { owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); sendInventoryPackets(item); owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); } - public void RefreshItem(params Item[] items) + public void RefreshItem(params InventoryItem[] items) { owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); sendInventoryPackets(items.ToList()); owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); } - public void RefreshItem(List items) + public void RefreshItem(List items) { owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); sendInventoryPackets(items); @@ -81,7 +82,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player int quantityCount = quantity; for (int i = 0; i < list.Count; i++) { - Item item = list[i]; + InventoryItem item = list[i]; if (item.itemId == itemId && item.quantity < item.maxStack) { slotsToUpdate.Add(item.slot); @@ -117,7 +118,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player //New item that spilled over while (quantityCount > 0) { - Item addedItem = Database.addItem(owner, itemId, Math.Min(quantityCount, 5), quality, false, 100, inventoryCode); + InventoryItem addedItem = Database.addItem(owner, itemId, Math.Min(quantityCount, 5), quality, false, 100, inventoryCode); list.Add(addedItem); if (inventoryCode != CURRANCY && inventoryCode != KEYITEMS) @@ -139,7 +140,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player return; List slotsToUpdate = new List(); - List itemsToRemove = new List(); + List itemsToRemove = new List(); List slotsToRemove = new List(); List addItemPackets = new List(); @@ -148,7 +149,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player ushort lowestSlot = 0; for (int i = list.Count - 1; i >= 0; i--) { - Item item = list[i]; + InventoryItem item = list[i]; if (item.itemId == itemId) { int oldQuantity = item.quantity; @@ -212,8 +213,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player public void removeItem(ulong itemDBId) { ushort slot = 0; - Item toDelete = null; - foreach (Item item in list) + InventoryItem toDelete = null; + foreach (InventoryItem item in list) { if (item.uniqueId == itemDBId) { @@ -304,12 +305,12 @@ namespace FFXIVClassic_Map_Server.actors.chara.player owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); } - private void sendInventoryPackets(Item item) + private void sendInventoryPackets(InventoryItem item) { owner.queuePacket(InventoryListX01Packet.buildPacket(owner.actorId, item)); } - private void sendInventoryPackets(List items) + private void sendInventoryPackets(List items) { int currentIndex = 0; @@ -403,7 +404,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player int quantityCount = quantity; for (int i = 0; i < list.Count; i++) { - Item item = list[i]; + InventoryItem item = list[i]; if (item.itemId == itemId && item.quantity < item.maxStack) { quantityCount -= (item.maxStack - item.quantity); @@ -424,7 +425,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player { int count = 0; - foreach (Item item in list) + foreach (InventoryItem item in list) { if (item.itemId == itemId) count += item.quantity; diff --git a/FFXIVClassic Map Server/dataobjects/InventoryItem.cs b/FFXIVClassic Map Server/dataobjects/InventoryItem.cs new file mode 100644 index 00000000..7f57c226 --- /dev/null +++ b/FFXIVClassic Map Server/dataobjects/InventoryItem.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.dataobjects +{ + class InventoryItem + { + public uint uniqueId; + public uint itemId; + public int quantity = 1; + public ushort slot; + + public int maxStack = 99999; + + public bool isUntradeable = false; + public byte quality = 1; + + public uint durability = 0; + public ushort spiritbind = 0; + + public byte materia1 = 0; + public byte materia2 = 0; + public byte materia3 = 0; + public byte materia4 = 0; + public byte materia5 = 0; + + //Bare Minimum + public InventoryItem(uint id, uint itemId, ushort slot) + { + this.uniqueId = id; + this.itemId = itemId; + this.quantity = quantity; + this.slot = slot; + } + + public InventoryItem(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; + this.quantity = quantity; + this.slot = slot; + this.isUntradeable = isUntradeable; + this.quality = qualityNumber; + this.durability = durability; + this.spiritbind = spiritbind; + this.materia1 = materia1; + this.materia2 = materia2; + this.materia3 = materia3; + this.materia4 = materia4; + this.materia5 = materia5; + } + + public byte[] toPacketBytes() + { + byte[] data = new byte[0x70]; + + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryWriter binWriter = new BinaryWriter(mem)) + { + binWriter.Write((UInt32)uniqueId); + binWriter.Write((UInt32)0x00000000); + binWriter.Write((Int32)quantity); + binWriter.Write((UInt32)itemId); + binWriter.Write((UInt16)slot); + + binWriter.Write((UInt16)0x0000); + binWriter.Write((UInt32)0x00000000); + binWriter.Write((UInt32)0x00000000); + binWriter.Write((UInt32)0x00000000); + + binWriter.Write(isUntradeable ? (UInt32)0x3 : (UInt32)0x0); + + binWriter.Write((UInt32)0x00000000); + + binWriter.Write((byte)quality); + binWriter.Write((byte)0x01); + binWriter.Write((uint)durability); + + binWriter.BaseStream.Seek(0x10-0x06, SeekOrigin.Current); + + binWriter.Write((byte)0x01); + binWriter.Write((byte)0x01); + binWriter.Write((byte)0x01); + binWriter.Write((byte)0x01); + + binWriter.BaseStream.Seek(0x10, SeekOrigin.Current); + + binWriter.Write((ushort)spiritbind); + + binWriter.Write((byte)materia1); + binWriter.Write((byte)materia2); + binWriter.Write((byte)materia3); + binWriter.Write((byte)materia4); + binWriter.Write((byte)materia5); + } + } + + return data; + } + + } +} diff --git a/FFXIVClassic Map Server/dataobjects/Item.cs b/FFXIVClassic Map Server/dataobjects/Item.cs index 20f39b98..38705ec8 100644 --- a/FFXIVClassic Map Server/dataobjects/Item.cs +++ b/FFXIVClassic Map Server/dataobjects/Item.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,99 +8,140 @@ namespace FFXIVClassic_Map_Server.dataobjects { class Item { - public uint uniqueId; - public uint itemId; - public int quantity = 1; - public ushort slot; + //Basic + public readonly string id; + public readonly string name; + + //_item sheet + public readonly string category; + public readonly int maxStack; + public readonly bool isRare; + public readonly bool isExclusive; - public int maxStack = 99999; - - public bool isUntradeable = false; - public byte quality = 1; - - public uint durability = 0; - public ushort spiritbind = 0; - - public byte materia1 = 0; - public byte materia2 = 0; - public byte materia3 = 0; - public byte materia4 = 0; - public byte materia5 = 0; - - //Bare Minimum - public Item(uint id, uint itemId, ushort slot) - { - this.uniqueId = id; - this.itemId = itemId; - this.quantity = quantity; - this.slot = slot; - } - - 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; - this.quantity = quantity; - this.slot = slot; - this.isUntradeable = isUntradeable; - this.quality = qualityNumber; - this.durability = durability; - this.spiritbind = spiritbind; - this.materia1 = materia1; - this.materia2 = materia2; - this.materia3 = materia3; - this.materia4 = materia4; - this.materia5 = materia5; - } - - public byte[] toPacketBytes() - { - byte[] data = new byte[0x70]; - - using (MemoryStream mem = new MemoryStream(data)) - { - using (BinaryWriter binWriter = new BinaryWriter(mem)) - { - binWriter.Write((UInt32)uniqueId); - binWriter.Write((UInt32)0x00000000); - binWriter.Write((Int32)quantity); - binWriter.Write((UInt32)itemId); - binWriter.Write((UInt16)slot); - - binWriter.Write((UInt16)0x0000); - binWriter.Write((UInt32)0x00000000); - binWriter.Write((UInt32)0x00000000); - binWriter.Write((UInt32)0x00000000); - - binWriter.Write(isUntradeable ? (UInt32)0x3 : (UInt32)0x0); - - binWriter.Write((UInt32)0x00000000); - - binWriter.Write((byte)quality); - binWriter.Write((byte)0x01); - binWriter.Write((uint)durability); - - binWriter.BaseStream.Seek(0x10-0x06, SeekOrigin.Current); - - binWriter.Write((byte)0x01); - binWriter.Write((byte)0x01); - binWriter.Write((byte)0x01); - binWriter.Write((byte)0x01); - - binWriter.BaseStream.Seek(0x10, SeekOrigin.Current); - - binWriter.Write((ushort)spiritbind); - - binWriter.Write((byte)materia1); - binWriter.Write((byte)materia2); - binWriter.Write((byte)materia3); - binWriter.Write((byte)materia4); - binWriter.Write((byte)materia5); - } - } - - return data; - } + //itemData sheet + public readonly int durability; + public readonly int icon; + public readonly int king; + public readonly int color; + public readonly int material; + public readonly int decoration; + public readonly int use; + public readonly int mainSkill; + public readonly int unknown1; + public readonly int level; + public readonly int compatibility; + public readonly float effectMagnitude; + public readonly float effectRate; + public readonly float shieldBlocking; + public readonly float effectDuration; + public readonly float recastTime; + public readonly float unknown2; + public readonly byte recastGroup; + public readonly int repairSkill; + public readonly int repairItem; + public readonly int repairItemNum; + public readonly int repairLevel; + public readonly int repairLicense; } + class EquipmentItem : Item + { + //equipment sheet + public readonly int equipPoint; + public readonly short equipTribe1; + public readonly ushort unknown1; + public readonly short equipTribe2; + public readonly ushort unknown2; + public readonly short equipTribe3; + public readonly ushort unknown3; + public readonly short equipTribe4; + public readonly ushort unknown4; + + public readonly int paramBonusType1; + public readonly short paramBonusValue1; + public readonly int paramBonusType2; + public readonly short paramBonusValue2; + public readonly int paramBonusType3; + public readonly short paramBonusValue3; + public readonly int paramBonusType4; + public readonly short paramBonusValue4; + + public readonly int paramBonusAtSlotType; + public readonly short paramBonusAtSlotValue; + + public readonly int elementalBonusType; + public readonly short elementalBonusValue; + } + + class WeaponItem : EquipmentItem + { + //graphics + public readonly int graphicsWeaponId; + public readonly int graphicsEquipId; + public readonly int graphicsVariantId; + public readonly int graphicsColorId; + + //weapon sheet + public readonly short attack; + public readonly short magicAttack; + public readonly short craftProcessing; + public readonly short craftMagicProcessing; + public readonly short harvestPotency; + public readonly short harvestLimit; + public readonly byte frequency; + public readonly short rate; + public readonly short magicRate; + public readonly short craftProcessControl; + public readonly short harvestRate; + public readonly short critical; + public readonly short magicCritical; + public readonly short parry; + + public readonly int damageAttributeType1; + public readonly float damageAttributeValue1; + public readonly int damageAttributeType2; + public readonly float damageAttributeValue2; + public readonly int damageAttributeType3; + public readonly float damageAttributeValue3; + } + + class ArmorItem : EquipmentItem + { + //graphics + public readonly int graphicsArmorId; + public readonly int graphicsEquipId; + public readonly int graphicsVariantId; + public readonly int graphicsColorId; + + //armor sheet + public readonly short defence; + public readonly short magicDefence; + public readonly short criticalDefense; + public readonly short evasion; + public readonly short magicResistance; + + public readonly int damageDefenseType1; + public readonly short damageDefenseValue1; + public readonly int damageDefenseType2; + public readonly short damageDefenseValue2; + public readonly int damageDefenseType3; + public readonly short damageDefenseValue3; + public readonly int damageDefenseType4; + public readonly short damageDefenseValue4; + } + + class AccessoryItem : EquipmentItem + { + //graphics + public readonly int graphicsAccessoryId; + public readonly int graphicsEquipId; + public readonly int graphicsVariantId; + public readonly int graphicsColorId; + + //accessory sheet + public readonly byte power; + public readonly byte size; + } + + } diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX08Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX08Packet.cs index a2e71b73..9cb1086b 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX08Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX08Packet.cs @@ -14,7 +14,7 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory public const ushort OPCODE = 0x14E; public const uint PACKET_SIZE = 0x58; - public static SubPacket buildPacket(uint playerActorId, Item[] equipment, List slotsToUpdate, ref int listOffset) + public static SubPacket buildPacket(uint playerActorId, InventoryItem[] equipment, List slotsToUpdate, ref int listOffset) { byte[] data = new byte[PACKET_SIZE - 0x20]; diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX16Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX16Packet.cs index e0fb3d16..c733edfc 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX16Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX16Packet.cs @@ -14,7 +14,7 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory public const ushort OPCODE = 0x14F; public const uint PACKET_SIZE = 0x80; - public static SubPacket buildPacket(uint playerActorId, Item[] equipment, List slotsToUpdate, ref int listOffset) + public static SubPacket buildPacket(uint playerActorId, InventoryItem[] equipment, List slotsToUpdate, ref int listOffset) { byte[] data = new byte[PACKET_SIZE - 0x20]; diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX32Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX32Packet.cs index d7b0eba6..2081256e 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX32Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX32Packet.cs @@ -14,7 +14,7 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory public const ushort OPCODE = 0x150; public const uint PACKET_SIZE = 0xE0; - public static SubPacket buildPacket(uint playerActorId, Item[] equipment, List slotsToUpdate, ref int listOffset) + public static SubPacket buildPacket(uint playerActorId, InventoryItem[] equipment, List slotsToUpdate, ref int listOffset) { byte[] data = new byte[PACKET_SIZE - 0x20]; diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX64Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX64Packet.cs index 88a34f4f..a8109e54 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX64Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX64Packet.cs @@ -14,7 +14,7 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory public const ushort OPCODE = 0x151; public const uint PACKET_SIZE = 0x194; - public static SubPacket buildPacket(uint playerActorId, Item[] equipment, List slotsToUpdate, ref int listOffset) + public static SubPacket buildPacket(uint playerActorId, InventoryItem[] equipment, List slotsToUpdate, ref int listOffset) { byte[] data = new byte[PACKET_SIZE - 0x20]; diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryItemEndPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryItemEndPacket.cs index f64173bf..414ceecd 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryItemEndPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryItemEndPacket.cs @@ -15,7 +15,7 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory public const ushort OPCODE = 0x0149; public const uint PACKET_SIZE = 0x90; - public static SubPacket buildPacket(uint playerActorID, List items, ref int listOffset) + public static SubPacket buildPacket(uint playerActorID, List items, ref int listOffset) { byte[] data; diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryItemPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryItemPacket.cs index b8d7af78..d898bb49 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryItemPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryItemPacket.cs @@ -15,7 +15,7 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory public const ushort OPCODE = 0x014A; public const uint PACKET_SIZE = 0x90; - public static SubPacket buildPacket(uint playerActorID, List items, ref int listOffset) + public static SubPacket buildPacket(uint playerActorID, List items, ref int listOffset) { byte[] data; diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX01Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX01Packet.cs index a20e1879..75231726 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX01Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX01Packet.cs @@ -14,7 +14,7 @@ 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, Item item) + public static SubPacket buildPacket(uint playerActorID, InventoryItem item) { byte[] data = new byte[PACKET_SIZE - 0x20]; diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX08Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX08Packet.cs index 57b04b08..591cc519 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX08Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX08Packet.cs @@ -14,7 +14,7 @@ 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) { byte[] data = new byte[PACKET_SIZE - 0x20]; diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX16Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX16Packet.cs index f0c118fa..741f9ab6 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX16Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX16Packet.cs @@ -14,7 +14,7 @@ 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) { byte[] data = new byte[PACKET_SIZE - 0x20]; diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX32Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX32Packet.cs index a830610a..f18275f5 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX32Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX32Packet.cs @@ -14,7 +14,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.inventory public const ushort OPCODE = 0x014B; public const uint PACKET_SIZE = 0xE20; - public static SubPacket buildPacket(uint playerActorID, List items, ref int listOffset) + public static SubPacket buildPacket(uint playerActorID, List items, ref int listOffset) { byte[] data = new byte[PACKET_SIZE - 0x20]; diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX64Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX64Packet.cs index 8e4827e1..e8443e9f 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX64Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryListX64Packet.cs @@ -14,7 +14,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.inventory public const ushort OPCODE = 0x014C; public const uint PACKET_SIZE = 0x1C20; - public static SubPacket buildPacket(uint playerActorID, List items, ref int listOffset) + public static SubPacket buildPacket(uint playerActorID, List items, ref int listOffset) { byte[] data = new byte[PACKET_SIZE - 0x20];