Пример #1
0
        public void Handle(User u, InPacket p)
        {
            ushort usernameLength = p.ReadUShort();
            string username = p.ReadString(usernameLength);
            ushort passwordLength = p.ReadUShort();
            string password = p.ReadString(passwordLength);

            Console.WriteLine("Login Request: {0}:{1}", username, password);
        }
Пример #2
0
        public override void Dispatch(InPacket inPacket)
        {
            if (inPacket.OperationCode == Program.ServerIP)
            {
                ushort status = inPacket.ReadUShort();
                ushort status2 = inPacket.ReadUShort();
                byte[] ip = inPacket.ReadBytes(4);
                ushort port = inPacket.ReadUShort();
                byte[] leftover = inPacket.ReadLeftoverBytes();

                Program.IP = string.Format("{0}.{1}.{2}.{3}", ip[0], ip[1], ip[2], ip[3]);
                Program.Port = port;

                using (OutPacket outPacket = new OutPacket(Program.ServerIP))
                {
                    outPacket.WriteUShort(status);
                    outPacket.WriteUShort(status2);
                    outPacket.WriteBytes(127, 0, 0, 1);
                    outPacket.WriteUShort(8484);
                    outPacket.WriteBytes(leftover);

                    if (ClientSession.Instance != null)
                    {
                        ClientSession.Instance.Send(outPacket.ToArray());
                    }
                }
            }
            else
            {
                using (OutPacket outPacket = new OutPacket(inPacket))
                {
                    if (ClientSession.Instance != null)
                    {
                        ClientSession.Instance.Send(outPacket.ToArray());
                    }
                }
            }
        }
Пример #3
0
        // Preview Page 2 2019-08-29 11:3 [GMT+7]
        public static void Char_page2_preview(InPacket lea, Client gc)
        {
            int unknown1 = lea.ReadInt();

            CharPacket.Char_page2_preview_ack(gc);
        }
Пример #4
0
 public override void Handle(Server sender, InPacket packetReader)
 {
     // TODO Implement something here?
 }
Пример #5
0
 public Item(InPacket packet)
 {
     DisplayId     = packet.ReadUInt32();
     InventoryType = packet.ReadByte();
     packet.ReadUInt32();                // ???
 }
Пример #6
0
 public void HandlePacket(InPacket inPacket)
 {
     this.Handle(null, true, inPacket);
 }
Пример #7
0
        public static void MoveItem_Req(InPacket lea, Client gc)
        {
            byte SourceType = lea.ReadByte();
            byte SourceSlot = lea.ReadByte();
            byte TargetType = lea.ReadByte();
            byte TargetSlot = lea.ReadByte();
            int  Quantity   = lea.ReadInt();
            Item Source     = gc.Character.Items.getItem(SourceType, SourceSlot);
            Item Target     = gc.Character.Items.getItem(TargetType, TargetSlot);
            var  chr        = gc.Character;

            if (SourceType != (byte)InventoryType.ItemType.Pet5 && Source.IsLocked == 1 && TargetType == (byte)InventoryType.ItemType.Equip)
            {
                Source.IsLocked = 0;
            }

            if (TargetType == 0x63 && TargetSlot == 0x63)
            {
                if (SourceType == 0xFF && SourceSlot == 0xFF)
                {
                    return;
                }
                Map Map = MapFactory.GetMap(chr.MapX, chr.MapY);
                foreach (Character All in Map.Characters)
                {
                    InventoryPacket.CharDropItem(All.Client, Map.ObjectID, Source.ItemID, chr.PlayerX, (short)(chr.PlayerY - 50), Quantity == 0 ? 1 : Quantity);
                }
                Map.Item.Add(Map.ObjectID, new Drop(Map.ObjectID, Source.ItemID, Quantity == 0 ? (short)1 : (short)Quantity));
                Map.ObjectID++;
                chr.Items.Remove(SourceType, SourceSlot, Quantity == 0 ? 1 : Quantity);
            }
            else
            {
                if (chr.Items.getItem(TargetType, TargetSlot) == null)
                {
                    if (SourceType != 5 && TargetType != 5)
                    {
                        // 普通物品
                        Source.Type = TargetType;
                        Source.Slot = TargetSlot;
                        if (TargetType == (byte)InventoryType.ItemType.Equip || SourceType == (byte)InventoryType.ItemType.Equip)
                        {
                            UpdateCharacterInventoryStatus(gc, Source, SourceType > 0);
                        }
                    }
                    else
                    {
                        // 寵物
                        Pet Src = chr.Pets.Pet(SourceType, SourceSlot);
                        Pet Tar = chr.Pets.Pet(TargetType, TargetSlot);

                        if (SourceType == 5)
                        {
                            chr.UseSlot[(byte)InventoryType.ItemType.Pet5] = Src.Slot;
                        }
                        else if (TargetType == 5)
                        {
                            chr.UseSlot[(byte)InventoryType.ItemType.Pet5] = 0xFF;
                        }

                        if (chr.Pets.Pet(TargetType, TargetSlot) == null)
                        {
                            Src.Type = TargetType;
                            Src.Slot = TargetSlot;
                        }
                        else
                        {
                            // 交換位置(swap)
                            chr.Pets.Remove(SourceType, SourceSlot);
                            chr.Pets.Remove(TargetType, TargetSlot);
                            // 類型
                            byte swapType = Src.Type;
                            Src.Type = Tar.Type;
                            Tar.Type = swapType;
                            // 欄位
                            byte swapSlot = Src.Slot;
                            Src.Slot = Tar.Slot;
                            Tar.Slot = swapSlot;
                            //
                            chr.Pets.Add(Src);
                            chr.Pets.Add(Tar);
                        }
                    }
                }
                else
                {
                    if ((SourceType == TargetType) &&
                        ((TargetType == (byte)InventoryType.ItemType.Spend3) ||
                         (TargetType == (byte)InventoryType.ItemType.Other4)) &&
                        (Source.ItemID == Target.ItemID))
                    {
                        // 合併消費物品跟其他物品
                        if (chr.Items[(InventoryType.ItemType)Target.Type, Target.Slot].Quantity + Source.Quantity > 100)
                        {
                            short newqu = (short)(Source.Quantity - (100 - chr.Items[(InventoryType.ItemType)Target.Type, Target.Slot].Quantity));
                            chr.Items[(InventoryType.ItemType)Source.Type, Source.Slot].Quantity = newqu;
                            chr.Items[(InventoryType.ItemType)Target.Type, Target.Slot].Quantity = 100;
                        }
                        else
                        {
                            chr.Items.Remove(SourceType, SourceSlot);
                            chr.Items[(InventoryType.ItemType)Target.Type, Target.Slot].Quantity += Source.Quantity;
                        }
                    }
                    else
                    {
                        // 交換位置(swap)
                        chr.Items.Remove(SourceType, SourceSlot);
                        chr.Items.Remove(TargetType, TargetSlot);
                        // 類型
                        byte swapType = Source.Type;
                        Source.Type = Target.Type;
                        Target.Type = swapType;
                        // 欄位
                        byte swapSlot = Source.Slot;
                        Source.Slot = Target.Slot;
                        Target.Slot = swapSlot;
                        //
                        chr.Items.Add(Source);
                        chr.Items.Add(Target);
                    }
                    if (SourceType == (byte)InventoryType.ItemType.Equip && TargetType == (byte)InventoryType.ItemType.Equip1)
                    {
                        UpdateCharacterInventoryStatus(gc, Source, false);
                        UpdateCharacterInventoryStatus(gc, Target, true);
                    }
                    else if (SourceType == (byte)InventoryType.ItemType.Equip || TargetType == (byte)InventoryType.ItemType.Equip)
                    {
                        UpdateCharacterInventoryStatus(gc, Target, false);
                        UpdateCharacterInventoryStatus(gc, Source, true);
                    }
                }
            }
            UpdateInventory(gc, SourceType, TargetType);
        }
