Пример #1
0
        public static void TradePutItem(InPacket lea, Client c)
        {
            var chr        = c.Character;
            int SourceType = lea.ReadShort();
            int SourceSlot = lea.ReadShort();
            int Quantity   = lea.ReadInt();

            if (SourceType == 0x64 && SourceSlot == 0x64)
            {
                // Money欄位
                chr.Money      -= Quantity;
                chr.Trade.Money = Quantity;
                InventoryPacket.getInvenMoney(c, chr.Money, -Quantity);
                TradePacket.TradePutItem(c);
                TradePacket.TradePutItem(chr.Trader.Client);
                return;
            }

            Item Source = chr.Items.getItem((byte)SourceType, (byte)SourceSlot);

            chr.Trade.SourceQuantity.Add(Source.Quantity);

            if (Source != null)
            {
                chr.Trade.Item.Add(Source);
                chr.Trade.TargetQuantity.Add((short)Quantity);
                chr.Items.Remove((byte)SourceType, (byte)SourceSlot, Quantity);
                InventoryHandler.UpdateInventory(c, (byte)SourceType);
                TradePacket.TradePutItem(c);
                TradePacket.TradePutItem(chr.Trader.Client);
            }
        }
Пример #2
0
        public static void Buy_Req(InPacket lea, Client c)
        {
            int CharacterID = lea.ReadInt();
            int ItemID      = lea.ReadInt();
            int Slot        = lea.ReadShort();
            int Quantity    = lea.ReadShort();
            var chr         = c.Character;

            try
            {
                Map       map    = MapFactory.GetMap(chr.MapX, chr.MapY);
                Character Seller = null;
                foreach (Character find in map.Characters)
                {
                    if (find.CharacterID == CharacterID)
                    {
                        Seller = find;
                    }
                }

                ShopData Item     = Seller.Shop.Find(i => ItemID == i.ItemID && Slot == i.TargetSlot);
                byte     Type     = InventoryType.getItemType(ItemID);
                byte     FreeSlot = chr.Items.GetNextFreeSlot((InventoryType.ItemType)Type);

                if (Item.Quantity < Quantity || Item == null)
                {
                    PlayerShopPacket.Buy(c, 0);
                    return;
                }

                chr.Money -= (Item.Price * Quantity);
                InventoryPacket.getInvenMoney(c, chr.Money, -(Item.Price * Quantity));
                chr.Items.Add(new Item(Item.ItemID, (short)Quantity, Item.Spirit, Item.Level1, Item.Level2,
                                       Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7, Item.Level8, Item.Level9,
                                       Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term, Type, FreeSlot));
                InventoryHandler.UpdateInventory(c, Type);
                //Seller.Shop.Remove(Item);
                Seller.Items.Remove((byte)Item.SourceType, (byte)Item.SourceSlot);
                Seller.Items.Add(new Item(Item.ItemID, (short)(Item.Quantity - Quantity), Item.Spirit, Item.Level1,
                                          Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7, Item.Level8,
                                          Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term, (byte)Item.SourceType,
                                          (byte)Item.SourceSlot));
                Item.Quantity      = Item.Quantity - Quantity;
                Seller.Shop.Money += (Item.Price * Quantity);
                Seller.Money      += (Item.Price * Quantity);
                PlayerShopPacket.ShopInfo(c, Seller, CharacterID);
                InventoryHandler.UpdateInventory(Seller.Client, (byte)Item.SourceType);
                PlayerShopPacket.SellInfo(Seller.Client);
                InventoryPacket.getInvenMoney(Seller.Client, Seller.Money, Item.Price * Quantity);

                PlayerShopPacket.Buy(c, 1);
            }
            catch
            {
                PlayerShopPacket.Buy(c, 0);
                return;
            }
        }
Пример #3
0
        public static void GiveStorageMoney(InPacket lea, Client gc)
        {
            var chr   = gc.Character;
            int money = lea.ReadInt();
            int unk   = lea.ReadInt();

            chr.Storages.getStorages()[0].Money -= money;
            chr.Storages.getStorages()[0].Save();
            chr.Money += money;
            chr.Save();
            InventoryPacket.getInvenMoney(gc, chr.Money, money);
            StoragePacket.getStoreMoney(gc);
        }
