From 94491903f774476eed4f16d7be12032e71807a5c Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sun, 1 Oct 2017 12:23:54 -0400 Subject: [PATCH] More trade work. --- .../FFXIVClassic Map Server.csproj | 1 + FFXIVClassic Map Server/WorldManager.cs | 6 ++ .../actors/chara/player/Inventory.cs | 17 ++++- .../actors/chara/player/Player.cs | 62 +++++++++++++++++++ .../dataobjects/TradeTransaction.cs | 9 +++ 5 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 FFXIVClassic Map Server/dataobjects/TradeTransaction.cs diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index 7db51905..3febcfd7 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -111,6 +111,7 @@ + diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs index 62e9779b..e092b465 100644 --- a/FFXIVClassic Map Server/WorldManager.cs +++ b/FFXIVClassic Map Server/WorldManager.cs @@ -959,6 +959,12 @@ namespace FFXIVClassic_Map_Server Player inviter = (Player)invitee.GetZone().FindActorInArea(group.GetHost()); DeleteTradeGroup(group.groupIndex); + + inviter.StartTradeTransaction(invitee); + invitee.StartTradeTransaction(inviter); + + inviter.KickEvent(Server.GetStaticActors("TradeExecuteCommand"), "commandContent", null, null, null, 16, null, null, null, null, null); + invitee.KickEvent(Server.GetStaticActors("TradeExecuteCommand"), "commandContent", null, null, null, 16, null, null, null, null, null); } public void CancelTradeTooFar(Player inviter) diff --git a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs index 6770643f..5cc25122 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs @@ -14,13 +14,14 @@ namespace FFXIVClassic_Map_Server.actors.chara.player class Inventory { public const ushort NORMAL = 0; //Max 0xC8 - public const ushort TRADE = 1; //Max 0x96 + public const ushort UNKNOWN = 1; //Max 0x96 public const ushort LOOT = 4; //Max 0xA public const ushort MELDREQUEST = 5; //Max 0x04 public const ushort BAZAAR = 7; //Max 0x0A public const ushort CURRENCY_CRYSTALS = 99; //Max 0x140 public const ushort KEYITEMS = 100; //Max 0x500 - public const ushort EQUIPMENT = 0x00FE; //Max 0x23 + public const ushort EQUIPMENT = 0x00FE; //Max 0x23 + public const ushort TRADE = 0x00FD; //Max 0x04 public const ushort EQUIPMENT_OTHERPLAYER = 0x00F9; //Max 0x23 public enum INV_ERROR { @@ -293,6 +294,18 @@ namespace FFXIVClassic_Map_Server.actors.chara.player } } + public void Clear() + { + for (int i = 0; i < endOfListIndex; i++) + { + list[i] = null; + isDirty[i] = true; + } + endOfListIndex = 0; + + SendUpdatePackets(); + } + public void ChangeDurability(uint slot, uint durabilityChange) { isDirty[slot] = true; diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index b6b6de8e..f08ce14a 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -108,6 +108,10 @@ namespace FFXIVClassic_Map_Server.Actors private Dictionary inventories = new Dictionary(); private Equipment equipment; + //Trading + private Player otherTrader = null; + private Inventory myOfferings; + //GC Related public byte gcCurrent; public byte gcRankLimsa; @@ -257,6 +261,8 @@ namespace FFXIVClassic_Map_Server.Actors Database.LoadPlayerCharacter(this); lastPlayTimeUpdate = Utils.UnixTimeStampUTC(); + + } public List Create0x132Packets() @@ -1775,5 +1781,61 @@ namespace FFXIVClassic_Map_Server.Actors } } + public void StartTradeTransaction(Player otherPlayer) + { + myOfferings = new Inventory(this, 4, Inventory.TRADE, true); + Inventory otherPlayerOfferings = new Inventory(otherPlayer, 4, Inventory.TRADE, true); + + QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId)); + QueuePacket(InventorySetBeginPacket.BuildPacket(actorId, 4, Inventory.TRADE)); + + QueuePacket(EquipmentListX01Packet.BuildPacket(actorId, 1, 1)); + + QueuePacket(InventorySetEndPacket.BuildPacket(actorId)); + QueuePacket(InventoryEndChangePacket.BuildPacket(actorId)); + + myOfferings.SendFullInventory(this); + + otherTrader = otherPlayer; + } + + public void Test() + { + QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId)); + QueuePacket(InventorySetBeginPacket.BuildPacket(actorId, 4, Inventory.TRADE)); + + QueuePacket(InventoryRemoveX01Packet.BuildPacket(actorId, 1)); + + QueuePacket(InventorySetEndPacket.BuildPacket(actorId)); + QueuePacket(InventoryEndChangePacket.BuildPacket(actorId)); + } + public void Test2() + { + QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId)); + QueuePacket(InventorySetBeginPacket.BuildPacket(actorId, 4, Inventory.TRADE)); + + QueuePacket(EquipmentListX01Packet.BuildPacket(actorId, 1, 1)); + + QueuePacket(InventorySetEndPacket.BuildPacket(actorId)); + QueuePacket(InventoryEndChangePacket.BuildPacket(actorId)); + } + + + public Inventory GetTradeOfferings() + { + return myOfferings; + } + + public void FinishTradeTransaction() + { + myOfferings = null; + otherTrader = null; + } + + public void CancelTradeTransaction() + { + myOfferings = null; + otherTrader = null; + } } } diff --git a/FFXIVClassic Map Server/dataobjects/TradeTransaction.cs b/FFXIVClassic Map Server/dataobjects/TradeTransaction.cs new file mode 100644 index 00000000..47d71315 --- /dev/null +++ b/FFXIVClassic Map Server/dataobjects/TradeTransaction.cs @@ -0,0 +1,9 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.dataobjects +{ +}