Fabric 1.20.6 Mixin на повышение hp игрока в режиме выживания

Версия Minecraft
1.20.6
API
Fabric
Нужно:
Увеличить максимальное здоровье игрока до 30 в режиме выживания.

Пробовал через @Inject и MinecraftClient - безрезультно.
Такое запускается но не дает желаемое:
Java:
import net.djjoyyes.stiks.STIKS_Mod;
import net.minecraft.entity.player.PlayerEntity;

import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyVariable;

@Mixin(PlayerEntity.class)
public abstract class MixinPlayerEntity {

    // Метод, который изменяет максимальное здоровье (30 вместо стандартных 20)
    @ModifyVariable(
        method = "<init>(Lnet/minecraft/entity/Type;Lnet/minecraft/world/World;)V",
        at = @At("HEAD"),
        ordinal = 0
    )
    private static float modifyMaxHealth(float originalValue) {
        STIKS_Mod.LOGGER.info("MAXHP30");
        return 30.0F;
    }
}

Остановился на этом, оно крашится при запуске, но выглядит наиболее подходящим:

Java:
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.hud.InGameHud;
import net.minecraft.entity.player.PlayerEntity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyVariable;

@Mixin(InGameHud.class)
public class HudMixin {
    @ModifyVariable(
            method = "net/minecraft/entity/player/PlayerEntity;",
            at = @At("HEAD"), ordinal = 0)
    private void renderHealthBar(DrawContext dc, PlayerEntity player, int i1, int i2, int i3, int i4, float hp, int i5, int i6, int i7, boolean bool) {
        //this.renderHealthBar(dc, player, i1, i2, i3, i4, 30.0F, i5, i6, i7, bool);
        hp = 30.0F;
    }
}

