Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 108 additions & 0 deletions src/ZoneServer/Network/PacketHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1905,6 +1905,114 @@ public void CZ_MAP_SEARCH_INFO(IZoneConnection conn, Packet packet)
public void CZ_EXCHANGE_REQUEST(IZoneConnection conn, Packet packet)
{
var targetHandle = packet.GetInt();

var character = conn.SelectedCharacter;

if (character == null)
return;

var targetCharacter = character.Map.GetCharacter(targetHandle);
if (targetCharacter == null)
{
Log.Warning("CZ_EXCHANGE_REQUEST: User '{0}' trade partner not found.", conn.Account.Name);
return;
}

ZoneServer.Instance.World.Trades.RequestTrade(character, targetCharacter);
}

/// <summary>
/// Indicates an accepted request from the client to trade with another character.
/// </summary>
/// <param name="conn"></param>
/// <param name="packet"></param>
[PacketHandler(Op.CZ_EXCHANGE_ACCEPT)]
public void CZ_EXCHANGE_ACCEPT(IZoneConnection conn, Packet packet)
{
var character = conn.SelectedCharacter;

if (!character.IsTrading)
{
Log.Warning("CZ_EXCHANGE_ACCEPT: User '{0}' tried to accept a non-existent trade.", conn.Account.Name);
return;
}

ZoneServer.Instance.World.Trades.StartTrade(character);
}

/// <summary>
/// Request to offer an item for trade
/// </summary>
/// <param name="conn"></param>
/// <param name="packet"></param>
[PacketHandler(Op.CZ_EXCHANGE_OFFER)]
public void CZ_EXCHANGE_OFFER(IZoneConnection conn, Packet packet)
{
var i1 = packet.GetInt();
var worldId = packet.GetLong();
var amount = packet.GetInt();
var i3 = packet.GetInt();

var character = conn.SelectedCharacter;

if (character == null)
return;

if (!character.IsTrading)
{
Log.Warning("CZ_EXCHANGE_OFFER: User '{0}' tried to trade without actually trading.", conn.Account.Name);
return;
}

ZoneServer.Instance.World.Trades.OfferTradeItem(character, worldId, amount);
}

/// <summary>
/// Initial trade agreement request
/// </summary>
/// <param name="conn"></param>
/// <param name="packet"></param>
[PacketHandler(Op.CZ_EXCHANGE_AGREE)]
public void CZ_EXCHANGE_AGREE(IZoneConnection conn, Packet packet)
{
var character = conn.SelectedCharacter;

if (character == null)
return;

ZoneServer.Instance.World.Trades.ConfirmTrade(character);
}

/// <summary>
/// Final trade agreement request
/// </summary>
/// <param name="conn"></param>
/// <param name="packet"></param>
[PacketHandler(Op.CZ_EXCHANGE_FINALAGREE)]
public void CZ_EXCHANGE_FINALAGREE(IZoneConnection conn, Packet packet)
{
var character = conn.SelectedCharacter;

if (character == null)
return;

ZoneServer.Instance.World.Trades.FinalConfirmTrade(character);
}

/// <summary>
/// Cancel trade request
/// </summary>
/// <param name="conn"></param>
/// <param name="packet"></param>
[PacketHandler(Op.CZ_EXCHANGE_CANCEL)]
public void CZ_EXCHANGE_CANCEL(IZoneConnection conn, Packet packet)
{
var character = conn.SelectedCharacter;

if (character == null)
return;

ZoneServer.Instance.World.Trades.CancelTrade(character);
}

/// <summary>
Expand Down
133 changes: 133 additions & 0 deletions src/ZoneServer/Network/Send.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1552,6 +1552,139 @@ public static void ZC_OBJECT_PROPERTY(IZoneConnection conn, long objectId, Prope
conn.Send(packet);
}

/// <summary>
/// Send a trade request to another player acknowledgement
/// </summary>
/// <param name="character"></param>
public static void ZC_EXCHANGE_REQUEST_ACK(Character character)
{
var packet = new Packet(Op.ZC_EXCHANGE_REQUEST_ACK);

packet.PutString(character.Name, 65);
packet.PutByte(0);

character.Connection.Send(packet);
}

/// <summary>
/// Send a trade request to another player
/// </summary>
/// <param name="character"></param>
public static void ZC_EXCHANGE_REQUEST_RECEIVED(Character character, string requesterName)
{
var packet = new Packet(Op.ZC_EXCHANGE_REQUEST_RECEIVED);

packet.PutString(requesterName, 65);

character.Connection.Send(packet);
}