Пример #4
0
        public static void Sell_Req(InPacket lea, Client gc)
        {
            int   ItemID   = lea.ReadInt();
            byte  Type     = lea.ReadByte();
            byte  Slot     = lea.ReadByte();
            short Quantity = lea.ReadShort();

            if (Quantity > 100)
            {
                return;
            }

            int Money = 0;

            switch (ItemID / 100000)
            {
            case 75:     // 耳環
                Money  = ItemFactory.earringData[ItemID].Price;
                Money /= 5;
                break;

            case 79:     // 武器
            case 80:     // 武器
                Money  = ItemFactory.weaponData[ItemID].Price;
                Money /= 5;
                break;

            case 81:     // 衣服
                Money  = ItemFactory.topData[ItemID].Price;
                Money /= 5;
                break;

            case 84:     // 披風
                Money  = ItemFactory.capeData[ItemID].Price;
                Money /= 5;
                break;

            case 86:     // 帽子
                Money  = ItemFactory.hatData[ItemID].Price;
                Money /= 5;
                break;

            case 87:     // 面具
                Money  = ItemFactory.maskData[ItemID].Price;
                Money /= 5;
                break;

            case 93:     // 武器
                Money  = ItemFactory.weaponData[ItemID].Price;
                Money /= 5;
                break;

            case 94:     // 鬍子
                Money  = ItemFactory.beardData[ItemID].Price;
                Money /= 5;
                break;

            case 95:     // 服裝
                Money  = ItemFactory.clothingData[ItemID].Price;
                Money /= 5;
                break;

            case 82:     // 戒指
                Money  = ItemFactory.ringData[ItemID].Price;
                Money /= 5;
                break;

            case 83:     // 項鍊
                Money  = ItemFactory.necklaceData[ItemID].Price;
                Money /= 5;
                break;

            case 85:     // 封印箱
                Money  = ItemFactory.soulData[ItemID].Price;
                Money /= 5;
                break;

            case 11:     // 拼圖
                Money = ItemFactory.jigsawData[ItemID].Price;
                break;

            case 88:     // 消耗
                Money  = ItemFactory.useData[ItemID].Price;
                Money /= 5;
                break;

            case 89:     // 其他
                Money = ItemFactory.etcData[ItemID].Price;
                break;

            default:
                Log.Error("未知的物品型態:" + ItemID / 100000);
                break;
            }

            if (ItemID == 8880011 || ItemID == 8880021 || ItemID == 8880031 || ItemID == 8880041 || ItemID == 8880051 || ItemID == 8880061 || ItemID == 8880071 || ItemID == 8880081 || ItemID == 8880091 || ItemID == 8880101)
            {
                Money = 0;
            }

            Item Source = gc.Character.Items.getItem(Type, Slot);

            if (Source != null)
            {
                if (Source.Quantity > Quantity)
                {
                    if (Quantity <= 0)
                    {
                        return;
                    }
                    gc.Character.Items[(InventoryType.ItemType)Source.Type, Source.Slot].Quantity -= Quantity;
                }
                else
                {
                    if (Quantity > Source.Quantity)
                    {
                        return;
                    }
                    gc.Character.Items.Remove(Type, Slot);
                }
                gc.Character.Money += (Money * Quantity);
                InventoryPacket.getInvenMoney(gc, gc.Character.Money, Money);
                InventoryHandler.UpdateInventory(gc, Type);
            }
        }
Пример #5
0
        public static void Buy_Req(InPacket lea, Client gc)
        {
            lea.ReadInt();
            int ItemID   = lea.ReadInt();
            int Quantity = lea.ReadInt();
            int money    = 0;

            switch (ItemID / 100000)
            {
            case 75:     // 耳環
                money = ItemFactory.earringData[ItemID].Price;
                break;

            case 79:     // 武器
            case 80:     // 武器
                money = ItemFactory.weaponData[ItemID].Price;
                break;

            case 81:     // 衣服
                money = ItemFactory.topData[ItemID].Price;
                break;

            case 84:     // 披風
                money = ItemFactory.capeData[ItemID].Price;
                break;

            case 86:     // 帽子
                money = ItemFactory.hatData[ItemID].Price;
                break;

            case 87:     // 面具
                money = ItemFactory.maskData[ItemID].Price;
                break;

            case 93:     // 武器
                money = ItemFactory.weaponData[ItemID].Price;
                break;

            case 94:     // 鬍子
                money = ItemFactory.beardData[ItemID].Price;
                break;

            case 95:     // 服裝
                money = ItemFactory.clothingData[ItemID].Price;
                break;

            case 82:     // 戒指
                money = ItemFactory.ringData[ItemID].Price;
                break;

            case 83:     // 項鍊
                money = ItemFactory.necklaceData[ItemID].Price;
                break;

            case 85:     // 封印箱
                money = ItemFactory.soulData[ItemID].Price;
                break;

            case 11:     // 拼圖
                money = ItemFactory.jigsawData[ItemID].Price;
                break;

            case 88:     // 消耗
                money = ItemFactory.useData[ItemID].Price;
                break;

            case 89:     // 其他
                money = ItemFactory.etcData[ItemID].Price;
                break;

            default:
                Log.Error("未知的物品型態:" + ItemID / 100000);
                break;
            }
            if (gc.Character.Money >= (money * Quantity))
            {
                byte Type = (byte)InventoryType.getItemType(ItemID);

                if (ItemID >= 8880011 && ItemID <= 8880101) // 飛鏢
                {
                    Quantity *= 100;
                }

                Item finditem = null;
                foreach (Item it in gc.Character.Items)
                {
                    if (it.ItemID == ItemID)
                    {
                        finditem = it;
                    }
                }
                if (((Type == (byte)InventoryType.ItemType.Spend3) || (Type == (byte)InventoryType.ItemType.Other4)) && (finditem != null))
                {
                    // 合併消費物品跟其他物品
                    if ((finditem.Quantity + Quantity) > 100)
                    {
                        int newqu = Quantity - (100 - finditem.Quantity);
                        gc.Character.Items[(InventoryType.ItemType)finditem.Type, finditem.Slot].Quantity = (short)100;
                        byte Slot  = gc.Character.Items.GetNextFreeSlot((InventoryType.ItemType)Type);
                        Item oItem = new Item(ItemID, Type, Slot, (short)newqu);
                        gc.Character.Items.Add(oItem);
                    }
                    else
                    {
                        gc.Character.Items[(InventoryType.ItemType)finditem.Type, finditem.Slot].Quantity += (short)Quantity;
                    }
                }
                else
                {
                    byte Slot  = gc.Character.Items.GetNextFreeSlot((InventoryType.ItemType)Type);
                    Item oItem = new Item(ItemID, Type, Slot, (short)Quantity);
                    gc.Character.Items.Add(oItem);
                }

                gc.Character.Money -= (money * Quantity);
                InventoryPacket.getInvenMoney(gc, gc.Character.Money, -(money * Quantity));
                InventoryHandler.UpdateInventory(gc, Type);
            }
        }
