Exemplo n.º 1
0
        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;
                }
            }
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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]);
                }
            }
        }
Exemplo n.º 4
0
        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.");
                }
            }
        }
Exemplo n.º 5
0
        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>");
            }
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        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);
            }
        }
Exemplo n.º 9
0
        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]);
        }
Exemplo n.º 10
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}");
        }
Exemplo n.º 11
0
        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;
        }
Exemplo n.º 12
0
        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));
        }
Exemplo n.º 13
0
        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 + "!");
        }
Exemplo n.º 14
0
        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));
                    }
                }
            }
        }
Exemplo n.º 15
0
        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);
                }
            }
        }
Exemplo n.º 16
0
        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.");
            }
        }
Exemplo n.º 17
0
        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;
            }
        }
Exemplo n.º 18
0
        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)));
            }
        }
Exemplo n.º 19
0
        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.");
            }
        }
Exemplo n.º 20
0
        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} |");
        }
Exemplo n.º 21
0
 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));
     }
 }
Exemplo n.º 22
0
        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))));
                }
            }
        }
Exemplo n.º 23
0
        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
            }
        }
Exemplo n.º 24
0
        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!");
            }
        }
Exemplo n.º 25
0
        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
            }
        }
Exemplo n.º 26
0
        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;
        }
Exemplo n.º 27
0
        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));
                    }
                }
            }
        }
Exemplo n.º 28
0
        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;
            }
        }
Exemplo n.º 29
0
        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;
            }
        }
Exemplo n.º 30
0
        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;
            }
        }