首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Minecraft插件EventHandler?

Java Minecraft插件EventHandler?
EN

Stack Overflow用户
提问于 2021-06-06 14:37:41
回答 2查看 53关注 0票数 1

我在做一个服务器插件,可以在玩家死的时候踢他们。我已经解决了所有的问题,但我希望能够切换它。我看过使用布尔值,但当我将@EventHandler放在一个布尔值中时,它会对我大喊大叫,我认为我做得不对……所以我想问题是,有没有办法在执行"/kdoff“时,@EventHandler只有在执行"/kd”之后才会执行。我觉得你可以用onDisable()做一些事情,但老实说,我不完全确定它们是如何工作的。

代码语言:javascript
复制
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"); 
    
    }
    
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-06 15:02:54

我认为最简单的方法就是在某个地方存储一个布尔值,以确定是否启用了kick on death。/kd/kdoff命令可以设置它,只要有人死了,你只要检查它是否被启用,就可以决定是否应该踢他们。

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

代码语言:javascript
复制
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"); 
        }
    }
    
}

这个实现有一个全局标志,只启用和禁用,但我相信你可以让它持久化或特定于玩家。

票数 0
EN

Stack Overflow用户

发布于 2021-06-06 15:29:49

如果您想要全局启用/禁用kicking on death事件,则可以使用布尔值。

你只需要把它作为一个字段添加到类中:

代码语言:javascript
复制
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字段的值:

代码语言:javascript
复制
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字段的值,并执行相应的操作:

代码语言:javascript
复制
@EventHandler
public void onDeath(EntityDeathEvent event) {
   if (enabled) {
       // Kill player.
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67856413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档