Пример #6
0
        public static void Command_Req(InPacket lea, Client gc)
        {
            string[] cmd = lea.ReadString(60).Split(new[] { (char)0x20 }, StringSplitOptions.None);

            if (gc.Account.Master == 0 || cmd.Length < 1)
            {
                return;
            }
            var       chr    = gc.Character;
            Character victim = null;

            switch (cmd[0])
            {
            case "//notice":
                if (cmd.Length != 2)
                {
                    break;
                }
                foreach (Character all in MapFactory.AllCharacters)
                {
                    GamePacket.getNotice(all.Client, 3, cmd[1]);
                }
                break;

            case "//item":
                if (cmd.Length != 2 && cmd.Length != 3)
                {
                    break;
                }

                short Quantity = 1;

                if (cmd.Length == 3)
                {
                    if (int.Parse(cmd[2]) > 100)
                    {
                        Quantity = 100;
                    }
                    else
                    {
                        Quantity = short.Parse(cmd[2]);
                    }
                }

                if (InventoryType.getItemType(int.Parse(cmd[1])) == 1 || InventoryType.getItemType(int.Parse(cmd[1])) == 2)
                {
                    Quantity = 1;
                }

                if (InventoryType.getItemType(int.Parse(cmd[1])) == 5)
                {
                    return;
                }

                chr.Items.Add(new Item(int.Parse(cmd[1]), InventoryType.getItemType(int.Parse(cmd[1])), chr.Items.GetNextFreeSlot((InventoryType.ItemType)InventoryType.getItemType(int.Parse(cmd[1]))), Quantity));
                InventoryHandler.UpdateInventory(gc, InventoryType.getItemType(int.Parse(cmd[1])));
                break;

            case "//money":
                if (cmd.Length != 2)
                {
                    break;
                }
                chr.Money = int.Parse(cmd[1]);
                InventoryPacket.getInvenMoney(gc, chr.Money, int.Parse(cmd[1]));
                break;

            case "//levelup":
                chr.LevelUp();
                break;

            case "//gogo":
                if (cmd.Length != 3)
                {
                    break;
                }
                MapPacket.warpToMapAuth(gc, true, short.Parse(cmd[1]), short.Parse(cmd[2]), short.Parse(cmd[3]), short.Parse(cmd[4]));
                break;

            case "//hp":
                if (cmd.Length != 2)
                {
                    break;
                }

                short Hp = short.Parse(cmd[1]);

                if (Hp > short.MaxValue)
                {
                    Hp = short.MaxValue;
                }

                chr.MaxHp = Hp;
                chr.Hp    = Hp;
                StatusPacket.getStatusInfo(gc);
                break;

            case "//mp":
                short Mp = short.Parse(cmd[1]);

                if (Mp > short.MaxValue)
                {
                    Mp = short.MaxValue;
                }

                chr.MaxMp = Mp;
                chr.Mp    = Mp;
                StatusPacket.getStatusInfo(gc);
                break;

            case "//heal":
                chr.Hp   = chr.MaxHp;
                chr.Mp   = chr.MaxMp;
                chr.Fury = chr.MaxFury;
                StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury);
                break;

            case "//warp":
                if (cmd.Length != 2)
                {
                    break;
                }
                foreach (Character find in MapFactory.AllCharacters)
                {
                    if (find.Name.Equals(cmd[1]))
                    {
                        victim = find;
                    }
                }
                if (victim != null)
                {
                    chr.MapX    = victim.MapX;
                    chr.MapY    = victim.MapY;
                    chr.PlayerX = victim.PlayerX;
                    chr.PlayerY = victim.PlayerY;
                    MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY);
                }
                break;

            case "//ban":
                if (cmd.Length != 2)
                {
                    break;
                }
                foreach (Character find in MapFactory.AllCharacters)
                {
                    if (find.Name.Equals(cmd[1]))
                    {
                        victim = find;
                    }
                }
                if (victim != null)
                {
                    dynamic datum = new Datum("accounts");
                    victim.Client.Account.Banned = 7;
                    victim.Client.Dispose();
                }
                break;

            case "//save":
                for (int i = 0; i < MapFactory.AllCharacters.Count; i++)
                {
                    if (chr.CharacterID == MapFactory.AllCharacters[i].CharacterID)
                    {
                        continue;
                    }
                    MapFactory.AllCharacters[i].Client.Dispose();
                }
                //GameServer.IsAlive = false;
                break;

            case "//skillhack":
                break;

            case "//serverinfo":
                GamePacket.NormalNotice(gc, 1, "I: P:15101 U:1 E:1.00 D:1.00 M:1.00 G:1.00");
                break;

            case "//come":

            case "//oxstate":
                break;

            case "//now":
                DateTime now     = DateTime.Now;
                string   nowtime = string.Format("Server Time Now : [{0}-{1}-{2} {3}:{4}:{5}]", now.Year, now.Month, now.Day.ToString("00.##"), now.Hour.ToString("00.##"), now.Minute.ToString("00.##"), now.Second.ToString("00.##"));
                GamePacket.NormalNotice(gc, 4, nowtime);
                break;

            case "//user":
                break;

            case "//serverdown":
                break;

            case "//test":
                GamePacket.getNotice(gc, 4, "Tes000t");
                break;

            case "//expbuff":
                GamePacket.getNotice(gc, 1, "!@ExpEvent2@!");
                break;

            case "//processlist":
                GamePacket.GmProcessList(gc);
                GamePacket.NormalNotice(gc, 4, "[GM] Process File has saved in game folder.");
                break;

            case "//gameinfo":
                GamePacket.GmGameInfo(gc);
                GamePacket.NormalNotice(gc, 4, "[GM] GAME_INFO has copied to your clipboard.");                         //[GM] Game Log has copied to your clipboard.
                break;

            default:
                break;
            }
        }
