Ejemplo n.º 1
0
        /// <summary>
        /// Handles a player cheating if they take an effect they did not legally purchase in the <see cref="Shop"/>. If there are at least two zombies or more in the
        /// Everybody Edits world then the anti-cheat system does not check for zombie cheaters.
        /// </summary>
        /// <param name="ctfBot">The <see cref="CaptureTheFlagBot"/> instance.</param>
        /// <param name="eventArgs">The arguments for when the player received/lost an effect.</param>
        private void OnEffectToggled(CaptureTheFlagBot ctfBot, EffectToggledEventArgs eventArgs)
        {
            if (!ctfBot.FinishedInit || !eventArgs.IsEffectEnabled || eventArgs.Effect == Effect.Fire)
            {
                return;
            }

            if (eventArgs.Effect == Effect.Zombie && ctfBot.JoinedWorld.TotalZombiePlayers >= 2 ||
                eventArgs.Effect == Effect.Curse && DateTimeOffset.Now.ToUnixTimeMilliseconds() - ctfBot.JoinedWorld.LastCurseRemoveTickMs <= CurseEnabledMessageMs)
            {
                return;
            }

            if (eventArgs.Effect != eventArgs.Player.PurchasedEffectFlag)
            {
                ctfBot.KickPlayer(eventArgs.Player.Username, "You were auto kicked for attemping to cheat!");
            }

            // Reset the flag variable
            eventArgs.Player.PurchasedEffectFlag = Effect.None;
        }
        /// <summary>
        /// Handles a player executing an administrator command. Administrators are defined in the MySql database.
        /// </summary>
        /// <param name="ctfBot">The <see cref="CaptureTheFlagBot"/> instance.</param>
        /// <param name="player">The player executing the command.</param>
        /// <param name="parsedCommand">The command being executed.</param>
        /// <returns>
        /// True if the command was successfully handled, if not, false. A successful handle is when the parsed command is not equal to null and also the ValidCommands string
        /// array contains the parsed command.
        /// </returns>
        public override bool Handle(CaptureTheFlagBot ctfBot, Player player, ParsedCommand parsedCommand)
        {
            bool canHandle = base.Handle(ctfBot, player, parsedCommand);

            if (canHandle)
            {
                if (MySqlDatabase.Loaded)
                {
                    if (MySqlDatabase.GetRow(player.Username).IsAdministrator)
                    {
                        switch (parsedCommand.Command)
                        {
                        case "ban":
                        case "unban":
                        {
                            if (parsedCommand.Parameters.Length >= 1)
                            {
                                string     username   = parsedCommand.Parameters[0];
                                PlayerData playerData = MySqlDatabase.GetRow(username);

                                if (parsedCommand.Command.Equals("ban", System.StringComparison.OrdinalIgnoreCase))
                                {
                                    if (playerData != null)         // Player exists in the database
                                    {
                                        if (!playerData.IsBanned)
                                        {
                                            playerData.IsBanned = true;
                                            ctfBot?.KickPlayer(username, "You've been banned from this world.");
                                        }
                                        else
                                        {
                                            ctfBot?.SendPrivateMessage(player, $"Player {username.ToUpper()} is already banned!");
                                        }
                                    }
                                    else         // Player does not exist in the database
                                    {
                                        MySqlDatabase.AddNewPlayer(username, true);
                                    }

                                    ctfBot?.SendPrivateMessage(player, $"Player {username.ToUpper()} has been banned from the world.");
                                }
                                else         // The command is "unban"
                                {
                                    if (playerData != null)
                                    {
                                        if (playerData.IsBanned)
                                        {
                                            playerData.IsBanned = false;

                                            ctfBot?.ForgivePlayer(username);
                                            ctfBot?.SendPrivateMessage(player, $"Player {username.ToUpper()} has been unbanned.");
                                        }
                                        else
                                        {
                                            ctfBot?.SendPrivateMessage(player, $"Player {username.ToUpper()} is not banned!");
                                        }
                                    }
                                    else
                                    {
                                        ctfBot?.SendPrivateMessage(player, $"Cannot ban player {username.ToUpper()} because they don't exist.");
                                    }
                                }
                            }
                            else
                            {
                                ctfBot?.SendPrivateMessage(player, "Insufficient amount of parameters!");
                            }
                        }
                        break;

                        case "disconnect":
                        {
                            ctfBot.Disconnect();
                        }
                        break;

                        case "kick":
                        {
                            if (parsedCommand.Parameters.Length >= 1)
                            {
                                string playerToKick = parsedCommand.Parameters[0];
                                string reason       = "";

                                if (parsedCommand.Parameters.Length >= 2)
                                {
                                    for (int i = 2; i < parsedCommand.Parameters.Length; i++)
                                    {
                                        reason += parsedCommand.Parameters[i] + " ";
                                    }
                                }

                                ctfBot.KickPlayer(playerToKick, reason);
                            }
                            else
                            {
                                ctfBot.SendPrivateMessage(player, "Insufficient amount of parameters for command.");
                            }
                        }
                        break;

                        case "retf":     // Return flag
                        {
                            if (parsedCommand.Parameters.Length >= 1)
                            {
                                bool isValidParameter = string.Equals(parsedCommand.Parameters[0], "blue", StringComparison.OrdinalIgnoreCase) || string.Equals(parsedCommand.Parameters[0], "red", StringComparison.OrdinalIgnoreCase);

                                if (isValidParameter)
                                {
                                    if (string.Equals(parsedCommand.Parameters[0], "blue", StringComparison.OrdinalIgnoreCase) && ctfBot.FlagSystem.Flags[Team.Blue].IsTaken)
                                    {
                                        ctfBot?.FlagSystem.Flags[Team.Blue].Return(ctfBot, null, false);
                                    }
                                    else if (string.Equals(parsedCommand.Parameters[0], "red", StringComparison.OrdinalIgnoreCase) && ctfBot.FlagSystem.Flags[Team.Red].IsTaken)
                                    {
                                        ctfBot?.FlagSystem.Flags[Team.Red].Return(ctfBot, null, false);
                                    }
                                    else
                                    {
                                        ctfBot?.SendPrivateMessage(player, $"Cannot return the {parsedCommand.Parameters[0].ToLower()} flag as it is already at its base!");
                                    }
                                }
                                else         // Parameter is not "blue" or "red"
                                {
                                    ctfBot?.SendPrivateMessage(player, "Unknown flag type.");
                                }
                            }
                            else
                            {
                                ctfBot?.SendPrivateMessage(player, "Insufficient amount of parameters for command.");
                            }
                        }
                        break;
                        }
                    }
                    else // User is not an administrator
                    {
                        ctfBot?.SendPrivateMessage(player, "You don't have permission to execute this command.");
                    }
                }
                else
                {
                    ctfBot?.SendPrivateMessage(player, "Administrator commands are disabled due to the database not being loaded!");
                }
            }

            return(canHandle);
        }