public LocationUpdate(GameClient client, ReceivablePacket packet) { // Read data. float posX = (float)packet.ReadDouble(); // TODO: Client WriteFloat float posY = (float)packet.ReadDouble(); // TODO: Client WriteFloat float posZ = (float)packet.ReadDouble(); // TODO: Client WriteFloat float heading = (float)packet.ReadDouble(); // TODO: Client WriteFloat int animState = packet.ReadShort(); int waterState = packet.ReadByte(); // Update player location. Player player = client.GetActiveChar(); LocationHolder location = player.GetLocation(); location.SetX(posX); location.SetY(posY); location.SetZ(posZ); location.SetHeading(heading); // Broadcast movement. foreach (Player nearby in WorldManager.GetVisiblePlayers(player)) { nearby.ChannelSend(new MoveToLocation(player, heading, animState, waterState)); } }
public AccountAuthenticationRequest(GameClient client, ReceivablePacket packet) { // Read data. double clientVersion = packet.ReadDouble(); string accountName = packet.ReadString().ToLowerInvariant(); string passwordHash = packet.ReadString(); // Client version check. if (clientVersion != Config.CLIENT_VERSION) { client.ChannelSend(new AccountAuthenticationResult(STATUS_INCORRECT_CLIENT)); return; } // Replace illegal characters. foreach (char c in Util.ILLEGAL_CHARACTERS) { accountName = accountName.Replace(c, '\''); } // Account name checks. if ((accountName.Length < 2) || (accountName.Length > 20) || accountName.Contains("'") || (passwordHash.Length == 0)) // 20 should not happen, checking it here in case of client cheat. { client.ChannelSend(new AccountAuthenticationResult(STATUS_NOT_FOUND)); return; } // Get data from database. string storedPassword = ""; int status = STATUS_NOT_FOUND; try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(ACCOUNT_INFO_QUERY, con); cmd.Parameters.AddWithValue("account", accountName); MySqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { storedPassword = reader.GetString("password"); status = reader.GetInt32("status"); } con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } // In case of auto create accounts configuration. if ((status == 0) && Config.ACCOUNT_AUTO_CREATE) { // Create account. try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(ACCOUNT_CREATE_QUERY, con); cmd.Parameters.AddWithValue("account", accountName); cmd.Parameters.AddWithValue("password", passwordHash); cmd.ExecuteNonQuery(); con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } LogManager.Log("Created account " + accountName + "."); } else // Account status issue. { // 0 does not exist, 1 banned, 2 requires activation, 3 wrong password, 4 too many online, 100 authenticated if (status < STATUS_WRONG_PASSWORD) { client.ChannelSend(new AccountAuthenticationResult(status)); return; } // Wrong password. if (!passwordHash.Equals(storedPassword)) { client.ChannelSend(new AccountAuthenticationResult(STATUS_WRONG_PASSWORD)); return; } } // Kick existing logged client. GameClient existingClient = WorldManager.GetClientByAccountName(accountName); if (existingClient != null) { existingClient.ChannelSend(new Logout(accountName)); client.ChannelSend(new AccountAuthenticationResult(STATUS_ALREADY_ONLINE)); return; } // Too many online users. if (WorldManager.GetOnlineCount() >= Config.MAXIMUM_ONLINE_USERS) { client.ChannelSend(new AccountAuthenticationResult(STATUS_TOO_MANY_ONLINE)); return; } // Authentication was successful. WorldManager.AddClient(client); client.SetAccountName(accountName); client.ChannelSend(new AccountAuthenticationResult(STATUS_AUTHENTICATED)); // Update last login date and IP address. try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(ACCOUNT_INFO_UPDATE_QUERY, con); cmd.Parameters.AddWithValue("last_active", DateTimeOffset.Now.ToUnixTimeSeconds()); cmd.Parameters.AddWithValue("ip", client.GetIp()); cmd.Parameters.AddWithValue("account", accountName); cmd.ExecuteNonQuery(); con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } }
public static void Handle(GameClient client, ReceivablePacket packet) { /* * switch (packet.ReadShort()) // Packet id. * { * case 1: * new AccountAuthenticationRequest(client, packet); * break; * * case 2: * new CharacterSelectionInfoRequest(client, packet); * break; * * case 3: * new CharacterCreationRequest(client, packet); * break; * * case 4: * new CharacterDeletionRequest(client, packet); * break; * * case 5: * new CharacterSlotUpdate(client, packet); * break; * * case 6: * new CharacterSelectUpdate(client, packet); * break; * * case 7: * new EnterWorldRequest(client, packet); * break; * * case 8: * new ExitWorldRequest(client, packet); * break; * * case 9: * new LocationUpdateRequest(client, packet); * break; * * case 10: * new AnimatorUpdateRequest(client, packet); * break; * * case 11: * new ObjectInfoRequest(client, packet); * break; * * case 12: * new PlayerOptionsUpdate(client, packet); * break; * * case 13: * new ChatRequest(client, packet); * break; * } */ // Test receive. LogManager.Log("" + packet.ReadByte()); LogManager.Log("" + packet.ReadShort()); LogManager.Log("" + packet.ReadInt()); LogManager.Log("" + packet.ReadLong()); LogManager.Log("" + packet.ReadFloat()); LogManager.Log("" + packet.ReadDouble()); LogManager.Log("" + packet.ReadString()); // Test send. SendablePacket send = new SendablePacket(); send.WriteShort(1); // id send.WriteString("All is good!"); client.ChannelSend(send); }