zxl
/
CTT
forked from Cal/CTT
1
0
Fork 0
CTT/Server/Hotfix/Game/Event/ChangeMapEvent.cs

88 lines
3.3 KiB
C#
Executable File

using Cal.DataTable;
using System;
using System.Collections.Generic;
using System.Text;
namespace ET
{
public class ChangeMapEvent : AEvent<EventType.ChangeMap>
{
public override async ETTask Run(EventType.ChangeMap args)
{
try
{
Unit unit = args.unit;
int mapId = args.mapId;
if (!unit.IsTeamLeader)
{
MessageHelper.SendActor(unit, new M2C_SendTip() { Message = "您不是队长,无法传送" });
return;
}
UnitScene _unitScene = unit.GetComponent<UnitScene>();
Sys_Scene targetSceneInfo = MapSceneComponent.Instance.GetMapInfo(mapId / 100);
Sys_Scene.PlayerPos position = targetSceneInfo.PlayerPosArr[0];
Team team = TeamComponent.Instance.Get(unit.TeamLeaderId);
if (team == null)
{
Log.Error(" team == null");
return;
}
long oldTeamInstance = team.InstanceId;
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),mapId));
}
static async ETTask Transfer(Unit item,UnityEngine.Vector2 pos,int mapId)
{
try
{
item.IsTransfer = true;
UnitScene unitScene = item.GetComponent<UnitScene>();
unitScene.enterTime = TimeHelper.ClientNow();
//!停止移动
item.Stop();
long oldUnitSceneId = unitScene.InstanceId;
await TimerComponent.Instance.WaitAsync(500);
if (oldUnitSceneId != unitScene.InstanceId)
{
Log.Error($"unitScene instanceId is not same old:{oldUnitSceneId} new:{unitScene.InstanceId}");
return;
}
unitScene.Position = pos;
await MapSceneComponent.Instance.ChangeMap(unitScene, mapId);
}
catch (Exception e)
{
Log.Error(e);
}
}
await ETTaskHelper.WaitAll(listComponent.List);
await TimerComponent.Instance.WaitAsync(1000);
if (team.InstanceId != oldTeamInstance)
{
Log.Error($"team instanceId is not same old:{oldTeamInstance} new:{team.InstanceId}");
return;
}
team.ChangeState(TeamState.None);
foreach (Unit u in teamList)
{
u.IsTransfer = false;
}
TeamHelper.SendTeamMember(team);
}
catch (Exception e)
{
Log.Error(e);
}
}
}
}