void HandleSetTradeItem(SetTradeItem setTradeItem) { TradeData my_trade = GetPlayer().GetTradeData(); if (my_trade == null) { return; } TradeStatusPkt info = new TradeStatusPkt(); // invalid slot number if (setTradeItem.TradeSlot >= (byte)TradeSlots.Count) { info.Status = TradeStatus.Cancelled; SendTradeStatus(info); return; } // check cheating, can't fail with correct client operations Item item = GetPlayer().GetItemByPos(setTradeItem.PackSlot, setTradeItem.ItemSlotInPack); if (!item || (setTradeItem.TradeSlot != (byte)TradeSlots.NonTraded && !item.CanBeTraded(false, true))) { info.Status = TradeStatus.Cancelled; SendTradeStatus(info); return; } ObjectGuid iGUID = item.GetGUID(); // prevent place single item into many trade slots using cheating and client bugs if (my_trade.HasItem(iGUID)) { // cheating attempt info.Status = TradeStatus.Cancelled; SendTradeStatus(info); return; } my_trade.UpdateClientStateIndex(); if (setTradeItem.TradeSlot != (byte)TradeSlots.NonTraded && item.IsBindedNotWith(my_trade.GetTrader())) { info.Status = TradeStatus.NotOnTaplist; info.TradeSlot = setTradeItem.TradeSlot; SendTradeStatus(info); return; } my_trade.SetItem((TradeSlots)setTradeItem.TradeSlot, item); }