diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java index fae81ebc3..a334dc717 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSChunkGeneratorDelegate.java @@ -3,9 +3,7 @@ package com.dfsek.terra.bukkit.nms; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.info.WorldProperties; -import com.dfsek.terra.bukkit.generator.BukkitProtoChunk; import com.dfsek.terra.bukkit.world.BukkitAdapter; -import com.dfsek.terra.bukkit.world.BukkitServerWorld; import com.mojang.serialization.Codec; import net.minecraft.core.BlockPosition; @@ -25,7 +23,8 @@ import net.minecraft.world.level.levelgen.WorldGenStage; import net.minecraft.world.level.levelgen.blending.Blender; import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; import org.bukkit.craftbukkit.v1_18_R2.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_18_R2.generator.CraftChunkData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -33,7 +32,7 @@ import java.util.concurrent.Executor; public class NMSChunkGeneratorDelegate extends ChunkGenerator { - + private static final Logger LOGGER = LoggerFactory.getLogger(ChunkGenerator.class); private final NMSBiomeProvider biomeSource; private final com.dfsek.terra.api.world.chunk.generation.ChunkGenerator delegate; @@ -41,6 +40,8 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { private final ConfigPack pack; private final CraftWorld world; + private volatile boolean structures = false; + public NMSChunkGeneratorDelegate(ChunkGenerator vanilla, ConfigPack pack, NMSBiomeProvider biomeProvider, CraftWorld world) { super(vanilla.b, vanilla.e, biomeProvider, biomeProvider, world.getSeed()); @@ -51,6 +52,14 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { this.world = world; } + public void enableStructures() { + if(structures) { + throw new IllegalStateException("Structures have already been enabled!"); + } + LOGGER.info("Enabling structure generation..."); + this.structures = true; + } + @Override //applyCarvers public void a(RegionLimitedWorldAccess regionlimitedworldaccess, long var2, BiomeManager var4, StructureManager var5, IChunkAccess ichunkaccess, WorldGenStage.Features var7) { @@ -76,7 +85,9 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { @Override public void a(GeneratorAccessSeed gas, StructureManager manager, IChunkAccess ica) { - vanilla.a(gas, manager, ica); + if(structures) { + vanilla.a(gas, manager, ica); + } } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java index e748972f2..3b4dfd573 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/nms/NMSInjectListener.java @@ -7,6 +7,7 @@ import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.WorldInitEvent; +import org.bukkit.event.world.WorldLoadEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,4 +47,16 @@ public class NMSInjectListener implements Listener { INJECT_LOCK.unlock(); } } + + @EventHandler + public void onWorldLoad(WorldLoadEvent event) { + if (INJECTED.contains(event.getWorld()) && event.getWorld().getGenerator() instanceof BukkitChunkGeneratorWrapper bukkitChunkGeneratorWrapper) { + LOGGER.info("Enabling structure deadlock workaround on world {}.", event.getWorld().getName()); + CraftWorld craftWorld = (CraftWorld) event.getWorld(); + WorldServer serverWorld = craftWorld.getHandle(); + + ((NMSChunkGeneratorDelegate) serverWorld.k().a.u).enableStructures(); + LOGGER.info("Thank you Bukkit."); + } + } }