From 99f3909bedbeda744984c8af6ba50bcb251c4221 Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 1 Oct 2022 23:45:58 +0200 Subject: [PATCH] crucible templates in folder, storage tanks, recipes --- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../com/hbm/blocks/generic/BlockSmolder.java | 30 +-- .../com/hbm/blocks/machine/FoundryBasin.java | 5 + .../blocks/machine/FoundryCastingBase.java | 13 ++ .../com/hbm/blocks/machine/FoundryMold.java | 6 + .../com/hbm/blocks/machine/FoundryOutlet.java | 54 ++++- .../com/hbm/blocks/machine/FoundryTank.java | 122 +++++++++++ .../hbm/blocks/machine/MachineCrucible.java | 45 +++- .../com/hbm/inventory/SlotNonRetarded.java | 24 +++ .../container/ContainerCrucible.java | 5 +- .../com/hbm/inventory/gui/GUICrucible.java | 4 +- .../gui/GUIScreenTemplateFolder.java | 18 +- .../inventory/recipes/CrucibleRecipes.java | 25 ++- .../inventory/recipes/anvil/AnvilRecipes.java | 7 + .../items/machine/ItemCrucibleTemplate.java | 19 +- .../com/hbm/items/machine/ItemScraps.java | 2 +- src/main/java/com/hbm/main/ClientProxy.java | 9 +- .../java/com/hbm/main/CraftingManager.java | 1 + .../com/hbm/main/ModEventHandlerClient.java | 6 +- .../java/com/hbm/packet/ItemFolderPacket.java | 5 + ...nderBasin.java => RenderFoundryBasin.java} | 2 +- ...Channel.java => RenderFoundryChannel.java} | 2 +- ...RenderMold.java => RenderFoundryMold.java} | 2 +- ...erOutlet.java => RenderFoundryOutlet.java} | 56 ++++- .../hbm/render/block/RenderFoundryTank.java | 201 ++++++++++++++++++ .../hbm/render/tileentity/RenderCrucible.java | 2 +- .../hbm/render/tileentity/RenderFoundry.java | 2 +- .../render/util/RenderAccessoryUtility.java | 2 +- .../java/com/hbm/tileentity/TileMappings.java | 1 + .../machine/TileEntityCrucible.java | 22 +- .../machine/TileEntityFoundryChannel.java | 50 +++-- .../machine/TileEntityFoundryOutlet.java | 30 +++ .../machine/TileEntityFoundryTank.java | 117 ++++++++++ src/main/resources/assets/hbm/lang/de_DE.lang | 7 + src/main/resources/assets/hbm/lang/en_US.lang | 6 + .../textures/blocks/foundry_tank_bottom.png | Bin 0 -> 515 bytes .../textures/blocks/foundry_tank_inner.png | Bin 0 -> 578 bytes .../hbm/textures/blocks/foundry_tank_side.png | Bin 0 -> 600 bytes .../hbm/textures/blocks/foundry_tank_top.png | Bin 0 -> 466 bytes .../textures/blocks/foundry_tank_upper.png | Bin 0 -> 657 bytes .../textures/models/capes/CapeHoboy_mk3.png | Bin 0 -> 12042 bytes 41 files changed, 816 insertions(+), 89 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/FoundryTank.java create mode 100644 src/main/java/com/hbm/inventory/SlotNonRetarded.java rename src/main/java/com/hbm/render/block/{RenderBasin.java => RenderFoundryBasin.java} (97%) rename src/main/java/com/hbm/render/block/{RenderChannel.java => RenderFoundryChannel.java} (99%) rename src/main/java/com/hbm/render/block/{RenderMold.java => RenderFoundryMold.java} (98%) rename src/main/java/com/hbm/render/block/{RenderOutlet.java => RenderFoundryOutlet.java} (73%) create mode 100644 src/main/java/com/hbm/render/block/RenderFoundryTank.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityFoundryTank.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_tank_bottom.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_tank_inner.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_tank_side.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_tank_top.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/foundry_tank_upper.png create mode 100644 src/main/resources/assets/hbm/textures/models/capes/CapeHoboy_mk3.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index a56afe4b3..57b2c7c12 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -643,6 +643,7 @@ public class ModBlocks { public static Block foundry_mold; public static Block foundry_basin; public static Block foundry_channel; + public static Block foundry_tank; public static Block foundry_outlet; public static Block machine_difurnace_off; @@ -1830,6 +1831,7 @@ public class ModBlocks { foundry_mold = new FoundryMold().setBlockName("foundry_mold").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); foundry_basin = new FoundryBasin().setBlockName("foundry_basin").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); foundry_channel = new FoundryChannel().setBlockName("foundry_channel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); + foundry_tank = new FoundryTank().setBlockName("foundry_tank").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); foundry_outlet = new FoundryOutlet().setBlockName("foundry_outlet").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); machine_difurnace_off = new MachineDiFurnace(false).setBlockName("machine_difurnace_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); @@ -3027,6 +3029,7 @@ public class ModBlocks { register(foundry_mold); register(foundry_basin); register(foundry_channel); + register(foundry_tank); register(foundry_outlet); GameRegistry.registerBlock(machine_difurnace_off, machine_difurnace_off.getUnlocalizedName()); GameRegistry.registerBlock(machine_difurnace_on, machine_difurnace_on.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/generic/BlockSmolder.java b/src/main/java/com/hbm/blocks/generic/BlockSmolder.java index ea82080a8..2717c8844 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockSmolder.java +++ b/src/main/java/com/hbm/blocks/generic/BlockSmolder.java @@ -17,26 +17,26 @@ public class BlockSmolder extends Block { public BlockSmolder(Material mat) { super(mat); } - - @Override - @SideOnly(Side.CLIENT) - public void randomDisplayTick(World world, int x, int y, int z, Random rand) { - super.randomDisplayTick(world, x, y, z, rand); - - if(world.getBlock(x, y + 1, z).getMaterial() == Material.air) { - world.spawnParticle("lava", x + 0.25 + rand.nextDouble() * 0.5, y + 1.1, z + 0.25 + rand.nextDouble() * 0.5, 0.0, 0.0, 0.0); - world.spawnParticle("flame", x + 0.25 + rand.nextDouble() * 0.5, y + 1.1, z + 0.25 + rand.nextDouble() * 0.5, 0.0, 0.0, 0.0); - } - } + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, int x, int y, int z, Random rand) { + super.randomDisplayTick(world, x, y, z, rand); + + if(world.getBlock(x, y + 1, z).getMaterial() == Material.air) { + + world.spawnParticle("lava", x + 0.25 + rand.nextDouble() * 0.5, y + 1.1, z + 0.25 + rand.nextDouble() * 0.5, 0.0, 0.0, 0.0); + world.spawnParticle("flame", x + 0.25 + rand.nextDouble() * 0.5, y + 1.1, z + 0.25 + rand.nextDouble() * 0.5, 0.0, 0.0, 0.0); + } + } @Override public Item getItemDropped(int i, Random rand, int j) { return ModItems.powder_fire; - } + } - @Override + @Override public void onEntityWalking(World world, int x, int y, int z, Entity entity) { - entity.setFire(3); - } + entity.setFire(3); + } } diff --git a/src/main/java/com/hbm/blocks/machine/FoundryBasin.java b/src/main/java/com/hbm/blocks/machine/FoundryBasin.java index f4df32c6d..59014be8e 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryBasin.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryBasin.java @@ -83,4 +83,9 @@ public class FoundryBasin extends FoundryCastingBase { public int getRenderType() { return renderID; } + + @Override + public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { + return side != ForgeDirection.UP; + } } diff --git a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java index 149ba3f33..ffd799fed 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java @@ -2,6 +2,7 @@ package com.hbm.blocks.machine; import java.util.ArrayList; import java.util.List; +import java.util.Random; import com.hbm.blocks.ILookOverlay; import com.hbm.inventory.material.Mats.MaterialStack; @@ -127,6 +128,18 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc return false; } + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, int x, int y, int z, Random rand) { + super.randomDisplayTick(world, x, y, z, rand); + + TileEntityFoundryCastingBase cast = (TileEntityFoundryCastingBase) world.getTileEntity(x, y, z); + + if(cast.amount > 0 && cast.amount >= cast.getCapacity()) { + world.spawnParticle("smoke", x + 0.25 + rand.nextDouble() * 0.5, y + this.maxY, z + 0.25 + rand.nextDouble() * 0.5, 0.0, 0.0, 0.0); + } + } + @Override public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { diff --git a/src/main/java/com/hbm/blocks/machine/FoundryMold.java b/src/main/java/com/hbm/blocks/machine/FoundryMold.java index 5bb037991..1c3182d49 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryMold.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryMold.java @@ -15,6 +15,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class FoundryMold extends FoundryCastingBase { @@ -77,4 +78,9 @@ public class FoundryMold extends FoundryCastingBase { public int getRenderType() { return renderID; } + + @Override + public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { + return side == ForgeDirection.DOWN; + } } diff --git a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java index bb4b8a805..5905ed152 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java @@ -1,10 +1,16 @@ package com.hbm.blocks.machine; +import java.util.ArrayList; import java.util.List; +import com.hbm.blocks.ILookOverlay; import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemScraps; import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityFoundryCastingBase; import com.hbm.tileentity.machine.TileEntityFoundryOutlet; +import com.hbm.util.I18nUtil; import api.hbm.block.ICrucibleAcceptor; import cpw.mods.fml.client.registry.RenderingRegistry; @@ -15,22 +21,27 @@ import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; -public class FoundryOutlet extends BlockContainer implements ICrucibleAcceptor { +public class FoundryOutlet extends BlockContainer implements ICrucibleAcceptor, ILookOverlay { @SideOnly(Side.CLIENT) public IIcon iconTop; @SideOnly(Side.CLIENT) public IIcon iconSide; @SideOnly(Side.CLIENT) public IIcon iconBottom; @SideOnly(Side.CLIENT) public IIcon iconInner; @SideOnly(Side.CLIENT) public IIcon iconFront; + @SideOnly(Side.CLIENT) public IIcon iconLock; + @SideOnly(Side.CLIENT) public IIcon iconFilter; public FoundryOutlet() { super(Material.rock); @@ -45,6 +56,8 @@ public class FoundryOutlet extends BlockContainer implements ICrucibleAcceptor { this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_bottom"); this.iconInner = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_inner"); this.iconFront = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_front"); + this.iconLock = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_lock"); + this.iconFilter = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_filter"); } @SideOnly(Side.CLIENT) @@ -99,6 +112,30 @@ public class FoundryOutlet extends BlockContainer implements ICrucibleAcceptor { if(meta == 2) this.setBlockBounds(0.3125F, 0F, 0.625F, 0.6875F, 0.5F, 1F); if(meta == 3) this.setBlockBounds(0.3125F, 0F, 0F, 0.6875F, 0.5F, 0.375F); } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) { + return true; + } + + if(!player.isSneaking()) { + TileEntityFoundryOutlet tile = (TileEntityFoundryOutlet) world.getTileEntity(x, y, z); + + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.scraps) { + MaterialStack mat = ItemScraps.getMats(player.getHeldItem()); + if(mat != null) { + tile.filter = mat.material; + } + } else { + tile.invertRedstone = !tile.invertRedstone; + } + tile.markDirty(); + world.markBlockForUpdate(x, y, z); + } + + return true; + } @Override public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return false; } @Override public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return stack; } @@ -129,4 +166,19 @@ public class FoundryOutlet extends BlockContainer implements ICrucibleAcceptor { public boolean renderAsNormalBlock() { return false; } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + TileEntityFoundryOutlet outlet = (TileEntityFoundryOutlet) world.getTileEntity(x, y, z); + List text = new ArrayList(); + + if(outlet.filter != null) { + text.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("foundry.filter", outlet.filter.names[0])); + } + if(outlet.invertRedstone) { + text.add(EnumChatFormatting.DARK_RED + I18nUtil.resolveKey("foundry.inverted")); + } + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(this.getUnlocalizedName() + ".name"), 0xFF4000, 0x401000, text); + } } diff --git a/src/main/java/com/hbm/blocks/machine/FoundryTank.java b/src/main/java/com/hbm/blocks/machine/FoundryTank.java new file mode 100644 index 000000000..0c8d0a48c --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/FoundryTank.java @@ -0,0 +1,122 @@ +package com.hbm.blocks.machine; + +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.machine.ItemScraps; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityFoundryTank; + +import api.hbm.block.ICrucibleAcceptor; +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemTool; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class FoundryTank extends BlockContainer implements ICrucibleAcceptor { + + @SideOnly(Side.CLIENT) public IIcon iconTop; + @SideOnly(Side.CLIENT) public IIcon iconSide; + @SideOnly(Side.CLIENT) public IIcon iconSideUpper; + @SideOnly(Side.CLIENT) public IIcon iconBottom; + @SideOnly(Side.CLIENT) public IIcon iconInner; + @SideOnly(Side.CLIENT) public IIcon iconLava; + + public FoundryTank() { + super(Material.rock); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":foundry_tank_top"); + this.iconSide = iconRegister.registerIcon(RefStrings.MODID + ":foundry_tank_side"); + this.iconSideUpper = iconRegister.registerIcon(RefStrings.MODID + ":foundry_tank_upper"); + this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":foundry_tank_bottom"); + this.iconInner = iconRegister.registerIcon(RefStrings.MODID + ":foundry_tank_inner"); + this.iconLava = iconRegister.registerIcon(RefStrings.MODID + ":lava_gray"); + } + + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return true; + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityFoundryTank(); + } + + @Override + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).canAcceptPartialPour(world, x, y, z, dX, dY, dZ, side, stack); + } + + @Override + public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).pour(world, x, y, z, dX, dY, dZ, side, stack); + } + + @Override public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return false; } + @Override public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return stack; } + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); + + @Override + public int getRenderType() { + return renderID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) { + return true; + } + + TileEntityFoundryTank cast = (TileEntityFoundryTank) world.getTileEntity(x, y, z); + + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemTool && ((ItemTool) player.getHeldItem().getItem()).getToolClasses(player.getHeldItem()).contains("shovel")) { + if(cast.amount > 0) { + ItemStack scrap = ItemScraps.create(new MaterialStack(cast.type, cast.amount)); + if(!player.inventory.addItemStackToInventory(scrap)) { + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + } else { + player.inventoryContainer.detectAndSendChanges(); + } + cast.amount = 0; + cast.type = null; + cast.markDirty(); + world.markBlockForUpdate(x, y, z); + } + return true; + } + + return false; + } + + @Override + public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { + return side != ForgeDirection.UP; + } +} diff --git a/src/main/java/com/hbm/blocks/machine/MachineCrucible.java b/src/main/java/com/hbm/blocks/machine/MachineCrucible.java index f55de661f..d3c9f996f 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCrucible.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCrucible.java @@ -1,10 +1,20 @@ package com.hbm.blocks.machine; +import java.util.ArrayList; +import java.util.List; + import com.hbm.blocks.BlockDummyable; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.machine.ItemScraps; +import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityCrucible; +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemTool; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; @@ -32,7 +42,40 @@ public class MachineCrucible extends BlockDummyable { @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - return this.standardOpenBehavior(world, x, y, z, player, 0); + + if(world.isRemote) { + return true; + } else if(!player.isSneaking()) { + int[] pos = this.findCore(world, x, y, z); + + if(pos == null) + return false; + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemTool && ((ItemTool) player.getHeldItem().getItem()).getToolClasses(player.getHeldItem()).contains("shovel")) { + TileEntityCrucible crucible = (TileEntityCrucible) world.getTileEntity(pos[0], pos[1], pos[2]); + List stacks = new ArrayList(); + stacks.addAll(crucible.recipeStack); + stacks.addAll(crucible.wasteStack); + + for(MaterialStack stack : stacks) { + ItemStack scrap = ItemScraps.create(new MaterialStack(stack.material, stack.amount)); + if(!player.inventory.addItemStackToInventory(scrap)) { + EntityItem item = new EntityItem(world, x + hitX, y + hitY, z + hitZ, scrap); + world.spawnEntityInWorld(item); + } + } + + player.inventoryContainer.detectAndSendChanges(); + crucible.recipeStack.clear(); + crucible.wasteStack.clear(); + crucible.markDirty(); + + } else { + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, pos[0], pos[1], pos[2]); + } + return true; + } else { + return true; + } } @Override diff --git a/src/main/java/com/hbm/inventory/SlotNonRetarded.java b/src/main/java/com/hbm/inventory/SlotNonRetarded.java new file mode 100644 index 000000000..c2d81ed61 --- /dev/null +++ b/src/main/java/com/hbm/inventory/SlotNonRetarded.java @@ -0,0 +1,24 @@ +package com.hbm.inventory; + +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +/** + * Because vanilla slots have severe mental disabilities that prevent them from working as expected. + * @author hbm + */ +public class SlotNonRetarded extends Slot { + + public SlotNonRetarded(IInventory inventory, int id, int x, int y) { + super(inventory, id, x, y); + } + + /** + * Dear mojang: Why wasn't that the standard to begin with? What do IInventories have isItemValidForSlot when by default nothing fucking uses it? + */ + @Override + public boolean isItemValid(ItemStack stack) { + return inventory.isItemValidForSlot(this.slotNumber, stack); + } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrucible.java b/src/main/java/com/hbm/inventory/container/ContainerCrucible.java index 7d7074a47..5061bb4a6 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrucible.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrucible.java @@ -1,5 +1,6 @@ package com.hbm.inventory.container; +import com.hbm.inventory.SlotNonRetarded; import com.hbm.tileentity.machine.TileEntityCrucible; import com.hbm.util.InventoryUtil; @@ -17,12 +18,12 @@ public class ContainerCrucible extends Container { this.crucible = crucible; //template - this.addSlotToContainer(new Slot(crucible, 0, 107, 81)); + this.addSlotToContainer(new SlotNonRetarded(crucible, 0, 107, 81)); //input for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { - this.addSlotToContainer(new Slot(crucible, j + i * 3 + 1, 107 + j * 18, 18 + i * 18)); + this.addSlotToContainer(new SlotNonRetarded(crucible, j + i * 3 + 1, 107 + j * 18, 18 + i * 18)); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUICrucible.java b/src/main/java/com/hbm/inventory/gui/GUICrucible.java index 65b7dfdb8..aa1893b21 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICrucible.java +++ b/src/main/java/com/hbm/inventory/gui/GUICrucible.java @@ -63,8 +63,8 @@ public class GUICrucible extends GuiInfoContainer { int hGauge = crucible.heat * 33 / crucible.maxHeat; if(hGauge > 0) drawTexturedModalRect(guiLeft + 126, guiTop + 91, 176, 5, hGauge, 5); - if(!crucible.recipeStack.isEmpty()) drawStack(crucible.recipeStack, crucible.recipeCapacity, 62, 97); - if(!crucible.wasteStack.isEmpty()) drawStack(crucible.wasteStack, crucible.wasteCapacity, 17, 97); + if(!crucible.recipeStack.isEmpty()) drawStack(crucible.recipeStack, crucible.recipeZCapacity, 62, 97); + if(!crucible.wasteStack.isEmpty()) drawStack(crucible.wasteStack, crucible.wasteZCapacity, 17, 97); } protected void drawStackInfo(List stack, int mouseX, int mouseY, int x, int y) { diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java b/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java index d0041b0e7..91f9f42e1 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java @@ -13,6 +13,7 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.recipes.AssemblerRecipes; import com.hbm.inventory.recipes.ChemplantRecipes; import com.hbm.inventory.recipes.ChemplantRecipes.ChemRecipe; +import com.hbm.inventory.recipes.CrucibleRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemAssemblyTemplate; import com.hbm.items.machine.ItemCassette; @@ -88,6 +89,11 @@ public class GUIScreenTemplateFolder extends GuiScreen { ChemRecipe chem = ChemplantRecipes.recipes.get(i); allStacks.add(new ItemStack(ModItems.chemistry_template, 1, chem.getId())); } + + // Crucible Templates + for(int i = 0; i < CrucibleRecipes.recipes.size(); i++) { + allStacks.add(new ItemStack(ModItems.crucible_template, 1, CrucibleRecipes.recipes.get(i).getId())); + } } else { for(int i = 0; i < AssemblerRecipes.recipeList.size(); i++) { @@ -290,19 +296,21 @@ public class GUIScreenTemplateFolder extends GuiScreen { public void drawIcon(boolean b) { try { - RenderHelper.enableGUIStandardItemLighting(); - GL11.glDisable(GL11.GL_LIGHTING); - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)240 / 1.0F, (float)240 / 1.0F); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float) 240 / 1.0F, (float) 240 / 1.0F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); if(stack != null) { if(stack.getItem() == ModItems.assembly_template) itemRender.renderItemAndEffectIntoGUI(fontRendererObj, mc.getTextureManager(), AssemblerRecipes.getOutputFromTempate(stack), xPos + 1, yPos + 1); else if(stack.getItem() == ModItems.chemistry_template) itemRender.renderItemAndEffectIntoGUI(fontRendererObj, mc.getTextureManager(), new ItemStack(ModItems.chemistry_icon, 1, stack.getItemDamage()), xPos + 1, yPos + 1); + else if(stack.getItem() == ModItems.crucible_template) + itemRender.renderItemAndEffectIntoGUI(fontRendererObj, mc.getTextureManager(), CrucibleRecipes.indexMapping.get(stack.getItemDamage()).icon, xPos + 1, yPos + 1); else itemRender.renderItemAndEffectIntoGUI(fontRendererObj, mc.getTextureManager(), stack, xPos + 1, yPos + 1); } - GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_LIGHTING); } catch(Exception x) { } } diff --git a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java index 072faee53..9234b5487 100644 --- a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java @@ -10,6 +10,9 @@ import com.google.gson.stream.JsonWriter; import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.inventory.recipes.loader.SerializableRecipe; +import com.hbm.items.ModItems; + +import net.minecraft.item.ItemStack; public class CrucibleRecipes extends SerializableRecipe { @@ -24,17 +27,17 @@ public class CrucibleRecipes extends SerializableRecipe { @Override public void registerDefaults() { - recipes.add(new CrucibleRecipe(0, "crucible.steel", 1) - .inputs(new MaterialStack(Mats.MAT_IRON, 10), new MaterialStack(Mats.MAT_COAL, 15)) - .outputs(new MaterialStack(Mats.MAT_STEEL, 10))); + recipes.add(new CrucibleRecipe(0, "crucible.steel", 1, new ItemStack(ModItems.ingot_steel)) + .inputs(new MaterialStack(Mats.MAT_IRON, 8), new MaterialStack(Mats.MAT_COAL, 8)) + .outputs(new MaterialStack(Mats.MAT_STEEL, 8))); - recipes.add(new CrucibleRecipe(1, "crucible.redcopper", 1) - .inputs(new MaterialStack(Mats.MAT_STEEL, 10), new MaterialStack(Mats.MAT_REDSTONE, 10)) - .outputs(new MaterialStack(Mats.MAT_MINGRADE, 20))); + recipes.add(new CrucibleRecipe(1, "crucible.redcopper", 1, new ItemStack(ModItems.ingot_red_copper)) + .inputs(new MaterialStack(Mats.MAT_COPPER, 8), new MaterialStack(Mats.MAT_REDSTONE, 8)) + .outputs(new MaterialStack(Mats.MAT_MINGRADE, 16))); - recipes.add(new CrucibleRecipe(2, "crucible.aa", 1) - .inputs(new MaterialStack(Mats.MAT_STEEL, 10), new MaterialStack(Mats.MAT_MINGRADE, 10)) - .outputs(new MaterialStack(Mats.MAT_ALLOY, 20))); + recipes.add(new CrucibleRecipe(2, "crucible.aa", 1, new ItemStack(ModItems.ingot_advanced_alloy)) + .inputs(new MaterialStack(Mats.MAT_STEEL, 8), new MaterialStack(Mats.MAT_MINGRADE, 8)) + .outputs(new MaterialStack(Mats.MAT_ALLOY, 16))); } public static class CrucibleRecipe { @@ -43,11 +46,13 @@ public class CrucibleRecipes extends SerializableRecipe { private int id; private String name; public int frequency = 1; + public ItemStack icon; - public CrucibleRecipe(int id, String name, int frequency) { + public CrucibleRecipe(int id, String name, int frequency, ItemStack icon) { this.id = id; this.name = name; this.frequency = frequency; + this.icon = icon; if(!indexMapping.containsKey(id)) { indexMapping.put(id, this); diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index 4c5ad09d4..8d1dfcfec 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -273,6 +273,13 @@ public class AnvilRecipes { new ComparableStack(ModItems.sawblade) }, new AnvilOutput(new ItemStack(ModBlocks.machine_sawmill))).setTier(2)); + constructionRecipes.add(new AnvilConstructionRecipe( + new AStack[] { + new ComparableStack(ModItems.ingot_firebrick, 20), + new OreDictStack(CU.ingot(), 8), + new OreDictStack(STEEL.plate(), 8) + }, new AnvilOutput(new ItemStack(ModBlocks.machine_crucible))).setTier(2)); + constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { new OreDictStack(STEEL.ingot(), 6), diff --git a/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java b/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java index b6171bd28..4d062b85b 100644 --- a/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java +++ b/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java @@ -6,6 +6,7 @@ import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.inventory.recipes.CrucibleRecipes; import com.hbm.inventory.recipes.CrucibleRecipes.CrucibleRecipe; +import com.hbm.util.I18nUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -13,6 +14,7 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; public class ItemCrucibleTemplate extends Item { @@ -37,17 +39,16 @@ public class ItemCrucibleTemplate extends Item { if(recipe == null) { return; } - - list.add("Input:"); + + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("info.template_out_p")); + for(MaterialStack out : recipe.output) { + list.add(out.material.names[0] + ": " + Mats.formatAmount(out.amount)); + } + + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("info.template_in_p")); for(MaterialStack in : recipe.input) { - list.add("- " + in.material.names[0] + ": " + Mats.formatAmount(in.amount)); - } - - list.add("Output:"); - - for(MaterialStack out : recipe.output) { - list.add("- " + out.material.names[0] + ": " + Mats.formatAmount(out.amount)); + list.add(in.material.names[0] + ": " + Mats.formatAmount(in.amount)); } } } diff --git a/src/main/java/com/hbm/items/machine/ItemScraps.java b/src/main/java/com/hbm/items/machine/ItemScraps.java index ca3606c70..3e2a0f45e 100644 --- a/src/main/java/com/hbm/items/machine/ItemScraps.java +++ b/src/main/java/com/hbm/items/machine/ItemScraps.java @@ -35,7 +35,7 @@ public class ItemScraps extends Item { MaterialStack contents = getMats(stack); if(contents != null) { - list.add(contents.material.names[0] + " " + Mats.formatAmount(contents.amount)); + list.add(contents.material.names[0] + ", " + Mats.formatAmount(contents.amount)); } } diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 5f0ba1133..54a1d2560 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -744,10 +744,11 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerBlockHandler(new RenderBoxDuct()); RenderingRegistry.registerBlockHandler(new RenderBlockDecoModel(ModBlocks.deco_computer.getRenderType(), ResourceManager.deco_computer)); - RenderingRegistry.registerBlockHandler(new RenderBasin()); - RenderingRegistry.registerBlockHandler(new RenderMold()); - RenderingRegistry.registerBlockHandler(new RenderChannel()); - RenderingRegistry.registerBlockHandler(new RenderOutlet()); + RenderingRegistry.registerBlockHandler(new RenderFoundryBasin()); + RenderingRegistry.registerBlockHandler(new RenderFoundryMold()); + RenderingRegistry.registerBlockHandler(new RenderFoundryChannel()); + RenderingRegistry.registerBlockHandler(new RenderFoundryTank()); + RenderingRegistry.registerBlockHandler(new RenderFoundryOutlet()); RenderingRegistry.registerBlockHandler(new RenderBlockRotated(ModBlocks.charge_dynamite.getRenderType(), ResourceManager.charge_dynamite)); RenderingRegistry.registerBlockHandler(new RenderBlockRotated(ModBlocks.charge_c4.getRenderType(), ResourceManager.charge_c4)); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index e767c9848..28008617b 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -954,6 +954,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.foundry_basin), new Object[] { "B B", "B B", "BSB", 'B', ModItems.ingot_firebrick, 'S', Blocks.stone_slab }); addRecipeAuto(new ItemStack(ModBlocks.foundry_mold), new Object[] { "B B", "BSB", 'B', ModItems.ingot_firebrick, 'S', Blocks.stone_slab }); addRecipeAuto(new ItemStack(ModBlocks.foundry_channel, 4), new Object[] { "B B", " S ", 'B', ModItems.ingot_firebrick, 'S', Blocks.stone_slab }); + addRecipeAuto(new ItemStack(ModBlocks.foundry_tank), new Object[] { "B B", "I I", "BSB", 'B', ModItems.ingot_firebrick, 'I', STEEL.ingot(), 'S', Blocks.stone_slab }); addShapelessAuto(new ItemStack(ModBlocks.foundry_outlet), new Object[] { ModBlocks.foundry_channel, STEEL.plate() }); addRecipeAuto(new ItemStack(ModItems.mold_base), new Object[] { " B ", "BIB", " B ", 'B', ModItems.ingot_firebrick, 'I', IRON.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.brick_fire), new Object[] { "BB", "BB", 'B', ModItems.ingot_firebrick }); diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 307565a7c..9f713ec5c 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -25,8 +25,6 @@ import com.hbm.interfaces.IItemHUD; import com.hbm.interfaces.Spaghetti; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.gui.GUIArmorTable; -import com.hbm.inventory.material.Mats; -import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.items.ISyncButtons; import com.hbm.items.ModItems; import com.hbm.items.armor.ArmorFSB; @@ -644,14 +642,14 @@ public class ModEventHandlerClient { list.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("cannery.f1")); } - ItemStack copy = stack.copy(); + /*ItemStack copy = stack.copy(); List materials = Mats.getMaterialsFromItem(copy); if(!materials.isEmpty()) { for(MaterialStack mat : materials) { list.add(EnumChatFormatting.DARK_PURPLE + mat.material.names[0] + ": " + Mats.formatAmount(mat.amount * stack.stackSize)); } - } + }*/ } private ResourceLocation ashes = new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_ash.png"); diff --git a/src/main/java/com/hbm/packet/ItemFolderPacket.java b/src/main/java/com/hbm/packet/ItemFolderPacket.java index 14b9671b2..d585db46b 100644 --- a/src/main/java/com/hbm/packet/ItemFolderPacket.java +++ b/src/main/java/com/hbm/packet/ItemFolderPacket.java @@ -6,6 +6,7 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemAssemblyTemplate; import com.hbm.items.machine.ItemCassette; import com.hbm.items.machine.ItemChemistryTemplate; +import com.hbm.items.machine.ItemCrucibleTemplate; import com.hbm.items.machine.ItemFluidIdentifier; import com.hbm.util.InventoryUtil; @@ -85,6 +86,10 @@ public class ItemFolderPacket implements IMessage { tryMakeItem(p, stack, Items.paper, "dye"); return null; } + if(stack.getItem() instanceof ItemCrucibleTemplate) { + tryMakeItem(p, stack, Items.paper, "dye"); + return null; + } if(stack.getItem() instanceof ItemCassette) { tryMakeItem(p, stack, ModItems.plate_polymer, "plateSteel"); return null; diff --git a/src/main/java/com/hbm/render/block/RenderBasin.java b/src/main/java/com/hbm/render/block/RenderFoundryBasin.java similarity index 97% rename from src/main/java/com/hbm/render/block/RenderBasin.java rename to src/main/java/com/hbm/render/block/RenderFoundryBasin.java index a13e97ca4..3cc464284 100644 --- a/src/main/java/com/hbm/render/block/RenderBasin.java +++ b/src/main/java/com/hbm/render/block/RenderFoundryBasin.java @@ -11,7 +11,7 @@ import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.world.IBlockAccess; -public class RenderBasin implements ISimpleBlockRenderingHandler { +public class RenderFoundryBasin implements ISimpleBlockRenderingHandler { @Override public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { diff --git a/src/main/java/com/hbm/render/block/RenderChannel.java b/src/main/java/com/hbm/render/block/RenderFoundryChannel.java similarity index 99% rename from src/main/java/com/hbm/render/block/RenderChannel.java rename to src/main/java/com/hbm/render/block/RenderFoundryChannel.java index 8d5cc6423..666373832 100644 --- a/src/main/java/com/hbm/render/block/RenderChannel.java +++ b/src/main/java/com/hbm/render/block/RenderFoundryChannel.java @@ -16,7 +16,7 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.IBlockAccess; -public class RenderChannel implements ISimpleBlockRenderingHandler { +public class RenderFoundryChannel implements ISimpleBlockRenderingHandler { @Override public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { diff --git a/src/main/java/com/hbm/render/block/RenderMold.java b/src/main/java/com/hbm/render/block/RenderFoundryMold.java similarity index 98% rename from src/main/java/com/hbm/render/block/RenderMold.java rename to src/main/java/com/hbm/render/block/RenderFoundryMold.java index d2dbacf7a..fb29141a4 100644 --- a/src/main/java/com/hbm/render/block/RenderMold.java +++ b/src/main/java/com/hbm/render/block/RenderFoundryMold.java @@ -11,7 +11,7 @@ import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.world.IBlockAccess; -public class RenderMold implements ISimpleBlockRenderingHandler { +public class RenderFoundryMold implements ISimpleBlockRenderingHandler { @Override public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { diff --git a/src/main/java/com/hbm/render/block/RenderOutlet.java b/src/main/java/com/hbm/render/block/RenderFoundryOutlet.java similarity index 73% rename from src/main/java/com/hbm/render/block/RenderOutlet.java rename to src/main/java/com/hbm/render/block/RenderFoundryOutlet.java index 1a67ab3f9..743ba6306 100644 --- a/src/main/java/com/hbm/render/block/RenderOutlet.java +++ b/src/main/java/com/hbm/render/block/RenderFoundryOutlet.java @@ -3,6 +3,7 @@ package com.hbm.render.block; import org.lwjgl.opengl.GL11; import com.hbm.blocks.machine.FoundryOutlet; +import com.hbm.tileentity.machine.TileEntityFoundryOutlet; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import net.minecraft.block.Block; @@ -11,7 +12,7 @@ import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.world.IBlockAccess; -public class RenderOutlet implements ISimpleBlockRenderingHandler { +public class RenderFoundryOutlet implements ISimpleBlockRenderingHandler { @Override public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { @@ -81,6 +82,7 @@ public class RenderOutlet implements ISimpleBlockRenderingHandler { FoundryOutlet outlet = (FoundryOutlet) block; int meta = world.getBlockMetadata(x, y, z); + TileEntityFoundryOutlet tile = (TileEntityFoundryOutlet) world.getTileEntity(x, y, z); int brightness = block.getMixedBrightnessForBlock(world, x, y, z); tessellator.setBrightness(brightness); @@ -100,7 +102,20 @@ public class RenderOutlet implements ISimpleBlockRenderingHandler { renderer.renderFaceZNeg(block, x, y, z + 0.3125D, outlet.iconInner); renderer.field_152631_f = false; tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXPos(block, x, y, z, outlet.iconFront); renderer.renderFaceXNeg(block, x, y, z, outlet.iconFront); + + if(tile.filter != null) { + renderer.setRenderBounds(0.96875D, 0.0625, 0.375D, 0.96875D, top, 0.625D); + renderer.renderFaceXPos(block, x, y, z, outlet.iconFilter); + renderer.renderFaceXNeg(block, x, y, z, outlet.iconFilter); + } + + if(tile.isClosed()) { + renderer.setRenderBounds(0.9375D, 0.0625, 0.375D, 0.9375D, top, 0.625D); + renderer.renderFaceXPos(block, x, y, z, outlet.iconLock); + renderer.renderFaceXNeg(block, x, y, z, outlet.iconLock); + } } if(meta == 5) { @@ -119,6 +134,19 @@ public class RenderOutlet implements ISimpleBlockRenderingHandler { renderer.field_152631_f = false; tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); renderer.renderFaceXPos(block, x, y, z, outlet.iconFront); + renderer.renderFaceXNeg(block, x, y, z, outlet.iconFront); + + if(tile.filter != null) { + renderer.setRenderBounds(0.03125D, 0.0625, 0.375D, 0.03125D, top, 0.625D); + renderer.renderFaceXPos(block, x, y, z, outlet.iconFilter); + renderer.renderFaceXNeg(block, x, y, z, outlet.iconFilter); + } + + if(tile.isClosed()) { + renderer.setRenderBounds(0.0625D, 0.0625, 0.375D, 0.0625D, top, 0.625D); + renderer.renderFaceXPos(block, x, y, z, outlet.iconLock); + renderer.renderFaceXNeg(block, x, y, z, outlet.iconLock); + } } if(meta == 2) { @@ -136,7 +164,20 @@ public class RenderOutlet implements ISimpleBlockRenderingHandler { renderer.renderFaceXNeg(block, x, y, z, outlet.iconSide); renderer.renderFaceXNeg(block, x + 0.3125D, y, z, outlet.iconInner); tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZPos(block, x, y, z, outlet.iconFront); renderer.renderFaceZNeg(block, x, y, z, outlet.iconFront); + + if(tile.filter != null) { + renderer.setRenderBounds(0.375D, 0.0625, 0.96875D, 0.625D, top, 0.96875D); + renderer.renderFaceZPos(block, x, y, z, outlet.iconFilter); + renderer.renderFaceZNeg(block, x, y, z, outlet.iconFilter); + } + + if(tile.isClosed()) { + renderer.setRenderBounds(0.375D, 0.0625, 0.9375D, 0.625D, top, 0.9375D); + renderer.renderFaceZPos(block, x, y, z, outlet.iconLock); + renderer.renderFaceZNeg(block, x, y, z, outlet.iconLock); + } } if(meta == 3) { @@ -155,6 +196,19 @@ public class RenderOutlet implements ISimpleBlockRenderingHandler { renderer.renderFaceXNeg(block, x + 0.3125D, y, z, outlet.iconInner); tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); renderer.renderFaceZPos(block, x, y, z, outlet.iconFront); + renderer.renderFaceZNeg(block, x, y, z, outlet.iconFront); + + if(tile.filter != null) { + renderer.setRenderBounds(0.375D, 0.0625D, 0.03125, 0.625D, top, 0.03125D); + renderer.renderFaceZPos(block, x, y, z, outlet.iconFilter); + renderer.renderFaceZNeg(block, x, y, z, outlet.iconFilter); + } + + if(tile.isClosed()) { + renderer.setRenderBounds(0.375D, 0.0625, 0.0625D, 0.625D, top, 0.0625D); + renderer.renderFaceZPos(block, x, y, z, outlet.iconLock); + renderer.renderFaceZNeg(block, x, y, z, outlet.iconLock); + } } return true; diff --git a/src/main/java/com/hbm/render/block/RenderFoundryTank.java b/src/main/java/com/hbm/render/block/RenderFoundryTank.java new file mode 100644 index 000000000..9d0863248 --- /dev/null +++ b/src/main/java/com/hbm/render/block/RenderFoundryTank.java @@ -0,0 +1,201 @@ +package com.hbm.render.block; + +import java.awt.Color; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.machine.FoundryTank; +import com.hbm.tileentity.machine.TileEntityFoundryTank; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; + +public class RenderFoundryTank implements ISimpleBlockRenderingHandler { + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + FoundryTank basin = (FoundryTank) block; + double x = 0; + double y = 0; + double z = 0; + + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + + tessellator.startDrawingQuads(); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, basin.iconTop); + renderer.renderFaceYPos(block, x, y - 0.875D, z, basin.iconBottom); + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg(block, x, y, z, basin.iconBottom); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, basin.iconSide); + renderer.renderFaceXPos(block, x - 0.875D, y, z, basin.iconInner); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, basin.iconSide); + renderer.renderFaceXNeg(block, x + 0.875D, y, z, basin.iconInner); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, basin.iconSide); + renderer.renderFaceZPos(block, x, y, z - 0.875D, basin.iconInner); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, basin.iconSide); + renderer.renderFaceZNeg(block, x, y, z + 0.875D, basin.iconInner); + tessellator.draw(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + int colorMult = block.colorMultiplier(world, x, y, z); + float r = (float) (colorMult >> 16 & 255) / 255.0F; + float g = (float) (colorMult >> 8 & 255) / 255.0F; + float b = (float) (colorMult & 255) / 255.0F; + + float mulBottom = 0.5F; + float mulTop = 1.0F; + float mulZ = 0.8F; + float mulX = 0.6F; + + int brightness = block.getMixedBrightnessForBlock(world, x, y, z); + int fullBright = 240; + tessellator.setBrightness(brightness); + + if(EntityRenderer.anaglyphEnable) { + float aR = (r * 30.0F + g * 59.0F + b * 11.0F) / 100.0F; + float aG = (r * 30.0F + g * 70.0F) / 100.0F; + float aB = (r * 30.0F + b * 70.0F) / 100.0F; + r = aR; + g = aG; + b = aB; + } + + FoundryTank tank = (FoundryTank) block; + + TileEntity te = world.getTileEntity(x, y, z); + TileEntityFoundryTank tile = null; + + if(te instanceof TileEntityFoundryTank) { + tile = (TileEntityFoundryTank) te; + } + + boolean conPosX = world.getBlock(x + 1, y, z) == ModBlocks.foundry_tank; + boolean conNegX = world.getBlock(x - 1, y, z) == ModBlocks.foundry_tank; + boolean conPosZ = world.getBlock(x, y, z + 1) == ModBlocks.foundry_tank; + boolean conNegZ = world.getBlock(x, y, z - 1) == ModBlocks.foundry_tank; + boolean conPosY = world.getBlock(x, y + 1, z) == ModBlocks.foundry_tank; + boolean conNegY = world.getBlock(x, y - 1, z) == ModBlocks.foundry_tank; + + boolean doRender = tile != null ? (tile.amount > 0 && tile.type != null) : false; + double max = 0.75D + (conNegY ? 0.125D : 0) + (conPosY ? 0.125D : 0); + double level = doRender ? tile.amount * max / tile.getCapacity() : 0; + Color color = doRender ? new Color(tile.type.moltenColor).brighter() : null; + + if(color != null) { + double brightener = 0.7D; + int nr = (int) (255D - (255D - color.getRed()) * brightener); + int ng = (int) (255D - (255D - color.getGreen()) * brightener); + int nb = (int) (255D - (255D - color.getBlue()) * brightener); + + color = new Color(nr, ng, nb); + } + + renderer.setRenderBounds(0D, 0D, 0D, 1D, 1D, 1D); + + if(!conNegY) { + renderer.setRenderBounds(0D, 0D, 0D, 1D, 0.125D, 1D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, tank.iconBottom); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, tank.iconBottom); + } + + if(!conPosX) { + renderer.setRenderBounds(0.875D, 0D, 0D, 1D, 1D, 1D); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXPos(block, x, y, z, conNegY ? tank.iconSideUpper : tank.iconSide); + renderer.renderFaceXNeg(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + if(conPosZ) renderer.renderFaceZPos(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + if(conNegZ) renderer.renderFaceZNeg(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, tank.iconTop); + } + + if(!conNegX) { + renderer.setRenderBounds(0D, 0D, 0D, 0.125D, 1D, 1D); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXPos(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + renderer.renderFaceXNeg(block, x, y, z, conNegY ? tank.iconSideUpper : tank.iconSide); + + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + if(conPosZ) renderer.renderFaceZPos(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + if(conNegZ) renderer.renderFaceZNeg(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, tank.iconTop); + } + + if(!conPosZ) { + renderer.setRenderBounds(0D, 0D, 0.875D, 1D, 1D, 1D); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZPos(block, x, y, z, conNegY ? tank.iconSideUpper : tank.iconSide); + renderer.renderFaceZNeg(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + if(conPosX) renderer.renderFaceXPos(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + if(conNegX) renderer.renderFaceXNeg(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, tank.iconTop); + } + + if(!conNegZ) { + renderer.setRenderBounds(0D, 0D, 0D, 1D, 1D, 0.125D); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZPos(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + renderer.renderFaceZNeg(block, x, y, z, conNegY ? tank.iconSideUpper : tank.iconSide); + + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + if(conPosX) renderer.renderFaceXPos(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + if(conNegX) renderer.renderFaceXNeg(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, tank.iconTop); + } + + if(doRender) { + double height = conNegY ? 0D : 0.125D; + renderer.setRenderBounds(0D, height, 0D, 1D, height + level, 1D); + tessellator.setColorOpaque_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + tessellator.setBrightness(fullBright); + renderer.renderFaceYPos(block, x, y, z, tank.iconLava); + if(conPosX) renderer.renderFaceXPos(block, x, y, z, tank.iconLava); + if(conNegX) renderer.renderFaceXNeg(block, x, y, z, tank.iconLava); + if(conPosZ) renderer.renderFaceZPos(block, x, y, z, tank.iconLava); + if(conNegZ) renderer.renderFaceZNeg(block, x, y, z, tank.iconLava); + tessellator.setBrightness(brightness); + } + + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return FoundryTank.renderID; + } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderCrucible.java b/src/main/java/com/hbm/render/tileentity/RenderCrucible.java index 5d710e10a..abaacf24c 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderCrucible.java +++ b/src/main/java/com/hbm/render/tileentity/RenderCrucible.java @@ -42,7 +42,7 @@ public class RenderCrucible extends TileEntitySpecialRenderer implements IItemRe TileEntityCrucible crucible = (TileEntityCrucible) tile; if(!crucible.recipeStack.isEmpty() || !crucible.wasteStack.isEmpty()) { - int totalCap = crucible.recipeCapacity + crucible.wasteCapacity; + int totalCap = crucible.recipeZCapacity + crucible.wasteZCapacity; int totalMass = 0; for(MaterialStack stack : crucible.recipeStack) totalMass += stack.amount; diff --git a/src/main/java/com/hbm/render/tileentity/RenderFoundry.java b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java index c9c2d8a21..7f3de13af 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderFoundry.java +++ b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java @@ -90,7 +90,6 @@ public class RenderFoundry extends TileEntitySpecialRenderer { if(foundry.shouldRender()) { - GL11.glDepthMask(false); this.bindTexture(lava); int hex = foundry.getMat().moltenColor; @@ -112,6 +111,7 @@ public class RenderFoundry extends TileEntitySpecialRenderer { tess.addVertexWithUV(foundry.maxX(), foundry.getLevel(), foundry.minZ(), foundry.minZ(), foundry.minX()); tess.draw(); + GL11.glDepthMask(false); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); tess.startDrawingQuads(); diff --git a/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java b/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java index 168311b29..d2ea47b0f 100644 --- a/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java +++ b/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java @@ -26,7 +26,7 @@ public class RenderAccessoryUtility { private static ResourceLocation nostalgia = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeNostalgia.png"); private static ResourceLocation nostalgia2 = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeNostalgia2.png"); private static ResourceLocation sam = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeSam.png"); - private static ResourceLocation hoboy = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeHoboy.png"); + private static ResourceLocation hoboy = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeHoboy_mk3.png"); private static ResourceLocation master = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeMaster.png"); private static ResourceLocation mek = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeMek.png"); private static ResourceLocation zippy = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeZippySqrl.png"); diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 4144bc497..90cf23c00 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -255,6 +255,7 @@ public class TileMappings { put(TileEntityFoundryMold.class, "tileentity_foundry_mold"); put(TileEntityFoundryBasin.class, "tileentity_foundry_basin"); put(TileEntityFoundryChannel.class, "tileentity_foundry_channel"); + put(TileEntityFoundryTank.class, "tileentity_foundry_tank"); put(TileEntityFoundryOutlet.class, "tileentity_foundry_outlet"); put(TileEntityMachineAutocrafter.class, "tileentity_autocrafter"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index 859e29b88..76412caa9 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -42,8 +42,10 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro public static final int processTime = 20_000; public static final double diffusion = 0.25D; - public final int recipeCapacity = MaterialShapes.BLOCK.q(16); - public final int wasteCapacity = MaterialShapes.BLOCK.q(16); + //because eclipse's auto complete is dumb as a fucking rock, it's now called "ZCapacity" so it's listed AFTER the actual stacks in the auto complete list. + //also martin i know you read these: no i will not switch to intellij after using eclipse for 8 years. + public final int recipeZCapacity = MaterialShapes.BLOCK.q(16); + public final int wasteZCapacity = MaterialShapes.BLOCK.q(16); public List recipeStack = new ArrayList(); public List wasteStack = new ArrayList(); @@ -95,7 +97,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro } } - int totalCap = recipeCapacity + wasteCapacity; + int totalCap = recipeZCapacity + wasteZCapacity; int totalMass = 0; for(MaterialStack stack : recipeStack) totalMass += stack.amount; @@ -288,6 +290,16 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro return -1; } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack) { + + if(i == 0) { + return stack.getItem() == ModItems.crucible_template; + } + + return isItemSmeltable(stack); + } public boolean isItemSmeltable(ItemStack stack) { @@ -317,7 +329,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro } else { //the maximum is the recipe's ratio scaled up to the recipe stack's capacity - int matMaximum = recipeInputRequired * this.recipeCapacity / recipeContent; + int matMaximum = recipeInputRequired * this.recipeZCapacity / recipeContent; int amountStored = getQuantaFromType(recipeStack, mat.material); matchesRecipe = true; @@ -329,7 +341,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro } //if the waste amount doesn't exceed the capacity and the recipe matches (or isn't null), return true - return wasteAmount <= this.wasteCapacity && matchesRecipe; + return wasteAmount <= this.wasteZCapacity && matchesRecipe; } public void addToStack(List stack, MaterialStack matStack) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java index d156bfc0a..11525880c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java @@ -30,6 +30,7 @@ public class TileEntityFoundryChannel extends TileEntityFoundryBase { if(nextUpdate <= 0 && this.amount > 0 && this.type != null) { + boolean hasOp = false; nextUpdate = worldObj.rand.nextInt(6) + 5; List ints = new ArrayList() {{ add(2); add(3); add(4); add(5); }}; @@ -50,36 +51,39 @@ public class TileEntityFoundryChannel extends TileEntityFoundryBase { } else { this.amount = left.amount; } - return; + hasOp = true; + break; } } } - for(Integer i : ints) { - ForgeDirection dir = ForgeDirection.getOrientation(i); - TileEntity b = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); - - if(b instanceof TileEntityFoundryChannel) { - TileEntityFoundryChannel acc = (TileEntityFoundryChannel) b; + if(!hasOp) { + for(Integer i : ints) { + ForgeDirection dir = ForgeDirection.getOrientation(i); + TileEntity b = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); - if(acc.type == null || acc.type == this.type || acc.amount == 0) { - acc.type = this.type; + if(b instanceof TileEntityFoundryChannel) { + TileEntityFoundryChannel acc = (TileEntityFoundryChannel) b; - if(worldObj.rand.nextInt(5) == 0) { - //1:4 chance that the fill states are simply swapped - //this promotes faster spreading and prevents spread limits - int buf = this.amount; - this.amount = acc.amount; - acc.amount = buf; + if(acc.type == null || acc.type == this.type || acc.amount == 0) { + acc.type = this.type; - } else { - //otherwise, equalize the neighbors - int diff = this.amount - acc.amount; - - if(diff > 0) { - diff /= 2; - this.amount -= diff; - acc.amount += diff; + if(worldObj.rand.nextInt(5) == 0) { + //1:4 chance that the fill states are simply swapped + //this promotes faster spreading and prevents spread limits + int buf = this.amount; + this.amount = acc.amount; + acc.amount = buf; + + } else { + //otherwise, equalize the neighbors + int diff = this.amount - acc.amount; + + if(diff > 0) { + diff /= 2; + this.amount -= diff; + acc.amount += diff; + } } } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java index c12d80656..484375a16 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java @@ -1,10 +1,12 @@ package com.hbm.tileentity.machine; +import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.inventory.material.NTMMaterial; import com.hbm.util.CrucibleUtil; import api.hbm.block.ICrucibleAcceptor; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; @@ -15,11 +17,25 @@ public class TileEntityFoundryOutlet extends TileEntityFoundryBase { public NTMMaterial filter = null; /** inverts redstone behavior, i.e. when TRUE, the outlet will be blocked by default and only open with redstone */ public boolean invertRedstone = false; + public boolean lastClosed = false; /** if TRUE, prevents all fluids from flowing through the outlet and renders a small barrier */ public boolean isClosed() { return invertRedstone ^ this.worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); } + + @Override + public void updateEntity() { + super.updateEntity(); + + if(worldObj.isRemote) { + boolean isClosed = isClosed(); + if(this.lastClosed != isClosed) { + this.lastClosed = isClosed; + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + } @Override public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return false; } @Override public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return stack; } @@ -62,4 +78,18 @@ public class TileEntityFoundryOutlet extends TileEntityFoundryBase { public int getCapacity() { return 0; } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.invertRedstone = nbt.getBoolean("invert"); + this.filter = Mats.matById.get((int) nbt.getShort("filter")); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setBoolean("invert", this.invertRedstone); + nbt.setShort("filter", this.filter == null ? -1 : (short) this.filter.id); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryTank.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryTank.java new file mode 100644 index 000000000..a9c8c91c5 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryTank.java @@ -0,0 +1,117 @@ +package com.hbm.tileentity.machine; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.Mats.MaterialStack; + +import api.hbm.block.ICrucibleAcceptor; +import net.minecraft.block.Block; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityFoundryTank extends TileEntityFoundryBase { + + public int nextUpdate; + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(this.type == null && this.amount != 0) { + this.amount = 0; + } + + nextUpdate--; + + if(nextUpdate <= 0 && this.amount > 0 && this.type != null) { + + boolean hasOp = false; + nextUpdate = worldObj.rand.nextInt(6) + 5; + + TileEntity te = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + + if(te instanceof TileEntityFoundryTank) { + TileEntityFoundryTank tank = (TileEntityFoundryTank) te; + + if((tank.type == null || tank.type == this.type) && tank.amount < tank.getCapacity()) { + tank.type = this.type; + int toFill = Math.min(this.amount, tank.getCapacity() - tank.amount); + this.amount -= toFill; + tank.amount += toFill; + hasOp = true; + } + } + + List ints = new ArrayList() {{ add(2); add(3); add(4); add(5); }}; + Collections.shuffle(ints); + + if(!hasOp) { + + for(Integer i : ints) { + ForgeDirection dir = ForgeDirection.getOrientation(i); + Block b = worldObj.getBlock(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); + + if(b instanceof ICrucibleAcceptor && b != ModBlocks.foundry_channel) { + ICrucibleAcceptor acc = (ICrucibleAcceptor) b; + + if(acc.canAcceptPartialFlow(worldObj, xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ, dir.getOpposite(), new MaterialStack(this.type, this.amount))) { + MaterialStack left = acc.flow(worldObj, xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ, dir.getOpposite(), new MaterialStack(this.type, this.amount)); + if(left == null) { + this.type = null; + this.amount = 0; + } else { + this.amount = left.amount; + } + hasOp = true; + break; + } + } + } + } + + if(!hasOp) { + for(Integer i : ints) { + ForgeDirection dir = ForgeDirection.getOrientation(i); + TileEntity b = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); + + if(b instanceof TileEntityFoundryTank) { + TileEntityFoundryTank acc = (TileEntityFoundryTank) b; + + if(acc.type == null || acc.type == this.type || acc.amount == 0) { + acc.type = this.type; + if(worldObj.rand.nextInt(5) == 0) { + //1:4 chance that the fill states are simply swapped + //this promotes faster spreading and prevents spread limits + int buf = this.amount; + this.amount = acc.amount; + acc.amount = buf; + + } else { + int diff = this.amount - acc.amount; + + if(diff > 0) { + diff /= 2; + this.amount -= diff; + acc.amount += diff; + } + } + } + } + } + } + } + } + + super.updateEntity(); + } + + @Override + public int getCapacity() { + return MaterialShapes.BLOCK.q(1); + } +} diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 18a85a063..6c2967c35 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -489,6 +489,8 @@ fluid.schrabidic_fluid=Schrabidische Säure fluid.toxic_fluid=Stereotypischer grüner Schleim fluid.volcanic_lava_fluid=Vulkanische Lava +foundry.filter=Filter: %s +foundry.inverted=Redstone invertiert foundry.noCast=Keine Form eingelegt! geiger.chunkRad=Chunk-Strahlung: @@ -2676,7 +2678,9 @@ item.scrap.name=Schrott item.scrap_nuclear.name=Radioaktiver Schutt item.scrap_oil.name=Öliger Schutt item.scrap_plastic.name=Geschreddertes Plastik +item.scraps.name=Gießerei-Schutt item.screwdriver.name=Schraubenzieher +item.screwdriver.desc=Könnte statt einer Sicherung verwendet werden... item.screwdriver_desh.name=Desh-Schraubenzieher item.scrumpy.name=Flasche Scrumpy item.security_boots.name=Sicherheitsstiefel @@ -3348,7 +3352,9 @@ tile.fluid_duct_solid.name=Geschirmtes universelles Flüssigkeitsrohr tile.foam_layer.name=Schaumdecke tile.foundry_basin.name=Gussbecken tile.foundry_channel.name=Gusskanal +tile.foundry_tank.name=Gießerei-Lagerbecken tile.foundry_mold.name=Seichtes Gussbecken +tile.foundry_outlet.name=Ausguss tile.fraction_spacer.name=Fraktionierungsturm-Teiler tile.frozen_dirt.name=Gefrorene Erde tile.frozen_grass.name=Gefrorenes Gras @@ -3474,6 +3480,7 @@ tile.machine_condenser.name=Dampfkondensierer tile.machine_controller.name=Reaktorfernsteuerung tile.machine_converter_he_rf.name=HE zu RF Konverter tile.machine_converter_rf_he.name=RF zu HE Konverter +tile.machine_crucible.name=Schmelztiegel tile.machine_crystallizer.name=Erzauflöser tile.machine_cyclotron.name=Zyklotron tile.machine_detector.name=Energiedetektor diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 71a959808..07b6a32ec 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -719,6 +719,8 @@ fluid.schrabidic_fluid=Schrabidic Acid fluid.toxic_fluid=Stereotypical Green Ooze fluid.volcanic_lava_fluid=Volcanic Lava +foundry.filter=Filter: %s +foundry.inverted=Redstone inverted foundry.noCast=No mold installed! geiger.chunkRad=Current chunk radiation: @@ -3098,6 +3100,7 @@ item.scrap.name=Scrap item.scrap_nuclear.name=Radioactive Scraps item.scrap_oil.name=Oily Scraps item.scrap_plastic.name=Plastic Scraps +item.scraps.name=Foundry Scraps item.screwdriver.name=Screwdriver item.screwdriver.desc=Could be used instead of a fuse... item.screwdriver_desh.name=Desh Screwdriver @@ -3798,7 +3801,9 @@ tile.fluid_duct_solid.name=Coated Universal Fluid Duct tile.foam_layer.name=Foam layer tile.foundry_basin.name=Foundry Basin tile.foundry_channel.name=Foundry Channel +tile.foundry_tank.name=Foundry Storage Basin tile.foundry_mold.name=Shallow Foundry Basin +tile.foundry_outlet.name=Foundry Outlet tile.fraction_spacer.name=Fractioning Tower Separator tile.frozen_dirt.name=Frozen Dirt tile.frozen_grass.name=Frozen Grass @@ -3924,6 +3929,7 @@ tile.machine_condenser.name=Steam Condenser tile.machine_controller.name=Reactor Remote Control Block tile.machine_converter_he_rf.name=HE to RF Converter tile.machine_converter_rf_he.name=RF to HE Converter +tile.machine_crucible.name=Crucible tile.machine_crystallizer.name=Ore Acidizer tile.machine_cyclotron.name=Cyclotron tile.machine_detector.name=Power Detector diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_tank_bottom.png b/src/main/resources/assets/hbm/textures/blocks/foundry_tank_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..53406350fa015e77948f54ae5f07880b0c7b6a65 GIT binary patch literal 515 zcmV+e0{s1nP)B@dw6ZoCj;E>jGz$c{)GJf^Sd&W z@IX}f`FUezjNTce0}zoEMP*S{EO$hNW=6|MB7&@ zNsEZRX-0Uk?#BRgEqZH2CZ>vtpshWR0h*cZ1K*uZ6*B_?LU>;nV~nS%s2~U)v1K4U z2>*AEOvdQ6)-Y8>jRMnQV);46WMP$-j!_4;CTpY(BA~qs|$`@T#(TJd`IA5=g zq`Q!JvpE-t?EPAZ$YxW8d^|AQl(Gt literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_tank_inner.png b/src/main/resources/assets/hbm/textures/blocks/foundry_tank_inner.png new file mode 100644 index 0000000000000000000000000000000000000000..58ef85a6177c197b6896f6d25f800d568c4389e4 GIT binary patch literal 578 zcmV-I0=@l-P)-~TH_V`No5B#)kfC2FLKOgZ- z6p$CspQT4oijk3wxiXt79ziVykHA#z<6M^M{*+Pm;@Wj(;wQ}2c%#7A5nMpCjBTx}il?2LN z`*cS|h)im&j4`-gFZgukT*whYW>U8eJ>F>_gE<{CQB`U!-1Z$+rId08`k}j)LL5d% z1gfg^-ceQNoXfbQZF5c{6A{78u)`ZQCCNo#s%)(hnTOMm5iGA(in4omvij*>T^!UoLsi;kh|``0f{Lr&;-BB Qg8%>k07*qoM6N<$f&)ki)&Kwi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_tank_side.png b/src/main/resources/assets/hbm/textures/blocks/foundry_tank_side.png new file mode 100644 index 0000000000000000000000000000000000000000..dbc0b9d6638cf0d02bd2059da2db13c302af8291 GIT binary patch literal 600 zcmV-e0;m0nP)f^)7D02Zk08edq9_WSbA%88XqtxUbh~o!a2ucu|P_R zQi@)$w|)2CZ^hk;5pjBY8o37{1TjXewUlLfOBUi6p0yVJau59Vci+uxo(>bVl4OZy zltpH%yYn^2y9R*6L7%g)7wFHkJE@11Hby4b-2kwOMoGbXtz0B}Z= zCJLjwvWyoUVUn+?+ZH7S@_L1$_SmHBhyhln&j1jF=*EA^s m@ZPiWp3E2!5JI4B13v*XAN<_{X@e>N0000s1Sd^roY0ERIK|E zEck-9dsJ3ciXe&7xN&07jP065MAr3PKIt7@-TR*N_0z}pO&ar%Z5SsJw=2W3Y{-ql z>q!=y5+!@|eUG!rAwT})966SvssWGyrLA~3O!mXjmAoIOJZZy+QObO)=_`-Lst@bE*Dqd9bTwQ;OgRYd$-7te_N0HrGDw|UPVzMhb;Ibp& zc4Yt%*V7ro5uF{p4IGYTgIH_J+Sty3NfMJAgD`c&=)ms`c+$I?#V`u?^>tC`?rucb zrskEeIs@igjgmb?tQ6BM?+oZGkG}6Af7d;z+s=UJ_L;NEA@U^cZXe)gsZn`@c*r({ zuIvmr9rzqM7U$cS^Y;H^+$=Sx10UfC*2XeA@F}WY$kQz6SJ`rsDneJX+?LF@8hO9k z1sK{I<#~*vkn8D;wYL16Ju-{}Y_lR(3g`iFx5yYL5o|U805C+O8bj!frT_o{07*qo IM6N<$f}gtGKmY&$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_tank_upper.png b/src/main/resources/assets/hbm/textures/blocks/foundry_tank_upper.png new file mode 100644 index 0000000000000000000000000000000000000000..917d94ed46d725c833de652fa6e91df7c8492157 GIT binary patch literal 657 zcmV;C0&e|@P)4L$H#3bU3g3&3ipP;@#_4KCjj!VZhl{!O4D%6p}?*aoCB; z)-`)^#Bjdkd+vEYh%kXBTh{>SKeHtOrmBg;kV9+uIJ{s{RD8Xd^3Wz!&5Ujo0SbU` zlR1s|NI(MgnMJt1*A3J!)U!mH%Cvf*0ut`0A*PcMG@!c=Num&1JE=Lb<<$D z!Duu>TWgt2CLA0baCv!2nx`KC zIZ{fLQY1;TJFn|{CvI2th||+k&piks@ZMvLAjh{f zi381E?73Rqt`|HXL;yVMb~yVxM*qCJ<+=-Lyl1q@27n1PN($zAg(C#uD$CjCM|PtC z02^t-KoRLSEW>$A7%f(mO@opGxmh7CYfR8)M7(`*;sKoVbUTJsp5M1*_r%@AkY+hT zN}OvD0`$wr1EhdX7;s&b&~L}gt2JL14Nv<4M}r<0%M}21SD}?e3d!f|3hlh(*K|qa zJWAfUJk1J-x;rIAXO>Qz!Io;-9niXul*y4eSQK}W)7Kd8mZt+?VyrA(8B^BT{ rcQ`spLY9|!9NvQv?EVEn5=Q(7C)g8xw2&1%00000NkvXXu0mjf6_FeE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/capes/CapeHoboy_mk3.png b/src/main/resources/assets/hbm/textures/models/capes/CapeHoboy_mk3.png new file mode 100644 index 0000000000000000000000000000000000000000..e0eaab8e749e361b68da57b82bc46b86f7222acc GIT binary patch literal 12042 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 Pw8v8hCdYG*p@01k(Twjs literal 0 HcmV?d00001