Exemplo n.º 1
0
 public static void Handle(byte[] Data, SocketClient Client)
 {
     Client.Crypto.Decrypt(ref Data);
     if (Data.Length < 4)
     {
         Client.Disconnect();
         return;
     }
     ushort PacketID = BitConverter.ToUInt16(Data, 2);
     Packet handler;
     if (packetHandlers.TryGetValue(PacketID, out handler))
     {
         if (Data.Length >= handler.MinLength)
             handler.Handle(Data, Client);
         else
             Client.Disconnect();
     }
     else
         Console.WriteLine("Missing PacketID: {0}", PacketID);
 }
Exemplo n.º 2
0
 public void Handle(byte[] Data, SocketClient Client)
 {
     byte Type = Data[22];
     switch(Type)
     {
         case 74:
             {
                 Calculations.CalculateMaxHP(Client.Character);
                 Calculations.CalculateMaxMana(Client.Character);
                 Client.Send(Packets.ToSend.GeneralData(Client.UniqueID, Client.Character.MapID, Client.Character.X, Client.Character.Y, 0, Enums.GeneralData.SetLocation));
                 Client.Send(Packets.ToSend.GeneralData(Client.UniqueID, Client.Character.MapID, Client.Character.X, Client.Character.Y, 0, Enums.GeneralData.ChgMap));
                 Client.Send(Packets.ToSend.MapInfo(Client.Character.MapID, (uint)(Client.Character.MapID == 1036 ? 30 : 2080)));
                 Client.Character.Map.Insert(Client);
                 break;
             }
         case 79:
             {
                 Client.Character.Facing = (Enums.ConquerAngle)Data[20];
                 break;
             }
         case 133:
             {
                 ushort new_X = BitConverter.ToUInt16(Data, 12);
                 ushort new_Y = BitConverter.ToUInt16(Data, 14);
                 double jumpDistance = Calculations.GetDistance(Client.Character.X, Client.Character.Y, new_X, new_Y);
                 if (jumpDistance <= Constants.ScreenDistance)
                 {
                     Client.Character.X = new_X;
                     Client.Character.Y = new_Y;
                     Client.Character.Screen.Send(Data, true);
                     Client.Character.Map.PopulateScreen(Client);
                 }
                 else
                     Client.Disconnect();
                 break;
             }
         case 142:
             {
                 if (Client.Character.Silver >= 500)
                 {
                     Client.Character.Silver -= 500;
                     Client.Character.Avatar = BitConverter.ToUInt16(Data, 12);
                 }
                 else
                     Client.Send(Packets.ToSend.MessagePacket("You don't have 500 silvers.", "SYSTEM", Client.Character.Name, Enums.ChatType.Top));
                 break;
             }
         default: Console.WriteLine("Missing General Data PacketID: {0}", Type); break;
     }
 }
Exemplo n.º 3
0
        public void Handle(byte[] Data, SocketClient Client)
        {
            string CharName = System.Text.ASCIIEncoding.ASCII.GetString(Data, 20, 16).Replace("\0", "");
            ushort Model = BitConverter.ToUInt16(Data, 52);
            ushort Class = BitConverter.ToUInt16(Data, 54);
            uint AccountID = BitConverter.ToUInt32(Data, 56);

            if (Model != 1003 && Model != 1004 && Model != 2001 && Model != 2002)
            {
                Client.Disconnect();
                return;
            }
            if (Class != 10 && Class != 100 && Class != 20 && Class != 40)
            {
                Client.Disconnect();
                return;
            }
            if (Database.Methods.ValidString(CharName))
            {
                if (!Database.Methods.NameExists(CharName))
                {
                    if (!Database.Methods.HasCharacter(Client.UniqueID))
                    {
                        Database.Methods.CreateCharacter(Client.UniqueID, CharName, Class, Model);
                        Client.Send(Packets.ToSend.MessagePacket("ANSWER_OK", "SYSTEM", "ALLUSERS", Enums.ChatType.Dialog));
                        Client.Disconnect();
                    }
                    else
                        Client.Send(Packets.ToSend.MessagePacket("You already have a character created.", "SYSTEM", "ALLUSERS", Enums.ChatType.Dialog));
                }
                else
                    Client.Send(Packets.ToSend.MessagePacket("Character name has been taken! Please choose a new one!", "SYSTEM", "ALLUSERS", Enums.ChatType.Dialog));
            }
            else
                Client.Send(Packets.ToSend.MessagePacket("Invalid character name!", "SYSTEM", "ALLUSERS", Enums.ChatType.Dialog));
        }
Exemplo n.º 4
0
 public void Handle(byte[] Data, SocketClient Client)
 {
     Client.UniqueID = BitConverter.ToUInt32(Data, 4);
     if (Database.Methods.Authenticated(Client.UniqueID))
     {
         Client.Crypto.SetKeys(255, Client.UniqueID);
         if (Database.Methods.LoadCharacter(Client))
         {
             Client.Connected = true;
             Database.Methods.LoadItems(Client);
             Database.Methods.LoadProfs(Client);
             Client.Send(Packets.ToSend.MessagePacket("ANSWER_OK", "SYSTEM", "ALLUSERS", Enums.ChatType.LoginInformation));
             Client.Send(Packets.ToSend.CharacterInfo(Client));
         }
         else
             Client.Send(Packets.ToSend.MessagePacket("NEW_ROLE", "SYSTEM", "ALLUSERS", Enums.ChatType.LoginInformation));
     }
     else
     {
         Client.Send(Packets.ToSend.MessagePacket("Nice try buddy <3", "SYSTEM", "ALLUSERS", Enums.ChatType.LoginInformation));
         Client.Disconnect();
     }
 }
