= 创作分享 =
编程开发
通过重写方法实现在1.16.5的Forge中实现不死实体 ...
爱编程的叶一笑

通过重写方法实现在1.16.5的Forge中实现不死实体

这里的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指令还是和平模式,实体都不会出现死亡的迹象。
此方法可以对抗绝大多数“神器”

评分

参与人数 1RF +4 Vis +2 收起 理由
QQ酱29797 + 4 + 2 祖国需要你

查看全部评分

发表于 2022-5-16 19:29:15 | 显示全部楼层 |阅读模式

回复 | 举报

该帖共收到 2 条回复!
K₂MnO₄
应该都通用吧
发表于 2022-8-20 01:34:13 | 显示全部楼层

回复 | 举报

3.14159265358979
改都改了,建议把getHealth也加上(
azaz
azzz
eee
zaza
zzza
发表于 2023-1-30 09:21:29 | 显示全部楼层

回复 | 举报

百科目前不允许匿名发帖哦~ 请先 [ 登陆 ][ 注册 ] 吧~

本版积分规则

发新帖
  • 回复
  • 点评
  • 评分

[ MC百科(mcmod.cn) 除另有声明,所有开放公共编辑的内容均使用 BY-NC-SA 3.0 协议 ]

Minecraft百科CC协议
快速回复 返回顶部 返回列表