Пример #8
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);
        }
Пример #9
0
        private void OnDataReceived(IAsyncResult iAr)
        {
            try
            {
                int bytesReceived = socket.EndReceive(iAr);

                if (bytesReceived > 0)
                {
                    byte[] packetBuffer = new byte[bytesReceived];

                    Buffer.BlockCopy(buffer, 0, packetBuffer, 0, packetBuffer.Length);
                    // Decrypt the bytes with the xOrKey.
                    for (int i = 0; i < bytesReceived; i++)
                    {
                        packetBuffer[i] ^= Core.Constants.xOrKeyReceive;
                    }

                    int oldLength = cacheBuffer.Length;
                    Array.Resize(ref cacheBuffer, oldLength + bytesReceived);
                    Array.Copy(packetBuffer, 0, cacheBuffer, oldLength, packetBuffer.Length);

                    int startIndex = 0; // Determs whre the bytes should split
                    for (int i = 0; i < cacheBuffer.Length; i++)
                    {
                        // loop trough our cached buffer.
                        if (cacheBuffer[i] == 0x0A)
                        {
                            // Found a complete packet
                            byte[] newPacket = new byte[i - startIndex]; // determ the new packet size.
                            for (int j = 0; j < (i - startIndex); j++)
                            {
                                newPacket[j] = cacheBuffer[startIndex + j]; // copy the buffer to the buffer of the new packet.
                            }

                            // Handle the packet instantly.
                            InPacket inPacket = new InPacket(newPacket);
                            if (inPacket.Id > 0)
                            {
                                PacketHandler <User> pHandler = NetworkTable.Instance.FindExternal(inPacket);
                                if (pHandler != null)
                                {
                                    try
                                    {
                                        pHandler.Handle(this, inPacket);
                                    }
                                    catch { /*Disconnect();*/ }
                                }
                                else
                                {
                                    Console.WriteLine("UNKNOWN PACKET :: " + newPacket);
                                }
                            }

                            startIndex = i + 1;
                        }
                    }

                    if (startIndex > 0)
                    {
                        byte[] fullCopy = cacheBuffer;
                        Array.Resize(ref cacheBuffer, (cacheBuffer.Length - startIndex));
                        for (int i = 0; i < (cacheBuffer.Length - startIndex); i++)
                        {
                            cacheBuffer[i] = fullCopy[startIndex + i];
                        }
                        fullCopy = null;
                    }

                    socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), null);
                }
                else
                {
                    Disconnect();
                }
            }
            catch
            {
                Disconnect();
            }
        }
Пример #10
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);
        }
Пример #11
0
    private void ReadPacket()
    {
        if (BytesToSkip > 0)
        {
            int skipped = Math.Min(BytesToSkip, (int)Memory.Length);
            Memory.Position += skipped;
            BytesToSkip     -= skipped;
        }

        while (Memory.Length - Memory.Position > 2)
        {
            // Commands are always the first two bytes
            // Followed by either the packet data in case the packet
            // has its size fixed, or the packet length
            var tmp = new byte[2];
            Memory.Read(tmp, 0, 2);
            ushort cmd = BitConverter.ToUInt16(tmp, 0);

            if (!RegisteredPackets.ContainsKey(cmd))
            {
                // We gotta break because we don't know the size of the packet
                Debug.LogWarning($"Received Unknown Command: {string.Format("0x{0:x4}", cmd)}\nProbably: {(PacketHeader)cmd}");
                Memory.Position -= 2;
                break;
            }
            else
            {
                int  size    = RegisteredPackets[cmd].Size;
                bool isFixed = true;

                if (size <= 0)
                {
                    isFixed = false;

                    // Do we have more than two bytes left?
                    if (Memory.Length - Memory.Position > 2)
                    {
                        Memory.Read(tmp, 0, 2);
                        size = BitConverter.ToUInt16(tmp, 0);
                    }
                    else
                    {
                        Memory.Position -= 4;
                        break;
                    }
                }

                // Read skipping command and length
                byte[] data = new byte[size];
                Memory.Read(data, 0, size - (isFixed ? 2 : 4));

                ConstructorInfo ci     = RegisteredPackets[cmd].Type.GetConstructor(new Type[] { });
                InPacket        packet = (InPacket)ci.Invoke(null);
                using (var br = new BinaryReader(data)) {
                    var shouldContinue = packet.Read(br);

                    ThreadManager.ExecuteOnMainThread(() => {
                        if (PacketHooks.ContainsKey(cmd))
                        {
                            PacketHooks[cmd].DynamicInvoke(cmd, size, packet);
                        }
                        else
                        {
                            Debug.LogWarning($"Received Unhadled Command {(PacketHeader)cmd}");
                        }
                        PacketReceived?.Invoke(cmd, size, packet);
                    });

                    if (!shouldContinue)
                    {
                        break;
                    }
                }
            }
        }

        if (Memory.Length - Memory.Position > 0)
        {
            MemoryStream ms = new MemoryStream();
            ms.Write(Memory.GetBuffer(), (int)Memory.Position, (int)Memory.Length - (int)Memory.Position);
            Memory.Dispose();

            Memory = ms;
        }
    }
