From e6ec2083efbc88a42192f26f55b726ad018c9314 Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 17 May 2024 18:56:20 +0100 Subject: [PATCH] Add a fortification status effect so earth ponies can see when they're fortified --- .../magic/spell/effect/AttractionUtils.java | 9 +++-- .../unicopia/entity/effect/EffectUtils.java | 23 ++++++++++++ .../entity/effect/SimpleStatusEffect.java | 33 ++++++++++++++++++ .../unicopia/entity/effect/UEffects.java | 3 +- .../entity/player/PlayerAttributes.java | 3 ++ .../unicopia/entity/player/Pony.java | 14 ++++---- .../resources/assets/unicopia/lang/en_us.json | 1 + .../textures/mob_effect/fortification.png | Bin 0 -> 8616 bytes 8 files changed, 73 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/entity/effect/SimpleStatusEffect.java create mode 100644 src/main/resources/assets/unicopia/textures/mob_effect/fortification.png diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/AttractionUtils.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/AttractionUtils.java index 76b2d29e..2f8833e9 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/AttractionUtils.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/AttractionUtils.java @@ -3,6 +3,7 @@ package com.minelittlepony.unicopia.ability.magic.spell.effect; import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.entity.Living; +import com.minelittlepony.unicopia.entity.effect.EffectUtils; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.item.enchantment.UEnchantments; @@ -61,12 +62,10 @@ public interface AttractionUtils { return Pony.of(entity).map(pony -> { double force = 0.75; - if (pony.getCompositeRace().canUseEarth()) { + if (EffectUtils.hasExtraDefenses(pony.asEntity())) { + force /= 12; + } else if (pony.getCompositeRace().canUseEarth()) { force /= 2; - - if (pony.asEntity().isSneaking()) { - force /= 6; - } } else if (pony.getCompositeRace().canFly()) { force *= 2; } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/effect/EffectUtils.java b/src/main/java/com/minelittlepony/unicopia/entity/effect/EffectUtils.java index 14372955..dff45f27 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/effect/EffectUtils.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/effect/EffectUtils.java @@ -2,6 +2,7 @@ package com.minelittlepony.unicopia.entity.effect; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.entity.effect.StatusEffectInstance; public interface EffectUtils { static boolean isPoisoned(LivingEntity entity) { @@ -15,4 +16,26 @@ public interface EffectUtils { static boolean isChangingRace(LivingEntity entity) { return entity.getStatusEffects().stream().anyMatch(effect -> effect.getEffectType() instanceof RaceChangeStatusEffect); } + + static boolean hasExtraDefenses(LivingEntity entity) { + return entity.hasStatusEffect(UEffects.FORTIFICATION); + } + + static boolean applyStatusEffect(LivingEntity entity, StatusEffect effect, boolean apply) { + if (entity.getWorld().isClient) { + return false; + } + boolean has = entity.hasStatusEffect(effect); + if (has != apply) { + if (has) { + if (entity.getStatusEffect(effect).getDuration() == StatusEffectInstance.INFINITE) { + entity.removeStatusEffect(effect); + } + } else { + entity.addStatusEffect(new StatusEffectInstance(effect, StatusEffectInstance.INFINITE, 0, false, false, true)); + } + return true; + } + return false; + } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/effect/SimpleStatusEffect.java b/src/main/java/com/minelittlepony/unicopia/entity/effect/SimpleStatusEffect.java new file mode 100644 index 00000000..7adc3654 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/entity/effect/SimpleStatusEffect.java @@ -0,0 +1,33 @@ +package com.minelittlepony.unicopia.entity.effect; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.entity.effect.StatusEffectCategory; + +public class SimpleStatusEffect extends StatusEffect { + + private final boolean instant; + + public SimpleStatusEffect(StatusEffectCategory category, int color, boolean instant) { + super(category, color); + this.instant = instant; + } + + @Override + public void applyUpdateEffect(LivingEntity entity, int amplifier) { + + } + + @Override + public void applyInstantEffect(@Nullable Entity source, @Nullable Entity attacker, LivingEntity target, int amplifier, double proximity) { + + } + + @Override + public final boolean isInstant() { + return instant; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/entity/effect/UEffects.java b/src/main/java/com/minelittlepony/unicopia/entity/effect/UEffects.java index 00b51dd6..83feb060 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/effect/UEffects.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/effect/UEffects.java @@ -15,7 +15,8 @@ public interface UEffects { * When affecting an entity, will give them a random chance to reproduce or duplicate themselves when they die. */ StatusEffect CORRUPT_INFLUENCE = register("corrupt_influence", new CorruptInfluenceStatusEffect(0x00FF00)); - StatusEffect PARALYSIS = register("paralysis", new StatusEffect(StatusEffectCategory.HARMFUL, 0) {}); + StatusEffect PARALYSIS = register("paralysis", new SimpleStatusEffect(StatusEffectCategory.HARMFUL, 0, false)); + StatusEffect FORTIFICATION = register("fortification", new SimpleStatusEffect(StatusEffectCategory.BENEFICIAL, 0x000077, false)); /** * Side-effect of wearing the alicorn amulet. * Causes the player to lose grip on whatever item they're holding. diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerAttributes.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerAttributes.java index 8bbccdef..b1efa4a6 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerAttributes.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerAttributes.java @@ -6,6 +6,8 @@ import java.util.function.Predicate; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; +import com.minelittlepony.unicopia.entity.effect.EffectUtils; +import com.minelittlepony.unicopia.entity.effect.UEffects; import com.minelittlepony.unicopia.entity.mob.UEntityAttributes; import com.minelittlepony.unicopia.util.Tickable; @@ -87,6 +89,7 @@ public class PlayerAttributes implements Tickable { @Override public void tick() { ATTRIBUTES.forEach(attribute -> attribute.update(pony)); + EffectUtils.applyStatusEffect(pony.asEntity(), UEffects.FORTIFICATION, pony.getCompositeRace().canUseEarth() && pony.asEntity().isSneaking()); } record ToggleableAttribute(EntityAttributeModifier modifier, List attributes, Predicate test) { diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index 07a13cec..b8f30cd5 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -21,6 +21,7 @@ import com.minelittlepony.unicopia.advancement.UCriteria; import com.minelittlepony.unicopia.entity.*; import com.minelittlepony.unicopia.entity.behaviour.EntityAppearance; import com.minelittlepony.unicopia.entity.duck.LivingEntityDuck; +import com.minelittlepony.unicopia.entity.effect.EffectUtils; import com.minelittlepony.unicopia.entity.effect.MetamorphosisStatusEffect; import com.minelittlepony.unicopia.entity.effect.SunBlindnessStatusEffect; import com.minelittlepony.unicopia.entity.effect.UEffects; @@ -700,18 +701,17 @@ public class Pony extends Living implements Copyable, Update } } - if (!cause.isIn(DamageTypeTags.BYPASSES_SHIELD) + if (EffectUtils.hasExtraDefenses(entity) + && !cause.isIn(DamageTypeTags.BYPASSES_SHIELD) && !cause.isOf(DamageTypes.MAGIC) && !cause.isIn(DamageTypeTags.IS_FIRE) && !cause.isIn(DamageTypeTags.BYPASSES_INVULNERABILITY) && !cause.isOf(DamageTypes.THORNS) && !cause.isOf(DamageTypes.FREEZE)) { - if (getCompositeRace().canUseEarth() && entity.isSneaking()) { - amount /= (cause.isOf(DamageTypes.MOB_PROJECTILE) ? 3 : 2) * (entity.getHealth() < 5 ? 3 : 1); + amount /= (cause.isOf(DamageTypes.MOB_PROJECTILE) ? 3 : 2) * (entity.getHealth() < 5 ? 3 : 1); - return Optional.of(amount); - } + return Optional.of(amount); } return Optional.empty(); } @@ -727,7 +727,7 @@ public class Pony extends Living implements Copyable, Update public float onImpact(float distance, float damageMultiplier, DamageSource cause) { distance = super.onImpact(distance, damageMultiplier, cause); - if (getCompositeRace().canUseEarth() && entity.isSneaking()) { + if (EffectUtils.hasExtraDefenses(entity)) { double radius = distance / 10; if (radius > 0) { EarthPonyStompAbility.spawnEffectAround(entity, entity.getSteppingPos(), radius, radius); @@ -750,7 +750,7 @@ public class Pony extends Living implements Copyable, Update } } - if (getCompositeRace().canFly() || (getCompositeRace().canUseEarth() && entity.isSneaking())) { + if (getCompositeRace().canFly() || EffectUtils.hasExtraDefenses(entity)) { distance -= 5; } } diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 86c642e4..dcacc971 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -406,6 +406,7 @@ "effect.unicopia.corrupt_influence": "Corrupt Influence", "effect.unicopia.paralysis": "Paralysis", "effect.unicopia.butter_fingers": "Butterfingers", + "effect.unicopia.fortification": "Fortification", "effect.unicopia.change_race_earth": "Earth Pony Metamorphosis", "effect.unicopia.change_race_unicorn": "Unicorn Metamorphosis", diff --git a/src/main/resources/assets/unicopia/textures/mob_effect/fortification.png b/src/main/resources/assets/unicopia/textures/mob_effect/fortification.png new file mode 100644 index 0000000000000000000000000000000000000000..106e3a2f6591f2c46e14c77dda2c065da4cc6daa GIT binary patch literal 8616 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 literal 0 HcmV?d00001