88 lines
3.3 KiB
C#
Executable File
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);
|
|
}
|
|
}
|
|
}
|
|
}
|