/// <summary>
/// Send start trade to client
/// </summary>
/// <param name="character"></param>
public static void ZC_EXCHANGE_START(Character character, string tradePartnerTeamName)
{
var packet = new Packet(Op.ZC_EXCHANGE_START);

packet.PutString(tradePartnerTeamName, 65);
packet.PutByte(0);

character.Connection.Send(packet);
}

/// <summary>
/// Send item offer to client
/// </summary>
/// <param name="character"></param>
public static void ZC_EXCHANGE_OFFER_ACK(Character character, bool sameAsSender, Item item, int amount)
{
var packet = new Packet(Op.ZC_EXCHANGE_OFFER_ACK);

var propertyList = item.Properties.GetAll();
var propertiesSize = propertyList.GetByteCount();

packet.PutByte((byte)(sameAsSender ? 0 : 1));
packet.PutInt(0);
packet.PutInt(-1);
packet.PutLong(item.ObjectId);
packet.PutInt(item.Id);
packet.PutInt(amount);
packet.PutShort(propertiesSize);
packet.AddProperties(propertyList);
packet.PutShort(0);
packet.PutLong(item.ObjectId);

// TODO:
// Check for item sockets when trading
// -----------------------------------
// if (!item.HasSockets)
// packet.PutShort(0);
// else
// {
// var gems = item.GetGemSockets();
// packet.PutShort(gems.Count);
//
// short gemIndex = 0;
// foreach (var gem in gems)
// {
// packet.AddSocket(gemIndex, gem);
// gemIndex++;
// }
// }

character.Connection.Send(packet);
}

/// <summary>
/// Send exchange initial agree acknowledgement to client
/// </summary>
/// <param name="character"></param>
/// <param name="isSameAsSender"></param>
public static void ZC_EXCHANGE_AGREE_ACK(Character character, bool isSameAsSender)
{
var packet = new Packet(Op.ZC_EXCHANGE_AGREE_ACK);
packet.PutByte((byte)(isSameAsSender ? 0 : 1));

character.Connection.Send(packet);
}

/// <summary>
/// Send exchange final agree acknowledgement to client
/// </summary>
/// <param name="character"></param>
/// <param name="isSameAsSender"></param>
public static void ZC_EXCHANGE_FINALAGREE_ACK(Character character, bool isSameAsSender)
{
var packet = new Packet(Op.ZC_EXCHANGE_FINALAGREE_ACK);

packet.PutByte((byte)(isSameAsSender ? 0 : 1));

character.Connection.Send(packet);
}

/// <summary>
/// Send trade successfully completed
/// </summary>
/// <param name="character"></param>
public static void ZC_EXCHANGE_SUCCESS(Character character)
{
var packet = new Packet(Op.ZC_EXCHANGE_SUCCESS);

character.Connection.Send(packet);
}

/// <summary>
/// Send trade canceled
/// </summary>
/// <param name="character"></param>
public static void ZC_EXCHANGE_CANCEL_ACK(Character character)
{
var packet = new Packet(Op.ZC_EXCHANGE_CANCEL_ACK);

character.Connection.Send(packet);
}

/// <summary>
/// Updates actor's rotation for characters in range of it.
/// </summary>
Expand Down
5 changes: 5 additions & 0 deletions src/ZoneServer/World/Actors/Characters/Character.cs
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,11 @@ public class Character : Actor, IActor, ICombatEntity, ICommander, IPropertyObje
/// </summary>
public bool IsSitting { get; set; }

/// <summary>
/// Gets whether the character is currently in a trade.
/// </summary>
public bool IsTrading => ZoneServer.Instance.World.Trades.IsTrading(this.ObjectId);

/// <summary>
/// Returns the character's personal storage.
/// </summary>
Expand Down
11 changes: 9 additions & 2 deletions src/ZoneServer/World/Items/Item.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public Item(int itemId, int amount = 1)
/// Creates a copy of the given item.
/// </summary>
/// <param name="other"></param>
public Item(Item other)
public Item(Item other, int amount = -1)
{
this.Id = other.Id;
this.LoadData();
Expand All @@ -129,8 +129,15 @@ public Item(Item other)
this.LootProtectionEnd = other.LootProtectionEnd;

other.Properties.CopyFrom(this.Properties);
// TODO:
// Copy sockets
// -----------------------------------
// this.CopyGemSockets(other);

this.Amount = other.Amount;
if (amount == -1)
this.Amount = other.Amount;
else
this.Amount = amount;
}

/// <summary>
Expand Down
Loading