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
@@ -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);
}
}
@@ -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.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);
}
});
});