Skip to content
iPlugin

导航渲染器

负责导航的视觉呈现,允许开发者通过自定义渲染器实现不同的导航风格,例如粒子路径、指南针指示等

概述

导航渲染器(NavigationRenderer) 是一个抽象类,用于定义导航任务的视觉表现和行为。 通过实现这个抽象类,开发者可以创建多种不同的导航风格,例如聊天消息提示、指南针、箭头指示等,以提供更丰富的玩家体验。


导航渲染器抽象类

NavigationRenderer 抽象类定义了导航渲染器的核心属性和行为。

// 导航渲染器抽象类
abstract class NavigationRenderer {

    // 渲染器唯一标识
    abstract val id: String

    // 导航更新间隔(游戏刻)
    abstract val updateInterval: Long

    // 初始化渲染器(可选)
    open fun initialize() {}

    // 启动导航渲染
    abstract fun startNavigation(context: NavigationContext)

    // 更新导航状态
    abstract fun updateNavigation(context: NavigationContext, distance: Double)

    // 停止导航渲染
    abstract fun stopNavigation(context: NavigationContext)

    // 停止特定玩家的所有导航(可选)
    open fun stopAllNavigations(player: Player) {}

    // 清理资源(可选)
    open fun cleanup() {}

    // 检查是否应该继续导航(可选)
    open fun shouldContinueNavigation(context: NavigationContext, distance: Double): Boolean
}
  • id: 渲染器的唯一标识符,用于在配置或代码中引用。
  • updateInterval: 导航更新的频率,以tick为单位。例如,1L 表示每游戏刻更新一次,20L 表示每秒更新一次。
  • startNavigation: 当一个导航任务开始时调用,用于执行一次性的初始化操作。
  • updateNavigation: 在导航任务进行中,每隔 updateInterval 游戏刻调用一次,用于更新导航的视觉效果。
  • stopNavigation: 当一个导航任务结束时调用,用于执行清理操作。
  • variables(context: NavigationContext)**: 提供了通用的变量映射,例如 {name} 和 {title},方便渲染器在渲染时使用。

注册导航渲染器

要使用自定义的导航渲染器,需要通过 NavigationAPI 进行注册。

import com.hiusers.questengine.api.QuestEngine

// 获取 NavigationAPI 实例
val navigationAPI = QuestEngine.api().getNavigationAPI()

// 创建你的导航渲染器实例
val messageRenderer = NavigationMessage()

// 注册导航渲染器
navigationAPI.registerRenderer(messageRenderer)

NavigationAPI.registerRenderer 方法支持传入一个或多个 NavigationRenderer 实例。


导航渲染器示例:消息提示

以下是一个简单的消息提示导航渲染器示例。它会每隔一段时间给玩家发送一条聊天消息,提示他们距离目标还有多远。

import com.hiusers.questengine.api.navigate.NavigationContext
import com.hiusers.questengine.api.navigate.NavigationRenderer
import org.bukkit.entity.Player

// 消息提示导航渲染器
class NavigationMessage : NavigationRenderer() {

    // 渲染器唯一标识
    override val id: String = "message"

    // 导航更新间隔,例如 20L 表示每秒更新一次
    override val updateInterval: Long = 20L

    // 启动导航,发送开始消息
    override fun startNavigation(context: NavigationContext) {
        val player = context.player
        player.sendMessage("§a[导航] §f任务 '${context.questConfig.meta.name}' 的导航已启动!")
    }

    // 更新导航,发送距离提示消息
    override fun updateNavigation(context: NavigationContext, distance: Double) {
        val player = context.player
        val objectiveTitle = context.objectiveConfig.agent.track.navigate.title
        val formattedDistance = "%.2f".format(distance) // 格式化距离,保留两位小数
        player.sendMessage("§b[导航] §f距离目标 '$objectiveTitle' 还有 $formattedDistance 米")
    }

    // 停止导航,发送结束消息
    override fun stopNavigation(context: NavigationContext) {
        val player = context.player
        player.sendMessage("§e[导航] §f任务导航已停止。")
    }

    // 检查是否应该继续导航
    override fun shouldContinueNavigation(context: NavigationContext, distance: Double): Boolean {
        // 当距离小于 2 米时,停止导航
        return distance >= 2.0
    }
}