Пример #7
0
        public static void PickupItem(InPacket lea, Client gc)
        {
            int OriginalID = lea.ReadInt();
            int ItemID     = lea.ReadInt();

            lea.ReadInt();
            var chr = gc.Character;
            Map Map = MapFactory.GetMap(chr.MapX, chr.MapY);

            // 撿取靈魂
            if (ItemID >= 9900001 && ItemID <= 9900004)
            {
                if (Map.getDropByOriginalID(OriginalID) == null)
                {
                    return;
                }

                switch (ItemID)
                {
                case 9900001:     // Blue
                    chr.Mp += (short)(chr.MaxMp * 0.2);
                    if (chr.Mp > chr.MaxMp)
                    {
                        chr.Mp = chr.MaxMp;
                    }
                    break;

                case 9900002:     // Green
                    chr.Mp += (short)(chr.MaxMp * 0.4);
                    if (chr.Mp > chr.MaxMp)
                    {
                        chr.Mp = chr.MaxMp;
                    }
                    break;

                case 9900003:     // Red
                    int rnd = Randomizer.Next(3, 7);
                    chr.Fury += (short)(chr.MaxFury / 100 * rnd);
                    if (chr.Fury > chr.MaxFury)
                    {
                        chr.Fury = chr.MaxFury;
                    }
                    break;

                case 9900004:     // Purple
                    if (chr.Items[InventoryType.ItemType.Equip, (byte)InventoryType.EquipType.Seal] != null)
                    {
                        chr.Items[InventoryType.ItemType.Equip, (byte)InventoryType.EquipType.Seal].Spirit++;
                        InventoryPacket.getInvenEquip(gc);
                    }
                    break;
                }
                StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury);
                foreach (Character All in Map.Characters)
                {
                    InventoryPacket.ClearDropItem(All.Client, chr.CharacterID, OriginalID, ItemID);
                }
                return;
            }

            // 撿取錢
            if (ItemID >= 9800001 && ItemID <= 9800005)
            {
                if (Map.getDropByOriginalID(OriginalID) == null)
                {
                    return;
                }
                chr.Money += Map.getDropByOriginalID(OriginalID).Quantity;
                InventoryPacket.getInvenMoney(gc, chr.Money, Map.getDropByOriginalID(OriginalID).Quantity);
                foreach (Character All in Map.Characters)
                {
                    InventoryPacket.ClearDropItem(All.Client, chr.CharacterID, OriginalID, ItemID);
                }
                return;
            }

            if (!Map.Item.ContainsKey(OriginalID))
            {
                return;
            }

            byte Type = InventoryType.getItemType(ItemID);

            Item finditem = null;

            foreach (Item it in gc.Character.Items)
            {
                if (it.ItemID == ItemID)
                {
                    finditem = it;
                }
            }

            if (((Type == (byte)InventoryType.ItemType.Spend3) ||
                 (Type == (byte)InventoryType.ItemType.Other4)) &&
                (finditem != null) &&
                (finditem.Quantity + Map.getDropByOriginalID(OriginalID).Quantity) <= 100)
            {
                // 合併消費物品跟其他物品
                chr.Items[(InventoryType.ItemType)finditem.Type, finditem.Slot].Quantity += Map.getDropByOriginalID(OriginalID).Quantity;
            }
            else
            {
                byte Slot  = gc.Character.Items.GetNextFreeSlot((InventoryType.ItemType)Type);
                Item oItem = new Item(ItemID, Type, Slot, Map.getDropByOriginalID(OriginalID).Quantity);
                chr.Items.Add(oItem);
            }
            foreach (Character All in Map.Characters)
            {
                InventoryPacket.ClearDropItem(All.Client, chr.CharacterID, OriginalID, ItemID);
            }
            Map.Item.Remove(OriginalID);
            UpdateInventory(gc, Type);
        }
