using ET.EventType; using System; using System.Collections.Generic; namespace ET { public class MapSceneAwakeSystem: AwakeSystem { public override void Awake(MapScene self) { self.Init(); self.UnitDic.Clear(); } } public static class MapSceneSystem { private const int Max_Tier_Count_Per_Map = 20; public static void Init(this MapScene self) { self.tierDic.Clear(); for (int i = 1; i <= Max_Tier_Count_Per_Map; i++) { //!Tier 没有其他逻辑 self.tierDic.Add(i, new Tier()); } } public static Tier GetTier(this MapScene self, int tierId) { self.tierDic.TryGetValue(tierId, out Tier tier); return tier; } public static void AddUnit(this MapScene self, Unit unit) { try { MapUnitComponent.Instance.Add(unit); self.UnitDic[unit.Id] = unit; unit.Parent = self; } catch (Exception e) { Log.Error(e); } } public static bool RemoveUnit(this MapScene self, Unit unit) { MapUnitComponent.Instance.Remove(unit.Id); return self.UnitDic.Remove(unit.Id); } public static async ETTask Enter(this MapScene self, Unit unit, bool isReEnter = false) { if (unit.UnitType != UnitType.Player) { self.AddUnit(unit); return; } Game.EventSystem.Publish(new ET.EventType.OnEnterMap { unit = unit }).Coroutine(); UnitScene unitScene = unit.GetComponent(); int tierId = 0; Tier tier = null; if (!isReEnter) { bool isEnter = false; do { tierId++; tier = self.GetTier(tierId); if (tier == null) { break; } if (tier.CanAdd()) isEnter = true; } while (!isEnter); unitScene.TierId = tierId; } using (var listComponent = ListComponent.Create()) { IEnumerable unitList = self.GetTierAll(tierId); if (unitList != null) listComponent.List.AddRange(unitList); //广播 foreach (Unit u in listComponent.List) { try { if (!u) continue; BrocastMessage(unit, u).Coroutine(); } catch (Exception e) { Log.Error(e); } } static async ETVoid BrocastMessage(Unit enterUnit, Unit targetUnit) { M2C_EnterMap m2C_EnterMap = new M2C_EnterMap { UnitInfo = new UnitPosInfo(), }; //!加入到其他玩家的aoi列表 targetUnit.GetComponent()?.Add(enterUnit); //!其他玩家加入到刚进入的aoi列表 enterUnit.GetComponent()?.Add(targetUnit); UnitHelper.SetUnitInfo(enterUnit, m2C_EnterMap.UnitInfo); m2C_EnterMap.PvpUnitCharacter = await CharacterHelper.GetUnitCharacter(enterUnit); MessageHelper.SendActor(targetUnit, m2C_EnterMap); } //发送场景中已有的玩家 M2C_UnitsInMap unitsInMap = new M2C_UnitsInMap(); using (var taskList = ListComponent.Create()) { foreach (Unit u in listComponent.List) { try { if (!u) continue; taskList.List.Add(GetUnitInfo(u, unitsInMap)); } catch (Exception e) { Log.Error(e); } } static async ETTask GetUnitInfo(Unit u, M2C_UnitsInMap unitsInMap) { UnitPosInfo unitInfo = new UnitPosInfo(); UnitHelper.SetUnitInfo(u, unitInfo); unitsInMap.Units.Add(unitInfo); unitsInMap.PvpUnits.Add(await CharacterHelper.GetUnitCharacter(u)); } await ETTaskHelper.WaitAll(taskList.List); MessageHelper.SendActor(unit, unitsInMap); } if (!isReEnter) BattleHelper.UpdateChangeMapTaskStateEvent(unitScene, listComponent.List); } if (!isReEnter) { if (tier != null) tier.Add(unit); self.AddUnit(unit); } // if (AppConfig.inst.isTest) // Log.Debug($"【进入】{unit.ToCustomString()}进入地图[{self.mapId / 100}][{self.mapId % 100}]的{tierId}线,当前线玩家:{unitList.ToCustomString()}"); //!触发通关任务事件 Game.EventSystem.Publish(new ET.EventType.AfterChangeMap { unit = unit, mapId = self.mapId }).Coroutine(); } public static IEnumerable GetAll(this MapScene self) { return self.UnitDic.Values; } public static IEnumerable GetTierAll(this MapScene self, int tierId) { if (self.GetTier(tierId) is { } tier) { return tier.GetAll(); } return null; } public static bool ChangeTier(this MapScene self, Unit unit, int tierId) { UnitScene unitScene = unit.GetComponent(); if (self.GetTier(tierId) is { } tier) { if (tier.CanAdd()) { tier.Add(unit); self.GetTier(unitScene.TierId).Remove(unit.Id); return true; } } return false; } public static void Leave(this MapScene self, Unit unit, bool isOffLine = false) { if (unit.UnitType != UnitType.Player) { self.RemoveUnit(unit); return; } if (!self.RemoveUnit(unit)) { return; } try { UnitScene unitScene = unit.GetComponent(); int tierId = unitScene.TierId; self.GetTier(tierId).Remove(unit.Id); IEnumerable unitList = self.GetTierAll(tierId); // if (AppConfig.inst.isTest) // Log.Debug($"【离开】{unit.ToCustomString()}离开地图[{self.mapId / 100}][{self.mapId % 100}]的{tierId}线,剩余线玩家:{unitList.ToCustomString()}"); //广播 using var listComponent = ListComponent.Create(); listComponent.List.AddRange(unitList); foreach (Unit u in listComponent.List) { try { if (!u) continue; //!离开其他玩家的aoi列表 u.GetComponent()?.Remove(unit.Id); //!其他玩家离开的aoi列表 unit.GetComponent()?.Remove(u.Id); MessageHelper.SendActor(u, new M2C_LeaveMap() { UnitId = unit.Id }); } catch (Exception e) { Log.Error(e); } } } catch (Exception e) { Log.Error(e); } } } }