From 7076c78782a22b7a04d4234f4fa426ca0c30e8ca Mon Sep 17 00:00:00 2001 From: Arthur Uzulin Date: Tue, 8 Oct 2013 21:08:46 +1100 Subject: [PATCH] Merge branch 'armor' of https://github.com/mDiyo/TinkersConstruct --- resources/assets/tinker/lang/en_US.xml | 5 + .../textures/items/materials/armor_cast.png | Bin 0 -> 414 bytes .../items/materials/armorcast_boots.png | Bin 0 -> 570 bytes .../items/materials/armorcast_chestplate.png | Bin 0 -> 600 bytes .../items/materials/armorcast_helmet.png | Bin 0 -> 544 bytes .../items/materials/armorcast_leggings.png | Bin 0 -> 527 bytes src/tconstruct/TConstruct.java | 46 +-- src/tconstruct/client/TProxyClient.java | 7 + .../client/armor/RenderArmorCast.java | 231 ++++++++++++++ .../block/CastingBasinSpecialRender.java | 20 +- .../block/CastingTableSpecialRenderer.java | 15 +- src/tconstruct/client/block/SearedRender.java | 64 +++- src/tconstruct/common/TContent.java | 16 +- src/tconstruct/common/TProxyCommon.java | 13 +- src/tconstruct/items/ArmorPattern.java | 52 ++++ src/tconstruct/items/armor/ArmorStandard.java | 25 ++ src/tconstruct/library/ItemBlocklike.java | 3 + src/tconstruct/library/armor/ArmorCore.java | 283 ++++++++++++++++++ .../armor/BehaviorDispenseArmorCopy.java | 52 ++++ .../library/armor/EnumArmorPart.java | 16 + .../library/client/FluidRenderProperties.java | 54 ++++ .../library/crafting/CastingRecipe.java | 5 +- .../library/crafting/LiquidCasting.java | 69 +++-- src/tconstruct/util/config/PHConstruct.java | 2 + 24 files changed, 887 insertions(+), 91 deletions(-) create mode 100644 resources/assets/tinker/textures/items/materials/armor_cast.png create mode 100644 resources/assets/tinker/textures/items/materials/armorcast_boots.png create mode 100644 resources/assets/tinker/textures/items/materials/armorcast_chestplate.png create mode 100644 resources/assets/tinker/textures/items/materials/armorcast_helmet.png create mode 100644 resources/assets/tinker/textures/items/materials/armorcast_leggings.png create mode 100644 src/tconstruct/client/armor/RenderArmorCast.java create mode 100644 src/tconstruct/items/ArmorPattern.java create mode 100644 src/tconstruct/items/armor/ArmorStandard.java create mode 100644 src/tconstruct/library/ItemBlocklike.java create mode 100644 src/tconstruct/library/armor/ArmorCore.java create mode 100644 src/tconstruct/library/armor/BehaviorDispenseArmorCopy.java create mode 100644 src/tconstruct/library/armor/EnumArmorPart.java create mode 100644 src/tconstruct/library/client/FluidRenderProperties.java diff --git a/resources/assets/tinker/lang/en_US.xml b/resources/assets/tinker/lang/en_US.xml index 2edaca8ac75..cc68df0194e 100644 --- a/resources/assets/tinker/lang/en_US.xml +++ b/resources/assets/tinker/lang/en_US.xml @@ -186,6 +186,11 @@ Alumite Nugget Steel Nugget + Helmet Cast + Chestplate Cast + Leggings Cast + Boots Cast + Beef Jerky Bacon Jerky Chicken Jerky diff --git a/resources/assets/tinker/textures/items/materials/armor_cast.png b/resources/assets/tinker/textures/items/materials/armor_cast.png new file mode 100644 index 0000000000000000000000000000000000000000..3b0fc0a9c0e05228e844d584e9688d6a7da0c8a7 GIT binary patch literal 414 zcmV;P0b%}$P)Pu15Jq3Q?9L1z%@sHb7voMGhDBB^7^H}Z6{sg_+f|iC&-9Omtl~{ew)^S(UK!rG z1fc%-8XiuB6A^#`U_DS(l4i0hDG3ol@6OZtJDTY%A_P);;7t@)xvgE8L=T3g- z`|kNJ+_MBAJN#(D0%id-13Un}Fr0I!i-?>M)K%QrW5OB_M z^z)$h_vrB^&N+S`EqeW(S92T10?=wFguGcxeEsgL%nm+SNJq7rs&_T|b*-x16+oJ1 zq-k0Ms+vxxL{S95?T_~Y&~CT8m0AD=2*FciIp)I(pxf<`Bn<%CFFzT;Y<5eYr+A+) zU7{$edS}Pu@womz`|?)GVdan&3r-^%jmG8v-e7&}*|uJMd#(V^IYb12BuS!la^iXq zwtPA{p*i1zR(svw8?3+R@2Yc(s+yS<%YdRNiagJ4a(Sdl=i#aXAIjv#Ya3yHCpNno zN)pAG8U5`YqRz%lMB>VlD??13#LcH$+*}+YBFKE~bULk*S&WZk;3|aBGc&R*TL8+C zNiDas6~}SipP%)rfz9P4o(>0$&X4bGL9Ki|)jKe=|AF_fe*pCPguS0abpQYW07*qo IM6N<$g78-S`~Uy| literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/materials/armorcast_chestplate.png b/resources/assets/tinker/textures/items/materials/armorcast_chestplate.png new file mode 100644 index 0000000000000000000000000000000000000000..4e1afda707de15ba65a17db2c6baa6175d352f8e GIT binary patch literal 600 zcmV-e0;m0nP)2|xlWWU`mDe0zSC#aaJr8A6yAMPaR0OYQcG6-5pAlDoSR!{Kjgt>=FG>ztftOD0+%gg^!6l9YgQ zG#Y6s@&<4>XK^nf0K|}})oSc?x}2T%Wk!ao11Y6Yuh%JxV!Zln+b6f*X*3!%mQz?{ zznJ;iBqT}h9wm8|SVjGjiP;yFD#n^OrbzWr{qK2EqGZ*gSe2OjCc5WE)7;$+&~P|( zGqZU!CCPKnK@!vHbXh_r!_0WOy%U=4bvLs|k493?!>dpf1(F_na5XsO=k>Rx>&KNB mvN=0PQj~PR=BL_t(I%cYaCiWET*hQI2bnVnrl z5Ca1P4{wjt%s|2L-oi{DLlfUd5HayRG*M)cT`{;74iBT1z1f+b?%!Z;W_Q)>3L3hr zy8f!a`fs?R89?*>m68%tLJ|-Gh^_G6<9tTuJMIEjc?pxGMP{m1>XBDKuVFe2`F~lN28H` ze|~O#^6JyGVZYg25JF9iVP}ZuaLx_Y+P2-RURBkw?+3g`!Mlt+&&je3fLo8=B-moy ze)4WOlw~=rp@aVIFD-7qy_BS?TD<7v0t!hXgpluckO9OLFCF4=dgQCsDZqG?6-XLH zBq`6VE95&7Gbk~oh}0?3tP8H!>pf-mGmu2nG`keoOYCVCMKSnyW0Lk~aJKx)uk+J? iewvg0P2s~PyZ{os7VpHvbb$~cM35q?vVf2wGh_Q>F_}rKva45?b$$H(81A_Yp#Snt zRTZfs2`B)REZm*ok?2kch9q*XY}Qvie*NAefF%C@USmO+86kulGrLrQp%KnMYVrfDpMpv7V_lv2n!r@qg5)xdt=VrG;woP=m$ zz6_9a77*IDosXtXt#z6?0z5=gN+&geBzO0zR?G~58t;`lCpS#`ej)hXjxxVjDEsQqIj2Exo z0tle{wZ_a?Jba`n#HMMGbUTC1`U5xD-wq=m=Qe`upzbP5ijwAsCPnvN{{UdA4bF^$ R;bs5;002ovPDHLkV1k2#>7W1r literal 0 HcmV?d00001 diff --git a/src/tconstruct/TConstruct.java b/src/tconstruct/TConstruct.java index d249b8386cc..c7334c8aea3 100644 --- a/src/tconstruct/TConstruct.java +++ b/src/tconstruct/TConstruct.java @@ -1,46 +1,27 @@ package tconstruct; +import cpw.mods.fml.common.*; +import cpw.mods.fml.common.Mod.EventHandler; +import cpw.mods.fml.common.Mod.Instance; +import cpw.mods.fml.common.event.*; +import cpw.mods.fml.common.network.*; +import cpw.mods.fml.common.registry.*; +import cpw.mods.fml.relauncher.Side; import net.minecraft.crash.CallableMinecraftVersion; import net.minecraft.world.gen.structure.MapGenStructureIO; import net.minecraftforge.common.MinecraftForge; import tconstruct.client.event.EventCloakRender; -import tconstruct.common.TContent; -import tconstruct.common.TProxyCommon; +import tconstruct.common.*; import tconstruct.library.TConstructRegistry; -import tconstruct.library.crafting.Detailing; -import tconstruct.library.crafting.LiquidCasting; +import tconstruct.library.crafting.*; import tconstruct.library.util.TabTools; -import tconstruct.util.TCraftingHandler; -import tconstruct.util.TEventHandler; -import tconstruct.util.config.BOPConfig; -import tconstruct.util.config.DimensionBlacklist; -import tconstruct.util.config.PHConstruct; -import tconstruct.util.config.TwilightForestConfig; +import tconstruct.util.*; +import tconstruct.util.config.*; import tconstruct.util.landmine.behavior.Behavior; import tconstruct.util.landmine.behavior.stackCombo.SpecialStackHandler; import tconstruct.util.player.TPlayerHandler; -import tconstruct.worldgen.SlimeIslandGen; -import tconstruct.worldgen.TBaseWorldGenerator; -import tconstruct.worldgen.TerrainGenEventHandler; -import tconstruct.worldgen.village.ComponentSmeltery; -import tconstruct.worldgen.village.ComponentToolWorkshop; -import tconstruct.worldgen.village.TVillageTrades; -import tconstruct.worldgen.village.VillageSmelteryHandler; -import tconstruct.worldgen.village.VillageToolStationHandler; -import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.Mod; -import cpw.mods.fml.common.Mod.EventHandler; -import cpw.mods.fml.common.Mod.Instance; -import cpw.mods.fml.common.SidedProxy; -import cpw.mods.fml.common.event.FMLInitializationEvent; -import cpw.mods.fml.common.event.FMLPostInitializationEvent; -import cpw.mods.fml.common.event.FMLPreInitializationEvent; -import cpw.mods.fml.common.network.NetworkMod; -import cpw.mods.fml.common.network.NetworkRegistry; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.common.registry.VillagerRegistry; -import cpw.mods.fml.common.versioning.ComparableVersion; -import cpw.mods.fml.relauncher.Side; +import tconstruct.worldgen.*; +import tconstruct.worldgen.village.*; /** TConstruct, the tool mod. * Craft your tools with style, then modify until the original is gone! @@ -163,6 +144,7 @@ public void init (FMLInitializationEvent event) @EventHandler public void postInit (FMLPostInitializationEvent evt) { + proxy.postInit(); Behavior.registerBuiltInBehaviors(); SpecialStackHandler.registerBuiltInStackHandlers(); content.modIntegration(); diff --git a/src/tconstruct/client/TProxyClient.java b/src/tconstruct/client/TProxyClient.java index 8a1f39c6c94..d15ca902e69 100644 --- a/src/tconstruct/client/TProxyClient.java +++ b/src/tconstruct/client/TProxyClient.java @@ -27,6 +27,7 @@ import org.w3c.dom.Document; import tconstruct.TConstruct; import tconstruct.blocks.logic.*; +import tconstruct.client.armor.RenderArmorCast; import tconstruct.client.block.*; import tconstruct.client.entity.*; import tconstruct.client.entity.projectile.*; @@ -939,4 +940,10 @@ else if (par1Str.equals("happyVillager")) return null; } } + + @Override + public void postInit() { + MinecraftForgeClient.registerItemRenderer(TContent.armorPattern.itemID, new RenderArmorCast()); + } + } diff --git a/src/tconstruct/client/armor/RenderArmorCast.java b/src/tconstruct/client/armor/RenderArmorCast.java new file mode 100644 index 00000000000..d103f728549 --- /dev/null +++ b/src/tconstruct/client/armor/RenderArmorCast.java @@ -0,0 +1,231 @@ +package tconstruct.client.armor; + +import java.util.*; + +import org.lwjgl.opengl.*; + +import tconstruct.items.ArmorPattern; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Icon; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.common.ForgeDirection; + +public class RenderArmorCast implements IItemRenderer { + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type != ItemRenderType.FIRST_PERSON_MAP; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + switch (helper) { + case BLOCK_3D: + return true; + case ENTITY_BOBBING: + return true; + case ENTITY_ROTATION: + return true; + case EQUIPPED_BLOCK: + return true; + case INVENTORY_BLOCK: + return true; + default: + return false; + } + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + RenderBlocks renderer = Minecraft.getMinecraft().renderGlobal.globalRenderBlocks; + Tessellator tessellator = Tessellator.instance; + Icon baseIcon = item.getItem() instanceof ArmorPattern ? ((ArmorPattern) item.getItem()).getBaseIcon() : item.getIconIndex(); + GL11.glPushMatrix(); + switch (type) { + case ENTITY: + GL11.glScalef(0.8F, 0.33F, 0.8F); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + break; + case INVENTORY: + GL11.glScalef(1F, 0.6F, 1F); + GL11.glTranslatef(0F, -0.1F, 0F); + break; + case EQUIPPED: + GL11.glScalef(1F, 0.6F, 1F); + break; + case EQUIPPED_FIRST_PERSON: + GL11.glScalef(1F, 0.6F, 1F); + break; + default: + break; + } + renderer.setRenderBounds(0.1F, 0.1F, 0.1F, 0.9F, 0.83F, 0.9F); + renderCube(tessellator, renderer, baseIcon); + renderer.setRenderBounds(0.1F, 0.1F, 0.1F, 0.9F, 1.0F, 0.9F); + ArrayList sides = new ArrayList(); + sides.add(ForgeDirection.NORTH); + sides.add(ForgeDirection.SOUTH); + sides.add(ForgeDirection.EAST); + sides.add(ForgeDirection.WEST); + renderSelectedCube(tessellator, renderer, baseIcon, sides); + renderCastTop(item, type); + + GL11.glPopMatrix(); + } + + public void renderCube(Tessellator tessellator, RenderBlocks renderer, Icon icon) { + tessellator.startDrawingQuads(); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg((Block) null, 0F, 0F, 0F, icon); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos((Block) null, 0F, 0F, 0F, icon); + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg((Block) null, 0F, 0F, 0F, icon); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos((Block) null, 0F, 0F, 0F, icon); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg((Block) null, 0F, 0F, 0F, icon); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos((Block) null, 0F, 0F, 0F, icon); + tessellator.draw(); + } + + public void renderSelectedCube(Tessellator tessellator, RenderBlocks renderer, Icon icon, List sidesToRender) { + tessellator.startDrawingQuads(); + tessellator.setNormal(-1F, 0F, 0F); + if (sidesToRender.contains(ForgeDirection.WEST)) + renderer.renderFaceXNeg((Block) null, 0F, 0F, 0F, icon); + tessellator.setNormal(1F, 0F, 0F); + if (sidesToRender.contains(ForgeDirection.EAST)) + renderer.renderFaceXPos((Block) null, 0F, 0F, 0F, icon); + tessellator.setNormal(0F, -1F, 0F); + if (sidesToRender.contains(ForgeDirection.DOWN)) + renderer.renderFaceYNeg((Block) null, 0F, 0F, 0F, icon); + tessellator.setNormal(0F, 1F, 0F); + if (sidesToRender.contains(ForgeDirection.UP)) + renderer.renderFaceYPos((Block) null, 0F, 0F, 0F, icon); + tessellator.setNormal(0F, 0F, -1F); + if (sidesToRender.contains(ForgeDirection.SOUTH)) + renderer.renderFaceZNeg((Block) null, 0F, 0F, 0F, icon); + tessellator.setNormal(0F, 0F, 1F); + if (sidesToRender.contains(ForgeDirection.NORTH)) + renderer.renderFaceZPos((Block) null, 0F, 0F, 0F, icon); + tessellator.draw(); + } + + public void renderCastTop(ItemStack par1ItemStack, ItemRenderType type) { + GL11.glPushMatrix(); + Icon icon = par1ItemStack.getIconIndex(); + + if (icon == null) { + GL11.glPopMatrix(); + return; + } + TextureManager texturemanager = Minecraft.getMinecraft().renderEngine; + texturemanager.bindTexture(texturemanager.getResourceLocation(par1ItemStack.getItemSpriteNumber())); + Tessellator tessellator = Tessellator.instance; + float f = icon.getMinU(); + float f1 = icon.getMaxU(); + float f2 = icon.getMinV(); + float f3 = icon.getMaxV(); + float f4 = 0.0F; + float f5 = 0.3F; + GL11.glTranslatef(-f4, -f5, 0.0F); + float f6 = 1.5F; + GL11.glRotatef(90F, 90F, 0F, 0F); + GL11.glScalef(0.9F, 0.9F, 2F); + GL11.glTranslatef(0.05F, 0.05F, -0.6F); + renderItemIn2D(tessellator, f1, f2, f, f3, icon.getIconWidth(), icon.getIconHeight(), 0.0625F); + GL11.glScalef(0.8F, 0.8F, 0.9F); + GL11.glTranslatef(0.125F, 0.125F, 0.05F); + renderItemIn2D(tessellator, f1, f2, f, f3, icon.getIconWidth(), icon.getIconHeight(), 0.0625F); + GL11.glScalef(0.6F, 0.6F, 0.6F); + GL11.glTranslatef(0.335F, 0.335F, 0.05F); + renderItemIn2D(tessellator, f1, f2, f, f3, icon.getIconWidth(), icon.getIconHeight(), 0.0625F); + + GL11.glPopMatrix(); + } + + public static void renderItemIn2D(Tessellator par0Tessellator, float par1, float par2, float par3, float par4, float par5, float par6, float par7) { + par0Tessellator.startDrawingQuads(); + par0Tessellator.setNormal(0.0F, 0.0F, 1.0F); + par0Tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, (double) par1, (double) par4); + par0Tessellator.addVertexWithUV(1.0D, 0.0D, 0.0D, (double) par3, (double) par4); + par0Tessellator.addVertexWithUV(1.0D, 1.0D, 0.0D, (double) par3, (double) par2); + par0Tessellator.addVertexWithUV(0.0D, 1.0D, 0.0D, (double) par1, (double) par2); + par0Tessellator.draw(); + par0Tessellator.startDrawingQuads(); + par0Tessellator.setNormal(0.0F, 0.0F, -1.0F); + par0Tessellator.addVertexWithUV(0.0D, 1.0D, (double) (0.0F - par7), (double) par1, (double) par2); + par0Tessellator.addVertexWithUV(1.0D, 1.0D, (double) (0.0F - par7), (double) par3, (double) par2); + par0Tessellator.addVertexWithUV(1.0D, 0.0D, (double) (0.0F - par7), (double) par3, (double) par4); + par0Tessellator.addVertexWithUV(0.0D, 0.0D, (double) (0.0F - par7), (double) par1, (double) par4); + par0Tessellator.draw(); + float f5 = 0.5F * (par1 - par3) / (float) par5; + float f6 = 0.5F * (par4 - par2) / (float) par6; + par0Tessellator.startDrawingQuads(); + par0Tessellator.setNormal(-1.0F, 0.0F, 0.0F); + int k; + float f7; + float f8; + + for (k = 0; k < par5; ++k) { + f7 = (float) k / (float) par5; + f8 = par1 + (par3 - par1) * f7 - f5; + par0Tessellator.addVertexWithUV((double) f7, 0.0D, (double) (0.0F - par7), (double) f8, (double) par4); + par0Tessellator.addVertexWithUV((double) f7, 0.0D, 0.0D, (double) f8, (double) par4); + par0Tessellator.addVertexWithUV((double) f7, 1.0D, 0.0D, (double) f8, (double) par2); + par0Tessellator.addVertexWithUV((double) f7, 1.0D, (double) (0.0F - par7), (double) f8, (double) par2); + } + + par0Tessellator.draw(); + par0Tessellator.startDrawingQuads(); + par0Tessellator.setNormal(1.0F, 0.0F, 0.0F); + float f9; + + for (k = 0; k < par5; ++k) { + f7 = (float) k / (float) par5; + f8 = par1 + (par3 - par1) * f7 - f5; + f9 = f7 + 1.0F / (float) par5; + par0Tessellator.addVertexWithUV((double) f9, 1.0D, (double) (0.0F - par7), (double) f8, (double) par2); + par0Tessellator.addVertexWithUV((double) f9, 1.0D, 0.0D, (double) f8, (double) par2); + par0Tessellator.addVertexWithUV((double) f9, 0.0D, 0.0D, (double) f8, (double) par4); + par0Tessellator.addVertexWithUV((double) f9, 0.0D, (double) (0.0F - par7), (double) f8, (double) par4); + } + + par0Tessellator.draw(); + par0Tessellator.startDrawingQuads(); + par0Tessellator.setNormal(0.0F, 1.0F, 0.0F); + + for (k = 0; k < par6; ++k) { + f7 = (float) k / (float) par6; + f8 = par4 + (par2 - par4) * f7 - f6; + f9 = f7 + 1.0F / (float) par6; + par0Tessellator.addVertexWithUV(0.0D, (double) f9, 0.0D, (double) par1, (double) f8); + par0Tessellator.addVertexWithUV(1.0D, (double) f9, 0.0D, (double) par3, (double) f8); + par0Tessellator.addVertexWithUV(1.0D, (double) f9, (double) (0.0F - par7), (double) par3, (double) f8); + par0Tessellator.addVertexWithUV(0.0D, (double) f9, (double) (0.0F - par7), (double) par1, (double) f8); + } + + par0Tessellator.draw(); + par0Tessellator.startDrawingQuads(); + par0Tessellator.setNormal(0.0F, -1.0F, 0.0F); + + for (k = 0; k < par6; ++k) { + f7 = (float) k / (float) par6; + f8 = par4 + (par2 - par4) * f7 - f6; + par0Tessellator.addVertexWithUV(1.0D, (double) f7, 0.0D, (double) par3, (double) f8); + par0Tessellator.addVertexWithUV(0.0D, (double) f7, 0.0D, (double) par1, (double) f8); + par0Tessellator.addVertexWithUV(0.0D, (double) f7, (double) (0.0F - par7), (double) par1, (double) f8); + par0Tessellator.addVertexWithUV(1.0D, (double) f7, (double) (0.0F - par7), (double) par3, (double) f8); + } + + par0Tessellator.draw(); + } + +} \ No newline at end of file diff --git a/src/tconstruct/client/block/CastingBasinSpecialRender.java b/src/tconstruct/client/block/CastingBasinSpecialRender.java index 263fd3cd138..22d3456d56f 100644 --- a/src/tconstruct/client/block/CastingBasinSpecialRender.java +++ b/src/tconstruct/client/block/CastingBasinSpecialRender.java @@ -1,19 +1,14 @@ package tconstruct.client.block; -import net.minecraft.client.renderer.entity.RenderItem; -import net.minecraft.client.renderer.entity.RenderManager; +import cpw.mods.fml.relauncher.*; +import net.minecraft.client.renderer.entity.*; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; +import net.minecraft.item.*; import net.minecraft.tileentity.TileEntity; - import org.lwjgl.opengl.GL11; - import tconstruct.blocks.logic.CastingBasinLogic; import tconstruct.entity.FancyEntityItem; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import tconstruct.library.ItemBlocklike; /* Special renderer, only used for drawing tools */ @@ -58,7 +53,12 @@ void renderItem (CastingBasinLogic logic, ItemStack stack) { GL11.glScalef(1.6F, 1.6F, 1.6F); GL11.glTranslatef(0F, 0.045F, 0.0f); - } + } else if (!(stack.getItem() instanceof ItemBlocklike)) { + GL11.glRotatef(90F, 1F, 0F, 0F); + GL11.glRotatef(90F, 0F, 0F, 1F); + GL11.glScalef(0.75F, 0.75F, 0.75F); + GL11.glTranslatef(0F, -0.235F, -0.36F); + } RenderItem.renderInFrame = true; RenderManager.instance.renderEntityWithPosYaw(entityitem, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F); diff --git a/src/tconstruct/client/block/CastingTableSpecialRenderer.java b/src/tconstruct/client/block/CastingTableSpecialRenderer.java index 24a83ef0bea..7fdcf608ddd 100644 --- a/src/tconstruct/client/block/CastingTableSpecialRenderer.java +++ b/src/tconstruct/client/block/CastingTableSpecialRenderer.java @@ -1,19 +1,14 @@ package tconstruct.client.block; -import net.minecraft.client.renderer.entity.RenderItem; -import net.minecraft.client.renderer.entity.RenderManager; +import cpw.mods.fml.relauncher.*; +import net.minecraft.client.renderer.entity.*; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; +import net.minecraft.item.*; import net.minecraft.tileentity.TileEntity; - import org.lwjgl.opengl.GL11; - import tconstruct.blocks.logic.CastingTableLogic; import tconstruct.entity.FancyEntityItem; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import tconstruct.library.ItemBlocklike; /* Special renderer, only used for drawing tools */ @@ -60,7 +55,7 @@ void renderItem (CastingTableLogic logic, ItemStack stack) GL11.glTranslatef(1F, 1.48F, 0.55F); GL11.glRotatef(90F, 1, 0F, 0F); GL11.glScalef(2F, 2F, 2F); - if (stack.getItem() instanceof ItemBlock) + if (stack.getItem() instanceof ItemBlock || stack.getItem() instanceof ItemBlocklike) { GL11.glRotatef(90F, -1, 0F, 0F); GL11.glTranslatef(0F, -0.1F, 0.2275F); diff --git a/src/tconstruct/client/block/SearedRender.java b/src/tconstruct/client/block/SearedRender.java index c6ece04f392..7c71e5dd5ff 100644 --- a/src/tconstruct/client/block/SearedRender.java +++ b/src/tconstruct/client/block/SearedRender.java @@ -1,17 +1,16 @@ package tconstruct.client.block; -import tconstruct.blocks.logic.CastingBasinLogic; -import tconstruct.blocks.logic.CastingTableLogic; -import tconstruct.blocks.logic.FaucetLogic; -import tconstruct.client.TProxyClient; -import tconstruct.common.TContent; +import cpw.mods.fml.client.registry.*; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.world.IBlockAccess; import net.minecraftforge.fluids.Fluid; -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; -import cpw.mods.fml.client.registry.RenderingRegistry; +import tconstruct.TConstruct; +import tconstruct.blocks.logic.*; +import tconstruct.client.TProxyClient; +import tconstruct.common.TContent; +import tconstruct.library.crafting.CastingRecipe; public class SearedRender implements ISimpleBlockRenderingHandler { @@ -163,8 +162,30 @@ public boolean renderWorldBlock (IBlockAccess world, int x, int y, int z, Block CastingTableLogic logic = (CastingTableLogic) world.getBlockTileEntity(x, y, z); if (logic.liquid != null) { + float minHeight = 0.9375F; + float maxHeight = 1F; + + float minX = 0.0625F; + float maxX = 0.9375F; + float minZ = 0.0625F; + float maxZ = 0.9375F; + + ItemStack it = logic.getStackInSlot(0); + if(it != null){ + CastingRecipe rec = TConstruct.tableCasting.getCastingRecipe(logic.liquid, it); + if(rec != null){ + minHeight = rec.fluidRenderProperties.minHeight; + maxHeight = rec.fluidRenderProperties.maxHeight; + + minX = rec.fluidRenderProperties.minX; + maxX = rec.fluidRenderProperties.maxX; + minZ = rec.fluidRenderProperties.minZ; + maxZ = rec.fluidRenderProperties.maxZ; + } + } + float height = logic.getLiquidAmount() / (logic.getCapacity() * 1.03F) / 16F; - renderer.setRenderBounds(0.0625F, 0.9375F, 0.0625F, 0.9375F, 0.9375F + height, 0.9375F); + renderer.setRenderBounds(minX, minHeight, minZ, maxX, minHeight + height, maxZ); Fluid fluid = logic.liquid.getFluid(); BlockSkinRenderHelper.renderLiquidBlock(fluid.getStillIcon(), fluid.getFlowingIcon(), x, y, z, renderer, world); @@ -356,8 +377,29 @@ else if (metadata == 2) CastingBasinLogic logic = (CastingBasinLogic) world.getBlockTileEntity(x, y, z); if (logic.liquid != null) { - float height = logic.getLiquidAmount() / (logic.getCapacity() * 1.05F) * 0.6875F; - renderer.setRenderBounds(0.0625F, 0.25f, 0.0625F, 0.9375F, 0.25f + height, 0.9375F); + float minHeight = 0.25F; + float maxHeight = 0.95F; + + float minX = 0.0625F; + float maxX = 0.9375F; + float minZ = 0.0625F; + float maxZ = 0.9375F; + + ItemStack it = logic.getStackInSlot(0); + if(it != null){ + CastingRecipe rec = TConstruct.basinCasting.getCastingRecipe(logic.liquid, it); + if(rec != null){ + minHeight = rec.fluidRenderProperties.minHeight; + maxHeight = rec.fluidRenderProperties.maxHeight; + + minX = rec.fluidRenderProperties.minX; + maxX = rec.fluidRenderProperties.maxX; + minZ = rec.fluidRenderProperties.minZ; + maxZ = rec.fluidRenderProperties.maxZ; + } + } + float height = (logic.getLiquidAmount() / (logic.getCapacity() * 1.05F) * 0.6875F) / maxHeight; + renderer.setRenderBounds(minX, minHeight, minZ, maxX, minHeight + height, maxZ); Fluid fluid = logic.liquid.getFluid(); BlockSkinRenderHelper.renderLiquidBlock(fluid.getStillIcon(), fluid.getFlowingIcon(), x, y, z, renderer, world); diff --git a/src/tconstruct/common/TContent.java b/src/tconstruct/common/TContent.java index 969eb1960d5..a5b98d4e330 100644 --- a/src/tconstruct/common/TContent.java +++ b/src/tconstruct/common/TContent.java @@ -4,7 +4,6 @@ import cpw.mods.fml.common.event.FMLInterModComms; import cpw.mods.fml.common.registry.*; import java.lang.reflect.Field; - import java.util.*; import net.minecraft.block.*; import net.minecraft.block.material.*; @@ -48,6 +47,7 @@ public class TContent implements IFuelHandler public static Item toolShard; public static Item woodPattern; public static Item metalPattern; + public static Item armorPattern; public static Item manualBook; public static Item buckets; @@ -264,6 +264,9 @@ public class TContent implements IFuelHandler public static ChestGenHooks tinkerHouseChest; public static ChestGenHooks tinkerHousePatterns; + //Temporary items + //public static Item armorTest = new ArmorStandard(2445, 4, EnumArmorPart.HELMET).setCreativeTab(CreativeTabs.tabAllSearch); + public TContent() { registerItems(); @@ -765,10 +768,12 @@ void registerItems () toolShard = new ToolShard(PHConstruct.toolShard, "_chunk").setUnlocalizedName("tconstruct.ToolShard"); woodPattern = new Pattern(PHConstruct.woodPattern, "WoodPattern", "pattern_", "materials/").setUnlocalizedName("tconstruct.Pattern"); metalPattern = new MetalPattern(PHConstruct.metalPattern, "MetalPattern", "cast_", "materials/").setUnlocalizedName("tconstruct.MetalPattern"); - + armorPattern = new ArmorPattern(PHConstruct.armorPattern, "ArmorPattern", "armorcast_", "materials/").setUnlocalizedName("tconstruct.ArmorPattern"); + TConstructRegistry.addItemToDirectory("blankPattern", blankPattern); TConstructRegistry.addItemToDirectory("woodPattern", woodPattern); TConstructRegistry.addItemToDirectory("metalPattern", metalPattern); + TConstructRegistry.addItemToDirectory("armorPattern", armorPattern); String[] patternTypes = { "ingot", "toolRod", "pickaxeHead", "shovelHead", "hatchetHead", "swordBlade", "wideGuard", "handGuard", "crossbar", "binding", "frypanHead", "signHead", "knifeBlade", "chiselHead", "toughRod", "toughBinding", "largePlate", "broadAxeHead", "scytheHead", "excavatorHead", "largeBlade", "hammerHead", "fullGuard" }; @@ -781,6 +786,10 @@ void registerItems () { TConstructRegistry.addItemStackToDirectory(patternTypes[i] + "Cast", new ItemStack(metalPattern, 1, i)); } + String[] armorPartTypes = { "helmet", "chestplate", "leggings", "boots" }; + for (int i = 1; i < armorPartTypes.length; i++) { + TConstructRegistry.addItemStackToDirectory(armorPartTypes[i] + "Cast", new ItemStack(armorPattern, 1, i)); + } manualBook = new Manual(PHConstruct.manual); buckets = new FilledBucket(PHConstruct.buckets); @@ -1261,6 +1270,9 @@ void addCraftingRecipes () basinCasting.addCastingRecipe(new ItemStack(Block.whiteStone), new FluidStack(moltenEnderFluid, 25), new ItemStack(Block.obsidian), true, 100); //endstone basinCasting.addCastingRecipe(new ItemStack(metalBlock.blockID, 1, 10), new FluidStack(moltenEnderFluid, 1000), null, true, 100); //ender + //TODO TEST +// basinCasting.addCastingRecipe(new ItemStack(armorTest), new FluidStack(moltenIronFluid, TConstruct.ingotLiquidValue * 24), new ItemStack(armorPattern, 1, 0), false, 100, new FluidRenderProperties(0.5F, 0.575F, 0.15F, 0.85F, 0.15F, 0.85F)); + //Ore Smeltery.addMelting(Block.oreIron, 0, 600, new FluidStack(moltenIronFluid, TConstruct.ingotLiquidValue * 2)); Smeltery.addMelting(Block.oreGold, 0, 400, new FluidStack(moltenGoldFluid, TConstruct.ingotLiquidValue * 2)); diff --git a/src/tconstruct/common/TProxyCommon.java b/src/tconstruct/common/TProxyCommon.java index a8e80d3b7b4..c3097584ef7 100644 --- a/src/tconstruct/common/TProxyCommon.java +++ b/src/tconstruct/common/TProxyCommon.java @@ -1,18 +1,15 @@ package tconstruct.common; -import net.minecraft.entity.Entity; +import cpw.mods.fml.common.network.IGuiHandler; +import cpw.mods.fml.common.registry.LanguageRegistry; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import tconstruct.TConstruct; import tconstruct.blocks.logic.TileEntityLandmine; -import tconstruct.inventory.ArmorExtendedContainer; -import tconstruct.inventory.ContainerLandmine; -import tconstruct.inventory.KnapsackContainer; +import tconstruct.inventory.*; import tconstruct.library.blocks.InventoryLogic; import tconstruct.util.player.TPlayerStats; -import cpw.mods.fml.common.network.IGuiHandler; -import cpw.mods.fml.common.registry.LanguageRegistry; /** * Common proxy class for InfiTools @@ -222,4 +219,8 @@ public void spawnParticle (String slimeParticle, double xPos, double yPos, doubl public static final String[] patternNames = new String[] { "Ingot", "Tool Rod", "Pickaxe Head", "Shovel Head", "Axe Head", "Sword Blade", "Wide Guard", "Hand Guard", "Crossbar", "Tool Binding", "Pan", "Board", "Knife Blade", "Chisel Head", "Tough Tool Rod", "Tough Binding", "Large Plate", "Broad Axe Head", "Scythe Head", "Broad Shovel Head", "Large Blade", "Hammer Head", "Full Guard", "Bowstring", "Fletching", "Arrowhead" }; + + public void postInit(){ + + } } diff --git a/src/tconstruct/items/ArmorPattern.java b/src/tconstruct/items/ArmorPattern.java new file mode 100644 index 00000000000..3dddce1c4ce --- /dev/null +++ b/src/tconstruct/items/ArmorPattern.java @@ -0,0 +1,52 @@ +package tconstruct.items; + +import java.util.List; + +import cpw.mods.fml.relauncher.*; + +import tconstruct.library.ItemBlocklike; + +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Icon; + +public class ArmorPattern extends CraftingItem implements ItemBlocklike{ + + private Icon baseIcon; + + public ArmorPattern(int id, String partType, String patternType, String folder) { + super(id, patternName, getPatternNames(patternType), folder); + this.setHasSubtypes(true); + this.setMaxDamage(0); + this.setContainerItem(this); + this.setMaxStackSize(1); + } + + protected static String[] getPatternNames (String partType){ + String[] names = new String[patternName.length]; + for (int i = 0; i < patternName.length; i++) + names[i] = partType + patternName[i]; + return names; + } + + public Icon getBaseIcon(){ + return baseIcon; + } + + @SideOnly(Side.CLIENT) + @Override + public void registerIcons (IconRegister iconRegister){ + super.registerIcons(iconRegister); + baseIcon = iconRegister.registerIcon("tinker:" + folder + "armor_cast"); + } + + private static final String[] patternName = new String[] { "helmet", "chestplate", "leggings", "boots" }; + + public void getSubItems (int id, CreativeTabs tab, List list){ + for (int i = 0; i < patternName.length; i++){ + list.add(new ItemStack(id, 1, i)); + } + } + +} \ No newline at end of file diff --git a/src/tconstruct/items/armor/ArmorStandard.java b/src/tconstruct/items/armor/ArmorStandard.java new file mode 100644 index 00000000000..af9ee384bb5 --- /dev/null +++ b/src/tconstruct/items/armor/ArmorStandard.java @@ -0,0 +1,25 @@ +package tconstruct.items.armor; + +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; + +import net.minecraft.client.renderer.texture.IconRegister; +import tconstruct.library.armor.*; + +public class ArmorStandard extends ArmorCore{ + + public ArmorStandard(int par1, int baseProtection, EnumArmorPart armorPart) { + super(par1, baseProtection, armorPart); + } + + @Override + public void registerIcons(IconRegister par1IconRegister){ + this.itemIcon = par1IconRegister.registerIcon("tinker:armor/wood_helmet"); + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, int slot, int layer){ + return "tinker:textures/armor/wood_" + layer + ".png"; + } + +} \ No newline at end of file diff --git a/src/tconstruct/library/ItemBlocklike.java b/src/tconstruct/library/ItemBlocklike.java new file mode 100644 index 00000000000..4e479445cd2 --- /dev/null +++ b/src/tconstruct/library/ItemBlocklike.java @@ -0,0 +1,3 @@ +package tconstruct.library; + +public interface ItemBlocklike {} diff --git a/src/tconstruct/library/armor/ArmorCore.java b/src/tconstruct/library/armor/ArmorCore.java new file mode 100644 index 00000000000..74e7ab24c14 --- /dev/null +++ b/src/tconstruct/library/armor/ArmorCore.java @@ -0,0 +1,283 @@ +package tconstruct.library.armor; + +import ic2.api.item.*; +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.IBehaviorDispenseItem; +import net.minecraft.entity.*; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.*; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import net.minecraftforge.common.ISpecialArmor; + +/** + * NBTTags + * Main tag - InfiArmor + */ +public abstract class ArmorCore extends ItemArmor implements ICustomElectricItem, IBoxable, ISpecialArmor { + + public static final String SET_NAME = "InfiArmor"; + public final EnumArmorPart armorPart; + private static final IBehaviorDispenseItem dispenserBehavior = new BehaviorDispenseArmorCopy(); + public final int baseProtection; + + public ArmorCore(int par1, int baseProtection, EnumArmorPart part) { + super(par1, EnumArmorMaterial.CHAIN, 0, 0); + this.maxStackSize = 1; + this.setMaxDamage(100); + this.setUnlocalizedName(SET_NAME); + this.armorPart = part; + this.baseProtection = baseProtection; + BlockDispenser.dispenseBehaviorRegistry.putObject(this, dispenserBehavior); + } + + public String getArmorName() { + return this.getClass().getSimpleName(); + } + + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { + int i = EntityLiving.getArmorPosition(par1ItemStack) - 1; + ItemStack itemstack1 = par3EntityPlayer.getCurrentArmor(i); + + if (itemstack1 == null) { + par3EntityPlayer.setCurrentItemOrArmor(i + 1, par1ItemStack.copy()); //Forge: Vanilla bug fix associated with fixed setCurrentItemOrArmor indexs for players. + par1ItemStack.stackSize = 0; + } + + return par1ItemStack; + } + + //ISpecialArmor overrides + @Override + public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, int slot) { + NBTTagCompound tags = armor.getTagCompound(); + + if (tags == null) { + return new ArmorProperties(0, damage / baseProtection, baseProtection); + } + + NBTTagCompound data = tags.getCompoundTag(SET_NAME); + + return new ArmorProperties(0, data.getInteger("damageReduction") / damage, data.getInteger("maxAbsorb")); + } + + @Override + public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) { + return armor.getTagCompound() != null && armor.getTagCompound().getCompoundTag(SET_NAME) != null ? armor.getTagCompound().getCompoundTag(SET_NAME).getInteger("maxAbsorb") : this.baseProtection; + } + + @Override + public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) { + NBTTagCompound tags = stack.getTagCompound(); + NBTTagCompound data; + + if (tags == null) { + tags = new NBTTagCompound(); + stack.setTagCompound(tags); + data = new NBTTagCompound(); + tags.setCompoundTag(SET_NAME, data); + data.setInteger("damageReduction", baseProtection); + data.setInteger("maxAbsorb", baseProtection); + } + + data = tags.getCompoundTag(SET_NAME); + + if (tags.hasKey("charge")) { + int charge = tags.getInteger("charge"); + if (charge > damage) { + charge -= damage; + tags.setInteger("charge", charge); + return; + } else { + damage -= charge; + tags.setInteger("charge", 0); + int dmg = data.getInteger("Damage"); + dmg += damage; + data.setInteger("Damage", dmg); + } + + } else { + int dmg = data.getInteger("Damage"); + dmg += damage; + data.setInteger("Damage", dmg); + } + } + + /* + * IC2 API support + */ + + @Override + public boolean canBeStoredInToolbox(ItemStack stack) { + return true; + } + + @Override + public boolean canProvideEnergy(ItemStack stack) { + NBTTagCompound tags = stack.getTagCompound(); + + return tags.hasKey("charge"); + } + + @Override + public int getChargedItemId(ItemStack stack) { + return this.itemID; + } + + @Override + public int getEmptyItemId(ItemStack stack) { + return this.itemID; + } + + @Override + public int getMaxCharge(ItemStack stack) { + NBTTagCompound tags = stack.getTagCompound(); + return tags.hasKey("charge") ? 10000 : 0; + } + + @Override + public int getTier(ItemStack stack) { + return 0; + } + + @Override + public int getTransferLimit(ItemStack stack) { + NBTTagCompound tags = stack.getTagCompound(); + + return tags.hasKey("charge") ? 32 : 0; + } + + @Override + public int charge(ItemStack stack, int amount, int tier, boolean ignoreTransferLimit, boolean simulate) { + NBTTagCompound tags = stack.getTagCompound(); + if (!tags.hasKey("charge")) { + return 0; + } + + if (amount > 0) { + if (amount > getTransferLimit(stack) && !ignoreTransferLimit) { + amount = getTransferLimit(stack); + } + + int charge = tags.getInteger("charge"); + + if (amount > getMaxCharge(stack)) { + amount = getMaxCharge(stack); + } + + charge += amount; + + if (!simulate) { + tags.setInteger("charge", charge); + stack.setItemDamage(1 + (getMaxCharge(stack) - charge) * (stack.getMaxDamage() - 2) / getMaxCharge(stack)); + } + return amount; + } + + else + return 0; + } + + @Override + public int discharge(ItemStack stack, int amount, int tier, boolean ignoreTransferLimit, boolean simulate) { + NBTTagCompound tags = stack.getTagCompound(); + if (!tags.hasKey("charge")) { + return 0; + } + + if (amount > 0) { + if (amount > getTransferLimit(stack)) { + amount = getTransferLimit(stack); + } + + int charge = tags.getInteger("charge"); + + if (amount > charge) { + amount = charge; + } + + charge -= amount; + + if (!simulate) { + tags.setInteger("charge", charge); + stack.setItemDamage(1 + (getMaxCharge(stack) - charge) * (stack.getMaxDamage() - 1) / getMaxCharge(stack)); + } + + return charge; + } + + else + return 0; + } + + @Override + public boolean canUse(ItemStack stack, int amount) { + return false; + } + + @Override + public boolean canShowChargeToolTip(ItemStack stack) { + return false; + } + + // Vanilla overrides + public boolean isItemTool(ItemStack par1ItemStack) { + return false; + } + + @Override + public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) { + return false; + } + + public boolean isRepairable() { + return false; + } + + public int getItemEnchantability() { + return 0; + } + + public boolean isFull3D() { + return true; + } + + public boolean isValidArmor(ItemStack stack, int armorType, Entity entity) { + return this.armorPart.getPartId() == armorType; + } + + /* Proper stack damage */ + public int getItemMaxDamageFromStack(ItemStack stack) { + NBTTagCompound tags = stack.getTagCompound(); + if (tags == null) { + return 0; + } + + if (tags.hasKey("charge")) { + int charge = tags.getInteger("charge"); + if (charge > 0) { + return this.getMaxCharge(stack); + } + } + + return tags.getCompoundTag(SET_NAME).getInteger("TotalDurability"); + } + + public int getItemMaxDamageFromStackForDisplay(ItemStack stack) { + NBTTagCompound tags = stack.getTagCompound(); + if (tags == null) { + return 0; + } + + if (tags.hasKey("charge")) { + int charge = tags.getInteger("charge"); + if (charge > 0) { + return this.getMaxCharge(stack) - charge; + } + } + + return tags.getCompoundTag(SET_NAME).getInteger("Damage"); + } + +} \ No newline at end of file diff --git a/src/tconstruct/library/armor/BehaviorDispenseArmorCopy.java b/src/tconstruct/library/armor/BehaviorDispenseArmorCopy.java new file mode 100644 index 00000000000..4389496dff4 --- /dev/null +++ b/src/tconstruct/library/armor/BehaviorDispenseArmorCopy.java @@ -0,0 +1,52 @@ +package tconstruct.library.armor; + +import java.util.List; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.BehaviorDefaultDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.EntitySelectorArmoredMob; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumFacing; + +final class BehaviorDispenseArmorCopy extends BehaviorDefaultDispenseItem +{ + /** + * Dispense the specified stack, play the dispense sound and spawn particles. + */ + protected ItemStack dispenseStack(IBlockSource par1IBlockSource, ItemStack par2ItemStack) + { + EnumFacing enumfacing = BlockDispenser.getFacing(par1IBlockSource.getBlockMetadata()); + int i = par1IBlockSource.getXInt() + enumfacing.getFrontOffsetX(); + int j = par1IBlockSource.getYInt() + enumfacing.getFrontOffsetY(); + int k = par1IBlockSource.getZInt() + enumfacing.getFrontOffsetZ(); + AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB((double)i, (double)j, (double)k, (double)(i + 1), (double)(j + 1), (double)(k + 1)); + List list = par1IBlockSource.getWorld().selectEntitiesWithinAABB(EntityLivingBase.class, axisalignedbb, new EntitySelectorArmoredMob(par2ItemStack)); + + if (list.size() > 0) + { + EntityLivingBase entitylivingbase = (EntityLivingBase)list.get(0); + int l = entitylivingbase instanceof EntityPlayer ? 1 : 0; + int i1 = EntityLiving.getArmorPosition(par2ItemStack); + ItemStack itemstack1 = par2ItemStack.copy(); + itemstack1.stackSize = 1; + entitylivingbase.setCurrentItemOrArmor(i1, itemstack1); //BUGFIX Forge: Vanilla bug fix associated with fixed setCurrentItemOrArmor indexs for players. + + if (entitylivingbase instanceof EntityLiving) + { + ((EntityLiving)entitylivingbase).setEquipmentDropChance(i1, 2.0F); + } + + --par2ItemStack.stackSize; + return par2ItemStack; + } + else + { + return super.dispenseStack(par1IBlockSource, par2ItemStack); + } + } +} \ No newline at end of file diff --git a/src/tconstruct/library/armor/EnumArmorPart.java b/src/tconstruct/library/armor/EnumArmorPart.java new file mode 100644 index 00000000000..d60d6cbc065 --- /dev/null +++ b/src/tconstruct/library/armor/EnumArmorPart.java @@ -0,0 +1,16 @@ +package tconstruct.library.armor; + +public enum EnumArmorPart { + + HELMET(0), CHESTPLATE(1), LEGGINGS(2), BOOTS(3); + + private final int partID; + + private EnumArmorPart(int partID) { + this.partID = partID; + } + + public int getPartId() { + return this.partID; + } +} \ No newline at end of file diff --git a/src/tconstruct/library/client/FluidRenderProperties.java b/src/tconstruct/library/client/FluidRenderProperties.java new file mode 100644 index 00000000000..bba9e77402d --- /dev/null +++ b/src/tconstruct/library/client/FluidRenderProperties.java @@ -0,0 +1,54 @@ +package tconstruct.library.client; + +public class FluidRenderProperties { + + //Constant defaults + public static final FluidRenderProperties DEFAULT_TABLE = new FluidRenderProperties(Applications.TABLE); + public static final FluidRenderProperties DEFAULT_BASIN = new FluidRenderProperties(Applications.BASIN); + + public float minHeight, maxHeight, minX, maxX, minZ, maxZ; + + public FluidRenderProperties(float minHeight, float maxHeight, float minX, float maxX, float minZ, float maxZ) { + this.minHeight = minHeight; + this.maxHeight = maxHeight; + this.minX = minX; + this.maxX = maxX; + this.minZ = minZ; + this.maxZ = maxZ; + } + + public FluidRenderProperties(float minHeight, float maxHeight, Applications defaults) { + this(minHeight, maxHeight, defaults.minX, defaults.maxX, defaults.minZ, defaults.maxZ); + } + + public FluidRenderProperties(float minHeight, float maxHeight, float minX, float maxX, Applications defaults) { + this(minHeight, maxHeight, minX, maxX, defaults.minZ, defaults.maxZ); + } + + public FluidRenderProperties(Applications defaults, float minX, float maxX) { + this(defaults.minHeight, defaults.maxHeight, minX, maxX, defaults.minZ, defaults.maxZ); + } + + public FluidRenderProperties(Applications defaults, float minX, float maxX, float minZ, float maxZ) { + this(defaults.minHeight, defaults.maxHeight, minX, maxX, minZ, maxZ); + } + + public FluidRenderProperties(Applications defaults) { + this(defaults.minHeight, defaults.maxHeight, defaults.minX, defaults.maxX, defaults.minZ, defaults.maxZ); + } + + public static enum Applications { + TABLE(0.9375F, 1F, 0.0625F, 0.9375F, 0.0625F, 0.9375F), BASIN(0.25F, 0.95F, 0.0625F, 0.9375F, 0.0625F, 0.9375F); + + float minHeight, maxHeight, minX, maxX, minZ, maxZ; + + Applications(float minHeight, float maxHeight, float minX, float maxX, float minZ, float maxZ) { + this.minHeight = minHeight; + this.maxHeight = maxHeight; + this.minX = minX; + this.maxX = maxX; + this.minZ = minZ; + this.maxZ = maxZ; + } + } +} \ No newline at end of file diff --git a/src/tconstruct/library/crafting/CastingRecipe.java b/src/tconstruct/library/crafting/CastingRecipe.java index d2065da770b..315e4d3bde7 100644 --- a/src/tconstruct/library/crafting/CastingRecipe.java +++ b/src/tconstruct/library/crafting/CastingRecipe.java @@ -2,6 +2,7 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; +import tconstruct.library.client.FluidRenderProperties; public class CastingRecipe { @@ -10,14 +11,16 @@ public class CastingRecipe public ItemStack cast; public boolean consumeCast; public int coolTime; + public FluidRenderProperties fluidRenderProperties; - public CastingRecipe(ItemStack replacement, FluidStack metal, ItemStack cast, boolean consume, int delay) + public CastingRecipe(ItemStack replacement, FluidStack metal, ItemStack cast, boolean consume, int delay, FluidRenderProperties props) { castingMetal = metal; this.cast = cast; output = replacement; consumeCast = consume; coolTime = delay; + fluidRenderProperties = props; } public boolean matches (FluidStack metal, ItemStack inputCast) diff --git a/src/tconstruct/library/crafting/LiquidCasting.java b/src/tconstruct/library/crafting/LiquidCasting.java index b3bf536fc7a..ab615e79afc 100644 --- a/src/tconstruct/library/crafting/LiquidCasting.java +++ b/src/tconstruct/library/crafting/LiquidCasting.java @@ -1,9 +1,11 @@ package tconstruct.library.crafting; -import java.util.ArrayList; +import tconstruct.library.client.FluidRenderProperties.Applications; +import java.util.ArrayList; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; +import tconstruct.library.client.FluidRenderProperties; /* Melting becomes hardened */ public class LiquidCasting @@ -18,10 +20,22 @@ public class LiquidCasting * @param cast The empty item to cast with. ex Ingot Cast * @param consume Whether the item should be consumed while casting * @param delay Time to cast in ticks + * @param props The rendering properties for the casting fluid (may be null) */ - public void addCastingRecipe (ItemStack output, FluidStack metal, ItemStack cast, boolean consume, int delay) - { - casts.add(new CastingRecipe(output, metal, cast, consume, delay)); + public void addCastingRecipe (ItemStack output, FluidStack metal, ItemStack cast, boolean consume, int delay, FluidRenderProperties props){ + casts.add(new CastingRecipe(output, metal, cast, consume, delay, props)); + } + + /** Adds a casting recipe + * + * @param output Result of the cast + * @param metal Liquid to be used in casting. This also decides how much metal is consumed + * @param cast The empty item to cast with. ex Ingot Cast + * @param consume Whether the item should be consumed while casting + * @param delay Time to cast in ticks + */ + public void addCastingRecipe (ItemStack output, FluidStack metal, ItemStack cast, boolean consume, int delay){ + addCastingRecipe(output, metal, cast, consume, delay, null); } /** Adds a casting recipe. Does not consume the cast @@ -30,10 +44,21 @@ public void addCastingRecipe (ItemStack output, FluidStack metal, ItemStack cast * @param metal Liquid to be used in casting. This also decides how much metal is consumed * @param cast The empty item to cast with. ex Ingot Cast * @param delay Time to cast in ticks + * @param props The rendering properties for the casting fluid (may be null) */ - public void addCastingRecipe (ItemStack output, FluidStack metal, ItemStack cast, int delay) - { - addCastingRecipe(output, metal, cast, false, delay); + public void addCastingRecipe (ItemStack output, FluidStack metal, ItemStack cast, int delay, FluidRenderProperties props){ + addCastingRecipe(output, metal, cast, false, delay, props); + } + + /** Adds a casting recipe. Does not consume the cast + * + * @param output Result of the cast + * @param metal Liquid to be used in casting. This also decides how much metal is consumed + * @param cast The empty item to cast with. ex Ingot Cast + * @param delay Time to cast in ticks + */ + public void addCastingRecipe (ItemStack output, FluidStack metal, ItemStack cast, int delay){ + addCastingRecipe(output, metal, cast, false, delay, null); } /** Adds a casting recipe. Does not consume the cast or have an item to cast against @@ -41,10 +66,20 @@ public void addCastingRecipe (ItemStack output, FluidStack metal, ItemStack cast * @param output Result of the cast * @param metal Liquid to be used in casting. This also decides how much metal is consumed * @param delay Time to cast in ticks + * @param props The rendering properties for the casting fluid (may be null) */ - public void addCastingRecipe (ItemStack output, FluidStack metal, int delay) - { - addCastingRecipe(output, metal, null, false, delay); + public void addCastingRecipe (ItemStack output, FluidStack metal, int delay, FluidRenderProperties props){ + addCastingRecipe(output, metal, null, false, delay, props); + } + + /** Adds a casting recipe. Does not consume the cast or have an item to cast against + * + * @param output Result of the cast + * @param metal Liquid to be used in casting. This also decides how much metal is consumed + * @param delay Time to cast in ticks + */ + public void addCastingRecipe (ItemStack output, FluidStack metal, int delay){ + addCastingRecipe(output, metal, null, false, delay, null); } public void addCustomCastingRecipe (CastingRecipe recipe) @@ -52,24 +87,21 @@ public void addCustomCastingRecipe (CastingRecipe recipe) casts.add(recipe); } - public int getCastingDelay (FluidStack metal, ItemStack cast) - { + public int getCastingDelay (FluidStack metal, ItemStack cast){ CastingRecipe recipe = getCastingRecipe(metal, cast); if (recipe != null) return recipe.coolTime; return -1; } - public int getCastingAmount (FluidStack metal, ItemStack cast) - { + public int getCastingAmount (FluidStack metal, ItemStack cast){ CastingRecipe recipe = getCastingRecipe(metal, cast); if (recipe != null) return recipe.castingMetal.amount; return 0; } - public CastingRecipe getCastingRecipe (FluidStack metal, ItemStack cast) - { + public CastingRecipe getCastingRecipe (FluidStack metal, ItemStack cast){ for (CastingRecipe recipe : casts) { if (recipe.matches(metal, cast)) @@ -79,8 +111,7 @@ public CastingRecipe getCastingRecipe (FluidStack metal, ItemStack cast) } //Getter for public viewing - public ArrayList getCastingRecipes () - { + public ArrayList getCastingRecipes (){ return casts; } -} +} \ No newline at end of file diff --git a/src/tconstruct/util/config/PHConstruct.java b/src/tconstruct/util/config/PHConstruct.java index ba2a2a4d092..7773933a0c8 100644 --- a/src/tconstruct/util/config/PHConstruct.java +++ b/src/tconstruct/util/config/PHConstruct.java @@ -185,6 +185,7 @@ public static void initProps (File location) toolShard = config.getItem("Patterns and Misc", "Tool Shard", 14022).getInt(14022); woodPattern = config.getItem("Patterns and Misc", "Wood Pattern", 14023).getInt(14023); metalPattern = config.getItem("Patterns and Misc", "Metal Pattern", 14024).getInt(14024); + armorPattern = config.getItem("Patterns and Misc", "Armor Pattern", 14025).getInt(14025); pickaxeHead = config.getItem("Tool Parts", "Pickaxe Head", 14026).getInt(14026); shovelHead = config.getItem("Tool Parts", "Shovel Head", 14027).getInt(14027); @@ -488,6 +489,7 @@ public static void initProps (File location) public static int toolShard; public static int woodPattern; public static int metalPattern; + public static int armorPattern; public static int manual; public static int buckets;