예제 #1
0
        private void OnGetData(GetDataEventArgs e)
        {
            if (e.Handled)
            {
                return;
            }

            TSPlayer tsplayer = TShock.Players[e.Msg.whoAmI];

            if (tsplayer == null)
            {
                return;
            }

            switch (e.MsgID)
            {
            //depracated https://github.com/Pryaxis/TerrariaAPI-Server/pull/151/commits/c302e57f4fd934420a4c3311220993d2c567f15b #region Packet 45 - PlayerKillMe

            case PacketTypes.PlayerDeathV2:
                if (tsplayer.Group.HasPermission(Permissions.TpBack))
                {
                    tsplayer.GetPlayerInfo().PushBackHistory(tsplayer.TPlayer.position);
                }
                return;

            case PacketTypes.Teleport:
            {
                if (tsplayer.Group.HasPermission(Permissions.TpBack))
                {
                    using (MemoryStream ms = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
                    {
                        BitsByte flags = (byte)ms.ReadByte();

                        int type = 0;
                        if (flags[1])
                        {
                            type = 2;
                        }

                        if (type == 0 && tsplayer.Group.HasPermission(TShockAPI.Permissions.rod))
                        {
                            tsplayer.GetPlayerInfo().PushBackHistory(tsplayer.TPlayer.position);
                        }
                        else if (type == 2 && tsplayer.Group.HasPermission(TShockAPI.Permissions.wormhole))
                        {
                            tsplayer.GetPlayerInfo().PushBackHistory(tsplayer.TPlayer.position);
                        }
                    }
                }
            }
                return;

                //#endregion
            }
        }
예제 #2
0
        private void OnGetData(GetDataEventArgs e)
        {
            if (e.Handled)
            {
                return;
            }

            TSPlayer tsplayer = TShock.Players[e.Msg.whoAmI];

            if (tsplayer == null)
            {
                return;
            }

            switch (e.MsgID)
            {
                #region Packet 45 - PlayerKillMe

            case PacketTypes.PlayerKillMe:
                if (tsplayer.Group.HasPermission(Permissions.TpBack))
                {
                    tsplayer.GetPlayerInfo().PushBackHistory(tsplayer.TPlayer.position);
                }
                return;

            case PacketTypes.Teleport:
            {
                if (tsplayer.Group.HasPermission(Permissions.TpBack))
                {
                    using (MemoryStream ms = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
                    {
                        BitsByte flags = (byte)ms.ReadByte();

                        int type = 0;
                        if (flags[1])
                        {
                            type = 2;
                        }

                        if (type == 0 && tsplayer.Group.HasPermission(TShockAPI.Permissions.rod))
                        {
                            tsplayer.GetPlayerInfo().PushBackHistory(tsplayer.TPlayer.position);
                        }
                        else if (type == 2 && tsplayer.Group.HasPermission(TShockAPI.Permissions.wormhole))
                        {
                            tsplayer.GetPlayerInfo().PushBackHistory(tsplayer.TPlayer.position);
                        }
                    }
                }
            }
                return;

                #endregion
            }
        }
예제 #3
0
        private void cmdBack(CommandArgs e)
        {
            TSPlayer   player = e.Player;
            PlayerInfo data   = player.GetPlayerInfo();

            if (!player.GetPlayerInfo().canBack || player.GetPlayerInfo().getLastLocationCount() == 0 || player.Dead)
            {
                e.Player.SendErrorMessage("Tak boleh back lagi!");
                return;
            }

            Vector2 vector = data.popLastLocation();

            player.Teleport(vector.X, vector.Y);
            e.Player.SendSuccessMessage("Teleport to your last location");
        }
예제 #4
0
        private void OnLeave(LeaveEventArgs e)
        {
            if ((e.Who < 0) || (e.Who > Main.maxNetPlayers))
            {
                return;
            }
            TSPlayer player = TShock.Players[e.Who];

            if (player != null)
            {
                PlayerInfo info = player.GetPlayerInfo();
                info.Restore(Main.ServerSideCharacter, player);
            }
            foreach (TSPlayer plr in TShock.Players)
            {
                if ((plr == null) || !plr.Active || !plr.ContainsData(PlayerInfo.KEY))
                {
                    continue;
                }

                PlayerInfo info = plr.GetPlayerInfo();
                if (info.CopyingPlayerIndex == e.Who)
                {
                    info.CopyingPlayerIndex = -1;
                }
            }
        }
예제 #5
0
        private async void OnJoin(JoinEventArgs e)
        {
            if (e.Handled)
            {
                return;
            }

            TSPlayer player = TShock.Players[e.Who];

            if (player == null)
            {
                return;
            }

            DateTime muteExpiration = await Mutes.GetExpirationAsync(player);

            if (DateTime.UtcNow < muteExpiration)
            {
                player.mute = true;
                try
                {
                    await Task.Delay(muteExpiration - DateTime.UtcNow, player.GetPlayerInfo().MuteToken);

                    player.mute = false;
                    player.SendInfoMessage("You have been unmuted.");
                }
                catch (TaskCanceledException)
                {
                }
            }
        }
예제 #6
0
 protected WECommand(int x, int y, int x2, int y2, TSPlayer plr)
 {
     this.plr    = plr;
     this.select = plr.GetPlayerInfo().Select ?? WorldEdit.Selections["normal"];
     this.x      = x;
     this.x2     = x2;
     this.y      = y;
     this.y2     = y2;
 }
예제 #7
0
 protected WECommand(int x, int y, int x2, int y2, MagicWand magicWand,
                     TSPlayer plr, bool minMaxPoints = true)
 {
     this.plr          = plr;
     this.select       = plr.GetPlayerInfo().Select ?? WorldEdit.Selections["normal"];
     this.x            = x;
     this.x2           = x2;
     this.y            = y;
     this.y2           = y2;
     this.magicWand    = magicWand ?? new MagicWand();
     this.minMaxPoints = minMaxPoints;
 }
예제 #8
0
        private void OnPlayerCommand(PlayerCommandEventArgs e)
        {
            if (e.Handled || e.Player == null)
            {
                return;
            }

            TSPlayer player = e.Player;

            if (everyTeleportCommands.Contains(e.CommandName))
            {
                player.GetPlayerInfo().pushLastLocation(player.TPlayer.position);
            }
        }
예제 #9
0
        void OnLeave(LeaveEventArgs e)
        {
            if (e.Who < 0 || e.Who > Main.maxNetPlayers)
            {
                return;
            }

            TSPlayer player = TShock.Players[e.Who];

            if (player != null)
            {
                PlayerInfo info = player.GetPlayerInfo();
                info.Restore(player);
            }
        }
예제 #10
0
        private void OnGetData(GetDataEventArgs e)
        {
            if (e.Handled)
            {
                return;
            }

            TSPlayer tsplayer = TShock.Players[e.Msg.whoAmI];

            if (tsplayer == null)
            {
                return;
            }

            PlayerInfo playerInfo = tsplayer.GetPlayerInfo();

            switch (e.MsgID)
            {
            case PacketTypes.PlayerDeathV2:
                playerInfo.pushLastLocation(tsplayer.TPlayer.position);
                break;
            }
        }
예제 #11
0
        /// <summary>
        /// Executes a command. Checks for specific permissions.
        /// </summary>
        /// <param name="player">The command issuer.</param>
        /// <param name="text">The command text.</param>
        /// <returns>True or false.</returns>
        public static bool ExecuteCommand(this TSPlayer player, string text)
        {
            string cmdText   = text.Remove(0, 1);
            string cmdPrefix = text[0].ToString();
            bool   silent    = false;

            if (cmdPrefix == TShock.Config.CommandSilentSpecifier)
            {
                silent = true;
            }

            var args = typeof(Commands).CallMethod <List <string> >("ParseParameters", cmdText);

            if (args.Count < 1)
            {
                return(false);
            }

            string cmdName = args[0].ToLower();

            args.RemoveAt(0);

            IEnumerable <Command> cmds = Commands.ChatCommands.FindAll(c => c.HasAlias(cmdName));

            if (PlayerHooks.OnPlayerCommand(player, cmdName, cmdText, args, ref cmds, cmdPrefix))
            {
                return(true);
            }

            if (cmds.Count() == 0)
            {
                if (player.AwaitingResponse.ContainsKey(cmdName))
                {
                    Action <CommandArgs> call = player.AwaitingResponse[cmdName];
                    player.AwaitingResponse.Remove(cmdName);
                    call(new CommandArgs(cmdText, player, args));
                    return(true);
                }
                player.SendErrorMessage("Invalid command entered. Type {0}help for a list of valid commands.", TShock.Config.CommandSpecifier);
                return(true);
            }
            foreach (Command command in cmds)
            {
                if (!command.AllowServer && !player.RealPlayer)
                {
                    player.SendErrorMessage("You must use this command in-game.");
                }
                else if ((!command.CanRun(player) && !player.GetPlayerInfo().HasPermission(command.Permissions.Any() ? command.Permissions[0] : null)) || (command.CanRun(player) && player.GetPlayerInfo().Permissions.Negated(command.Permissions.Any() ? command.Permissions[0] : null)))
                {
                    TShock.Utils.SendLogs(string.Format("{0} tried to execute {1}{2}.", player.Name, TShock.Config.CommandSpecifier, cmdText), Color.PaleVioletRed, player);
                    player.SendErrorMessage("You do not have access to this command.");
                }
                else
                {
                    if (command.DoLog)
                    {
                        TShock.Utils.SendLogs(string.Format("{0} executed: {1}{2}.", player.Name, silent ? TShock.Config.CommandSilentSpecifier : TShock.Config.CommandSpecifier, cmdText), Color.PaleVioletRed, player);
                    }
                    RunCommand(command, cmdText, player, args);
                }
            }

            return(true);
        }
예제 #12
0
        /// <summary>
        /// Internal hook, fired when a chat message is sent.
        /// </summary>
        /// <param name="args">The <see cref="ServerChatEventArgs"/> object.</param>
        private void OnChat(ServerChatEventArgs args)
        {
            // Return if the packet was already handled by another plugin.
            if (args.Handled)
            {
                return;
            }

            // Ensure the player is not null and has modified data.
            TSPlayer tsplr = TShock.Players[args.Who];

            if (tsplr == null || tsplr.GetPlayerInfo() == null)
            {
                return;
            }

            // Check if the player has the permission to speak and has not been muted.
            if (!tsplr.HasPermission(TShockAPI.Permissions.canchat) || tsplr.mute)
            {
                return;
            }

            if (!args.Text.StartsWith(TShock.Config.CommandSpecifier) && !args.Text.StartsWith(TShock.Config.CommandSilentSpecifier))
            {
                string prefix    = tsplr.GetPlayerInfo().Prefix?.ToString() ?? tsplr.Group.Prefix;
                string suffix    = tsplr.GetPlayerInfo().Suffix?.ToString() ?? tsplr.Group.Suffix;
                Color  chatColor = tsplr.GetPlayerInfo().ChatColor?.ToColor() ?? tsplr.Group.ChatColor.ToColor();

                if (!TShock.Config.EnableChatAboveHeads)
                {
                    string message = string.Format(TShock.Config.ChatFormat, tsplr.Group.Name, prefix, tsplr.Name, suffix, args.Text);
                    TSPlayer.All.SendMessage(message, chatColor);
                    TSPlayer.Server.SendMessage(message, chatColor);
                    TShock.Log.Info("Broadcast: {0}", message);

                    args.Handled = true;
                }
                else
                {
                    Player player = Main.player[args.Who];
                    string name   = player.name;
                    player.name = string.Format(TShock.Config.ChatAboveHeadsFormat, tsplr.Group.Name, prefix, tsplr.Name, suffix);
                    NetMessage.SendData((int)PacketTypes.PlayerInfo, -1, -1, player.name, args.Who, 0, 0, 0, 0);
                    player.name = name;
                    var text = args.Text;
                    NetMessage.SendData((int)PacketTypes.ChatText, -1, args.Who, text, args.Who, chatColor.R, chatColor.G, chatColor.B);
                    NetMessage.SendData((int)PacketTypes.PlayerInfo, -1, -1, name, args.Who, 0, 0, 0, 0);

                    string message = string.Format("<{0}> {1}", string.Format(TShock.Config.ChatAboveHeadsFormat, tsplr.Group.Name, prefix, tsplr.Name, suffix), text);
                    tsplr.SendMessage(message, chatColor);
                    TSPlayer.Server.SendMessage(message, chatColor);
                    TShock.Log.Info("Broadcast: {0}", message);

                    args.Handled = true;
                }
            }
            else
            {
                // Check if the player entered a command.
                if (!string.IsNullOrWhiteSpace(args.Text.Substring(1)))
                {
                    try
                    {
                        args.Handled = tsplr.ExecuteCommand(args.Text);
                    }
                    catch (Exception ex)
                    {
                        TShock.Log.ConsoleError("An exception occured executing a command.");
                        TShock.Log.Error(ex.ToString());
                    }
                }
            }
        }