Пример #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 p_Damage_c(InPacket lea, Client c)
        {
            int   CharacterID = lea.ReadInt();
            short Damage      = lea.ReadShort();
            short Unk         = lea.ReadShort();
            float PositionX   = BitConverter.ToSingle(BitConverter.GetBytes(lea.ReadInt()), 0);
            float PositionY   = BitConverter.ToSingle(BitConverter.GetBytes(lea.ReadInt()), 0);

            var chr = c.Character;

            if (chr == null)
            {
                if (chr.CharacterID == CharacterID)
                {
                }
                else
                {
                    return;
                }
            }

            if (Damage > 0)
            {
                chr.Hp -= Damage;
            }

            if (PositionX != 0)
            {
                chr.PlayerX = ((short)PositionX);
            }
        }
Пример #3
0
        public static void SellStart_Req(InPacket lea, Client c)
        {
            string Name = lea.ReadString(40);
            var    chr  = c.Character;

            //if (!(chr.MapX == 1 && chr.MapY == 51) && !(chr.MapX == 1 && chr.MapY == 52) && !(chr.MapX == 1 && chr.MapY == 53) && !(chr.MapX == 1 && chr.MapY == 54) && !(chr.MapX == 1 && chr.MapY == 55))
            //    return;

            Map           map        = MapFactory.GetMap(chr.MapX, chr.MapY);
            CharacterShop PlayerShop = new CharacterShop(Name);

            for (int i = 0; i < 12; i++)
            {
                int  SourceType = lea.ReadShort();
                int  SourceSlot = lea.ReadShort();
                int  Quantity   = lea.ReadInt();
                int  Price      = lea.ReadInt();
                Item Source     = chr.Items.getItem((byte)SourceType, (byte)SourceSlot);
                if (Source != null)
                {
                    PlayerShop.Add(new ShopData(Source.ItemID, Quantity, SourceType, SourceSlot, (byte)i, Source.Spirit, Source.Level1, Source.Level2, Source.Level3, Source.Level4, Source.Level5, Source.Level6, Source.Level7, Source.Level8, Source.Level9, Source.Level10, Source.Fusion, Source.IsLocked, Source.Icon, Source.Term, Price));
                }
            }
            chr.Shop = PlayerShop;
            foreach (Character All in map.Characters)
            {
                PlayerShopPacket.SellStart(All.Client, chr, Name);
            }
        }
Пример #4
0
        public static void MoveItemToStorage(InPacket lea, Client gc)
        {
            int     SourceType = lea.ReadShort();
            int     SourceSlot = lea.ReadShort();
            int     TargetType = lea.ReadShort();
            int     TargetSlot = lea.ReadShort();
            int     Quantity   = lea.ReadInt();
            var     chr        = gc.Character;
            Storage Target     = chr.Storages.GetItem((byte)TargetType, (byte)TargetSlot);
            Item    Source     = chr.Items.getItem((byte)SourceType, (byte)SourceSlot);

            if (Target != null || Source.ItemID / 100000 == 86 || Source.ItemID / 100000 == 87 ||
                Source.ItemID / 100000 == 92 || Source.ItemID / 100000 == 94 || Source.ItemID / 100000 == 95)
            {
                return;
            }

            chr.Storages.Add(new Storage(Source.ItemID, Quantity, Source.Spirit, Source.Level1, Source.Level2,
                                         Source.Level3, Source.Level4, Source.Level5, Source.Level6, Source.Level7, Source.Level8, Source.Level9,
                                         Source.Level10, Source.Fusion, Source.IsLocked, Source.Icon, Source.Term, TargetType, TargetSlot, 0));
            chr.Items.Remove((byte)SourceType, (byte)SourceSlot, Quantity);
            chr.Save();
            StoragePacket.getStoreInfo(gc);
            InventoryHandler.UpdateInventory(gc, (byte)SourceType);
        }
Пример #5
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;
            }
        }
Пример #6
0
        public static void AbilityRecover_Req(InPacket lea, Client c)
        {
            short Slot = lea.ReadShort();
            short Type = lea.ReadShort();
            var   chr  = c.Character;

            switch (Type)
            {
            case 0:                     // 力量還原本
                if (chr.Str < 4)
                {
                    return;
                }
                chr.Str--;
                chr.AbilityBonus++;
                chr.Items.Remove(3, (byte)Slot, 1);
                break;

            case 1:                     // 精力還原本
                if (chr.Dex < 4)
                {
                    return;
                }
                chr.Dex--;
                chr.AbilityBonus++;
                chr.Items.Remove(3, (byte)Slot, 1);
                break;

            case 2:                     // 氣力還原本
                if (chr.Vit < 4)
                {
                    return;
                }
                chr.Vit--;
                chr.AbilityBonus++;
                chr.Items.Remove(3, (byte)Slot, 1);
                break;

            case 3:                     // 智力還原本
                if (chr.Int < 4)
                {
                    return;
                }
                chr.Int--;
                chr.AbilityBonus++;
                chr.Items.Remove(3, (byte)Slot, 1);
                break;
            }

            InventoryHandler.UpdateInventory(c, 3);
            StatusPacket.getStatusInfo(c);
        }
Пример #7
0
        protected override void Dispatch(InPacket inPacket)
        {
            try
            {
#if DEBUG
                Log.Hex("<<< Received (0x{0:X2}) packet from {1}: ", inPacket.Content, inPacket.OperationCode, this.Title);
#endif

                if (inPacket.OperationCode == (ushort)ClientOpcode.SERVER)
                {
                    short Header = inPacket.ReadShort();    // Read header
                    inPacket.ReadInt();                     // Original length + CRC
                    inPacket.ReadInt();
#if DEBUG
                    Log.Debug("^^^--- <<< Received opcode (0x{0:X}): ", Header);
#endif

                    switch ((ClientOpcode)Header)
                    {
                    case ClientOpcode.MYCHAR_INFO_REQ:
                        Log.Debug("Send >> CharHandler.MyChar_Info_Req");
                        CharHandler.MyChar_Info_Req(inPacket, this);
                        break;

                    case ClientOpcode.CREATE_MYCHAR_REQ:
                        Log.Debug("Send >> CharHandler.Create_MyChar_Req");
                        CharHandler.Create_MyChar_Req(inPacket, this);
                        break;

                    case ClientOpcode.CHECK_SAMENAME_REQ:
                        Log.Debug("Send >> CharHandler.Check_SameName_Req");
                        CharHandler.Check_SameName_Req(inPacket, this);
                        break;

                    case ClientOpcode.DELETE_MYCHAR_REQ:
                        Log.Debug("Send >> CharHandler.Delete_MyChar_Req");
                        CharHandler.Delete_MyChar_Req(inPacket, this);
                        break;

                    case ClientOpcode.CREATE_PREVIEW_REQ:
                        Log.Debug("Send >> CharHandler.Create_Preview_Req");
                        CharHandler.Create_Preview_Req(inPacket, this);
                        break;

                    case ClientOpcode.CHAR_PAGE2_REQ:
                        Log.Debug("Send >> CharHandler.Char_page2_preview ");
                        CharHandler.Char_page2_preview(inPacket, this);
                        break;
                    }
                }
            }
            catch (HackException e)
            {
                Log.Warn("Hack from {0}: \n{1}", this.Account.Username, e.ToString());
            }
            catch (Exception e)
            {
                Log.Error("Unhandled exception from {0}: \n{1}", this.Title, e.ToString());
            }
        }
