From 137100114ac55452209ebd10a3fbfbc1b6928a8f Mon Sep 17 00:00:00 2001 From: ForestOfLight Date: Sat, 7 Jun 2025 18:52:42 -0700 Subject: [PATCH] add custom items for tool picker, easy place, & material grabber --- Construct[BP]/items/easy_place.json | 22 ++++++++++++++++++ Construct[BP]/items/material_grabber.json | 22 ++++++++++++++++++ Construct[BP]/items/tool_picker.json | 22 ++++++++++++++++++ Construct[BP]/scripts/options/easyPlace.js | 18 ++++++-------- .../scripts/options/fastEasyPlace.js | 6 ++--- .../scripts/options/materialGrabber.js | 7 +++--- Construct[RP]/textures/item_texture.json | 14 +++++++++++ Construct[RP]/textures/items/easy_place.png | Bin 0 -> 290 bytes .../textures/items/material_grabber.png | Bin 0 -> 250 bytes Construct[RP]/textures/items/tool_picker.png | Bin 0 -> 242 bytes 10 files changed, 92 insertions(+), 19 deletions(-) create mode 100644 Construct[BP]/items/easy_place.json create mode 100644 Construct[BP]/items/material_grabber.json create mode 100644 Construct[BP]/items/tool_picker.json create mode 100644 Construct[RP]/textures/item_texture.json create mode 100644 Construct[RP]/textures/items/easy_place.png create mode 100644 Construct[RP]/textures/items/material_grabber.png create mode 100644 Construct[RP]/textures/items/tool_picker.png diff --git a/Construct[BP]/items/easy_place.json b/Construct[BP]/items/easy_place.json new file mode 100644 index 0000000..e4ed343 --- /dev/null +++ b/Construct[BP]/items/easy_place.json @@ -0,0 +1,22 @@ +{ + "format_version": "1.20.30", + "minecraft:item": { + "description": { + "identifier": "construct:easy_place", + "category": "Items" + }, + "components": { + "minecraft:max_stack_size": 1, + "minecraft:icon": { + "texture": "construct:easy_place" + }, + "minecraft:display_name": { + "value": "Easy Place" + }, + "minecraft:wearable": { + "dispensable": true, + "slot": "slot.weapon.offhand" + } + } + } +} \ No newline at end of file diff --git a/Construct[BP]/items/material_grabber.json b/Construct[BP]/items/material_grabber.json new file mode 100644 index 0000000..f3d45fd --- /dev/null +++ b/Construct[BP]/items/material_grabber.json @@ -0,0 +1,22 @@ +{ + "format_version": "1.20.30", + "minecraft:item": { + "description": { + "identifier": "construct:material_grabber", + "category": "Items" + }, + "components": { + "minecraft:max_stack_size": 1, + "minecraft:icon": { + "texture": "construct:material_grabber" + }, + "minecraft:display_name": { + "value": "Material Grabber" + }, + "minecraft:wearable": { + "dispensable": true, + "slot": "slot.weapon.offhand" + } + } + } +} \ No newline at end of file diff --git a/Construct[BP]/items/tool_picker.json b/Construct[BP]/items/tool_picker.json new file mode 100644 index 0000000..eeb0f24 --- /dev/null +++ b/Construct[BP]/items/tool_picker.json @@ -0,0 +1,22 @@ +{ + "format_version": "1.20.30", + "minecraft:item": { + "description": { + "identifier": "construct:tool_picker", + "category": "Items" + }, + "components": { + "minecraft:max_stack_size": 1, + "minecraft:icon": { + "texture": "construct:tool_picker" + }, + "minecraft:display_name": { + "value": "Construct Tool Picker" + }, + "minecraft:wearable": { + "dispensable": true, + "slot": "slot.weapon.offhand" + } + } + } +} \ No newline at end of file diff --git a/Construct[BP]/scripts/options/easyPlace.js b/Construct[BP]/scripts/options/easyPlace.js index 7ad3ae8..4e53c05 100644 --- a/Construct[BP]/scripts/options/easyPlace.js +++ b/Construct[BP]/scripts/options/easyPlace.js @@ -1,5 +1,5 @@ import { BuilderOption } from '../classes/Builder/BuilderOption'; -import { BlockPermutation, EntityComponentTypes, GameMode, ItemStack, system, world } from '@minecraft/server'; +import { BlockPermutation, EntityComponentTypes, EquipmentSlot, GameMode, ItemStack, system, world } from '@minecraft/server'; import { structureCollection } from '../classes/Structure/StructureCollection'; import { bannedBlocks, bannedToValidBlockMap, whitelistedBlockStates, resetToBlockStates, bannedDimensionBlocks, specialItemPlacementConversions, blockIdToItemStackMap } from '../data'; @@ -11,29 +11,25 @@ const builderOption = new BuilderOption({ identifier: 'easyPlace', displayName: 'Easy Place', description: 'Always place the correct structure block.', - howToUse: "Name a paper 'Easy Place', then put it in the inventory slot above your first hotbar slot to always place the correct blocks in a structure." + howToUse: "Hold the Easy Place item in your offhand to always place the correct blocks in a structure." }); world.beforeEvents.playerPlaceBlock.subscribe(onPlayerPlaceBlock); function onPlayerPlaceBlock(event) { const { player, block } = event; - if (!player || !block || !builderOption.isEnabled(player.id) || !hasActionItemInCorrectSlot(player)) return; + if (!player || !block || !builderOption.isEnabled(player.id) || !isHoldingActionItem(player)) return; const structureBlock = structureCollection.fetchStructureBlock(block.dimension.id, block.location); if (!structureBlock) return; tryPlaceBlock(event, player, block, structureBlock); } -function hasActionItemInCorrectSlot(player) { - const inventory = player.getComponent(EntityComponentTypes.Inventory)?.container; - if (!inventory) +function isHoldingActionItem(player) { + const offhandItemStack = player.getComponent(EntityComponentTypes.Equippable).getEquipment(EquipmentSlot.Offhand); + if (!offhandItemStack) return false; - const actionSlot = inventory.getSlot(ACTION_SLOT); - return actionSlot.hasItem() - && actionSlot.typeId === 'minecraft:paper' - && actionSlot.nameTag?.toLowerCase().includes('easy') - && actionSlot.nameTag?.toLowerCase().includes('place'); + return offhandItemStack.typeId === 'construct:easy_place'; } function tryPlaceBlock(event, player, block, structureBlock) { diff --git a/Construct[BP]/scripts/options/fastEasyPlace.js b/Construct[BP]/scripts/options/fastEasyPlace.js index fda754b..04daed2 100644 --- a/Construct[BP]/scripts/options/fastEasyPlace.js +++ b/Construct[BP]/scripts/options/fastEasyPlace.js @@ -11,7 +11,7 @@ const builderOption = new BuilderOption({ identifier: 'fastEasyPlace', displayName: 'Fast Easy Place', description: 'Place correct structure blocks just by looking at them.', - howToUse: "Hold a paper named 'Easy Place' in your hand and look at blocks in a structure to place them." + howToUse: "Hold the Easy Place item in your main hand and look at blocks in a structure to place them." }); system.runInterval(onTick, PROCESS_INTERVAL); @@ -37,9 +37,7 @@ function isHoldingActionItem(player) { const mainhandItemStack = player.getComponent(EntityComponentTypes.Equippable).getEquipment(EquipmentSlot.Mainhand); if (!mainhandItemStack) return false; - return mainhandItemStack.typeId === 'minecraft:paper' - && mainhandItemStack.nameTag?.toLowerCase().includes('easy') - && mainhandItemStack.nameTag?.toLowerCase().includes('place'); + return mainhandItemStack.typeId === 'construct:easy_place'; } function tryPlaceBlock(player, worldBlock, structureBlock) { diff --git a/Construct[BP]/scripts/options/materialGrabber.js b/Construct[BP]/scripts/options/materialGrabber.js index 0f69733..ced5a5c 100644 --- a/Construct[BP]/scripts/options/materialGrabber.js +++ b/Construct[BP]/scripts/options/materialGrabber.js @@ -16,14 +16,14 @@ world.beforeEvents.playerInteractWithBlock.subscribe(onPlayerInteract); world.beforeEvents.playerInteractWithEntity.subscribe(onPlayerInteract); function onItemUse(event) { - if (!isActionItem(event.itemStack) || !builderOption.isEnabled(event.source.id)) + if (!isActionItem(event.itemStack) || !builderOption.isEnabled(event.source?.id)) return; event.cancel = true; system.run(() => new MaterialGrabberForm(event.source)); } function onPlayerInteract(event) { - if (!isActionItem(event.itemStack) || !builderOption.isEnabled(event.player.id)) + if (!isActionItem(event.itemStack) || !builderOption.isEnabled(event.player?.id)) return; const player = event.player; const target = event.block || event.target; @@ -40,8 +40,7 @@ function onPlayerInteract(event) { } function isActionItem(itemStack) { - return itemStack?.nameTag?.toLowerCase().includes('material') - && itemStack?.nameTag?.toLowerCase().includes('grabber'); + return itemStack.typeId === 'construct:material_grabber'; } function getActiveMaterials(player) { diff --git a/Construct[RP]/textures/item_texture.json b/Construct[RP]/textures/item_texture.json new file mode 100644 index 0000000..b70b005 --- /dev/null +++ b/Construct[RP]/textures/item_texture.json @@ -0,0 +1,14 @@ +{ + "resource_pack_name": "Construct Resource Pack", + "texture_data": { + "construct:tool_picker": { + "textures": "textures/items/tool_picker" + }, + "construct:easy_place": { + "textures": "textures/items/easy_place" + }, + "construct:material_grabber": { + "textures": "textures/items/material_grabber" + } + } +} \ No newline at end of file diff --git a/Construct[RP]/textures/items/easy_place.png b/Construct[RP]/textures/items/easy_place.png new file mode 100644 index 0000000000000000000000000000000000000000..4d560e1cee6b65ad49a209233a88e7c8f9881652 GIT binary patch literal 290 zcmV+-0p0$IP)Px#+(|@1R5(wSlc5d*F${)xngqKbuviQVkLERa3vzG4YoPHc1XwJpc!GrdP5w*Q z?KYU%U3%ZwcGq>GvSN%Mghiwq`>Yrscss6?TW&A9mqdxcgFb6XGzb7QW34S##A;OV z4@^0#fn*Sz4~sCFO>s&+^q2@BS0+FJRoF$51rZ0#zml}D-rY4|MK5_L zS#5&k3-bxD+^jrF-!UU-aiUrJlX9JQSOncJ&+R>aP^7CqLeaV>D^2t&RmwAmj z?s6;i8Z=yIC~2NxIw^(079P9no+dk@`fOL}qyHZdynzNlo%Ph*l~ oF=CkQHp9CxEqKOuj?{F9pYJ;ax4l~T3FvMHPgg&ebxsLQ0J(%&!~g&Q literal 0 HcmV?d00001