Minecraft Bukkit:如何从主 class 访问另一个 class 中的 properties/methods?
Minecraft Bukkit: How can I access properties/methods in another class from the main class?
大家好我正在尝试将 Main class 中的变量用于我的事件侦听器 class。这是我正在使用的 Minecraft Java Bukkit 代码。我正在尝试从我的 MainClass 接收 "CanRestart" 静态布尔变量并尝试在事件监听器 class 中使用它。程序中没有错误弹出,但在控制台中有错误,插件不起作用。
我知道问题出在事件监听器 class 中的这行代码(我创建它是为了尝试从 Main class 获取变量):
MainProgram MainCode = new MainProgram();
我对 Java 的 OOP 了解不多,但我真的很想知道是否可以得到帮助。
我正在尝试获得这样的代码:
MainProgram MainCode = new MainProgram();
if(MainCode.CanRestart == true){
//We received a variable from the main class!
}
这是我的主要内容 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.
}
}
这是我的事件监听器Class:
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
}
}
}
这是控制台显示的内容:
您正在使用 new MainProgram()
创建插件的主 class 的另一个实例,这对于访问在创建时创建的主 class 的原始实例中的变量不是必需的插件首先加载,特别是如果您尝试访问的变量是静态的,因此不属于特定对象。由于 CanRestart
布尔值是 public 并且是静态的,因此您可以仅使用 MainProgram.CanRestart
来访问该布尔值。但是,如果变量不是静态的,因此是 "instance variable"(每个对象都有自己的变量副本),那么您需要添加对原始 main class 的引用(不是新的instance) 在监听器中,这样你就可以从监听器 class.
中的主 class 访问 variables/methods
在您的侦听器 class 中,您获取通过构造函数传入的 MainProgram 对象并为其创建一个引用变量。这样您就可以在您的侦听器中访问您的 MainProgram class class.
事件监听器 class:
//Change
MainProgram MainCode = new MainProgram();
//to
MainProgram MainCode;
public EventListeners(MainProgram plugin) {
//Add this
this.MainCode = plugin;
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
同时从 CanRestart 中删除 static
修饰符。
大家好我正在尝试将 Main class 中的变量用于我的事件侦听器 class。这是我正在使用的 Minecraft Java Bukkit 代码。我正在尝试从我的 MainClass 接收 "CanRestart" 静态布尔变量并尝试在事件监听器 class 中使用它。程序中没有错误弹出,但在控制台中有错误,插件不起作用。
我知道问题出在事件监听器 class 中的这行代码(我创建它是为了尝试从 Main class 获取变量):
MainProgram MainCode = new MainProgram();
我对 Java 的 OOP 了解不多,但我真的很想知道是否可以得到帮助。
我正在尝试获得这样的代码:
MainProgram MainCode = new MainProgram();
if(MainCode.CanRestart == true){
//We received a variable from the main class!
}
这是我的主要内容 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.
}
}
这是我的事件监听器Class:
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
}
}
}
这是控制台显示的内容:
您正在使用 new MainProgram()
创建插件的主 class 的另一个实例,这对于访问在创建时创建的主 class 的原始实例中的变量不是必需的插件首先加载,特别是如果您尝试访问的变量是静态的,因此不属于特定对象。由于 CanRestart
布尔值是 public 并且是静态的,因此您可以仅使用 MainProgram.CanRestart
来访问该布尔值。但是,如果变量不是静态的,因此是 "instance variable"(每个对象都有自己的变量副本),那么您需要添加对原始 main class 的引用(不是新的instance) 在监听器中,这样你就可以从监听器 class.
在您的侦听器 class 中,您获取通过构造函数传入的 MainProgram 对象并为其创建一个引用变量。这样您就可以在您的侦听器中访问您的 MainProgram class class.
事件监听器 class:
//Change
MainProgram MainCode = new MainProgram();
//to
MainProgram MainCode;
public EventListeners(MainProgram plugin) {
//Add this
this.MainCode = plugin;
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
同时从 CanRestart 中删除 static
修饰符。