Beispiel #1
0
        public static void UserInfo(Packet packet)
        {
            var username = packet.Reader.ReadUnicodeStatic(32); // username
            var ticket   = packet.Reader.ReadUInt32();          // Ticket

            Log.Debug("UserInfo request. (Username: {0}, Ticket: {1})", username, ticket);

            if (ticket != packet.Sender.User.Ticket)
            {
                Log.Error("Rejecting packet from {0} (ticket {1}) for invalid user-ticket combination.", username,
                          ticket);
                packet.Sender.Error("Invalid ticket-user combination.");
            }

            var ack = new Packet(Packets.GameSettingsAck);

            ack.Writer.Write(GameSettings);

            /*ack.Writer.Write(new byte[90]);
            *  ack.Writer.Write((short) 50); // Max Level?
            *  ack.Writer.Write(new byte[12]);*/
            packet.Sender.Send(ack);

            packet.Sender.User.Characters = CharacterModel.Retrieve(LobbyServer.Instance.Database.Connection,
                                                                    packet.Sender.User.UID);

            ack = new Packet(Packets.UserInfoAck);
            ack.Writer.Write(0);                                        // Permissions
            ack.Writer.Write(packet.Sender.User.Characters.Count);      // Characters count
            ack.Writer.WriteUnicodeStatic(packet.Sender.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.User.Characters)
            {
                Vehicle v    = VehicleModel.Retrieve(LobbyServer.Instance.Database.Connection, character.CurrentCarId);
                var     team = TeamModel.Retrieve(LobbyServer.Instance.Database.Connection, character.Tid);
                character.TeamId        = team.TeamId;
                character.TeamName      = team.TeamName;
                character.TeamMarkId    = team.TeamMarkId;
                character.TeamCloseDate = (int)team.CloseDate;
                character.TeamRank      = 1;

                ack.Writer.WriteUnicodeStatic(character.Name, 21); // Name
                ack.Writer.Write(character.Cid);                   // ID
                ack.Writer.Write((int)character.Avatar);           // Avatar
                ack.Writer.Write((int)character.Level);            // Level
                ack.Writer.Write(character.CurrentCarId);          // CarID
                ack.Writer.Write(v.CarType);                       // CarType
                ack.Writer.Write(v.BaseColor);                     // CarColor
                ack.Writer.Write(character.CreationDate);          // Creation Date
                ack.Writer.Write(character.Tid);                   // Crew ID
                ack.Writer.Write(character.TeamMarkId);            // Crew Image
                ack.Writer.WriteUnicodeStatic("Staff", 13);        // Crew Name
                ack.Writer.Write((short)1);                        // Guild
                ack.Writer.Write((short)-1);
            }

            packet.Sender.Send(ack);
        }
Beispiel #2
0
        public static void LoadCharThread(Packet packet)
        {
            string characterName = packet.Reader.ReadUnicode();
            uint   serial        = packet.Reader.ReadUInt32();

            var character = CharacterModel.Retrieve(GameServer.Instance.Database.Connection, characterName);
            var team      = TeamModel.Retrieve(GameServer.Instance.Database.Connection, character.Tid);

            character.TeamId        = team.TeamId;
            character.TeamName      = team.TeamName;
            character.TeamMarkId    = team.TeamMarkId;
            character.TeamCloseDate = (int)team.CloseDate;
            character.TeamRank      = 1;
            var user = AccountModel.Retrieve(GameServer.Instance.Database.Connection, character.Uid);

            packet.Sender.User = user;
            packet.Sender.User.ActiveCharacterId = character.Uid;
            packet.Sender.User.ActiveCharacter   = CharacterModel.RetrieveOne(GameServer.Instance.Database.Connection, character.Uid);
            packet.Sender.User.ActiveCarId       = character.CurrentCarId;
            packet.Sender.User.ActiveTeam        = team;
            packet.Sender.User.Characters        = CharacterModel.Retrieve(GameServer.Instance.Database.Connection, user.UID);

            var vehicles = VehicleModel.Retrieve(GameServer.Instance.Database.Connection, character.Cid);

            var ack = new Packet(Packets.LoadCharThreadAck);

            ack.Writer.Write((uint)0); // ServerId
            ack.Writer.Write((uint)0); // ServerStartTime

            // Character
            character.Serialize(ack.Writer);

            ack.Writer.Write((uint)vehicles.Count);

            foreach (var vehicle in vehicles)
            {
                if (vehicle.CarID == character.CurrentCarId)
                {
                    packet.Sender.User.ActiveCar = vehicle;
                }
                ack.Writer.Write(vehicle.CarID);
                ack.Writer.Write(vehicle.CarType);
                ack.Writer.Write(vehicle.BaseColor);
                ack.Writer.Write(vehicle.Grade);
                ack.Writer.Write(vehicle.SlotType);
                ack.Writer.Write(vehicle.AuctionCnt);
                ack.Writer.Write(vehicle.Mitron);
                ack.Writer.Write(vehicle.Kmh);

                ack.Writer.Write(vehicle.Color);
                ack.Writer.Write(vehicle.Color2);
                ack.Writer.Write(vehicle.MitronCapacity);
                ack.Writer.Write(vehicle.MitronEfficiency);
                ack.Writer.Write(vehicle.AuctionOn);
                ack.Writer.Write(vehicle.SBBOn);
            }
            packet.Sender.Send(ack);

            /*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 cars = Rice.Game.Vehicle.Retrieve(character.CID);
             *
             * var ackStruct = new Structures.LoadCharAck
             * {
             *  CharInfo = character.GetInfo(),
             *  nCarSize = (uint)cars.Count,
             *  CarInfo = cars,
             * };
             * ack.Writer.Write(ackStruct);
             *
             * packet.Sender.Send(ack);
             * Log.WriteLine("Sent LoadCharAck");*/
        }
