Esempio n. 1
0
 public void AddMesos(MapleCharacter chr, long mesos)
 {
     if (Type == TradeType.Trade && Partners.Count == 1 && Partners[0].Trade == this)
     {
         if (chr == Owner)
         {
             if (OwnerMesos + mesos <= chr.Inventory.Mesos)
             {
                 OwnerMesos += mesos;
             }
             Owner.Client.SendPacket(UpdateTradeMesos(OwnerMesos, 0));
             Partners[0].Client.SendPacket(UpdateTradeMesos(OwnerMesos, 1));
             MapleInventory.UpdateMesos(Owner.Client, Owner.Inventory.Mesos - OwnerMesos);
         }
         else if (chr == Partners[0])
         {
             if (PartnerMesos + mesos <= chr.Inventory.Mesos)
             {
                 PartnerMesos += mesos;
             }
             Owner.Client.SendPacket(UpdateTradeMesos(PartnerMesos, 1));
             Partners[0].Client.SendPacket(UpdateTradeMesos(PartnerMesos, 0));
             MapleInventory.UpdateMesos(Partners[0].Client, Partners[0].Inventory.Mesos - PartnerMesos);
         }
     }
 }
        private static bool GetAndCheckItemsFromInventory(MapleInventory inventory, short equipSlot, short scrollSlot, out MapleEquip equip, out MapleItem scroll)
        {
            MapleInventoryType equipInventory = equipSlot < 0 ? MapleInventoryType.Equipped : MapleInventoryType.Equip;

            equip  = inventory.GetItemSlotFromInventory(equipInventory, equipSlot) as MapleEquip;
            scroll = inventory.GetItemSlotFromInventory(MapleInventoryType.Use, scrollSlot);
            return(equip != null && scroll != null);
        }
Esempio n. 3
0
        public static void Handle(MapleClient c, PacketReader pw)
        {
            MapleCharacter chr = c.Account.Character;

            if (!chr.DisableActions())
            {
                return;
            }
            int tickCount           = pw.ReadInt();
            MapleInventoryType type = (MapleInventoryType)pw.ReadByte();
            short oldPosition       = pw.ReadShort();
            short newPosition       = pw.ReadShort();
            short quantity          = pw.ReadShort();
            bool  success           = false;

            if (oldPosition == newPosition)
            {
                return;
            }
            try
            {
                MapleInventory inventory = chr.Inventory;

                if (newPosition < 0 && oldPosition > 0) //equip item
                {
                    success = inventory.EquipItem(oldPosition, newPosition);
                }
                else if (oldPosition < 0 && newPosition > 0) //unequip item
                {
                    success = inventory.UnEquip(oldPosition, newPosition);
                }
                else if (newPosition == 0) //drop item
                {
                    if (!chr.Map.DropItemLimit)
                    {
                        success = inventory.DropItem(type, oldPosition, quantity);
                    }
                }
                else //item moved within inventory
                {
                    success = inventory.MoveItem(type, oldPosition, newPosition);
                }
            }
            finally
            {
                chr.EnableActions(!success);
            }
        }