Пример #12
0
        private void OnDataReceived(IAsyncResult iAr)
        {
            try
            {
                int bytesReceived = socket.EndReceive(iAr);

                if (bytesReceived > 0)
                {
                    byte[] packetBuffer = new byte[bytesReceived];

                    // Decrypt the bytes with the xOrKey.
                    for (int i = 0; i < bytesReceived; i++)
                    {
                        packetBuffer[i] = (byte)(this.buffer[i] ^ Core.Constants.xOrKeyReceive);
                    }

                    int oldLength = cacheBuffer.Length;
                    Array.Resize(ref cacheBuffer, oldLength + bytesReceived);
                    Array.Copy(packetBuffer, 0, cacheBuffer, oldLength, packetBuffer.Length);

                    int startIndex = 0;                                  // Determs where the bytes should split
                    for (int i = 0; i < cacheBuffer.Length; i++)
                    {                                                    // loop trough our cached buffer.
                        if (cacheBuffer[i] == 0x0A)
                        {                                                // Found a complete packet
                            byte[] newPacket = new byte[i - startIndex]; // determ the new packet size.
                            for (int j = 0; j < (i - startIndex); j++)
                            {
                                newPacket[j] = cacheBuffer[startIndex + j]; // copy the buffer to the buffer of the new packet.
                            }
                            packetCount++;
                            // Instant handeling
                            InPacket inPacket = new InPacket(newPacket);
                            if (inPacket != null)
                            {
                                if (inPacket.Id > 0)
                                {
                                    PacketHandler <User> pHandler = NetworkTable.Instance.FindExternal(inPacket);
                                    if (pHandler != null)
                                    {
                                        try
                                        {
                                            pHandler.Handle(this, inPacket);
                                        }
                                        catch (Exception e) { Log.Instance.WriteError(e.ToString()); }
                                    }
                                }
                            }
                            // Increase start index.
                            startIndex = i + 1;
                        }
                    }

                    if (startIndex > 0)
                    {
                        byte[] fullCopy = cacheBuffer;
                        Array.Resize(ref cacheBuffer, (cacheBuffer.Length - startIndex));
                        for (int i = 0; i < (cacheBuffer.Length - startIndex); i++)
                        {
                            cacheBuffer[i] = fullCopy[startIndex + i];
                        }
                        fullCopy = null;
                    }

                    socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), null);
                }
                else
                {
                    Disconnect();
                }
            }
            catch
            {
                Disconnect();
            }
        }
Пример #13
0
        public void PushIn(ByteBuffer receiveIn)
        {
            InPacket inPacket = ParseIn(receiveIn);

            this.PushIn(inPacket);
        }
Пример #14
0
 public void PushIn(InPacket inPacket)
 {
     client.PacketManager.AddIncomingPacket(inPacket, ID);
 }
Пример #15
0
 public OutPacket RetrieveSent(InPacket inPacket)
 {
     return(helper.RetriveSent(inPacket));
 }
Пример #16
0
        // Holy Grail ftw
        public static void useItem(Character chr, Item item, byte usingIndex, InPacket p)
        {
            MartialClient c              = chr.getAccount().mClient;
            ItemData      itemData       = ItemDataCache.Instance.getItemData(item.getItemID());
            Boolean       shouldDecrease = false;
            string        determined     = null;
            int           determiner     = 0;

            if (itemData.getIsStackable())
            {
                shouldDecrease = true;
            }
            else
            {
                if (itemData.getTimeToExpire() == 0)
                {
                    shouldDecrease = true;
                }
            }

            // well.. we don't care if it's handled by server.. let's just remove them & f**k haterz! qq
            if (shouldDecrease)
            {
                if (!chr.getInventory().decrementItem(usingIndex))
                {
                    Console.WriteLine("something went wrong with decrement..");
                    return;
                }
            }

            switch (itemData.getCategory())
            {
            case 1001:                     // healingz
            {
                if (itemData.getHealHP() > 0 || itemData.getHealMana() > 0 || itemData.getHealStamina() > 0)
                {
                    StaticPackets.releaseHealPacket(chr, (int)(chr.getCurHP() + itemData.getHealHP()), (short)(chr.getCurMP() + itemData.getHealMana()), (short)(chr.getCurSP() + itemData.getHealStamina()));
                }
                break;
            }

            case 1002:                     // skillz o.o
            {
                StaticPackets.sendSystemMessageToClient(chr.getAccount().mClient, 1, "If you'd like to learn any skill, go to skills list and press CTRL+LMB.");
                break;
            }

            case 1003:                     // teleport
            {
                if (chr.getMap() == itemData.getTeleportMap() || chr.getMap() != itemData.getTeleportMap() && itemData.getSpecialEffect() != 0)
                {
                    CharacterFunctions.setPlayerPosition(chr, itemData.getTeleportX(), itemData.getTeleportY(), (short)itemData.getTeleportMap());
                }
                break;
            }

            case 1007:                     // reset skills
            {
                chr.getSkills().resetAll();
                chr.getSkillBar().getSkillBar().Clear();
                break;
            }

            case 1011:                     // effect potions
            {
                chr.setEffect((byte)itemData.getSpecialEffect());
                break;
            }

            case 1012:                     // tae potion
            {
                break;
            }

            case 1013:                     // faction change
            {
                if (chr.getFaction() == 0)
                {
                    return;
                }

                chr.setFaction(chr.getFaction() == 1 ? (byte)2 : (byte)1);
                break;
            }

            case 1015:                     // chuk amulet
            {
                determiner = BitConverter.ToInt32(p.ReadBytes(4), 0);
                if (determiner == 0)
                {
                    return;
                }
                ItemData determinedItem = ItemDataCache.Instance.getItemData(determiner);
                if (determinedItem == null || determinedItem.getCategory() != 1003 || (determiner < 212100146 && determiner > 212100164 && determiner != 212100185 && determiner != 212100187))
                {
                    Console.WriteLine("I CAN'T TURN 10 INTO 20 CHICKENZ");
                    return;
                }
                CharacterFunctions.setPlayerPosition(chr, determinedItem.getTeleportX(), determinedItem.getTeleportY(), (short)determinedItem.getTeleportMap());
                break;
            }

            case 1016:                     // karma amulet
            {
                chr.setKarmaMessagingTimes((short)(chr.getKarmaMessagingTimes() + 1));
                break;
            }

            case 1020:                     // name changer
            {
                p.Skip(4);
                string charName = MiscFunctions.obscureString(p.ReadString(16));
                if (charName.Length < 3 || Regex.Replace(charName, "[^A-Za-z0-9]+", "") != charName || MySQLTool.NameTaken(charName))
                {
                    StaticPackets.sendSystemMessageToClient(chr.getAccount().mClient, 1, "Wrong input " + charName + ".");
                    return;
                }

                chr.setName(charName);
                determined = charName;

                CharacterFunctions.refreshCharacterForTheWorld(chr);
                break;
            }

            case 1021:                     // face changer
            {
                chr.setFace((byte)itemData.getSpecialEffect());
                break;
            }

            case 1024:
            {
                // yy..?
                break;
            }

            case 1031:                     // red castle
            {
                determiner = BitConverter.ToInt32(p.ReadBytes(4), 0);
                if (determiner == 0)
                {
                    return;
                }
                ItemData determinedItem = ItemDataCache.Instance.getItemData(determiner);
                if (determinedItem == null || determinedItem.getCategory() != 56 || ((determiner < 273001255 && determiner > 273001257) && determiner != 283000472 && determiner != 283000543 && determiner != 283000575 && determiner != 283000614 && determiner != 283000934 && determiner != 283001078 && determiner != 283001373 && determiner != 283001376))
                {
                    Console.WriteLine("I CAN'T TURN 10 INTO 20 CHICKENZ");
                    return;
                }
                CharacterFunctions.setPlayerPosition(chr, determinedItem.getTeleportX(), determinedItem.getTeleportY(), (short)determinedItem.getTeleportMap());
                break;
            }

            default:
            {
                StaticPackets.sendSystemMessageToClient(chr.getAccount().mClient, 1, "Feature not implemented yet");
                return;
            }
            }

            OutPacket op = new OutPacket(52);

            op.WriteInt(52);
            op.WriteShort(0x04);
            op.WriteShort(0x05);
            op.WriteInt(140328705);
            op.WriteInt(chr.getuID());
            op.WriteShort(0x01);
            op.WriteByte(0x01);
            op.WriteByte(usingIndex);
            op.WriteInt(item.getQuantity());
            op.WriteInt(793149441);
            op.WriteInt(/*determiner > 0 ? determiner : 0*/);
            op.WritePaddedString(determined, 17);
            op.WriteByte(0x90);
            op.WriteByte(0xd2);
            op.WriteByte(0x2a);
            c.WriteRawPacket(op.ToArray());

            OutPacket ops = new OutPacket(40);

            ops.WriteInt(40);
            ops.WriteShort(0x05);
            ops.WriteShort(0x05);
            ops.WriteInt(779458561);
            ops.WriteInt(chr.getuID());
            ops.WriteInt(item.getItemID());
            ops.WritePaddedString(determined, 17);
            ops.WriteByte(0x9e);
            ops.WriteByte(0x0f);
            ops.WriteByte(0xbf);
            WMap.Instance.getGrid(chr.getMap()).sendTo3x3Area(chr, chr.getArea(), ops.ToArray());
        }
