Bukkit 插件 - 监听器没有运行?

Bukkit plugin - Listener not running?

嗨,每次我在监听器中创建一个对象时,我的代码都会遇到这个问题class监听器将无法工作,例如

我的主 class (CSmain.java) 中有这个 public 变量:

public static Location spawn;

我在 class 中还有一个名为 getSpawn() 的方法,它 returns 生成:

public Location getSpawn(){
    return spawn;
}

我已经在我的 onEnable() 中初始化了变量,但是当我尝试从我的另一个 class 获取它时,class (JoinListener.java) 将无法工作,例如

@EventHandler
    public void onJoin(PlayerJoinEvent event){

        CSmain mainClass = new CSmain();

        Bukkit.broadcastMessage("Worked");
        event.getPlayer().teleport(mainClass.getSpawn());
        event.getPlayer().setGameMode(GameMode.ADVENTURE);

        setItem(event.getPlayer(), Material.COMPASS, "§2§kll §a§lGAMES §2§kll", 0);

}

我在没有创建对象 (CSmain mainClass = new CSmain();) 和 (event.getPlayer().teleport(mainClass.getSpawn());) 的情况下测试了它,监听器工作美好的。怎么了?

如果这是你的主要 mod class,你永远不应该创建它的新实例。相反,你应该有一个

@Instance('yourmodid')
public static CSmain instance;

这样您就可以像这样从任何地方检索您的 mod 实例:

// assuming your getSpawn() returns chunk coordinates
ChunkCoordinates cc = CSmain.instance.getSpawn();

您还可以从 event.entity.worldObj.getSpawn 或 getWorldSpawn 获取世界生成位置 - 我记不清了,而且我面前没有代码。

编辑:我看到你的 spawn 'Location' 字段是 public 和静态的,这意味着你可以直接访问它:

CSmain.location;

我敦促您仔细阅读 static keyword 的含义,因为如果您不完全理解它,它可能会以意想不到的方式严重影响您的代码。请不要只是为了方便访问字段而使用它。