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); var serverTicket = RiceServer.GetTicket(ticket); if (serverTicket == null || !serverTicket.ValidateOrigin(packet.Sender, username)) { #if DEBUG packet.Sender.Player = new Player(Rice.Game.User.Retrieve(username)); RiceServer.AddPlayer(packet.Sender.Player); serverTicket = RiceServer.CreateDebugTicket(packet.Sender, ticket); #else Log.WriteLine("Ticket is non-existent or invalid for current user."); packet.Sender.Error("water u even doin"); return; #endif } else { packet.Sender.Player = serverTicket.GetOwner(); } var ack = new RicePacket(42); // CheckInLobbyAck ack.Writer.Write(ticket); // Ticket 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); }
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); }