using Fantasy; using Fantasy.Async; namespace NB.Map; public static class MapUnitManageComponentSystem { #region 上线下线 /// /// 玩家上线 /// /// /// /// /// public static async FTask Online(this MapUnitManageComponent self, Scene scene, long accountId, long gateRouteId) { if (!self.TryGet(accountId, out var unit)) { unit = MapUnitFactory.Create(scene, accountId); self.Add(unit); } if (unit != null) { unit.GateRouteId = gateRouteId; } await FTask.CompletedTask; return unit; } public static async FTask Offline(this MapUnitManageComponent self, Scene scene, long accountId, long gateRouteId) { if (self.TryGet(accountId, out var unit) && unit != null) { if (unit.GateRouteId == gateRouteId) { self.Remove(accountId); //如果当前网关和下线的网关一致 } } await FTask.CompletedTask; } #endregion #region 获取&移除 public static void Add(this MapUnitManageComponent self, MapUnit unit) { self.Units.Add(unit.Id, unit); } public static MapUnit? Get(this MapUnitManageComponent self, long accountId) { return self.Units.GetValueOrDefault(accountId); } public static bool TryGet(this MapUnitManageComponent self, long accountId, out MapUnit? unit) { return self.Units.TryGetValue(accountId, out unit); } public static void Remove(this MapUnitManageComponent self, long accountId, bool isDispose = true) { if (!self.Units.Remove(accountId, out var account)) { return; } if (!isDispose) { return; } account.Dispose(); } #endregion }