CTT/Server/Hotfix/Game/Event/UnitOffLineEvent.cs

93 lines
3.2 KiB
C#

using ET.EventType;
using System;
using System.Collections.Generic;
namespace ET
{
public class UnitOffLineEvent : AEvent<EventType.UnitOffline>
{
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).Coroutine();
}
//移除本地Actor
await unit.RemoveLocation();
//退出队伍
TeamComponent.Instance.DestroyTeam(unit);
try
{
//销毁之前保存buff
BuffLib lib = await BuffLibComponent.Instance.Query(unit.Id);
IEnumerable<GoodsEffect> 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)
{
await UnitHelper.Save<PlayerData>(unit);
await UnitHelper.Save<NumericComponent>(unit);
await UnitHelper.Save<Character>(unit);
await UnitHelper.Save<Bag>(unit);
await UnitHelper.Save<UnitTask>(unit);
await UnitHelper.Save<UnitScene>(unit);
await UnitHelper.Save<UserSetting>(unit);
await UnitHelper.Save<UnitSkillComponent>(unit);
await UnitHelper.Save<Pet>(unit);
await UnitHelper.Save<StarSoulBag>(unit);
}
}
}
}