From 019dc3d943eb06b6bdedcdefaf4811c4a83aad92 Mon Sep 17 00:00:00 2001 From: fretuks Date: Wed, 19 Nov 2025 16:03:00 +0100 Subject: [PATCH] Implement M&M support for shrine choices --- build.gradle | 4 ++ gradle.properties | 2 +- .../ascend/client/screen/ShrineScreen.java | 26 +++++-- .../fretux/ascend/compat/AscendMMCompat.java | 9 +++ .../ServerboundShrineChoicePacket.java | 71 +++++++++++++++---- 5 files changed, 90 insertions(+), 22 deletions(-) create mode 100644 src/main/java/net/fretux/ascend/compat/AscendMMCompat.java diff --git a/build.gradle b/build.gradle index 67a5264..abfe557 100644 --- a/build.gradle +++ b/build.gradle @@ -99,6 +99,8 @@ minecraft { sourceSets.main.resources { srcDir 'src/generated/resources' } repositories { + mavenLocal() + mavenCentral() // Put repositories for dependencies here // ForgeGradle automatically adds the Forge maven and Maven Central for you @@ -133,6 +135,8 @@ repositories { dependencies { minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" + implementation fg.deobf("net.fretux.mindmotion:mindmotion:1.1.0") + // Iron's Spellbooks API only compileOnly fg.deobf("io.redspace.ironsspellbooks:irons_spellbooks:${irons_spells_version}:api") implementation fg.deobf("io.redspace.ironsspellbooks:irons_spellbooks:${irons_spells_version}") diff --git a/gradle.properties b/gradle.properties index de6d527..f9ffbb9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -53,7 +53,7 @@ mod_name=Ascend: SbA # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=All Rights Reserved # The mod version. See https://semver.org/ -mod_version=1.1.0 +mod_version=1.2.0 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html diff --git a/src/main/java/net/fretux/ascend/client/screen/ShrineScreen.java b/src/main/java/net/fretux/ascend/client/screen/ShrineScreen.java index fa32d5e..ca27c90 100644 --- a/src/main/java/net/fretux/ascend/client/screen/ShrineScreen.java +++ b/src/main/java/net/fretux/ascend/client/screen/ShrineScreen.java @@ -13,7 +13,7 @@ import net.minecraft.network.chat.Component; public class ShrineScreen extends Screen { private static final int WIDTH = 260; - private static final int HEIGHT = 160; + private static final int HEIGHT = 200; private int leftPos; private int topPos; @@ -74,17 +74,31 @@ public class ShrineScreen extends Screen { addRenderableWidget(leaveButton); } - case 2 -> { // Player picks what to unmake + case 2 -> { + // Existing Ascend option Button forgetButton = Button.builder(Component.literal("I WISH TO FORGET."), (btn) -> { PacketHandler.INSTANCE.sendToServer(new ServerboundShrineChoicePacket("forget")); Minecraft.getInstance().setScreen(null); }).bounds(leftPos + 20, buttonY, WIDTH - 40, 20).build(); - + addRenderableWidget(forgetButton); + int y = buttonY + 25; + if (net.fretux.ascend.compat.AscendMMCompat.isMindMotionPresent()) { + Button understandButton = Button.builder(Component.literal("I WISH TO UNDERSTAND."), (btn) -> { + PacketHandler.INSTANCE.sendToServer(new ServerboundShrineChoicePacket("understand")); + Minecraft.getInstance().setScreen(null); + }).bounds(leftPos + 20, y, WIDTH - 40, 20).build(); + addRenderableWidget(understandButton); + y += 25; + Button restButton = Button.builder(Component.literal("I WISH TO REST."), (btn) -> { + PacketHandler.INSTANCE.sendToServer(new ServerboundShrineChoicePacket("rest")); + Minecraft.getInstance().setScreen(null); + }).bounds(leftPos + 20, y, WIDTH - 40, 20).build(); + addRenderableWidget(restButton); + y += 25; + } Button leaveButton = Button.builder(Component.literal("LEAVE."), (btn) -> { Minecraft.getInstance().setScreen(null); - }).bounds(leftPos + 20, buttonY + 25, WIDTH - 40, 20).build(); - - addRenderableWidget(forgetButton); + }).bounds(leftPos + 20, y, WIDTH - 40, 20).build(); addRenderableWidget(leaveButton); } } diff --git a/src/main/java/net/fretux/ascend/compat/AscendMMCompat.java b/src/main/java/net/fretux/ascend/compat/AscendMMCompat.java new file mode 100644 index 0000000..dd07cea --- /dev/null +++ b/src/main/java/net/fretux/ascend/compat/AscendMMCompat.java @@ -0,0 +1,9 @@ +package net.fretux.ascend.compat; + +import net.minecraftforge.fml.ModList; + +public class AscendMMCompat { + public static boolean isMindMotionPresent() { + return ModList.get().isLoaded("mindmotion"); + } +} diff --git a/src/main/java/net/fretux/ascend/network/ServerboundShrineChoicePacket.java b/src/main/java/net/fretux/ascend/network/ServerboundShrineChoicePacket.java index 6001508..c1c5201 100644 --- a/src/main/java/net/fretux/ascend/network/ServerboundShrineChoicePacket.java +++ b/src/main/java/net/fretux/ascend/network/ServerboundShrineChoicePacket.java @@ -4,11 +4,8 @@ import net.fretux.ascend.player.PlayerStatsProvider; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.phys.Vec3; import net.minecraftforge.network.NetworkEvent; -import net.minecraftforge.network.PacketDistributor; import java.util.function.Supplier; @@ -33,19 +30,63 @@ public class ServerboundShrineChoicePacket { if (player == null) return; player.getCapability(PlayerStatsProvider.PLAYER_STATS).ifPresent(stats -> { - if ("forget".equals(choice)) { - if (stats.getKnowledge() >= 15) { - stats.addKnowledge(-15); - stats.refundAllPoints(); - player.sendSystemMessage(Component.literal("FOOLISH... YET HONEST.")); - } else { - player.sendSystemMessage(Component.literal("YOUR MIND IS TOO EMPTY TO BE WORTH MY TOUCH.")); - player.hurt(player.level().damageSources().magic(), 4.0F); - Vec3 look = player.getLookAngle().normalize().scale(-2.0D); - player.setDeltaMovement(look.x * 5, 0.8, look.z * 5); - player.hurtMarked = true; + switch (choice) { + case "forget" -> { + if (stats.getKnowledge() >= 15) { + stats.addKnowledge(-15); + stats.refundAllPoints(); + player.sendSystemMessage(Component.literal("YOU ARE A BLANK SLATE. EMPTY. FORGOTTEN.")); + } else { + player.sendSystemMessage(Component.literal("YOUR MIND IS TOO EMPTY TO BE WORTH MY TOUCH.")); + player.hurt(player.level().damageSources().magic(), 4.0F); + Vec3 look = player.getLookAngle().normalize().scale(-2.0D); + player.setDeltaMovement(look.x * 5, 0.8, look.z * 5); + player.hurtMarked = true; + } + PlayerStatsProvider.sync(player); + } + + case "understand" -> { + if (!net.fretux.ascend.compat.AscendMMCompat.isMindMotionPresent()) + return; + + player.getCapability(net.fretux.mindmotion.player.PlayerCapabilityProvider.SANITY).ifPresent(sanity -> { + + float sanityPercent = sanity.getSanity() / sanity.getMaxSanity(); + + if (sanityPercent >= 0.90f) { + stats.addKnowledge(5); + sanity.setSanity(0); + sanity.setInsanity(0); + + player.sendSystemMessage(Component.literal("YOUR MIND EXPANDS AS IT BREAKS.")); + } else { + player.sendSystemMessage(Component.literal("YOUR MIND IS NOT YET CLEAR ENOUGH.")); + } + }); + + PlayerStatsProvider.sync(player); + } + + case "rest" -> { + if (!net.fretux.ascend.compat.AscendMMCompat.isMindMotionPresent()) + return; + + if (stats.getKnowledge() >= 10) { + stats.addKnowledge(-10); + + player.getCapability(net.fretux.mindmotion.player.PlayerCapabilityProvider.SANITY).ifPresent(sanity -> { + sanity.setSanity(sanity.getMaxSanity()); + sanity.setInsanity(0); + }); + + player.sendSystemMessage(Component.literal("THE SHRINE RESTORES YOUR FRACTURED MIND.")); + } else { + player.sendSystemMessage(Component.literal("YOU LACK THE KNOWLEDGE TO REST.")); + } + + PlayerStatsProvider.sync(player); } - PlayerStatsProvider.sync(player); } }); });