#Internal Task Scheduler

4 messages · Page 1 of 1 (latest)

hollow imp
#

Does Minecraft have task scheduler? I need to change screen after some time from client initialization and check for some values so this screen is probably not necessary.

So is there any way to avoid exception like on screenshot

spark cloud
#

!!timer

lucid glacierBOT
#

Fabric itself does not include APIs to schedule something in the future.

DO NOT use threads or java.util.Timer. (This can cause a crash!) Instead:

  • If you are making a block do something in the future: world.scheduleBlockTick + override scheduledTick in your Block.
  • If you are making a custom tickable stuff (usually block entity/entity) do something in the future/periodically: see below, but instead of Mixin just implement yourself
  • If you are making a vanilla tickable thing (world, server, etc) do something in the future/periodically: use the following mixin.
@Mixin(StuffToTick.class) // ServerWorld, MinecraftServer, etc
public class StuffTimer implements StuffTimerAccess {
    @Unique
    private long ticksUntilSomething;

    @Inject(method = "tick", at = @At("TAIL"))
    private void onTick(CallbackInfo ci) { // Fix parameters as needed
        if (--this.ticksUntilSomething == 0L) {
            doSomething();
            // If you want to repeat this, reset ticksUntilSomething here.
        }
    }

    @Override
    public void yourmod_setTimer(long ticksUntilSomething) {
        this.ticksUntilSomething = ticksUntilSomething;
    }
}
public interface StuffTimerAccess {
    void yourmod_setTimer(long ticksUntilSomething);
}

Usage:

MinecraftServer server;
((StuffTimerAccess) server).yourmod_setTimer(100L); // do something after 100 ticks
spark cloud
#

Although "some time after client initialization" is not well defined