Пример #17
0
 public abstract void Decode(InPacket packet);
Пример #18
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);
        }
Пример #19
0
 public static void DeclareWar(MartialClient c, InPacket p)
 {
     return;
 }
Пример #20
0
 protected void HandleTransferPending(InPacket packet)
 {
     Player.ResetPosition();
     var newMap = packet.ReadUInt32();
 }
Пример #21
0
        public static void CreateGuild(MartialClient c, InPacket p)
        {
            if (c.getAccount().activeCharacter == null)
            {
                Logger.LogCheat(Logger.HackTypes.NullActive, c, "Hooked guild.Refresh with null of activeCharacter");
                c.Close();
                return;
            }

            Character chr = c.getAccount().activeCharacter;

            Guild guild = chr.getGuild();

            byte   managementType = p.ReadByte();           // 0 - disband; 1 - create; 2 - donate; 3 - hat
            byte   managementArg  = p.ReadByte();           // 1 - bang, 2 - mun, 3 - pa, 4 - nohing, 5 - dan, 6 - gak, 7 - gyo, 8 - gung
            string managementName = MiscFunctions.obscureString(p.ReadString(18));

            switch (managementType)
            {
            case 0:
            {
                if (guild == null)
                {
                    Logger.LogCheat(Logger.HackTypes.Guild, c, "Hooked guild disband with char that ain't in guild");
                    c.Close();
                    return;
                }

                guild.Delete();
                WMap.Instance.removeGuild(guild);
                foreach (GuildMember i in guild.guildMembers)
                {
                    Character tmp = i.getOnlineCharacter();
                    tmp.getAccount().mClient.WriteRawPacket(GuildPackets.quitGuildForInternal(tmp));
                    WMap.Instance.getGrid(tmp.getMap()).sendTo3x3Area(tmp, tmp.getArea(), GuildPackets.quitGuildForExternals(tmp));
                    tmp.setGuild(null);
                    i.setOnlineCharacter(null);
                }
                return;
            }

            case 1:
            {
                if (guild != null)
                {
                    Logger.LogCheat(Logger.HackTypes.Guild, c, "Hooked guild create with char that is in guild");
                    c.Close();
                    return;
                }

                Guild newGuild = new Guild(managementArg, managementName);
                c.WriteRawPacket(GuildPackets.createGuildResponse(chr, managementType, managementArg, managementName));
                WMap.Instance.getGrid(chr.getMap()).sendTo3x3Area(chr, chr.getArea(), GuildPackets.extCharGuild(chr));
                return;
            }

            case 2:
            {
                if (guild == null)
                {
                    Logger.LogCheat(Logger.HackTypes.Guild, c, "Hooked guild donate with char that ain't in guild");
                    c.Close();
                    return;
                }


                return;
            }

            case 3:
            {
                if (guild == null)
                {
                    Logger.LogCheat(Logger.HackTypes.Guild, c, "Hooked guild hat change with char that ain't in guild");
                    c.Close();
                    return;
                }

                guild.guildHat = managementArg;
                WMap.Instance.getGrid(chr.getMap()).sendTo3x3Area(chr, chr.getArea(), GuildPackets.extCharGuild(chr));
                c.WriteRawPacket(GuildPackets.refreshGuild(chr));
                return;
            }
            }
            return;
        }
