From fbf8cfd82c5ce134923cef5b5fd3b692252d37bc Mon Sep 17 00:00:00 2001 From: Glease <4586901+Glease@users.noreply.github.com> Date: Tue, 22 Jun 2021 23:58:19 +0800 Subject: [PATCH] Add constructable trigger item and a few utilities --- gradle.properties | 2 +- .../structurelib/StructureLib.java | 3 ++ .../item/ItemConstructableTrigger.java | 37 +++++++++++++++ .../structure/IWithExtendedContext.java | 14 ++++++ .../structure/StructureUtility.java | 46 +++++++++++++++++-- .../assets/structurelib/lang/en_US.lang | 7 +++ 6 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/gtnewhorizon/structurelib/item/ItemConstructableTrigger.java create mode 100644 src/main/java/com/gtnewhorizon/structurelib/structure/IWithExtendedContext.java diff --git a/gradle.properties b/gradle.properties index 8e1dd8ab..80772c21 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ modGroup = com.gtnewhorizon -modVersion = 1.0.2 +modVersion = 1.0.3 modBaseName = StructureLib forgeVersion = 1.7.10-10.13.4.1614-1.7.10 diff --git a/src/main/java/com/gtnewhorizon/structurelib/StructureLib.java b/src/main/java/com/gtnewhorizon/structurelib/StructureLib.java index aa6b48ab..0494a667 100644 --- a/src/main/java/com/gtnewhorizon/structurelib/StructureLib.java +++ b/src/main/java/com/gtnewhorizon/structurelib/StructureLib.java @@ -3,6 +3,7 @@ package com.gtnewhorizon.structurelib; import com.gtnewhorizon.structurelib.alignment.AlignmentMessage; import com.gtnewhorizon.structurelib.block.BlockHint; import com.gtnewhorizon.structurelib.item.ItemBlockHint; +import com.gtnewhorizon.structurelib.item.ItemConstructableTrigger; import com.gtnewhorizon.structurelib.item.ItemFrontRotationTool; import com.gtnewhorizon.structurelib.proxy.CommonProxy; import com.gtnewhorizon.structurelib.util.XSTR; @@ -45,6 +46,7 @@ public class StructureLib { static Block blockHint; static Item itemBlockHint; static Item itemFrontRotationTool; + static Item itemConstructableTrigger; public static final CreativeTabs creativeTab = new CreativeTabs("structurelib") { @Override @SideOnly(Side.CLIENT) @@ -58,6 +60,7 @@ public class StructureLib { GameRegistry.registerBlock(blockHint = new BlockHint(), ItemBlockHint.class, "blockhint"); itemBlockHint = ItemBlock.getItemFromBlock(StructureLibAPI.getBlockHint()); GameRegistry.registerItem(itemFrontRotationTool = new ItemFrontRotationTool(), itemFrontRotationTool.getUnlocalizedName()); + GameRegistry.registerItem(itemConstructableTrigger = new ItemConstructableTrigger(), itemConstructableTrigger.getUnlocalizedName()); } public static void addClientSideChatMessages(String... messages) { diff --git a/src/main/java/com/gtnewhorizon/structurelib/item/ItemConstructableTrigger.java b/src/main/java/com/gtnewhorizon/structurelib/item/ItemConstructableTrigger.java new file mode 100644 index 00000000..8af6c210 --- /dev/null +++ b/src/main/java/com/gtnewhorizon/structurelib/item/ItemConstructableTrigger.java @@ -0,0 +1,37 @@ +package com.gtnewhorizon.structurelib.item; + +import com.gtnewhorizon.structurelib.StructureLib; +import com.gtnewhorizon.structurelib.alignment.constructable.ConstructableUtility; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +import java.util.List; + +import static com.gtnewhorizon.structurelib.StructureLib.MOD_ID; +import static net.minecraft.util.EnumChatFormatting.BLUE; +import static net.minecraft.util.StatCollector.translateToLocal; + +public class ItemConstructableTrigger extends Item { + public ItemConstructableTrigger() { + setUnlocalizedName("structurelib.constructableTrigger"); + setTextureName(MOD_ID + ":itemConstructableTrigger"); + setCreativeTab(StructureLib.creativeTab); + } + + @Override + public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { + return ConstructableUtility.handle(stack, player, world, x, y, z, side); + } + + @SuppressWarnings("unchecked") + @Override + public void addInformation(ItemStack aStack, EntityPlayer ep, List aList, boolean boo) { + aList.add(translateToLocal("item.structurelib.constructableTrigger.desc.0"));//Triggers Constructable Interface + aList.add(BLUE + translateToLocal("item.structurelib.constructableTrigger.desc.1"));//Shows multiblock construction details, + aList.add(BLUE + translateToLocal("item.structurelib.constructableTrigger.desc.2"));//just Use on a multiblock controller. + aList.add(BLUE + translateToLocal("item.structurelib.constructableTrigger.desc.3"));//(Sneak Use in creative to build) + aList.add(BLUE + translateToLocal("item.structurelib.constructableTrigger.desc.4"));//Quantity affects tier/mode/type + } +} diff --git a/src/main/java/com/gtnewhorizon/structurelib/structure/IWithExtendedContext.java b/src/main/java/com/gtnewhorizon/structurelib/structure/IWithExtendedContext.java new file mode 100644 index 00000000..c9267635 --- /dev/null +++ b/src/main/java/com/gtnewhorizon/structurelib/structure/IWithExtendedContext.java @@ -0,0 +1,14 @@ +package com.gtnewhorizon.structurelib.structure; + +/** + * Implement this and use {@link StructureUtility#withContext(IStructureElement)} in case you need to record some + * temporary states that don't need to live in your main context, which would usually live for the whole lifetime of the + * structure than just during structure check. Usually just save some few bytes, but becomes non trivial if you need to + * record too much stuff. + * + * You will have to reset the context yourself though. The API can't guess when the old context becomes invalid. + * @param the temporary state context + */ +public interface IWithExtendedContext { + CTX getCurrentContext(); +} diff --git a/src/main/java/com/gtnewhorizon/structurelib/structure/StructureUtility.java b/src/main/java/com/gtnewhorizon/structurelib/structure/StructureUtility.java index 3024bcce..0500cd7b 100644 --- a/src/main/java/com/gtnewhorizon/structurelib/structure/StructureUtility.java +++ b/src/main/java/com/gtnewhorizon/structurelib/structure/StructureUtility.java @@ -13,10 +13,7 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; import java.util.*; -import java.util.function.BiFunction; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; +import java.util.function.*; import static java.lang.Integer.MIN_VALUE; @@ -558,6 +555,26 @@ public class StructureUtility { } }; } + + public static IStructureElementNoPlacement ofSpecificTileAdder(BiPredicate iTileAdder, Class tileClass, Block hintBlock, int hintMeta) { + if (iTileAdder == null || hintBlock == null || tileClass == null) { + throw new IllegalArgumentException(); + } + return new IStructureElementNoPlacement() { + @Override + public boolean check(T t, World world, int x, int y, int z) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + // This used to check if it's a GT tile. Since this is now an standalone mod we no longer do this + return tileClass.isInstance(tileEntity) && iTileAdder.test(t, tileClass.cast(tileEntity)); + } + + @Override + public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { + StructureLibAPI.hintParticle(world, x, y, z, hintBlock, hintMeta); + return true; + } + }; + } // No more hatch adder. Implement it via tile adder. We could of course add a wrapper around it in gregtech, but not any more in this standalone mod. //endregion @@ -640,6 +657,27 @@ public class StructureUtility { return ofChain(elementChain.toArray(new IStructureElement[0])); } + // region context + public static , E extends IStructureElement> IStructureElement withContext(E elem) { + return new IStructureElement() { + @Override + public boolean check(T t, World world, int x, int y, int z) { + return elem.check(t.getCurrentContext(), world, x, y, z); + } + + @Override + public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { + return elem.spawnHint(t.getCurrentContext(), world, x, y, z, trigger); + } + + @Override + public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) { + return elem.placeBlock(t.getCurrentContext(), world, x, y, z, trigger); + } + }; + } + //endregion + //region defer public static IStructureElementDeferred defer(Supplier> to) { diff --git a/src/main/resources/assets/structurelib/lang/en_US.lang b/src/main/resources/assets/structurelib/lang/en_US.lang index 563c811d..f8e97029 100644 --- a/src/main/resources/assets/structurelib/lang/en_US.lang +++ b/src/main/resources/assets/structurelib/lang/en_US.lang @@ -20,6 +20,13 @@ item.structurelib.frontRotationTool.desc.0=Triggers Front Rotation Interface item.structurelib.frontRotationTool.desc.1=Rotates only the front panel, item.structurelib.frontRotationTool.desc.2=which allows structure rotation. +item.structurelib.constructableTrigger.name=Multiblock Machine Blueprint +item.structurelib.constructableTrigger.desc.0=Triggers Constructable Interface +item.structurelib.constructableTrigger.desc.1=Shows multiblock construction details, +item.structurelib.constructableTrigger.desc.2=just Use on a multiblock controller. +item.structurelib.constructableTrigger.desc.3=(Sneak Use in creative to build) +item.structurelib.constructableTrigger.desc.4=Quantity affects tier/mode/type + structurelib.blockhint.desc.0=Helps while building structurelib.blockhint.0.name=Hint 1 dot structurelib.blockhint.1.name=Hint 2 dot