Пример #8
0
        public static void TradeConfirm(InPacket lea, Client c)
        {
            var chr = c.Character;
            int j   = 0;
            int k   = 0;
            int m   = 0;
            int l   = 0;

            try
            {
                // 交易成功

                // Item

                // 個人接收
                foreach (Item Item in chr.Trader.Trade.Item)
                {
                    byte Type = Item.Type;
                    byte Slot = chr.Items.GetNextFreeSlot((InventoryType.ItemType)Type);
                    chr.Items.Add(new Item(Item.ItemID, chr.Trader.Trade.TargetQuantity[m], Item.Spirit, Item.Level1,
                                           Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7, Item.Level8,
                                           Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term, Type, Slot));
                    InventoryHandler.UpdateInventory(c, Item.Type);
                    m++;
                }

                // 對方接收
                foreach (Item Item in chr.Trade.Item)
                {
                    byte Type = Item.Type;
                    byte Slot = chr.Trader.Items.GetNextFreeSlot((InventoryType.ItemType)Type);
                    chr.Trader.Items.Add(new Item(Item.ItemID, chr.Trade.TargetQuantity[l], Item.Spirit, Item.Level1,
                                                  Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7, Item.Level8,
                                                  Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term, Type, Slot));
                    InventoryHandler.UpdateInventory(chr.Trader.Client, Item.Type);
                    l++;
                }

                // Money

                // 個人
                chr.Money += chr.Trader.Trade.Money;
                // 對方
                chr.Trader.Money += chr.Trade.Money;
                // 個人
                if (chr.Trader.Trade.Money > 0)
                {
                    InventoryPacket.getInvenMoney(c, chr.Money, chr.Trader.Trade.Money);
                }
                // 對方
                if (chr.Trade.Money > 0)
                {
                    InventoryPacket.getInvenMoney(chr.Trader.Client, chr.Trader.Money, chr.Trade.Money);
                }
            }
            catch
            {
                // 交易失敗

                // Item

                // 個人
                foreach (Item Item in chr.Trade.Item)
                {
                    Item i = chr.Items.getItem(Item.Type, Item.Slot);
                    if (i != null)
                    {
                        // 合併消費物品、其他物品
                        if (chr.Trade.SourceQuantity[j] + chr.Trade.TargetQuantity[j] <= 100)
                        {
                            chr.Items.Remove(Item.Type, Item.Slot);
                            chr.Items.Add(new Item(Item.ItemID, chr.Trade.SourceQuantity[j], Item.Spirit, Item.Level1,
                                                   Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7,
                                                   Item.Level8, Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon,
                                                   Item.Term, Item.Type, Item.Slot));
                        }
                        else
                        {
                            chr.Items.Add(Item);
                        }
                    }
                    else
                    {
                        chr.Items.Add(Item);
                    }

                    InventoryHandler.UpdateInventory(c, Item.Type);
                    j++;
                }

                // 對方
                foreach (Item Item in chr.Trader.Trade.Item)
                {
                    Item i = chr.Trader.Items.getItem(Item.Type, Item.Slot);
                    if (i != null)
                    {
                        // 合併消費物品、其他物品
                        if (chr.Trader.Trade.SourceQuantity[k] + chr.Trader.Trade.TargetQuantity[k] <= 100)
                        {
                            chr.Trader.Items.Remove(Item.Type, Item.Slot);
                            chr.Trader.Items.Add(new Item(Item.ItemID, chr.Trader.Trade.SourceQuantity[k], Item.Spirit,
                                                          Item.Level1, Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6,
                                                          Item.Level7, Item.Level8, Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked,
                                                          Item.Icon, Item.Term, Item.Type, Item.Slot));
                        }
                        else
                        {
                            chr.Trader.Items.Add(Item);
                        }
                    }
                    else
                    {
                        chr.Trader.Items.Add(Item);
                    }

                    InventoryHandler.UpdateInventory(chr.Trader.Client, Item.Type);
                    k++;
                }

                // Money

                // 個人
                chr.Money += chr.Trade.Money;
                // 對方
                chr.Trader.Money += chr.Trader.Trade.Money;
                // 個人
                if (chr.Trade.Money > 0)
                {
                    InventoryPacket.getInvenMoney(c, chr.Money, chr.Trade.Money);
                }
                // 對方
                if (chr.Trader.Trade.Money > 0)
                {
                    InventoryPacket.getInvenMoney(chr.Trader.Client, chr.Trader.Money, chr.Trader.Trade.Money);
                }

                TradePacket.TradeFail(c);
                TradePacket.TradeFail(chr.Trader.Client);
                return;
            }

            TradePacket.TradeSuccessful(c);
            TradePacket.TradeSuccessful(chr.Trader.Client);
        }
