Визуальная часть HealingHelper aka InventoryHighlight | Forge 1.16.5

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
6 Дек 2023
Сообщения
507
Реакции
3
Выберите загрузчик игры
  1. Forge
  2. ForgeOptiFine
Всем ку, видел когда то сливали какой то галимый аналог, который в 2д криво рисовал мигание, поэтому сливаю

Java:
Expand Collapse Copy
package ru.luminar.feature.functions.impl.utils;

import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.item.PotionItem;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;
import net.minecraft.potion.PotionUtils;
import ru.luminar.feature.functions.Category;
import ru.luminar.feature.functions.Function;
import ru.luminar.feature.functions.settings.impl.BooleanSetting;
import ru.luminar.feature.functions.settings.impl.SliderSetting;

import java.util.List;

public class HealingHelper extends Function {
    private final BooleanSetting gapple = new BooleanSetting("Золотое Яблоко", true);
    private final BooleanSetting charka = new BooleanSetting("Чарка", true);
    private final BooleanSetting heal = new BooleanSetting("Исцел", true);
    private final BooleanSetting morkva = new BooleanSetting("Золотая морковь", true);

    SliderSetting gapplePorog = new SliderSetting("Порог для гэппла",14,2,20,0.5f).setVisible(() -> gapple.get());
    SliderSetting charkaPorog = new SliderSetting("Порог для чарки",12,2,20,0.5f).setVisible(() -> charka.get());
    SliderSetting healPorog = new SliderSetting("Порог для хилки",10,2,20,0.5f).setVisible(() -> heal.get());
    SliderSetting morkvaPorog = new SliderSetting("Сытость для морковки",18,2,20,0.5f).setVisible(() -> morkva.get());

    public HealingHelper() {
        super("HealingHelper", Category.Utils);
        addSettings(charka,charkaPorog,gapple,gapplePorog,heal,healPorog,morkva,morkvaPorog);

    }

    public boolean shouldHightLight(ItemStack stack) {
        Item item = stack.getItem();

        float hp = mc.player.getHealth() + mc.player.getAbsorptionAmount();

        if (stack.getItem() instanceof PotionItem && heal.get() && hp < healPorog.get()) {
            List<EffectInstance> effects = PotionUtils.getCustomEffects(stack);
            for (EffectInstance effect : effects) {
                if (effect.getEffect() == Effects.HEAL) {
                    return true;
                }
            }
            List<EffectInstance> effects2 = PotionUtils.getAllEffects(stack.getTag());
            for (EffectInstance effect1 : effects2) {
                if (effect1.getEffect() == Effects.HEAL) {
                    return true;
                }
            }
        }
        if (gapple.get() && item == Items.GOLDEN_APPLE) {
            if (hp < gapplePorog.get()) {
                return true;
            }
        }
        if (charka.get() && item == Items.ENCHANTED_GOLDEN_APPLE) {
            if (hp < charkaPorog.get()) {
                return true;
            }
        }
        if (morkva.get() && item == Items.GOLDEN_CARROT) {
            if (mc.player.getFoodData().getFoodLevel() < morkvaPorog.get()) {
                return true;
            }
        }

        return false;
    }
}


И миксин
Java:
Expand Collapse Copy
package ru.luminar.mixins.functions;

import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.IngameGui;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.CooldownTracker;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import ru.luminar.Luminar;
import ru.luminar.utils.ICooldownTrackerAccessor;
import ru.luminar.utils.SlotPos;
import ru.luminar.utils.animations.Animation;
import ru.luminar.utils.animations.Direction;
import ru.luminar.utils.animations.impl.DecelerateAnimation;

import java.util.HashMap;
import java.util.Map;

import static net.minecraft.client.gui.AbstractGui.fill;

@Mixin(IngameGui.class)
public abstract class HealingHelperMixin {

    private final Map<SlotPos, Animation> slotAnimations = new HashMap<>();

