From e1fe0be8eb3a298333fcfa2312a4937cb6e89369 Mon Sep 17 00:00:00 2001 From: KitsuShadow Date: Thu, 18 Feb 2016 06:20:18 -0500 Subject: [PATCH] cannon_orientation --- bin/assets/kitsumedievalcraft/lang/en_US.lang | 6 +- .../kitsu/medievalcraft/block/ModBlocks.class | Bin 8980 -> 8974 bytes .../medievalcraft/gui/GuiSolidFilter.class | Bin 1791 -> 1791 bytes .../renderer/RendererRegistry.class | Bin 9711 -> 10004 bytes .../kitsu/medievalcraft/block/ModBlocks.java | 4 +- .../CannonBallBlock28.java | 4 +- .../block/{machines => cannon}/Cannon_28.java | 114 ++++++++++++-- .../contain/ContainerCannon_28.java | 58 +++---- .../kitsu/medievalcraft/gui/GuiCannon_28.java | 2 +- .../medievalcraft/gui/GuiSolidFilter.java | 3 +- .../renderer/RendererRegistry.java | 7 +- .../cannons/Render_CannonBall_Iron_Block.java | 95 ++++++++++++ .../blocks/cannons/Render_Cannon_28.java | 56 ++++++- .../cannons/IR_CannonBall_28.java | 143 ++++++++++++++++++ .../tileents/cannon/TileCannonBall28.java | 1 + .../tileents/cannon/TileCannon_28.java | 4 +- .../assets/kitsumedievalcraft/lang/en_US.lang | 6 +- .../kitsumedievalcraft/models/CannonBall.png | Bin 0 -> 604 bytes .../textures/gui/cannongui.png | Bin 0 -> 19902 bytes 19 files changed, 442 insertions(+), 61 deletions(-) rename src/main/java/com/kitsu/medievalcraft/block/{decorative => cannon}/CannonBallBlock28.java (96%) rename src/main/java/com/kitsu/medievalcraft/block/{machines => cannon}/Cannon_28.java (71%) create mode 100644 src/main/java/com/kitsu/medievalcraft/renderer/blocks/cannons/Render_CannonBall_Iron_Block.java create mode 100644 src/main/java/com/kitsu/medievalcraft/renderer/itemrenderer/cannons/IR_CannonBall_28.java create mode 100644 src/main/resources/assets/kitsumedievalcraft/models/CannonBall.png create mode 100644 src/main/resources/assets/kitsumedievalcraft/textures/gui/cannongui.png diff --git a/bin/assets/kitsumedievalcraft/lang/en_US.lang b/bin/assets/kitsumedievalcraft/lang/en_US.lang index 888fc58f..ce9d88a5 100644 --- a/bin/assets/kitsumedievalcraft/lang/en_US.lang +++ b/bin/assets/kitsumedievalcraft/lang/en_US.lang @@ -302,6 +302,7 @@ item.halfSplitBoard.name=Half Split Board item.woodPulp.name=Wood Pulp item.charcoalFilter.name=Charcoal Filter item.slottedTongs.name=Stone Tongs +item.flintKnapped.name=Knapped Flint tile.shitBlock.name=Shit Block tile.formTable.name=Form Table @@ -352,7 +353,10 @@ tile.smallBarrelLid.name=Small Barrel Lid tile.shelfFour.name=Shelf tile.firebox.name=Clay Firebox tile.emptySoftCrucible.name=Empty Soft Crucible -tile.emptyCookedCrucible=Empty Crucible +tile.emptyCookedCrucible.name=Empty Crucible + +tile.cannon_28.name=Cannon 28lb +tile.cannonBallBlock_28.name=Cannon Ball 28lb itemGroup.MedievalCraftTab=ForgeCraft diff --git a/bin/com/kitsu/medievalcraft/block/ModBlocks.class b/bin/com/kitsu/medievalcraft/block/ModBlocks.class index 56cab13cee4e7a640e298875870df56f5a45b8dc..711deadbaf726d054d8e7f3f7bac497e3a1a9a9a 100644 GIT binary patch delta 40 ncmbQ@*5|h203V~?WJOVV*2KKL{JhD}`4kz=5d6)C{EvkJ6G;s- delta 36 pcmeBko8q?N03V~lC!c)p z?|05S_uO-H^OvQ2o899VUOfo_Rd~M&3PL4?ZQ%#T-A5OFpn9BLkwhYysEx$qE34+J zFi0)-O8Qjw_|i){tOrelUKlc9BNb=o(P(yau)V%6wYDqP8IS6)$^ES(Tj{!SiHGA9S>Q~eFp5O z7CnRq33ChRb_~#dJ?uDOsfP@Bl-|&b3Li7zagoqH5J{{MU(akog(vnn+G*V3qE3e& zpS>hYE}0Hj_!%qH^9CHTD(d6j)<#mPC~xstx}wVViB%nrS|KkP@UjTW>7NiAW8Eqo zN2rxM-eowZj9O;XfNu)3*1swm?^%*u%bhuy_DyTgtm$yVvX2??y0EJ~u~f7(xn70u zQ0tUZI-TX@jvFP`st(__>~9$GePN#@&qsxEgoRwe9D2^FIZj!g9~kf^jX48&n%-2a z__VcPLtCazI=p4M-ZtPzbY)Ix?oSMON2GLir6*@aGC6Rkn5?q~{Oo^}#>kpjzfgW* zz%OYiCqMX}0lyL!M=IJAOGLXHQpto0zm~&#*yW**aY{~#=-Wxg=A z1oG(vw--O9;lO;V^!OYXK+{pdEER3k>M75{Noc37o{gBzgVu(+H15jv*)>jtPO2y< zrIBDRy_;)fxy1301uJN>*QezOJr|)yerTk~LA_oN`lzC)lAiW@HLuWvm*~0miGkR_ zVAEiIUo;hocdM8$&DB1yJx`bmso7VDllhXClFRF&@A~}qA|Zr%X9aX9Pm}v8^5zf) zSanH!sl8Hos=1`ubR_7+Ipm&Xm31!Y)n*HEKEf=SU}l~#>so|4+?y*Xk>}BBgnS*s z?6mCC()SY=(OBL>?RudvM!1&sSyYqnz$NMQ9vaH`X!SyGK$tIdeM$O8;Zp8b8Ep<} zq=wwuO~TZSz-9ZcrlydJt$bPqv?erNYY|#|rui)ajczS4vgJ6bcr(2lYP2sGmd|oT zEq;!hQbr>MC0d7Ay!EoUJ%uW+FXNw2Fa=8LhL6GD<;r=^_%F_w`)?C2 zbc`ZD3+P4FM2*2A!7wq0!7agKqL;xhAz)%2Lr6k_iA4-kBov!Cm7!F^G!v&Y%#d)U ziC1-u4&zKo|%&Y=rM5>!xts2HnEQ(DPfI?DTV6#uL83hcpCKzJ7R;)n1co`;7O4IWYQ;j79F*r&{c z{YnEIRBnb5r4tS*NqAHlg0Cw(;Bn<4ctUv$o>Y#&HwhvC&o`jRO W7h%jc2HyjR+z#&scZuI{_kRIyIJ-;$ delta 2437 zcmZXWdvsLQ6~_0zH{3gS=1wxt%uF%~nGh)w6aqy{h=C9Sq+*Ccd9*5>WF}$CWG2o8 z1Th2=Sg6Yvn*~CH;8JYyfel&{xt7{imxb0=tG1=o7TZ-@S1p#>Wu>;*ea=nFqyJ>x z-}%11&))l-lVnHBN7s6epF46C0H)#=9TbEbim9=Oj(Y|h{-B4w$?l%sb&Io|y^Xom z9jW$oQipX2H_)5;=z~=Vei_r4&8|u&Xt!e-^%!Q^2HUgA zgu8^t*_q9CB^xqpQfVEwP|esXdZWNiQ=G1e^ZuteVY3~z&4jx}lkjo3w9w~H&V5i!mgtEJMF+dCVWE# z2HLZ!bSl%eRBSQYtY~Ym36BVar#GItNYr6JLd!_b*o1v{zQ;^>T-bg2bi8BLB>_)d zSj2dGYgqQ-kHiJ+p}wRI7)ZAo5J6< zY+YG}aaqz#2;|1sPC zx(PoOcJGDu=1f<%SB&=!6W$c6dsJPT&Gz0dl($TH`yypwyeE|x$}dd#rBFPhF>T32 zzBijm3h{&qzZRmaFqiC1Ws(U|oesaDMOqCVDsoQ{EVplNbHYix#^0H6N(4C)@$PuO zV|8AK-%~?z6`k^wkX7W3zGwUXXu|u#XQVhuYntzh4u2laJW*tpiz4%%?1;aZ@S%us zrbYE~UmZ?Ut7l=wUv0-36aFq7?%YThBc^|h6i}^w42BN>B(Jv>&(imNwKU)jxIP8L z3IB$3I{b$$@8kmb9Dz=I`%t0N!E5NCFNg(fZqZbZMx9Z5wEhqeWM1!V{eXfQm1?(-JWJ3+q|6}}3tw+$=V zy~v1(h0DaVIuop=w~CAL3$o#=P(T|mw24$7x*jL7xt5NHf=0DioIF}dY1oZ5g+u-})A7qZ{y9dokgh|R z$=yw)6;ab6ue6Sf_&(S*KN97)QyS7*gtbi^8c(p?DQ=c{VR!?Nqnd=vAB`A`g=^{g zgnnFpL8h3oOz1a>>5Obh=b}!$g{Nods4pwgZWf+6-BMPE9o$q6{iMvVwTs10ip8qP zC=cRFKHVB>Ee{!8Lg33foo6|T2FhL7ErU*!`;D~Fdc-7I^NhYp`!-{aQ!LPK6_(XJ za*@|XhsK(C8#Po^Q&B*p561?KHNtSa$bTkSN!1lWyo2>7ZM|6U=YnPw+&OwyTVsCQ zNPA*^#_OQ+UocP)JXcW}!{E;4L-6o0gb%~OFr+Qm$NVTQ8MnUa7=Qg(DnFCTdH(q& z{LUr(E6FE0{#`1rYV7xYV!@|O{~CtR{D>B+%ZG4`1kFMRgHwXbLN`N^1doM2hJb{i zg&~HBgc1v*4CNBWS{P#(C!xy1@eC6rTy9}C!xh8*V%IAzoWe9!O4BTy&TzGaFIia2 zP$%IU3uiGjNSI^cT!wl75A!W-X60I`EVQtNp;f~57A|JEQNj`nmn|Ra$FE5Gs)aYR zv_ityENo{;NJv`P#gLNlbqmuB83|bnZ)M0!=(TVS!&(XJEL_jfCt-ty8yPk+4D#VB z-~_-zXyorMppP%RD%cOlU?ZG>P4EH#TX7aPqXAo~e*C!p2k{_0gfGH&JO+d(U+QVe)liNJ2@Ur?iyb3Pa3%7!Ii7(vzUo)V(wg3PC diff --git a/src/main/java/com/kitsu/medievalcraft/block/ModBlocks.java b/src/main/java/com/kitsu/medievalcraft/block/ModBlocks.java index 229cf1bb..fb6cd014 100644 --- a/src/main/java/com/kitsu/medievalcraft/block/ModBlocks.java +++ b/src/main/java/com/kitsu/medievalcraft/block/ModBlocks.java @@ -6,6 +6,8 @@ import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; import com.kitsu.medievalcraft.Main; +import com.kitsu.medievalcraft.block.cannon.CannonBallBlock28; +import com.kitsu.medievalcraft.block.cannon.Cannon_28; import com.kitsu.medievalcraft.block.crucible.CrucibleIronIngot; import com.kitsu.medievalcraft.block.crucible.CrucibleIronOre; import com.kitsu.medievalcraft.block.crucible.CrucibleLapis; @@ -17,7 +19,6 @@ import com.kitsu.medievalcraft.block.crucible.empty.EmptySoftCrucible; import com.kitsu.medievalcraft.block.crucible.empty.FilledWaterCrucible; import com.kitsu.medievalcraft.block.crucible.empty.SlackWaterCrucible; import com.kitsu.medievalcraft.block.crucible.empty.TanWaterCrucible; -import com.kitsu.medievalcraft.block.decorative.CannonBallBlock28; import com.kitsu.medievalcraft.block.decorative.EggWashedBrick; import com.kitsu.medievalcraft.block.decorative.EggWashedWall; import com.kitsu.medievalcraft.block.decorative.LimestoneRaw; @@ -32,7 +33,6 @@ import com.kitsu.medievalcraft.block.ingots.IronPlate; import com.kitsu.medievalcraft.block.ingots.LapisIngot; import com.kitsu.medievalcraft.block.ingots.RedstoneIngot; import com.kitsu.medievalcraft.block.ingots.RefinedIron; -import com.kitsu.medievalcraft.block.machines.Cannon_28; import com.kitsu.medievalcraft.block.machines.Firebox; import com.kitsu.medievalcraft.block.machines.Forge; import com.kitsu.medievalcraft.block.machines.ForgeAnvil; diff --git a/src/main/java/com/kitsu/medievalcraft/block/decorative/CannonBallBlock28.java b/src/main/java/com/kitsu/medievalcraft/block/cannon/CannonBallBlock28.java similarity index 96% rename from src/main/java/com/kitsu/medievalcraft/block/decorative/CannonBallBlock28.java rename to src/main/java/com/kitsu/medievalcraft/block/cannon/CannonBallBlock28.java index 57dd33ec..9912140b 100644 --- a/src/main/java/com/kitsu/medievalcraft/block/decorative/CannonBallBlock28.java +++ b/src/main/java/com/kitsu/medievalcraft/block/cannon/CannonBallBlock28.java @@ -1,4 +1,4 @@ -package com.kitsu.medievalcraft.block.decorative; +package com.kitsu.medievalcraft.block.cannon; import java.util.Random; @@ -34,7 +34,7 @@ public class CannonBallBlock28 extends BlockContainer { //xmin, ymin, zmin, this.setBlockBounds(0.38F, 0.0F, 0.38F, //xmax, ymax, zmax - 0.62F, 0.2F, 0.62F); + 0.62F, 0.35F, 0.62F); } public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_){ diff --git a/src/main/java/com/kitsu/medievalcraft/block/machines/Cannon_28.java b/src/main/java/com/kitsu/medievalcraft/block/cannon/Cannon_28.java similarity index 71% rename from src/main/java/com/kitsu/medievalcraft/block/machines/Cannon_28.java rename to src/main/java/com/kitsu/medievalcraft/block/cannon/Cannon_28.java index 17d9b0fd..28d393c7 100644 --- a/src/main/java/com/kitsu/medievalcraft/block/machines/Cannon_28.java +++ b/src/main/java/com/kitsu/medievalcraft/block/cannon/Cannon_28.java @@ -1,4 +1,4 @@ -package com.kitsu.medievalcraft.block.machines; +package com.kitsu.medievalcraft.block.cannon; import static net.minecraftforge.common.util.ForgeDirection.UP; @@ -38,6 +38,7 @@ import net.minecraft.item.ItemSword; import net.minecraft.item.ItemTool; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -82,7 +83,7 @@ public class Cannon_28 extends BlockContainer{ TileCannon_28 tile = (TileCannon_28) world.getTileEntity(x, y, z); Item ball = new ItemStack(ModBlocks.cannonBall_28, 0, 1).getItem(); - if(tile.getStackInSlot(0)!=null){ + if(tile.getStackInSlot(0)!=null && tile.getStackInSlot(0).getItem()==Items.gunpowder){ if(world.getBlockMetadata(x, y, z)==3){ tile.isOn=true; world.playSoundEffect(x, y, z, "random.fizz", 0.1f, world.rand.nextFloat()/0.5f * 0.1F + 0.8F); @@ -92,13 +93,14 @@ public class Cannon_28 extends BlockContainer{ tile.decrStackSize(1, 1); cannonball = new EntityCannonBall(world, (double)x+2, (double)y, (double)z, null); cannonball.setVelocity(tile.getStackInSlot(0).stackSize-world.rand.nextFloat(), 0.25, (world.rand.nextFloat()*2-1)/5); + tile.setInventorySlotContents(0, null); tile.markForUpdate(); tile.markDirty(); } } } } - if(tile.getStackInSlot(0)!=null){ + if(tile.getStackInSlot(0)!=null && tile.getStackInSlot(0).getItem()==Items.gunpowder){ if(world.getBlockMetadata(x, y, z)==2){ tile.isOn=true; world.playSoundEffect(x, y, z, "random.fizz", 0.1f, world.rand.nextFloat()/0.5f * 0.1F + 0.8F); @@ -108,13 +110,14 @@ public class Cannon_28 extends BlockContainer{ tile.decrStackSize(1, 1); cannonball = new EntityCannonBall(world, (double)x, (double)y, (double)z-2, null); cannonball.setVelocity((world.rand.nextFloat()*2-1)/5, 0.25, -tile.getStackInSlot(0).stackSize+world.rand.nextFloat()); + tile.setInventorySlotContents(0, null); tile.markForUpdate(); tile.markDirty(); } } } } - if(tile.getStackInSlot(0)!=null){ + if(tile.getStackInSlot(0)!=null && tile.getStackInSlot(0).getItem()==Items.gunpowder){ if(world.getBlockMetadata(x, y, z)==1){ tile.isOn=true; world.playSoundEffect(x, y, z, "random.fizz", 0.1f, world.rand.nextFloat()/0.5f * 0.1F + 0.8F); @@ -124,13 +127,14 @@ public class Cannon_28 extends BlockContainer{ tile.decrStackSize(1, 1); cannonball = new EntityCannonBall(world, (double)x-2, (double)y, (double)z, null); cannonball.setVelocity(-tile.getStackInSlot(0).stackSize+world.rand.nextFloat(), 0.25, (world.rand.nextFloat()*2-1)/5); + tile.setInventorySlotContents(0, null); tile.markForUpdate(); tile.markDirty(); } } } } - if(tile.getStackInSlot(0)!=null){ + if(tile.getStackInSlot(0)!=null && tile.getStackInSlot(0).getItem()==Items.gunpowder){ if(world.getBlockMetadata(x, y, z)==0){ tile.isOn=true; world.playSoundEffect(x, y, z, "random.fizz", 0.1f, world.rand.nextFloat()/0.5f * 0.1F + 0.8F); @@ -140,21 +144,19 @@ public class Cannon_28 extends BlockContainer{ tile.decrStackSize(1, 1); cannonball = new EntityCannonBall(world, (double)x, (double)y, (double)z+2, null); cannonball.setVelocity((world.rand.nextFloat()*2-1)/5, 0.25, tile.getStackInSlot(0).stackSize-world.rand.nextFloat()); + tile.setInventorySlotContents(0, null); tile.markForUpdate(); tile.markDirty(); } } } } - tile.setInventorySlotContents(0, null); + tile.markForUpdate(); tile.markDirty(); return cannonball; } - - - public boolean onBlockActivated (World world, int x, int y, int z, EntityPlayer player, int q, float a, float b, float c) { if(!world.isRemote){ TileCannon_28 tileEnt = (TileCannon_28) world.getTileEntity(x, y, z); @@ -194,12 +196,94 @@ public class Cannon_28 extends BlockContainer{ } } - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack p_149689_6_) { - int dir = MathHelper.floor_double((player.rotationYaw * 4F) / 360F + 0.5D) & 3; - world.setBlockMetadataWithNotify(x, y, z, dir, 0); - System.out.println(dir); - } + /** + * Updates the blocks bounds based on its current state. Args: world, x, y, z + */ + @Override + public void setBlockBoundsBasedOnState(IBlockAccess iBlock, int x, int y, int z) + { + int l = iBlock.getBlockMetadata(x, y, z) & 7; + + switch (l) + { + case 1: + default: + this.setBlockBounds(0F, 0.0F, 0F, 1F, 1F, 1F); + break; + case 2: + this.setBlockBounds(0F, 0.0F, 0F, 1F, 1F, 1F); + break; + case 3: + this.setBlockBounds(0F, 0.0F, 0F, 1F, 1F, 1F); + break; + case 4: + this.setBlockBounds(0F, 0.0F, 0F, 1F, 1F, 1F); + break; + case 5: + this.setBlockBounds(0F, 0.0F, 0F, 1F, 1F, 1F); + } + } + + /** + * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been + * cleared to be reused) + */ + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) + { + this.setBlockBoundsBasedOnState(world, x, y, z); + return super.getCollisionBoundingBoxFromPool(world, x, y, z); + } + + /** + * Called when the block is placed in the world. + */ + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack) + { + //22.5 + //11.25 + if(!world.isRemote){ + double a = living.rotationYaw*(-1); + if(a >= 180-11.25 && a <= 180+11.25){ + world.setBlockMetadataWithNotify(x, y, z, 0, 2); + System.out.println("0"); + } + if(a >= 202.5-11.25 && a <= 202.5+11.25){ + world.setBlockMetadataWithNotify(x, y, z, 1, 2); + System.out.println("1"); + } + if(a >= 225-11.25 && a <= 225+11.25){ + world.setBlockMetadataWithNotify(x, y, z, 2, 2); + System.out.println("2"); + } + /*int l = MathHelper.floor_double((double)(living.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3; + world.setBlockMetadataWithNotify(x, y, z, l, 2);*/ + System.out.println((a)); + } + //System.out.println(l); + } + + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) { + if(!world.isRemote){ + if(player.isSneaking()==true){ + if(world.getBlockMetadata(x, y, z)==15){ + world.setBlockMetadataWithNotify(x, y, z, 0, 2); + } + if(world.getBlockMetadata(x, y, z)<15){ + world.setBlockMetadataWithNotify(x, y, z, world.getBlockMetadata(x, y, z)+1, 2); + } + } + if(!player.isSneaking()==true){ + if(world.getBlockMetadata(x, y, z)==0){ + world.setBlockMetadataWithNotify(x, y, z, 15, 2); + } + if(world.getBlockMetadata(x, y, z)>0){ + world.setBlockMetadataWithNotify(x, y, z, world.getBlockMetadata(x, y, z)-1, 2); + } + } + } + } public void breakBlock(World world, int x, int y, int z, Block block, int meta) { TileCannon_28 tileEnt = (TileCannon_28) world.getTileEntity(x, y, z); diff --git a/src/main/java/com/kitsu/medievalcraft/contain/ContainerCannon_28.java b/src/main/java/com/kitsu/medievalcraft/contain/ContainerCannon_28.java index b75b3456..c1c5f74e 100644 --- a/src/main/java/com/kitsu/medievalcraft/contain/ContainerCannon_28.java +++ b/src/main/java/com/kitsu/medievalcraft/contain/ContainerCannon_28.java @@ -10,44 +10,44 @@ import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; public class ContainerCannon_28 extends Container { - + protected TileCannon_28 tileEnt; - @Override - public boolean canInteractWith(EntityPlayer player) { - return tileEnt.isUseableByPlayer(player); - } - - public ContainerCannon_28 (InventoryPlayer inventoryPlayer, TileCannon_28 te){ - tileEnt = te; + @Override + public boolean canInteractWith(EntityPlayer player) { + return tileEnt.isUseableByPlayer(player); + } - //the Slot constructor takes the IInventory and the slot number in that it binds to - //and the x-y coordinates it resides on-screen - /* for (int i = 0; i < 2; i++) { + public ContainerCannon_28 (InventoryPlayer inventoryPlayer, TileCannon_28 te){ + tileEnt = te; + + //the Slot constructor takes the IInventory and the slot number in that it binds to + //and the x-y coordinates it resides on-screen + /* for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { addSlotToContainer(new Slot(tileEnt, j + i * 3, 62 + j * 18, 17 + i * 18)); } }*/ - addSlotToContainer(new Slot(tileEnt, 0, 80, 34)); - addSlotToContainer(new Slot(tileEnt, 1, 100, 34)); - //commonly used vanilla code that adds the player's inventory - bindPlayerInventory(inventoryPlayer); - } + addSlotToContainer(new Slot(tileEnt, 0, 30, 34)); + addSlotToContainer(new Slot(tileEnt, 1, 48, 34)); + //commonly used vanilla code that adds the player's inventory + bindPlayerInventory(inventoryPlayer); + } - protected void bindPlayerInventory(InventoryPlayer inventoryPlayer) { - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 9; j++) { - addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9, - 8 + j * 18, 84 + i * 18)); - } - } + protected void bindPlayerInventory(InventoryPlayer inventoryPlayer) { + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 9; j++) { + addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9, + 8 + j * 18, 84 + i * 18)); + } + } - for (int i = 0; i < 9; i++) { - addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 142)); - } - } - - @Override + for (int i = 0; i < 9; i++) { + addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 142)); + } + } + + @Override public ItemStack transferStackInSlot(EntityPlayer player, int slot) { ItemStack stack = null; Slot slotObject = (Slot) inventorySlots.get(slot); diff --git a/src/main/java/com/kitsu/medievalcraft/gui/GuiCannon_28.java b/src/main/java/com/kitsu/medievalcraft/gui/GuiCannon_28.java index 6f785bd5..cab62c1a 100644 --- a/src/main/java/com/kitsu/medievalcraft/gui/GuiCannon_28.java +++ b/src/main/java/com/kitsu/medievalcraft/gui/GuiCannon_28.java @@ -12,7 +12,7 @@ import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.ResourceLocation; public class GuiCannon_28 extends GuiContainer { - private ResourceLocation texture = new ResourceLocation(Main.MODID + ":" + "textures/gui/forgeovengui.png"); + private ResourceLocation texture = new ResourceLocation(Main.MODID + ":" + "textures/gui/cannongui.png"); public GuiCannon_28(InventoryPlayer inventoryPlayer, TileCannon_28 tileEntity) { super(new ContainerCannon_28(inventoryPlayer, tileEntity)); diff --git a/src/main/java/com/kitsu/medievalcraft/gui/GuiSolidFilter.java b/src/main/java/com/kitsu/medievalcraft/gui/GuiSolidFilter.java index 5bb92713..f7fc51d0 100644 --- a/src/main/java/com/kitsu/medievalcraft/gui/GuiSolidFilter.java +++ b/src/main/java/com/kitsu/medievalcraft/gui/GuiSolidFilter.java @@ -17,12 +17,11 @@ public class GuiSolidFilter extends GuiContainer { public GuiSolidFilter(InventoryPlayer inventoryPlayer, TileEntitySolidFilter tileEntity) { super(new ContainerSolidFilter(inventoryPlayer, tileEntity)); - // TODO Auto-generated constructor stub } @Override protected void drawGuiContainerForegroundLayer(int par1, int par2) { - //String name = "Forge"; + //String name = "28lb Cannon"; //this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); //this.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, this.ySize - 96 + 2, 4210752); diff --git a/src/main/java/com/kitsu/medievalcraft/renderer/RendererRegistry.java b/src/main/java/com/kitsu/medievalcraft/renderer/RendererRegistry.java index aa5da441..390f4a86 100644 --- a/src/main/java/com/kitsu/medievalcraft/renderer/RendererRegistry.java +++ b/src/main/java/com/kitsu/medievalcraft/renderer/RendererRegistry.java @@ -5,7 +5,7 @@ import com.kitsu.medievalcraft.item.ModItems; import com.kitsu.medievalcraft.renderer.blocks.BarrelLidRender; import com.kitsu.medievalcraft.renderer.blocks.SmallBarrelRender; import com.kitsu.medievalcraft.renderer.blocks.TestBlockRenderer; -import com.kitsu.medievalcraft.renderer.blocks.cannons.Render_CannonBall_Iron; +import com.kitsu.medievalcraft.renderer.blocks.cannons.Render_CannonBall_Iron_Block; import com.kitsu.medievalcraft.renderer.blocks.cannons.Render_Cannon_28; import com.kitsu.medievalcraft.renderer.blocks.crucibles.IronOreCrucibleRenderer; import com.kitsu.medievalcraft.renderer.blocks.crucibles.LapisCrucibleRenderer; @@ -34,6 +34,7 @@ import com.kitsu.medievalcraft.renderer.itemrenderer.IRITSpear; import com.kitsu.medievalcraft.renderer.itemrenderer.ItemRendererITModelArrow; import com.kitsu.medievalcraft.renderer.itemrenderer.ItemRendererLongbow; import com.kitsu.medievalcraft.renderer.itemrenderer.ItemRendererModelArrow; +import com.kitsu.medievalcraft.renderer.itemrenderer.cannons.IR_CannonBall_28; import com.kitsu.medievalcraft.renderer.itemrenderer.cannons.IR_Cannon_28; import com.kitsu.medievalcraft.renderer.itemrenderer.crucibles.IRCrucible; import com.kitsu.medievalcraft.renderer.itemrenderer.crucibles.empty.IRSlackCrucible; @@ -55,7 +56,6 @@ import com.kitsu.medievalcraft.renderer.itemrenderer.machines.IRSmallBarrel; import com.kitsu.medievalcraft.renderer.itemrenderer.machines.IRSolidFilter; import com.kitsu.medievalcraft.renderer.itemrenderer.machines.IRWaterFilter; import com.kitsu.medievalcraft.renderer.itemrenderer.tongs.IRSlottedTongs; -import com.kitsu.medievalcraft.renderer.itemrenderer.tools.IRCraftingBlade; import com.kitsu.medievalcraft.renderer.itemrenderer.tools.IRForgeHammer; import com.kitsu.medievalcraft.renderer.itemrenderer.tools.IRInlayHammer; import com.kitsu.medievalcraft.renderer.itemrenderer.weapons.IRBattleAxe; @@ -123,6 +123,7 @@ public class RendererRegistry { MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ModBlocks.cannon_28), new IR_Cannon_28()); + MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ModBlocks.cannonBall_28), new IR_CannonBall_28()); MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ModBlocks.emptySoftCrucible), new ItemRendererSECrucible()); MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ModBlocks.emptyCookedCrucible), new ItemRendererECCrucible()); @@ -186,7 +187,7 @@ public class RendererRegistry { ClientRegistry.bindTileEntitySpecialRenderer(TileLapisIngot.class, new LapisIngotRenderer()); ClientRegistry.bindTileEntitySpecialRenderer(TileCannon_28.class, new Render_Cannon_28()); - //ClientRegistry.bindTileEntitySpecialRenderer(TileCannonBall28.class, new Render_CannonBall_Iron()); + ClientRegistry.bindTileEntitySpecialRenderer(TileCannonBall28.class, new Render_CannonBall_Iron_Block()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTestBlock.class, new TestBlockRenderer()); diff --git a/src/main/java/com/kitsu/medievalcraft/renderer/blocks/cannons/Render_CannonBall_Iron_Block.java b/src/main/java/com/kitsu/medievalcraft/renderer/blocks/cannons/Render_CannonBall_Iron_Block.java new file mode 100644 index 00000000..56479036 --- /dev/null +++ b/src/main/java/com/kitsu/medievalcraft/renderer/blocks/cannons/Render_CannonBall_Iron_Block.java @@ -0,0 +1,95 @@ +package com.kitsu.medievalcraft.renderer.blocks.cannons; + +import org.lwjgl.opengl.GL11; + +import com.kitsu.medievalcraft.block.ModBlocks; +import com.kitsu.medievalcraft.entity.EntityCannonBall; +import com.kitsu.medievalcraft.tileents.cannon.TileCannonBall28; +import com.kitsu.medievalcraft.tileents.cannon.TileCannon_28; + +import cpw.mods.fml.client.FMLClientHandler; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.client.model.AdvancedModelLoader; +import net.minecraftforge.client.model.IModelCustom; + +public class Render_CannonBall_Iron_Block extends TileEntitySpecialRenderer { + + EntityItem entItem = null; + + private static final ResourceLocation MODEL_CRUCIBLE = new ResourceLocation("kitsumedievalcraft:models/cannon_ball.obj"); + private static final ResourceLocation TEXTURE = new ResourceLocation("kitsumedievalcraft:models/CannonBall.png"); + private IModelCustom model = AdvancedModelLoader.loadModel(MODEL_CRUCIBLE); + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float scale) { + TileCannonBall28 tileEntity = (TileCannonBall28)tile; + GL11.glPushMatrix(); + GL11.glTranslatef((float) x, (float) y, (float) z); + + renderBlock(tileEntity, tile.getWorldObj(), tile.xCoord,tile.yCoord, tile.zCoord, ModBlocks.cannonBall_28); + + GL11.glPopMatrix(); + } + + + public void renderBlock(TileCannonBall28 tl, World world, int i, int j,int k, Block block) { + Tessellator tessellator = Tessellator.instance; + // This will make your block brightness dependent from surroundings + // lighting. + /*float f = block.getLightOpacity(world, i, j, k); + int l = world.getLightBrightnessForSkyBlocks(i, j, k, 0); + int l1 = l % 65536; + int l2 = l / 65536; + tessellator.setNormal(0.0F, 1.0F, 0.0F);*/ + //OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit,(float) l1, (float) l2); + + /* + * This will rotate your model corresponding to player direction that + * was when you placed the block. If you want this to work, add these + * lines to onBlockPlacedBy method in your block class. int dir = + * MathHelper.floor_double((double)((player.rotationYaw * 4F) / 360F) + + * 0.5D) & 3; world.setBlockMetadataWithNotify(x, y, z, dir, 0); + */ + + int dir = world.getBlockMetadata(i, j, k); + + GL11.glPushMatrix(); + //GL11.glRotatef(15F, 0F, 1F, 0F); + float scale = 0.25f; + GL11.glScalef(scale, scale, scale); + + /*if(dir == 0){ + GL11.glTranslatef(0.48F, 0.5F, 0.7F); + GL11.glRotated(180F, 0.0, 1.0F, 0.0F); + } + if(dir == 1){ + GL11.glTranslatef(0.3F, 0.5F, 0.48F); + GL11.glRotated(90F, 0.0, 1.0F, 0.0F); + } + if(dir == 2){ + GL11.glTranslatef(0.48F, 0.5F, 0.3F); + GL11.glRotated(0F, 0.0, 1.0F, 0.0F); + }*/ + + GL11.glTranslatef(2.0F, 0.5F, 2.0F); + //GL11.glRotated(-90F, 0.0, 1.0F, 0.0F); + + // + FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE); + /* + * Place your rendering code here. + */ + this.model.renderAll(); + GL11.glPopMatrix(); + } + +} \ No newline at end of file diff --git a/src/main/java/com/kitsu/medievalcraft/renderer/blocks/cannons/Render_Cannon_28.java b/src/main/java/com/kitsu/medievalcraft/renderer/blocks/cannons/Render_Cannon_28.java index e81011c8..3aefca4e 100644 --- a/src/main/java/com/kitsu/medievalcraft/renderer/blocks/cannons/Render_Cannon_28.java +++ b/src/main/java/com/kitsu/medievalcraft/renderer/blocks/cannons/Render_Cannon_28.java @@ -85,19 +85,67 @@ public class Render_Cannon_28 extends TileEntitySpecialRenderer { if(dir == 0){ GL11.glTranslatef(0.48F, 0.5F, 0.7F); - GL11.glRotated(180F, 0.0, 1.0F, 0.0F); + GL11.glRotated(0, 0.0, 1.0F, 0.0F); } if(dir == 1){ GL11.glTranslatef(0.3F, 0.5F, 0.48F); - GL11.glRotated(90F, 0.0, 1.0F, 0.0F); + GL11.glRotated(22.5F, 0.0, 1.0F, 0.0F); } if(dir == 2){ GL11.glTranslatef(0.48F, 0.5F, 0.3F); - GL11.glRotated(0F, 0.0, 1.0F, 0.0F); + GL11.glRotated(22.5F*dir, 0.0, 1.0F, 0.0F); } if(dir == 3){ GL11.glTranslatef(0.7F, 0.5F, 0.48F); - GL11.glRotated(-90F, 0.0, 1.0F, 0.0F); + GL11.glRotated(22.5F*dir, 0.0, 1.0F, 0.0F); + } + if(dir == 3){ + GL11.glTranslatef(0.7F, 0.5F, 0.48F); + GL11.glRotated(22.5F*dir, 0.0, 1.0F, 0.0F); + } + if(dir == 4){ + GL11.glTranslatef(0.7F, 0.5F, 0.48F); + GL11.glRotated(22.5F*dir, 0.0, 1.0F, 0.0F); + } + if(dir == 5){ + GL11.glTranslatef(0.7F, 0.5F, 0.48F); + GL11.glRotated(22.5F*dir, 0.0, 1.0F, 0.0F); + } + if(dir == 6){ + GL11.glTranslatef(0.7F, 0.5F, 0.48F); + GL11.glRotated(22.5F*dir, 0.0, 1.0F, 0.0F); + } + if(dir == 7){ + GL11.glTranslatef(0.7F, 0.5F, 0.48F); + GL11.glRotated(22.5F*dir, 0.0, 1.0F, 0.0F); + } + if(dir == 8){ + GL11.glTranslatef(0.7F, 0.5F, 0.48F); + GL11.glRotated(22.5F*dir, 0.0, 1.0F, 0.0F); + } + if(dir == 9){ + GL11.glTranslatef(0.7F, 0.5F, 0.48F); + GL11.glRotated(22.5F*dir, 0.0, 1.0F, 0.0F); + } + if(dir == 10){ + GL11.glTranslatef(0.7F, 0.5F, 0.48F); + GL11.glRotated(22.5F*dir, 0.0, 1.0F, 0.0F); + } + if(dir == 11){ + GL11.glTranslatef(0.7F, 0.5F, 0.48F); + GL11.glRotated(22.5F*dir, 0.0, 1.0F, 0.0F); + } + if(dir == 12){ + GL11.glTranslatef(0.7F, 0.5F, 0.48F); + GL11.glRotated(22.5F*dir, 0.0, 1.0F, 0.0F); + } + if(dir == 13){ + GL11.glTranslatef(0.7F, 0.5F, 0.48F); + GL11.glRotated(22.5F*dir, 0.0, 1.0F, 0.0F); + } + if(dir == 14){ + GL11.glTranslatef(0.7F, 0.5F, 0.48F); + GL11.glRotated(22.5F*dir, 0.0, 1.0F, 0.0F); } // FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE); diff --git a/src/main/java/com/kitsu/medievalcraft/renderer/itemrenderer/cannons/IR_CannonBall_28.java b/src/main/java/com/kitsu/medievalcraft/renderer/itemrenderer/cannons/IR_CannonBall_28.java new file mode 100644 index 00000000..390a4e5f --- /dev/null +++ b/src/main/java/com/kitsu/medievalcraft/renderer/itemrenderer/cannons/IR_CannonBall_28.java @@ -0,0 +1,143 @@ +package com.kitsu.medievalcraft.renderer.itemrenderer.cannons; + +import org.lwjgl.opengl.GL11; + +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import net.minecraftforge.client.IItemRenderer.ItemRendererHelper; +import net.minecraftforge.client.model.AdvancedModelLoader; +import net.minecraftforge.client.model.IModelCustom; + +public class IR_CannonBall_28 implements IItemRenderer { + + public static final ResourceLocation MODEL_CRUCIBLE = new ResourceLocation("kitsumedievalcraft:models/cannon_ball.obj"); + public static final ResourceLocation TEXTURE = new ResourceLocation("kitsumedievalcraft:models/CannonBall.png"); + + public IModelCustom model = AdvancedModelLoader.loadModel(MODEL_CRUCIBLE); + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + + switch(type) { + case EQUIPPED: { + return true; + } + case EQUIPPED_FIRST_PERSON: { + return true; + } + case INVENTORY: { + return true; + } + case ENTITY: { + return true; + } + + default: return false; + } + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, + ItemRendererHelper helper) { + + switch(type) { + case EQUIPPED: { + return helper == ItemRendererHelper.BLOCK_3D; + } + case EQUIPPED_FIRST_PERSON: { + return helper == ItemRendererHelper.EQUIPPED_BLOCK; + } + case INVENTORY: { + return helper == ItemRendererHelper.INVENTORY_BLOCK; + } + case ENTITY: { + return (helper == ItemRendererHelper.ENTITY_BOBBING || + helper == ItemRendererHelper.ENTITY_ROTATION || + helper == ItemRendererHelper.BLOCK_3D); + } + + default: return false; + } + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + + switch(type) { + + case EQUIPPED: { + + GL11.glPushMatrix(); + float scale = 0.5F; + GL11.glScalef(scale, scale, scale); + + //ANGLE, X ROTATE, Y ROTATE, Z ROTATE + //GL11.glRotatef(22F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(-90F, 0.0F, 1.0F, 0.0F); + + GL11.glTranslatef(1.8F, 0.4F, 0.3F); + + Minecraft.getMinecraft().renderEngine.bindTexture(TEXTURE); + model.renderAll(); + + GL11.glPopMatrix(); + } break; + + case EQUIPPED_FIRST_PERSON: { + float f = 0.8F; + GL11.glPushMatrix(); + GL11.glScalef(f, f, f); + + GL11.glTranslatef(0.5F, 1.F, 1.0F); + //ANGLE, X ROTATE, Y ROTATE, Z ROTATE + GL11.glRotatef(-50F, 0.0F, 1.0F, 0.0F); + //GL11.glRotatef(-45F, 0.0F, 1.0F, 0.0F); + + + + Minecraft.getMinecraft().renderEngine.bindTexture(TEXTURE); + model.renderAll(); + + GL11.glPopMatrix(); + + } break; + + case INVENTORY: { + GL11.glPushMatrix(); + + GL11.glEnable(GL11.GL_TEXTURE_2D); + float scale = 1.4F; + GL11.glScalef(scale, scale, scale); + + //GL11.glRotatef(90, 1.0F, 0.0F, 0.0F); + + GL11.glTranslatef(0.0F, -0.05F, 0.0F); + + Minecraft.getMinecraft().renderEngine.bindTexture(TEXTURE); + model.renderAll(); + + GL11.glPopMatrix(); + + } break; + + case ENTITY: { + GL11.glPushMatrix(); + //GL11.glScalef(1.75F, 1.75F, 1.75F); + + //GL11.glTranslatef(0.0F, 0.0F, 0.0F); + + Minecraft.getMinecraft().renderEngine.bindTexture(TEXTURE); + model.renderAll(); + + GL11.glPopMatrix(); + + } break; + + default: + break; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/kitsu/medievalcraft/tileents/cannon/TileCannonBall28.java b/src/main/java/com/kitsu/medievalcraft/tileents/cannon/TileCannonBall28.java index 7b3df79b..b22740d3 100644 --- a/src/main/java/com/kitsu/medievalcraft/tileents/cannon/TileCannonBall28.java +++ b/src/main/java/com/kitsu/medievalcraft/tileents/cannon/TileCannonBall28.java @@ -12,4 +12,5 @@ public class TileCannonBall28 extends TileEntity { public void tileCannonBall28(String string){ this.stringCannonBall_28 = string; } + } \ No newline at end of file diff --git a/src/main/java/com/kitsu/medievalcraft/tileents/cannon/TileCannon_28.java b/src/main/java/com/kitsu/medievalcraft/tileents/cannon/TileCannon_28.java index 70a4e5e2..e5fe3eee 100644 --- a/src/main/java/com/kitsu/medievalcraft/tileents/cannon/TileCannon_28.java +++ b/src/main/java/com/kitsu/medievalcraft/tileents/cannon/TileCannon_28.java @@ -127,7 +127,9 @@ public class TileCannon_28 extends TileEntity implements IInventory, ISidedInven @Override public void openInventory() {} @Override - public void closeInventory() {} + public void closeInventory() { + + } @Override public boolean isItemValidForSlot(int slot, ItemStack itemstack) { diff --git a/src/main/resources/assets/kitsumedievalcraft/lang/en_US.lang b/src/main/resources/assets/kitsumedievalcraft/lang/en_US.lang index 888fc58f..ce9d88a5 100644 --- a/src/main/resources/assets/kitsumedievalcraft/lang/en_US.lang +++ b/src/main/resources/assets/kitsumedievalcraft/lang/en_US.lang @@ -302,6 +302,7 @@ item.halfSplitBoard.name=Half Split Board item.woodPulp.name=Wood Pulp item.charcoalFilter.name=Charcoal Filter item.slottedTongs.name=Stone Tongs +item.flintKnapped.name=Knapped Flint tile.shitBlock.name=Shit Block tile.formTable.name=Form Table @@ -352,7 +353,10 @@ tile.smallBarrelLid.name=Small Barrel Lid tile.shelfFour.name=Shelf tile.firebox.name=Clay Firebox tile.emptySoftCrucible.name=Empty Soft Crucible -tile.emptyCookedCrucible=Empty Crucible +tile.emptyCookedCrucible.name=Empty Crucible + +tile.cannon_28.name=Cannon 28lb +tile.cannonBallBlock_28.name=Cannon Ball 28lb itemGroup.MedievalCraftTab=ForgeCraft diff --git a/src/main/resources/assets/kitsumedievalcraft/models/CannonBall.png b/src/main/resources/assets/kitsumedievalcraft/models/CannonBall.png new file mode 100644 index 0000000000000000000000000000000000000000..d00bcaab10e4f80e262be72e8e41753d094e2e29 GIT binary patch literal 604 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 f{|DEnjQ8Phw(mA