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); }
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; } }
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)); }
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(); } }
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; } } }