Пример #8
0
        public static void InvenUseSpendStart_Req(InPacket lea, Client c)
        {
            short PositionX = lea.ReadShort();
            short PositionY = lea.ReadShort();
            int   Slot      = lea.ReadInt();
            var   chr       = c.Character;
            Map   map       = MapFactory.GetMap(chr.MapX, chr.MapY);
            Item  Item      = chr.Items.getItem((byte)InventoryType.ItemType.Spend3, (byte)Slot);

            foreach (Character All in map.Characters)
            {
                InventoryPacket.UseSpendStart(All.Client, chr, PositionX, PositionY, Item.ItemID, (byte)InventoryType.ItemType.Spend3, Slot);
            }
            chr.Items.Remove((byte)InventoryType.ItemType.Spend3, (byte)Slot, 1);
            UpdateInventory(c, (byte)InventoryType.ItemType.Spend3);
        }
Пример #9
0
        private void Handle(byte[] rawPacket, bool fromCommand = false, InPacket packet = null)
        {
            InPacket inPacket = fromCommand ? packet : new InPacket(this.Cryptograph.Decrypt(rawPacket));

            if (Enum.IsDefined(typeof(TReceiveOP), inPacket.OperationCode))
            {
                switch (PacketBase.LogLevel)
                {
                case LogLevel.Name:
                    Log.Inform("Received {0} packet from {1}.",
                               Enum.GetName(typeof(TReceiveOP), inPacket.OperationCode), this.Title);
                    break;

                case LogLevel.Full:
                    Log.Hex("Received {0} packet from {1}: ", inPacket.Content,
                            Enum.GetName(typeof(TReceiveOP), inPacket.OperationCode), this.Title);
                    break;
                }
            }
            else
            {
#if DEBUG
                Log.Hex("Received unknown (0x{0:X2}) packet from {1}: ", inPacket.Content, inPacket.OperationCode,
                        this.Title);
#endif
            }

            if (fromCommand)
            {
                inPacket.Position = 0;
                inPacket.ReadShort();
            }

            this.Dispatch(inPacket);
        }
Пример #10
0
        public static void OnMobMove(MapleClient client, InPacket iPacket)
        {
            int objectID = iPacket.ReadInt();

            Mob mob;

            try
            {
                mob = client.Character.ControlledMobs[objectID];
            }
            catch (KeyNotFoundException)
            {
                return;
            }

            short moveAction      = iPacket.ReadShort();
            bool  cheatResult     = (iPacket.ReadByte() & 0xF) != 0;
            byte  centerSplit     = iPacket.ReadByte();
            int   illegalVelocity = iPacket.ReadInt();
            byte  unknown         = iPacket.ReadByte();

            iPacket.ReadInt();

            Movements movements = Movements.Decode(iPacket);

            Movement lastMovement = movements[movements.Count - 1];

            mob.Position = lastMovement.Position;
            mob.Foothold = lastMovement.Foothold;
            mob.Stance   = lastMovement.Stance;

            using (OutPacket oPacket = new OutPacket(SendOps.MobCtrlAck))
            {
                oPacket
                .WriteInt(objectID)
                .WriteShort(moveAction)
                .WriteBool(cheatResult)
                .WriteShort()    // NOTE: Mob mana.
                .WriteByte()     // NOTE: Ability ID.
                .WriteByte();    // NOTE: Ability level.

                client.Send(oPacket);
            }

            using (OutPacket oPacket = new OutPacket(SendOps.MobMove))
            {
                oPacket
                .WriteInt(objectID)
                .WriteBool(cheatResult)
                .WriteByte(centerSplit)
                .WriteInt(illegalVelocity);

                movements.Encode(oPacket);

                client.Character.Map.Broadcast(oPacket, client.Character);
            }
        }
Пример #11
0
        public static void MoveItemToBag(InPacket lea, Client gc)
        {
            int SourceType = lea.ReadShort();
            int SourceSlot = lea.ReadShort();
            int TargetSlot = lea.ReadShort();

            lea.ReadShort();
            int Quantity = lea.ReadInt();
            var chr      = gc.Character;

            Storage Source     = chr.Storages.GetItem((byte)SourceType, (byte)SourceSlot);
            int     TargetType = InventoryType.getItemType(Source.ItemID);
            Item    Item       = chr.Items.getItem((byte)TargetType, (byte)TargetSlot);

            if (Item == null)
            {
                chr.Items.Add(new Item(Source.ItemID, (short)Quantity, Source.Spirit, Source.Level1, Source.Level2,
                                       Source.Level3, Source.Level4, Source.Level5, Source.Level6, Source.Level7, Source.Level8,
                                       Source.Level9, Source.Level10, Source.Fusion, Source.IsLocked, Source.Icon, Source.Term,
                                       (byte)TargetType, (byte)TargetSlot));
            }
            else
            {
                if (Source.ItemID != Item.ItemID)
                {
                    return;
                }

                int QuantityTemp = Item.Quantity;
                chr.Items.Remove((byte)TargetType, (byte)TargetSlot);
                chr.Items.Add(new Item(Item.ItemID, (short)(QuantityTemp + 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)TargetType,
                                       (byte)TargetSlot));
            }

            chr.Storages.Remove((byte)Source.Type, (byte)Source.Slot, Quantity);

            chr.Save();
            StoragePacket.getStoreInfo(gc);
            InventoryHandler.UpdateInventory(gc, (byte)TargetType);
        }
Пример #12
0
        public static void HandleSpawnCharacter(MapleConnection connection, InPacket packet)
        {
            Character character = new Character();

            character.ID    = packet.ReadInt();
            character.Level = packet.ReadByte();
            packet.ReadShort();
            character.Name = packet.ReadString();

            Main.Instance.DrawCharacterObject(character);
        }
Пример #13
0
        public static void DecodeCharacterData(Character character, InPacket packet)
        {
            packet.ReadShort();

            for (int i = 0; i < 3; i++)
            {
                uint damageSeed = packet.ReadUInt();
            }

            ulong flags = packet.ReadULong();
        }
Пример #14
0
        public override void OnPacket(InPacket iPacket)
        {
            try
            {
                iPacket.Decrypt(CRYPT_KEY);

                CenterOpcodes uOpcode    = (CenterOpcodes)iPacket.ReadShort();
                int           uSize      = iPacket.ReadInt();
                bool          isCompress = iPacket.ReadBool();
                int           cSize      = 0;
                if (isCompress == true)
                {
                    cSize = iPacket.ReadInt();
                    LogFactory.GetLog("Main").LogInfo("Pacote comprimido {0}({1})", (int)uOpcode, uOpcode.ToString());
                }
                else
                {
                    LogFactory.GetLog("Main").LogInfo("Packet {0}({1})", (int)uOpcode, uOpcode.ToString());
                }

                LogFactory.GetLog("Main").LogHex("Pacote", iPacket.ToArray());

                switch (uOpcode)
                {
                case CenterOpcodes.HEART_BIT_NOT:
                    OnHeartBeatNot();
                    break;

                case CenterOpcodes.ENU_CLIENT_CONTENTS_FIRST_INIT_INFO_REQ:
                    MyLoading.NotifyContentInfo(this);
                    break;

                case CenterOpcodes.ENU_VERIFY_ACCOUNT_REQ:
                    MyUser.OnLogin(this, iPacket);
                    break;

                default:
                {
                    LogFactory.GetLog("Main").LogWarning("Pacote indefinido foi recebida. Opcode: {0}({1})", (int)uOpcode, uOpcode.ToString());
                    LogFactory.GetLog("Main").LogHex("Pacote", iPacket.ToArray());
                    break;
                }
                }
            }
            catch (Exception e)
            {
                LogFactory.GetLog("Main").LogError(e.ToString());
                Close();
            }
        }
