为什么 if 语句检测不到我的游戏状态

Why won't the if statement detect my game state

我是 Java 的新手,我在我的代码中遇到 "bug" 遇到问题 understanding/fixing。为了给你一些背景知识,我设置了一个枚举来说明所有游戏状态(如下)

public enum GameState {

    IN_LOBBY(true), IN_GAME(false), POST_GAME(false), RESETTING(false);

    private boolean canJoin;    
    private static GameState currentState;

    GameState(boolean canJoin) {
        this.canJoin = canJoin;
    }

    public boolean canJoin() {
        return canJoin();
    }

    public static void setState(GameState state) {
        GameState currentState = state;
    }

    public static boolean isState(GameState state) {
        return GameState.currentState == state;
    }

    public static GameState getState() {
        return currentState;
    }
}

在我的 main.java class 中,我在 onEnable 方法中指定将 GameState 设置为 IN_LOBBY

基本上我想做的是在 BlockBreakEvent 监听器中 我想说的是

if (GameState.isState(GameState.IN_LOBBY)) {
    Location bLoc = block.getLocation();
    ChatUtilties.errorPlayer("You may not break blocks at this time.", player);
    bLoc.getBlock().setType(Material.type);
}

换句话说,我正在尝试检测 GameState 是否为 IN_LOBBY,如果是,则让玩家无法破坏方块。但是目前出现了两个问题。

  1. 出于某种原因,当 GameState 为 IN_LOBBY 时,插件甚至不会注意到。它只是忽略了 if 语句。它甚至不会发送消息,就好像游戏状态不是 IN_LOBBY.

  2. 我不确定如何根据玩家破坏的方块动态更改 material。

你的setter是错误的:

public static void setState(GameState state) {
    GameState currentState = state;
}

您正在此处创建一个新的局部变量 currentState,而不是使用现有字段。发生这种情况是因为你在它前面写了变量类型,创建了一个新的初始化语句。

改为使用:

public static void setState(GameState state) {
    currentState = state;
}

(因为 currentState 是一个静态字段 GameState.currentState = state; 也适用于这种情况)

编辑:

另一个问题是您的 canJoin 方法。

public boolean canJoin() {
    return canJoin();
}

此方法递归调用自身,没有任何结束条件。因此,如果您尝试调用它,您将得到一个 WhosebugException。

相反,您可能打算 return canJoin 字段:

public boolean canJoin() {
    return canJoin;
}