Пример #9
0
        public static void TradeEventItem(InPacket lea, Client c)
        {
            lea.ReadShort();             // 活動ID ?
            byte Type     = lea.ReadByte();
            byte Slot     = lea.ReadByte();
            int  Quantity = lea.ReadInt();
            var  chr      = c.Character;

            Item Item = null;

            foreach (Item im in chr.Items.getItems())
            {
                if (im.Type == 4 && im.ItemID == 8990049 && im.Quantity >= Quantity)
                {
                    Item = im;
                    break;
                }
            }

            if (Item == null && Quantity <= 100)
            {
                return;
            }

            switch (Quantity)
            {
            case 5:
                chr.Rank += 1;
                StatusPacket.UpdateFame(c, 1);
                break;

            case 8:
                chr.Rank += 2;
                StatusPacket.UpdateFame(c, 2);
                break;

            case 12:
                chr.Rank += 3;
                StatusPacket.UpdateFame(c, 3);
                break;

            case 20:
                chr.Items.Add(new Item(8510071, (byte)InventoryType.ItemType.Equip2,
                                       chr.Items.GetNextFreeSlot(InventoryType.ItemType.Equip2)));
                InventoryHandler.UpdateInventory(c, 2);
                InventoryPacket.ClearDropItem(c, chr.CharacterID, -1, 8510071);
                break;

            case 30:
                chr.Items.Add(new Item(8510081, (byte)InventoryType.ItemType.Equip2,
                                       chr.Items.GetNextFreeSlot(InventoryType.ItemType.Equip2)));
                InventoryHandler.UpdateInventory(c, 2);
                InventoryPacket.ClearDropItem(c, chr.CharacterID, -1, 8510081);
                break;

            case 40:
                chr.Items.Add(new Item(8510091, (byte)InventoryType.ItemType.Equip2,
                                       chr.Items.GetNextFreeSlot(InventoryType.ItemType.Equip2)));
                InventoryHandler.UpdateInventory(c, 2);
                InventoryPacket.ClearDropItem(c, chr.CharacterID, -1, 8510091);
                break;

            case 50:
                chr.Items.Add(new Item(8510101, (byte)InventoryType.ItemType.Equip2,
                                       chr.Items.GetNextFreeSlot(InventoryType.ItemType.Equip2)));
                InventoryHandler.UpdateInventory(c, 2);
                InventoryPacket.ClearDropItem(c, chr.CharacterID, -1, 8510101);
                break;

            case 60:
                chr.Money += 2000000;
                InventoryPacket.getInvenMoney(c, chr.Money, 2000000);
                break;

            case 100:
                chr.Money += 4000000;
                InventoryPacket.getInvenMoney(c, chr.Money, 4000000);
                break;

            case 200:
                chr.Money += 8200000;
                InventoryPacket.getInvenMoney(c, chr.Money, 8200000);
                break;

            case 300:
                chr.Money += 13000000;
                InventoryPacket.getInvenMoney(c, chr.Money, 13000000);
                break;

            case 500:
                chr.Money += 24000000;
                InventoryPacket.getInvenMoney(c, chr.Money, 24000000);
                break;
            }

            if (Quantity > 100)
            {
                Item Target1 = null;
                Item Target2 = null;
                Item Target3 = null;
                Item Target4 = null;
                Item Target5 = null;
                int  i       = 0;
                foreach (Item Target in chr.Items.getItems())
                {
                    if (i == 0 && Target.ItemID == 8990049 && Target.Quantity == 100)
                    {
                        Target1 = Target;
                        i++;
                    }
                    else if (i == 1 && Target.ItemID == 8990049 && Target.Quantity == 100)
                    {
                        Target2 = Target;
                        i++;
                    }
                    else if (i == 2 && (Quantity == 300 || Quantity == 500) && Target.ItemID == 8990049 &&
                             Target.Quantity == 100)
                    {
                        Target3 = Target;
                        i++;
                    }
                    else if (i == 3 && Quantity == 500 && Target.ItemID == 8990049 && Target.Quantity == 100)
                    {
                        Target4 = Target;
                        i++;
                    }
                    else if (i == 4 && Quantity == 500 && Target.ItemID == 8990049 && Target.Quantity == 100)
                    {
                        Target5 = Target;
                        i++;
                    }
                    else if (i == 5)
                    {
                        break;
                    }
                }

                if (Target1 != null)
                {
                    chr.Items.Remove(Target1.Type, Target1.Slot, 100);
                }
                if (Target2 != null)
                {
                    chr.Items.Remove(Target2.Type, Target2.Slot, 100);
                }
                if (Target3 != null)
                {
                    chr.Items.Remove(Target3.Type, Target3.Slot, 100);
                }
                if (Target4 != null)
                {
                    chr.Items.Remove(Target4.Type, Target4.Slot, 100);
                }
                if (Target5 != null)
                {
                    chr.Items.Remove(Target5.Type, Target5.Slot, 100);
                }
            }
            else
            {
                chr.Items.Remove(Type, Slot, Quantity);
            }

            InventoryHandler.UpdateInventory(c, Type);
        }
