public static void OnPlayerCommand(TShockAPI.Hooks.PlayerCommandEventArgs args) { var eplr = args.Player.EPlayer(); var cmd = args.Parameters; if (eplr != null) { switch (args.CommandName.ToLower()) { case "home": args.Handled = true; args.Player.Teleport((float)(Main.spawnTileX * 16), (float)(Main.spawnTileY * 16 - 48), 1); break; case "tp": if (cmd.Count >= 1) { var temptp = TSPlayer.FindByNameOrID(cmd[0]); if (temptp.Count > 1) { eplr.tsp.SendMultipleError(temptp); args.Handled = true; return; } else if (temptp.Any() && temptp[0].EPlayer() != null && eplr.MapUUID != temptp[0].EPlayer().MapUUID) { eplr.SendErrorEX($"你无法直接传送至位于其他世界的玩家."); args.Handled = true; } } break; } } }
public static bool MatchPlayerByName( string name, out TSPlayer matchedPlayer, TSPlayer messagesReceiver = null ) { matchedPlayer = null; List <TSPlayer> matchedPlayers = TSPlayer.FindByNameOrID(name); if (matchedPlayers.Count == 0) { if (messagesReceiver != null) { messagesReceiver.SendErrorMessage($"Could not match any players for \"{name}\"."); } return(false); } if (matchedPlayers.Count > 1) { if (messagesReceiver != null) { messagesReceiver.SendErrorMessage( "More than one player matched! Matches: " + string.Join(", ", matchedPlayers.Select(p => p.Name)) ); } return(false); } matchedPlayer = matchedPlayers[0]; return(true); }
public static void Check_Afk(CommandArgs args) { if (args.Parameters.Count == 1) { if (STools.GetPlayer(args.Player.Index) != null) { SPlayer player = STools.GetPlayer(args.Player.Index); if (player.AFK) { args.Player.SendInfoMessage("You have been AFK for {0} seconds.", player.AFKcount); } else { args.Player.SendInfoMessage("You are not AFK."); } } else if (TSServerPlayer.Server.Name == args.Player.Name) { args.Player.SendErrorMessage("The console has no stats to check."); } else { args.Player.SendErrorMessage("Something broke. Please try again later."); } } if (args.Parameters.Count > 1) { args.Parameters.RemoveAt(0); string name = string.Join(" ", args.Parameters); var players = TSPlayer.FindByNameOrID(name); // fix command fail when afk checking an offline player if (players.Count == 0) { args.Player.SendErrorMessage("Invalid player!"); return; } if (STools.GetPlayer(name).Count == 1) { SPlayer player = STools.GetPlayer(name)[0]; if (player.AFK) { args.Player.SendInfoMessage("{0} has been AFK for {1} second{2}.", player.TSPlayer.Account.Name, player.AFKcount, STools.Suffix(player.AFKcount)); } else { args.Player.SendInfoMessage("{0} is not AFK.", player.TSPlayer.Account.Name); } } else if (STools.GetPlayer(name).Count > 1) { args.Player.SendMultipleMatchError(STools.GetPlayer(name).Select(p => p.Name)); } else { args.Player.SendErrorMessage("Player {0} is not in the database.", args.Parameters[1]); } } }
private void BMCheck(CommandArgs args) { var username = String.Join(" ", args.Parameters); var matchedPlayers = TSPlayer.FindByNameOrID(username); if (matchedPlayers.Count < 1) { args.Player.SendErrorMessage("No players matched that name!"); } else if (matchedPlayers.Count > 1) { args.Player.SendMultipleMatchError(matchedPlayers.Select(p => p.Name)); } else { if (matchedPlayers[0].IsBuildModeOn()) { args.Player.SendInfoMessage($"{matchedPlayers[0].Name} has Buildmode enabled!"); } else { args.Player.SendInfoMessage($"{matchedPlayers[0].Name} does not have Buildmode enabled."); } } }
public static void Check_Name(CommandArgs args) { if (args.Parameters.Count > 1) { args.Parameters.RemoveAt(0); string name = string.Join(" ", args.Parameters); var player = TSPlayer.FindByNameOrID(name); if (player.Count > 1) { args.Player.SendMultipleMatchError(player.Select(ply => ply.Name)); } else if (player.Count == 1) { if (player[0].IsLoggedIn) { args.Player.SendInfoMessage("Username of {0} is \"{1}\".", player[0].Name, player[0].Account.Name); } else { args.Player.SendErrorMessage("{0} is not logged in.", player[0].Name); } } else { args.Player.SendErrorMessage("Could not find any players named \"{0}\".", name); } } else { args.Player.SendErrorMessage("Proper syntax: /check name <player>"); } }
void SetLife(int life, string Name) { var ply = TSPlayer.FindByNameOrID(Name)[0].TPlayer; life = Math.Min(life, Config.GetConfig().MaxLife); ply.statLifeMax = life; NetMessage.SendData((int)PacketTypes.PlayerHp, -1, -1, null, ply.whoAmI); }
private static void SendCombatTextToOther(CommandArgs args) { if (args.Parameters.Count == 0) { args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /sendctother [-b/--broadcast] <Player> <Messages> [r] [g] [b]"); return; } var broadcast = false; if (string.Equals(args.Parameters[0], "-b", StringComparison.OrdinalIgnoreCase) || string.Equals(args.Parameters[0], "--broadcast", StringComparison.OrdinalIgnoreCase)) { broadcast = true; args.Parameters.RemoveAt(0); } var players = TSPlayer.FindByNameOrID(args.Parameters[0]); if (players.Count > 1) { args.Player.SendMultipleMatchError(players.Select(p => p.Name)); return; } if (players.Count == 0) { args.Player.SendErrorMessage("Invalid player name!"); return; } var player = players[0]; Color color; string text; if (args.Parameters.Count >= 5) { var rgbs = args.Parameters.Skip(args.Parameters.Count - 3).ToArray(); if (!byte.TryParse(rgbs[0], out var r) || !byte.TryParse(rgbs[1], out var g) || !byte.TryParse(rgbs[2], out var b)) { color = Color.Yellow; text = string.Join(" ", args.Parameters.Skip(1)); } else { color = new Color(r, g, b); text = string.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 4)); } } else { color = Color.Yellow; text = string.Join(" ", args.Parameters.Skip(1)); } SendCombatText(player, text, color, broadcast); }
public async Task Mute(CommandContext ctx, string player) { var players = TSPlayer.FindByNameOrID(player); if (players.Count == 0) { var emojiplr = DiscordEmoji.FromName(ctx.Client, ":warning:"); var embedplr = new DiscordEmbedBuilder { Title = "Player not found!", Description = $"{emojiplr} `{player}` not found!", Color = new DiscordColor(0xFF0000) // red }; await ctx.RespondAsync("", embed : embedplr); } else if (players[0].HasPermission(Permissions.mute)) { var emojiplr = DiscordEmoji.FromName(ctx.Client, ":warning:"); var embedplr = new DiscordEmbedBuilder { Title = "Permission denied!", Description = $"{emojiplr} `{player}` is immune to mute!", Color = new DiscordColor(0xFF0000) // red }; await ctx.RespondAsync("", embed : embedplr); } else if (players[0].mute) { var plr = players[0]; plr.mute = false; TShockAPI.TSPlayer.All.SendInfoMessage("{0} has been unmuted by {1}.", plr.Name, ctx.Member.Username); var emojiplr = DiscordEmoji.FromName(ctx.Client, ":ok:"); var embedplr = new DiscordEmbedBuilder { Title = "Player has been unmuted!", Description = $"{emojiplr} `{player}` has been unmuted!", Color = new DiscordColor(0x00fd2c) // green }; await ctx.RespondAsync("", embed : embedplr); } else { var plr = players[0]; plr.mute = true; TShockAPI.TSPlayer.All.SendInfoMessage("{0} has been muted by {1}.", plr.Name, ctx.Member.Username); var emojiplr = DiscordEmoji.FromName(ctx.Client, ":ok:"); var embedplr = new DiscordEmbedBuilder { Title = "Player has been muted!", Description = $"{emojiplr} Player `{player}` has been muted!", Color = new DiscordColor(0x00fd2c) // green }; await ctx.RespondAsync("", embed : embedplr); } }
public static TSPlayer GetPlayerByName(string playerName) { var playerMatches = TSPlayer.FindByNameOrID(playerName); if (0 == playerMatches.Count) { throw new ArgumentException(String.Format("Invalid player! {0} not found", playerName)); } if (1 < playerMatches.Count) { throw new ArgumentException(String.Format("More than one match found: {0}", String.Join(", ", playerMatches.Select(currPlayer => currPlayer.Name)))); } return(playerMatches[0]); }
private void OASet(CommandArgs args) { bool isGreet = args.Message.StartsWith("setgreet"); if (args.Parameters.Count < 2) { args.Player.SendErrorMessage($"Invalid syntax: {(isGreet ? "setgreet" : "setleave")} <player> <announcement>"); return; } string playerName = args.Parameters[0]; string message = string.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)); var pList = TSPlayer.FindByNameOrID(playerName); if (pList.Count == 0) { args.Player.SendErrorMessage("No players found by the name: " + playerName); return; } if (pList.Count > 1) { args.Player.SendMultipleMatchError(pList.Select(e => e.Name)); return; } OAInfo info = pList[0].GetData <OAInfo>(OAString); if (isGreet) { info.greet = message; } else { info.leave = message; } if (info.wasInDatabase) { DB.UpdateAnnouncement(info); } else { DB.AddAnnouncement(info); } info.wasInDatabase = true; pList[0].SetData(OAString, info); args.Player.SendSuccessMessage($"You have successfully set {pList[0].Name}'s {(isGreet.OAType())} to {message}"); }
private void OnNpcStrike(NpcStrikeEventArgs args) { var ply = TSPlayer.FindByNameOrID(args.Player.name)[0]; var item = ply.TPlayer.inventory[ply.TPlayer.selectedItem]; var job = Data.Job.GetJob(ply.Name); NetMessage.SendData((int)PacketTypes.Status, -1, -1, Terraria.Localization.NetworkText.FromLiteral("Status 测试 "), 100, 2); if (item.magic && job.jobType == Data.Job.JobType.法师 || item.melee && job.jobType == Data.Job.JobType.战士 || item.ranged && job.jobType == Data.Job.JobType.射手) { args.Damage += args.Damage * (int)job.Level * Data.Config.GetConfig().Player.DamageAdd / 100; } args.Damage = args.Damage + args.Damage / (Data.Config.GetConfig().NPC.Level + 1) / 10; }
public static void ForceJoin(CommandArgs args) { TSPlayer tSPlayer = args.Player; if (args.Parameters.Count < 2) { tSPlayer.SendErrorMessage("Invalid syntax! Proper syntax: /forcejoin <Player Name> <Event Name>"); return; } List <TSPlayer> tSPlayerTargets = TSPlayer.FindByNameOrID(args.Parameters[0]); if (tSPlayerTargets.Count == 0) { tSPlayer.SendErrorMessage("The player specified was not found!"); return; } if (tSPlayerTargets.Count > 1) { tSPlayer.SendErrorMessage("Multiple players with that name were found!"); return; } TSPlayer tSPlayerTarget = tSPlayerTargets.First(); string eventName = string.Join("", args.Parameters.Skip(1)).ToLower(); HubEvent hubEvent = HubEvent.GetEvent(eventName); if (hubEvent == null) { tSPlayer.SendErrorMessage("The event specified was not found!"); return; } // Check if player has already joined an event, and if so, remove them from it HubEvent playerHubEvent = HubEvent.GetEventPlayerIn(tSPlayerTarget.Name); if (playerHubEvent != null) { HubEvent.RemovePlayerFromEvent(tSPlayerTarget, playerHubEvent); } HubEvent.AddPlayerToEvent(tSPlayerTarget, hubEvent); tSPlayer.SendSuccessMessage(string.Format("{0} was successfully added to {1}!", tSPlayerTarget.Name, hubEvent.eventName)); }
public static void SpectatePlayer(CommandArgs args) { TSPlayer tSPlayer = args.Player; Player player = tSPlayer.TPlayer; if (args.Parameters.Count < 1) { tSPlayer.SendErrorMessage("Invalid syntax! Proper syntax: /spectate <Player Name>"); return; } List <TSPlayer> tSPlayerTargets = TSPlayer.FindByNameOrID(args.Parameters[0]); if (tSPlayerTargets.Count == 0) { tSPlayer.SendErrorMessage("The player specified was not found!"); return; } if (tSPlayerTargets.Count > 1) { tSPlayer.SendErrorMessage("Multiple players with that name were found!"); return; } TSPlayer tSPlayerTarget = tSPlayerTargets.First(); if (tSPlayer == tSPlayerTarget) { tSPlayer.SendErrorMessage("You can't spectate yourself!"); return; } Util.spectatingPlayersToTargets.Remove(tSPlayer); Util.spectatingPlayersToTargets.Add(tSPlayer, tSPlayerTarget); tSPlayer.ResetPlayer(); tSPlayer.GodMode = true; player.active = false; NetMessage.SendData((int)PacketTypes.PlayerActive, -1, args.Player.Index, null, args.Player.Index, 0); tSPlayer.SendSuccessMessage("You are now spectating " + tSPlayerTarget.Name + "!"); }
private static void TogglePvP(CommandArgs args) { if (args.Parameters.Count != 1) { args.Player.SendErrorMessage("You used too many parameters! Try /tpvp \"player's name\"!"); } var plStr = string.Join(" ", args.Parameters); var ply = TSPlayer.FindByNameOrID(plStr); if (ply.Count < 1) { args.Player.SendErrorMessage("No players matched that name!"); } else if (ply.Count > 1) { args.Player.SendErrorMessage("More than one player has that name!"); } else { var player = ply[0]; if (args.Parameters.Count == 1 && ply.Count == 1) { if (!Main.player[player.Index].hostile) { Main.player[player.Index].hostile = true; NetMessage.SendData((int)PacketTypes.TogglePvp, -1, -1, NetworkText.Empty, player.Index); args.Player.SendInfoMessage(string.Format("You have turned {0}'s PvP on!", player.Name)); player.SendInfoMessage(string.Format("{0} has turned your PvP on!", args.Player.Name)); } else if (Main.player[player.Index].hostile) { Main.player[player.Index].hostile = false; NetMessage.SendData((int)PacketTypes.TogglePvp, -1, -1, NetworkText.Empty, player.Index); args.Player.SendInfoMessage(string.Format("You have turned {0}'s PvP off!", player.Name)); player.SendInfoMessage(string.Format("{0} has turned your PvP off!", args.Player.Name)); } } } }
public async Task Kick(CommandContext ctx, string player, string reason = null) { var players = TSPlayer.FindByNameOrID(player); if (players.Count == 0) { var emojiplr = DiscordEmoji.FromName(ctx.Client, ":warning:"); var embedplr = new DiscordEmbedBuilder { Title = "Player not found!", Description = $"{emojiplr} `{player}` not found!", Color = new DiscordColor(0xFF0000) // red }; await ctx.RespondAsync("", embed : embedplr); } else { if (!players[0].Kick(reason ?? "null", false, false, ctx.Member.Username, true)) { var emojiplr = DiscordEmoji.FromName(ctx.Client, ":warning:"); var embedplr = new DiscordEmbedBuilder { Title = "Permission denied!", Description = $"{emojiplr} `{player}`is immune to kick!", Color = new DiscordColor(0xFF0000) // red }; await ctx.RespondAsync("", embed : embedplr); } else { var emojiplr = DiscordEmoji.FromName(ctx.Client, ":ok:"); var embedplr = new DiscordEmbedBuilder { Title = "Player was kicked!", Description = $"{emojiplr} Player `{player}` was kicked{((!string.IsNullOrWhiteSpace(reason)) ? $" for `{reason}`" : "")}!", Color = new DiscordColor(0x00fd2c) // green }; await ctx.RespondAsync("", embed : embedplr); } } }
private void StaffChat_Kick(CommandArgs args) { if (args.Parameters.Count < 1) { args.Player.SendErrorMessage($"Invalid syntax! Syntax: {TShock.Config.CommandSpecifier}skick <player>"); return; } var foundplr = TSPlayer.FindByNameOrID(string.Join(" ", args.Parameters)); if (foundplr.Count == 0) { args.Player.SendErrorMessage("Invalid player!"); return; } if (foundplr.Count > 1) { TShock.Players[args.Player.Index].SendMultipleMatchError(foundplr.Select(e => e.Name)); return; } var plr = foundplr[0]; if (!InStaffChat[plr.Index] || !plr.HasPermission(Permission.Chat)) { args.Player.SendErrorMessage("This player is not in the staffchat!"); return; } if (plr.HasPermission(Permission.Chat)) { args.Player.SendErrorMessage("You can't kick another staff member from the staffchat!"); return; } InStaffChat[plr.Index] = false; plr.SendInfoMessage("You have been removed from staffchat!"); foreach (TSPlayer ts in TShock.Players.Where(e => e != null && (e.HasPermission(Permission.Chat) || InStaffChat[e.Index]))) { ts.SendInfoMessage(plr.Name + " has been removed from the staffchat."); } }
private void Whisper(CommandArgs args) { if (args.Parameters.Count < 2) { args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /whisper <player> <text>"); return; } var players = TSPlayer.FindByNameOrID(args.Parameters[0]); if (players.Count == 0) { args.Player.SendErrorMessage("Invalid player!"); } else if (players.Count > 1) { args.Player.SendMultipleMatchError(players.Select(p => p.Name)); } else if (args.Player.mute) { args.Player.SendErrorMessage("You are muted."); } else { var plr = players[0]; var msg = string.Join(" ", args.Parameters.ToArray(), 1, args.Parameters.Count - 1); if (!args.Player.HasPermission("antispam.ignore")) { msg = RemoveTags(msg); if ((double)msg.Count(Char.IsUpper) / msg.Length >= _config.CapsRatio) { msg = msg.ToLower(); } } plr.SendMessage(String.Format("<From {0}> {1}", args.Player.Name, msg), Color.MediumPurple); args.Player.SendMessage(String.Format("<To {0}> {1}", plr.Name, msg), Color.MediumPurple); plr.LastWhisper = args.Player; args.Player.LastWhisper = plr; } }
private static void SendMessageToOther(CommandArgs args) { if (args.Parameters.Count == 0) { args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /sendother <Player> <Messages> [r] [g] [b]"); return; } var players = TSPlayer.FindByNameOrID(args.Parameters[0]); if (players.Count > 1) { args.Player.SendMultipleMatchError(players.Select(p => p.Name)); return; } if (players.Count == 0) { args.Player.SendErrorMessage("Invalid player name!"); return; } var player = players[0]; if (args.Parameters.Count >= 5) { var rgbs = args.Parameters.Skip(args.Parameters.Count - 3).ToArray(); if (!byte.TryParse(rgbs[0], out var r) || !byte.TryParse(rgbs[1], out var g) || !byte.TryParse(rgbs[2], out var b)) { player.SendInfoMessage(string.Join(" ", args.Parameters.Skip(1))); } else { player.SendMessage(string.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 4)), r, g, b); } } else { player.SendInfoMessage(string.Join(" ", args.Parameters.Skip(1))); } }
public static void Transfer(CommandArgs args) { if (args.Parameters.Count <= 0) { args.Player.SendErrorMessage("Uzycie: /przelej <nick> <ilosc>"); return; } List <TSPlayer> list = TSPlayer.FindByNameOrID(args.Parameters[0]); int result; if (list.Count < 1) { args.Player.SendErrorMessage("Nie mozna bylo znalezc gracza {0}.", args.Parameters[0]); } else if (list.Count > 1) { args.Player.SendErrorMessage("Znaleziono wiecej niz jednego gracza.", args.Parameters[0]); } else if (list[0] == args.Player) { args.Player.SendErrorMessage("Nie mozna przelac pieniedzy samemu sobie."); } else if (int.TryParse(args.Parameters[1], out result)) { if (result <= 0) { args.Player.SendErrorMessage("Podana wartosc nie moze byc rowna 0 lub mniejsza."); } else { Operations.SendMoney(args.Player, list[0], result); } } else { args.Player.SendErrorMessage("Podano zla wartosc."); } }
private static void Show(CommandArgs args) { if (args.Parameters.Count == 0 && !args.Player.RealPlayer) { args.Player.SendErrorMessage("只有玩家才能使用战绩."); return; } var player = args.Player; if (args.Parameters.Count > 0) { var players = TSPlayer.FindByNameOrID(string.Join(" ", args.Parameters)); if (players.Count == 0) { args.Player.SendErrorMessage("指定玩家无效!"); return; } if (players.Count > 1) { args.Player.SendMultipleMatchError(players.Select(p => p.Name)); return; } player = players.Single(); if (!player.GetData <bool>(PvpAllow) && !args.Player.HasPermission("nanami.pvp.showother")) { args.Player.SendErrorMessage("{0} 已经禁止别人查看其战绩.", player.Name); return; } } var dt = PlayerPvpData.GetPlayerData(player.Index); args.Player.SendInfoMessage($"{"---- {0}的PvP战绩 ----",38}", player.Name); args.Player.SendInfoMessage($"{"",11}* | 消灭 {dt.Eliminations,8} | {"连续消灭数目",6} {dt.KillStreak,8} |"); args.Player.SendInfoMessage($"{"",11}* | 伤害 {dt.DamageDone,8} | {"总承受伤害量",6} {dt.Endurance,8} |"); args.Player.SendInfoMessage($"{"",11}* | 死亡 {dt.Deaths,8} | {"最大连续消灭",6} {dt.BestKillStreak,8} |"); }
public static void Currency(CommandArgs args) { if (args.Parameters.Count > 0) { List <TSPlayer> list = TSPlayer.FindByNameOrID(args.Parameters[0]); if (list.Count < 1) { args.Player.SendErrorMessage("Nie mozna bylo znalezc gracza {0}.", args.Parameters[0]); } else if (list.Count > 1) { args.Player.SendErrorMessage("Znaleziono wiecej niz jednego gracza.", args.Parameters[0]); } else { args.Player.SendInfoMessage(string.Format("Stan konta {0}: {1} {2}", list[0].Name, SurvivalCore.SrvPlayers[list[0].Index].Money.ToString("N0").Replace(' ', ','), Economy.Config.ValueName)); } } else { args.Player.SendInfoMessage(string.Format("Stan twojego konta: {0} {1}", SurvivalCore.SrvPlayers[args.Player.Index].Money.ToString("N0").Replace(' ', ','), Economy.Config.ValueName)); } }
private void PBCheck(CommandArgs args) { if (args.Parameters.Count == 0) { args.Player.SendErrorMessage("Invalid syntax: {0}buffcheck <player>", (args.Silent ? TShock.Config.CommandSilentSpecifier : TShock.Config.CommandSpecifier)); return; } var playername = string.Join(" ", args.Parameters); var players = TSPlayer.FindByNameOrID(playername); if (players.Count < 1) { args.Player.SendErrorMessage("No players found."); } else if (players.Count > 1) { args.Player.SendMultipleMatchError(players.Select(p => p.Name)); } else if (!players[0].IsLoggedIn) { args.Player.SendErrorMessage("{0} has no permabuffs active.", players[0].Name); } else { if (DB.PlayerBuffs[players[0].Account.ID].bufflist.Count == 0) { args.Player.SendInfoMessage("{0} has no permabuffs active.", players[0].Name); } else { args.Player.SendInfoMessage("{0} has the following permabuffs active: {1}", players[0].Name, string.Join(", ", DB.PlayerBuffs[players[0].Account.ID].bufflist.Select(p => TShock.Utils.GetBuffName(p)))); } } }
public static async void Mute(CommandArgs e) { string subCmd = e.Parameters.FirstOrDefault() ?? "help"; switch (subCmd.ToLowerInvariant()) { #region Add case "add": { var regex = new Regex(@"^\w+ \w+ (?:""(.+?)""|([^\s]+?))(?: (.+))?$"); Match match = regex.Match(e.Message); if (!match.Success) { e.Player.SendErrorMessage("Invalid syntax! Proper syntax: /mute add <name> [time]"); return; } int seconds = Int32.MaxValue / 1000; if (!String.IsNullOrWhiteSpace(match.Groups[3].Value) && (!TShock.Utils.TryParseTime(match.Groups[3].Value, out seconds) || seconds <= 0 || seconds > Int32.MaxValue / 1000)) { e.Player.SendErrorMessage("Invalid time '{0}'!", match.Groups[3].Value); return; } string playerName = String.IsNullOrWhiteSpace(match.Groups[2].Value) ? match.Groups[1].Value : match.Groups[2].Value; List <TSPlayer> players = TSPlayer.FindByNameOrID(playerName); if (players.Count == 0) { UserAccount user = TShock.UserAccounts.GetUserAccountByName(playerName); if (user == null) { e.Player.SendErrorMessage("Invalid player or account '{0}'!", playerName); } else { if (TShock.Groups.GetGroupByName(user.Group).GetDynamicPermission(Permissions.Mute) >= e.Player.Group.GetDynamicPermission(Permissions.Mute)) { e.Player.SendErrorMessage("You can't mute {0}!", user.Name); return; } if (await EssentialsPlus.Mutes.AddAsync(user, DateTime.UtcNow.AddSeconds(seconds))) { TSPlayer.All.SendInfoMessage("{0} muted {1}.", e.Player.Name, user.Name); } else { e.Player.SendErrorMessage("Could not mute, check logs for details."); } } } else if (players.Count > 1) { e.Player.SendErrorMessage("More than one player matched: {0}", String.Join(", ", players.Select(p => p.Name))); } else { if (players[0].Group.GetDynamicPermission(Permissions.Mute) >= e.Player.Group.GetDynamicPermission(Permissions.Mute)) { e.Player.SendErrorMessage("You can't mute {0}!", players[0].Name); return; } if (await EssentialsPlus.Mutes.AddAsync(players[0], DateTime.UtcNow.AddSeconds(seconds))) { TSPlayer.All.SendInfoMessage("{0} muted {1}.", e.Player.Name, players[0].Name); players[0].mute = true; try { await Task.Delay(TimeSpan.FromSeconds(seconds), players[0].GetPlayerInfo().MuteToken); players[0].mute = false; players[0].SendInfoMessage("You have been unmuted."); } catch (TaskCanceledException) { } } else { e.Player.SendErrorMessage("Could not mute, check logs for details."); } } } return; #endregion #region Delete case "del": case "delete": { var regex = new Regex(@"^\w+ \w+ (?:""(.+?)""|([^\s]*?))$"); Match match = regex.Match(e.Message); if (!match.Success) { e.Player.SendErrorMessage("Invalid syntax! Proper syntax: /mute del <name>"); return; } string playerName = String.IsNullOrWhiteSpace(match.Groups[2].Value) ? match.Groups[1].Value : match.Groups[2].Value; List <TSPlayer> players = TSPlayer.FindByNameOrID(playerName); if (players.Count == 0) { UserAccount user = TShock.UserAccounts.GetUserAccountByName(playerName); if (user == null) { e.Player.SendErrorMessage("Invalid player or account '{0}'!", playerName); } else { if (await EssentialsPlus.Mutes.DeleteAsync(user)) { TSPlayer.All.SendInfoMessage("{0} unmuted {1}.", e.Player.Name, user.Name); } else { e.Player.SendErrorMessage("Could not unmute, check logs for details."); } } } else if (players.Count > 1) { e.Player.SendErrorMessage("More than one player matched: {0}", String.Join(", ", players.Select(p => p.Name))); } else { if (await EssentialsPlus.Mutes.DeleteAsync(players[0])) { players[0].mute = false; TSPlayer.All.SendInfoMessage("{0} unmuted {1}.", e.Player.Name, players[0].Name); } else { e.Player.SendErrorMessage("Could not unmute, check logs for details."); } } } return; #endregion #region Help default: e.Player.SendSuccessMessage("Mute Sub-Commands:"); e.Player.SendInfoMessage("add <name> [time] - Mutes a player or account."); e.Player.SendInfoMessage("del <name> - Unmutes a player or account."); return; #endregion } }
public void ResetPlayer(CommandArgs args) { var cmd = TShock.Config.Settings.CommandSpecifier; TSPlayer player = args.Player; if (Main.ServerSideCharacter) { if (args.Parameters.Count < 2) { player.SendErrorMessage($"Invalid syntax! Proper syntax: {cmd}resetplayer <username> <all|stats|inventory|quests>"); return; } var username = args.Parameters[0]; var subcmd = args.Parameters[1].ToLower(); IDbConnection db = TShock.CharacterDB.database; bool online = true; int userid = 0; List <TSPlayer> players = TSPlayer.FindByNameOrID(username); if (players.Count < 1) // If player is not found online { online = false; //player.SendWarningMessage("Player not found online. Searching database..."); player.SendInfoMessage("Player not found online. Searching database... (Offline queries are case sensitive)"); } else if (players.Count > 1) { args.Player.SendMultipleMatchError(players.Select(p => p.Name)); return; } if (!online) { if (TShock.UserAccounts.GetUserAccountByName(username) == null) { //player.SendErrorMessage("Username \"{0}\" not found in database. (Usernames are case-sensitive)", username); player.SendErrorMessage($"Username {username} not found in database. (Usernames are case-sensitive)"); return; } else { //userid = TShock.Users.GetUserByName(username).ID; // Can't reset offline players unless using resetplayers to reset ALL players userid = TShock.UserAccounts.GetUserAccountID(username); // works but is case sensitive } } switch (subcmd) { case "all": try { if (online) { ResetStats(players[0]); ResetInventory(players[0]); ResetQuests(players[0]); ResetBanks(players[0]); player.SendSuccessMessage($"{players[0].Name}'s character has been reset!"); players[0].SendInfoMessage("Your character has been reset!"); } else { TShock.CharacterDB.RemovePlayer(userid); player.SendSuccessMessage($"{username}'s character has been reset!"); } } catch (Exception ex) { player.SendErrorMessage($"An error occurred while resetting all for: {username}"); TShock.Log.ConsoleError(ex.ToString()); } break; case "stats": try { if (online) { ResetStats(players[0]); player.SendSuccessMessage($"{players[0].Name}'s stats have been reset!"); players[0].SendInfoMessage("Your stats have been reset!"); } else { db.Query("UPDATE tsCharacter SET Health = @0, MaxHealth = @1, Mana = @2, MaxMana = @3 WHERE Account = @4;", startHealth, startHealth, startMana, startMana, userid); player.SendSuccessMessage($"{players[0].Name}'s stats have been reset!"); } } catch (Exception ex) { player.SendErrorMessage($"An error occurred while resetting stats for: {players[0].Name}"); TShock.Log.ConsoleError(ex.ToString()); } break; case "inventory": try { if (online) { ResetInventory(players[0]); ResetBanks(players[0]); player.SendSuccessMessage($"{players[0].Name}'s inventory has been reset!"); players[0].SendInfoMessage("Your inventory has been reset!"); } else { var inventory = new StringBuilder(); //for (int i = 0; i < Terraria.Main.maxInventory; i++) for (int i = 0; i < 58; i++) { if (i > 0) { inventory.Append("~"); } if (i < TShock.ServerSideCharacterConfig.Settings.StartingInventory.Count) { var item = TShock.ServerSideCharacterConfig.Settings.StartingInventory[i]; inventory.Append(item.NetId).Append(',').Append(item.Stack).Append(',').Append(item.PrefixId); } else { inventory.Append("0,0,0"); } } string initialItems = inventory.ToString(); db.Query("UPDATE tsCharacter SET Inventory = @0 WHERE Account = @1;", initialItems, userid); player.SendSuccessMessage($"{username}'s inventory has been reset!"); } } catch (Exception ex) { player.SendErrorMessage($"An error occurred while resetting inventory for: {username}"); TShock.Log.ConsoleError(ex.ToString()); } break; case "quests": try { if (online) { ResetQuests(players[0]); player.SendSuccessMessage($"{players[0].Name}'s quests have been reset to 0!"); players[0].SendInfoMessage("Your quests have been reset to 0!"); } else { db.Query("UPDATE tsCharacter SET questsCompleted = @0 WHERE Account = @1;", 0, userid); player.SendSuccessMessage($"{username}'s quests have been reset to 0!"); } } catch (Exception ex) { player.SendErrorMessage($"An error occurred while resetting quests for: {username}"); TShock.Log.ConsoleError(ex.ToString()); } break; default: player.SendErrorMessage($"Invalid syntax! Proper syntax: {cmd}resetplayer <username> <all|stats|inventory|quests>"); break; } } else { player.SendErrorMessage("SSC is not enabled on this server! \nThis plugin will only work if SSC (Server Side Characters) is enabled!"); } }
public async Task Info(CommandContext ctx, string username) { var emojiOnline = DiscordEmoji.FromName(ctx.Client, ":white_check_mark:"); var emojiOffline = DiscordEmoji.FromName(ctx.Client, ":no_entry:"); var player = TSPlayer.FindByNameOrID(username); string pattern = @"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"; Regex r = new Regex(pattern, RegexOptions.IgnoreCase); if (!string.IsNullOrWhiteSpace(username)) { var account = TShock.UserAccounts.GetUserAccountByName(username); if (r.IsMatch(username)) { #region IP Ban ban = TShock.Bans.GetBanByIp(username); string accounts = null; List <string> accountlist = Utils.GetUserAccountByIP(username); if (accountlist.Count > 0) { foreach (string accountPly in accountlist) { accounts += "`" + accountPly + "` "; } } var embed = new DiscordEmbedBuilder { Title = "**" + username + "**", Description = (accountlist.Count > 0) ? $"{emojiOnline} **Accounts:** {accounts}" : $"{emojiOffline} **No accounts found!**", Color = new DiscordColor(0xAC983C) }; string expBan = (ban.Expiration != "" && ban.Expiration != null) ? $"*{ban.Expiration}*\n" : "**PERMANENT**\n"; embed.AddField("Current ban", (ban != null) ? $"**Username: {ban.AccountName}**" + $"\nBy *{ban.BanningUser}*" + $"\nDate: *{ban.BanDateTime}*" + $"\nExpiration:" + expBan + $"\n**Reason:** `{ban.Reason}`" : "No ban!"); //string banlist = null; //int i = 1; //if (bans.Count > 0) //{ // foreach (Ban item in bans) // { // string exp = (item.Expiration != "" && item.Expiration != null) ? $"*{item.Expiration}*\n" : "**ПЕРМАНЕНТ**\n"; // banlist += $"{i}. **{item.AccountName}**" + // $"\nBy *{item.BanningUser}*" + // $"\nDate: *{item.Date}*" + // $"\nExpiration: " + // exp + // $"\n**Reason:** `{item.Reason}`\n \n"; // i++; // } // embed.AddField("Все баны", banlist); //} await ctx.RespondAsync("", embed : embed); return; #endregion } if (account != null) { #region USER DateTime LastSeen; string Timezone = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now).Hours.ToString("+#;-#"); if (DateTime.TryParse(account.LastAccessed, out LastSeen)) { LastSeen = DateTime.Parse(account.LastAccessed).ToLocalTime(); List <string> KnownIps = JsonConvert.DeserializeObject <List <string> >(account.KnownIps?.ToString() ?? string.Empty); string ip = KnownIps?[KnownIps.Count - 1] ?? "N/A"; DateTime Registered = DateTime.Parse(account.Registered).ToLocalTime(); Ban ban = TShock.Bans.GetBanByAccountName(username, true); var embed = new DiscordEmbedBuilder { Title = "**" + username + "**", Description = (player.Count > 0) ? $"{emojiOnline} **{username} Online!**" : $"{emojiOffline} **{username} Offline!**", Color = new DiscordColor(0xAC983C) }; embed.AddField("Last login occured", $"{LastSeen.ToShortDateString()} {LastSeen.ToShortTimeString()} UTC{Timezone}."); embed.AddField("Group", account.Group); embed.AddField("IP", (player.Count > 1) ? player[0].IP : ip); embed.AddField("Register date", $"{Registered.ToShortDateString()} {Registered.ToShortTimeString()} UTC{Timezone}."); embed.AddField("Current ban", (ban != null) ? $"By *{ban.BanningUser}*" + $"\nDate: *{ban.BanDateTime}*" + $"\nExpiration: *{ban.ExpirationDateTime}*\n " + $"\n**Reason:** `{ban.Reason}`" : "No ban!"); //List<Ban> banlist = CommandManager.AdvancedBan.GetBans("", account.Name); //string bans = null; //int i = 1; //if (banlist.Count > 0) //{ // foreach (Ban item in banlist) // { // bans += $"{i}.\n" + // $"By *{item.BanningUser}*" + // $"\nDate: *{item.Date}*" + // $"\nExpiration: *{item.Expiration}*" + // $"\n**Reason:** `{item.Reason}`\n \n"; // i++; // } // embed.AddField("All bans", bans); //} await ctx.RespondAsync("", embed : embed); return; } #endregion } else { var emoji = DiscordEmoji.FromName(ctx.Client, ":warning:"); var embed = new DiscordEmbedBuilder { Title = "Account or IP not found!", Description = $"{emoji} `{username}` not found!", Color = new DiscordColor(0xFF0000) }; await ctx.RespondAsync("", embed: embed); return; } } else { #region ERROR var emojiplr = DiscordEmoji.FromName(ctx.Client, ":warning:"); var embedplr = new DiscordEmbedBuilder { Title = "Invalid syntax!", Description = $"{emojiplr} /info <account/username/ip>", Color = new DiscordColor(0xFF0000) // red }; await ctx.RespondAsync("", embed : embedplr); #endregion } }
public async Task Ban(CommandContext ctx, string user, string time, string reason = "no reason") { bool parsedOkay = false; bool success = false; string targetGeneralizedName = ""; int banLengthInSeconds = 0; List <TSPlayer> players = TSPlayer.FindByNameOrID(user); UserAccount offlineUserAccount = TShock.UserAccounts.GetUserAccountByName(user); if (time != "0") { parsedOkay = TShock.Utils.TryParseTime(time, out banLengthInSeconds); } else { parsedOkay = true; } if (!parsedOkay) { var emojitime = DiscordEmoji.FromName(ctx.Client, ":warning:"); var embedtime = new DiscordEmbedBuilder { Title = "Invalid time format", Description = $"{emojitime} Example: *0 (permanent), 10d 5h 3m 2s*", Color = new DiscordColor(0xFF0000) // red }; await ctx.RespondAsync("", embed : embedtime); return; } if (players.Count == 1) { TSPlayer target = players[0]; if (target.HasPermission(Permissions.immunetoban)) { var emojiimmune = DiscordEmoji.FromName(ctx.Client, ":warning:"); var embedimmune = new DiscordEmbedBuilder { Title = "Permissions denied!", Description = $"{emojiimmune} Player is immune to ban!", Color = new DiscordColor(0xFF0000) // red }; await ctx.RespondAsync("", embed : embedimmune); return; } targetGeneralizedName = target.Name; success = TShock.Bans.AddBan(target.IP, target.Name, target.UUID, target.Account?.Name ?? "", reason, false, ctx.User.Username + "#" + ctx.User.Discriminator, banLengthInSeconds == 0 ? "" : DateTime.UtcNow.AddSeconds(banLengthInSeconds).ToString("s")); //Terraria4PDA.CommandManager.AdvancedBan.AddBanToDB(target.IP, target.Name, target.UUID, target.Account?.Name ?? "", reason, ctx.User.Username + "#" + ctx.User.Discriminator, // banLengthInSeconds == 0 ? "" : DateTime.UtcNow.AddSeconds(banLengthInSeconds).ToString("s")); if (success) { if (banLengthInSeconds == 0) { target.Disconnect(string.Format("Permanently banned for {0}", reason)); } else { target.Disconnect(string.Format("Banned for {0} seconds for {1}", banLengthInSeconds, reason)); } } } if (players.Count == 0) { // If the target is a valid IP... string pattern = @"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"; Regex r = new Regex(pattern, RegexOptions.IgnoreCase); if (r.IsMatch(user)) { targetGeneralizedName = "IP: " + user; success = TShock.Bans.AddBan(user, "", "", "", reason, false, ctx.User.Username, banLengthInSeconds == 0 ? "" : DateTime.UtcNow.AddSeconds(banLengthInSeconds).ToString("s")); //CommandManager.AdvancedBan.AddBanToDB(user, "", "", "", reason, // ctx.User.Username, banLengthInSeconds == 0 ? "" : DateTime.UtcNow.AddSeconds(banLengthInSeconds).ToString("s")); if (success && offlineUserAccount != null) { var emojiip = DiscordEmoji.FromName(ctx.Client, ":b:"); var embedip = new DiscordEmbedBuilder { Title = $"{emojiip} IP banned successfully!", Description = $"**IP:** `{user}`\n**Time:** `{time}`\n**Reason:** `{reason}`", Color = new DiscordColor(0x00fd2c) // green }; await ctx.RespondAsync("", embed : embedip); } } else { // Apparently there is no way to not IP ban someone // This means that where we would normally just ban a "character name" here // We can't because it requires some IP as a primary key. if (offlineUserAccount == null) { var emojierror = DiscordEmoji.FromName(ctx.Client, ":warning:"); var embederror = new DiscordEmbedBuilder { Title = "Invalid player/IP!", Description = $"{emojierror} `{user}` not found!!", Color = new DiscordColor(0xFF0000) // red }; await ctx.RespondAsync("", embed : embederror); return; } } } if (players.Count == 0 && offlineUserAccount != null) { // Catch: we don't know an offline player's last login character name // This means that we're banning their *user name* on the assumption that // user name == character name // (which may not be true) // This needs to be fixed in a future implementation. targetGeneralizedName = offlineUserAccount.Name; if (TShock.Groups.GetGroupByName(offlineUserAccount.Group).HasPermission(TShockAPI.Permissions.immunetoban)) { var emojiimmune = DiscordEmoji.FromName(ctx.Client, ":warning:"); var embedimmune = new DiscordEmbedBuilder { Title = "Permissions denied!", Description = $"{emojiimmune} Player is immune to ban!", Color = new DiscordColor(0xFF0000) // red }; await ctx.RespondAsync("", embed : embedimmune); return; } if (offlineUserAccount.KnownIps == null) { var emojierror = DiscordEmoji.FromName(ctx.Client, ":warning:"); var embederror = new DiscordEmbedBuilder { Title = "Error!", Description = $"{emojierror} `{user}` have no valid IP to ban.", Color = new DiscordColor(0xFF0000) // red }; await ctx.RespondAsync("", embed : embederror); return; } string lastIP = JsonConvert.DeserializeObject <List <string> >(offlineUserAccount.KnownIps).Last(); success = TShock.Bans.AddBan(lastIP, "", offlineUserAccount.UUID, offlineUserAccount.Name, reason, false, ctx.User.Username, banLengthInSeconds == 0 ? "" : DateTime.UtcNow.AddSeconds(banLengthInSeconds).ToString("s")); //CommandManager.AdvancedBan.AddBanToDB(lastIP, // "", offlineUserAccount.UUID, offlineUserAccount.Name, reason, ctx.User.Username, // banLengthInSeconds == 0 ? "" : DateTime.UtcNow.AddSeconds(banLengthInSeconds).ToString("s")); } if (success) { var emojiban = DiscordEmoji.FromName(ctx.Client, ":b:"); var embedban = new DiscordEmbedBuilder { Title = "Player successfully banned!", Color = new DiscordColor(0x00fd2c) // green }; if (banLengthInSeconds == 0) { embedban.AddField("Description", $"{emojiban} Player `{user}` was successfully banned **PERMANENTLY** for `{reason}`!*"); } else { embedban.AddField("Description", $"{emojiban} Player `{user}` was successfully banned for *{time}* for `{reason}`!*"); } await ctx.RespondAsync("", embed : embedban); } else { var emojierror = DiscordEmoji.FromName(ctx.Client, ":warning:"); var embederror = new DiscordEmbedBuilder { Title = "System error!", Description = $"{emojierror} Player was NOT banned due to a database error or other system problem.", Color = new DiscordColor(0xFF0000) // red }; await ctx.RespondAsync("", embed : embederror); } return; }
private static void ForceToggle(CommandArgs args) { if (args.Parameters.Count != 1) { args.Player.SendErrorMessage("Incorrect syntax. Use /fpvp \"player's name\" or *"); return; } string plStr = String.Join(" ", args.Parameters); var players = TSPlayer.FindByNameOrID(plStr); if (players.Count == 0 && ((plStr != "*") && (plStr != "all") && (plStr != "*off") && (plStr != "alloff"))) { args.Player.SendErrorMessage("No players matched that name"); return; } if (players.Count > 1 && ((plStr != "*") && (plStr != "all") && (plStr != "*off") && (plStr != "alloff"))) { args.Player.SendErrorMessage("More than one player matched that name"); return; } if (plStr == "*" || plStr == "all") { foreach (var pl in PvPplayer) { pl.PvPType = "forceon"; } TSPlayer.All.SendInfoMessage(string.Format("{0} has forced on everyone's PvP", args.Player.Name)); return; } if (plStr == "*off" || plStr == "alloff") { foreach (var pl in PvPplayer) { pl.PvPType = ""; } TSPlayer.All.SendInfoMessage(string.Format("{0} has stopped forcing everyone's PvP on. It can now be turned off", args.Player.Name)); } else { if (args.Parameters.Count == 1 && players.Count == 1) { var plr = players[0]; var player = Tools.GetPlayerByIndex(players[0].Index); if (player.PvPType == "") { player.PvPType = "forceon"; Main.player[plr.Index].hostile = true; NetMessage.SendData((int)PacketTypes.TogglePvp, -1, -1, NetworkText.Empty, plr.Index, 0f, 0f, 0f); plr.SendInfoMessage(string.Format("{0} has forced your PvP on!", args.Player.Name)); args.Player.SendInfoMessage(string.Format("You have forced {0}'s PvP on!", player.PlayerName)); } else if (player.PvPType == "forceon") { player.PvPType = ""; Main.player[plr.Index].hostile = false; NetMessage.SendData((int)PacketTypes.TogglePvp, -1, -1, NetworkText.Empty, plr.Index, 0f, 0f, 0f); plr.SendInfoMessage(string.Format("{0} has turned your PvP off!", args.Player.Name)); args.Player.SendInfoMessage(string.Format("You have turned {0}'s PvP off!", player.PlayerName)); } } } }
private void PBGive(CommandArgs args) { if (config.buffgroups.Length == 0) { args.Player.SendErrorMessage("Your server administrator has not defined any buff groups. Please contact an admin to fix this issue."); return; } var availableBuffGroups = config.buffgroups.Where(e => args.Player.HasPermission($"pb.{e.groupPerm}") || args.Player.HasPermission("pb.useall")).ToList(); if (args.Parameters.Count == 2) { // /gpermabuffs -g list if (args.Parameters[0].Equals("-g", StringComparison.CurrentCultureIgnoreCase) && args.Parameters[1].Equals("list", StringComparison.CurrentCultureIgnoreCase)) { args.Player.SendInfoMessage($"Available buff groups: {string.Join(", ", availableBuffGroups.Select(e => e.groupName))}"); return; } // Get player id from args.Parameters[1] var playername = args.Parameters[1]; var players = TSPlayer.FindByNameOrID(playername); if (players.Count < 1) { args.Player.SendErrorMessage("No players found."); return; } else if (players.Count > 1) { args.Player.SendMultipleMatchError(players.Select(p => p.Name)); return; } else if (!players[0].IsLoggedIn) { args.Player.SendErrorMessage("This player cannot receive permabuffs!"); return; } var playerid = players[0].Account.ID; //Get buff name/id from args.Parameters[0] var buff = args.Parameters[0]; if (!int.TryParse(args.Parameters[0], out var bufftype)) { var bufftypelist = new List <int>(); bufftypelist = TShock.Utils.GetBuffByName(buff); if (bufftypelist.Count < 1) { args.Player.SendErrorMessage("No buffs by that name were found."); return; } else if (bufftypelist.Count > 1) { args.Player.SendMultipleMatchError(bufftypelist.Select(p => TShock.Utils.GetBuffName(p))); return; } else { bufftype = bufftypelist[0]; } } else if (bufftype > Main.maxBuffTypes || bufftype < 1) // Buff ID is not valid (less than 1 or higher than 192 (1.3.1)). { args.Player.SendErrorMessage("Invalid buff ID!"); } //Removes all groups where the buff isn't included, leaving only a list of groups where player has access AND contains the buff availableBuffGroups.RemoveAll(e => !e.buffIDs.Contains(bufftype)); if (availableBuffGroups.Count == 0) { args.Player.SendErrorMessage("You do not have access to this permabuff!"); return; } if (DB.PlayerBuffs[playerid].bufflist.Contains(bufftype)) { DB.PlayerBuffs[playerid].bufflist.Remove(bufftype); DB.UpdatePlayerBuffs(playerid, DB.PlayerBuffs[playerid].bufflist); args.Player.SendInfoMessage($"You have removed the {TShock.Utils.GetBuffName(bufftype)} permabuff for {players[0].Name}."); if (!args.Silent) { players[0].SendInfoMessage($"{args.Player.Name} has removed your {TShock.Utils.GetBuffName(bufftype)} permabuff."); } } else if (bufftype.IsPermanent()) { DB.PlayerBuffs[playerid].bufflist.Add(bufftype); DB.UpdatePlayerBuffs(playerid, DB.PlayerBuffs[playerid].bufflist); args.Player.SendSuccessMessage($"You have permabuffed {players[0].Name} with the {TShock.Utils.GetBuffName(bufftype)} buff!"); if (!args.Silent) { players[0].SendInfoMessage($"{args.Player.Name} has permabuffed you with the {TShock.Utils.GetBuffName(bufftype)} buff!"); } } else { args.Player.SetBuff(bufftype); args.Player.SendSuccessMessage($"You have given {players[0].Name} the {TShock.Utils.GetBuffName(bufftype)} buff!"); if (!args.Silent) { players[0].SendInfoMessage($"{args.Player.Name} has given you the {TShock.Utils.GetBuffName(bufftype)} buff!"); } } } //gpermabuff -g <group> <player> else if (args.Parameters.Count == 3) { if (args.Parameters[0] != "-g") { args.Player.SendErrorMessage("Invalid syntax:"); args.Player.SendErrorMessage("{0}gpermabuff <buff name or ID> <player>", TShock.Config.CommandSpecifier); args.Player.SendErrorMessage("{0}gpermabuff -g <buff group> <player>", TShock.Config.CommandSpecifier); } var matchedPlayers = TSPlayer.FindByNameOrID(args.Parameters[2]); if (matchedPlayers.Count == 0) { args.Player.SendErrorMessage($"No players found by the name: {args.Parameters[2]}"); return; } else if (matchedPlayers.Count > 1) { args.Player.SendMultipleMatchError(matchedPlayers.Select(p => p.Name)); return; } else if (!matchedPlayers[0].IsLoggedIn) { args.Player.SendErrorMessage("This player cannot receive permabuffs!"); return; } else if (!availableBuffGroups.Any(e => e.groupName.Equals(args.Parameters[1], StringComparison.CurrentCultureIgnoreCase))) { args.Player.SendErrorMessage("No buffgroups matched your query!"); } var player = matchedPlayers[0]; var id = matchedPlayers[0].Account.ID; foreach (var buff in availableBuffGroups.First(e => e.groupName.Equals(args.Parameters[1], StringComparison.CurrentCultureIgnoreCase)).buffIDs) { if (!DB.PlayerBuffs[id].bufflist.Contains(buff) && buff.IsPermanent()) { DB.PlayerBuffs[id].bufflist.Add(buff); } } DB.UpdatePlayerBuffs(id, DB.PlayerBuffs[id].bufflist); args.Player.SendSuccessMessage($"Successfully permabuffed {player.Name} with all of the buffs in the group {args.Parameters[1]}!"); if (!args.Silent) { args.Player.SendInfoMessage($"{args.Player.Name} has permabuffed you with all of the buffs in the group {args.Parameters[1]}!"); } } else { args.Player.SendErrorMessage("Invalid syntax:"); args.Player.SendErrorMessage("{0}gpermabuff <buff name or ID> <player>", TShock.Config.CommandSpecifier); args.Player.SendErrorMessage("{0}gpermabuff -g <buff group> <player>", TShock.Config.CommandSpecifier); return; } }
private void CheckClones(CommandArgs args) { // clones -<a/i/o> <info> if (args.Parameters.Count != 2) { args.Player.SendErrorMessage($"Invalid syntax: {TShock.Config.CommandSpecifier}clones <-a/-i/-n/-o> <search>"); return; } switch (args.Parameters[0]) { case "-a": case "-A": var user = TShock.UserAccounts.GetUserAccountByName(args.Parameters[1]); if (user == null) { args.Player.SendErrorMessage("Unknown account."); return; } var iplist = JsonConvert.DeserializeObject <List <string> >(user.KnownIps); if (iplist.Count == 0 || string.IsNullOrWhiteSpace(user.UUID)) { args.Player.SendErrorMessage("This is an empty account."); return; } var clones = DB.GetClones(iplist.Last(), user.UUID); args.Player.SendInfoMessage($"{user.Name}'s clones: {string.Join(", ", clones)}"); break; case "-i": case "-I": clones = DB.GetClones(args.Parameters[1]); args.Player.SendInfoMessage($"Character matches for IP {args.Parameters[1]}: {string.Join(", ", clones)}"); break; case "-n": case "-N": var cloneinfo = DB.GetCloneInfo(args.Parameters[1]); clones = DB.GetClones(cloneinfo.IP, cloneinfo.UUID); args.Player.SendInfoMessage($"{cloneinfo.Character}'s clones: {string.Join(", ", clones)}"); break; case "-o": case "-O": var users = TSPlayer.FindByNameOrID(args.Parameters[1]); if (users.Count == 0) { args.Player.SendErrorMessage($"No matches found for player {args.Parameters[1]}."); return; } else if (users.Count > 1) { args.Player.SendMultipleMatchError(users.Select(e => e.Name)); return; } clones = DB.GetClones(users[0].IP, users[0].UUID); args.Player.SendInfoMessage($"{users[0].Name}'s clones: {string.Join(", ", clones)}"); break; default: args.Player.SendErrorMessage($"Invalid syntax: {TShock.Config.CommandSpecifier}clones <-a/-i/-n/-o> <search>"); break; } }
public static async void Sudo(CommandArgs e) { var regex = new Regex(String.Format(@"^\w+(?: -(\w+))* (?:""(.+?)""|([^\s]*?)) (?:{0})?(.+)$", TShock.Config.CommandSpecifier)); Match match = regex.Match(e.Message); if (!match.Success) { e.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}sudo [-switches...] <player> <command...>", TShock.Config.CommandSpecifier); e.Player.SendSuccessMessage("Valid {0}sudo switches:", TShock.Config.CommandSpecifier); e.Player.SendInfoMessage("-f, -force: Force sudo, ignoring permissions."); return; } bool force = false; foreach (Capture capture in match.Groups[1].Captures) { switch (capture.Value.ToLowerInvariant()) { case "f": case "force": if (!e.Player.Group.HasPermission(Permissions.SudoForce)) { e.Player.SendErrorMessage("You do not have access to the switch '-{0}'!", capture.Value); return; } force = true; continue; default: e.Player.SendSuccessMessage("Valid {0}sudo switches:", TShock.Config.CommandSpecifier); e.Player.SendInfoMessage("-f, -force: Force sudo, ignoring permissions."); return; } } string playerName = String.IsNullOrWhiteSpace(match.Groups[3].Value) ? match.Groups[2].Value : match.Groups[3].Value; string command = match.Groups[4].Value; List <TSPlayer> players = TSPlayer.FindByNameOrID(playerName); if (players.Count == 0) { e.Player.SendErrorMessage("Invalid player '{0}'!", playerName); } else if (players.Count > 1) { e.Player.SendErrorMessage("More than one player matched: {0}", String.Join(", ", players.Select(p => p.Name))); } else { if ((e.Player.Group.GetDynamicPermission(Permissions.Sudo) <= players[0].Group.GetDynamicPermission(Permissions.Sudo)) && !e.Player.Group.HasPermission(Permissions.SudoSuper)) { e.Player.SendErrorMessage("You cannot force {0} to execute {1}{2}!", players[0].Name, TShock.Config.CommandSpecifier, command); return; } e.Player.SendSuccessMessage("Forced {0} to execute {1}{2}.", players[0].Name, TShock.Config.CommandSpecifier, command); if (!e.Player.Group.HasPermission(Permissions.SudoInvisible)) { players[0].SendInfoMessage("{0} forced you to execute {1}{2}.", e.Player.Name, TShock.Config.CommandSpecifier, command); } var fakePlayer = new TSPlayer(players[0].Index) { AwaitingName = players[0].AwaitingName, AwaitingNameParameters = players[0].AwaitingNameParameters, AwaitingTempPoint = players[0].AwaitingTempPoint, Group = force ? new SuperAdminGroup() : players[0].Group, TempPoints = players[0].TempPoints }; await Task.Run(() => TShockAPI.Commands.HandleCommand(fakePlayer, TShock.Config.CommandSpecifier + command)); players[0].AwaitingName = fakePlayer.AwaitingName; players[0].AwaitingNameParameters = fakePlayer.AwaitingNameParameters; players[0].AwaitingTempPoint = fakePlayer.AwaitingTempPoint; players[0].TempPoints = fakePlayer.TempPoints; } }