Пример #22
0
        public static void UseSpend_Req(InPacket lea, Client gc)
        {
            var  chr  = gc.Character;
            byte Type = lea.ReadByte();
            byte Slot = lea.ReadByte();
            Item Item = chr.Items.getItem(Type, Slot);
            Map  map  = MapFactory.GetMap(chr.MapX, chr.MapY);
            var  use  = ItemFactory.useData[Item.ItemID];

            // 使用回復HP 跟 MP 的物品
            switch (Item.ItemID)
            {
            case 8841006:     // 全部還原本
                int Recover = 0;
                Recover           = Recover + (chr.Str - 3);
                Recover           = Recover + (chr.Dex - 3);
                Recover           = Recover + (chr.Vit - 3);
                Recover           = Recover + (chr.Int - 3);
                chr.Str           = 3;
                chr.Dex           = 3;
                chr.Vit           = 3;
                chr.Int           = 3;
                chr.AbilityBonus += (short)Recover;
                StatusPacket.getStatusInfo(gc);
                break;

            case 8850011:     // 回城符
                switch (chr.MapX)
                {
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                case 22:
                case 23:
                    chr.MapX = 1;
                    chr.MapY = 1;
                    break;

                case 7:
                case 8:
                case 9:
                    chr.MapX = 16;
                    chr.MapY = 1;
                    break;

                case 10:
                case 11:
                case 20:
                    chr.MapX = 10;
                    chr.MapY = 1;
                    break;

                case 12:
                case 13:
                    chr.MapX = 12;
                    chr.MapY = 1;
                    break;

                case 14:
                case 15:
                case 17:
                case 18:
                case 19:
                case 21:
                    chr.MapX = 15;
                    chr.MapY = 1;
                    break;

                case 16:
                    chr.MapX = 16;
                    chr.MapY = 1;
                    break;

                case 24:
                case 25:
                case 26:
                case 31:
                case 32:
                case 33:
                    chr.MapX = 25;
                    chr.MapY = 1;
                    break;

                case 27:
                case 28:
                    chr.MapX = 27;
                    chr.MapY = 1;
                    break;

                default:
                    chr.MapX = 1;
                    chr.MapY = 1;
                    break;
                }
                chr.PlayerX = 0;
                chr.PlayerY = 0;
                MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY);
                break;

            case 8850021:     // 清陰符
                chr.MapX    = 1;
                chr.MapY    = 2;
                chr.PlayerX = 2955;
                chr.PlayerY = 1116;
                MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY);
                break;

            case 8850031:     // 龍林符(龍林城)
                chr.MapX    = 15;
                chr.MapY    = 2;
                chr.PlayerX = 3600;
                chr.PlayerY = 1041;
                MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY);
                break;

            case 8850041:     // 冥珠符
                chr.MapX    = 10;
                chr.MapY    = 3;
                chr.PlayerX = 1645;
                chr.PlayerY = 899;
                MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY);
                break;

            case 8850051:     // 古樂符
                chr.MapX    = 25;
                chr.MapY    = 1;
                chr.PlayerX = 4237;
                chr.PlayerY = 1230;
                MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY);
                break;

            case 8850061:     // 無名符
                chr.MapX    = 16;
                chr.MapY    = 1;
                chr.PlayerX = 2005;
                chr.PlayerY = 1101;
                MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY);
                break;

            case 8850071:     // 龍林符(龍林客棧)
                chr.MapX    = 12;
                chr.MapY    = 1;
                chr.PlayerX = 1040;
                chr.PlayerY = 782;
                MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY);
                break;

            case 8890011:     // 蠟燭
            case 8890021:     // 火把
                InventoryPacket.UseSpendStart(gc, chr, chr.PlayerX, chr.PlayerY, Item.ItemID, (byte)InventoryType.ItemType.Spend3, Slot);
                break;

            case 8899017:     // 逮巴符
                chr.MapX    = 27;
                chr.MapY    = 1;
                chr.PlayerX = 2070;
                chr.PlayerY = 1330;
                MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY);
                break;

            default:
                switch (use.Type)
                {
                case 0:         // 恢復鬼力
                    if ((chr.MaxMp > chr.Mp + use.Recover))
                    {
                        chr.Mp += (short)use.Recover;
                        StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury);
                    }
                    else if (chr.MaxMp - chr.Mp < use.Recover)
                    {
                        chr.Mp = chr.MaxMp;
                        StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury);
                    }
                    break;

                case 1:         // 恢復鬼力(%)
                    if ((chr.MaxMp > chr.Mp + chr.MaxMp * use.Recover / 100))
                    {
                        chr.Mp += (short)(chr.MaxMp * use.Recover / 100);
                        StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury);
                    }
                    else if (chr.MaxMp - chr.Mp < chr.MaxMp * use.Recover / 100)
                    {
                        chr.Mp = chr.MaxMp;
                        StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury);
                    }
                    break;

                case 2:         // 恢復體力
                    if ((chr.MaxHp > chr.Hp + use.Recover))
                    {
                        chr.Hp += (short)use.Recover;
                        StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury);
                    }
                    else if (chr.MaxHp - chr.Hp < use.Recover)
                    {
                        chr.Hp = chr.MaxHp;
                        StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury);
                    }
                    break;

                case 3:         // 恢復體力(%)
                    if ((chr.MaxHp > chr.Hp + chr.MaxHp * use.Recover / 100))
                    {
                        chr.Hp += (short)(chr.MaxHp * use.Recover / 100);
                        StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury);
                    }
                    else if (chr.MaxHp - chr.Hp < chr.MaxHp * use.Recover / 100)
                    {
                        chr.Hp = chr.MaxHp;
                        StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury);
                    }
                    break;

                default:
                    break;
                }
                break;
            }
            chr.Items.Remove(Type, Slot, 1);
            UpdateInventory(gc, Type);
        }
