From b59270a90bad440809dbf7c8fc9ad5d0414363df Mon Sep 17 00:00:00 2001 From: HyperRaccoon13 Date: Fri, 11 Oct 2024 19:11:22 +0100 Subject: [PATCH 1/6] Villagers went brrrr Allows trades to be changed/replaced. Todo: Add the power to add new trades to villagers Maybe Todo: allow for trade removal --- kubejs/server_scripts/server.js | 64 +---------------- kubejs/server_scripts/villager.js | 110 ++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+), 63 deletions(-) create mode 100644 kubejs/server_scripts/villager.js diff --git a/kubejs/server_scripts/server.js b/kubejs/server_scripts/server.js index f9eddaf5d..0fe278189 100644 --- a/kubejs/server_scripts/server.js +++ b/kubejs/server_scripts/server.js @@ -1506,69 +1506,7 @@ onEvent("recipes", (event) => { event.stonecutting("4x createdeco:copper_sheet_metal", "minecraft:copper_block"); }); -onEvent("morejs.villager.trades", (event) => { - const vanillaTradesToRemove = [ - ["minecraft:armorer", 4], - ["minecraft:armorer", 5], - ["minecraft:toolsmith", 3], - ["minecraft:toolsmith", 4], - ["minecraft:toolsmith", 5], - ["minecraft:weaponsmith", 4], - ["minecraft:weaponsmith", 5], - ["minecraft:cleric", 5], - ]; - - const customTradesToAdd = [ - ["minecraft:armorer", 4, ["25x minecraft:emerald"], "createastral:sturdy_chestplate"], - ["minecraft:armorer", 4, ["20x minecraft:emerald"], "createastral:sturdy_leggings"], - ["minecraft:armorer", 5, ["20x minecraft:emerald"], "createastral:sturdy_helmet"], - ["minecraft:armorer", 5, ["27x minecraft:emerald"], "createastral:sturdy_chestplate"], - ["minecraft:armorer", 5, ["23x minecraft:emerald"], "createastral:sturdy_boots"], - ["minecraft:armorer", 2, ["18x minecraft:flint"], "createastral:andesite_compound"], - ["minecraft:toolsmith", 3, ["1x minecraft:gravel"], "minecraft:flint"], - ["minecraft:toolsmith", 3, ["4x minecraft:gold_ingot"], "create:wrench"], - ["minecraft:toolsmith", 3, ["8x minecraft:flint"], "create:shaft"], - ["minecraft:toolsmith", 4, ["12x minecraft:flint"], "minecraft:iron_pickaxe"], - ["minecraft:toolsmith", 4, ["10x minecraft:flint"], "minecraft:iron_shovel"], - ["minecraft:toolsmith", 2, ["18x minecraft:flint"], "createastral:andesite_compound"], - ["minecraft:toolsmith", 5, ["6x minecraft:emerald"], "createastral:bronze_sheet"], - ["minecraft:toolsmith", 5, ["12x minecraft:emerald"], "create:sturdy_sheet"], - ["minecraft:weaponsmith", 4, ["15x minecraft:flint"], "tconstruct:dagger"], - ["minecraft:weaponsmith", 4, ["16x minecraft:flint"], "tconstruct:sword"], - ["minecraft:weaponsmith", 5, ["17x minecraft:flint"], "tconstruct:hand_axe"], - ["minecraft:weaponsmith", 5, ["18x minecraft:flint"], "tconstruct:cleaver"], - ["minecraft:cleric", 5, ["20x ad_astra:moon_sand"], "kubejs:shimmer_bucket"], - ["techreborn:metallurgist", 1, ["10x minecraft:emerald"], "createastral:bronze_sheet"], - ["techreborn:metallurgist", 1, ["5x minecraft:gold_ingot"], "create:wrench"], - ["techreborn:metallurgist", 2, ["10x minecraft:emerald"], "create:cogwheel"], - ["techreborn:metallurgist", 3, ["7x minecraft:emerald"], "createastral:bronze_sheet"], - ["techreborn:metallurgist", 3, ["7x minecraft:emerald"], "create:iron_sheet"], - ["techreborn:metallurgist", 3, ["6x minecraft:emerald"], "create:copper_sheet"], - ["techreborn:metallurgist", 4, ["10x minecraft:emerald"], "create:minecart_coupling"], - ["techreborn:metallurgist", 4, ["9x minecraft:emerald"], "create:whisk"], - ["techreborn:metallurgist", 4, ["9x minecraft:emerald"], "create:sturdy_sheet"], - ["techreborn:metallurgist", 5, ["12x minecraft:emerald"], "create:propeller"], - ["techreborn:metallurgist", 5, ["14x minecraft:emerald"], "create:brass_hand"], - ["techreborn:electrician", 1, ["2x create:andesite_alloy"], "createaddition:copper_wire"], - ["techreborn:electrician", 2, ["3x minecraft:flint"], "minecraft:redstone"], - ["techreborn:electrician", 2, ["2x create:andesite_alloy"], "createaddition:gold_wire"], - ["techreborn:electrician", 3, ["6x minecraft:flint"], "minecraft:repeater"], - ["techreborn:electrician", 4, ["32x create:andesite_alloy"], "computercraft:computer_normal"], - ["techreborn:electrician", 4, ["5x create:andesite_alloy"], "computercraft:cable"], - ["techreborn:electrician", 5, ["10x create:andesite_alloy"], "minecraft:comparator"], - ["techreborn:electrician", 5, ["10x create:andesite_alloy"], "minecraft:observer"], - ]; - - vanillaTradesToRemove.forEach((trade) => { - event.removeVanillaTrades(trade[0], trade[1]); - }); - - event.removeModdedTrades(); - - customTradesToAdd.forEach((trade) => { - event.addTrade(trade[0], trade[1], trade[2], trade[3]); - }); -}); +//Moved to villager.js // Listen to server recipe event onEvent("recipes", (event) => { diff --git a/kubejs/server_scripts/villager.js b/kubejs/server_scripts/villager.js new file mode 100644 index 000000000..02100743d --- /dev/null +++ b/kubejs/server_scripts/villager.js @@ -0,0 +1,110 @@ + +//! Not used, just here for reference +const customTradesToAdd = [ + ["minecraft:armorer", 4, ["25x minecraft:emerald"], "createastral:sturdy_chestplate"], + ["minecraft:armorer", 4, ["20x minecraft:emerald"], "createastral:sturdy_leggings"], + ["minecraft:armorer", 5, ["20x minecraft:emerald"], "createastral:sturdy_helmet"], + ["minecraft:armorer", 5, ["27x minecraft:emerald"], "createastral:sturdy_chestplate"], + ["minecraft:armorer", 5, ["23x minecraft:emerald"], "createastral:sturdy_boots"], + ["minecraft:armorer", 2, ["18x minecraft:flint"], "createastral:andesite_compound"], + ["minecraft:toolsmith", 3, ["1x minecraft:gravel"], "minecraft:flint"], + ["minecraft:toolsmith", 3, ["4x minecraft:gold_ingot"], "create:wrench"], + ["minecraft:toolsmith", 3, ["8x minecraft:flint"], "create:shaft"], + ["minecraft:toolsmith", 4, ["12x minecraft:flint"], "minecraft:iron_pickaxe"], + ["minecraft:toolsmith", 4, ["10x minecraft:flint"], "minecraft:iron_shovel"], + ["minecraft:toolsmith", 2, ["18x minecraft:flint"], "createastral:andesite_compound"], + ["minecraft:toolsmith", 5, ["6x minecraft:emerald"], "createastral:bronze_sheet"], + ["minecraft:toolsmith", 5, ["12x minecraft:emerald"], "create:sturdy_sheet"], + ["minecraft:weaponsmith", 4, ["15x minecraft:flint"], "tconstruct:dagger"], + ["minecraft:weaponsmith", 4, ["16x minecraft:flint"], "tconstruct:sword"], + ["minecraft:weaponsmith", 5, ["17x minecraft:flint"], "tconstruct:hand_axe"], + ["minecraft:weaponsmith", 5, ["18x minecraft:flint"], "tconstruct:cleaver"], + ["minecraft:cleric", 5, ["20x ad_astra:moon_sand"], "kubejs:shimmer_bucket"], + ["techreborn:metallurgist", 1, ["10x minecraft:emerald"], "createastral:bronze_sheet"], + ["techreborn:metallurgist", 1, ["5x minecraft:gold_ingot"], "create:wrench"], + ["techreborn:metallurgist", 2, ["10x minecraft:emerald"], "create:cogwheel"], + ["techreborn:metallurgist", 3, ["7x minecraft:emerald"], "createastral:bronze_sheet"], + ["techreborn:metallurgist", 3, ["7x minecraft:emerald"], "create:iron_sheet"], + ["techreborn:metallurgist", 3, ["6x minecraft:emerald"], "create:copper_sheet"], + ["techreborn:metallurgist", 4, ["10x minecraft:emerald"], "create:minecart_coupling"], + ["techreborn:metallurgist", 4, ["9x minecraft:emerald"], "create:whisk"], + ["techreborn:metallurgist", 4, ["9x minecraft:emerald"], "create:sturdy_sheet"], + ["techreborn:metallurgist", 5, ["12x minecraft:emerald"], "create:propeller"], + ["techreborn:metallurgist", 5, ["14x minecraft:emerald"], "create:brass_hand"], + ["techreborn:electrician", 1, ["2x create:andesite_alloy"], "createaddition:copper_wire"], + ["techreborn:electrician", 2, ["3x minecraft:flint"], "minecraft:redstone"], + ["techreborn:electrician", 2, ["2x create:andesite_alloy"], "createaddition:gold_wire"], + ["techreborn:electrician", 3, ["6x minecraft:flint"], "minecraft:repeater"], + ["techreborn:electrician", 4, ["32x create:andesite_alloy"], "computercraft:computer_normal"], + ["techreborn:electrician", 4, ["5x create:andesite_alloy"], "computercraft:cable"], + ["techreborn:electrician", 5, ["10x create:andesite_alloy"], "minecraft:comparator"], + ["techreborn:electrician", 5, ["10x create:andesite_alloy"], "minecraft:observer"] +] + +/** + * @typedef {object} NewTrade Config + * @property {string} villagerType - String - Requird + * @property {string} buyItem - String - What the player gives - Requird + * @property {string} sellItem - String - What the player gets - Requird + * @property {boolean} careAboutCount - Bool - Does item count matter + * @property {number} buyCount - Int - How much is needed to buy - Required if caraAboutCount is true + * @property {number} sellCount - Int - How much is given to player - Required if caraAboutCount is true + * @property {boolean} replaceBuyItem - Bool + * @property {string} replaceBuyItemWith - String - What item to replace buy item with - Required if replaceBuyItem is true + * @property {number} replaceBuyCount - Int - How much is need to buy after replaced - Required if replaceBuyItem is true + * @property {boolean} replaceSellItem - Bool + * @property {string} replaceSellItemWith - String - What item to replace sell item with - Required if replaceSellItem is true + * @property {number} replaceSellCount - Int - How much is given to the player after replaced - Required if replaceSellItem is true + */ + + +const replaceTrades = [ + //? this is an example use + {villagerType: "minecraft:armorer", buyItem: "minecraft:emerald", sellItem: "minecraft:diamond_sword", + careAboutCount: true, buyCount: 25, sellCount: 1, + replaceBuyItem: true, replaceBuyItemWith: "minecraft:iron_ingot", replaceBuyCount: 1, + replaceSellItem: true, replaceSellItemWith: "minecraft:iron_boots", replaceSellCount: 1} +] + +function replaceVillagerTrades(entity) { + let nbt = entity.getFullNBT() + + if (nbt.Offers && nbt.Offers.Recipes) { + let recipes = nbt.Offers.Recipes + + recipes.forEach(trade => { + replaceTrades.forEach(newTrade => { + if (nbt.VillagerData.profession === newTrade.villagerType) { + + let buyItemMatches = trade.buy.id === newTrade.buyItem + let sellItemMatches = trade.sell.id === newTrade.sellItem + + if (newTrade.careAboutCount) { + buyItemMatches = buyItemMatches && (trade.buy.Count === newTrade.buyCount) + sellItemMatches = sellItemMatches && (trade.sell.Count === newTrade.sellCount) + } + + if (newTrade.replaceBuyItem && buyItemMatches) { + trade.buy.id = newTrade.replaceBuyItemWith + trade.buy.Count = newTrade.replaceBuyCount + } + + if (newTrade.replaceSellItem && sellItemMatches) { + trade.sell.id = newTrade.replaceSellItemWith + trade.sell.Count = newTrade.replaceSellCount + } + } + }) + }) + entity.setFullNBT(nbt) + } +} + + +onEvent("item.entity_interact", (event) => { + if (event.target.type == "minecraft:villager") { + replaceVillagerTrades(event.target) + } +}) + +//TODO: Allow the adding of trades \ No newline at end of file From a70a6ffde16775e61114464b1c6c0636218224da Mon Sep 17 00:00:00 2001 From: HyperRaccoon13 Date: Fri, 11 Oct 2024 19:49:26 +0100 Subject: [PATCH 2/6] updated villager.js Added the power to add trades --- kubejs/server_scripts/villager.js | 58 ++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/kubejs/server_scripts/villager.js b/kubejs/server_scripts/villager.js index 02100743d..997de8a10 100644 --- a/kubejs/server_scripts/villager.js +++ b/kubejs/server_scripts/villager.js @@ -42,7 +42,7 @@ const customTradesToAdd = [ ] /** - * @typedef {object} NewTrade Config + * @typedef {object} replaceTrades Config * @property {string} villagerType - String - Requird * @property {string} buyItem - String - What the player gives - Requird * @property {string} sellItem - String - What the player gets - Requird @@ -56,7 +56,18 @@ const customTradesToAdd = [ * @property {string} replaceSellItemWith - String - What item to replace sell item with - Required if replaceSellItem is true * @property {number} replaceSellCount - Int - How much is given to the player after replaced - Required if replaceSellItem is true */ - +/** + * @typedef {object} addTrades + * @property {string} villagerType - String - Requird + * @property {number} villagerLevel - Int - Requird + * @property {string} buyItem - String - Requird + * @property {string} sellItem - String - Requird + * @property {number} buyCount - Int - Requird + * @property {number} sellCount - Int - Requird + * @property {boolean} rewardExp - Bool - Requird + * @property {number} maxUses - Int - Requird + * @property {number} uses - Int - Requird + */ const replaceTrades = [ //? this is an example use @@ -66,7 +77,13 @@ const replaceTrades = [ replaceSellItem: true, replaceSellItemWith: "minecraft:iron_boots", replaceSellCount: 1} ] -function replaceVillagerTrades(entity) { +const addTrades = [ + {villagerType: "minecraft:armorer", villagerLevel: 1, buyItem: "minecraft:dirt", sellItem: "minecraft:sand", + buyCount: 2, sellCount: 1, rewardExp: true, maxUses: 12, uses: 0 + } +] + +function ReplaceVillagerTrades(entity) { let nbt = entity.getFullNBT() if (nbt.Offers && nbt.Offers.Recipes) { @@ -100,10 +117,43 @@ function replaceVillagerTrades(entity) { } } +function AddVillagerTrade(entity) { + let nbt = entity.getFullNBT() + + if (nbt.Offers && nbt.Offers.Recipes) { + let recipes = nbt.Offers.Recipes; + + + addTrades.forEach(newTrade => { + if (nbt.VillagerData.profession === newTrade.villagerType && nbt.VillagerData.level >= newTrade.villagerLevel) { + + let tradeExists = recipes.some(trade => { + let buyMatches = trade.buy.id === newTrade.buyItem && trade.buy.Count === newTrade.buyCount; + let sellMatches = trade.sell.id === newTrade.sellItem && trade.sell.Count === newTrade.sellCount; + return buyMatches && sellMatches; + }); + + if (!tradeExists) { + let newRecipe = { + buy: { id: newTrade.buyItem, Count: newTrade.buyCount }, + sell: { id: newTrade.sellItem, Count: newTrade.sellCount }, + rewardExp: newTrade.rewardExp, + maxUses: newTrade.maxUses, + uses: newTrade.uses + } + recipes.push(newRecipe); + }} + }) + entity.setFullNBT(nbt) + } +} + + onEvent("item.entity_interact", (event) => { if (event.target.type == "minecraft:villager") { - replaceVillagerTrades(event.target) + ReplaceVillagerTrades(event.target) + AddVillagerTrade(event.target) } }) From ec95cda8423a1e7fef61fa4b13d902162e605267 Mon Sep 17 00:00:00 2001 From: HyperRaccoon13 Date: Mon, 30 Dec 2024 17:35:55 +0000 Subject: [PATCH 3/6] Conduit fix the astral conduit only work in your main hand now, which removes 2 bugs The conduit now also takes damage from the other portal stones. note for ethan: Add the glacio portal block --- kubejs/server_scripts/interaction.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/kubejs/server_scripts/interaction.js b/kubejs/server_scripts/interaction.js index bccd1ad59..60e3caa6c 100644 --- a/kubejs/server_scripts/interaction.js +++ b/kubejs/server_scripts/interaction.js @@ -33,18 +33,22 @@ onEvent("item.right_click", (event) => { //? Makes the conduit take damge if used on shimmer stone //? If you wish to increase the damge please goto startup scripts, line 385, then what ever value you set it, take 1 off and change the 19 +const conduitBlocks = [ + "createastral:shimmering_stone", + "createastral:ancient_stone", + "createastral:moonset_stone", + "createastral:mercurian_stone" +] + onEvent("block.right_click", (event) => { - if ( - event.block.id == "createastral:shimmering_stone" && - event.item.id == "createastral:astral_conduit" && - event.item.nbt["Damage"] <= 19 - ) { + if (event.item.id == "createastral:astral_conduit" && event.item.nbt["Damage"] <= 19 && conduitBlocks.includes(event.block.id)) { + if (event.hand != "MAIN_HAND") { return } event.item.nbt["Damage"]++; if (event.item.nbt["Damage"] == 20) { event.player.inventory.set(event.player.getSelectedSlot(), "air"); } } - //? Tp player back to their spawn point, or world spawn if no spawn point was set + //? Tp player back to their spawn point, or world spawn if no spawn point was set //! Please note it will still send the player to their bed if the bed was broke. A fix is planned else if ( event.block.id == "minecraft:bedrock" && From f1c820933ddc028310a4c52689da29a8d0eaf201 Mon Sep 17 00:00:00 2001 From: HyperRaccoon13 Date: Wed, 5 Mar 2025 14:12:46 +0000 Subject: [PATCH 4/6] Revert "Conduit fix" This reverts commit ec95cda8423a1e7fef61fa4b13d902162e605267. --- kubejs/server_scripts/interaction.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/kubejs/server_scripts/interaction.js b/kubejs/server_scripts/interaction.js index 60e3caa6c..bccd1ad59 100644 --- a/kubejs/server_scripts/interaction.js +++ b/kubejs/server_scripts/interaction.js @@ -33,22 +33,18 @@ onEvent("item.right_click", (event) => { //? Makes the conduit take damge if used on shimmer stone //? If you wish to increase the damge please goto startup scripts, line 385, then what ever value you set it, take 1 off and change the 19 -const conduitBlocks = [ - "createastral:shimmering_stone", - "createastral:ancient_stone", - "createastral:moonset_stone", - "createastral:mercurian_stone" -] - onEvent("block.right_click", (event) => { - if (event.item.id == "createastral:astral_conduit" && event.item.nbt["Damage"] <= 19 && conduitBlocks.includes(event.block.id)) { - if (event.hand != "MAIN_HAND") { return } + if ( + event.block.id == "createastral:shimmering_stone" && + event.item.id == "createastral:astral_conduit" && + event.item.nbt["Damage"] <= 19 + ) { event.item.nbt["Damage"]++; if (event.item.nbt["Damage"] == 20) { event.player.inventory.set(event.player.getSelectedSlot(), "air"); } } - //? Tp player back to their spawn point, or world spawn if no spawn point was set + //? Tp player back to their spawn point, or world spawn if no spawn point was set //! Please note it will still send the player to their bed if the bed was broke. A fix is planned else if ( event.block.id == "minecraft:bedrock" && From 37f5caebbe0ccb68c3a2cb5af710b97d87063eeb Mon Sep 17 00:00:00 2001 From: HyperRaccoon13 Date: Wed, 5 Mar 2025 14:21:16 +0000 Subject: [PATCH 5/6] conduit fix making the conduit take damage on other portal blocks ethan --> add the ice thing one idk --- kubejs/server_scripts/interaction.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/kubejs/server_scripts/interaction.js b/kubejs/server_scripts/interaction.js index bccd1ad59..60e3caa6c 100644 --- a/kubejs/server_scripts/interaction.js +++ b/kubejs/server_scripts/interaction.js @@ -33,18 +33,22 @@ onEvent("item.right_click", (event) => { //? Makes the conduit take damge if used on shimmer stone //? If you wish to increase the damge please goto startup scripts, line 385, then what ever value you set it, take 1 off and change the 19 +const conduitBlocks = [ + "createastral:shimmering_stone", + "createastral:ancient_stone", + "createastral:moonset_stone", + "createastral:mercurian_stone" +] + onEvent("block.right_click", (event) => { - if ( - event.block.id == "createastral:shimmering_stone" && - event.item.id == "createastral:astral_conduit" && - event.item.nbt["Damage"] <= 19 - ) { + if (event.item.id == "createastral:astral_conduit" && event.item.nbt["Damage"] <= 19 && conduitBlocks.includes(event.block.id)) { + if (event.hand != "MAIN_HAND") { return } event.item.nbt["Damage"]++; if (event.item.nbt["Damage"] == 20) { event.player.inventory.set(event.player.getSelectedSlot(), "air"); } } - //? Tp player back to their spawn point, or world spawn if no spawn point was set + //? Tp player back to their spawn point, or world spawn if no spawn point was set //! Please note it will still send the player to their bed if the bed was broke. A fix is planned else if ( event.block.id == "minecraft:bedrock" && From 4bc062ba5553ae2c6a93d678c309f1481ca1e531 Mon Sep 17 00:00:00 2001 From: HyperRaccoon13 Date: Wed, 5 Mar 2025 14:21:51 +0000 Subject: [PATCH 6/6] Revert "conduit fix" This reverts commit 37f5caebbe0ccb68c3a2cb5af710b97d87063eeb. --- kubejs/server_scripts/interaction.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/kubejs/server_scripts/interaction.js b/kubejs/server_scripts/interaction.js index 60e3caa6c..bccd1ad59 100644 --- a/kubejs/server_scripts/interaction.js +++ b/kubejs/server_scripts/interaction.js @@ -33,22 +33,18 @@ onEvent("item.right_click", (event) => { //? Makes the conduit take damge if used on shimmer stone //? If you wish to increase the damge please goto startup scripts, line 385, then what ever value you set it, take 1 off and change the 19 -const conduitBlocks = [ - "createastral:shimmering_stone", - "createastral:ancient_stone", - "createastral:moonset_stone", - "createastral:mercurian_stone" -] - onEvent("block.right_click", (event) => { - if (event.item.id == "createastral:astral_conduit" && event.item.nbt["Damage"] <= 19 && conduitBlocks.includes(event.block.id)) { - if (event.hand != "MAIN_HAND") { return } + if ( + event.block.id == "createastral:shimmering_stone" && + event.item.id == "createastral:astral_conduit" && + event.item.nbt["Damage"] <= 19 + ) { event.item.nbt["Damage"]++; if (event.item.nbt["Damage"] == 20) { event.player.inventory.set(event.player.getSelectedSlot(), "air"); } } - //? Tp player back to their spawn point, or world spawn if no spawn point was set + //? Tp player back to their spawn point, or world spawn if no spawn point was set //! Please note it will still send the player to their bed if the bed was broke. A fix is planned else if ( event.block.id == "minecraft:bedrock" &&