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