当前位置: 首页 > news >正文

我的世界1.20.1forge模组开发(8)——自定义实体、AI

在第五节我们讲了怎么新建一个实体,但是那是最基本的教程,这期我们来讲讲怎么新建一个雪怪类继承自monster类,然后有一些自定义的行为AI。

和第五期不同的是,构造函数必须这么写:

    public SnowMonster(EntityType<? extends Monster> type, Level level) {
        super(type, level);
    }

生物属性

    public static AttributeSupplier.Builder createAttributes() {
        return Monster.createMonsterAttributes()
                .add(Attributes.MAX_HEALTH, 50.0)
                .add(Attributes.MOVEMENT_SPEED, 0.25)
                .add(Attributes.ATTACK_DAMAGE, 2.0)
                .add(Attributes.FOLLOW_RANGE, 5.0);
    }

代码解释: 

这段代码是一个静态方法,返回一个AttributeSupplier.Builder对象。该方法首先调用Monster.createMonsterAttributes()方法来获取一个怪物的属性构建器对象,然后通过链式调用.add()方法来添加不同的属性。具体添加的属性包括MAX_HEALTH(最大生命值为50.0)、MOVEMENT_SPEED(移动速度为0.25)、ATTACK_DAMAGE(攻击伤害为2.0)和FOLLOW_RANGE(跟随范围为5.0)。

整体操作是在已有的怪物属性构建器对象基础上进行属性的添加,以便创建具有特定属性的怪物对象。

然后注册到事件监听器中

    @SubscribeEvent
    public static void onEntityAttributeCreation(EntityAttributeCreationEvent event) {
        event.put(EntityRegistry.SNOW_MONSTER.get(), SnowMonster.createAttributes().build());
    }

自定义AI

自定义AI必须重写registerGoals方法:

    @Override
    protected void registerGoals() {
        this.goalSelector.addGoal(1, new SnowMonsterGoals.RangedAttackGoal(this, 20, 5.0F));
        this.goalSelector.addGoal(2, new SnowMonsterGoals.PanicGoal(this));
        this.goalSelector.addGoal(3, new SnowMonsterGoals.AvoidStrongTargetGoal(this));
        this.goalSelector.addGoal(4, new SnowMonsterGoals.AvoidTargetWhenWeakGoal(this));
        this.goalSelector.addGoal(5, new SnowMonsterGoals.SnowMonsterSkillGoal(this));
        this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, true));
            this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(
                    this,
                    Animal.class,
                    true,
                    // 仅排除雪傀儡和同类
                    e -> !(e instanceof SnowGolem) && !(e instanceof SnowMonster)));
    }

这段代码是一个实体类的注册行为,通过重写registerGoals()方法来设定实体在游戏中的行为目标。在这段代码中,为一个名为SnowMonster的实体注册了多个行为目标。

  1. RangedAttackGoal:设定SnowMonster实体在20 ticks内以5.0的力量进行远程攻击的行为目标。

  2. PanicGoal:设定SnowMonster实体在受到惊吓时会进行惊慌行为的目标。

  3. AvoidStrongTargetGoal:设定SnowMonster实体会避开强大目标的行为目标。

  4. AvoidTargetWhenWeakGoal:设定SnowMonster实体在虚弱时会避开目标的行为目标。

  5. SnowMonsterSkillGoal:设定SnowMonster实体的技能行为目标。

在目标选择器中,也注册了两个目标选择器:

  1. NearestAttackableTargetGoal:设定SnowMonster实体会攻击距离最近的玩家实体。

  2. NearestAttackableTargetGoal:设定SnowMonster实体会攻击距禮最近的动物实体,并通过Lambda表达式排除了雪傀儡和同类的实体。

总之,这段代码通过添加不同的目标选择器和行为目标的组合,为SnowMonster实体设定了在游戏中的行为逻辑,定义了它的攻击、逃避和技能等行为。

 实体数据

创建实体数据的意义是用来标识实体的状态和自定义一些功能,存储一些数据

实体数据可以这么创建:

    public static final EntityDataAccessor<Boolean> PANIC = SynchedEntityData.defineId(SnowMonster.class, EntityDataSerializers.BOOLEAN);
    public static final EntityDataAccessor<Float> TURN = SynchedEntityData.defineId(SnowMonster.class, EntityDataSerializers.FLOAT);

这里定义了两个数据,一个是PANIC代表实体是否处于惊慌状态,另一个是TURN的Float类数据。

深入源码 

相关文章:

  • Hugging Face 推出 FastRTC:实时语音视频应用开发变得得心应手
  • H.264,H.265,H.266标准技术改进
  • 基于字符的卷积网络在文本分类中的应用与探索
  • TypeError: Invalid attempt to spread non-iterable instance
  • 金融合规测试:金融系统稳健运行的“定海神针“
  • Matlab——添加坐标轴虚线网格的方法
  • 本地化deepseek
  • Mybatis如何通过databaseId属性支持不同数据库的不同语法
  • 分布式数据库中的四种透明性:逻辑透明、位置透明、分片透明和复制透明
  • ⭐算法OJ⭐N-皇后问题 II【回溯剪枝】(C++实现)N-Queens II
  • Spring中的@Qualifier和@Resource注解有什么不同?
  • redis 支持哪几种数据结构
  • 【FPGA开发】Verilog-数据截断实现四舍五入效果、模块化改造、对比Matlab验证,Modelsim覆盖率
  • SSLScan实战指南:全面检测SSL/TLS安全配置
  • 股指期货交割日每月几号?为什么是第三个周五还是倒数第二个周五?
  • 第十五届蓝桥杯Scratch12月stema选拔赛真题—消失的水母
  • STM32之Unix时间戳
  • 计算机毕业设计Python+DeepSeek-R1大模型医疗问答系统 知识图谱健康膳食推荐系统 食谱推荐系统 医疗大数据(源码+LW文档+PPT+讲解)
  • Spring-framework源码编译
  • 完全背包-一维数组
  • 吉林省吉林市舒兰市/seo快速入门教程
  • centos wordpress 建站教程/谷歌搜索指数查询
  • 用php做的网站论文/百度seo教程
  • 目前网站建设用哪种语言/百度推广费用预算表
  • 提供网站制作价格/百度官网地址
  • 东莞企业网站制/搜索优化的培训免费咨询