From a594963bffd575dc34c5fe9be86edfa76a7447c8 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Wed, 20 Nov 2024 18:41:00 -0500 Subject: [PATCH 01/13] Mention low yield in immunity recipe --- src/main/resources/assets/spectrum/lang/en_us.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index 217f1a025e..668f5c063f 100644 --- a/src/main/resources/assets/spectrum/lang/en_us.json +++ b/src/main/resources/assets/spectrum/lang/en_us.json @@ -3565,7 +3565,7 @@ "book.spectrum.guidebook.potion_workshop_brewing.page4.text": "Adding a Fermented Spider Eye will change the effect to **Mining Fatigue** instead.", "book.spectrum.guidebook.potion_workshop_brewing.page5.text": "Adding a Fermented Spider Eye will change the effect to **Hunger** instead.", "book.spectrum.guidebook.potion_workshop_brewing.page7.text": "Adding a Fermented Spider Eye will change the effect to **Bad Luck** instead.", - "book.spectrum.guidebook.potion_workshop_brewing.page19.text": "*Taken from the notes in the [Poisoner's Handbook](entry://dimension/lore/poisoners_handbook).*", + "book.spectrum.guidebook.potion_workshop_brewing.page19.text": "*Taken from the notes in the [Poisoner's Handbook](entry://dimension/lore/poisoners_handbook).\\\n\\\nThis brew also has a naturally low yield.*", "book.spectrum.guidebook.potion_workshop_crafting": "Workshop Crafting", "book.spectrum.guidebook.potion_workshop_crafting.page0.text": "As the name implies, I designed the [Potion Workshop](entry://brewing/potion_workshop) around the creation of powerful potions.\\\nBut with the help of all of the filigree and granular adjustable switches and valves I found great utility in it for creating other things with it, as well!\\\n\\\nAll of those recipes do not require [Reagents](entry://brewing/potion_workshop_reagents).", "book.spectrum.guidebook.potion_workshop_crafting.page1.title": "Water", From 23d99ef0484a047dcc41eeaa4760a951530e265c Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Wed, 20 Nov 2024 19:36:03 -0500 Subject: [PATCH 02/13] Percent based duration reduction for incurable effects --- .../LivingEntityPreventStatusClearMixin.java | 16 ++++++++-------- .../present/SpectrumEventListenersMixin.java | 10 +++++----- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/mixin/compat/quilt_status_effect/absent/LivingEntityPreventStatusClearMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/compat/quilt_status_effect/absent/LivingEntityPreventStatusClearMixin.java index 147e705c6b..7a75080154 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/compat/quilt_status_effect/absent/LivingEntityPreventStatusClearMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/compat/quilt_status_effect/absent/LivingEntityPreventStatusClearMixin.java @@ -28,15 +28,15 @@ public abstract class LivingEntityPreventStatusClearMixin { if (affectedByImmunity(instance, effect.getAmplifier())) return true; - if (effect.getDuration() > 1200) { - ((StatusEffectInstanceAccessor) effect).setDuration(effect.getDuration() - 1200); - if (!instance.getWorld().isClient()) { - ((ServerWorld) instance.getWorld()).getChunkManager().sendToNearbyPlayers(instance, new EntityStatusEffectS2CPacket(instance.getId(), effect)); - } - - blockRemoval.set(true); - return false; + // new duration = duration - 1min OR duration * 0.4, whichever is the smaller reduction + int duration = effect.getDuration(); + ((StatusEffectInstanceAccessor) effect).setDuration(Math.max(duration - 1200, (int)(duration * 0.4))); + if (!instance.getWorld().isClient()) { + ((ServerWorld) instance.getWorld()).getChunkManager().sendToNearbyPlayers(instance, new EntityStatusEffectS2CPacket(instance.getId(), effect)); } + + blockRemoval.set(true); + return false; } return true; } diff --git a/src/main/java/de/dafuqs/spectrum/mixin/compat/quilt_status_effect/present/SpectrumEventListenersMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/compat/quilt_status_effect/present/SpectrumEventListenersMixin.java index 714eb0a42e..510d281627 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/compat/quilt_status_effect/present/SpectrumEventListenersMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/compat/quilt_status_effect/present/SpectrumEventListenersMixin.java @@ -21,11 +21,11 @@ public class SpectrumEventListenersMixin { @Unique private static TriState _shouldRemove(LivingEntity entity, StatusEffectInstance effect, Object reason) { if (Incurable.isIncurable(effect) && !affectedByImmunity(entity, effect.getAmplifier())) { - if (effect.getDuration() > 1200) { - ((StatusEffectInstanceAccessor) effect).setDuration(effect.getDuration() - 1200); - if (!entity.getWorld().isClient()) { - ((ServerWorld) entity.getWorld()).getChunkManager().sendToNearbyPlayers(entity, new EntityStatusEffectS2CPacket(entity.getId(), effect)); - } + // new duration = duration - 1min OR duration * 0.4, whichever is the smaller reduction + int duration = effect.getDuration(); + ((StatusEffectInstanceAccessor) effect).setDuration(Math.max(duration - 1200, (int)(duration * 0.4))); + if (!entity.getWorld().isClient()) { + ((ServerWorld) entity.getWorld()).getChunkManager().sendToNearbyPlayers(entity, new EntityStatusEffectS2CPacket(entity.getId(), effect)); } return TriState.FALSE; } From 5e8beccce6ab9c57c7e9837953ed0ebbe1ee8ed0 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Wed, 20 Nov 2024 23:27:17 -0500 Subject: [PATCH 03/13] Untangle bypass tags for Immunity and Whispy Circlet --- .../items/trinkets/WhispyCircletItem.java | 4 ++-- .../spectrum/mixin/LivingEntityMixin.java | 2 +- .../registries/SpectrumStatusEffectTags.java | 16 +++++++------- .../status_effects/ImmunityStatusEffect.java | 22 +++++++++++++++++-- .../tags/mob_effect/bypasses_immunity.json | 5 +++++ .../mob_effect/bypasses_whispy_circlet.json | 5 +++++ .../tags/mob_effect/immunity_immune.json | 5 ----- .../spectrum/tags/mob_effect/unclearable.json | 6 ----- 8 files changed, 41 insertions(+), 24 deletions(-) create mode 100644 src/main/resources/data/spectrum/tags/mob_effect/bypasses_immunity.json create mode 100644 src/main/resources/data/spectrum/tags/mob_effect/bypasses_whispy_circlet.json delete mode 100644 src/main/resources/data/spectrum/tags/mob_effect/immunity_immune.json delete mode 100644 src/main/resources/data/spectrum/tags/mob_effect/unclearable.json diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/WhispyCircletItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/WhispyCircletItem.java index 30383cef1d..f6e270818b 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/WhispyCircletItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/WhispyCircletItem.java @@ -36,7 +36,7 @@ public static void removeSingleStatusEffect(@NotNull LivingEntity entity, Status List negativeEffects = new ArrayList<>(); for (StatusEffectInstance statusEffectInstance : currentEffects) { StatusEffect effect = statusEffectInstance.getEffectType(); - if (effect.getCategory() == category && !SpectrumStatusEffectTags.isIn(SpectrumStatusEffectTags.SOPORIFIC, effect) && !SpectrumStatusEffectTags.isUnclearable(effect)) { + if (effect.getCategory() == category && !SpectrumStatusEffectTags.isIn(SpectrumStatusEffectTags.SOPORIFIC, effect) && !SpectrumStatusEffectTags.bypassesWhispyCirclet(effect)) { negativeEffects.add(statusEffectInstance); } } @@ -90,7 +90,7 @@ public static void shortenNegativeStatusEffects(@NotNull LivingEntity entity, in } public static boolean affects(StatusEffect statusEffect) { - return statusEffect.getCategory() == StatusEffectCategory.HARMFUL && !SpectrumStatusEffectTags.isIn(SpectrumStatusEffectTags.SOPORIFIC, statusEffect) && !SpectrumStatusEffectTags.isUnclearable(statusEffect); + return statusEffect.getCategory() == StatusEffectCategory.HARMFUL && !SpectrumStatusEffectTags.bypassesWhispyCirclet(statusEffect); } public static void preventPhantomSpawns(@NotNull ServerPlayerEntity serverPlayerEntity) { diff --git a/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java index 76145fd782..afc73b8ce2 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java @@ -227,7 +227,7 @@ public abstract class LivingEntityMixin { private boolean spectrum$canHaveStatusEffect(boolean original, @Local(argsOnly = true) StatusEffectInstance statusEffectInstance) { var instance = (LivingEntity) (Object) this; - if (original && this.hasStatusEffect(SpectrumStatusEffects.IMMUNITY) && statusEffectInstance.getEffectType().getCategory() == StatusEffectCategory.HARMFUL && !SpectrumStatusEffectTags.isImmunityImmune(statusEffectInstance.getEffectType())) { + if (original && this.hasStatusEffect(SpectrumStatusEffects.IMMUNITY) && statusEffectInstance.getEffectType().getCategory() == StatusEffectCategory.HARMFUL && !SpectrumStatusEffectTags.bypassesImmunity(statusEffectInstance.getEffectType())) { if (Incurable.isIncurable(statusEffectInstance)) { var immunity = getStatusEffect(SpectrumStatusEffects.IMMUNITY); var cost = 600 * (statusEffectInstance.getAmplifier() + 1); diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumStatusEffectTags.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumStatusEffectTags.java index a819297a86..513a8e2b61 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumStatusEffectTags.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumStatusEffectTags.java @@ -8,15 +8,15 @@ public class SpectrumStatusEffectTags { - public static TagKey NO_EFFECT_CLEAR; - public static TagKey IMMUNITY_IMMUNE; + public static TagKey BYPASSES_WHISPY_CIRCLET; + public static TagKey BYPASSES_IMMUNITY; public static TagKey NO_DURATION_EXTENSION; public static TagKey SOPORIFIC; public static TagKey NIGHT_ALCHEMY; public static void register() { - NO_EFFECT_CLEAR = of("unclearable"); - IMMUNITY_IMMUNE = of("immunity_immune"); + BYPASSES_WHISPY_CIRCLET = of("bypasses_whispy_circlet"); + BYPASSES_IMMUNITY = of("bypasses_immunity"); NO_DURATION_EXTENSION = of("no_duration_extension"); SOPORIFIC = of("soporific"); NIGHT_ALCHEMY = of("night_alchemy"); @@ -30,12 +30,12 @@ public static boolean isIn(TagKey tag, StatusEffect effect) { return Registries.STATUS_EFFECT.getEntry(effect).isIn(tag); } - public static boolean isImmunityImmune(StatusEffect statusEffect) { - return isIn(SpectrumStatusEffectTags.IMMUNITY_IMMUNE, statusEffect); + public static boolean bypassesImmunity(StatusEffect statusEffect) { + return isIn(SpectrumStatusEffectTags.BYPASSES_IMMUNITY, statusEffect); } - public static boolean isUnclearable(StatusEffect statusEffect) { - return isIn(SpectrumStatusEffectTags.NO_EFFECT_CLEAR, statusEffect); + public static boolean bypassesWhispyCirclet(StatusEffect statusEffect) { + return isIn(SpectrumStatusEffectTags.BYPASSES_WHISPY_CIRCLET, statusEffect); } public static boolean hasEffectWithTag(LivingEntity livingEntity, TagKey tag) { diff --git a/src/main/java/de/dafuqs/spectrum/status_effects/ImmunityStatusEffect.java b/src/main/java/de/dafuqs/spectrum/status_effects/ImmunityStatusEffect.java index d168b5febc..575709c1cb 100644 --- a/src/main/java/de/dafuqs/spectrum/status_effects/ImmunityStatusEffect.java +++ b/src/main/java/de/dafuqs/spectrum/status_effects/ImmunityStatusEffect.java @@ -1,9 +1,12 @@ package de.dafuqs.spectrum.status_effects; import de.dafuqs.spectrum.items.trinkets.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.entity.*; import net.minecraft.entity.attribute.*; import net.minecraft.entity.effect.*; +import org.jetbrains.annotations.*; +import java.util.*; public class ImmunityStatusEffect extends StatusEffect { @@ -19,13 +22,28 @@ public boolean canApplyUpdateEffect(int duration, int amplifier) { @Override public void applyUpdateEffect(LivingEntity entity, int amplifier) { super.applyUpdateEffect(entity, amplifier); - WhispyCircletItem.removeNegativeStatusEffects(entity); + removeNegativeStatusEffects(entity); } @Override public void onApplied(LivingEntity entity, AttributeContainer attributes, int amplifier) { super.onApplied(entity, attributes, amplifier); - WhispyCircletItem.removeNegativeStatusEffects(entity); + removeNegativeStatusEffects(entity); + } + + public static void removeNegativeStatusEffects(@NotNull LivingEntity entity) { + Set effectsToRemove = new HashSet<>(); + Collection currentEffects = entity.getStatusEffects(); + for (StatusEffectInstance instance : currentEffects) { + StatusEffect effectType = instance.getEffectType(); + if (effectType.getCategory() == StatusEffectCategory.HARMFUL && !SpectrumStatusEffectTags.bypassesImmunity(effectType)) { + effectsToRemove.add(instance.getEffectType()); + } + } + + for (StatusEffect effect : effectsToRemove) { + entity.removeStatusEffect(effect); + } } } \ No newline at end of file diff --git a/src/main/resources/data/spectrum/tags/mob_effect/bypasses_immunity.json b/src/main/resources/data/spectrum/tags/mob_effect/bypasses_immunity.json new file mode 100644 index 0000000000..5ae1465d7f --- /dev/null +++ b/src/main/resources/data/spectrum/tags/mob_effect/bypasses_immunity.json @@ -0,0 +1,5 @@ +{ + "values": [ + + ] +} diff --git a/src/main/resources/data/spectrum/tags/mob_effect/bypasses_whispy_circlet.json b/src/main/resources/data/spectrum/tags/mob_effect/bypasses_whispy_circlet.json new file mode 100644 index 0000000000..0adc265e45 --- /dev/null +++ b/src/main/resources/data/spectrum/tags/mob_effect/bypasses_whispy_circlet.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#spectrum:soporific" + ] +} diff --git a/src/main/resources/data/spectrum/tags/mob_effect/immunity_immune.json b/src/main/resources/data/spectrum/tags/mob_effect/immunity_immune.json deleted file mode 100644 index c98eda0649..0000000000 --- a/src/main/resources/data/spectrum/tags/mob_effect/immunity_immune.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "spectrum:fatal_slumber" - ] -} diff --git a/src/main/resources/data/spectrum/tags/mob_effect/unclearable.json b/src/main/resources/data/spectrum/tags/mob_effect/unclearable.json deleted file mode 100644 index 5fa33d7ffb..0000000000 --- a/src/main/resources/data/spectrum/tags/mob_effect/unclearable.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "spectrum:eternal_slumber", - "#spectrum:immunity_immune" - ] -} From 89d163578ba848c6ee44ab4433e736fc8b1f5e2c Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Thu, 21 Nov 2024 01:48:43 -0500 Subject: [PATCH 04/13] Fatal Slumber turns into Eternal Slumber when cured, removing Immunity if present; Eternal Slumber costs 30 seconds of Immunity duration to cure --- .../spectrum/mixin/EffectCommandMixin.java | 4 ++ .../spectrum/mixin/LivingEntityMixin.java | 37 ++++++++++++++++--- .../LivingEntityPreventStatusClearMixin.java | 22 +++++++++++ 3 files changed, 58 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/mixin/EffectCommandMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/EffectCommandMixin.java index baf656d2d0..150c6ec8b2 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/EffectCommandMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/EffectCommandMixin.java @@ -2,6 +2,7 @@ import com.llamalad7.mixinextras.sugar.Local; import de.dafuqs.spectrum.api.status_effect.Incurable; +import de.dafuqs.spectrum.registries.*; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.effect.StatusEffect; @@ -25,6 +26,9 @@ private static void clearIncurableEffects(ServerCommandSource source, Collection for (StatusEffectInstance effect : living.getStatusEffects()) { if (((Incurable) effect).spectrum$isIncurable()) ((Incurable) effect).spectrum$setIncurable(false); + // manually remove fatal slumber to bypass turning it into eternal slumber + if (effect.getEffectType() == SpectrumStatusEffects.FATAL_SLUMBER) + living.removeStatusEffect(SpectrumStatusEffects.FATAL_SLUMBER); } } } diff --git a/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java index afc73b8ce2..08cb2f360d 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java @@ -227,23 +227,50 @@ public abstract class LivingEntityMixin { private boolean spectrum$canHaveStatusEffect(boolean original, @Local(argsOnly = true) StatusEffectInstance statusEffectInstance) { var instance = (LivingEntity) (Object) this; + // if fatal slumber is applied, incoming immunity converts fatal->eternal and doesn't apply immunity + if (original && this.hasStatusEffect(SpectrumStatusEffects.FATAL_SLUMBER) && statusEffectInstance.getEffectType() == SpectrumStatusEffects.IMMUNITY) { + ImmunityStatusEffect.removeNegativeStatusEffects(instance); + addStatusEffect(new StatusEffectInstance(SpectrumStatusEffects.ETERNAL_SLUMBER, 6000)); + return false; + } + + // if eternal slumber is applied, incoming immunity loses 30s of duration but does still apply + if (original && this.hasStatusEffect(SpectrumStatusEffects.ETERNAL_SLUMBER) && statusEffectInstance.getEffectType() == SpectrumStatusEffects.IMMUNITY) { + ImmunityStatusEffect.removeNegativeStatusEffects(instance); + ((StatusEffectInstanceAccessor) statusEffectInstance).setDuration(Math.max(0, statusEffectInstance.getDuration() - 600)); + if (!instance.getWorld().isClient()) { + ((ServerWorld) instance.getWorld()).getChunkManager().sendToNearbyPlayers(instance, new EntityStatusEffectS2CPacket(instance.getId(), statusEffectInstance)); + } + return true; + } + + // normal immunity handling (block incoming negative effects) if (original && this.hasStatusEffect(SpectrumStatusEffects.IMMUNITY) && statusEffectInstance.getEffectType().getCategory() == StatusEffectCategory.HARMFUL && !SpectrumStatusEffectTags.bypassesImmunity(statusEffectInstance.getEffectType())) { - if (Incurable.isIncurable(statusEffectInstance)) { + // incurable effects (and eternal slumber) cost chunks of immunity duration to block + if (Incurable.isIncurable(statusEffectInstance) || statusEffectInstance.getEffectType() == SpectrumStatusEffects.ETERNAL_SLUMBER) { var immunity = getStatusEffect(SpectrumStatusEffects.IMMUNITY); var cost = 600 * (statusEffectInstance.getAmplifier() + 1); + var immDuration = immunity.getDuration(); - if (immunity.getDuration() >= cost) { - ((StatusEffectInstanceAccessor) immunity).setDuration(Math.max(5, immunity.getDuration() - cost)); + if (immDuration >= cost) { + ((StatusEffectInstanceAccessor) immunity).setDuration(immDuration - cost); if (!instance.getWorld().isClient()) { ((ServerWorld) instance.getWorld()).getChunkManager().sendToNearbyPlayers(instance, new EntityStatusEffectS2CPacket(instance.getId(), immunity)); } return false; - } - else { + } else { + removeStatusEffect(SpectrumStatusEffects.IMMUNITY); return true; } } + // fatal slumber removes the immunity and then turns into eternal slumber + if (statusEffectInstance.getEffectType() == SpectrumStatusEffects.FATAL_SLUMBER) { + removeStatusEffect(SpectrumStatusEffects.IMMUNITY); + addStatusEffect(new StatusEffectInstance(SpectrumStatusEffects.ETERNAL_SLUMBER, 6000)); + return false; + } + return false; } return original; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/compat/quilt_status_effect/absent/LivingEntityPreventStatusClearMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/compat/quilt_status_effect/absent/LivingEntityPreventStatusClearMixin.java index 7a75080154..100c2769a8 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/compat/quilt_status_effect/absent/LivingEntityPreventStatusClearMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/compat/quilt_status_effect/absent/LivingEntityPreventStatusClearMixin.java @@ -11,8 +11,10 @@ import net.minecraft.entity.effect.*; import net.minecraft.network.packet.s2c.play.*; import net.minecraft.server.world.*; +import org.jetbrains.annotations.*; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.*; @@ -21,7 +23,27 @@ public abstract class LivingEntityPreventStatusClearMixin { @Shadow public abstract void remove(Entity.RemovalReason reason); + + @Shadow + public abstract boolean addStatusEffect(StatusEffectInstance effect); + + @Shadow + public abstract Map getActiveStatusEffects(); + private boolean hasFatalSlumber = false; + + @Inject(method = "clearStatusEffects", at = @At("HEAD")) + private void spectrum$detectFatalSlumber(CallbackInfoReturnable cir) { + hasFatalSlumber = getActiveStatusEffects().containsKey(SpectrumStatusEffects.FATAL_SLUMBER); + } + + @Inject(method = "clearStatusEffects", at = @At("TAIL")) + private void spectrum$applyEternalSlumberIfFatalSlumberRemoved(CallbackInfoReturnable cir) { + if (hasFatalSlumber) { + addStatusEffect(new StatusEffectInstance(SpectrumStatusEffects.ETERNAL_SLUMBER, 6000)); + } + } + @WrapWithCondition(method = "clearStatusEffects", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;onStatusEffectRemoved(Lnet/minecraft/entity/effect/StatusEffectInstance;)V")) private boolean spectrum$preventStatusClear(LivingEntity instance, StatusEffectInstance effect, @Share("blockRemoval") LocalBooleanRef blockRemoval) { if (Incurable.isIncurable(effect)) { From f57c47a0723aafd783f6a78eb610312f1b3e035b Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Thu, 21 Nov 2024 01:52:11 -0500 Subject: [PATCH 05/13] Clarify that all vanilla potions work in the Potion Workshop --- src/main/resources/assets/spectrum/lang/en_us.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index 668f5c063f..f4f4855526 100644 --- a/src/main/resources/assets/spectrum/lang/en_us.json +++ b/src/main/resources/assets/spectrum/lang/en_us.json @@ -3559,7 +3559,7 @@ "book.spectrum.guidebook.potion_workshop_brewing.fillable_only": "*This brew is too concentrated to function as a potion or tipped arrow, and will only be useful for more complex items that can be filled with a potion effect.*", "book.spectrum.guidebook.potion_workshop_brewing.name": "Brewing Potions", "book.spectrum.guidebook.potion_workshop_brewing.page0.text": "I was able to replicate all the potions I could do with the Brewing Stand and more! (though some of them are easier or harder to get enhanced effects from)\\\n\\\nI can use [Reagents](entry://brewing/potion_workshop_reagents) to tinker with their effects.", - "book.spectrum.guidebook.potion_workshop_brewing.page1.text": "I can make those using the same ingredients as I would in the [#](bb00bb)Brewing Stand[#]().", + "book.spectrum.guidebook.potion_workshop_brewing.page1.text": "I can make any vanilla potion using the same ingredients as I would in the [#](bb00bb)Brewing Stand[#]().", "book.spectrum.guidebook.potion_workshop_brewing.page1.title": "Previously Known Potions", "book.spectrum.guidebook.potion_workshop_brewing.page2.strong.text": "Using Milky Resin yields a stronger blend at the cost of duration.", "book.spectrum.guidebook.potion_workshop_brewing.page4.text": "Adding a Fermented Spider Eye will change the effect to **Mining Fatigue** instead.", From ec9a3388865dbb0a4df7e3268489820615a216fc Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Thu, 21 Nov 2024 02:27:54 -0500 Subject: [PATCH 06/13] Hexcasting potion compat --- .../resources/assets/spectrum/lang/en_us.json | 3 +- .../entries/mod_integration/hexcasting.json | 10 +++++++ .../hexcasting_enlarge_grid.json | 26 +++++++++++++++++ .../hexcasting_shrink_grid.json | 29 +++++++++++++++++++ 4 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/data/spectrum/recipes/mod_integration/hexcasting/potion_workshop_brewing/hexcasting_enlarge_grid.json create mode 100644 src/main/resources/data/spectrum/recipes/mod_integration/hexcasting/potion_workshop_brewing/hexcasting_shrink_grid.json diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index f4f4855526..239718f0db 100644 --- a/src/main/resources/assets/spectrum/lang/en_us.json +++ b/src/main/resources/assets/spectrum/lang/en_us.json @@ -3256,7 +3256,8 @@ "book.spectrum.guidebook.mod_integration.hexcasting.page2.title": "Edified Leaf Crafting", "book.spectrum.guidebook.mod_integration.hexcasting.page3.text": "I can charge up [#](bb00bb)Amethyst Shards[#]() using the [Fusion Shrine](entry://general/fusion_shrine).", "book.spectrum.guidebook.mod_integration.hexcasting.page3.title": "Charging Amethyst", - "book.spectrum.guidebook.mod_integration.hexcasting.page4.text": "- +15-120s duration. Sometimes more, sometimes less\\\n\\\nAs I expected, [#](bb00bb)Charged Amethyst[#]() serves as a more potent, but also more fluctuate, [#](bb00bb)Amethyst[#]() reagent in regards to prolonging durations.", + "book.spectrum.guidebook.mod_integration.hexcasting.page4.text": "- +15-120s duration. Sometimes more, sometimes less\\\n\\\nAs I expected, [#](bb00bb)Charged Amethyst[#]() serves as a more potent [#](bb00bb)Amethyst[#]() reagent in regards to prolonging durations, though it's also more prone to fluctuation.", + "book.spectrum.guidebook.mod_integration.hexcasting.page5.text": "Adding a Fermented Spider Eye will change the effect to **Clouding** instead.", "book.spectrum.guidebook.mod_integration.immersive_weathering.name": "Immersive Weathering", "book.spectrum.guidebook.mod_integration.immersive_weathering.page0.text": "This really immerses my weathering.", "book.spectrum.guidebook.mod_integration.immersive_weathering.enchanted_golden_moss.text": "*Neither chaotic nor lawful to moss.*", diff --git a/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/mod_integration/hexcasting.json b/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/mod_integration/hexcasting.json index 66f00b7ceb..15ca1052d1 100644 --- a/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/mod_integration/hexcasting.json +++ b/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/mod_integration/hexcasting.json @@ -64,6 +64,16 @@ "item": "hexcasting:charged_amethyst" }, "text": "book.spectrum.guidebook.mod_integration.hexcasting.page4.text" + }, + { + "type": "spectrum:potion_workshop_brewing", + "condition": { + "type": "modonomicon:advancement", + "advancement_id": "spectrum:midgame/brew_potion_in_potion_workshop" + }, + "text": "book.spectrum.guidebook.mod_integration.hexcasting.page5.text", + "title": "effect.hexcasting.enlarge_grid", + "recipe_id": "spectrum:mod_integration/hexcasting/potion_workshop_brewing/hexcasting_enlarge_grid" } ] } diff --git a/src/main/resources/data/spectrum/recipes/mod_integration/hexcasting/potion_workshop_brewing/hexcasting_enlarge_grid.json b/src/main/resources/data/spectrum/recipes/mod_integration/hexcasting/potion_workshop_brewing/hexcasting_enlarge_grid.json new file mode 100644 index 0000000000..a041e7ffac --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/mod_integration/hexcasting/potion_workshop_brewing/hexcasting_enlarge_grid.json @@ -0,0 +1,26 @@ +{ + "type": "spectrum:potion_workshop_brewing", + "group": "hexcasting_potions", + "ingredient1": { + "item": "minecraft:nether_wart" + }, + "ingredient2": { + "item": "hexcasting:amethyst_dust" + }, + "effect": "hexcasting:enlarge_grid", + "base_duration_ticks": 3600, + "potency_modifier": 1.0, + "applicable_to_potions": true, + "applicable_to_tipped_arrows": true, + "applicable_to_potion_fillables": true, + "ink_color": "spectrum:purple", + "ink_cost": 4, + "fabric:load_conditions": [ + { + "condition": "fabric:all_mods_loaded", + "values": [ + "hexcasting" + ] + } + ] + } \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/mod_integration/hexcasting/potion_workshop_brewing/hexcasting_shrink_grid.json b/src/main/resources/data/spectrum/recipes/mod_integration/hexcasting/potion_workshop_brewing/hexcasting_shrink_grid.json new file mode 100644 index 0000000000..90346b9d02 --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/mod_integration/hexcasting/potion_workshop_brewing/hexcasting_shrink_grid.json @@ -0,0 +1,29 @@ +{ + "type": "spectrum:potion_workshop_brewing", + "group": "hexcasting_potions", + "ingredient1": { + "item": "minecraft:nether_wart" + }, + "ingredient2": { + "item": "hexcasting:amethyst_dust" + }, + "ingredient3": { + "item": "minecraft:fermented_spider_eye" + }, + "effect": "hexcasting:shrink_grid", + "base_duration_ticks": 3600, + "potency_modifier": 1.0, + "applicable_to_potions": true, + "applicable_to_tipped_arrows": true, + "applicable_to_potion_fillables": true, + "ink_color": "spectrum:green", + "ink_cost": 4, + "fabric:load_conditions": [ + { + "condition": "fabric:all_mods_loaded", + "values": [ + "hexcasting" + ] + } + ] + } \ No newline at end of file From 51bfbef82f0a4208bcbba8ba4d246eb5e3e27e17 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Thu, 21 Nov 2024 03:07:09 -0500 Subject: [PATCH 07/13] Mixin improvements --- .../de/dafuqs/spectrum/mixin/EffectCommandMixin.java | 5 ++--- .../absent/LivingEntityPreventStatusClearMixin.java | 10 ++++------ .../spectrum/status_effects/ImmunityStatusEffect.java | 2 +- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/mixin/EffectCommandMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/EffectCommandMixin.java index 150c6ec8b2..6c7637ffee 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/EffectCommandMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/EffectCommandMixin.java @@ -26,10 +26,9 @@ private static void clearIncurableEffects(ServerCommandSource source, Collection for (StatusEffectInstance effect : living.getStatusEffects()) { if (((Incurable) effect).spectrum$isIncurable()) ((Incurable) effect).spectrum$setIncurable(false); - // manually remove fatal slumber to bypass turning it into eternal slumber - if (effect.getEffectType() == SpectrumStatusEffects.FATAL_SLUMBER) - living.removeStatusEffect(SpectrumStatusEffects.FATAL_SLUMBER); } + // manually remove fatal slumber to bypass turning it into eternal slumber + living.removeStatusEffect(SpectrumStatusEffects.FATAL_SLUMBER); } } diff --git a/src/main/java/de/dafuqs/spectrum/mixin/compat/quilt_status_effect/absent/LivingEntityPreventStatusClearMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/compat/quilt_status_effect/absent/LivingEntityPreventStatusClearMixin.java index 100c2769a8..ce6f3ba318 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/compat/quilt_status_effect/absent/LivingEntityPreventStatusClearMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/compat/quilt_status_effect/absent/LivingEntityPreventStatusClearMixin.java @@ -29,17 +29,15 @@ public abstract class LivingEntityPreventStatusClearMixin { @Shadow public abstract Map getActiveStatusEffects(); - - private boolean hasFatalSlumber = false; @Inject(method = "clearStatusEffects", at = @At("HEAD")) - private void spectrum$detectFatalSlumber(CallbackInfoReturnable cir) { - hasFatalSlumber = getActiveStatusEffects().containsKey(SpectrumStatusEffects.FATAL_SLUMBER); + private void spectrum$detectFatalSlumber(CallbackInfoReturnable cir, @Share("hasFatalSlumber") LocalBooleanRef hasFatalSlumber) { + hasFatalSlumber.set(getActiveStatusEffects().containsKey(SpectrumStatusEffects.FATAL_SLUMBER)); } @Inject(method = "clearStatusEffects", at = @At("TAIL")) - private void spectrum$applyEternalSlumberIfFatalSlumberRemoved(CallbackInfoReturnable cir) { - if (hasFatalSlumber) { + private void spectrum$applyEternalSlumberIfFatalSlumberRemoved(CallbackInfoReturnable cir, @Share("hasFatalSlumber") LocalBooleanRef hasFatalSlumber) { + if (hasFatalSlumber.get()) { addStatusEffect(new StatusEffectInstance(SpectrumStatusEffects.ETERNAL_SLUMBER, 6000)); } } diff --git a/src/main/java/de/dafuqs/spectrum/status_effects/ImmunityStatusEffect.java b/src/main/java/de/dafuqs/spectrum/status_effects/ImmunityStatusEffect.java index 575709c1cb..fa5d71e231 100644 --- a/src/main/java/de/dafuqs/spectrum/status_effects/ImmunityStatusEffect.java +++ b/src/main/java/de/dafuqs/spectrum/status_effects/ImmunityStatusEffect.java @@ -37,7 +37,7 @@ public static void removeNegativeStatusEffects(@NotNull LivingEntity entity) { for (StatusEffectInstance instance : currentEffects) { StatusEffect effectType = instance.getEffectType(); if (effectType.getCategory() == StatusEffectCategory.HARMFUL && !SpectrumStatusEffectTags.bypassesImmunity(effectType)) { - effectsToRemove.add(instance.getEffectType()); + effectsToRemove.add(effectType); } } From 209ad3a7c8daea6dae1ed0364707b830c7636243 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Thu, 21 Nov 2024 10:49:52 -0500 Subject: [PATCH 08/13] Mention potency nerf for brews that use it --- .../resources/assets/spectrum/lang/en_us.json | 1 + .../entries/brewing/potion_workshop_brewing.json | 15 ++++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index 239718f0db..c55a8e6088 100644 --- a/src/main/resources/assets/spectrum/lang/en_us.json +++ b/src/main/resources/assets/spectrum/lang/en_us.json @@ -3557,6 +3557,7 @@ "book.spectrum.guidebook.potion_workshop.page0.text": "The Potion Workshop is so much more than a [#](bb00bb)Brewing Stand[#](): my biggest change was to use the liquid I found in [Mermaid's Gems](entry://general/mermaids_brush) instead of [#](bb00bb)Blaze Powder[#](), which enabled me to [use magic items as additional reagents](entry://brewing/potion_workshop_reagents).\\\n\\\nAnother great side effect is that I do not have to fill the bottles with water beforehand.", "book.spectrum.guidebook.potion_workshop.page1.text": "", "book.spectrum.guidebook.potion_workshop_brewing.low_yield": "*In spite of everything I've tried, this brew has a naturally low yield.*", + "book.spectrum.guidebook.potion_workshop_brewing.low_potency_mod": "*This brew doesn't take well to potency reagents, and requires more than the usual amount to achieve the same increase in strength.*", "book.spectrum.guidebook.potion_workshop_brewing.fillable_only": "*This brew is too concentrated to function as a potion or tipped arrow, and will only be useful for more complex items that can be filled with a potion effect.*", "book.spectrum.guidebook.potion_workshop_brewing.name": "Brewing Potions", "book.spectrum.guidebook.potion_workshop_brewing.page0.text": "I was able to replicate all the potions I could do with the Brewing Stand and more! (though some of them are easier or harder to get enhanced effects from)\\\n\\\nI can use [Reagents](entry://brewing/potion_workshop_reagents) to tinker with their effects.", diff --git a/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/brewing/potion_workshop_brewing.json b/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/brewing/potion_workshop_brewing.json index 64ce0210a9..b1d96aef00 100644 --- a/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/brewing/potion_workshop_brewing.json +++ b/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/brewing/potion_workshop_brewing.json @@ -51,7 +51,8 @@ "type": "modonomicon:advancement", "advancement_id": "spectrum:midgame/brew_potion_in_potion_workshop" }, - "recipe_id": "spectrum:potion_workshop_brewing/absorption" + "recipe_id": "spectrum:potion_workshop_brewing/absorption", + "text": "book.spectrum.guidebook.potion_workshop_brewing.low_potency_mod" }, { "type": "spectrum:potion_workshop_brewing", @@ -108,7 +109,8 @@ "type": "modonomicon:advancement", "advancement_id": "spectrum:unlocks/potions/resistance" }, - "recipe_id": "spectrum:potion_workshop_brewing/resistance" + "recipe_id": "spectrum:potion_workshop_brewing/resistance", + "text": "book.spectrum.guidebook.potion_workshop_brewing.low_potency_mod" }, { "type": "spectrum:potion_workshop_brewing", @@ -117,7 +119,8 @@ "type": "modonomicon:advancement", "advancement_id": "spectrum:unlocks/potions/wither" }, - "recipe_id": "spectrum:potion_workshop_brewing/wither" + "recipe_id": "spectrum:potion_workshop_brewing/wither", + "text": "book.spectrum.guidebook.potion_workshop_brewing.low_potency_mod" }, { "type": "spectrum:potion_workshop_brewing", @@ -135,7 +138,8 @@ "type": "modonomicon:advancement", "advancement_id": "spectrum:unlocks/potions/toughness" }, - "recipe_id": "spectrum:potion_workshop_brewing/toughness" + "recipe_id": "spectrum:potion_workshop_brewing/toughness", + "text": "book.spectrum.guidebook.potion_workshop_brewing.low_potency_mod" }, { "type": "spectrum:potion_workshop_brewing", @@ -180,7 +184,8 @@ "type": "modonomicon:advancement", "advancement_id": "spectrum:unlocks/potions/weak_sleep_effects" }, - "recipe_id": "spectrum:potion_workshop_brewing/somnolence" + "recipe_id": "spectrum:potion_workshop_brewing/somnolence", + "text": "book.spectrum.guidebook.potion_workshop_brewing.low_potency_mod" }, { "type": "spectrum:potion_workshop_brewing", From 95a68e2c7f737e6c8dc740a5f33465e9e6a70122 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Thu, 21 Nov 2024 11:01:38 -0500 Subject: [PATCH 09/13] Remove potency nerf from Absorption --- .../guidebook/entries/brewing/potion_workshop_brewing.json | 3 +-- .../spectrum/recipes/potion_workshop_brewing/absorption.json | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/brewing/potion_workshop_brewing.json b/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/brewing/potion_workshop_brewing.json index b1d96aef00..3aa27e2843 100644 --- a/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/brewing/potion_workshop_brewing.json +++ b/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/brewing/potion_workshop_brewing.json @@ -51,8 +51,7 @@ "type": "modonomicon:advancement", "advancement_id": "spectrum:midgame/brew_potion_in_potion_workshop" }, - "recipe_id": "spectrum:potion_workshop_brewing/absorption", - "text": "book.spectrum.guidebook.potion_workshop_brewing.low_potency_mod" + "recipe_id": "spectrum:potion_workshop_brewing/absorption" }, { "type": "spectrum:potion_workshop_brewing", diff --git a/src/main/resources/data/spectrum/recipes/potion_workshop_brewing/absorption.json b/src/main/resources/data/spectrum/recipes/potion_workshop_brewing/absorption.json index 119845fde9..4c784744aa 100644 --- a/src/main/resources/data/spectrum/recipes/potion_workshop_brewing/absorption.json +++ b/src/main/resources/data/spectrum/recipes/potion_workshop_brewing/absorption.json @@ -8,7 +8,7 @@ }, "effect": "minecraft:absorption", "base_duration_ticks": 1800, - "potency_modifier": 0.5, + "potency_modifier": 1.0, "applicable_to_potions": true, "applicable_to_tipped_arrows": true, "applicable_to_potion_fillables": false, From 87388cc73b1c9d694fb351d3bbb207363b5b55e7 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Fri, 22 Nov 2024 17:15:27 -0500 Subject: [PATCH 10/13] All drinks can now be consumed even at full hunger; slushslide is now a drink --- .../spectrum/items/food/SlushslideItem.java | 24 +++++++++++++++++++ .../registries/SpectrumFoodComponents.java | 16 ++++++------- .../spectrum/registries/SpectrumItems.java | 2 +- 3 files changed, 33 insertions(+), 9 deletions(-) create mode 100644 src/main/java/de/dafuqs/spectrum/items/food/SlushslideItem.java diff --git a/src/main/java/de/dafuqs/spectrum/items/food/SlushslideItem.java b/src/main/java/de/dafuqs/spectrum/items/food/SlushslideItem.java new file mode 100644 index 0000000000..671b325836 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/items/food/SlushslideItem.java @@ -0,0 +1,24 @@ +package de.dafuqs.spectrum.items.food; + +import net.minecraft.client.item.TooltipContext; +import net.minecraft.item.FoodComponent; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.world.World; + +import java.util.List; + +public class SlushslideItem extends DrinkItem { + + public SlushslideItem(Settings settings) { + super(settings); + } + + @Override + public void appendTooltip(ItemStack itemStack, World world, List tooltip, TooltipContext tooltipContext) { + tooltip.add(Text.translatable("item.spectrum.slushslide.tooltip").formatted(Formatting.GRAY)); + super.appendTooltip(itemStack, world, tooltip, tooltipContext); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumFoodComponents.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumFoodComponents.java index e2e5798b6b..7d19655895 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumFoodComponents.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumFoodComponents.java @@ -81,7 +81,7 @@ public class SpectrumFoodComponents { .build(); public static final FoodComponent RESTORATION_TEA = new FoodComponent.Builder() - .hunger(2).saturationModifier(2F) + .hunger(2).saturationModifier(2F).alwaysEdible() .statusEffect(new StatusEffectInstance(SpectrumStatusEffects.IMMUNITY, 1200), 1.0F) .build(); @@ -96,7 +96,7 @@ public class SpectrumFoodComponents { .build(); public static final FoodComponent DEMON_TEA = new FoodComponent.Builder() - .snack().hunger(2).saturationModifier(0.2F) + .snack().hunger(2).saturationModifier(0.2F).alwaysEdible() .statusEffect(new StatusEffectInstance(SpectrumStatusEffects.FRENZY, 800, 1), 2.0F / 3.0F) .build(); @@ -135,7 +135,7 @@ public class SpectrumFoodComponents { .build(); public static final FoodComponent HOT_CHOCOLATE = new FoodComponent.Builder() - .hunger(6).saturationModifier(0.2F) + .hunger(6).saturationModifier(0.2F).alwaysEdible() .statusEffect(new StatusEffectInstance(SpectrumStatusEffects.NOURISHING, 1200), 1.0F) .build(); @@ -144,7 +144,7 @@ public class SpectrumFoodComponents { .build(); public static final FoodComponent KARAK_CHAI = new FoodComponent.Builder() - .hunger(5).saturationModifier(1F) + .hunger(5).saturationModifier(1F).alwaysEdible() .statusEffect(new StatusEffectInstance(SpectrumStatusEffects.CALMING, 2400, 1), 1.0F) .build(); @@ -154,7 +154,7 @@ public class SpectrumFoodComponents { .build(); public static final FoodComponent AZALEA_TEA = new FoodComponent.Builder() - .hunger(2).saturationModifier(0.1F) + .hunger(2).saturationModifier(0.1F).alwaysEdible() .statusEffect(new StatusEffectInstance(SpectrumStatusEffects.SOMNOLENCE, 1200), 1.0F) .build(); @@ -369,7 +369,7 @@ public class SpectrumFoodComponents { .build(); public static final FoodComponent GOLDEN_BRISTLE_TEA = new FoodComponent.Builder() - .hunger(6).saturationModifier(1F) + .hunger(6).saturationModifier(1F).alwaysEdible() .statusEffect(new StatusEffectInstance(StatusEffects.INSTANT_HEALTH), 0.5F) .statusEffect(new StatusEffectInstance(StatusEffects.STRENGTH, 600, 3), 1) .statusEffect(new StatusEffectInstance(StatusEffects.RESISTANCE, 600, 0), 0.5F) @@ -428,7 +428,7 @@ public class SpectrumFoodComponents { .build(); public static final FoodComponent PEACH_CREAM = new FoodComponent.Builder() - .hunger(8).saturationModifier(1F) + .hunger(8).saturationModifier(1F).alwaysEdible() .statusEffect(new StatusEffectInstance(SpectrumStatusEffects.TOUGHNESS, 3000, 1), 1.0F) .build(); @@ -455,7 +455,7 @@ public class SpectrumFoodComponents { .build(); public static final FoodComponent SLUSHSLIDE = new FoodComponent.Builder() - .hunger(9).saturationModifier(0.6F) + .hunger(9).saturationModifier(0.6F).alwaysEdible() .statusEffect(new StatusEffectInstance(SpectrumStatusEffects.SWIFTNESS, 2400, 1), 1.0F) .statusEffect(new StatusEffectInstance(StatusEffects.HASTE, 2400, 1), 1.0F) .build(); diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java index 002c7b98d8..993149442c 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java @@ -397,7 +397,7 @@ public Map getDefaultEnchantments() { public static final Item PEACH_JAM = new Item(IS.of().food(SpectrumFoodComponents.PEACH_JAM)); public static final Item RABBIT_CREAM_PIE = new ItemWithTooltip(IS.of().food(SpectrumFoodComponents.RABBIT_CREAM_PIE), "item.spectrum.rabbit_cream_pie.tooltip"); public static final Item SEDATIVES = new SedativesItem(IS.of().food(SpectrumFoodComponents.SEDATIVES), "item.spectrum.sedatives.tooltip"); - public static final Item SLUSHSLIDE = new ItemWithTooltip(IS.of().food(SpectrumFoodComponents.SLUSHSLIDE), "item.spectrum.slushslide.tooltip"); + public static final Item SLUSHSLIDE = new SlushslideItem(IS.of(16).food(SpectrumFoodComponents.SLUSHSLIDE)); public static final Item SURSTROMMING = new Item(IS.of().food(SpectrumFoodComponents.SURSTROMMING)); public static final Item EVERNECTAR = new EvernectarItem(IS.of(1, Rarity.EPIC).food(SpectrumFoodComponents.EVERNECTAR).recipeRemainder(Items.GLASS_BOTTLE), "item.spectrum.evernectar.tooltip"); From a5b92f835d7a15b7a4f0af5a4af876ac471f0bdc Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Fri, 22 Nov 2024 17:36:07 -0500 Subject: [PATCH 11/13] If an incurable effect consumes all of your remaining immunity duration, it will still be blocked --- src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java index 08cb2f360d..9c7e1bd563 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java @@ -260,7 +260,7 @@ public abstract class LivingEntityMixin { return false; } else { removeStatusEffect(SpectrumStatusEffects.IMMUNITY); - return true; + return false; } } From 39571fd9509330919e506d4bc26334a483d8fe3b Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Fri, 22 Nov 2024 17:36:16 -0500 Subject: [PATCH 12/13] Fix nectar gloves wasting dike while you have immunity --- .../java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java index 9c7e1bd563..e96a84fcb8 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java @@ -523,8 +523,10 @@ private float getToughness() { @Inject(method = "addStatusEffect(Lnet/minecraft/entity/effect/StatusEffectInstance;Lnet/minecraft/entity/Entity;)Z", at = @At("HEAD"), cancellable = true) private void spectrum$modifyOrCancelEffects(StatusEffectInstance effect, Entity source, CallbackInfoReturnable cir) { var entity = (LivingEntity) (Object) this; + var effectType = effect.getEffectType(); - if (AetherGracedNectarGlovesItem.testEffectFor(entity, effect.getEffectType())) { + // trigger gloves only if you don't have immunity, or if you do have immunity but the incoming effect bypasses it + if ((!entity.hasStatusEffect(SpectrumStatusEffects.IMMUNITY) || SpectrumStatusEffectTags.isIn(SpectrumStatusEffectTags.BYPASSES_IMMUNITY, effectType)) && AetherGracedNectarGlovesItem.testEffectFor(entity, effectType)) { var cost = (effect.getAmplifier() + 1) * AetherGracedNectarGlovesItem.HARMFUL_EFFECT_COST; if (Incurable.isIncurable(effect)) @@ -537,13 +539,13 @@ private float getToughness() { } var resistanceModifier = MathHelper.clamp(SleepStatusEffect.getSleepResistance(effect, entity), 0.1F, 10F); - if (effect.getEffectType() == SpectrumStatusEffects.ETERNAL_SLUMBER) { + if (effectType == SpectrumStatusEffects.ETERNAL_SLUMBER) { if (SleepStatusEffect.isImmuneish(entity)) { ((StatusEffectInstanceAccessor) effect).setDuration(Math.round(effect.getDuration() / resistanceModifier)); } else if (!entity.getType().isIn(SpectrumEntityTypeTags.SLEEP_RESISTANT)) { ((StatusEffectInstanceAccessor) effect).setDuration(StatusEffectInstance.INFINITE); } - } else if (effect.getEffectType() == SpectrumStatusEffects.FATAL_SLUMBER) { + } else if (effectType == SpectrumStatusEffects.FATAL_SLUMBER) { if (SleepStatusEffect.isImmuneish(entity) && entity.getType().isIn(ConventionalEntityTypeTags.BOSSES)) { ((StatusEffectInstanceAccessor) effect).setDuration(20 * 60); } From 80e3c2a0b55f759820dd3e8f8cb5e4a8843f6f1a Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Fri, 22 Nov 2024 17:52:12 -0500 Subject: [PATCH 13/13] Tag for effects that should bypass nectar gloves --- .../items/trinkets/AetherGracedNectarGlovesItem.java | 2 +- .../java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java | 2 +- .../spectrum/registries/SpectrumStatusEffectTags.java | 6 ++++++ .../spectrum/tags/mob_effect/bypasses_nectar_gloves.json | 6 ++++++ 4 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/data/spectrum/tags/mob_effect/bypasses_nectar_gloves.json diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/AetherGracedNectarGlovesItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/AetherGracedNectarGlovesItem.java index 69a7fac870..855ef41eea 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/AetherGracedNectarGlovesItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/AetherGracedNectarGlovesItem.java @@ -48,7 +48,7 @@ public static boolean testEffectFor(LivingEntity entity, StatusEffect effect) { if (effect.isBeneficial()) return false; - if (SpectrumStatusEffectTags.isIn(SpectrumStatusEffectTags.SOPORIFIC, effect)) + if (SpectrumStatusEffectTags.bypassesNectarGloves(effect)) return false; var trinkets = TrinketsApi.getTrinketComponent(entity); diff --git a/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java index e96a84fcb8..054c8d1760 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java @@ -526,7 +526,7 @@ private float getToughness() { var effectType = effect.getEffectType(); // trigger gloves only if you don't have immunity, or if you do have immunity but the incoming effect bypasses it - if ((!entity.hasStatusEffect(SpectrumStatusEffects.IMMUNITY) || SpectrumStatusEffectTags.isIn(SpectrumStatusEffectTags.BYPASSES_IMMUNITY, effectType)) && AetherGracedNectarGlovesItem.testEffectFor(entity, effectType)) { + if ((!entity.hasStatusEffect(SpectrumStatusEffects.IMMUNITY) || SpectrumStatusEffectTags.bypassesImmunity(effectType)) && AetherGracedNectarGlovesItem.testEffectFor(entity, effectType)) { var cost = (effect.getAmplifier() + 1) * AetherGracedNectarGlovesItem.HARMFUL_EFFECT_COST; if (Incurable.isIncurable(effect)) diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumStatusEffectTags.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumStatusEffectTags.java index 513a8e2b61..a6e10998ea 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumStatusEffectTags.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumStatusEffectTags.java @@ -9,6 +9,7 @@ public class SpectrumStatusEffectTags { public static TagKey BYPASSES_WHISPY_CIRCLET; + public static TagKey BYPASSES_NECTAR_GLOVES; public static TagKey BYPASSES_IMMUNITY; public static TagKey NO_DURATION_EXTENSION; public static TagKey SOPORIFIC; @@ -16,6 +17,7 @@ public class SpectrumStatusEffectTags { public static void register() { BYPASSES_WHISPY_CIRCLET = of("bypasses_whispy_circlet"); + BYPASSES_NECTAR_GLOVES = of("bypasses_nectar_gloves"); BYPASSES_IMMUNITY = of("bypasses_immunity"); NO_DURATION_EXTENSION = of("no_duration_extension"); SOPORIFIC = of("soporific"); @@ -33,6 +35,10 @@ public static boolean isIn(TagKey tag, StatusEffect effect) { public static boolean bypassesImmunity(StatusEffect statusEffect) { return isIn(SpectrumStatusEffectTags.BYPASSES_IMMUNITY, statusEffect); } + + public static boolean bypassesNectarGloves(StatusEffect statusEffect) { + return isIn(SpectrumStatusEffectTags.BYPASSES_NECTAR_GLOVES, statusEffect); + } public static boolean bypassesWhispyCirclet(StatusEffect statusEffect) { return isIn(SpectrumStatusEffectTags.BYPASSES_WHISPY_CIRCLET, statusEffect); diff --git a/src/main/resources/data/spectrum/tags/mob_effect/bypasses_nectar_gloves.json b/src/main/resources/data/spectrum/tags/mob_effect/bypasses_nectar_gloves.json new file mode 100644 index 0000000000..5a9c10e21f --- /dev/null +++ b/src/main/resources/data/spectrum/tags/mob_effect/bypasses_nectar_gloves.json @@ -0,0 +1,6 @@ +{ + "values": [ + "#spectrum:soporific" + ] + } + \ No newline at end of file