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
+{
+}