这里的forge版本采用36.2.20。 需要先创建一个实体,这里继承MonsterEntity类。 参考: public static class CustomEntity extends MonsterEntity implements IRangedAttackMob
在原版中,最常见的死亡方式是受伤,因此我们可以在受伤事件中不与理会。 @Override
public boolean attackEntityFrom(DamageSource source, float amount) {
return false;
//return super.attackEntityFrom(source, amount);
}通过返回false,我们已经实现了使其不受到物理伤害,但是如中毒效果等代码伤害仍是有效的,因此,我们需要对setHealth进行重写。 @Override
public void setHealth(float health) {
if(!(health <=10000)){
super.setHealth(health);
}
}可以看出,这个重写方法通过判断设置的血量,当设置的血量大于10000时,才调用父类方法。 为了效果,我们可以将受伤和死亡声音设置为0。 @Override
public net.minecraft.util.SoundEvent getHurtSound(DamageSource ds) {
return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(""));
}
@Override
public net.minecraft.util.SoundEvent getDeathSound() {
return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(""));
}这段代码会返回一个空的声音。
同时,为了防止使用kill等,我们需要封堵代码杀。 @Override
public void onDeath(DamageSource source) {
//super.onDeath(source);
//这里将调用父类方法的代码注释了。
}
@Override
public void remove(boolean keepData) {
this.removed = false;
//防止通过removed强行移除。
}
@Override
public void setDead() {
//super.setDead();
//this.clearLeashed(true, false);
}
@Override
public void onKillCommand() {
//this.remove();
}
@Override
public void remove() {
//this.remove(false);
}接着,我们可以再在返回实体类型时返回一个UNDEAD(不死)。 @Override
public CreatureAttribute getCreatureAttribute() {
return CreatureAttribute.UNDEAD;
}最后,为了防止被系统自动刷走,还要加上: @Override
public boolean canDespawn(double distanceToClosestPlayer) {
return false;
}
现在,你已经知道了如何通过重写方法实现在1.16.5的Forge中实现不死实体。效果是无论是kill指令还是和平模式,实体都不会出现死亡的迹象。 此方法可以对抗绝大多数“神器”
|