Пример #10
0
        public static void TradeCancel(InPacket lea, Client c)
        {
            var chr = c.Character;
            int j   = 0;

            // 個人
            chr.Money += chr.Trade.Money;
            // 對方
            chr.Trader.Money += chr.Trader.Trade.Money;
            // 個人
            if (chr.Trade.Money > 0)
            {
                InventoryPacket.getInvenMoney(c, chr.Money, chr.Trade.Money);
            }
            // 對方
            if (chr.Trader.Trade.Money > 0)
            {
                InventoryPacket.getInvenMoney(chr.Trader.Client, chr.Trader.Money, chr.Trader.Trade.Money);
            }

            // 個人
            foreach (Item Item in chr.Trade.Item)
            {
                Item i = chr.Items.getItem(Item.Type, Item.Slot);
                if (i != null)
                {
                    // 合併消費物品、其他物品
                    if (chr.Trade.SourceQuantity[j] + chr.Trade.TargetQuantity[j] <= 100)
                    {
                        chr.Items.Remove(Item.Type, Item.Slot);
                        chr.Items.Add(new Item(Item.ItemID, chr.Trade.SourceQuantity[j], Item.Spirit, Item.Level1,
                                               Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7, Item.Level8,
                                               Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term, Item.Type,
                                               Item.Slot));
                    }
                    else
                    {
                        chr.Items.Add(Item);
                    }
                }
                else
                {
                    chr.Items.Add(Item);
                }

                InventoryHandler.UpdateInventory(c, Item.Type);
                j++;
            }

            int k = 0;

            // 對方
            foreach (Item Item in chr.Trader.Trade.Item)
            {
                Item i = chr.Trader.Items.getItem(Item.Type, Item.Slot);
                if (i != null)
                {
                    // 合併消費物品、其他物品
                    if (chr.Trader.Trade.SourceQuantity[k] + chr.Trader.Trade.TargetQuantity[k] <= 100)
                    {
                        chr.Trader.Items.Remove(Item.Type, Item.Slot);
                        chr.Trader.Items.Add(new Item(Item.ItemID, chr.Trader.Trade.SourceQuantity[k], Item.Spirit,
                                                      Item.Level1, Item.Level2, Item.Level3, Item.Level4, Item.Level5, Item.Level6, Item.Level7,
                                                      Item.Level8, Item.Level9, Item.Level10, Item.Fusion, Item.IsLocked, Item.Icon, Item.Term,
                                                      Item.Type, Item.Slot));
                    }
                    else
                    {
                        chr.Trader.Items.Add(Item);
                    }
                }
                else
                {
                    chr.Trader.Items.Add(Item);
                }

                InventoryHandler.UpdateInventory(chr.Trader.Client, Item.Type);
                k++;
            }

            TradePacket.TradeCancel(chr.Trader.Client);
            chr.Trade  = null;
            chr.Trader = null;
        }
