2015-12-31 2 views
0

Привет всем Я пытаюсь использовать переменные из основного класса в свой класс List Listener. Это код Java Bukkit Minecraft, с которым я работаю. Я пытаюсь получить статическую логическую переменную CanRestart из моего MainClass и пытаюсь использовать ее в классе Listeners. В программе нет всплывающих окон, но в консоли появляются ошибки, и плагин не работает.Minecraft Bukkit: Как я могу получить доступ к свойствам/методам в другом классе из основного класса?

Я знаю, что проблема эта строка кода из класса Listeners событий (который я создал, чтобы попытаться получить переменные из главного класса):

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. 

    } 
} 

Вот мое событие Слушатель Класс:

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

ответ

0

В классе слушателя вы берете объект 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.

+0

Поскольку вы создали «this.MainCode = плагин» внутри функции EventListeners, можете ли вы рассказать мне, как я могу получить к ней доступ в функции события PlayerJump? –

+0

Итак, теперь у вас есть переменная, которую вы можете использовать в классе слушателей 'MainCode'. Вы можете получить доступ к своим полям с помощью оператора точки. 'MainCode.CanRestart'. – k3v

+0

Это потрясающий человек! Спасибо, что работает сейчас :)! –

0

Вы создаете еще один экземпляр основного класса вашего плагина с new MainProgram(), который не является необходимым для того, чтобы получить доступ к переменным в исходном экземпляре основного класса создается, когда плагин сначала загружается, особенно если переменные, пытаются получить доступ, являются статическими и, следовательно, не принадлежат только конкретному объекту. Так как CanRestart boolean является общедоступным и статическим, вы можете использовать только MainProgram.CanRestart для доступа к этому булевому. Если переменная была, однако, не статичной и, следовательно, «переменной экземпляра» (где каждый объект имеет свою собственную копию переменной), вам нужно добавить ссылку на исходный основной класс (а не новый экземпляр) в слушателе поэтому вы можете получить доступ к переменным/методам из основного класса в классе слушателя.

Смежные вопросы