    @Inject(method = "renderSlot", at = @At("HEAD"))
    private void onRenderSlotPre(int x, int y, float partialTicks, PlayerEntity player, ItemStack stack, CallbackInfo ci) {
        if (!stack.isEmpty() && (Luminar.instance.functions.healingHelper.isEnabled() && Luminar.instance.functions.healingHelper.shouldHightLight(stack))) {
            SlotPos pos = new SlotPos(x, y);
            Animation anim = slotAnimations.computeIfAbsent(
                    pos,
                    k -> new DecelerateAnimation(250, 0.5,Direction.FORWARDS)
            );

            if (anim.isDone()) {
                anim.setDirection(anim.getDirection().opposite());
            }
        }
    }

    @Inject(method = "renderSlot", at = @At(value = "INVOKE",
            target = "Lnet/minecraft/client/renderer/ItemRenderer;renderGuiItemDecorations(Lnet/minecraft/client/gui/FontRenderer;Lnet/minecraft/item/ItemStack;II)V",
            shift = At.Shift.AFTER))
    private void onRenderItemPost(int x, int y, float partialTicks, PlayerEntity player, ItemStack stack, CallbackInfo ci) {
        if (!stack.isEmpty() && (Luminar.instance.functions.healingHelper.isEnabled() && Luminar.instance.functions.healingHelper.shouldHightLight(stack))) {
            Animation anim = slotAnimations.get(new SlotPos(x, y));
            if (anim != null) {
                int color = Luminar.instance.styleManager.getCurrentStyle().getColor(90);
                float alpha = (float) anim.getOutput();

                RenderSystem.enableBlend();
                RenderSystem.defaultBlendFunc();
                RenderSystem.disableDepthTest();

                fill(new MatrixStack(), x, y, x+16, y+16, (color & 0x00FFFFFF) | ((int)(alpha * 255) << 24));

                RenderSystem.enableDepthTest();
            }
        }
    }
}

И класс для позиций слота проста
Java:
Expand Collapse Copy
package ru.luminar.utils;

import java.util.Objects;

public class SlotPos {
final int x, y;

    public SlotPos(int x, int y) {
this.x = x;
        this.y = y;
    }

@Override
    public boolean equals(Object o) {
if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        SlotPos slotPos = (SlotPos) o;
        return x == slotPos.x && y == slotPos.y;
    }

@Override
    public int hashCode() {
return Objects.hash(x, y);
    }
}

Если кому-то будет нужно - тот усовершенствует и сделает так же для инвентаря

ПЕРЕНЕСТИ НА ЭКСПУ НЕ ПОМОГУ
UPD: Я неправильно кинул класс SlotPos, а так же забыл прикрепить SS
SS =
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
Всем ку, видел когда то сливали какой то галимый аналог, который в 2д криво рисовал мигание, поэтому сливаю

Java:
Expand Collapse Copy
package ru.luminar.feature.functions.impl.utils;

import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.item.PotionItem;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;
import net.minecraft.potion.PotionUtils;
import ru.luminar.feature.functions.Category;
import ru.luminar.feature.functions.Function;
import ru.luminar.feature.functions.settings.impl.BooleanSetting;
import ru.luminar.feature.functions.settings.impl.SliderSetting;

import java.util.List;

public class HealingHelper extends Function {
    private final BooleanSetting gapple = new BooleanSetting("Золотое Яблоко", true);
    private final BooleanSetting charka = new BooleanSetting("Чарка", true);
    private final BooleanSetting heal = new BooleanSetting("Исцел", true);
    private final BooleanSetting morkva = new BooleanSetting("Золотая морковь", true);

    SliderSetting gapplePorog = new SliderSetting("Порог для гэппла",14,2,20,0.5f).setVisible(() -> gapple.get());
    SliderSetting charkaPorog = new SliderSetting("Порог для чарки",12,2,20,0.5f).setVisible(() -> charka.get());
    SliderSetting healPorog = new SliderSetting("Порог для хилки",10,2,20,0.5f).setVisible(() -> heal.get());
    SliderSetting morkvaPorog = new SliderSetting("Сытость для морковки",18,2,20,0.5f).setVisible(() -> morkva.get());

    public HealingHelper() {
        super("HealingHelper", Category.Utils);
        addSettings(charka,charkaPorog,gapple,gapplePorog,heal,healPorog,morkva,morkvaPorog);

    }

