fixes LazyGen

This commit is contained in:
CreepyCre 2023-07-10 21:56:11 +02:00
parent e77d0501ec
commit bb5669ce2d
4 changed files with 50 additions and 12 deletions

View file

@ -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<ChunkServedCallback> EVENT = EventFactory.createLoop();
void onChunkServed(ServerLevel level, LevelChunk chunk);
}

View file

@ -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);
}
}
}

View file

@ -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<ChunkAccess> 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());
}
}

View file

@ -16,6 +16,7 @@
"ServerPlayerInteractionManagerMixin",
"ServerPlayNetworkHandlerMixin",
"ServerWorldMixin",
"ThreadedAnvilChunkStorageMixin",
"TrapDoorMixin",
"WorldMixin",
"accessor.ChunkGeneratorAccessor",