Greetings! I am HyperElectron. I decided that learning to make Minecraft Forge mods were hard by myself. I didnt understand anything. Now I have tons of knowledge I want to share with you guys. So far I've done all the beginner tutorials, and working on doing the intermediate ones. To read my tutorials, visit my website here. Hope all of you will learn alot from my tutorials
Tutorials on website:
Setting up forge and eclipse
Basic Block
Basic Item
Custom crafting, smelting and ore dictionary recipes
Creative Tab
Ore generation
Structure Generation
Fluid Tank tutorial (post below) Fluid tank is up and running, the tile entity is now there.
Custom Fluid Tank
Hello again! I couldnt get the code for this on my website just yet, so I'll put it here instead. Remember! Not all the code is copy paste, all things that arent are basic things you should know like texture registry and language localisations.
Here are the classes you need:
Block
package forgingmc.minecraftthing.blocks;<br>import java.util.Random;<br> <br> <br> <br>import cpw.mods.fml.common.registry.GameRegistry;<br>import forgingmc.minecraftthing.Constants;<br>import forgingmc.minecraftthing.ForgingMC;<br>import forgingmc.minecraftthing.Utils;<br>import forgingmc.minecraftthing.items.ItemBlockLeadTank;<br>import forgingmc.minecraftthing.render.RenderLeadTank;<br>import forgingmc.minecraftthing.tile.TileLeadTank;<br>import net.minecraft.block.Block;<br>import net.minecraft.block.BlockContainer;<br>import net.minecraft.block.ITileEntityProvider;<br>import net.minecraft.block.material.Material;<br>import net.minecraft.creativetab.CreativeTabs;<br>import net.minecraft.entity.Entity;<br>import net.minecraft.entity.EntityLivingBase;<br>import net.minecraft.entity.player.EntityPlayer;<br>import net.minecraft.item.ItemStack;<br>import net.minecraft.nbt.NBTTagCompound;<br>import net.minecraft.tileentity.TileEntity;<br>import net.minecraft.util.IIcon;<br>import net.minecraft.util.MovingObjectPosition;<br>import net.minecraft.world.EnumSkyBlock;<br>import net.minecraft.world.Explosion;<br>import net.minecraft.world.IBlockAccess;<br>import net.minecraft.world.World;<br>import net.minecraftforge.common.util.ForgeDirection;<br>import net.minecraftforge.fluids.FluidContainerRegistry;<br>import net.minecraftforge.fluids.FluidStack;<br>import net.minecraftforge.fluids.FluidTankInfo;<br>public class LeadTank extends Block implements ITileEntityProvider{<br>public static int renderID;<br>public static IIcon icon;<br>public LeadTank() {<br> super(Material.glass);<br> setBlockName(Constants.MOD_ID + "_" + Constants.LEAD_TANK_NAME);<br> setBlockTextureName(Constants.MOD_ID + ":" + Constants.LEAD_TANK_TEXTURE);<br> setCreativeTab(ForgingMC.forgingMCTab);<br> GameRegistry.registerBlock(this, ItemBlockLeadTank.class, Constants.LEAD_TANK_NAME);<br>}<br> <br> <br><br>@Override<br> public ItemStack getPickBlock(MovingObjectPosition target, World world,<br> int x, int y, int z) {<br> // TODO Auto-generated method stub<br> return Utils.getTankStackFromTile((TileLeadTank) world.getTileEntity(x, y, z), true);<br> }<br>@Override<br> public boolean hasComparatorInputOverride() {<br>return true;<br> }<br>public TileEntity createNewTileEntity(World world, int meta) {<br>return new TileLeadTank();<br> }<br>@Override<br> public boolean isOpaqueCube() {<br>return false;<br> }<br>@Override<br> public int getRenderType() {<br> <br> return renderID;<br> }<br>@Override<br> public boolean renderAsNormalBlock() {<br>return false;<br> }<br>@Override<br> public int getRenderBlockPass() {<br>return 1;<br> }<br><br> @Override<br> public boolean canRenderInPass(int pass) {<br>RenderLeadTank.renderPass = pass;<br> return true;<br> }<br>@Override<br>public int quantityDropped(Random rnd) {<br>return 0;<br>}<br> <br><br>@Override<br>public int getComparatorInputOverride(World world, int x, int y, int z, int opSide) {<br>return 0;<br>}<br>@Override<br> public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9) {<br>ItemStack stack = player.inventory.getCurrentItem();<br> if (stack != null) {<br>FluidStack liquid = FluidContainerRegistry.getFluidForFilledItem(stack);<br> TileLeadTank tank = (TileLeadTank) world.getTileEntity(x, y, z);<br>if (liquid != null) {<br>int amount = tank.fill(ForgeDirection.UNKNOWN, liquid, false);<br>if (amount == liquid.amount) {<br>tank.fill(ForgeDirection.UNKNOWN, liquid, true);<br> if (!player.capabilities.isCreativeMode)<br> player.inventory.setInventorySlotContents(player.inventory.currentItem, Utils.useItemSafely(stack));<br> <br> if(tank.tank.getFluid().getFluid().getBlock() != null)<br> {<br> //z world.setLightValue(EnumSkyBlock.Sky., tank.xCoord, tank.xCoord, tank.xCoord, tank.tank.getFluid().getFluid().getBlock().getLightValue());<br> }<br> <br> <br> return true;<br> }<br>else<br> return true;<br> }<br>else if (FluidContainerRegistry.isBucket(stack)) {<br>FluidTankInfo[] tanks = tank.getTankInfo(ForgeDirection.UNKNOWN);<br>if (tanks[0] != null) {<br>FluidStack fillFluid = tanks[0].fluid;<br> ItemStack fillStack = FluidContainerRegistry.fillFluidContainer(fillFluid, stack);<br>if (fillStack != null) {<br>tank.drain(ForgeDirection.UNKNOWN, FluidContainerRegistry.getFluidForFilledItem(fillStack).amount, true);<br>if (!player.capabilities.isCreativeMode) {<br>if (stack.stackSize == 1)<br> player.inventory.setInventorySlotContents(player.inventory.currentItem, fillStack);<br>else {<br> player.inventory.setInventorySlotContents(player.inventory.currentItem, Utils.useItemSafely(stack));<br>if (!player.inventory.addItemStackToInventory(fillStack))<br> player.dropPlayerItemWithRandomChoice(fillStack, false);<br> }<br> }<br> return true;<br> }<br>else<br> return true;<br> }<br> <br> }<br> }<br>return false;<br> }<br>@Override<br> public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z, boolean willHarvest) {<br>if (!player.capabilities.isCreativeMode) {<br>TileLeadTank tank = (TileLeadTank) world.getTileEntity(x, y, z);<br> <br> Utils.dropStackInWorld(world, x, y, z, Utils.getTankStackFromTile(tank, true));<br> <br> <br> <br> }<br>return world.setBlockToAir(x, y, z);<br> }<br>@Override<br> public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack stack) {<br>if (stack.hasTagCompound()) {<br>TileLeadTank tank = (TileLeadTank) world.getTileEntity(x, y, z);<br>if (tank != null) {<br>NBTTagCompound tagFluid = stack.getTagCompound().getCompoundTag("Fluid");<br>if (tagFluid != null) {<br>FluidStack liquid = FluidStack.loadFluidStackFromNBT(tagFluid);<br> tank.tank.setFluid(liquid);<br>}<br><br>}<br>}<br>}<br>@Override<br>public void onBlockExploded(World world, int x, int y, int z, Explosion explosion) {<br>Utils.dropStackInWorld(world, x, y, z, Utils.getTankStackFromTile((TileLeadTank) world.getTileEntity(x, y, z), true));<br>world.setBlockToAir(x, y, z);<br>onBlockDestroyedByExplosion(world, x, y, z, explosion);<br>}<br> <br> <br>}<br></span>
public void updateEntity()
{
needsUpdate = true;
if (needsUpdate)
{
if (updateTimer == 0)
{
updateTimer = 16; // every 1 ticks it will send an update
}
else
{
--updateTimer;
if (updateTimer == 0)
{
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
package forgingmc.minecraftthing.render;<br>import net.minecraft.block.Block;<br>import net.minecraft.client.renderer.RenderBlocks;<br>import net.minecraft.world.IBlockAccess;<br>import net.minecraftforge.fluids.Fluid;<br>import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;<br>import forgingmc.minecraftthing.Utils;<br>import forgingmc.minecraftthing.blocks.InitBlocks;<br>import forgingmc.minecraftthing.tile.TileLeadTank;<br>public class RenderLeadTank implements ISimpleBlockRenderingHandler{<br>public static int renderID;<br> public static int renderPass = 0;<br>public RenderLeadTank(int renderingID) {<br>renderID = renderingID;<br> }<br>@Override<br> public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {<br>}<br>@Override<br> public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {<br>if (modelId == renderID) {<br>TileLeadTank tank = (TileLeadTank) world.getTileEntity(x, y, z);<br>if (renderPass == 0) {<br>if (tank.tank.getFluid() != null) {<br>Fluid fluid = tank.tank.getFluid().getFluid();<br> Utils.renderBlockByCompleteness(InitBlocks.renderBlock,fluid, world.getBlockMetadata(x, y, z), renderer, (double) tank.tank.getFluidAmount() / (double) tank.tank.getCapacity(), x, y, z);<br> }<br> }<br>else if (renderPass == 1) {<br>renderer.setRenderBounds(0, 0, 0, 1, 1, 1);<br>renderer.renderStandardBlock(block, x, y, z);<br>renderer.setRenderFromInside(true);<br> renderer.setRenderBounds(0, 0, 0, 1, 1, 1);<br> renderer.renderStandardBlock(block, x, y, z);<br> renderer.setRenderFromInside(false);<br> }<br> }<br> return true;<br> }<br>@Override<br> public boolean shouldRender3DInInventory(int modelId) {<br>return false;<br> }<br>@Override<br> public int getRenderId() {<br>return renderID;<br> }<br>}<br>[/spoiler]
ItemBlock Render
[spoiler][code] package forgingmc.minecraftthing.render;<br>import org.lwjgl.opengl.GL11;<br>import forgingmc.minecraftthing.Utils;<br>import forgingmc.minecraftthing.blocks.InitBlocks;<br>import net.minecraft.block.Block;<br>import net.minecraft.client.renderer.RenderBlocks;<br>import net.minecraft.item.ItemStack;<br>import net.minecraft.nbt.NBTTagCompound;<br>import net.minecraftforge.client.IItemRenderer;<br>import net.minecraftforge.client.IItemRenderer.ItemRenderType;<br>import net.minecraftforge.client.IItemRenderer.ItemRendererHelper;<br>import net.minecraftforge.fluids.FluidStack;<br>public class RenderItemBlockLeadTank implements IItemRenderer {<br>@Override<br> public boolean handleRenderType(ItemStack item, ItemRenderType type) {<br>return type == ItemRenderType.INVENTORY || type == ItemRenderType.ENTITY || type == ItemRenderType.EQUIPPED_FIRST_PERSON || type == ItemRenderType.EQUIPPED;<br> }<br>@Override<br> public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {<br>return true;<br> }<br>@Override<br> public void renderItem(ItemRenderType type, ItemStack item, Object... data) {<br>RenderBlocks renderblocks = (RenderBlocks) data[0];<br> Block block = Block.getBlockFromItem(item.getItem());<br>if (item.hasTagCompound()) {<br>NBTTagCompound tag = item.stackTagCompound;<br>if (tag.hasKey("Fluid")) {<br>FluidStack liquid = FluidStack.loadFluidStackFromNBT(item.getTagCompound().getCompoundTag("Fluid"));<br> if (liquid != null) {<br>GL11.glEnable(GL11.GL_BLEND);<br> float height = ((float) liquid.amount / (float) 20000 * (float) 0.99);<br> renderblocks.setRenderBounds(0.01, 0.01, 0.01, 0.99, height, 0.99);<br> Utils.renderInventoryBlock(renderblocks, InitBlocks.renderBlock, liquid.getFluid());<br> GL11.glDisable(GL11.GL_BLEND);<br> }<br> }<br> <br>GL11.glEnable(GL11.GL_ALPHA_TEST);<br> renderblocks.setRenderBounds(0, 0, 0, 1, 1, 1);<br>Utils.renderInventoryBlock(renderblocks, block, InitBlocks.lead_tank.getIcon(0, 0));<br> GL11.glDisable(GL11.GL_ALPHA_TEST);<br> <br> }<br> }<br>}<br>
BlocksInit (registry of blocks)
package forgingmc.minecraftthing.blocks;<br>import net.minecraft.block.Block;<br>import net.minecraftforge.fluids.Fluid;<br>public class InitBlocks {<br>public static Block ore_lead;<br> public static Block lead_block;<br> public static Block lead_tank;<br> public static Block renderBlock;<br> public static Block liquidLead;<br> public static Fluid fluidLead;<br> <br> public static void init()<br> {<br> liquidLead = new BlockFluidLead();<br> ore_lead = new LeadOre();<br> lead_block = new LeadBlock();<br> lead_tank = new LeadTank();<br> renderBlock = new RenderBlock();<br> }<br> <br> <br>}<br>
Client and Common Proxies
package forgingmc.minecraftthing;<br>import net.minecraft.item.Item;<br>import net.minecraftforge.client.MinecraftForgeClient;<br>import cpw.mods.fml.client.registry.RenderingRegistry;<br>import forgingmc.minecraftthing.blocks.InitBlocks;<br>import forgingmc.minecraftthing.blocks.LeadTank;<br>import forgingmc.minecraftthing.render.RenderItemBlockLeadTank;<br>import forgingmc.minecraftthing.render.RenderLeadTank;<br>public class ClientProxy extends CommonProxy{<br><br> @Override<br> public void registerRenders() {<br> int tank_id = RenderingRegistry.getNextAvailableRenderId();<br> LeadTank.renderID = tank_id;<br> RenderingRegistry.registerBlockHandler(tank_id, new RenderLeadTank(tank_id));<br> MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(InitBlocks.lead_tank), new RenderItemBlockLeadTank());<br> <br> <br> }<br> <br> <br>}<br>
package forgingmc.minecraftthing;<br>import cpw.mods.fml.common.registry.GameRegistry;<br>import forgingmc.minecraftthing.tile.TileLeadTank;<br>public class CommonProxy {<br>public void init()<br> {<br> registerRenders();<br> registerTiles();<br> }<br> <br> <br> public void registerTiles()<br> {<br> GameRegistry.registerTileEntity(TileLeadTank.class, "leadTank");<br> }<br> <br> public void registerRenders()<br> {<br> <br> }<br> <br>}<br>
Tutorials on website:
Setting up forge and eclipse
Basic Block
Basic Item
Custom crafting, smelting and ore dictionary recipes
Creative Tab
Ore generation
Structure Generation
Fluid Tank tutorial (post below) Fluid tank is up and running, the tile entity is now there.
Want any new tutorials or having some problems? Comment below or email me (contact on website).
http://septoxel.wix.com/forgingmc
Hello again! I couldnt get the code for this on my website just yet, so I'll put it here instead. Remember! Not all the code is copy paste, all things that arent are basic things you should know like texture registry and language localisations.
Here are the classes you need:
Block
package forgingmc.minecraftthing.blocks;<br>import java.util.Random;<br> <br> <br> <br>import cpw.mods.fml.common.registry.GameRegistry;<br>import forgingmc.minecraftthing.Constants;<br>import forgingmc.minecraftthing.ForgingMC;<br>import forgingmc.minecraftthing.Utils;<br>import forgingmc.minecraftthing.items.ItemBlockLeadTank;<br>import forgingmc.minecraftthing.render.RenderLeadTank;<br>import forgingmc.minecraftthing.tile.TileLeadTank;<br>import net.minecraft.block.Block;<br>import net.minecraft.block.BlockContainer;<br>import net.minecraft.block.ITileEntityProvider;<br>import net.minecraft.block.material.Material;<br>import net.minecraft.creativetab.CreativeTabs;<br>import net.minecraft.entity.Entity;<br>import net.minecraft.entity.EntityLivingBase;<br>import net.minecraft.entity.player.EntityPlayer;<br>import net.minecraft.item.ItemStack;<br>import net.minecraft.nbt.NBTTagCompound;<br>import net.minecraft.tileentity.TileEntity;<br>import net.minecraft.util.IIcon;<br>import net.minecraft.util.MovingObjectPosition;<br>import net.minecraft.world.EnumSkyBlock;<br>import net.minecraft.world.Explosion;<br>import net.minecraft.world.IBlockAccess;<br>import net.minecraft.world.World;<br>import net.minecraftforge.common.util.ForgeDirection;<br>import net.minecraftforge.fluids.FluidContainerRegistry;<br>import net.minecraftforge.fluids.FluidStack;<br>import net.minecraftforge.fluids.FluidTankInfo;<br>public class LeadTank extends Block implements ITileEntityProvider{<br>public static int renderID;<br>public static IIcon icon;<br>public LeadTank() {<br> super(Material.glass);<br> setBlockName(Constants.MOD_ID + "_" + Constants.LEAD_TANK_NAME);<br> setBlockTextureName(Constants.MOD_ID + ":" + Constants.LEAD_TANK_TEXTURE);<br> setCreativeTab(ForgingMC.forgingMCTab);<br> GameRegistry.registerBlock(this, ItemBlockLeadTank.class, Constants.LEAD_TANK_NAME);<br>}<br> <br> <br><br>@Override<br> public ItemStack getPickBlock(MovingObjectPosition target, World world,<br> int x, int y, int z) {<br> // TODO Auto-generated method stub<br> return Utils.getTankStackFromTile((TileLeadTank) world.getTileEntity(x, y, z), true);<br> }<br>@Override<br> public boolean hasComparatorInputOverride() {<br>return true;<br> }<br>public TileEntity createNewTileEntity(World world, int meta) {<br>return new TileLeadTank();<br> }<br>@Override<br> public boolean isOpaqueCube() {<br>return false;<br> }<br>@Override<br> public int getRenderType() {<br> <br> return renderID;<br> }<br>@Override<br> public boolean renderAsNormalBlock() {<br>return false;<br> }<br>@Override<br> public int getRenderBlockPass() {<br>return 1;<br> }<br><br> @Override<br> public boolean canRenderInPass(int pass) {<br>RenderLeadTank.renderPass = pass;<br> return true;<br> }<br>@Override<br>public int quantityDropped(Random rnd) {<br>return 0;<br>}<br> <br><br>@Override<br>public int getComparatorInputOverride(World world, int x, int y, int z, int opSide) {<br>return 0;<br>}<br>@Override<br> public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9) {<br>ItemStack stack = player.inventory.getCurrentItem();<br> if (stack != null) {<br>FluidStack liquid = FluidContainerRegistry.getFluidForFilledItem(stack);<br> TileLeadTank tank = (TileLeadTank) world.getTileEntity(x, y, z);<br>if (liquid != null) {<br>int amount = tank.fill(ForgeDirection.UNKNOWN, liquid, false);<br>if (amount == liquid.amount) {<br>tank.fill(ForgeDirection.UNKNOWN, liquid, true);<br> if (!player.capabilities.isCreativeMode)<br> player.inventory.setInventorySlotContents(player.inventory.currentItem, Utils.useItemSafely(stack));<br> <br> if(tank.tank.getFluid().getFluid().getBlock() != null)<br> {<br> //z world.setLightValue(EnumSkyBlock.Sky., tank.xCoord, tank.xCoord, tank.xCoord, tank.tank.getFluid().getFluid().getBlock().getLightValue());<br> }<br> <br> <br> return true;<br> }<br>else<br> return true;<br> }<br>else if (FluidContainerRegistry.isBucket(stack)) {<br>FluidTankInfo[] tanks = tank.getTankInfo(ForgeDirection.UNKNOWN);<br>if (tanks[0] != null) {<br>FluidStack fillFluid = tanks[0].fluid;<br> ItemStack fillStack = FluidContainerRegistry.fillFluidContainer(fillFluid, stack);<br>if (fillStack != null) {<br>tank.drain(ForgeDirection.UNKNOWN, FluidContainerRegistry.getFluidForFilledItem(fillStack).amount, true);<br>if (!player.capabilities.isCreativeMode) {<br>if (stack.stackSize == 1)<br> player.inventory.setInventorySlotContents(player.inventory.currentItem, fillStack);<br>else {<br> player.inventory.setInventorySlotContents(player.inventory.currentItem, Utils.useItemSafely(stack));<br>if (!player.inventory.addItemStackToInventory(fillStack))<br> player.dropPlayerItemWithRandomChoice(fillStack, false);<br> }<br> }<br> return true;<br> }<br>else<br> return true;<br> }<br> <br> }<br> }<br>return false;<br> }<br>@Override<br> public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z, boolean willHarvest) {<br>if (!player.capabilities.isCreativeMode) {<br>TileLeadTank tank = (TileLeadTank) world.getTileEntity(x, y, z);<br> <br> Utils.dropStackInWorld(world, x, y, z, Utils.getTankStackFromTile(tank, true));<br> <br> <br> <br> }<br>return world.setBlockToAir(x, y, z);<br> }<br>@Override<br> public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack stack) {<br>if (stack.hasTagCompound()) {<br>TileLeadTank tank = (TileLeadTank) world.getTileEntity(x, y, z);<br>if (tank != null) {<br>NBTTagCompound tagFluid = stack.getTagCompound().getCompoundTag("Fluid");<br>if (tagFluid != null) {<br>FluidStack liquid = FluidStack.loadFluidStackFromNBT(tagFluid);<br> tank.tank.setFluid(liquid);<br>}<br><br>}<br>}<br>}<br>@Override<br>public void onBlockExploded(World world, int x, int y, int z, Explosion explosion) {<br>Utils.dropStackInWorld(world, x, y, z, Utils.getTankStackFromTile((TileLeadTank) world.getTileEntity(x, y, z), true));<br>world.setBlockToAir(x, y, z);<br>onBlockDestroyedByExplosion(world, x, y, z, explosion);<br>}<br> <br> <br>}<br></span>RenderBlock
</span> package forgingmc.minecraftthing.blocks;<br>import cpw.mods.fml.common.registry.GameRegistry;<br>import net.minecraft.block.Block;<br>import net.minecraft.block.material.Material;<br>public class RenderBlock extends Block {<br>protected RenderBlock() {<br> super(Material.air);<br> GameRegistry.registerBlock(this, "renderBlocks");<br> }<br>}<br>TileEntity
package forgingmc.minecraftthing.tile;
import java.util.HashMap;
import net.minecraft.block.Block;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTank;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;
public class TileLeadTank extends TileEntity implements IFluidHandler{
public FluidTank tank = new FluidTank(20000);
private boolean needsUpdate = false;
private int updateTimer = 0;
public TileLeadTank() {
}
public TileLeadTank(int x, int y, int z) {
worldObj.getTileEntity(x, y, z);
}
public int fill(ForgeDirection from, FluidStack resource, boolean doFill)
{
needsUpdate = true;
return this.tank.fill(resource, doFill);
}
public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain)
{
return this.tank.drain(resource.amount, doDrain);
}
public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain)
{
needsUpdate = true;
return this.tank.drain(maxDrain, doDrain);
}
public boolean canFill(ForgeDirection from, Fluid fluid)
{
return true;
}
public boolean canDrain(ForgeDirection from, Fluid fluid)
{
return true;
}
public FluidTankInfo[] getTankInfo(ForgeDirection from)
{
return new FluidTankInfo[] {this.tank.getInfo()};
}
public float getAdjustedVolume()
{
float amount = tank.getFluidAmount();
float capacity = tank.getCapacity();
float volume = (amount/capacity)*0.8F;
return volume;
}
public void updateEntity()
{
needsUpdate = true;
if (needsUpdate)
{
if (updateTimer == 0)
{
updateTimer = 16; // every 1 ticks it will send an update
}
else
{
--updateTimer;
if (updateTimer == 0)
{
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
needsUpdate = false;
}
}
}
}
@Override
public void readFromNBT(NBTTagCompound tag)
{
super.readFromNBT(tag);
tank.readFromNBT(tag);
}
@Override
public void writeToNBT(NBTTagCompound tag)
{
super.writeToNBT(tag);
tank.writeToNBT(tag);
writeCustomNBT(tag);
}
private void writeCustomNBT(NBTTagCompound tag) {
NBTTagCompound comp = new NBTTagCompound();
}
@Override
public Packet getDescriptionPacket()
{
NBTTagCompound tag = new NBTTagCompound();
writeToNBT(tag);
return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, this.blockMetadata, tag);
}
@Override
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt)
{
NBTTagCompound tag = pkt.func_148857_g();
readFromNBT(tag);
}
}
Utils
</span> package forgingmc.minecraftthing;<br>import org.lwjgl.opengl.GL11;<br>import net.minecraft.block.Block;<br>import net.minecraft.client.renderer.RenderBlocks;<br>import net.minecraft.client.renderer.Tessellator;<br>import net.minecraft.entity.item.EntityItem;<br>import net.minecraft.init.Blocks;<br>import net.minecraft.item.Item;<br>import net.minecraft.item.ItemStack;<br>import net.minecraft.nbt.NBTTagCompound;<br>import net.minecraft.util.IIcon;<br>import net.minecraft.world.World;<br>import net.minecraftforge.fluids.Fluid;<br>import net.minecraftforge.fluids.FluidStack;<br>import forgingmc.minecraftthing.blocks.InitBlocks;<br>import forgingmc.minecraftthing.tile.TileLeadTank;<br>public class Utils {<br>public static void renderBlockByCompleteness(Block block, Fluid fluid, int meta, RenderBlocks renderer, double complete, int x, int y, int z) {<br> <br> renderer.setRenderBounds(0.01, 0.01, 0.01, 0.99, complete * 0.99, 0.99);<br> renderer.setOverrideBlockTexture(fluid.getIcon()); <br> renderer.renderStandardBlock(block, x, y, z);<br> renderer.clearOverrideBlockTexture();<br> }<br>public static ItemStack useItemSafely(ItemStack stack) {<br> if (stack.stackSize == 1) {<br>if (stack.getItem().hasContainerItem(stack))<br> return stack.getItem().getContainerItem(stack);<br> else<br> return null;<br> }<br>else {<br>stack.splitStack(1);<br> return stack;<br> }<br> }<br>public static void dropStackInWorld(World world, int x, int y, int z,<br> ItemStack stack) {<br> if (!world.isRemote && world.getGameRules().getGameRuleBooleanValue("doTileDrops")) {<br>float f = 0.7F;<br> double d0 = (double) (world.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D;<br> double d1 = (double) (world.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D;<br> double d2 = (double) (world.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D;<br> EntityItem entityitem = new EntityItem(world, (double) x + d0, (double) y + d1, (double) z + d2, stack);<br> entityitem.delayBeforeCanPickup = 10;<br> world.spawnEntityInWorld(entityitem);<br> }<br> <br> }<br>public static ItemStack getTankStackFromTile(TileLeadTank tank,<br> boolean keepFluid) {<br>ItemStack stack = new ItemStack(InitBlocks.lead_tank);<br> stack.setTagCompound(new NBTTagCompound());<br> FluidStack fluid = tank.tank.getFluid();<br>if (fluid != null && keepFluid) {<br>NBTTagCompound tagFluid = new NBTTagCompound();<br> fluid.writeToNBT(tagFluid);<br> stack.getTagCompound().setTag("Fluid", tagFluid);<br> }<br> <br>return stack;<br> }<br>public static void renderInventoryBlock(RenderBlocks renderblocks, Block block, IIcon icon) {<br>Tessellator tessellator = Tessellator.instance;<br>GL11.glTranslatef(-0.5F, -0.5F, -0.5F);<br> tessellator.startDrawingQuads();<br> tessellator.setNormal(0.0F, -1F, 0.0F);<br> renderblocks.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, getValidIIcon(icon));<br> tessellator.draw();<br> tessellator.startDrawingQuads();<br> tessellator.setNormal(0.0F, 1.0F, 0.0F);<br> renderblocks.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, getValidIIcon(icon));<br> tessellator.draw();<br> tessellator.startDrawingQuads();<br> tessellator.setNormal(0.0F, 0.0F, -1F);<br> renderblocks.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, getValidIIcon(icon));<br> tessellator.draw();<br> tessellator.startDrawingQuads();<br> tessellator.setNormal(0.0F, 0.0F, 1.0F);<br> renderblocks.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, getValidIIcon(icon));<br> tessellator.draw();<br> tessellator.startDrawingQuads();<br> tessellator.setNormal(-1F, 0.0F, 0.0F);<br> renderblocks.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, getValidIIcon(icon));<br> tessellator.draw();<br> tessellator.startDrawingQuads();<br> tessellator.setNormal(1.0F, 0.0F, 0.0F);<br> renderblocks.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, getValidIIcon(icon));<br> tessellator.draw();<br> GL11.glTranslatef(0.5F, 0.5F, 0.5F);<br> }<br> <br> public static void renderInventoryBlock(RenderBlocks renderblocks, Block block, Fluid fluid) {<br>Tessellator tessellator = Tessellator.instance;<br> GL11.glTranslatef(-0.5F, -0.5F, -0.5F);<br> tessellator.startDrawingQuads();<br> tessellator.setNormal(0.0F, -1F, 0.0F);<br> renderblocks.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, getValidIIcon(fluid.getIcon()));<br> tessellator.draw();<br> tessellator.startDrawingQuads();<br> tessellator.setNormal(0.0F, 1.0F, 0.0F);<br> renderblocks.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, getValidIIcon(fluid.getIcon()));<br> tessellator.draw();<br> tessellator.startDrawingQuads();<br> tessellator.setNormal(0.0F, 0.0F, -1F);<br> renderblocks.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, getValidIIcon(fluid.getIcon()));<br> tessellator.draw();<br> tessellator.startDrawingQuads();<br> tessellator.setNormal(0.0F, 0.0F, 1.0F);<br> renderblocks.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, getValidIIcon(fluid.getIcon()));<br> tessellator.draw();<br> tessellator.startDrawingQuads();<br> tessellator.setNormal(-1F, 0.0F, 0.0F);<br> renderblocks.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, getValidIIcon(fluid.getIcon()));<br> tessellator.draw();<br> tessellator.startDrawingQuads();<br> tessellator.setNormal(1.0F, 0.0F, 0.0F);<br> renderblocks.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, getValidIIcon(fluid.getIcon()));<br> tessellator.draw();<br> GL11.glTranslatef(0.5F, 0.5F, 0.5F);<br> }<br>private static IIcon getValidIIcon(IIcon icon) {<br> if (icon != null)<br> return icon;<br>return Blocks.fire.getIcon(0, 0);<br> }<br>public static ItemStack getTankStackFromData() {<br>ItemStack stack = new ItemStack(Item.getItemFromBlock(InitBlocks.lead_tank));<br> NBTTagCompound tag = new NBTTagCompound();<br> stack.setTagCompound(tag);<br> return stack;<br> }<br>public static ItemStack getItemBlockForCreativeTab(Block block)<br> {<br> ItemStack stack = new ItemStack(Item.getItemFromBlock(block));<br> return stack;<br> }<br> <br> <br> <br>}<br>ItemBlock
package forgingmc.minecraftthing.items;<br>import java.util.List;<br> <br>import cpw.mods.fml.relauncher.Side;<br>import cpw.mods.fml.relauncher.SideOnly;<br>import forgingmc.minecraftthing.Utils;<br>import net.minecraft.block.Block;<br>import net.minecraft.creativetab.CreativeTabs;<br>import net.minecraft.entity.player.EntityPlayer;<br>import net.minecraft.item.Item;<br>import net.minecraft.item.ItemBlock;<br>import net.minecraft.item.ItemStack;<br>import net.minecraft.nbt.NBTTagCompound;<br>import net.minecraftforge.fluids.FluidStack;<br>public class ItemBlockLeadTank extends ItemBlock{<br>public ItemBlockLeadTank(Block p_i45328_1_) {<br> super(p_i45328_1_);<br> this.setMaxStackSize(1);<br> }<br>@SideOnly(Side.CLIENT)<br> @Override<br> public void addInformation(ItemStack stack, EntityPlayer player,<br> List tooltip, boolean isAdvanced) {<br> <br> if (stack.hasTagCompound()) {<br>NBTTagCompound tag = stack.stackTagCompound;<br>FluidStack fluid = null;<br>if (tag.hasKey("Fluid")) {<br>fluid = FluidStack.loadFluidStackFromNBT((NBTTagCompound) tag.getTag("Fluid"));<br> tooltip.add("Fluid " + ": " + fluid.getLocalizedName());<br> }<br>int amount = (fluid != null) ? fluid.amount : 0;<br>tooltip.add("Amount" + ": " + amount + " / " + 20000 + " mB");<br> <br> }<br>else<br> tooltip.add("Item Error");<br> }<br> <br> <br> @SideOnly(Side.CLIENT)<br> public void getSubItems(Item item, CreativeTabs tab, List itemList) {<br><br> itemList.add(Utils.getTankStackFromData());<br> <br>}<br> <br> <br>}<br> <br>package forgingmc.minecraftthing.render;<br>import net.minecraft.block.Block;<br>import net.minecraft.client.renderer.RenderBlocks;<br>import net.minecraft.world.IBlockAccess;<br>import net.minecraftforge.fluids.Fluid;<br>import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;<br>import forgingmc.minecraftthing.Utils;<br>import forgingmc.minecraftthing.blocks.InitBlocks;<br>import forgingmc.minecraftthing.tile.TileLeadTank;<br>public class RenderLeadTank implements ISimpleBlockRenderingHandler{<br>public static int renderID;<br> public static int renderPass = 0;<br>public RenderLeadTank(int renderingID) {<br>renderID = renderingID;<br> }<br>@Override<br> public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {<br>}<br>@Override<br> public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {<br>if (modelId == renderID) {<br>TileLeadTank tank = (TileLeadTank) world.getTileEntity(x, y, z);<br>if (renderPass == 0) {<br>if (tank.tank.getFluid() != null) {<br>Fluid fluid = tank.tank.getFluid().getFluid();<br> Utils.renderBlockByCompleteness(InitBlocks.renderBlock,fluid, world.getBlockMetadata(x, y, z), renderer, (double) tank.tank.getFluidAmount() / (double) tank.tank.getCapacity(), x, y, z);<br> }<br> }<br>else if (renderPass == 1) {<br>renderer.setRenderBounds(0, 0, 0, 1, 1, 1);<br>renderer.renderStandardBlock(block, x, y, z);<br>renderer.setRenderFromInside(true);<br> renderer.setRenderBounds(0, 0, 0, 1, 1, 1);<br> renderer.renderStandardBlock(block, x, y, z);<br> renderer.setRenderFromInside(false);<br> }<br> }<br> return true;<br> }<br>@Override<br> public boolean shouldRender3DInInventory(int modelId) {<br>return false;<br> }<br>@Override<br> public int getRenderId() {<br>return renderID;<br> }<br>}<br>[/spoiler] ItemBlock Render [spoiler][code] package forgingmc.minecraftthing.render;<br>import org.lwjgl.opengl.GL11;<br>import forgingmc.minecraftthing.Utils;<br>import forgingmc.minecraftthing.blocks.InitBlocks;<br>import net.minecraft.block.Block;<br>import net.minecraft.client.renderer.RenderBlocks;<br>import net.minecraft.item.ItemStack;<br>import net.minecraft.nbt.NBTTagCompound;<br>import net.minecraftforge.client.IItemRenderer;<br>import net.minecraftforge.client.IItemRenderer.ItemRenderType;<br>import net.minecraftforge.client.IItemRenderer.ItemRendererHelper;<br>import net.minecraftforge.fluids.FluidStack;<br>public class RenderItemBlockLeadTank implements IItemRenderer {<br>@Override<br> public boolean handleRenderType(ItemStack item, ItemRenderType type) {<br>return type == ItemRenderType.INVENTORY || type == ItemRenderType.ENTITY || type == ItemRenderType.EQUIPPED_FIRST_PERSON || type == ItemRenderType.EQUIPPED;<br> }<br>@Override<br> public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {<br>return true;<br> }<br>@Override<br> public void renderItem(ItemRenderType type, ItemStack item, Object... data) {<br>RenderBlocks renderblocks = (RenderBlocks) data[0];<br> Block block = Block.getBlockFromItem(item.getItem());<br>if (item.hasTagCompound()) {<br>NBTTagCompound tag = item.stackTagCompound;<br>if (tag.hasKey("Fluid")) {<br>FluidStack liquid = FluidStack.loadFluidStackFromNBT(item.getTagCompound().getCompoundTag("Fluid"));<br> if (liquid != null) {<br>GL11.glEnable(GL11.GL_BLEND);<br> float height = ((float) liquid.amount / (float) 20000 * (float) 0.99);<br> renderblocks.setRenderBounds(0.01, 0.01, 0.01, 0.99, height, 0.99);<br> Utils.renderInventoryBlock(renderblocks, InitBlocks.renderBlock, liquid.getFluid());<br> GL11.glDisable(GL11.GL_BLEND);<br> }<br> }<br> <br>GL11.glEnable(GL11.GL_ALPHA_TEST);<br> renderblocks.setRenderBounds(0, 0, 0, 1, 1, 1);<br>Utils.renderInventoryBlock(renderblocks, block, InitBlocks.lead_tank.getIcon(0, 0));<br> GL11.glDisable(GL11.GL_ALPHA_TEST);<br> <br> }<br> }<br>}<br>BlocksInit (registry of blocks)
package forgingmc.minecraftthing.blocks;<br>import net.minecraft.block.Block;<br>import net.minecraftforge.fluids.Fluid;<br>public class InitBlocks {<br>public static Block ore_lead;<br> public static Block lead_block;<br> public static Block lead_tank;<br> public static Block renderBlock;<br> public static Block liquidLead;<br> public static Fluid fluidLead;<br> <br> public static void init()<br> {<br> liquidLead = new BlockFluidLead();<br> ore_lead = new LeadOre();<br> lead_block = new LeadBlock();<br> lead_tank = new LeadTank();<br> renderBlock = new RenderBlock();<br> }<br> <br> <br>}<br>Client and Common Proxies
package forgingmc.minecraftthing;<br>import net.minecraft.item.Item;<br>import net.minecraftforge.client.MinecraftForgeClient;<br>import cpw.mods.fml.client.registry.RenderingRegistry;<br>import forgingmc.minecraftthing.blocks.InitBlocks;<br>import forgingmc.minecraftthing.blocks.LeadTank;<br>import forgingmc.minecraftthing.render.RenderItemBlockLeadTank;<br>import forgingmc.minecraftthing.render.RenderLeadTank;<br>public class ClientProxy extends CommonProxy{<br><br> @Override<br> public void registerRenders() {<br> int tank_id = RenderingRegistry.getNextAvailableRenderId();<br> LeadTank.renderID = tank_id;<br> RenderingRegistry.registerBlockHandler(tank_id, new RenderLeadTank(tank_id));<br> MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(InitBlocks.lead_tank), new RenderItemBlockLeadTank());<br> <br> <br> }<br> <br> <br>}<br>package forgingmc.minecraftthing;<br>import cpw.mods.fml.common.registry.GameRegistry;<br>import forgingmc.minecraftthing.tile.TileLeadTank;<br>public class CommonProxy {<br>public void init()<br> {<br> registerRenders();<br> registerTiles();<br> }<br> <br> <br> public void registerTiles()<br> {<br> GameRegistry.registerTileEntity(TileLeadTank.class, "leadTank");<br> }<br> <br> public void registerRenders()<br> {<br> <br> }<br> <br>}<br>This seems nice, especially because coding help is real tough to get around here.
I'm confused on one thing, if I downloaded Forge API, do I have to download the 1.7.10 src too?
Oh, I get it, dang, I have only the installer version, I have to re-install it? But, using the src version?
Yeah, don't mess with me. Pro in most games, especially Minecraft, CoC, and many more. Level 9001 skills.
I
V
Oh, I get it, I can have two types of Forge, right?
When I open with a Forge profile the launcher dissapears after I click play, so I'm gonna need someone to test this probably lol.
Yeah, don't mess with me. Pro in most games, especially Minecraft, CoC, and many more. Level 9001 skills.
I
V
It says BUILD FAILED when I want to setup my workspace. What am I doing wrong?
Maybe I should type gradle instead of gradlew.
Yeah, don't mess with me. Pro in most games, especially Minecraft, CoC, and many more. Level 9001 skills.
I
V
Gradle doesn't work, how do I setup my workspace if everyone does it this way?!! :0
Yeah, don't mess with me. Pro in most games, especially Minecraft, CoC, and many more. Level 9001 skills.
I
V
Scorce code by any chance for people that want to see what there getting into?