Esempio n. 4
0
 public void Close(bool finished, bool success) //may be different for non-trade types like shops
 {
     Owner.Trade = null;
     if (Owner.Client != null)
     {
         Owner.Client.SendPacket(GenerateTradeClose(finished, success));
         MapleInventory.UpdateMesos(Owner.Client, Owner.Inventory.Mesos);
         if (!success || !finished)
         {
             foreach (TradeItem item in items[0])
             {
                 if (item != null)
                 {
                     Owner.Client.SendPacket(MapleInventory.Packets.AddItem(item.Item, item.Item.InventoryType, item.Item.Position)); //force the "hidden" items to reappear
                 }
             }
             Owner.EnableActions();
         } 
         else 
             Owner.EnableActions(false);
     }
     foreach (MapleCharacter chr in Partners.Where(chr => chr.Trade == this))
     {
         chr.Client.SendPacket(GenerateTradeClose(finished, success));
         chr.Trade = null;
         MapleInventory.UpdateMesos(chr.Client, chr.Inventory.Mesos);
         if (Type == TradeType.Trade)
         {
             if (!success || !finished)
             {
                 foreach (TradeItem item in items[1])
                 {
                     if (item == null) continue;
                     chr.Client.SendPacket(MapleInventory.Packets.AddItem(item.Item, item.Item.InventoryType, item.Item.Position));
                 }
             }
         }
         chr.EnableActions(false);
     }
     TradeIDs.Remove(TradeID);
 }
        public static void Handle(MapleClient c, PacketReader pr)
        {
            try
            {
                if (c.NpcEngine != null && c.NpcEngine.IsShop)
                {
                    byte mode  = pr.ReadByte();
                    int  NpcId = c.NpcEngine.NpcId;
                    switch (mode)
                    {
                    case 0:
                    {
                        short shopIndex = pr.ReadShort();
                        int   itemId    = pr.ReadInt();
                        short amount    = pr.ReadShort();
                        c.NpcEngine.BuyItem(itemId, shopIndex, amount);
                        break;
                    }

                    case 1:     //sell
                    {
                        short inventoryIndex = pr.ReadShort();
                        int   itemId         = pr.ReadInt();
                        short qty            = pr.ReadShort();

                        MapleInventoryType invType = ItemConstants.GetInventoryType(itemId);
                        switch (invType)
                        {
                        case MapleInventoryType.Equip:
                        case MapleInventoryType.Etc:
                        case MapleInventoryType.Setup:
                        case MapleInventoryType.Use:
                            break;

                        default:
                            return;         // Not a valid item
                        }
                        WzItem wzitem = DataBuffer.GetItemById(itemId);
                        if (wzitem == null)
                        {
                            wzitem = DataBuffer.GetEquipById(itemId);
                        }
                        if (wzitem == null)     // Item doesnt exist (anymore?)
                        {
                            return;
                        }
                        if (wzitem.NotSale || wzitem.IsCashItem || wzitem.IsQuestItem)
                        {
                            return;
                        }
                        byte response = 0;
                        if (!wzitem.IsQuestItem)
                        {
                            MapleInventory inventory = c.Account.Character.Inventory;
                            MapleItem      item      = inventory.GetItemSlotFromInventory(invType, inventoryIndex);
                            if (item?.ItemId == itemId && item.Quantity >= qty)
                            {
                                if (inventory.Mesos + wzitem.Price > GameConstants.MAX_MESOS)
                                {
                                    response = 2;     // You do not have enough mesos
                                }
                                else
                                {
                                    inventory.RemoveItemsFromSlot(item.InventoryType, item.Position, qty, true);
                                    inventory.GainMesos(wzitem.Price * qty, false, false);
                                }
                                // TODO: buyback
                            }
                        }
                        PacketWriter pw = new PacketWriter();
                        pw.WriteHeader(SendHeader.NpcTransaction);
                        pw.WriteByte(response);
                        pw.WriteByte(0);
                        pw.WriteByte(0);
                        c.SendPacket(pw);
                        break;
                    }

                    case 3:
                    {
                        c.NpcEngine.Dispose();
                        break;
                    }

                    default:
                    {
                        c.NpcEngine.ScriptInstance = null;
                        ServerConsole.Warning("Unkown NpcShopActionHandler mode:" + mode);
                        ServerConsole.Info(Functions.ByteArrayToStr(pr.ToArray()));
                        break;
                    }
                    }
                }
            }
            catch (Exception ex)
            {
                ServerConsole.Error("NpcShopActionHandler Failure");
                ServerConsole.Error(ex.Message);
                if (c.NpcEngine != null)
                {
                    c.NpcEngine.Dispose();
                }
            }
        }