wyh172111
本帖最后由 wyh172111 于 2023-1-20 13:03 编辑

(事先声明,本人是模组新人开发者,如有小白问题,勿喷)
如题,我有一个对于PlayerEntity类的实例中damage方法的Mixin,我想要实现当这个PlayerEntity实例具有某个状态时可以直接把这个damage方法return false(就是取消伤害)

但是我发现在这个里面无法使用“this.getStatusEffect(XXX_EFFECT)!= null”来进行判断,就是不能识别出这个方法。
此外,在模仿之前自动生成的“@shadow @FINAL private PlayerInventory inventory;”写了一个“@Nullable public abstract StatusEffectInstance getStatusEffect(StatusEffect effect);”,但是似乎没有用,因为在运行的过程中,在damage函数中mixin了一个“LOGGER.info(getStatusEffect([size=13.0667px]XXX_EFFECT
) == null ? "YES": "NO");”,在游戏中甚至没有任何[size=13.0667px]"YES"[size=13.0667px]"NO"的打印。
最后我打印了一下this.getClass(),发现[size=13.0667px]this是一个“ServerPlayerEntity”类型,而“[size=13.0667px]ServerPlayerEntity”是继承了“PlayerEntity”类型的,所以就完全没有搞明白为什么不能调用“getStatusEffect”函数。


另:
getStatusEffect函数是PlayerEntity从LivingEntity处
[size=13.0667px]继承
来的
[size=13.0667px]在尝试使用this.inventory[size=13.0667px]时,使用IDEA的自动补全,会自动在类当中声明一个@Shadow @Final private PlayerInventory inventory;”,我也没大能搞懂是怎么实现调用那个实例的inventory的。。。。我用的是Fabric,Minecraft版本为1.19.3

另附Mixin源代码:
package com.马赛克.马赛克.mixin;
import net.minecraft.entity.damage.DamageSource;
import net.minecraft.entity.effect.StatusEffect;
import net.minecraft.entity.effect.StatusEffectCategory;
import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.text.Text;
import org.jetbrains.annotations.Nullable;
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.CallbackInfoReturnable;

import static com.马赛克.马赛克.马赛克.*;

@Mixin(PlayerEntity.class)
public abstract class DogeHeadMixin {
@Inject(at = @At("HEAD"), method = "damage", cancellable = true)    // 无敌代码
private void onDamage(DamageSource damageSource, float amount, CallbackInfoReturnable<Boolean> info) {   
// 此处应有if语句判断是否拥有XXX_EFFECT,但是没弄出来
        
LOGGER.info("你抵挡了一次伤害");
        info.setReturnValue(
false);
    }

}





洞穴夜莺
本帖最后由 洞穴夜莺 于 2023-1-20 15:12 编辑

  1. @Mixin(PlayerEntity.class)
  2. public abstract class DogeHeadMixin {
复制代码

应当extends被Mixin类的父类
@Mixin(PlayerEntity.class)
public abstract class DogeHeadMixin extends LivingEntity {[/code]