Пример #15
0
        public override void OnPacket(InPacket iPacket)
        {
            try
            {
                iPacket.Decrypt(CRYPT_KEY);

                GameOpcodes uOpcode    = (GameOpcodes)iPacket.ReadShort();
                int         uSize      = iPacket.ReadInt();
                bool        isCompress = iPacket.ReadBool();
                int         cSize      = 0;
                if (isCompress == true)
                {
                    cSize = iPacket.ReadInt();
                    LogFactory.GetLog("Main").LogInfo("Pacote comprimido {0}({1})", (int)uOpcode, uOpcode.ToString());
                }
                else
                {
                    LogFactory.GetLog("Main").LogInfo("Packet {0}({1})", (int)uOpcode, uOpcode.ToString());
                }

                LogFactory.GetLog("Main").LogHex("Pacote", iPacket.ToArray());

                switch (uOpcode)
                {
                case GameOpcodes.HEART_BIT_NOT:
                    OnHeartBeatNot();
                    break;

                case GameOpcodes.EVENT_INVITE_REQ:     //31 EVENT_FRIEND_LIST_REQ
                    MsgUser.FriendList(this, iPacket);
                    break;

                case GameOpcodes.EVENT_LEAVE_ROOM_ACK:     //34 ADD_FRIEND
                    MsgUser.Add(this, iPacket);
                    break;

                default:
                {
                    LogFactory.GetLog("Main").LogWarning("Pacote indefinido foi recebida. Opcode: {0}({1})", (int)uOpcode, uOpcode.ToString());
                    LogFactory.GetLog("Main").LogHex("Pacote", iPacket.ToArray());
                    break;
                }
                }
            }
            catch (Exception e)
            {
                LogFactory.GetLog("Main").LogFatal(e);
                Close();
            }
        }
Пример #16
0
        public static void HandleItemMove(MapleClient client, InPacket iPacket)
        {
            iPacket.Skip(4); // NOTE: tRequestTime (ticks).
            InventoryType inventory = (InventoryType)iPacket.ReadByte();
            short         slot1     = iPacket.ReadShort();
            short         slot2     = iPacket.ReadShort();
            short         quantity  = iPacket.ReadShort();

            bool dropped       = slot2 == 0;
            bool equippedSlot1 = slot1 < 0;
            bool equippedSlot2 = slot2 < 0;

            if (dropped)
            {
            }
            else
            {
                client.Character.Items.Swap(inventory, slot1, slot2);
            }

            if (equippedSlot1 || equippedSlot2)
            {
            }
        }
Пример #17
0
        protected override void Dispatch(InPacket inPacket)
        {
            try
            {
                PacketCrypt pd = new PacketCrypt(0);

                byte[] ii;
                if (inPacket.Array[0] == 0xAA && inPacket.Array[1] == 0x55)
                {
                    ii = inPacket.Array;
                }
                else
                {
                    ii = pd.Decrypt(inPacket.Array);
                }

                InPacket ip = new InPacket(ii);

                if (ip.OperationCode == (ushort)ClientOpcode.SERVER)
                {
                    var Header = ip.ReadShort();
#if DEBUG
                    Log.Hex("Received (0x{0:X2}) packet from {1}: ", ip.Content, Header, this.Title);
#endif
                    switch (Header)
                    {
                    case 0x0C:
                        FriendPacket.FriendList(this);
                        break;
                    }
                }
            }
            catch (HackException e)
            {
                // TODO: Register offense using the exception's message.
                Log.Warn("Hack exception from {0}: \n{1}", this.Title, e.ToString());
            }
            catch (Exception e)
            {
                Log.Error("Unhandled exception from {0}: \n{1}", this.Title, e.ToString());
            }
        }
Пример #18
0
        public static void Char_Damage_Req(InPacket lea, Client c)
        {
            short Damage = lea.ReadShort();
            var   chr    = c.Character;

            if (Damage < 0)
            {
                Damage = short.MaxValue;
            }

            chr.Hp -= Damage;
            if (chr.Hp <= 0)
            {
                chr.IsAlive = false;
                if (!(chr.MapX == 10 && chr.MapY == 60) && !(chr.MapX == 10 && chr.MapY == 61) &&
                    !(chr.MapX == 10 && chr.MapY == 62) && !(chr.MapX == 10 && chr.MapY == 63) &&
                    !(chr.MapX == 10 && chr.MapY == 64))
                {
                    chr.Exp -= (int)(GameConstants.getExpNeededForLevel(chr.Level) * 0.2);
                    if (chr.Exp < 0)
                    {
                        chr.Exp = 0;
                    }
                    StatusPacket.UpdateExp(c);
                }

                MapPacket.userDead(c);
                if (chr.Competitor != null)
                {
                    PvPPacket.PvPEnd(c, chr.Competitor.CharacterID);
                    PvPPacket.PvPEnd(chr.Competitor.Client, chr.Competitor.CharacterID);
                    chr.Competitor            = null;
                    chr.Competitor.Competitor = null;
                }

                chr.Hp = 1;
                chr.Mp = 1;
            }

            StatusPacket.UpdateHpMp(c, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury);
        }
Пример #19
0
        protected override void Dispatch(InPacket inPacket)
        {
            try
            {
                Log.Hex("Received (0x{0:X2}) packet from {1}: ", inPacket.Content, inPacket.OperationCode, this.Title);

                if (inPacket.OperationCode == (ushort)ClientOpcode.SERVER)
                {
                    var Header = inPacket.ReadShort(); // 讀取包頭
                    inPacket.ReadInt();                // 原始長度 + CRC
                    inPacket.ReadInt();

                    switch ((ClientOpcode)Header)
                    {
                    case ClientOpcode.MYCHAR_INFO_REQ:
                        CharHandler.MyChar_Info_Req(inPacket, this);
                        break;

                    case ClientOpcode.CREATE_MYCHAR_REQ:
                        CharHandler.Create_MyChar_Req(inPacket, this);
                        break;

                    case ClientOpcode.CHECK_SAMENAME_REQ:
                        CharHandler.Check_SameName_Req(inPacket, this);
                        break;

                    case ClientOpcode.DELETE_MYCHAR_REQ:
                        CharHandler.Delete_MyChar_Req(inPacket, this);
                        break;
                    }
                }
            }
            catch (HackException e)
            {
                Log.Warn("Hack from {0}: \n{1}", this.Account.Username, e.ToString());
            }
            catch (Exception e)
            {
                Log.Error("Unhandled exception from {0}: \n{1}", this.Title, e.ToString());
            }
        }
