using KianaBH.Data; using KianaBH.Database; using KianaBH.Database.Account; using KianaBH.Database.Client; using KianaBH.Database.Player; using KianaBH.GameServer.Game.Avatar; using KianaBH.GameServer.Game.Battle; using KianaBH.GameServer.Game.Inventory; using KianaBH.GameServer.Server; using KianaBH.KcpSharp; using KianaBH.Util.Extensions; namespace KianaBH.GameServer.Game.Player; public class PlayerInstance(PlayerData data) { public AvatarManager? AvatarManager { get; private set; } public InventoryManager? InventoryManager { get; private set; } public static readonly List _playerInstances = []; public PlayerData Data { get; set; } = data; public ClientData? ClientData { get; private set; } public GuideData? GuideData { get; private set; } public WorldChatManager? WorldChatManager { get; private set; } public int Uid { get; set; } public Connection? Connection { get; set; } public bool Initialized { get; set; } public bool IsNewPlayer { get; set; } public int GetMissionDataRequestCount = 0; #region Initializers public PlayerInstance(int uid) : this(new PlayerData { Uid = uid }) { // new player IsNewPlayer = true; Data.Name = AccountData.GetAccountByUid(uid)?.Username; DatabaseHelper.CreateInstance(Data); var t = Task.Run(async () => { await InitialPlayerManager(); await AvatarManager!.AddAvatar(101); GuideData?.GuideFinishList.AddRange(GameData.TutorialData.Values.Select(x => x.Id)); }); t.Wait(); Initialized = true; } private async ValueTask InitialPlayerManager() { Uid = Data.Uid; AvatarManager = new AvatarManager(this); InventoryManager = new InventoryManager(this); ClientData = InitializeDatabase(); GuideData = InitializeDatabase(); WorldChatManager = new WorldChatManager(this); Data.LastActiveTime = Extensions.GetUnixSec(); await Task.CompletedTask; } public T InitializeDatabase() where T : BaseDatabaseDataHelper, new() { var instance = DatabaseHelper.GetInstanceOrCreateNew(Uid); return instance!; } #endregion #region Network public async ValueTask OnGetToken() { if (!Initialized) await InitialPlayerManager(); } public async ValueTask OnLogin() { _playerInstances.Add(this); await Task.CompletedTask; } public static PlayerInstance? GetPlayerInstanceByUid(long uid) => _playerInstances.FirstOrDefault(player => player.Uid == uid); public void OnLogoutAsync() { _playerInstances.Remove(this); } public async ValueTask SendPacket(BasePacket packet) { if (Connection?.IsOnline == true) await Connection.SendPacket(packet); } #endregion #region Actions public async ValueTask OnHeartBeat() { DatabaseHelper.ToSaveUidList.SafeAdd(Uid); await Task.CompletedTask; } #endregion #region Serialization public Proto.GetMainDataRsp ToProto() { return Data.ToProto(); } #endregion }