using System; using System.Collections.Generic; using System.Text; using Cal.DataTable; using MongoDB.Bson; using UnityEngine; namespace ET { public class UnitHelper { public static async ETTask Query(Entity domain, long id) { try { Unit unit = EntityFactory.CreateWithId(domain, id); PlayerData data = await DBComponent.Instance.Query(id); if (data) unit.AddComponent(data); Character character = await DBComponent.Instance.Query(id); if (character) unit.AddComponent(character); NumericComponent num = await DBComponent.Instance.Query(id); if (num) unit.AddComponent(num); UnitSkillComponent unitSkill = await DBComponent.Instance.Query(id); if (unitSkill) unit.AddComponent(unitSkill); //!玩家设置 UserSetting setting = await DBComponent.Instance.Query(id); if (setting) unit.AddComponent(setting); //!任务 UnitTask unitTask = await DBComponent.Instance.Query(id); if (unitTask) unit.AddComponent(unitTask); //!背包 Bag bag = await DBComponent.Instance.Query(id); if (bag) unit.AddComponent(bag); UnitScene unitScene = await DBComponent.Instance.Query(id); if (unitScene) unit.AddComponent(unitScene); StarSoulBag starSoulBag = await DBComponent.Instance.Query(id); if (starSoulBag) unit.AddComponent(starSoulBag); Pet pet = await DBComponent.Instance.Query(id); if (pet) unit.AddComponent(pet); unit.AddComponent(); return unit; } catch (Exception e) { Log.Error(e); } return null; } public static async ETTask Query(int zone, long id) where T : Entity { try { long mapInstanceId = StartSceneConfigCategory.Instance.GetBySceneName(zone, SceneType.UserCache.ToString()).SceneId; U2M_GetComponent getComponent = (U2M_GetComponent) await MessageHelper.CallActor(mapInstanceId, new M2U_GetComponent() { UserId = id, type = typeof (T).Name }); if (getComponent.component == null) return null; T t = getComponent.component as T; return t; } catch (Exception e) { Log.Error(e); } return null; } public static void Save(Unit unit) where T : Entity { Entity entity = unit.GetComponent(); if(entity==null) return; int zone = entity.DomainZone(); if (zone == 0) { zone = 1; } long mapInstanceId = StartSceneConfigCategory.Instance.GetBySceneName(zone, SceneType.UserCache.ToString()).SceneId; MessageHelper.SendActor(mapInstanceId, new M2U_WriteComponent() { Id = entity.Id, type = typeof (T).Name, component = entity }); } public static void SaveComponenet(T t) where T : Entity { int zone = t.DomainZone(); if (zone == 0) { zone = 1; } long mapInstanceId = StartSceneConfigCategory.Instance.GetBySceneName(zone, SceneType.UserCache.ToString()).SceneId; MessageHelper.SendActor(mapInstanceId, new M2U_WriteComponent() { Id = t.Id, type = typeof (T).Name, component = t }); } public static void SaveComponenet(int zone, T t) where T : Entity { if (zone == 0) { zone = 1; } // await DBComponent.Instance.Save(t); long mapInstanceId = StartSceneConfigCategory.Instance.GetBySceneName(zone, SceneType.UserCache.ToString()).SceneId; MessageHelper.SendActor(mapInstanceId, new M2U_WriteComponent() { Id = t.Id, type = typeof (T).Name, component = t }); } /// /// 设置位置信息以及人物信息 /// /// /// /// public static void SetUnitInfo(Unit unit, UnitPosInfo unitInfo) { UnitScene unitScene = unit.GetComponent(); if (unitScene == null) { Log.Error($"unitScene == null where id = {unit.Id}"); return; } unitInfo.X = unitScene.X; unitInfo.Y = unitScene.Y; unitInfo.YAngle = unitScene.YAngle; } public static async ETTask AddComponentFromDB(Unit unit, int jobId) { int zone = unit.DomainZone(); long id = unit.Id; //!玩家数据 var data = await UnitHelper.Query(zone, id); if (data == null) { data = unit.AddComponent(); data.IsNew = true; data.UpdateMinstoryRecord(Sys_SceneId.Scene_MainStory1 - 1); data.SkillPointKV = new KeyValuePair(1, 1); } else unit.AddComponent(data); Character character = await UnitHelper.Query(zone, id); if (character == null) character = unit.AddComponent(); else unit.AddComponent(character); var num = await UnitHelper.Query(zone, id); if (num == null) { num = unit.AddComponent(); CharacterHelper.InitData(num); num.Set(NumericType.SkinId, jobId); num.Set(NumericType.Energy, 1000); } else unit.AddComponent(num); //!exp int energy = num.GetAsInt(NumericType.Energy); data.ForbidExp = energy <= 0; UnitSkillComponent unitSkill = await UnitHelper.Query(zone, id); if (unitSkill == null) { unitSkill = unit.AddComponent(); JobType jobType = JobHelper.GetJobType(jobId); unitSkill.InitSkill(jobType); } else unit.AddComponent(unitSkill); //!玩家设置 UserSetting setting = await UnitHelper.Query(zone, id); if (setting == null) { setting = unit.AddComponent(); } else unit.AddComponent(setting); setting.SetCD(MathHelper.RoundToInt(CharacterHelper.GetSkillCD(num.Get(NumericType.Spd)))); //!宠物 Pet pet = await UnitHelper.Query(zone, id); if (pet == null) { pet = unit.AddComponent(); } else unit.AddComponent(pet); if (pet.petId == 0) { pet.petId = 2101; } UnitScene unitScene = await UnitHelper.Query(zone, id); if (unitScene == null) { unitScene = UnitSceneFactory.Create(Game.Scene, id, new Vector2(0, 0), 0, Sys_SceneId.Scene_Beach * 100 + 1); unit.AddComponent(unitScene); } else unit.AddComponent(unitScene); //!任务 UnitTask unitTask = await UnitHelper.Query(zone, id); if (unitTask == null) { unitTask = unit.AddComponent(); } else unit.AddComponent(unitTask); //!背包 Bag bag = await UnitHelper.Query(zone, id); if (bag == null) { bag = unit.AddComponent(); } else unit.AddComponent(bag); if (bag.ItemDic.Count == 0) { bag.InitBag(); } bag.CheckSlot(); Store store = await StoreComponent.Instance.Query(unit.Id); //!初始化仓库 if (store == null) StoreComponent.Instance.Init(unit.Id).Coroutine(); store.CheckSlot(); //!背包 StarSoulBag StarSoulBag = await UnitHelper.Query(zone, id); if (StarSoulBag == null) { StarSoulBag = unit.AddComponent(); } else unit.AddComponent(StarSoulBag); } public static async ETTask SendUnitInfo(Unit unit) { Log.Debug($"【{UserComponent.Instance.Get(unit.Id)?.NickName} ({unit.Id})】已经进入游戏"); PlayerData data = unit.GetComponent(); var num = unit.GetComponent(); CharacterHelper.ResetAddNumeric(unit, num); data.IsBattleIdle = false; UnitScene unitScene = unit.GetComponent(); if (unitScene == null) { Log.Error($"unitScene == null where id = {unit.Id}"); return; } if (unitScene.MapId / 100 == Sys_SceneId.Scene_BattleIdle) { unitScene.MapId = Sys_SceneId.Scene_MainCity * 100 + 1; } //!+任务相关 //!+发送Boss消息 Game.EventSystem.Publish(new EventType.AfterEnterGame() { unit = unit }); } } }