From e85afd7dd6c9b7db17257ef60f687f4d251cee60 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 20 Jun 2022 19:37:17 -0700 Subject: [PATCH] convert most lifecycle mixins to event listeners --- .../mixin/lifecycle/NoiseConfigMixin.java | 5 +-- .../dfsek/terra/forge/ForgeEntryPoint.java | 6 ++- .../com/dfsek/terra/forge/PlatformImpl.java | 11 +++-- .../mixin/access/ChunkRegionAccessor.java | 15 ------- .../mixin/lifecycle/MinecraftServerMixin.java | 32 --------------- .../mixin/lifecycle/NoiseConfigMixin.java | 24 +++++++---- .../client/MinecraftClientMixin.java | 41 ------------------- .../lifecycle/server/ServerMainMixin.java | 40 ------------------ .../main/resources/terra.forge.mixins.json | 4 -- 9 files changed, 27 insertions(+), 151 deletions(-) delete mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/access/ChunkRegionAccessor.java delete mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/MinecraftServerMixin.java delete mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/client/MinecraftClientMixin.java delete mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/server/ServerMainMixin.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/NoiseConfigMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/NoiseConfigMixin.java index 6f9af2ed8..b1ddda34f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/NoiseConfigMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/NoiseConfigMixin.java @@ -1,10 +1,7 @@ package com.dfsek.terra.fabric.mixin.lifecycle; -import com.dfsek.terra.fabric.util.SeedHack; - import net.minecraft.util.math.noise.DoublePerlinNoiseSampler; import net.minecraft.util.registry.Registry; -import net.minecraft.world.biome.source.util.MultiNoiseUtil; import net.minecraft.world.biome.source.util.MultiNoiseUtil.MultiNoiseSampler; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.noise.NoiseConfig; @@ -15,6 +12,8 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import com.dfsek.terra.fabric.util.SeedHack; + /** * Hack to map noise sampler to seeds diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java index 22194ac6e..e2aeef71e 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java @@ -27,9 +27,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.dfsek.terra.forge.data.Codecs; +import com.dfsek.terra.forge.util.LifecycleUtil; @Mod("terra") public class ForgeEntryPoint { + public static final String MODID = "terra"; + private static final Logger logger = LoggerFactory.getLogger(ForgeEntryPoint.class); private static final PlatformImpl TERRA_PLUGIN = new PlatformImpl(); @@ -50,7 +53,8 @@ public class ForgeEntryPoint { modEventBus.addListener(this::commonSetup); } - private void commonSetup(final FMLCommonSetupEvent event) { + private void commonSetup(FMLCommonSetupEvent event) { logger.info("Initializing Terra Forge mod..."); + LifecycleUtil.initialize(); } } diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/PlatformImpl.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/PlatformImpl.java index 3e3791142..3e15ce880 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/PlatformImpl.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/PlatformImpl.java @@ -29,7 +29,10 @@ import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.world.biome.Biome.Precipitation; import net.minecraft.world.biome.BiomeEffects.GrassColorModifier; +import net.minecraftforge.common.ForgeConfig.Common; import net.minecraftforge.fml.loading.FMLLoader; +import net.minecraftforge.fml.loading.targets.FMLServerLaunchHandler; +import net.minecraftforge.server.ServerLifecycleHooks; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -58,18 +61,13 @@ public class PlatformImpl extends AbstractPlatform { private final ItemHandle itemHandle = new FabricItemHandle(); private final WorldHandle worldHandle = new FabricWorldHandle(); private final Lazy dataFolder = Lazy.lazy(() -> new File("./config/Terra")); - private MinecraftServer server; public PlatformImpl() { load(); } - public void setServer(MinecraftServer server) { - this.server = server; - } - public MinecraftServer getServer() { - return server; + return ServerLifecycleHooks.getCurrentServer(); } @Override @@ -78,6 +76,7 @@ public class PlatformImpl extends AbstractPlatform { getRawConfigRegistry().clear(); boolean succeed = getRawConfigRegistry().loadAll(this); + MinecraftServer server = getServer(); if(server != null) { server.reloadResources(server.getDataPackManager().getNames()).exceptionally(throwable -> { diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/access/ChunkRegionAccessor.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/access/ChunkRegionAccessor.java deleted file mode 100644 index 58624dfe9..000000000 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/access/ChunkRegionAccessor.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.dfsek.terra.forge.mixin.access; - -import net.minecraft.world.ChunkRegion; -import net.minecraft.world.chunk.Chunk; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.List; - - -@Mixin(ChunkRegion.class) -public interface ChunkRegionAccessor { - @Accessor("chunks") - List getChunks(); -} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/MinecraftServerMixin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/MinecraftServerMixin.java deleted file mode 100644 index a524a9df7..000000000 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/MinecraftServerMixin.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.dfsek.terra.forge.mixin.lifecycle; - -import com.dfsek.terra.forge.ForgeEntryPoint; - -import com.mojang.datafixers.DataFixer; -import net.minecraft.resource.ResourcePackManager; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.SaveLoader; -import net.minecraft.server.WorldGenerationProgressListenerFactory; -import net.minecraft.util.ApiServices; -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 = "(Ljava/lang/Thread;Lnet/minecraft/world/level/storage/LevelStorage$Session;" + - "Lnet/minecraft/resource/ResourcePackManager;Lnet/minecraft/server/SaveLoader;Ljava/net/Proxy;" + - "Lcom/mojang/datafixers/DataFixer;Lnet/minecraft/util/ApiServices;" + - "Lnet/minecraft/server/WorldGenerationProgressListenerFactory;)V", - at = @At("RETURN")) - private void injectConstructor(Thread serverThread, LevelStorage.Session session, ResourcePackManager dataPackManager, - SaveLoader saveLoader, Proxy proxy, DataFixer dataFixer, ApiServices apiServices, - WorldGenerationProgressListenerFactory worldGenerationProgressListenerFactory, CallbackInfo ci) { - ForgeEntryPoint.getPlatform().setServer((MinecraftServer) (Object) this); - } -} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/NoiseConfigMixin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/NoiseConfigMixin.java index 67008fbba..ca1f00a99 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/NoiseConfigMixin.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/NoiseConfigMixin.java @@ -2,17 +2,18 @@ package com.dfsek.terra.forge.mixin.lifecycle; import com.dfsek.terra.forge.util.SeedHack; -import net.minecraft.util.math.noise.DoublePerlinNoiseSampler; -import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.random.RandomSplitter; import net.minecraft.world.biome.source.util.MultiNoiseUtil.MultiNoiseSampler; -import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; +import net.minecraft.world.biome.source.util.MultiNoiseUtil.NoiseHypercube; +import net.minecraft.world.gen.densityfunction.DensityFunction; import net.minecraft.world.gen.noise.NoiseConfig; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.List; /** @@ -22,10 +23,15 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; public class NoiseConfigMixin { @Shadow @Final - private MultiNoiseSampler multiNoiseSampler; + private long legacyWorldSeed; - @Inject(method = "(Lnet/minecraft/world/gen/chunk/ChunkGeneratorSettings;Lnet/minecraft/util/registry/Registry;J)V", at = @At("TAIL")) - private void mapMultiNoise(ChunkGeneratorSettings chunkGeneratorSettings, Registry noiseRegistry, long seed, CallbackInfo ci) { - SeedHack.register(multiNoiseSampler, seed); + @Redirect(method = "(Lnet/minecraft/world/gen/chunk/ChunkGeneratorSettings;Lnet/minecraft/util/registry/Registry;J)V", at = @At(value = "NEW", target = "net/minecraft/world/biome/source/util/MultiNoiseUtil$MultiNoiseSampler.")) + private MultiNoiseSampler t(DensityFunction densityFunction, DensityFunction densityFunction2, DensityFunction densityFunction3, + DensityFunction densityFunction4, DensityFunction densityFunction5, DensityFunction densityFunction6, + List list) { + MultiNoiseSampler sampler = new MultiNoiseSampler(densityFunction, densityFunction2, densityFunction3, densityFunction4, + densityFunction5, densityFunction6, list); + SeedHack.register(sampler, legacyWorldSeed); + return null; } } diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/client/MinecraftClientMixin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/client/MinecraftClientMixin.java deleted file mode 100644 index ee2e01268..000000000 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/client/MinecraftClientMixin.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of Terra. - * - * Terra is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Terra is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Terra. If not, see . - */ - -package com.dfsek.terra.forge.mixin.lifecycle.client; - -import com.dfsek.terra.forge.util.LifecycleUtil; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.RunArgs; -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; - - -@Mixin(MinecraftClient.class) -public class MinecraftClientMixin { - @Inject(method = "", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/util/WindowProvider;createWindow" + - "(Lnet/minecraft/client/WindowSettings;Ljava/lang/String;Ljava/lang/String;)" + - "Lnet/minecraft/client/util/Window;", - // sorta arbitrary position, after mod init, before window opens - shift = At.Shift.BEFORE)) - public void injectConstructor(RunArgs args, CallbackInfo callbackInfo) { - LifecycleUtil.initialize(); - } -} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/server/ServerMainMixin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/server/ServerMainMixin.java deleted file mode 100644 index 70d93969e..000000000 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/server/ServerMainMixin.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This file is part of Terra. - * - * Terra is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Terra is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Terra. If not, see . - */ - -package com.dfsek.terra.forge.mixin.lifecycle.server; - -import com.dfsek.terra.forge.util.LifecycleUtil; - -import net.minecraft.server.Main; -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; - - -@Mixin(Main.class) -public class ServerMainMixin { - @Inject(method = "main([Ljava/lang/String;)V", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/resource/ResourcePackManager;(Lnet/minecraft/resource/ResourceType;" + - "[Lnet/minecraft/resource/ResourcePackProvider;)V") - // after registry manager creation - ) - private static void injectConstructor(String[] args, CallbackInfo ci) { - LifecycleUtil.initialize(); - } -} diff --git a/platforms/forge/src/main/resources/terra.forge.mixins.json b/platforms/forge/src/main/resources/terra.forge.mixins.json index e1dd26479..77d2c9e44 100644 --- a/platforms/forge/src/main/resources/terra.forge.mixins.json +++ b/platforms/forge/src/main/resources/terra.forge.mixins.json @@ -4,7 +4,6 @@ "package": "com.dfsek.terra.forge.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ - "access.ChunkRegionAccessor", "access.MobSpawnerLogicAccessor", "access.StateAccessor", "access.StructureAccessorAccessor", @@ -36,15 +35,12 @@ "implementations.terra.world.ChunkRegionMixin", "implementations.terra.world.ServerWorldMixin", "lifecycle.DataPackContentsMixin", - "lifecycle.MinecraftServerMixin", "lifecycle.NoiseConfigMixin", "lifecycle.RegistryMixin" ], "client": [ - "lifecycle.client.MinecraftClientMixin" ], "server": [ - "lifecycle.server.ServerMainMixin" ], "injectors": { "defaultRequire": 1