using Cal.DataTable; using System; using System.Collections.Generic; using System.Text; namespace ET { public class ChangeMapEvent : AEvent { 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(); 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 listComponent = ListComponent.Create(); LinkedList 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.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); } } } }