Ошибка:
[m[34m[11:01:53][m [31m[Render thread/ERROR][m [36m(FabricLoader/Mixin)[m [31mMixin apply for mod stiks_mod failed stiks_mod.mixins.json:HudMixin from mod stiks_mod -> net.minecraft.client.gui.hud.InGameHud: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException @ModifyVariable annotation on renderHealthBar, has invalid target descriptor: Invalid owner: net/minecraft/entity/player/PlayerEntity;. No refMap loaded. [INJECT_PREPARE Applicator Phase -> stiks_mod.mixins.json:HudMixin from mod stiks_mod -> Prepare Injections -> localvar$zjb000$stiks_mod$renderHealthBar(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/entity/player/PlayerEntity;IIIIFIIIZ)V -> Parse -> -> Parse Selectors]
[m org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException: @ModifyVariable annotation on renderHealthBar, has invalid target descriptor: Invalid owner: net/minecraft/entity/player/PlayerEntity;. No refMap loaded. [INJECT_PREPARE Applicator Phase -> stiks_mod.mixins.json:HudMixin from mod stiks_mod -> Prepare Injections -> localvar$zjb000$stiks_mod$renderHealthBar(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/entity/player/PlayerEntity;IIIIFIIIZ)V -> Parse -> -> Parse Selectors]
 
Краш-лог
[m[34m[11:01:53][m [31m[Render thread/ERROR][m [36m(FabricLoader/Mixin)[m [31mMixin apply for mod stiks_mod failed stiks_mod.mixins.json:HudMixin from mod stiks_mod -> net.minecraft.client.gui.hud.InGameHud: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException @ModifyVariable annotation on renderHealthBar, has invalid target descriptor: Invalid owner: net/minecraft/entity/player/PlayerEntity;. No refMap loaded. [INJECT_PREPARE Applicator Phase -> stiks_mod.mixins.json:HudMixin from mod stiks_mod -> Prepare Injections -> localvar$zjb000$stiks_mod$renderHealthBar(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/entity/player/PlayerEntity;IIIIFIIIZ)V -> Parse ->  -> Parse Selectors]
[m org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException: @ModifyVariable annotation on renderHealthBar, has invalid target descriptor: Invalid owner: net/minecraft/entity/player/PlayerEntity;. No refMap loaded. [INJECT_PREPARE Applicator Phase -> stiks_mod.mixins.json:HudMixin from mod stiks_mod -> Prepare Injections -> localvar$zjb000$stiks_mod$renderHealthBar(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/entity/player/PlayerEntity;IIIIFIIIZ)V -> Parse -> -> Parse Selectors]
Краш-лог:
[m[34m[11:01:53][m [31m[Render thread/ERROR][m [36m(FabricLoader/Mixin)[m [31mMixin apply for mod stiks_mod failed stiks_mod.mixins.json:HudMixin from mod stiks_mod -> net.minecraft.client.gui.hud.InGameHud: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException @ModifyVariable annotation on renderHealthBar, has invalid target descriptor: Invalid owner: net/minecraft/entity/player/PlayerEntity;. No refMap loaded. [INJECT_PREPARE Applicator Phase -> stiks_mod.mixins.json:HudMixin from mod stiks_mod -> Prepare Injections -> localvar$zjb000$stiks_mod$renderHealthBar(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/entity/player/PlayerEntity;IIIIFIIIZ)V -> Parse ->  -> Parse Selectors]
[m org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException: @ModifyVariable annotation on renderHealthBar, has invalid target descriptor: Invalid owner: net/minecraft/entity/player/PlayerEntity;. No refMap loaded. [INJECT_PREPARE Applicator Phase -> stiks_mod.mixins.json:HudMixin from mod stiks_mod -> Prepare Injections -> localvar$zjb000$stiks_mod$renderHealthBar(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/entity/player/PlayerEntity;IIIIFIIIZ)V -> Parse ->  -> Parse Selectors]

Вложения

  • crash-2025-04-09_11.01.54-client.txt
    10.9 KB · Просмотры: 0
Решение
Имя класса указано неверно. Уберите точку с запятой на конце.

Префикс L и суффикс ; используются всегда вместе и только как дескриптор метода/поля класса.
Убрал то, выкинул это. Понял-принял.

Максимальное здоровье можно установить где-нибудь через EnitityAttributeInstance#setBaseValue, а текущий миксин - чисто визуальные 30hp(если его починить конечно).
За намёк спасибо, но я расковырял один модец. Спс автору что мод был небольшой, а маппинги достоверны 🥴

Добытое, решение:
LevelUpMixin:
import java.util.Objects;
import java.util.UUID;
import net.minecraft.entity.attribute.EntityAttributeModifier;
import net.minecraft.entity.attribute.EntityAttributes;
import net.minecraft.entity.attribute.EntityAttributeInstance...
has invalid target descriptor: Invalid owner: net/minecraft/entity/player/PlayerEntity;. No refMap loaded.
Имя класса указано неверно. Уберите точку с запятой на конце.

Префикс L и суффикс ; используются всегда вместе и только как дескриптор метода/поля класса.
 
Максимальное здоровье можно установить где-нибудь через EnitityAttributeInstance#setBaseValue, а текущий миксин - чисто визуальные 30hp(если его починить конечно).

Для работы с миксинами рекомендую MinecraftDev плагин, не нужно будет самому писать дескрипторы и т.д.
 
Имя класса указано неверно. Уберите точку с запятой на конце.

Префикс L и суффикс ; используются всегда вместе и только как дескриптор метода/поля класса.
Убрал то, выкинул это. Понял-принял.

Максимальное здоровье можно установить где-нибудь через EnitityAttributeInstance#setBaseValue, а текущий миксин - чисто визуальные 30hp(если его починить конечно).
За намёк спасибо, но я расковырял один модец. Спс автору что мод был небольшой, а маппинги достоверны 🥴

Добытое, решение:
LevelUpMixin:
import java.util.Objects;
import java.util.UUID;
import net.minecraft.entity.attribute.EntityAttributeModifier;
import net.minecraft.entity.attribute.EntityAttributes;
import net.minecraft.entity.attribute.EntityAttributeInstance;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin({net.minecraft.entity.player.PlayerEntity.class})
public abstract class LevelUpMixin extends net.minecraft.entity.LivingEntity {
  private static final UUID MODIFIER_ID = UUID.fromString("6fd1cdc4-6c1f-4879-96d5-791bb49d4d7f");
 
  @Accessor
  public abstract int getExperienceLevel();
 
  protected LevelUpMixin(net.minecraft.entity.EntityType<? extends net.minecraft.entity.LivingEntity> entityType, net.minecraft.world.World world) {
    super(entityType, world);
  }
 
  @Inject(at = {@At("HEAD")}, method = {"tick"})
  private void constructorInj(CallbackInfo info) {
    if (this.firstUpdate)
      applyHealthModifier();
  }
 
  @Inject(at = {@At("TAIL")}, method = {"addExperienceLevels"})
  private void addExperienceLevelsInj(CallbackInfo info) {
    applyHealthModifier();
  }
 
  private void applyHealthModifier() {
      EntityAttributeInstance instance = getAttributeInstance(EntityAttributes.GENERIC_MAX_HEALTH);
    if (instance == null)
      return;
    Objects.requireNonNull(this);
    int baseHealth = 20;
    // minHp, levelInterval, levelHeart
    int targetHealth = 26 + getExperienceLevel() / 2 * 2;
    int healthDiff = targetHealth - baseHealth;
    instance.tryRemoveModifier(MODIFIER_ID);
    try {
      instance.addPersistentModifier(new EntityAttributeModifier(MODIFIER_ID, "levelIsHealth.healthModifier", healthDiff, EntityAttributeModifier.Operation.ADD_VALUE));
    } catch (Exception ex) {
      // LOG!!! @todo
    }
  }
}
 
Последнее редактирование:
Назад
Сверху