Fix #2152: End server world tick too early and conditional (#2251)

This commit is contained in:
Technici4n 2022-05-24 16:08:00 +02:00 committed by GitHub
parent 23d88c8099
commit d8d7804af0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 11 additions and 20 deletions

View file

@ -35,4 +35,9 @@ public abstract class ServerWorldMixin {
private void startWorldTick(BooleanSupplier shouldKeepTicking, CallbackInfo ci) {
ServerTickEvents.START_WORLD_TICK.invoker().onStartTick((ServerWorld) (Object) this);
}
@Inject(method = "tick", at = @At("TAIL"))
private void endWorldTick(BooleanSupplier shouldKeepTicking, CallbackInfo ci) {
ServerTickEvents.END_WORLD_TICK.invoker().onEndTick((ServerWorld) (Object) this);
}
}

View file

@ -22,16 +22,11 @@ import java.util.Set;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.profiler.Profiler;
import net.minecraft.world.World;
import net.minecraft.world.chunk.WorldChunk;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.fabricmc.fabric.impl.event.lifecycle.LoadedChunksCache;
@Mixin(World.class)
@ -45,13 +40,6 @@ public abstract class WorldMixin implements LoadedChunksCache {
@Unique
private final Set<WorldChunk> loadedChunks = new HashSet<>();
@Inject(at = @At("RETURN"), method = "tickBlockEntities")
protected void tickWorldAfterBlockEntities(CallbackInfo ci) {
if (!this.isClient()) {
ServerTickEvents.END_WORLD_TICK.invoker().onEndTick((ServerWorld) (Object) this);
}
}
@Override
public Set<WorldChunk> fabric_getLoadedChunks() {
return this.loadedChunks;

View file

@ -26,19 +26,17 @@ import net.minecraft.client.world.ClientWorld;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.mixin.event.lifecycle.WorldMixin;
@Environment(EnvType.CLIENT)
@Mixin(ClientWorld.class)
public abstract class ClientWorldMixin extends WorldMixin {
// We override our injection on the clientworld so only the client world's tick invocations will run
@Override
protected void tickWorldAfterBlockEntities(CallbackInfo ci) {
ClientTickEvents.END_WORLD_TICK.invoker().onEndTick((ClientWorld) (Object) this);
}
public abstract class ClientWorldMixin {
@Inject(method = "tickEntities", at = @At("HEAD"))
private void startWorldTick(CallbackInfo ci) {
ClientTickEvents.START_WORLD_TICK.invoker().onStartTick((ClientWorld) (Object) this);
}
@Inject(method = "tickEntities", at = @At("TAIL"))
protected void endWorldTick(CallbackInfo ci) {
ClientTickEvents.END_WORLD_TICK.invoker().onEndTick((ClientWorld) (Object) this);
}
}