Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
        public void Error(string format, params object[] args)
        {
            var err = new RicePacket(1);

            err.Writer.WriteUnicode(String.Format(format, args));
            Send(err);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        public static void CreateCharacter(RicePacket packet)
        {
            string characterName = packet.Reader.ReadUnicode();
            Log.WriteLine("CreateChar: {0}", characterName);

            // TODO: Verify, Handle
        }
Beispiel #5
0
        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;
            }
        }
Beispiel #6
0
 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);
 }
Beispiel #7
0
 public void Broadcast(RicePacket packet, RiceClient exclude = null)
 {
     foreach (var client in GetClients())
     {
         if (exclude == null || client != exclude)
             client.Send(packet);
     }
 }
Beispiel #8
0
 public void Broadcast(RicePacket packet, RiceClient exclude = null)
 {
     foreach (var client in GetClients())
     {
         if (exclude == null || client != exclude)
         {
             client.Send(packet);
         }
     }
 }
Beispiel #9
0
        public static void CheckInGame(RicePacket packet)
        {
            Log.WriteLine("CheckInGame");

            // TODO: Verify

            var ack = new RicePacket(121);
            ack.Writer.Write(1L);
            packet.Sender.Send(ack);
        }
Beispiel #10
0
        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");
        }
Beispiel #11
0
        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);
        }
Beispiel #12
0
        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);
        }
Beispiel #13
0
        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);
        }
Beispiel #14
0
        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);
        }
Beispiel #15
0
        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;
            }
        }
Beispiel #16
0
        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); }
        }
Beispiel #17
0
        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;
            }
        }
Beispiel #18
0
        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");
        }
Beispiel #19
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);
        }
Beispiel #20
0
        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.");
        }
Beispiel #21
0
        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.");
        }
Beispiel #22
0
        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;
            }
        }
Beispiel #23
0
        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); }
        }
Beispiel #24
0
        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);
        }
Beispiel #25
0
        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;
            }
        }
Beispiel #26
0
        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); }
        }
Beispiel #27
0
 public static void NullPing(RicePacket packet) { }
Beispiel #28
0
        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); }
        }
Beispiel #29
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);
        }
Beispiel #30
0
 public static void UnknownSync(RicePacket packet)
 {
     // hide sync packets for now
 }
Beispiel #31
0
 public void Error(string format, params object[] args)
 {
     var err = new RicePacket(1);
     err.Writer.WriteUnicode(String.Format(format, args));
     Send(err);
 }