From 08c5980b2273ae7c4664989f45709448c95b14bb Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sun, 10 Dec 2017 15:13:33 -0500 Subject: [PATCH] Moved SendItemPackage to character class. Added a flag check after a bazaar purchase is made. Discovered a flag in InventoryBeginChangePacket that either modifies the client package or clears and refills it. Implemented this mode for a bunch of "SendFullInventory" methods. --- .../FFXIVClassic Map Server.csproj | 2 +- FFXIVClassic Map Server/WorldManager.cs | 2 ++ FFXIVClassic Map Server/actors/chara/Character.cs | 11 +++++++++++ .../actors/chara/player/Player.cs | 14 +++----------- .../dataobjects/InventoryItem.cs | 9 +++------ .../Actor/inventory/InventoryBeginChangePacket.cs | 11 ++++------- 6 files changed, 24 insertions(+), 25 deletions(-) diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index 7f5f9e68..99ceaa98 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -146,7 +146,7 @@ - + diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs index daba1e69..db1eacfc 100644 --- a/FFXIVClassic Map Server/WorldManager.cs +++ b/FFXIVClassic Map Server/WorldManager.cs @@ -1073,6 +1073,8 @@ namespace FFXIVClassic_Map_Server buyer.GetItemPackage(Inventory.CURRENCY_CRYSTALS).RemoveItem(1000001, cost); } + bazaar.CheckBazaarFlags(); + return true; } diff --git a/FFXIVClassic Map Server/actors/chara/Character.cs b/FFXIVClassic Map Server/actors/chara/Character.cs index 3e0c1cb8..e89cd8b6 100644 --- a/FFXIVClassic Map Server/actors/chara/Character.cs +++ b/FFXIVClassic Map Server/actors/chara/Character.cs @@ -5,6 +5,7 @@ using FFXIVClassic_Map_Server.actors.group; using FFXIVClassic_Map_Server.Actors.Chara; using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.packets.send.actor; +using FFXIVClassic_Map_Server.packets.send.actor.inventory; using FFXIVClassic_Map_Server.utils; using System.Collections.Generic; @@ -125,6 +126,16 @@ namespace FFXIVClassic_Map_Server.Actors #region Inventory + public void SendItemPackage(Player player, uint id) + { + if (!itemPackages.ContainsKey((ushort)id)) + return; + + player.QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId, true)); + itemPackages[(ushort)id].SendFullInventory(player); + player.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId)); + } + public void AddItem(uint catalogID) { AddItem(catalogID, 1); diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index f38dd81c..08fc70d2 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -552,7 +552,7 @@ namespace FFXIVClassic_Map_Server.Actors //GetSpawnPackets(actorId, spawnType).DebugPrintPacket(); #region Inventory & Equipment - QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId)); + QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId, true)); itemPackages[Inventory.NORMAL].SendFullInventory(this); itemPackages[Inventory.CURRENCY_CRYSTALS].SendFullInventory(this); itemPackages[Inventory.KEYITEMS].SendFullInventory(this); @@ -1630,7 +1630,9 @@ namespace FFXIVClassic_Map_Server.Actors public void SendMyTradeToPlayer(Player player) { Inventory tradeInventory = new Inventory(this, 4, Inventory.TRADE); + player.QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId, true)); tradeInventory.SendFullInventory(player); + player.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId)); } public void SendDataPacket(params object[] parameters) @@ -1817,16 +1819,6 @@ namespace FFXIVClassic_Map_Server.Actors chocoboAppearance = appearanceId; } - public void SendItemPackage(Player player, uint id) - { - if (!itemPackages.ContainsKey((ushort)id)) - return; - - player.QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId)); - itemPackages[(ushort)id].SendFullInventory(player); - player.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId)); - } - public Retainer SpawnMyRetainer(Npc bell, int retainerIndex) { Retainer retainer = Database.LoadRetainer(this, retainerIndex); diff --git a/FFXIVClassic Map Server/dataobjects/InventoryItem.cs b/FFXIVClassic Map Server/dataobjects/InventoryItem.cs index 50d570a0..879cdaa9 100644 --- a/FFXIVClassic Map Server/dataobjects/InventoryItem.cs +++ b/FFXIVClassic Map Server/dataobjects/InventoryItem.cs @@ -236,12 +236,9 @@ namespace FFXIVClassic_Map_Server.dataobjects public void RefreshPositioning(Character owner, ushort itemPackage, ushort slot) { - lock (owner.GetItemPackage(itemPackage)) - { - this.owner = owner; - this.itemPackage = itemPackage; - this.slot = slot; - } + this.owner = owner; + this.itemPackage = itemPackage; + this.slot = slot; } public void SetExclusive(bool isExclusive) diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryBeginChangePacket.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryBeginChangePacket.cs index 6f423d78..1601fe33 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryBeginChangePacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryBeginChangePacket.cs @@ -7,16 +7,13 @@ 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) + public static SubPacket BuildPacket(uint playerActorID, bool clearItemPackage = false) { byte[] data = new byte[8]; - data[0] = 2; - return new SubPacket(OPCODE, sourceActorId, data); - } - public static SubPacket BuildPacket(uint playerActorID) - { - byte[] data = new byte[8]; + if (clearItemPackage) + data[0] = 2; + return new SubPacket(OPCODE, playerActorID, data); } }