@esengine/behavior-tree 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts","../src/Types/TaskStatus.ts","../src/execution/BehaviorTreeData.ts","../src/execution/BehaviorTreeRuntimeComponent.ts","../src/execution/BehaviorTreeAssetManager.ts","../src/Serialization/EditorToBehaviorTreeDataConverter.ts","../src/execution/NodeExecutor.ts","../src/execution/BehaviorTreeExecutionSystem.ts","../src/execution/NodeMetadata.ts","../src/execution/Executors/RootExecutor.ts","../src/execution/Executors/SequenceExecutor.ts","../src/execution/Executors/SelectorExecutor.ts","../src/execution/Executors/ParallelExecutor.ts","../src/execution/Executors/ParallelSelectorExecutor.ts","../src/execution/Executors/RandomSequenceExecutor.ts","../src/execution/Executors/RandomSelectorExecutor.ts","../src/execution/Executors/InverterExecutor.ts","../src/execution/Executors/RepeaterExecutor.ts","../src/execution/Executors/AlwaysSucceedExecutor.ts","../src/execution/Executors/AlwaysFailExecutor.ts","../src/execution/Executors/UntilSuccessExecutor.ts","../src/execution/Executors/UntilFailExecutor.ts","../src/execution/Executors/ConditionalExecutor.ts","../src/execution/Executors/CooldownExecutor.ts","../src/execution/Executors/TimeoutExecutor.ts","../src/execution/Executors/ServiceDecorator.ts","../src/execution/Executors/WaitAction.ts","../src/execution/Executors/LogAction.ts","../src/execution/Executors/SetBlackboardValue.ts","../src/execution/Executors/ModifyBlackboardValue.ts","../src/execution/Executors/ExecuteAction.ts","../src/execution/Executors/SubTreeExecutor.ts","../src/execution/Executors/BlackboardCompare.ts","../src/execution/Executors/BlackboardExists.ts","../src/execution/Executors/RandomProbability.ts","../src/execution/Executors/ExecuteCondition.ts","../src/BehaviorTreeStarter.ts","../src/BehaviorTreeBuilder.ts","../src/Serialization/NodeTemplates.ts","../src/Serialization/BehaviorTreeAsset.ts","../src/Serialization/EditorFormatConverter.ts","../src/Serialization/BehaviorTreeAssetSerializer.ts","../src/Services/GlobalBlackboardService.ts","../src/Blackboard/BlackboardTypes.ts","../src/tokens.ts"],"sourcesContent":["/**\n * Behavior Tree Constants\n * 行为树常量\n */\n\n// Asset type constant for behavior tree\n// 行为树资产类型常量\n// 必须与 module.json 中 assetExtensions 定义的类型一致\n// Must match the type defined in module.json assetExtensions\nexport const BehaviorTreeAssetType = 'behavior-tree' as const;\n","/**\n * 任务执行状态\n */\nexport enum TaskStatus {\n /** 无效状态 - 节点未初始化或已被重置 */\n Invalid = 0,\n /** 成功 - 节点执行成功完成 */\n Success = 1,\n /** 失败 - 节点执行失败 */\n Failure = 2,\n /** 运行中 - 节点正在执行,需要在后续帧继续 */\n Running = 3\n}\n\n/**\n * 内置节点类型常量\n */\nexport const NodeType = {\n /** 根节点 - 行为树的起始节点 */\n Root: 'root',\n /** 复合节点 - 有多个子节点 */\n Composite: 'composite',\n /** 装饰器节点 - 有一个子节点 */\n Decorator: 'decorator',\n /** 动作节点 - 叶子节点 */\n Action: 'action',\n /** 条件节点 - 叶子节点 */\n Condition: 'condition'\n} as const;\n\n/**\n * 节点类型(支持自定义扩展)\n *\n * 使用内置类型或自定义字符串\n *\n * @example\n * ```typescript\n * // 使用内置类型\n * type: NodeType.Action\n *\n * // 使用自定义类型\n * type: 'custom-behavior'\n * ```\n */\nexport type NodeType = typeof NodeType[keyof typeof NodeType] | string;\n\n/**\n * 复合节点类型\n */\nexport enum CompositeType {\n /** 序列 - 按顺序执行,全部成功才成功 */\n Sequence = 'sequence',\n /** 选择 - 按顺序执行,任一成功则成功 */\n Selector = 'selector',\n /** 并行 - 同时执行所有子节点 */\n Parallel = 'parallel',\n /** 并行选择 - 并行执行,任一成功则成功 */\n ParallelSelector = 'parallel-selector',\n /** 随机序列 - 随机顺序执行序列 */\n RandomSequence = 'random-sequence',\n /** 随机选择 - 随机顺序执行选择 */\n RandomSelector = 'random-selector'\n}\n\n/**\n * 装饰器节点类型\n */\nexport enum DecoratorType {\n /** 反转 - 反转子节点结果 */\n Inverter = 'inverter',\n /** 重复 - 重复执行子节点 */\n Repeater = 'repeater',\n /** 直到成功 - 重复直到成功 */\n UntilSuccess = 'until-success',\n /** 直到失败 - 重复直到失败 */\n UntilFail = 'until-fail',\n /** 总是成功 - 无论子节点结果都返回成功 */\n AlwaysSucceed = 'always-succeed',\n /** 总是失败 - 无论子节点结果都返回失败 */\n AlwaysFail = 'always-fail',\n /** 条件装饰器 - 基于条件执行子节点 */\n Conditional = 'conditional',\n /** 冷却 - 冷却时间内阻止执行 */\n Cooldown = 'cooldown',\n /** 超时 - 超时则返回失败 */\n Timeout = 'timeout'\n}\n\n/**\n * 中止类型\n *\n * 用于动态优先级和条件重新评估\n */\nexport enum AbortType {\n /** 无 - 不中止任何节点 */\n None = 'none',\n /** 自身 - 条件变化时可以中止自身的执行 */\n Self = 'self',\n /** 低优先级 - 条件满足时可以中止低优先级的兄弟节点 */\n LowerPriority = 'lower-priority',\n /** 两者 - 可以中止自身和低优先级节点 */\n Both = 'both'\n}\n\n/**\n * 黑板变量类型\n */\nexport enum BlackboardValueType {\n String = 'string',\n Number = 'number',\n Boolean = 'boolean',\n Vector2 = 'vector2',\n Vector3 = 'vector3',\n Object = 'object',\n Array = 'array'\n}\n\n/**\n * 黑板变量定义\n */\nexport interface BlackboardVariable {\n name: string;\n type: BlackboardValueType;\n value: any;\n readonly?: boolean;\n description?: string;\n}\n","import { TaskStatus, NodeType, AbortType } from '../Types/TaskStatus';\n\n/**\n * 行为树节点定义(纯数据结构)\n *\n * 不依赖Entity,可以被多个实例共享\n */\nexport interface BehaviorNodeData {\n /** 节点唯一ID */\n id: string;\n\n /** 节点名称(用于调试) */\n name: string;\n\n /** 节点类型 */\n nodeType: NodeType;\n\n /** 节点实现类型(对应Component类名) */\n implementationType: string;\n\n /** 子节点ID列表 */\n children?: string[];\n\n /** 节点特定配置数据 */\n config: Record<string, any>;\n\n /** 属性到黑板变量的绑定映射 */\n bindings?: Record<string, string>;\n\n /** 中止类型(条件装饰器使用) */\n abortType?: AbortType;\n}\n\n/**\n * 行为树定义(可共享的Asset)\n */\nexport interface BehaviorTreeData {\n /** 树ID */\n id: string;\n\n /** 树名称 */\n name: string;\n\n /** 根节点ID */\n rootNodeId: string;\n\n /** 所有节点(扁平化存储) */\n nodes: Map<string, BehaviorNodeData>;\n\n /** 黑板变量定义 */\n blackboardVariables?: Map<string, any>;\n}\n\n/**\n * 节点运行时状态\n *\n * 每个BehaviorTreeRuntimeComponent实例独立维护\n */\nexport interface NodeRuntimeState {\n /** 当前执行状态 */\n status: TaskStatus;\n\n /** 当前执行的子节点索引(复合节点使用) */\n currentChildIndex: number;\n\n /** 执行顺序号(用于调试和可视化) */\n executionOrder?: number;\n\n /** 开始执行时间(某些节点需要) */\n startTime?: number;\n\n /** 上次执行时间(冷却节点使用) */\n lastExecutionTime?: number;\n\n /** 当前重复次数(重复节点使用) */\n repeatCount?: number;\n\n /** 缓存的结果(某些条件节点使用) */\n cachedResult?: any;\n\n /** 洗牌后的索引(随机节点使用) */\n shuffledIndices?: number[];\n\n /** 是否被中止 */\n isAborted?: boolean;\n\n /** 上次条件评估结果(条件装饰器使用) */\n lastConditionResult?: boolean;\n\n /** 正在观察的黑板键(条件装饰器使用) */\n observedKeys?: string[];\n}\n\n/**\n * 创建默认的运行时状态\n */\nexport function createDefaultRuntimeState(): NodeRuntimeState {\n return {\n status: TaskStatus.Invalid,\n currentChildIndex: 0\n };\n}\n","import { Component, ECSComponent, Property } from '@esengine/ecs-framework';\nimport { Serializable, Serialize, IgnoreSerialization } from '@esengine/ecs-framework';\nimport { NodeRuntimeState, createDefaultRuntimeState } from './BehaviorTreeData';\nimport { TaskStatus } from '../Types/TaskStatus';\n\n/**\n * 黑板变化监听器\n */\nexport type BlackboardChangeListener = (key: string, newValue: any, oldValue: any) => void;\n\n/**\n * 黑板观察者信息\n */\ninterface BlackboardObserver {\n nodeId: string;\n keys: Set<string>;\n callback: BlackboardChangeListener;\n}\n\n/**\n * 行为树运行时组件\n *\n * 挂载到游戏Entity上,引用共享的BehaviorTreeData\n * 维护该Entity独立的运行时状态\n */\n@ECSComponent('BehaviorTreeRuntime')\n@Serializable({ version: 1 })\nexport class BehaviorTreeRuntimeComponent extends Component {\n /**\n * 引用的行为树资产ID(可序列化)\n */\n @Serialize()\n @Property({ type: 'asset', label: 'Behavior Tree', extensions: ['.btree'] })\n treeAssetId: string = '';\n\n /**\n * 是否自动启动\n */\n @Serialize()\n @Property({ type: 'boolean', label: 'Auto Start' })\n autoStart: boolean = true;\n\n /**\n * 是否正在运行\n */\n @IgnoreSerialization()\n isRunning: boolean = false;\n\n /**\n * 节点运行时状态(每个节点独立)\n * 不序列化,每次加载时重新初始化\n */\n @IgnoreSerialization()\n private nodeStates: Map<string, NodeRuntimeState> = new Map();\n\n /**\n * 黑板数据(该Entity独立的数据)\n * 不序列化,通过初始化设置\n */\n @IgnoreSerialization()\n private blackboard: Map<string, any> = new Map();\n\n /**\n * 黑板观察者列表\n */\n @IgnoreSerialization()\n private blackboardObservers: Map<string, BlackboardObserver[]> = new Map();\n\n /**\n * 当前激活的节点ID列表(用于调试)\n */\n @IgnoreSerialization()\n activeNodeIds: Set<string> = new Set();\n\n /**\n * 标记是否需要在下一个tick重置状态\n */\n @IgnoreSerialization()\n needsReset: boolean = false;\n\n /**\n * 需要中止的节点ID列表\n */\n @IgnoreSerialization()\n nodesToAbort: Set<string> = new Set();\n\n /**\n * 执行顺序计数器(用于调试和可视化)\n */\n @IgnoreSerialization()\n executionOrderCounter: number = 0;\n\n /**\n * 获取节点运行时状态\n */\n getNodeState(nodeId: string): NodeRuntimeState {\n if (!this.nodeStates.has(nodeId)) {\n this.nodeStates.set(nodeId, createDefaultRuntimeState());\n }\n return this.nodeStates.get(nodeId)!;\n }\n\n /**\n * 重置节点状态\n */\n resetNodeState(nodeId: string): void {\n const state = this.getNodeState(nodeId);\n state.status = TaskStatus.Invalid;\n state.currentChildIndex = 0;\n delete state.startTime;\n delete state.lastExecutionTime;\n delete state.repeatCount;\n delete state.cachedResult;\n delete state.shuffledIndices;\n delete state.isAborted;\n delete state.lastConditionResult;\n delete state.observedKeys;\n }\n\n /**\n * 重置所有节点状态\n */\n resetAllStates(): void {\n this.nodeStates.clear();\n this.activeNodeIds.clear();\n this.executionOrderCounter = 0;\n }\n\n /**\n * 获取黑板值\n */\n getBlackboardValue<T = any>(key: string): T | undefined {\n return this.blackboard.get(key) as T;\n }\n\n /**\n * 设置黑板值\n */\n setBlackboardValue(key: string, value: any): void {\n const oldValue = this.blackboard.get(key);\n this.blackboard.set(key, value);\n\n if (oldValue !== value) {\n this.notifyBlackboardChange(key, value, oldValue);\n }\n }\n\n /**\n * 检查黑板是否有某个键\n */\n hasBlackboardKey(key: string): boolean {\n return this.blackboard.has(key);\n }\n\n /**\n * 初始化黑板(从树定义的默认值)\n */\n initializeBlackboard(variables?: Map<string, any>): void {\n if (variables) {\n variables.forEach((value, key) => {\n if (!this.blackboard.has(key)) {\n this.blackboard.set(key, value);\n }\n });\n }\n }\n\n /**\n * 清空黑板\n */\n clearBlackboard(): void {\n this.blackboard.clear();\n }\n\n /**\n * 启动行为树\n */\n start(): void {\n this.isRunning = true;\n this.resetAllStates();\n }\n\n /**\n * 停止行为树\n */\n stop(): void {\n this.isRunning = false;\n this.activeNodeIds.clear();\n }\n\n /**\n * 暂停行为树\n */\n pause(): void {\n this.isRunning = false;\n }\n\n /**\n * 恢复行为树\n */\n resume(): void {\n this.isRunning = true;\n }\n\n /**\n * 注册黑板观察者\n */\n observeBlackboard(nodeId: string, keys: string[], callback: BlackboardChangeListener): void {\n const observer: BlackboardObserver = {\n nodeId,\n keys: new Set(keys),\n callback\n };\n\n for (const key of keys) {\n if (!this.blackboardObservers.has(key)) {\n this.blackboardObservers.set(key, []);\n }\n this.blackboardObservers.get(key)!.push(observer);\n }\n }\n\n /**\n * 取消注册黑板观察者\n */\n unobserveBlackboard(nodeId: string): void {\n for (const observers of this.blackboardObservers.values()) {\n const index = observers.findIndex((o) => o.nodeId === nodeId);\n if (index !== -1) {\n observers.splice(index, 1);\n }\n }\n }\n\n /**\n * 通知黑板变化\n */\n private notifyBlackboardChange(key: string, newValue: any, oldValue: any): void {\n const observers = this.blackboardObservers.get(key);\n if (!observers) return;\n\n for (const observer of observers) {\n try {\n observer.callback(key, newValue, oldValue);\n } catch (error) {\n console.error(`黑板观察者回调错误 (节点: ${observer.nodeId}):`, error);\n }\n }\n }\n\n /**\n * 请求中止节点\n */\n requestAbort(nodeId: string): void {\n this.nodesToAbort.add(nodeId);\n }\n\n /**\n * 检查节点是否需要中止\n */\n shouldAbort(nodeId: string): boolean {\n return this.nodesToAbort.has(nodeId);\n }\n\n /**\n * 清除中止请求\n */\n clearAbortRequest(nodeId: string): void {\n this.nodesToAbort.delete(nodeId);\n }\n\n /**\n * 清除所有中止请求\n */\n clearAllAbortRequests(): void {\n this.nodesToAbort.clear();\n }\n}\n","import { BehaviorTreeData } from './BehaviorTreeData';\nimport { createLogger, IService } from '@esengine/ecs-framework';\nimport { EditorToBehaviorTreeDataConverter } from '../Serialization/EditorToBehaviorTreeDataConverter';\n\nconst logger = createLogger('BehaviorTreeAssetManager');\n\n/**\n * 行为树资产管理器(服务)\n *\n * 管理所有共享的BehaviorTreeData\n * 多个实例可以引用同一份数据\n *\n * 使用方式:\n * ```typescript\n * // 注册服务\n * Core.services.registerSingleton(BehaviorTreeAssetManager);\n *\n * // 使用服务\n * const assetManager = Core.services.resolve(BehaviorTreeAssetManager);\n * ```\n */\nexport class BehaviorTreeAssetManager implements IService {\n /**\n * 已加载的行为树资产\n */\n private assets: Map<string, BehaviorTreeData> = new Map();\n\n /**\n * 加载行为树资产\n */\n loadAsset(asset: BehaviorTreeData): void {\n if (this.assets.has(asset.id)) {\n logger.warn(`行为树资产已存在,将被覆盖: ${asset.id}`);\n }\n this.assets.set(asset.id, asset);\n logger.info(`行为树资产已加载: ${asset.name} (${asset.nodes.size}个节点)`);\n }\n\n /**\n * 从编辑器 JSON 格式加载行为树资产\n *\n * @param json 编辑器导出的 JSON 字符串\n * @returns 加载的行为树数据\n *\n * @example\n * ```typescript\n * const assetManager = Core.services.resolve(BehaviorTreeAssetManager);\n * const jsonContent = await readFile('path/to/tree.btree');\n * const treeData = assetManager.loadFromEditorJSON(jsonContent);\n * ```\n */\n loadFromEditorJSON(json: string): BehaviorTreeData {\n try {\n const treeData = EditorToBehaviorTreeDataConverter.fromEditorJSON(json);\n this.loadAsset(treeData);\n return treeData;\n } catch (error) {\n logger.error('从编辑器JSON加载失败:', error);\n throw error;\n }\n }\n\n /**\n * 批量加载多个行为树资产(从编辑器JSON)\n *\n * @param jsonDataList JSON字符串列表\n * @returns 成功加载的资产数量\n */\n loadMultipleFromEditorJSON(jsonDataList: string[]): number {\n let successCount = 0;\n for (const json of jsonDataList) {\n try {\n this.loadFromEditorJSON(json);\n successCount++;\n } catch (error) {\n logger.error('批量加载时出错:', error);\n }\n }\n logger.info(`批量加载完成: ${successCount}/${jsonDataList.length} 个资产`);\n return successCount;\n }\n\n /**\n * 获取行为树资产\n */\n getAsset(assetId: string): BehaviorTreeData | undefined {\n return this.assets.get(assetId);\n }\n\n /**\n * 检查资产是否存在\n */\n hasAsset(assetId: string): boolean {\n return this.assets.has(assetId);\n }\n\n /**\n * 卸载行为树资产\n */\n unloadAsset(assetId: string): boolean {\n const result = this.assets.delete(assetId);\n if (result) {\n logger.info(`行为树资产已卸载: ${assetId}`);\n }\n return result;\n }\n\n /**\n * 清空所有资产\n */\n clearAll(): void {\n this.assets.clear();\n logger.info('所有行为树资产已清空');\n }\n\n /**\n * 获取已加载资产数量\n */\n getAssetCount(): number {\n return this.assets.size;\n }\n\n /**\n * 获取所有资产ID\n */\n getAllAssetIds(): string[] {\n return Array.from(this.assets.keys());\n }\n\n /**\n * 释放资源(实现IService接口)\n */\n dispose(): void {\n this.clearAll();\n }\n}\n","import { BehaviorTreeData, BehaviorNodeData } from '../execution/BehaviorTreeData';\nimport { NodeType, AbortType } from '../Types/TaskStatus';\n\n/**\n * 编辑器节点数据接口\n */\ninterface EditorNode {\n id: string;\n template: {\n type: string;\n className: string;\n displayName?: string;\n };\n data: Record<string, any>;\n children?: string[];\n}\n\n/**\n * 编辑器连接数据接口\n */\ninterface EditorConnection {\n from: string;\n to: string;\n connectionType: 'node' | 'property';\n fromProperty?: string;\n toProperty?: string;\n}\n\n/**\n * 编辑器行为树数据接口\n */\ninterface EditorBehaviorTreeData {\n version?: string;\n metadata?: {\n name: string;\n description?: string;\n createdAt?: string;\n modifiedAt?: string;\n };\n nodes: EditorNode[];\n connections?: EditorConnection[];\n blackboard?: Record<string, any>;\n}\n\n/**\n * 编辑器格式到运行时格式的转换器\n *\n * 负责将编辑器的 JSON 格式(包含UI信息)转换为运行时的 BehaviorTreeData 格式\n */\nexport class EditorToBehaviorTreeDataConverter {\n /**\n * 将编辑器 JSON 字符串转换为运行时 BehaviorTreeData\n */\n static fromEditorJSON(json: string): BehaviorTreeData {\n const editorData: EditorBehaviorTreeData = JSON.parse(json);\n return this.convert(editorData);\n }\n\n /**\n * 将编辑器数据对象转换为运行时 BehaviorTreeData\n */\n static convert(editorData: EditorBehaviorTreeData): BehaviorTreeData {\n // 查找根节点\n const rootNode = editorData.nodes.find((n) =>\n n.template.type === 'root' || n.data['nodeType'] === 'root'\n );\n\n if (!rootNode) {\n throw new Error('Behavior tree must have a root node');\n }\n\n // 构建属性绑定映射:nodeId -> { propertyName -> blackboardKey }\n const propertyBindingsMap = this.buildPropertyBindingsMap(editorData);\n\n // 转换所有节点(过滤掉不可执行的节点,如黑板变量节点)\n const nodesMap = new Map<string, BehaviorNodeData>();\n for (const editorNode of editorData.nodes) {\n // 跳过黑板变量节点,它们只用于编辑器的可视化绑定\n if (this.isNonExecutableNode(editorNode)) {\n continue;\n }\n const propertyBindings = propertyBindingsMap.get(editorNode.id);\n const behaviorNodeData = this.convertNode(editorNode, propertyBindings);\n nodesMap.set(behaviorNodeData.id, behaviorNodeData);\n }\n\n // 转换黑板变量\n const blackboardVariables = editorData.blackboard\n ? new Map(Object.entries(editorData.blackboard))\n : new Map();\n\n return {\n id: this.generateTreeId(editorData),\n name: editorData.metadata?.name || 'Untitled',\n rootNodeId: rootNode.id,\n nodes: nodesMap,\n blackboardVariables\n };\n }\n\n /**\n * 从连接数据构建属性绑定映射\n * 处理 connectionType === 'property' 的连接,将黑板变量节点连接到目标节点的属性\n */\n private static buildPropertyBindingsMap(\n editorData: EditorBehaviorTreeData\n ): Map<string, Record<string, string>> {\n const bindingsMap = new Map<string, Record<string, string>>();\n\n if (!editorData.connections) {\n return bindingsMap;\n }\n\n // 构建节点 ID 到变量名的映射(用于黑板变量节点)\n const nodeToVariableMap = new Map<string, string>();\n for (const node of editorData.nodes) {\n if (node.data['nodeType'] === 'blackboard-variable' && node.data['variableName']) {\n nodeToVariableMap.set(node.id, node.data['variableName']);\n }\n }\n\n // 处理属性连接\n for (const conn of editorData.connections) {\n if (conn.connectionType === 'property' && conn.toProperty) {\n const variableName = nodeToVariableMap.get(conn.from);\n if (variableName) {\n // 获取或创建目标节点的绑定记录\n let bindings = bindingsMap.get(conn.to);\n if (!bindings) {\n bindings = {};\n bindingsMap.set(conn.to, bindings);\n }\n // 将属性绑定到黑板变量\n bindings[conn.toProperty] = variableName;\n }\n }\n }\n\n return bindingsMap;\n }\n\n /**\n * 转换单个节点\n * @param editorNode 编辑器节点数据\n * @param propertyBindings 从连接中提取的属性绑定(可选)\n */\n private static convertNode(\n editorNode: EditorNode,\n propertyBindings?: Record<string, string>\n ): BehaviorNodeData {\n const nodeType = this.mapNodeType(editorNode.template.type);\n const config = this.extractConfig(editorNode.data);\n // 从节点数据中提取绑定\n const dataBindings = this.extractBindings(editorNode.data);\n // 合并连接绑定和数据绑定(连接绑定优先)\n const bindings = { ...dataBindings, ...propertyBindings };\n const abortType = this.extractAbortType(editorNode.data);\n\n // 获取 implementationType:优先从 template.className,其次从 data 中的类型字段\n let implementationType: string | undefined = editorNode.template.className;\n if (!implementationType) {\n // 尝试从 data 中提取类型\n implementationType = this.extractImplementationType(editorNode.data, nodeType);\n }\n\n if (!implementationType) {\n console.warn(`[EditorToBehaviorTreeDataConverter] Node ${editorNode.id} has no implementationType, using fallback`);\n // 根据节点类型使用默认实现\n implementationType = this.getDefaultImplementationType(nodeType);\n }\n\n return {\n id: editorNode.id,\n name: editorNode.template.displayName || editorNode.template.className || implementationType,\n nodeType,\n implementationType,\n children: editorNode.children || [],\n config,\n ...(Object.keys(bindings).length > 0 && { bindings }),\n ...(abortType && { abortType })\n };\n }\n\n /**\n * 检查是否为不可执行的节点(如黑板变量节点)\n * 这些节点只在编辑器中使用,不参与运行时执行\n */\n private static isNonExecutableNode(editorNode: EditorNode): boolean {\n const nodeType = editorNode.data['nodeType'];\n // 黑板变量节点不需要执行,只用于可视化绑定\n return nodeType === 'blackboard-variable';\n }\n\n /**\n * 从节点数据中提取实现类型\n *\n * 优先级:\n * 1. template.className(标准方式)\n * 2. data 中的类型字段(compositeType, actionType 等)\n * 3. 特殊节点类型的默认值(如 Root)\n */\n private static extractImplementationType(data: Record<string, any>, nodeType: NodeType): string | undefined {\n // 节点类型到数据字段的映射\n const typeFieldMap: Record<NodeType, string> = {\n [NodeType.Composite]: 'compositeType',\n [NodeType.Decorator]: 'decoratorType',\n [NodeType.Action]: 'actionType',\n [NodeType.Condition]: 'conditionType',\n [NodeType.Root]: '', // Root 没有对应的数据字段\n };\n\n const field = typeFieldMap[nodeType];\n if (field && data[field]) {\n return data[field];\n }\n\n // Root 节点的特殊处理\n if (nodeType === NodeType.Root) {\n return 'Root';\n }\n\n return undefined;\n }\n\n /**\n * 获取节点类型的默认实现\n * 当无法确定具体实现类型时使用\n */\n private static getDefaultImplementationType(nodeType: NodeType): string {\n // 节点类型到默认实现的映射\n const defaultImplementations: Record<NodeType, string> = {\n [NodeType.Root]: 'Root',\n [NodeType.Composite]: 'Sequence',\n [NodeType.Decorator]: 'Inverter',\n [NodeType.Action]: 'Wait',\n [NodeType.Condition]: 'AlwaysTrue',\n };\n\n return defaultImplementations[nodeType] || 'Unknown';\n }\n\n /**\n * 映射节点类型\n */\n private static mapNodeType(type: string): NodeType {\n switch (type.toLowerCase()) {\n case 'root':\n return NodeType.Root;\n case 'composite':\n return NodeType.Composite;\n case 'decorator':\n return NodeType.Decorator;\n case 'action':\n return NodeType.Action;\n case 'condition':\n return NodeType.Condition;\n default:\n throw new Error(`Unknown node type: ${type}`);\n }\n }\n\n /**\n * 提取节点配置(过滤掉内部字段和绑定字段)\n */\n private static extractConfig(data: Record<string, any>): Record<string, any> {\n const config: Record<string, any> = {};\n const internalFields = new Set(['nodeType', 'abortType']);\n\n for (const [key, value] of Object.entries(data)) {\n // 跳过内部字段\n if (internalFields.has(key)) {\n continue;\n }\n\n // 跳过黑板绑定字段(它们会被提取到 bindings 中)\n if (this.isBinding(value)) {\n continue;\n }\n\n config[key] = value;\n }\n\n return config;\n }\n\n /**\n * 提取黑板变量绑定\n */\n private static extractBindings(data: Record<string, any>): Record<string, string> {\n const bindings: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(data)) {\n if (this.isBinding(value)) {\n bindings[key] = this.extractBindingKey(value);\n }\n }\n\n return bindings;\n }\n\n /**\n * 判断是否为黑板绑定\n */\n private static isBinding(value: any): boolean {\n if (typeof value === 'object' && value !== null) {\n return value._isBlackboardBinding === true ||\n value.type === 'blackboard' ||\n (value.blackboardKey !== undefined);\n }\n return false;\n }\n\n /**\n * 提取黑板绑定的键名\n */\n private static extractBindingKey(binding: any): string {\n return binding.blackboardKey || binding.key || binding.value || '';\n }\n\n /**\n * 提取中止类型(条件装饰器使用)\n */\n private static extractAbortType(data: Record<string, any>): AbortType | undefined {\n if (!data['abortType']) {\n return undefined;\n }\n\n const abortTypeStr = String(data['abortType']).toLowerCase();\n switch (abortTypeStr) {\n case 'none':\n return AbortType.None;\n case 'self':\n return AbortType.Self;\n case 'lowerpriority':\n case 'lower_priority':\n return AbortType.LowerPriority;\n case 'both':\n return AbortType.Both;\n default:\n return AbortType.None;\n }\n }\n\n /**\n * 生成行为树ID\n */\n private static generateTreeId(editorData: EditorBehaviorTreeData): string {\n if (editorData.metadata?.name) {\n // 将名称转换为合法ID(移除特殊字符)\n return editorData.metadata.name.replace(/[^a-zA-Z0-9_-]/g, '_');\n }\n return `tree_${Date.now()}`;\n }\n\n /**\n * 将运行时格式转换回编辑器格式(用于双向转换)\n */\n static toEditorJSON(treeData: BehaviorTreeData): string {\n const editorData = this.convertToEditor(treeData);\n return JSON.stringify(editorData, null, 2);\n }\n\n /**\n * 将运行时 BehaviorTreeData 转换为编辑器格式\n */\n static convertToEditor(treeData: BehaviorTreeData): EditorBehaviorTreeData {\n const nodes: EditorNode[] = [];\n\n for (const [_id, nodeData] of treeData.nodes) {\n nodes.push(this.convertNodeToEditor(nodeData));\n }\n\n const blackboard = treeData.blackboardVariables\n ? Object.fromEntries(treeData.blackboardVariables)\n : {};\n\n return {\n version: '1.0.0',\n metadata: {\n name: treeData.name,\n description: '',\n modifiedAt: new Date().toISOString()\n },\n nodes,\n blackboard\n };\n }\n\n /**\n * 将运行时节点转换为编辑器节点\n */\n private static convertNodeToEditor(nodeData: BehaviorNodeData): EditorNode {\n const data: Record<string, any> = { ...nodeData.config };\n\n // 添加绑定回数据对象\n if (nodeData.bindings) {\n for (const [key, blackboardKey] of Object.entries(nodeData.bindings)) {\n data[key] = {\n _isBlackboardBinding: true,\n blackboardKey\n };\n }\n }\n\n // 添加中止类型\n if (nodeData.abortType !== undefined) {\n data['abortType'] = nodeData.abortType;\n }\n\n // 获取节点类型字符串\n let typeStr: string;\n if (typeof nodeData.nodeType === 'string') {\n typeStr = nodeData.nodeType;\n } else {\n typeStr = 'action'; // 默认值\n }\n\n const result: EditorNode = {\n id: nodeData.id,\n template: {\n type: typeStr,\n className: nodeData.implementationType,\n displayName: nodeData.name\n },\n data\n };\n\n if (nodeData.children && nodeData.children.length > 0) {\n result.children = nodeData.children;\n }\n\n return result;\n }\n}\n","import { Entity } from '@esengine/ecs-framework';\nimport { TaskStatus } from '../Types/TaskStatus';\nimport { BehaviorNodeData, BehaviorTreeData, NodeRuntimeState } from './BehaviorTreeData';\nimport { BehaviorTreeRuntimeComponent } from './BehaviorTreeRuntimeComponent';\n\n/**\n * 节点执行上下文\n *\n * 包含执行节点所需的所有信息\n */\nexport interface NodeExecutionContext {\n /** 游戏Entity(行为树宿主) */\n readonly entity: Entity;\n\n /** 节点数据 */\n readonly nodeData: BehaviorNodeData;\n\n /** 节点运行时状态 */\n readonly state: NodeRuntimeState;\n\n /** 运行时组件(访问黑板等) */\n readonly runtime: BehaviorTreeRuntimeComponent;\n\n /** 行为树数据(访问子节点等) */\n readonly treeData: BehaviorTreeData;\n\n /** 当前帧增量时间 */\n readonly deltaTime: number;\n\n /** 总时间 */\n readonly totalTime: number;\n\n /** 执行子节点 */\n executeChild(childId: string): TaskStatus;\n}\n\n/**\n * 节点执行器接口\n *\n * 所有节点类型都需要实现对应的执行器\n * 执行器是无状态的,状态存储在NodeRuntimeState中\n */\nexport interface INodeExecutor {\n /**\n * 执行节点逻辑\n *\n * @param context 执行上下文\n * @returns 执行结果状态\n */\n execute(context: NodeExecutionContext): TaskStatus;\n\n /**\n * 重置节点状态(可选)\n *\n * 当节点完成或被中断时调用\n */\n reset?(context: NodeExecutionContext): void;\n}\n\n/**\n * 复合节点执行结果\n */\nexport interface CompositeExecutionResult {\n /** 节点状态 */\n status: TaskStatus;\n\n /** 要激活的子节点索引列表(undefined表示激活所有) */\n activateChildren?: number[];\n\n /** 是否停止所有子节点 */\n stopAllChildren?: boolean;\n}\n\n/**\n * 复合节点执行器接口\n */\nexport interface ICompositeExecutor extends INodeExecutor {\n /**\n * 执行复合节点逻辑\n *\n * @param context 执行上下文\n * @returns 复合节点执行结果\n */\n executeComposite(context: NodeExecutionContext): CompositeExecutionResult;\n}\n\n/**\n * 绑定辅助工具\n *\n * 处理配置属性的黑板绑定\n */\nexport class BindingHelper {\n /**\n * 获取配置值(考虑黑板绑定)\n *\n * @param context 执行上下文\n * @param configKey 配置键名\n * @param defaultValue 默认值\n * @returns 解析后的值\n */\n static getValue<T = any>(\n context: NodeExecutionContext,\n configKey: string,\n defaultValue?: T\n ): T {\n const { nodeData, runtime } = context;\n\n if (nodeData.bindings && nodeData.bindings[configKey]) {\n const blackboardKey = nodeData.bindings[configKey];\n const boundValue = runtime.getBlackboardValue<T>(blackboardKey);\n return boundValue !== undefined ? boundValue : (defaultValue as T);\n }\n\n const configValue = nodeData.config[configKey];\n return configValue !== undefined ? configValue : (defaultValue as T);\n }\n\n /**\n * 检查配置是否绑定到黑板变量\n */\n static hasBinding(context: NodeExecutionContext, configKey: string): boolean {\n return !!(context.nodeData.bindings && context.nodeData.bindings[configKey]);\n }\n\n /**\n * 获取绑定的黑板变量名\n */\n static getBindingKey(context: NodeExecutionContext, configKey: string): string | undefined {\n return context.nodeData.bindings?.[configKey];\n }\n}\n\n/**\n * 节点执行器注册表\n *\n * 管理所有节点类型的执行器\n */\nexport class NodeExecutorRegistry {\n private executors: Map<string, INodeExecutor> = new Map();\n\n /**\n * 注册执行器\n *\n * @param implementationType 节点实现类型(对应BehaviorNodeData.implementationType)\n * @param executor 执行器实例\n */\n register(implementationType: string, executor: INodeExecutor): void {\n if (this.executors.has(implementationType)) {\n console.warn(`执行器已存在,将被覆盖: ${implementationType}`);\n }\n this.executors.set(implementationType, executor);\n }\n\n /**\n * 获取执行器\n */\n get(implementationType: string): INodeExecutor | undefined {\n return this.executors.get(implementationType);\n }\n\n /**\n * 检查是否有执行器\n */\n has(implementationType: string): boolean {\n return this.executors.has(implementationType);\n }\n\n /**\n * 注销执行器\n */\n unregister(implementationType: string): boolean {\n return this.executors.delete(implementationType);\n }\n\n /**\n * 清空所有执行器\n */\n clear(): void {\n this.executors.clear();\n }\n}\n","import { EntitySystem, Matcher, Entity, Time, Core, ECSSystem, ServiceContainer } from '@esengine/ecs-framework';\nimport type { IBTAssetManager, IBehaviorTreeAssetContent } from '../Types/AssetManagerInterface';\nimport { BehaviorTreeRuntimeComponent } from './BehaviorTreeRuntimeComponent';\nimport { BehaviorTreeAssetManager } from './BehaviorTreeAssetManager';\nimport { NodeExecutorRegistry, NodeExecutionContext } from './NodeExecutor';\nimport { BehaviorTreeData, BehaviorNodeData } from './BehaviorTreeData';\nimport { TaskStatus } from '../Types/TaskStatus';\nimport { NodeMetadataRegistry } from './NodeMetadata';\nimport './Executors';\n\n/**\n * 行为树执行系统\n *\n * 统一处理所有行为树的执行\n */\n@ECSSystem('BehaviorTreeExecution')\nexport class BehaviorTreeExecutionSystem extends EntitySystem {\n private btAssetManager: BehaviorTreeAssetManager | null = null;\n private executorRegistry: NodeExecutorRegistry;\n private _services: ServiceContainer | null = null;\n\n /** 引用外部资产管理器(可选,由外部模块设置) */\n private _assetManager: IBTAssetManager | null = null;\n\n /** 已警告过的缺失资产,避免重复警告 */\n private _warnedMissingAssets: Set<string> = new Set();\n\n constructor(services?: ServiceContainer) {\n super(Matcher.empty().all(BehaviorTreeRuntimeComponent));\n this._services = services || null;\n this.executorRegistry = new NodeExecutorRegistry();\n this.registerBuiltInExecutors();\n }\n\n /**\n * @zh 设置外部资产管理器引用(可选)\n * @en Set external asset manager reference (optional)\n *\n * @zh 当与 ESEngine 集成时,由 BehaviorTreeRuntimeModule 调用。\n * 不使用 ESEngine 时,可以不调用此方法,\n * 直接使用 BehaviorTreeAssetManager.loadFromEditorJSON() 加载资产。\n *\n * @en Called by BehaviorTreeRuntimeModule when integrating with ESEngine.\n * When not using ESEngine, you can skip this and use\n * BehaviorTreeAssetManager.loadFromEditorJSON() to load assets directly.\n */\n setAssetManager(assetManager: IBTAssetManager | null): void {\n this._assetManager = assetManager;\n }\n\n /**\n * 启动所有 autoStart 的行为树(用于预览模式)\n * Start all autoStart behavior trees (for preview mode)\n *\n * 由于编辑器模式下系统默认禁用,实体添加时 onAdded 不会处理自动启动。\n * 预览开始时需要手动调用此方法来启动所有需要自动启动的行为树。\n */\n startAllAutoStartTrees(): void {\n if (!this.scene) {\n this.logger.warn('Scene not available, cannot start auto-start trees');\n return;\n }\n\n const entities = this.scene.entities.findEntitiesWithComponent(BehaviorTreeRuntimeComponent);\n for (const entity of entities) {\n const runtime = entity.getComponent(BehaviorTreeRuntimeComponent);\n if (runtime && runtime.autoStart && runtime.treeAssetId && !runtime.isRunning) {\n this.ensureAssetLoaded(runtime.treeAssetId).then(() => {\n if (runtime && runtime.autoStart && !runtime.isRunning) {\n runtime.start();\n this.logger.debug(`Auto-started behavior tree for entity: ${entity.name}`);\n }\n }).catch(e => {\n this.logger.error(`Failed to load behavior tree for entity ${entity.name}:`, e);\n });\n }\n }\n }\n\n /**\n * 当实体添加到系统时,处理自动启动\n * Handle auto-start when entity is added to system\n */\n protected override onAdded(entity: Entity): void {\n // 只有在系统启用时才自动启动\n // Only auto-start when system is enabled\n if (!this.enabled) return;\n\n const runtime = entity.getComponent(BehaviorTreeRuntimeComponent);\n if (runtime && runtime.autoStart && runtime.treeAssetId && !runtime.isRunning) {\n // 先尝试加载资产(如果是文件路径)\n this.ensureAssetLoaded(runtime.treeAssetId).then(() => {\n // 检查实体是否仍然有效\n if (runtime && runtime.autoStart && !runtime.isRunning) {\n runtime.start();\n this.logger.debug(`Auto-started behavior tree for entity: ${entity.name}`);\n }\n }).catch(e => {\n this.logger.error(`Failed to load behavior tree for entity ${entity.name}:`, e);\n });\n }\n }\n\n /**\n * 确保行为树资产已加载\n * Ensure behavior tree asset is loaded\n */\n private async ensureAssetLoaded(assetGuid: string): Promise<void> {\n const btAssetManager = this.getBTAssetManager();\n\n // 如果资产已存在,直接返回\n if (btAssetManager.hasAsset(assetGuid)) {\n return;\n }\n\n // 使用 AssetManager 加载(必须通过 setAssetManager 设置)\n // Use AssetManager (must be set via setAssetManager)\n if (!this._assetManager) {\n this.logger.warn(`AssetManager not set, cannot load: ${assetGuid}`);\n return;\n }\n\n try {\n // 使用 loadAsset 通过 GUID 加载,而不是 loadAssetByPath\n // Use loadAsset with GUID instead of loadAssetByPath\n const result = await this._assetManager.loadAsset(assetGuid);\n if (result && result.asset) {\n this.logger.debug(`Behavior tree loaded via AssetManager: ${assetGuid}`);\n }\n } catch (e) {\n this.logger.warn(`Failed to load via AssetManager: ${assetGuid}`, e);\n }\n }\n\n private getBTAssetManager(): BehaviorTreeAssetManager {\n if (!this.btAssetManager) {\n // 优先使用传入的 services,否则回退到全局 Core.services\n // Prefer passed services, fallback to global Core.services\n const services = this._services || Core.services;\n if (!services) {\n throw new Error('ServiceContainer is not available. Ensure Core.create() was called.');\n }\n this.btAssetManager = services.resolve(BehaviorTreeAssetManager);\n }\n return this.btAssetManager;\n }\n\n /**\n * 获取行为树数据\n * Get behavior tree data from AssetManager or BehaviorTreeAssetManager\n *\n * 优先从 AssetManager 获取(新方式),如果没有再从 BehaviorTreeAssetManager 获取(兼容旧方式)\n */\n private getTreeData(assetGuid: string): BehaviorTreeData | undefined {\n // 1. 优先从 AssetManager 获取(如果已加载)\n // First try AssetManager (preferred way)\n if (this._assetManager) {\n // 使用 getAsset 通过 GUID 获取,而不是 getAssetByPath\n // Use getAsset with GUID instead of getAssetByPath\n const cachedAsset = this._assetManager.getAsset<IBehaviorTreeAssetContent>(assetGuid);\n if (cachedAsset?.data) {\n return cachedAsset.data;\n }\n }\n\n // 2. 回退到 BehaviorTreeAssetManager(兼容旧方式)\n // Fallback to BehaviorTreeAssetManager (legacy support)\n return this.getBTAssetManager().getAsset(assetGuid);\n }\n\n /**\n * 注册所有执行器(包括内置和插件提供的)\n */\n private registerBuiltInExecutors(): void {\n const constructors = NodeMetadataRegistry.getAllExecutorConstructors();\n\n for (const [implementationType, ExecutorClass] of constructors) {\n try {\n const instance = new ExecutorClass();\n this.executorRegistry.register(implementationType, instance);\n } catch (error) {\n this.logger.error(`注册执行器失败: ${implementationType}`, error);\n }\n }\n }\n\n /**\n * 获取执行器注册表\n */\n getExecutorRegistry(): NodeExecutorRegistry {\n return this.executorRegistry;\n }\n\n protected override process(entities: readonly Entity[]): void {\n for (const entity of entities) {\n const runtime = entity.getComponent(BehaviorTreeRuntimeComponent)!;\n\n if (!runtime.isRunning) {\n continue;\n }\n\n const treeData = this.getTreeData(runtime.treeAssetId);\n if (!treeData) {\n // 只警告一次,避免每帧重复输出\n // Only warn once to avoid repeated output every frame\n if (!this._warnedMissingAssets.has(runtime.treeAssetId)) {\n this._warnedMissingAssets.add(runtime.treeAssetId);\n this.logger.warn(`未找到行为树资产: ${runtime.treeAssetId}`);\n }\n continue;\n }\n\n // 如果标记了需要重置,先重置状态\n if (runtime.needsReset) {\n runtime.resetAllStates();\n runtime.needsReset = false;\n }\n\n // 初始化黑板变量(如果行为树定义了默认值)\n // Initialize blackboard variables from tree definition\n if (treeData.blackboardVariables && treeData.blackboardVariables.size > 0) {\n runtime.initializeBlackboard(treeData.blackboardVariables);\n }\n\n this.executeTree(entity, runtime, treeData);\n }\n }\n\n /**\n * 执行整个行为树\n */\n private executeTree(\n entity: Entity,\n runtime: BehaviorTreeRuntimeComponent,\n treeData: BehaviorTreeData\n ): void {\n const rootNode = treeData.nodes.get(treeData.rootNodeId);\n if (!rootNode) {\n this.logger.error(`未找到根节点: ${treeData.rootNodeId}`);\n return;\n }\n\n const status = this.executeNode(entity, runtime, rootNode, treeData);\n\n // 如果树完成了,标记在下一个tick时重置状态\n // 这样UI可以看到节点的最终状态\n if (status !== TaskStatus.Running) {\n runtime.needsReset = true;\n } else {\n runtime.needsReset = false;\n }\n }\n\n /**\n * 执行单个节点\n */\n private executeNode(\n entity: Entity,\n runtime: BehaviorTreeRuntimeComponent,\n nodeData: BehaviorNodeData,\n treeData: BehaviorTreeData\n ): TaskStatus {\n const state = runtime.getNodeState(nodeData.id);\n\n if (runtime.shouldAbort(nodeData.id)) {\n runtime.clearAbortRequest(nodeData.id);\n state.isAborted = true;\n\n const executor = this.executorRegistry.get(nodeData.implementationType);\n if (executor && executor.reset) {\n const context = this.createContext(entity, runtime, nodeData, treeData);\n executor.reset(context);\n }\n\n runtime.activeNodeIds.delete(nodeData.id);\n state.status = TaskStatus.Failure;\n return TaskStatus.Failure;\n }\n\n runtime.activeNodeIds.add(nodeData.id);\n state.isAborted = false;\n\n if (state.executionOrder === undefined) {\n runtime.executionOrderCounter++;\n state.executionOrder = runtime.executionOrderCounter;\n }\n\n const executor = this.executorRegistry.get(nodeData.implementationType);\n if (!executor) {\n this.logger.error(`未找到执行器: ${nodeData.implementationType}`);\n state.status = TaskStatus.Failure;\n return TaskStatus.Failure;\n }\n\n const context = this.createContext(entity, runtime, nodeData, treeData);\n\n try {\n const status = executor.execute(context);\n state.status = status;\n\n if (status !== TaskStatus.Running) {\n runtime.activeNodeIds.delete(nodeData.id);\n\n if (executor.reset) {\n executor.reset(context);\n }\n }\n\n return status;\n } catch (error) {\n this.logger.error(`执行节点时发生错误: ${nodeData.name}`, error);\n state.status = TaskStatus.Failure;\n runtime.activeNodeIds.delete(nodeData.id);\n return TaskStatus.Failure;\n }\n }\n\n /**\n * 创建执行上下文\n */\n private createContext(\n entity: Entity,\n runtime: BehaviorTreeRuntimeComponent,\n nodeData: BehaviorNodeData,\n treeData: BehaviorTreeData\n ): NodeExecutionContext {\n return {\n entity,\n nodeData,\n state: runtime.getNodeState(nodeData.id),\n runtime,\n treeData,\n deltaTime: Time.deltaTime,\n totalTime: Time.totalTime,\n executeChild: (childId: string) => {\n const childData = treeData.nodes.get(childId);\n if (!childData) {\n this.logger.warn(`未找到子节点: ${childId}`);\n return TaskStatus.Failure;\n }\n return this.executeNode(entity, runtime, childData, treeData);\n }\n };\n }\n\n /**\n * 执行子节点列表\n */\n executeChildren(\n context: NodeExecutionContext,\n childIndices?: number[]\n ): TaskStatus[] {\n const { nodeData, treeData, entity, runtime } = context;\n\n if (!nodeData.children || nodeData.children.length === 0) {\n return [];\n }\n\n const results: TaskStatus[] = [];\n const indicesToExecute = childIndices ||\n Array.from({ length: nodeData.children.length }, (_, i) => i);\n\n for (const index of indicesToExecute) {\n if (index >= nodeData.children.length) {\n continue;\n }\n\n const childId = nodeData.children[index]!;\n const childData = treeData.nodes.get(childId);\n\n if (!childData) {\n this.logger.warn(`未找到子节点: ${childId}`);\n results.push(TaskStatus.Failure);\n continue;\n }\n\n const status = this.executeNode(entity, runtime, childData, treeData);\n results.push(status);\n }\n\n return results;\n }\n}\n","import { NodeType } from '../Types/TaskStatus';\n\n/**\n * 配置参数定义\n */\nexport interface ConfigFieldDefinition {\n type: 'string' | 'number' | 'boolean' | 'object' | 'array';\n default?: any;\n description?: string;\n min?: number;\n max?: number;\n options?: string[];\n supportBinding?: boolean;\n allowMultipleConnections?: boolean;\n}\n\n/**\n * 子节点约束配置\n */\nexport interface ChildrenConstraints {\n min?: number;\n max?: number;\n required?: boolean;\n}\n\n/**\n * 节点元数据\n */\nexport interface NodeMetadata {\n implementationType: string;\n nodeType: NodeType;\n displayName: string;\n description?: string;\n category?: string;\n configSchema?: Record<string, ConfigFieldDefinition>;\n childrenConstraints?: ChildrenConstraints;\n}\n\n/**\n * 节点元数据默认值\n */\nexport class NodeMetadataDefaults {\n static getDefaultConstraints(nodeType: NodeType): ChildrenConstraints | undefined {\n switch (nodeType) {\n case NodeType.Composite:\n return { min: 1 };\n case NodeType.Decorator:\n return { min: 1, max: 1 };\n case NodeType.Action:\n case NodeType.Condition:\n return { max: 0 };\n default:\n return undefined;\n }\n }\n}\n\n/**\n * 节点元数据注册表\n */\nexport class NodeMetadataRegistry {\n private static metadataMap: Map<string, NodeMetadata> = new Map();\n private static executorClassMap: Map<Function, string> = new Map();\n private static executorConstructors: Map<string, new () => any> = new Map();\n\n static register(target: Function, metadata: NodeMetadata): void {\n this.metadataMap.set(metadata.implementationType, metadata);\n this.executorClassMap.set(target, metadata.implementationType);\n this.executorConstructors.set(metadata.implementationType, target as new () => any);\n }\n\n static getMetadata(implementationType: string): NodeMetadata | undefined {\n return this.metadataMap.get(implementationType);\n }\n\n static getAllMetadata(): NodeMetadata[] {\n return Array.from(this.metadataMap.values());\n }\n\n static getByCategory(category: string): NodeMetadata[] {\n return this.getAllMetadata().filter((m) => m.category === category);\n }\n\n static getByNodeType(nodeType: NodeType): NodeMetadata[] {\n return this.getAllMetadata().filter((m) => m.nodeType === nodeType);\n }\n\n static getImplementationType(executorClass: Function): string | undefined {\n return this.executorClassMap.get(executorClass);\n }\n\n static getExecutorConstructor(implementationType: string): (new () => any) | undefined {\n return this.executorConstructors.get(implementationType);\n }\n\n static getAllExecutorConstructors(): Map<string, new () => any> {\n return new Map(this.executorConstructors);\n }\n}\n\n/**\n * 节点执行器元数据装饰器\n */\nexport function NodeExecutorMetadata(metadata: NodeMetadata) {\n return function (target: Function) {\n NodeMetadataRegistry.register(target, metadata);\n };\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 根节点执行器\n *\n * 行为树的入口节点,执行其唯一的子节点\n */\n@NodeExecutorMetadata({\n implementationType: 'Root',\n nodeType: NodeType.Root,\n displayName: '根节点',\n description: '行为树的入口节点',\n category: 'Root',\n childrenConstraints: {\n min: 1,\n max: 1\n }\n})\nexport class RootExecutor implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { nodeData } = context;\n\n // 根节点必须有且仅有一个子节点\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n\n const childId = nodeData.children[0]!;\n return context.executeChild(childId);\n }\n\n reset(_context: NodeExecutionContext): void {\n // 根节点没有需要重置的状态\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 序列节点执行器\n *\n * 按顺序执行子节点,全部成功才成功,任一失败则失败\n */\n@NodeExecutorMetadata({\n implementationType: 'Sequence',\n nodeType: NodeType.Composite,\n displayName: '序列',\n description: '按顺序执行子节点,全部成功才成功',\n category: 'Composite',\n childrenConstraints: {\n min: 1\n }\n})\nexport class SequenceExecutor implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { nodeData, state } = context;\n\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Success;\n }\n\n while (state.currentChildIndex < nodeData.children.length) {\n const childId = nodeData.children[state.currentChildIndex]!;\n const status = context.executeChild(childId);\n\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n\n if (status === TaskStatus.Failure) {\n state.currentChildIndex = 0;\n return TaskStatus.Failure;\n }\n\n state.currentChildIndex++;\n }\n\n state.currentChildIndex = 0;\n return TaskStatus.Success;\n }\n\n reset(context: NodeExecutionContext): void {\n context.state.currentChildIndex = 0;\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 选择器节点执行器\n *\n * 按顺序执行子节点,任一成功则成功,全部失败才失败\n */\n@NodeExecutorMetadata({\n implementationType: 'Selector',\n nodeType: NodeType.Composite,\n displayName: '选择器',\n description: '按顺序执行子节点,任一成功则成功',\n category: 'Composite',\n childrenConstraints: {\n min: 1\n }\n})\nexport class SelectorExecutor implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { nodeData, state } = context;\n\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n\n while (state.currentChildIndex < nodeData.children.length) {\n const childId = nodeData.children[state.currentChildIndex]!;\n const status = context.executeChild(childId);\n\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n\n if (status === TaskStatus.Success) {\n state.currentChildIndex = 0;\n return TaskStatus.Success;\n }\n\n state.currentChildIndex++;\n }\n\n state.currentChildIndex = 0;\n return TaskStatus.Failure;\n }\n\n reset(context: NodeExecutionContext): void {\n context.state.currentChildIndex = 0;\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext, BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 并行节点执行器\n *\n * 同时执行所有子节点\n */\n@NodeExecutorMetadata({\n implementationType: 'Parallel',\n nodeType: NodeType.Composite,\n displayName: '并行',\n description: '同时执行所有子节点',\n category: 'Composite',\n configSchema: {\n successPolicy: {\n type: 'string',\n default: 'all',\n description: '成功策略',\n options: ['all', 'one']\n },\n failurePolicy: {\n type: 'string',\n default: 'one',\n description: '失败策略',\n options: ['all', 'one']\n }\n },\n childrenConstraints: {\n min: 2\n }\n})\nexport class ParallelExecutor implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { nodeData } = context;\n const successPolicy = BindingHelper.getValue<string>(context, 'successPolicy', 'all');\n const failurePolicy = BindingHelper.getValue<string>(context, 'failurePolicy', 'one');\n\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Success;\n }\n\n let hasRunning = false;\n let successCount = 0;\n let failureCount = 0;\n\n for (const childId of nodeData.children) {\n const status = context.executeChild(childId);\n\n if (status === TaskStatus.Running) {\n hasRunning = true;\n } else if (status === TaskStatus.Success) {\n successCount++;\n } else if (status === TaskStatus.Failure) {\n failureCount++;\n }\n }\n\n if (successPolicy === 'one' && successCount > 0) {\n this.stopAllChildren(context);\n return TaskStatus.Success;\n }\n\n if (successPolicy === 'all' && successCount === nodeData.children.length) {\n return TaskStatus.Success;\n }\n\n if (failurePolicy === 'one' && failureCount > 0) {\n this.stopAllChildren(context);\n return TaskStatus.Failure;\n }\n\n if (failurePolicy === 'all' && failureCount === nodeData.children.length) {\n return TaskStatus.Failure;\n }\n\n return hasRunning ? TaskStatus.Running : TaskStatus.Success;\n }\n\n private stopAllChildren(context: NodeExecutionContext): void {\n const { nodeData, runtime } = context;\n if (!nodeData.children) return;\n\n for (const childId of nodeData.children) {\n runtime.activeNodeIds.delete(childId);\n runtime.resetNodeState(childId);\n }\n }\n\n reset(context: NodeExecutionContext): void {\n const { nodeData, runtime } = context;\n if (!nodeData.children) return;\n\n for (const childId of nodeData.children) {\n runtime.resetNodeState(childId);\n }\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext, BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 并行选择器执行器\n *\n * 并行执行子节点,任一成功则成功\n */\n@NodeExecutorMetadata({\n implementationType: 'ParallelSelector',\n nodeType: NodeType.Composite,\n displayName: '并行选择器',\n description: '并行执行子节点,任一成功则成功',\n category: 'Composite',\n configSchema: {\n failurePolicy: {\n type: 'string',\n default: 'all',\n description: '失败策略',\n options: ['all', 'one']\n }\n }\n})\nexport class ParallelSelectorExecutor implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { nodeData } = context;\n const failurePolicy = BindingHelper.getValue<string>(context, 'failurePolicy', 'all');\n\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n\n let hasRunning = false;\n let successCount = 0;\n let failureCount = 0;\n\n for (const childId of nodeData.children) {\n const status = context.executeChild(childId);\n\n if (status === TaskStatus.Running) {\n hasRunning = true;\n } else if (status === TaskStatus.Success) {\n successCount++;\n } else if (status === TaskStatus.Failure) {\n failureCount++;\n }\n }\n\n if (successCount > 0) {\n this.stopAllChildren(context);\n return TaskStatus.Success;\n }\n\n if (failurePolicy === 'one' && failureCount > 0) {\n this.stopAllChildren(context);\n return TaskStatus.Failure;\n }\n\n if (failurePolicy === 'all' && failureCount === nodeData.children.length) {\n return TaskStatus.Failure;\n }\n\n return hasRunning ? TaskStatus.Running : TaskStatus.Failure;\n }\n\n private stopAllChildren(context: NodeExecutionContext): void {\n const { nodeData, runtime } = context;\n if (!nodeData.children) return;\n\n for (const childId of nodeData.children) {\n runtime.activeNodeIds.delete(childId);\n runtime.resetNodeState(childId);\n }\n }\n\n reset(context: NodeExecutionContext): void {\n const { nodeData, runtime } = context;\n if (!nodeData.children) return;\n\n for (const childId of nodeData.children) {\n runtime.resetNodeState(childId);\n }\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 随机序列执行器\n *\n * 随机顺序执行子节点序列,全部成功才成功\n */\n@NodeExecutorMetadata({\n implementationType: 'RandomSequence',\n nodeType: NodeType.Composite,\n displayName: '随机序列',\n description: '随机顺序执行子节点,全部成功才成功',\n category: 'Composite',\n childrenConstraints: {\n min: 1\n }\n})\nexport class RandomSequenceExecutor implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { nodeData, state } = context;\n\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Success;\n }\n\n if (!state.shuffledIndices || state.shuffledIndices.length === 0) {\n state.shuffledIndices = this.shuffleIndices(nodeData.children.length);\n }\n\n while (state.currentChildIndex < state.shuffledIndices.length) {\n const shuffledIndex = state.shuffledIndices[state.currentChildIndex]!;\n const childId = nodeData.children[shuffledIndex]!;\n const status = context.executeChild(childId);\n\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n\n if (status === TaskStatus.Failure) {\n state.currentChildIndex = 0;\n delete state.shuffledIndices;\n return TaskStatus.Failure;\n }\n\n state.currentChildIndex++;\n }\n\n state.currentChildIndex = 0;\n delete state.shuffledIndices;\n return TaskStatus.Success;\n }\n\n private shuffleIndices(length: number): number[] {\n const indices = Array.from({ length }, (_, i) => i);\n for (let i = indices.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const temp = indices[i]!;\n indices[i] = indices[j]!;\n indices[j] = temp;\n }\n return indices;\n }\n\n reset(context: NodeExecutionContext): void {\n context.state.currentChildIndex = 0;\n delete context.state.shuffledIndices;\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 随机选择器执行器\n *\n * 随机顺序执行子节点,任一成功则成功\n */\n@NodeExecutorMetadata({\n implementationType: 'RandomSelector',\n nodeType: NodeType.Composite,\n displayName: '随机选择器',\n description: '随机顺序执行子节点,任一成功则成功',\n category: 'Composite'\n})\nexport class RandomSelectorExecutor implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { nodeData, state } = context;\n\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n\n if (!state.shuffledIndices || state.shuffledIndices.length === 0) {\n state.shuffledIndices = this.shuffleIndices(nodeData.children.length);\n }\n\n while (state.currentChildIndex < state.shuffledIndices.length) {\n const shuffledIndex = state.shuffledIndices[state.currentChildIndex]!;\n const childId = nodeData.children[shuffledIndex]!;\n const status = context.executeChild(childId);\n\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n\n if (status === TaskStatus.Success) {\n state.currentChildIndex = 0;\n delete state.shuffledIndices;\n return TaskStatus.Success;\n }\n\n state.currentChildIndex++;\n }\n\n state.currentChildIndex = 0;\n delete state.shuffledIndices;\n return TaskStatus.Failure;\n }\n\n private shuffleIndices(length: number): number[] {\n const indices = Array.from({ length }, (_, i) => i);\n for (let i = indices.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const temp = indices[i]!;\n indices[i] = indices[j]!;\n indices[j] = temp;\n }\n return indices;\n }\n\n reset(context: NodeExecutionContext): void {\n context.state.currentChildIndex = 0;\n delete context.state.shuffledIndices;\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 反转装饰器执行器\n *\n * 反转子节点的执行结果\n */\n@NodeExecutorMetadata({\n implementationType: 'Inverter',\n nodeType: NodeType.Decorator,\n displayName: '反转',\n description: '反转子节点的执行结果',\n category: 'Decorator',\n childrenConstraints: {\n min: 1,\n max: 1\n }\n})\nexport class InverterExecutor implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { nodeData } = context;\n\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n\n const childId = nodeData.children[0]!;\n const status = context.executeChild(childId);\n\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n\n if (status === TaskStatus.Success) {\n return TaskStatus.Failure;\n }\n\n if (status === TaskStatus.Failure) {\n return TaskStatus.Success;\n }\n\n return TaskStatus.Failure;\n }\n\n reset(context: NodeExecutionContext): void {\n if (context.nodeData.children && context.nodeData.children.length > 0) {\n context.runtime.resetNodeState(context.nodeData.children[0]!);\n }\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext, BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 重复装饰器执行器\n *\n * 重复执行子节点指定次数\n */\n@NodeExecutorMetadata({\n implementationType: 'Repeater',\n nodeType: NodeType.Decorator,\n displayName: '重复',\n description: '重复执行子节点指定次数',\n category: 'Decorator',\n configSchema: {\n repeatCount: {\n type: 'number',\n default: 1,\n description: '重复次数(-1表示无限循环)',\n supportBinding: true\n },\n endOnFailure: {\n type: 'boolean',\n default: false,\n description: '子节点失败时是否结束'\n }\n },\n childrenConstraints: {\n min: 1,\n max: 1\n }\n})\nexport class RepeaterExecutor implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { nodeData, state, runtime } = context;\n const repeatCount = BindingHelper.getValue<number>(context, 'repeatCount', 1);\n const endOnFailure = BindingHelper.getValue<boolean>(context, 'endOnFailure', false);\n\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Success;\n }\n\n const childId = nodeData.children[0]!;\n\n if (!state.repeatCount) {\n state.repeatCount = 0;\n }\n\n const status = context.executeChild(childId);\n\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n\n if (status === TaskStatus.Failure && endOnFailure) {\n state.repeatCount = 0;\n return TaskStatus.Failure;\n }\n\n state.repeatCount++;\n runtime.resetNodeState(childId);\n\n const shouldContinue = (repeatCount === -1) || (state.repeatCount < repeatCount);\n\n if (shouldContinue) {\n return TaskStatus.Running;\n } else {\n state.repeatCount = 0;\n return TaskStatus.Success;\n }\n }\n\n reset(context: NodeExecutionContext): void {\n delete context.state.repeatCount;\n if (context.nodeData.children && context.nodeData.children.length > 0) {\n context.runtime.resetNodeState(context.nodeData.children[0]!);\n }\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 总是成功装饰器执行器\n *\n * 无论子节点结果如何都返回成功\n */\n@NodeExecutorMetadata({\n implementationType: 'AlwaysSucceed',\n nodeType: NodeType.Decorator,\n displayName: '总是成功',\n description: '无论子节点结果如何都返回成功',\n category: 'Decorator'\n})\nexport class AlwaysSucceedExecutor implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { nodeData } = context;\n\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Success;\n }\n\n const childId = nodeData.children[0]!;\n const status = context.executeChild(childId);\n\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n\n return TaskStatus.Success;\n }\n\n reset(context: NodeExecutionContext): void {\n if (context.nodeData.children && context.nodeData.children.length > 0) {\n context.runtime.resetNodeState(context.nodeData.children[0]!);\n }\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 总是失败装饰器执行器\n *\n * 无论子节点结果如何都返回失败\n */\n@NodeExecutorMetadata({\n implementationType: 'AlwaysFail',\n nodeType: NodeType.Decorator,\n displayName: '总是失败',\n description: '无论子节点结果如何都返回失败',\n category: 'Decorator'\n})\nexport class AlwaysFailExecutor implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { nodeData } = context;\n\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n\n const childId = nodeData.children[0]!;\n const status = context.executeChild(childId);\n\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n\n return TaskStatus.Failure;\n }\n\n reset(context: NodeExecutionContext): void {\n if (context.nodeData.children && context.nodeData.children.length > 0) {\n context.runtime.resetNodeState(context.nodeData.children[0]!);\n }\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 直到成功装饰器执行器\n *\n * 重复执行子节点直到成功\n */\n@NodeExecutorMetadata({\n implementationType: 'UntilSuccess',\n nodeType: NodeType.Decorator,\n displayName: '直到成功',\n description: '重复执行子节点直到成功',\n category: 'Decorator'\n})\nexport class UntilSuccessExecutor implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { nodeData, runtime } = context;\n\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n\n const childId = nodeData.children[0]!;\n const status = context.executeChild(childId);\n\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n\n if (status === TaskStatus.Success) {\n return TaskStatus.Success;\n }\n\n runtime.resetNodeState(childId);\n return TaskStatus.Running;\n }\n\n reset(context: NodeExecutionContext): void {\n if (context.nodeData.children && context.nodeData.children.length > 0) {\n context.runtime.resetNodeState(context.nodeData.children[0]!);\n }\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 直到失败装饰器执行器\n *\n * 重复执行子节点直到失败\n */\n@NodeExecutorMetadata({\n implementationType: 'UntilFail',\n nodeType: NodeType.Decorator,\n displayName: '直到失败',\n description: '重复执行子节点直到失败',\n category: 'Decorator'\n})\nexport class UntilFailExecutor implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { nodeData, runtime } = context;\n\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Success;\n }\n\n const childId = nodeData.children[0]!;\n const status = context.executeChild(childId);\n\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n\n if (status === TaskStatus.Failure) {\n return TaskStatus.Failure;\n }\n\n runtime.resetNodeState(childId);\n return TaskStatus.Running;\n }\n\n reset(context: NodeExecutionContext): void {\n if (context.nodeData.children && context.nodeData.children.length > 0) {\n context.runtime.resetNodeState(context.nodeData.children[0]!);\n }\n }\n}\n","import { TaskStatus, NodeType, AbortType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext, BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 条件装饰器执行器\n *\n * 根据条件决定是否执行子节点\n * 支持动态优先级和中止机制\n */\n@NodeExecutorMetadata({\n implementationType: 'Conditional',\n nodeType: NodeType.Decorator,\n displayName: '条件',\n description: '根据条件决定是否执行子节点',\n category: 'Decorator',\n configSchema: {\n blackboardKey: {\n type: 'string',\n default: '',\n description: '黑板变量名'\n },\n expectedValue: {\n type: 'object',\n description: '期望值',\n supportBinding: true\n },\n operator: {\n type: 'string',\n default: 'equals',\n description: '比较运算符',\n options: ['equals', 'notEquals', 'greaterThan', 'lessThan', 'greaterOrEqual', 'lessOrEqual']\n },\n abortType: {\n type: 'string',\n default: 'none',\n description: '中止类型',\n options: ['none', 'self', 'lower-priority', 'both']\n }\n }\n})\nexport class ConditionalExecutor implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { nodeData, runtime, state } = context;\n\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n\n const blackboardKey = BindingHelper.getValue<string>(context, 'blackboardKey', '');\n const expectedValue = BindingHelper.getValue(context, 'expectedValue');\n const operator = BindingHelper.getValue<string>(context, 'operator', 'equals');\n const abortType = (nodeData.abortType || AbortType.None) as AbortType;\n\n if (!blackboardKey) {\n return TaskStatus.Failure;\n }\n\n const actualValue = runtime.getBlackboardValue(blackboardKey);\n const conditionMet = this.evaluateCondition(actualValue, expectedValue, operator);\n\n const wasRunning = state.status === TaskStatus.Running;\n\n if (abortType !== AbortType.None) {\n if (!state.observedKeys || state.observedKeys.length === 0) {\n state.observedKeys = [blackboardKey];\n this.setupObserver(context, blackboardKey, expectedValue, operator, abortType);\n }\n\n if (state.lastConditionResult !== undefined && state.lastConditionResult !== conditionMet) {\n if (conditionMet) {\n this.handleConditionBecameTrue(context, abortType);\n } else if (wasRunning) {\n this.handleConditionBecameFalse(context, abortType);\n }\n }\n }\n\n state.lastConditionResult = conditionMet;\n\n if (!conditionMet) {\n return TaskStatus.Failure;\n }\n\n const childId = nodeData.children[0]!;\n const status = context.executeChild(childId);\n\n return status;\n }\n\n private evaluateCondition(actualValue: any, expectedValue: any, operator: string): boolean {\n switch (operator) {\n case 'equals':\n return actualValue === expectedValue;\n case 'notEquals':\n return actualValue !== expectedValue;\n case 'greaterThan':\n return actualValue > expectedValue;\n case 'lessThan':\n return actualValue < expectedValue;\n case 'greaterOrEqual':\n return actualValue >= expectedValue;\n case 'lessOrEqual':\n return actualValue <= expectedValue;\n default:\n return false;\n }\n }\n\n /**\n * 设置黑板观察者\n */\n private setupObserver(\n context: NodeExecutionContext,\n blackboardKey: string,\n expectedValue: any,\n operator: string,\n abortType: AbortType\n ): void {\n const { nodeData, runtime } = context;\n\n runtime.observeBlackboard(nodeData.id, [blackboardKey], (_key, newValue) => {\n const conditionMet = this.evaluateCondition(newValue, expectedValue, operator);\n const lastResult = context.state.lastConditionResult;\n\n if (lastResult !== undefined && lastResult !== conditionMet) {\n if (conditionMet) {\n this.handleConditionBecameTrue(context, abortType);\n } else {\n this.handleConditionBecameFalse(context, abortType);\n }\n }\n\n context.state.lastConditionResult = conditionMet;\n });\n }\n\n /**\n * 处理条件变为true\n */\n private handleConditionBecameTrue(context: NodeExecutionContext, abortType: AbortType): void {\n if (abortType === AbortType.LowerPriority || abortType === AbortType.Both) {\n this.requestAbortLowerPriority(context);\n }\n }\n\n /**\n * 处理条件变为false\n */\n private handleConditionBecameFalse(context: NodeExecutionContext, abortType: AbortType): void {\n const { nodeData, runtime } = context;\n\n if (abortType === AbortType.Self || abortType === AbortType.Both) {\n if (nodeData.children && nodeData.children.length > 0) {\n runtime.requestAbort(nodeData.children[0]!);\n }\n }\n }\n\n /**\n * 请求中止低优先级节点\n */\n private requestAbortLowerPriority(context: NodeExecutionContext): void {\n const { runtime } = context;\n runtime.requestAbort('__lower_priority__');\n }\n\n reset(context: NodeExecutionContext): void {\n const { nodeData, runtime, state } = context;\n\n if (state.observedKeys && state.observedKeys.length > 0) {\n runtime.unobserveBlackboard(nodeData.id);\n delete state.observedKeys;\n }\n\n delete state.lastConditionResult;\n\n if (nodeData.children && nodeData.children.length > 0) {\n runtime.resetNodeState(nodeData.children[0]!);\n }\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext, BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 冷却装饰器执行器\n *\n * 子节点执行成功后进入冷却时间\n */\n@NodeExecutorMetadata({\n implementationType: 'Cooldown',\n nodeType: NodeType.Decorator,\n displayName: '冷却',\n description: '子节点执行成功后进入冷却时间',\n category: 'Decorator',\n configSchema: {\n cooldownTime: {\n type: 'number',\n default: 1.0,\n description: '冷却时间(秒)',\n min: 0,\n supportBinding: true\n }\n }\n})\nexport class CooldownExecutor implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { nodeData, state, totalTime } = context;\n\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n\n const cooldownTime = BindingHelper.getValue<number>(context, 'cooldownTime', 1.0);\n\n if (state.lastExecutionTime !== undefined) {\n const timeSinceLastExecution = totalTime - state.lastExecutionTime;\n if (timeSinceLastExecution < cooldownTime) {\n return TaskStatus.Failure;\n }\n }\n\n const childId = nodeData.children[0]!;\n const status = context.executeChild(childId);\n\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n\n if (status === TaskStatus.Success) {\n state.lastExecutionTime = totalTime;\n return TaskStatus.Success;\n }\n\n return TaskStatus.Failure;\n }\n\n reset(context: NodeExecutionContext): void {\n delete context.state.lastExecutionTime;\n if (context.nodeData.children && context.nodeData.children.length > 0) {\n context.runtime.resetNodeState(context.nodeData.children[0]!);\n }\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext, BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 超时装饰器执行器\n *\n * 限制子节点的执行时间\n */\n@NodeExecutorMetadata({\n implementationType: 'Timeout',\n nodeType: NodeType.Decorator,\n displayName: '超时',\n description: '限制子节点的执行时间',\n category: 'Decorator',\n configSchema: {\n timeout: {\n type: 'number',\n default: 1.0,\n description: '超时时间(秒)',\n min: 0,\n supportBinding: true\n }\n }\n})\nexport class TimeoutExecutor implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { nodeData, state, totalTime } = context;\n\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n\n const timeout = BindingHelper.getValue<number>(context, 'timeout', 1.0);\n\n if (state.startTime === undefined) {\n state.startTime = totalTime;\n }\n\n const elapsedTime = totalTime - state.startTime;\n if (elapsedTime >= timeout) {\n delete state.startTime;\n return TaskStatus.Failure;\n }\n\n const childId = nodeData.children[0]!;\n const status = context.executeChild(childId);\n\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n\n delete state.startTime;\n return status;\n }\n\n reset(context: NodeExecutionContext): void {\n delete context.state.startTime;\n if (context.nodeData.children && context.nodeData.children.length > 0) {\n context.runtime.resetNodeState(context.nodeData.children[0]!);\n }\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext, BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * Service执行接口\n */\nexport interface IServiceExecutor {\n /**\n * Service开始执行\n */\n onServiceStart?(context: NodeExecutionContext): void;\n\n /**\n * Service每帧更新\n */\n onServiceTick(context: NodeExecutionContext): void;\n\n /**\n * Service结束执行\n */\n onServiceEnd?(context: NodeExecutionContext): void;\n}\n\n/**\n * Service注册表\n */\nclass ServiceRegistry {\n private static services: Map<string, IServiceExecutor> = new Map();\n\n static register(name: string, service: IServiceExecutor): void {\n this.services.set(name, service);\n }\n\n static get(name: string): IServiceExecutor | undefined {\n return this.services.get(name);\n }\n\n static has(name: string): boolean {\n return this.services.has(name);\n }\n\n static unregister(name: string): boolean {\n return this.services.delete(name);\n }\n}\n\n/**\n * Service装饰器执行器\n *\n * 在子节点执行期间持续运行后台逻辑\n */\n@NodeExecutorMetadata({\n implementationType: 'Service',\n nodeType: NodeType.Decorator,\n displayName: 'Service',\n description: '在子节点执行期间持续运行后台逻辑',\n category: 'Decorator',\n configSchema: {\n serviceName: {\n type: 'string',\n default: '',\n description: 'Service名称'\n },\n tickInterval: {\n type: 'number',\n default: 0,\n description: 'Service更新间隔(秒,0表示每帧更新)',\n supportBinding: true\n }\n }\n})\nexport class ServiceDecorator implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { nodeData, state, totalTime } = context;\n\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n\n const serviceName = BindingHelper.getValue<string>(context, 'serviceName', '');\n const tickInterval = BindingHelper.getValue<number>(context, 'tickInterval', 0);\n\n if (!serviceName) {\n return TaskStatus.Failure;\n }\n\n const service = ServiceRegistry.get(serviceName);\n if (!service) {\n console.warn(`未找到Service: ${serviceName}`);\n return TaskStatus.Failure;\n }\n\n if (state.status !== TaskStatus.Running) {\n state.startTime = totalTime;\n state.lastExecutionTime = totalTime;\n\n if (service.onServiceStart) {\n service.onServiceStart(context);\n }\n }\n\n const shouldTick = tickInterval === 0 ||\n (state.lastExecutionTime !== undefined &&\n (totalTime - state.lastExecutionTime) >= tickInterval);\n\n if (shouldTick) {\n service.onServiceTick(context);\n state.lastExecutionTime = totalTime;\n }\n\n const childId = nodeData.children[0]!;\n const childStatus = context.executeChild(childId);\n\n if (childStatus !== TaskStatus.Running) {\n if (service.onServiceEnd) {\n service.onServiceEnd(context);\n }\n }\n\n return childStatus;\n }\n\n reset(context: NodeExecutionContext): void {\n const { nodeData, runtime, state } = context;\n\n const serviceName = BindingHelper.getValue<string>(context, 'serviceName', '');\n if (serviceName) {\n const service = ServiceRegistry.get(serviceName);\n if (service && service.onServiceEnd) {\n service.onServiceEnd(context);\n }\n }\n\n delete state.startTime;\n delete state.lastExecutionTime;\n\n if (nodeData.children && nodeData.children.length > 0) {\n runtime.resetNodeState(nodeData.children[0]!);\n }\n }\n}\n\nexport { ServiceRegistry };\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext, BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 等待动作执行器\n *\n * 等待指定时间后返回成功\n */\n@NodeExecutorMetadata({\n implementationType: 'Wait',\n nodeType: NodeType.Action,\n displayName: '等待',\n description: '等待指定时间后返回成功',\n category: 'Action',\n configSchema: {\n duration: {\n type: 'number',\n default: 1.0,\n description: '等待时长(秒)',\n min: 0,\n supportBinding: true\n }\n }\n})\nexport class WaitAction implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { state, totalTime } = context;\n const duration = BindingHelper.getValue<number>(context, 'duration', 1.0);\n\n if (!state.startTime) {\n state.startTime = totalTime;\n return TaskStatus.Running;\n }\n\n if (totalTime - state.startTime >= duration) {\n return TaskStatus.Success;\n }\n\n return TaskStatus.Running;\n }\n\n reset(context: NodeExecutionContext): void {\n delete context.state.startTime;\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext, BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 日志动作执行器\n *\n * 输出日志信息\n */\n@NodeExecutorMetadata({\n implementationType: 'Log',\n nodeType: NodeType.Action,\n displayName: '日志',\n description: '输出日志信息',\n category: 'Action',\n configSchema: {\n message: {\n type: 'string',\n default: '',\n description: '日志消息,支持{key}占位符引用黑板变量',\n supportBinding: true\n },\n logLevel: {\n type: 'string',\n default: 'info',\n description: '日志级别',\n options: ['info', 'warn', 'error']\n }\n }\n})\nexport class LogAction implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { runtime } = context;\n const message = BindingHelper.getValue<string>(context, 'message', '');\n const logLevel = BindingHelper.getValue<string>(context, 'logLevel', 'info');\n\n const finalMessage = this.replaceBlackboardVariables(message, runtime);\n\n this.log(finalMessage, logLevel);\n\n return TaskStatus.Success;\n }\n\n private replaceBlackboardVariables(message: string, runtime: NodeExecutionContext['runtime']): string {\n if (!message.includes('{') || !message.includes('}')) {\n return message;\n }\n\n // 使用限制长度的正则表达式避免 ReDoS 攻击\n // 限制占位符名称最多100个字符,只允许字母、数字、下划线和点号\n return message.replace(/\\{([\\w.]{1,100})\\}/g, (_, key) => {\n const value = runtime.getBlackboardValue(key.trim());\n return value !== undefined ? String(value) : `{${key}}`;\n });\n }\n\n private log(message: string, level: string): void {\n switch (level) {\n case 'error':\n console.error(message);\n break;\n case 'warn':\n console.warn(message);\n break;\n case 'info':\n default:\n console.log(message);\n break;\n }\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext, BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 设置黑板值动作执行器\n *\n * 设置黑板中的变量值\n */\n@NodeExecutorMetadata({\n implementationType: 'SetBlackboardValue',\n nodeType: NodeType.Action,\n displayName: '设置黑板值',\n description: '设置黑板中的变量值',\n category: 'Action',\n configSchema: {\n key: {\n type: 'string',\n default: '',\n description: '黑板变量名'\n },\n value: {\n type: 'object',\n description: '要设置的值',\n supportBinding: true\n }\n }\n})\nexport class SetBlackboardValue implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { runtime } = context;\n const key = BindingHelper.getValue<string>(context, 'key', '');\n const value = BindingHelper.getValue(context, 'value');\n\n if (!key) {\n return TaskStatus.Failure;\n }\n\n runtime.setBlackboardValue(key, value);\n\n return TaskStatus.Success;\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext, BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 修改黑板值动作执行器\n *\n * 对黑板中的数值进行运算\n */\n@NodeExecutorMetadata({\n implementationType: 'ModifyBlackboardValue',\n nodeType: NodeType.Action,\n displayName: '修改黑板值',\n description: '对黑板中的数值进行运算',\n category: 'Action',\n configSchema: {\n key: {\n type: 'string',\n default: '',\n description: '黑板变量名'\n },\n operation: {\n type: 'string',\n default: 'add',\n description: '运算类型',\n options: ['add', 'subtract', 'multiply', 'divide', 'set']\n },\n value: {\n type: 'number',\n default: 0,\n description: '操作数',\n supportBinding: true\n }\n }\n})\nexport class ModifyBlackboardValue implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { runtime } = context;\n const key = BindingHelper.getValue<string>(context, 'key', '');\n const operation = BindingHelper.getValue<string>(context, 'operation', 'add');\n const value = BindingHelper.getValue<number>(context, 'value', 0);\n\n if (!key) {\n return TaskStatus.Failure;\n }\n\n const currentValue = runtime.getBlackboardValue<number>(key) || 0;\n let newValue: number;\n\n switch (operation) {\n case 'add':\n newValue = currentValue + value;\n break;\n case 'subtract':\n newValue = currentValue - value;\n break;\n case 'multiply':\n newValue = currentValue * value;\n break;\n case 'divide':\n newValue = value !== 0 ? currentValue / value : currentValue;\n break;\n case 'set':\n newValue = value;\n break;\n default:\n return TaskStatus.Failure;\n }\n\n runtime.setBlackboardValue(key, newValue);\n\n return TaskStatus.Success;\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext, BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 执行动作执行器\n *\n * 执行自定义动作逻辑\n */\n@NodeExecutorMetadata({\n implementationType: 'ExecuteAction',\n nodeType: NodeType.Action,\n displayName: '执行动作',\n description: '执行自定义动作逻辑',\n category: 'Action',\n configSchema: {\n actionName: {\n type: 'string',\n default: '',\n description: '动作名称(黑板中action_前缀的函数)'\n }\n }\n})\nexport class ExecuteAction implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { runtime, entity } = context;\n const actionName = BindingHelper.getValue<string>(context, 'actionName', '');\n\n if (!actionName) {\n return TaskStatus.Failure;\n }\n\n const actionFunction = runtime.getBlackboardValue<(entity: NodeExecutionContext['entity']) => TaskStatus>(`action_${actionName}`);\n\n if (!actionFunction || typeof actionFunction !== 'function') {\n return TaskStatus.Failure;\n }\n\n try {\n return actionFunction(entity);\n } catch (error) {\n console.error(`ExecuteAction failed: ${error}`);\n return TaskStatus.Failure;\n }\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext, BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\nimport { BehaviorTreeAssetManager } from '../BehaviorTreeAssetManager';\nimport { Core } from '@esengine/ecs-framework';\n\n/**\n * SubTree执行器\n *\n * 引用并执行其他行为树,实现模块化和复用\n */\n@NodeExecutorMetadata({\n implementationType: 'SubTree',\n nodeType: NodeType.Action,\n displayName: '子树',\n description: '引用并执行其他行为树',\n category: 'Special',\n configSchema: {\n treeAssetId: {\n type: 'string',\n default: '',\n description: '要执行的行为树资产ID',\n supportBinding: true\n },\n shareBlackboard: {\n type: 'boolean',\n default: true,\n description: '是否共享黑板数据'\n }\n }\n})\nexport class SubTreeExecutor implements INodeExecutor {\n private assetManager: BehaviorTreeAssetManager | null = null;\n\n private getAssetManager(): BehaviorTreeAssetManager {\n if (!this.assetManager) {\n this.assetManager = Core.services.resolve(BehaviorTreeAssetManager);\n }\n return this.assetManager;\n }\n\n execute(context: NodeExecutionContext): TaskStatus {\n const { runtime, state, entity } = context;\n\n const treeAssetId = BindingHelper.getValue<string>(context, 'treeAssetId', '');\n const shareBlackboard = BindingHelper.getValue<boolean>(context, 'shareBlackboard', true);\n\n if (!treeAssetId) {\n return TaskStatus.Failure;\n }\n\n const assetManager = this.getAssetManager();\n const subTreeData = assetManager.getAsset(treeAssetId);\n\n if (!subTreeData) {\n console.warn(`未找到子树资产: ${treeAssetId}`);\n return TaskStatus.Failure;\n }\n\n const rootNode = subTreeData.nodes.get(subTreeData.rootNodeId);\n if (!rootNode) {\n console.warn(`子树根节点未找到: ${subTreeData.rootNodeId}`);\n return TaskStatus.Failure;\n }\n\n if (!shareBlackboard && state.status !== TaskStatus.Running) {\n if (subTreeData.blackboardVariables) {\n for (const [key, value] of subTreeData.blackboardVariables.entries()) {\n if (!runtime.hasBlackboardKey(key)) {\n runtime.setBlackboardValue(key, value);\n }\n }\n }\n }\n\n const subTreeContext: NodeExecutionContext = {\n entity,\n nodeData: rootNode,\n state: runtime.getNodeState(rootNode.id),\n runtime,\n treeData: subTreeData,\n deltaTime: context.deltaTime,\n totalTime: context.totalTime,\n executeChild: (childId: string) => {\n const childData = subTreeData.nodes.get(childId);\n if (!childData) {\n console.warn(`子树节点未找到: ${childId}`);\n return TaskStatus.Failure;\n }\n\n const childContext: NodeExecutionContext = {\n entity,\n nodeData: childData,\n state: runtime.getNodeState(childId),\n runtime,\n treeData: subTreeData,\n deltaTime: context.deltaTime,\n totalTime: context.totalTime,\n executeChild: subTreeContext.executeChild\n };\n\n return this.executeSubTreeNode(childContext);\n }\n };\n\n return this.executeSubTreeNode(subTreeContext);\n }\n\n private executeSubTreeNode(context: NodeExecutionContext): TaskStatus {\n const { nodeData, runtime } = context;\n\n const state = runtime.getNodeState(nodeData.id);\n\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Success;\n }\n\n const childId = nodeData.children[state.currentChildIndex]!;\n const childStatus = context.executeChild(childId);\n\n if (childStatus === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n\n if (childStatus === TaskStatus.Failure) {\n state.currentChildIndex = 0;\n return TaskStatus.Failure;\n }\n\n state.currentChildIndex++;\n\n if (state.currentChildIndex >= nodeData.children.length) {\n state.currentChildIndex = 0;\n return TaskStatus.Success;\n }\n\n return TaskStatus.Running;\n }\n\n reset(context: NodeExecutionContext): void {\n const treeAssetId = BindingHelper.getValue<string>(context, 'treeAssetId', '');\n\n if (treeAssetId) {\n const assetManager = this.getAssetManager();\n const subTreeData = assetManager.getAsset(treeAssetId);\n\n if (subTreeData) {\n const rootNode = subTreeData.nodes.get(subTreeData.rootNodeId);\n if (rootNode) {\n context.runtime.resetNodeState(rootNode.id);\n\n if (rootNode.children) {\n for (const childId of rootNode.children) {\n context.runtime.resetNodeState(childId);\n }\n }\n }\n }\n }\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext, BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 黑板比较条件执行器\n *\n * 比较黑板中的值\n */\n@NodeExecutorMetadata({\n implementationType: 'BlackboardCompare',\n nodeType: NodeType.Condition,\n displayName: '黑板比较',\n description: '比较黑板中的值',\n category: 'Condition',\n configSchema: {\n key: {\n type: 'string',\n default: '',\n description: '黑板变量名'\n },\n compareValue: {\n type: 'object',\n description: '比较值',\n supportBinding: true\n },\n operator: {\n type: 'string',\n default: 'equals',\n description: '比较运算符',\n options: ['equals', 'notEquals', 'greaterThan', 'lessThan', 'greaterOrEqual', 'lessOrEqual']\n }\n }\n})\nexport class BlackboardCompare implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { runtime } = context;\n const key = BindingHelper.getValue<string>(context, 'key', '');\n const compareValue = BindingHelper.getValue(context, 'compareValue');\n const operator = BindingHelper.getValue<string>(context, 'operator', 'equals');\n\n if (!key) {\n return TaskStatus.Failure;\n }\n\n const actualValue = runtime.getBlackboardValue(key);\n\n if (this.compare(actualValue, compareValue, operator)) {\n return TaskStatus.Success;\n }\n\n return TaskStatus.Failure;\n }\n\n private compare(actualValue: any, compareValue: any, operator: string): boolean {\n switch (operator) {\n case 'equals':\n return actualValue === compareValue;\n case 'notEquals':\n return actualValue !== compareValue;\n case 'greaterThan':\n return actualValue > compareValue;\n case 'lessThan':\n return actualValue < compareValue;\n case 'greaterOrEqual':\n return actualValue >= compareValue;\n case 'lessOrEqual':\n return actualValue <= compareValue;\n default:\n return false;\n }\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext, BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 黑板存在检查条件执行器\n *\n * 检查黑板中是否存在指定的键\n */\n@NodeExecutorMetadata({\n implementationType: 'BlackboardExists',\n nodeType: NodeType.Condition,\n displayName: '黑板存在',\n description: '检查黑板中是否存在指定的键',\n category: 'Condition',\n configSchema: {\n key: {\n type: 'string',\n default: '',\n description: '黑板变量名'\n },\n checkNull: {\n type: 'boolean',\n default: false,\n description: '检查是否为null'\n }\n }\n})\nexport class BlackboardExists implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { runtime } = context;\n const key = BindingHelper.getValue<string>(context, 'key', '');\n const checkNull = BindingHelper.getValue<boolean>(context, 'checkNull', false);\n\n if (!key) {\n return TaskStatus.Failure;\n }\n\n const value = runtime.getBlackboardValue(key);\n\n if (value === undefined) {\n return TaskStatus.Failure;\n }\n\n if (checkNull && value === null) {\n return TaskStatus.Failure;\n }\n\n return TaskStatus.Success;\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext, BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 随机概率条件执行器\n *\n * 根据概率返回成功或失败\n */\n@NodeExecutorMetadata({\n implementationType: 'RandomProbability',\n nodeType: NodeType.Condition,\n displayName: '随机概率',\n description: '根据概率返回成功或失败',\n category: 'Condition',\n configSchema: {\n probability: {\n type: 'number',\n default: 0.5,\n description: '成功概率(0-1)',\n min: 0,\n max: 1,\n supportBinding: true\n }\n }\n})\nexport class RandomProbability implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const probability = BindingHelper.getValue<number>(context, 'probability', 0.5);\n\n const clampedProbability = Math.max(0, Math.min(1, probability));\n\n if (Math.random() < clampedProbability) {\n return TaskStatus.Success;\n }\n\n return TaskStatus.Failure;\n }\n}\n","import { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { INodeExecutor, NodeExecutionContext, BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n\n/**\n * 执行条件执行器\n *\n * 执行自定义条件逻辑\n */\n@NodeExecutorMetadata({\n implementationType: 'ExecuteCondition',\n nodeType: NodeType.Condition,\n displayName: '执行条件',\n description: '执行自定义条件逻辑',\n category: 'Condition',\n configSchema: {\n conditionName: {\n type: 'string',\n default: '',\n description: '条件名称(黑板中condition_前缀的函数)'\n }\n }\n})\nexport class ExecuteCondition implements INodeExecutor {\n execute(context: NodeExecutionContext): TaskStatus {\n const { runtime, entity } = context;\n const conditionName = BindingHelper.getValue<string>(context, 'conditionName', '');\n\n if (!conditionName) {\n return TaskStatus.Failure;\n }\n\n const conditionFunction = runtime.getBlackboardValue<(entity: NodeExecutionContext['entity']) => boolean>(`condition_${conditionName}`);\n\n if (!conditionFunction || typeof conditionFunction !== 'function') {\n return TaskStatus.Failure;\n }\n\n try {\n return conditionFunction(entity) ? TaskStatus.Success : TaskStatus.Failure;\n } catch (error) {\n console.error(`ExecuteCondition failed: ${error}`);\n return TaskStatus.Failure;\n }\n }\n}\n","import { Entity, Core } from '@esengine/ecs-framework';\nimport { BehaviorTreeData } from './execution/BehaviorTreeData';\nimport { BehaviorTreeRuntimeComponent } from './execution/BehaviorTreeRuntimeComponent';\nimport { BehaviorTreeAssetManager } from './execution/BehaviorTreeAssetManager';\n\n/**\n * 行为树启动辅助类\n *\n * 提供便捷方法来启动、停止行为树\n */\nexport class BehaviorTreeStarter {\n /**\n * 启动行为树\n *\n * @param entity 游戏实体\n * @param treeData 行为树数据\n * @param autoStart 是否自动开始执行\n */\n static start(entity: Entity, treeData: BehaviorTreeData, autoStart: boolean = true): void {\n const assetManager = Core.services.resolve(BehaviorTreeAssetManager);\n assetManager.loadAsset(treeData);\n\n let runtime = entity.getComponent(BehaviorTreeRuntimeComponent);\n if (!runtime) {\n runtime = new BehaviorTreeRuntimeComponent();\n entity.addComponent(runtime);\n }\n\n runtime.treeAssetId = treeData.id;\n runtime.autoStart = autoStart;\n\n if (treeData.blackboardVariables) {\n for (const [key, value] of treeData.blackboardVariables.entries()) {\n runtime.setBlackboardValue(key, value);\n }\n }\n\n if (autoStart) {\n runtime.isRunning = true;\n }\n }\n\n /**\n * 停止行为树\n *\n * @param entity 游戏实体\n */\n static stop(entity: Entity): void {\n const runtime = entity.getComponent(BehaviorTreeRuntimeComponent);\n if (runtime) {\n runtime.isRunning = false;\n runtime.resetAllStates();\n }\n }\n\n /**\n * 暂停行为树\n *\n * @param entity 游戏实体\n */\n static pause(entity: Entity): void {\n const runtime = entity.getComponent(BehaviorTreeRuntimeComponent);\n if (runtime) {\n runtime.isRunning = false;\n }\n }\n\n /**\n * 恢复行为树\n *\n * @param entity 游戏实体\n */\n static resume(entity: Entity): void {\n const runtime = entity.getComponent(BehaviorTreeRuntimeComponent);\n if (runtime) {\n runtime.isRunning = true;\n }\n }\n\n /**\n * 重启行为树\n *\n * @param entity 游戏实体\n */\n static restart(entity: Entity): void {\n const runtime = entity.getComponent(BehaviorTreeRuntimeComponent);\n if (runtime) {\n runtime.resetAllStates();\n runtime.isRunning = true;\n }\n }\n}\n","import { BehaviorTreeData, BehaviorNodeData } from './execution/BehaviorTreeData';\nimport { NodeType } from './Types/TaskStatus';\n\n/**\n * 行为树构建器\n *\n * 提供流式API构建行为树数据结构\n */\nexport class BehaviorTreeBuilder {\n private treeData: BehaviorTreeData;\n private nodeStack: string[] = [];\n private nodeIdCounter: number = 0;\n\n private constructor(treeName: string) {\n this.treeData = {\n id: `tree_${Date.now()}`,\n name: treeName,\n rootNodeId: '',\n nodes: new Map(),\n blackboardVariables: new Map()\n };\n }\n\n /**\n * 创建构建器\n */\n static create(treeName: string = 'BehaviorTree'): BehaviorTreeBuilder {\n return new BehaviorTreeBuilder(treeName);\n }\n\n /**\n * 定义黑板变量\n */\n defineBlackboardVariable(key: string, initialValue: any): BehaviorTreeBuilder {\n if (!this.treeData.blackboardVariables) {\n this.treeData.blackboardVariables = new Map();\n }\n this.treeData.blackboardVariables.set(key, initialValue);\n return this;\n }\n\n /**\n * 添加序列节点\n */\n sequence(name?: string): BehaviorTreeBuilder {\n return this.addCompositeNode('Sequence', name || 'Sequence');\n }\n\n /**\n * 添加选择器节点\n */\n selector(name?: string): BehaviorTreeBuilder {\n return this.addCompositeNode('Selector', name || 'Selector');\n }\n\n /**\n * 添加并行节点\n */\n parallel(name?: string, config?: { successPolicy?: string; failurePolicy?: string }): BehaviorTreeBuilder {\n return this.addCompositeNode('Parallel', name || 'Parallel', config);\n }\n\n /**\n * 添加并行选择器节点\n */\n parallelSelector(name?: string, config?: { failurePolicy?: string }): BehaviorTreeBuilder {\n return this.addCompositeNode('ParallelSelector', name || 'ParallelSelector', config);\n }\n\n /**\n * 添加随机序列节点\n */\n randomSequence(name?: string): BehaviorTreeBuilder {\n return this.addCompositeNode('RandomSequence', name || 'RandomSequence');\n }\n\n /**\n * 添加随机选择器节点\n */\n randomSelector(name?: string): BehaviorTreeBuilder {\n return this.addCompositeNode('RandomSelector', name || 'RandomSelector');\n }\n\n /**\n * 添加反转装饰器\n */\n inverter(name?: string): BehaviorTreeBuilder {\n return this.addDecoratorNode('Inverter', name || 'Inverter');\n }\n\n /**\n * 添加重复装饰器\n */\n repeater(repeatCount: number, name?: string): BehaviorTreeBuilder {\n return this.addDecoratorNode('Repeater', name || 'Repeater', { repeatCount });\n }\n\n /**\n * 添加总是成功装饰器\n */\n alwaysSucceed(name?: string): BehaviorTreeBuilder {\n return this.addDecoratorNode('AlwaysSucceed', name || 'AlwaysSucceed');\n }\n\n /**\n * 添加总是失败装饰器\n */\n alwaysFail(name?: string): BehaviorTreeBuilder {\n return this.addDecoratorNode('AlwaysFail', name || 'AlwaysFail');\n }\n\n /**\n * 添加直到成功装饰器\n */\n untilSuccess(name?: string): BehaviorTreeBuilder {\n return this.addDecoratorNode('UntilSuccess', name || 'UntilSuccess');\n }\n\n /**\n * 添加直到失败装饰器\n */\n untilFail(name?: string): BehaviorTreeBuilder {\n return this.addDecoratorNode('UntilFail', name || 'UntilFail');\n }\n\n /**\n * 添加条件装饰器\n */\n conditional(blackboardKey: string, expectedValue: any, operator?: string, name?: string): BehaviorTreeBuilder {\n return this.addDecoratorNode('Conditional', name || 'Conditional', {\n blackboardKey,\n expectedValue,\n operator: operator || 'equals'\n });\n }\n\n /**\n * 添加冷却装饰器\n */\n cooldown(cooldownTime: number, name?: string): BehaviorTreeBuilder {\n return this.addDecoratorNode('Cooldown', name || 'Cooldown', { cooldownTime });\n }\n\n /**\n * 添加超时装饰器\n */\n timeout(timeout: number, name?: string): BehaviorTreeBuilder {\n return this.addDecoratorNode('Timeout', name || 'Timeout', { timeout });\n }\n\n /**\n * 添加等待动作\n */\n wait(duration: number, name?: string): BehaviorTreeBuilder {\n return this.addActionNode('Wait', name || 'Wait', { duration });\n }\n\n /**\n * 添加日志动作\n */\n log(message: string, name?: string): BehaviorTreeBuilder {\n return this.addActionNode('Log', name || 'Log', { message });\n }\n\n /**\n * 添加设置黑板值动作\n */\n setBlackboardValue(key: string, value: any, name?: string): BehaviorTreeBuilder {\n return this.addActionNode('SetBlackboardValue', name || 'SetBlackboardValue', { key, value });\n }\n\n /**\n * 添加修改黑板值动作\n */\n modifyBlackboardValue(key: string, operation: string, value: number, name?: string): BehaviorTreeBuilder {\n return this.addActionNode('ModifyBlackboardValue', name || 'ModifyBlackboardValue', {\n key,\n operation,\n value\n });\n }\n\n /**\n * 添加执行动作\n */\n executeAction(actionName: string, name?: string): BehaviorTreeBuilder {\n return this.addActionNode('ExecuteAction', name || 'ExecuteAction', { actionName });\n }\n\n /**\n * 添加黑板比较条件\n */\n blackboardCompare(key: string, compareValue: any, operator?: string, name?: string): BehaviorTreeBuilder {\n return this.addConditionNode('BlackboardCompare', name || 'BlackboardCompare', {\n key,\n compareValue,\n operator: operator || 'equals'\n });\n }\n\n /**\n * 添加黑板存在检查条件\n */\n blackboardExists(key: string, name?: string): BehaviorTreeBuilder {\n return this.addConditionNode('BlackboardExists', name || 'BlackboardExists', { key });\n }\n\n /**\n * 添加随机概率条件\n */\n randomProbability(probability: number, name?: string): BehaviorTreeBuilder {\n return this.addConditionNode('RandomProbability', name || 'RandomProbability', { probability });\n }\n\n /**\n * 添加执行条件\n */\n executeCondition(conditionName: string, name?: string): BehaviorTreeBuilder {\n return this.addConditionNode('ExecuteCondition', name || 'ExecuteCondition', { conditionName });\n }\n\n /**\n * 结束当前节点,返回父节点\n */\n end(): BehaviorTreeBuilder {\n if (this.nodeStack.length > 0) {\n this.nodeStack.pop();\n }\n return this;\n }\n\n /**\n * 构建行为树数据\n */\n build(): BehaviorTreeData {\n if (!this.treeData.rootNodeId) {\n throw new Error('No root node defined. Add at least one node to the tree.');\n }\n return this.treeData;\n }\n\n private addCompositeNode(implementationType: string, name: string, config: Record<string, any> = {}): BehaviorTreeBuilder {\n const nodeId = this.generateNodeId();\n const node: BehaviorNodeData = {\n id: nodeId,\n name,\n nodeType: NodeType.Composite,\n implementationType,\n children: [],\n config\n };\n\n this.treeData.nodes.set(nodeId, node);\n\n if (!this.treeData.rootNodeId) {\n this.treeData.rootNodeId = nodeId;\n }\n\n if (this.nodeStack.length > 0) {\n const parentId = this.nodeStack[this.nodeStack.length - 1]!;\n const parentNode = this.treeData.nodes.get(parentId);\n if (parentNode && parentNode.children) {\n parentNode.children.push(nodeId);\n }\n }\n\n this.nodeStack.push(nodeId);\n return this;\n }\n\n private addDecoratorNode(implementationType: string, name: string, config: Record<string, any> = {}): BehaviorTreeBuilder {\n const nodeId = this.generateNodeId();\n const node: BehaviorNodeData = {\n id: nodeId,\n name,\n nodeType: NodeType.Decorator,\n implementationType,\n children: [],\n config\n };\n\n this.treeData.nodes.set(nodeId, node);\n\n if (!this.treeData.rootNodeId) {\n this.treeData.rootNodeId = nodeId;\n }\n\n if (this.nodeStack.length > 0) {\n const parentId = this.nodeStack[this.nodeStack.length - 1]!;\n const parentNode = this.treeData.nodes.get(parentId);\n if (parentNode && parentNode.children) {\n parentNode.children.push(nodeId);\n }\n }\n\n this.nodeStack.push(nodeId);\n return this;\n }\n\n private addActionNode(implementationType: string, name: string, config: Record<string, any> = {}): BehaviorTreeBuilder {\n const nodeId = this.generateNodeId();\n const node: BehaviorNodeData = {\n id: nodeId,\n name,\n nodeType: NodeType.Action,\n implementationType,\n config\n };\n\n this.treeData.nodes.set(nodeId, node);\n\n if (!this.treeData.rootNodeId) {\n this.treeData.rootNodeId = nodeId;\n }\n\n if (this.nodeStack.length > 0) {\n const parentId = this.nodeStack[this.nodeStack.length - 1]!;\n const parentNode = this.treeData.nodes.get(parentId);\n if (parentNode && parentNode.children) {\n parentNode.children.push(nodeId);\n }\n }\n\n return this;\n }\n\n private addConditionNode(implementationType: string, name: string, config: Record<string, any> = {}): BehaviorTreeBuilder {\n const nodeId = this.generateNodeId();\n const node: BehaviorNodeData = {\n id: nodeId,\n name,\n nodeType: NodeType.Condition,\n implementationType,\n config\n };\n\n this.treeData.nodes.set(nodeId, node);\n\n if (!this.treeData.rootNodeId) {\n this.treeData.rootNodeId = nodeId;\n }\n\n if (this.nodeStack.length > 0) {\n const parentId = this.nodeStack[this.nodeStack.length - 1]!;\n const parentNode = this.treeData.nodes.get(parentId);\n if (parentNode && parentNode.children) {\n parentNode.children.push(nodeId);\n }\n }\n\n return this;\n }\n\n private generateNodeId(): string {\n return `node_${this.nodeIdCounter++}`;\n }\n}\n","import { NodeType } from '../Types/TaskStatus';\nimport { NodeMetadataRegistry, ConfigFieldDefinition, NodeMetadata } from '../execution/NodeMetadata';\n\n/**\n * 节点数据JSON格式\n */\nexport interface NodeDataJSON {\n nodeType: string;\n compositeType?: string;\n decoratorType?: string;\n actionType?: string;\n conditionType?: string;\n [key: string]: any;\n}\n\n/**\n * 行为树节点属性类型常量\n * Behavior tree node property type constants\n */\nexport const NodePropertyType = {\n /** 字符串 */\n String: 'string',\n /** 数值 */\n Number: 'number',\n /** 布尔值 */\n Boolean: 'boolean',\n /** 选择框 */\n Select: 'select',\n /** 黑板变量引用 */\n Blackboard: 'blackboard',\n /** 代码编辑器 */\n Code: 'code',\n /** 变量引用 */\n Variable: 'variable',\n /** 资产引用 */\n Asset: 'asset'\n} as const;\n\n/**\n * 节点属性类型(支持自定义扩展)\n * Node property type (supports custom extensions)\n *\n * @example\n * ```typescript\n * // 使用内置类型\n * type: NodePropertyType.String\n *\n * // 使用自定义类型\n * type: 'color-picker'\n * type: 'curve-editor'\n * ```\n */\nexport type NodePropertyType = (typeof NodePropertyType)[keyof typeof NodePropertyType] | string;\n\n/**\n * 属性定义(用于编辑器)\n */\nexport interface PropertyDefinition {\n name: string;\n type: NodePropertyType;\n label: string;\n description?: string;\n defaultValue?: any;\n options?: Array<{ label: string; value: any }>;\n min?: number;\n max?: number;\n step?: number;\n required?: boolean;\n\n /**\n * 字段编辑器配置\n *\n * 指定使用哪个字段编辑器以及相关选项\n *\n * @example\n * ```typescript\n * fieldEditor: {\n * type: 'asset',\n * options: { fileExtension: '.btree' }\n * }\n * ```\n */\n fieldEditor?: {\n type: string;\n options?: Record<string, any>;\n };\n\n /**\n * 自定义渲染配置\n *\n * 用于指定编辑器如何渲染此属性\n *\n * @example\n * ```typescript\n * renderConfig: {\n * component: 'ColorPicker', // 渲染器组件名称\n * props: { // 传递给组件的属性\n * showAlpha: true,\n * presets: ['#FF0000', '#00FF00']\n * }\n * }\n * ```\n */\n renderConfig?: {\n /** 渲染器组件名称或路径 */\n component?: string;\n /** 传递给渲染器的属性配置 */\n props?: Record<string, any>;\n /** 渲染器的样式类名 */\n className?: string;\n /** 渲染器的内联样式 */\n style?: Record<string, any>;\n /** 其他自定义配置 */\n [key: string]: any;\n };\n\n /**\n * 验证规则\n *\n * 用于在编辑器中验证输入\n *\n * @example\n * ```typescript\n * validation: {\n * pattern: /^\\d+$/,\n * message: '只能输入数字',\n * validator: (value) => value > 0\n * }\n * ```\n */\n validation?: {\n /** 正则表达式验证 */\n pattern?: RegExp | string;\n /** 验证失败的提示信息 */\n message?: string;\n /** 自定义验证函数 */\n validator?: string; // 函数字符串,编辑器会解析\n /** 最小长度(字符串) */\n minLength?: number;\n /** 最大长度(字符串) */\n maxLength?: number;\n };\n\n /**\n * 是否允许多个连接\n * 默认 false,只允许一个黑板变量连接\n */\n allowMultipleConnections?: boolean;\n}\n\n/**\n * 节点模板(用于编辑器)\n */\nexport interface NodeTemplate {\n type: NodeType;\n displayName: string;\n category: string;\n icon?: string;\n description: string;\n color?: string;\n className?: string;\n componentClass?: Function;\n requiresChildren?: boolean;\n minChildren?: number;\n maxChildren?: number;\n defaultConfig: Partial<NodeDataJSON>;\n properties: PropertyDefinition[];\n}\n\n/**\n * 节点模板库\n */\nexport class NodeTemplates {\n /**\n * 获取所有节点模板\n */\n static getAllTemplates(): NodeTemplate[] {\n const allMetadata = NodeMetadataRegistry.getAllMetadata();\n return allMetadata.map((metadata) => this.convertMetadataToTemplate(metadata));\n }\n\n /**\n * 根据类型和子类型获取模板\n */\n static getTemplate(type: NodeType, subType: string): NodeTemplate | undefined {\n return this.getAllTemplates().find((t) => {\n if (t.type !== type) return false;\n const config: any = t.defaultConfig;\n\n switch (type) {\n case NodeType.Composite:\n return config.compositeType === subType;\n case NodeType.Decorator:\n return config.decoratorType === subType;\n case NodeType.Action:\n return config.actionType === subType;\n case NodeType.Condition:\n return config.conditionType === subType;\n default:\n return false;\n }\n });\n }\n\n /**\n * 将NodeMetadata转换为NodeTemplate\n */\n private static convertMetadataToTemplate(metadata: NodeMetadata): NodeTemplate {\n const properties = this.convertConfigSchemaToProperties(metadata.configSchema || {});\n\n const defaultConfig: Partial<NodeDataJSON> = {\n nodeType: this.nodeTypeToString(metadata.nodeType)\n };\n\n switch (metadata.nodeType) {\n case NodeType.Composite:\n defaultConfig.compositeType = metadata.implementationType;\n break;\n case NodeType.Decorator:\n defaultConfig.decoratorType = metadata.implementationType;\n break;\n case NodeType.Action:\n defaultConfig.actionType = metadata.implementationType;\n break;\n case NodeType.Condition:\n defaultConfig.conditionType = metadata.implementationType;\n break;\n }\n\n if (metadata.configSchema) {\n for (const [key, field] of Object.entries(metadata.configSchema)) {\n const fieldDef = field as ConfigFieldDefinition;\n if (fieldDef.default !== undefined) {\n defaultConfig[key] = fieldDef.default;\n }\n }\n }\n\n // 根据节点类型生成默认颜色和图标\n const { icon, color } = this.getIconAndColorByType(metadata.nodeType, metadata.category || '');\n\n // 应用子节点约束\n const constraints = metadata.childrenConstraints || this.getDefaultConstraintsByNodeType(metadata.nodeType);\n\n const template: NodeTemplate = {\n type: metadata.nodeType,\n displayName: metadata.displayName,\n category: metadata.category || this.getCategoryByNodeType(metadata.nodeType),\n description: metadata.description || '',\n className: metadata.implementationType,\n icon,\n color,\n defaultConfig,\n properties\n };\n\n if (constraints) {\n if (constraints.min !== undefined) {\n template.minChildren = constraints.min;\n template.requiresChildren = constraints.min > 0;\n }\n if (constraints.max !== undefined) {\n template.maxChildren = constraints.max;\n }\n }\n\n return template;\n }\n\n /**\n * 获取节点类型的默认约束\n */\n private static getDefaultConstraintsByNodeType(nodeType: NodeType): { min?: number; max?: number } | undefined {\n switch (nodeType) {\n case NodeType.Composite:\n return { min: 1 };\n case NodeType.Decorator:\n return { min: 1, max: 1 };\n case NodeType.Action:\n case NodeType.Condition:\n return { max: 0 };\n default:\n return undefined;\n }\n }\n\n /**\n * 将ConfigSchema转换为PropertyDefinition数组\n */\n private static convertConfigSchemaToProperties(\n configSchema: Record<string, ConfigFieldDefinition>\n ): PropertyDefinition[] {\n const properties: PropertyDefinition[] = [];\n\n for (const [name, field] of Object.entries(configSchema)) {\n const property: PropertyDefinition = {\n name,\n type: this.mapFieldTypeToPropertyType(field),\n label: name\n };\n\n if (field.description !== undefined) {\n property.description = field.description;\n }\n\n if (field.default !== undefined) {\n property.defaultValue = field.default;\n }\n\n if (field.min !== undefined) {\n property.min = field.min;\n }\n\n if (field.max !== undefined) {\n property.max = field.max;\n }\n\n if (field.allowMultipleConnections !== undefined) {\n property.allowMultipleConnections = field.allowMultipleConnections;\n }\n\n if (field.options) {\n property.options = field.options.map((opt) => ({\n label: opt,\n value: opt\n }));\n }\n\n if (field.supportBinding) {\n property.renderConfig = {\n component: 'BindableInput',\n props: {\n supportBinding: true\n }\n };\n }\n\n properties.push(property);\n }\n\n return properties;\n }\n\n /**\n * 映射字段类型到属性类型\n */\n private static mapFieldTypeToPropertyType(field: ConfigFieldDefinition): NodePropertyType {\n if (field.options && field.options.length > 0) {\n return NodePropertyType.Select;\n }\n\n switch (field.type) {\n case 'string':\n return NodePropertyType.String;\n case 'number':\n return NodePropertyType.Number;\n case 'boolean':\n return NodePropertyType.Boolean;\n case 'array':\n case 'object':\n default:\n return NodePropertyType.String;\n }\n }\n\n /**\n * NodeType转字符串\n */\n private static nodeTypeToString(nodeType: NodeType): string {\n switch (nodeType) {\n case NodeType.Composite:\n return 'composite';\n case NodeType.Decorator:\n return 'decorator';\n case NodeType.Action:\n return 'action';\n case NodeType.Condition:\n return 'condition';\n default:\n return 'unknown';\n }\n }\n\n /**\n * 根据NodeType获取默认分类\n */\n private static getCategoryByNodeType(nodeType: NodeType): string {\n switch (nodeType) {\n case NodeType.Composite:\n return '组合';\n case NodeType.Decorator:\n return '装饰器';\n case NodeType.Action:\n return '动作';\n case NodeType.Condition:\n return '条件';\n default:\n return '其他';\n }\n }\n\n /**\n * 根据节点类型获取默认图标和颜色\n */\n private static getIconAndColorByType(nodeType: NodeType, _category: string): { icon: string; color: string } {\n // 根据节点类型设置默认值\n switch (nodeType) {\n case NodeType.Composite:\n return { icon: 'GitBranch', color: '#1976d2' }; // 蓝色\n case NodeType.Decorator:\n return { icon: 'Settings', color: '#fb8c00' }; // 橙色\n case NodeType.Action:\n return { icon: 'Play', color: '#388e3c' }; // 绿色\n case NodeType.Condition:\n return { icon: 'HelpCircle', color: '#d32f2f' }; // 红色\n default:\n return { icon: 'Circle', color: '#757575' }; // 灰色\n }\n }\n}\n","import { NodeType, BlackboardValueType } from '../Types/TaskStatus';\n\n/**\n * 行为树资产元数据\n */\nexport interface AssetMetadata {\n name: string;\n description?: string;\n version: string;\n createdAt?: string;\n modifiedAt?: string;\n}\n\n/**\n * 黑板变量定义\n */\nexport interface BlackboardVariableDefinition {\n name: string;\n type: BlackboardValueType;\n defaultValue: any;\n readonly?: boolean;\n description?: string;\n}\n\n/**\n * 行为树节点配置数据\n */\nexport interface BehaviorNodeConfigData {\n className?: string;\n [key: string]: any;\n}\n\n/**\n * 行为树节点数据(运行时格式)\n */\nexport interface BehaviorTreeNodeData {\n id: string;\n name: string;\n nodeType: NodeType;\n\n // 节点类型特定数据\n data: BehaviorNodeConfigData;\n\n // 子节点ID列表\n children: string[];\n}\n\n/**\n * 属性绑定定义\n */\nexport interface PropertyBinding {\n nodeId: string;\n propertyName: string;\n variableName: string;\n}\n\n/**\n * 行为树资产(运行时格式)\n *\n * 这是用于游戏运行时的优化格式,不包含编辑器UI信息\n */\nexport interface BehaviorTreeAsset {\n /**\n * 资产格式版本\n */\n version: string;\n\n /**\n * 元数据\n */\n metadata: AssetMetadata;\n\n /**\n * 根节点ID\n */\n rootNodeId: string;\n\n /**\n * 所有节点数据(扁平化存储,通过children建立层级)\n */\n nodes: BehaviorTreeNodeData[];\n\n /**\n * 黑板变量定义\n */\n blackboard: BlackboardVariableDefinition[];\n\n /**\n * 属性绑定\n */\n propertyBindings?: PropertyBinding[];\n}\n\n/**\n * 资产验证结果\n */\nexport interface AssetValidationResult {\n valid: boolean;\n errors?: string[];\n warnings?: string[];\n}\n\n/**\n * 资产验证器\n */\nexport class BehaviorTreeAssetValidator {\n /**\n * 验证资产数据的完整性和正确性\n */\n static validate(asset: BehaviorTreeAsset): AssetValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // 检查版本\n if (!asset.version) {\n errors.push('Missing version field');\n }\n\n // 检查元数据\n if (!asset.metadata || !asset.metadata.name) {\n errors.push('Missing or invalid metadata');\n }\n\n // 检查根节点\n if (!asset.rootNodeId) {\n errors.push('Missing rootNodeId');\n }\n\n // 检查节点列表\n if (!asset.nodes || !Array.isArray(asset.nodes)) {\n errors.push('Missing or invalid nodes array');\n } else {\n const nodeIds = new Set<string>();\n const rootNode = asset.nodes.find((n) => n.id === asset.rootNodeId);\n\n if (!rootNode) {\n errors.push(`Root node '${asset.rootNodeId}' not found in nodes array`);\n }\n\n // 检查节点ID唯一性\n for (const node of asset.nodes) {\n if (!node.id) {\n errors.push('Node missing id field');\n continue;\n }\n\n if (nodeIds.has(node.id)) {\n errors.push(`Duplicate node id: ${node.id}`);\n }\n nodeIds.add(node.id);\n\n // 检查节点类型\n if (!node.nodeType) {\n errors.push(`Node ${node.id} missing nodeType`);\n }\n\n // 检查子节点引用\n if (node.children) {\n for (const childId of node.children) {\n if (!asset.nodes.find((n) => n.id === childId)) {\n errors.push(`Node ${node.id} references non-existent child: ${childId}`);\n }\n }\n }\n }\n\n // 检查是否有孤立节点\n const referencedNodes = new Set<string>([asset.rootNodeId]);\n const collectReferencedNodes = (nodeId: string) => {\n const node = asset.nodes.find((n) => n.id === nodeId);\n if (node && node.children) {\n for (const childId of node.children) {\n referencedNodes.add(childId);\n collectReferencedNodes(childId);\n }\n }\n };\n collectReferencedNodes(asset.rootNodeId);\n\n for (const node of asset.nodes) {\n if (!referencedNodes.has(node.id)) {\n warnings.push(`Orphaned node detected: ${node.id} (${node.name})`);\n }\n }\n }\n\n // 检查黑板定义\n if (asset.blackboard && Array.isArray(asset.blackboard)) {\n const varNames = new Set<string>();\n for (const variable of asset.blackboard) {\n if (!variable.name) {\n errors.push('Blackboard variable missing name');\n continue;\n }\n\n if (varNames.has(variable.name)) {\n errors.push(`Duplicate blackboard variable: ${variable.name}`);\n }\n varNames.add(variable.name);\n\n if (!variable.type) {\n errors.push(`Blackboard variable ${variable.name} missing type`);\n }\n }\n }\n\n // 检查属性绑定\n if (asset.propertyBindings && Array.isArray(asset.propertyBindings)) {\n const nodeIds = new Set(asset.nodes.map((n) => n.id));\n const varNames = new Set(asset.blackboard?.map((v) => v.name) || []);\n\n for (const binding of asset.propertyBindings) {\n if (!nodeIds.has(binding.nodeId)) {\n errors.push(`Property binding references non-existent node: ${binding.nodeId}`);\n }\n\n if (!varNames.has(binding.variableName)) {\n errors.push(`Property binding references non-existent variable: ${binding.variableName}`);\n }\n\n if (!binding.propertyName) {\n errors.push('Property binding missing propertyName');\n }\n }\n }\n\n const result: AssetValidationResult = {\n valid: errors.length === 0\n };\n\n if (errors.length > 0) {\n result.errors = errors;\n }\n\n if (warnings.length > 0) {\n result.warnings = warnings;\n }\n\n return result;\n }\n\n /**\n * 获取资产统计信息\n */\n static getStats(asset: BehaviorTreeAsset): {\n nodeCount: number;\n actionCount: number;\n conditionCount: number;\n compositeCount: number;\n decoratorCount: number;\n blackboardVariableCount: number;\n propertyBindingCount: number;\n maxDepth: number;\n } {\n let actionCount = 0;\n let conditionCount = 0;\n let compositeCount = 0;\n let decoratorCount = 0;\n\n for (const node of asset.nodes) {\n switch (node.nodeType) {\n case NodeType.Action:\n actionCount++;\n break;\n case NodeType.Condition:\n conditionCount++;\n break;\n case NodeType.Composite:\n compositeCount++;\n break;\n case NodeType.Decorator:\n decoratorCount++;\n break;\n }\n }\n\n // 计算最大深度\n const getDepth = (nodeId: string, currentDepth: number = 0): number => {\n const node = asset.nodes.find((n) => n.id === nodeId);\n if (!node || !node.children || node.children.length === 0) {\n return currentDepth;\n }\n\n let maxChildDepth = currentDepth;\n for (const childId of node.children) {\n const childDepth = getDepth(childId, currentDepth + 1);\n maxChildDepth = Math.max(maxChildDepth, childDepth);\n }\n return maxChildDepth;\n };\n\n return {\n nodeCount: asset.nodes.length,\n actionCount,\n conditionCount,\n compositeCount,\n decoratorCount,\n blackboardVariableCount: asset.blackboard?.length || 0,\n propertyBindingCount: asset.propertyBindings?.length || 0,\n maxDepth: getDepth(asset.rootNodeId)\n };\n }\n}\n","import { createLogger } from '@esengine/ecs-framework';\nimport type { BehaviorTreeAsset, AssetMetadata, BehaviorTreeNodeData, BlackboardVariableDefinition, PropertyBinding } from './BehaviorTreeAsset';\nimport { NodeType, BlackboardValueType } from '../Types/TaskStatus';\n\nconst logger = createLogger('EditorFormatConverter');\n\n/**\n * 编辑器节点格式\n */\nexport interface EditorNodeTemplate {\n displayName: string;\n category: string;\n type: NodeType;\n className?: string;\n [key: string]: any;\n}\n\nexport interface EditorNodeData {\n nodeType?: string;\n className?: string;\n variableName?: string;\n name?: string;\n [key: string]: any;\n}\n\nexport interface EditorNode {\n id: string;\n template: EditorNodeTemplate;\n data: EditorNodeData;\n position: { x: number; y: number };\n children: string[];\n}\n\n/**\n * 编辑器连接格式\n */\nexport interface EditorConnection {\n from: string;\n to: string;\n fromProperty?: string;\n toProperty?: string;\n connectionType: 'node' | 'property';\n}\n\n/**\n * 编辑器格式\n */\nexport interface EditorFormat {\n version?: string;\n metadata?: {\n name: string;\n description?: string;\n createdAt?: string;\n modifiedAt?: string;\n };\n nodes: EditorNode[];\n connections: EditorConnection[];\n blackboard: Record<string, any>;\n canvasState?: {\n offset: { x: number; y: number };\n scale: number;\n };\n}\n\n/**\n * 编辑器格式转换器\n *\n * 将编辑器格式转换为运行时资产格式\n */\nexport class EditorFormatConverter {\n /**\n * 转换编辑器格式为资产格式\n *\n * @param editorData 编辑器数据\n * @param metadata 可选的元数据覆盖\n * @returns 行为树资产\n */\n static toAsset(editorData: EditorFormat, metadata?: Partial<AssetMetadata>): BehaviorTreeAsset {\n logger.info('开始转换编辑器格式到资产格式');\n\n const rootNode = this.findRootNode(editorData.nodes);\n if (!rootNode) {\n throw new Error('未找到根节点');\n }\n\n const assetMetadata: AssetMetadata = {\n name: metadata?.name || editorData.metadata?.name || 'Untitled Behavior Tree',\n version: metadata?.version || editorData.version || '1.0.0'\n };\n\n const description = metadata?.description || editorData.metadata?.description;\n if (description) {\n assetMetadata.description = description;\n }\n\n const createdAt = metadata?.createdAt || editorData.metadata?.createdAt;\n if (createdAt) {\n assetMetadata.createdAt = createdAt;\n }\n\n const modifiedAt = metadata?.modifiedAt || new Date().toISOString();\n if (modifiedAt) {\n assetMetadata.modifiedAt = modifiedAt;\n }\n\n const nodes = this.convertNodes(editorData.nodes);\n\n const blackboard = this.convertBlackboard(editorData.blackboard);\n\n const propertyBindings = this.convertPropertyBindings(\n editorData.connections,\n editorData.nodes,\n blackboard\n );\n\n const asset: BehaviorTreeAsset = {\n version: '1.0.0',\n metadata: assetMetadata,\n rootNodeId: rootNode.id,\n nodes,\n blackboard\n };\n\n if (propertyBindings.length > 0) {\n asset.propertyBindings = propertyBindings;\n }\n\n logger.info(`转换完成: ${nodes.length}个节点, ${blackboard.length}个黑板变量, ${propertyBindings.length}个属性绑定`);\n\n return asset;\n }\n\n /**\n * 查找根节点\n */\n private static findRootNode(nodes: EditorNode[]): EditorNode | null {\n return nodes.find((node) =>\n node.template.category === '根节点' ||\n node.data.nodeType === 'root'\n ) || null;\n }\n\n /**\n * 转换节点列表\n */\n private static convertNodes(editorNodes: EditorNode[]): BehaviorTreeNodeData[] {\n return editorNodes.map((node) => this.convertNode(node));\n }\n\n /**\n * 转换单个节点\n */\n private static convertNode(editorNode: EditorNode): BehaviorTreeNodeData {\n const data = { ...editorNode.data };\n\n delete data.nodeType;\n\n if (editorNode.template.className) {\n data.className = editorNode.template.className;\n }\n\n return {\n id: editorNode.id,\n name: editorNode.template.displayName || editorNode.data.name || 'Node',\n nodeType: editorNode.template.type,\n data,\n children: editorNode.children || []\n };\n }\n\n /**\n * 转换黑板变量\n */\n private static convertBlackboard(blackboard: Record<string, any>): BlackboardVariableDefinition[] {\n const variables: BlackboardVariableDefinition[] = [];\n\n for (const [name, value] of Object.entries(blackboard)) {\n const type = this.inferBlackboardType(value);\n\n variables.push({\n name,\n type,\n defaultValue: value\n });\n }\n\n return variables;\n }\n\n /**\n * 推断黑板变量类型\n */\n private static inferBlackboardType(value: any): BlackboardValueType {\n if (typeof value === 'number') {\n return BlackboardValueType.Number;\n } else if (typeof value === 'string') {\n return BlackboardValueType.String;\n } else if (typeof value === 'boolean') {\n return BlackboardValueType.Boolean;\n } else {\n return BlackboardValueType.Object;\n }\n }\n\n /**\n * 转换属性绑定\n */\n private static convertPropertyBindings(\n connections: EditorConnection[],\n nodes: EditorNode[],\n blackboard: BlackboardVariableDefinition[]\n ): PropertyBinding[] {\n const bindings: PropertyBinding[] = [];\n const blackboardVarNames = new Set(blackboard.map((v) => v.name));\n\n const propertyConnections = connections.filter((conn) => conn.connectionType === 'property');\n\n for (const conn of propertyConnections) {\n const fromNode = nodes.find((n) => n.id === conn.from);\n const toNode = nodes.find((n) => n.id === conn.to);\n\n if (!fromNode || !toNode || !conn.toProperty) {\n logger.warn(`跳过无效的属性连接: from=${conn.from}, to=${conn.to}`);\n continue;\n }\n\n let variableName: string | undefined;\n\n if (fromNode.data.nodeType === 'blackboard-variable') {\n variableName = fromNode.data.variableName;\n } else if (conn.fromProperty) {\n variableName = conn.fromProperty;\n }\n\n if (!variableName) {\n logger.warn(`无法确定变量名: from节点=${fromNode.template.displayName}`);\n continue;\n }\n\n if (!blackboardVarNames.has(variableName)) {\n logger.warn(`属性绑定引用了不存在的黑板变量: ${variableName}`);\n continue;\n }\n\n bindings.push({\n nodeId: toNode.id,\n propertyName: conn.toProperty,\n variableName\n });\n }\n\n return bindings;\n }\n\n /**\n * 从资产格式转换回编辑器格式(用于加载)\n *\n * @param asset 行为树资产\n * @returns 编辑器格式数据\n */\n static fromAsset(asset: BehaviorTreeAsset): EditorFormat {\n logger.info('开始转换资产格式到编辑器格式');\n\n const nodes = this.convertNodesFromAsset(asset.nodes);\n\n const blackboard: Record<string, any> = {};\n for (const variable of asset.blackboard) {\n blackboard[variable.name] = variable.defaultValue;\n }\n\n const connections = this.convertPropertyBindingsToConnections(\n asset.propertyBindings || []\n );\n\n const nodeConnections = this.buildNodeConnections(asset.nodes);\n connections.push(...nodeConnections);\n\n const metadata: { name: string; description?: string; createdAt?: string; modifiedAt?: string } = {\n name: asset.metadata.name\n };\n\n if (asset.metadata.description) {\n metadata.description = asset.metadata.description;\n }\n\n if (asset.metadata.createdAt) {\n metadata.createdAt = asset.metadata.createdAt;\n }\n\n if (asset.metadata.modifiedAt) {\n metadata.modifiedAt = asset.metadata.modifiedAt;\n }\n\n const editorData: EditorFormat = {\n version: asset.metadata.version,\n metadata,\n nodes,\n connections,\n blackboard,\n canvasState: {\n offset: { x: 0, y: 0 },\n scale: 1\n }\n };\n\n logger.info(`转换完成: ${nodes.length}个节点, ${connections.length}个连接`);\n\n return editorData;\n }\n\n /**\n * 从资产格式转换节点\n */\n private static convertNodesFromAsset(assetNodes: BehaviorTreeNodeData[]): EditorNode[] {\n return assetNodes.map((node, index) => {\n const position = {\n x: 100 + (index % 5) * 250,\n y: 100 + Math.floor(index / 5) * 150\n };\n\n const template: any = {\n displayName: node.name,\n category: this.inferCategory(node.nodeType),\n type: node.nodeType\n };\n\n if (node.data.className) {\n template.className = node.data.className;\n }\n\n return {\n id: node.id,\n template,\n data: { ...node.data },\n position,\n children: node.children\n };\n });\n }\n\n /**\n * 推断节点分类\n */\n private static inferCategory(nodeType: NodeType): string {\n switch (nodeType) {\n case NodeType.Action:\n return '动作';\n case NodeType.Condition:\n return '条件';\n case NodeType.Composite:\n return '组合';\n case NodeType.Decorator:\n return '装饰器';\n default:\n return '其他';\n }\n }\n\n /**\n * 将属性绑定转换为连接\n */\n private static convertPropertyBindingsToConnections(\n bindings: PropertyBinding[]\n ): EditorConnection[] {\n const connections: EditorConnection[] = [];\n\n for (const binding of bindings) {\n connections.push({\n from: 'blackboard',\n to: binding.nodeId,\n toProperty: binding.propertyName,\n connectionType: 'property'\n });\n }\n\n return connections;\n }\n\n /**\n * 根据children关系构建节点连接\n */\n private static buildNodeConnections(nodes: BehaviorTreeNodeData[]): EditorConnection[] {\n const connections: EditorConnection[] = [];\n\n for (const node of nodes) {\n for (const childId of node.children) {\n connections.push({\n from: node.id,\n to: childId,\n connectionType: 'node'\n });\n }\n }\n\n return connections;\n }\n}\n","import { createLogger, BinarySerializer } from '@esengine/ecs-framework';\nimport type { BehaviorTreeAsset } from './BehaviorTreeAsset';\nimport { BehaviorTreeAssetValidator } from './BehaviorTreeAsset';\nimport { EditorFormatConverter, type EditorFormat } from './EditorFormatConverter';\n\nconst logger = createLogger('BehaviorTreeAssetSerializer');\n\n/**\n * 行为树序列化格式\n * Behavior tree serialization format\n */\nexport type BehaviorTreeSerializationFormat = 'json' | 'binary';\n\n/**\n * 序列化选项\n */\nexport interface SerializationOptions {\n /**\n * 序列化格式\n */\n format: BehaviorTreeSerializationFormat;\n\n /**\n * 是否美化JSON输出(仅format='json'时有效)\n */\n pretty?: boolean;\n\n /**\n * 是否在序列化前验证资产\n */\n validate?: boolean;\n}\n\n/**\n * 反序列化选项\n */\nexport interface DeserializationOptions {\n /**\n * 是否在反序列化后验证资产\n */\n validate?: boolean;\n\n /**\n * 是否严格模式(验证失败抛出异常)\n */\n strict?: boolean;\n}\n\n/**\n * 行为树资产序列化器\n *\n * 支持JSON和二进制两种格式\n */\nexport class BehaviorTreeAssetSerializer {\n /**\n * 序列化资产\n *\n * @param asset 行为树资产\n * @param options 序列化选项\n * @returns 序列化后的数据(字符串或Uint8Array)\n *\n * @example\n * ```typescript\n * // JSON格式\n * const jsonData = BehaviorTreeAssetSerializer.serialize(asset, { format: 'json', pretty: true });\n *\n * // 二进制格式\n * const binaryData = BehaviorTreeAssetSerializer.serialize(asset, { format: 'binary' });\n * ```\n */\n static serialize(\n asset: BehaviorTreeAsset,\n options: SerializationOptions = { format: 'json', pretty: true }\n ): string | Uint8Array {\n // 验证资产(如果需要)\n if (options.validate !== false) {\n const validation = BehaviorTreeAssetValidator.validate(asset);\n if (!validation.valid) {\n const errors = validation.errors?.join(', ') || 'Unknown error';\n throw new Error(`资产验证失败: ${errors}`);\n }\n\n if (validation.warnings && validation.warnings.length > 0) {\n logger.warn(`资产验证警告: ${validation.warnings.join(', ')}`);\n }\n }\n\n // 根据格式序列化\n if (options.format === 'json') {\n return this.serializeToJSON(asset, options.pretty);\n } else {\n return this.serializeToBinary(asset);\n }\n }\n\n /**\n * 序列化为JSON格式\n */\n private static serializeToJSON(asset: BehaviorTreeAsset, pretty: boolean = true): string {\n try {\n const json = pretty\n ? JSON.stringify(asset, null, 2)\n : JSON.stringify(asset);\n\n logger.info(`已序列化为JSON: ${json.length} 字符`);\n return json;\n } catch (error) {\n throw new Error(`JSON序列化失败: ${error}`);\n }\n }\n\n /**\n * 序列化为二进制格式\n */\n private static serializeToBinary(asset: BehaviorTreeAsset): Uint8Array {\n try {\n const binary = BinarySerializer.encode(asset);\n logger.info(`已序列化为二进制: ${binary.length} 字节`);\n return binary;\n } catch (error) {\n throw new Error(`二进制序列化失败: ${error}`);\n }\n }\n\n /**\n * 反序列化资产\n *\n * @param data 序列化的数据(字符串或Uint8Array)\n * @param options 反序列化选项\n * @returns 行为树资产\n *\n * @example\n * ```typescript\n * // 从JSON加载\n * const asset = BehaviorTreeAssetSerializer.deserialize(jsonString);\n *\n * // 从二进制加载\n * const asset = BehaviorTreeAssetSerializer.deserialize(binaryData);\n * ```\n */\n static deserialize(\n data: string | Uint8Array,\n options: DeserializationOptions = { validate: true, strict: true }\n ): BehaviorTreeAsset {\n let asset: BehaviorTreeAsset;\n\n try {\n if (typeof data === 'string') {\n asset = this.deserializeFromJSON(data);\n } else {\n asset = this.deserializeFromBinary(data);\n }\n } catch (error) {\n throw new Error(`反序列化失败: ${error}`);\n }\n\n // 验证资产(如果需要)\n if (options.validate !== false) {\n const validation = BehaviorTreeAssetValidator.validate(asset);\n\n if (!validation.valid) {\n const errors = validation.errors?.join(', ') || 'Unknown error';\n if (options.strict) {\n throw new Error(`资产验证失败: ${errors}`);\n } else {\n logger.error(`资产验证失败: ${errors}`);\n }\n }\n\n if (validation.warnings && validation.warnings.length > 0) {\n logger.warn(`资产验证警告: ${validation.warnings.join(', ')}`);\n }\n }\n\n return asset;\n }\n\n /**\n * 从JSON反序列化\n */\n private static deserializeFromJSON(json: string): BehaviorTreeAsset {\n try {\n const data = JSON.parse(json);\n\n // 检测是否是编辑器格式(EditorFormat)\n // 编辑器格式有 nodes/connections/blackboard,但没有 rootNodeId\n // 运行时资产格式有 rootNodeId\n const isEditorFormat = !data.rootNodeId && data.nodes && data.connections;\n\n if (isEditorFormat) {\n logger.info('检测到编辑器格式,正在转换为运行时资产格式...');\n const editorData = data as EditorFormat;\n const asset = EditorFormatConverter.toAsset(editorData);\n logger.info(`已从编辑器格式转换: ${asset.nodes.length} 个节点`);\n return asset;\n } else {\n const asset = data as BehaviorTreeAsset;\n logger.info(`已从运行时资产格式反序列化: ${asset.nodes.length} 个节点`);\n return asset;\n }\n } catch (error) {\n throw new Error(`JSON解析失败: ${error}`);\n }\n }\n\n /**\n * 从二进制反序列化\n */\n private static deserializeFromBinary(binary: Uint8Array): BehaviorTreeAsset {\n try {\n const asset = BinarySerializer.decode(binary) as BehaviorTreeAsset;\n logger.info(`已从二进制反序列化: ${asset.nodes.length} 个节点`);\n return asset;\n } catch (error) {\n throw new Error(`二进制解码失败: ${error}`);\n }\n }\n\n /**\n * 检测数据格式\n *\n * @param data 序列化的数据\n * @returns 格式类型\n */\n static detectFormat(data: string | Uint8Array): BehaviorTreeSerializationFormat {\n if (typeof data === 'string') {\n return 'json';\n } else {\n return 'binary';\n }\n }\n\n /**\n * 获取序列化数据的信息(不完全反序列化)\n *\n * @param data 序列化的数据\n * @returns 资产元信息\n */\n static getInfo(data: string | Uint8Array): {\n format: BehaviorTreeSerializationFormat;\n name: string;\n version: string;\n nodeCount: number;\n blackboardVariableCount: number;\n size: number;\n } | null {\n try {\n const format = this.detectFormat(data);\n let asset: BehaviorTreeAsset;\n\n if (format === 'json') {\n asset = JSON.parse(data as string);\n } else {\n asset = BinarySerializer.decode(data as Uint8Array) as BehaviorTreeAsset;\n }\n\n const size = typeof data === 'string' ? data.length : data.length;\n\n return {\n format,\n name: asset.metadata.name,\n version: asset.version,\n nodeCount: asset.nodes.length,\n blackboardVariableCount: asset.blackboard.length,\n size\n };\n } catch (error) {\n logger.error(`获取资产信息失败: ${error}`);\n return null;\n }\n }\n\n /**\n * 转换格式\n *\n * @param data 源数据\n * @param targetFormat 目标格式\n * @param pretty 是否美化JSON(仅当目标格式为json时有效)\n * @returns 转换后的数据\n *\n * @example\n * ```typescript\n * // JSON转二进制\n * const binary = BehaviorTreeAssetSerializer.convert(jsonString, 'binary');\n *\n * // 二进制转JSON\n * const json = BehaviorTreeAssetSerializer.convert(binaryData, 'json', true);\n * ```\n */\n static convert(\n data: string | Uint8Array,\n targetFormat: BehaviorTreeSerializationFormat,\n pretty: boolean = true\n ): string | Uint8Array {\n const asset = this.deserialize(data, { validate: false });\n\n return this.serialize(asset, {\n format: targetFormat,\n pretty,\n validate: false\n });\n }\n\n /**\n * 比较两个资产数据的大小\n *\n * @param jsonData JSON格式数据\n * @param binaryData 二进制格式数据\n * @returns 压缩率(百分比)\n */\n static compareSize(jsonData: string, binaryData: Uint8Array): {\n jsonSize: number;\n binarySize: number;\n compressionRatio: number;\n savedBytes: number;\n } {\n const jsonSize = jsonData.length;\n const binarySize = binaryData.length;\n const savedBytes = jsonSize - binarySize;\n const compressionRatio = (savedBytes / jsonSize) * 100;\n\n return {\n jsonSize,\n binarySize,\n compressionRatio,\n savedBytes\n };\n }\n}\n","import { IService } from '@esengine/ecs-framework';\nimport { BlackboardValueType, BlackboardVariable } from '../Types/TaskStatus';\n\n/**\n * 全局黑板配置\n */\nexport interface GlobalBlackboardConfig {\n version: string;\n variables: BlackboardVariable[];\n}\n\n/**\n * 全局黑板服务\n *\n * 提供所有行为树共享的全局变量存储\n *\n * 使用方式:\n * ```typescript\n * // 注册服务(在 BehaviorTreePlugin.install 中自动完成)\n * core.services.registerSingleton(GlobalBlackboardService);\n *\n * // 获取服务\n * const blackboard = core.services.resolve(GlobalBlackboardService);\n * ```\n */\nexport class GlobalBlackboardService implements IService {\n private variables: Map<string, BlackboardVariable> = new Map();\n\n dispose(): void {\n this.variables.clear();\n }\n\n /**\n * 定义全局变量\n */\n defineVariable(\n name: string,\n type: BlackboardValueType,\n initialValue: any,\n options?: {\n readonly?: boolean;\n description?: string;\n }\n ): void {\n const variable: BlackboardVariable = {\n name,\n type,\n value: initialValue,\n readonly: options?.readonly ?? false\n };\n\n if (options?.description !== undefined) {\n variable.description = options.description;\n }\n\n this.variables.set(name, variable);\n }\n\n /**\n * 获取全局变量值\n */\n getValue<T = any>(name: string): T | undefined {\n const variable = this.variables.get(name);\n return variable?.value as T;\n }\n\n /**\n * 设置全局变量值\n */\n setValue(name: string, value: any, force: boolean = false): boolean {\n const variable = this.variables.get(name);\n\n if (!variable) {\n return false;\n }\n\n if (variable.readonly && !force) {\n return false;\n }\n\n variable.value = value;\n return true;\n }\n\n /**\n * 检查全局变量是否存在\n */\n hasVariable(name: string): boolean {\n return this.variables.has(name);\n }\n\n /**\n * 删除全局变量\n */\n removeVariable(name: string): boolean {\n return this.variables.delete(name);\n }\n\n /**\n * 获取所有变量名\n */\n getVariableNames(): string[] {\n return Array.from(this.variables.keys());\n }\n\n /**\n * 获取所有变量\n */\n getAllVariables(): BlackboardVariable[] {\n return Array.from(this.variables.values());\n }\n\n /**\n * 清空所有全局变量\n */\n clear(): void {\n this.variables.clear();\n }\n\n /**\n * 批量设置变量\n */\n setVariables(values: Record<string, any>): void {\n for (const [name, value] of Object.entries(values)) {\n const variable = this.variables.get(name);\n if (variable && !variable.readonly) {\n variable.value = value;\n }\n }\n }\n\n /**\n * 批量获取变量\n */\n getVariables(names: string[]): Record<string, any> {\n const result: Record<string, any> = {};\n for (const name of names) {\n const value = this.getValue(name);\n if (value !== undefined) {\n result[name] = value;\n }\n }\n return result;\n }\n\n /**\n * 导出配置\n */\n exportConfig(): GlobalBlackboardConfig {\n return {\n version: '1.0',\n variables: Array.from(this.variables.values())\n };\n }\n\n /**\n * 导入配置\n */\n importConfig(config: GlobalBlackboardConfig): void {\n this.variables.clear();\n for (const variable of config.variables) {\n this.variables.set(variable.name, variable);\n }\n }\n\n /**\n * 序列化为 JSON\n */\n toJSON(): string {\n return JSON.stringify(this.exportConfig(), null, 2);\n }\n\n /**\n * 从 JSON 反序列化\n */\n static fromJSON(json: string): GlobalBlackboardConfig {\n return JSON.parse(json);\n }\n}\n","export enum BlackboardValueType {\n // 基础类型\n String = 'string',\n Number = 'number',\n Boolean = 'boolean',\n\n // 数学类型\n Vector2 = 'vector2',\n Vector3 = 'vector3',\n Vector4 = 'vector4',\n Quaternion = 'quaternion',\n Color = 'color',\n\n // 引用类型\n GameObject = 'gameObject',\n Transform = 'transform',\n Component = 'component',\n AssetReference = 'assetReference',\n\n // 集合类型\n Array = 'array',\n Map = 'map',\n\n // 高级类型\n Enum = 'enum',\n Struct = 'struct',\n Function = 'function',\n\n // 游戏特定类型\n EntityId = 'entityId',\n NodePath = 'nodePath',\n ResourcePath = 'resourcePath',\n AnimationState = 'animationState',\n AudioClip = 'audioClip',\n Material = 'material',\n Texture = 'texture'\n}\n\nexport interface Vector2 {\n x: number;\n y: number;\n}\n\nexport interface Vector3 extends Vector2 {\n z: number;\n}\n\nexport interface Vector4 extends Vector3 {\n w: number;\n}\n\nexport interface Quaternion {\n x: number;\n y: number;\n z: number;\n w: number;\n}\n\nexport interface Color {\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\nexport interface BlackboardTypeDefinition {\n type: BlackboardValueType;\n displayName: string;\n category: 'basic' | 'math' | 'reference' | 'collection' | 'advanced' | 'game';\n defaultValue: any;\n editorComponent?: string; // 自定义编辑器组件\n validator?: (value: any) => boolean;\n converter?: (value: any) => any;\n}\n\nexport const BlackboardTypes: Record<BlackboardValueType, BlackboardTypeDefinition> = {\n [BlackboardValueType.String]: {\n type: BlackboardValueType.String,\n displayName: '字符串',\n category: 'basic',\n defaultValue: '',\n validator: (v) => typeof v === 'string'\n },\n [BlackboardValueType.Number]: {\n type: BlackboardValueType.Number,\n displayName: '数字',\n category: 'basic',\n defaultValue: 0,\n validator: (v) => typeof v === 'number'\n },\n [BlackboardValueType.Boolean]: {\n type: BlackboardValueType.Boolean,\n displayName: '布尔值',\n category: 'basic',\n defaultValue: false,\n validator: (v) => typeof v === 'boolean'\n },\n [BlackboardValueType.Vector2]: {\n type: BlackboardValueType.Vector2,\n displayName: '二维向量',\n category: 'math',\n defaultValue: { x: 0, y: 0 },\n editorComponent: 'Vector2Editor',\n validator: (v) => v && typeof v.x === 'number' && typeof v.y === 'number'\n },\n [BlackboardValueType.Vector3]: {\n type: BlackboardValueType.Vector3,\n displayName: '三维向量',\n category: 'math',\n defaultValue: { x: 0, y: 0, z: 0 },\n editorComponent: 'Vector3Editor',\n validator: (v) => v && typeof v.x === 'number' && typeof v.y === 'number' && typeof v.z === 'number'\n },\n [BlackboardValueType.Color]: {\n type: BlackboardValueType.Color,\n displayName: '颜色',\n category: 'math',\n defaultValue: { r: 1, g: 1, b: 1, a: 1 },\n editorComponent: 'ColorEditor',\n validator: (v) => v && typeof v.r === 'number' && typeof v.g === 'number' && typeof v.b === 'number' && typeof v.a === 'number'\n },\n [BlackboardValueType.GameObject]: {\n type: BlackboardValueType.GameObject,\n displayName: '游戏对象',\n category: 'reference',\n defaultValue: null,\n editorComponent: 'GameObjectPicker'\n },\n [BlackboardValueType.Transform]: {\n type: BlackboardValueType.Transform,\n displayName: '变换组件',\n category: 'reference',\n defaultValue: null,\n editorComponent: 'ComponentPicker'\n },\n [BlackboardValueType.AssetReference]: {\n type: BlackboardValueType.AssetReference,\n displayName: '资源引用',\n category: 'reference',\n defaultValue: null,\n editorComponent: 'AssetPicker'\n },\n [BlackboardValueType.EntityId]: {\n type: BlackboardValueType.EntityId,\n displayName: '实体ID',\n category: 'game',\n defaultValue: -1,\n validator: (v) => typeof v === 'number' && v >= -1\n },\n [BlackboardValueType.ResourcePath]: {\n type: BlackboardValueType.ResourcePath,\n displayName: '资源路径',\n category: 'game',\n defaultValue: '',\n editorComponent: 'AssetPathPicker'\n },\n [BlackboardValueType.Array]: {\n type: BlackboardValueType.Array,\n displayName: '数组',\n category: 'collection',\n defaultValue: [],\n editorComponent: 'ArrayEditor'\n },\n [BlackboardValueType.Map]: {\n type: BlackboardValueType.Map,\n displayName: '映射表',\n category: 'collection',\n defaultValue: {},\n editorComponent: 'MapEditor'\n },\n [BlackboardValueType.Enum]: {\n type: BlackboardValueType.Enum,\n displayName: '枚举',\n category: 'advanced',\n defaultValue: '',\n editorComponent: 'EnumPicker'\n },\n [BlackboardValueType.AnimationState]: {\n type: BlackboardValueType.AnimationState,\n displayName: '动画状态',\n category: 'game',\n defaultValue: '',\n editorComponent: 'AnimationStatePicker'\n },\n [BlackboardValueType.AudioClip]: {\n type: BlackboardValueType.AudioClip,\n displayName: '音频片段',\n category: 'game',\n defaultValue: null,\n editorComponent: 'AudioClipPicker'\n },\n [BlackboardValueType.Material]: {\n type: BlackboardValueType.Material,\n displayName: '材质',\n category: 'game',\n defaultValue: null,\n editorComponent: 'MaterialPicker'\n },\n [BlackboardValueType.Texture]: {\n type: BlackboardValueType.Texture,\n displayName: '纹理',\n category: 'game',\n defaultValue: null,\n editorComponent: 'TexturePicker'\n },\n [BlackboardValueType.Vector4]: {\n type: BlackboardValueType.Vector4,\n displayName: '四维向量',\n category: 'math',\n defaultValue: { x: 0, y: 0, z: 0, w: 0 },\n editorComponent: 'Vector4Editor'\n },\n [BlackboardValueType.Quaternion]: {\n type: BlackboardValueType.Quaternion,\n displayName: '四元数',\n category: 'math',\n defaultValue: { x: 0, y: 0, z: 0, w: 1 },\n editorComponent: 'QuaternionEditor'\n },\n [BlackboardValueType.Component]: {\n type: BlackboardValueType.Component,\n displayName: '组件',\n category: 'reference',\n defaultValue: null,\n editorComponent: 'ComponentPicker'\n },\n [BlackboardValueType.Struct]: {\n type: BlackboardValueType.Struct,\n displayName: '结构体',\n category: 'advanced',\n defaultValue: {},\n editorComponent: 'StructEditor'\n },\n [BlackboardValueType.Function]: {\n type: BlackboardValueType.Function,\n displayName: '函数',\n category: 'advanced',\n defaultValue: null,\n editorComponent: 'FunctionPicker'\n },\n [BlackboardValueType.NodePath]: {\n type: BlackboardValueType.NodePath,\n displayName: '节点路径',\n category: 'game',\n defaultValue: '',\n editorComponent: 'NodePathPicker'\n }\n};\n","/**\n * 行为树模块服务令牌\n * Behavior tree module service tokens\n */\n\nimport { createServiceToken } from '@esengine/ecs-framework';\nimport type { BehaviorTreeExecutionSystem } from './execution/BehaviorTreeExecutionSystem';\n\n// ============================================================================\n// 行为树模块导出的令牌 | Tokens exported by behavior tree module\n// ============================================================================\n\n/**\n * 行为树执行系统令牌\n * Behavior tree execution system token\n */\nexport const BehaviorTreeSystemToken = createServiceToken<BehaviorTreeExecutionSystem>('behaviorTreeSystem');\n"],"mappings":"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","names":["BehaviorTreeAssetType","TaskStatus","NodeType","Root","Composite","Decorator","Action","Condition","CompositeType","DecoratorType","AbortType","BlackboardValueType","createDefaultRuntimeState","status","TaskStatus","Invalid","currentChildIndex","Component","ECSComponent","Property","Serializable","Serialize","IgnoreSerialization","BehaviorTreeRuntimeComponent","Component","treeAssetId","autoStart","isRunning","nodeStates","Map","blackboard","blackboardObservers","activeNodeIds","Set","needsReset","nodesToAbort","executionOrderCounter","getNodeState","nodeId","has","set","createDefaultRuntimeState","get","resetNodeState","state","status","TaskStatus","Invalid","currentChildIndex","startTime","lastExecutionTime","repeatCount","cachedResult","shuffledIndices","isAborted","lastConditionResult","observedKeys","resetAllStates","clear","getBlackboardValue","key","setBlackboardValue","value","oldValue","notifyBlackboardChange","hasBlackboardKey","initializeBlackboard","variables","forEach","clearBlackboard","start","stop","pause","resume","observeBlackboard","keys","callback","observer","push","unobserveBlackboard","observers","values","index","findIndex","o","splice","newValue","error","console","requestAbort","add","shouldAbort","clearAbortRequest","delete","clearAllAbortRequests","type","label","extensions","version","createLogger","EditorToBehaviorTreeDataConverter","fromEditorJSON","json","editorData","JSON","parse","convert","rootNode","nodes","find","n","template","type","data","Error","propertyBindingsMap","buildPropertyBindingsMap","nodesMap","Map","editorNode","isNonExecutableNode","propertyBindings","get","id","behaviorNodeData","convertNode","set","blackboardVariables","blackboard","Object","entries","generateTreeId","name","metadata","rootNodeId","bindingsMap","connections","nodeToVariableMap","node","conn","connectionType","toProperty","variableName","from","bindings","to","nodeType","mapNodeType","config","extractConfig","dataBindings","extractBindings","abortType","extractAbortType","implementationType","className","extractImplementationType","console","warn","getDefaultImplementationType","displayName","children","keys","length","typeFieldMap","NodeType","Composite","Decorator","Action","Condition","Root","field","undefined","defaultImplementations","toLowerCase","internalFields","Set","key","value","has","isBinding","extractBindingKey","_isBlackboardBinding","blackboardKey","binding","abortTypeStr","String","AbortType","None","Self","LowerPriority","Both","replace","Date","now","toEditorJSON","treeData","convertToEditor","stringify","_id","nodeData","push","convertNodeToEditor","fromEntries","version","description","modifiedAt","toISOString","typeStr","result","logger","createLogger","BehaviorTreeAssetManager","assets","Map","loadAsset","asset","has","id","warn","set","info","name","nodes","size","loadFromEditorJSON","json","treeData","EditorToBehaviorTreeDataConverter","fromEditorJSON","error","loadMultipleFromEditorJSON","jsonDataList","successCount","length","getAsset","assetId","get","hasAsset","unloadAsset","result","delete","clearAll","clear","getAssetCount","getAllAssetIds","Array","from","keys","dispose","BindingHelper","getValue","context","configKey","defaultValue","nodeData","runtime","bindings","blackboardKey","boundValue","getBlackboardValue","undefined","configValue","config","hasBinding","getBindingKey","NodeExecutorRegistry","executors","Map","register","implementationType","executor","has","console","warn","set","get","unregister","delete","clear","EntitySystem","Matcher","Time","Core","ECSSystem","ServiceContainer","NodeMetadataRegistry","register","target","metadata","metadataMap","set","implementationType","executorClassMap","executorConstructors","getMetadata","get","getAllMetadata","Array","from","values","getByCategory","category","filter","m","getByNodeType","nodeType","getImplementationType","executorClass","getExecutorConstructor","getAllExecutorConstructors","Map","NodeExecutorMetadata","RootExecutor","execute","context","nodeData","children","length","TaskStatus","Failure","childId","executeChild","reset","_context","implementationType","nodeType","NodeType","Root","displayName","description","category","childrenConstraints","min","max","SequenceExecutor","execute","context","nodeData","state","children","length","TaskStatus","Success","currentChildIndex","childId","status","executeChild","Running","Failure","reset","implementationType","nodeType","NodeType","Composite","displayName","description","category","childrenConstraints","min","SelectorExecutor","execute","context","nodeData","state","children","length","TaskStatus","Failure","currentChildIndex","childId","status","executeChild","Running","Success","reset","implementationType","nodeType","NodeType","Composite","displayName","description","category","childrenConstraints","min","ParallelExecutor","execute","context","nodeData","successPolicy","BindingHelper","getValue","failurePolicy","children","length","TaskStatus","Success","hasRunning","successCount","failureCount","childId","status","executeChild","Running","Failure","stopAllChildren","runtime","activeNodeIds","delete","resetNodeState","reset","implementationType","nodeType","NodeType","Composite","displayName","description","category","configSchema","type","default","options","childrenConstraints","min","ParallelSelectorExecutor","execute","context","nodeData","failurePolicy","BindingHelper","getValue","children","length","TaskStatus","Failure","hasRunning","successCount","failureCount","childId","status","executeChild","Running","Success","stopAllChildren","runtime","activeNodeIds","delete","resetNodeState","reset","implementationType","nodeType","NodeType","Composite","displayName","description","category","configSchema","type","default","options","RandomSequenceExecutor","execute","context","nodeData","state","children","length","TaskStatus","Success","shuffledIndices","shuffleIndices","currentChildIndex","shuffledIndex","childId","status","executeChild","Running","Failure","indices","Array","from","_","i","j","Math","floor","random","temp","reset","implementationType","nodeType","NodeType","Composite","displayName","description","category","childrenConstraints","min","RandomSelectorExecutor","execute","context","nodeData","state","children","length","TaskStatus","Failure","shuffledIndices","shuffleIndices","currentChildIndex","shuffledIndex","childId","status","executeChild","Running","Success","indices","Array","from","_","i","j","Math","floor","random","temp","reset","implementationType","nodeType","NodeType","Composite","displayName","description","category","InverterExecutor","execute","context","nodeData","children","length","TaskStatus","Failure","childId","status","executeChild","Running","Success","reset","runtime","resetNodeState","implementationType","nodeType","NodeType","Decorator","displayName","description","category","childrenConstraints","min","max","RepeaterExecutor","execute","context","nodeData","state","runtime","repeatCount","BindingHelper","getValue","endOnFailure","children","length","TaskStatus","Success","childId","status","executeChild","Running","Failure","resetNodeState","shouldContinue","reset","implementationType","nodeType","NodeType","Decorator","displayName","description","category","configSchema","type","default","supportBinding","childrenConstraints","min","max","AlwaysSucceedExecutor","execute","context","nodeData","children","length","TaskStatus","Success","childId","status","executeChild","Running","reset","runtime","resetNodeState","implementationType","nodeType","NodeType","Decorator","displayName","description","category","AlwaysFailExecutor","execute","context","nodeData","children","length","TaskStatus","Failure","childId","status","executeChild","Running","reset","runtime","resetNodeState","implementationType","nodeType","NodeType","Decorator","displayName","description","category","UntilSuccessExecutor","execute","context","nodeData","runtime","children","length","TaskStatus","Failure","childId","status","executeChild","Running","Success","resetNodeState","reset","implementationType","nodeType","NodeType","Decorator","displayName","description","category","UntilFailExecutor","execute","context","nodeData","runtime","children","length","TaskStatus","Success","childId","status","executeChild","Running","Failure","resetNodeState","reset","implementationType","nodeType","NodeType","Decorator","displayName","description","category","ConditionalExecutor","execute","context","nodeData","runtime","state","children","length","TaskStatus","Failure","blackboardKey","BindingHelper","getValue","expectedValue","operator","abortType","AbortType","None","actualValue","getBlackboardValue","conditionMet","evaluateCondition","wasRunning","status","Running","observedKeys","setupObserver","lastConditionResult","undefined","handleConditionBecameTrue","handleConditionBecameFalse","childId","executeChild","observeBlackboard","id","_key","newValue","lastResult","LowerPriority","Both","requestAbortLowerPriority","Self","requestAbort","reset","unobserveBlackboard","resetNodeState","implementationType","nodeType","NodeType","Decorator","displayName","description","category","configSchema","type","default","supportBinding","options","CooldownExecutor","execute","context","nodeData","state","totalTime","children","length","TaskStatus","Failure","cooldownTime","BindingHelper","getValue","lastExecutionTime","undefined","timeSinceLastExecution","childId","status","executeChild","Running","Success","reset","runtime","resetNodeState","implementationType","nodeType","NodeType","Decorator","displayName","description","category","configSchema","type","default","min","supportBinding","TimeoutExecutor","execute","context","nodeData","state","totalTime","children","length","TaskStatus","Failure","timeout","BindingHelper","getValue","startTime","undefined","elapsedTime","childId","status","executeChild","Running","reset","runtime","resetNodeState","implementationType","nodeType","NodeType","Decorator","displayName","description","category","configSchema","type","default","min","supportBinding","ServiceRegistry","register","name","service","services","set","get","has","unregister","delete","Map","ServiceDecorator","execute","context","nodeData","state","totalTime","children","length","TaskStatus","Failure","serviceName","BindingHelper","getValue","tickInterval","console","warn","status","Running","startTime","lastExecutionTime","onServiceStart","shouldTick","undefined","onServiceTick","childId","childStatus","executeChild","onServiceEnd","reset","runtime","resetNodeState","implementationType","nodeType","NodeType","Decorator","displayName","description","category","configSchema","type","default","supportBinding","WaitAction","execute","context","state","totalTime","duration","BindingHelper","getValue","startTime","TaskStatus","Running","Success","reset","implementationType","nodeType","NodeType","Action","displayName","description","category","configSchema","type","default","min","supportBinding","LogAction","execute","context","runtime","message","BindingHelper","getValue","logLevel","finalMessage","replaceBlackboardVariables","log","TaskStatus","Success","includes","replace","_","key","value","getBlackboardValue","trim","undefined","String","level","console","error","warn","implementationType","nodeType","NodeType","Action","displayName","description","category","configSchema","type","default","supportBinding","options","SetBlackboardValue","execute","context","runtime","key","BindingHelper","getValue","value","TaskStatus","Failure","setBlackboardValue","Success","implementationType","nodeType","NodeType","Action","displayName","description","category","configSchema","type","default","supportBinding","ModifyBlackboardValue","execute","context","runtime","key","BindingHelper","getValue","operation","value","TaskStatus","Failure","currentValue","getBlackboardValue","newValue","setBlackboardValue","Success","implementationType","nodeType","NodeType","Action","displayName","description","category","configSchema","type","default","options","supportBinding","ExecuteAction","execute","context","runtime","entity","actionName","BindingHelper","getValue","TaskStatus","Failure","actionFunction","getBlackboardValue","error","console","implementationType","nodeType","NodeType","Action","displayName","description","category","configSchema","type","default","Core","SubTreeExecutor","assetManager","getAssetManager","Core","services","resolve","BehaviorTreeAssetManager","execute","context","runtime","state","entity","treeAssetId","BindingHelper","getValue","shareBlackboard","TaskStatus","Failure","subTreeData","getAsset","console","warn","rootNode","nodes","get","rootNodeId","status","Running","blackboardVariables","key","value","entries","hasBlackboardKey","setBlackboardValue","subTreeContext","nodeData","getNodeState","id","treeData","deltaTime","totalTime","executeChild","childId","childData","childContext","executeSubTreeNode","children","length","Success","currentChildIndex","childStatus","reset","resetNodeState","implementationType","nodeType","NodeType","Action","displayName","description","category","configSchema","type","default","supportBinding","BlackboardCompare","execute","context","runtime","key","BindingHelper","getValue","compareValue","operator","TaskStatus","Failure","actualValue","getBlackboardValue","compare","Success","implementationType","nodeType","NodeType","Condition","displayName","description","category","configSchema","type","default","supportBinding","options","BlackboardExists","execute","context","runtime","key","BindingHelper","getValue","checkNull","TaskStatus","Failure","value","getBlackboardValue","undefined","Success","implementationType","nodeType","NodeType","Condition","displayName","description","category","configSchema","type","default","RandomProbability","execute","context","probability","BindingHelper","getValue","clampedProbability","Math","max","min","random","TaskStatus","Success","Failure","implementationType","nodeType","NodeType","Condition","displayName","description","category","configSchema","type","default","supportBinding","ExecuteCondition","execute","context","runtime","entity","conditionName","BindingHelper","getValue","TaskStatus","Failure","conditionFunction","getBlackboardValue","Success","error","console","implementationType","nodeType","NodeType","Condition","displayName","description","category","configSchema","type","default","BehaviorTreeExecutionSystem","EntitySystem","services","Matcher","empty","all","BehaviorTreeRuntimeComponent","btAssetManager","executorRegistry","_services","_assetManager","_warnedMissingAssets","Set","NodeExecutorRegistry","registerBuiltInExecutors","setAssetManager","assetManager","startAllAutoStartTrees","scene","logger","warn","entities","findEntitiesWithComponent","entity","runtime","getComponent","autoStart","treeAssetId","isRunning","ensureAssetLoaded","then","start","debug","name","catch","e","error","onAdded","enabled","assetGuid","getBTAssetManager","hasAsset","result","loadAsset","asset","Core","Error","resolve","BehaviorTreeAssetManager","getTreeData","cachedAsset","getAsset","data","constructors","NodeMetadataRegistry","getAllExecutorConstructors","implementationType","ExecutorClass","instance","register","getExecutorRegistry","process","treeData","has","add","needsReset","resetAllStates","blackboardVariables","size","initializeBlackboard","executeTree","rootNode","nodes","get","rootNodeId","status","executeNode","TaskStatus","Running","nodeData","state","getNodeState","id","shouldAbort","clearAbortRequest","isAborted","executor","reset","context","createContext","activeNodeIds","delete","Failure","executionOrder","undefined","executionOrderCounter","execute","deltaTime","Time","totalTime","executeChild","childId","childData","executeChildren","childIndices","children","length","results","indicesToExecute","Array","from","_","i","index","push","Core","BehaviorTreeStarter","start","entity","treeData","autoStart","assetManager","Core","services","resolve","BehaviorTreeAssetManager","loadAsset","runtime","getComponent","BehaviorTreeRuntimeComponent","addComponent","treeAssetId","id","blackboardVariables","key","value","entries","setBlackboardValue","isRunning","stop","resetAllStates","pause","resume","restart","BehaviorTreeBuilder","treeName","treeData","nodeStack","nodeIdCounter","id","Date","now","name","rootNodeId","nodes","Map","blackboardVariables","create","defineBlackboardVariable","key","initialValue","set","sequence","addCompositeNode","selector","parallel","config","parallelSelector","randomSequence","randomSelector","inverter","addDecoratorNode","repeater","repeatCount","alwaysSucceed","alwaysFail","untilSuccess","untilFail","conditional","blackboardKey","expectedValue","operator","cooldown","cooldownTime","timeout","wait","duration","addActionNode","log","message","setBlackboardValue","value","modifyBlackboardValue","operation","executeAction","actionName","blackboardCompare","compareValue","addConditionNode","blackboardExists","randomProbability","probability","executeCondition","conditionName","end","length","pop","build","Error","implementationType","nodeId","generateNodeId","node","nodeType","NodeType","Composite","children","parentId","parentNode","get","push","Decorator","Action","Condition","NodePropertyType","String","Number","Boolean","Select","Blackboard","Code","Variable","Asset","NodeTemplates","getAllTemplates","allMetadata","NodeMetadataRegistry","getAllMetadata","map","metadata","convertMetadataToTemplate","getTemplate","type","subType","find","t","config","defaultConfig","NodeType","Composite","compositeType","Decorator","decoratorType","Action","actionType","Condition","conditionType","properties","convertConfigSchemaToProperties","configSchema","nodeType","nodeTypeToString","implementationType","key","field","Object","entries","fieldDef","default","undefined","icon","color","getIconAndColorByType","category","constraints","childrenConstraints","getDefaultConstraintsByNodeType","template","displayName","getCategoryByNodeType","description","className","min","minChildren","requiresChildren","max","maxChildren","name","property","mapFieldTypeToPropertyType","label","defaultValue","allowMultipleConnections","options","opt","value","supportBinding","renderConfig","component","props","push","length","_category","BehaviorTreeAssetValidator","validate","asset","errors","warnings","version","push","metadata","name","rootNodeId","nodes","Array","isArray","nodeIds","Set","rootNode","find","n","id","node","has","add","nodeType","children","childId","referencedNodes","collectReferencedNodes","nodeId","blackboard","varNames","variable","type","propertyBindings","map","v","binding","variableName","propertyName","result","valid","length","getStats","actionCount","conditionCount","compositeCount","decoratorCount","NodeType","Action","Condition","Composite","Decorator","getDepth","currentDepth","maxChildDepth","childDepth","Math","max","nodeCount","blackboardVariableCount","propertyBindingCount","maxDepth","createLogger","logger","createLogger","EditorFormatConverter","toAsset","editorData","metadata","info","rootNode","findRootNode","nodes","Error","assetMetadata","name","version","description","createdAt","modifiedAt","Date","toISOString","convertNodes","blackboard","convertBlackboard","propertyBindings","convertPropertyBindings","connections","asset","rootNodeId","id","length","find","node","template","category","data","nodeType","editorNodes","map","convertNode","editorNode","className","displayName","type","children","variables","value","Object","entries","inferBlackboardType","push","defaultValue","BlackboardValueType","Number","String","Boolean","bindings","blackboardVarNames","Set","v","propertyConnections","filter","conn","connectionType","fromNode","n","from","toNode","to","toProperty","warn","variableName","fromProperty","has","nodeId","propertyName","fromAsset","convertNodesFromAsset","variable","convertPropertyBindingsToConnections","nodeConnections","buildNodeConnections","canvasState","offset","x","y","scale","assetNodes","index","position","Math","floor","inferCategory","NodeType","Action","Condition","Composite","Decorator","binding","childId","createLogger","BinarySerializer","logger","createLogger","BehaviorTreeAssetSerializer","serialize","asset","options","format","pretty","validate","validation","BehaviorTreeAssetValidator","valid","errors","join","Error","warnings","length","warn","serializeToJSON","serializeToBinary","json","JSON","stringify","info","error","binary","BinarySerializer","encode","deserialize","data","strict","deserializeFromJSON","deserializeFromBinary","parse","isEditorFormat","rootNodeId","nodes","connections","editorData","EditorFormatConverter","toAsset","decode","detectFormat","getInfo","size","name","metadata","version","nodeCount","blackboardVariableCount","blackboard","convert","targetFormat","compareSize","jsonData","binaryData","jsonSize","binarySize","savedBytes","compressionRatio","GlobalBlackboardService","variables","Map","dispose","clear","defineVariable","name","type","initialValue","options","variable","value","readonly","description","undefined","set","getValue","get","setValue","force","hasVariable","has","removeVariable","delete","getVariableNames","Array","from","keys","getAllVariables","values","setVariables","Object","entries","getVariables","names","result","exportConfig","version","importConfig","config","toJSON","JSON","stringify","fromJSON","json","parse","BlackboardTypes","type","displayName","category","defaultValue","validator","v","x","y","editorComponent","z","r","g","b","a","w","createServiceToken","BehaviorTreeSystemToken"]}