fixes LazyGen
This commit is contained in:
parent
e77d0501ec
commit
bb5669ce2d
4 changed files with 50 additions and 12 deletions
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -16,6 +16,7 @@
|
|||
"ServerPlayerInteractionManagerMixin",
|
||||
"ServerPlayNetworkHandlerMixin",
|
||||
"ServerWorldMixin",
|
||||
"ThreadedAnvilChunkStorageMixin",
|
||||
"TrapDoorMixin",
|
||||
"WorldMixin",
|
||||
"accessor.ChunkGeneratorAccessor",
|
||||
|
|
Loading…
Reference in a new issue