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); }
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); }