Пример #20
0
        public static void Move(MartialClient c, InPacket p)
        {
            if (c.getAccount().activeCharacter == null)
            {
                Logger.LogCheat(Logger.HackTypes.NullActive, c, "Attempted to hook cargo movement while not being ingame.");
                c.Close();
                return;
            }

            byte      fromCargoIndex  = p.ReadByte();
            short     unknownMovement = p.ReadShort();
            byte      toCargoSlot     = p.ReadByte();
            byte      toCargoLine     = p.ReadByte();
            byte      toCargoRow      = p.ReadByte();
            Character chr             = c.getAccount().activeCharacter;
            Cargo     cargo           = chr.getCargo();

            Console.WriteLine("Cargo > {0} | {1} | {2} | {3}", fromCargoIndex, toCargoSlot, toCargoLine, toCargoRow);

            if (!cargo.moveItem(fromCargoIndex, toCargoSlot, toCargoRow, toCargoLine))
            {
                Console.WriteLine("problem with move item");
                return;
            }

            OutPacket op = new OutPacket(24);

            op.WriteInt(24);
            op.WriteShort(4);
            op.WriteShort(46);
            op.WriteInt(1);
            op.WriteInt(chr.getuID());
            op.WriteShort(1);
            op.WriteByte(fromCargoIndex);
            op.WriteShort(unknownMovement);
            op.WriteByte(toCargoSlot);
            op.WriteByte(toCargoLine);
            op.WriteByte(toCargoRow);
            c.WriteRawPacket(op.ToArray());
        }
Пример #21
0
        public void OnNewRequestReceived(MapleClient client, PacketRequestInfo packetInfo)
        {
            if (!client.RecvCipher.CheckPacket(packetInfo.Header))
            {
                throw new Exception("封包不正确");
            }

            var data = new byte[packetInfo.Data.Length];

            Buffer.BlockCopy(packetInfo.Data, 0, data, 0, data.Length);
            client.RecvCipher.Transform(data);

            var p       = new InPacket(data);
            var handler = Processor[p.ReadShort()];

            if (handler != null)
            {
                handler(client, p);
            }
            else
            {
                Console.WriteLine($"未知封包 长度:{data.Length} 封包:{BitTool.GetHexStr(data)}");
            }
        }
Пример #22
0
        public static void Chat(MartialClient c, InPacket p)
        {
            if (c.getAccount().activeCharacter == null)
            {
                Logger.LogCheat(Logger.HackTypes.NullActive, c, "Hooked chat with null of activeCharacter");
                c.Close();
                return;
            }

            Character chr = c.getAccount().activeCharacter;

            byte   messageType   = (byte)p.ReadShort();
            string receiver      = MiscFunctions.obscureString(p.ReadString(17));
            byte   messageLength = (byte)p.ReadInt();

            if (messageLength > 65)
            {
                Logger.LogCheat(Logger.HackTypes.Chat, c, "Tried to send a message of size {0}", messageLength);
                c.Close();
                return;
            }
            string message = p.ReadString(messageLength);

            switch (messageType)
            {
            case 0: WMap.Instance.getGrid(chr.getMap()).sendTo3x3Area(chr, chr.getArea(), StaticPackets.chatRelay(chr, messageType, message)); break;

            case 1:
            {
                if (receiver == null)
                {
                    return;
                }

                Character player = WMap.Instance.findPlayerByName(receiver);
                if (player == null)
                {
                    chr.getAccount().mClient.WriteRawPacket(StaticPackets.playerIsntConnected(chr));
                    break;
                }

                player.getAccount().mClient.WriteRawPacket(StaticPackets.chatRelay(chr, messageType, message));
                break;
            }

            case 6:                     // karma notice
            {
                if (chr.getKarmaMessagingTimes() == 0)
                {
                }

                WMap.Instance.sendToAllCharactersExcept(chr, StaticPackets.chatRelay(chr, messageType, message));
                break;
            }

            case 7:                     // "GM Shout"
            {
                if (chr.getAccount().gmLvl == 0 && chr.getGMShoutMessagingCounts() == 0)
                {
                }

                WMap.Instance.sendToAllCharactersExcept(chr, StaticPackets.chatRelay(chr, messageType, message));
                break;
            }

            case 9:                     // admin commands
            {
                string[] cmd = Regex.Split(message, " ");
                if (chr.getAccount().gmLvl == 0)
                {
                    Logger.LogCheat(Logger.HackTypes.Chat, c, "Tried to parse GM Command {0}", cmd[0]);
                    c.Close();
                    break;
                }

                if (cmd.Length == 0)
                {
                    Logger.LogCheat(Logger.HackTypes.Chat, c, "Tried to parse null GM Command");
                    c.Close();
                    break;
                }

                if (cmd[0][0] != '/')
                {
                    Logger.LogCheat(Logger.HackTypes.Chat, c, "Tried to parse command without '/' slash");
                    c.Close();
                    break;
                }

                CommandProcessor.ParseCommand(c, cmd);
                break;
            }

            default:
            {
                break;
            }
            }
        }
Пример #23
0
        public static void Quick_Slot_Req(InPacket lea, Client gc)
        {
            var chr        = gc.Character;
            int KeymapType = lea.ReadShort();
            int KeymapSlot = lea.ReadShort();
            int SkillID    = lea.ReadInt();
            int SkillType  = lea.ReadShort();
            int SkillSlot  = lea.ReadShort();

            string QuickSlotName = "";

            switch (KeymapType)
            {
            case 0:
                switch (KeymapSlot)
                {
                case 0:
                    QuickSlotName = "Z";
                    break;

                case 1:
                    QuickSlotName = "X";
                    break;

                case 2:
                    QuickSlotName = "C";
                    break;

                case 3:
                    QuickSlotName = "V";
                    break;

                case 4:
                    QuickSlotName = "B";
                    break;

                case 5:
                    QuickSlotName = "N";
                    break;
                }
                break;

            case 1:
                switch (KeymapSlot)
                {
                case 0:
                    QuickSlotName = "1";
                    break;

                case 1:
                    QuickSlotName = "2";
                    break;

                case 2:
                    QuickSlotName = "3";
                    break;

                case 3:
                    QuickSlotName = "4";
                    break;

                case 4:
                    QuickSlotName = "5";
                    break;

                case 5:
                    QuickSlotName = "6";
                    break;
                }
                break;

            case 2:
                switch (KeymapSlot)
                {
                case 0:
                    QuickSlotName = "Insert";
                    break;

                case 1:
                    QuickSlotName = "Home";
                    break;

                case 2:
                    QuickSlotName = "PageUp";
                    break;

                case 3:
                    QuickSlotName = "Delete";
                    break;

                case 4:
                    QuickSlotName = "End";
                    break;

                case 5:
                    QuickSlotName = "PageDown";
                    break;
                }
                break;

            case 3:
                switch (KeymapSlot)
                {
                case 0:
                    QuickSlotName = "7";
                    break;

                case 1:
                    QuickSlotName = "8";
                    break;

                case 2:
                    QuickSlotName = "9";
                    break;

                case 3:
                    QuickSlotName = "0";
                    break;

                case 4:
                    QuickSlotName = "-";
                    break;

                case 5:
                    QuickSlotName = "=";
                    break;
                }
                break;
            }
            if (SkillID == -1 && SkillType == -1 && SkillSlot == -1)
            {
                chr.Keymap.Remove(QuickSlotName);
                return;
            }
            chr.Keymap.Remove(QuickSlotName);
            chr.Keymap.Add(QuickSlotName, new Shortcut(SkillID, (byte)SkillType, (byte)SkillSlot));
        }
