Skip to content

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')

Clone this wiki locally