Пример #23
0
        public override void OnPacket(InPacket iPacket)
        {
            try
            {
                iPacket.Decrypt(CRYPT_KEY);

                GameOpcodes uOpcode    = (GameOpcodes)iPacket.ReadUShort();
                int         uSize      = iPacket.ReadInt();
                bool        isCompress = iPacket.ReadBool();
                int         cSize      = 0;
                if (isCompress == true)
                {
                    cSize = iPacket.ReadInt();
                    LogFactory.GetLog("Main").LogWarning("[{0}] pacote comprimido chegada {1} ({2})", Login, (int)uOpcode, uOpcode.ToString());
                }
                else
                {
                    LogFactory.GetLog("Main").LogInfo("[{0}] de chegada de pacotes {1} ({2})", Login, (int)uOpcode, uOpcode.ToString());
                }

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

                switch (uOpcode)
                {
                case GameOpcodes.EVENT_HEART_BIT_NOT:     // 0
                    OnHeartBeatNot();
                    break;

                case GameOpcodes.EVENT_CHANGE_CHARACTER_INFO_REQ:     //1618
                    InfoChars.ChangeCharInfo(this);
                    break;

                case GameOpcodes.EVENT_VERIFY_ACCOUNT_REQ:     // 2
                    MyUser.OnLogin(this, iPacket);
                    break;

                case GameOpcodes.EVENT_SET_CURRENT_CHARACTER_REQ:
                    MyCommon.SetCurretChar(this, iPacket);
                    break;

                case GameOpcodes.EVENT_GET_FULL_SP_INFO_REQ:     // 423 0x1A7
                    MyCommon.OnGetFullSPInfo(this, iPacket);
                    break;

                case GameOpcodes.EVENT_PET_COSTUM_LIST_REQ:     // 517 0x205
                    MyCommon.OnPetCostumList(this, iPacket);
                    break;

                case GameOpcodes.EVENT_INVEN_BUFF_ITEM_LIST_REQ:     // 1226 0x04CA
                    MyCommon.OnInvenBuffItemList(this, iPacket);
                    break;

                case GameOpcodes.EVENT_DEPOT_INFO_REQ:     // 1340 0x053C
                    MyCommon.OnDepotInfo(this, iPacket);
                    break;

                case GameOpcodes.EVENT_STAT_CLIENT_INFO:     // 226 0x00E2
                    MyCommon.OnStatClientInfo(this, iPacket);
                    break;

                case GameOpcodes.EVENT_COST_RATE_FOR_GAMBLE_BUY_REQ:     // 871 0x0367
                    MyCommon.OnCostRateForGambleBuy(this);
                    break;

                case GameOpcodes.EVENT_REGISTER_NICKNAME_REQ:     // 134 0x0086
                    MyUser.OnRegisterNick(this, iPacket);
                    break;

                case GameOpcodes.EVENT_SET_IDLE_STATE_REQ:     // 835 0x0343
                    MyCommon.OnSetIDLE(this, iPacket);
                    break;

                case GameOpcodes.EVENT_CHAR_SELECT_JOIN_REQ:     // 1557 0x0613
                    MyUser.OnCharSelectJoin(this, iPacket);
                    break;

                case GameOpcodes.EVENT_CHOICE_BOX_LIST_REQ:     // 1012 0x03F4
                    MyCommon.OnChoiceBoxList(this);
                    break;

                case GameOpcodes.EVENT_EXP_POTION_LIST_REQ:     // 1338 0x053A
                    MyCommon.OnExpPotionList(this);
                    break;

                case GameOpcodes.EVENT_AGIT_STORE_CATALOG_REQ:     // 1114 0x054A
                    MyCommon.OnAgitStoreCatalog(this);
                    break;

                case GameOpcodes.EVENT_AGIT_STORE_MATERIAL_REQ:     // 1116 0x045C
                    MyCommon.OnAgitStoreMaterial(this);
                    break;

                case GameOpcodes.EVENT_AGIT_MAP_CATALOGUE_REQ:     // 1106 0x0452
                    MyCommon.OnAgitMapCatalogue(this);
                    break;

                case GameOpcodes.EVENT_FAIRY_TREE_LV_TABLE_REQ:     // 1184 0x04A0
                    MyCommon.OnFaityTreeLvTable(this);
                    break;

                case GameOpcodes.EVENT_INVITE_DENY_NOT:     // 348 0x015C
                    InviteDeny = iPacket.ReadBool();
                    break;

                case GameOpcodes.EVENT_GET_USER_DONATION_INFO_REQ:     // 523 0x020B
                    MyCommon.OnGetUserDonationInfo(this);
                    break;

                case GameOpcodes.EVENT_RECOMMEND_FULL_INFO_REQ:     // 567 0x0237
                    MyCommon.OnRecommentUser(this);
                    break;

                case GameOpcodes.EVENT_USER_BINGO_DATA_REQ:     // 654 0x28E
                    MyCommon.OnUserBingoData(this);
                    break;

                case GameOpcodes.EVENT_CHANNEL_LIST_REQ:     // 14 0x0E
                    MyCommon.OnChannelList(this);
                    break;

                case GameOpcodes.EVENT_DONATION_INFO_REQ:     // 525 0x020D
                    MyCommon.OnDonationInfo(this);
                    break;

                case GameOpcodes.EVENT_ENTER_CHANNEL_REQ:     // 12 0x0C
                    MyUser.OnEnterChannel(this, iPacket);
                    break;

                case GameOpcodes.EVENT_LEAVE_CHANNEL_NOT:     // 26
                    MyUser.OnLeaveChannel(this);
                    break;

                case GameOpcodes.EVENT_CREATE_ROOM_REQ:
                    MyUser.OnCreateRoom(this, iPacket);
                    break;

                case GameOpcodes.EVENT_CHANGE_ROOM_INFO_REQ:
                    CurrentRoom.OnChangeRoomInfo(this, iPacket);
                    break;

                case GameOpcodes.EVENT_CHANGE_ROOMUSER_INFO_REQ:
                    CurrentRoom.OnChangeUserInfo(this, iPacket);
                    break;

                case GameOpcodes.EVENT_LEAVE_ROOM_REQ:
                    CurrentRoom.OnLeaveRoom(this, iPacket);
                    break;

                case GameOpcodes.EVENT_ROOM_LIST_REQ:
                    CurrentChannel.OnRoomList(this, iPacket);
                    break;

                case GameOpcodes.EVENT_JOIN_ROOM_REQ:
                    CurrentChannel.OnJoinRoom(this, iPacket);
                    break;

                case GameOpcodes.EVENT_START_GAME_REQ:
                    CurrentRoom.StartGame(this, iPacket);
                    break;

                case GameOpcodes.EVENT_RELAY_LOADING_STATE:
                    CurrentRoom.OnLoadState(this, iPacket);
                    break;

                case GameOpcodes.EVENT_LOAD_COMPLETE_NOT:
                    //MyUser.LoadComplete(this, iPacket);
                    CurrentRoom.OnLoadComplete(this, iPacket);
                    break;

                case GameOpcodes.EVENT_STAGE_LOAD_COMPLETE_NOT:
                    //MyUser.StageLoadComplete(this, iPacket);
                    CurrentRoom.OnStageLoadComplete(this, iPacket);
                    break;

                case GameOpcodes.EVENT_ROOM_MEMBER_PING_INFO_REQ:
                    CurrentRoom.OnPingInfo(this, iPacket);
                    break;

                case GameOpcodes.EVENT_GET_ROOMUSER_IDLE_STATE_REQ:
                    CurrentRoom.OnIdleInfo(this, iPacket);
                    break;

                case GameOpcodes.EVENT_END_GAME_REQ:
                    CurrentRoom.OnGameEnd(this, iPacket);
                    break;

                case GameOpcodes.EVENT_CHAT_REQ:
                    CurrentChannel.OnChat(this, iPacket);
                    break;

                case GameOpcodes.EVENT_LEAVE_GAME_REQ:
                    CurrentRoom.OnLeaveGame(this, iPacket);
                    break;

                case GameOpcodes.EVENT_EQUIP_ITEM_REQ:
                    MyCharacter.OnEquipItem(this, iPacket);
                    break;

                case GameOpcodes.EVENT_CHANGE_LOOK_EQUIP_REQ:
                    MyCharacter.OnChangeEquipInRoom(this, iPacket);
                    break;

                case GameOpcodes.EVENT_SET_PRESS_STATE_REQ:
                    CurrentRoom.OnSetPressState(this, iPacket);
                    break;

                case GameOpcodes.EVENT_SKILL_TRAINING_REQ:
                    MyCharacter.OnTrainSkill(this, iPacket);
                    break;

                case GameOpcodes.EVENT_SET_SKILL_REQ:
                    MyCharacter.OnSetSkill(this, iPacket);
                    break;

                case GameOpcodes.DB_EVENT_SYSTEM_GUIDE_COMPLETE_INFO_REQ:
                    MyCommon.SendGuideCompleteInfo(this);
                    break;

                case GameOpcodes.EVENT_CASHBACK_EXTRA_RATIO_INFO_REQ:
                    MyShop.CashRatio(this);
                    break;

                case GameOpcodes.EVENT_PACKAGE_INFO_REQ:
                    MyShop.packageInfo(this);
                    break;

                case GameOpcodes.EVENT_PACKAGE_INFO_DETAIL_REQ:
                    MyShop.packageInfoDetail(this, iPacket);
                    break;

                default:
                {
                    LogFactory.GetLog("Main").LogWarning("pacote indefinido foi recebido. Opcode: {0}({1})", (int)uOpcode, uOpcode.ToString());
                    LogFactory.GetLog("Main").LogHex("Pacote", iPacket.ToArray());
                    break;
                }
                }
            }
            catch (Exception e)
            {
                LogFactory.GetLog("Main").LogFatal(e);
                Close();
            }
        }
