add an option to disable tempo/sanity

This commit is contained in:
2026-07-21 20:38:38 +02:00
parent 1466416d4e
commit d222cafe84
18 changed files with 209 additions and 115 deletions
+1 -1
View File
@@ -52,7 +52,7 @@ mod_name=Mind & Motion
# 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.4.0 mod_version=1.4.2
# 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
@@ -80,12 +80,14 @@ public final class ConfigMM {
} }
public static class Common { public static class Common {
public final ForgeConfigSpec.BooleanValue ENABLE_SANITY;
public final ForgeConfigSpec.DoubleValue BASE_SANITY_REGEN_LIGHT; public final ForgeConfigSpec.DoubleValue BASE_SANITY_REGEN_LIGHT;
public final ForgeConfigSpec.DoubleValue BASE_SANITY_DECAY_DARK; public final ForgeConfigSpec.DoubleValue BASE_SANITY_DECAY_DARK;
public final ForgeConfigSpec.BooleanValue ENABLE_LOW_SANITY_SOUNDS; public final ForgeConfigSpec.BooleanValue ENABLE_LOW_SANITY_SOUNDS;
public final ForgeConfigSpec.BooleanValue ENABLE_SANITY_GAMEPLAY_EFFECTS; public final ForgeConfigSpec.BooleanValue ENABLE_SANITY_GAMEPLAY_EFFECTS;
public final ForgeConfigSpec.DoubleValue SCRATCHING_CHANCE; public final ForgeConfigSpec.DoubleValue SCRATCHING_CHANCE;
public final ForgeConfigSpec.DoubleValue PANIC_CHANCE; public final ForgeConfigSpec.DoubleValue PANIC_CHANCE;
public final ForgeConfigSpec.BooleanValue ENABLE_TEMPO;
public final ForgeConfigSpec.IntValue TEMPO_DECAY_DELAY; public final ForgeConfigSpec.IntValue TEMPO_DECAY_DELAY;
public final ForgeConfigSpec.IntValue VENT_COST; public final ForgeConfigSpec.IntValue VENT_COST;
public final ForgeConfigSpec.IntValue TEMPO_PER_MANA_REGEN_PERCENT; public final ForgeConfigSpec.IntValue TEMPO_PER_MANA_REGEN_PERCENT;
@@ -93,6 +95,10 @@ public final class ConfigMM {
Common(ForgeConfigSpec.Builder b) { Common(ForgeConfigSpec.Builder b) {
b.push("sanity"); b.push("sanity");
ENABLE_SANITY = b
.comment("Enable the sanity and insanity systems, including HUD, shaders, sounds, commands, and gameplay effects.")
.define("enableSanity", true);
BASE_SANITY_REGEN_LIGHT = b BASE_SANITY_REGEN_LIGHT = b
.comment("Sanity gained per tick in bright light.") .comment("Sanity gained per tick in bright light.")
.defineInRange("sanityRegenLight", 0.03, 0.0, 1.0); .defineInRange("sanityRegenLight", 0.03, 0.0, 1.0);
@@ -121,6 +127,10 @@ public final class ConfigMM {
b.pop().push("tempo"); b.pop().push("tempo");
ENABLE_TEMPO = b
.comment("Enable the tempo system, including HUD, combat gain, decay, Vent, and compatibility bonuses.")
.define("enableTempo", true);
TEMPO_DECAY_DELAY = b TEMPO_DECAY_DELAY = b
.comment("Ticks without combat before tempo begins to decay.") .comment("Ticks without combat before tempo begins to decay.")
.defineInRange("tempoDecayDelay", 100, 0, 20000); .defineInRange("tempoDecayDelay", 100, 0, 20000);
@@ -9,4 +9,6 @@ public class ClientData {
// NEW: synced from server // NEW: synced from server
public static float MAX_SANITY = 80f; public static float MAX_SANITY = 80f;
public static int MAX_TEMPO = 120; public static int MAX_TEMPO = 120;
public static boolean SANITY_ENABLED = true;
public static boolean TEMPO_ENABLED = true;
} }
@@ -1,5 +1,6 @@
package net.fretux.mindmotion.client; package net.fretux.mindmotion.client;
import net.fretux.mindmotion.ConfigMM;
import net.fretux.mindmotion.network.ModMessages; import net.fretux.mindmotion.network.ModMessages;
import net.fretux.mindmotion.network.VentPacket; import net.fretux.mindmotion.network.VentPacket;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@@ -13,12 +14,14 @@ public class ClientEvents {
@SubscribeEvent @SubscribeEvent
public static void onKeyInput(InputEvent.Key event) { public static void onKeyInput(InputEvent.Key event) {
if (Keybinds.VENT_KEY.isDown()) { boolean tempoEnabled = ConfigMM.COMMON.ENABLE_TEMPO.get() && ClientData.TEMPO_ENABLED;
boolean sanityEnabled = ConfigMM.COMMON.ENABLE_SANITY.get() && ClientData.SANITY_ENABLED;
if (tempoEnabled && Keybinds.VENT_KEY.isDown()) {
ModMessages.CHANNEL.sendToServer(new VentPacket()); ModMessages.CHANNEL.sendToServer(new VentPacket());
} }
if (Keybinds.HUD_EDITOR_KEY.consumeClick()) { if (Keybinds.HUD_EDITOR_KEY.consumeClick()) {
Minecraft minecraft = Minecraft.getInstance(); Minecraft minecraft = Minecraft.getInstance();
if (minecraft.screen == null) { if (minecraft.screen == null && (tempoEnabled || sanityEnabled)) {
minecraft.setScreen(new HudEditorScreen(null)); minecraft.setScreen(new HudEditorScreen(null));
} }
} }
@@ -1,5 +1,6 @@
package net.fretux.mindmotion.client; package net.fretux.mindmotion.client;
import net.fretux.mindmotion.ConfigMM;
import net.fretux.mindmotion.client.shader.VentShaderHandler; import net.fretux.mindmotion.client.shader.VentShaderHandler;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@@ -8,6 +9,9 @@ public final class ClientPacketHandlers {
} }
public static void handleVentEffect() { public static void handleVentEffect() {
if (!ConfigMM.COMMON.ENABLE_TEMPO.get() || !ClientData.TEMPO_ENABLED) {
return;
}
Minecraft mc = Minecraft.getInstance(); Minecraft mc = Minecraft.getInstance();
if (mc.player == null) { if (mc.player == null) {
return; return;
@@ -65,6 +65,8 @@ public class HudEditorScreen extends Screen {
int sliderWidth = 150; int sliderWidth = 150;
int y = 36; int y = 36;
int step = 24; int step = 24;
boolean tempoEnabled = ConfigMM.COMMON.ENABLE_TEMPO.get() && ClientData.TEMPO_ENABLED;
boolean sanityEnabled = ConfigMM.COMMON.ENABLE_SANITY.get() && ClientData.SANITY_ENABLED;
barWidthSlider = addRenderableWidget(new IntSlider( barWidthSlider = addRenderableWidget(new IntSlider(
leftX, leftX,
@@ -90,6 +92,7 @@ public class HudEditorScreen extends Screen {
)); ));
y += step; y += step;
if (tempoEnabled) {
tempoXSlider = addRenderableWidget(new IntSlider( tempoXSlider = addRenderableWidget(new IntSlider(
leftX, leftX,
y, y,
@@ -112,8 +115,10 @@ public class HudEditorScreen extends Screen {
tempoOffsetY, tempoOffsetY,
value -> setTempoOffsetY(value, false) value -> setTempoOffsetY(value, false)
)); ));
y += step; y += step;
}
if (sanityEnabled) {
sanityXSlider = addRenderableWidget(new IntSlider( sanityXSlider = addRenderableWidget(new IntSlider(
leftX, leftX,
y, y,
@@ -136,6 +141,7 @@ public class HudEditorScreen extends Screen {
sanityOffsetY, sanityOffsetY,
value -> setSanityOffsetY(value, false) value -> setSanityOffsetY(value, false)
)); ));
}
int buttonY = this.height - 28; int buttonY = this.height - 28;
addRenderableWidget(Button.builder( addRenderableWidget(Button.builder(
@@ -170,7 +176,7 @@ public class HudEditorScreen extends Screen {
public boolean mouseClicked(double mouseX, double mouseY, int button) { public boolean mouseClicked(double mouseX, double mouseY, int button) {
if (button == 0) { if (button == 0) {
BarPosition tempoBar = getTempoBarPosition(); BarPosition tempoBar = getTempoBarPosition();
if (isMouseOver(mouseX, mouseY, tempoBar)) { if (isTempoEnabled() && isMouseOver(mouseX, mouseY, tempoBar)) {
draggingTempo = true; draggingTempo = true;
dragStartX = mouseX; dragStartX = mouseX;
dragStartY = mouseY; dragStartY = mouseY;
@@ -179,7 +185,7 @@ public class HudEditorScreen extends Screen {
return true; return true;
} }
BarPosition sanityBar = getSanityBarPosition(); BarPosition sanityBar = getSanityBarPosition();
if (isMouseOver(mouseX, mouseY, sanityBar)) { if (isSanityEnabled() && isMouseOver(mouseX, mouseY, sanityBar)) {
draggingSanity = true; draggingSanity = true;
dragStartX = mouseX; dragStartX = mouseX;
dragStartY = mouseY; dragStartY = mouseY;
@@ -231,8 +237,11 @@ public class HudEditorScreen extends Screen {
private void renderPreview(GuiGraphics gui) { private void renderPreview(GuiGraphics gui) {
BarPosition tempoBar = getTempoBarPosition(); BarPosition tempoBar = getTempoBarPosition();
BarPosition sanityBar = getSanityBarPosition(); BarPosition sanityBar = getSanityBarPosition();
if (isTempoEnabled()) {
drawRoundedBar(gui, tempoBar, 0xFF33AFFF, (int) (barWidth * 0.75f)); drawRoundedBar(gui, tempoBar, 0xFF33AFFF, (int) (barWidth * 0.75f));
gui.drawString(this.font, Component.literal("Tempo"), tempoBar.x, tempoBar.y - 12, 0x66CCFF, false); gui.drawString(this.font, Component.literal("Tempo"), tempoBar.x, tempoBar.y - 12, 0x66CCFF, false);
}
if (isSanityEnabled()) {
drawRoundedBar(gui, sanityBar, 0xFFFFFFFF, (int) (barWidth * 0.6f)); drawRoundedBar(gui, sanityBar, 0xFFFFFFFF, (int) (barWidth * 0.6f));
int sanityLabelWidth = this.font.width("Sanity"); int sanityLabelWidth = this.font.width("Sanity");
gui.drawString( gui.drawString(
@@ -244,6 +253,7 @@ public class HudEditorScreen extends Screen {
false false
); );
} }
}
private BarPosition getTempoBarPosition() { private BarPosition getTempoBarPosition() {
int baseY = this.height - BASE_Y_OFFSET; int baseY = this.height - BASE_Y_OFFSET;
@@ -327,6 +337,14 @@ public class HudEditorScreen extends Screen {
ConfigMM.CLIENT_SPEC.save(); ConfigMM.CLIENT_SPEC.save();
} }
private static boolean isTempoEnabled() {
return ConfigMM.COMMON.ENABLE_TEMPO.get() && ClientData.TEMPO_ENABLED;
}
private static boolean isSanityEnabled() {
return ConfigMM.COMMON.ENABLE_SANITY.get() && ClientData.SANITY_ENABLED;
}
private static int clamp(int value, int min, int max) { private static int clamp(int value, int min, int max) {
return Math.min(Math.max(value, min), max); return Math.min(Math.max(value, min), max);
} }
@@ -20,6 +20,9 @@ public class SanityTempoOverlay {
public static void onRenderOverlay(RenderGuiOverlayEvent.Post event) { public static void onRenderOverlay(RenderGuiOverlayEvent.Post event) {
Minecraft mc = Minecraft.getInstance(); Minecraft mc = Minecraft.getInstance();
if (mc.player == null || mc.options.hideGui) return; if (mc.player == null || mc.options.hideGui) return;
boolean tempoEnabled = ConfigMM.COMMON.ENABLE_TEMPO.get() && ClientData.TEMPO_ENABLED;
boolean sanityEnabled = ConfigMM.COMMON.ENABLE_SANITY.get() && ClientData.SANITY_ENABLED;
if (!tempoEnabled && !sanityEnabled) return;
GuiGraphics gui = event.getGuiGraphics(); GuiGraphics gui = event.getGuiGraphics();
int width = event.getWindow().getGuiScaledWidth(); int width = event.getWindow().getGuiScaledWidth();
int height = event.getWindow().getGuiScaledHeight(); int height = event.getWindow().getGuiScaledHeight();
@@ -44,9 +47,11 @@ public class SanityTempoOverlay {
int tempoFill = (int) (barWidth * tempoPercent); int tempoFill = (int) (barWidth * tempoPercent);
int insanityFill = (int) (barWidth * insanityPercent); int insanityFill = (int) (barWidth * insanityPercent);
RenderSystem.enableBlend(); RenderSystem.enableBlend();
if (tempoEnabled) {
drawRoundedBar(gui, xTempo, yTempo, barWidth, barHeight, 0xFF33AFFF, tempoFill); drawRoundedBar(gui, xTempo, yTempo, barWidth, barHeight, 0xFF33AFFF, tempoFill);
gui.drawString(mc.font, Component.literal("Tempo"), xTempo, yTempo - labelOffset, 0x66CCFF, false); gui.drawString(mc.font, Component.literal("Tempo"), xTempo, yTempo - labelOffset, 0x66CCFF, false);
if (ClientData.VENT_COOLDOWN > 0) { }
if (tempoEnabled && ClientData.VENT_COOLDOWN > 0) {
int seconds = ClientData.VENT_COOLDOWN / 20; int seconds = ClientData.VENT_COOLDOWN / 20;
String ventText = "Vent: " + seconds + "s"; String ventText = "Vent: " + seconds + "s";
gui.drawString( gui.drawString(
@@ -59,6 +64,7 @@ public class SanityTempoOverlay {
); );
} }
boolean insaneMode = sanity <= 0; boolean insaneMode = sanity <= 0;
if (sanityEnabled) {
if (!insaneMode) { if (!insaneMode) {
drawRoundedBar(gui, xSanity, ySanity, barWidth, barHeight, 0xFFFFFFFF, sanityFill); drawRoundedBar(gui, xSanity, ySanity, barWidth, barHeight, 0xFFFFFFFF, sanityFill);
int sanityLabelWidth = mc.font.width("Sanity"); int sanityLabelWidth = mc.font.width("Sanity");
@@ -73,13 +79,14 @@ public class SanityTempoOverlay {
int insanityLabelX = xSanity + barWidth - insanityLabelWidth; int insanityLabelX = xSanity + barWidth - insanityLabelWidth;
gui.drawString(mc.font, Component.literal("Insanity"), insanityLabelX, ySanity - labelOffset, 0xCC66FF, false); gui.drawString(mc.font, Component.literal("Insanity"), insanityLabelX, ySanity - labelOffset, 0xCC66FF, false);
} }
}
double mouseX = mc.mouseHandler.xpos() * width / (double) event.getWindow().getScreenWidth(); double mouseX = mc.mouseHandler.xpos() * width / (double) event.getWindow().getScreenWidth();
double mouseY = mc.mouseHandler.ypos() * height / (double) event.getWindow().getScreenHeight(); double mouseY = mc.mouseHandler.ypos() * height / (double) event.getWindow().getScreenHeight();
if (isMouseOver(mouseX, mouseY, xTempo, yTempo, barWidth, barHeight)) { if (tempoEnabled && isMouseOver(mouseX, mouseY, xTempo, yTempo, barWidth, barHeight)) {
String text = String.format("%.0f%%", tempoPercent * 100f); String text = String.format("%.0f%%", tempoPercent * 100f);
gui.drawCenteredString(mc.font, text, xTempo + barWidth / 2, yTempo - (labelOffset + 2), 0x66CCFF); gui.drawCenteredString(mc.font, text, xTempo + barWidth / 2, yTempo - (labelOffset + 2), 0x66CCFF);
} }
if (isMouseOver(mouseX, mouseY, xSanity, ySanity, barWidth, barHeight)) { if (sanityEnabled && isMouseOver(mouseX, mouseY, xSanity, ySanity, barWidth, barHeight)) {
if (!insaneMode) { if (!insaneMode) {
String text = String.format("%.0f%%", sanityPercent * 100f); String text = String.format("%.0f%%", sanityPercent * 100f);
gui.drawCenteredString(mc.font, text, xSanity + barWidth / 2, ySanity - (labelOffset + 2), 0xFFFFFF); gui.drawCenteredString(mc.font, text, xSanity + barWidth / 2, ySanity - (labelOffset + 2), 0xFFFFFF);
@@ -69,7 +69,7 @@ public final class FakeChatMessageHandler {
if (event.phase != TickEvent.Phase.END) return; if (event.phase != TickEvent.Phase.END) return;
Minecraft minecraft = Minecraft.getInstance(); Minecraft minecraft = Minecraft.getInstance();
if (minecraft.level == null || minecraft.player == null || ConfigMM.CLIENT.DISABLE_SHADERS.get()) { if (minecraft.level == null || minecraft.player == null || ConfigMM.CLIENT.DISABLE_SHADERS.get() || !ConfigMM.COMMON.ENABLE_SANITY.get() || !ClientData.SANITY_ENABLED) {
reset(); reset();
return; return;
} }
@@ -46,7 +46,7 @@ public class SanityShaderHandler {
@SubscribeEvent @SubscribeEvent
public static void onRenderWorld(RenderLevelStageEvent event) { public static void onRenderWorld(RenderLevelStageEvent event) {
Minecraft mc = Minecraft.getInstance(); Minecraft mc = Minecraft.getInstance();
if (ConfigMM.CLIENT.DISABLE_SHADERS.get()) { if (ConfigMM.CLIENT.DISABLE_SHADERS.get() || !ConfigMM.COMMON.ENABLE_SANITY.get() || !ClientData.SANITY_ENABLED) {
if (mc.gameRenderer.currentEffect() != null) if (mc.gameRenderer.currentEffect() != null)
mc.gameRenderer.shutdownEffect(); mc.gameRenderer.shutdownEffect();
return; return;
@@ -49,7 +49,7 @@ public final class ShadowFigureHandler {
Minecraft minecraft = Minecraft.getInstance(); Minecraft minecraft = Minecraft.getInstance();
LocalPlayer player = minecraft.player; LocalPlayer player = minecraft.player;
if (minecraft.level == null || player == null || ConfigMM.CLIENT.DISABLE_SHADERS.get()) { if (minecraft.level == null || player == null || ConfigMM.CLIENT.DISABLE_SHADERS.get() || !ConfigMM.COMMON.ENABLE_SANITY.get() || !ClientData.SANITY_ENABLED) {
FIGURES.clear(); FIGURES.clear();
spawnCooldown = MIN_SPAWN_DELAY; spawnCooldown = MIN_SPAWN_DELAY;
return; return;
@@ -77,7 +77,7 @@ public final class ShadowFigureHandler {
if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_PARTICLES || FIGURES.isEmpty()) return; if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_PARTICLES || FIGURES.isEmpty()) return;
Minecraft minecraft = Minecraft.getInstance(); Minecraft minecraft = Minecraft.getInstance();
if (minecraft.level == null || minecraft.player == null || ConfigMM.CLIENT.DISABLE_SHADERS.get()) return; if (minecraft.level == null || minecraft.player == null || ConfigMM.CLIENT.DISABLE_SHADERS.get() || !ConfigMM.COMMON.ENABLE_SANITY.get() || !ClientData.SANITY_ENABLED) return;
Camera camera = event.getCamera(); Camera camera = event.getCamera();
Vec3 cameraPos = camera.getPosition(); Vec3 cameraPos = camera.getPosition();
@@ -2,9 +2,11 @@ package net.fretux.mindmotion.command;
import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.FloatArgumentType; import com.mojang.brigadier.arguments.FloatArgumentType;
import net.fretux.mindmotion.ConfigMM;
import net.fretux.mindmotion.player.PlayerCapabilityProvider; import net.fretux.mindmotion.player.PlayerCapabilityProvider;
import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands; import net.minecraft.commands.Commands;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.event.RegisterCommandsEvent; import net.minecraftforge.event.RegisterCommandsEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
@@ -17,6 +19,10 @@ public class SanityCommand {
.then(Commands.literal("set") .then(Commands.literal("set")
.then(Commands.argument("sanity", FloatArgumentType.floatArg(0)) .then(Commands.argument("sanity", FloatArgumentType.floatArg(0))
.executes(ctx -> { .executes(ctx -> {
if (!ConfigMM.COMMON.ENABLE_SANITY.get()) {
ctx.getSource().sendFailure(Component.literal("Sanity system is disabled."));
return 0;
}
ServerPlayer player = ctx.getSource().getPlayerOrException(); ServerPlayer player = ctx.getSource().getPlayerOrException();
float requestedSanity = FloatArgumentType.getFloat(ctx, "sanity"); float requestedSanity = FloatArgumentType.getFloat(ctx, "sanity");
final float[] appliedSanity = new float[] {0f}; final float[] appliedSanity = new float[] {0f};
@@ -30,7 +36,7 @@ public class SanityCommand {
}); });
ctx.getSource().sendSuccess(() -> ctx.getSource().sendSuccess(() ->
net.minecraft.network.chat.Component.literal("Set sanity = " + appliedSanity[0]), Component.literal("Set sanity = " + appliedSanity[0]),
true true
); );
@@ -44,6 +50,10 @@ public class SanityCommand {
.then(Commands.literal("set") .then(Commands.literal("set")
.then(Commands.argument("insanity", FloatArgumentType.floatArg(0)) .then(Commands.argument("insanity", FloatArgumentType.floatArg(0))
.executes(ctx -> { .executes(ctx -> {
if (!ConfigMM.COMMON.ENABLE_SANITY.get()) {
ctx.getSource().sendFailure(Component.literal("Sanity system is disabled."));
return 0;
}
ServerPlayer player = ctx.getSource().getPlayerOrException(); ServerPlayer player = ctx.getSource().getPlayerOrException();
float requestedInsanity = FloatArgumentType.getFloat(ctx, "insanity"); float requestedInsanity = FloatArgumentType.getFloat(ctx, "insanity");
final float[] appliedInsanity = new float[] {0f}; final float[] appliedInsanity = new float[] {0f};
@@ -57,7 +67,7 @@ public class SanityCommand {
}); });
ctx.getSource().sendSuccess(() -> ctx.getSource().sendSuccess(() ->
net.minecraft.network.chat.Component.literal("Set insanity = " + appliedInsanity[0]), Component.literal("Set insanity = " + appliedInsanity[0]),
true true
); );
@@ -2,6 +2,7 @@ package net.fretux.mindmotion.compat;
import net.fretux.ascend.player.PlayerStatsProvider; import net.fretux.ascend.player.PlayerStatsProvider;
import net.fretux.mindmotion.ConfigMM;
import net.fretux.mindmotion.player.PlayerCapabilityProvider; import net.fretux.mindmotion.player.PlayerCapabilityProvider;
import net.fretux.mindmotion.player.SanityCapability; import net.fretux.mindmotion.player.SanityCapability;
import net.fretux.mindmotion.player.TempoCapability; import net.fretux.mindmotion.player.TempoCapability;
@@ -16,16 +17,20 @@ public final class AscendCompat {
int willpower = stats.getAttributeLevel("willpower"); int willpower = stats.getAttributeLevel("willpower");
float sanityBonus = willpower * 3.0f; float sanityBonus = willpower * 3.0f;
float tempoBonus = willpower * 0.5f; float tempoBonus = willpower * 0.5f;
if (ConfigMM.COMMON.ENABLE_SANITY.get()) {
player.getCapability(PlayerCapabilityProvider.SANITY).ifPresent(cap -> { player.getCapability(PlayerCapabilityProvider.SANITY).ifPresent(cap -> {
if (cap instanceof SanityCapability impl) { if (cap instanceof SanityCapability impl) {
impl.setBonusMaxSanity(sanityBonus); impl.setBonusMaxSanity(sanityBonus);
} }
}); });
}
if (ConfigMM.COMMON.ENABLE_TEMPO.get()) {
player.getCapability(PlayerCapabilityProvider.TEMPO).ifPresent(cap -> { player.getCapability(PlayerCapabilityProvider.TEMPO).ifPresent(cap -> {
if (cap instanceof TempoCapability impl) { if (cap instanceof TempoCapability impl) {
impl.setBonusMaxTempo(tempoBonus); impl.setBonusMaxTempo(tempoBonus);
} }
}); });
}
}); });
} }
} }
@@ -1,5 +1,6 @@
package net.fretux.mindmotion.event; package net.fretux.mindmotion.event;
import net.fretux.mindmotion.ConfigMM;
import net.fretux.mindmotion.player.PlayerCapabilityProvider; import net.fretux.mindmotion.player.PlayerCapabilityProvider;
import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
@@ -11,13 +12,21 @@ public class CombatEvents {
@SubscribeEvent @SubscribeEvent
public static void onEntityHurt(LivingHurtEvent event) { public static void onEntityHurt(LivingHurtEvent event) {
if (event.getEntity() instanceof net.minecraft.world.entity.player.Player player) { if (event.getEntity() instanceof net.minecraft.world.entity.player.Player player) {
if (ConfigMM.COMMON.ENABLE_TEMPO.get()) {
player.getCapability(PlayerCapabilityProvider.TEMPO).ifPresent(tempo -> tempo.addTempo(3)); player.getCapability(PlayerCapabilityProvider.TEMPO).ifPresent(tempo -> tempo.addTempo(3));
}
if (ConfigMM.COMMON.ENABLE_SANITY.get() || ConfigMM.COMMON.ENABLE_TEMPO.get()) {
PlayerTickHandler.markCombat(player); PlayerTickHandler.markCombat(player);
} }
}
if (event.getSource().getEntity() instanceof net.minecraft.world.entity.player.Player attacker) { if (event.getSource().getEntity() instanceof net.minecraft.world.entity.player.Player attacker) {
if (ConfigMM.COMMON.ENABLE_TEMPO.get()) {
attacker.getCapability(PlayerCapabilityProvider.TEMPO).ifPresent(tempo -> tempo.addTempo(4)); attacker.getCapability(PlayerCapabilityProvider.TEMPO).ifPresent(tempo -> tempo.addTempo(4));
}
if (ConfigMM.COMMON.ENABLE_SANITY.get() || ConfigMM.COMMON.ENABLE_TEMPO.get()) {
PlayerTickHandler.markCombat(attacker); PlayerTickHandler.markCombat(attacker);
} }
} }
} }
}
@@ -1,5 +1,6 @@
package net.fretux.mindmotion.event; package net.fretux.mindmotion.event;
import net.fretux.mindmotion.ConfigMM;
import net.fretux.mindmotion.player.PlayerCapabilityProvider; import net.fretux.mindmotion.player.PlayerCapabilityProvider;
import net.fretux.mindmotion.player.SanityCapability; import net.fretux.mindmotion.player.SanityCapability;
import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.entity.monster.Monster;
@@ -15,6 +16,7 @@ public class CommonEvents {
public void onPlayerHurt(LivingHurtEvent event) { public void onPlayerHurt(LivingHurtEvent event) {
if (!(event.getEntity() instanceof net.minecraft.world.entity.player.Player player)) return; if (!(event.getEntity() instanceof net.minecraft.world.entity.player.Player player)) return;
if (player.level().isClientSide) return; if (player.level().isClientSide) return;
if (!ConfigMM.COMMON.ENABLE_SANITY.get()) return;
float loss = Math.min(5f, 0.5f + event.getAmount() * 0.25f); float loss = Math.min(5f, 0.5f + event.getAmount() * 0.25f);
player.getCapability(PlayerCapabilityProvider.SANITY).ifPresent(sanity -> sanity.reduceSanity(loss)); player.getCapability(PlayerCapabilityProvider.SANITY).ifPresent(sanity -> sanity.reduceSanity(loss));
@@ -24,6 +26,7 @@ public class CommonEvents {
public void onLivingDeath(LivingDeathEvent event) { public void onLivingDeath(LivingDeathEvent event) {
if (!(event.getSource().getEntity() instanceof net.minecraft.world.entity.player.Player player)) return; if (!(event.getSource().getEntity() instanceof net.minecraft.world.entity.player.Player player)) return;
if (player.level().isClientSide) return; if (player.level().isClientSide) return;
if (!ConfigMM.COMMON.ENABLE_SANITY.get()) return;
player.getCapability(PlayerCapabilityProvider.SANITY).ifPresent(sanity -> { player.getCapability(PlayerCapabilityProvider.SANITY).ifPresent(sanity -> {
if (event.getEntity() instanceof Monster) { if (event.getEntity() instanceof Monster) {
@@ -78,21 +78,29 @@ public class PlayerTickHandler {
int tick = player.tickCount; int tick = player.tickCount;
boolean sanityTick = tick % SANITY_TICK_INTERVAL == 0; boolean sanityTick = tick % SANITY_TICK_INTERVAL == 0;
boolean tempoSyncTick = tick % TEMPO_TICK_INTERVAL == 0; boolean tempoSyncTick = tick % TEMPO_TICK_INTERVAL == 0;
boolean sanityEnabled = ConfigMM.COMMON.ENABLE_SANITY.get();
boolean tempoEnabled = ConfigMM.COMMON.ENABLE_TEMPO.get();
if (sanityTick) handleSanityAndInsanity(player); if (sanityEnabled && sanityTick) handleSanityAndInsanity(player);
if (tempoEnabled) {
handleTempoTick(player, tick); handleTempoTick(player, tick);
} else if (tick % TEMPO_TICK_INTERVAL == 0) {
applyTempoToManaRegen(player, 0);
}
if (player instanceof ServerPlayer serverPlayer && (sanityTick || tempoSyncTick)) { if (player instanceof ServerPlayer serverPlayer && (sanityTick || tempoSyncTick)) {
player.getCapability(PlayerCapabilityProvider.SANITY).ifPresent(sanity -> player.getCapability(PlayerCapabilityProvider.SANITY).ifPresent(sanity ->
player.getCapability(PlayerCapabilityProvider.TEMPO).ifPresent(tempo -> player.getCapability(PlayerCapabilityProvider.TEMPO).ifPresent(tempo ->
ModMessages.CHANNEL.sendTo( ModMessages.CHANNEL.sendTo(
new SyncStatsS2CPacket( new SyncStatsS2CPacket(
sanity.getSanity(), sanityEnabled ? sanity.getSanity() : sanity.getMaxSanity(),
sanity.getInsanity(), sanityEnabled ? sanity.getInsanity() : 0f,
tempo.getTempo(), tempoEnabled ? tempo.getTempo() : 0,
tempo.getVentCooldown(), tempoEnabled ? tempo.getVentCooldown() : 0,
sanity.getMaxSanity(), sanity.getMaxSanity(),
tempo.getMaxTempo() tempo.getMaxTempo(),
sanityEnabled,
tempoEnabled
), ),
serverPlayer.connection.connection, serverPlayer.connection.connection,
net.minecraftforge.network.NetworkDirection.PLAY_TO_CLIENT net.minecraftforge.network.NetworkDirection.PLAY_TO_CLIENT
@@ -9,7 +9,7 @@ import net.fretux.mindmotion.AscendMindMotion;
public class ModMessages { public class ModMessages {
private static final String PROTOCOL_VERSION = "1"; private static final String PROTOCOL_VERSION = "2";
public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel( public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel(
ResourceLocation.fromNamespaceAndPath(AscendMindMotion.MODID, "main"), ResourceLocation.fromNamespaceAndPath(AscendMindMotion.MODID, "main"),
() -> PROTOCOL_VERSION, () -> PROTOCOL_VERSION,
@@ -13,19 +13,25 @@ public class SyncStatsS2CPacket {
private final int ventCooldown; private final int ventCooldown;
private final float maxSanity; private final float maxSanity;
private final int maxTempo; private final int maxTempo;
private final boolean sanityEnabled;
private final boolean tempoEnabled;
public SyncStatsS2CPacket(float sanity, public SyncStatsS2CPacket(float sanity,
float insanity, float insanity,
int tempo, int tempo,
int ventCooldown, int ventCooldown,
float maxSanity, float maxSanity,
int maxTempo) { int maxTempo,
boolean sanityEnabled,
boolean tempoEnabled) {
this.sanity = sanity; this.sanity = sanity;
this.insanity = insanity; this.insanity = insanity;
this.tempo = tempo; this.tempo = tempo;
this.ventCooldown = ventCooldown; this.ventCooldown = ventCooldown;
this.maxSanity = maxSanity; this.maxSanity = maxSanity;
this.maxTempo = maxTempo; this.maxTempo = maxTempo;
this.sanityEnabled = sanityEnabled;
this.tempoEnabled = tempoEnabled;
} }
public static void encode(SyncStatsS2CPacket msg, FriendlyByteBuf buf) { public static void encode(SyncStatsS2CPacket msg, FriendlyByteBuf buf) {
@@ -35,6 +41,8 @@ public class SyncStatsS2CPacket {
buf.writeInt(msg.ventCooldown); buf.writeInt(msg.ventCooldown);
buf.writeFloat(msg.maxSanity); buf.writeFloat(msg.maxSanity);
buf.writeInt(msg.maxTempo); buf.writeInt(msg.maxTempo);
buf.writeBoolean(msg.sanityEnabled);
buf.writeBoolean(msg.tempoEnabled);
} }
public static SyncStatsS2CPacket decode(FriendlyByteBuf buf) { public static SyncStatsS2CPacket decode(FriendlyByteBuf buf) {
@@ -44,7 +52,9 @@ public class SyncStatsS2CPacket {
int ventCooldown = buf.readInt(); int ventCooldown = buf.readInt();
float maxSanity = buf.readFloat(); float maxSanity = buf.readFloat();
int maxTempo = buf.readInt(); int maxTempo = buf.readInt();
return new SyncStatsS2CPacket(sanity, insanity, tempo, ventCooldown, maxSanity, maxTempo); boolean sanityEnabled = buf.readBoolean();
boolean tempoEnabled = buf.readBoolean();
return new SyncStatsS2CPacket(sanity, insanity, tempo, ventCooldown, maxSanity, maxTempo, sanityEnabled, tempoEnabled);
} }
public static void handle(SyncStatsS2CPacket msg, Supplier<NetworkEvent.Context> ctx) { public static void handle(SyncStatsS2CPacket msg, Supplier<NetworkEvent.Context> ctx) {
@@ -55,6 +65,8 @@ public class SyncStatsS2CPacket {
ClientData.VENT_COOLDOWN = msg.ventCooldown; ClientData.VENT_COOLDOWN = msg.ventCooldown;
ClientData.MAX_SANITY = msg.maxSanity; ClientData.MAX_SANITY = msg.maxSanity;
ClientData.MAX_TEMPO = msg.maxTempo; ClientData.MAX_TEMPO = msg.maxTempo;
ClientData.SANITY_ENABLED = msg.sanityEnabled;
ClientData.TEMPO_ENABLED = msg.tempoEnabled;
}); });
ctx.get().setPacketHandled(true); ctx.get().setPacketHandled(true);
@@ -64,7 +76,9 @@ public class SyncStatsS2CPacket {
", Tempo: " + msg.tempo + ", Tempo: " + msg.tempo +
", VentCD: " + msg.ventCooldown + ", VentCD: " + msg.ventCooldown +
", MaxSanity: " + msg.maxSanity + ", MaxSanity: " + msg.maxSanity +
", MaxTempo: " + msg.maxTempo ", MaxTempo: " + msg.maxTempo +
", SanityEnabled: " + msg.sanityEnabled +
", TempoEnabled: " + msg.tempoEnabled
); );
} }
} }
@@ -23,6 +23,7 @@ public class VentPacket {
ctx.get().enqueueWork(() -> { ctx.get().enqueueWork(() -> {
ServerPlayer player = ctx.get().getSender(); ServerPlayer player = ctx.get().getSender();
if (player == null) return; if (player == null) return;
if (!ConfigMM.COMMON.ENABLE_TEMPO.get()) return;
int ventCost = ConfigMM.COMMON.VENT_COST.get(); int ventCost = ConfigMM.COMMON.VENT_COST.get();
player.getCapability(PlayerCapabilityProvider.TEMPO).ifPresent(tempo -> { player.getCapability(PlayerCapabilityProvider.TEMPO).ifPresent(tempo -> {
if (tempo.getTempo() < ventCost) return; if (tempo.getTempo() < ventCost) return;