我的世界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)。
整体操作是在已有的怪物属性构建器对象基础上进行属性的添加,以便创建具有特定属性的怪物对象。
然后注册到事件监听器中
@SubscribeEventpublic static void onEntityAttributeCreation(EntityAttributeCreationEvent event) {event.put(EntityRegistry.SNOW_MONSTER.get(), SnowMonster.createAttributes().build());}
自定义AI
自定义AI必须重写registerGoals方法:
@Overrideprotected 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的实体注册了多个行为目标。
-
RangedAttackGoal
:设定SnowMonster实体在20 ticks内以5.0的力量进行远程攻击的行为目标。 -
PanicGoal
:设定SnowMonster实体在受到惊吓时会进行惊慌行为的目标。 -
AvoidStrongTargetGoal
:设定SnowMonster实体会避开强大目标的行为目标。 -
AvoidTargetWhenWeakGoal
:设定SnowMonster实体在虚弱时会避开目标的行为目标。 -
SnowMonsterSkillGoal
:设定SnowMonster实体的技能行为目标。
在目标选择器中,也注册了两个目标选择器:
-
NearestAttackableTargetGoal
:设定SnowMonster实体会攻击距离最近的玩家实体。 -
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类数据。