diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs index 875c08b4..f685a9e5 100644 --- a/FFXIVClassic Map Server/Database.cs +++ b/FFXIVClassic Map Server/Database.cs @@ -452,12 +452,12 @@ namespace FFXIVClassic_Lobby_Server } } - player.inventories[Inventory.NORMAL].initList(getInventory(player, 0, Inventory.NORMAL)); - player.inventories[Inventory.KEYITEMS].initList(getInventory(player, 0, Inventory.KEYITEMS)); - player.inventories[Inventory.CURRANCY].initList(getInventory(player, 0, Inventory.CURRANCY)); - player.inventories[Inventory.BAZAAR].initList(getInventory(player, 0, Inventory.BAZAAR)); - player.inventories[Inventory.MELDREQUEST].initList(getInventory(player, 0, Inventory.MELDREQUEST)); - player.inventories[Inventory.LOOT].initList(getInventory(player, 0, Inventory.LOOT)); + player.getInventory(Inventory.NORMAL).initList(getInventory(player, 0, Inventory.NORMAL)); + player.getInventory(Inventory.KEYITEMS).initList(getInventory(player, 0, Inventory.KEYITEMS)); + player.getInventory(Inventory.CURRANCY).initList(getInventory(player, 0, Inventory.CURRANCY)); + player.getInventory(Inventory.BAZAAR).initList(getInventory(player, 0, Inventory.BAZAAR)); + player.getInventory(Inventory.MELDREQUEST).initList(getInventory(player, 0, Inventory.MELDREQUEST)); + player.getInventory(Inventory.LOOT).initList(getInventory(player, 0, Inventory.LOOT)); } catch (MySqlException e) @@ -581,7 +581,7 @@ namespace FFXIVClassic_Lobby_Server cmd.ExecuteNonQuery(); cmd2.ExecuteNonQuery(); - insertedItem = new Item((uint)cmd.LastInsertedId, itemId, quantity, (ushort)player.inventories[type].getNextEmptySlot(), isUntradeable, quality, durability, 0, 0, 0, 0, 0, 0); + insertedItem = new Item((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/Server.cs b/FFXIVClassic Map Server/Server.cs index 7bce7195..895de39f 100644 --- a/FFXIVClassic Map Server/Server.cs +++ b/FFXIVClassic Map Server/Server.cs @@ -432,14 +432,14 @@ namespace FFXIVClassic_Lobby_Server if (client != null) { Player p = client.getActor(); - p.inventories[Inventory.NORMAL].addItem(itemId, quantity, 1); + p.getInventory(Inventory.NORMAL).addItem(itemId, quantity, 1); } else { foreach (KeyValuePair entry in mConnectedPlayerList) { Player p = entry.Value.getActor(); - p.inventories[Inventory.NORMAL].addItem(itemId, quantity, 1); + p.getInventory(Inventory.NORMAL).addItem(itemId, quantity, 1); } } } @@ -450,8 +450,8 @@ namespace FFXIVClassic_Lobby_Server { Player p = client.getActor(); - if (p.inventories.ContainsKey(type)) - p.inventories[type].addItem(itemId, quantity, 1); + if (p.getInventory(type) != null) + p.getInventory(type).addItem(itemId, quantity, 1); } else { @@ -459,8 +459,8 @@ namespace FFXIVClassic_Lobby_Server { Player p = entry.Value.getActor(); - if (p.inventories.ContainsKey(type)) - p.inventories[type].addItem(itemId, quantity, 1); + if (p.getInventory(type) != null) + p.getInventory(type).addItem(itemId, quantity, 1); } } } @@ -470,14 +470,14 @@ namespace FFXIVClassic_Lobby_Server if (client != null) { Player p = client.getActor(); - p.inventories[Inventory.NORMAL].removeItem(itemId, quantity); + p.getInventory(Inventory.NORMAL).removeItem(itemId, quantity); } else { foreach (KeyValuePair entry in mConnectedPlayerList) { Player p = entry.Value.getActor(); - p.inventories[Inventory.NORMAL].removeItem(itemId, quantity); + p.getInventory(Inventory.NORMAL).removeItem(itemId, quantity); } } } @@ -488,8 +488,8 @@ namespace FFXIVClassic_Lobby_Server { Player p = client.getActor(); - if (p.inventories.ContainsKey(type)) - p.inventories[type].removeItem(itemId, quantity); + if (p.getInventory(type) != null) + p.getInventory(type).removeItem(itemId, quantity); } else { @@ -497,8 +497,8 @@ namespace FFXIVClassic_Lobby_Server { Player p = entry.Value.getActor(); - if (p.inventories.ContainsKey(type)) - p.inventories[type].removeItem(itemId, quantity); + if (p.getInventory(type) != null) + p.getInventory(type).removeItem(itemId, quantity); } } } @@ -508,14 +508,14 @@ namespace FFXIVClassic_Lobby_Server if (client != null) { Player p = client.getActor(); - p.inventories[Inventory.CURRANCY].addItem(itemId, quantity, 1); + p.getInventory(Inventory.CURRANCY).addItem(itemId, quantity, 1); } else { foreach (KeyValuePair entry in mConnectedPlayerList) { Player p = entry.Value.getActor(); - p.inventories[Inventory.CURRANCY].addItem(itemId, quantity, 1); + p.getInventory(Inventory.CURRANCY).addItem(itemId, quantity, 1); } } } @@ -525,14 +525,14 @@ namespace FFXIVClassic_Lobby_Server if (client != null) { Player p = client.getActor(); - p.inventories[Inventory.CURRANCY].removeItem(itemId, quantity); + p.getInventory(Inventory.CURRANCY).removeItem(itemId, quantity); } else { foreach (KeyValuePair entry in mConnectedPlayerList) { Player p = entry.Value.getActor(); - p.inventories[Inventory.CURRANCY].removeItem(itemId, quantity); + p.getInventory(Inventory.CURRANCY).removeItem(itemId, quantity); } } } @@ -542,14 +542,14 @@ namespace FFXIVClassic_Lobby_Server if (client != null) { Player p = client.getActor(); - p.inventories[Inventory.KEYITEMS].addItem(itemId, 1, 1); + p.getInventory(Inventory.KEYITEMS).addItem(itemId, 1, 1); } else { foreach (KeyValuePair entry in mConnectedPlayerList) { Player p = entry.Value.getActor(); - p.inventories[Inventory.KEYITEMS].addItem(itemId, 1, 1); + p.getInventory(Inventory.KEYITEMS).addItem(itemId, 1, 1); } } } @@ -559,14 +559,14 @@ namespace FFXIVClassic_Lobby_Server if (client != null) { Player p = client.getActor(); - p.inventories[Inventory.KEYITEMS].removeItem(itemId, 1); + p.getInventory(Inventory.KEYITEMS).removeItem(itemId, 1); } else { foreach (KeyValuePair entry in mConnectedPlayerList) { Player p = entry.Value.getActor(); - p.inventories[Inventory.KEYITEMS].removeItem(itemId, 1); + p.getInventory(Inventory.KEYITEMS).removeItem(itemId, 1); } } } diff --git a/FFXIVClassic Map Server/actors/chara/player/Equipment.cs b/FFXIVClassic Map Server/actors/chara/player/Equipment.cs index a3dbd470..d2795664 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Equipment.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Equipment.cs @@ -1,5 +1,6 @@ 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; using System; using System.Collections.Generic; @@ -34,12 +35,15 @@ namespace FFXIVClassic_Map_Server.actors.chara.player private ushort inventoryCapacity; private ushort inventoryCode; private Item[] list; + private Inventory normalInventory; - public Equipment(Player ownerPlayer, ushort capacity, ushort code) + public Equipment(Player ownerPlayer, Inventory normalInventory, ushort capacity, ushort code) { owner = ownerPlayer; inventoryCapacity = capacity; inventoryCode = code; + list = new Item[inventoryCapacity]; + this.normalInventory = normalInventory; } public Item GetItemAtSlot(ushort slot) @@ -50,6 +54,20 @@ namespace FFXIVClassic_Map_Server.actors.chara.player return null; } + public void SendFullEquipment(bool doClear) + { + List slotsToUpdate = new List(); + for (ushort i = 0; i < list.Length; i++) + { + if (list[i] == null && doClear) + slotsToUpdate.Add(0); + else if (list[i] != null) + slotsToUpdate.Add(i); + } + + SendEquipmentPackets(slotsToUpdate); + } + public void SetEquipment(List> toEquip) { List slotsToUpdate = new List(); @@ -64,41 +82,68 @@ namespace FFXIVClassic_Map_Server.actors.chara.player public void Equip(ushort slot, Item item) { - if (slot < list.Length) - list[slot] = item; + if (slot >= list.Length) + return; + + owner.queuePacket(InventoryBeginChangePacket.buildPacket(owner.actorId)); + + if (list[slot] != null) + normalInventory.RefreshItem(list[slot], item); + else + normalInventory.RefreshItem(item); + + owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); SendEquipmentPackets(slot, item); + owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); + + owner.queuePacket(InventoryEndChangePacket.buildPacket(owner.actorId)); + + list[slot] = item; } public void Unequip(ushort slot) { - if (slot < list.Length) - list[slot] = null; + if (slot >= list.Length) + return; + + owner.queuePacket(InventoryBeginChangePacket.buildPacket(owner.actorId)); + + normalInventory.RefreshItem(list[slot]); + + owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); SendEquipmentPackets(slot, null); + owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); + + owner.queuePacket(InventoryEndChangePacket.buildPacket(owner.actorId)); + + list[slot] = null; } private void SendEquipmentPackets(ushort equipSlot, Item item) { if (item == null) - owner.queuePacket(EquipmentListX01Packet.buildPacket(owner.actorId, equipSlot, 0)); + owner.queuePacket(InventoryRemoveX01Packet.buildPacket(owner.actorId, equipSlot)); else owner.queuePacket(EquipmentListX01Packet.buildPacket(owner.actorId, equipSlot, item.slot)); } private void SendEquipmentPackets(List slotsToUpdate) { + owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); + int currentIndex = 0; while (true) { - if (list.Length - currentIndex >= 64) + if (slotsToUpdate.Count - currentIndex >= 64) owner.queuePacket(EquipmentListX64Packet.buildPacket(owner.actorId, list, slotsToUpdate, ref currentIndex)); - else if (list.Length - currentIndex >= 32) + else if (slotsToUpdate.Count - currentIndex >= 32) owner.queuePacket(EquipmentListX32Packet.buildPacket(owner.actorId, list, slotsToUpdate, ref currentIndex)); - else if (list.Length - currentIndex >= 16) + else if (slotsToUpdate.Count - currentIndex >= 16) owner.queuePacket(EquipmentListX16Packet.buildPacket(owner.actorId, list, slotsToUpdate, ref currentIndex)); - else if (list.Length - currentIndex > 1) + else if (slotsToUpdate.Count - currentIndex > 1) owner.queuePacket(EquipmentListX08Packet.buildPacket(owner.actorId, list, slotsToUpdate, ref currentIndex)); - else if (list.Length - currentIndex == 1) + else if (slotsToUpdate.Count - currentIndex == 1) { owner.queuePacket(EquipmentListX01Packet.buildPacket(owner.actorId, slotsToUpdate[currentIndex], list[currentIndex].slot)); currentIndex++; @@ -107,6 +152,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player 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 3dd42141..aeebdc9f 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs @@ -40,6 +40,35 @@ namespace FFXIVClassic_Map_Server.actors.chara.player list = itemsFromDB; } + public Item getItem(ushort slot) + { + if (slot < list.Count) + return list[slot]; + else + return null; + } + + public void RefreshItem(Item item) + { + owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); + sendInventoryPackets(item); + owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); + } + + public void RefreshItem(params Item[] items) + { + owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); + sendInventoryPackets(items.ToList()); + owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); + } + + public void RefreshItem(List items) + { + owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); + sendInventoryPackets(items); + owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); + } + public void addItem(uint itemId, int quantity, byte quality) { if (!isSpaceForAdd(itemId, quantity)) @@ -173,6 +202,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.player sendInventoryRemovePackets(slotsToRemove); owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); + + if (inventoryCode == NORMAL) + owner.getEquipment().SendFullEquipment(false); + owner.queuePacket(InventoryEndChangePacket.buildPacket(owner.actorId)); } @@ -210,6 +243,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.player sendInventoryRemovePackets((ushort)(oldListSize - 1)); owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); + + if (inventoryCode == NORMAL) + owner.getEquipment().SendFullEquipment(false); + owner.queuePacket(InventoryEndChangePacket.buildPacket(owner.actorId)); } @@ -236,6 +273,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.player sendInventoryRemovePackets((ushort)(oldListSize - 1)); owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); + + if (inventoryCode == NORMAL) + owner.getEquipment().SendFullEquipment(false); + owner.queuePacket(InventoryEndChangePacket.buildPacket(owner.actorId)); } @@ -268,6 +309,31 @@ namespace FFXIVClassic_Map_Server.actors.chara.player owner.queuePacket(InventoryListX01Packet.buildPacket(owner.actorId, item)); } + private void sendInventoryPackets(List items) + { + int currentIndex = 0; + + while (true) + { + if (items.Count - currentIndex >= 64) + owner.queuePacket(InventoryListX64Packet.buildPacket(owner.actorId, items, ref currentIndex)); + else if (items.Count - currentIndex >= 32) + owner.queuePacket(InventoryListX32Packet.buildPacket(owner.actorId, items, ref currentIndex)); + else if (items.Count - currentIndex >= 16) + owner.queuePacket(InventoryListX16Packet.buildPacket(owner.actorId, items, ref currentIndex)); + else if (items.Count - currentIndex > 1) + owner.queuePacket(InventoryListX08Packet.buildPacket(owner.actorId, items, ref currentIndex)); + else if (items.Count - currentIndex == 1) + { + owner.queuePacket(InventoryListX01Packet.buildPacket(owner.actorId, items[currentIndex])); + currentIndex++; + } + else + break; + } + + } + private void sendInventoryPackets(int startOffset) { int currentIndex = startOffset; diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 7e43dc79..d5ba6cbd 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -32,7 +32,7 @@ namespace FFXIVClassic_Map_Server.Actors public const int MAXSIZE_INVENTORY_LOOT = 10; public const int MAXSIZE_INVENTORY_MELDREQUEST = 4; public const int MAXSIZE_INVENTORY_BAZAAR = 10; - public const int MAXSIZE_INVENTORY_EQUIPMENT = 10; + public const int MAXSIZE_INVENTORY_EQUIPMENT = 35; public const int TIMER_TOTORAK = 0; public const int TIMER_DZEMAEL = 1; @@ -61,8 +61,8 @@ namespace FFXIVClassic_Map_Server.Actors public uint currentTitle; //Inventory - public Dictionary inventories = new Dictionary(); - public int[] invEquipment = new int[MAXSIZE_INVENTORY_EQUIPMENT]; + private Dictionary inventories = new Dictionary(); + private Equipment equipment; //GC Related public byte gcCurrent; @@ -102,6 +102,8 @@ namespace FFXIVClassic_Map_Server.Actors inventories[Inventory.BAZAAR] = new Inventory(this, MAXSIZE_INVENTORY_BAZAAR, Inventory.BAZAAR); inventories[Inventory.LOOT] = new Inventory(this, MAXSIZE_INVENTORY_LOOT, Inventory.LOOT); + equipment = new Equipment(this, inventories[Inventory.NORMAL], MAXSIZE_INVENTORY_EQUIPMENT, Inventory.EQUIPMENT); + charaWork.property[0] = 1; charaWork.property[1] = 1; charaWork.property[2] = 1; @@ -431,7 +433,8 @@ namespace FFXIVClassic_Map_Server.Actors BasePacket partyListPacket = BasePacket.createPacket(ListUtils.createPartyList(actorId, 0xF4, 1, 0x8000000000696df2, partyListEntries), true, false); playerSession.queuePacket(partyListPacket); #endregion - + + #region Inventory & Equipment queuePacket(InventoryBeginChangePacket.buildPacket(actorId)); inventories[Inventory.NORMAL].sendFullInventory(); inventories[Inventory.CURRANCY].sendFullInventory(); @@ -439,21 +442,9 @@ namespace FFXIVClassic_Map_Server.Actors inventories[Inventory.BAZAAR].sendFullInventory(); inventories[Inventory.MELDREQUEST].sendFullInventory(); inventories[Inventory.LOOT].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); - - //Equip Init - // playerSession.queuePacket(InventorySetBeginPacket.buildPacket(actorId, 0x23, InventorySetBeginPacket.CODE_EQUIPMENT), true, false); - // playerSession.queuePacket(BasePacket.createPacket(initialEqupmentPacket.buildPackets(actorId), true, false)); - // playerSession.queuePacket(InventorySetEndPacket.buildPacket(actorId), true, false); + equipment.SendFullEquipment(false); + playerSession.queuePacket(InventoryEndChangePacket.buildPacket(actorId), true, false); #endregion - playerSession.queuePacket(InventoryEndChangePacket.buildPacket(actorId), true, false); playerSession.queuePacket(getInitPackets(actorId)); @@ -646,7 +637,15 @@ namespace FFXIVClassic_Map_Server.Actors public Inventory getInventory(ushort type) { - return inventories[type]; + if (inventories.ContainsKey(type)) + return inventories[type]; + else + return null; + } + + public Equipment getEquipment() + { + return equipment; } public void runEventFunction(string functionName, params object[] parameters)