兔子寻路修复(非官方Forge移植版)

兔子寻路修复(非官方Forge移植版)

修复兔子寻路 / MC-150224。一个从 Fabric 版本非官方移植到 Forge 生态的版本

游戏机制

免责声明

这是 Rabbit Pathfinding Fixed 的分支版本。我不主张对原始代码、资源的所有权,也没有更改任何代码逻辑。所有功劳归 litetex 所有。我只是为 Forge 生态系统做了一个移植。

Rabbit Pathfinding Fixed

高效地修复兔子寻路。

截至 1.21.1,兔子寻路存在多个问题:

基础寻路

  1. 跳跃高度/速度的计算不正确且实现拙劣。
    这导致跳跃高度过小,无法翻越方块。
  2. 兔子在跳跃期间会“停滞”(没有水平移动)——因此当它们试图翻越方块时,只会在原地向上跳。
    此行为由 RabbitMoveControl 引起,它在移动时只正确设置(水平)速度,但在跳跃时不设置。
  3. 兔子会卡住 / 试图永远四处游荡。
    • 根本原因是 EntityNavigation 根据移动速度设置其超时时间。
      如果移动速度为 0(当兔子/生物“卡住”时就是这种情况),超时时间也为 0……而如果超时时间为 0,它就会被忽略,因此会永远执行下去(或被外部因素如另一个目标中断)。
    • 兔子在空闲时只有一个目标:WanderAround(Far)。大多数其他实体还使用 LookAroundGoal。
      因此上述无限导航永远不会停止,以便像大多数其他生物那样执行另一个目标。
    • RabbitMoveControl#tick 会不断更新兔子的速度(RabbitEntity#setSpeed)。
      在此过程中,它还会间接执行 moveControl#moveTo,因此兔子总是试图到达它的最后一个目标,即使它不应该这样做。

截至 1.21.4/24w46a,MC-150224 已被修复,纠正了跳跃高度(1)并修复了停滞问题(2)。
然而,所有其他部分——包括上述修复中的优化和健全性检查——仍然缺失。

吃胡萝卜作物

  1. 兔子无法到达作物,总是停在距离它们一个方块的位置。
    这是由于选择了不正确的作物方块距离(是 1,但应该是 0)。
  2. 兔子即使仍在跳跃和处于空中时也会立即吃掉作物。
  3. 由于 shouldContinue 和 isTargetPos 方法的实现不正确,该目标/行为会被立即中止(在选择目标作物方块后的几个 tick 内)。

详细的视频对比也可供查看。