private void DoTrade() { byte TargetReqItems = 0; byte TraderReqItems = 0; byte i = 0; do { checked { if (TraderSlots[i] > 0) { TargetReqItems = (byte)(TargetReqItems + 1); } if (TargetSlots[i] > 0) { TraderReqItems = (byte)(TraderReqItems + 1); } i = (byte)unchecked ((uint)(i + 1)); } }while (i <= 5u); try { if (Target.ItemFREESLOTS() < TargetReqItems) { Packets.PacketClass responseUnAccept2 = new(Opcodes.SMSG_TRADE_STATUS); try { responseUnAccept2.AddInt32(7); Target.client.SendMultiplyPackets(ref responseUnAccept2); TraderAccept = false; Trader.client.SendMultiplyPackets(ref responseUnAccept2); TraderAccept = false; } finally { responseUnAccept2.Dispose(); } Packets.PacketClass responseNoSlot2 = new(Opcodes.SMSG_INVENTORY_CHANGE_FAILURE); try { responseNoSlot2.AddInt8(50); responseNoSlot2.AddUInt64(0uL); responseNoSlot2.AddUInt64(0uL); responseNoSlot2.AddInt8(0); Target.client.Send(ref responseNoSlot2); } finally { responseNoSlot2.Dispose(); } return; } if (Trader.ItemFREESLOTS() < TraderReqItems) { Packets.PacketClass responseUnAccept = new(Opcodes.SMSG_TRADE_STATUS); try { responseUnAccept.AddInt32(7); Target.client.SendMultiplyPackets(ref responseUnAccept); TraderAccept = false; Trader.client.SendMultiplyPackets(ref responseUnAccept); TargetAccept = false; } finally { responseUnAccept.Dispose(); } Packets.PacketClass responseNoSlot = new(Opcodes.SMSG_INVENTORY_CHANGE_FAILURE); try { responseNoSlot.AddInt8(50); responseNoSlot.AddUInt64(0uL); responseNoSlot.AddUInt64(0uL); responseNoSlot.AddInt8(0); Trader.client.Send(ref responseNoSlot); } finally { responseNoSlot.Dispose(); } return; } if ((TargetGold > 0L) || (TraderGold > 0L)) { checked { Trader.Copper = Trader.Copper - TraderGold + TargetGold; Target.Copper = Target.Copper + TraderGold - TargetGold; Trader.SetUpdateFlag(1176, Trader.Copper); Target.SetUpdateFlag(1176, Target.Copper); } } if (TargetReqItems > 0 || TraderReqItems > 0) { byte j = 0; do { checked { if (TraderSlots[j] > 0) { var mySlot2 = (byte)(TraderSlots[j] & 0xFF); var myBag2 = (byte)(TraderSlots[j] >> 8); ItemObject myItem2 = null; myItem2 = (myBag2 != 0) ? Trader.Items[myBag2].Items[mySlot2] : Trader.Items[mySlot2]; if (myItem2.ItemInfo.ObjectClass != ITEM_CLASS.ITEM_CLASS_QUEST) { myItem2.OwnerGUID = Target.GUID; if (Target.ItemADD(ref myItem2)) { Trader.ItemREMOVE(myBag2, mySlot2, Destroy: false, Update: false); } } } if (TargetSlots[j] > 0) { var mySlot = (byte)(TargetSlots[j] & 0xFF); var myBag = (byte)(TargetSlots[j] >> 8); ItemObject myItem = null; myItem = (myBag != 0) ? Target.Items[myBag].Items[mySlot] : Target.Items[mySlot]; if (myItem.ItemInfo.ObjectClass != ITEM_CLASS.ITEM_CLASS_QUEST) { myItem.OwnerGUID = Trader.GUID; if (Trader.ItemADD(ref myItem)) { Target.ItemREMOVE(myBag, mySlot, Destroy: false, Update: false); } } } j = (byte)unchecked ((uint)(j + 1)); } }while (j <= 5u); } Trader.SendCharacterUpdate(); Target.SendCharacterUpdate(); Packets.PacketClass response = new(Opcodes.SMSG_TRADE_STATUS); try { response.AddInt32(8); Target.client.SendMultiplyPackets(ref response); Trader.client.SendMultiplyPackets(ref response); } finally { response.Dispose(); Dispose(); } } catch (Exception e) { WorldServiceLocator._WorldServer.Log.WriteLine(LogType.FAILED, "Error doing trade: {0}{1}", Environment.NewLine, e.ToString()); } }