    public boolean shouldHightLight(ItemStack stack) {
        Item item = stack.getItem();

        float hp = mc.player.getHealth() + mc.player.getAbsorptionAmount();

        if (stack.getItem() instanceof PotionItem && heal.get() && hp < healPorog.get()) {
            List<EffectInstance> effects = PotionUtils.getCustomEffects(stack);
            for (EffectInstance effect : effects) {
                if (effect.getEffect() == Effects.HEAL) {
                    return true;
                }
            }
            List<EffectInstance> effects2 = PotionUtils.getAllEffects(stack.getTag());
            for (EffectInstance effect1 : effects2) {
                if (effect1.getEffect() == Effects.HEAL) {
                    return true;
                }
            }
        }
        if (gapple.get() && item == Items.GOLDEN_APPLE) {
            if (hp < gapplePorog.get()) {
                return true;
            }
        }
        if (charka.get() && item == Items.ENCHANTED_GOLDEN_APPLE) {
            if (hp < charkaPorog.get()) {
                return true;
            }
        }
        if (morkva.get() && item == Items.GOLDEN_CARROT) {
            if (mc.player.getFoodData().getFoodLevel() < morkvaPorog.get()) {
                return true;
            }
        }

        return false;
    }
}


И миксин
Java:
Expand Collapse Copy
package ru.luminar.mixins.functions;

import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.IngameGui;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.CooldownTracker;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import ru.luminar.Luminar;
import ru.luminar.utils.ICooldownTrackerAccessor;
import ru.luminar.utils.SlotPos;
import ru.luminar.utils.animations.Animation;
import ru.luminar.utils.animations.Direction;
import ru.luminar.utils.animations.impl.DecelerateAnimation;

import java.util.HashMap;
import java.util.Map;

import static net.minecraft.client.gui.AbstractGui.fill;

@Mixin(IngameGui.class)
public abstract class HealingHelperMixin {

    private final Map<SlotPos, Animation> slotAnimations = new HashMap<>();

    @Inject(method = "renderSlot", at = @At("HEAD"))
    private void onRenderSlotPre(int x, int y, float partialTicks, PlayerEntity player, ItemStack stack, CallbackInfo ci) {
        if (!stack.isEmpty() && (Luminar.instance.functions.healingHelper.isEnabled() && Luminar.instance.functions.healingHelper.shouldHightLight(stack))) {
            SlotPos pos = new SlotPos(x, y);
            Animation anim = slotAnimations.computeIfAbsent(
                    pos,
                    k -> new DecelerateAnimation(250, 0.5,Direction.FORWARDS)
            );

            if (anim.isDone()) {
                anim.setDirection(anim.getDirection().opposite());
            }
        }
    }

    @Inject(method = "renderSlot", at = @At(value = "INVOKE",
            target = "Lnet/minecraft/client/renderer/ItemRenderer;renderGuiItemDecorations(Lnet/minecraft/client/gui/FontRenderer;Lnet/minecraft/item/ItemStack;II)V",
            shift = At.Shift.AFTER))
    private void onRenderItemPost(int x, int y, float partialTicks, PlayerEntity player, ItemStack stack, CallbackInfo ci) {
        if (!stack.isEmpty() && (Luminar.instance.functions.healingHelper.isEnabled() && Luminar.instance.functions.healingHelper.shouldHightLight(stack))) {
            Animation anim = slotAnimations.get(new SlotPos(x, y));
            if (anim != null) {
                int color = Luminar.instance.styleManager.getCurrentStyle().getColor(90);
                float alpha = (float) anim.getOutput();

                RenderSystem.enableBlend();
                RenderSystem.defaultBlendFunc();
                RenderSystem.disableDepthTest();

                fill(new MatrixStack(), x, y, x+16, y+16, (color & 0x00FFFFFF) | ((int)(alpha * 255) << 24));

                RenderSystem.enableDepthTest();
            }
        }
    }
}

И класс для позиций слота проста
Java:
Expand Collapse Copy
package ru.luminar.utils;

public class SlotPos {
    final int x, y;

