diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index 220c15962..d73796332 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -14,9 +14,9 @@ configurations { dependencies { shadedApi(project(":common:implementation:base")) - "compileOnly"("net.fabricmc:sponge-mixin:${Versions.Fabric.mixin}") - "annotationProcessor"("net.fabricmc:sponge-mixin:${Versions.Fabric.mixin}") - "annotationProcessor"("net.fabricmc:fabric-loom:${Versions.Fabric.loom}") + compileOnly("net.fabricmc:sponge-mixin:${Versions.Fabric.mixin}") + annotationProcessor("net.fabricmc:sponge-mixin:${Versions.Fabric.mixin}") + annotationProcessor("net.fabricmc:fabric-loom:${Versions.Fabric.loom}") "common"(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false } shaded(project(path = ":platforms:mixin-common", configuration = "transformProductionFabric")) { isTransitive = false } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricEntryPoint.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricEntryPoint.java index 6fcc2b792..403f8df56 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricEntryPoint.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricEntryPoint.java @@ -21,42 +21,18 @@ import cloud.commandframework.execution.CommandExecutionCoordinator; import cloud.commandframework.fabric.FabricServerCommandManager; import net.fabricmc.api.ModInitializer; import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.BuiltinRegistries; -import net.minecraft.util.registry.Registry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.dfsek.terra.api.command.CommandSender; import com.dfsek.terra.api.event.events.platform.CommandRegistrationEvent; -import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; -import com.dfsek.terra.fabric.util.BiomeUtil; -import com.dfsek.terra.mod.CommonPlatform; -import com.dfsek.terra.mod.data.Codecs; public class FabricEntryPoint implements ModInitializer { private static final Logger logger = LoggerFactory.getLogger(FabricEntryPoint.class); - private static final PlatformImpl TERRA_PLUGIN = new PlatformImpl(); - - - public static PlatformImpl getPlatform() { - return TERRA_PLUGIN; - } - - public static void register() { // register the things - Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), Codecs.MINECRAFT_CHUNK_GENERATOR_WRAPPER); - Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), Codecs.TERRA_BIOME_SOURCE); - } - - public static void initialize() { - getPlatform().getEventManager().callEvent( - new PlatformInitializationEvent()); - BiomeUtil.registerBiomes(); - CommonPlatform.get().registerWorldTypes((id, preset) -> BuiltinRegistries.add(BuiltinRegistries.WORLD_PRESET, id, preset)); - } - + private static final FabricPlatform TERRA_PLUGIN = new FabricPlatform(); + @Override public void onInitialize() { logger.info("Initializing Terra Fabric mod..."); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricPlatform.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricPlatform.java new file mode 100644 index 000000000..6477407b4 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricPlatform.java @@ -0,0 +1,76 @@ +/* + * 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.fabric; + +import ca.solostudios.strata.Versions; +import ca.solostudios.strata.parser.tokenizer.ParseException; +import ca.solostudios.strata.version.Version; + +import com.dfsek.terra.lifecycle.LifecyclePlatform; + +import net.fabricmc.loader.api.FabricLoader; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.util.Collection; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.dfsek.terra.addon.EphemeralAddon; +import com.dfsek.terra.api.addon.BaseAddon; +import com.dfsek.terra.api.util.generic.Lazy; +import com.dfsek.terra.mod.CommonPlatform; + + +public class FabricPlatform extends LifecyclePlatform { + private static final Logger LOGGER = LoggerFactory.getLogger(FabricPlatform.class); + + @Override + protected Collection getPlatformMods() { + return FabricLoader.getInstance().getAllMods().stream().flatMap(mod -> { + String id = mod.getMetadata().getId(); + if(id.equals("terra") || id.equals("minecraft") || id.equals("java")) return Stream.empty(); + try { + Version version = Versions.parseVersion(mod.getMetadata().getVersion().getFriendlyString()); + return Stream.of(new EphemeralAddon(version, "fabric:" + id)); + } catch(ParseException e) { + LOGGER.warn( + "Mod {}, version {} does not follow semantic versioning specification, Terra addons will be unable to depend on " + + "it.", + id, mod.getMetadata().getVersion().getFriendlyString()); + } + return Stream.empty(); + }).collect(Collectors.toList()); + } + @Override + public @NotNull String platformName() { + return "Fabric"; + } + + @Override + public @NotNull File getDataFolder() { + return new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra"); + } + + @Override + public BaseAddon getPlatformAddon() { + return new FabricAddon(this); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/PlatformImpl.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/PlatformImpl.java deleted file mode 100644 index 4c5ab038a..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/PlatformImpl.java +++ /dev/null @@ -1,151 +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.fabric; - -import ca.solostudios.strata.Versions; -import ca.solostudios.strata.parser.tokenizer.ParseException; -import ca.solostudios.strata.version.Version; -import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.MinecraftVersion; -import net.minecraft.server.MinecraftServer; -import org.jetbrains.annotations.NotNull; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import com.dfsek.terra.addon.EphemeralAddon; -import com.dfsek.terra.api.addon.BaseAddon; -import com.dfsek.terra.api.handle.ItemHandle; -import com.dfsek.terra.api.handle.WorldHandle; -import com.dfsek.terra.api.util.generic.Lazy; -import com.dfsek.terra.fabric.util.BiomeUtil; -import com.dfsek.terra.mod.CommonPlatform; -import com.dfsek.terra.mod.ModPlatform; -import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; -import com.dfsek.terra.mod.handle.MinecraftItemHandle; -import com.dfsek.terra.mod.handle.MinecraftWorldHandle; - - -public class PlatformImpl extends ModPlatform { - private static final Logger LOGGER = LoggerFactory.getLogger(PlatformImpl.class); - private final ItemHandle itemHandle = new MinecraftItemHandle(); - private final WorldHandle worldHandle = new MinecraftWorldHandle(); - private final Lazy dataFolder = Lazy.lazy(() -> new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra")); - private MinecraftServer server; - - public PlatformImpl() { - CommonPlatform.initialize(this); - load(); - } - - public void setServer(MinecraftServer server) { - this.server = server; - } - - @Override - public MinecraftServer getServer() { - return server; - } - - @Override - public boolean reload() { - getTerraConfig().load(this); - getRawConfigRegistry().clear(); - boolean succeed = getRawConfigRegistry().loadAll(this); - - - if(server != null) { - server.reloadResources(server.getDataPackManager().getNames()).exceptionally(throwable -> { - LOGGER.warn("Failed to execute reload", throwable); - return null; - }).join(); - BiomeUtil.registerBiomes(); - server.getWorlds().forEach(world -> { - if(world.getChunkManager().getChunkGenerator() instanceof MinecraftChunkGeneratorWrapper chunkGeneratorWrapper) { - getConfigRegistry().get(chunkGeneratorWrapper.getPack().getRegistryKey()).ifPresent(pack -> { - chunkGeneratorWrapper.setPack(pack); - LOGGER.info("Replaced pack in chunk generator for world {}", world); - }); - } - }); - } - return succeed; - } - - @Override - protected Iterable platformAddon() { - List addons = new ArrayList<>(); - - super.platformAddon().forEach(addons::add); - - String mcVersion = MinecraftVersion.CURRENT.getReleaseTarget(); - try { - addons.add(new EphemeralAddon(Versions.parseVersion(mcVersion), "minecraft")); - } catch(ParseException e) { - try { - addons.add(new EphemeralAddon(Versions.parseVersion(mcVersion + ".0"), "minecraft")); - } catch(ParseException ex) { - LOGGER.warn("Failed to parse Minecraft version", e); - } - } - - FabricLoader.getInstance().getAllMods().forEach(mod -> { - String id = mod.getMetadata().getId(); - if(id.equals("terra") || id.equals("minecraft") || id.equals("java")) return; - try { - Version version = Versions.parseVersion(mod.getMetadata().getVersion().getFriendlyString()); - addons.add(new EphemeralAddon(version, "fabric:" + id)); - } catch(ParseException e) { - LOGGER.warn( - "Mod {}, version {} does not follow semantic versioning specification, Terra addons will be unable to depend on " + - "it.", - id, mod.getMetadata().getVersion().getFriendlyString()); - } - }); - - return addons; - } - - @Override - public @NotNull String platformName() { - return "Fabric"; - } - - @Override - public @NotNull WorldHandle getWorldHandle() { - return worldHandle; - } - - @Override - public @NotNull File getDataFolder() { - return dataFolder.value(); - } - - @Override - public @NotNull ItemHandle getItemHandle() { - return itemHandle; - } - - @Override - public BaseAddon getPlatformAddon() { - return new FabricAddon(this); - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/MinecraftServerMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/MinecraftServerMixin.java deleted file mode 100644 index 0620de7f2..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/MinecraftServerMixin.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.dfsek.terra.fabric.mixin.lifecycle; - -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; - -import com.dfsek.terra.fabric.FabricEntryPoint; - - -@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) { - FabricEntryPoint.getPlatform().setServer((MinecraftServer) (Object) this); - } -} 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 deleted file mode 100644 index 15957b31c..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/NoiseConfigMixin.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.dfsek.terra.fabric.mixin.lifecycle; - -import net.minecraft.util.math.noise.DoublePerlinNoiseSampler; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.biome.source.util.MultiNoiseUtil.MultiNoiseSampler; -import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; -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 com.dfsek.terra.mod.util.SeedHack; - - -/** - * Hack to map noise sampler to seeds - */ -@Mixin(NoiseConfig.class) -public class NoiseConfigMixin { - @Shadow - @Final - private MultiNoiseSampler multiNoiseSampler; - - @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); - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/RegistryMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/RegistryMixin.java deleted file mode 100644 index 0f6ccd532..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/RegistryMixin.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.dfsek.terra.fabric.mixin.lifecycle; - - -import net.minecraft.util.registry.Registry; -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 com.dfsek.terra.fabric.FabricEntryPoint; - - -// Register Terra things to the builtin registries. -@Mixin(Registry.class) -public class RegistryMixin { - @Inject(method = "", at = @At("RETURN")) - private static void registerTerraGenerators(CallbackInfo ci) { - FabricEntryPoint.register(); - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/package-info.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/package-info.java deleted file mode 100644 index ad90c31eb..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/package-info.java +++ /dev/null @@ -1,22 +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 . - */ - -/** - * Mixins that inject behavior into the client/server lifecycle. - */ - -package com.dfsek.terra.fabric.mixin.lifecycle; \ No newline at end of file diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/BiomeUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/BiomeUtil.java deleted file mode 100644 index 7afb25668..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/BiomeUtil.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.dfsek.terra.fabric.util; - -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.BuiltinRegistries; -import net.minecraft.util.registry.Registry; -import net.minecraft.util.registry.RegistryKey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; - -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.fabric.FabricEntryPoint; -import com.dfsek.terra.mod.config.PreLoadCompatibilityOptions; -import com.dfsek.terra.mod.config.ProtoPlatformBiome; -import com.dfsek.terra.mod.util.MinecraftUtil; - - -public final class BiomeUtil { - private static final Logger logger = LoggerFactory.getLogger(BiomeUtil.class); - - private BiomeUtil() { - - } - - public static void registerBiomes() { - logger.info("Registering biomes..."); - FabricEntryPoint.getPlatform().getConfigRegistry().forEach(pack -> { // Register all Terra biomes. - pack.getCheckedRegistry(Biome.class) - .forEach((id, biome) -> registerBiome(biome, pack, id)); - }); - MinecraftUtil.registerFlora(BuiltinRegistries.BIOME); - logger.info("Terra biomes registered."); - } - - /** - * Clones a Vanilla biome and injects Terra data to create a Terra-vanilla biome delegate. - * - * @param biome The Terra BiomeBuilder. - * @param pack The ConfigPack this biome belongs to. - */ - private static void registerBiome(Biome biome, ConfigPack pack, - com.dfsek.terra.api.registry.key.RegistryKey id) { - Registry registry = BuiltinRegistries.BIOME; - RegistryKey vanilla = ((ProtoPlatformBiome) biome.getPlatformBiome()).get(registry); - - - if(pack.getContext().get(PreLoadCompatibilityOptions.class).useVanillaBiomes()) { - ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(vanilla); - } else { - net.minecraft.world.biome.Biome minecraftBiome = MinecraftUtil.createBiome(biome, registry.get(vanilla)); - - Identifier identifier = new Identifier("terra", MinecraftUtil.createBiomeID(pack, id)); - - if(registry.containsId(identifier)) { - ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(MinecraftUtil.getEntry(registry, identifier) - .orElseThrow() - .getKey() - .orElseThrow()); - } else { - ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(BuiltinRegistries.add(registry, - MinecraftUtil.registerKey(identifier).getValue(), - minecraftBiome).getKey().orElseThrow()); - } - - MinecraftUtil.TERRA_BIOME_MAP.computeIfAbsent(vanilla.getValue(), i -> new ArrayList<>()).add(identifier); - } - } - -} diff --git a/platforms/fabric/src/main/resources/fabric.mod.json b/platforms/fabric/src/main/resources/fabric.mod.json index 2d9a3db6a..65289db22 100644 --- a/platforms/fabric/src/main/resources/fabric.mod.json +++ b/platforms/fabric/src/main/resources/fabric.mod.json @@ -22,6 +22,7 @@ }, "mixins": [ "terra.fabric.mixins.json", + "terra.lifecycle.mixins.json", "terra.common.mixins.json" ], "depends": { diff --git a/platforms/fabric/src/main/resources/terra.fabric.mixins.json b/platforms/fabric/src/main/resources/terra.fabric.mixins.json index 9b2d4bcec..f97889f6d 100644 --- a/platforms/fabric/src/main/resources/terra.fabric.mixins.json +++ b/platforms/fabric/src/main/resources/terra.fabric.mixins.json @@ -4,15 +4,10 @@ "package": "com.dfsek.terra.fabric.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ - "lifecycle.MinecraftServerMixin", - "lifecycle.NoiseConfigMixin", - "lifecycle.RegistryMixin" ], "client": [ - "lifecycle.client.MinecraftClientMixin" ], "server": [ - "lifecycle.server.ServerMainMixin" ], "injectors": { "defaultRequire": 1 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 9691dde88..d9ad54d81 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 @@ -47,16 +47,16 @@ public class ForgeEntryPoint { static { AwfulForgeHacks.loadAllTerraClasses(); - TERRA_PLUGIN = new PlatformImpl(); + TERRA_PLUGIN = new ForgePlatform(); } public static final String MODID = "terra"; private static final Logger logger = LoggerFactory.getLogger(ForgeEntryPoint.class); - private static final PlatformImpl TERRA_PLUGIN; + private static final ForgePlatform TERRA_PLUGIN; - public static PlatformImpl getPlatform() { + public static ForgePlatform getPlatform() { return TERRA_PLUGIN; } diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/PlatformImpl.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgePlatform.java similarity index 87% rename from platforms/forge/src/main/java/com/dfsek/terra/forge/PlatformImpl.java rename to platforms/forge/src/main/java/com/dfsek/terra/forge/ForgePlatform.java index 5281b8ba1..60cd727f4 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/PlatformImpl.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgePlatform.java @@ -34,23 +34,17 @@ import java.util.List; import com.dfsek.terra.addon.EphemeralAddon; import com.dfsek.terra.api.addon.BaseAddon; -import com.dfsek.terra.api.handle.ItemHandle; -import com.dfsek.terra.api.handle.WorldHandle; import com.dfsek.terra.api.util.generic.Lazy; import com.dfsek.terra.mod.CommonPlatform; import com.dfsek.terra.mod.ModPlatform; import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; -import com.dfsek.terra.mod.handle.MinecraftItemHandle; -import com.dfsek.terra.mod.handle.MinecraftWorldHandle; -public class PlatformImpl extends ModPlatform { - private static final Logger LOGGER = LoggerFactory.getLogger(PlatformImpl.class); - private final ItemHandle itemHandle = new MinecraftItemHandle(); - private final WorldHandle worldHandle = new MinecraftWorldHandle(); +public class ForgePlatform extends ModPlatform { + private static final Logger LOGGER = LoggerFactory.getLogger(ForgePlatform.class); private final Lazy dataFolder = Lazy.lazy(() -> new File("./config/Terra")); - public PlatformImpl() { + public ForgePlatform() { CommonPlatform.initialize(this); load(); } @@ -117,23 +111,12 @@ public class PlatformImpl extends ModPlatform { public @NotNull String platformName() { return "Forge"; } - - @Override - public @NotNull WorldHandle getWorldHandle() { - return worldHandle; - } - + @Override public @NotNull File getDataFolder() { return dataFolder.value(); } - @Override - public @NotNull ItemHandle getItemHandle() { - return itemHandle; - } - - @Override public BaseAddon getPlatformAddon() { return new ForgeAddon(this); diff --git a/platforms/mixin-common/build.gradle.kts b/platforms/mixin-common/build.gradle.kts index 47b720ca2..08098d753 100644 --- a/platforms/mixin-common/build.gradle.kts +++ b/platforms/mixin-common/build.gradle.kts @@ -15,6 +15,8 @@ loom { dependencies { shadedApi(project(":common:implementation:base")) + compileOnly("net.fabricmc:sponge-mixin:${Versions.Fabric.mixin}") + modImplementation("net.fabricmc:fabric-loader:${Versions.Mod.fabricLoader}") minecraft("com.mojang:minecraft:${Versions.Mod.minecraft}") diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java index ed9f2a986..680fcf187 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java @@ -4,8 +4,14 @@ import com.dfsek.tectonic.api.TypeRegistry; import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; +import com.dfsek.terra.api.handle.ItemHandle; +import com.dfsek.terra.api.handle.WorldHandle; import com.dfsek.terra.mod.config.SpawnSettingsTemplate; +import com.dfsek.terra.mod.handle.MinecraftItemHandle; + +import com.dfsek.terra.mod.handle.MinecraftWorldHandle; + import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; import net.minecraft.server.MinecraftServer; @@ -43,10 +49,15 @@ import com.dfsek.terra.mod.config.SpawnGroupTemplate; import com.dfsek.terra.mod.config.SpawnTypeConfig; import com.dfsek.terra.mod.util.PresetUtil; +import org.jetbrains.annotations.NotNull; + public abstract class ModPlatform extends AbstractPlatform { public abstract MinecraftServer getServer(); + private final ItemHandle itemHandle = new MinecraftItemHandle(); + private final WorldHandle worldHandle = new MinecraftWorldHandle(); + public void registerWorldTypes(BiConsumer registerFunction) { getRawConfigRegistry() .forEach(pack -> PresetUtil.createDefault(pack).apply(registerFunction)); @@ -93,4 +104,14 @@ public abstract class ModPlatform extends AbstractPlatform { } protected abstract BaseAddon getPlatformAddon(); + + @Override + public @NotNull WorldHandle getWorldHandle() { + return worldHandle; + } + + @Override + public @NotNull ItemHandle getItemHandle() { + return itemHandle; + } } diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java new file mode 100644 index 000000000..13ae3f692 --- /dev/null +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java @@ -0,0 +1,88 @@ +package com.dfsek.terra.lifecycle; + +import ca.solostudios.strata.Versions; +import ca.solostudios.strata.parser.tokenizer.ParseException; +import net.minecraft.MinecraftVersion; +import net.minecraft.server.MinecraftServer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import com.dfsek.terra.addon.EphemeralAddon; +import com.dfsek.terra.api.addon.BaseAddon; +import com.dfsek.terra.lifecycle.util.BiomeUtil; +import com.dfsek.terra.mod.CommonPlatform; +import com.dfsek.terra.mod.ModPlatform; +import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; + + +public abstract class LifecyclePlatform extends ModPlatform { + private static final Logger LOGGER = LoggerFactory.getLogger(LifecyclePlatform.class); + private static MinecraftServer server; + + public LifecyclePlatform() { + CommonPlatform.initialize(this); + load(); + } + + public static void setServer(MinecraftServer server) { + LifecyclePlatform.server = server; + } + + @Override + public MinecraftServer getServer() { + return server; + } + + @Override + public boolean reload() { + getTerraConfig().load(this); + getRawConfigRegistry().clear(); + boolean succeed = getRawConfigRegistry().loadAll(this); + + + if(server != null) { + server.reloadResources(server.getDataPackManager().getNames()).exceptionally(throwable -> { + LOGGER.warn("Failed to execute reload", throwable); + return null; + }).join(); + BiomeUtil.registerBiomes(); + server.getWorlds().forEach(world -> { + if(world.getChunkManager().getChunkGenerator() instanceof MinecraftChunkGeneratorWrapper chunkGeneratorWrapper) { + getConfigRegistry().get(chunkGeneratorWrapper.getPack().getRegistryKey()).ifPresent(pack -> { + chunkGeneratorWrapper.setPack(pack); + LOGGER.info("Replaced pack in chunk generator for world {}", world); + }); + } + }); + } + return succeed; + } + + @Override + protected Iterable platformAddon() { + List addons = new ArrayList<>(); + + super.platformAddon().forEach(addons::add); + + String mcVersion = MinecraftVersion.CURRENT.getReleaseTarget(); + try { + addons.add(new EphemeralAddon(Versions.parseVersion(mcVersion), "minecraft")); + } catch(ParseException e) { + try { + addons.add(new EphemeralAddon(Versions.parseVersion(mcVersion + ".0"), "minecraft")); + } catch(ParseException ex) { + LOGGER.warn("Failed to parse Minecraft version", e); + } + } + + addons.addAll(getPlatformMods()); + + return addons; + } + + protected abstract Collection getPlatformMods(); +} diff --git a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/mixin/lifecycle/NoiseConfigMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java similarity index 96% rename from platforms/quilt/src/main/java/com/dfsek/terra/quilt/mixin/lifecycle/NoiseConfigMixin.java rename to platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java index 6b863cca0..015a22260 100644 --- a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/mixin/lifecycle/NoiseConfigMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/NoiseConfigMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.quilt.mixin.lifecycle; +package com.dfsek.terra.lifecycle.mixin; import net.minecraft.util.math.noise.DoublePerlinNoiseSampler; import net.minecraft.util.registry.Registry; diff --git a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/mixin/lifecycle/RegistryMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java similarity index 70% rename from platforms/quilt/src/main/java/com/dfsek/terra/quilt/mixin/lifecycle/RegistryMixin.java rename to platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java index 55d649d44..42b73c1ce 100644 --- a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/mixin/lifecycle/RegistryMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/RegistryMixin.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.quilt.mixin.lifecycle; +package com.dfsek.terra.lifecycle.mixin; +import com.dfsek.terra.lifecycle.util.RegistryUtil; -import com.dfsek.terra.quilt.QuiltEntryPoint; import net.minecraft.util.registry.Registry; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -9,11 +9,10 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -// Register Terra things to the builtin registries. @Mixin(Registry.class) public class RegistryMixin { @Inject(method = "", at = @At("RETURN")) private static void registerTerraGenerators(CallbackInfo ci) { - QuiltEntryPoint.register(); + RegistryUtil.register(); } -} +} \ No newline at end of file diff --git a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/mixin/lifecycle/MinecraftServerMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/MinecraftServerMixin.java similarity index 89% rename from platforms/quilt/src/main/java/com/dfsek/terra/quilt/mixin/lifecycle/MinecraftServerMixin.java rename to platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/MinecraftServerMixin.java index 53277b18c..25ac340d0 100644 --- a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/mixin/lifecycle/MinecraftServerMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/MinecraftServerMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.quilt.mixin.lifecycle; +package com.dfsek.terra.lifecycle.mixin.lifecycle; import com.mojang.datafixers.DataFixer; import net.minecraft.resource.ResourcePackManager; @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.net.Proxy; -import com.dfsek.terra.quilt.QuiltEntryPoint; +import com.dfsek.terra.lifecycle.LifecyclePlatform; @Mixin(MinecraftServer.class) @@ -27,6 +27,6 @@ public class MinecraftServerMixin { private void injectConstructor(Thread serverThread, LevelStorage.Session session, ResourcePackManager dataPackManager, SaveLoader saveLoader, Proxy proxy, DataFixer dataFixer, ApiServices apiServices, WorldGenerationProgressListenerFactory worldGenerationProgressListenerFactory, CallbackInfo ci) { - QuiltEntryPoint.getPlatform().setServer((MinecraftServer) (Object) this); + LifecyclePlatform.setServer((MinecraftServer) (Object) this); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/client/MinecraftClientMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/client/MinecraftClientMixin.java similarity index 91% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/client/MinecraftClientMixin.java rename to platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/client/MinecraftClientMixin.java index b605d8cdb..30f092786 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/client/MinecraftClientMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/client/MinecraftClientMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.lifecycle.client; +package com.dfsek.terra.lifecycle.mixin.lifecycle.client; import net.minecraft.client.MinecraftClient; import net.minecraft.client.RunArgs; @@ -24,7 +24,7 @@ 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.FabricEntryPoint; +import com.dfsek.terra.lifecycle.util.LifecycleUtil; @Mixin(MinecraftClient.class) @@ -36,6 +36,6 @@ public class MinecraftClientMixin { // sorta arbitrary position, after mod init, before window opens shift = At.Shift.BEFORE)) public void injectConstructor(RunArgs args, CallbackInfo callbackInfo) { - FabricEntryPoint.initialize(); + LifecycleUtil.initialize(); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/ServerMainMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/server/ServerMainMixin.java similarity index 90% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/ServerMainMixin.java rename to platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/server/ServerMainMixin.java index 16e107631..e2e52bd2a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/ServerMainMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/server/ServerMainMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.lifecycle.server; +package com.dfsek.terra.lifecycle.mixin.lifecycle.server; import net.minecraft.server.Main; import org.spongepowered.asm.mixin.Mixin; @@ -23,7 +23,7 @@ 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.FabricEntryPoint; +import com.dfsek.terra.lifecycle.util.LifecycleUtil; @Mixin(Main.class) @@ -35,6 +35,6 @@ public class ServerMainMixin { // after registry manager creation ) private static void injectConstructor(String[] args, CallbackInfo ci) { - FabricEntryPoint.initialize(); + LifecycleUtil.initialize(); } } diff --git a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/util/BiomeUtil.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/BiomeUtil.java similarity index 94% rename from platforms/quilt/src/main/java/com/dfsek/terra/quilt/util/BiomeUtil.java rename to platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/BiomeUtil.java index e26d08938..b632220f9 100644 --- a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/util/BiomeUtil.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/BiomeUtil.java @@ -1,6 +1,5 @@ -package com.dfsek.terra.quilt.util; +package com.dfsek.terra.lifecycle.util; -import com.dfsek.terra.quilt.QuiltEntryPoint; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; @@ -12,6 +11,7 @@ import java.util.ArrayList; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.mod.CommonPlatform; import com.dfsek.terra.mod.config.PreLoadCompatibilityOptions; import com.dfsek.terra.mod.config.ProtoPlatformBiome; import com.dfsek.terra.mod.util.MinecraftUtil; @@ -26,7 +26,7 @@ public final class BiomeUtil { public static void registerBiomes() { logger.info("Registering biomes..."); - QuiltEntryPoint.getPlatform().getConfigRegistry().forEach(pack -> { // Register all Terra biomes. + CommonPlatform.get().getConfigRegistry().forEach(pack -> { // Register all Terra biomes. pack.getCheckedRegistry(Biome.class) .forEach((id, biome) -> registerBiome(biome, pack, id)); }); diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleUtil.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleUtil.java new file mode 100644 index 000000000..7961a9c9a --- /dev/null +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleUtil.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.lifecycle.util; + +import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; +import com.dfsek.terra.mod.CommonPlatform; + +import net.minecraft.util.registry.BuiltinRegistries; + + +public final class LifecycleUtil { + private LifecycleUtil() { + + } + + public static void initialize() { + CommonPlatform.get().getEventManager().callEvent(new PlatformInitializationEvent()); + BiomeUtil.registerBiomes(); + CommonPlatform.get().registerWorldTypes((id, preset) -> BuiltinRegistries.add(BuiltinRegistries.WORLD_PRESET, id, preset)); + } +} diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/RegistryUtil.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/RegistryUtil.java new file mode 100644 index 000000000..000f7c472 --- /dev/null +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/RegistryUtil.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.lifecycle.util; + +import com.dfsek.terra.mod.data.Codecs; + +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; + + +public final class RegistryUtil { + private RegistryUtil() { + + } + + public static void register() { + Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), Codecs.MINECRAFT_CHUNK_GENERATOR_WRAPPER); + Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), Codecs.TERRA_BIOME_SOURCE); + } +} diff --git a/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json b/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json new file mode 100644 index 000000000..ea76eb90e --- /dev/null +++ b/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json @@ -0,0 +1,20 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.dfsek.terra.lifecycle.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + "NoiseConfigMixin", + "RegistryMixin", + "lifecycle.MinecraftServerMixin" + ], + "client": [ + "lifecycle.client.MinecraftClientMixin" + ], + "server": [ + "lifecycle.server.ServerMainMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/PlatformImpl.java b/platforms/quilt/src/main/java/com/dfsek/terra/quilt/PlatformImpl.java deleted file mode 100644 index 958e61080..000000000 --- a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/PlatformImpl.java +++ /dev/null @@ -1,151 +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.quilt; - -import ca.solostudios.strata.Versions; -import ca.solostudios.strata.parser.tokenizer.ParseException; -import ca.solostudios.strata.version.Version; -import net.minecraft.MinecraftVersion; -import net.minecraft.server.MinecraftServer; -import org.jetbrains.annotations.NotNull; -import org.quiltmc.loader.api.QuiltLoader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import com.dfsek.terra.addon.EphemeralAddon; -import com.dfsek.terra.api.addon.BaseAddon; -import com.dfsek.terra.api.handle.ItemHandle; -import com.dfsek.terra.api.handle.WorldHandle; -import com.dfsek.terra.api.util.generic.Lazy; -import com.dfsek.terra.mod.CommonPlatform; -import com.dfsek.terra.mod.ModPlatform; -import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; -import com.dfsek.terra.mod.handle.MinecraftItemHandle; -import com.dfsek.terra.mod.handle.MinecraftWorldHandle; -import com.dfsek.terra.quilt.util.BiomeUtil; - - -public class PlatformImpl extends ModPlatform { - private static final Logger LOGGER = LoggerFactory.getLogger(PlatformImpl.class); - private final ItemHandle itemHandle = new MinecraftItemHandle(); - private final WorldHandle worldHandle = new MinecraftWorldHandle(); - private final Lazy dataFolder = Lazy.lazy(() -> new File(QuiltLoader.getConfigDir().toFile(), "Terra")); - private MinecraftServer server; - - public PlatformImpl() { - CommonPlatform.initialize(this); - load(); - } - - public void setServer(MinecraftServer server) { - this.server = server; - } - - @Override - public MinecraftServer getServer() { - return server; - } - - @Override - public boolean reload() { - getTerraConfig().load(this); - getRawConfigRegistry().clear(); - boolean succeed = getRawConfigRegistry().loadAll(this); - - - if(server != null) { - server.reloadResources(server.getDataPackManager().getNames()).exceptionally(throwable -> { - LOGGER.warn("Failed to execute reload", throwable); - return null; - }).join(); - BiomeUtil.registerBiomes(); - server.getWorlds().forEach(world -> { - if(world.getChunkManager().getChunkGenerator() instanceof MinecraftChunkGeneratorWrapper chunkGeneratorWrapper) { - getConfigRegistry().get(chunkGeneratorWrapper.getPack().getRegistryKey()).ifPresent(pack -> { - chunkGeneratorWrapper.setPack(pack); - LOGGER.info("Replaced pack in chunk generator for world {}", world); - }); - } - }); - } - return succeed; - } - - @Override - protected Iterable platformAddon() { - List addons = new ArrayList<>(); - - super.platformAddon().forEach(addons::add); - - String mcVersion = MinecraftVersion.CURRENT.getReleaseTarget(); - try { - addons.add(new EphemeralAddon(Versions.parseVersion(mcVersion), "minecraft")); - } catch(ParseException e) { - try { - addons.add(new EphemeralAddon(Versions.parseVersion(mcVersion + ".0"), "minecraft")); - } catch(ParseException ex) { - LOGGER.warn("Failed to parse Minecraft version", e); - } - } - - QuiltLoader.getAllMods().forEach(mod -> { - String id = mod.metadata().id(); - if(id.equals("terra") || id.equals("minecraft") || id.equals("java")) return; - try { - Version version = Versions.parseVersion(mod.metadata().version().raw()); - addons.add(new EphemeralAddon(version, "quilt:" + id)); - } catch(ParseException e) { - LOGGER.warn( - "Mod {}, version {} does not follow semantic versioning specification, Terra addons will be unable to depend on " + - "it.", - id, mod.metadata().version().raw()); - } - }); - - return addons; - } - - @Override - public @NotNull String platformName() { - return "Quilt"; - } - - @Override - public @NotNull WorldHandle getWorldHandle() { - return worldHandle; - } - - @Override - public @NotNull File getDataFolder() { - return dataFolder.value(); - } - - @Override - public @NotNull ItemHandle getItemHandle() { - return itemHandle; - } - - @Override - public BaseAddon getPlatformAddon() { - return new QuiltAddon(this); - } -} diff --git a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/QuiltEntryPoint.java b/platforms/quilt/src/main/java/com/dfsek/terra/quilt/QuiltEntryPoint.java index 20adb8e3b..f7c939fed 100644 --- a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/QuiltEntryPoint.java +++ b/platforms/quilt/src/main/java/com/dfsek/terra/quilt/QuiltEntryPoint.java @@ -19,45 +19,20 @@ package com.dfsek.terra.quilt; import cloud.commandframework.execution.CommandExecutionCoordinator; import cloud.commandframework.fabric.FabricServerCommandManager; +import net.minecraft.server.command.ServerCommandSource; import org.quiltmc.loader.api.ModContainer; import org.quiltmc.qsl.base.api.entrypoint.ModInitializer; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.BuiltinRegistries; -import net.minecraft.util.registry.Registry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.dfsek.terra.api.command.CommandSender; import com.dfsek.terra.api.event.events.platform.CommandRegistrationEvent; -import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; -import com.dfsek.terra.quilt.util.BiomeUtil; -import com.dfsek.terra.mod.CommonPlatform; -import com.dfsek.terra.mod.data.Codecs; public class QuiltEntryPoint implements ModInitializer { private static final Logger logger = LoggerFactory.getLogger(QuiltEntryPoint.class); - private static final PlatformImpl TERRA_PLUGIN = new PlatformImpl(); - - - public static PlatformImpl getPlatform() { - return TERRA_PLUGIN; - } - - public static void register() { // register the things - Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), Codecs.MINECRAFT_CHUNK_GENERATOR_WRAPPER); - Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), Codecs.TERRA_BIOME_SOURCE); - } - - public static void initialize() { - getPlatform().getEventManager().callEvent( - new PlatformInitializationEvent()); - BiomeUtil.registerBiomes(); - CommonPlatform.get().registerWorldTypes((id, preset) -> BuiltinRegistries.add(BuiltinRegistries.WORLD_PRESET, id, preset)); - } - + private static final QuiltPlatform TERRA_PLUGIN = new QuiltPlatform(); @Override public void onInitialize(ModContainer container) { logger.info("Initializing Terra Quilt mod..."); diff --git a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/QuiltPlatform.java b/platforms/quilt/src/main/java/com/dfsek/terra/quilt/QuiltPlatform.java new file mode 100644 index 000000000..406e2ffcf --- /dev/null +++ b/platforms/quilt/src/main/java/com/dfsek/terra/quilt/QuiltPlatform.java @@ -0,0 +1,74 @@ +/* + * 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.quilt; + +import ca.solostudios.strata.Versions; +import ca.solostudios.strata.parser.tokenizer.ParseException; +import ca.solostudios.strata.version.Version; +import org.jetbrains.annotations.NotNull; +import org.quiltmc.loader.api.QuiltLoader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.util.Collection; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.dfsek.terra.addon.EphemeralAddon; +import com.dfsek.terra.api.addon.BaseAddon; +import com.dfsek.terra.api.util.generic.Lazy; +import com.dfsek.terra.lifecycle.LifecyclePlatform; + + +public class QuiltPlatform extends LifecyclePlatform { + private static final Logger LOGGER = LoggerFactory.getLogger(QuiltPlatform.class); + + @Override + protected Collection getPlatformMods() { + return QuiltLoader.getAllMods().stream().flatMap(mod -> { + String id = mod.metadata().id(); + if(id.equals("terra") || id.equals("minecraft") || id.equals("java")) return Stream.empty(); + try { + Version version = Versions.parseVersion(mod.metadata().version().raw()); + return Stream.of(new EphemeralAddon(version, "quilt:" + id)); + } catch(ParseException e) { + LOGGER.warn( + "Mod {}, version {} does not follow semantic versioning specification, Terra addons will be unable to depend on " + + "it.", + id, mod.metadata().version().raw()); + } + return Stream.empty(); + }).collect(Collectors.toList()); + } + + @Override + public @NotNull String platformName() { + return "Quilt"; + } + + @Override + public @NotNull File getDataFolder() { + return new File(QuiltLoader.getConfigDir().toFile(), "Terra"); + } + + @Override + public BaseAddon getPlatformAddon() { + return new QuiltAddon(this); + } +} diff --git a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/mixin/lifecycle/client/MinecraftClientMixin.java b/platforms/quilt/src/main/java/com/dfsek/terra/quilt/mixin/lifecycle/client/MinecraftClientMixin.java deleted file mode 100644 index 6556ba806..000000000 --- a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/mixin/lifecycle/client/MinecraftClientMixin.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.quilt.mixin.lifecycle.client; - -import com.dfsek.terra.quilt.QuiltEntryPoint; -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) { - QuiltEntryPoint.initialize(); - } -} diff --git a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/mixin/lifecycle/package-info.java b/platforms/quilt/src/main/java/com/dfsek/terra/quilt/mixin/lifecycle/package-info.java deleted file mode 100644 index 23f9f63d2..000000000 --- a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/mixin/lifecycle/package-info.java +++ /dev/null @@ -1,22 +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 . - */ - -/** - * Mixins that inject behavior into the client/server lifecycle. - */ - -package com.dfsek.terra.quilt.mixin.lifecycle; \ No newline at end of file diff --git a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/mixin/lifecycle/server/ServerMainMixin.java b/platforms/quilt/src/main/java/com/dfsek/terra/quilt/mixin/lifecycle/server/ServerMainMixin.java deleted file mode 100644 index 577e2cfe2..000000000 --- a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/mixin/lifecycle/server/ServerMainMixin.java +++ /dev/null @@ -1,39 +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.quilt.mixin.lifecycle.server; - -import com.dfsek.terra.quilt.QuiltEntryPoint; -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) { - QuiltEntryPoint.initialize(); - } -} diff --git a/platforms/quilt/src/main/resources/quilt.mod.json b/platforms/quilt/src/main/resources/quilt.mod.json index 6dac98fb9..fdb6735b4 100644 --- a/platforms/quilt/src/main/resources/quilt.mod.json +++ b/platforms/quilt/src/main/resources/quilt.mod.json @@ -46,6 +46,7 @@ }, "mixin": [ "terra.quilt.mixins.json", + "terra.lifecycle.mixins.json", "terra.common.mixins.json" ], "accessWidener": "terra.accesswidener" diff --git a/platforms/quilt/src/main/resources/terra.quilt.mixins.json b/platforms/quilt/src/main/resources/terra.quilt.mixins.json index ca92e0bf1..91f51b344 100644 --- a/platforms/quilt/src/main/resources/terra.quilt.mixins.json +++ b/platforms/quilt/src/main/resources/terra.quilt.mixins.json @@ -4,15 +4,10 @@ "package": "com.dfsek.terra.quilt.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ - "lifecycle.MinecraftServerMixin", - "lifecycle.NoiseConfigMixin", - "lifecycle.RegistryMixin" ], "client": [ - "lifecycle.client.MinecraftClientMixin" ], "server": [ - "lifecycle.server.ServerMainMixin" ], "injectors": { "defaultRequire": 1