public static void OnSendAreaHighlights(Players.Player causedBy, List <AreaJobTracker.AreaHighlight> jobs, List <ushort> activeTypes)
        {
            if (!IsShowAllActive(causedBy))
            {
                return;
            }

            Pipliz.Vector3Int playerPos = causedBy.VoxelPosition;
            foreach (KeyValuePair <Colony, List <IAreaJob> > kvp in allAreaJobs)
            {
                if (kvp.Key == causedBy.ActiveColony)
                {
                    continue;
                }
                BannerTracker.Banner closestBanner = kvp.Key.GetClosestBanner(playerPos);
                if (Math.ManhattanDistance(closestBanner.Position, playerPos) > MaxDistance)
                {
                    continue;
                }
                foreach (IAreaJob job in kvp.Value)
                {
                    jobs.Add(new AreaJobTracker.AreaHighlight(job.Minimum, job.Maximum, job.AreaTypeMesh, job.AreaType));
                }
            }
            return;
        }
        // purge all colonies within a given range
        public int PurgeAllColonies(Players.Player causedBy, int range)
        {
            List <Colony> colonies = new List <Colony>();

            foreach (Colony checkColony in ServerManager.ColonyTracker.ColoniesByID.Values)
            {
                if (checkColony.Banners.Length == 0)
                {
                    Log.Write($"colony id={checkColony.ColonyID} has no banners");
                    continue;
                }
                BannerTracker.Banner closestBanner = checkColony.GetClosestBanner(causedBy.VoxelPosition);
                if (Pipliz.Math.ManhattanDistance(closestBanner.Position, causedBy.VoxelPosition) <= range)
                {
                    colonies.Add(checkColony);
                }
            }

            // second loop for actual deletion
            int counter = 0;

            foreach (Colony colony in colonies)
            {
                while (colony.Banners.Length > 1)
                {
                    ServerManager.ClientCommands.DeleteBannerTo(causedBy, colony, colony.Banners[0].Position);
                }
                Chat.Send(causedBy, $"Purging {colony.Name}");
                ServerManager.ClientCommands.DeleteColonyAndBanner(causedBy, colony, colony.Banners[0].Position);
                counter++;
            }

            return(counter);
        }
        public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits)
        {
            if (!splits[0].Equals("/bannername"))
            {
                return(false);
            }
            BannerTracker.Banner closestBanner = null;
            int shortestDistance = int.MaxValue;

            foreach (Colony checkColony in ServerManager.ColonyTracker.ColoniesByID.Values)
            {
                bool isOwner = false;
                foreach (Players.Player owner in checkColony.Owners)
                {
                    if (owner == causedBy)
                    {
                        isOwner = true;
                        break;
                    }
                }
                if (isOwner)
                {
                    continue;
                }

                foreach (BannerTracker.Banner checkBanner in checkColony.Banners)
                {
                    int distX    = (int)(causedBy.Position.x - checkBanner.Position.x);
                    int distZ    = (int)(causedBy.Position.z - checkBanner.Position.z);
                    int distance = (int)System.Math.Sqrt(System.Math.Pow(distX, 2) + System.Math.Pow(distZ, 2));
                    if (distance < shortestDistance)
                    {
                        shortestDistance = distance;
                        closestBanner    = checkBanner;
                    }
                }
            }

            if (closestBanner != null)
            {
                string owners = "";
                foreach (Players.Player owner in closestBanner.Colony.Owners)
                {
                    if (!owners.Equals(""))
                    {
                        owners += ", ";
                    }
                    owners += owner.Name;
                }
                Chat.Send(causedBy, $"Closest banner is at {closestBanner.Position.x},{closestBanner.Position.z}. {shortestDistance} blocks away. It belongs to colony {closestBanner.Colony.Name} owned by {owners}");
            }
            return(true);
        }
        public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits)
        {
            if (!splits[0].Equals("/spawnnpc"))
            {
                return(false);
            }
            if (!PermissionsManager.CheckAndWarnPermission(causedBy, AntiGrief.MOD_PREFIX + "npcandbeds"))
            {
                return(true);
            }

            Match m = Regex.Match(chattext, @"/spawnnpc (?<amount>\d+) ?(?<player>['].+[']|[^ ]+)?");

            if (!m.Success)
            {
                Chat.Send(causedBy, "Syntax: /spawnnpc {number} [targetplayer]");
                return(true);
            }
            int amount = 0;

            if (!int.TryParse(m.Groups["amount"].Value, out amount) || amount <= 0)
            {
                Chat.Send(causedBy, "Number should be > 0");
                return(true);
            }

            Players.Player target = causedBy;
            string         error;

            if (!m.Groups["player"].Value.Equals(""))
            {
                if (!PlayerHelper.TryGetPlayer(m.Groups["player"].Value, out target, out error))
                {
                    Chat.Send(causedBy, "Could not find target: {error}");
                }
            }

            Colony colony = target.ActiveColony;

            if (colony == null)
            {
                Chat.Send(target, "You need to be at an active colony to spawn beds");
                if (causedBy != target)
                {
                    Chat.Send(causedBy, " {target} has no active colony");
                }
                return(true);
            }
            BannerTracker.Banner banner = colony.GetClosestBanner(causedBy.VoxelPosition);
            if (banner == null)
            {
                Chat.Send(causedBy, "No banners found for the active colony");
                return(true);
            }

            for (int i = 0; i < amount; i++)
            {
                NPCBase npc = new NPCBase(colony, banner.Position);
                NPCTracker.Add(npc);
                colony.RegisterNPC(npc);
                ModLoader.Callbacks.OnNPCRecruited.Invoke(npc);
            }

            Chat.Send(causedBy, $"Spawned {amount} colonists");
            return(true);
        }
