MerchantJS

MerchantJS

这个模组是KubeJS的附属,扩展了其在交易系统中的功能。

经济

MerchantJS

这个模组是 KubeJS 的一个附属模组,扩展了其在交易系统中的功能。

随时随地创建自定义交易

该模组允许你在任何地方发起交易——与猪交易、用末地石交易、用附魔金苹果交易,甚至凭空交易!

// server_scripts
ItemEvents.entityInteracted(event => {
    // 检查交互的实体是否为猪
    if (event.getTarget().type === "minecraft:pig") {
        // 创建一个完整的交易选项
        let offer0 = MerchantJSUtils.createMerchantOffer({
            buy: Item.of("minecraft:potato").toNBT(),
            buyB: Item.of("minecraft:bread").toNBT(),
            sell: Item.of("minecraft:stone").toNBT(),
            uses: 0,
            maxUses: 50,
            xp: 5,
            priceMultiplier: 0,
            demand: 0
        });
        // 创建一个简单的交易选项
        let offer1 = MerchantJSUtils.createMerchantOffer({
            buy: Item.of("minecraft:beef").toNBT(),
            sell: Item.of("minecraft:egg").toNBT()
        });
        // 使用指定的玩家、标题和交易选项打开自定义交易界面
        MerchantJSUtils.openMerchant(
            event.player,
            Component.translatable("小猪的卡通屋"),
            [offer0, offer1]
        );
    }
});

上面的示例让玩家可以与猪交易,并且交易界面是完全可自定义的!

如果你需要更深度的自定义——请继续阅读。


选择性交易开关

首先来解释每个参数的含义:

let offer0 = MerchantJSUtils.createMerchantOffer({
    buy: Item.of("minecraft:potato").toNBT(), // 输入物品A(必填)
    buyB: Item.of("minecraft:bread").toNBT(), // 输入物品B(可选,默认为空)
    sell: Item.of("minecraft:stone").toNBT(), // 输出物品(必填)
    uses: 0, // 已使用次数(可选,默认为0)
    maxUses: 50, // 最大使用次数(可选,默认为99)
    xp: 5, // 经验奖励(可选,默认为0)
    priceMultiplier: 0, // 价格波动倍数(可选,默认为0)
    demand: 0 // 初始需求值(可选,默认为0)
});

将 maxUses 设置为 0 会使交易显示为不可用。

现在将这个事件与动态交易控制结合起来:

// client_scripts
MerchantEvents.switchTrade(event => {
    if (event.titleKey == "小猪的卡通屋") {
        // 检查是否为猪的交易窗口(也适用于原版交易!)
        if (event.getOffer().getMaxUses() == 0) {
            Client.player.tell("这笔交易已被锁定...");
        }
    }
});

这样你就可以有选择地启用或禁用交易,非常适合基于阶段或进度的游戏机制。


原版交易兼容性

原版交易已经有很多机制。 MerchantJS 主要专注于轻松创建额外的交易。 至于补货、经验、需求或价格波动等功能——你需要自行处理。

至少,你需要一个地方来存储与交易相关的数据(如库存或货物信息), 因为每次调用 openMerchant 都会重新定义交易选项。

幸运的是,KubeJS 的 persistentData 非常适合这个用途。 然后,剩下的就是在需要时触发数据刷新。

// server_scripts
MerchantEvents.afterTrade(event => {
    event.player.tell(`感谢购买 ${event.getOffer().result.id}!欢迎再次光临!`);
    event.player.addXP(event.getOffer().xp);
});

该事件在每次交易完成后触发——对原版交易同样有效! 如果你想在交易后触发额外操作,这里就是正确的位置。

至于补货——只需在打开交易界面时检查时间间隔即可。


未来计划

目前暂无计划——但欢迎提出建议!