PassiveSkillTreeJS 是暴露给脚本的运行时入口。
公开入口方法:
PassiveSkillTreeJS.player(player)PassiveSkillTreeJS.skill(id)PassiveSkillTreeJS.tree(id)PassiveSkillTreeJS.item(stack)
Player View
PassiveSkillTreeJS.player(player) 会返回 PSTPlayerView;如果玩家没有 PST capability,就返回 null。
PSTPlayerView 常用方法:
skillPoints()treeReset()grantSkillPoints(amount)consumeSkillPoints(amount)hasSkill(id)learn(id)learnWithoutSkillPointCost(id)learnWithSkillPointCost(id, cost)remove(id)reset()learnedSkillIds()learnedSkills()learnedSkill(id)hasLearnedInTree(id)learnedSkillsInTree(id)skill(id)
skill(id) 会返回一个绑定玩家状态的 PSTPlayerSkillView。
玩家绑定的 Skill View
PSTPlayerSkillView 适合处理“这个玩家当前是否学会、现在能不能学”这类问题。
常用方法:
learned()canLearn()learn()remove()requirements()bonuses()listeners()
每个 requirement、bonus 和 listener view 都会暴露:
typeId()text()node()
只有当对象背后是 PassiveSTJS 运行时 serializer 类型时,node() 才会存在。
只读的 Skill 与 Tree View
PassiveSkillTreeJS.skill(id) 会返回只读的 PSTSkillView。
常用 PSTSkillView 方法:
id()title()titleColor()positionX()positionY()tags()directConnections()bonusCount()requirementCount()
PassiveSkillTreeJS.tree(id) 会返回只读的 PSTTreeView。
常用 PSTTreeView 方法:
id()skillIds()limits()hasSkill(id)skill(id)skills()isDefaultTree()
Item Bonus Runtime View
PassiveSkillTreeJS.item(stack) 会返回 PSTItemView。
常用方法:
bonusCount()bonuses()clearBonuses()addItemBonus(typeId, consumer)addItemBonus(builder)addSkillBonusItemBonus(typeId, consumer)addAttributeItemBonus(consumer)addItemBonusList(consumer)
每个 PSTItemBonusView 都会暴露:
typeId()text()node()
最小模式
读取玩家状态:
var playerView = PassiveSkillTreeJS.player(event.player)if (playerView && playerView.hasSkill('kubejs:sample_runtime_tree/water_pulse')) {playerView.grantSkillPoints(1)}
检查玩家绑定 skill 的 requirement 与 listener:
var skillView = playerView ? playerView.skill('kubejs:passivestjs/runtime_threshold') : nullif (skillView && !skillView.learned()) {for (var requirement of skillView.requirements()) {console.log(requirement.typeId(), requirement.passed())}}
直接把 item bonus 加到活体 ItemStack:
var stackView = PassiveSkillTreeJS.item(event.item)if (stackView && stackView.bonusCount() === 0) {stackView.addAttributeItemBonus(bonus => {bonus.attribute('minecraft:generic.armor')bonus.amount(2)bonus.operation(0)bonus.modifierId('8516d3f4-373e-42c3-9138-3215993b34c4')bonus.bonusName('passivestjs.sample')})}
这些模式都在仓库里的样例文件中有对应写法:
examples/kubejs/passivestjs/03_server_runtime_api.jsexamples/kubejs/passivestjs/07_server_runtime_helper_samples.jsexamples/kubejs/passivestjs/09_server_item_bonus_runtime_api.js
最容易混淆的是两种 skill view:
PassiveSkillTreeJS.skill(id)只看技能定义,不绑定玩家PassiveSkillTreeJS.player(player).skill(id)绑定玩家,可以判断learned()、canLearn(),并读取requirements()、bonuses()、listeners()
如果你的逻辑是“这个玩家现在能不能点这个技能”,就应该走第二种。