Java 为什么赢了';if语句是否检测到我的游戏状态

Java 为什么赢了';if语句是否检测到我的游戏状态,java,plugins,enums,listeners,Java,Plugins,Enums,Listeners,我是Java新手,在我的代码中遇到了一个“bug”,我在理解/修复它时遇到了困难。为了让您了解一些背景知识,我设置了一个枚举,其中列出了所有游戏状态(如下所示) 在我的main.java类中,我在onEnable方法中指定将游戏状态设置为 基本上,我要做的是在BlockBreakEvent侦听器中,我想说的是 if (GameState.isState(GameState.IN_LOBBY)) { Location bLoc = block.getLocation(); Chat

我是Java新手,在我的代码中遇到了一个“bug”,我在理解/修复它时遇到了困难。为了让您了解一些背景知识,我设置了一个枚举,其中列出了所有游戏状态(如下所示)

在我的
main.java
类中,我在
onEnable
方法中指定将游戏状态设置为

基本上,我要做的是在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);
}
换句话说,我试图检测游戏状态是否在休息室中
,如果是这样的话,那么就让玩家不能打破方块。但目前出现了两个问题

  • 由于某种原因,当游戏状态是
    在_lobble
    时,插件甚至不会注意到。它只是忽略了if语句。它甚至不会发送消息,就好像游戏状态不在大厅中一样

  • 我不知道如何根据玩家打破的块动态更改材质

  • 你的二传手错了:

    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();
    }
    
    这个方法递归地调用自己,没有任何结束条件。因此,如果您尝试调用StackOverflowException,您将得到一个StackOverflowException

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

    public boolean canJoin() {
        return canJoin;
    }
    
    你的二传手错了:

    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();
    }
    
    这个方法递归地调用自己,没有任何结束条件。因此,如果您尝试调用StackOverflowException,您将得到一个StackOverflowException

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

    public boolean canJoin() {
        return canJoin;
    }
    

    对于他的isState方法,也要提到同样的事情,他应该使用return currentState==state@RAZ_Muh_Taz:他的currentState字段是静态的。所以通过
    GameState.currentState
    引用它应该不会引起任何问题。当然,将当前状态保存在静态字段中是否好是另一个问题,但我觉得解决这个问题将超出这个问题的范围。谢谢!你知道怎么做吗?当玩家打破一个方块时,它会把它换回来?很明显,我做错了。我猜这是一些与雷击相关的东西(断块)。Sry,但我对Minecraft的编程了解还不够,无法帮助您解决这个特定问题。@OhGodSpiders我终于找到了解决方案!显然正在执行
    event.setCancelled(true)会成功的!对于他的isState方法,也要提到同样的事情,他应该使用return currentState==state@RAZ_Muh_Taz:他的currentState字段是静态的。所以通过
    GameState.currentState
    引用它应该不会引起任何问题。当然,将当前状态保存在静态字段中是否好是另一个问题,但我觉得解决这个问题将超出这个问题的范围。谢谢!你知道怎么做吗?当玩家打破一个方块时,它会把它换回来?很明显,我做错了。我猜这是一些与雷击相关的东西(断块)。Sry,但我对Minecraft的编程了解还不够,无法帮助您解决这个特定问题。@OhGodSpiders我终于找到了解决方案!显然正在执行
    event.setCancelled(true)会成功的!