Java 我的世界插件事件处理程序?

Java Minecraft Plugin EventHandler?

我正在制作一个服务器插件,可以在玩家死亡时将其踢出。我已经解决了所有问题,但我希望能够打开和关闭它。我见过使用布尔值,但是当我将 @EventHandler 放在一个布尔值中时它对我大喊大叫,我认为我做的不对......所以我想问题是真的,有没有办法为了在执行“/kdoff”时做到这一点,@EventHandler 直到“/kd”被执行。我觉得你可以用 onDisable() 做一些事情,但老实说我不太确定这些是如何工作的。

package me.Cats.KickDead;

import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin
    implements Listener {

    @Override
    public void onEnable() { // on server start-up
        System.out.println("Death Kick is enabled");
        getServer().getPluginManager().registerEvents(this, this);
        
    }
    
    
    @Override
    public void onDisable() {
        
    }
    
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { // enables command
        if (label.equalsIgnoreCase("kd")) {
            if (sender instanceof Player) { //player
                Player player = (Player) sender;
                if (player.hasPermission("kickdead.use")) {
                player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&bPlayers will now be sent to the &8&lShadow Realm&b. &r(&0&aOn&r)")); // Yu-gi-oh Reference
                
                return true;
                }
                player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cYour deck lacks the power to send someone to the &8&lShadow Realm&r&b.")); // Yet another Yu-gi-oh reference

            }
            
        if(label.equalsIgnoreCase("kdoff")) {
            if(sender instanceof Player) {
                Player player = (Player) sender;
                if (player.hasPermission("kickdead.use")) {
                player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&bPlayers will be allowed on the &a&lMoral Plane&r&b. &r(&0&4Off&r)")); // Yu-gi-oh Reference
                
                return false;
            }
                player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cYour deck lacks the power to allow people to walk this &a&lMoral Plane&r&b.")); 
        }
            
            
        else { //console
            sender.sendMessage("Currently only works if ran by a player. I'm a bit lazy..."); 
            return true;
                }
            }
        }
        return false;
    }
    
    @EventHandler // if a player dies they're kicked
    public void onDeath(EntityDeathEvent event) {
        Player player = (Player)event.getEntity();
        player.kickPlayer(ChatColor.RED + "" + ChatColor.BOLD + "You Died"); 
    
    }
    
}

我认为最简单的方法就是在某处存储一个布尔值,以确定是否启用死亡后踢球。 /kd/kdoff 命令可以设置它,每当有人死亡时,你只需检查它是否启用来决定是否应该踢他们。

OnDisabled 是插件被禁用时调用的事件,通常意味着服务器关闭时(尽管也有其他时间!)。您不想完全禁用该插件,因为那样您将无法捕获 /kd 命令。

public class Main extends JavaPlugin
    implements Listener {
    public static boolean kickOnDeath = true;

    @Override
    public void onEnable() { // on server start-up
        if (kickOnDeath) {
            System.out.println("Death Kick is enabled");
        }
        getServer().getPluginManager().registerEvents(this, this);
        
    }
    
    
    @Override
    public void onDisable() {
        
    }
    
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { // enables command
        if (label.equalsIgnoreCase("kd")) {
            if (sender instanceof Player) { //player
                Player player = (Player) sender;
                if (player.hasPermission("kickdead.use")) {
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&bPlayers will now be sent to the &8&lShadow Realm&b. &r(&0&aOn&r)")); // Yu-gi-oh Reference
                    kickOnDeath = true;
                    return true;
                }
                player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cYour deck lacks the power to send someone to the &8&lShadow Realm&r&b.")); // Yet another Yu-gi-oh reference
            } else { //console
                sender.sendMessage("Currently only works if ran by a player. I'm a bit lazy..."); 
                return true;
            }
        } else if (label.equalsIgnoreCase("kdoff")) {
            if (sender instanceof Player) {
                Player player = (Player) sender;
                if (player.hasPermission("kickdead.use")) {
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&bPlayers will be allowed on the &a&lMoral Plane&r&b. &r(&0&4Off&r)")); // Yu-gi-oh Reference
                    kickOnDeath = false;
                    return true;
                }
                player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cYour deck lacks the power to allow people to walk this &a&lMoral Plane&r&b."));
            } else { //console
                sender.sendMessage("Currently only works if ran by a player. I'm a bit lazy..."); 
                return true;
            }
        }
        return false;
    }
    
    @EventHandler // if a player dies they're kicked
    public void onDeath(EntityDeathEvent event) {
        if (kickOnDeath) {
            Player player = (Player)event.getEntity();
            player.kickPlayer(ChatColor.RED + "" + ChatColor.BOLD + "You Died"); 
        }
    }
    
}

此实现有一个仅启用和禁用的全局标志,但我相信您可以使其持久化或特定于播放器。

如果你想在全局范围内enable/disable死亡事件中的踢球,使用布尔值是可行的方法。

您只需将其作为字段添加到 class:

public class Main extends JavaPlugin
    implements Listener {

    private boolean enabled = true; // Added this line.

    @Override
    public void onEnable() { // on server start-up
        System.out.println("Death Kick is enabled");
        getServer().getPluginManager().registerEvents(this, this);
        
    }

    ...

现在您可以在调用命令时设置 enabled 字段的值:

if (label.equalsIgnoreCase("kd")) {
    if (sender instanceof Player) { //player
      Player player = (Player) sender;
      if (player.hasPermission("kickdead.use")) {
        player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&bPlayers will now be sent to the &8&lShadow Realm&b. &r(&0&aOn&r)")); // Yu-gi-oh Reference
        
        enabled = true; // Added this line to set the enable flag.

        return true;
      }
      player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cYour deck lacks the power to send someone to the &8&lShadow Realm&r&b.")); // Yet another Yu-gi-oh reference
    }
    
else if(label.equalsIgnoreCase("kdoff")) {
    if(sender instanceof Player) {
        Player player = (Player) sender;
      if (player.hasPermission("kickdead.use")) {
          player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&bPlayers will be allowed on the &a&lMoral Plane&r&b. &r(&0&4Off&r)")); // Yu-gi-oh Reference
          
          enabled = false; // Added this line to set the enable flag.

          return false;
      }
        player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cYour deck lacks the power to allow people to walk this &a&lMoral Plane&r&b.")); 
}

现在您可以在 onDeath 侦听器中检查 enabled 字段的值并采取相应行动:

@EventHandler
public void onDeath(EntityDeathEvent event) {
   if (enabled) {
       // Kill player.
   }
}