예제 #5
0
        public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits)
        {
            if (!splits[0].Equals("/beds"))
            {
                return(false);
            }
            if (!PermissionsManager.CheckAndWarnPermission(causedBy, AntiGrief.MOD_PREFIX + "beds"))
            {
                return(true);
            }

            var m = Regex.Match(chattext, @"/beds (?<amount>\d+)");

            if (!m.Success)
            {
                Chat.Send(causedBy, "Syntax: /beds {number}");
                return(true);
            }
            int amount = 0;

            if (!int.TryParse(m.Groups["amount"].Value, out amount) || amount <= 0)
            {
                Chat.Send(causedBy, "Number should be > 0");
                return(true);
            }

            Colony colony = causedBy.ActiveColony;

            if (colony == null)
            {
                Chat.Send(causedBy, "You need to be at an active colony to spawn beds");
                return(true);
            }
            BannerTracker.Banner banner = colony.GetClosestBanner(causedBy.VoxelPosition);
            if (banner == null)
            {
                Chat.Send(causedBy, "No banners found for the active colony");
                return(true);
            }

            Chat.Send(causedBy, $"Placing {amount} beds around you");
            int        radius = 3;
            Vector3Int pos = banner.Position.Add(-radius + 1, 0, -radius);
            int        counterX = -radius + 1, counterZ = -radius;
            int        bedUsed = 0;
            int        stepX = 1, stepZ = 0;

            while (amount > 0)
            {
                ushort blockType;
                if (World.TryGetTypeAt(pos, out blockType) && blockType == BuiltinBlocks.Indices.air &&
                    ServerManager.TryChangeBlock(pos, bedBlocks[bedUsed], causedBy) == EServerChangeBlockResult.Success)
                {
                    --amount;
                }
                if (counterX == -radius && counterZ == -radius)
                {
                    stepX    = 1;
                    stepZ    = 0;
                    radius  += 2;
                    counterZ = -radius;
                    counterX = -radius;
                    bedUsed  = 0;
                    pos      = pos.Add(-2, 0, -2);
                }
                else if (counterX == radius && counterZ == -radius)
                {
                    stepX   = 0;
                    stepZ   = 1;
                    bedUsed = 1;
                }
                else if (counterX == radius && counterZ == radius)
                {
                    stepX   = -1;
                    stepZ   = 0;
                    bedUsed = 2;
                }
                else if (counterX == -radius && counterZ == radius)
                {
                    stepX   = 0;
                    stepZ   = -1;
                    bedUsed = 3;
                }
                counterX += stepX;
                counterZ += stepZ;
                pos       = pos.Add(stepX, 0, stepZ);
            }

            return(true);
        }
        public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits)
        {
            if (!splits[0].Equals("/purgebanner"))
            {
                return(false);
            }
            if (!PermissionsManager.CheckAndWarnPermission(causedBy, AntiGrief.MOD_PREFIX + "purgebanner"))
            {
                return(true);
            }

            // command: /purgebanner all <range> (Purge ALL colonies within range)
            if (splits.Count == 3 && splits[1].Equals("all"))
            {
                if (!PermissionsManager.CheckAndWarnPermission(causedBy, AntiGrief.MOD_PREFIX + "purgeallbanner"))
                {
                    return(true);
                }
                int range = 0;
                if (!int.TryParse(splits[2], out range))
                {
                    Chat.Send(causedBy, "Syntax: /purgebanner all <range>");
                    return(true);
                }
                int counter = PurgeAllColonies(causedBy, range);
                Chat.Send(causedBy, $"Purged {counter} colonies within range");
                return(true);
            }

            // command: /purgebanner days <minage> (Purge ALL colonies from inactive players)
            if (splits.Count == 3 && splits[1].Equals("days"))
            {
                if (!PermissionsManager.CheckAndWarnPermission(causedBy, AntiGrief.MOD_PREFIX + "purgeallbanner"))
                {
                    return(true);
                }
                int minage = int.MaxValue;
                if (!int.TryParse(splits[2], out minage))
                {
                    Chat.Send(causedBy, "Syntax: /purgebanner days <minage>");
                    return(true);
                }

                int counter = 0;
                foreach (KeyValuePair <Players.Player, int> entry in ActivityTracker.GetInactivePlayers(minage))
                {
                    Players.Player player = entry.Key;
                    counter += PurgePlayerColonies(causedBy, player);
                }
                Chat.Send(causedBy, $"Purged {counter} colonies from inactive players");
                return(true);
            }

            Colony colony = null;

            BannerTracker.Banner banner = null;
            int shortestDistance        = int.MaxValue;

            foreach (Colony checkColony in ServerManager.ColonyTracker.ColoniesByID.Values)
            {
                foreach (BannerTracker.Banner checkBanner in checkColony.Banners)
                {
                    int distX    = (int)(causedBy.Position.x - checkBanner.Position.x);
                    int distZ    = (int)(causedBy.Position.z - checkBanner.Position.z);
                    int distance = (int)System.Math.Sqrt(System.Math.Pow(distX, 2) + System.Math.Pow(distZ, 2));
                    if (distance < shortestDistance)
                    {
                        shortestDistance = distance;
                        banner           = checkBanner;
                        colony           = checkColony;
                    }
                }
            }

            if (banner == null)
            {
                Chat.Send(causedBy, "No banners found at all");
                return(true);
            }
            if (shortestDistance > 100)
            {
                Chat.Send(causedBy, "Closest banner is more than 100 blocks away. Not doing anything, too risky");
                return(true);
            }

            // command: /purgebanner { colony | <playername> }
            if (splits.Count == 2)
            {
                if (splits[1].Equals("colony") && colony != null)
                {
                    PurgeColony(causedBy, colony);
                }
                else
                {
                    PurgePlayerFromColonies(causedBy, splits[1]);
                    Chat.Send(causedBy, $"Freed {splits[1]} from any colonies");
                }
                return(true);
            }

            if (colony.Banners.Length > 1)
            {
                ServerManager.ClientCommands.DeleteBannerTo(causedBy, colony, banner.Position);
                Chat.Send(causedBy, $"Deleted banner at {banner.Position.x},{banner.Position.z}. Colony still has more banners");
            }
            else
            {
                ServerManager.ClientCommands.DeleteColonyAndBanner(causedBy, colony, banner.Position);
                Chat.Send(causedBy, $"Deleted banner at {banner.Position.x},{banner.Position.z} and also the colony.");
            }
            return(true);
        }