public void UpdateServerList() { // The server update delay var updateDelay = GetValueOrDefault("WorldStatsUpdateDelay", 30); // Loop and update the server list every 30s while (true) { var bldr = new PacketBuilder(Common.Database.Opcodes.SERVER_LIST); _dbClient.Write(bldr.ToPacket(), (_data, _length) => { int serverCount = _data[0] & 0xFF; var data = new byte[_length - 4]; Array.Copy(_data, 4, data, 0, _length - 4); lock (_syncObject) { _servers.Clear(); for (int i = 0; i < serverCount; i++) { Common.Database.Structs.Game.Server server = new Common.Database.Structs.Game.Server(); server = Serializer.Deserialize <Common.Database.Structs.Game.Server>(data); _servers.Add(server); } } }); Thread.Sleep(TimeSpan.FromSeconds(updateDelay.Value <int>())); } }
/// <summary> /// Handles a server list request from the login server /// </summary> /// <param name="session">The session instance</param> /// <param name="length">The length of the packet</param> /// <param name="opcode">The opcode of the incoming packet</param> /// <param name="requestId"></param> /// <param name="data">The packet data</param> /// <returns></returns> public override bool Handle(ServerSession session, int length, int opcode, int requestId, byte[] data) { var bldr = new PacketBuilder(opcode); bldr.WriteInt(requestId); using (SqlConnection connection = new DatabaseConnector().GetConnection("origin_gamedata")) { var rowCmd = new SqlCommand("SELECT COUNT(*) FROM worlds", connection); var cmd = new SqlCommand("SELECT * FROM worlds", connection); connection.Open(); rowCmd.Prepare(); int rowCount = Convert.ToInt32(rowCmd.ExecuteScalar()); // Execute the prepared statement var reader = cmd.ExecuteReader(); bldr.WriteInt(rowCount); // Loop through the results while (reader.Read()) { Common.Database.Structs.Game.Server server = new Common.Database.Structs.Game.Server(); server.serverId = reader.GetInt16(0); server.serverName = reader.GetString(1); server.population = reader.GetInt16(2); server.status = reader.GetInt16(3); server.ipAddress = reader.GetString(4); server.maxPlayers = reader.GetInt16(5); server.clientVersion = reader.GetInt16(6); var array = Serializer.Serialize(server); bldr.WriteBytes(array); } reader.Close(); } session.Write(bldr.ToPacket()); return(true); }