Пример #1
0
        private static void onStatus(HttpListenerContext ctx)
        {
            dynamic status = new ExpandoObject();

            status.status      = "ok";
            status.playercount = RiceServer.GetPlayers().Length;

            var servers = new [] { RiceServer.Auth, RiceServer.Lobby, RiceServer.Game, RiceServer.Area, RiceServer.Ranking };

            status.servers = servers
                             .Select(server => new
            {
                name        = server.Name,
                clientcount = server.GetClients().Length
            });

            status.areas = RiceServer.GetAreas()
                           .Where(a => a.GetPlayerCount() > 0)
                           .Select(area => new
            {
                id          = area.ID,
                playercount = area.GetPlayerCount(),
                players     = area.GetPlayers()
                              .Select(p => new
                {
                    name  = p.ActiveCharacter.Name,
                    level = p.ActiveCharacter.Level
                })
            });

            writeJsonResp(status, ctx);
        }
Пример #2
0
        public static void PlayerInfoReq(RicePacket packet)
        {
            var reqCnt = packet.Reader.ReadUInt32();
            var serial = packet.Reader.ReadUInt16(); // No known scenarios where the requested info count is > 1

            // Followed by the session age of the player we are requesting info for. nplutowhy.avi

            foreach (var p in RiceServer.GetPlayers())
            {
                if (p.ActiveCharacter != null && p.ActiveCharacter.CarSerial == serial)
                {
                    var character  = p.ActiveCharacter;
                    var playerInfo = new Structures.PlayerInfo()
                    {
                        Name   = character.Name,
                        Serial = character.CarSerial,
                        Age    = 0
                    };
                    var res = new RicePacket(802);
                    res.Writer.Write(1);
                    res.Writer.Write(playerInfo);
                    packet.Sender.Send(res);
                    break;
                }
            }
        }
Пример #3
0
        public static void CheckInLobby(RicePacket packet)
        {
            Log.WriteLine("CheckInLobby request.");

            uint   version      = packet.Reader.ReadUInt32();
            uint   ticket       = packet.Reader.ReadUInt32();
            string username     = packet.Reader.ReadUnicodeStatic(0x28);
            uint   time         = packet.Reader.ReadUInt32();
            string stringTicket = packet.Reader.ReadASCIIStatic(0x40);

#if DEBUG
            packet.Sender.Player = new Player(Rice.Game.User.Retrieve("admin"));
#else
            foreach (var p in RiceServer.GetPlayers())
            {
                if (p.User.Username == username && p.Ticket == ticket)
                {
                    player             = p;
                    player.LobbyClient = packet.Sender;
                    break;
                }
            }
#endif

            if (packet.Sender.Player == null)
            {
                Log.WriteLine("Rejecting {0} (ticket {1}) for invalid user-ticket combination.", username, ticket);
                packet.Sender.Error("Invalid ticket-user combination.");
                return;
            }

            var ack = new RicePacket(42); // CheckInLobbyAck
            ack.Writer.Write(0);          // Result
            ack.Writer.Write(0);          // Permission
            packet.Sender.Send(ack);

            var timeAck = new RicePacket(47); // LobbyTimeAck
            timeAck.Writer.Write(Environment.TickCount);
            timeAck.Writer.Write(Environment.TickCount);
            packet.Sender.Send(timeAck);

            Log.WriteLine("User {0} entered lobby.", username);
        }
Пример #4
0
        public static void UserAuth(RicePacket packet)
        {
            packet.Reader.ReadInt32(); // Skip 4 bytes.
            var username = packet.Reader.ReadUnicodeStatic(40);
            var password = packet.Reader.ReadASCII();

            string pwhash = Utilities.MD5(password.Substring(0, password.Length - 1));

            User user = User.Retrieve(username, pwhash);

            if (user == null || user.Status == UserStatus.Invalid)
            {
                Log.WriteLine("Attempt to log into non-existant account or use invalid password.");

                var invalid = new RicePacket(22);

                invalid.Writer.Write(0);
                invalid.Writer.Write(1);
                invalid.Writer.Write(new byte[68]);

                packet.Sender.Send(invalid);
                return;
            }
            else if (user.Status == UserStatus.Banned)
            {
                Log.WriteLine("Attempt to log into suspended account {0}.", user.Name);

                packet.Sender.Error("Your account has been suspended.");
                packet.Sender.Kill();
                return;
            }

            Player player = new Player(user);

            player.AuthClient = packet.Sender;
            player.Ticket     = RiceServer.CreateTicket();
            RiceServer.AddPlayer(player);

            var ack = new RicePacket(22);

            ack.Writer.Write(player.Ticket);                         // Ticket
            ack.Writer.Write(0);                                     // Auth Result

            ack.Writer.Write(Environment.TickCount);                 // Time
            ack.Writer.Write(new byte[64]);                          // Filler ("STicket")

            ack.Writer.Write((ushort)23);                            // ServerList ID
            ack.Writer.Write(1);                                     // Server Count

            ack.Writer.WriteUnicodeStatic("Rice Emulator", 32);      // Server Name
            ack.Writer.Write(1);                                     // Server ID

            ack.Writer.Write((float)RiceServer.GetPlayers().Length); // Player Count
            ack.Writer.Write(7000f);                                 // Max Player Count

            ack.Writer.Write(1);                                     // Server State

            ack.Writer.Write(Environment.TickCount);                 // Game Update Time
            ack.Writer.Write(Environment.TickCount);                 // Lobby Update Time
            ack.Writer.Write(Environment.TickCount);                 // Area1 Update Time
            ack.Writer.Write(Environment.TickCount);                 // Area2 Update Time
            ack.Writer.Write(Environment.TickCount);                 // Ranking Update Time

            byte[] ip = IPAddress.Parse(RiceServer.Config.PublicIP).GetAddressBytes();
            ack.Writer.Write(ip);                            // GameServer IP
            ack.Writer.Write(ip);                            // LobbyServer IP
            ack.Writer.Write(ip);                            // AreaServer 1 IP
            ack.Writer.Write(ip);                            // AreaServer 2 IP
            ack.Writer.Write(ip);                            // Ranking IP

            ack.Writer.Write(RiceServer.Config.GamePort);    // GameServer Port
            ack.Writer.Write(RiceServer.Config.LobbyPort);   // LobbyServer Port
            ack.Writer.Write(RiceServer.Config.AreaPort);    // AreaServer 1 Port
            ack.Writer.Write((ushort)11041);                 // AreaServer 2 Port
            ack.Writer.Write((ushort)10701);                 // AreaServer 1 UDP Port
            ack.Writer.Write((ushort)10702);                 // AreaServer 2 UDP Port
            ack.Writer.Write(RiceServer.Config.RankingPort); // Ranking Port

            ack.Writer.Write((ushort)0);                     // what

            packet.Sender.Send(ack);
        }