Начинающий
- Статус
- Оффлайн
- Регистрация
- 6 Дек 2023
- Сообщения
- 507
- Реакции
- 3
- Выберите загрузчик игры
- Forge
- ForgeOptiFine
Всем ку, видел когда то сливали какой то галимый аналог, который в 2д криво рисовал мигание, поэтому сливаю
И миксин
И класс для позиций слота проста
Если кому-то будет нужно - тот усовершенствует и сделает так же для инвентаря
ПЕРЕНЕСТИ НА ЭКСПУ НЕ ПОМОГУ
UPD: Я неправильно кинул класс SlotPos, а так же забыл прикрепить SS
SS =
Java:
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:
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:
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 =
Пожалуйста, авторизуйтесь для просмотра ссылки.
Последнее редактирование: