diff --git a/build.gradle b/build.gradle index 77e882c..5ca68b8 100644 --- a/build.gradle +++ b/build.gradle @@ -47,6 +47,7 @@ processResources { expand "version": project.version filter { line -> line.replace("@mc_version@", project.minecraft_version) } + filter { line -> line.replace("@gh_hash@", System.getenv("GITHUB_SHA") ?: "unknown") } } } diff --git a/src/main/java/anticope/rejects/mixin/TitleScreenMixin.java b/src/main/java/anticope/rejects/mixin/TitleScreenMixin.java new file mode 100644 index 0000000..cce67ad --- /dev/null +++ b/src/main/java/anticope/rejects/mixin/TitleScreenMixin.java @@ -0,0 +1,25 @@ +package anticope.rejects.mixin; + +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 net.minecraft.client.gui.screen.TitleScreen; +import net.minecraft.client.util.math.MatrixStack; + +import anticope.rejects.utils.RejectsConfig; +import anticope.rejects.utils.UpdateUtil; +import meteordevelopment.meteorclient.utils.network.MeteorExecutor; + +@Mixin(value = TitleScreen.class) +public class TitleScreenMixin { + @Inject(method = "render", at = @At("TAIL")) + private void onRender(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo info) { + if (RejectsConfig.get().checkForUpdates) { + MeteorExecutor.execute(() -> { + UpdateUtil.checkUpdate(); + }); + } + } +} diff --git a/src/main/java/anticope/rejects/utils/ConfigModifier.java b/src/main/java/anticope/rejects/utils/ConfigModifier.java index 06ca2ee..846f195 100644 --- a/src/main/java/anticope/rejects/utils/ConfigModifier.java +++ b/src/main/java/anticope/rejects/utils/ConfigModifier.java @@ -1,5 +1,6 @@ package anticope.rejects.utils; +import meteordevelopment.meteorclient.settings.BoolSetting; import meteordevelopment.meteorclient.settings.EnumSetting; import meteordevelopment.meteorclient.settings.ModuleListSetting; import meteordevelopment.meteorclient.settings.Setting; @@ -33,6 +34,14 @@ public class ConfigModifier { .build() ); + public final Setting checkForUpdates = sgRejects.add(new BoolSetting.Builder() + .name("check-for-updates") + .description("Show toast on title screen when new update is available.") + .defaultValue(RejectsConfig.get().checkForUpdates) + .onChanged(v -> RejectsConfig.get().checkForUpdates = v) + .build() + ); + public static ConfigModifier get() { if (INSTANCE == null) INSTANCE = new ConfigModifier(); return INSTANCE; diff --git a/src/main/java/anticope/rejects/utils/RejectsConfig.java b/src/main/java/anticope/rejects/utils/RejectsConfig.java index 5afdd14..4645483 100644 --- a/src/main/java/anticope/rejects/utils/RejectsConfig.java +++ b/src/main/java/anticope/rejects/utils/RejectsConfig.java @@ -28,6 +28,7 @@ public class RejectsConfig extends System { } public HttpAllowed httpAllowed = HttpAllowed.Everything; + public boolean checkForUpdates = true; public Set hiddenModules = new HashSet(); public RejectsConfig() { @@ -65,6 +66,7 @@ public class RejectsConfig extends System { public NbtCompound toTag() { NbtCompound tag = new NbtCompound(); tag.putString("httpAllowed", httpAllowed.toString()); + tag.putBoolean("checkForUpdates", checkForUpdates); NbtList modulesTag = new NbtList(); for (String module : hiddenModules) modulesTag.add(NbtString.of(module)); @@ -76,6 +78,7 @@ public class RejectsConfig extends System { @Override public RejectsConfig fromTag(NbtCompound tag) { httpAllowed = HttpAllowed.valueOf(tag.getString("httpAllowed")); + checkForUpdates = !tag.contains("checkForUpdates") || tag.getBoolean("checkForUpdates"); NbtList valueTag = tag.getList("hiddenModules", 8); for (NbtElement tagI : valueTag) { diff --git a/src/main/java/anticope/rejects/utils/UpdateUtil.java b/src/main/java/anticope/rejects/utils/UpdateUtil.java new file mode 100644 index 0000000..12ec611 --- /dev/null +++ b/src/main/java/anticope/rejects/utils/UpdateUtil.java @@ -0,0 +1,36 @@ +package anticope.rejects.utils; + +import com.google.gson.JsonObject; +import net.minecraft.item.Items; + +import net.fabricmc.loader.api.FabricLoader; +import anticope.rejects.MeteorRejectsAddon; +import meteordevelopment.meteorclient.utils.network.Http; +import meteordevelopment.meteorclient.utils.render.MeteorToast; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +public class UpdateUtil { + private static boolean firstTimeTitleScreen = true; + private static final String TAGNAME = "latest-1.18"; + + public static void checkUpdate() { + if (!firstTimeTitleScreen) return; + firstTimeTitleScreen = false; + + MeteorRejectsAddon.LOG.info("Checking for Meteor Rejects update..."); + + String gitHash = FabricLoader + .getInstance() + .getModContainer("meteor-rejects") + .get().getMetadata() + .getCustomValue("updater:sha") + .getAsString().trim(); + + JsonObject tag = Http.get("https://api.github.com/repos/AntiCope/meteor-rejects/git/ref/tags/"+TAGNAME).sendJson(JsonObject.class); + if (tag.get("object").getAsJsonObject().get("sha").getAsString().trim() == gitHash) return; + + mc.getToastManager().add(new MeteorToast(Items.BARRIER, "New Rejects update.", "Download it from Github", 8000)); + } + +} diff --git a/src/main/java/anticope/rejects/utils/seeds/Seeds.java b/src/main/java/anticope/rejects/utils/seeds/Seeds.java index 986ef73..172108d 100644 --- a/src/main/java/anticope/rejects/utils/seeds/Seeds.java +++ b/src/main/java/anticope/rejects/utils/seeds/Seeds.java @@ -93,7 +93,7 @@ public class Seeds extends System { try { return Long.parseLong(inSeed); } catch (NumberFormatException e) { - return inSeed.hashCode(); + return inSeed.strip().hashCode(); } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index aa41a67..44b6827 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -28,7 +28,8 @@ "meteor-rejects-meteor.mixins.json" ], "custom": { - "meteor-client:color": "227,0,0" + "meteor-client:color": "227,0,0", + "updater:sha": "@gh_hash@" }, "depends": { "java": ">=16", diff --git a/src/main/resources/meteor-rejects.mixins.json b/src/main/resources/meteor-rejects.mixins.json index dc8b3c1..31db31f 100644 --- a/src/main/resources/meteor-rejects.mixins.json +++ b/src/main/resources/meteor-rejects.mixins.json @@ -12,7 +12,8 @@ "LivingEntityRendererMixin", "MinecraftClientMixin", "StructureVoidBlockMixin", - "ToastManagerMixin" + "ToastManagerMixin", + "TitleScreenMixin" ], "injectors": { "defaultRequire": 1