本帖最后由 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源代码:
(事先声明,本人是模组新人开发者,如有小白问题,勿喷)
如题,我有一个对于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 编辑 
复制代码
应当extends被Mixin类的父类
@Mixin(PlayerEntity.class)
public abstract class DogeHeadMixin extends LivingEntity {[/code]
 
- @Mixin(PlayerEntity.class)
 
- public abstract class DogeHeadMixin {
应当extends被Mixin类的父类
@Mixin(PlayerEntity.class)
public abstract class DogeHeadMixin extends LivingEntity {[/code]