无论如何要在Minecraft Forge 1.12.2中“等待1秒”?

时间:2020-05-10 01:38:16

标签: java minecraft minecraft-forge

我试图在《我的世界》锻造中“等待1秒”,并且我使用“线程”来做到这一点。 但是我遇到了这个错误。

Exception in thread "Thread-14" java.lang.IllegalMonitorStateException
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:218)
    at io.github.bloodnighttw.WaitAndReplaceBlock.run(WaitAndReplaceBlock.java:22)

我曾尝试使用world.scheduleBlockUpdate(......)来做到这一点,但是在我突破障碍之后却发生了任何事情。

这是我的代码,共有三个类。

ExampleMod.java

package io.github.bloodnighttw;

import net.minecraft.init.Blocks;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import org.apache.logging.log4j.Logger;

import io.github.bloodnighttw.event.Event;

@Mod(modid = ExampleMod.MODID, name = ExampleMod.NAME, version = ExampleMod.VERSION)
public class ExampleMod
{
    public static final String MODID = "nothing";
    public static final String NAME = "Bang!";
    public static final String VERSION = "3.0";

    private static Logger logger;

    @EventHandler
    public void preInit(FMLPreInitializationEvent event)
    {
        logger = event.getModLog();
        logger.info("Bang");
    }

    @EventHandler
    public void init(FMLInitializationEvent event)
    {
        // some example code
        logger.info("DIRT BLOCK >> {}", Blocks.DIRT.getRegistryName());

        MinecraftForge.EVENT_BUS.register(new Event());
    }
 }

Event.java

package io.github.bloodnighttw.event;

import io.github.bloodnighttw.WaitAndReplaceBlock;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextComponentString;
import net.minecraftforge.event.world.BlockEvent.BreakEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;


public class Event {

    @SubscribeEvent
    public void breakBlockEvent(final BreakEvent e) {
        e.getPlayer().sendMessage(new TextComponentString(e.getState().toString()+"222222"));
        BlockPos a = e.getPos();
        new WaitAndReplaceBlock(a,e).start();

    }
}

WaitAndReplaceBlock.java

package io.github.bloodnighttw;

import net.minecraft.init.Blocks;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.event.world.BlockEvent;

public class WaitAndReplaceBlock extends Thread{

    BlockPos a;
    BlockEvent.BreakEvent e ;

    public WaitAndReplaceBlock(BlockPos a, BlockEvent.BreakEvent e){
        this.a = a ;
        this.e = e ;
    }

    @Override
    public void run() {
        try {
            wait(10);
        } catch (InterruptedException interruptedException) {
            interruptedException.printStackTrace();
        }
        World world = e.getWorld();
        world.setBlockState(a, Blocks.BEDROCK.getDefaultState());

    }
}

我试图用Google搜索它,但是我搜索的所有内容都太旧了,无法在1.12.2中使用,或者这不是我的解决方案,因此我决定在stackoverflow中进行询问。


编辑: 这是我使用的world.scheduleBlockUpdate(......)代码 只有Event.java有所更改。

Event.java 包io.github.bloodnighttw.event;

import io.github.bloodnighttw.WaitAndReplaceBlock;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextComponentString;
import net.minecraftforge.event.world.BlockEvent.BreakEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;


public class Event {

    @SubscribeEvent
    public void breakBlockEvent(final BreakEvent e) {
        e.getPlayer().sendMessage(new TextComponentString(e.getState().toString()+"222222"));
        BlockPos a = e.getPos();
        //new WaitAndReplaceBlock(a,e).start();

        e.getWorld().scheduleBlockUpdate(a,e.getState().getBlock(),10,1000000);

    }

}

这就是我所说的“什么都没发生”。 视频:https://youtu.be/tZMIRHDUnV4

0 个答案:

没有答案