mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-17 14:21:08 +00:00
implement hacky Bukkit structure workaround
This commit is contained in:
+16
-5
@@ -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.");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user