Beispiel #3
0
        public static void Handle(Packet packet)
        {
            /*
             * struct __cppobj __unaligned __declspec(align(2)) BS_PktETCInfo : BS_PktBody
             * {
             * int m_IsPcBang;
             * int m_NumPCBangCoupon;
             * int m_reserve[32];
             * };
             */

            var loadCharThreadPacket = new LoadCharThreadPacket(packet);

            var character = CharacterModel.Retrieve(GameServer.Instance.Database.Connection, loadCharThreadPacket.CharacterName);

            if (character == null)
            {
                packet.Sender.KillConnection("Invalid character selected.");
                return;
            }

            // Even though we set it already it does seem to not work for some reason.
            //var team = TeamModel.Retrieve(GameServer.Instance.Database.Connection, character.TeamId);

            /*
             * character.TeamId = team.TeamId;
             * character.TeamName = team.TeamName;
             * character.TeamMarkId = team.TeamMarkId;
             * character.TeamCloseDate = (int) team.CloseDate;
             * character.TeamRank = 1;*/// <-- This all get set by CharacterModel already.

            var user = AccountModel.Retrieve(GameServer.Instance.Database.Connection, character.Uid);

            AccountModel.SetActiveCharacter(GameServer.Instance.Database.Connection, user, character.Id);

            packet.Sender.User = user;
            packet.Sender.User.ActiveCharacterId = character.Id;
            packet.Sender.User.ActiveCharacter   = character;
            packet.Sender.User.ActiveCharacter.ActiveCar.CarId = character.ActiveVehicleId;
            //packet.Sender.User.ActiveCharacter.Team = team;
            packet.Sender.User.Characters = AccountModel.RetrieveCharacters(GameServer.Instance.Database.Connection, user.Id);
            //packet.Sender.User.Characters = CharacterModel.RetrieveUser(GameServer.Instance.Database.Connection, user.Id);

            var vehicles = VehicleModel.Retrieve(GameServer.Instance.Database.Connection, character.Id);

            if (packet.Sender.User.Permission >= UserPermission.Administrator)
            {
                character.PartyType = 65;
            }

            packet.Sender.User.ActiveCharacter.ActiveCar = vehicles.Find(vehicle => vehicle.CarId == character.ActiveVehicleId);
            var ack = new LoadCharThreadAnswer()
            {
                ServerId        = 0,
                ServerStartTime = 0,
                Character       = character,
                Vehicles        = vehicles.ToArray(),
                CurrentCarId    = (int)character.ActiveVehicleId,
            };

            packet.Sender.Send(ack.CreatePacket());

            packet.Sender.Send(new StatUpdateAnswer()
            {
                StatisticInfo = new XiStrStatInfo()
                {
                    BasedAccel   = 0,
                    BasedBoost   = 0,
                    BasedCrash   = 0,
                    BasedSpeed   = 0,
                    CharAccel    = 0,
                    CharBoost    = 0,
                    CharCrash    = 0,
                    CharSpeed    = 0,
                    EquipAccel   = 0,
                    EquipBoost   = 0,
                    EquipCrash   = 0,
                    EquipSpeed   = 0,
                    ItemUseAccel = 0,
                    ItemUseBoost = 0,
                    ItemUseCrash = 0,
                    ItemUseSpeed = 0,
                    TotalAccel   = 0,
                    TotalBoost   = 0,
                    TotalCrash   = 0,
                    TotalSpeed   = 0,
                },
                EnchantBonus = new XiStrEnchantBonus()
                {
                    Speed            = 0,
                    Crash            = 0,
                    Accel            = 0,
                    Boost            = 0,
                    AddSpeed         = 0,
                    Drop             = 0.0f,
                    Exp              = 0.0f,
                    MitronCapacity   = 0.0f,
                    MitronEfficiency = 0.0f
                }
            }.CreatePacket());

            /*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 cars = Rice.Game.Vehicle.Retrieve(character.CID);
             *
             * var ackStruct = new Structures.LoadCharAck
             * {
             *  CharInfo = character.GetInfo(),
             *  nCarSize = (uint)cars.Count,
             *  CarInfo = cars,
             * };
             * ack.Writer.Write(ackStruct);
             *
             * packet.Sender.Send(ack);
             * Log.WriteLine("Sent LoadCharAck");*/

            /* Pulled from Rice:
             * var stat = new RicePacket(760); // StatUpdate
             * for (int i = 0; i < 16; ++i)
             *  stat.Writer.Write(0);
             * stat.Writer.Write(1000);
             * stat.Writer.Write(9001);
             * stat.Writer.Write(9002);
             * stat.Writer.Write(9003);
             * stat.Writer.Write(new byte[76]);
             * packet.Sender.Send(stat);
             */
        }