Exemplo n.º 5
0
 public void Handle(byte[] Data, SocketClient Client)
 {
     Enums.ChatType ChatType = (Enums.ChatType)BitConverter.ToUInt32(Data, 8);
     string From = Encoding.ASCII.GetString(Data, 26, Data[25]);
     if (From != Client.Character.Name)
         return;
     string To = Encoding.ASCII.GetString(Data, 27 + From.Length, Data[26 + From.Length]);
     string Message = Encoding.ASCII.GetString(Data, 29 + From.Length + To.Length, Data[28 + From.Length + To.Length]);
     if (Message.StartsWith(Constants.CommandOperator))
     {
         Message = Message.Replace(Constants.CommandOperator, "");
         string[] msgData = Message.Split(' ');
         switch (msgData[0])
         {
             case "life": Client.Character.HitPoints = Client.Character.MaxHitPoints; break;
             case "dc": Client.Disconnect(); break;
             case "money":
             case "silver":
                 {
                     if (msgData.Length < 2)
                         return;
                     uint Silver;
                     if (!uint.TryParse(msgData[1], out Silver))
                         return;
                     Client.Character.Silver = Silver;
                     break;
                 }
             case "learnspell":
                 {
                     if (msgData.Length < 3)
                         return;
                     ushort SkillID;
                     if (!ushort.TryParse(msgData[1], out SkillID))
                         return;
                     byte Level;
                     if (!byte.TryParse(msgData[2], out Level))
                         return;
                     Client.Character.LearnSkill(SkillID, Level, 0);
                     break;
                 }
             case "forgetspell":
                 {
                     if (msgData.Length < 2)
                         return;
                     ushort SkillID;
                     if (!ushort.TryParse(msgData[1], out SkillID))
                         return;
                     Client.Character.ForgetSkill(SkillID);
                     break;
                 }
             case "item":
                 {
                     if (msgData.Length > 2)
                     {
                         uint ItemID;
                         if (!uint.TryParse(msgData[1], out ItemID))
                         {
                             if (msgData.Length == 8)
                             {
                                 Enums.ItemQuality quality;
                                 switch (msgData[2].ToLower())
                                 {
                                     case "super": quality = Enums.ItemQuality.Super; break;
                                     case "elite": quality = Enums.ItemQuality.Elite; break;
                                     case "unique": quality = Enums.ItemQuality.Unique; break;
                                     case "refined": quality = Enums.ItemQuality.Refined; break;
                                     case "normal": quality = Enums.ItemQuality.Normal; break;
                                     default: return;
                                 }
                                 byte Plus;
                                 if (!byte.TryParse(msgData[3], out Plus))
                                     return;
                                 byte Bless;
                                 if (!byte.TryParse(msgData[4], out Bless))
                                     return;
                                 byte Enchant;
                                 if (!byte.TryParse(msgData[5], out Enchant))
                                     return;
                                 byte Gem1;
                                 if (!byte.TryParse(msgData[6], out Gem1))
                                     return;
                                 byte Gem2;
                                 if (!byte.TryParse(msgData[7], out Gem2))
                                     return;
                                 foreach (Items.ItemType ItemInfo in Kernel.ItemTypes.Values)
                                 {
                                     if (ItemInfo.Name == msgData[1])
                                     {
                                         Items.Item Itm = new Items.Item(ItemInfo);
                                         Itm.OwnerUID = Client.UniqueID;
                                         Itm.Bless = Bless;
                                         Itm.Enchant = Enchant;
                                         Itm.QualityChange(quality);
                                         Itm.Durability = ItemInfo.MaxDurability;
                                         Itm.Mode = 1;
                                         Itm.Plus = Plus;
                                         if (ItemInfo.ID >= 730001 && ItemInfo.ID <= 730009)
                                             Itm.Plus = (byte)(ItemInfo.ID - 730000);
                                         Itm.Position = (byte)Enums.ItemPosition.Inventory;
                                         Itm.Loaded = true;
                                         Itm.Save();
                                         Client.Character.Inventory.TryAdd(Itm);
                                         return;
                                     }
                                 }
                             }
                         }
                     }
                     break;
                 }
             default: break;
         }
     }
     else
     {
         uint Color = BitConverter.ToUInt32(Data, 4);
         switch(ChatType)
         {
             case Enums.ChatType.Talk:
                 {
                     Client.Character.Screen.Send(Packets.ToSend.MessagePacket(Message, From, To, Client.Character.Dead ? Enums.ChatType.Ghost : Enums.ChatType.Talk), false);
                     break;
                 }
             default: break;
         }
     }
 }