From f210d1cd9f45d04da3b806fa5e64f63b96b54a6b Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 27 Aug 2022 18:07:26 +0200 Subject: [PATCH] Rebalance the metamorphosis potion and turn players' hearts black when they're turning --- .../unicopia/command/Commands.java | 1 + .../unicopia/command/ManaCommand.java | 55 +++++++++++++++++++ .../entity/effect/RaceChangeStatusEffect.java | 20 ++++--- .../unicopia/mixin/client/MixinInGameHud.java | 21 ++++++- src/main/resources/unicopia.mixin.json | 1 + 5 files changed, 88 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/command/ManaCommand.java diff --git a/src/main/java/com/minelittlepony/unicopia/command/Commands.java b/src/main/java/com/minelittlepony/unicopia/command/Commands.java index 9322fd5a..d1310f89 100644 --- a/src/main/java/com/minelittlepony/unicopia/command/Commands.java +++ b/src/main/java/com/minelittlepony/unicopia/command/Commands.java @@ -23,6 +23,7 @@ public class Commands { DisguiseCommand.register(dispatcher); TraitCommand.register(dispatcher); EmoteCommand.register(dispatcher); + ManaCommand.register(dispatcher); }); Object game = FabricLoader.getInstance().getGameInstance(); if (game instanceof MinecraftServer) { diff --git a/src/main/java/com/minelittlepony/unicopia/command/ManaCommand.java b/src/main/java/com/minelittlepony/unicopia/command/ManaCommand.java new file mode 100644 index 00000000..3bc9725f --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/command/ManaCommand.java @@ -0,0 +1,55 @@ +package com.minelittlepony.unicopia.command; + +import java.util.function.Function; + +import com.minelittlepony.unicopia.entity.player.MagicReserves; +import com.minelittlepony.unicopia.entity.player.Pony; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.FloatArgumentType; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.text.Text; + +public class ManaCommand { + static void register(CommandDispatcher dispatcher) { + dispatcher.register(CommandManager + .literal("mana") + .then(CommandManager.argument("type", EnumArgumentType.of(ManaType.class)).executes(source -> { + var type = source.getArgument("type", ManaType.class); + var pony = Pony.of(source.getSource().getPlayer()); + var bar = type.getBar(pony.getMagicalReserves()); + + source.getSource().getPlayer().sendMessage(Text.literal(type.name() + " is " + bar.get() + "/" + bar.getMax())); + return 0; + }) + .then(CommandManager.argument("value", FloatArgumentType.floatArg()).executes(source -> { + var type = source.getArgument("type", ManaType.class); + var pony = Pony.of(source.getSource().getPlayer()); + var bar = type.getBar(pony.getMagicalReserves()); + + bar.set(source.getArgument("value", Float.class)); + source.getSource().getPlayer().sendMessage(Text.literal("Set " + type.name() + " to " + bar.get() + "/" + bar.getMax())); + return 0; + })) + ) + ); + } + + enum ManaType { + EXERTION(MagicReserves::getExertion), + EXHAUSTION(MagicReserves::getExhaustion), + ENERGY(MagicReserves::getEnergy), + MANA(MagicReserves::getMana), + XP(MagicReserves::getXp); + + private final Function getter; + + ManaType(Function getter) { + this.getter = getter; + } + + public MagicReserves.Bar getBar(MagicReserves reserves) { + return getter.apply(reserves); + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/entity/effect/RaceChangeStatusEffect.java b/src/main/java/com/minelittlepony/unicopia/entity/effect/RaceChangeStatusEffect.java index a14d072c..a760af55 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/effect/RaceChangeStatusEffect.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/effect/RaceChangeStatusEffect.java @@ -11,10 +11,7 @@ import com.minelittlepony.unicopia.util.MagicalDamageSource; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffectCategory; +import net.minecraft.entity.effect.*; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.particle.ParticleTypes; import net.minecraft.text.Text; @@ -22,7 +19,7 @@ import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; public class RaceChangeStatusEffect extends StatusEffect { - public static final int STAGE_DURATION = 50; + public static final int STAGE_DURATION = 200; public static final int MAX_DURATION = Stage.VALUES.length * STAGE_DURATION + 1; public static final StatusEffect CHANGE_RACE_EARTH = register(0x886F0F, Race.EARTH); @@ -41,6 +38,10 @@ public class RaceChangeStatusEffect extends StatusEffect { ); } + public static boolean hasEffect(PlayerEntity player) { + return player.getStatusEffects().stream().anyMatch(effect -> effect.getEffectType() instanceof RaceChangeStatusEffect); + } + public RaceChangeStatusEffect(int color, Race race) { super(StatusEffectCategory.NEUTRAL, color); this.race = race; @@ -85,10 +86,10 @@ public class RaceChangeStatusEffect extends StatusEffect { if (stage != Stage.DEATH && entity instanceof PlayerEntity) { ((PlayerEntity)entity).sendMessage(stage.getMessage(race), true); } - - entity.damage(DamageSource.MAGIC, 0); } + entity.setHealth(1); + if (entity instanceof PlayerEntity) { Pony pony = (Pony)eq; MagicReserves magic = pony.getMagicalReserves(); @@ -110,11 +111,14 @@ public class RaceChangeStatusEffect extends StatusEffect { if (eq instanceof Pony pony) { MagicReserves magic = pony.getMagicalReserves(); - magic.getExertion().set(0.2F); + magic.getEnergy().set(0.6F); + magic.getExhaustion().set(0); + magic.getExertion().set(0); pony.setDirty(); } entity.damage(MagicalDamageSource.TRIBE_SWAP, Float.MAX_VALUE); + entity.setHealth(0); } } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinInGameHud.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinInGameHud.java index f7bb7132..2b24b104 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinInGameHud.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinInGameHud.java @@ -1,19 +1,36 @@ package com.minelittlepony.unicopia.mixin.client; -import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.minelittlepony.unicopia.client.gui.UHud; +import com.minelittlepony.unicopia.entity.effect.RaceChangeStatusEffect; import net.minecraft.client.gui.hud.InGameHud; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.player.PlayerEntity; @Mixin(InGameHud.class) -public class MixinInGameHud { +abstract class MixinInGameHud { @Inject(method = "render(Lnet/minecraft/client/util/math/MatrixStack;F)V", at = @At("HEAD")) private void onRender(MatrixStack stack, float tickDelta, CallbackInfo info) { UHud.INSTANCE.render((InGameHud)(Object)this, stack, tickDelta); } } + +@Mixin(targets = "net.minecraft.client.gui.hud.InGameHud$HeartType") +abstract class MixinInGameHud$HeartType { + @SuppressWarnings({"unchecked", "rawtypes"}) + @Inject( + method = "fromPlayerState(Lnet/minecraft/entity/player/PlayerEntity;F)Lnet/minecraft/client/gui/hud/InGameHud$HeartType;", + at = @At("RETURN"), + cancellable = true) + private static void onFromPlayerState(PlayerEntity player, CallbackInfoReturnable cbi) { + if (RaceChangeStatusEffect.hasEffect(player)) { + cbi.setReturnValue(Enum.valueOf(cbi.getReturnValue().getClass(), "WITHERED")); + } + } +} \ No newline at end of file diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index 3b2490fc..bc434a41 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -39,6 +39,7 @@ "client.MixinEntityRenderDispatcher", "client.MixinGameRenderer", "client.MixinInGameHud", + "client.MixinInGameHud$HeartType", "client.MixinItem", "client.MixinItemModels", "client.MixinKeyboardInput",