[Feature] Updater Icons from Entrypoints

This commit is contained in:
Frank 2022-07-22 18:41:06 +02:00
parent bcd64b87b7
commit dca9817c17
9 changed files with 86 additions and 11 deletions

View file

@ -1,11 +1,16 @@
package org.betterx.bclib.client.gui.screens;
import org.betterx.bclib.BCLib;
import org.betterx.bclib.config.Configs;
import org.betterx.bclib.entrypoints.EntrypointUtil;
import org.betterx.bclib.networking.VersionCheckEntryPoint;
import org.betterx.bclib.networking.VersionChecker;
import org.betterx.ui.ColorUtil;
import org.betterx.ui.layout.components.HorizontalStack;
import org.betterx.ui.layout.components.LayoutComponent;
import org.betterx.ui.layout.components.VerticalStack;
import org.betterx.ui.layout.values.Size;
import org.betterx.ui.layout.values.Value;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.gui.GuiComponent;
@ -13,6 +18,7 @@ import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.CommonComponents;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.Style;
import net.minecraft.resources.ResourceLocation;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@ -27,6 +33,18 @@ public class UpdatesScreen extends BCLibLayoutScreen {
super(parent, Component.translatable("bclib.updates.title"), 10, 10, 10);
}
public ResourceLocation getUpdaterIcon(String modID) {
if (modID.equals(BCLib.MOD_ID)) {
return BCLibLayoutScreen.BCLIB_LOGO_LOCATION;
}
return EntrypointUtil.getCommon(VersionCheckEntryPoint.class)
.stream()
.map(vc -> vc.updaterIcon(modID))
.filter(r -> r != null)
.findAny()
.orElse(null);
}
@Override
protected LayoutComponent<?, ?> initContent() {
VerticalStack rows = new VerticalStack(relative(1), fit()).centerHorizontal();
@ -37,8 +55,14 @@ public class UpdatesScreen extends BCLibLayoutScreen {
VersionChecker.forEachUpdate((mod, cur, updated) -> {
ModContainer nfo = FabricLoader.getInstance().getModContainer(mod).orElse(null);
HorizontalStack row = rows.addRow(relative(0.8), fit()).centerHorizontal();
ResourceLocation icon = getUpdaterIcon(mod);
HorizontalStack row = rows.addRow(fixed(320), fit()).centerHorizontal();
if (icon != null) {
row.addImage(Value.fit(), Value.fit(), icon, Size.of(32));
row.addSpacer(4);
} else {
row.addSpacer(36);
}
if (nfo != null) {
row.addText(fit(), fit(), Component.literal(nfo.getMetadata().getName()))
.setColor(ColorUtil.WHITE);
@ -54,7 +78,7 @@ public class UpdatesScreen extends BCLibLayoutScreen {
row.addButton(fit(), fit(), Component.translatable("bclib.updates.curseforge_link"))
.onPress((bt) -> {
this.openLink(nfo.getMetadata().getContact().get("homepage").get());
});
}).centerVertical();
}
});

View file

@ -72,7 +72,7 @@ public class WelcomeScreen extends BCLibLayoutScreen {
Checkbox check = innerContent.addCheckbox(
fit(),
fit(),
translatable("title.config.bclib.client.ui.check"),
translatable("title.config.bclib.client.version.check"),
Configs.CLIENT_CONFIG.checkVersions()
)
.onChange((cb, state) -> {
@ -80,7 +80,7 @@ public class WelcomeScreen extends BCLibLayoutScreen {
});
innerContent.addSpacer(2);
HorizontalStack dscBox = innerContent.indent(24);
dscBox.addMultilineText(fill(), fit(), translatable("description.config.bclib.client.ui.check"))
dscBox.addMultilineText(fill(), fit(), translatable("description.config.bclib.client.version.check"))
.setColor(ColorUtil.GRAY);
dscBox.addSpacer(8);

View file

@ -0,0 +1,4 @@
package org.betterx.bclib.entrypoints;
public interface BCLibEntryPoint {
}

View file

@ -0,0 +1,31 @@
package org.betterx.bclib.entrypoints;
import net.fabricmc.loader.api.FabricLoader;
import java.util.List;
import org.jetbrains.annotations.ApiStatus;
@ApiStatus.Internal
public class EntrypointUtil {
private static <T extends BCLibEntryPoint> List<T> getEntryPoints(boolean client, Class<T> select) {
return FabricLoader.getInstance()
.getEntrypoints(
client ? "bclib_client" : "bclib",
BCLibEntryPoint.class
)
.stream()
.filter(o -> select.isAssignableFrom(o.getClass()))
.map(e -> (T) e)
.toList();
}
@ApiStatus.Internal
public static <T extends BCLibEntryPoint> List<T> getCommon(Class<T> select) {
return getEntryPoints(false, select);
}
@ApiStatus.Internal
public static <T extends BCLibEntryPoint> List<T> getClient(Class<T> select) {
return getEntryPoints(true, select);
}
}

View file

@ -0,0 +1,9 @@
package org.betterx.bclib.networking;
import org.betterx.bclib.entrypoints.BCLibEntryPoint;
import net.minecraft.resources.ResourceLocation;
public interface VersionCheckEntryPoint extends BCLibEntryPoint {
ResourceLocation updaterIcon(String modID);
}

View file

@ -4,6 +4,8 @@ import org.betterx.bclib.BCLib;
import org.betterx.bclib.config.Configs;
import org.betterx.worlds.together.util.ModUtil;
import net.fabricmc.loader.api.FabricLoader;
import com.google.gson.Gson;
import java.io.IOException;
@ -123,6 +125,10 @@ public class VersionChecker implements Runnable {
BCLib.LOGGER.info("Received Version Info for minecraft=" + json.mc + ", loader=" + json.loader);
if (json.mods != null) {
for (ModVersion mod : json.mods) {
if (!KNOWN_MODS.contains(mod.n)) {
if (FabricLoader.getInstance().getModContainer(mod.n).isPresent())
registerMod(mod.n);
}
if (mod.n != null && mod.v != null && KNOWN_MODS.contains(mod.n)) {
boolean isNew = ModUtil.isLargerVersion(mod.v, ModUtil.getModVersion(mod.n));
BCLib.LOGGER.info(" - " + mod.n + ":" + mod.v + (isNew ? " (update available)" : ""));

View file

@ -19,10 +19,12 @@ public class EntrypointUtil {
.toList();
}
@ApiStatus.Internal
public static <T extends WorldsTogetherEntrypoint> List<T> getCommon(Class<T> select) {
return getEntryPoints(false, select);
}
@ApiStatus.Internal
public static <T extends WorldsTogetherEntrypoint> List<T> getClient(Class<T> select) {
return getEntryPoints(true, select);
}

View file

@ -74,14 +74,13 @@
"bclib.updates.description": "Einige der installierten Mods sind veraltet. Wir verbessern und erweitern ständig unseren Inhalt und stellen wichtige Fehlerbehebungen zur Verfügung.\nBitte aktualisiere Deine Mods über die unten angegebenen Links.",
"bclib.welcome.title": "Wilkommen bei ",
"bclib.welcome.description": "... und ein riesiges herzliches **Dankeschön** für das Herunterladen und Spielen unserer Mods. Wir hoffen, dass sie euch genauso viel Spaß machen wie uns.\n\nBevor wir anfangen, gibt es ein paar Dinge, die wir einrichten müssen, also lest bitte den folgenden langweiligen Teil weiter.",
"bclib.welcome.donation": "Wenn Dir unsere Mods so gut gefallen, wie wir hoffen, dann denken Sie bitte über eine kleine Spende nach :)",
"description.config.bclib.client.ui.check": "BCLib enthält eine einfache Versionsüberprüfung, die Dich benachrichtigen kann, wenn neue Updates unserer Mods verfügbar sind. Dazu müssen wir eine Ressource von einem unserer Webserver abrufen. Um die Anfrage zu bearbeiten versenden wir zusammen mit Deiner IP-Address (wir müssen ja wissen wohin die Antwort gehen soll) auch Deine Minecraft-Version (damit wir die richtige Mod-Version auswählen können). Die übertragenen Daten werden von uns niemals für andere Zwecke verwendet, verarbeitet oder weitergegeben, müssen aber aus rechtlichen Gründen für 4 Wochen in unseren Log-Dateien gespeichert werden.",
"title.config.bclib.client.client.ui.check": "Versionsprüfung erlauben",
"bclib.welcome.donation": "Wenn Dir unsere Mods so gut gefallen, wie wir hoffen, dann denke bitte über eine kleine Spende nach :)",
"description.config.bclib.client.version.check": "BCLib enthält eine einfache Versionsüberprüfung, die Dich benachrichtigen kann, wenn neue Updates unserer Mods verfügbar sind. Dazu müssen wir eine Ressource von einem unserer Webserver abrufen. Um die Anfrage zu bearbeiten versenden wir zusammen mit Deiner IP-Address (wir müssen ja wissen wohin die Antwort gehen soll) auch Deine Minecraft-Version (damit wir die richtige Mod-Version auswählen können). Die übertragenen Daten werden von uns niemals für andere Zwecke verwendet, verarbeitet oder weitergegeben, müssen aber aus rechtlichen Gründen für 4 Wochen in unseren Log-Dateien gespeichert werden.",
"title.config.bclib.client.version.check": "Versionsprüfung erlauben",
"title.config.bclib.client.ui.showUpdateInfo": "Anzeigen wenn neue Updates verfügabr sind",
"title.config.bclib.client.rendering.FogDensity": "Nebeldichte",
"description.config.bclib.client.ui.suppressExperimentalDialogOnLoad": "Der Warnbildschirm wird immer dann angezeigt, wenn Deine Welt nicht die Einstellungen der Vanilla-Version verwendet. Dies kann passieren, wenn Du eine Welt in einer Vorschauversion startest, aber auch wenn Du Mods verwendest, um die Welterzeugung zu verändern. Wenn diese Option aktiviert ist, wird die Warnung übersprungen, wenn Du eine bestehende Welt lädst. Sie wird weiterhin angezeigt (als Erinnerung), wenn eine neue Welt erstellt wird.",
"title.config.bclib.client.ui.forceBetterXPreset": "BetterX als Standard-Welt-Typ verwenden",
"description.config.bclib.client.ui.forceBetterXPreset": "Der Welt-Typ bestimmt, wie eine Welt generiert wird. In den meisten Fällen solltet BetterX als Standardeinstellung beibehalten werden (Du kannst den Typ jederzeit im Welt-Erstellen-Bildschirm ändern). Dieser Typ ist für maximale Kompatibilität zwischen DataPacks, unserer Mod und anderen Fabric-Mods optimiert. Außerdem bietet er einige einzigartige Funktionen für BetterNether und BetterEnd. Du solltest diese Option nur deaktivieren, wenn Du einen Grund dazu hast!",
"title.config.bclib.client.ui.check": "Enable Version Check",
"warning.config.bclib.client.ui.forceBetterXPreset": "IN DEN MEISTEN FÄLLEN SOLLTE DIESE OPTION AKTIVIERT BLEIBEN.\n"
}

View file

@ -75,8 +75,8 @@
"bclib.welcome.title": "Welcome to ",
"bclib.welcome.description": "... and a huge hearty **thank you** for downloading and playing our mods. We hope you enjoy them as much as we do.\n\nBefore we start, there are a few things we need to set up, so please continue reading the following boring part.",
"bclib.welcome.donation": "If you enjoy our Mods as much as we hope you do, please consider a small Donation :)",
"description.config.bclib.client.ui.check": "BCLib includes a simple version checker that can notify you when new updates of our mods are available. To do this, we need to read a resource from one of our web servers. To process the request, together with your IP address (we need to know where to send the response) we also send your Minecraft version (so we can choose the right mod version). The transmitted data will never be used or processed by us for other purposes, but must be stored in our log files for 4 weeks for legal reasons.",
"title.config.bclib.client.ui.check": "Enable Version Check",
"description.config.bclib.client.version.check": "BCLib includes a simple version checker that can notify you when new updates of our mods are available. To do this, we need to read a resource from one of our web servers. To process the request, together with your IP address (we need to know where to send the response) we also send your Minecraft version (so we can choose the right mod version). The transmitted data will never be used or processed by us for other purposes, but must be stored in our log files for 4 weeks for legal reasons.",
"title.config.bclib.client.version.check": "Enable Version Check",
"title.config.bclib.client.ui.showUpdateInfo": "Allow Update Reminder Screen",
"title.config.bclib.client.rendering.FogDensity": "Fog Density",
"description.config.bclib.client.ui.suppressExperimentalDialogOnLoad": "The warning screen appears whenever your world does not use the vanilla version settings. This can happen when you start a world in a preview version, but also when you use mods to change the world creation. If this option is enabled, the warning will be skipped when you load an existing world. It will still be displayed (as a reminder) when a new world is created.",