如何让玩家自动佩戴背包里的物品?-酷界

如何让玩家自动佩戴背包里的物品?

本教程适用于以下情景:

1. 找到一个诅咒饰品mod,但发现配置里没有开具强制佩戴的选项?
2. 每次重进游戏/reload发现饰品栏里的饰品总是在背包掉一地?
3. 想要强制玩家戴上你的整活自定义物品?

本人就是深受(2)的毒害,压力D老师一下午获得了焚诀

环境为Forge 1.20.1,更高版本的Neoforge可以参考这位大佬的教程获得思路

在使用脚本前请确保你已经安装了kubejs以及其前置mod
以来自月之石:有罪待偿的七宗罪为例,该饰品栏位为护符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// server_scripts/auto_equip_curio.js
 
console.info('七宗罪物品自动装备脚本已加载 (Forge 1.20.1 版)');
 
// 加载正确的 CuriosApi 类
const CuriosApi = Java.loadClass("top.theillusivec4.curios.api.CuriosApi");
 
// 辅助函数:将物品装备到玩家护符栏
function equipToCharm(player, targetItemId) {
    try {
        // 1. 获取玩家的饰品栏管理器 (返回 LazyOptional)
        let lazyCurios = CuriosApi.getCuriosInventory(player);
        if (!lazyCurios.isPresent()) {
            console.warn('玩家没有 Curios 饰品栏能力');
            return false;
        }
 
        // 2. 解包获取 ICuriosItemHandler 实例
        let curiosInventory = lazyCurios.orElse(null);
        if (!curiosInventory) return false;
 
        // 3. 在背包中查找目标物品
        let inventory = player.getInventory();
        let foundSlot = -1;
        let foundItem = null;
        for (let i = 0; i < inventory.getContainerSize(); i++) {
            let stack = inventory.getItem(i);
            if (!stack.isEmpty() && stack.getId() === targetItemId) {
                foundSlot = i;
                foundItem = stack;
                break;
            }
        }
        if (foundSlot === -1) {
            console.warn('背包中未找到目标物品');
            return false;
        }
 
        // 4. 获取护符栏 (charm) 的管理器 CurioStacksHandler
        let charmHandlerOpt = curiosInventory.getStacksHandler("charm");
        if (!charmHandlerOpt.isPresent()) {
            console.warn('玩家没有护符栏 (charm) 槽位');
            return false;
        }
        let charmHandler = charmHandlerOpt.get();
 
        // 5. 获取 IItemHandler 接口,用于物品操作
        let stacks = charmHandler.getStacks();
        if (!stacks) return false;
 
        // 6. 寻找空位并尝试插入物品
        let itemToEquip = foundItem.copy();
        let slotCount = stacks.getSlots();
        for (let i = 0; i < slotCount; i++) {
            if (stacks.getStackInSlot(i).isEmpty()) {
                let remaining = stacks.insertItem(i, itemToEquip, false);
                if (remaining.isEmpty()) {
                    foundItem.setCount(0);
                    console.info(`✓ 成功将物品放入护符栏,槽位: ${i}`);
                    return true;
                } else {
                    console.warn('插入失败,物品可能不兼容护符栏');
                    return false;
                }
            }
        }
 
        console.warn('护符栏已满,无可用空位');
        return false;
 
    } catch (error) {
        console.error('装备过程出错:', error);
        if (error.stack) console.error(error.stack);
        return false;
    }
}
 
// 监听玩家登录
PlayerEvents.loggedIn(event => {
    let player = event.player;
    let targetItemId = 'moonstoneoutstandingsins:seven_curse_item';
 
    event.server.scheduleInTicks(20, () => {
        let inventory = player.getInventory();
        for (let i = 0; i < inventory.getContainerSize(); i++) {
            let stack = inventory.getItem(i);
            if (!stack.isEmpty() && stack.getId() === targetItemId) {
                console.info('登录时检测到七宗罪物品,尝试自动装备...');
                equipToCharm(player, targetItemId);
                break;
            }
        }
    });
});
 
// 监听物品栏变化
PlayerEvents.inventoryChanged(event => {
    let player = event.player;
    let item = event.getItem();
    let targetItemId = 'moonstoneoutstandingsins:seven_curse_item';
 
    if (item.getId() !== targetItemId || item.isEmpty()) {
        return;
    }
 
    console.info('检测到七宗罪物品进入背包,准备自动装备...');
 
    event.server.scheduleInTicks(10, () => {
        equipToCharm(player, targetItemId);
    });
});

自己魔改则需要修改以下部分
1. 将下列代码里的物品ID换成你所想要修改的物品ID(需完整命名空间)

1
let targetItemId = 'moonstoneoutstandingsins:seven_curse_item';

2.将下列代码里的栏位ID替换成你所想要修改的栏位ID

1
let charmHandlerOpt = curiosInventory.getStacksHandler("charm");

那么,如何知道我这个栏位的ID是什么呢?

打开游戏,找到你的目标物品,输入指令/kubejs hand

1788693282_602895_KOmV

如何让玩家自动佩戴背包里的物品?-第1张图片(以维度意志为例)

可以看到
第一行Item.of里第一个值即为物品ID,curios:back即为饰品槽位ID(图中为背饰)
其余饰品按照这个方法即可

最后,希望这个教程可以帮到大家!本人kubejs小白,如有不足请多多包涵!

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容