← Назад к ресурсам

MerchantJS

This mod is an addon for KubeJS, expanding its functionality in the trading system.

Modrinth economy utility

Описание

## MerchantJS This mod is an addon for **KubeJS**, expanding its functionality in the **trading system**. ### Create Custom Trades Anywhere This mod allows you to initiate trades *anywhere* — trade with pigs, with End Stone, with Enchanted Golden Apples, or even out of thin air! ```javascript // server_scripts ItemEvents.entityInteracted(event => { // Check if the interacted entity is a pig if (event.getTarget().type === "minecraft:pig") { // Create a complete trade offer 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 }); // Create a simple trade offer let offer1 = MerchantJSUtils.createMerchantOffer({ buy: Item.of("minecraft:beef").toNBT(), sell: Item.of("minecraft:egg").toNBT() }); // Open a custom trading GUI with the given player, title, and offers MerchantJSUtils.openMerchant( event.player, Component.translatable("Little Piggy’s Cartoon House"), [offer0, offer1] ); } }); ``` The above example lets players **trade with pigs**, with a fully customizable trading GUI! And if you need deeper customization — read on. --- ### Selective Trade Availability Let’s first explain the meaning of each parameter: ```javascript let offer0 = MerchantJSUtils.createMerchantOffer({ buy: Item.of("minecraft:potato").toNBT(), // Input item A (required) buyB: Item.of("minecraft:bread").toNBT(), // Input item B (optional, defaults to empty) sell: Item.of("minecraft:stone").toNBT(), // Output item (required) uses: 0, // Number of times used (optional, default 0) maxUses: 50, // Maximum uses (optional, default 99) xp: 5, // Experience reward (optional, default 0) priceMultiplier: 0, // Price fluctuation multiplier (optional, default 0) demand: 0 // Initial demand value (optional, default 0) }); ``` Setting `maxUses` to `0` will make the trade appear **unavailable**. Now combine it with this event for dynamic trade control: ```javascript // client_scripts MerchantEvents.switchTrade(event => { if (event.titleKey == "Little Piggy’s Cartoon House") { // Check if it’s the pig’s trading window (works with vanilla ones too!) if (event.getOffer().getMaxUses() == 0) { Client.player.tell("This trade is locked..."); } } }); ``` With this, you can **selectively enable or disable trades**, which is perfect for stage-based gameplay or progression systems. --- ### Vanilla Trade Compatibility Vanilla trading already has many mechanics. MerchantJS mainly focuses on **creating additional trades easily**. For features like restocking, experience, demand, or price fluctuation — you’ll need to handle those yourself. At minimum, you’ll need a place to store trade-related data (like inventory or stock info), since each call to `openMerchant` defines the offers anew. Fortunately, **KubeJS’s `persistentData`** works great for this. Then, all that’s left is triggering data refresh when needed. ```javascript // server_scripts MerchantEvents.afterTrade(event => { event.player.tell(`Thank you for purchasing ${event.getOffer().result.id}! Come again soon!`); event.player.addXP(event.getOffer().xp); }); ``` This event fires after any trade occurs — and works for vanilla trades too! If you want to trigger additional actions after trading, this is the place to do it. As for restocking — just check the time interval whenever you open the trade window. --- ### Future Plans None for now — but feel free to make a wish!