Пример #24
0
        public static void ServerHandlerReceive(InPacket ip, Client gc)
        {
            var Header = ip.ReadShort(); // Read header

            ip.ReadInt();                // Original length + CRC
            ip.ReadInt();
#if DEBUG
            Log.Hex("Received {0}({1}) packet from {2}: ", ip.Array, ((ClientOpcode)Header).ToString(), Header,
                    gc.Title);
#endif
            switch ((ClientOpcode)Header)
            {
            // Game
            case ClientOpcode.COMMAND_REQ:
                GameHandler.Command_Req(ip, gc);
                break;

            case ClientOpcode.GAMELOG_REQ:
                GameHandler.Game_Log_Req(ip, gc);
                break;

            case ClientOpcode.QUICK_SLOT_REQ:
                GameHandler.Quick_Slot_Req(ip, gc);
                break;

            //2019-09-01 16:48 GMT+7
            case ClientOpcode.CHARACTER_INFO_REQ:                     // OPCODE = 76  // Try Change test = E4
                GameHandler.Character_Info_Req(ip, gc);
                break;

            case ClientOpcode.GAME_ISACTIVE:
                GameHandler.GameisActive_Ack(ip, gc);
                break;

            // Shop
            case ClientOpcode.NPC_SHOP_BUY_REQ:
                NpcShopHandler.Buy_Req(ip, gc);
                break;

            case ClientOpcode.NPC_SHOP_SELL_REQ:
                NpcShopHandler.Sell_Req(ip, gc);
                break;

            // Status
            case ClientOpcode.CHAR_DAMAGE_REQ:
                StatusHandler.Char_Damage_Req(ip, gc);
                break;

            case ClientOpcode.CHAR_DEAD_REQ:
                StatusHandler.Char_Dead_Req(ip, gc);
                break;

            case ClientOpcode.CHAR_STATUP_REQ:
                StatusHandler.Char_Statup_Req(ip, gc);
                break;

            case ClientOpcode.CHAR_FURY:
                StatusHandler.Char_Fury_Req(ip, gc);
                break;

            // Inventory
            case ClientOpcode.MOVE_ITEM_REQ:
                InventoryHandler.MoveItem_Req(ip, gc);
                break;

            case ClientOpcode.INVEN_SELECTSLOT_REQ:
                InventoryHandler.SelectSlot_Req(ip, gc);
                break;

            case ClientOpcode.USE_SPEND_REQ:
                InventoryHandler.UseSpend_Req(ip, gc);
                break;

            case ClientOpcode.INVEN_USESPEND_REQ:
                InventoryHandler.InvenUseSpendStart_Req(ip, gc);
                break;

            case ClientOpcode.INVEN_USESPEND_SHOUT_REQ:
            case ClientOpcode.INVEN_USESPEND_SHOUT_ALL_REQ:
                InventoryHandler.InvenUseSpendShout_Req(ip, gc);
                break;

            case ClientOpcode.PICKUP_ITEM:
                InventoryHandler.PickupItem(ip, gc);
                break;

            // Skill
            case ClientOpcode.SKILL_LEVELUP_REQ:
                SkillHandler.SkillLevelUp_Req(ip, gc);
                break;

            //case ClientOpcode.USE_SKILL_REQ:
            //    SkillHandler.UseSkill_Req(ip, gc);
            //    break;
            // Quest
            case ClientOpcode.QUEST_ALL_REQ:
                QuestHandler.Quest_All_Req(ip, gc);
                break;

            case ClientOpcode.QUEST_GIVEUP_REQ:
                QuestHandler.Quest_GiveUp_Req(ip, gc);
                break;

            case ClientOpcode.QUEST_DONE_REQ:
                QuestHandler.Quest_Done_Req(ip, gc);
                break;

            case ClientOpcode.QUEST_RETURN_REQ:
                QuestHandler.Quest_Return_Req(ip, gc);
                break;

            case ClientOpcode.QUEST_DONE2_REQ:
                QuestHandler.Quest_Done2_Req(ip, gc);
                break;

            case ClientOpcode.QUEST_UPDATE_REQ:
                QuestHandler.Quest_Update_Req(ip, gc);
                break;

            // Map
            case ClientOpcode.ENTER_WARP_ACK_REQ:
                MapHandler.WarpToMap_Req(ip, gc);
                break;

            case ClientOpcode.CAN_WARP_ACK_REQ:
                MapHandler.WarpToMapAuth_Req(ip, gc);
                break;

            // Monster
            case ClientOpcode.ATTACK_MONSTER_REQ:
                MonsterHandler.AttackMonster_Req(ip, gc);
                break;

            // Storage
            case ClientOpcode.MOVE_ITEM_STORAGE_REQ:
                StorageHandler.MoveItemToStorage(ip, gc);
                break;

            case ClientOpcode.MOVE_ITEM_TO_BAG_REQ:
                StorageHandler.MoveItemToBag(ip, gc);
                break;

            case ClientOpcode.SAVE_MONEY_REQ:
                StorageHandler.SaveStorageMoney(ip, gc);
                break;

            case ClientOpcode.GIVE_MONEY_REQ:
                StorageHandler.GiveStorageMoney(ip, gc);
                break;

            // Coupon
            case ClientOpcode.CASH_SN:
                CouponHandler.Use_Coupon_Req(ip, gc);
                break;

            // Action
            case ClientOpcode.P_WARP_C:
                ActionHandler.p_Warp_c(ip, gc);
                break;

            case ClientOpcode.P_MOVE_C:
                ActionHandler.p_Move_c(ip, gc);
                break;

            case ClientOpcode.P_JUMP_C:
                ActionHandler.p_Jump_c(ip, gc);
                break;

            case ClientOpcode.P_SPEED_C:
                ActionHandler.p_Speed_c(ip, gc);
                break;

            case ClientOpcode.P_ATTACK_C:
                ActionHandler.p_Attack_c(ip, gc);
                break;

            //case ClientOpcode.P_DAMAGE_C:
            //    ActionHandler.p_Damage_c(ip, gc);
            //    break;
            //case ClientOpcode.P_DEAD_C:
            //    ActionHandler.p_Dead_c(ip, gc);
            //    break;
            case ClientOpcode.P_MOVE_C_2:
                ActionHandler.p_Move_c_2(ip, gc);
                break;

            //case ClientOpcode.PET_MOVE_C:
            //    ActionHandler.Pet_Move_C(ip, gc);
            //    break;
            //case ClientOpcode.PET_ATTACK_C:
            //    ActionHandler.Pet_Attack_C(ip, gc);
            //    break;
            // Trade
            case ClientOpcode.TRADE_INVITE_REQ:
                TradeHandler.TradeInvite(ip, gc);
                break;

            case ClientOpcode.TRADE_INVITE_RESPONSE_REQ:
                TradeHandler.TradeInviteResponses(ip, gc);
                break;

            case ClientOpcode.TRADE_READY_REQ:
                TradeHandler.TradeReady(ip, gc);
                break;

            case ClientOpcode.TRADE_CONFIRM_REQ:
                TradeHandler.TradeConfirm(ip, gc);
                break;

            case ClientOpcode.TRADE_CANCEL_REQ:
                TradeHandler.TradeCancel(ip, gc);
                break;

            case ClientOpcode.TRADE_PUT_REQ:
                TradeHandler.TradePutItem(ip, gc);
                break;

            // Party
            case ClientOpcode.PARTY_INVITE_REQ:
                PartyHandler.PartyInvite(ip, gc);
                break;

            case ClientOpcode.PARTY_INVITE_RESPONSES_REQ:
                PartyHandler.PartyInviteResponses(ip, gc);
                break;

            case ClientOpcode.PARTY_LEAVE:
                PartyHandler.PartyLeave(ip, gc);
                break;

            // PvP
            case ClientOpcode.PVP_REQ:
                PvPHandler.PvPInvite(ip, gc);
                break;

            case ClientOpcode.PVP_ACK_REQ:
                PvPHandler.PvPInviteResponses(ip, gc);
                break;

            // PlayerShop
            case ClientOpcode.PSHOP_OPEN_REQ:
                PlayerShopHandler.OpenShop_Req(ip, gc);
                break;

            case ClientOpcode.PSHOP_SELLSTART_REQ:
                PlayerShopHandler.SellStart_Req(ip, gc);
                break;

            case ClientOpcode.PSHOP_SELLEND_REQ:
                PlayerShopHandler.SellEnd_Req(ip, gc);
                break;

            case ClientOpcode.PSHOP_INFO_REQ:
                PlayerShopHandler.ShopInfo_Req(ip, gc);
                break;

            case ClientOpcode.PSHOP_BUYACK_REQ:
                PlayerShopHandler.Buy_Req(ip, gc);
                break;

            // Fish
            case ClientOpcode.FISH_REQ:
                FishHandler.Fish_Req(ip, gc);
                break;

            // CashShop
            //case ClientOpcode.CASHSHOP_LIST_REQ:
            //    CashShopHandler.CashShopList_Req(ip, gc);
            //    break;
            case ClientOpcode.CASH_MGAMECASH_REQ:
                CashShopHandler.MgameCash_Req(ip, gc);
                break;

            case ClientOpcode.CASH_BUY_REQ:
                CashShopHandler.BuyCommodity_Req(ip, gc);
                break;

            case ClientOpcode.CASH_GIFT_REQ:
                CashShopHandler.Gifts_Req(ip, gc);
                break;

            case ClientOpcode.CASH_TO_INVEN_REQ:
                CashShopHandler.CommodityToInventory_Req(ip, gc);
                break;

            case ClientOpcode.ABILITY_RECOVER_REQ:
                CashShopHandler.AbilityRecover_Req(ip, gc);
                break;

            case ClientOpcode.CASH_CHECKCHARNAME_REQ:
                CashShopHandler.CheckName_Req(ip, gc);
                break;

            case ClientOpcode.DISMANTLE_REQ:
                CashShopHandler.Dismantle_Req(ip, gc);
                break;

            // Pet
            case ClientOpcode.PET_NAME_REQ:
                PetHandler.Pet_Name_Req(ip, gc);
                break;

            case ClientOpcode.SPIRIT_MOVE_REQ:
                SpiritHandler.SpiritMove(ip, gc);
                break;

            case ClientOpcode.EQUIPMENT_COMPOUND_REQ:
                SpiritHandler.EquipmentCompound(ip, gc);
                break;

            case ClientOpcode.EVENTITEM_ACK:
                TradeHandler.TradeEventItem(ip, gc);
                break;
            }
        }