Пример #24
0
        public static void OpenShop_Req(InPacket lea, Client c)
        {
            int Slots = 6;

            PlayerShopPacket.OpenShop(c, Slots);
        }
Пример #25
0
        public static void WarpToMapAuth_Req(InPacket lea, Client gc)
        {
            var   chr            = gc.Character;
            short MapX           = lea.ReadShort();
            short MapY           = lea.ReadShort();
            short PositionX      = lea.ReadShort();
            short PositionY      = lea.ReadShort();
            bool  IsAvailableMap = true;

            if (chr.IsAlive == false)
            {
                StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury);
                chr.IsAlive = true;
                switch (MapX)
                {
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                case 22:
                case 23:
                    MapX = 1;
                    MapY = 1;
                    break;

                case 7:
                case 8:
                case 9:
                    MapX = 16;
                    MapY = 1;
                    break;

                case 10:
                case 11:
                case 20:
                    MapX = 10;
                    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))
                    {
                        MapY = 60;
                    }
                    else
                    {
                        MapY = 1;
                    }
                    break;

                case 12:
                case 13:
                    MapX = 12;
                    MapY = 1;
                    break;

                case 14:
                case 15:
                case 17:
                case 18:
                case 19:
                case 21:
                    MapX = 15;
                    MapY = 1;
                    break;

                case 16:
                    MapX = 16;
                    MapY = 1;
                    break;

                case 24:
                case 25:
                case 26:
                case 31:
                case 32:
                case 33:
                    MapX = 25;
                    MapY = 1;
                    break;

                case 27:
                case 28:
                    MapX = 27;
                    MapY = 1;
                    break;

                default:
                    MapX = 1;
                    MapY = 1;
                    break;
                }
                PositionX = 0;
                PositionY = 0;
            }
            MapPacket.warpToMapAuth(gc, IsAvailableMap, MapX, MapY, PositionX, PositionY);
        }
Пример #26
0
 private static void OnUDPPacketReceived(InPacket inPacket, IPEndPoint endpoint)
 {
 }
Пример #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 Check_SameName_Req(InPacket lea, Client gc)
        {
            string name = lea.ReadString(20);

            CharPacket.Check_SameName_Ack(gc, (Database.Exists("Characters", "name = '{0}'", name) ? 0 : 1));
        }
Пример #29
0
 protected override void Process(InPacket data)
 {
 }