Пример #11
0
        public static void Command_Req(InPacket lea, Client gc)
        {
            string[] cmd = lea.ReadString(60).Split(new[] { (char)0x20 }, StringSplitOptions.None);

            if (gc.Account.Master == 0 || cmd.Length < 1)
            {
                return;
            }
            var       chr    = gc.Character;
            Character victim = null;

            switch (cmd[0])
            {
            case "//1":
            case "//公告":
            case "//notice":
                if (cmd.Length != 2)
                {
                    break;
                }
                foreach (Character all in MapFactory.AllCharacters)
                {
                    GamePacket.getNotice(all.Client, 3, cmd[1]);
                }
                break;

            case "//item":
                if (cmd.Length != 2 && cmd.Length != 3)
                {
                    break;
                }

                short Quantity = 1;

                if (cmd.Length == 3)
                {
                    if (int.Parse(cmd[2]) > 100)
                    {
                        Quantity = 100;
                    }
                    else
                    {
                        Quantity = short.Parse(cmd[2]);
                    }
                }

                if (InventoryType.getItemType(int.Parse(cmd[1])) == 1 || InventoryType.getItemType(int.Parse(cmd[1])) == 2)
                {
                    Quantity = 1;
                }

                if (InventoryType.getItemType(int.Parse(cmd[1])) == 5)
                {
                    return;
                }

                chr.Items.Add(new Item(int.Parse(cmd[1]), InventoryType.getItemType(int.Parse(cmd[1])), chr.Items.GetNextFreeSlot((InventoryType.ItemType)InventoryType.getItemType(int.Parse(cmd[1]))), Quantity));
                InventoryHandler.UpdateInventory(gc, InventoryType.getItemType(int.Parse(cmd[1])));
                break;

            case "//money":
                if (cmd.Length != 2)
                {
                    break;
                }
                chr.Money = int.Parse(cmd[1]);
                InventoryPacket.getInvenMoney(gc, chr.Money, int.Parse(cmd[1]));
                break;

            case "//levelup":
                chr.LevelUp();
                break;

            case "//gogo":
                if (cmd.Length != 3)
                {
                    break;
                }
                MapPacket.warpToMapAuth(gc, true, short.Parse(cmd[1]), short.Parse(cmd[2]), -1, -1);
                break;

            case "//hp":
                if (cmd.Length != 2)
                {
                    break;
                }

                short Hp = short.Parse(cmd[1]);

                if (Hp > short.MaxValue)
                {
                    Hp = short.MaxValue;
                }

                chr.MaxHp = Hp;
                chr.Hp    = Hp;
                StatusPacket.getStatusInfo(gc);
                break;

            case "//mp":
                short Mp = short.Parse(cmd[1]);

                if (Mp > short.MaxValue)
                {
                    Mp = short.MaxValue;
                }

                chr.MaxMp = Mp;
                chr.Mp    = Mp;
                StatusPacket.getStatusInfo(gc);
                break;

            case "//heal":
                chr.Hp   = chr.MaxHp;
                chr.Mp   = chr.MaxMp;
                chr.Fury = chr.MaxFury;
                StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury);
                break;

            case "//warp":
                if (cmd.Length != 2)
                {
                    break;
                }
                foreach (Character find in MapFactory.AllCharacters)
                {
                    if (find.Name.Equals(cmd[1]))
                    {
                        victim = find;
                    }
                }
                if (victim != null)
                {
                    chr.MapX    = victim.MapX;
                    chr.MapY    = victim.MapY;
                    chr.PlayerX = victim.PlayerX;
                    chr.PlayerY = victim.PlayerY;
                    MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY);
                }
                break;

            case "//ban":
                if (cmd.Length != 2)
                {
                    break;
                }
                foreach (Character find in MapFactory.AllCharacters)
                {
                    if (find.Name.Equals(cmd[1]))
                    {
                        victim = find;
                    }
                }
                if (victim != null)
                {
                    dynamic datum = new Datum("accounts");
                    victim.Client.Account.Banned = 1;
                    victim.Client.Dispose();
                }
                break;

            case "//save":
                for (int i = 0; i < MapFactory.AllCharacters.Count; i++)
                {
                    if (chr.CharacterID == MapFactory.AllCharacters[i].CharacterID)
                    {
                        continue;
                    }
                    MapFactory.AllCharacters[i].Client.Dispose();
                }
                //GameServer.IsAlive = false;
                break;

            case "//選擇正派":
                Quest Quest = new Quest(60);
                Quest.QuestState = 0x31;
                chr.Quests.Add(Quest);
                QuestPacket.getQuestInfo(gc, chr.Quests.getQuests());
                chr.Items.Add(new Item(8990019, 4, chr.Items.GetNextFreeSlot(InventoryType.ItemType.Other4)));
                break;

            case "//選擇邪派":
                Quest            = new Quest(64);
                Quest.QuestState = 0x31;
                chr.Quests.Add(Quest);
                QuestPacket.getQuestInfo(gc, chr.Quests.getQuests());
                chr.Items.Add(new Item(8990020, 4, chr.Items.GetNextFreeSlot(InventoryType.ItemType.Other4)));
                break;

            //case "//test":
            //    PartyPacket.PartyInvite(gc);
            //    break;
            //case "//test2":
            //    PartyPacket.PartyInvite(gc, 1, 1);
            //    break;
            //case "//test3":
            //    PartyPacket.PartyInvite(gc, 1 , 0);
            //    break;
            default:
                break;
            }
        }