package org.saturnclient.impl.mixins; import org.saturnclient.common.ref.asset.IdentifierRef; import org.saturnclient.common.ref.asset.SpriteRef; import org.saturnclient.common.ref.game.EffectRef; //? if <1.21.9 //import org.saturnclient.saturnclient.SaturnClient; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import net.minecraft.client.gui.Gui; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.core.Holder; import net.minecraft.resources.Identifier; @Mixin(MobEffectInstance.class) public abstract class StatusEffectMixin implements EffectRef { @Shadow public abstract boolean showIcon(); @Shadow public abstract boolean isInfiniteDuration(); @Shadow public abstract int getDuration(); @Shadow public abstract Holder getEffect(); // EffectRef's methods delegate to MobEffectInstance's, whose names production renames. @Override public boolean shouldShowIcon() { return showIcon(); } @Override public boolean isInfinite() { return isInfiniteDuration(); } @Override public SpriteRef getIcon() { // 1.21.9 changed the GUI atlas, so newer versions draw the effect's texture (getIconId) instead. //? if >=1.21.9 { return null; //?} else if >=1.21.6 { //return (SpriteRef) SaturnClient.client.getGuiSprites().getSprite((Gui.getMobEffectSprite(getEffect()))); //?} else //return (SpriteRef) SaturnClient.client.getMobEffectTextures().get(getEffect()); } // Before 1.21.6 there's no InGameHud.getEffectTexture; getIcon's sprite is used there instead. //? if >=1.21.6 { @Override public IdentifierRef getIconId() { Identifier id = Gui.getMobEffectSprite(getEffect()); return IdentifierRef.of(id.getNamespace(), "textures/" + id.getPath() + ".png"); } //?} @Override public String getInfiniteText() { return "∞"; } @Override public int getDurationSeconds() { return getDuration() / 20; // ticks → seconds } }