java 中的变量未更新(Minecraft forge)

Variables not updating in java (Minecraft forge)

我正在尝试在 Minecraft forge 环境中更新 class 中的一些变量。首先,我想说的是 class 的长度超过了 600 行,所以我截取了代码片段(这就是为什么某些变量没有在下面的代码片段中初始化的原因在 class 的其他地方初始化。) 我尝试了不同的方法来尝试调用和更改变量,但 none 已成功运行。

编辑: (isAccelerating 设置为 2):

if(slot.isItemEqual(new ItemStack(ModItems.Particles, 1, 19))){
            if(this.isAccelerating == 0){
                if(this.module == 1){
                    if(this.energyStored >= 600000){
                        this.j = 1200;
                        this.stoneBuffer = 8;
                        this.isAccelerating = 2;
                        return true;
                    }
                }
                else{
                    this.j = 1200;
                    this.stoneBuffer = 8;

编辑:

似乎isAccelerating变量被设置为2并且是运行,但是,能量并没有减少。 这里是能量消耗的地方:

if(i<1200){
            System.out.println("1");
            i++;
            if(i%20 == 0){
                worldObj.playSound(xCoord+5, yCoord, zCoord, "random.explode", 1F, 1F, true);
                worldObj.playSound(xCoord-5, yCoord, zCoord, "random.explode", 1F, 1F, true);
                worldObj.playSound(xCoord, yCoord, zCoord+5, "random.explode", 1F, 1F, true);
                worldObj.playSound(xCoord, yCoord, zCoord-5, "random.explode", 1F, 1F, true);
                worldObj.playSound(xCoord-5, yCoord, zCoord-5, "random.explode", 1F, 1F, true);
                worldObj.playSound(xCoord+5, yCoord, zCoord-5, "random.explode", 1F, 1F, true);
                worldObj.playSound(xCoord-5, yCoord, zCoord+5, "random.explode", 1F, 1F, true);
                worldObj.playSound(xCoord+5, yCoord, zCoord+5, "random.explode", 1F, 1F, true);
            }
            if(this.energyStored < 500){
                System.out.println("2");
                this.energyStored = 0;
                this.isAccelerating = 0;
            }
            else{
                System.out.println("3");
                this.energyStored -= 500;
            }
        }
        else{
            j = 0;
            i = 0;
            this.isAccelerating = 0;
            this.stoneBuffer = 0;
            Entity entity = new EntityItem(worldObj);
            ItemStack itemstack = new ItemStack(ModItems.Particles, 1, 8);
            this.output(itemstack);
        }

在这段代码中,系统会打印出1和3,提示这是运行消耗能量但实际上并没有消耗能量的代码。

编辑:

我找到了解决这个问题的办法。为了将来参考,我不得不添加这些代码行来同步服务器和客户端:

this.markDirty();
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);

感谢给予帮助的人

可能,您 运行 在 concurrency problem. For example, if int j is not declared as volatile then the changes that have been made in another thread may never become visible

当你说变量没有更新时,你怎么知道它们没有更新?您的代码中是否有列出它们的输出行?还是断点?

您没有正确减少宝箱的堆叠数量。您将传入插槽中的堆栈大小减少 1,然后将插槽 i (0) 中的堆栈大小减小传入插槽的新堆栈大小。 您应该传入插槽索引而不是插槽,然后调用 chest.decrStackSize(slotIndex, 1); 另一个技巧是使用 this.energyStored >= 600000 而不是单独检查大于等于。 根据您的示例,isAccelerating 字段永远不会设置为 2,因此更新代码永远不会 运行.

我找到了解决这个问题的方法。为了将来参考,我不得不添加这些代码行来同步服务器和客户端:

this.markDirty(); worldObj.markBlockForUpdate(x坐标, y坐标, z坐标);

感谢给予帮助的人