代码之家  ›  专栏  ›  技术社区  ›  user3925121

Minecraft Bukkit:如何从主类访问另一个类中的属性/方法?

  •  0
  • user3925121  · 技术社区  · 9 年前

    大家好,我正在尝试将Main类中的变量用于Event Listener类。这是我正在使用的Minecraft Java Bukkit代码。我正在尝试从MainClass接收“CanRestart”静态布尔变量,并尝试在Event Listeners类中使用它。程序中没有弹出错误,但控制台中有错误,插件无法工作。

    我知道问题是Event Listeners类中的这行代码(我创建该类是为了尝试从Main类中获取变量):

    MainProgram MainCode = new MainProgram();
    

    我对Java的OOP没有太多的知识,但我真的想知道是否可以得到帮助。

    我想得到这样一个代码:

    MainProgram MainCode = new MainProgram();
    if(MainCode.CanRestart == true){
    //We received a variable from the main class!
    }
    

    这是我的主要课程:

    package me.Shadowsych;
    
    
    import org.bukkit.Bukkit;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class MainProgram extends JavaPlugin{
    
    public static boolean CanRestart = true;
    public int CDNumber = 5;
    public int DetermineCounter;
    
        @Override
        public void onEnable(){ //Essential, when your plugin is enabled.
            getLogger().info("Shadowsych's Command Plugin is working!"); //CMD will print this out.
            new EventListeners(this); //Inherits the EventListeners class
        }
    
        @Override
        public void onDisable(){//Essential, when your plugin is disabled.
    
        }
    
        @SuppressWarnings("deprecation")
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { //Creates command function.
    
            Player player = (Player) sender;
            if(cmd.getName().equalsIgnoreCase("timer")){ 
                if(CanRestart == true){ //Checks to see if the Timer is still running
                CanRestart = false; //The timer has ran.
                CDNumber = 5;
                DetermineCounter = Bukkit.getServer().getScheduler().scheduleAsyncRepeatingTask(this, new Runnable(){
    
                    public void run(){
                            if(CDNumber > -1){ //This can be a 0 integer
                                if(!(CDNumber == 0)){ //If once it is 0.
                            player.sendMessage("" + CDNumber); //The "" is used to make number a String.
                                }
                            CDNumber --; //Makes the number -1 if it's already a 0.
                        }
                        if(CDNumber == -1){ //Now catches that the number is -1.
                            player.sendMessage("Count down finished");
                            Bukkit.getServer().getScheduler().cancelTask(DetermineCounter); //Disables counter.
                            CanRestart = true; //You can restart your timer now.
                            return;
                        }
                    }
                }, 0L, 20L);
                }
    
    
            }
    
            return false; //Is essential in a boolean function.
    
        }
    }
    

    这是我的Event Listener类:

    package me.Shadowsych;
    
    import me.Shadowsych.MainProgram;
    import org.bukkit.ChatColor;
    import org.bukkit.GameMode;
    import org.bukkit.Material;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerMoveEvent;
    import org.bukkit.event.player.PlayerToggleFlightEvent;
    
    public class EventListeners implements Listener {
    
    MainProgram MainCode = new MainProgram();
    
    public EventListeners(MainProgram plugin) {
        plugin.getServer().getPluginManager().registerEvents(this, plugin); //Registers Event Main
    }
    
    
    
    @EventHandler
    public void PlayerToggleFlight(PlayerToggleFlightEvent EventFloat){
    
        Player player = EventFloat.getPlayer();
    
        if(player.getGameMode() == GameMode.CREATIVE)
            return; //If the player is creative then don't do this Event.
        EventFloat.setCancelled(true); 
        player.setAllowFlight(false);
        player.setVelocity(player.getLocation().getDirection().multiply(0).setY(1));
        player.sendMessage(ChatColor.AQUA + "You have double jumped!");
    
    }
    
    @EventHandler
    public void PlayerJump(PlayerMoveEvent EventJumped){
    Player player = EventJumped.getPlayer();
    
    if((player.getGameMode() != GameMode.CREATIVE) //Player is not creative
            && (player.getLocation().subtract(0, 1, 0).getBlock().getType() != Material.AIR) //Block beneath them is not air
            && (!player.isFlying())) //Player is not flying
    {
    
        player.setAllowFlight(true); //Allow the player to fly
    }
    
    
    }
    }
    

    下面是控制台的内容:

    http://prntscr.com/9ki7a5

    2 回复  |  直到 9 年前
        1
  •  0
  •   k3v    9 年前

    在侦听器类中,获取通过构造函数传入的MainProgram对象,并在中为其创建一个引用变量。这样,您可以在侦听器类中访问MainProgram类。

    EventListeners类:

    //Change
    MainProgram MainCode = new MainProgram();
    //to
    MainProgram MainCode;
    
    public EventListeners(MainProgram plugin) {
        //Add this
        this.MainCode = plugin;
        plugin.getServer().getPluginManager().registerEvents(this, plugin);
    }
    

    同时拆下 static CanRestart中的修改器。

        2
  •  0
  •   Adrian Sohn    9 年前

    您正在创建插件主类的另一个实例 new MainProgram() ,这对于访问第一次加载插件时创建的主类的原始实例中的变量是不必要的,尤其是如果您试图访问的变量是静态的,因此不属于特定对象。自从 CanRestart 布尔值是公共的和静态的,您可以使用 MainProgram.CanRestart 以访问该布尔值。但是,如果变量不是静态的,因此是“实例变量”(每个对象都有自己的变量副本),那么您需要在侦听器中添加对原始主类(而不是新实例)的引用,以便可以从侦听器类中的主类访问变量/方法。