    public SlotPos(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

Если кому-то будет нужно - тот усовершенствует и сделает так же для инвентаря

ПЕРЕНЕСТИ НА ЭКСПУ НЕ ПОМОГУ
стоп миксин на фабрик это я что то не знаю?
 
Всем ку, видел когда то сливали какой то галимый аналог, который в 2д криво рисовал мигание, поэтому сливаю

Java:
Expand Collapse Copy
package ru.luminar.feature.functions.impl.utils;

import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.item.PotionItem;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;
import net.minecraft.potion.PotionUtils;
import ru.luminar.feature.functions.Category;
import ru.luminar.feature.functions.Function;
import ru.luminar.feature.functions.settings.impl.BooleanSetting;
import ru.luminar.feature.functions.settings.impl.SliderSetting;

import java.util.List;

public class HealingHelper extends Function {
    private final BooleanSetting gapple = new BooleanSetting("Золотое Яблоко", true);
    private final BooleanSetting charka = new BooleanSetting("Чарка", true);
    private final BooleanSetting heal = new BooleanSetting("Исцел", true);
    private final BooleanSetting morkva = new BooleanSetting("Золотая морковь", true);

    SliderSetting gapplePorog = new SliderSetting("Порог для гэппла",14,2,20,0.5f).setVisible(() -> gapple.get());
    SliderSetting charkaPorog = new SliderSetting("Порог для чарки",12,2,20,0.5f).setVisible(() -> charka.get());
    SliderSetting healPorog = new SliderSetting("Порог для хилки",10,2,20,0.5f).setVisible(() -> heal.get());
    SliderSetting morkvaPorog = new SliderSetting("Сытость для морковки",18,2,20,0.5f).setVisible(() -> morkva.get());

    public HealingHelper() {
        super("HealingHelper", Category.Utils);
        addSettings(charka,charkaPorog,gapple,gapplePorog,heal,healPorog,morkva,morkvaPorog);

    }

    public boolean shouldHightLight(ItemStack stack) {
        Item item = stack.getItem();

        float hp = mc.player.getHealth() + mc.player.getAbsorptionAmount();

        if (stack.getItem() instanceof PotionItem && heal.get() && hp < healPorog.get()) {
            List<EffectInstance> effects = PotionUtils.getCustomEffects(stack);
            for (EffectInstance effect : effects) {
                if (effect.getEffect() == Effects.HEAL) {
                    return true;
                }
            }
            List<EffectInstance> effects2 = PotionUtils.getAllEffects(stack.getTag());
            for (EffectInstance effect1 : effects2) {
                if (effect1.getEffect() == Effects.HEAL) {
                    return true;
                }
            }
        }
        if (gapple.get() && item == Items.GOLDEN_APPLE) {
            if (hp < gapplePorog.get()) {
                return true;
            }
        }
        if (charka.get() && item == Items.ENCHANTED_GOLDEN_APPLE) {
            if (hp < charkaPorog.get()) {
                return true;
            }
        }
        if (morkva.get() && item == Items.GOLDEN_CARROT) {
            if (mc.player.getFoodData().getFoodLevel() < morkvaPorog.get()) {
                return true;
            }
        }

        return false;
    }
}


И миксин
Java:
Expand Collapse Copy
package ru.luminar.mixins.functions;

import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.IngameGui;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.CooldownTracker;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import ru.luminar.Luminar;
import ru.luminar.utils.ICooldownTrackerAccessor;
import ru.luminar.utils.SlotPos;
import ru.luminar.utils.animations.Animation;
import ru.luminar.utils.animations.Direction;
import ru.luminar.utils.animations.impl.DecelerateAnimation;

import java.util.HashMap;
import java.util.Map;

import static net.minecraft.client.gui.AbstractGui.fill;

@Mixin(IngameGui.class)
public abstract class HealingHelperMixin {

    private final Map<SlotPos, Animation> slotAnimations = new HashMap<>();

    @Inject(method = "renderSlot", at = @At("HEAD"))
    private void onRenderSlotPre(int x, int y, float partialTicks, PlayerEntity player, ItemStack stack, CallbackInfo ci) {
        if (!stack.isEmpty() && (Luminar.instance.functions.healingHelper.isEnabled() && Luminar.instance.functions.healingHelper.shouldHightLight(stack))) {
            SlotPos pos = new SlotPos(x, y);
            Animation anim = slotAnimations.computeIfAbsent(
                    pos,
                    k -> new DecelerateAnimation(250, 0.5,Direction.FORWARDS)
            );

            if (anim.isDone()) {
                anim.setDirection(anim.getDirection().opposite());
            }
        }
    }

    @Inject(method = "renderSlot", at = @At(value = "INVOKE",
            target = "Lnet/minecraft/client/renderer/ItemRenderer;renderGuiItemDecorations(Lnet/minecraft/client/gui/FontRenderer;Lnet/minecraft/item/ItemStack;II)V",
            shift = At.Shift.AFTER))
    private void onRenderItemPost(int x, int y, float partialTicks, PlayerEntity player, ItemStack stack, CallbackInfo ci) {
        if (!stack.isEmpty() && (Luminar.instance.functions.healingHelper.isEnabled() && Luminar.instance.functions.healingHelper.shouldHightLight(stack))) {
            Animation anim = slotAnimations.get(new SlotPos(x, y));
            if (anim != null) {
                int color = Luminar.instance.styleManager.getCurrentStyle().getColor(90);
                float alpha = (float) anim.getOutput();

                RenderSystem.enableBlend();
                RenderSystem.defaultBlendFunc();
                RenderSystem.disableDepthTest();

                fill(new MatrixStack(), x, y, x+16, y+16, (color & 0x00FFFFFF) | ((int)(alpha * 255) << 24));

                RenderSystem.enableDepthTest();
            }
        }
    }
}

И класс для позиций слота проста
Java:
Expand Collapse Copy
package ru.luminar.utils;

public class SlotPos {
    final int x, y;

    public SlotPos(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

Если кому-то будет нужно - тот усовершенствует и сделает так же для инвентаря

ПЕРЕНЕСТИ НА ЭКСПУ НЕ ПОМОГУ
cc?
 
Всем ку, видел когда то сливали какой то галимый аналог, который в 2д криво рисовал мигание, поэтому сливаю

Java:
Expand Collapse Copy
package ru.luminar.feature.functions.impl.utils;

import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.item.PotionItem;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;
import net.minecraft.potion.PotionUtils;
import ru.luminar.feature.functions.Category;
import ru.luminar.feature.functions.Function;
import ru.luminar.feature.functions.settings.impl.BooleanSetting;
import ru.luminar.feature.functions.settings.impl.SliderSetting;

import java.util.List;

public class HealingHelper extends Function {
    private final BooleanSetting gapple = new BooleanSetting("Золотое Яблоко", true);
    private final BooleanSetting charka = new BooleanSetting("Чарка", true);
    private final BooleanSetting heal = new BooleanSetting("Исцел", true);
    private final BooleanSetting morkva = new BooleanSetting("Золотая морковь", true);

    SliderSetting gapplePorog = new SliderSetting("Порог для гэппла",14,2,20,0.5f).setVisible(() -> gapple.get());
    SliderSetting charkaPorog = new SliderSetting("Порог для чарки",12,2,20,0.5f).setVisible(() -> charka.get());
    SliderSetting healPorog = new SliderSetting("Порог для хилки",10,2,20,0.5f).setVisible(() -> heal.get());
    SliderSetting morkvaPorog = new SliderSetting("Сытость для морковки",18,2,20,0.5f).setVisible(() -> morkva.get());

    public HealingHelper() {
        super("HealingHelper", Category.Utils);
        addSettings(charka,charkaPorog,gapple,gapplePorog,heal,healPorog,morkva,morkvaPorog);

    }

    public boolean shouldHightLight(ItemStack stack) {
        Item item = stack.getItem();

        float hp = mc.player.getHealth() + mc.player.getAbsorptionAmount();

        if (stack.getItem() instanceof PotionItem && heal.get() && hp < healPorog.get()) {
            List<EffectInstance> effects = PotionUtils.getCustomEffects(stack);
            for (EffectInstance effect : effects) {
                if (effect.getEffect() == Effects.HEAL) {
                    return true;
                }
            }
            List<EffectInstance> effects2 = PotionUtils.getAllEffects(stack.getTag());
            for (EffectInstance effect1 : effects2) {
                if (effect1.getEffect() == Effects.HEAL) {
                    return true;
                }
            }
        }
        if (gapple.get() && item == Items.GOLDEN_APPLE) {
            if (hp < gapplePorog.get()) {
                return true;
            }
        }
        if (charka.get() && item == Items.ENCHANTED_GOLDEN_APPLE) {
            if (hp < charkaPorog.get()) {
                return true;
            }
        }
        if (morkva.get() && item == Items.GOLDEN_CARROT) {
            if (mc.player.getFoodData().getFoodLevel() < morkvaPorog.get()) {
                return true;
            }
        }

        return false;
    }
}


И миксин
Java:
Expand Collapse Copy
package ru.luminar.mixins.functions;

import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.IngameGui;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.CooldownTracker;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import ru.luminar.Luminar;
import ru.luminar.utils.ICooldownTrackerAccessor;
import ru.luminar.utils.SlotPos;
import ru.luminar.utils.animations.Animation;
import ru.luminar.utils.animations.Direction;
import ru.luminar.utils.animations.impl.DecelerateAnimation;

import java.util.HashMap;
import java.util.Map;

import static net.minecraft.client.gui.AbstractGui.fill;

@Mixin(IngameGui.class)
public abstract class HealingHelperMixin {

    private final Map<SlotPos, Animation> slotAnimations = new HashMap<>();

    @Inject(method = "renderSlot", at = @At("HEAD"))
    private void onRenderSlotPre(int x, int y, float partialTicks, PlayerEntity player, ItemStack stack, CallbackInfo ci) {
        if (!stack.isEmpty() && (Luminar.instance.functions.healingHelper.isEnabled() && Luminar.instance.functions.healingHelper.shouldHightLight(stack))) {
            SlotPos pos = new SlotPos(x, y);
            Animation anim = slotAnimations.computeIfAbsent(
                    pos,
                    k -> new DecelerateAnimation(250, 0.5,Direction.FORWARDS)
            );

            if (anim.isDone()) {
                anim.setDirection(anim.getDirection().opposite());
            }
        }
    }

    @Inject(method = "renderSlot", at = @At(value = "INVOKE",
            target = "Lnet/minecraft/client/renderer/ItemRenderer;renderGuiItemDecorations(Lnet/minecraft/client/gui/FontRenderer;Lnet/minecraft/item/ItemStack;II)V",
            shift = At.Shift.AFTER))
    private void onRenderItemPost(int x, int y, float partialTicks, PlayerEntity player, ItemStack stack, CallbackInfo ci) {
        if (!stack.isEmpty() && (Luminar.instance.functions.healingHelper.isEnabled() && Luminar.instance.functions.healingHelper.shouldHightLight(stack))) {
            Animation anim = slotAnimations.get(new SlotPos(x, y));
            if (anim != null) {
                int color = Luminar.instance.styleManager.getCurrentStyle().getColor(90);
                float alpha = (float) anim.getOutput();

                RenderSystem.enableBlend();
                RenderSystem.defaultBlendFunc();
                RenderSystem.disableDepthTest();

                fill(new MatrixStack(), x, y, x+16, y+16, (color & 0x00FFFFFF) | ((int)(alpha * 255) << 24));

                RenderSystem.enableDepthTest();
            }
        }
    }
}

И класс для позиций слота проста
Java:
Expand Collapse Copy
package ru.luminar.utils;

public class SlotPos {
    final int x, y;

    public SlotPos(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

Если кому-то будет нужно - тот усовершенствует и сделает так же для инвентаря

ПЕРЕНЕСТИ НА ЭКСПУ НЕ ПОМОГУ
спиздил с темы cons0leweb'a
 
извиняюсь если не шарю, но это кто?
он вот это сливал
1754667840401.png


я чекнул код, там чет даже не похоже на мой
 
а началось то все с моей темы
 
Fabric и Forge можно считать братья и используют они один и тот же фреймворк - Mixin, от SpongePowered
считать их братьями тоже самое что сказать ручка и машина одно и тоже
 

Похожие темы

Назад
Сверху Снизу