diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index ed2fa0b9b..4970d4248 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -471,6 +471,12 @@ public class ModBlocks { public static Block plant_tall; public static Block plant_dead; public static Block reeds; + public static Block vine_phosphor; + public static final Material thick_foliage = new MaterialLogic(MapColor.foliageColor) { + @Override public boolean getCanBurn() { return true; } + @Override public boolean isToolNotRequired() { return false; } + @Override public int getMaterialMobility() { return 1; } + }; public static Block waste_earth; public static Block waste_mycelium; @@ -1635,7 +1641,8 @@ public class ModBlocks { plant_tall = new BlockTallPlant().setBlockName("plant_tall").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGrass).setHardness(0.0F); plant_dead = new BlockDeadPlant().setBlockName("plant_dead").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGrass).setHardness(0.0F); reeds = new BlockReeds().setBlockName("plant_reeds").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGrass).setHardness(0.0F); - + vine_phosphor = new BlockHangingVine(thick_foliage).setBlockName("vine_phosphor").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGrass).setHardness(0.5F); + waste_earth = new WasteEarth(Material.ground, true).setBlockName("waste_earth").setStepSound(Block.soundTypeGrass).setCreativeTab(MainRegistry.blockTab).setHardness(0.6F).setBlockTextureName(RefStrings.MODID + ":waste_earth"); waste_mycelium = new WasteEarth(Material.ground, true).setBlockName("waste_mycelium").setStepSound(Block.soundTypeGrass).setLightLevel(1F).setCreativeTab(MainRegistry.blockTab).setHardness(0.6F).setBlockTextureName(RefStrings.MODID + ":waste_mycelium_side"); waste_trinitite = new BlockOre(Material.sand).noFortune().setBlockName("waste_trinitite").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setResistance(2.5F).setBlockTextureName(RefStrings.MODID + ":waste_trinitite"); @@ -2754,6 +2761,7 @@ public class ModBlocks { register(plant_tall); register(plant_dead); register(reeds); + register(vine_phosphor); GameRegistry.registerBlock(mush, mush.getUnlocalizedName()); GameRegistry.registerBlock(mush_block, mush_block.getUnlocalizedName()); GameRegistry.registerBlock(mush_block_stem, mush_block_stem.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/generic/BlockHangingVine.java b/src/main/java/com/hbm/blocks/generic/BlockHangingVine.java new file mode 100644 index 000000000..8bebf517f --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockHangingVine.java @@ -0,0 +1,120 @@ +package com.hbm.blocks.generic; + +import java.util.ArrayList; +import java.util.Random; + +import com.hbm.lib.RefStrings; + +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.IShearable; +import net.minecraftforge.common.util.ForgeDirection; + +public class BlockHangingVine extends Block implements IShearable { + + public BlockHangingVine(Material mat) { + super(mat); + } + + @Override + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { + if(world.getBlock(x, y - 1, z).isSideSolid(world, x, y - 1, z, ForgeDirection.UP)) + entity.setInWeb(); + } + + @Override + public boolean canPlaceBlockAt(World world, int x, int y, int z) { + return this.canBlockStay(world, x, y, z); + } + + @Override + public boolean canBlockStay(World world, int x, int y, int z) { + Block b = world.getBlock(x, y + 1, z); + return b.isSideSolid(world, x, y + 1, z, ForgeDirection.UP) || b == this; + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { + super.onNeighborBlockChange(world, x, y, z, block); + this.checkAndDropBlock(world, x, y, z); + } + + protected void checkAndDropBlock(World world, int x, int y, int z) { + if(!this.canBlockStay(world, x, y, z)) { + world.setBlock(x, y, z, Blocks.air); + } + } + + @Override protected boolean canSilkHarvest() { return true; } + + @Override + public boolean isShearable(ItemStack item, IBlockAccess world, int x, int y, int z) { + return true; + } + + @Override + public ArrayList onSheared(ItemStack item, IBlockAccess world, int x, int y, int z, int fortune) { + ArrayList ret = new ArrayList(); + ret.add(new ItemStack(this)); //placeholder + return ret; + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + return null; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @SideOnly(Side.CLIENT) public IIcon iconGround; //when touching a solid face below + @SideOnly(Side.CLIENT) public IIcon iconHang; //when hanging mid-air + @SideOnly(Side.CLIENT) public IIcon iconGlow; //regular phosphor + @SideOnly(Side.CLIENT) public IIcon iconHangGlow; //phosphor in different position when hanging for variety + + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + this.blockIcon = reg.registerIcon(RefStrings.MODID + ":vine_phosphor"); + this.iconGround = reg.registerIcon(RefStrings.MODID + ":vine_phosphor_ground"); + this.iconHang = reg.registerIcon(RefStrings.MODID + ":vine_phosphor_hang"); + this.iconGlow = reg.registerIcon(RefStrings.MODID + ":vine_phosphor_spots"); + this.iconHangGlow = reg.registerIcon(RefStrings.MODID + ":vine_phosphor_spots_hang"); + } + + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, boolean pass) { + Block b = world.getBlock(x, y - 1, z); + + if(!pass) + return b.isSideSolid(world, x, y, z, ForgeDirection.UP) ? iconGround : b == this ? blockIcon : iconHang; + else + return b.isAir(world, x, y, z) ? iconHangGlow : iconGlow; + } + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); + + @Override + public int getRenderType() { + return renderID; + } +} diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 592722535..0b968028b 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -793,6 +793,7 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerBlockHandler(new RenderBoxDuct()); RenderingRegistry.registerBlockHandler(new RenderBlockDecoModel(ModBlocks.deco_computer.getRenderType(), ResourceManager.deco_computer)); RenderingRegistry.registerBlockHandler(new RenderReeds()); + RenderingRegistry.registerBlockHandler(new RenderHangingVine()); RenderingRegistry.registerBlockHandler(new RenderRTTY()); RenderingRegistry.registerBlockHandler(new RenderDiFurnaceExtension()); RenderingRegistry.registerBlockHandler(new RenderSplitter()); diff --git a/src/main/java/com/hbm/render/block/RenderHangingVine.java b/src/main/java/com/hbm/render/block/RenderHangingVine.java new file mode 100644 index 000000000..059b1023e --- /dev/null +++ b/src/main/java/com/hbm/render/block/RenderHangingVine.java @@ -0,0 +1,94 @@ +package com.hbm.render.block; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.generic.BlockHangingVine; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.util.ForgeDirection; + +public class RenderHangingVine implements ISimpleBlockRenderingHandler { + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + + Tessellator tess = 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; + + tess.setColorOpaque_F(r, g, b); + + BlockHangingVine vine = (BlockHangingVine) block; + + int brightness = block.getMixedBrightnessForBlock(world, x, y, z); + tess.setBrightness(brightness); + + IIcon icon = vine.getIcon(world, x, y, z, false); + renderCrossedSquares(icon, x, y, z, 1.0D); + + tess.setBrightness(240); + + icon = vine.getIcon(world, x, y, z, true); //glow pass + renderCrossedSquares(icon, x, y, z, 1.0D); + + return true; + } + + //fixed implementation of drawCrossedSquares + public void renderCrossedSquares(IIcon icon, double x, double y, double z, double height) { + Tessellator tess = Tessellator.instance; + + double minU = icon.getMinU(); + double minV = icon.getMinV(); + double maxU = icon.getMaxU(); + double maxV = icon.getMaxV(); + + double factor = 0.45D * height; + double minX = x + 0.5D - factor; + double maxX = x + 0.5D + factor; + double minZ = z + 0.5D - factor; + double maxZ = z + 0.5D + factor; + + tess.addVertexWithUV(minX, y, minZ, maxU, maxV); + tess.addVertexWithUV(minX, y + height, minZ, maxU, minV); + tess.addVertexWithUV(maxX, y + height, maxZ, minU, minV); + tess.addVertexWithUV(maxX, y, maxZ, minU, maxV); + + tess.addVertexWithUV(maxX, y, maxZ, maxU, maxV); + tess.addVertexWithUV(maxX, y + height, maxZ, maxU, minV); + tess.addVertexWithUV(minX, y + height, minZ, minU, minV); + tess.addVertexWithUV(minX, y, minZ, minU, maxV); + + tess.addVertexWithUV(maxX, y, minZ, maxU, maxV); + tess.addVertexWithUV(maxX, y + height, minZ, maxU, minV); + tess.addVertexWithUV(minX, y + height, maxZ, minU, minV); + tess.addVertexWithUV(minX, y, maxZ, minU, maxV); + + tess.addVertexWithUV(minX, y, maxZ, maxU, maxV); + tess.addVertexWithUV(minX, y + height, maxZ, maxU, minV); + tess.addVertexWithUV(maxX, y + height, minZ, minU, minV); + tess.addVertexWithUV(maxX, y, minZ, minU, maxV); + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return false; + } + + @Override + public int getRenderId() { + return BlockHangingVine.renderID; + } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/vine_phosphor.png b/src/main/resources/assets/hbm/textures/blocks/vine_phosphor.png new file mode 100644 index 000000000..16b22cfb1 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/vine_phosphor.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/vine_phosphor_ground.png b/src/main/resources/assets/hbm/textures/blocks/vine_phosphor_ground.png new file mode 100644 index 000000000..999d56b6a Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/vine_phosphor_ground.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/vine_phosphor_hang.png b/src/main/resources/assets/hbm/textures/blocks/vine_phosphor_hang.png new file mode 100644 index 000000000..67184d660 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/vine_phosphor_hang.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/vine_phosphor_spots.png b/src/main/resources/assets/hbm/textures/blocks/vine_phosphor_spots.png new file mode 100644 index 000000000..bf8b9ba3a Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/vine_phosphor_spots.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/vine_phosphor_spots.png.mcmeta b/src/main/resources/assets/hbm/textures/blocks/vine_phosphor_spots.png.mcmeta new file mode 100644 index 000000000..a5c14ed33 --- /dev/null +++ b/src/main/resources/assets/hbm/textures/blocks/vine_phosphor_spots.png.mcmeta @@ -0,0 +1,16 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hbm/textures/blocks/vine_phosphor_spots_hang.png b/src/main/resources/assets/hbm/textures/blocks/vine_phosphor_spots_hang.png new file mode 100644 index 000000000..c8dd11beb Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/vine_phosphor_spots_hang.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/vine_phosphor_spots_hang.png.mcmeta b/src/main/resources/assets/hbm/textures/blocks/vine_phosphor_spots_hang.png.mcmeta new file mode 100644 index 000000000..a5c14ed33 --- /dev/null +++ b/src/main/resources/assets/hbm/textures/blocks/vine_phosphor_spots_hang.png.mcmeta @@ -0,0 +1,16 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file