Пример #1
0
        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());
            }
        }