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

85 lines
3.0 KiB
C#

using Cal.DataTable;
using System;
using System.Collections.Generic;
using System.Text;
namespace ET
{
public class BackHomeEvent: AEvent<EventType.BackMainCity>
{
public override async ETTask Run(EventType.BackMainCity args)
{
Unit unit = args.unit;
if (!unit.IsTeamLeader)
{
MessageHelper.SendActor(unit, new M2C_SendTip() { Message = "您不是队长,无法回城" });
return;
}
bool isInCity = unit.GetComponent<UnitScene>().MapId / 100 == Sys_SceneId.Scene_MainCity;
if (isInCity)
return;
Sys_Scene targetSceneInfo = MapSceneComponent.Instance.GetMapInfo(Sys_SceneId.Scene_MainCity);
Sys_Scene.PlayerPos position = targetSceneInfo.PlayerPosArr[0];
Team team = TeamComponent.Instance.Get(unit.TeamLeaderId);
if (team == null)
{
Log.Error(" team == null");
return;
}
if (!args.isForce)
{
PlayerData data = unit.GetComponent<PlayerData>();
if (team.TeamState == TeamState.Fight || data.IsBattleIdle)
{
MessageHelper.SendActor(unit, new M2C_SendTip() { Message = "战斗中,无法回城" });
return;
}
}
team.ChangeState(TeamState.Transfer);
using ListComponent<ETTask> listComponent = ListComponent<ETTask>.Create();
LinkedList<Unit> teamList = team.GetUnits();
foreach (Unit item in teamList)
{
listComponent.List.Add(Transfer(item, new UnityEngine.Vector2(position.PlayerPos_x, position.PlayerPos_y),
Sys_SceneId.Scene_MainCity * 100 + 1, isInCity));
}
static async ETTask Transfer(Unit item, UnityEngine.Vector2 pos, int mapId, bool isInCity)
{
try
{
item.IsTransfer = true;
//!停止移动
item.Stop();
long itemInsatnceId = item.InstanceId;
await TimerComponent.Instance.WaitAsync(100);
if (item.InstanceId != itemInsatnceId)
return;
UnitScene unitScene = item.GetComponent<UnitScene>();
unitScene.Position = pos;
if (isInCity) return;
await MapSceneComponent.Instance.ChangeMap(unitScene, mapId);
}
catch (Exception e)
{
Log.Error(e);
}
}
await ETTaskHelper.WaitAll(listComponent.List);
await TimerComponent.Instance.WaitAsync(1000);
team.ChangeState(TeamState.None);
foreach (Unit u in teamList)
{
u.IsTransfer = false;
}
TeamHelper.SendTeamMember(team);
}
}
}