module-ai

这部分作为 Bukkit 平台下实现自定义生物寻路(Pathfinder)以及相关控制方法。

该模块依赖于:

  • common

  • module-nms

安装方式如下所示:

taboolib {
    install("common", "module-nms", "module-ai")
}

在开始前,请您阅读 [上古之石]Pathfinder插件教程 以确保您大致了解原版 Pathfinder 的实现逻辑。

在该模块中,由 taboolib.module.ai.SimpleAi 代替了 PathfinderGoal 类。

/**
 * 使用 SimpleAi 实现上方教程中提到的蜘蛛生成网生成AI
 */
class PathfinderGoalNet(val spider: Spider) : SimpleAi() {

    override fun shouldExecute(): Boolean {
        if (random(10) != 0) {
            return false
        }
        if (!spider.isOnGround) {
            return false
        }
        return true
    }

    override fun continueExecute(): Boolean {
        return false
    }

    /**
     * 等价于 startExecute() 方法
     */
    override fun startTask() {
        spider.location.block.type = Material.COBWEB
    }
}

随后使用扩展函数注册AI:

val spider: Spider = ...
spider.addGoalAi(PathfinderGoalNet(spider), 1)

其余控制方法表现在以下扩展函数:

fun LivingEntity.addGoalAi(ai: SimpleAi, priority: Int)

fun LivingEntity.addTargetAi(ai: SimpleAi, priority: Int)

fun LivingEntity.replaceGoalAi(ai: SimpleAi, priority: Int)

fun LivingEntity.replaceTargetAi(ai: SimpleAi, priority: Int)

/**
 * 根据类的 simpleName 属性替换一个 AI
 */
fun LivingEntity.replaceGoalAi(ai: SimpleAi, priority: Int, name: String?)

fun LivingEntity.replaceTargetAi(ai: SimpleAi, priority: Int, name: String?)

fun LivingEntity.removeGoalAi(priority: Int)

fun LivingEntity.removeTargetAi(priority: Int)

/**
 * 根据类的 simpleName 属性移除一个 AI
 */
fun LivingEntity.removeGoalAi(name: String)

fun LivingEntity.removeTargetAi(name: String)

fun LivingEntity.clearGoalAi()

fun LivingEntity.clearTargetAi()

fun LivingEntity.getGoalAi(): Iterable<*>

fun LivingEntity.getTargetAi(): Iterable<*>

fun LivingEntity.setGoalAi(ai: Iterable<*>)

fun LivingEntity.setTargetAi(ai: Iterable<*>)

/**
 * 使用原版 Navigation 移动实体到特定坐标
 */
fun LivingEntity.navigationMove(location: Location, speed: Double = 0.2): Boolean

/**
 * 使用原版 Navigation 移动实体到特定实体位置
 */
fun LivingEntity.navigationMove(target: LivingEntity, speed: Double = 0.2): Boolean

fun LivingEntity.navigationReach(): Boolean

fun LivingEntity.controllerLookAt(target: Location)

fun LivingEntity.controllerLookAt(target: Entity)

fun LivingEntity.controllerJumpReady()

fun LivingEntity.controllerJumpCurrent(): Boolean