Пример #25
0
        public static void Login_Req(InPacket lea, Client c)
        {
            string username   = lea.ReadString();
            string password   = lea.ReadString();
            short  encryptKey = lea.ReadShort();

            if (username.IsAlphaNumeric() == false)
            {
                LoginPacket.Login_Ack(c, ServerState.LoginState.NO_USERNAME);
                return;
            }

            c.SetAccount(new Account(c));

            try
            {
                c.Account.Load(username);
                var    pe = new PasswordEncrypt(encryptKey);
                string encryptPassword = ServerConstants.PASSWORD_DECODE ? pe.encrypt(c.Account.Password, c.RetryLoginCount > 0 ? password.ToCharArray() : null) : c.Account.Password;

                if (!password.Equals(encryptPassword))
                {
                    LoginPacket.Login_Ack(c, ServerState.LoginState.PASSWORD_ERROR);
                    Log.Error("Login Fail!");
                    c.RetryLoginCount += 1;
                }
                else if (c.Account.Banned == 1)
                {
                    LoginPacket.Login_Ack(c, ServerState.LoginState.USER_LOCK);
                }
                else
                {
                    LoginPacket.Login_Ack(c, ServerState.LoginState.OK, encryptKey, c.Account.Master > 0 ? true : false);
                    c.Account.LoggedIn = 1;
                    Log.Success("Login Success!");
                }
                Log.Inform("Password = {0}", password);
                //Log.Inform("encryptKey = {0}", encryptKey);
                //Log.Inform("encryptPassword = {0}", encryptPassword);
            }
            catch (NoAccountException)
            {
                if (ServerConstants.AUTO_REGISTRATION == true)
                {
                    if (username.Length < 5 || password.Length < 5)
                    {
                        LoginPacket.Login_Ack(c, ServerState.LoginState.NO_USERNAME);
                    }

                    Account account = new Account(c);
                    account.Username    = username.ToLower();
                    account.Password    = password;
                    account.Creation    = DateTime.Now;
                    account.LoggedIn    = 0;
                    account.Banned      = 0;
                    account.Master      = 0;
                    account.GamePoints  = 0;
                    account.GiftPoints  = 0;
                    account.BonusPoints = 0;
                    account.Save();
                    LoginPacket.Login_Ack(c, ServerState.LoginState.USER_LOCK);
                    return;
                }
                LoginPacket.Login_Ack(c, ServerState.LoginState.NO_USERNAME);
            }
        }
