コード例 #1
0
        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>()));
            }
        }
コード例 #2
0
        /// <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);
        }