From 0b5f4aa433e52fc8338e7f26ab520044bbb69c27 Mon Sep 17 00:00:00 2001 From: Armisael5 <193531144+Armisael5@users.noreply.github.com> Date: Tue, 20 Oct 2026 21:26:09 -0400 Subject: [PATCH] Add debug hologram projector (#79) --- .../gtnewhorizon/structurelib/StructureLib.java | 5 +++++ .../constructable/ConstructableUtility.java | 3 ++- .../item/ItemDebugConstructableTrigger.java | 14 ++++++++++++++ .../assets/structurelib/lang/en_US.lang | 2 ++ .../items/itemDebugConstructableTrigger.png | Bin 0 -> 2156 bytes 5 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/gtnewhorizon/structurelib/item/ItemDebugConstructableTrigger.java create mode 100644 src/main/resources/assets/structurelib/textures/items/itemDebugConstructableTrigger.png diff --git a/src/main/java/com/gtnewhorizon/structurelib/StructureLib.java b/src/main/java/com/gtnewhorizon/structurelib/StructureLib.java index 4a491d86..182d86cc 100644 --- a/src/main/java/com/gtnewhorizon/structurelib/StructureLib.java +++ b/src/main/java/com/gtnewhorizon/structurelib/StructureLib.java @@ -22,6 +22,7 @@ import com.gtnewhorizon.structurelib.command.CommandConfigureChannels; import com.gtnewhorizon.structurelib.command.CommandRegistryDebug; import com.gtnewhorizon.structurelib.item.ItemBlockHint; import com.gtnewhorizon.structurelib.item.ItemConstructableTrigger; +import com.gtnewhorizon.structurelib.item.ItemDebugConstructableTrigger; import com.gtnewhorizon.structurelib.item.ItemFrontRotationTool; import com.gtnewhorizon.structurelib.net.AlignmentMessage; import com.gtnewhorizon.structurelib.net.ErrorHintParticleMessage; @@ -99,6 +100,7 @@ public class StructureLib { static Item itemBlockHint; static Item itemFrontRotationTool; static Item itemConstructableTrigger; + static Item itemDebugConstructableTrigger; public static final CreativeTabs creativeTab = new CreativeTabs("structurelib") { @Override @@ -119,6 +121,9 @@ public class StructureLib { GameRegistry.registerItem( itemConstructableTrigger = new ItemConstructableTrigger(), itemConstructableTrigger.getUnlocalizedName()); + GameRegistry.registerItem( + itemDebugConstructableTrigger = new ItemDebugConstructableTrigger(), + itemDebugConstructableTrigger.getUnlocalizedName()); proxy.preInit(e); NetworkRegistry.INSTANCE.registerGuiHandler(instance(), new GuiHandler()); diff --git a/src/main/java/com/gtnewhorizon/structurelib/alignment/constructable/ConstructableUtility.java b/src/main/java/com/gtnewhorizon/structurelib/alignment/constructable/ConstructableUtility.java index 9b42ad71..291ad1dd 100644 --- a/src/main/java/com/gtnewhorizon/structurelib/alignment/constructable/ConstructableUtility.java +++ b/src/main/java/com/gtnewhorizon/structurelib/alignment/constructable/ConstructableUtility.java @@ -16,6 +16,7 @@ import com.gtnewhorizon.structurelib.StructureLib; import com.gtnewhorizon.structurelib.StructureLibAPI; import com.gtnewhorizon.structurelib.alignment.IAlignment; import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing; +import com.gtnewhorizon.structurelib.item.ItemDebugConstructableTrigger; import com.gtnewhorizon.structurelib.structure.IItemSource; import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; @@ -73,7 +74,7 @@ public class ConstructableUtility { if (aPlayer instanceof EntityPlayerMP playerMP) { // server side and sneaking (already checked above) // do construct - if (aPlayer.capabilities.isCreativeMode) { + if (aPlayer.capabilities.isCreativeMode || aStack.getItem() instanceof ItemDebugConstructableTrigger) { constructable.construct(aStack, false); } else if (constructable instanceof ISurvivalConstructable) { int built = ((ISurvivalConstructable) constructable).survivalConstruct( diff --git a/src/main/java/com/gtnewhorizon/structurelib/item/ItemDebugConstructableTrigger.java b/src/main/java/com/gtnewhorizon/structurelib/item/ItemDebugConstructableTrigger.java new file mode 100644 index 00000000..6bad5eea --- /dev/null +++ b/src/main/java/com/gtnewhorizon/structurelib/item/ItemDebugConstructableTrigger.java @@ -0,0 +1,14 @@ +package com.gtnewhorizon.structurelib.item; + +import static com.gtnewhorizon.structurelib.StructureLibAPI.MOD_ID; + +/** + * Hologram projector that always performs a creative build, whatever the player's game mode. + */ +public class ItemDebugConstructableTrigger extends ItemConstructableTrigger { + + public ItemDebugConstructableTrigger() { + setUnlocalizedName("structurelib.debugConstructableTrigger"); + setTextureName(MOD_ID + ":itemDebugConstructableTrigger"); + } +} diff --git a/src/main/resources/assets/structurelib/lang/en_US.lang b/src/main/resources/assets/structurelib/lang/en_US.lang index 8a733238..ce143ea6 100644 --- a/src/main/resources/assets/structurelib/lang/en_US.lang +++ b/src/main/resources/assets/structurelib/lang/en_US.lang @@ -41,6 +41,8 @@ item.structurelib.constructableTrigger.gui.wipe.confirm=§4Sure? item.structurelib.constructableTrigger.gui.channels.from=§rMod: §9§o%s item.structurelib.constructableTrigger.gui.info=Many multiblocks support some degree of variation in their structure and a sub channel allows indication of which variant to use.\n All sub channels have a sequence of lowercase characters as key and a positive integer as value. Most known sub channels should be available as typeahead completions.\n You can also drag and drop items from NEI to set the corresponding sub channel value. These items all have a tooltip of "§oIndicates§r §ovalue§r §oX§r §ofor§r §osub§r §ochannel§r §oY§r". +item.structurelib.debugConstructableTrigger.name=Debug Multiblock Structure Hologram Projector + channels.structurelib.show_errors=When set, will highlight parts of the multiblock that is definitely wrong structurelib.tooltip.channelvalue=§7Value §b%d§r§7 for subchannel §b%s diff --git a/src/main/resources/assets/structurelib/textures/items/itemDebugConstructableTrigger.png b/src/main/resources/assets/structurelib/textures/items/itemDebugConstructableTrigger.png new file mode 100644 index 0000000000000000000000000000000000000000..d29c8427c5c992aa578b91a92a1e000baba2dff2 GIT binary patch literal 2156 zcmb_ee{9rL9Pi}EV7NHlLY9Hh6kR~<^~bfnYr_HKZa)saF^>z3APMi<*IVWKgSOk< zCdS2pW<)l?7y?0K3?xK;Xrj@WffGa2$S+Y0hzP_C!ylMo_6L73GGA|Z7k)#CP1?S` z_xb+*eBWzNOLJp+Sxp&+Vdc@LNF2Q@ynE6_^qe_73ean^)wIIFuql<^U4re{S&d;6 zKhqMeZfopiNj7yKP|PIsWpxXoF>Ky~tOevX(8ZH5r5Pb&sDFUKH6=tW=VNrt3d1(7 zsmq2-yP6Yn*BV(=hz0ZUd07c5(4hpM^w`GnjP?Ib!aNX4OJw%anS??7(O@}jY%unmE0+6mK4 z7YfxnxU8(XU;7GFalf{B3POgNQNd^I>B%fOG{jkq&bPE$DlD&(bUen zpe!RXw8V^KQ5IBI6@w&{1)dZD$B`hwsiYjBd5~mSllq>ryCN59J+oKj$6L@nF}1;AccNK$C(f@+2#A5EYM>Nsfm= z6+}i3vY-(9-LCTzA~P=(c=|Z5=hG^;0V4&`o=OpqAIzgM@ji99v+4f7U?^`Z9b*`E zC;4(~w`{wpkhv+emwUtFA%Z@N#}G77o@{i;tgdQYk6|UrXrwL?+_Zb^z>=z0sx}Pt zA03E5?eM;G^8Nmr7p5h@q?x0A)z3WPYpI^Q@ZJ6UPiDesJC9p6TL|#qVvO zp}2>xotyIMu`4@H4WEDM%`Uy+%*@W4eKY3uq^4FaZKg{8iJu$1dA#rQ(4HN?)i!P7 zYt-fv>|pz*Rc9)+%Bx?W=pBc3yn4C!#<@{`a-SUS4qe0#AFUqzv+{;