public void Parse(RicePacket packet) { //Log.WriteLine("{0} parsing {1}.", port, packet.ID); if (parsers.ContainsKey(packet.ID)) { parsers[packet.ID](packet); } else { Console.ForegroundColor = ConsoleColor.DarkYellow; #if DEBUG if (debugNameDatabase.ContainsKey(packet.ID)) { Log.WriteLine("Received {2} (id {0}, {0:X}) on {1}.", packet.ID, port, debugNameDatabase[packet.ID]); } else { Log.WriteLine("Received unknown packet (id {0}, {0:X}) on {1}.", packet.ID, port); } #else Log.WriteLine("Received unknown packet (id {0}, {0:X}) on {1}.", packet.ID, port); #endif Console.ForegroundColor = ConsoleColor.Gray; } }
public void Error(string format, params object[] args) { var err = new RicePacket(1); err.Writer.WriteUnicode(String.Format(format, args)); Send(err); }
public static void ChatWrite(RicePacket packet) { string unknown = packet.Reader.ReadUnicode(); // 114 // room / channel / party / team string unknown2 = packet.Reader.ReadUnicode(); // 111 string unknown3 = packet.Reader.ReadUnicode(); // 111 unknown = unknown.Substring(0, unknown.Length - 1); //Log.WriteLine("Channel: {0} {0} {0}", unknown, unknown2, unknown3); //Log.WriteLine("{0}", packet.Reader.ReadUInt32()); int channel = 0; if (unknown.ToLower() == "room") channel = 0; else if (unknown.ToLower() == "channel") channel = 1; else if (unknown.ToLower() == "party") channel = 2; else if (unknown.ToLower() == "team") channel = 3; var ack = new RicePacket(147); ack.Writer.WriteUnicode("party "); // Unknown maybe channel (7 bytes big) ack.Writer.WriteUnicode("GigaToni"); // Username ack.Writer.WriteUnicode("room9999"); // Unknown (8 bytes big) ack.Writer.WriteUnicode("This is the first Chat msg"); packet.Sender.Send(ack); }
public static void CreateCharacter(RicePacket packet) { string characterName = packet.Reader.ReadUnicode(); Log.WriteLine("CreateChar: {0}", characterName); // TODO: Verify, Handle }
public void Parse(RicePacket packet) { //Log.WriteLine("{0} parsing {1}.", port, packet.ID); if (parsers.ContainsKey(packet.ID)) { if (checkInParsers.Contains(packet.ID) && packet.Sender.Player == null) { Log.WriteLine("Autokilling {0} sender on {1}: CheckIn requirement not met."); packet.Sender.Kill("Forbidden"); return; } parsers[packet.ID](packet); } else { Console.ForegroundColor = ConsoleColor.DarkYellow; #if DEBUG if (debugNameDatabase.ContainsKey(packet.ID)) { Log.WriteLine("Received {2} (id {0}, {0:X}) on {1}.", packet.ID, port, debugNameDatabase[packet.ID]); } else { Log.WriteLine("Received unknown packet (id {0}, {0:X}) on {1}.", packet.ID, port); } #else Log.WriteLine("Received unknown packet (id {0}, {0:X}) on {1}.", packet.ID, port); #endif Console.ForegroundColor = ConsoleColor.Gray; } }
public static void TimeSync(RicePacket packet) { var ack = new RicePacket(0x21C); ack.Writer.Write(packet.Reader.ReadUInt32()); ack.Writer.Write(0); packet.Sender.Send(ack); }
public void Broadcast(RicePacket packet, RiceClient exclude = null) { foreach (var client in GetClients()) { if (exclude == null || client != exclude) client.Send(packet); } }
public void Broadcast(RicePacket packet, RiceClient exclude = null) { foreach (var client in GetClients()) { if (exclude == null || client != exclude) { client.Send(packet); } } }
public static void CheckInGame(RicePacket packet) { Log.WriteLine("CheckInGame"); // TODO: Verify var ack = new RicePacket(121); ack.Writer.Write(1L); packet.Sender.Send(ack); }
public static void LoadCharacter(RicePacket packet) { string characterName = packet.Reader.ReadUnicode(); var ack = new RicePacket(124); var ackStruct = new Structures.LoadCharAck { CharInfo = new Structures.CharInfo { Avatar = 1, Name = "charName", Cid = 1, City = 1, CurCarId = 1, ExpInfo = new Structures.ExpInfo { BaseExp = 0, CurExp = 0, NextExp = 0 }, HancoinGarage = 1, Level = 80, TeamId = 1, TeamName = "Staff", MitoMoney = 123456789 }, nCarSize = 1, CarInfo = new List<Structures.CarInfo>() { new Structures.CarInfo { AuctionOn = false, CarUnit = new Structures.CarUnit { AuctionCnt = 0, BaseColor = 0, CarID = 1, CarType = 24, Grade = 9, Mitron = 0.00f, Kmh = 200, SlotType = 0 }, Color = 0, MitronCapacity = 0.00f, MitronEfficiency = 0.00f } } }; ack.Writer.Write(ackStruct); packet.Sender.Send(ack); Log.WriteLine("Sent LoadCharAck"); }
public static void JoinChannel(RicePacket packet) { var ack = new RicePacket(126); ack.Writer.WriteUnicodeStatic("speeding", 10); ack.Writer.WriteUnicodeStatic("charName", 16); ack.Writer.Write((ushort)123); // Serial ack.Writer.Write((ushort)123); // Age packet.Sender.Send(ack); }
public static void DeleteCharacter(RicePacket packet) { string characterName = packet.Reader.ReadUnicode(); Log.WriteLine("DeleteChar: {0}", characterName); // TODO: Verify var ack = new RicePacket(84); ack.Writer.WriteUnicodeStatic(characterName, 21); packet.Sender.Send(ack); }
public static void FirstPosition(RicePacket packet) { var ack = new RicePacket(0x30F); ack.Writer.Write(0L); ack.Writer.Write(0L); ack.Writer.Write(0L); ack.Writer.Write(3); packet.Sender.Send(ack); }
public static void CheckCharacterName(RicePacket packet) { string characterName = packet.Reader.ReadUnicode(); Log.WriteLine("VerifyCharName: {0}", characterName); // TODO: Verify var ack = new RicePacket(81); ack.Writer.WriteUnicodeStatic(characterName, 21); ack.Writer.Write(1); // Availability. 1 = Available, 0 = Unavailable. packet.Sender.Send(ack); }
public void Parse(RicePacket packet) { //Log.WriteLine("{0} parsing {1}.", port, packet.ID); if (parsers.ContainsKey(packet.ID)) parsers[packet.ID](packet); else { Console.ForegroundColor = ConsoleColor.DarkYellow; Log.WriteLine("Received unknown packet (id {0}, {0:X}) on {1}.", packet.ID, port); Console.ForegroundColor = ConsoleColor.Gray; } }
public void Send(RicePacket packet) { byte[] buffer = packet.Writer.GetBuffer(); int bufferLength = buffer.Length; ushort length = (ushort)(bufferLength + 2); // Length includes itself try { ns.Write(BitConverter.GetBytes(length), 0, 2); ns.Write(buffer, 0, bufferLength); } catch (Exception ex) { Kill(ex); } }
public void Parse(RicePacket packet) { //Log.WriteLine("{0} parsing {1}.", port, packet.ID); if (parsers.ContainsKey(packet.ID)) { parsers[packet.ID](packet); } else { Console.ForegroundColor = ConsoleColor.DarkYellow; Log.WriteLine("Received unknown packet (id {0}, {0:X}) on {1}.", packet.ID, port); Console.ForegroundColor = ConsoleColor.Gray; } }
public static void LoadCharacter(RicePacket packet) { string characterName = packet.Reader.ReadUnicode(); var character = Rice.Game.Character.Retrieve(characterName); // TODO: verify this var user = Rice.Game.User.Retrieve(character.UID); packet.Sender.Player = new Rice.Game.Player(user); packet.Sender.Player.Characters = Rice.Game.Character.Retrieve(user.UID); packet.Sender.Player.ActiveCharacter = character; var ack = new RicePacket(124); var ackStruct = new Structures.LoadCharAck { CharInfo = character.GetInfo(), nCarSize = 1, CarInfo = new List<Structures.CarInfo>() { new Structures.CarInfo { AuctionOn = false, CarUnit = new Structures.CarUnit { AuctionCnt = 0, BaseColor = 0, CarID = 1, CarType = 24, Grade = 9, Mitron = 0.00f, Kmh = 200, SlotType = 0 }, Color = 0, MitronCapacity = 0.00f, MitronEfficiency = 0.00f } } }; ack.Writer.Write(ackStruct); packet.Sender.Send(ack); Log.WriteLine("Sent LoadCharAck"); }
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); }
public static void UserInfo(RicePacket packet) { Log.WriteLine("UserInfo request."); var settings = new RicePacket(30); settings.Writer.Write(Static.GameSettings); packet.Sender.Send(settings); packet.Sender.Player.Characters = Rice.Game.Character.Retrieve(packet.Sender.Player.User.UID); var ack = new RicePacket(61); ack.Writer.Write(0); // Permissions ack.Writer.Write(packet.Sender.Player.Characters.Count); // Character Count ack.Writer.WriteUnicodeStatic(packet.Sender.Player.User.Name, 18); // Username ack.Writer.Write((long)0); ack.Writer.Write((long)0); ack.Writer.Write((long)0); ack.Writer.Write(0); foreach (var character in packet.Sender.Player.Characters) { ack.Writer.WriteUnicodeStatic(character.Name, 21); // Name ack.Writer.Write(character.CID); // ID ack.Writer.Write(character.Avatar); // Avatar ack.Writer.Write(character.Level); // Level ack.Writer.Write(1); ack.Writer.Write(0x50); ack.Writer.Write(0); ack.Writer.Write(int.MaxValue / 2); // Creation Date ack.Writer.Write(character.TID); // Crew ID ack.Writer.Write(0L); // Crew Image ack.Writer.WriteUnicodeStatic("Staff", 12); // Crew Name ack.Writer.Write((short)0); ack.Writer.Write((short)-1); ack.Writer.Write((short)0); } packet.Sender.Send(ack); Log.WriteLine("Sent character list."); }
public static void UserInfo(RicePacket packet) { Log.WriteLine("UserInfo request."); var settings = new RicePacket(30); settings.Writer.Write(Static.GameSettings); packet.Sender.Send(settings); var ack = new RicePacket(61); ack.Writer.Write(0); // Permissions ack.Writer.Write(2); // Character Count ack.Writer.WriteUnicodeStatic("userName", 18); // Username ack.Writer.Write((long)0); ack.Writer.Write((long)0); ack.Writer.Write((long)0); ack.Writer.Write(0); // Generate 2 characters for (int i = 1; i <= 2; i++) { ack.Writer.WriteUnicodeStatic("char" + i, 21); // Name ack.Writer.Write((ulong)i); // ID ack.Writer.Write(i); // Avatar ack.Writer.Write(i * 20); // Level ack.Writer.Write(1); ack.Writer.Write(0x50); ack.Writer.Write(0); ack.Writer.Write(int.MaxValue / 2); // Creation Date ack.Writer.Write((ulong)1); // Crew ID ack.Writer.Write(0L); // Crew Image ack.Writer.WriteUnicodeStatic("Staff, maybe", 12); // Crew Name ack.Writer.Write((short)0); ack.Writer.Write((short)-1); ack.Writer.Write((short)0); } packet.Sender.Send(ack); Log.WriteLine("Sent character list."); }
public void Parse(RicePacket packet) { //Log.WriteLine("{0} parsing {1}.", port, packet.ID); if (parsers.ContainsKey(packet.ID)) parsers[packet.ID](packet); else { Console.ForegroundColor = ConsoleColor.DarkYellow; #if DEBUG if (debugNameDatabase.ContainsKey(packet.ID)) Log.WriteLine("Received {2} (id {0}, {0:X}) on {1}.", packet.ID, port, debugNameDatabase[packet.ID]); else Log.WriteLine("Received unknown packet (id {0}, {0:X}) on {1}.", packet.ID, port); #else Log.WriteLine("Received unknown packet (id {0}, {0:X}) on {1}.", packet.ID, port); #endif Console.ForegroundColor = ConsoleColor.Gray; } }
private void onData(IAsyncResult result) { try { bytesToRead -= ns.EndRead(result); if (bytesToRead > 0) { ns.BeginRead(buffer, buffer.Length - bytesToRead, bytesToRead, onData, null); return; } var packet = new RicePacket(this, packetID, buffer); parent.Parse(packet); buffer = new byte[4]; bytesToRead = buffer.Length; ns.BeginRead(buffer, 0, 4, onHeader, null); } catch (Exception ex) { Kill(ex); } }
public static void BuyItem(RicePacket packet) { // 0 = ItemID // 1 = Unknown // 2 = Quantity int itemID = packet.Reader.ReadInt16(); int unknown = packet.Reader.ReadInt16(); int quantity = packet.Reader.ReadInt16(); Log.WriteLine("{0} {1} {2}", itemID, unknown, quantity); // 0 = itemID // 1 = Price // 2 = Quantity var ack = new RicePacket(406); ack.Writer.Write(itemID); ack.Writer.Write(17500); ack.Writer.Write(quantity); packet.Sender.Send(ack); }
public static void ChatMessage(RicePacket packet) { string type = packet.Reader.ReadUnicodeStatic(10); bool green = packet.Reader.ReadUInt32() == 0xFF00FF00; // ignore this, use packet.Sender.Player.User.Status string message = packet.Reader.ReadUnicodePrefixed(); string sender = packet.Sender.Player.ActiveCharacter.Name; Console.WriteLine("({0}) <{1}> {2}", type, sender, message); var ack = new RicePacket(147); ack.Writer.WriteUnicodeStatic(type, 10); ack.Writer.WriteUnicodeStatic(sender, 18); ack.Writer.WriteUnicode(message); switch (type) { case "room": RiceServer.Game.Broadcast(ack); // TODO: broadcast only to users in same area break; case "channel": RiceServer.Game.Broadcast(ack); break; case "party": RiceServer.Game.Broadcast(ack); // TODO: broadcast only to users in same party break; case "team": RiceServer.Game.Broadcast(ack); // TODO: broadcast only to users in same crew break; default: Log.WriteError("Undefined chat message type."); break; } }
public void Send(RicePacket packet) { byte[] buffer = packet.Writer.GetBuffer(); int bufferLength = buffer.Length; ushort length = (ushort)(bufferLength + 2); // Length includes itself try { ns.Write(BitConverter.GetBytes(length), 0, 2); ns.Write(buffer, 0, bufferLength); } catch (Exception ex) { Kill(ex); } }
public static void NullPing(RicePacket packet) { }
private void onData(IAsyncResult result) { try { bytesToRead -= ns.EndRead(result); if (bytesToRead > 0) { ns.BeginRead(buffer, buffer.Length - bytesToRead, bytesToRead, onData, null); return; } var packet = new RicePacket(this, packetID, buffer); parent.Parse(packet); buffer = new byte[4]; bytesToRead = buffer.Length; ns.BeginRead(buffer, 0, 4, onHeader, null); } catch (Exception ex) { Kill(ex); } }
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); }
public static void UnknownSync(RicePacket packet) { // hide sync packets for now }
public void Error(string format, params object[] args) { var err = new RicePacket(1); err.Writer.WriteUnicode(String.Format(format, args)); Send(err); }