public static void On_SMSG_CHAR_ENUM(ref Packets.PacketClass Packet) { Console.WriteLine("[{0}][World] Received Character List.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss")); var NumChars = Packet.GetInt8(); if (NumChars > 0) { for (byte i = 1, loopTo = NumChars; i <= loopTo; i++) { var GUID = Packet.GetUInt64(); var Name = Packet.GetString(); var Race = Packet.GetInt8(); var Classe = Packet.GetInt8(); var Gender = Packet.GetInt8(); var Skin = Packet.GetInt8(); var Face = Packet.GetInt8(); var HairStyle = Packet.GetInt8(); var HairColor = Packet.GetInt8(); var FacialHair = Packet.GetInt8(); var Level = Packet.GetInt8(); var Zone = Packet.GetInt32(); var Map = Packet.GetInt32(); var PosX = Packet.GetFloat(); var PosY = Packet.GetFloat(); var PosZ = Packet.GetFloat(); var GuildID = Packet.GetUInt32(); var PlayerState = Packet.GetUInt32(); var RestState = Packet.GetInt8(); var PetInfoID = Packet.GetUInt32(); var PetLevel = Packet.GetUInt32(); var PetFamilyID = Packet.GetUInt32(); Console.WriteLine("[{0}][World] Logging in with character [{1}].", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss"), Name); Worldserver.CharacterGUID = GUID; Packets.PacketClass Response = new(OPCODES.CMSG_PLAYER_LOGIN); Response.AddUInt64(GUID); Worldserver.Send(Response); Response.Dispose(); break; // Skip the equipment Packet.Offset += 20 * 9; } } else { Console.WriteLine("[{0}][World] No characters found.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss")); } }
public static void On_SMSG_AUTH_CHALLENGE(ref Packets.PacketClass Packet) { Console.WriteLine("[{0}][World] Received Auth Challenge.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss")); WS_WardenClient.InitWarden(); Worldserver.ServerSeed = Packet.GetUInt32(); var temp = Encoding.ASCII.GetBytes(Realmserver.Account.ToCharArray()); temp = Realmserver.Concat(temp, BitConverter.GetBytes(0)); temp = Realmserver.Concat(temp, BitConverter.GetBytes(Worldserver.ClientSeed)); temp = Realmserver.Concat(temp, BitConverter.GetBytes(Worldserver.ServerSeed)); temp = Realmserver.Concat(temp, Realmserver.SS_Hash); SHA1Managed algorithm1 = new(); var ShaDigest = algorithm1.ComputeHash(temp); Worldserver.Decoding = true; VBMath.Randomize(); Worldserver.ClientSeed = (uint)(uint.MaxValue * VBMath.Rnd()); Packets.PacketClass Response = new(OPCODES.CMSG_AUTH_SESSION); Response.AddInt32(Realmserver.Revision); Response.AddInt32(0); // SessionID? Response.AddString(Realmserver.Account.ToUpper()); Response.AddUInt32(Worldserver.ClientSeed); Response.AddByteArray(ShaDigest); Response.AddInt32(0); // Addon size Worldserver.Send(Response); Response.Dispose(); Worldserver.Encoding = true; }
public static void On_SMSG_PONG(ref Packets.PacketClass Packet) { var SequenceID = Packet.GetUInt32(); var Latency = Worldserver.timeGetTime() - Worldserver.PingSent; if (SequenceID == Worldserver.CurrentPing && Latency >= 0) { Worldserver.CurrentLatency = Latency; } }
public void On_CMSG_WORLD_TELEPORT(ref Packets.PacketClass packet, ref WS_Network.ClientClass client) { WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_WORLD_TELEPORT", client.IP, client.Port); if (client.Access >= AccessLevel.GameMaster) { packet.GetInt16(); int Time = packet.GetInt32(); uint Map = packet.GetUInt32(); float X = packet.GetFloat(); float Y = packet.GetFloat(); float Z = packet.GetFloat(); float O = packet.GetFloat(); client.Character.Teleport(X, Y, Z, O, checked ((int)Map)); } }
public void MaievResult(ref WS_PlayerData.CharacterObject objCharacter, ref Packets.PacketClass Packet) { ushort bufLen = Packet.GetUInt16(); uint checkSum = Packet.GetUInt32(); int tmpOffset = Packet.Offset; byte[] data = Packet.GetByteArray(); Packet.Offset = tmpOffset; if (!ControlChecksum(checkSum, data)) { WorldServiceLocator._WorldServer.Log.WriteLine(LogType.CRITICAL, "[WARDEN] Failed checkSum at result packet. Cheater?"); objCharacter.CommandResponse("[WARDEN] Pack your bags cheater, you're going!"); return; } WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[WARDEN] Result bufLen:{0} checkSum:{1:X}", bufLen, checkSum); objCharacter.WardenData.Scan.HandleResponse(ref Packet); }
public void On_CMSG_SET_TRADE_GOLD(ref Packets.PacketClass packet, ref WS_Network.ClientClass client) { packet.GetInt16(); var gold = packet.GetUInt32(); WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_SET_TRADE_GOLD [gold={2}]", client.IP, client.Port, gold); if (client.Character.tradeInfo != null) { if (client.Character.tradeInfo.Trader == client.Character) { client.Character.tradeInfo.TraderGold = gold; client.Character.tradeInfo.SendTradeUpdateToTarget(); } else { client.Character.tradeInfo.TargetGold = gold; client.Character.tradeInfo.SendTradeUpdateToTrader(); } } }
public static void On_SMSG_WARDEN_DATA(ref Packets.PacketClass Packet) { // START Warden Decryption var b = new byte[(Packet.Data.Length - 4)]; Buffer.BlockCopy(Packet.Data, 4, b, 0, b.Length); RC4.Crypt(ref b, Maiev.KeyIn); Buffer.BlockCopy(b, 0, Packet.Data, 4, b.Length); // END var WardenData = new byte[(Packet.Data.Length - 4)]; Buffer.BlockCopy(Packet.Data, 4, WardenData, 0, WardenData.Length); MaievOpcode Opcode = (MaievOpcode)Packet.GetInt8(); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("SMSG_WARDEN_DATA [{0}]", Opcode); Console.ForegroundColor = ConsoleColor.White; switch (Opcode) { case MaievOpcode.MAIEV_MODULE_INFORMATION: { var Name = Packet.GetByteArray(16); var Key = Packet.GetByteArray(16); var Size = Packet.GetUInt32(); Maiev.ModuleName = BitConverter.ToString(Name).Replace("-", ""); Maiev.ModuleKey = Key; ModuleLength = (int)Size; Maiev.ModuleData = Array.Empty <byte>(); if (File.Exists(@"modules\" + Maiev.ModuleName + ".mod") == false) { Console.WriteLine("[{0}][WARDEN] Module is missing.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss")); Packets.PacketClass response = new(OPCODES.CMSG_WARDEN_DATA); response.AddInt8((byte)MaievResponse.MAIEV_RESPONSE_FAILED_OR_MISSING); SendWardenPacket(ref response); response.Dispose(); } else { Console.WriteLine("[{0}][WARDEN] Module is initiated.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss")); Maiev.ModuleData = File.ReadAllBytes(@"modules\" + Maiev.ModuleName + ".mod"); if (Maiev.LoadModule(Maiev.ModuleName, ref Maiev.ModuleData, Maiev.ModuleKey)) { Console.WriteLine("[{0}][WARDEN] Successfully loaded the module.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss")); Packets.PacketClass response = new(OPCODES.CMSG_WARDEN_DATA); response.AddInt8((byte)MaievResponse.MAIEV_RESPONSE_SUCCESS); SendWardenPacket(ref response); response.Dispose(); } else { Packets.PacketClass response = new(OPCODES.CMSG_WARDEN_DATA); response.AddInt8((byte)MaievResponse.MAIEV_RESPONSE_FAILED_OR_MISSING); SendWardenPacket(ref response); response.Dispose(); } } break; } case MaievOpcode.MAIEV_MODULE_TRANSFER: { var Size = Packet.GetUInt16(); var Data = Packet.GetByteArray(Size); Maiev.ModuleData = Realmserver.Concat(Maiev.ModuleData, Data); ModuleLength -= Size; if (ModuleLength <= 0) { Console.WriteLine("[{0}][WARDEN] Module is fully transfered.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss")); if (Directory.Exists("modules") == false) { Directory.CreateDirectory("modules"); } File.WriteAllBytes(@"modules\" + Maiev.ModuleName + ".mod", Maiev.ModuleData); if (Maiev.LoadModule(Maiev.ModuleName, ref Maiev.ModuleData, Maiev.ModuleKey)) { Console.WriteLine("[{0}][WARDEN] Successfully loaded the module.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss")); Packets.PacketClass response = new(OPCODES.CMSG_WARDEN_DATA); response.AddInt8((byte)MaievResponse.MAIEV_RESPONSE_SUCCESS); SendWardenPacket(ref response); response.Dispose(); } } else { Console.WriteLine("[{0}][WARDEN] Module transfer. Bytes left: {1}", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss"), ModuleLength); } break; } case MaievOpcode.MAIEV_MODULE_RUN: { Console.WriteLine("[{0}][WARDEN] Requesting a scan.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss")); // TODO: Encrypt? Maiev.ReadKeys2(); RC4.Crypt(ref WardenData, Maiev.ModKeyIn); var HandledBytes = Maiev.HandlePacket(WardenData); if (HandledBytes <= 0) { return; } var thePacket = Maiev.ReadPacket(); if (thePacket.Length == 0) { return; } RC4.Crypt(ref WardenData, Maiev.ModKeyOut); // TODO: Decrypt? Packets.DumpPacket(thePacket); Packets.PacketClass response = new(OPCODES.CMSG_WARDEN_DATA); response.AddByteArray(thePacket); SendWardenPacket(ref response); response.Dispose(); break; } case MaievOpcode.MAIEV_MODULE_UNK: { // TODO: Encrypt? Maiev.ReadKeys2(); RC4.Crypt(ref WardenData, Maiev.ModKeyIn); var HandledBytes = Maiev.HandlePacket(WardenData); if (HandledBytes <= 0) { return; } var thePacket = Maiev.ReadPacket(); if (thePacket.Length == 0) { return; } RC4.Crypt(ref WardenData, Maiev.ModKeyOut); // TODO: Decrypt? Packets.DumpPacket(thePacket); Packets.PacketClass response = new(OPCODES.CMSG_WARDEN_DATA); response.AddByteArray(thePacket); SendWardenPacket(ref response); response.Dispose(); break; } case MaievOpcode.MAIEV_MODULE_SEED: { Maiev.GenerateNewRC4Keys(Realmserver.SS_Hash); var HandledBytes = Maiev.HandlePacket(WardenData); if (HandledBytes <= 0) { return; } var thePacket = Maiev.ReadPacket(); Maiev.ModKeyIn = new byte[258]; Maiev.ModKeyOut = new byte[258]; Packets.PacketClass response = new(OPCODES.CMSG_WARDEN_DATA); response.AddByteArray(thePacket); SendWardenPacket(ref response); response.Dispose(); Maiev.ReadKeys(); break; } default: { Console.WriteLine("[{0}][WARDEN] Unhandled Opcode [{1}] 0x{2:X}", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss"), Opcode, Conversions.ToInteger(Opcode)); break; } } }
public void On_MSG_BATTLEGROUND_PLAYER_POSITIONS(ref Packets.PacketClass packet, ref WS_Network.ClientClass client) { packet.GetUInt32(); }