diff --git a/main-process/AppMenu.ts b/main-process/AppMenu.ts index 3e28e83..adfef0d 100644 --- a/main-process/AppMenu.ts +++ b/main-process/AppMenu.ts @@ -1,4 +1,4 @@ -import { BrowserView, Menu, app, shell, dialog, BrowserWindow, MenuItem, WebContents, MenuItemConstructorOptions } from 'electron'; +import { Menu, app, dialog, BrowserWindow, MenuItem, WebContents, MenuItemConstructorOptions } from 'electron'; import MainEventType from '../common/MainEventType'; import { MainProcess } from './main'; import Settings from './Settings'; @@ -167,8 +167,18 @@ export default class AppMenu { } private createNodeMenu() { + const nodeItems: MenuItemConstructorOptions[] = []; + for (let node of this.settings.nodeConfig) { + nodeItems.push({ + label: `${node.name}(${node.desc})`, + click: () => { + console.log("create node", node.name); + } + }) + } return new MenuItem({ - label: "新建节点" + label: "新建节点", + submenu: nodeItems }); } } \ No newline at end of file diff --git a/main-process/Settings.ts b/main-process/Settings.ts index 5b042e7..b0d4642 100644 --- a/main-process/Settings.ts +++ b/main-process/Settings.ts @@ -1,6 +1,7 @@ import * as fs from 'fs'; const settingPath = 'settings.json'; +const sampleNodeConfig = 'sample-node-config.json' export interface SettingsModel { recentWorkspaces?: string[]; @@ -18,7 +19,7 @@ export default class Settings { this.settings = { recentWorkspaces: [], recentFiles: [], - nodeConfigPath: '' + nodeConfigPath: sampleNodeConfig, }; this.save(); } @@ -33,6 +34,10 @@ export default class Settings { get recentFiles() { return this.settings.recentFiles; } + get nodeConfig() { + const str = fs.readFileSync(this.nodeConfigPath, 'utf8'); + return JSON.parse(str); + } set(config: SettingsModel) { this.settings = { diff --git a/sample-node-config.json b/sample-node-config.json new file mode 100644 index 0000000..e78a6c1 --- /dev/null +++ b/sample-node-config.json @@ -0,0 +1 @@ +[{"desc":"BOSS对话","input":["{对象}?"],"doc":"+ 使用event_level表中的事件ID(事件逻辑见事件表)\n","args":[{"desc":"事件ID","type":"int","name":"event_id"}],"name":"BossTalk"},{"desc":"获取自己的单位","output":["{单位}"],"name":"GetSelfAvatar"},{"desc":"炮手被动","args":[{"desc":"间隔","type":"int","name":"lock"},{"desc":"排除技能id","type":"int?","name":"ex1"},{"desc":"排除技能id","type":"int?","name":"ex2"},{"desc":"排除技能id","type":"int?","name":"ex3"},{"desc":"排除技能id","type":"int?","name":"ex4"},{"desc":"排除技能id","type":"int?","name":"ex5"}],"name":"Passive1010200"},{"desc":"获取单位数量","output":["数量(int)"],"args":[{"desc":"阵营1\/2","type":"int?","name":"camp"},{"desc":"角色","type":"boolean?","name":"role"},{"desc":"怪物","type":"boolean?","name":"monster"},{"desc":"子弹","type":"boolean?","name":"bullet"},{"desc":"机器人","type":"boolean?","name":"robot"}],"doc":"+ 默认全地图\n","name":"GetAvatarCount"},{"desc":"始终返回失败","doc":"+ 只能有一个子节点,多个仅执行第一个\n+ 不管子节点是否成功都返回失败\n","name":"AlwaysFail"},{"desc":"复活","name":"Realive"},{"desc":"加怒气点","input":["{作用目标}?"],"doc":"+ 是正常的怒气产消,会用于正常逻辑的怒气消耗\n+ 默认目标为自己\n+ 仅使用一次,是指本次释放技能所有被勾选“仅使用一次”的addAp节点最多加一次\n","args":[{"desc":"点数","type":"int","name":"add"},{"desc":"是否只加一次","type":"boolean?","name":"once"}],"name":"AddAp"},{"desc":"比较公共血量(千分比)","args":[{"desc":">","type":"int?","name":"gt"},{"desc":">=","type":"int?","name":"ge"},{"desc":"==","type":"int?","name":"eq"},{"desc":"<=","type":"int?","name":"le"},{"desc":"<","type":"int?","name":"lt"}],"doc":"+ 直接针对地图中的公共血量\n","name":"CmpShareHp"},{"desc":"查找敌人","output":["目标单位"],"args":[{"desc":"x","type":"int?","name":"x"},{"desc":"y","type":"int?","name":"y"},{"desc":"宽","type":"lua?","name":"w"},{"desc":"高","type":"lua?","name":"h"},{"desc":"查找类型","type":"string?","name":"type"},{"desc":"怪物类型","type":"int?","name":"monster_type"},{"desc":"以子弹为中心","type":"boolean?","name":"bullet"},{"desc":"忽略碰撞体积","type":"boolean?","name":"no_collision"},{"desc":"考虑自身体积","type":"boolean?","name":"self_collision"},{"desc":"距离优先","type":"boolean?","name":"dis_priority"}],"doc":"+ 返回单目标,判定优先级:威胁值最高,当威胁值相等时选最近那一个\n+ 没找到返回失败\n","name":"FindEnemy"},{"desc":"放范围内权重最大的技能","input":["{目标}"],"doc":"+ 当多个技能都可以满足释放条件时,按权重释放,被动技能不参与\n","output":["{技能id}"],"name":"LaunchSkillWithWeight"},{"desc":"设置朝向","args":[{"desc":"反向","type":"boolean?","name":"anti"},{"desc":"指定朝向","type":"int?","name":"face"}],"doc":"+ 1为右,-1为左\n+ 指定朝向优先\n","name":"SetFace"},{"desc":"随机移动","args":[{"desc":"只向前随机","type":"boolean?","name":"face"},{"desc":"范围","type":"int?","name":"range"}],"doc":"+ 无法移动返回失败\n+ 移动过程中返回正在运行状态,达到目的地返回成功\n","name":"MoveRandom"},{"desc":"贝塞尔曲线运动","input":["[路点]","{作用单位}"],"doc":"+ 子弹专用运动曲线,人物带测\n+ 飞行过程返回正在运行,抵达返回成功,前端假象,后端瞬移,最好不要在飞行过程做碰撞\n+ 所输入路点少于两个返回失败\n","args":[{"desc":"时间","type":"int","name":"time"},{"desc":"子弹","type":"boolean?","name":"bullet"}],"name":"BezierCurve"},{"desc":"正在待机","name":"IsIdle"},{"desc":"获取范围内怪物数量","output":["数量(int)"],"args":[{"desc":"怪物id","type":"int?","name":"monsterid"},{"desc":"x","type":"int?","name":"x"},{"desc":"y","type":"int?","name":"y"},{"desc":"宽","type":"lua?","name":"w"},{"desc":"高","type":"lua?","name":"h"},{"desc":"以子弹为中心","type":"boolean?","name":"bullet"},{"desc":"忽略碰撞体积","type":"boolean?","name":"no_collision"}],"name":"GetMonsterCountInRange"},{"desc":"否为主角","input":["{对象}"],"name":"IsRole"},{"desc":"获取buff时间","output":["帧数(int)"],"args":[{"desc":"首层id","type":"int?","name":"buffid"}],"doc":"+ 获取BUFF当前剩余时间\n+ 当同ID的BUFF同时存在不止一个时,按最大层数的BUFF的结果\n","name":"GetBuffTime"},{"desc":"自增","input":["变量"],"doc":"+ 所输入变量为空,返回失败\n+ 变量稳定加1\n","args":[{"desc":"值","type":"lua?","name":"add"}],"name":"AddValue"},{"desc":"怪物寻敌(读配置警戒范围)","output":["[{目标}]"],"args":[{"desc":"查找类型","type":"string?","name":"type"},{"desc":"忽略碰撞体积","type":"boolean?","name":"no_collision"},{"desc":"考虑自身体积","type":"boolean?","name":"self_collision"},{"desc":"威胁值优先","type":"boolean?","name":"threat"}],"doc":"+ 无目标返回失败\n","name":"MonsterFindEnemy"},{"desc":"取数组的长度","input":["数组"],"doc":"+ 若数组为空,返回失败\n","output":["值"],"name":"GetArrayCount"},{"desc":"释放技能","input":["{目标}"],"doc":"+ 本身也会进行技能冷却判定\n+ 技能转向按目标碰撞体积中心做判定(仅计算x轴)\n","args":[{"desc":"技能id","type":"int","name":"skillid"},{"desc":"改变朝向","type":"boolean?","name":"face"}],"name":"LaunchSkill"},{"desc":"取反","doc":"+ 将子节点的返回值取反\n","name":"Not"},{"desc":"正在移动","name":"IsMoving"},{"desc":"修改技能触发几率","args":[{"desc":"技能id","type":"lua","name":"skillid"},{"desc":"t1","type":"lua?","name":"t1"},{"desc":"t2","type":"lua?","name":"t2"},{"desc":"id","type":"lua?","name":"id"},{"desc":"p","type":"lua?","name":"p"}],"doc":"+ 调整触发类技能触发几率(直接替换表中数值)\n+ 没有携带技能时返回失败\n","name":"ChangeSkillTrigger"},{"desc":"驱散buff","input":["{目标}"],"doc":"+ 驱散成功与否收到驱散几率属性影响\n+ 无目标返回失败\n+ 来源默认是技能释放者,无来源技能默认自己\n","name":"DispelBuff"},{"desc":"Buff是否存在","input":["{对象}"],"doc":"+ 可以只填分类\n+ 单位默认自己\n","args":[{"desc":"分类","type":"int?","name":"type"},{"desc":"指定buffid(首层)","type":"int?","name":"buffid"}],"name":"HasBuff"},{"desc":"拉取到子弹","input":["[{被拉单位}]"],"doc":"+ 本质上是瞬移,过程不可见\n+ 拉去到子弹坐标\n","args":[{"desc":"时间\/帧","type":"int","name":"time"}],"name":"PullToBullet"},{"desc":"是否可以击退","input":["{目标单位}"],"doc":"+ 目标是主角、可击退的怪物(配表)且不处于霸体状态(目前不包括机器人与召唤物)则返回成功\n+ 其他情况或没有目标时返回失败\n","name":"CanHitBack"},{"desc":"否为怪物","input":["{对象}"],"name":"IsMonster"},{"desc":"是否已死亡","input":["{单位(默认自己)}"],"name":"IsDeath"},{"desc":"顺序执行","doc":"+ 一直往下执行,有子节点返回成功则返回成功,若全部节点返回失败则返回失败\n+ 子节点是或的关系\n","name":"Sequence"},{"desc":"等待","args":[{"desc":"帧数","type":"lua","name":"time"}],"doc":"+ 仅影响当前行为树\n","name":"Wait"},{"desc":"查找攻击范围内敌人","output":["{目标单位}"],"doc":"+ 使用monster中的攻击范围进行判定\n+ 没找到返回失败\n","name":"FindEnemyCanAttack"},{"desc":"检查副本类型","args":[{"desc":"副本id","type":"int?","name":"id"},{"desc":"是否为pvp","type":"boolean?","name":"is_pvp"}],"name":"CheckMapLevel"},{"desc":"查找多个友军","output":["[{目标单位}]"],"args":[{"desc":"x","type":"int?","name":"x"},{"desc":"y","type":"int?","name":"y"},{"desc":"宽","type":"lua?","name":"w"},{"desc":"高","type":"lua?","name":"h"},{"desc":"最大数量","type":"int?","name":"count"},{"desc":"查找类型","type":"string?","name":"type"},{"desc":"以子弹为中心","type":"boolean?","name":"bullet"},{"desc":"考虑自身体积","type":"boolean?","name":"self_collision"},{"desc":"忽略碰撞体积","type":"boolean?","name":"no_collision"}],"doc":"+ 跟FindEnemyList一样,仅限友军\n","name":"FindFriendList"},{"desc":"拉取目标","input":["{目的单位}","[{被拉单位}]"],"doc":"+ 本质上是瞬移,过程不可见\n","args":[{"desc":"时间\/帧","type":"int?","name":"time"}],"name":"PullToTarget"},{"desc":"击退","input":["目标"],"args":[{"desc":"时间(帧)","type":"int","name":"time"},{"desc":"距离","type":"int","name":"w"}],"name":"HitBack"},{"desc":"子树","args":[{"desc":"行为树","type":"string","name":"tree"}],"doc":"+ 不能死循环(原则上不可套娃)\n+ 不可接子节点\n+ 返回子树根节点结果\n","name":"ChildTree"},{"desc":"范围伤害","args":[{"desc":"x","type":"int?","name":"x"},{"desc":"y","type":"int?","name":"y"},{"desc":"宽","type":"lua?","name":"w"},{"desc":"高","type":"lua?","name":"h"},{"desc":"数量上限","type":"int?","name":"max"},{"desc":"查找类型","type":"string?","name":"type"},{"desc":"最终伤害加成(千分比)","type":"lua?","name":"add"},{"desc":"吸血(千分比)","type":"lua?","name":"recover"},{"desc":"技能伤害千分比","type":"lua?","name":"dmg_var"},{"desc":"技能固定伤害","type":"lua?","name":"dmg_const"},{"desc":"不播受击","type":"boolean?","name":"no_hit_action"},{"desc":"以子弹为中心","type":"boolean?","name":"bullet"},{"desc":"忽略碰撞体积","type":"boolean?","name":"no_collision"},{"desc":"伤害次数","type":"int?","name":"count"}],"doc":"+ findEnemyList+forEach+Hurt,必定成功\n","name":"RangeHurt"},{"desc":"遍历数组","input":["[{数组}]"],"doc":"+ 遍历数组,并对每个数组里的值进行一次运算\n+ 执行逻辑为并行执行\n","output":["{变量}"],"name":"ForEach"},{"desc":"只执行一次","args":[{"desc":"本帧内","type":"boolean?","name":"frame"}],"doc":"+ 可以接多个子节点,子节点默认全部执行\n+ 被打断后该节点后的子节点依旧不会执行\n+ 该节点执行后永远返回成功\n","name":"Once"},{"desc":"侦听技能释放","input":["{目标(默认自己)}"],"doc":"+ 第一次执行返回成功,之后执行返回失败\n","args":[{"desc":"技能id","type":"int?","name":"skillid"},{"desc":"技能类型","type":"int?","name":"type"}],"name":"ListenSkill"},{"desc":"宠物跟随","name":"PetFollow"},{"desc":"敌人处于警戒范围内","input":["{敌人}"],"doc":"+ 根据monster表中的警戒范围进行判定\n+ 敌人为空或敌人已经死亡返回失败\n","name":"InAlertRange"},{"desc":"随机并行执行","args":[{"desc":"数量","type":"lua","name":"count"}],"doc":"+ 随机选取若干子节点并行执行,过程无序\n+ 随机数量不得超过子节点\n+ 子节点不支持返回正在运行状态(wait之类)\n","name":"RandomParallel"},{"desc":"始终返回成功","doc":"+ 只能有一个子节点,多个仅执行第一个\n+ 不管子节点是否成功都返回成功\n","name":"AlwaysSuccess"},{"desc":"技能是否可释放","args":[{"desc":"技能id","type":"int","name":"skillid"}],"doc":"# 返回失败的情况:\n+ 没有携带该技能(配表)\n+ 处于CD状态\n+ 所释放技能的类型处于lockAction状态\n+ 被动技能\n+ 怒气技能需求怒气不足\n","name":"CanLaunch"},{"desc":"真实伤害","input":["{目标}"],"doc":"+ 无视伤害免疫\n+ 目标可以是单个或多个\n","args":[{"desc":"次数","type":"int?","name":"count"},{"desc":"固定值","type":"lua?","name":"extra"},{"desc":"不播受击","type":"boolean?","name":"no_hit_action"}],"name":"RealDamage"},{"desc":"比较属性值(千分比)","input":["{对象}"],"doc":"+ 对象默认自己\n+ 字段名只能填hp与ap\n","args":[{"desc":"字段(hp\/ap)","type":"string","name":"key"},{"desc":">","type":"int?","name":"gt"},{"desc":">=","type":"int?","name":"ge"},{"desc":"==","type":"int?","name":"eq"},{"desc":"<=","type":"int?","name":"le"},{"desc":"<","type":"int?","name":"lt"}],"name":"CmpAttrPercent"},{"desc":"设置为空","input":["变量"],"doc":"+ 将变量置空\n","name":"SetNull"},{"desc":"敌人处于攻击范围内","input":["{敌人}"],"doc":"+ 根据monster表中的攻击范围进行判定\n+ 敌人为空或敌人已经死亡返回失败\n","name":"InAttackRange"},{"desc":"秒杀单位","input":["{目标(默认自己)}"],"doc":"+ 无视一切,直接死亡\n","name":"SecKill"},{"input":["{目标}"],"doc":"+ 无目标返回失败\n+ 无法转向或无法移动返回失败\n+ 抵达地形边界返回失败\n+ 不会返回正在运行状态\n","name":"MoveAway"},{"desc":"锁定行为","args":[{"desc":"时间(帧)","type":"lua","name":"time"},{"desc":"禁止重力","type":"boolean?","name":"gravity"},{"desc":"禁止移动","type":"boolean?","name":"move"},{"desc":"禁止跳跃","type":"boolean?","name":"jump"},{"desc":"禁止转向","type":"boolean?","name":"face"},{"desc":"禁止普攻","type":"boolean?","name":"skill1"},{"desc":"禁止自动技能","type":"boolean?","name":"skill2"},{"desc":"禁止主动技能","type":"boolean?","name":"skill3"},{"desc":"禁止二段跳","type":"boolean?","name":"skill4"},{"desc":"霸体","type":"boolean?","name":"super_armor"},{"desc":"无法被选中","type":"boolean?","name":"select"},{"desc":"无法回怒","type":"boolean?","name":"ap"}],"doc":"+ 状态间不相互影响,重复效果取最大值\n+ 无特殊情况下仅用做技能过程设定单位状态\n","name":"LockAction"},{"desc":"获取单位属性","input":["{单位}"],"doc":"+ 属性名称,英文小写\n","args":[{"desc":"属性1名称","type":"string?","name":"key1"},{"desc":"属性2名称","type":"string?","name":"key2"},{"desc":"属性3名称","type":"string?","name":"key3"},{"desc":"属性4名称","type":"string?","name":"key4"},{"desc":"属性5名称","type":"string?","name":"key5"}],"output":["{属性1}","{属性2}","{属性3}","{属性4}","{属性5}"],"name":"GetAttrs"},{"desc":"击退怒气","input":["{作用目标}?"],"doc":"+ 受到击退怒气抵抗属性影响,原则上不可写负\n+ 来源默认是技能释放者,无来源技能默认自己\n+ 是否生效一次,是指本次释放技能所有被勾选“仅使用一次”的addAp节点最多加一次\n","args":[{"desc":"点数","type":"int","name":"add"},{"desc":"是否生效一次","type":"boolean?","name":"once"}],"name":"DropAp"},{"desc":"设置免疫伤害状态","args":[{"desc":"是否激活","type":"boolean?","name":"active"},{"desc":"持续时间","type":"lua?","name":"time"}],"name":"SetInvincibleState"},{"desc":"伤害之无中生有","input":["{目标}"],"args":[{"desc":"次数","type":"int?","name":"count"},{"desc":"伤害值","type":"lua?","name":"value"}],"name":"HurtWithoutSrc"},{"desc":"查找多个敌人","output":["[{目标单位}]"],"args":[{"desc":"x","type":"int?","name":"x"},{"desc":"y","type":"int?","name":"y"},{"desc":"宽","type":"lua?","name":"w"},{"desc":"高","type":"lua?","name":"h"},{"desc":"最大数量","type":"int?","name":"count"},{"desc":"查找类型","type":"string?","name":"type"},{"desc":"怪物类型","type":"int?","name":"monster_type"},{"desc":"以子弹为中心","type":"boolean?","name":"bullet"},{"desc":"忽略碰撞体积","type":"boolean?","name":"no_collision"},{"desc":"考虑自身体积","type":"boolean?","name":"self_collision"},{"desc":"距离优先","type":"boolean?","name":"dis_priority"}],"doc":"+ 返回数组\n+ 没找到返回失败\n","name":"FindEnemyList"},{"desc":"子弹是否已死亡","name":"IsBulletDeath"},{"desc":"侦听击杀","input":["{目标}"],"doc":"+ 第一次执行返回成功,之后执行返回失败\n","name":"ListenKill"},{"desc":"比较血量百分比","input":["{对象}"],"doc":"+ 对象默认自己\n","args":[{"desc":">","type":"int?","name":"gt"},{"desc":">=","type":"int?","name":"ge"},{"desc":"==","type":"int?","name":"eq"},{"desc":"<=","type":"int?","name":"le"},{"desc":"<","type":"int?","name":"lt"}],"name":"CmpHp"},{"desc":"循环执行","args":[{"desc":"次数","type":"lua?","name":"count"}],"name":"Loop"},{"desc":"敌人处于巡逻范围内","input":["{敌人}"],"doc":"+ 根据monster表中的巡逻范围进行判定\n+ 敌人为空或敌人已经死亡返回失败\n","name":"InPatrolRange"},{"desc":"增加技能等级","args":[{"desc":"skillid","type":"int","name":"skillid"},{"desc":"增加等级","type":"lua","name":"add"}],"doc":"+ 战斗过程增加的技能等级,可增可减\n+ 没有携带该技能时返回失败\n+ 技能等级最高可达上限,最低到1\n","name":"AddSkillLevel"},{"desc":"创建Buff","input":["{目标}?"],"doc":"+ 原则上AI行为树不可使用\n+ BUFF效果根据分类会受到对应属性(抗性)影响(具体查表)\n+ BUFF叠加规则见表中配置,可自叠\n+ BUFF的ID必须填第一层ID,否则会当第一层ID使用\n+ 该节点所填BUFF变量(持续时间、属性千分比)将会覆盖原BUFF表中持续时间\n+ 怪物不可控会使怪物直接免疫控制分类的BUFF\n+ 作用目标默认自己\n+ 除非buffid不存在返回失败,否则永远返回成功\n+ 属性如果使用公式,需要用双号括起来,{\\[1011\\]=\"atk*2\"}\n","args":[{"desc":"buffid","type":"lua","name":"buffid"},{"desc":"层数","type":"int","name":"stack"},{"desc":"持续时间(帧)","type":"lua?","name":"time"},{"desc":"属性(覆盖)","type":"lua?","name":"attrs"},{"desc":"属性千分比(覆盖)","type":"lua?","name":"attrs_per"}],"name":"CreateBuff"},{"desc":"造成百分比伤害","input":["{目标}"],"doc":"+ 跟hurt一样,除了是根据血量进行伤害计算,会受伤害免疫影响\n+ 目标为空返回失败\n","args":[{"desc":"伤害(千分比)","type":"lua?","name":"percent"},{"desc":"基于最大血量(默认当前血量)","type":"boolean?","name":"max_hp"},{"desc":"不播受击","type":"boolean?","name":"no_hit_action"}],"name":"HurtPercent"},{"desc":"怪物塔防寻路","output":["[路点]"],"doc":"+ 根据mappic_json里的路点进行移动(仅用于进击的怪怪)\n+ 无路点时返回失败\n","name":"MonsterFindDefendPath"},{"desc":"碰撞检测","output":["[{目标单位}]"],"args":[{"desc":"单位类型","type":"string?","name":"type"},{"desc":"共享碰撞","type":"boolean?","name":"share_skill"}],"doc":"+ 注意普朗克时间常量12帧,子弹实际情况下并非连续过程,速度不可过快\n+ 共享碰撞,所有同一技能的标记了的子弹共享碰撞记录\n+ 碰撞规则在子弹表中配置\n+ 返回结果为数组\n","name":"CheckCollision"},{"desc":"非空","input":["变量"],"doc":"+ 判断变量是否为空\n","name":"NotNull"},{"desc":"获取副本剩余时间","output":["时间\/秒(int)"],"doc":"+ 若副本无剩余时间,返回失败\n","name":"GetFubenRemainTime"},{"desc":"寻找本平台的敌人","output":["[{目标}]"],"doc":"+ 找当前平台怪物,不包括斜坡\n+ 没找到返回失败\n","name":"FindEnemyFloor"},{"desc":"创建子弹","input":["{以目标为中心}"],"doc":"+ 先创建的子弹表现层级低于后创建的,此处先后为该节点先后(不管延时)\n+ 延迟创建不算计子弹存活时间,延迟创建后无法打断,除非死亡\n+ 不在空中创建,起始坐标点在空中返回失败\n+ 目标默认自己\n+ 不在地里创建,设定后会做地形检测\n","args":[{"desc":"子弹id","type":"int","name":"id"},{"desc":"x","type":"int","name":"x"},{"desc":"y","type":"int","name":"y"},{"desc":"x初速度","type":"int?","name":"vx"},{"desc":"y初速度","type":"int?","name":"vy"},{"desc":"x加速度","type":"int?","name":"ax"},{"desc":"y加速度","type":"int?","name":"ay"},{"desc":"飞行时间","type":"int?","name":"time"},{"desc":"以子弹为中心","type":"boolean?","name":"by_bullet"},{"desc":"不在地里创建","type":"boolean?","name":"terrain"},{"desc":"不在空中创建","type":"boolean?","name":"nospace"},{"desc":"延时","type":"int?","name":"delay"}],"name":"CreateBullet"},{"desc":"战士被动","args":[{"desc":"间隔","type":"int","name":"lock"},{"desc":"排除技能id","type":"int?","name":"ex1"},{"desc":"排除技能id","type":"int?","name":"ex2"},{"desc":"排除技能id","type":"int?","name":"ex3"},{"desc":"排除技能id","type":"int?","name":"ex4"},{"desc":"排除技能id","type":"int?","name":"ex5"}],"name":"Passive1010100"},{"desc":"侦听复活","doc":"+ 第一次执行返回成功,之后执行返回失败\n","name":"ListenRealive"},{"desc":"获取单位属性","input":["{单位}"],"doc":"+ 属性名称,英文小写\n","args":[{"desc":"属性名称","type":"string","name":"key"}],"output":["{属性值}"],"name":"GetAttr"},{"desc":"是否可释放普通攻击","doc":"+ 判定该单位所携带的所有普攻技能是否可释放\n+ 失败条件跟CanLaunch相同\n","name":"CanNormalAttack"},{"desc":"设置变量","input":["变量"],"args":[{"desc":"值","type":"lua?","name":"value"}],"name":"SetValue"},{"desc":"随机执行","args":[{"desc":"权重1","type":"int?","name":"w1"},{"desc":"权重2","type":"int?","name":"w2"},{"desc":"权重3","type":"int?","name":"w3"},{"desc":"权重4","type":"int?","name":"w4"},{"desc":"权重5","type":"int?","name":"w5"},{"desc":"权重6","type":"int?","name":"w6"},{"desc":"权重7","type":"int?","name":"w7"},{"desc":"权重8","type":"int?","name":"w8"},{"desc":"权重9","type":"int?","name":"w9"},{"desc":"权重10","type":"int?","name":"w10"}],"doc":"\n","name":"RandomExec"},{"input":["数组1","数组2","数组3","数组4"],"doc":"+ 拼接会去除重复项\n+ 不同类别数组可拼接,后果自负\n","output":["[数组]"],"name":"MergeList"},{"desc":"否为为斜坡(以单位为中心点)","input":["单位"],"doc":"+ 相对面向,x,y偏移按自己面向控制\n","args":[{"desc":"x","type":"lua","name":"x"},{"desc":"y","type":"lua","name":"y"},{"desc":"相对面向","type":"boolean?","name":"face"}],"name":"IsSlant"},{"desc":"强制位移","input":["{单位}"],"doc":"+ 跟主动位移区分,会受到霸体影响,且会触发临击稳如泰山属性\n+ 边界限制后不会掉落平台,前提是无y轴位移\n+ 不选择以自身为方向时,正为右,负为左\n","args":[{"desc":"x","type":"int","name":"x"},{"desc":"y","type":"int","name":"y"},{"desc":"时间(帧)","type":"int","name":"time"},{"desc":"以自己的方向为基准","type":"boolean?","name":"myface"},{"desc":"相对方向","type":"boolean?","name":"relatively"},{"desc":"边界限制","type":"boolean?","name":"border"}],"output":["实际位移距离(int)"],"name":"ForceShift"},{"desc":"改变子弹轨迹","args":[{"desc":"x初速度","type":"int?","name":"vx"},{"desc":"y初速度","type":"int?","name":"vy"},{"desc":"x加速度","type":"int?","name":"ax"},{"desc":"y加速度","type":"int?","name":"ay"},{"desc":"地形检测","type":"boolean?","name":"terrain"}],"doc":"+ 子弹轨迹在前端与后端中存在偏差,不要做过于浮夸的轨迹与碰撞\n+ 子弹专用,其他地方返回失败\n","name":"ChangeBulletPath"},{"desc":"并行执行","doc":"执行所有子节点并返回成功\n","name":"Parallel"},{"desc":"跳跃","input":["{目标\/默认自己}"],"args":[{"desc":"纵向初速度","type":"int","name":"vspeed"},{"desc":"横向初速度","type":"int","name":"hspeed"},{"desc":"时间","type":"int?","name":"time"},{"desc":"是否忽略重力","type":"boolean?","name":"no_gravity"}],"name":"Jump"},{"desc":"寻路","input":["{目标单位}"],"doc":"+ 填写终点自动返回路点(移动路径),需要使用movePath进行移动\n+ 没有找到路径则返回失败\n","args":[{"desc":"终点坐标x","type":"int?","name":"x"},{"desc":"终点坐标y","type":"int?","name":"y"},{"desc":"只能移动","type":"boolean?","name":"only_move"}],"output":["[路点]"],"name":"FindPath"},{"desc":"怪物巡逻","args":[{"desc":"随机范围","type":"int?","name":"rand"}],"doc":"+ 在平台上进行monster表中的巡逻范围(半径)\n","name":"MonsterPatrol"},{"desc":"获取单位当前怒气","input":["单位"],"doc":"+ 必定返回成功\n","output":["怒气"],"name":"GetAp"},{"desc":"比较值大小","input":["值(int)"],"doc":"+ 若值为空,返回失败\n+ 非整数类型可能会报错\n","args":[{"desc":"值","type":"lua?","name":"value"},{"desc":">","type":"int?","name":"gt"},{"desc":">=","type":"int?","name":"ge"},{"desc":"==","type":"int?","name":"eq"},{"desc":"<=","type":"int?","name":"le"},{"desc":"<","type":"int?","name":"lt"}],"name":"Cmp"},{"desc":"获取Ai行为树变量","input":["{单位}"],"doc":"+ 如果所输入单位无AI,返回失败\n+ 不传目标默认自己\n+ 原行为树中的值修改不会影响拷贝过来的值\n+ 若那边值不存在,这边得到的输出值为空,并不会返回失败\n","args":[{"desc":"变量1名称","type":"string?","name":"key1"},{"desc":"变量2名称","type":"string?","name":"key2"},{"desc":"变量3名称","type":"string?","name":"key3"},{"desc":"变量4名称","type":"string?","name":"key4"},{"desc":"变量5名称","type":"string?","name":"key5"}],"output":["{变量1}","{变量2}","{变量3}","{变量4}","{变量5}"],"name":"GetAiVars"},{"desc":"获取buff层数","output":["层数(int)"],"args":[{"desc":"首层id","type":"int?","name":"buffid"}],"doc":"+ 必须为首层ID\n+ 当同ID的BUFF同时存在不止一个时,按最大层数的BUFF的结果\n","name":"GetBuffStack"},{"desc":"获取释放者","output":["{单位}"],"name":"GetLauncher"},{"desc":"寻路移动","input":["[路点]"],"doc":"+ 根据路点依次进行移动\n+ 路点少于两个返回失败\n+ 无法移动返回失败\n+ 每达到一个目的地移除一个路点\n+ 不会返回正在运行状态\n","name":"MovePath"},{"desc":"普通攻击","input":["{目标}"],"doc":"+ 默认使用所携带技能中的普攻\n+ 有两个时会出问题,会根据怪物攻击范围做一次是否能打到人的判定\n","args":[{"desc":"转向","type":"boolean?","name":"face"}],"name":"NormalAttack"},{"desc":"获取单位等级","input":["单位"],"doc":"+ 必定返回成功\n","output":["等级"],"name":"GetLv"},{"desc":"解除锁定行为(无效)","args":[{"desc":"重力","type":"boolean?","name":"gravity"},{"desc":"移动","type":"boolean?","name":"move"},{"desc":"跳跃","type":"boolean?","name":"jump"},{"desc":"转向","type":"boolean?","name":"face"},{"desc":"普攻","type":"boolean?","name":"skill1"},{"desc":"自动技能","type":"boolean?","name":"skill2"},{"desc":"主动技能","type":"boolean?","name":"skill3"},{"desc":"二段跳","type":"boolean?","name":"skill4"},{"desc":"霸体","type":"boolean?","name":"super_armor"},{"desc":"选中","type":"boolean?","name":"select"},{"desc":"回怒","type":"boolean?","name":"ap"}],"name":"UnlockAction"},{"desc":"净化buff","input":["{目标(默认自己)}"],"doc":"+ 净化成功与否收到净化几率属性影响\n","name":"PurgeBuff"},{"desc":"计算距离","input":["{起始单位}?","{目标单位}"],"doc":"+ 计算两个单位的距离\n+ 目标为空返回失败\n","output":["距离(int)"],"name":"Distance"},{"desc":"设置状态(单选)","input":["{对象}(默认自己)"],"doc":"+ BOSS专用\n","args":[{"desc":"持续时间","type":"lua?","name":"time"},{"desc":"虚弱","type":"boolean?","name":"WEAK"}],"name":"SetState"},{"desc":"打印日志","args":[{"desc":"值","type":"lua?","name":"value"}],"doc":"+ 测试用,可打印任意变量或值\n","name":"Trace"},{"desc":"测试伤害次数","doc":"+ 统计本单位的所以技能的伤害次数(该单位的任意行为树中)\n","name":"DebugHitCount"},{"desc":"选择执行","doc":"+ 一直往下执行,有子节点返回成功则返回成功,若全部节点返回失败则返回失败\n+ 子节点是或的关系\n","name":"Selector"},{"desc":"移动到攻击位置","input":["{目标}"],"doc":"+ 偏移量务必保证少于所拥有技能的攻击范围\n","args":[{"desc":"偏移量","type":"int?","name":"offset"},{"desc":"考虑碰撞体积","type":"boolean?","name":"collision"}],"name":"MoveToAtkPos"},{"desc":"侦听使用物品","input":["物品id"],"doc":"+ 第一次执行返回成功,之后执行返回失败\n","name":"ListenUseItem"},{"desc":"侦听击杀","doc":"+ 第一次执行返回成功,之后执行返回失败\n","name":"ListenDie"},{"desc":"获取统计数据","input":["{单位}"],"doc":"+ 非主角返回失败\n","output":["同时击杀","连杀"],"name":"GetStat"},{"desc":"改变技能cd","args":[{"desc":"skillid","type":"int","name":"skillid"},{"desc":"千分比","type":"lua?","name":"percent"},{"desc":"固定值","type":"lua?","name":"add"}],"doc":"+ 没有携带技能返回失败,cd最低为0\n+ 不会影响当前已经进入的冷却时间\n","name":"ChangeSkillCd"},{"desc":"子弹跟随","input":["{跟随目标}"],"doc":"+ 不能在跟随过程做碰撞检测\n+ 后端为时间到时瞬移至跟随目标(本质上无实际无移动过程)【无延迟情况下强制抵达】\n+ 跟随过程返回正在运行,到达后返回成功,无目标返回失败\n","args":[{"desc":"时间","type":"int","name":"time"},{"desc":"x初速度","type":"int?","name":"vx"},{"desc":"y初速度","type":"int?","name":"vy"}],"name":"BulletFollow"},{"desc":"获取符文词条属性","output":["(int)"],"args":[{"desc":"词条id","type":"int","name":"entryid"}],"doc":"+ 没有词条返回失败\n","name":"GetRuneEntry"},{"desc":"设置战斗状态","args":[{"desc":"状态","type":"string","name":"state"},{"desc":"持续时间","type":"lua?","name":"time"}],"name":"SetFightState"},{"desc":"比较属性值","input":["{对象}"],"doc":"+ 属性值使用attr表中小写英文字段\n+ 也可获取hp、ap\n","args":[{"desc":"字段","type":"string","name":"key"},{"desc":">","type":"int?","name":"gt"},{"desc":">=","type":"int?","name":"ge"},{"desc":"==","type":"int?","name":"eq"},{"desc":"<=","type":"int?","name":"le"},{"desc":"<","type":"int?","name":"lt"}],"name":"CmpAttr"},{"desc":"获取图腾精练等级","output":["图腾id","精练等级(int)"],"args":[{"desc":"部位","type":"int","name":"part"}],"name":"GetTotemRefine"},{"desc":"获取配置","output":["{值}"],"args":[{"desc":"表名","type":"string","name":"name"},{"desc":"索引","type":"lua","name":"id"},{"desc":"字段","type":"string","name":"key"}],"doc":"+ 慎重使用\n+ 可获取任意表中的字段\n+ 填错可能会报错\n","name":"GetConf"},{"desc":"子弹销毁","doc":"+ 子弹专用,非子弹返回失败\n","name":"BulletDie"},{"desc":"数组随机取一值","input":["[数组]"],"doc":"+ 输入数组为空,输出变量为空\n","output":["{随机值}"],"name":"ArrayRandomOne"},{"desc":"取数组的一个元素","input":["数组"],"doc":"+ 若数组为空,返回失败\n+ 索引超出数组大小,输出空值\n","args":[{"desc":"索引(从1开始)","type":"int","name":"index"}],"output":["值"],"name":"GetArrayItem"},{"desc":"获取当前时间帧","output":["帧(int)"],"doc":"+ 返回一个服务器启动至今的一个时间,用于相减\n","name":"GetCurFrame"},{"desc":"修改技能行为树变量","args":[{"desc":"技能id","type":"int","name":"skillid"}],"doc":"+ 即将废弃\n","name":"ChangeSkillVars"},{"desc":"修改AI行为树变量","input":["{目标}"],"doc":"+ 改变指定单位的AI行为树的变量,无目标时返回失败\n+ 变量是即时修改,若选择立即执行则强制该行为树再次执行(需要处理重复执行问题)\n","args":[{"desc":"立即执行","type":"boolean?","name":"now"}],"name":"ChangeAiVars"},{"desc":"恢复血量(默认恢复至max)","input":["{目标}"],"doc":"+ 秘密回血不会触发飘字,血条会变\n","args":[{"desc":"千分比","type":"lua?","name":"percent"},{"desc":"固定值","type":"lua?","name":"add"},{"desc":"秘密回血(不通知客户端)","type":"boolean?","name":"secret"}],"name":"RecoverHp"},{"desc":"瞬移","input":["作用单位"],"doc":"+ 进行相对坐标瞬移\n","args":[{"desc":"x偏移","type":"int","name":"x"},{"desc":"y偏移","type":"int","name":"y"}],"name":"Teleport"},{"desc":"主动位移","input":["{单位}"],"doc":"+ 主动位移不受霸体影响,不会触发临击稳如泰山,过程霸体\n","args":[{"desc":"x","type":"int","name":"x"},{"desc":"y","type":"int","name":"y"},{"desc":"时间(帧)","type":"int","name":"time"},{"desc":"以自己的方向为基准","type":"boolean?","name":"myface"},{"desc":"相对方向","type":"boolean?","name":"relatively"},{"desc":"边界限制","type":"boolean?","name":"border"}],"output":["实际位移距离(int)"],"name":"Shift"},{"desc":"随机执行","args":[{"desc":"概率(千分比)","type":"lua","name":"prob"}],"doc":"+ 并行执行所有子节点\n+ 随机失败时返回失败,否则必定返回成功\n","name":"ProbExec"},{"desc":"获取主角名字","input":["{对象}"],"doc":"+ 主角为空,返回失败\n","output":["名字(string)"],"name":"GetRoleName"},{"desc":"检查True或False","args":[{"desc":"值","type":"lua?","name":"value"}],"doc":"+ 做简单数值公式判定,返回成功或失败\n","name":"Check"},{"desc":"获取当前最高输出玩家单位","output":["{单位}"],"doc":"+ 若全相等随便返回一个\n","name":"GetHighestHurtRole"},{"desc":"图腾之力属性","output":["值(int)"],"args":[{"desc":"部位","type":"int","name":"part"},{"desc":"属性(1,2,3)","type":"int","name":"idx"}],"doc":"+ 没有携带图腾返回默认值\n","name":"GetTotemRefineAttr"},{"desc":"移除buff","args":[{"desc":"buffid","type":"int?","name":"buffid"},{"desc":"分类","type":"int?","name":"type"},{"desc":"层数","type":"int","name":"stack"}],"doc":"+ 强制移除BUFF,不受任何影响,用于逻辑处理\n","name":"RemoveBuff"},{"desc":"打断并设置新状态","input":["{目标}"],"doc":"+ 没有目标、怪物不可控、霸体返回失败\n+ 打断对方所有正在运行技能,会打断行为树中的LockAction(会打断被动、不会打断AI)\n+ 禁止移动(lockAction)被打断会进入待机状态\n","args":[{"desc":"时间(帧)","type":"lua?","name":"time"},{"desc":"禁止重力","type":"boolean?","name":"gravity"},{"desc":"禁止移动","type":"boolean?","name":"move"},{"desc":"禁止跳跃","type":"boolean?","name":"jump"},{"desc":"禁止转向","type":"boolean?","name":"face"},{"desc":"禁止普攻","type":"boolean?","name":"skill1"},{"desc":"禁止自动技能","type":"boolean?","name":"skill2"},{"desc":"禁止主动技能","type":"boolean?","name":"skill3"},{"desc":"禁止二段跳","type":"boolean?","name":"skill4"},{"desc":"无法回怒","type":"boolean?","name":"ap"}],"name":"Break"},{"desc":"获取战斗状态时长(只能选一种状态)","output":["时间"],"args":[{"desc":"禁止重力","type":"boolean?","name":"gravity"},{"desc":"禁止移动","type":"boolean?","name":"move"},{"desc":"禁止跳跃","type":"boolean?","name":"jump"},{"desc":"禁止转向","type":"boolean?","name":"face"},{"desc":"禁止普攻","type":"boolean?","name":"skill1"},{"desc":"禁止瞬发","type":"boolean?","name":"skill2"},{"desc":"禁止吟唱","type":"boolean?","name":"skill3"},{"desc":"禁止蓄力","type":"boolean?","name":"skill4"},{"desc":"霸体","type":"boolean?","name":"super_armor"},{"desc":"无法被选中","type":"boolean?","name":"select"},{"desc":"无法回怒","type":"boolean?","name":"ap"}],"doc":"+ 测试用\n","name":"GetFightState"},{"desc":"不处于移动中","name":"NotMoving"},{"desc":"拉取到自己","input":["[{被拉单位}]"],"doc":"+ 本质上是瞬移,过程不可见\n","args":[{"desc":"时间\/帧","type":"int?","name":"time"}],"name":"PullToSelf"},{"desc":"根据id查找怪物","output":["[{怪物(数组)}]"],"args":[{"desc":"怪物id","type":"int","name":"monsterid"}],"doc":"+ 获取地图中特定ID的怪物\n+ 没有的话也会返回成功\n","name":"FindMonstersById"},{"desc":"获取单位所有技能id","input":["单位"],"doc":"+ 测试用\n","output":["技能id列表"],"name":"GetSkillIds"},{"input":["{目标}"],"doc":"+ 客户端专用\n","args":[{"desc":"随机范围","type":"int?","name":"rand"},{"desc":"忽略碰撞体积","type":"boolean?","name":"no_collision"}],"name":"MoveToTarget"},{"input":["{目标}"],"doc":"+ 移动到设定目标的一个随机距离位置(该位置在第一次执行时随机,之后固定)\n+ 没有目标时返回失败\n+ 需要跟找本平台敌人节点配合\n","args":[{"desc":"随机范围","type":"int?","name":"rand"}],"name":"FloorMove"},{"desc":"设置路点","input":["[路点]"],"doc":"+ 路点进行角度偏移\n+ 以原点坐标(0,0)进行旋转,逆时针\n","args":[{"desc":"角度","type":"int","name":"angle"}],"name":"RotatePath"},{"desc":"设置路点","output":["[数组]"],"args":[{"desc":"x1","type":"int?","name":"x1"},{"desc":"y1","type":"int?","name":"y1"},{"desc":"x2","type":"int?","name":"x2"},{"desc":"y2","type":"int?","name":"y2"},{"desc":"x3","type":"int?","name":"x3"},{"desc":"y3","type":"int?","name":"y3"}],"doc":"+ 贝塞尔曲线专用贝塞尔曲线专用\n","name":"SetPath"},{"desc":"跟随","input":["{单位}","{跟随目标}"],"doc":"+ 跟随过程中无法被选中XXXXX,本质上为瞬移\n+ 后端为时间到时瞬移至跟随目标(本质上无实际无移动过程)【无延迟情况下强制抵达】\n+ 跟随过程返回正在运行,到达后返回成功,无目标返回失败\n","args":[{"desc":"时间","type":"int","name":"time"},{"desc":"x初速度","type":"int?","name":"vx"},{"desc":"y初速度","type":"int?","name":"vy"}],"name":"Follow"},{"desc":"侦听被攻击","input":["{伤害来源}","伤害值int"],"doc":"+ 第一次执行返回成功,之后执行返回失败\n","args":[{"desc":"排除技能id","type":"int?","name":"exclude"},{"desc":"包含无敌单位","type":"boolean?","name":"no_select"}],"name":"ListenUnderAttack"},{"desc":"造成伤害","input":["{目标}"],"doc":"+ 在伤害公式表可见详细流程\n+ 目标为空返回失败\n","args":[{"desc":"次数","type":"int?","name":"count"},{"desc":"最终伤害加成(千分比)","type":"lua?","name":"add"},{"desc":"吸血(千分比)","type":"lua?","name":"recover"},{"desc":"技能伤害千分比","type":"lua?","name":"dmg_var"},{"desc":"技能固定伤害","type":"lua?","name":"dmg_const"},{"desc":"伤害衰减","type":"lua?","name":"attenuate"},{"desc":"不播受击","type":"boolean?","name":"no_hit_action"}],"name":"Hurt"},{"input":["{单位}?","{坐标}"],"doc":"+ 根据地图位置瞬移\n","args":[{"desc":"x","type":"int?","name":"x"},{"desc":"y","type":"int?","name":"y"}],"name":"SetPos"},{"desc":"数组是否为空","output":["[数组]"],"name":"IsEmpty"},{"desc":"创建召唤物","input":["{相对目标}"],"doc":"+ 与主角同向,会调整召唤物的初始朝向\n","args":[{"desc":"召唤物id","type":"int","name":"id"},{"desc":"x偏移量","type":"lua?","name":"x"},{"desc":"y偏移量","type":"lua?","name":"y"},{"desc":"无法被命中","type":"boolean?","name":"no_select"},{"desc":"与主角同向","type":"boolean?","name":"same_face"},{"desc":"持续时间","type":"lua?","name":"time"},{"desc":"与主同死","type":"boolean?","name":"die_together"}],"output":["{召唤物}"],"name":"CreateSummon"},{"desc":"待机","input":["{单位}"],"name":"Idle"},{"desc":"获取技能等级","output":["等级(int)"],"args":[{"desc":"skillid","type":"int","name":"skillid"}],"doc":"+ 没携带技能返回失败\n","name":"GetSkillLevel"},{"desc":"获取单位坐标","input":["{单位}"],"doc":"+ 返回的坐标为地图绝对坐标\n+ 单位为空返回失败\n","output":["{坐标}"],"name":"GetAvatarPos"},{"desc":"否为悬空","input":["{对象}"],"doc":"+ 不在地面上全当浮空\n","name":"IsInSky"}] \ No newline at end of file