From 9ded1e8d6899635e9ed7a49b58aaef0f3591e973 Mon Sep 17 00:00:00 2001 From: AlgorithmX2 Date: Sat, 10 Nov 2018 19:08:29 -0600 Subject: [PATCH] Dye-able bit bags. Implements #198 --- .../bitbag/BagCapabilityProvider.java | 6 +- .../client/ItemColorBitBag.java | 26 +++ .../mod/chiselsandbits/core/ClientSide.java | 22 ++- .../chiselsandbits/crafting/BagDyeing.java | 166 ++++++++++++++++++ .../chiselsandbits/crafting/ModRecipes.java | 5 + .../mod/chiselsandbits/items/ItemBitBag.java | 62 +++++++ .../assets/chiselsandbits/lang/en_us.lang | 4 +- .../models/item/bit_bag_dyed.json | 7 + .../textures/items/bit_bag_dyeable.png | Bin 0 -> 322 bytes .../textures/items/bit_bag_string.png | Bin 0 -> 270 bytes 10 files changed, 293 insertions(+), 5 deletions(-) create mode 100644 src/main/java/mod/chiselsandbits/client/ItemColorBitBag.java create mode 100644 src/main/java/mod/chiselsandbits/crafting/BagDyeing.java create mode 100644 src/main/resources/assets/chiselsandbits/models/item/bit_bag_dyed.json create mode 100644 src/main/resources/assets/chiselsandbits/textures/items/bit_bag_dyeable.png create mode 100644 src/main/resources/assets/chiselsandbits/textures/items/bit_bag_string.png diff --git a/src/main/java/mod/chiselsandbits/bitbag/BagCapabilityProvider.java b/src/main/java/mod/chiselsandbits/bitbag/BagCapabilityProvider.java index 8d0f738d..3cb35dc6 100644 --- a/src/main/java/mod/chiselsandbits/bitbag/BagCapabilityProvider.java +++ b/src/main/java/mod/chiselsandbits/bitbag/BagCapabilityProvider.java @@ -32,14 +32,16 @@ static int[] getStorageArray( int[] out = null; NBTTagCompound compound = stack.getTagCompound(); - if ( compound != null && compound.hasKey( "contents" ) ) + if ( compound == null ) + compound = new NBTTagCompound(); + + if ( compound.hasKey( "contents" ) ) { out = compound.getIntArray( "contents" ); } if ( out == null ) { - compound = new NBTTagCompound(); stack.setTagCompound( compound ); out = new int[size]; compound.setIntArray( "contents", out ); diff --git a/src/main/java/mod/chiselsandbits/client/ItemColorBitBag.java b/src/main/java/mod/chiselsandbits/client/ItemColorBitBag.java new file mode 100644 index 00000000..c5eda063 --- /dev/null +++ b/src/main/java/mod/chiselsandbits/client/ItemColorBitBag.java @@ -0,0 +1,26 @@ +package mod.chiselsandbits.client; + +import mod.chiselsandbits.core.ChiselsAndBits; +import net.minecraft.client.renderer.color.IItemColor; +import net.minecraft.item.EnumDyeColor; +import net.minecraft.item.ItemStack; + +public class ItemColorBitBag implements IItemColor +{ + + @Override + public int getColorFromItemstack( + ItemStack stack, + int tintIndex ) + { + if ( tintIndex == 1 ) + { + EnumDyeColor color = ChiselsAndBits.getItems().itemBitBag.getDyedColor( stack ); + if ( color != null ) + return color.func_193350_e(); + } + + return -1; + } + +} diff --git a/src/main/java/mod/chiselsandbits/core/ClientSide.java b/src/main/java/mod/chiselsandbits/core/ClientSide.java index f5061184..4d8e9946 100644 --- a/src/main/java/mod/chiselsandbits/core/ClientSide.java +++ b/src/main/java/mod/chiselsandbits/core/ClientSide.java @@ -39,6 +39,7 @@ import mod.chiselsandbits.chiseledblock.iterators.ChiselTypeIterator; import mod.chiselsandbits.client.BlockColorChisled; import mod.chiselsandbits.client.CreativeClipboardTab; +import mod.chiselsandbits.client.ItemColorBitBag; import mod.chiselsandbits.client.ItemColorBits; import mod.chiselsandbits.client.ItemColorChisled; import mod.chiselsandbits.client.ItemColorPatterns; @@ -239,6 +240,11 @@ public void postinit( final ModItems modItems = ChiselsAndBits.getItems(); + if ( modItems.itemBitBag != null ) + { + Minecraft.getMinecraft().getItemColors().registerItemColorHandler( new ItemColorBitBag(), modItems.itemBitBag ); + } + if ( modItems.itemBlockBit != null ) { Minecraft.getMinecraft().getItemColors().registerItemColorHandler( new ItemColorBits(), modItems.itemBlockBit ); @@ -286,7 +292,6 @@ public void registerItemModels() registerMesh( modItems.itemChiselIron, 0, new ModelResourceLocation( new ResourceLocation( modId, "chisel_iron" ), "inventory" ) ); registerMesh( modItems.itemChiselGold, 0, new ModelResourceLocation( new ResourceLocation( modId, "chisel_gold" ), "inventory" ) ); registerMesh( modItems.itemChiselDiamond, 0, new ModelResourceLocation( new ResourceLocation( modId, "chisel_diamond" ), "inventory" ) ); - registerMesh( modItems.itemBitBag, 0, new ModelResourceLocation( new ResourceLocation( modId, "bit_bag" ), "inventory" ) ); registerMesh( modItems.itemWrench, 0, new ModelResourceLocation( new ResourceLocation( modId, "wrench_wood" ), "inventory" ) ); registerMesh( modItems.itemBitSawDiamond, 0, new ModelResourceLocation( new ResourceLocation( modId, "bitsaw_diamond" ), "inventory" ) ); registerMesh( modItems.itemTapeMeasure, 0, new ModelResourceLocation( new ResourceLocation( modId, "tape_measure" ), "inventory" ) ); @@ -296,6 +301,21 @@ public void registerItemModels() registerMesh( ChiselsAndBits.getBlocks().itemBitTank, 0, new ModelResourceLocation( new ResourceLocation( modId, "bittank" ), "inventory" ) ); } + if ( modItems.itemBitBag != null ) + { + ModelBakery.registerItemVariants( modItems.itemBitBag, new ResourceLocation( modId, "bit_bag" ), new ResourceLocation( modId, "bit_bag_dyed" ) ); + ModelLoader.setCustomMeshDefinition( modItems.itemBitBag, new ItemMeshDefinition() { + + @Override + public ModelResourceLocation getModelLocation( + final ItemStack stack ) + { + return new ModelResourceLocation( new ResourceLocation( modId, modItems.itemBitBag.getDyedColor( stack ) != null ? "bit_bag_dyed" : "bit_bag" ), "inventory" ); + } + + } ); + } + if ( modItems.itemPositiveprint != null ) { ModelBakery.registerItemVariants( modItems.itemPositiveprint, new ResourceLocation( modId, "positiveprint" ), new ResourceLocation( modId, "positiveprint_written" ) ); diff --git a/src/main/java/mod/chiselsandbits/crafting/BagDyeing.java b/src/main/java/mod/chiselsandbits/crafting/BagDyeing.java new file mode 100644 index 00000000..3f4b4fcf --- /dev/null +++ b/src/main/java/mod/chiselsandbits/crafting/BagDyeing.java @@ -0,0 +1,166 @@ +package mod.chiselsandbits.crafting; + +import mod.chiselsandbits.core.ChiselsAndBits; +import mod.chiselsandbits.helpers.ModUtil; +import mod.chiselsandbits.items.ItemBitBag; +import net.minecraft.init.Items; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.EnumDyeColor; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; + +public class BagDyeing extends CustomRecipe +{ + + public BagDyeing( + ResourceLocation name ) + { + super( name ); + } + + private static class dyed_output + { + ItemStack bag; + EnumDyeColor color; + + public dyed_output( + ItemStack bag, + EnumDyeColor dye ) + { + this.bag = bag; + this.color = dye; + } + + }; + + @Override + public boolean matches( + InventoryCrafting inv, + World worldIn ) + { + return getOutput( inv ) != null; + } + + @Override + public ItemStack getCraftingResult( + InventoryCrafting inv ) + { + dyed_output output = getOutput( inv ); + + if ( output != null ) + { + return ChiselsAndBits.getItems().itemBitBag.dyeBag( output.bag, output.color ); + } + + return ModUtil.getEmptyStack(); + } + + private dyed_output getOutput( + InventoryCrafting inv ) + { + ItemStack bag = null; + ItemStack dye = null; + + for ( int x = 0; x < inv.getSizeInventory(); ++x ) + { + ItemStack is = inv.getStackInSlot( x ); + if ( is != null && !ModUtil.isEmpty( is ) ) + { + if ( is.getItem() == Items.WATER_BUCKET || getDye( is ) != null ) + { + if ( dye == null ) + dye = is; + else + return null; + } + else if ( is.getItem() instanceof ItemBitBag ) + { + if ( bag == null ) + bag = is; + else + return null; + } + else + return null; + } + } + + if ( bag != null && dye != null ) + { + return new dyed_output( bag, getDye( dye ) ); + } + + return null; + } + + private EnumDyeColor getDye( + ItemStack is ) + { + if ( testDye( "dyeWhite", is ) ) + return EnumDyeColor.WHITE; + if ( testDye( "dyeOrange", is ) ) + return EnumDyeColor.ORANGE; + if ( testDye( "dyeMagenta", is ) ) + return EnumDyeColor.MAGENTA; + if ( testDye( "dyeLightBlue", is ) ) + return EnumDyeColor.LIGHT_BLUE; + if ( testDye( "dyeLime", is ) ) + return EnumDyeColor.LIME; + if ( testDye( "dyePink", is ) ) + return EnumDyeColor.PINK; + if ( testDye( "dyeGray", is ) ) + return EnumDyeColor.GRAY; + if ( testDye( "dyeLightGray", is ) ) + return EnumDyeColor.SILVER; + if ( testDye( "dyeCyan", is ) ) + return EnumDyeColor.CYAN; + if ( testDye( "dyePurple", is ) ) + return EnumDyeColor.PURPLE; + if ( testDye( "dyeBlue", is ) ) + return EnumDyeColor.BLUE; + if ( testDye( "dyeBrown", is ) ) + return EnumDyeColor.BROWN; + if ( testDye( "dyeGreen", is ) ) + return EnumDyeColor.GREEN; + if ( testDye( "dyeRed", is ) ) + return EnumDyeColor.RED; + if ( testDye( "dyeBlack", is ) ) + return EnumDyeColor.BLACK; + + return null; + } + + private boolean testDye( + String string, + ItemStack is ) + { + if ( OreDictionary.doesOreNameExist( string ) ) + { + int ore = OreDictionary.getOreID( string ); + int[] list = OreDictionary.getOreIDs( is ); + for ( int x = 0; x < list.length; ++x ) + if ( list[x] == ore ) + return true; + return false; + } + else + throw new RuntimeException( "Invalid dye: " + string ); + } + + @Override + public boolean func_194133_a( + int p_194133_1_, + int p_194133_2_ ) + { + return p_194133_1_ * p_194133_2_ >= 2; + } + + @Override + public ItemStack getRecipeOutput() + { + return ModUtil.getEmptyStack(); + } + +} diff --git a/src/main/java/mod/chiselsandbits/crafting/ModRecipes.java b/src/main/java/mod/chiselsandbits/crafting/ModRecipes.java index 2c94e1ef..9c8d543d 100644 --- a/src/main/java/mod/chiselsandbits/crafting/ModRecipes.java +++ b/src/main/java/mod/chiselsandbits/crafting/ModRecipes.java @@ -27,6 +27,11 @@ void registerRecipes( String MODID = ChiselsAndBits.MODID; // add special recipes... + if ( ChiselsAndBits.getItems().itemBitBag != null ) + { + r.register( new BagDyeing( new ResourceLocation( MODID, "bitbagdyeing" ) ) ); + } + if ( config.enablePositivePrintCrafting ) { r.register( new ChiselCrafting( new ResourceLocation( MODID, "positiveprintcrafting" ) ) ); diff --git a/src/main/java/mod/chiselsandbits/items/ItemBitBag.java b/src/main/java/mod/chiselsandbits/items/ItemBitBag.java index 08fd0964..b4439922 100644 --- a/src/main/java/mod/chiselsandbits/items/ItemBitBag.java +++ b/src/main/java/mod/chiselsandbits/items/ItemBitBag.java @@ -16,15 +16,19 @@ import mod.chiselsandbits.network.packets.PacketOpenBagGui; import mod.chiselsandbits.render.helpers.SimpleInstanceCache; import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; +import net.minecraft.item.EnumDyeColor; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumHand; +import net.minecraft.util.NonNullList; +import net.minecraft.util.text.translation.I18n; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.event.entity.player.EntityItemPickupEvent; @@ -57,6 +61,17 @@ public ICapabilityProvider initCapabilities( return new BagCapabilityProvider( stack, nbt ); } + @Override + public String getItemStackDisplayName( + ItemStack stack ) + { + EnumDyeColor color = getDyedColor( stack ); + if ( color != null ) + return super.getItemStackDisplayName( stack ) + " - " + I18n.translateToLocal( "chiselsandbits.color." + color.getName() ); + else + return super.getItemStackDisplayName( stack ); + } + @Override @SideOnly( Side.CLIENT ) public void addInformation( @@ -318,4 +333,51 @@ public double getDurabilityForDisplay( return 0; } + + @Override + public void getSubItems( + CreativeTabs itemIn, + NonNullList tab ) + { + if ( this.func_194125_a( itemIn ) ) + { + tab.add( new ItemStack( this ) ); + + for ( EnumDyeColor color : EnumDyeColor.values() ) + tab.add( dyeBag( new ItemStack( this ), color ) ); + } + } + + public ItemStack dyeBag( + ItemStack bag, + EnumDyeColor color ) + { + ItemStack copy = bag.copy(); + + if ( !copy.hasTagCompound() ) + copy.setTagCompound( new NBTTagCompound() ); + + if ( color == null ) + copy.getTagCompound().removeTag( "color" ); + else + copy.getTagCompound().setString( "color", color.getName() ); + + return copy; + } + + public EnumDyeColor getDyedColor( + ItemStack stack ) + { + if ( stack.hasTagCompound() && stack.getTagCompound().hasKey( "color" ) ) + { + String name = stack.getTagCompound().getString( "color" ); + for ( EnumDyeColor color : EnumDyeColor.values() ) + { + if ( name.equals( color.getName() ) ) + return color; + } + } + + return null; + } } diff --git a/src/main/resources/assets/chiselsandbits/lang/en_us.lang b/src/main/resources/assets/chiselsandbits/lang/en_us.lang index f53ea643..62af1b5c 100644 --- a/src/main/resources/assets/chiselsandbits/lang/en_us.lang +++ b/src/main/resources/assets/chiselsandbits/lang/en_us.lang @@ -102,7 +102,7 @@ mod.chiselsandbits.help.bittank=Fill with fluid and extract bits. mod.chiselsandbits.help.tape_measure={} and drag to measure;{} + {} to clear;Use {} to display menu. mod.chiselsandbits.help.chiseled_block.long=Left-click to place the block. Sneak while placing to ignore block grid. Shift + Mouse Wheel to cycle placement rotation. -mod.chiselsandbits.help.bit_bag.long=Automatically re-stocks, and store bits when you exceed or go under a stack in your inventory. +mod.chiselsandbits.help.bit_bag.long=Automatically re-stocks, and store bits when you exceed or go under a stack in your inventory.\n\nCraft with any dye to color. mod.chiselsandbits.help.wrench.long=Right-click blocks to rotate them around the axis of the face you click. mod.chiselsandbits.help.tape_measure.long=Left-click to and drag to measure spaces. Sneak Use to remove previously created measurements. Use the menu to switch between measurement modes. mod.chiselsandbits.help.bit.long=Left-click to chisel the highlighted area. Right-click to place at the designated area. @@ -144,7 +144,7 @@ chiselsandbits.color.yellow=Yellow chiselsandbits.color.lime=Lime chiselsandbits.color.pink=Pink chiselsandbits.color.gray=Gray -chiselsandbits.color.silver=Silver +chiselsandbits.color.silver=Light Gray chiselsandbits.color.cyan=Cyan chiselsandbits.color.purple=Purple chiselsandbits.color.blue=Blue diff --git a/src/main/resources/assets/chiselsandbits/models/item/bit_bag_dyed.json b/src/main/resources/assets/chiselsandbits/models/item/bit_bag_dyed.json new file mode 100644 index 00000000..e40e390d --- /dev/null +++ b/src/main/resources/assets/chiselsandbits/models/item/bit_bag_dyed.json @@ -0,0 +1,7 @@ +{ + "parent":"item/generated", + "textures": { + "layer0":"chiselsandbits:items/bit_bag_string", + "layer1":"chiselsandbits:items/bit_bag_dyeable" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/chiselsandbits/textures/items/bit_bag_dyeable.png b/src/main/resources/assets/chiselsandbits/textures/items/bit_bag_dyeable.png new file mode 100644 index 0000000000000000000000000000000000000000..7288e1d38aa63e45f05781807b89759257767b88 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QJXPB%t#~Y~TfTxRN zh=u>!2?u$b4MdzbiyEgen>i%0t&1`CUzc-0ZRfLZ(f_Z+GpYU!S*02t@JFVgKt=w) z4r}(>Ag{#E=oH7M&o-+I_rCvqU8s`VzG`mJq|Y`_E%;7at`2NT=jcgMHSlY>UK;wj z{)tKLWz`Kj-FGh=y8Y)(;E-O>BF%8@d4;t@*a5|jtluk)mNeQ{+%~I~PLVDO{T_0t zpNr$ZR*H6-?!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QJXPB%t#~Y}o$J50z z#KM1T_i3&}0X#16|Nozo5X*9K+YhIOt9NaTy{a#