Пример #26
0
        public static void AttackMonster_Req(InPacket lea, Client gc)
        {
            short CharacterID = lea.ReadShort();
            short OriginalID  = lea.ReadShort();

            lea.ReadShort();
            short   Damage  = lea.ReadShort();
            short   HitX    = lea.ReadShort();
            short   HitY    = lea.ReadShort();
            short   SkillID = lea.ReadShort();
            var     chr     = gc.Character;
            Map     Map     = MapFactory.GetMap(chr.MapX, chr.MapY);
            Monster Monster = Map.getMonsterByOriginalID(OriginalID);

            if (Monster == null)
            {
                return;
            }
            Monster.HP -= Damage;
            switch (SkillID)
            {
            case 10108:     // 點穴定身
                if (Randomizer.Next(0, 2) == 0)
                {
                    Monster.Effect = 1;
                }
                break;

            case 10204:     // 餵毒術
                if (Randomizer.Next(0, 2) == 0)
                {
                    Monster.Effect = 2;
                }
                break;

            case 10304:     // 玄冰擊
            case 10305:     // 冰凍大地
                if (Randomizer.Next(0, 2) == 0)
                {
                    Monster.Effect = 5;
                }
                break;

            case 10306:     // 矇蔽蝕眼
                if (Randomizer.Next(0, 2) == 0)
                {
                    Monster.Effect = 3;
                }
                break;

            default:
                //Log.Inform("[Attack Monster] SkillID = {0}", SkillID);
                break;
            }
            if (Monster.HP <= 0)
            {
                //if (Monster.IsAlive == false)
                //    return;
                Monster.State  = 9;
                Monster.Effect = 0;
                //map.Monster.Remove(Monster);
                Monster.IsAlive = false;
                chr.Exp        += Monster.Exp;
                if (chr.Exp >= GameConstants.getExpNeededForLevel(chr.Level))
                {
                    chr.LevelUp();
                }
                StatusPacket.UpdateExp(gc);

                // 加入要掉落物品
                int Max_Count     = 2; // 設定最大物品掉落數
                int Current_Count = 0;
                foreach (Loot loot in MobFactory.Drop_Data)
                {
                    if (Current_Count == Max_Count)
                    {
                        break;
                    }

                    if (loot.MobID == Monster.MonsterID)
                    {
                        if ((Randomizer.Next(999999) / GameServer.Rates.Loot) < loot.Chance)
                        {
                            Monster.Drops.Add(new Drop(0, loot.ItemID, (short)Randomizer.Next(loot.MinimumQuantity, loot.MaximumQuantity)));
                            Current_Count++;
                        }
                    }
                }

                // 加入要掉落靈魂
                //【藍色鬼魂】能恢復20%的鬼力值
                //【綠色鬼魂】能恢復40%的鬼力值
                //【紅色鬼魂】累積憤怒計量值用,當憤怒計滿之後能轉為憤怒狀態,攻防都會*1.2倍
                //【紫色鬼魂】能吸收到封印裝備,蒐集越多越能增加封印物合成的成功機率

                // 無 : 1%
                // 9900001 : 20%
                // 9900002 : 19%
                // 9900003 : 20%
                // 9900004 : 40%

                int[] Soul =
                {
                    0,
                    9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001,                                                                                                                                                                                    // 20%
                    9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002,                                                                                                                                                                                             // 19%
                    9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003,                                                                                                                                                                                    // 20%
                    9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004 // 40%
                };

                int rnd = Randomizer.Next(0, 100);
                if (rnd != 0)
                {
                    Monster.Drops.Add(new Drop(0, Soul[rnd], 20));
                }

                //int Max_Soul_Count = 1; // 設定最大物品掉落數
                //int Current_Soul_Count = 0;
                //int[] Soul = new int[] { 15000, 250000, 800000, 650000 };
                //for (int i = 1; i < 5; i++)
                //{
                //    if (Max_Soul_Count == Current_Soul_Count)
                //        break;

                //    if ((Randomizer.Next(999999) / GameServer.Rates.Loot) < Soul[i-1])
                //    {
                //        Monster.Drops.Add(new Drop(0, 9900001 + (i -1), 20));
                //        Current_Soul_Count++;
                //    }
                //}

                short rndMoney = (short)(Monster.Exp + Randomizer.Next(6));

                if (rndMoney != 0 && Monster.MonsterID != 1010002)                                   // rndMoney != 0 (少數怪物未寫入經驗值)
                {
                    Monster.Drops.Add(new Drop(0, InventoryType.getMoneyStyle(rndMoney), rndMoney)); // 錢
                }
                for (int i = 0; i < Monster.Drops.Count; i++)
                {
                    Monster.Drops[i].PositionX = Monster.PositionX;
                    Monster.Drops[i].PositionY = Monster.PositionY - 50;
                    //Item it = new Item(Monster.Drops[i].ItemID, 0x63, 0x63, Monster.Drops[i].Quantity);
                    Monster.Drops[i].ID = Map.ObjectID;
                    Map.Item.Add(Map.ObjectID, new Drop(Map.ObjectID, Monster.Drops[i].ItemID, Monster.Drops[i].Quantity));
                    Map.ObjectID++;
                }
                foreach (Character All in Map.Characters)
                {
                    MapPacket.MonsterDrop(All.Client, Monster);
                }
                Monster.Drops.Clear();
            }
            else
            {
                Monster.State = 7;
                if (chr.PlayerX < HitX && Monster.Direction == 1)
                {
                    Monster.Direction = 0xFF;
                }
                else if (chr.PlayerX > HitX && Monster.Direction == 0xFF)
                {
                    Monster.Direction = 1;
                }
            }

            foreach (Character All in Map.Characters)
            {
                MonsterPacket.spawnMonster(All.Client, Monster, CharacterID, Damage, HitX, HitY);
            }

            if (Monster.State == 9 && Monster.tmr1 != null)
            {
                Monster.tmr1.Cancel();
                Monster.tmr1 = null;
                return;
            }

            if (Monster.State == 9 && Monster.tmr2 != null)
            {
                Monster.tmr2.Cancel();
                Monster.tmr2 = null;
                return;
            }

            if (Monster.State == 9 && Monster.tmr3 != null)
            {
                Monster.tmr3.Cancel();
                Monster.tmr3 = null;
                return;
            }

            int r = Randomizer.Next(0, 2);

            if (r == 0 && Monster.Effect == 0 && Monster.State == 7 && Monster.AttackType != 0 && Monster.tmr1 == null)
            {
                Monster.tmr1 = new Delay(600, false, () =>
                {
                    if (Monster.State == 9)
                    {
                        Monster.tmr1.Cancel();
                        Monster.tmr2.Cancel();
                        Monster.tmr3.Cancel();
                        Monster.tmr1 = null;
                        Monster.tmr2 = null;
                        Monster.tmr3 = null;
                        return;
                    }
                    Monster.State = 3;
                    foreach (Character All in Map.Characters)
                    {
                        MonsterPacket.spawnMonster(All.Client, Monster, CharacterID, 0, HitX, HitY);
                    }
                    Monster.tmr1 = null;

                    if (Monster.State == 3 && Monster.tmr2 == null)
                    {
                        Monster.tmr2 = new Delay(500, false, () =>
                        {
                            if (Monster.State == 9)
                            {
                                Monster.tmr1.Cancel();
                                Monster.tmr2.Cancel();
                                Monster.tmr3.Cancel();
                                Monster.tmr1 = null;
                                Monster.tmr2 = null;
                                Monster.tmr3 = null;
                                return;
                            }
                            Monster.State = (Monster.MoveType == 0 ? (byte)0 : (byte)1);
                            foreach (Character All in Map.Characters)
                            {
                                MonsterPacket.spawnMonster(All.Client, Monster, 0, 0, 0, 0);
                            }
                            Monster.tmr2 = null;
                        });
                        Monster.tmr2.Execute();
                    }
                });
                Monster.tmr1.Execute();
            }

            if ((r == 1 && Monster.Effect == 0 && Monster.State != 9) || (Monster.State != 9 && Monster.Effect == 0 && Monster.AttackType == 0))
            {
                Monster.tmr2 = new Delay(500, false, () =>
                {
                    Monster.State = (Monster.MoveType == 0 ? (byte)0 : (byte)1);
                    foreach (Character All in Map.Characters)
                    {
                        MonsterPacket.spawnMonster(All.Client, Monster, 0, 0, 0, 0);
                    }
                    Monster.tmr2 = null;
                });
                Monster.tmr2.Execute();
            }

            if (Monster.Effect != 0)
            {
                Monster.tmr3 = new Delay(6000, false, () =>
                {
                    Monster.Effect = 0;
                    Monster.State  = (Monster.MoveType == 0 ? (byte)0 : (byte)1);
                    foreach (Character All in Map.Characters)
                    {
                        MonsterPacket.spawnMonster(All.Client, Monster, 0, 0, 0, 0);
                    }
                    Monster.tmr3 = null;
                });
                Monster.tmr3.Execute();
            }
        }
