diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/server/ChunkManagerBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/server/ChunkManagerBridge.java index 3a0b6852..ac1598c4 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/server/ChunkManagerBridge.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/server/ChunkManagerBridge.java @@ -2,6 +2,7 @@ package io.izzel.arclight.common.bridge.world.server; import io.izzel.arclight.common.mod.util.ArclightCallbackExecutor; import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.gen.ChunkGenerator; import net.minecraft.world.server.ChunkHolder; import java.util.function.BooleanSupplier; @@ -21,4 +22,6 @@ public interface ChunkManagerBridge { ChunkHolder bridge$chunkHolderAt(long chunkPos); void bridge$setViewDistance(int i); + + void bridge$setChunkGenerator(ChunkGenerator generator); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/WorldMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/WorldMixin.java index f2db8e5f..804f58d7 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/WorldMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/WorldMixin.java @@ -2,6 +2,7 @@ package io.izzel.arclight.common.mixin.core.world; import io.izzel.arclight.common.bridge.world.WorldBridge; import io.izzel.arclight.common.bridge.world.border.WorldBorderBridge; +import io.izzel.arclight.common.bridge.world.server.ServerChunkProviderBridge; import io.izzel.arclight.common.mod.ArclightMod; import io.izzel.arclight.common.mod.server.ArclightServer; import io.izzel.arclight.common.mod.server.world.WrappedWorlds; @@ -31,6 +32,7 @@ import org.bukkit.craftbukkit.v.CraftWorld; import org.bukkit.craftbukkit.v.block.CraftBlock; import org.bukkit.craftbukkit.v.block.data.CraftBlockData; import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.bukkit.craftbukkit.v.generator.CustomChunkGenerator; import org.bukkit.event.block.BlockPhysicsEvent; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.generator.ChunkGenerator; @@ -218,6 +220,11 @@ public abstract class WorldMixin implements WorldBridge, IWorldWriter { } if (generator == null) { generator = getServer().getGenerator(((IServerWorldInfo) this.getWorldInfo()).getWorldName()); + if (generator != null && (Object) this instanceof ServerWorld) { + ServerWorld serverWorld = (ServerWorld) (Object) this; + CustomChunkGenerator gen = new CustomChunkGenerator(serverWorld, serverWorld.getChunkProvider().getChunkGenerator(), generator); + ((ServerChunkProviderBridge) serverWorld.getChunkProvider()).bridge$setChunkGenerator(gen); + } } if (environment == null) { environment = ArclightServer.getEnvironment(this.typeKey); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ChunkManagerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ChunkManagerMixin.java index dfb124e2..a49d85d4 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ChunkManagerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ChunkManagerMixin.java @@ -6,10 +6,13 @@ import io.izzel.arclight.common.mod.util.ArclightCallbackExecutor; import net.minecraft.util.RegistryKey; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.DimensionType; +import net.minecraft.world.gen.ChunkGenerator; import net.minecraft.world.server.ChunkHolder; import net.minecraft.world.server.ChunkManager; import net.minecraft.world.server.ServerWorld; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.gen.Invoker; import org.spongepowered.asm.mixin.injection.At; @@ -26,6 +29,7 @@ public abstract class ChunkManagerMixin implements ChunkManagerBridge { @Shadow protected abstract Iterable getLoadedChunksIterable(); @Shadow abstract boolean isOutsideSpawningRadius(ChunkPos chunkPosIn); @Shadow protected abstract void tickEntityTracker(); + @Shadow @Final @Mutable public ChunkGenerator generator; @Invoker("tick") public abstract void bridge$tick(BooleanSupplier hasMoreTime); @Invoker("setViewDistance") public abstract void bridge$setViewDistance(int i); // @formatter:on @@ -61,4 +65,9 @@ public abstract class ChunkManagerMixin implements ChunkManagerBridge { public void bridge$tickEntityTracker() { this.tickEntityTracker(); } + + @Override + public void bridge$setChunkGenerator(ChunkGenerator generator) { + this.generator = generator; + } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerChunkProviderMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerChunkProviderMixin.java index 76ee845c..d7394f0c 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerChunkProviderMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerChunkProviderMixin.java @@ -70,6 +70,7 @@ public abstract class ServerChunkProviderMixin implements ServerChunkProviderBri @Override public void bridge$setChunkGenerator(ChunkGenerator chunkGenerator) { this.generator = chunkGenerator; + ((ChunkManagerBridge) this.chunkManager).bridge$setChunkGenerator(chunkGenerator); } @Override