Fix custom world generator not applied (#164)

This commit is contained in:
IzzelAliz 2021-03-06 17:38:01 +08:00
parent a2820926ec
commit ebe5b4de14
4 changed files with 20 additions and 0 deletions

View File

@ -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);
}

View File

@ -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);

View File

@ -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<ChunkHolder> 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;
}
}

View File

@ -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