Example #1
0
        public static bool PlayerLimit(long id)
        {
            if (id == 0)
            {
                return(false);
            }
            var playerBlocks = new HashSet <MySlimBlock>();

            GridCache.GetPlayerBlocks(playerBlocks, id);

            var limits = BlockLimiterConfig.Instance.AllLimits;

            if (limits?.Count == 0)
            {
                return(false);
            }
            if (playerBlocks.Count == 0)
            {
                foreach (var limit in BlockLimiterConfig.Instance.AllLimits)
                {
                    limit.FoundEntities.Remove(id);
                }
                return(false);
            }

            Parallel.ForEach(BlockLimiterConfig.Instance.AllLimits, limit =>
            {
                if (!limit.LimitPlayers)
                {
                    limit.FoundEntities.Remove(id);
                    return;
                }
                var limitedBlocks = playerBlocks.Count(x =>
                                                       limit.IsMatch(x.BlockDefinition));
                if (limitedBlocks == 0)
                {
                    limit.FoundEntities.Remove(id);
                    return;
                }

                limit.FoundEntities[id] = limitedBlocks;
            });

            return(true);
        }
Example #2
0
        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);
        }