如何为Pocketmine-MP自定义实体添加随机移动功能?
复用Pocketmine-MP原版实体随机移动逻辑的实现方案
核心实现步骤
- 更换父类简化逻辑:不要直接继承
Entity基类,改成继承Creature类(原版生物的通用父类),如果你的恐龙是被动生物,还可以进一步继承Animal类。这两个类已经封装好了随机移动、寻路、重力处理等全套基础逻辑,不需要自己从零实现。 - 正确初始化构造函数:如果坚持继承
Entity,必须在构造函数中调用父类构造方法,同时初始化移动相关属性:public function __construct(World $world, CompoundTag $nbt){ parent::__construct($world, $nbt); $this->movementSpeed = 0.2; // 设置移动速度 $this->setScale(1.0); // 可选,调整实体大小 } - 复用原版移动更新逻辑:在你的
DinosaurEntity类中重写onUpdate()方法,调用原版的移动处理逻辑,同时添加随机转向触发:public function onUpdate(int $currentTick): bool{ $hasUpdate = parent::onUpdate($currentTick); // 每100tick随机改变一次移动方向 if($this->getRandom()->nextBoundedInt(100) === 0){ $this->motion->x = $this->getRandom()->nextFloat() * 2 - 1; $this->motion->z = $this->getRandom()->nextFloat() * 2 - 1; } // 调用原版移动处理方法,处理重力、碰撞、位置同步 $this->updateMovement(); return $hasUpdate; } - 注册实体属性:在实体的
defineProperties()方法中定义移动速度属性,确保逻辑生效:protected function defineProperties(): void{ parent::defineProperties(); $this->registerProperty("movement_speed", 0.2); }
关键注意点
- 继承
Creature或Animal后,父类的onUpdate()已经包含了随机移动的触发逻辑,你只需要调整移动速度等参数即可,无需手动写方向随机代码。 - 不要直接复制
Entity基类的onUpdate()代码,调用父类方法可以避免破坏实体的基础生命周期逻辑。
内容的提问来源于stack exchange,提问作者LA_
相关产品推荐
相关产品推荐

