导航渲染器
负责导航的视觉呈现,允许开发者通过自定义渲染器实现不同的导航风格,例如粒子路径、指南针指示等
概述
导航渲染器(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
}
}