Пример #27
0
        public static void WarpToMap_Req(InPacket lea, Client gc)
        {
            int   CharacterID = lea.ReadInt();
            short MapX        = lea.ReadShort();
            short MapY        = lea.ReadShort();
            short PositionX   = lea.ReadShort();
            short PositionY   = lea.ReadShort();
            var   chr         = gc.Character;

            chr.MapX    = MapX;
            chr.MapY    = MapY;
            chr.PlayerX = PositionX;
            chr.PlayerY = PositionY;

            if (MapX == 77 && MapY == 1)
            {
                CashShopPacket.CashShopList1(gc); // 人物
                CashShopPacket.CashShopList2(gc); // 裝備
                CashShopPacket.CashShopList3(gc); // 能力
                CashShopPacket.CashShopList4(gc); // 靈物
                CashShopPacket.CashShopList5(gc); // 寶牌
                CashShopPacket.CashShopList6(gc);
                CashShopPacket.CashShopList7(gc); // 紅利積點
                CashShopPacket.CashShopList8(gc);
                CashShopPacket.CashShopList9(gc);
                CashShopPacket.MgameCash(gc);
                CashShopPacket.GuiHonCash(gc);

                // 接收禮物
                List <int> Gifts = new List <int>();

                foreach (dynamic datum in new Datums("Gifts").Populate())
                {
                    if (chr.Name.Equals(datum.name) && datum.receive == 0)
                    {
                        Gifts.Add(datum.itemID);
                        datum.receive = 1;
                        datum.Update("id = '{0}'", datum.id);
                    }
                }
                foreach (int ItemID in Gifts)
                {
                    chr.Items.Add(new Item(ItemID, true, 0, -1, (byte)InventoryType.ItemType.Cash, chr.Items.GetNextFreeSlot(InventoryType.ItemType.Cash)));
                    chr.Items.Save();
                }
                InventoryPacket.getInvenCash(gc);
                MapPacket.warpToMap(gc, chr, CharacterID, MapX, MapY, PositionX, PositionY);
                return;
            }

            Map Map = MapFactory.GetMap(MapX, MapY);

            MapPacket.warpToMap(gc, chr, CharacterID, MapX, MapY, PositionX, PositionY);

            if (Map.GetMapCharactersTotal() > 0)
            {
                foreach (Character All in Map.Characters)
                {
                    MapPacket.warpToMap(All.Client, chr, CharacterID, MapX, MapY, PositionX, PositionY);
                }

                MapPacket.createUser(gc, Map);
            }

            Map.Characters.Add(chr);

            //if ((MapX == 1 && MapY == 53) || (MapX == 1 && MapY == 54) || (MapX == 1 && MapY == 55))
            //    return;

            //if ((MapX == 10 && MapY == 63) || (MapX == 10 && MapY == 64))
            //{
            //    Monster Monster = new Monster(0, 1020001, 200, 10000, 10000, 0, 0, 1, 0xFF, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1408, 659, true);
            //    Map.Monster.Add(Monster);
            //}

            MonsterPacket.createAllMonster(gc, Map, Map.Monster);

            int j = 0;

            for (int i = 0; i < 50; i++)
            {
                if (Map.Monster[i] != null)
                {
                    j++;
                }
            }

            //for (int i = 0; i < j; i++)
            //{
            //    foreach (Character All in map.Characters)
            //    {
            //        if (map.Monster[i].IsAlive == true)
            //            MonsterPacket.spawnMonster(All.Client, map.Monster[i], 0, 0, 0, 0);
            //    }
            //}

            //if (map.GetMapCharactersTotal() < 1)
            //{
            Map.ControlMonster(gc, j);
            //}

            //if (chr.IsFuring == true)
            //{
            //    foreach (Character All in Map.Characters)
            //    {
            //        StatusPacket.Fury(All.Client, chr, chr.FuringType);
            //    }
            //}
        }
Пример #28
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);
            }
        }
Пример #29
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);
        }
        public static List <ILifeMovementFragment> ParseMovement(InPacket lea)
        {
            var res         = new List <ILifeMovementFragment>();
            var numCommands = lea.ReadByte();

            for (var i = 0; i < numCommands; i++)
            {
                var command = lea.ReadByte();
                switch (command)
                {
                case 0:     // normal move
                case 5:
                case 17:    // Float
                {
                    var xpos     = lea.ReadShort();
                    var ypos     = lea.ReadShort();
                    var xwobble  = lea.ReadShort();
                    var ywobble  = lea.ReadShort();
                    var unk      = lea.ReadShort();
                    var newstate = lea.ReadByte();
                    var duration = lea.ReadShort();
                    var alm      = new AbsoluteLifeMovement(command, new Point(xpos, ypos), duration, newstate);
                    alm.Unk             = unk;
                    alm.PixelsPerSecond = new Point(xwobble, ywobble);
                    res.Add(alm);
                    break;
                }

                case 1:
                case 2:
                case 6:     // fj
                case 12:
                case 13:    // Shot-jump-back thing
                case 16:    // Float
                {
                    var xmod     = lea.ReadShort();
                    var ymod     = lea.ReadShort();
                    var newstate = lea.ReadByte();
                    var duration = lea.ReadShort();
                    var rlm      = new RelativeLifeMovement(command, new Point(xmod, ymod), duration, newstate);
                    res.Add(rlm);
                    // log.trace("Relative move {},{} state {}, duration {}", new Object[] { xmod, ymod, newstate, duration });
                    break;
                }

                case 3:
                case 4:     // tele... -.-
                case 7:     // assaulter
                case 8:     // assassinate
                case 9:     // rush
                case 14:
                {
                    var xpos     = lea.ReadShort();
                    var ypos     = lea.ReadShort();
                    var xwobble  = lea.ReadShort();
                    var ywobble  = lea.ReadShort();
                    var newstate = lea.ReadByte();
                    var tm       = new TeleportMovement(command, new Point(xpos, ypos), newstate);
                    tm.PixelsPerSecond = new Point(xwobble, ywobble);
                    res.Add(tm);
                    break;
                }

                case 10:     // change equip ???
                {
                    res.Add(new ChangeEquipSpecialAwesome(lea.ReadByte()));
                    break;
                }

                case 11:     // chair
                {
                    var xpos     = lea.ReadShort();
                    var ypos     = lea.ReadShort();
                    var unk      = lea.ReadShort();
                    var newstate = lea.ReadByte();
                    var duration = lea.ReadShort();
                    var cm       = new ChairMovement(command, new Point(xpos, ypos), duration, newstate);
                    cm.Unk = unk;
                    res.Add(cm);
                    break;
                }

                case 15:
                {
                    var xpos     = lea.ReadShort();
                    var ypos     = lea.ReadShort();
                    var xwobble  = lea.ReadShort();
                    var ywobble  = lea.ReadShort();
                    var unk      = lea.ReadShort();
                    var fh       = lea.ReadShort();
                    var newstate = lea.ReadByte();
                    var duration = lea.ReadShort();
                    var jdm      = new JumpDownMovement(command, new Point(xpos, ypos), duration, newstate);
                    jdm.Unk             = unk;
                    jdm.PixelsPerSecond = new Point(xwobble, ywobble);
                    jdm.Fh = fh;
                    res.Add(jdm);
                    break;
                }

                case 20:
                case 21:
                case 22:
                {
                    var unk      = lea.ReadShort();
                    var newstate = lea.ReadByte();
                    var acm      = new ArasMovement(command, new Point(0, 0), unk, newstate);
                    res.Add(acm);
                    break;
                }

                default:
                {
                    Console.WriteLine("Unhandeled movement command {0} received", command);
                    //Console.WriteLine("Movement packet: {0}" lea.ToArray());
                    return(null);
                }
                }
            }
            if (numCommands != res.Count)
            {
                Console.WriteLine(
                    "numCommands ({0}) does not match the number of deserialized movement commands ({1})", numCommands,
                    res.Count);
            }
            return(res);
        }