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); }
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");*/ }
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); */ }