diff --git a/common/src/main/java/org/dimdev/dimdoors/api/event/ChunkServedCallback.java b/common/src/main/java/org/dimdev/dimdoors/api/event/ChunkServedCallback.java new file mode 100644 index 00000000..1e0518a7 --- /dev/null +++ b/common/src/main/java/org/dimdev/dimdoors/api/event/ChunkServedCallback.java @@ -0,0 +1,12 @@ +package org.dimdev.dimdoors.api.event; + +import dev.architectury.event.Event; +import dev.architectury.event.EventFactory; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.chunk.LevelChunk; + +public interface ChunkServedCallback { + Event EVENT = EventFactory.createLoop(); + + void onChunkServed(ServerLevel level, LevelChunk chunk); +} diff --git a/common/src/main/java/org/dimdev/dimdoors/listener/ChunkLoadListener.java b/common/src/main/java/org/dimdev/dimdoors/listener/ChunkLoadListener.java index 29de23a0..9277c43e 100644 --- a/common/src/main/java/org/dimdev/dimdoors/listener/ChunkLoadListener.java +++ b/common/src/main/java/org/dimdev/dimdoors/listener/ChunkLoadListener.java @@ -1,30 +1,27 @@ package org.dimdev.dimdoors.listener; -import dev.architectury.event.events.common.ChunkEvent; -import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.LevelChunk; +import org.dimdev.dimdoors.api.event.ChunkServedCallback; import org.dimdev.dimdoors.pockets.generator.LazyPocketGenerator; import org.dimdev.dimdoors.pockets.modifier.LazyCompatibleModifier; import org.dimdev.dimdoors.world.ModDimensions; import org.dimdev.dimdoors.world.level.registry.DimensionalRegistry; import org.dimdev.dimdoors.world.pocket.type.LazyGenerationPocket; import org.dimdev.dimdoors.world.pocket.type.Pocket; -import org.jetbrains.annotations.Nullable; -public class ChunkLoadListener implements ChunkEvent.LoadData { +public class ChunkLoadListener implements ChunkServedCallback { @Override - public void load(ChunkAccess chunk, @Nullable ServerLevel world, CompoundTag nbt) { - if(!(world != null && chunk instanceof LevelChunk levelChunk)) return; - if (!ModDimensions.isPocketDimension(world)) return; - Pocket pocket = DimensionalRegistry.getPocketDirectory(world.dimension()).getPocketAt(chunk.getPos().getWorldPosition()); + public void onChunkServed(ServerLevel level, LevelChunk chunk) { + if(level == null) return; + if (!ModDimensions.isPocketDimension(level)) return; + Pocket pocket = DimensionalRegistry.getPocketDirectory(level.dimension()).getPocketAt(chunk.getPos().getWorldPosition()); if (!(pocket instanceof LazyGenerationPocket)) return; if (LazyPocketGenerator.currentlyGenerating) { - LazyPocketGenerator.generationQueue.add(levelChunk); + LazyPocketGenerator.generationQueue.add(chunk); } else { - LazyCompatibleModifier.runQueuedModifications(levelChunk); - ((LazyGenerationPocket) pocket).chunkLoaded(levelChunk); + LazyCompatibleModifier.runQueuedModifications(chunk); + ((LazyGenerationPocket) pocket).chunkLoaded(chunk); } } } diff --git a/common/src/main/java/org/dimdev/dimdoors/mixin/ThreadedAnvilChunkStorageMixin.java b/common/src/main/java/org/dimdev/dimdoors/mixin/ThreadedAnvilChunkStorageMixin.java new file mode 100644 index 00000000..b497e511 --- /dev/null +++ b/common/src/main/java/org/dimdev/dimdoors/mixin/ThreadedAnvilChunkStorageMixin.java @@ -0,0 +1,28 @@ +package org.dimdev.dimdoors.mixin; + +import net.minecraft.server.level.ChunkHolder; +import net.minecraft.server.level.ChunkMap; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.LevelChunk; +import org.dimdev.dimdoors.api.event.ChunkServedCallback; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +//100% joinked from Fabric Lifecycle events +@Mixin(ChunkMap.class) +public abstract class ThreadedAnvilChunkStorageMixin { + @Shadow + @Final + ServerLevel level; + + @Inject(method = "method_17227", at = @At("TAIL")) + private void onChunkLoad(ChunkHolder chunkHolder, ChunkAccess protoChunk, CallbackInfoReturnable callbackInfoReturnable) { + // We fire the event at TAIL since the chunk is guaranteed to be a WorldChunk then. + ChunkServedCallback.EVENT.invoker().onChunkServed(this.level, (LevelChunk) callbackInfoReturnable.getReturnValue()); + } +} diff --git a/common/src/main/resources/dimdoors-common.mixins.json b/common/src/main/resources/dimdoors-common.mixins.json index c86fca1c..9c5dd8a9 100644 --- a/common/src/main/resources/dimdoors-common.mixins.json +++ b/common/src/main/resources/dimdoors-common.mixins.json @@ -16,6 +16,7 @@ "ServerPlayerInteractionManagerMixin", "ServerPlayNetworkHandlerMixin", "ServerWorldMixin", + "ThreadedAnvilChunkStorageMixin", "TrapDoorMixin", "WorldMixin", "accessor.ChunkGeneratorAccessor",