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/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/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/EffectCommandMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/EffectCommandMixin.java index baf656d2d0..6c7637ffee 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; @@ -26,6 +27,8 @@ private static void clearIncurableEffects(ServerCommandSource source, Collection if (((Incurable) effect).spectrum$isIncurable()) ((Incurable) effect).spectrum$setIncurable(false); } + // 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/LivingEntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java index 76145fd782..054c8d1760 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java @@ -227,21 +227,48 @@ 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 (Incurable.isIncurable(statusEffectInstance)) { + // 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())) { + // 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 { + removeStatusEffect(SpectrumStatusEffects.IMMUNITY); + return false; } - else { - 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; @@ -496,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.bypassesImmunity(effectType)) && AetherGracedNectarGlovesItem.testEffectFor(entity, effectType)) { var cost = (effect.getAmplifier() + 1) * AetherGracedNectarGlovesItem.HARMFUL_EFFECT_COST; if (Incurable.isIncurable(effect)) @@ -510,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); } 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..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 @@ -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,22 +23,40 @@ public abstract class LivingEntityPreventStatusClearMixin { @Shadow public abstract void remove(Entity.RemovalReason reason); - + + @Shadow + public abstract boolean addStatusEffect(StatusEffectInstance effect); + + @Shadow + public abstract Map getActiveStatusEffects(); + + @Inject(method = "clearStatusEffects", at = @At("HEAD")) + 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, @Share("hasFatalSlumber") LocalBooleanRef hasFatalSlumber) { + if (hasFatalSlumber.get()) { + 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)) { 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; } 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"); diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumStatusEffectTags.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumStatusEffectTags.java index a819297a86..a6e10998ea 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumStatusEffectTags.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumStatusEffectTags.java @@ -8,15 +8,17 @@ public class SpectrumStatusEffectTags { - public static TagKey NO_EFFECT_CLEAR; - public static TagKey IMMUNITY_IMMUNE; + 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; 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_NECTAR_GLOVES = of("bypasses_nectar_gloves"); + BYPASSES_IMMUNITY = of("bypasses_immunity"); NO_DURATION_EXTENSION = of("no_duration_extension"); SOPORIFIC = of("soporific"); NIGHT_ALCHEMY = of("night_alchemy"); @@ -30,12 +32,16 @@ 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 bypassesNectarGloves(StatusEffect statusEffect) { + return isIn(SpectrumStatusEffectTags.BYPASSES_NECTAR_GLOVES, 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..fa5d71e231 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(effectType); + } + } + + for (StatusEffect effect : effectsToRemove) { + entity.removeStatusEffect(effect); + } } } \ No newline at end of file diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index 217f1a025e..c55a8e6088 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.*", @@ -3556,16 +3557,17 @@ "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.", - "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.", "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", 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..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 @@ -108,7 +108,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 +118,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 +137,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 +183,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", 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 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, 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_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 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" - ] -}