public static void SubPasswordChangeQARequest(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { packet.Skip(4); var pass = packet.ReadString(10).Trim('\0'); var syncServer = client.Metadata["syncServer"] as SyncReceiver; var checksub = SubpassManagement.CheckSubPw(syncServer, client.AccountID, pass); var tries = 0; builder.New(0x414); { if (checksub) { client.Metadata["subTries"] = 0; builder += 1; // success builder += (byte)0x00; // failed times } else { client.Metadata["subTries"] = (int)client.Metadata["subTries"] + 1; tries = (int)client.Metadata["subTries"]; builder += 0; // failed builder += (byte)tries; // failed times } builder += 1; } client.Send(builder, "SubPasswordChangeQARequest"); if ((int)client.Metadata["subTries"] > 3) { client.Disconnect(); } }
public static void MessageEvent(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { Character character = client.Metadata["fullchar"] as Character; var name = character.name; var x = (ushort)character.x; var y = (ushort)character.y; var id = character.id; var map = client.Metadata["map"] as IMap; var clients = map.GetSurroundingClients(client, 1); int unk = packet.ReadInt(); packet.Skip(4); int size = packet.ReadShort() - 3; packet.Skip(2); var type = packet.ReadByte(); var msg = packet.ReadString(size); var smsg = msg.Split(' '); if (msg == "/quit") { client.Disconnect(); return; } #region DebugCommands #if DEBUG if (smsg.Length > 1 && string.IsNullOrEmpty(smsg[0]) == false) { switch (smsg[0]) { case "_drop": int itemid = 0; if (int.TryParse(smsg[1], out itemid)) { map.DropItem(x, y, itemid, (uint)id, (uint)id); } break; case "_warp": ushort mapid = 0; ushort curx = 0; ushort cury = 0; if (!ushort.TryParse(smsg[1], out mapid)) { return; } if (!ushort.TryParse(smsg[2], out curx)) { return; } if (!ushort.TryParse(smsg[3], out cury)) { return; } var p = client.CreatePacket("PC_WarpCommand", mapid, curx, cury, client); events.Warped("world.Initialized", client, mapid, curx, cury); client.Send(p, "PC_WarpCommand"); break; case "_levelup": ushort level = 0; if (!ushort.TryParse(smsg[1], out level)) { return; } builder.New(0x03F0); { builder += (byte)2; builder += (uint)1371; builder += (uint)1367; } client.Send(builder, "LevelUp"); break; case "_spawn": ushort mobid = 0; ushort specid = 0; if (!ushort.TryParse(smsg[1], out mobid)) { return; } if (!ushort.TryParse(smsg[2], out specid)) { return; } var p1 = client.CreatePacket("MobSpawned", mobid, specid); client.Send(p1, "MobSpawned"); break; case "/Partytime": uint pid = 1337; foreach (var c in clients) { builder.New(0xC9); { builder += (int)pid; builder += (byte)12; //b = builder.Data; } var timestamp = (uint)c.Metadata["timestamp"]; var style = (uint)c.Metadata["style"]; c.Send(builder, "NFY_DelUserList"); builder.New(0xC8); { builder += (short)0x3101; builder += (int)pid++; builder += (short)0x000D; builder += (short)0x0100; builder += 1; builder += Environment.TickCount - (int)timestamp; builder += (short)(x + 1); builder += (short)y; builder += (short)(x + 1); builder += (short)y; builder += (byte)0; builder += 0; builder += (short)0; builder += (int)style; builder += (byte)1; builder += (byte)0; builder += 0; builder += 0; builder += (byte)0; var equipment = (List <CItem>)c.Metadata["equipment"]; builder += (byte)(equipment.Count); builder += (short)0; builder += (byte)0; builder += 0; name = "PARTY TIME!!"; builder += (byte)(name.Length + 1); builder += name; builder += (byte)0; foreach (var e in equipment) { builder += (short)e.ID; builder += e.Slot; } } c.Send(builder, "NFY_NewUserList"); } return; } } #endif #endregion builder.New(0xD9); { builder += id; builder += (byte)0; builder += (byte)unk; builder += (byte)0; builder += (byte)(msg.Length + 3); builder += (byte)0; builder += (byte)254; builder += (byte)254; builder += type; builder += msg; builder += new byte[3]; } foreach (var c in clients) { c.Send(builder, "NFY_MessageEvnt"); } events.SaidLocal("world.MessageEvnt", id, name, msg); }
/* * Unknown_7D6 Packet * ------------------------- * Client2Server Structure: * * ushort : magic code * ushort : size * int : padding * ushort : opcode * * int : unk1 * byte[] : encrypted data #array size depends on RSA keylength, see PublicKey packet * ------------------------- * Server2Client Structure: * * ushort : magic code * ushort : size * ushort : opcode * * int : unk1 #is set to 1 upon successful login; otherwise 0 * int : unk2 * byte : unk3 * int : status #account status * ------------------------- * If login was successful, server sends another Unknown_7D6 packet: * Server2Client Structure: * * ushort : magic code * ushort : size * ushort : opcode * * int : unk1 #is set to 1 upon successful login; otherwise 0 * int : unk2 * byte : unk3 * int : status #account status * int : unk4 * byte : unk5 * int : unk6 * long : unk7 * byte : unk8 * int : unk9 * byte : unk10 * int : unk11 * int : unk12 * int : unk13 * char[32] : auth key #possibly used for cash shop * short : unk14 * byte : server count * * foreach server * byte : server id * byte : character count * * byte[] : unk15 #array length is 248 */ #endregion public static void Unknown_7D6(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { packet.Skip(4); var rsa = client.Metadata["rsa"] as RSA; if (rsa == null) { Log.Error("Unable to decrypt RSA data!"); client.Disconnect(); client = null; return; } byte[] encrypted = packet.ReadBytes(rsa.KeyLength / 8); // keylength is in bits byte[] details = rsa.Decrypt(encrypted); byte[] tmpdata = new byte[16]; if (details == null) { Log.Error("Unable to decrypt RSA data!"); client.Disconnect(); client = null; return; } Array.Copy(details, tmpdata, 16); string name = Encoding.UTF8.GetString(tmpdata).Trim('\0'); Array.Copy(details, 65, tmpdata, 0, 16); string pass = Encoding.UTF8.GetString(tmpdata).Trim('\0'); Log.Notice("Login authentication: " + name); string ip = client.RemoteEndPoint.ToString().Split(':')[0]; var syncServer = client.Metadata["syncServer"] as SyncReceiver; var data = Authentication.FetchAccount(syncServer, name, pass); bool kick = false; if (data == null || data.id == -1) { builder.New(0x7D6); { builder += 0; builder += 0; builder += (byte)0; builder += (int)AccountStatus.OutOfService; } events.FailedLogin("login.AuthAccount", new LoginEventArgs(name, pass, ip, LoginResult.OutOfService)); client.Send(builder, "Unknown_7D6"); return; } builder.New(0x7D6); { switch (data.status) { case AuthStatus.Unverified: builder += 0; builder += 0; builder += (byte)0; builder += (int)AccountStatus.Unverified; break; case AuthStatus.Banned: builder += 0; builder += 0; builder += (byte)0; builder += (int)AccountStatus.Banned; break; case AuthStatus.IncorrectName: case AuthStatus.IncorrectPass: builder += 0; builder += 0; builder += (byte)0; builder += (int)AccountStatus.Incorrect; var tmp = data.status == AuthStatus.IncorrectName ? LoginResult.UnknownUsername : LoginResult.WrongPassword; events.FailedLogin("login.AuthAccount", new LoginEventArgs(name, pass, ip, tmp)); break; case AuthStatus.Verified: client.AccountID = data.id; Authentication.UpdateIPDate(syncServer, client.AccountID, ip, DateTime.Now); Authentication.UpdateOnline(syncServer, client.AccountID, true); builder += 1; builder += 0; builder += (byte)0; builder += (int)AccountStatus.Normal; events.SuccessfulLogin("login.AuthAccount", new LoginEventArgs(name, pass, ip, LoginResult.Success, client.AccountID)); break; default: kick = true; break; } } client.Send(builder, "Unknown_7D6"); if (kick) { client.Disconnect(); } if (data.id > 0 && data.status == AuthStatus.Verified) { builder.New(0x7D6); { builder += 1; builder += 0x0900; builder += (byte)0; builder += (int)AccountStatus.Normal; builder += 0x4B6359; builder += (byte)1; builder += 0x67; builder += (long)0; builder += (byte)0; builder += 0x43A56B60; builder += (byte)0; builder += 1; builder += 0; builder += 0; builder += "0A47130EA1D04A4D99D58F094B7E88C3"; // AuthKey builder += (short)0; builder += (byte)1; // Char Num of all servers builder += (byte)1; // Server ID builder += (byte)1; // CharNum } client.Send(builder, "Unknown_7D6"); URLToClient(packet, builder, client, events); SystemMessg(packet, builder, client, events); SendChannels.SendChannelList(client); var timer = new System.Timers.Timer(5000); timer.AutoReset = true; timer.Elapsed += (sender, e) => { SendChannels.SendChannelList(client); }; timer.Start(); client.Metadata["timer"] = timer; } }
public static void Unknown_7D6(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { packet.Skip(4); var details = RSA.Decrypt(packet.ReadBytes(256)); var tmpdata = new byte[16]; Array.Copy(details, tmpdata, 16); var name = Encoding.UTF8.GetString(tmpdata).Trim('\0'); Array.Copy(details, 65, tmpdata, 0, 16); var pass = Encoding.UTF8.GetString(tmpdata).Trim('\0'); Log.Notice("Login authentication with name: " + name); var ip = client.RemoteEndPoint.ToString().Split(':')[0]; var syncServer = client.Metadata["syncServer"] as SyncReceiver; var data = Authentication.FetchAccount(syncServer, name, pass); var kick = false; if (data == null || data.id == -1) { builder.New(0x7D6); { builder += 0; builder += 0; builder += (byte)0; builder += (int)AccountStatus.OutOfService; } events.FailedLogin("login.AuthAccount", new LoginEventArgs(name, pass, ip, LoginResult.OutOfService)); client.Send(builder, "Unknown_7D6"); return; } builder.New(0x7D6); { switch (data.status) { case AuthStatus.Unverified: builder += 0; builder += 0; builder += (byte)0; builder += (int)AccountStatus.Unverified; break; case AuthStatus.Banned: builder += 0; builder += 0; builder += (byte)0; builder += (int)AccountStatus.Banned; break; case AuthStatus.IncorrectName: case AuthStatus.IncorrectPass: builder += 0; builder += 0; builder += (byte)0; builder += (int)AccountStatus.Incorrect; var tmp = data.status == AuthStatus.IncorrectName ? LoginResult.UnknownUsername : LoginResult.WrongPassword; events.FailedLogin("login.AuthAccount", new LoginEventArgs(name, pass, ip, tmp)); break; case AuthStatus.Verified: client.AccountID = data.id; Authentication.UpdateIPDate(syncServer, client.AccountID, ip, DateTime.Now); builder += 1; builder += 0; builder += (byte)0; builder += (int)AccountStatus.Normal; events.SuccessfulLogin("login.AuthAccount", new LoginEventArgs(name, pass, ip, LoginResult.Success, client.AccountID)); break; default: kick = true; break; } } client.Send(builder, "Unknown_7D6"); if (kick) { client.Disconnect(); } if (data.id > 0 && data.status == AuthStatus.Verified) { builder.New(0x7D6); { builder += 1; builder += 0x0700; builder += (byte)0; builder += (int)AccountStatus.Normal; builder += 0x2FD49F; builder += (byte)1; builder += 0x67; builder += (long)0; builder += (byte)0; builder += 0x55746A01; builder += (byte)0; builder += 1; builder += 0; builder += 0x02; builder += "A6318A0A7D294CE2A7019511FEDB7AD7"; // AuthKey builder += (short)0; builder += (byte)1; // Char Num of all servers builder += (byte)1; // Server ID builder += (byte)1; // CharNum } client.Send(builder, "Unknown_7D6"); URLToClient(packet, builder, client, events); SystemMessg(packet, builder, client, events); SendChannels.SendChannelList(client); var timer = new System.Timers.Timer(5000); timer.AutoReset = true; timer.Elapsed += (sender, e) => { SendChannels.SendChannelList(client); }; timer.Start(); client.Metadata["timer"] = timer; } }
public static void MessageEvent(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { //byte[] b; var name = client.Metadata["name"] as string; var x = (ushort)client.Metadata["x"]; var y = (ushort)client.Metadata["y"]; var id = (uint)client.Metadata["id"]; var cid = (uint)client.Metadata["cid"]; var map = client.Metadata["map"] as IMap; int size = packet.ReadByte() - 3; packet.Skip(2); var type = packet.ReadByte(); var msg = packet.ReadString(size); var smsg = msg.Split(' '); if (msg == "/quit") { client.Disconnect(); return; } if (smsg.Length > 1 && smsg[0] == "/drop") { int itemid = 0; if (int.TryParse(smsg[1], out itemid)) { map.DropItem(x, y, itemid, cid, id); } return; } var clients = map.GetSurroundingClients(client, 1); if (smsg.Length > 1 && smsg[0] == "/spawn") { ushort mobid = 0; if (!ushort.TryParse(smsg[1], out mobid)) { return; } var p = client.CreatePacket("MobSpawned", mobid); client.Send(p, "MobSpawned"); return; } if (msg == "/partytime") { uint pid = 1337; foreach (var c in clients) { builder.New(0xC9); { builder += (int)pid; builder += (byte)12; //b = builder.Data; } var timestamp = (uint)c.Metadata["timestamp"]; var style = (uint)c.Metadata["style"]; c.Send(builder, "UnknownPacket_0xC9"); builder.New(0xC8); { builder += (short)0x3101; builder += (int)pid++; builder += (short)0x000D; builder += (short)0x0100; builder += 1; builder += Environment.TickCount - (int)timestamp; builder += (short)(x + 1); builder += (short)y; builder += (short)(x + 1); builder += (short)y; builder += (byte)0; builder += 0; builder += (short)0; builder += (int)style; builder += (byte)1; builder += (byte)0; builder += 0; builder += 0; builder += (byte)0; var equipment = (List <CItem>)c.Metadata["equipment"]; builder += (byte)(equipment.Count); builder += (short)0; builder += (byte)0; builder += 0; name = "PARTY TIME!!"; builder += (byte)(name.Length + 1); builder += name; builder += (byte)0; foreach (var e in equipment) { builder += (short)e.ID; builder += (byte)e.Slot; } //b = builder.Data; } c.Send(builder, "UnknownPacket_0xC8"); } return; } foreach (var c in clients) { builder.New(0xD9); { builder += (int)cid; builder += (byte)(msg.Length + 3); builder += (byte)0xFE; builder += (byte)0xFE; builder += type; builder += msg; //b = builder.Data; } c.Send(builder, "MessageEvnt"); } events.SaidLocal("world.700.MessageEvnt", (int)cid, name, msg); }
public static void ChangeMapCell(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { //byte[] b; packet.Skip(4); var x = packet.ReadShort(); var y = packet.ReadShort(); var map = client.Metadata["map"] as IMap; map.MoveClient(client, x / 16, y / 16); var clients = (client.Metadata["map"] as IMap).GetSurroundingClients(client, 2); if (clients.Count > 1) { builder.New(0xC8); { builder += (short)(clients.Count - 1); foreach (var c in clients) { if (c == client) { continue; } //if (!c.Metadata.ContainsKey("id") || (uint)c.Metadata["cid"] == 0) continue; var id = (uint)c.Metadata["cid"]; var level = (uint)c.Metadata["level"]; var timestamp = (uint)c.Metadata["timestamp"]; var px = (ushort)c.Metadata["x"]; var py = (ushort)c.Metadata["y"]; var dx = (ushort)c.Metadata["dest_x"]; var dy = (ushort)c.Metadata["dest_y"]; var style = (uint)c.Metadata["style"]; builder += (int)id; builder += (short)0x000D; builder += (short)0x0100; builder += (int)level; builder += Environment.TickCount - (int)timestamp; builder += (short)px; builder += (short)py; builder += (short)dx; builder += (short)dy; builder += (byte)0; // PK penalty builder += 0; builder += (short)0; builder += (int)style; builder += (byte)0; // Animation ID builder += 0; builder += 0; builder += (byte)0; builder += (byte)0; // 1 = dead var equipment = (List <CItem>)c.Metadata["equipment"]; builder += (byte)equipment.Count; builder += (short)0; builder += (byte)0; // 1 = has private shop open builder += 0; var name = c.Metadata["name"] as string; builder += (byte)(name.Length + 1); builder += name; builder += (byte)0; foreach (var e in equipment) { builder += (short)e.ID; builder += (byte)e.Slot; } } //b = builder.Data; } client.Send(builder, "UnknownPacket_0xC8"); // nested wooooooo! { var id = (uint)client.Metadata["cid"]; var level = (uint)client.Metadata["level"]; var timestamp = (uint)client.Metadata["timestamp"]; var px = (ushort)client.Metadata["x"]; var py = (ushort)client.Metadata["y"]; var dx = (ushort)client.Metadata["dest_x"]; var dy = (ushort)client.Metadata["dest_y"]; var style = (uint)client.Metadata["style"]; builder.New(0xC8); { builder += (ushort)0x3101; builder += (int)id; builder += (short)0x000D; builder += (short)0x0100; builder += (int)level; builder += Environment.TickCount - (int)timestamp; builder += (short)px; builder += (short)py; builder += (short)dx; builder += (short)dy; builder += (byte)0; // PK penalty builder += 0; builder += (short)0; builder += (int)style; builder += (byte)0; // Animation ID builder += 0; builder += 0; builder += (byte)0; builder += (byte)0; // 1 = dead var equipment = (List <CItem>)client.Metadata["equipment"]; builder += (byte)equipment.Count; builder += (short)0; builder += (byte)0; builder += 0; var name = client.Metadata["name"] as string; builder += (byte)(name.Length + 1); builder += name; builder += (byte)0; foreach (var e in equipment) { builder += e.ID; builder += (byte)e.Slot; } //b = builder.Data; } foreach (var c in clients) { if (c == client) { continue; } //var b2 = b; c.Send(builder, "UnknownPacket_0xC8"); } } } }