public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits) { if (!splits[0].Equals("/w") && !splits[0].Equals("/whisper")) { return(false); } var m = Regex.Match(chattext, @"/((w)|(whisper)) (?<targetplayername>['].+[']|[^ ]+) (?<message>.+)"); if (!m.Success) { Chat.Send(causedBy, "Command didn't match, use /w [targetplayername] [message] or /whisper [targetplayername] [message]"); return(true); } var targetPlayerName = m.Groups ["targetplayername"].Value; Players.Player targetPlayer; string error; if (!PlayerHelper.TryGetPlayer(targetPlayerName, out targetPlayer, out error)) { Chat.Send(causedBy, $"Could not find target player '{targetPlayerName}'; {error}"); return(true); } var message = m.Groups ["message"].Value; Chat.Send(targetPlayer, $"<color=cyan>From [{causedBy.Name}]: {message}</color>"); Chat.Send(causedBy, $"<color=cyan>To [{targetPlayer}]: {message}</color>"); return(true); }
public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits) { if (!splits[0].Equals("/ban")) { return(false); } if (!PermissionsManager.CheckAndWarnPermission(causedBy, AntiGrief.MOD_PREFIX + "ban")) { return(true); } var m = Regex.Match(chattext, @"/ban (?<targetplayername>['].+[']|[^ ]+)"); if (!m.Success) { Chat.Send(causedBy, "Command didn't match, use /ban [targetplayername]"); return(true); } var targetPlayerName = m.Groups ["targetplayername"].Value; Players.Player targetPlayer; string error; if (!PlayerHelper.TryGetPlayer(targetPlayerName, out targetPlayer, out error)) { Chat.Send(causedBy, $"Could not find target player '{targetPlayerName}'; {error}"); return(true); } Chat.Send(targetPlayer, "<color=red>You were banned from the server</color>"); Chat.SendToConnected($"{targetPlayer.Name} is banned by {causedBy.Name}"); BlackAndWhitelisting.AddBlackList(targetPlayer.ID.steamID.m_SteamID); BlackAndWhitelisting.Reload(); Players.Disconnect(targetPlayer); return(true); }
public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits) { if (!splits[0].Equals("/lastseen")) { return(false); } var m = Regex.Match(chattext, @"/lastseen (?<playername>['].+[']|[^ ]+)"); if (!m.Success) { Chat.Send(causedBy, "Command didn't match, use /lastseen [playername]"); return(true); } var targetPlayerName = m.Groups ["playername"].Value; Players.Player targetPlayer; string error; if (!PlayerHelper.TryGetPlayer(targetPlayerName, out targetPlayer, out error, true)) { Chat.Send(causedBy, $"Could not find player '{targetPlayerName}'; {error}"); return(true); } var lastSeen = ActivityTracker.GetLastSeen(targetPlayer.ID.ToStringReadable()); Chat.Send(causedBy, $"Player {targetPlayer.ID.ToStringReadable()} last seen {lastSeen}"); return(true); }
public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits) { if (!splits[0].Equals("/jail")) { return(false); } if (!PermissionsManager.CheckAndWarnPermission(causedBy, AntiGrief.MOD_PREFIX + "jail")) { return(true); } var m = Regex.Match(chattext, @"/jail (?<player>['].+[']|[^ ]+) (?<jailtime>[0-9]+)? ?(?<reason>.+)$"); if (!m.Success) { Chat.Send(causedBy, "Syntax error, use /jail <player> [time] <reason>"); return(true); } Players.Player target; string targetName = m.Groups["player"].Value; string error; if (!PlayerHelper.TryGetPlayer(targetName, out target, out error, true)) { Chat.Send(causedBy, $"Could not find player {targetName}: {error}"); return(true); } uint jailtime = 0; var timeval = m.Groups["jailtime"].Value; if (timeval.Equals("")) { jailtime = JailManager.DEFAULT_JAIL_TIME; } else { if (!uint.TryParse(timeval, out jailtime)) { Chat.Send(causedBy, $"Could not identify time value {timeval}"); } } string reason = m.Groups["reason"].Value; if (JailManager.IsPlayerJailed(target)) { Chat.Send(causedBy, $"{target.Name} is already in jail."); return(true); } JailManager.jailPlayer(target, causedBy, reason, jailtime); Chat.Send(causedBy, $"Threw {target.Name} into the jail for {jailtime} minutes"); return(true); }
// purge all colonies of a given player (or remove him/her in case of multiple owners) public void PurgePlayerFromColonies(Players.Player causedBy, string targetName) { Players.Player target; string error; if (!PlayerHelper.TryGetPlayer(targetName, out target, out error)) { Chat.Send(causedBy, $"Could not find {targetName}: {error}"); return; } PurgePlayerColonies(causedBy, target); return; }
public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits) { if (!splits[0].Equals("/warp")) { return(false); } if (!PermissionsManager.HasPermission(causedBy, AntiGrief.MOD_PREFIX + "warp.player") && !PermissionsManager.HasPermission(causedBy, AntiGrief.MOD_PREFIX + "warp.self")) { Chat.Send(causedBy, "<color=red>You don't have permission to warp</color>"); return(true); } var m = Regex.Match(chattext, @"/warp (?<targetplayername>['].+[']|[^ ]+)( (?<teleportplayername>['].+[']|[^ ]+))?"); if (!m.Success) { Chat.Send(causedBy, "Command didn't match, use /warp [targetplayername] or /warp [targetplayername] [teleportplayername]"); return(true); } var targetPlayerName = m.Groups ["targetplayername"].Value; Players.Player targetPlayer; string error; if (!PlayerHelper.TryGetPlayer(targetPlayerName, out targetPlayer, out error)) { Chat.Send(causedBy, $"Could not find target player '{targetPlayerName}'; {error}"); return(true); } var teleportPlayer = causedBy; var teleportPlayerName = m.Groups ["teleportplayername"].Value; if (teleportPlayerName.Length > 0) { if (PermissionsManager.HasPermission(causedBy, AntiGrief.MOD_PREFIX + "warp.player")) { if (!PlayerHelper.TryGetPlayer(teleportPlayerName, out teleportPlayer, out error)) { Chat.Send(causedBy, $"Could not find teleport player '{teleportPlayerName}'; {error}"); return(true); } } else { Chat.Send(causedBy, "<color=red>You don't have permission to warp other players</color>"); return(true); } } Teleport.TeleportTo(teleportPlayer, targetPlayer.Position); return(true); }
public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits) { if (!splits[0].Equals("/killnpcs")) { return(false); } Players.Player targetPlayer = causedBy; var m = Regex.Match(chattext, @"/killnpcs ?(?<targetplayername>['].+[']|[^ ]+)"); if (m.Success) { string targetPlayerName = m.Groups["targetplayername"].Value; string error; if (!PlayerHelper.TryGetPlayer(targetPlayerName, out targetPlayer, out error, true)) { Chat.Send(causedBy, $"Could not find '{targetPlayerName}'; {error}"); return(true); } } string permission = AntiGrief.MOD_PREFIX + "killnpcs"; if (targetPlayer == causedBy) { permission += ".self"; } if (!PermissionsManager.CheckAndWarnPermission(causedBy, permission)) { return(true); } if (targetPlayer.ActiveColony == null) { Chat.Send(targetPlayer, $"You have to be at an active colony to allow NPC killing"); if (targetPlayer != causedBy) { Chat.Send(causedBy, $"{targetPlayer.Name} is not at an active colony"); } return(true); } List <NPCBase> cachedFollowers = new List <NPCBase>(targetPlayer.ActiveColony.Followers); foreach (NPCBase npc in cachedFollowers) { npc.OnDeath(); } return(true); }
// load log file (=past jail records) public static void LoadLogFile() { JSONNode jsonLog; if (!JSON.Deserialize(LogFilePath, out jsonLog, false)) { Log.Write("No {0} found inside world directory, nothing to load", LOG_FILE); return; } Log.Write("Loading jail history records from {0}", LOG_FILE); try { JSONNode players; jsonLog.TryGetAs("players", out players); foreach (JSONNode node in players.LoopArray()) { string PlayerId = node.GetAs <string>("steamId"); Players.Player target; string error; if (!PlayerHelper.TryGetPlayer(PlayerId, out target, out error, true)) { Log.Write($"Could not find player with id {PlayerId} from {LOG_FILE}"); continue; } List <JailLogRecord> playerHistory = new List <JailLogRecord>(); JSONNode jsonPlayerRecords; node.TryGetAs("records", out jsonPlayerRecords); foreach (JSONNode record in jsonPlayerRecords.LoopArray()) { long timestamp = record.GetAs <long>("timestamp"); long duration = record.GetAs <long>("duration"); string jailedById = record.GetAs <string>("jailedBy"); string reason = record.GetAs <string>("reason"); Players.Player causedBy; PlayerHelper.TryGetPlayer(jailedById, out causedBy, out error, true); JailLogRecord playerRecord = new JailLogRecord(timestamp, duration, causedBy, reason); playerHistory.Add(playerRecord); } jailLog.Add(target, playerHistory); } } catch (Exception e) { Log.Write("Error parsing {0}: {1}", LOG_FILE, e.Message); } return; }
public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits) { if (!splits[0].Equals("/killplayer")) { return(false); } var m = Regex.Match(chattext, @"/killplayer (?<targetplayername>['].+[']|[^ ]+)"); if (!m.Success) { Chat.Send(causedBy, "Syntax: /killplayer [targetplayername]"); return(true); } string targetPlayerName = m.Groups["targetplayername"].Value; Players.Player targetPlayer; string error; if (!PlayerHelper.TryGetPlayer(targetPlayerName, out targetPlayer, out error, true)) { Chat.Send(causedBy, $"Could not find '{targetPlayerName}'; {error}"); return(true); } string permission = AntiGrief.MOD_PREFIX + "killplayer"; if (causedBy == targetPlayer) { permission += ".self"; } if (!PermissionsManager.CheckAndWarnPermission(causedBy, permission)) { return(true); } Players.OnDeath(targetPlayer); targetPlayer.SendHealthPacket(); if (targetPlayer == causedBy) { Chat.SendToConnected($"Player {causedBy.Name} committed suicide"); } else { Chat.SendToConnected($"Player {targetPlayer.Name} was killed by {causedBy.Name}"); } return(true); }
public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits) { if (!splits[0].Equals("/list")) { return(false); } Match m = Regex.Match(chattext, @"/list (?<playername>['].+[']|[^ ]+)"); if (!m.Success) { Chat.Send(causedBy, "Syntax: /list {playername}"); return(true); } if (!PermissionsManager.CheckAndWarnPermission(causedBy, AntiGrief.MOD_PREFIX + "listplayer")) { return(true); } string targetName = m.Groups["playername"].Value; string error; Players.Player targetPlayer; if (!PlayerHelper.TryGetPlayer(targetName, out targetPlayer, out error, true)) { Chat.Send(causedBy, $"Could not find '{targetName}'; {error}"); return(true); } string lastSeen = ActivityTracker.GetLastSeen(targetPlayer.ID.ToStringReadable()); string colonies = ""; int count = 0; for (int i = 0; i < targetPlayer.Colonies.Length; i++) { if (!colonies.Equals("")) { colonies += ", "; } colonies += targetPlayer.Colonies[i].Name; count++; } Chat.Send(causedBy, $"Player {targetPlayer.Name} last seen {lastSeen}"); Chat.Send(causedBy, $"{targetPlayer.Name} owns {count} colonies: {colonies}"); return(true); }
public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits) { if (!splits[0].Equals("/mute")) { return(false); } if (!PermissionsManager.CheckAndWarnPermission(causedBy, AntiGrief.MOD_PREFIX + "mute")) { return(true); } var m = Regex.Match(chattext, @"/mute (?<targetplayername>['].+[']|[^ ]+) (?<minutes>\d+)"); if (!m.Success) { Chat.Send(causedBy, "Syntax: /mute [playername] [minutes]"); return(true); } string targetPlayerName = m.Groups["targetplayername"].Value; Players.Player targetPlayer; string error; if (!PlayerHelper.TryGetPlayer(targetPlayerName, out targetPlayer, out error)) { Chat.Send(causedBy, $"Could not find target player '{targetPlayerName}': {error}"); return(true); } long minutes; if (!long.TryParse(m.Groups["minutes"].Value, out minutes)) { Chat.Send(causedBy, "Could not read minutes value"); return(true); } if (MuteList.MutedMinutes.ContainsKey(targetPlayer)) { MuteList.MutedMinutes.Remove(targetPlayer); } MuteList.MutedMinutes.Add(targetPlayer, DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond + minutes * 60 * 1000); Chat.Send(targetPlayer, $"You're muted for {minutes} Minute(s)"); Log.Write($"{targetPlayer.Name} muted for {minutes} Minute(s)"); Chat.Send(causedBy, $"{targetPlayer.Name} muted for {minutes} Minute(s)"); return(true); }
public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits) { if (!splits[0].Equals("/jailrelease")) { return(false); } if (!PermissionsManager.CheckAndWarnPermission(causedBy, AntiGrief.MOD_PREFIX + "jail")) { return(true); } var m = Regex.Match(chattext, @"/jailrelease (?<player>.+)"); if (!m.Success) { Chat.Send(causedBy, "Syntax error, use /jailrelease <player>"); return(true); } Players.Player target; string targetName = m.Groups["player"].Value; string error; if (!PlayerHelper.TryGetPlayer(targetName, out target, out error, true)) { Chat.Send(causedBy, $"Could not find player {targetName}: {error}"); return(true); } if (!JailManager.IsPlayerJailed(target)) { Chat.Send(causedBy, $"{target.Name} is currently not in jail"); return(true); } JailManager.releasePlayer(target, causedBy); Chat.Send(causedBy, $"Released {target.Name} from jail"); Chat.Send(target, $"<color=yellow>{causedBy.Name} released you from jail</color>"); return(true); }
public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits) { if (!splits[0].Equals("/unmute")) { return(false); } if (!PermissionsManager.CheckAndWarnPermission(causedBy, AntiGrief.MOD_PREFIX + "mute")) { return(true); } var m = Regex.Match(chattext, @"/unmute (?<targetplayername>['].+[']|[^ ]+)"); if (!m.Success) { Chat.Send(causedBy, "Syntax: /unmute [targetplayername]"); return(true); } var targetPlayerName = m.Groups["targetplayername"].Value; Players.Player targetPlayer; string error; if (!PlayerHelper.TryGetPlayer(targetPlayerName, out targetPlayer, out error)) { Chat.Send(causedBy, $"Could not find target player '{targetPlayerName}': {error}"); return(true); } if (MuteList.MutedMinutes.ContainsKey(targetPlayer)) { MuteList.MutedMinutes.Remove(targetPlayer); Log.Write($"Unmuted {targetPlayer.Name}"); } else { Chat.Send(causedBy, $"{targetPlayer.Name} was not muted"); } return(true); }
public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits) { if (!splits[0].Equals("/warpspawn")) { return(false); } if (!PermissionsManager.CheckAndWarnPermission(causedBy, AntiGrief.MOD_PREFIX + "warp.spawn.self")) { return(true); } var m = Regex.Match(chattext, @"/warpspawn ?(?<playername>.+)?"); if (!m.Success) { Chat.Send(causedBy, "use /warpspawn or /warpspawn <playername>"); return(true); } var TeleportPlayer = causedBy; var TeleportPlayerName = m.Groups ["playername"].Value; if (TeleportPlayerName.Length > 0) { if (!PermissionsManager.CheckAndWarnPermission(causedBy, AntiGrief.MOD_PREFIX + "warp.spawn")) { return(true); } string Error; if (!PlayerHelper.TryGetPlayer(TeleportPlayerName, out TeleportPlayer, out Error)) { Chat.Send(causedBy, $"Could not find teleport player '{TeleportPlayerName}'; {Error}"); return(true); } } Teleport.TeleportTo(TeleportPlayer, ServerManager.TerrainGenerator.GetDefaultSpawnLocation().Vector); return(true); }
public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits) { if (!splits[0].Equals("/trade")) { return(false); } var m = Regex.Match(chattext, @"/trade (?<playername>['].+[']|[^ ]+) (?<material>.+) (?<amount>\d+)"); if (!m.Success) { Chat.Send(causedBy, "Command didn't match, use /trade [playername] [material] [amount]"); return(true); } var targetPlayerName = m.Groups ["playername"].Value; if (targetPlayerName.StartsWith("'")) { if (targetPlayerName.EndsWith("'")) { targetPlayerName = targetPlayerName.Substring(1, targetPlayerName.Length - 2); } else { Chat.Send(causedBy, "Command didn't match, missing ' after playername"); return(true); } } if (targetPlayerName.Length < 1) { Chat.Send(causedBy, "Command didn't match, no playername given"); return(true); } var itemTypeName = m.Groups ["material"].Value; ushort itemType; if (!ItemTypes.IndexLookup.TryGetIndex(itemTypeName, out itemType)) { Chat.Send(causedBy, "Command didn't match, item type not found"); return(true); } var amount = Int32.Parse(m.Groups ["amount"].Value); if (amount <= 0) { Chat.Send(causedBy, "Command didn't match, amount too low"); return(true); } Players.Player targetPlayer; string error; if (!PlayerHelper.TryGetPlayer(targetPlayerName, out targetPlayer, out error)) { Chat.Send(causedBy, $"Could not find target player '{targetPlayerName}'; {error}"); return(true); } Colony sourceColony = causedBy.ActiveColony; Colony targetColony = targetPlayer.ActiveColony; if (sourceColony == null || targetColony == null) { Chat.Send(causedBy, "Coud not get active colony for both players"); return(false); } InventoryItem tradeItem = new InventoryItem(itemType, amount); if (sourceColony.Stockpile.TryRemove(tradeItem)) { targetColony.Stockpile.Add(tradeItem); Chat.Send(causedBy, $"Send {amount} x {itemTypeName} to '{targetPlayer.Name}'"); Chat.Send(targetPlayer, $"Received {amount} x {itemTypeName} from '{causedBy.Name}'"); } else { Chat.Send(causedBy, "You don't have enough items"); } return(true); }
// load from config file public static void Load() { JSONNode jsonConfig; if (!JSON.Deserialize(ConfigfilePath, out jsonConfig, false)) { Log.Write("No {0} found inside world directory, creating default config", CONFIG_FILE); return; } Log.Write("Loading jail config from {0}", CONFIG_FILE); try { JSONNode position; if (jsonConfig.TryGetAs("position", out position)) { jailPosition.x = position.GetAs <float>("x"); jailPosition.y = position.GetAs <float>("y"); jailPosition.z = position.GetAs <float>("z"); jailRange = position.GetAs <uint>("range"); validJail = true; } else { Log.Write("Did not find a jail position, invalid config"); } JSONNode visitorPos; if (jsonConfig.TryGetAs("visitorPosition", out visitorPos)) { jailVisitorPosition.x = visitorPos.GetAs <float>("x"); jailVisitorPosition.y = visitorPos.GetAs <float>("y"); jailVisitorPosition.z = visitorPos.GetAs <float>("z"); validVisitorPos = true; } uint defaultJailTime; if (jsonConfig.TryGetAs("defaultJailTime", out defaultJailTime)) { DEFAULT_JAIL_TIME = defaultJailTime; } uint graceEscapeAttempts; if (jsonConfig.TryGetAs("graceEscapeAttempts", out graceEscapeAttempts)) { GRACE_ESCAPE_ATTEMPTS = graceEscapeAttempts; } JSONNode players; jsonConfig.TryGetAs("players", out players); foreach (JSONNode node in players.LoopArray()) { string PlayerName = node.GetAs <string>("target"); long jailTimestamp = node.GetAs <long>("time"); long jailDuration = node.GetAs <long>("duration"); string causedByName = node.GetAs <string>("jailedBy"); string reason = node.GetAs <string>("jailReason"); List <string> permissions = node.GetAs <List <string> >("permissions"); // TODO // List<string> permissions = new List<string>; // JSONNode jsonPerm; // node.TryGetAs("permissions", out jsonPerm); // foreach (string perm in jsonPerm.LoopArray()) { // permissions.Add(perm); // } Players.Player target; Players.Player causedBy; string error; // causedBy can be null in case of server actions, but target has to be a valid player PlayerHelper.TryGetPlayer(causedByName, out causedBy, out error, true); if (PlayerHelper.TryGetPlayer(PlayerName, out target, out error, true)) { JailRecord record = new JailRecord(jailTimestamp, jailDuration, causedBy, reason, permissions); jailedPersons.Add(target, record); } } } catch (Exception e) { Log.Write("Error parsing {0}: {1}", CONFIG_FILE, e.Message); } LoadLogFile(); return; }
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("/jailrec")) { return(false); } if (!PermissionsManager.CheckAndWarnPermission(causedBy, AntiGrief.MOD_PREFIX + "jail")) { return(true); } // get log by player var m = Regex.Match(chattext, @"/jailrec (?<target>.+)"); if (m.Success) { string targetName = m.Groups["target"].Value; Players.Player target; string error; if (!PlayerHelper.TryGetPlayer(targetName, out target, out error)) { Chat.Send(causedBy, $"Could not find {targetName}: {error}"); return(true); } List <JailManager.JailLogRecord> PlayerJailLog; if (!JailManager.jailLog.TryGetValue(target, out PlayerJailLog)) { Chat.Send(causedBy, $"No records found - {targetName} is clean"); return(true); } foreach (JailManager.JailLogRecord record in PlayerJailLog) { DateTime timestamp = new DateTime(record.timestamp * TimeSpan.TicksPerMillisecond * 1000); string jailedBy = "Server"; if (record.jailedBy != null) { jailedBy = record.jailedBy.Name; } Chat.Send(causedBy, String.Format("{0} by: {1} for: {2}", timestamp.ToString(), jailedBy, record.reason)); } // or get the full log } else { // in full log mode only timestamp and playername are displayed (last 10 jailed). // showing more would require a more capable chat window List <combinedJailLog> combinedLog = new List <combinedJailLog>(); foreach (KeyValuePair <Players.Player, List <JailManager.JailLogRecord> > kvp in JailManager.jailLog) { Players.Player target = kvp.Key; List <JailManager.JailLogRecord> records = kvp.Value; foreach (JailManager.JailLogRecord record in records) { combinedLog.Add(new combinedJailLog(target, record.jailedBy, record.timestamp)); } } combinedLog.Sort(delegate(combinedJailLog a, combinedJailLog b) { return(a.timestamp.CompareTo(b.timestamp)); }); int limit = 10; if (combinedLog.Count < limit) { limit = combinedLog.Count; } Chat.Send(causedBy, "Jail Records (last 10):"); for (int i = 0; i < limit; ++i) { combinedJailLog record = combinedLog[i]; DateTime timestamp = new DateTime(record.timestamp * TimeSpan.TicksPerMillisecond * 1000); string targetName = record.target.Name; string jailerName = "Server"; if (record.causedBy != null) { jailerName = record.causedBy.Name; } Chat.Send(causedBy, String.Format("{0} {1} by: {2}", timestamp.ToString(), targetName, jailerName)); } } return(true); }
// load config public static void Load() { SpawnProtectionRangeXPos = 50; SpawnProtectionRangeXNeg = 50; SpawnProtectionRangeZPos = 50; SpawnProtectionRangeZNeg = 50; BannerProtectionRangeX = 50; BannerProtectionRangeZ = 50; CustomAreas.Clear(); JSONNode jsonConfig; if (JSON.Deserialize(ConfigFilepath, out jsonConfig, false)) { int rx; if (jsonConfig.TryGetAs("SpawnProtectionRangeX+", out rx)) { SpawnProtectionRangeXPos = rx; } else if (jsonConfig.TryGetAs("SpawnProtectionRangeX", out rx)) { SpawnProtectionRangeXPos = rx; } else { Log.Write($"Could not get SpawnProtectionRangeX+ or SpawnProtectionRangeX from json config, using default value {SpawnProtectionRangeXPos}"); } if (jsonConfig.TryGetAs("SpawnProtectionRangeX-", out rx)) { SpawnProtectionRangeXNeg = rx; } else if (jsonConfig.TryGetAs("SpawnProtectionRangeX", out rx)) { SpawnProtectionRangeXNeg = rx; } else { Log.Write($"Could not get SpawnProtectionRangeX- or SpawnProtectionRangeX from json config, using default value {SpawnProtectionRangeXNeg}"); } int rz; if (jsonConfig.TryGetAs("SpawnProtectionRangeZ+", out rz)) { SpawnProtectionRangeZPos = rz; } else if (jsonConfig.TryGetAs("SpawnProtectionRangeZ", out rz)) { SpawnProtectionRangeZPos = rz; } else { Log.Write($"Could not get SpawnProtectionRangeZ+ or SpawnProtectionRangeZ from json config, using default value {SpawnProtectionRangeZPos}"); } if (jsonConfig.TryGetAs("SpawnProtectionRangeZ-", out rz)) { SpawnProtectionRangeZNeg = rz; } else if (jsonConfig.TryGetAs("SpawnProtectionRangeZ", out rz)) { SpawnProtectionRangeZNeg = rz; } else { Log.Write($"Could not get SpawnProtectionRangeZ- or SpawnProtectionRangeZ from json config, using default value {SpawnProtectionRangeZNeg}"); } if (!jsonConfig.TryGetAs("BannerProtectionRangeX", out BannerProtectionRangeX)) { Log.Write($"Could not get banner protection x-range from json config, using default value {BannerProtectionRangeX}"); } if (!jsonConfig.TryGetAs("BannerProtectionRangeZ", out BannerProtectionRangeZ)) { Log.Write($"Could not get banner protection z-range from json config, using default value {BannerProtectionRangeZ}"); } JSONNode jsonCustomAreas; if (jsonConfig.TryGetAs("CustomAreas", out jsonCustomAreas) && jsonCustomAreas.NodeType == NodeType.Array) { foreach (var jsonCustomArea in jsonCustomAreas.LoopArray()) { try { CustomAreas.Add(new CustomProtectionArea(jsonCustomArea)); } catch (Exception exception) { Log.WriteError($"Exception loading custom area; {exception.Message}"); } } Log.Write($"Loaded {CustomAreas.Count} from file"); } jsonConfig.TryGetAsOrDefault("NpcKillsJailThreshold", out NpcKillsJailThreshold, 2); jsonConfig.TryGetAsOrDefault("NpcKillsKickThreshold", out NpcKillsKickThreshold, 5); jsonConfig.TryGetAsOrDefault("NpcKillsBanThreshold", out NpcKillsBanThreshold, 6); JSONNode jsonNameList; if (jsonConfig.TryGetAs("UnscoredPlayers", out jsonNameList) && jsonNameList.NodeType == NodeType.Array) { foreach (JSONNode jsonName in jsonNameList.LoopArray()) { Players.Player player; string error; string playerName = jsonName.GetAs <string>(); if (PlayerHelper.TryGetPlayer(playerName, out player, out error, true)) { UnscoredPlayers.Add(player); } else { Log.Write($"Error loading unscored players {playerName}: {error}"); } } } jsonConfig.TryGetAsOrDefault("ColonistLimit", out ColonistLimit, 0); jsonConfig.TryGetAsOrDefault("ColonistCheckInterval", out ColonistLimitCheckSeconds, 30); int speed = 0; jsonConfig.TryGetAsOrDefault("DeleteJobSpeed", out speed, 4); // DeleteJobsManager.SetDeleteJobSpeed(speed, false); } else { Save(); Log.Write($"Could not find {ConfigFilepath} file, created default one"); } Log.Write($"Using spawn protection with X+ range {SpawnProtectionRangeXPos}"); Log.Write($"Using spawn protection with X- range {SpawnProtectionRangeXNeg}"); Log.Write($"Using spawn protection with Z+ range {SpawnProtectionRangeZPos}"); Log.Write($"Using spawn protection with Z- range {SpawnProtectionRangeZNeg}"); Log.Write($"Using banner protection with X range {BannerProtectionRangeX}"); Log.Write($"Using banner protection with Z range {BannerProtectionRangeZ}"); }
public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits) { if (!splits[0].Equals("/antigrief")) { return(false); } var matched = Regex.Match(chattext, @"/antigrief (?<accesslevel>[^ ]+) ((?<playername>['].+[']|[^ ]+)|((?<rangex>\d+) (?<rangez>\d+))|((?<rangexn>\d+) (?<rangexp>\d+) (?<rangezn>\d+) (?<rangezp>\d+)))$"); if (!matched.Success) { Chat.Send(causedBy, "Command didn't match, use /antigrief [spawn|nospawn|banner|deny] [playername] or /antigrief area [rangex rangez|rangexn rangexp rangezn rangezp]"); return(true); } var accesslevel = matched.Groups ["accesslevel"].Value; var targetPlayerName = matched.Groups ["playername"].Value; if (accesslevel.Equals("area")) { if (causedBy == null || causedBy.ID == NetworkID.Server) { Log.WriteError("You can't define custom protection areas as server (missing center)"); return(true); } else if (!PermissionsManager.CheckAndWarnPermission(causedBy, AntiGrief.PERMISSION_SUPER)) { return(true); } var rangex = matched.Groups ["rangex"].Value; var rangez = matched.Groups ["rangez"].Value; int rx, rz; var rangexn = matched.Groups ["rangexn"].Value; var rangexp = matched.Groups ["rangexp"].Value; var rangezn = matched.Groups ["rangezn"].Value; var rangezp = matched.Groups ["rangezp"].Value; int rxn, rxp, rzn, rzp; if (rangex.Length > 0 && int.TryParse(rangex, out rx) && rangez.Length > 0 && int.TryParse(rangez, out rz)) { AntiGrief.AddCustomArea(new CustomProtectionArea(causedBy.VoxelPosition, rx, rz)); Chat.Send(causedBy, $"Added anti grief area at {causedBy.VoxelPosition} with x-range {rx} and z-range {rz}"); } else if (rangexn.Length > 0 && int.TryParse(rangexn, out rxn) && rangexp.Length > 0 && int.TryParse(rangexp, out rxp) && rangezn.Length > 0 && int.TryParse(rangezn, out rzn) && rangezp.Length > 0 && int.TryParse(rangezp, out rzp)) { AntiGrief.AddCustomArea(new CustomProtectionArea(causedBy.VoxelPosition, rxn, rxp, rzn, rzp)); Chat.Send(causedBy, $"Added anti grief area at {causedBy.VoxelPosition} from x- {rxn} to x+ {rxp} and from z- {rzn} to z+ {rzp}"); } else { Chat.Send(causedBy, $"Could not parse protection area ranges {rangex} {rangez} {rangexn} {rangexp} {rangezn} {rangezp}"); } } else { Players.Player targetPlayer; string error; if (!PlayerHelper.TryGetPlayer(targetPlayerName, out targetPlayer, out error, true)) { Chat.Send(causedBy, $"Could not find target player '{targetPlayerName}'; {error}"); return(true); } if (accesslevel.Equals("spawn")) { if (PermissionsManager.CheckAndWarnPermission(causedBy, AntiGrief.PERMISSION_SUPER)) { PermissionsManager.AddPermissionToUser(causedBy, targetPlayer, AntiGrief.PERMISSION_SPAWN_CHANGE); Chat.Send(causedBy, $"You granted [{targetPlayer.Name}] permission to change the spawn area"); Chat.Send(targetPlayer, "You got permission to change the spawn area"); } } else if (accesslevel.Equals("nospawn")) { if (PermissionsManager.HasPermission(causedBy, AntiGrief.PERMISSION_SUPER)) { PermissionsManager.RemovePermissionOfUser(causedBy, targetPlayer, AntiGrief.PERMISSION_SPAWN_CHANGE); Chat.Send(causedBy, $"You revoked permission for [{targetPlayer.Name}] to change the spawn area"); Chat.Send(targetPlayer, "You lost permission to change the spawn area"); } } else if (accesslevel.Equals("banner")) { if (causedBy.Equals(targetPlayer)) { Chat.Send(causedBy, "You already have this permission"); return(true); } PermissionsManager.AddPermissionToUser(causedBy, targetPlayer, AntiGrief.PERMISSION_BANNER_PREFIX + causedBy.ID.steamID); Chat.Send(causedBy, $"You granted [{targetPlayer.Name}] permission to change your banner area"); Chat.Send(targetPlayer, $"You got permission to change banner area of [{causedBy.Name}]"); } else if (accesslevel.Equals("deny")) { if (causedBy.Equals(targetPlayer)) { Chat.Send(causedBy, "You can't revoke the permission for yourself"); return(true); } PermissionsManager.RemovePermissionOfUser(causedBy, targetPlayer, AntiGrief.PERMISSION_BANNER_PREFIX + causedBy.ID.steamID); Chat.Send(causedBy, $"You revoked permission for [{targetPlayer.Name}] to change your banner area"); Chat.Send(targetPlayer, $"You lost permission to change banner area of [{causedBy.Name}]"); } else { Chat.Send(causedBy, "Unknown access level, use /antigrief [spawn|nospawn|banner|deny] steamid"); } } return(true); }
public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits) { if (!splits[0].Equals("/warpbanner")) { return(false); } if (!PermissionsManager.CheckAndWarnPermission(causedBy, AntiGrief.MOD_PREFIX + "warp.banner.self")) { return(true); } Players.Player targetPlayer = null; Colony targetColony = null; Match m = Regex.Match(chattext, @"/warpbanner (?<target>['].+[']|[^ ]+)"); if (m.Success) { string error; if (!PlayerHelper.TryGetColony(m.Groups["target"].Value, out targetColony, out error) && !PlayerHelper.TryGetPlayer(m.Groups["target"].Value, out targetPlayer, out error)) { Chat.Send(causedBy, $"Could not find target: {error}"); return(true); } } string permission = AntiGrief.MOD_PREFIX + "warp.banner"; if (targetColony != null) { if (targetColony.Owners.ContainsByReference(causedBy)) { permission += ".self"; } if (!PermissionsManager.CheckAndWarnPermission(causedBy, permission)) { return(true); } } else if (targetPlayer != null) { if (!PermissionsManager.CheckAndWarnPermission(causedBy, permission)) { return(true); } } else { targetPlayer = causedBy; } if (targetColony == null) { int num = int.MaxValue; Colony[] colonies = targetPlayer.Colonies; for (int i = 0; i < colonies.Length; i++) { BannerTracker.Banner found; int closestDistance = colonies[i].Banners.GetClosestDistance(targetPlayer.VoxelPosition, out found); if (closestDistance < num) { targetColony = colonies[i]; num = closestDistance; } } if (targetColony == null) { Chat.Send(causedBy, $"Could not find any banner for '{targetPlayer.Name}'"); return(true); } } Helper.TeleportPlayer(causedBy, targetColony.Banners[0].Position.Vector); return(true); }