From 85206d5239f1b42b14737e987e03c56556724b38 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 27 Nov 2021 11:08:01 -0700 Subject: [PATCH] implement ephemeral addons for platform version comparison --- .../com/dfsek/terra/AbstractPlatform.java | 16 ++++--- .../com/dfsek/terra/addon/EphemeralAddon.java | 26 +++++++++++ .../terra/{ => addon}/InternalAddon.java | 2 +- .../com/dfsek/terra/fabric/PlatformImpl.java | 45 +++++++++++++++++-- 4 files changed, 80 insertions(+), 9 deletions(-) create mode 100644 common/implementation/base/src/main/java/com/dfsek/terra/addon/EphemeralAddon.java rename common/implementation/base/src/main/java/com/dfsek/terra/{ => addon}/InternalAddon.java (97%) diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java b/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java index ed9ad8d5e..6bb16106f 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java @@ -18,6 +18,10 @@ package com.dfsek.terra; import com.dfsek.tectonic.loading.TypeRegistry; + +import com.dfsek.terra.addon.EphemeralAddon; +import com.dfsek.terra.addon.InternalAddon; + import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; @@ -33,9 +37,9 @@ import java.io.UncheckedIOException; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.Optional; import com.dfsek.terra.addon.BootstrapAddonLoader; import com.dfsek.terra.addon.DependencySorter; @@ -102,8 +106,8 @@ public abstract class AbstractPlatform implements Platform { return manager; } - protected Optional platformAddon() { - return Optional.empty(); + protected Iterable platformAddon() { + return Collections.emptySet(); } protected void load() { @@ -175,7 +179,7 @@ public abstract class AbstractPlatform implements Platform { addonList.add(internalAddon); - platformAddon().ifPresent(addonList::add); + platformAddon().forEach(addonList::add); BootstrapAddonLoader bootstrapAddonLoader = new BootstrapAddonLoader(); @@ -214,7 +218,9 @@ public abstract class AbstractPlatform implements Platform { sorter.sort().forEach(addon -> { platformInjector.inject(addon); addon.initialize(); - addonRegistry.register(addon.getID(), addon); + if(!(addon instanceof EphemeralAddon)) { // ephemeral addons exist only for version checking + addonRegistry.register(addon.getID(), addon); + } }); eventManager.getHandler(FunctionalEventHandler.class) diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/addon/EphemeralAddon.java b/common/implementation/base/src/main/java/com/dfsek/terra/addon/EphemeralAddon.java new file mode 100644 index 000000000..8d269241d --- /dev/null +++ b/common/implementation/base/src/main/java/com/dfsek/terra/addon/EphemeralAddon.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.addon; + +import ca.solostudios.strata.version.Version; + +import com.dfsek.terra.api.addon.BaseAddon; + + +public class EphemeralAddon implements BaseAddon { + private final Version version; + private final String id; + + public EphemeralAddon(Version version, String id) { + this.version = version; + this.id = id; + } + + @Override + public Version getVersion() { + return version; + } + + @Override + public String getID() { + return id; + } +} diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/InternalAddon.java b/common/implementation/base/src/main/java/com/dfsek/terra/addon/InternalAddon.java similarity index 97% rename from common/implementation/base/src/main/java/com/dfsek/terra/InternalAddon.java rename to common/implementation/base/src/main/java/com/dfsek/terra/addon/InternalAddon.java index b2da42607..d802930ce 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/InternalAddon.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/addon/InternalAddon.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra; +package com.dfsek.terra.addon; import ca.solostudios.strata.Versions; import ca.solostudios.strata.version.Version; 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 index 845461887..0d410194a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/PlatformImpl.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/PlatformImpl.java @@ -17,15 +17,26 @@ 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.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.TypeRegistry; + +import com.dfsek.terra.addon.EphemeralAddon; + import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.MinecraftVersion; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Optional; import java.util.Set; @@ -40,9 +51,12 @@ import com.dfsek.terra.fabric.handle.FabricItemHandle; import com.dfsek.terra.fabric.handle.FabricWorldHandle; import com.dfsek.terra.fabric.util.ProtoBiome; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class PlatformImpl extends AbstractPlatform { - + private static final Logger LOGGER = LoggerFactory.getLogger(PlatformImpl.class); private final ItemHandle itemHandle = new FabricItemHandle(); private final WorldHandle worldHandle = new FabricWorldHandle(); private final Lazy dataFolder = Lazy.lazy(() -> new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra")); @@ -72,8 +86,33 @@ public class PlatformImpl extends AbstractPlatform { } @Override - protected Optional platformAddon() { - return Optional.of(new FabricAddon(this)); + protected Iterable platformAddon() { + List addons = new ArrayList<>(); + + addons.add(new FabricAddon(this)); + + 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 -> { + if(mod.getMetadata().getId().equals("terra")) return; + try { + Version version = Versions.parseVersion(mod.getMetadata().getVersion().getFriendlyString()); + addons.add(new EphemeralAddon(version, "fabric:" + mod.getMetadata().getId())); + } catch(ParseException e) { + LOGGER.warn("Mod {}, version {} does not follow semantic versioning specification.", mod.getMetadata().getId(), mod.getMetadata().getVersion().getFriendlyString()); + } + }); + + return addons; } @Override