diff --git a/build.gradle b/build.gradle index 4613887..6d52e0c 100644 --- a/build.gradle +++ b/build.gradle @@ -30,7 +30,7 @@ dependencies { modApi include("me.shedaniel.cloth:cloth-config-fabric:10.0.96") { exclude(group: "net.fabricmc.fabric-api") } - modApi("com.terraformersmc:modmenu:5.0.1") + modApi("com.terraformersmc:modmenu:6.1.0-rc.4") implementation include('com.github.JnCrMx:discord-game-sdk4j:v0.5.5') } diff --git a/gradle.properties b/gradle.properties index a4d876a..97d7e72 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ minecraft_version=1.19.4 yarn_mappings=1.19.4+build.1 loader_version=0.14.17 # Mod Properties -mod_version=1.3.1 +mod_version=1.3.2 maven_group=net.asodev archives_base_name=islandutils # Dependencies diff --git a/src/main/java/net/asodev/islandutils/discord/DiscordPresence.java b/src/main/java/net/asodev/islandutils/discord/DiscordPresence.java index 1bcb00d..5b6b707 100644 --- a/src/main/java/net/asodev/islandutils/discord/DiscordPresence.java +++ b/src/main/java/net/asodev/islandutils/discord/DiscordPresence.java @@ -14,8 +14,8 @@ public class DiscordPresence { static String os = System.getProperty("os.name").toLowerCase(); - public static void init() { - if (initalised) return; + public static boolean init() { + if (initalised) return true; File discordLibrary; try { @@ -26,7 +26,7 @@ public static void init() { System.load(discordJNI.getAbsolutePath()); } catch (Exception e) { System.out.println("Failed to grab Natives: " + e.getMessage()); - return; + return false; } Core.initDiscordNative(discordLibrary.getAbsolutePath()); @@ -40,16 +40,17 @@ public static void init() { initalised = true; } catch (Exception e) { System.out.println("Failed to Initialise Discord Presence."); - return; + return false; } new Thread(() -> { - while (core.isOpen()) { + while (core != null && core.isOpen()) { core.runCallbacks(); try { Thread.sleep(16); } catch (Exception e) { e.printStackTrace(); } } - }).start(); + }, "IslandUtils - Discord Callbacks").start(); + return true; } public static void clear() { @@ -60,6 +61,7 @@ public static void clear() { catch (Exception e) { e.printStackTrace(); } initalised = false; + core = null; } } diff --git a/src/main/java/net/asodev/islandutils/discord/DiscordPresenceUpdator.java b/src/main/java/net/asodev/islandutils/discord/DiscordPresenceUpdator.java index 75c7140..1187ef4 100644 --- a/src/main/java/net/asodev/islandutils/discord/DiscordPresenceUpdator.java +++ b/src/main/java/net/asodev/islandutils/discord/DiscordPresenceUpdator.java @@ -21,8 +21,14 @@ public class DiscordPresenceUpdator { public static UUID timeLeftBossbar = null; public static Instant started; public static void create() { + if (!IslandOptions.getOptions().discordPresence) return; + try { - DiscordPresence.init(); + boolean didInit = DiscordPresence.init(); + if (!didInit) { + System.out.println("Failed to start discord presence"); + return; + } activity = new Activity(); activity.setType(ActivityType.PLAYING); @@ -139,9 +145,12 @@ public static void clear() { public static void updateFromConfig(IslandOptions options) { try { - if (activity == null || DiscordPresence.core == null) return; + if (!MccIslandState.isOnline()) { clear(); return; } if (options.discordPresence) create(); + else { clear(); return; } + + if (activity == null) activity = new Activity(); if (!options.showTimeElapsed) activity.timestamps().setStart(Instant.MAX); else { diff --git a/src/main/java/net/asodev/islandutils/mixins/discord/ConnectionMixin.java b/src/main/java/net/asodev/islandutils/mixins/discord/ConnectionMixin.java index 66f8226..24d5c59 100644 --- a/src/main/java/net/asodev/islandutils/mixins/discord/ConnectionMixin.java +++ b/src/main/java/net/asodev/islandutils/mixins/discord/ConnectionMixin.java @@ -1,6 +1,8 @@ package net.asodev.islandutils.mixins.discord; import net.asodev.islandutils.discord.DiscordPresenceUpdator; +import net.asodev.islandutils.state.GAME; +import net.asodev.islandutils.state.MccIslandState; import net.minecraft.network.Connection; import net.minecraft.network.chat.Component; import org.spongepowered.asm.mixin.Mixin; @@ -15,6 +17,8 @@ public class ConnectionMixin { private void disconnect(Component component, CallbackInfo ci) { DiscordPresenceUpdator.started = null; DiscordPresenceUpdator.clear(); + + MccIslandState.setGame(GAME.HUB); } } diff --git a/src/main/java/net/asodev/islandutils/mixins/ui/PauseScreenMixin.java b/src/main/java/net/asodev/islandutils/mixins/ui/PauseScreenMixin.java index 1d3539c..fbb66ba 100644 --- a/src/main/java/net/asodev/islandutils/mixins/ui/PauseScreenMixin.java +++ b/src/main/java/net/asodev/islandutils/mixins/ui/PauseScreenMixin.java @@ -16,46 +16,39 @@ import org.spongepowered.asm.mixin.Mutable; 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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(PauseScreen.class) public class PauseScreenMixin extends Screen { @Final @Shadow private static Component DISCONNECT; - @Final @Shadow private static Component RETURN_TO_MENU; - @Mutable @Shadow private Button disconnectButton; @Mutable @Shadow private void onDisconnect() {} protected PauseScreenMixin(Component component) { super(component); } - @Inject(method = "createPauseMenu", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;isLocalServer()Z", shift = At.Shift.AFTER), - cancellable = true, - locals = LocalCapture.CAPTURE_FAILHARD + @Redirect( + method = "createPauseMenu", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/gui/components/Button;builder(Lnet/minecraft/network/chat/Component;Lnet/minecraft/client/gui/components/Button$OnPress;)Lnet/minecraft/client/gui/components/Button$Builder;" + ) ) - private void createPause(CallbackInfo ci, GridLayout gridLayout, GridLayout.RowHelper rowHelper) { - if (!MccIslandState.isOnline()) return; - ci.cancel(); + private Button.Builder createPause(Component component, Button.OnPress onPress) { + if (!MccIslandState.isOnline() && IslandOptions.getOptions().isPauseConfirm()) return Button.builder(component, onPress); + if (component == DISCONNECT) { + Component message = Component.literal("Are you sure you want to leave?").withStyle(ChatFormatting.AQUA); + Component no = Component.literal("Cancel"); + Component yes = Component.literal("Disconnect").withStyle(ChatFormatting.RED); - Component message = Component.literal("Are you sure you want to leave?").withStyle(ChatFormatting.AQUA); - Component no = Component.literal("Cancel"); - Component yes = Component.literal("Disconnect").withStyle(ChatFormatting.RED); - - Component component = this.minecraft.isLocalServer() ? RETURN_TO_MENU : DISCONNECT; - this.disconnectButton = rowHelper.addChild(Button.builder(component, (button) -> { - if (!IslandOptions.getOptions().isPauseConfirm()) disconnect(button); - else { + return Button.builder(component, (button) -> { ConfirmScreen screen = new ConfirmScreen((bool) -> callback(bool, button), Component.literal("Leave the server"), message, yes, no); Minecraft.getInstance().setScreen(screen); - } - }).width(204).build(), 2); - gridLayout.arrangeElements(); - FrameLayout.alignInRectangle(gridLayout, 0, 0, this.width, this.height, 0.5F, 0.25F); - gridLayout.visitWidgets(this::addRenderableWidget); + }); + } + return Button.builder(component, onPress); } void callback(boolean confirm, Button buttonx) { diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 0651e76..8f01ab7 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -10,7 +10,7 @@ "homepage": "https://modrinth.com/mod/island-utils" }, "license": "MIT", - "icon": "icon.png", + "icon": "assets/island/icon.png", "environment": "client", "entrypoints": { "client": [ "net.asodev.islandutils.IslandutilsClient" ], @@ -23,7 +23,7 @@ "custom": { "modmenu": { "links": { - "islandutils.website": "https://modrinth.com/mod/island-utils" + "website": "https://modrinth.com/mod/island-utils" } } }, diff --git a/src/main/resources/native/lib/aarch64/discord_game_sdk.bundle b/src/main/resources/native/lib/aarch64/discord_game_sdk.bundle new file mode 100644 index 0000000..8f08606 Binary files /dev/null and b/src/main/resources/native/lib/aarch64/discord_game_sdk.bundle differ diff --git a/src/main/resources/native/lib/aarch64/discord_game_sdk.dylib b/src/main/resources/native/lib/aarch64/discord_game_sdk.dylib new file mode 100644 index 0000000..8f08606 Binary files /dev/null and b/src/main/resources/native/lib/aarch64/discord_game_sdk.dylib differ diff --git a/src/main/resources/native/lib/x86/discord_game_sdk.dll b/src/main/resources/native/lib/x86/discord_game_sdk.dll index 8f1ee0a..45b9bb1 100644 Binary files a/src/main/resources/native/lib/x86/discord_game_sdk.dll and b/src/main/resources/native/lib/x86/discord_game_sdk.dll differ diff --git a/src/main/resources/native/lib/x86/discord_game_sdk.dll.lib b/src/main/resources/native/lib/x86/discord_game_sdk.dll.lib index 58ec282..02c417e 100644 Binary files a/src/main/resources/native/lib/x86/discord_game_sdk.dll.lib and b/src/main/resources/native/lib/x86/discord_game_sdk.dll.lib differ diff --git a/src/main/resources/native/lib/x86_64/discord_game_sdk.bundle b/src/main/resources/native/lib/x86_64/discord_game_sdk.bundle index 24045f7..3402426 100644 Binary files a/src/main/resources/native/lib/x86_64/discord_game_sdk.bundle and b/src/main/resources/native/lib/x86_64/discord_game_sdk.bundle differ diff --git a/src/main/resources/native/lib/x86_64/discord_game_sdk.dll b/src/main/resources/native/lib/x86_64/discord_game_sdk.dll index 10a8928..be946ea 100644 Binary files a/src/main/resources/native/lib/x86_64/discord_game_sdk.dll and b/src/main/resources/native/lib/x86_64/discord_game_sdk.dll differ diff --git a/src/main/resources/native/lib/x86_64/discord_game_sdk.dll.lib b/src/main/resources/native/lib/x86_64/discord_game_sdk.dll.lib index 8ab3d4c..562b01c 100644 Binary files a/src/main/resources/native/lib/x86_64/discord_game_sdk.dll.lib and b/src/main/resources/native/lib/x86_64/discord_game_sdk.dll.lib differ diff --git a/src/main/resources/native/lib/x86_64/discord_game_sdk.dylib b/src/main/resources/native/lib/x86_64/discord_game_sdk.dylib index 24045f7..3402426 100644 Binary files a/src/main/resources/native/lib/x86_64/discord_game_sdk.dylib and b/src/main/resources/native/lib/x86_64/discord_game_sdk.dylib differ diff --git a/src/main/resources/native/lib/x86_64/discord_game_sdk.so b/src/main/resources/native/lib/x86_64/discord_game_sdk.so index e465760..9dacf94 100644 Binary files a/src/main/resources/native/lib/x86_64/discord_game_sdk.so and b/src/main/resources/native/lib/x86_64/discord_game_sdk.so differ