public static void VerifyLinks(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { var timestamp = (ulong)packet.ReadInt(); var count = (ulong)packet.ReadShort(); var newChannel = packet.ReadByte(); var oldChannel = packet.ReadByte(); var magickey = packet.ReadInt(); var key = (count << 32) + timestamp; var syncServer = client.Metadata["syncServer"] as SyncReceiver; Authentication.AddUser(syncServer, key, client.AccountID); Authentication.UpdateOnline(syncServer, client.AccountID, true); builder.New(0x8D); { builder += newChannel; // server builder += oldChannel; // channel builder += (byte)0; } client.Send(builder, "VerifyLinks"); }
public static void AddSkillPoints(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { var sync = client.Metadata["syncServer"] as SyncReceiver; var server = (int)client.Metadata["server"]; Character character = client.Metadata["fullchar"] as Character; var skill = packet.ReadUShort(); var slot = packet.ReadByte(); var oldlevel = packet.ReadUShort(); var newlevel = packet.ReadUShort(); if ((newlevel == oldlevel + 1) || (newlevel == oldlevel - 1)) { CharacterManagement.UpdateSkillPoints(sync, server, character.id, skill, newlevel, slot); builder.New(0x0A56); client.Send(builder, "AddSkillPoints"); } else //Punishment for hackers :D { var map = client.Metadata["map"] as IMap; CharacterManagement.UpdatePosition(sync, server, client.AccountID, character.slot, character.map, character.x, character.y); 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); }
public static void DeleteCharacter(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { var charID = packet.ReadInt(); var server = (int)client.Metadata["server"]; var syncServer = client.Metadata["syncServer"] as SyncReceiver; var status = CharacterManagement.DeleteCharacter(syncServer, server, client.AccountID, charID - client.AccountID * 8); builder.New(0x87); { builder += (byte)status; } client.Send(builder, "DelMyChartr"); }
public static void CheckUserPrivacyData(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { packet.Skip(4); var pass = packet.ReadString(32).Trim('\0'); var syncServer = client.Metadata["syncServer"] as SyncReceiver; bool auth = Authentication.VerifyPassword(syncServer, client.AccountID, pass); builder.New(0x320); { builder += (auth) ? (byte)1 : (byte)0; } client.Send(builder, "CheckUserPrivacyData"); }
public static void Heartbeat(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { builder.New(0x09FE); client.Send(builder, "Unknown9FE"); }
public static void ArrivedAtLocation(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { //byte[] b; var x = packet.ReadShort(); var y = packet.ReadShort(); var id = (uint)client.Metadata["cid"]; builder.New(0xD3); { builder += (int)id; builder += x; builder += y; client.Metadata["x"] = (ushort)x; client.Metadata["y"] = (ushort)y; client.Metadata["dest_x"] = (ushort)x; client.Metadata["dest_y"] = (ushort)y; //b = builder.Data; } //var clients = client.Metadata["clients"] as Dictionary<ulong, ClientHandler>; var clients = (client.Metadata["map"] as IMap).GetSurroundingClients(client, 2); foreach (var c in clients) { //var b2 = b; c.Send(builder, "MoveEnded"); } }
public virtual void AuthAccount(ref byte[] message, ClientHandler client, EventHandler events) { var p = new Outgoing.AuthAccount(true); // Check username and password int userLength = message[0x0B]; int passLength = message[0x0A] - userLength; var user = System.Text.Encoding.ASCII.GetString(message, 0x0C, userLength); var pass = System.Text.Encoding.ASCII.GetString(message, 0x0C + userLength, passLength); var ip = client.RemoteEndPoint.ToString().Split(':')[0]; int auth = 0; bool online = false; var database = client.Metadata["database"] as IDatabaseContracts; var dbresult = database.FetchAccount(user); if (dbresult != null) { if (dbresult.Item1 == GenerateHash(pass)) { auth = dbresult.Item2; if (auth == 0) { p.Status = AccountStatus.Unverified; } else if (auth == 2) { p.Status = AccountStatus.Banned; } else { online = dbresult.Item3; if (online) { p.Status = AccountStatus.Online; } else { client.AccountID = dbresult.Item4; p.Status = AccountStatus.Normal; events.SuccessfulLogin(this, new LoginEventArgs(user, pass, ip, LoginResult.Success, client.AccountID)); } } } else { p.Status = AccountStatus.Incorrect; events.FailedLogin(this, new LoginEventArgs(user, pass, ip, LoginResult.WrongPassword)); } } else { p.Status = AccountStatus.Incorrect; events.FailedLogin(this, new LoginEventArgs(user, pass, ip, LoginResult.UnknownUsername)); } var b = p.ToByteArray(); client.Send(ref b, "AuthAccount"); if (auth == 1 && !online) { SendChannelList(client); var timer = new System.Timers.Timer(5000); timer.AutoReset = true; timer.Elapsed += (sender, e) => { SendChannelList(client); }; timer.Start(); client.Metadata["timer"] = timer; } }
/* * 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; } }
/* * SpecialInventoryList Packet * ------------------------- * Server2Client Structure: * * Unknown8BD -> E2 B7 16 00 BD 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * * ushort : magic code * ushort : size * ushort : opcode * * byte[16] : UnknItemData */ public static void SpecialInventoryList(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { builder.New(0x8BD); { builder += (byte)0; builder += (byte)0; builder += (byte)0; builder += (byte)0; builder += (byte)0; builder += (byte)0; builder += (byte)0; builder += (byte)0; builder += (byte)0; builder += (byte)0; builder += (byte)0; builder += (byte)0; builder += (byte)0; builder += (byte)0; builder += (byte)0; builder += (byte)0; } client.Send(builder, "SpecialInventoryList"); }
public static void SubPasswordSet(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { var pass = packet.ReadString(10).Trim('\0'); packet.Skip(5); var question = packet.ReadInt(); var answer = packet.ReadString(16).Trim('\0'); packet.Skip(112); var changeSub = packet.ReadInt(); var syncServer = client.Metadata["syncServer"] as SyncReceiver; if (changeSub == 0) { SubpassManagement.SetSubPass(syncServer, client.AccountID, pass, question, answer); } else { SubpassManagement.SetSubPass(syncServer, client.AccountID, pass, -1, string.Empty); } builder.New(0x406); { builder += 1; builder += 0; builder += 1; builder += 0; } SubpassManagement.SetSubPassTime(syncServer, client.AccountID, 0); client.Send(builder, "SubPasswordSet"); }
public static void AuthAccount(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { //byte[] b; int passLength = packet.ReadByte(); int userLength = packet.ReadByte(); passLength -= userLength; var user = packet.ReadString(userLength); var pass = packet.ReadString(passLength); var ip = client.RemoteEndPoint.ToString().Split(':')[0]; int auth = 0; bool online = false; var database = client.Metadata["database"] as IDatabaseContracts; var dbresult = database.FetchAccount(user); builder.New(0x7d2); { // Check username and password if (dbresult != null) { if (dbresult.Item1 == GenerateHash(pass)) { auth = dbresult.Item2; if (auth == 0) { builder += (byte)AccountStatus.Unverified; } else if (auth == 2) { builder += (byte)AccountStatus.Banned; } else { online = dbresult.Item3; if (online) { builder += (byte)AccountStatus.Online; } else { client.AccountID = dbresult.Item4; builder += (byte)AccountStatus.Normal; events.SuccessfulLogin("login.700.AuthAccount", new LoginEventArgs(user, pass, ip, LoginResult.Success, client.AccountID)); } } } else { builder += (byte)AccountStatus.Incorrect; events.FailedLogin("login.700.AuthAccount", new LoginEventArgs(user, pass, ip, LoginResult.WrongPassword)); } } else { builder += (byte)AccountStatus.Incorrect; events.FailedLogin("login.700.AuthAccount", new LoginEventArgs(user, pass, ip, LoginResult.UnknownUsername)); } builder += 0x0022F756; builder += (short)0x6301; builder += new byte[14]; builder += "000102030405060708090A0B0C0D0E0F"; // Key used when accessing cash shop and guild board. builder += (short)0x0100; builder += new byte[12]; builder += (byte)0; // For each server, append byte server_id and byte character_count //b = builder.Data; } client.Send(builder, "AuthAccount"); if (auth == 1 && !online) { //var cash = "http://shop.cabalonline.com/login.aspx?v1="; //var cashdead = "http://shop.cabalonline.com/login.aspx?isdead=1&v1="; //var guild = "http://nguild.cabalonline.com/CabalGuild/SecureLogin.aspx?EncVal="; //builder.New(0x80); // Cash shop and guild board URL's. //{ // builder += (short)0xB4; // builder += (short)0xB2; // builder += cash.Length; // builder += cash; // builder += cashdead.Length; // builder += cashdead; // builder += 0; // builder += guild.Length; // builder += guild; // builder += 0; // //b = builder.Data; //} //client.Send(builder, "CashGuildURLs"); //builder.New(0x78); // Unknown packet //{ // builder += (byte)9; // builder += (short)0; // //b = builder.Data; //} //client.Send(builder, "UnknownPacket_0x78"); //builder.New(0x7D2); // Unknown packet //{ // builder += (short)0x7D2; // b = builder.Data; //} //client.Send(builder, "2002"); SendChannelList(client); var timer = new System.Timers.Timer(5000); timer.AutoReset = true; timer.Elapsed += (sender, e) => { SendChannelList(client); }; timer.Start(); client.Metadata["timer"] = timer; } }
static void SendChannelList(ClientHandler client) { //byte[] b; var proxy = client.Metadata["proxy"] as ILoginContracts; var channels = proxy.GetChannels(); #region PSEUDOCODE /* * short header; * short size; * short opcode; * byte servers; * foreach (server) * { * short id; * uint padding; // Possibly character count? * byte channels; * foreach (channel) * { * byte id; * short players; * byte[22] padding; * short maxplayers; * uint ip; * short port; * int type; * } * } */ #endregion var p = new PacketBuilder(); p.New(0x79); { p += (byte)channels.Count; foreach (var s in channels) { p += (short)s.Key; p += 0; p += (byte)s.Value.Count; foreach (var c in s.Value) { p += (byte)c.Key; p += c.Value.Item5; p += new byte[22]; p += c.Value.Item4; var wan = (uint)client.Metadata["wan"]; var lan = (uint)client.Metadata["lan"]; var isLocal = client.RemoteEndPoint.ToString().Contains("127.0.0.1"); var isLan = client.RemoteEndPoint.ToString().Contains("192.168."); var samePC = c.Value.Item2 == wan; p += (isLocal && samePC) ? 0x0100007F : (isLan && samePC) ? (int)lan : (int)c.Value.Item2; p += c.Value.Item3; p += c.Value.Item1; } } //b = p.Data; } client.Send(p, "ServerList"); }
public static void Remove(Dictionary <ulong, ClientHandler> clients, SyncReceiver syncServer, EventHandler events, ulong magic, ClientHandler client, System.Net.EndPoint ip, int AccID) { try { foreach (ClientHandler cli in clients.Values) { if (cli.RemoteEndPoint == null) { clients.Remove((ulong)cli.Metadata["magic"]); Authentication.GetUser(syncServer, (ulong)cli.Metadata["magic"]); client.Disconnect(); } else if (cli.RemoteEndPoint == ip) { clients.Remove(magic); Authentication.GetUser(syncServer, magic); events.ClientDisconnected(events, client); } } } catch (Exception) { Log.Notice("Account {0} already removed", AccID); } }
public static void AlterDestination(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { var turnX = packet.ReadUShort(); var turnY = packet.ReadUShort(); var endX = packet.ReadUShort(); var endY = packet.ReadUShort(); //var unkX = packet.ReadShort(); //var unkY = packet.ReadShort(); //var unk0 = packet.ReadShort(); Character character = client.Metadata["fullchar"] as Character; var id = character.id; var timestamp = (uint)client.Metadata["timestamp"]; character.x = (byte)turnX; character.y = (byte)turnY; client.Metadata["dest_x"] = endX; client.Metadata["dest_y"] = endY; var clients = (client.Metadata["map"] as IMap).GetSurroundingClients(client, 2); builder.New(0xD4); { builder += id; builder += Environment.TickCount - timestamp; builder += turnX; builder += turnY; builder += endX; builder += endY; } foreach (var c in clients) { c.Send(builder, "NFY_MoveChanged"); } NewMobsList(packet, builder, client, events); //NewUserList(packet, builder, client, events); CharacterManagement.UpdatePosition(client.Metadata["syncServer"] as SyncReceiver, (int)client.Metadata["server"], client.AccountID, character.slot, character.map, character.x, character.y); }
public static void CharacterSelect(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { builder.New(0x03D9); { builder += (byte)1; } Character character = client.Metadata["fullchar"] as Character; CharacterManagement.UpdatePosition(client.Metadata["syncServer"] as SyncReceiver, (int)client.Metadata["server"], client.AccountID, character.slot, character.map, character.x, character.y); client.Send(builder, "CharacterSelect"); if (character.id != -999999998) { character.id = -999999998; } else { Log.Error("Character ID Already -999999998!", "[Channel::CharacterSelect::CharacterSelect()]"); } }
static void SendChannelList(ClientHandler client) { var proxy = client.Metadata["proxy"] as ILoginContracts; var channels = proxy.GetChannels(); #region PSEUDOCODE /* * short header; * short size; * short opcode; * byte servers; * foreach (server) * { * short id; * byte channels; * foreach (channel) * { * byte id; * short players; * short maxplayers; * uint ip; * short port; * int type; * } * } */ #endregion var p = new PacketBuilder(0x79); /*p += (byte)1; * p += (byte)0x01; * p += (byte)0x10; * p += (byte)0x01; * p += -1; * p += -1; * p += -1; * p += -1; * p += -1; * p += (byte)0xFF;*/ p += (byte)channels.Count; foreach (var s in channels) { p += (short)s.Key; p += (byte)s.Value.Count; foreach (var c in s.Value) { p += (byte)c.Key; p += c.Value.Item5; p += c.Value.Item4; var wan = (uint)client.Metadata["wan"]; var lan = (uint)client.Metadata["lan"]; var isLocal = client.RemoteEndPoint.ToString().Contains("127.0.0.1"); var isLan = client.RemoteEndPoint.ToString().Contains("192.168."); var samePC = c.Value.Item2 == wan; p += (isLocal && samePC) ? 0x0100007F : (isLan && samePC) ? lan : c.Value.Item2; p += c.Value.Item3; p += c.Value.Item1; } } var b = p.Data; client.Send(ref b, "ServerList", true); }
public void RemoveClient(ClientHandler client) { (client.Metadata["cell"] as MapCell).RemoveClient(client); }
public static void UpdateHelpInfo(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { Character character = client.Metadata["fullchar"] as Character; var clients = client.Metadata["clients"] as Dictionary <ulong, ClientHandler>; var syncServer = client.Metadata["syncServer"] as SyncReceiver; var server = (int)client.Metadata["server"]; var x = character.x; var y = character.y; var map = client.Metadata["map"] as IMap; builder.New(0x087D); { builder += (byte)1; } CharacterManagement.UpdatePosition(syncServer, server, client.AccountID, character.slot, character.map, x, y); client.Send(builder, "UpdateHelpInfo"); }
public List <ClientHandler> GetSurroundingClients(ClientHandler client, int radius) { return(GetSurroundingClients((MapCell)client.Metadata["cell"], radius)); }
public static void KeyMoveChanged(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { var unk1 = packet.ReadLong(); var unk2 = packet.ReadLong(); packet.Skip(8); var unk3 = packet.ReadByte(); Character character = client.Metadata["fullchar"] as Character; var id = character.id; var timestamp = (uint)client.Metadata["timestamp"]; var clients = (client.Metadata["map"] as IMap).GetSurroundingClients(client, 2); builder.New(0x196); { builder += id; builder += Environment.TickCount - (int)timestamp; builder += unk1; builder += unk2; builder += unk3; } foreach (var c in clients) { c.Send(builder, "NFY_KeyMoveBegined"); } }
public List <MobData> GetSurroundingMobsData(ClientHandler client, int radius) { return(GetSurroundingMobsData((MapCell)client.Metadata["cell"], radius)); }
public static void ChannelSelectList(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { var syncServer = client.Metadata["syncServer"] as SyncReceiver; var channels = GetChannels(syncServer); if (channels == null) { return; } var ipuint = BitConverter.ToUInt32(Global.Config.IP.GetAddressBytes(), 0); builder.New(0x840); { foreach (var server in channels) { if (server.id == ((int)client.Metadata["server"])) { builder += (byte)server.channels.Length; foreach (var channel in server.channels) { builder += (byte)server.id; builder += (byte)channel.id; builder += (ushort)channel.curPlayers; builder += new byte[21]; builder += (byte)255; builder += (ushort)channel.maxPlayers; if (ipuint == 0) { builder += channel.ip; } else { builder += ipuint; } builder += (ushort)channel.port; builder += (byte)0; builder += channel.type; builder += new byte[3]; } } } } client.Send(builder, "ChannelSelectList"); }
List <MapCell> GetSurroundingCells(ClientHandler client) { var list = new List <MapCell>(); var current = (MapCell)client.Metadata["cell"]; var row = current.Row; var column = current.Column; var rI = 0; var cI = 0; for (int i = row; i < 16; i++) { if (rI == 3) { break; } cI = 0; for (int j = column; j < 16; j++) { if (cI == 3) { break; } list.Add(cells[i, j]); cI++; } rI++; } rI = 0; for (int i = row; i > 0; i--) { if (rI == 3) { break; } cI = 0; for (int j = column; j > 0; j--) { if (cI == 3) { break; } list.Add(cells[i, j]); cI++; } rI++; } return(list); }
public static void MoveToLocation(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { var startX = packet.ReadUShort(); var startY = packet.ReadUShort(); var endX = packet.ReadUShort(); var endY = packet.ReadUShort(); //var unkX = packet.ReadShort(); //var unkY = packet.ReadShort(); //var map = packet.ReadShort(); Character character = client.Metadata["fullchar"] as Character; var id = character.id; var timestamp = (uint)client.Metadata["timestamp"]; character.x = (byte)startX; character.y = (byte)startY; client.Metadata["dest_x"] = endX; client.Metadata["dest_y"] = endY; var clients = (client.Metadata["map"] as IMap).GetSurroundingClients(client, 2); builder.New(0xD2); { builder += id; builder += Environment.TickCount - (int)timestamp; builder += startX; builder += startY; builder += endX; builder += endY; } foreach (var c in clients) { c.Send(builder, "NFY_MoveBegined"); } }
public void UpdateCells(ClientHandler client) { client.Metadata["surroundingCells"] = GetSurroundingCells(client); }
public static void NewUserList(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { 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) { Character character = c.Metadata["fullchar"] as Character; if (c == client) { continue; } if (character.id == 0) { continue; } var cid = character.id; var level = character.level; var timestamp = (uint)c.Metadata["timestamp"]; var x = (ushort)character.x; var y = (ushort)character.y; var dx = (ushort)c.Metadata["dest_x"]; var dy = (ushort)c.Metadata["dest_y"]; var style = (int)c.Metadata["style"]; var name = character.name; builder += cid; builder += (short)12; builder += (short)0x0100; builder += level; builder += 0x01C2; //builder += (int)(Environment.TickCount - (int)timestamp); builder += x; builder += y; builder += dx; // end x builder += dy; // end y builder += (byte)0; // pk penalty builder += 0; builder += (short)0; builder += style; builder += (byte)0; // animation id..? builder += new byte[2]; builder += 4; builder += new byte[21]; builder += (byte)(name.Length + 1); builder += name; builder += (byte)0; builder += (short)0x6901; builder += new byte[7]; builder += (byte)2; builder += (byte)150; builder += new byte[7]; builder += (byte)3; builder += (byte)195; builder += new byte[7]; builder += (byte)4; builder += (byte)90; builder += new byte[7]; } } foreach (var c in clients) { if (c == client) { continue; } c.Send(builder, "NFY_NewUserList"); } } else { builder.New(0xC8); { Character character = client.Metadata["fullchar"] as Character; var cid = character.id; var level = character.level; var timestamp = (uint)client.Metadata["timestamp"]; var x = (ushort)character.x; var y = (ushort)character.y; var dx = (ushort)client.Metadata["dest_x"]; var dy = (ushort)client.Metadata["dest_y"]; var style = (int)client.Metadata["style"]; var name = character.name; builder += (short)0x3001; builder += cid; builder += (short)9; builder += (short)0x0100; builder += level; builder += 0x01C2; //builder += (int)(Environment.TickCount - (int)timestamp); builder += x; builder += y; builder += dx; // end x builder += dy; // end y builder += (byte)0; // pk penalty builder += 0; builder += (short)0; builder += style; builder += (byte)0; // animation id..? builder += new byte[2]; builder += 4; builder += new byte[21]; builder += (byte)(name.Length + 1); builder += name; builder += (byte)0; builder += (short)0x6901; builder += new byte[7]; builder += (byte)2; builder += (byte)150; builder += new byte[7]; builder += (byte)3; builder += (byte)195; builder += new byte[7]; builder += (byte)4; builder += (byte)90; builder += new byte[7]; client.Send(builder, "NFY_NewUserList"); } } }
public static void SubPasswordFindRequest(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { var syncServer = client.Metadata["syncServer"] as SyncReceiver; var questionID = SubpassManagement.GetSubPassQuestion(syncServer, client.AccountID); builder.New(0x40C); { builder += questionID; builder += questionID; builder += 1; } client.Send(builder, "SubPasswordFindRequest"); }
public static void SubPasswordDelRequest(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(0x410); { 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, "SubPasswordDelRequest"); if ((int)client.Metadata["subTries"] > 3) { client.Disconnect(); } }
public static void NFY_ChangeStyle(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { var style = packet.ReadInt(); var unk2 = packet.ReadInt(); Character character = client.Metadata["fullchar"] as Character; var cid = character.id; var clients = (client.Metadata["map"] as IMap).GetSurroundingClients(client, 2); client.Metadata["style"] = style; builder.New(0x143); { builder += cid; builder += style; builder += unk2; builder += 0; builder += (short)0; } foreach (var c in clients) { c.Send(builder, "NFY_ChangeStyle"); } }