18.2 罐头示例(包含物品注册, 配方添加, 玩家交互和persistentData的使用)
在这个例子中,我们将:
- 添加3个物品:密封的牛肉罐头,打开的牛肉罐头,罐头盒
- 添加配方:8个玻璃板合成3个罐头盒,罐头盒+两个牛肉无序合成密封的牛肉罐头
- 添加事件:当玩家手持密封的牛肉罐头长按右键时打开罐头
- 添加事件:当玩家吃完罐头后给予玩家一个空罐头盒
1、物品注册
kubejs\startup_scripts\item_registry.js
onEvent('item.registry', event => { // 监听物品注册事件
event.create('can_empty').displayName('空罐头盒').maxStackSize(32);// 最大堆叠数:32
event.create('can').displayName('密封的牛肉罐头').maxStackSize(8);// 最大堆叠数:8
event.create('can_open').displayName('打开的牛肉罐头').maxStackSize(1).food(food => {
food.hunger(18);// 设置食物信息
food.saturation(18);
});
})
2、配方修改
kubejs\server_scripts\recipe.js
onEvent('recipes', event => { // 监听配方事件
// 空罐头盒合成
event.shaped('8x kubejs:can_empty', [
'GGG',
'G G',
'GGG'
], {
G: 'minecraft:glass_pane'
})
// 罐头合成
event.shapeless('kubejs:can', ['kubejs:can_empty', '2x minecraft:cooked_beef'])
})
3、罐头事件系统
kubejs\server_scripts\can_events.js
onEvent("item.right_click", event => {// 监听物品右键事件
if(event.player.mainHandItem.id == "kubejs:can"){ // 判断物品是否为给定物品
if(event.player.persistentData.canholdtime / 10 >= 1){
// 当时间达到一定值时就执行物品交换
// 给予玩家空罐头盒
event.player.give("kubejs:can_open");
// 重置persistentData
event.player.persistentData.canholdtime = 0;
// 密封罐头数-1
event.item.count--;
}
// 若时间未达到一定值则自增1
event.player.persistentData.canholdtime++;
// 刷新罐头打开进度条
event.player.statusMessage = `罐头打开进度:${event.player.persistentData.canholdtime * 10}%`;
}
})
onEvent("player.logged_in", event =>{// 监听玩家登录事件
// 玩家加入世界时初始化 persistentData 否则其值将为NAN
event.player.persistentData.canholdtime = 0;
})
onEvent("item.food_eaten", event =>{// 监听吃食物事件
// 如果物品id为打开的罐头就给予玩家一个罐头盒
if(event.item.id == "kubejs:can_open"){
event.player.give("kubejs:can_empty")
}
})
4、修改展示
(图片较大,请耐心等待)