public static bool TryGetAimedBlock(IMyPlayer player, out MyTextPanel panel) { panel = null; if (player == null) { return(false); } var character = ((MyCharacter)player.Character); if (character == null) { return(false); } if (!GridCache.TryGetGridById(character.AimedGrid, out var aimedGrid)) { return(false); } var aimedBlock = aimedGrid.GetCubeBlock(character.AimedBlock); if (aimedBlock.FatBlock is MyTextPanel txtPanel && Block.IsOwner(aimedBlock, player.IdentityId)) { panel = txtPanel; } return(panel != null); }
public static void IncreaseCount(MyCubeBlockDefinition def, long playerId, int amount = 1, long gridId = 0) { if (!BlockLimiterConfig.Instance.EnableLimits) { return; } var faction = MySession.Static.Factions.GetPlayerFaction(playerId); foreach (var limit in Limits) { if (!limit.IsMatch(def)) { continue; } var foundGrid = GridCache.TryGetGridById(gridId, out var grid); if (foundGrid && !limit.IsGridType(grid)) { limit.FoundEntities.Remove(gridId); continue; } if (limit.IgnoreNpcs) { if (MySession.Static.Players.IdentityIsNpc(playerId)) { continue; } if (foundGrid && MySession.Static.Players.IdentityIsNpc(GridCache.GetBuilders(grid).FirstOrDefault())) { continue; } } if (limit.LimitPlayers && playerId > 0) { limit.FoundEntities.AddOrUpdate(playerId, amount, (l, i) => i + amount); } if (limit.LimitGrids && gridId > 0) { limit.FoundEntities.AddOrUpdate(gridId, amount, (l, i) => i + amount); } if (limit.LimitFaction && faction != null) { limit.FoundEntities.AddOrUpdate(faction.FactionId, amount, (l, i) => i + amount); } } }
public static bool IsExcepted(long obj, List <string> exceptions) { var excepted = false; var allExceptions = new HashSet <string>(); allExceptions.UnionWith(exceptions); allExceptions.UnionWith(BlockLimiterConfig.Instance.GeneralException); if (allExceptions.Contains(obj.ToString())) { return(true); } var faction = MySession.Static.Factions.TryGetFactionById(obj); if (faction != null) { return(allExceptions.Contains(faction.Tag)); } var id = MySession.Static.Players.TryGetIdentity(obj); if (id != null) { var steamId = MySession.Static.Players.TryGetSteamId(obj); return((allExceptions.Contains(id.DisplayName)) || steamId > 0 && allExceptions.Contains(steamId.ToString())); } if (!GridCache.TryGetGridById(obj, out var grid)) { return(false); } if (allExceptions.Contains(grid.DisplayName)) { excepted = true; } if (grid.BigOwners.Any(x => allExceptions.Contains(x.ToString()))) { return(true); } return(excepted); }
public static bool IsSizeViolation(long id) { return(GridCache.TryGetGridById(id, out var grid) && IsSizeViolation(grid, false, out _)); }
public static bool IsWithinLimits(MyCubeBlockDefinition def, long ownerId, long gridId, int count = 1) { if (def == null || Math.Abs(ownerId + gridId) < 1) { return(true); } var ownerFaction = MySession.Static.Factions.GetPlayerFaction(ownerId); if (ownerId > 0 && Utilities.IsExcepted(ownerId, new List <string>()) || (ownerFaction != null && Utilities.IsExcepted(ownerFaction.FactionId, new List <string>())) || gridId > 0 && Utilities.IsExcepted(gridId, new List <string>())) { return(true); } var allow = true; foreach (var item in BlockLimiterConfig.Instance.AllLimits) { if (!item.BlockList.Any() || !IsMatch(def, item)) { continue; } if (ownerId > 0 && (Utilities.IsExcepted(ownerId, item.Exceptions) || ownerFaction != null && Utilities.IsExcepted(ownerFaction.FactionId, item.Exceptions) || gridId > 0 && Utilities.IsExcepted(gridId, item.Exceptions))) { continue; } if (item.Limit == 0 && (item.LimitGrids || item.LimitPlayers || item.LimitFaction)) { return(false); } if (item.LimitGrids && gridId > 0 && item.FoundEntities.TryGetValue(gridId, out var gCount)) { if (GridCache.TryGetGridById(gridId, out var grid) && Grid.IsGridType(grid, item)) { if (gCount + count > item.Limit) { allow = false; break; } } } if (ownerId > 0 && item.LimitPlayers && item.FoundEntities.TryGetValue(ownerId, out var pCount)) { if (pCount + count > item.Limit) { allow = false; break; } } if (ownerFaction == null || !item.LimitFaction || !item.FoundEntities.TryGetValue(ownerFaction.FactionId, out var fCount)) { continue; } { if (fCount + count <= item.Limit) { continue; } allow = false; break; } } return(allow); }
public static StringBuilder GetLimit(long playerId) { var sb = new StringBuilder(); if (playerId == 0) { sb.AppendLine("Player not found"); return(sb); } var limitItems = BlockLimiterConfig.Instance.AllLimits; if (limitItems.Count < 1) { sb.AppendLine("No limit found"); return(sb); } var playerFaction = MySession.Static.Factions.GetPlayerFaction(playerId); foreach (var item in limitItems) { if (item.BlockList.Count == 0 || item.FoundEntities.Count == 0) { continue; } var itemName = string.IsNullOrEmpty(item.Name) ? item.BlockList.FirstOrDefault() : item.Name; sb.AppendLine(); sb.AppendLine($"----->{itemName}<-----"); if (item.LimitPlayers && item.FoundEntities.TryGetValue(playerId, out var pCount)) { if (pCount < 1) { continue; } sb.AppendLine($"Player Limit = {pCount}/{item.Limit}"); } if (item.LimitFaction && playerFaction != null && item.FoundEntities.TryGetValue(playerFaction.FactionId, out var fCount)) { if (fCount < 1) { continue; } sb.AppendLine($"Faction Limit = {fCount}/{item.Limit} "); } if (!item.LimitGrids || (!item.FoundEntities.Any(x => GridCache.TryGetGridById(x.Key, out var grid) && Grid.IsOwner(grid, playerId)))) { continue; } sb.AppendLine("Grid Limits:"); foreach (var(id, gCount) in item.FoundEntities) { if (!GridCache.TryGetGridById(id, out var grid) || !Grid.IsOwner(grid, playerId)) { continue; } if (gCount < 1) { continue; } sb.AppendLine($"->{grid.DisplayName} = {gCount} / {item.Limit}"); } } return(sb); }
public static bool IsExcepted(object target, LimitItem limit = null) { if (target == null) { return(false); } HashSet <string> allExceptions = new HashSet <string>(); if (limit != null) { allExceptions = new HashSet <string>(limit.Exceptions); } allExceptions.UnionWith(BlockLimiterConfig.Instance.GeneralException); if (allExceptions.Count == 0) { return(false); } MyIdentity identity = null; MyFaction faction = null; long identityId = 0; ulong playerSteamId = 0; string displayName = ""; HashSet <long> gridOwners = new HashSet <long>(); switch (target) { case HashSet <long> owners: gridOwners.UnionWith(owners); break; case ulong steamId: if (steamId == 0) { return(false); } playerSteamId = steamId; identityId = GetPlayerIdFromSteamId(steamId); identity = MySession.Static.Players.TryGetIdentity(identityId); displayName = identity.DisplayName; faction = MySession.Static.Factions.GetPlayerFaction(identityId); break; case string name: if (allExceptions.Contains(name)) { return(true); } if (TryGetPlayerByNameOrId(name, out identity)) { identityId = identity.IdentityId; faction = MySession.Static.Factions.GetPlayerFaction(identityId); displayName = identity.DisplayName; playerSteamId = GetSteamIdFromPlayerId(identityId); } break; case long id: if (id == 0) { return(false); } identityId = id; identity = MySession.Static.Players.TryGetIdentity(id); if (identity != null) { faction = MySession.Static.Factions.GetPlayerFaction(id); displayName = identity.DisplayName; playerSteamId = GetSteamIdFromPlayerId(id); } else { faction = (MyFaction)MySession.Static.Factions.TryGetFactionById(id); } if (MyEntities.TryGetEntityById(id, out var entity)) { if (allExceptions.Contains(entity.DisplayName)) { return(true); } } if (GridCache.TryGetGridById(id, out var foundGrid)) { gridOwners.UnionWith(GridCache.GetOwners(foundGrid)); if (allExceptions.Contains(foundGrid.DisplayName)) { return(true); } } break; case MyFaction targetFaction: if (allExceptions.Contains(targetFaction.Tag) || allExceptions.Contains(targetFaction.FactionId.ToString())) { return(true); } break; case MyPlayer player: playerSteamId = player.Character.ControlSteamId; if (playerSteamId == 0) { return(false); } if (allExceptions.Contains(playerSteamId.ToString())) { return(true); } identityId = GetPlayerIdFromSteamId(playerSteamId); if (identityId > 0) { if (allExceptions.Contains(identityId.ToString())) { return(true); } identity = MySession.Static.Players.TryGetIdentity(identityId); displayName = identity.DisplayName; } break; case MyCubeGrid grid: { if (allExceptions.Contains(grid.DisplayName) || allExceptions.Contains(grid.EntityId.ToString())) { return(true); } var owners = GridCache.GetOwners(grid); if (owners.Count == 0) { break; } gridOwners.UnionWith(owners); break; } } foreach (var owner in gridOwners) { if (owner == 0) { continue; } if (allExceptions.Contains(owner.ToString())) { return(true); } identity = MySession.Static.Players.TryGetIdentity(owner); playerSteamId = GetSteamIdFromPlayerId(owner); if (playerSteamId > 0 && allExceptions.Contains(playerSteamId.ToString())) { return(true); } if (identity != null) { if (allExceptions.Contains(identity.DisplayName)) { return(true); } } faction = MySession.Static.Factions.GetPlayerFaction(owner); if (faction != null && (allExceptions.Contains(faction.Tag) || allExceptions.Contains(faction.FactionId.ToString()))) { return(true); } } if (playerSteamId > 0 && allExceptions.Contains(playerSteamId.ToString())) { return(true); } if (identityId > 0 && allExceptions.Contains(identityId.ToString())) { return(true); } if (identity != null && allExceptions.Contains(identity.DisplayName)) { return(true); } if (faction != null && (allExceptions.Contains(faction.Tag) || allExceptions.Contains(faction.FactionId.ToString()))) { return(true); } if (!string.IsNullOrEmpty(displayName) && allExceptions.Contains(displayName)) { return(true); } return(false); }
public static StringBuilder GetLimit(long playerId) { var sb = new StringBuilder(); sb.AppendLine("Ain't find shit"); if (playerId == 0) { return(sb); } var limitItems = BlockLimiterConfig.Instance.AllLimits; if (limitItems.Count < 1) { return(sb); } sb.Clear(); var playerFaction = MySession.Static.Factions.GetPlayerFaction(playerId); var playerBlocks = new HashSet <MySlimBlock>(); if (playerId > 0) { GridCache.GetPlayerBlocks(playerBlocks, playerId); var grids = new HashSet <MyCubeGrid>(); GridCache.GetPlayerGrids(grids, playerId); if (grids.Count > 0) { if (BlockLimiterConfig.Instance.MaxBlockSizeShips > 0) { sb.AppendLine($"Ship Limits"); foreach (var grid in grids.Where(x => x.BlocksCount > 0 && !x.IsStatic)) { sb.AppendLine( $"{grid.DisplayName}: {grid.BlocksCount}/{BlockLimiterConfig.Instance.MaxBlockSizeShips}"); } } if (BlockLimiterConfig.Instance.MaxBlockSizeStations > 0) { sb.AppendLine($"Station Limits"); foreach (var grid in grids.Where(x => x.BlocksCount > 0 && x.IsStatic)) { sb.AppendLine( $"{grid.DisplayName}: {grid.BlocksCount}/{BlockLimiterConfig.Instance.MaxBlockSizeStations}"); } } if (BlockLimiterConfig.Instance.MaxBlocksLargeGrid > 0) { sb.AppendLine($"Large Grid Block Limits"); foreach (var grid in grids.Where(x => x.BlocksCount > 0 && x.GridSizeEnum == MyCubeSize.Large)) { sb.AppendLine( $"{grid.DisplayName}: {grid.BlocksCount}/{BlockLimiterConfig.Instance.MaxBlocksLargeGrid}"); } } if (BlockLimiterConfig.Instance.MaxBlocksSmallGrid > 0) { sb.AppendLine($"Small Grid Block Limits"); foreach (var grid in grids.Where(x => x.BlocksCount > 0 && x.GridSizeEnum == MyCubeSize.Small)) { sb.AppendLine( $"{grid.DisplayName}: {grid.BlocksCount}/{BlockLimiterConfig.Instance.MaxBlocksSmallGrid}"); } } if (BlockLimiterConfig.Instance.MaxSmallGrids > 0) { sb.AppendLine($"Small Grids Limits: {grids.Count(x=>x.GridSizeEnum == MyCubeSize.Small)}/{BlockLimiterConfig.Instance.MaxSmallGrids}"); } if (BlockLimiterConfig.Instance.MaxLargeGrids > 0) { sb.AppendLine($"Large Grid Limits: {grids.Count(x=>x.GridSizeEnum == MyCubeSize.Large)}/{BlockLimiterConfig.Instance.MaxLargeGrids}"); } } } foreach (var item in limitItems) { if (item.BlockList.Count == 0 || item.FoundEntities.Count == 0) { continue; } var itemName = string.IsNullOrEmpty(item.Name) ? item.BlockList.FirstOrDefault() : item.Name; sb.AppendLine(); sb.AppendLine($"----->{itemName}<-----"); if (item.LimitPlayers && item.FoundEntities.TryGetValue(playerId, out var pCount)) { if (pCount > 1) { var dictionary = new ConcurrentDictionary <long, double>(); sb.AppendLine($"Player Limit = {pCount}/{item.Limit}"); if (playerBlocks.Count > 0) { foreach (var block in playerBlocks) { if (!item.IsMatch(block.BlockDefinition)) { continue; } dictionary.AddOrUpdate(block.CubeGrid.EntityId, 1, (l, i) => i + 1); } foreach (var(gridId, amount) in dictionary) { if (!GridCache.TryGetGridById(gridId, out var grid) && Grid.IsOwner(grid, playerId)) { sb.AppendLine($"[UnknownGrid] = {amount}"); continue; } sb.AppendLine($"{grid.DisplayName} = {amount}"); } } } } if (item.LimitFaction && playerFaction != null && item.FoundEntities.TryGetValue(playerFaction.FactionId, out var fCount)) { if (fCount > 1) { sb.AppendLine($"Faction Limit = {fCount}/{item.Limit} "); } } if (!item.LimitGrids) { continue; } var gridDictionary = new Dictionary <string, int>(); foreach (var(id, gCount) in item.FoundEntities) { if (!GridCache.TryGetGridById(id, out var grid) || !Grid.IsOwner(grid, playerId)) { continue; } if (!item.IsGridType(grid)) { item.FoundEntities.Remove(id); continue; } if (gCount < 1) { continue; } gridDictionary[grid.DisplayName] = gCount; } if (gridDictionary.Count == 0) { continue; } sb.AppendLine("Grid Limits:"); foreach (var(name, gCount) in gridDictionary) { sb.AppendLine($"->{name} = {gCount} / {item.Limit}"); } } return(sb); }
public static void DecreaseCount(MyCubeBlockDefinition def, List <long> playerIds, int amount = 1, long gridId = 0) { if (!BlockLimiterConfig.Instance.EnableLimits) { return; } var factions = new List <MyFaction>(); foreach (var playerId in playerIds) { var faction = MySession.Static.Factions.GetPlayerFaction(playerId); if (faction == null) { continue; } factions.Add(faction); } foreach (var limit in Limits) { if (!limit.IsMatch(def)) { continue; } var foundGrid = GridCache.TryGetGridById(gridId, out var grid); if (foundGrid && !limit.IsGridType(grid)) { limit.FoundEntities.Remove(gridId); continue; } if (limit.LimitGrids && gridId > 0) { limit.FoundEntities.AddOrUpdate(gridId, 0, (l, i) => Math.Max(0, i - amount)); } foreach (var playerId in playerIds) { if (playerId == 0) { continue; } if (limit.IgnoreNpcs) { if (MySession.Static.Players.IdentityIsNpc(playerId)) { limit.FoundEntities.Remove(playerId); continue; } if (foundGrid && MySession.Static.Players.IdentityIsNpc(GridCache.GetBuilders(grid).FirstOrDefault())) { continue; } } if (limit.LimitPlayers) { limit.FoundEntities.AddOrUpdate(playerId, 0, (l, i) => Math.Max(0, i - amount)); } } if (limit.LimitFaction && factions.Count > 0) { foreach (var faction in factions) { limit.FoundEntities.AddOrUpdate(faction.FactionId, 0, (l, i) => Math.Max(0, i - amount)); } } limit.ClearEmptyEntities(); } }
public static bool IsWithinLimits(MyCubeBlockDefinition def, long ownerId, long gridId, int count, out string limit) { limit = string.Empty; if (def == null || Math.Abs(ownerId + gridId) < 1) { return(true); } var ownerFaction = MySession.Static.Factions.GetPlayerFaction(ownerId); var allow = true; if (Grid.IsSizeViolation(gridId)) { return(false); } if (BlockLimiterConfig.Instance.AllLimits.Count == 0) { return(true); } var foundGrid = GridCache.TryGetGridById(gridId, out var grid); if (!foundGrid) { GridCache.AddGrid(grid); } var subGrids = Grid.GetSubGrids(grid); foreach (var item in BlockLimiterConfig.Instance.AllLimits) { limit = item.Name; if (!item.IsMatch(def)) { continue; } if ((ownerId > 0 && item.IsExcepted(ownerId)) || gridId > 0 && item.IsExcepted(gridId)) { continue; } if (foundGrid && !item.IsGridType(grid)) { continue; } if (item.Limit == 0 && (item.LimitGrids || item.LimitPlayers || item.LimitFaction)) { return(false); } if (item.LimitGrids && gridId > 0) { item.FoundEntities.TryGetValue(gridId, out var gCount); if (foundGrid && item.IsGridType(grid)) { if (gCount + count > item.Limit) { allow = false; break; } //Counts found subgrid blocks too. var subGBlockCount = 0; foreach (var subGrid in subGrids) { if (!item.FoundEntities.TryGetValue(subGrid.EntityId, out var subGCount)) { continue; } subGBlockCount += subGCount; } if (subGBlockCount + count + gCount > item.Limit) { allow = false; break; } } } if (ownerId > 0 && item.LimitPlayers && item.FoundEntities.TryGetValue(ownerId, out var pCount)) { if (pCount + count > item.Limit) { allow = false; break; } } if (ownerFaction == null || !item.LimitFaction || !item.FoundEntities.TryGetValue(ownerFaction.FactionId, out var fCount)) { continue; } { if (fCount + count <= item.Limit) { continue; } allow = false; break; } } return(allow); }