Repository navigation
KubeJS Examples zh
hp-1e edited this page Oct 25, 2026
·
1 revision
English | 中文
服务端脚本放在 kubejs/server_scripts,客户端脚本放在 kubejs/client_scripts。下面的属性 ID 使用 1.20.1 / 1.21.1 的写法;26.1.2 上请去掉 generic. 前缀(例如 minecraft:max_health)。
SkillAtlasEvents.definitions(event => {
event.createPool('pack_farming')
.name('农耕扩展点数')
.acquisition('harvest', 16, 1, 0)
.targets(['#minecraft:crops'])
event.createCategory('pack_farming')
.name('农耕扩展')
.icon('minecraft:wheat')
.pool('pack_farming')
event.createNode('pack_harvest_health')
.name('耕作体魄')
.description('提高生命值上限。')
.category('pack_farming')
.icon('minecraft:golden_carrot')
.position(0, 0)
.level(1, rank => {
rank.cost({ type: 'skill_points', amount: 1 })
rank.attributeReward('minecraft:generic.max_health', 2, 'add')
})
})SkillAtlasEvents.definitions(event => {
event.createNode('pack_path_blade')
.name('利刃之路')
.category('pack_farming')
.position(-60, 80)
.requires('pack_harvest_health')
.choiceGroup('pack_path')
.level(1, rank => {
rank.cost({ type: 'skill_points', amount: 2 })
rank.attributeReward('minecraft:generic.attack_damage', 2, 'add')
})
event.createNode('pack_path_shield')
.name('坚盾之路')
.category('pack_farming')
.position(60, 80)
.requires('pack_harvest_health')
.choiceGroup('pack_path')
.level(1, rank => {
rank.cost({ type: 'skill_points', amount: 2 })
rank.attributeReward('minecraft:generic.armor', 4, 'add')
})
})学习其中一条路线后,另一条会被锁定,直到已学的那条被重置。
SkillAtlasEvents.beforeLearn('pack_harvest_health', event => {
if (String(event.player.level.dimension) === 'minecraft:the_nether') {
event.deny(Text.red('请离开下界后再学习'))
}
})
SkillAtlasEvents.pointsChanging('mining', event => {
if (event.source === 'acquire' && event.delta > 0) {
event.delta = event.delta * 2
}
})
SkillAtlasEvents.learned(event => {
event.player.tell(Text.gold('技能已提升至 ' + event.newLevel + ' 级'))
})SkillAtlasEvents.conditionTypes(event => {
event.register('pack:quest_gate', type => {
type.validate(data => typeof data.flag === 'string' && typeof data.label === 'string')
.test((ctx, data) => ctx.player.persistentData.getBoolean(data.flag))
.describe((ctx, data) => Text.gold(data.label))
})
})
SkillAtlasEvents.rewardTypes(event => {
event.register('pack:apple_gift', type => {
type.validate(data => data.count >= 1 && data.count <= 64 && data.count === Math.floor(data.count))
.describe((ctx, data) => Text.green('苹果 ×' + data.count))
.onLearn((ctx, data) => ctx.player.give(Item.of('minecraft:apple', data.count)))
})
})
SkillAtlasEvents.definitions(event => {
event.modifyNode('haste', node => {
node.condition('pack:quest_gate', { flag: 'intro_done', label: '完成入门任务' })
.level(1, rank => rank.customReward('pack:apple_gift', { count: 1 }))
})
})
SkillAtlasEvents.learningCost('haste', event => {
if (event.player.persistentData.getBoolean('discount')) {
event.amount = Math.floor(event.amount * 0.8)
}
event.items = [{ item: 'minecraft:emerald', count: 2 }]
})SkillAtlasEvents.acquisitionTypes(event => {
event.register('pack:machine', type => {
type.name('机器加工').description('完成指定机器加工获取技能点')
.unit('count')
.validate(data => typeof data.machine === 'string')
.test((ctx, data) => ctx.payload.machine === data.machine)
})
})
SkillAtlasEvents.definitions(event => {
event.createPool('machine').name('加工点数')
.customAcquisition('pack:machine', { machine: 'press' }, 8, 1, 20)
event.createCategory('industry').name('工业').pool('machine')
})
// 放进所接入模组真实的服务端行为事件回调:
// SkillAtlas.player(event.player).emitAcquisition('pack:machine', { machine: 'press' }, 1)
// 在整合包的重置流程中:
// SkillAtlas.player(event.player).resetAcquisition('machine')
// 在服务端任务奖励回调中:
// SkillAtlas.player(event.player).focus('haste')SkillAtlasClientEvents.tooltip('haste', event => {
event.add(Text.gold('任务提示:可先完成采矿入门'))
})
// 在任务书的客户端按钮回调中:
// SkillAtlasClient.open('mining')
// SkillAtlasClient.focus('haste')
// 外部界面需要完整技能提示时:
// const lines = SkillAtlasClient.tooltip('haste')KubeJS (English)
- Getting Started
- Events
- Server API
- Atlas Builder
- Custom Types and Costs
- Client API
- Reload and Editor
- Examples
KubeJS(中文)