From ae89bf1f9d0e93d249162011416246298fe763f0 Mon Sep 17 00:00:00 2001 From: OnyxDarkKnight Date: Sun, 24 May 2015 19:10:19 +0100 Subject: Crystals!!! --- .../jewelrycraft/block/BlockCrystal.java | 99 ++++++++++++++ .../jewelrycraft/block/BlockItemCrystal.java | 36 +++++ .../darkknight/jewelrycraft/block/BlockList.java | 6 +- .../block/render/BlockCrystalRenderer.java | 145 +++++++++++++++++++++ 4 files changed, 285 insertions(+), 1 deletion(-) create mode 100644 src/main/java/darkknight/jewelrycraft/block/BlockCrystal.java create mode 100644 src/main/java/darkknight/jewelrycraft/block/BlockItemCrystal.java create mode 100644 src/main/java/darkknight/jewelrycraft/block/render/BlockCrystalRenderer.java (limited to 'src/main/java/darkknight/jewelrycraft/block') diff --git a/src/main/java/darkknight/jewelrycraft/block/BlockCrystal.java b/src/main/java/darkknight/jewelrycraft/block/BlockCrystal.java new file mode 100644 index 0000000..975f89f --- /dev/null +++ b/src/main/java/darkknight/jewelrycraft/block/BlockCrystal.java @@ -0,0 +1,99 @@ +/** + * + */ +package darkknight.jewelrycraft.block; + +import java.io.IOException; +import java.util.List; +import java.util.Random; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import darkknight.jewelrycraft.proxy.ClientProxy.BlockRenderIDs; +import darkknight.jewelrycraft.tileentity.TileEntityCrystal; +import darkknight.jewelrycraft.tileentity.TileEntityShadowEye; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.ITileEntityProvider; +import net.minecraft.block.material.Material; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +/** + * @author Sorin + * + */ +public class BlockCrystal extends Block implements ITileEntityProvider +{ + public static int[] colors = {1973019, 11743532, 3887386, 5320730, 2437522, 8073150, 2651799, 11250603, 4408131, 14188952, 4312372, 14602026, 6719955, 12801229, 15435844, 15790320}; + + protected BlockCrystal() + { + super(Material.glass); + setBlockBounds(0.2F, 0F, 0.2F, 0.8F, 1.0F, 0.8F); + } + + @Override + public TileEntity createNewTileEntity(World world, int var2) + { + return new TileEntityCrystal(); + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @SideOnly(Side.CLIENT) + public int getRenderBlockPass() + { + return 1; + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item item, CreativeTabs tab, List list) + { + for(int i = 0; i < 16; ++i) list.add(new ItemStack(item, 1, i)); + } + + @Override + public int getRenderType() + { + return BlockRenderIDs.CRYSTAL.id(); + } + + @Override + @SideOnly (Side.CLIENT) + public int colorMultiplier(IBlockAccess world, int i, int j, int k) + { + return colors[world.getBlockMetadata(i, j, k)]; + } + + public int damageDropped(int meta) + { + return meta; + } + + public void breakBlock(World world, int x, int y, int z, Block block, int meta) + { + super.breakBlock(world, x, y, z, block, meta); + world.removeTileEntity(x, y, z); + } + + public boolean onBlockEventReceived(World world, int x, int y, int z, int eventNo, int arg) + { + super.onBlockEventReceived(world, x, y, z, eventNo, arg); + TileEntity tileentity = world.getTileEntity(x, y, z); + return tileentity != null ? tileentity.receiveClientEvent(eventNo, arg) : false; + } +} diff --git a/src/main/java/darkknight/jewelrycraft/block/BlockItemCrystal.java b/src/main/java/darkknight/jewelrycraft/block/BlockItemCrystal.java new file mode 100644 index 0000000..a8fb0b1 --- /dev/null +++ b/src/main/java/darkknight/jewelrycraft/block/BlockItemCrystal.java @@ -0,0 +1,36 @@ +package darkknight.jewelrycraft.block; + +import java.io.IOException; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class BlockItemCrystal extends ItemBlock +{ + public BlockItemCrystal(Block block) { + super(block); + setHasSubtypes(true); + } + + @Override + public int getMetadata (int damageValue) + { + return damageValue; + } + + @Override + public String getUnlocalizedName(ItemStack itemstack) + { + return getUnlocalizedName() + "." + itemstack.getItemDamage(); + } + + @Override + @SideOnly (Side.CLIENT) + public int getColorFromItemStack(ItemStack stack, int pass) + { + return stack.getItemDamage() < 16 ? BlockCrystal.colors[stack.getItemDamage()] : 0; + } + +} \ No newline at end of file diff --git a/src/main/java/darkknight/jewelrycraft/block/BlockList.java b/src/main/java/darkknight/jewelrycraft/block/BlockList.java index a02b264..990a77f 100644 --- a/src/main/java/darkknight/jewelrycraft/block/BlockList.java +++ b/src/main/java/darkknight/jewelrycraft/block/BlockList.java @@ -10,6 +10,7 @@ import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.registry.GameRegistry; import darkknight.jewelrycraft.JewelrycraftMod; import darkknight.jewelrycraft.tileentity.TileEntityBlockShadow; +import darkknight.jewelrycraft.tileentity.TileEntityCrystal; import darkknight.jewelrycraft.tileentity.TileEntityDisplayer; import darkknight.jewelrycraft.tileentity.TileEntityHandPedestal; import darkknight.jewelrycraft.tileentity.TileEntityJewelrsCraftingTable; @@ -22,7 +23,7 @@ import darkknight.jewelrycraft.util.Variables; public class BlockList { - public static Block shadowOre, smelter, molder, displayer, jewelCraftingTable, shadowBlock, shadowEye, handPedestal, shadowHand, midasTouchBlock; + public static Block shadowOre, smelter, molder, displayer, jewelCraftingTable, shadowBlock, shadowEye, handPedestal, shadowHand, midasTouchBlock, crystal; public static BlockMoltenMetal moltenMetal; public static Fluid moltenMetalFluid; private static boolean isInitialized = false; @@ -42,6 +43,7 @@ public class BlockList moltenMetalFluid = new Fluid("metal.molten").setLuminosity(15).setDensity(3000).setTemperature(2000).setViscosity(6000); if (!FluidRegistry.registerFluid(moltenMetalFluid)) moltenMetalFluid = FluidRegistry.getFluid("metal.molten"); moltenMetal = new BlockMoltenMetal(moltenMetalFluid, Material.lava); + crystal = new BlockCrystal().setHardness(2.0F).setResistance(5.0F).setStepSound(Block.soundTypeGlass).setBlockTextureName(Variables.MODID + ":blockCrystal").setBlockName(Variables.MODID + ".blockCrystal").setCreativeTab(JewelrycraftMod.jewelrycraft); GameRegistry.registerBlock(shadowOre, "shadowOre"); GameRegistry.registerBlock(shadowBlock, "shadowBlock"); @@ -54,6 +56,7 @@ public class BlockList GameRegistry.registerBlock(shadowHand, "Shadow Hand"); GameRegistry.registerBlock(midasTouchBlock, "Midas Touch Block"); GameRegistry.registerBlock(moltenMetal, "moltenMetalLiquid"); + GameRegistry.registerBlock(crystal, BlockItemCrystal.class, "crystalBlock"); GameRegistry.registerTileEntity(TileEntitySmelter.class, Variables.MODID + ":smelter"); GameRegistry.registerTileEntity(TileEntityMolder.class, Variables.MODID + ":molder"); @@ -64,6 +67,7 @@ public class BlockList GameRegistry.registerTileEntity(TileEntityHandPedestal.class, Variables.MODID + ":handPedestal"); GameRegistry.registerTileEntity(TileEntityShadowHand.class, Variables.MODID + ":shadowHand"); GameRegistry.registerTileEntity(TileEntityMidasTouch.class, Variables.MODID + ":midsaTouch"); + GameRegistry.registerTileEntity(TileEntityCrystal.class, Variables.MODID + ":crystalBlock"); OreDictionary.registerOre("oreShadow", new ItemStack(BlockList.shadowOre)); } diff --git a/src/main/java/darkknight/jewelrycraft/block/render/BlockCrystalRenderer.java b/src/main/java/darkknight/jewelrycraft/block/render/BlockCrystalRenderer.java new file mode 100644 index 0000000..2a81007 --- /dev/null +++ b/src/main/java/darkknight/jewelrycraft/block/render/BlockCrystalRenderer.java @@ -0,0 +1,145 @@ +/** + * + */ +package darkknight.jewelrycraft.block.render; + +import java.util.Random; +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 org.lwjgl.opengl.GL11; +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import darkknight.jewelrycraft.block.BlockCrystal; +import darkknight.jewelrycraft.config.ConfigHandler; +import darkknight.jewelrycraft.proxy.ClientProxy.BlockRenderIDs; +import darkknight.jewelrycraft.tileentity.TileEntityCrystal; + +/** + * @author Sorin + */ +@SideOnly (Side.CLIENT) +public class BlockCrystalRenderer implements ISimpleBlockRenderingHandler +{ + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) + { + Tessellator tessellator = Tessellator.instance; + GL11.glDisable(GL11.GL_LIGHTING); + tessellator.startDrawingQuads(); + if (metadata < 16) tessellator.setColorRGBA_I(((BlockCrystal)block).colors[metadata], 100); + GL11.glTranslatef(-0.5f, 0f, -0.5f); + this.renderWorldBlock(null, 0, 0, 0, block, modelID, renderer); + tessellator.draw(); + GL11.glTranslatef(0.5f, 0f, 0.5f); + GL11.glEnable(GL11.GL_LIGHTING); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) + { + int crystals = 5; + Random rnd = new Random(); + Tessellator tessellator = Tessellator.instance; + IIcon icon = ((BlockCrystal)block).getIcon(0, 0); + double umin = icon.getMinU(); + double vmin = icon.getMinV(); + double umax = icon.getMaxU(); + double vmax = icon.getMaxV(); + tessellator.addTranslation(x, y, z); + if (world != null && world.getTileEntity(x, y, z) != null && ConfigHandler.CRYSTAL_GLOW) tessellator.setBrightness(((TileEntityCrystal)world.getTileEntity(x, y, z)).shine); + else tessellator.setBrightness(230); + // 37435, 76464 + if (world != null) rnd.setSeed(2 * x * 3 * y * z * 5); + else rnd.setSeed(76464); + if (world != null && world.getBlockMetadata(x, y, z) < 16) tessellator.setColorRGBA_I(((BlockCrystal)block).colors[world.getBlockMetadata(x, y, z)], 100); + crystal(tessellator, umin, vmin, umax, vmax, 0.8D, 0.2D, 0D, 0D, 0D, 0.0D, 0.0D); + for(int i = 0; i < crystals; i++){ + double rotation = Math.PI * 2.0f / (float)crystals * (float)i; + double xp1 = Math.sin(rotation) * 0.2f; + double zp1 = Math.cos(rotation) * 0.2f; + double height = 0.2f + rnd.nextFloat(); + double topHeight = 0.1f + rnd.nextFloat() / 2f; + crystal(tessellator, umin, vmin, umax, vmax, height, topHeight, -xp1, 0D, zp1, xp1, zp1); + } + if (world != null){ + crystals = 4; + for(int i = 0; i < crystals; i++){ + double rotation = Math.PI * 2.0f / (float)crystals * (float)i; + double xp1 = Math.sin(rotation) * 0.2f; + double zp1 = Math.cos(rotation) * 0.2f; + double height = 0.2f + rnd.nextFloat(); + double topHeight = 0.1f + rnd.nextFloat() / 2f; + float xOff = (rnd.nextFloat() * 1.5f - 0.5f) * 0.2f; + float zOff = (rnd.nextFloat() * 1.5f - 0.5f) * 0.2f; + crystal(tessellator, umin, vmin, umax, vmax, height, topHeight, xOff, 0D, zOff, xp1, zp1); + } + } + tessellator.addTranslation(-x, -y, -z); + return true; + } + + private void crystal(Tessellator tessellator, double umin, double vmin, double umax, double vmax, double height, double topHeight, double posX, double posY, double posZ, double rotX, double rotZ) + { + // Negative X + tessellator.addVertexWithUV(0.4 + rotX + posX, 0.0 + posY, 0.6 - rotZ + posZ, umin, vmin); + tessellator.addVertexWithUV(0.4 - rotX + posX, height + posY, 0.6 + rotZ + posZ, umin, vmax); + tessellator.addVertexWithUV(0.4 - rotX + posX, height + posY, 0.4 + rotZ + posZ, umax, vmax); + tessellator.addVertexWithUV(0.4 + rotX + posX, 0.0 + posY, 0.4 - rotZ + posZ, umax, vmin); + // Positive X + tessellator.addVertexWithUV(0.6 + rotX + posX, 0.0 + posY, 0.4 - rotZ + posZ, umin, vmin); + tessellator.addVertexWithUV(0.6 - rotX + posX, height + posY, 0.4 + rotZ + posZ, umin, vmax); + tessellator.addVertexWithUV(0.6 - rotX + posX, height + posY, 0.6 + rotZ + posZ, umax, vmax); + tessellator.addVertexWithUV(0.6 + rotX + posX, 0.0 + posY, 0.6 - rotZ + posZ, umax, vmin); + // Negative Z + tessellator.addVertexWithUV(0.4 + rotX + posX, 0.0 + posY, 0.4 - rotZ + posZ, umin, vmin); + tessellator.addVertexWithUV(0.4 - rotX + posX, height + posY, 0.4 + rotZ + posZ, umin, vmax); + tessellator.addVertexWithUV(0.6 - rotX + posX, height + posY, 0.4 + rotZ + posZ, umax, vmax); + tessellator.addVertexWithUV(0.6 + rotX + posX, 0.0 + posY, 0.4 - rotZ + posZ, umax, vmin); + // Positive Z + tessellator.addVertexWithUV(0.6 + rotX + posX, 0.0 + posY, 0.6 - rotZ + posZ, umin, vmin); + tessellator.addVertexWithUV(0.6 - rotX + posX, height + posY, 0.6 + rotZ + posZ, umin, vmax); + tessellator.addVertexWithUV(0.4 - rotX + posX, height + posY, 0.6 + rotZ + posZ, umax, vmax); + tessellator.addVertexWithUV(0.4 + rotX + posX, 0.0 + posY, 0.6 - rotZ + posZ, umax, vmin); + // Top -X + tessellator.addVertexWithUV(0.4 - rotX + posX, height + posY, 0.6 + rotZ + posZ, umin, vmin); + tessellator.addVertexWithUV(0.5 - rotX - rotX + posX, height + topHeight + posY, 0.5 + rotZ + rotZ + posZ, umin, vmax); + tessellator.addVertexWithUV(0.5 - rotX - rotX + posX, height + topHeight + posY, 0.5 + rotZ + rotZ + posZ, umax, vmax); + tessellator.addVertexWithUV(0.4 - rotX + posX, height + posY, 0.4 + rotZ + posZ, umax, vmin); + // Top +X + tessellator.addVertexWithUV(0.6 - rotX + posX, height + posY, 0.4 + rotZ + posZ, umin, vmin); + tessellator.addVertexWithUV(0.5 - rotX - rotX + posX, height + topHeight + posY, 0.5 + rotZ + rotZ + posZ, umin, vmax); + tessellator.addVertexWithUV(0.5 - rotX - rotX + posX, height + topHeight + posY, 0.5 + rotZ + rotZ + posZ, umax, vmax); + tessellator.addVertexWithUV(0.6 - rotX + posX, height + posY, 0.6 + rotZ + posZ, umax, vmin); + // Top +Z + tessellator.addVertexWithUV(0.6 - rotX + posX, height + posY, 0.6 + rotZ + posZ, umin, vmin); + tessellator.addVertexWithUV(0.5 - rotX - rotX + posX, height + topHeight + posY, 0.5 + rotZ + rotZ + posZ, umin, vmax); + tessellator.addVertexWithUV(0.5 - rotX - rotX + posX, height + topHeight + posY, 0.5 + rotZ + rotZ + posZ, umax, vmax); + tessellator.addVertexWithUV(0.4 - rotX + posX, height + posY, 0.6 + rotZ + posZ, umax, vmin); + // Top -Z + tessellator.addVertexWithUV(0.4 - rotX + posX, height + posY, 0.4 + rotZ + posZ, umin, vmin); + tessellator.addVertexWithUV(0.5 - rotX - rotX + posX, height + topHeight + posY, 0.5 + rotZ + rotZ + posZ, umin, vmax); + tessellator.addVertexWithUV(0.5 - rotX - rotX + posX, height + topHeight + posY, 0.5 + rotZ + rotZ + posZ, umax, vmax); + tessellator.addVertexWithUV(0.6 - rotX + posX, height + posY, 0.4 + rotZ + posZ, umax, vmin); + // Bottom + tessellator.addVertexWithUV(0.4 + rotX + posX, 0.0 + posY, 0.6 - rotZ + posZ, umin, vmin); + tessellator.addVertexWithUV(0.4 + rotX + posX, 0.0 + posY, 0.4 - rotZ + posZ, umin, vmax); + tessellator.addVertexWithUV(0.6 + rotX + posX, 0.0 + posY, 0.4 - rotZ + posZ, umax, vmax); + tessellator.addVertexWithUV(0.6 + rotX + posX, 0.0 + posY, 0.6 - rotZ + posZ, umax, vmin); + } + + @Override + public boolean shouldRender3DInInventory(int modelId) + { + return true; + } + + @Override + public int getRenderId() + { + return BlockRenderIDs.CRYSTAL.id(); + } +} -- cgit v1.2.3