provide platform with server instance to redeclare platform biomes

This commit is contained in:
dfsek
2021-12-29 02:07:29 -07:00
parent 0ce072a2ca
commit e72669354a
4 changed files with 109 additions and 51 deletions
@@ -27,6 +27,7 @@ import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.MinecraftVersion; import net.minecraft.MinecraftVersion;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.BuiltinRegistries;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -68,12 +69,26 @@ public class PlatformImpl extends AbstractPlatform {
worlds.add(world); worlds.add(world);
} }
private MinecraftServer server;
public void setServer(MinecraftServer server) {
this.server = server;
}
@Override @Override
public boolean reload() { public boolean reload() {
getTerraConfig().load(this); getTerraConfig().load(this);
getRawConfigRegistry().clear(); getRawConfigRegistry().clear();
boolean succeed = getRawConfigRegistry().loadAll(this); boolean succeed = getRawConfigRegistry().loadAll(this);
if(server != null) {
server.reloadResources(server.getDataPackManager().getNames()).exceptionally(throwable -> {
LOGGER.warn("Failed to execute reload", throwable);
return null;
});
}
worlds.forEach(world -> { worlds.forEach(world -> {
FabricChunkGeneratorWrapper chunkGeneratorWrapper = ((FabricChunkGeneratorWrapper) world.getChunkManager().getChunkGenerator()); FabricChunkGeneratorWrapper chunkGeneratorWrapper = ((FabricChunkGeneratorWrapper) world.getChunkManager().getChunkGenerator());
chunkGeneratorWrapper.setPack(getConfigRegistry().get(chunkGeneratorWrapper.getPack().getRegistryKey()).orElseThrow()); chunkGeneratorWrapper.setPack(getConfigRegistry().get(chunkGeneratorWrapper.getPack().getRegistryKey()).orElseThrow());
@@ -0,0 +1,40 @@
package com.dfsek.terra.fabric.mixin.lifecycle;
import com.dfsek.terra.fabric.FabricEntryPoint;
import com.mojang.authlib.GameProfileRepository;
import com.mojang.authlib.minecraft.MinecraftSessionService;
import com.mojang.datafixers.DataFixer;
import net.minecraft.resource.ResourcePackManager;
import net.minecraft.resource.ServerResourceManager;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.WorldGenerationProgressListenerFactory;
import net.minecraft.util.UserCache;
import net.minecraft.util.registry.DynamicRegistryManager;
import net.minecraft.world.SaveProperties;
import net.minecraft.world.level.storage.LevelStorage;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.net.Proxy;
@Mixin(MinecraftServer.class)
public class MinecraftServerMixin {
@Inject(method = "<init>(Ljava/lang/Thread;Lnet/minecraft/util/registry/DynamicRegistryManager$Impl;" +
"Lnet/minecraft/world/level/storage/LevelStorage$Session;Lnet/minecraft/world/SaveProperties;" +
"Lnet/minecraft/resource/ResourcePackManager;Ljava/net/Proxy;Lcom/mojang/datafixers/DataFixer;" +
"Lnet/minecraft/resource/ServerResourceManager;Lcom/mojang/authlib/minecraft/MinecraftSessionService;" +
"Lcom/mojang/authlib/GameProfileRepository;Lnet/minecraft/util/UserCache;" +
"Lnet/minecraft/server/WorldGenerationProgressListenerFactory;)V",
at = @At("RETURN"))
private void injectConstructor(Thread serverThread, DynamicRegistryManager.Impl registryManager, LevelStorage.Session session,
SaveProperties saveProperties, ResourcePackManager dataPackManager, Proxy proxy, DataFixer dataFixer,
ServerResourceManager serverResourceManager, MinecraftSessionService sessionService,
GameProfileRepository gameProfileRepo, UserCache userCache,
WorldGenerationProgressListenerFactory worldGenerationProgressListenerFactory, CallbackInfo ci) {
FabricEntryPoint.getPlatform().setServer((MinecraftServer) (Object) this);
}
}
@@ -143,7 +143,9 @@ public final class FabricUtil {
.build(); .build();
Identifier identifier = new Identifier("terra", FabricUtil.createBiomeID(pack, id)); Identifier identifier = new Identifier("terra", FabricUtil.createBiomeID(pack, id));
if(!biomeRegistry.containsId(identifier)) { if(biomeRegistry.containsId(identifier)) {
((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(biomeRegistry.get(identifier));
} else {
Registry.register(biomeRegistry, identifier, minecraftBiome); Registry.register(biomeRegistry, identifier, minecraftBiome);
((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(minecraftBiome); ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(minecraftBiome);
terraVanillaBiomes.computeIfAbsent(biomeRegistry.getKey(vanilla).orElseThrow(), b -> new ArrayList<>()).add( terraVanillaBiomes.computeIfAbsent(biomeRegistry.getKey(vanilla).orElseThrow(), b -> new ArrayList<>()).add(
@@ -34,6 +34,7 @@
"implementations.inventory.meta.ItemStackMetaMixin", "implementations.inventory.meta.ItemStackMetaMixin",
"implementations.world.ChunkRegionMixin", "implementations.world.ChunkRegionMixin",
"implementations.world.ServerWorldMixin", "implementations.world.ServerWorldMixin",
"lifecycle.MinecraftServerMixin",
"lifecycle.ServerResourceManagerMixin" "lifecycle.ServerResourceManagerMixin"
], ],
"client": [ "client": [