using ET.EventType; using System; using System.Collections.Generic; namespace ET { public class UnitOffLineEvent : AEvent { public override async ETTask Run(UnitOffline args) { try { Unit unit = args.unit; Log.Debug($"玩家Id=【{unit.Id}】下线开始"); User user = UserComponent.Instance.Get(unit.Id); //保存玩家单位 await SaveUnit(unit); if (user == null) { Log.ErrorDetail($"user == null where id = {unit.Id}"); } else { user.lastLoginTime = TimeHelper.ClientNow(); UserComponent.Instance.Save(user); } //移除本地Actor await unit.RemoveLocation(); //退出队伍 TeamComponent.Instance.DestroyTeam(unit); try { //销毁之前保存buff BuffLib lib = await BuffLibComponent.Instance.Query(unit.Id); IEnumerable goodsBuffList = GoodsEffectComponent.Instance.GetAllEffect(unit.Id); if (goodsBuffList != null) foreach (GoodsEffect item in goodsBuffList) { //!排除非时间性goodsBuff效果 if (item.BuffEndTime != 0) lib.goodsEffectBuffDic[(int)item.GoodsBase.Id] = item.BuffEndTime; } BuffLibComponent.Instance.Save(lib).Coroutine(); } catch (Exception e) { Log.Error(e); } //从地图中移除 try { unit.GetMap()?.Leave(unit); } catch (Exception e) { Log.Error(e); } //单元管理器移除 UserComponent.Instance.Remove(unit.Id); unit.Dispose(); Log.Debug($"玩家Id=【{unit.Id}】下线完成"); } catch (Exception e) { Log.Error(e); } } private async ETTask SaveUnit(Unit unit) { if (!unit) return; if (unit.UnitType != UnitType.Player) return; Team team = TeamComponent.Instance.Get(unit.Id); if (team?.TeamState != TeamState.Fight) { UnitHelper.Save(unit); UnitHelper.Save(unit); UnitHelper.Save(unit); UnitHelper.Save(unit); UnitHelper.Save(unit); UnitHelper.Save(unit); UnitHelper.Save(unit); UnitHelper.Save(unit); UnitHelper.Save(unit); UnitHelper.Save(unit); } } } }