using System; using System.Collections.Generic; using Cal.DataTable; using UnityEngine; namespace ET { [ActorMessageHandler] public class G2M_CreateUnitHandler : AMActorRpcHandler { protected override async ETTask Run(Scene scene, G2M_CreateUnit request, M2G_CreateUnit response, Action reply) { try { Log.Debug($"*********************************************************UserId = {request.PlayerId} 开始进入游戏"); bool isNewUser = false; User user = UserComponent.Instance.Get(request.PlayerId); if (user == null) { isNewUser = true; user = await UserComponent.Instance.Query(request.PlayerId); } if (user == null) { response.Message = $"没有这个玩家"; Log.Error($"服务器没有这个玩家Id={ request.PlayerId}"); reply(); return; } if (!await CheckChangeDB(user)) { response.Message = $"数据调整完毕,请重新登录"; reply(); return; } Unit unit = MapUnitComponent.Instance.Get(user.Id); long id = user.Id; NumericComponent num; PlayerData data; bool isOnline = false; if (unit) { isOnline = true; unit.isAgainOnLine = true; unit.IsOffline = false; Log.Debug($"【{ UserComponent.Instance.Get(unit.Id)?.NickName} ({ unit.Id})】 断线之后重新进入游戏了"); num = unit.GetComponent(); data = unit.GetComponent(); unit.RemoveComponent(); unit.AddComponent(request.GateSessionId); TeamComponent.Instance.Get(unit.TeamLeaderId); } else { Log.Debug($"【{request.PlayerId}】 新进入游戏"); unit = EntityFactory.CreateWithId(scene, user.Id, UnitType.Player); unit.isAgainOnLine = false; user.SkinId = 0; //!移动 unit.AddComponent(); unit.AddComponent(); unit.AddComponent(); //!属性 JobType jobType = JobHelper.GetJobType(user.JobId); //!玩家数据 data = await DBComponent.Instance.Query(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 DBComponent.Instance.Query(id); if (character == null) character = unit.AddComponent(); else unit.AddComponent(character); num = await DBComponent.Instance.Query(id); if (num == null) { num = unit.AddComponent(); CharacterHelper.InitData(num); num.Set(NumericType.SkinId, user.JobId); num.Set(NumericType.Energy, 1000); } else unit.AddComponent(num); //!exp int energy = num.GetAsInt(NumericType.Energy); data.ForbidExp = energy<=0; UnitSkillComponent unitSkill = await DBComponent.Instance.Query(id); if (unitSkill == null) { unitSkill = unit.AddComponent(); unitSkill.InitSkill(jobType); } else unit.AddComponent(unitSkill); //!玩家设置 UserSetting setting = await DBComponent.Instance.Query(id); if (setting == null) { setting = unit.AddComponent(); } else unit.AddComponent(setting); setting.SetCD(MathHelper.RoundToInt(CharacterHelper.GetSkillCD(num.Get(NumericType.Spd)))); //!自动技能AI unit.AddComponent(); unit.AddComponent(); unit.AddComponent(); unit.AddComponent(); //!通讯相关 unit.AddComponent(); await unit.AddLocation(); UserGateComponent unitGate = unit.AddComponent(request.GateSessionId); BrocastComponent brocastComponent = unit.AddComponent(true); //!宠物 Pet pet = await DBComponent.Instance.Query(id); if (pet == null) { pet = unit.AddComponent(); } else unit.AddComponent(pet); if (pet.petId == 0) { pet.petId = 2101; } UnitScene unitScene = await DBComponent.Instance.Query(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); MapScene map = unit.GetMapByUnitScene(); await map.Enter(unit); //!队伍 TeamComponent.Instance.CreateTeam(unit.Id); //!战斗组件 unit.AddComponent().BattleType = BattleType.None; unit.AddComponent(); unit.AddComponent(); //!任务 UnitTask unitTask = await DBComponent.Instance.Query(id); if (unitTask == null) { unitTask = unit.AddComponent(); } else unit.AddComponent(unitTask); //!背包 Bag bag = await DBComponent.Instance.Query(id); if (bag == null) { bag = unit.AddComponent(); } else unit.AddComponent(bag); //!背包 StarSoulBag StarSoulBag = await DBComponent.Instance.Query(id); if (StarSoulBag == null) { StarSoulBag = unit.AddComponent(); } else unit.AddComponent(StarSoulBag); Store store = await StoreComponent.Instance.Query(unit.Id); //!初始化仓库 if (store == null) StoreComponent.Instance.Init(unit.Id).Coroutine(); if (bag.ItemDic.Count == 0) { bag.InitBag(); } store.CheckSlot(); bag.CheckSlot(); Combat combat = unit.AddComponent(); Game.EventSystem.Change(pet); //unit.AddComponent().InitNodes(new AINode[] {new FollowTeamLeaderNode(),new IdleNode()/*, new BuyInShopNode(), new MoveToCityTransPointNode(), new BackHomeNode()*/ }); } Log.Debug($"【{ UserComponent.Instance.Get(unit.Id)?.NickName} ({ unit.Id})】 组件添加完毕"); if (user.SkinId == 0) { user.SkinId = num.GetAsInt(NumericType.SkinId); } if (isNewUser) UserComponent.Instance.Add(user); if (isNewUser) UserComponent.Instance.Save(user).Coroutine(); response.IsOnLine = isOnline; reply(); CharacterHelper.SyncNumeric(unit); CharacterHelper.RecoverUnit(unit); Log.Debug($"【{ UserComponent.Instance.Get(unit.Id)?.NickName} ({ unit.Id})】请求进入地图完成"); } catch (System.Exception e) { Log.Error(e); } } private async ETTask CheckChangeDB(User user) { if (user.isChangeDB) return true; Log.Warning($"开始修改{user.Id}的数据"); Unit unit = await DBComponent.Instance.Query(user.Id); if (unit == null) return false; unit.Domain = Game.Scene; PlayerData data = unit.GetComponent(); Character character = unit.GetComponent(); NumericComponent num = unit.GetComponent(); UnitSkillComponent unitSkill = unit.GetComponent(); UserSetting setting = unit.GetComponent(); UnitTask unitTask = unit.GetComponent(); Bag bag = unit.GetComponent(); UnitScene unitScene = unit.GetComponent(); if (unitScene == null) unitScene = EntityFactory.CreateWithId(Game.Scene, user.Id); unitScene.Id = user.Id; await DBComponent.Instance.Save(data); await DBComponent.Instance.Save(character); await DBComponent.Instance.Save(num); await DBComponent.Instance.Save(unitSkill); await DBComponent.Instance.Save(setting); await DBComponent.Instance.Save(unitTask); await DBComponent.Instance.Save(bag); await DBComponent.Instance.Save(unitScene); unit.Dispose(); user.isChangeDB = true; await DBComponent.Instance.Save(user); return false; } } }