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 io.izzel.arclight.common.mod.util.ArclightCallbackExecutor;
import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.ChunkPos;
import net.minecraft.world.gen.ChunkGenerator;
import net.minecraft.world.server.ChunkHolder; import net.minecraft.world.server.ChunkHolder;
import java.util.function.BooleanSupplier; import java.util.function.BooleanSupplier;
@ -21,4 +22,6 @@ public interface ChunkManagerBridge {
ChunkHolder bridge$chunkHolderAt(long chunkPos); ChunkHolder bridge$chunkHolderAt(long chunkPos);
void bridge$setViewDistance(int i); 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.WorldBridge;
import io.izzel.arclight.common.bridge.world.border.WorldBorderBridge; 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.ArclightMod;
import io.izzel.arclight.common.mod.server.ArclightServer; import io.izzel.arclight.common.mod.server.ArclightServer;
import io.izzel.arclight.common.mod.server.world.WrappedWorlds; 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.CraftBlock;
import org.bukkit.craftbukkit.v.block.data.CraftBlockData; import org.bukkit.craftbukkit.v.block.data.CraftBlockData;
import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.bukkit.craftbukkit.v.event.CraftEventFactory;
import org.bukkit.craftbukkit.v.generator.CustomChunkGenerator;
import org.bukkit.event.block.BlockPhysicsEvent; import org.bukkit.event.block.BlockPhysicsEvent;
import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.generator.ChunkGenerator; import org.bukkit.generator.ChunkGenerator;
@ -218,6 +220,11 @@ public abstract class WorldMixin implements WorldBridge, IWorldWriter {
} }
if (generator == null) { if (generator == null) {
generator = getServer().getGenerator(((IServerWorldInfo) this.getWorldInfo()).getWorldName()); 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) { if (environment == null) {
environment = ArclightServer.getEnvironment(this.typeKey); 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.RegistryKey;
import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.ChunkPos;
import net.minecraft.world.DimensionType; import net.minecraft.world.DimensionType;
import net.minecraft.world.gen.ChunkGenerator;
import net.minecraft.world.server.ChunkHolder; import net.minecraft.world.server.ChunkHolder;
import net.minecraft.world.server.ChunkManager; import net.minecraft.world.server.ChunkManager;
import net.minecraft.world.server.ServerWorld; import net.minecraft.world.server.ServerWorld;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.gen.Invoker; import org.spongepowered.asm.mixin.gen.Invoker;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
@ -26,6 +29,7 @@ public abstract class ChunkManagerMixin implements ChunkManagerBridge {
@Shadow protected abstract Iterable<ChunkHolder> getLoadedChunksIterable(); @Shadow protected abstract Iterable<ChunkHolder> getLoadedChunksIterable();
@Shadow abstract boolean isOutsideSpawningRadius(ChunkPos chunkPosIn); @Shadow abstract boolean isOutsideSpawningRadius(ChunkPos chunkPosIn);
@Shadow protected abstract void tickEntityTracker(); @Shadow protected abstract void tickEntityTracker();
@Shadow @Final @Mutable public ChunkGenerator generator;
@Invoker("tick") public abstract void bridge$tick(BooleanSupplier hasMoreTime); @Invoker("tick") public abstract void bridge$tick(BooleanSupplier hasMoreTime);
@Invoker("setViewDistance") public abstract void bridge$setViewDistance(int i); @Invoker("setViewDistance") public abstract void bridge$setViewDistance(int i);
// @formatter:on // @formatter:on
@ -61,4 +65,9 @@ public abstract class ChunkManagerMixin implements ChunkManagerBridge {
public void bridge$tickEntityTracker() { public void bridge$tickEntityTracker() {
this.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 @Override
public void bridge$setChunkGenerator(ChunkGenerator chunkGenerator) { public void bridge$setChunkGenerator(ChunkGenerator chunkGenerator) {
this.generator = chunkGenerator; this.generator = chunkGenerator;
((ChunkManagerBridge) this.chunkManager).bridge$setChunkGenerator(chunkGenerator);
} }
@Override @Override