Пример #30
0
        public static void Create_MyChar_Req(InPacket lea, Client gc)
        {
            string name   = lea.ReadString(20);
            int    gender = lea.ReadByte();
            int    value1 = lea.ReadByte();
            int    value2 = lea.ReadByte();
            int    value3 = lea.ReadByte();
            int    eyes   = lea.ReadInt();
            int    hair   = lea.ReadInt();
            int    weapon = lea.ReadInt();
            int    outfit = lea.ReadInt();
            int    job    = lea.ReadByte();
            int    seal   = 8510011;



            /*
             * Private
             * [05 01 ] [0A 00 38 00] [47 01 01 00] 00 00  Header
             * 4E 69 6E 6A 61 35 35 35 35  CharacterName
             * 00 00 00 00 00 00 00 00 00 00 00  Empty
             * 01 E7 19 00  // Unknow
             * DD A1 8B 00 // Eye =
             * D1 18 8A 00 // hair =
             * 3C 87 7A 00 // weapon 8030012
             * 01 00 7D 00 // Outfit 8192001
             * 02 00 00 00
             *
             */
            Log.Inform(">> Create Character");
            Log.Debug(">> Character Name: {0} Gender : {1} Value1 : {2} Value2 : {3} Value3 : {4}", name, gender, value1, value2, value3);
            Log.Debug(">> Character ITEM : Eye : {0} Hair: {1} Weapon: {2} Outfit: {3} Job: {4}", eyes, hair, weapon, outfit, job);


            var account_id = gc.Account.ID;

            if (gender != 1 && gender != 2)
            {
                account_id = 0;
                gc.Dispose();
            }

            // Hack Check
            int DefaultCharacterLevel = 1;

            if (job >= 6 && job < 12)
            {
                DefaultCharacterLevel = 60;
            }

            if (job < 1 || job > 11)
            {
                job        = 0;
                account_id = 0;
                gc.Dispose();
            }


            Character chr = new Character();

            chr.AccountID  = account_id;
            chr.WorldID    = gc.WorldID;
            chr.Name       = name;
            chr.Title      = "Kanghoin";
            chr.Level      = (byte)DefaultCharacterLevel;
            chr.Class      = 0;
            chr.ClassLevel = 0xFF;
            chr.Guild      = 0xFF;
            chr.Gender     = (byte)gender;
            chr.Job        = job;
            chr.Eyes       = eyes;
            chr.Hair       = hair;
            chr.MapX       = 0;
            chr.MapY       = 0;
            chr.Str        = 3;
            chr.Dex        = 3;
            chr.Vit        = 3;
            chr.Int        = 3;
            chr.Hp         = 75;
            chr.MaxHp      = 75;
            chr.Mp         = 25;
            chr.MaxMp      = 25;
            chr.Fury       = 0;
            chr.MaxFury    = 1200;
            chr.Exp        = 0;
            chr.Money      = 0;
            chr.Attack     = 9;
            chr.MaxAttack  = 11;
            chr.Magic      = 4;
            chr.MaxMagic   = 4;
            chr.Defense    = 12;
            chr.JumpHeight = 3;


            int pos = 1;

            foreach (Character cc in gc.Account.Characters)
            {
                if (cc.Position != pos)
                {
                    break;
                }

                pos++;
            }

            chr.Position = (byte)(pos);

            chr.Items.Add(
                new Item(weapon, (byte)(InventoryType.ItemType.Equip), (byte)InventoryType.EquipType.Weapon));
            chr.Items.Add(
                new Item(outfit, (byte)(InventoryType.ItemType.Equip), (byte)InventoryType.EquipType.Outfit));
            chr.Items.Add(new Item(seal, (byte)(InventoryType.ItemType.Equip), (byte)InventoryType.EquipType.Seal));
            chr.Items.Add(new Item(8810011, (byte)InventoryType.ItemType.Spend3, 0, 10));
            chr.Items.Add(new Item(8820011, (byte)InventoryType.ItemType.Spend3, 1, 10));
            chr.Storages.Add(new Storage(0));
            chr.Skills.Add(new Skill(1, 1, 0, 0));
            chr.Skills.Add(new Skill(2, 1, 0, 1));
            chr.Skills.Add(new Skill(3, 1, 0, 2));
            chr.Skills.Add(new Skill(4, 1, 0, 3));
            chr.Keymap.Add("Z", new Shortcut(1, 0, 0));
            chr.Keymap.Add("X", new Shortcut(4, 0, 3));
            chr.Keymap.Add("C", new Shortcut(3, 0, 2));
            chr.UseSlot.Add((byte)InventoryType.ItemType.Spend3, 0xFF);
            chr.UseSlot.Add((byte)InventoryType.ItemType.Pet5, 0xFF);

            Log.Debug("[Create_MyChar_Req] total char = '{0}'", gc.Account.Characters.Count);

            if ((gc.Account.Characters.Count + 1) <= 4)
            {
                Log.Debug("[Create_MyChar_Req] trying to save '{0}' to DB", name);

                chr.Save();
                gc.Account.Characters.Insert(pos - 1, chr);
                pos = (chr.Position << 8) + 1;

                Log.Debug("[Create_MyChar_Req] save status is: '{0}'", pos);
            }
            else if (Database.Exists("Characters", "name = '{0}'", name))
            {
                Log.Debug("[Create_MyChar_Req] user exist: '{0}'", name);
                pos = -1;
            }
            else if ((gc.Account.Characters.Count + 1) > 4)
            {
                Log.Debug("[Create_MyChar_Req] user maxed: {0} - total 4/4: '{0}'", name);
                pos = -2;
            }
            else
            {
                Log.Debug("[Create_MyChar_Req] unknown error during save: '{0}'", name);
                pos = 0;
            }

            Log.Debug("Send Create_MyChar_Ack: '{0}'", name);
            CharPacket.Create_MyChar_Ack(gc, pos);
        }
Пример #31
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;
        }
Пример #32
0
 protected abstract void Dispatch(InPacket inPacket);
Пример #33
0
        public void Push(InPacket packet)
        {
            #region Playable unit events
            if (packet is ReceiveDestination)
            {
                ReceiveDestination pos = packet as ReceiveDestination;

                if (presentedUnits.Contains(pos.Name))
                {
                    events.Enqueue(PacketConverter.ReceiveDestination(pos, ReceiveDestinationForm.MOVE));
                }
                else
                {
                    presentedUnits.Add(pos.Name);
                    events.Enqueue(PacketConverter.ReceiveDestination(pos, ReceiveDestinationForm.SPAWN));
                }
            }
            else if (packet is LeaveMessage)
            {
                LeaveMessage lev = packet as LeaveMessage;

                presentedUnits.Remove(lev.Name);
                events.Enqueue(lev.ToString());
            }
            #endregion
            #region Fauna events
            else if (packet is UpdateMonster)
            {
                UpdateMonster monster = packet as UpdateMonster;

                if (presentedFauna.Contains(monster.Id))
                {
                    events.Enqueue(PacketConverter.UpdateMonster(monster, UpdateMonsterForm.MOVE));
                }
                else
                {
                    presentedFauna.Add(monster.Id);
                    events.Enqueue(PacketConverter.UpdateMonster(monster, UpdateMonsterForm.SPAWN));
                }
            }
            #endregion
            #region Flora events
            else if (packet is UpdateHerb)
            {
                UpdateHerb herb = packet as UpdateHerb;

                if (presentedFauna.Contains(herb.Id))
                {
                    if (herb.State == 0)
                    {
                        events.Enqueue(PacketConverter.UpdateHerb(herb, UpdateHerbForm.REMOVE));
                    }
                    else
                    {
                        events.Enqueue(PacketConverter.UpdateHerb(herb, UpdateHerbForm.GROWTH));
                    }
                }
                else
                {
                    presentedFlora.Add(herb.Id);
                    events.Enqueue(PacketConverter.UpdateHerb(herb, UpdateHerbForm.SPAWN));
                }
            }
            #endregion
        }