implement hacky Bukkit structure workaround

This commit is contained in:
dfsek
2022-05-31 13:21:55 -07:00
parent 00e9ab4263
commit 6883151809
2 changed files with 29 additions and 5 deletions
@@ -3,9 +3,7 @@ package com.dfsek.terra.bukkit.nms;
import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties; 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.BukkitAdapter;
import com.dfsek.terra.bukkit.world.BukkitServerWorld;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import net.minecraft.core.BlockPosition; 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 net.minecraft.world.level.levelgen.blending.Blender;
import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; 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.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.List;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@@ -33,7 +32,7 @@ import java.util.concurrent.Executor;
public class NMSChunkGeneratorDelegate extends ChunkGenerator { public class NMSChunkGeneratorDelegate extends ChunkGenerator {
private static final Logger LOGGER = LoggerFactory.getLogger(ChunkGenerator.class);
private final NMSBiomeProvider biomeSource; private final NMSBiomeProvider biomeSource;
private final com.dfsek.terra.api.world.chunk.generation.ChunkGenerator delegate; 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 ConfigPack pack;
private final CraftWorld world; private final CraftWorld world;
private volatile boolean structures = false;
public NMSChunkGeneratorDelegate(ChunkGenerator vanilla, ConfigPack pack, NMSBiomeProvider biomeProvider, CraftWorld world) { public NMSChunkGeneratorDelegate(ChunkGenerator vanilla, ConfigPack pack, NMSBiomeProvider biomeProvider, CraftWorld world) {
super(vanilla.b, vanilla.e, biomeProvider, biomeProvider, world.getSeed()); super(vanilla.b, vanilla.e, biomeProvider, biomeProvider, world.getSeed());
@@ -51,6 +52,14 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator {
this.world = world; 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 @Override //applyCarvers
public void a(RegionLimitedWorldAccess regionlimitedworldaccess, long var2, BiomeManager var4, StructureManager var5, public void a(RegionLimitedWorldAccess regionlimitedworldaccess, long var2, BiomeManager var4, StructureManager var5,
IChunkAccess ichunkaccess, WorldGenStage.Features var7) { IChunkAccess ichunkaccess, WorldGenStage.Features var7) {
@@ -76,7 +85,9 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator {
@Override @Override
public void a(GeneratorAccessSeed gas, StructureManager manager, IChunkAccess ica) { public void a(GeneratorAccessSeed gas, StructureManager manager, IChunkAccess ica) {
vanilla.a(gas, manager, ica); if(structures) {
vanilla.a(gas, manager, ica);
}
} }
@Override @Override
@@ -7,6 +7,7 @@ import org.bukkit.craftbukkit.v1_18_R2.CraftWorld;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.world.WorldInitEvent; import org.bukkit.event.world.WorldInitEvent;
import org.bukkit.event.world.WorldLoadEvent;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -46,4 +47,16 @@ public class NMSInjectListener implements Listener {
INJECT_LOCK.unlock(); 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.");
}
}
} }