Implement M&M support for shrine choices

This commit is contained in:
2025-11-19 16:03:00 +01:00
parent 1e2e337e24
commit 019dc3d943
5 changed files with 90 additions and 22 deletions
+4
View File
@@ -99,6 +99,8 @@ minecraft {
sourceSets.main.resources { srcDir 'src/generated/resources' } sourceSets.main.resources { srcDir 'src/generated/resources' }
repositories { repositories {
mavenLocal()
mavenCentral()
// Put repositories for dependencies here // Put repositories for dependencies here
// ForgeGradle automatically adds the Forge maven and Maven Central for you // ForgeGradle automatically adds the Forge maven and Maven Central for you
@@ -133,6 +135,8 @@ repositories {
dependencies { dependencies {
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
implementation fg.deobf("net.fretux.mindmotion:mindmotion:1.1.0")
// Iron's Spellbooks API only // Iron's Spellbooks API only
compileOnly fg.deobf("io.redspace.ironsspellbooks:irons_spellbooks:${irons_spells_version}:api") compileOnly fg.deobf("io.redspace.ironsspellbooks:irons_spellbooks:${irons_spells_version}:api")
implementation fg.deobf("io.redspace.ironsspellbooks:irons_spellbooks:${irons_spells_version}") implementation fg.deobf("io.redspace.ironsspellbooks:irons_spellbooks:${irons_spells_version}")
+1 -1
View File
@@ -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. # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default.
mod_license=All Rights Reserved mod_license=All Rights Reserved
# The mod version. See https://semver.org/ # 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. # 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. # This should match the base package used for the mod sources.
# See https://maven.apache.org/guides/mini/guide-naming-conventions.html # See https://maven.apache.org/guides/mini/guide-naming-conventions.html
@@ -13,7 +13,7 @@ import net.minecraft.network.chat.Component;
public class ShrineScreen extends Screen { public class ShrineScreen extends Screen {
private static final int WIDTH = 260; private static final int WIDTH = 260;
private static final int HEIGHT = 160; private static final int HEIGHT = 200;
private int leftPos; private int leftPos;
private int topPos; private int topPos;
@@ -74,17 +74,31 @@ public class ShrineScreen extends Screen {
addRenderableWidget(leaveButton); 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) -> { Button forgetButton = Button.builder(Component.literal("I WISH TO FORGET."), (btn) -> {
PacketHandler.INSTANCE.sendToServer(new ServerboundShrineChoicePacket("forget")); PacketHandler.INSTANCE.sendToServer(new ServerboundShrineChoicePacket("forget"));
Minecraft.getInstance().setScreen(null); Minecraft.getInstance().setScreen(null);
}).bounds(leftPos + 20, buttonY, WIDTH - 40, 20).build(); }).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) -> { Button leaveButton = Button.builder(Component.literal("LEAVE."), (btn) -> {
Minecraft.getInstance().setScreen(null); Minecraft.getInstance().setScreen(null);
}).bounds(leftPos + 20, buttonY + 25, WIDTH - 40, 20).build(); }).bounds(leftPos + 20, y, WIDTH - 40, 20).build();
addRenderableWidget(forgetButton);
addRenderableWidget(leaveButton); addRenderableWidget(leaveButton);
} }
} }
@@ -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");
}
}
@@ -4,11 +4,8 @@ import net.fretux.ascend.player.PlayerStatsProvider;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer; 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.minecraft.world.phys.Vec3;
import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.network.NetworkEvent;
import net.minecraftforge.network.PacketDistributor;
import java.util.function.Supplier; import java.util.function.Supplier;
@@ -33,19 +30,63 @@ public class ServerboundShrineChoicePacket {
if (player == null) return; if (player == null) return;
player.getCapability(PlayerStatsProvider.PLAYER_STATS).ifPresent(stats -> { player.getCapability(PlayerStatsProvider.PLAYER_STATS).ifPresent(stats -> {
if ("forget".equals(choice)) { switch (choice) {
if (stats.getKnowledge() >= 15) { case "forget" -> {
stats.addKnowledge(-15); if (stats.getKnowledge() >= 15) {
stats.refundAllPoints(); stats.addKnowledge(-15);
player.sendSystemMessage(Component.literal("FOOLISH... YET HONEST.")); stats.refundAllPoints();
} else { player.sendSystemMessage(Component.literal("YOU ARE A BLANK SLATE. EMPTY. FORGOTTEN."));
player.sendSystemMessage(Component.literal("YOUR MIND IS TOO EMPTY TO BE WORTH MY TOUCH.")); } else {
player.hurt(player.level().damageSources().magic(), 4.0F); player.sendSystemMessage(Component.literal("YOUR MIND IS TOO EMPTY TO BE WORTH MY TOUCH."));
Vec3 look = player.getLookAngle().normalize().scale(-2.0D); player.hurt(player.level().damageSources().magic(), 4.0F);
player.setDeltaMovement(look.x * 5, 0.8, look.z * 5); Vec3 look = player.getLookAngle().normalize().scale(-2.0D);
player.hurtMarked = true; 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);
} }
}); });
}); });