PassiveSkillTreeJS is the runtime entry point exposed to scripts.
Public entry methods:
PassiveSkillTreeJS.player(player)PassiveSkillTreeJS.skill(id)PassiveSkillTreeJS.tree(id)PassiveSkillTreeJS.item(stack)
Player View
PassiveSkillTreeJS.player(player) returns PSTPlayerView or null when the player has no PST capability.
Important methods on 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) returns a player-bound PSTPlayerSkillView.
Player-Bound Skill View
PSTPlayerSkillView is useful when you care about the current player's learned state.
Important methods:
learned()canLearn()learn()remove()requirements()bonuses()listeners()
Each requirement, bonus, and listener view exposes:
typeId()text()node()
node() is only present when the object is serializer-backed by PassiveSTJS runtime types.
Read-Only Skill And Tree Views
PassiveSkillTreeJS.skill(id) returns a read-only PSTSkillView.
Useful PSTSkillView methods:
id()title()titleColor()positionX()positionY()tags()directConnections()bonusCount()requirementCount()
PassiveSkillTreeJS.tree(id) returns a read-only PSTTreeView.
Useful PSTTreeView methods:
id()skillIds()limits()hasSkill(id)skill(id)skills()isDefaultTree()
Item Bonus Runtime View
PassiveSkillTreeJS.item(stack) returns PSTItemView.
Important methods:
bonusCount()bonuses()clearBonuses()addItemBonus(typeId, consumer)addItemBonus(builder)addSkillBonusItemBonus(typeId, consumer)addAttributeItemBonus(consumer)addItemBonusList(consumer)
Each PSTItemBonusView exposes:
typeId()text()node()
Minimal Patterns
Read player state:
var playerView = PassiveSkillTreeJS.player(event.player)if (playerView && playerView.hasSkill('kubejs:sample_runtime_tree/water_pulse')) {playerView.grantSkillPoints(1)}
Inspect player-bound requirements and listeners:
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())}}
Append item bonuses directly to a live stack:
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')})}
These patterns are all shown in the checked-in example files:
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