package mod.mores.objects.blocks.machines;
import mod.mores.init.BlockInit;
import mod.mores.util.Reference;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemHoe;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemSword;
import net.minecraft.item.ItemTool;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ITickable;
import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.world.World;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.event.ForgeEventFactory;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.ItemStackHandler;
import java.util.ArrayList;
public class TileEntityAlloyFurnace extends TileEntity implements ITickable {
private ItemStackHandler inventory = new ItemStackHandler(NonNullList.withSize(4, ItemStack.EMPTY));
private String customName;
private ItemStack smelting = ItemStack.EMPTY;
private static final String BURNTIME_KEY = "BurnTime";
private static final String COOKTIME_KEY = "CookTime";
private static final String COOKTIMETOTAL_KEY = "CookTimeTotal";
private static final String INVENTORY_KEY = "inventory";
private static final String CUSTOMNAME_KEY = "CustomName";
public static final int INPUT_LEFT = 0;
public static final int INPUT_RIGHT = 1;
public static final int INPUT_FUEL = 2;
public static final int OUTPUT = 3;
public int burnTime = 0;
public int currentBurnTime = 0;
public int cookTime = 0;
public int totalCookTime = 600;
public TileEntityAlloyFurnace() {
Reference.LOGGER.info("TileEntity is successfully bound to a block");
}
@Override
public boolean shouldRefresh(World world, BlockPos pos, IBlockState oldState, IBlockState newState)
{
return (oldState.getBlock() != newState.getBlock());
}
@Override
public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
// TODO Auto-generated method stub
if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
return true;
return super.hasCapability(capability, facing);
}
@Override
public <T> T getCapability(Capability<T> capability, EnumFacing facing) {
// TODO Auto-generated method stub
if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
return (T) this.inventory;
return super.getCapability(capability, facing);
}
public boolean hasCustomName() {
return customName != null && !customName.isEmpty();
}
public void setCustomName(String customname) {
this.customName = customname;
}
@Override
public ITextComponent getDisplayName() {
return this.hasCustomName() ? new TextComponentString(this.customName)
: new TextComponentTranslation("container.alloy_furnace");
}
@Override
public void readFromNBT(NBTTagCompound compound) {
super.readFromNBT(compound);
this.inventory.deserializeNBT(compound.getCompoundTag(INVENTORY_KEY));
burnTime = compound.getInteger(BURNTIME_KEY);
cookTime = compound.getInteger(COOKTIME_KEY);
totalCookTime = compound.getInteger(COOKTIMETOTAL_KEY);
currentBurnTime = getItemBurnTime((ItemStack) inventory.getStackInSlot(1));
if (compound.hasKey(CUSTOMNAME_KEY, 8))
setCustomName(compound.getString(CUSTOMNAME_KEY));
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound compound) {
super.writeToNBT(compound);
compound.setInteger(BURNTIME_KEY, (short) burnTime);
compound.setInteger(COOKTIME_KEY, (short) cookTime);
compound.setInteger(COOKTIMETOTAL_KEY, (short) totalCookTime);
compound.setTag(INVENTORY_KEY, this.inventory.serializeNBT());
if (hasCustomName())
compound.setString(CUSTOMNAME_KEY, customName);
return compound;
}
public boolean isBurning() {
return burnTime > 0;
}
@SideOnly(Side.CLIENT)
public static boolean isBurning(TileEntityAlloyFurnace te) {
return te.burnTime > 0;
}
public static void setState(boolean active, World worldIn, BlockPos pos) {
IBlockState state = worldIn.getBlockState(pos);
TileEntity tileentity = worldIn.getTileEntity(pos);
if (active)
worldIn.setBlockState(pos, BlockInit.ALLOY_FURNACE.getDefaultState()
.withProperty(BlockAlloyFurnace.FACING, state.getValue(BlockAlloyFurnace.FACING)).withProperty(BlockAlloyFurnace.BURNING, true), 1 | 2);
else
worldIn.setBlockState(pos, BlockInit.ALLOY_FURNACE.getDefaultState()
.withProperty(BlockAlloyFurnace.FACING, state.getValue(BlockAlloyFurnace.FACING)).withProperty(BlockAlloyFurnace.BURNING, false), 1 | 2);
if (tileentity != null) {
tileentity.validate();
worldIn.setTileEntity(pos, tileentity);
}
}
@Override
public void update() {
boolean wasBurning = isBurning();
boolean flag1 = false;
if(this.isBurning())
{
--this.burnTime;
setState(true, world, pos);
}
ItemStack[] inputs = new ItemStack[] {inventory.getStackInSlot(INPUT_LEFT), inventory.getStackInSlot(INPUT_RIGHT)};
ItemStack fuel = this.inventory.getStackInSlot(INPUT_FUEL);
if(this.isBurning() || !fuel.isEmpty() && !this.inventory.getStackInSlot(INPUT_LEFT).isEmpty() || !this.inventory.getStackInSlot(INPUT_RIGHT).isEmpty())
{
if(!this.isBurning() && this.canSmelt())
{
this.burnTime = getItemBurnTime(fuel);
this.currentBurnTime = burnTime;
if(this.isBurning() && !fuel.isEmpty())
{
Item item = fuel.getItem();
fuel.shrink(1);
if(fuel.isEmpty())
{
ItemStack item1 = item.getContainerItem(fuel);
this.inventory.setStackInSlot(2, item1);
}
}
}
}
if(this.isBurning() && this.canSmelt() && cookTime > 0)
{
cookTime++;
if(cookTime == totalCookTime)
{
if(inventory.getStackInSlot(3).getCount() > 0)
{
inventory.getStackInSlot(3).grow(1);
}
else
{
inventory.insertItem(3, smelting, false);
}
smelting = ItemStack.EMPTY;
cookTime = 0;
return;
}
}
else
{
if(this.canSmelt() && this.isBurning())
{
ItemStack output = AlloyFurnaceRecipes.getInstance().getAlloyResult(inputs[0], inputs[1]);
if(!output.isEmpty())
{
smelting = output;
cookTime++;
inputs[0].shrink(1);
inputs[1].shrink(1);
inventory.setStackInSlot(0, inputs[0]);
inventory.setStackInSlot(1, inputs[1]);
}
}
}
}
private boolean canSmelt() {
if (((ItemStack) inventory.getStackInSlot(INPUT_LEFT)).isEmpty() || ((ItemStack) inventory.getStackInSlot(INPUT_RIGHT)).isEmpty())
return false;
else {
ItemStack result1 = AlloyFurnaceRecipes.getInstance().getAlloyResult((ItemStack) inventory.getStackInSlot(INPUT_LEFT), (ItemStack) inventory.getStackInSlot(INPUT_RIGHT));
if (result1.isEmpty())
return false;
else {
ItemStack fuel = (ItemStack) inventory.getStackInSlot(INPUT_FUEL);
ItemStack output = (ItemStack) inventory.getStackInSlot(OUTPUT);
if(output.isEmpty()) return true;
if(!output.isItemEqual(result1)) return false;
int res1 = output.getCount() + result1.getCount();
int res2 = fuel.getCount() + 1;
return (res1 <= 64 && res1 <= output.getMaxStackSize())
|| (res2 <= 64 && res2 <= fuel.getMaxStackSize());
}
}
}
public static int getItemBurnTime(ItemStack fuel) {
if (fuel.isEmpty())
return 0;
else {
Item item = fuel.getItem();
if (item instanceof ItemBlock && Block.getBlockFromItem(item) != Blocks.AIR) {
Block block = Block.getBlockFromItem(item);
if (block == Blocks.WOODEN_SLAB)
return 100;
if (block == Blocks.ACACIA_STAIRS || block == Blocks.OAK_STAIRS || block == Blocks.JUNGLE_STAIRS
|| block == Blocks.BIRCH_STAIRS || block == Blocks.DARK_OAK_STAIRS
|| block == Blocks.SPRUCE_STAIRS)
return 150;
if (block.getDefaultState().getMaterial() == Material.WOOD)
return 200;
if (block == Blocks.COAL_BLOCK)
return 14400;
}
if (item instanceof ItemTool && "WOOD".contentEquals(((ItemTool) item).getToolMaterialName()))
return 180;
if (item instanceof ItemSword && "WOOD".contentEquals(((ItemTool) item).getToolMaterialName()))
return 180;
if (item instanceof ItemHoe && "WOOD".contentEquals(((ItemTool) item).getToolMaterialName()))
return 180;
if (item == Items.STICK)
return 50;
if (item == Items.COAL)
return 1600;
if (item == Items.LAVA_BUCKET)
return 20000;
if (item == Item.getItemFromBlock(Blocks.SAPLING))
return 70;
if (item == Items.BLAZE_ROD)
return 1600;
return ForgeEventFactory.getItemBurnTime(fuel);
}
}
public static boolean isItemFuel(ItemStack fuel) {
return getItemBurnTime(fuel) > 0;
}
public boolean isUsableByPlayer(EntityPlayer player) {
return world.getTileEntity(pos) == this && player.getDistanceSq((double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D,
(double) pos.getZ() + 0.5D) <= 64.0D;
}
public boolean isItemValidForSlot(int index, ItemStack stack) {
if (index == 2 || index == 3)
return false;
if (index != 1)
return true;
else {
return isItemFuel(stack);
}
}
public final ArrayList<ItemStack> containerLists() {
ArrayList<ItemStack> stackList = new ArrayList(inventory.getSlots());
for (int i = 0; i < inventory.getSlots(); i++) {
stackList.add(inventory.getStackInSlot(i));
}
return stackList;
}
public int getField(int id)
{
switch(id)
{
case 0:
return this.burnTime;
case 1:
return this.currentBurnTime;
case 2:
return this.cookTime;
case 3:
return this.totalCookTime;
default:
return 0;
}
}
public void setField(int id, int value)
{
switch(id)
{
case 0:
this.burnTime = value;
break;
case 1:
this.currentBurnTime = value;
break;
case 2:
this.cookTime = value;
break;
case 3:
this.totalCookTime = value;
}
}
/*
@Override
public NBTTagCompound getUpdateTag() {
return writeToNBT(new NBTTagCompound());
}
*/
/*
@Override
public SPacketUpdateTileEntity getUpdatePacket() {
return null;
}
*/
}
package mod.mores.objects.blocks.machines;
import mod.mores.init.BlockInit;
import mod.mores.init.ItemInit;
import mod.mores.modid.Mores;
import mod.mores.objects.BlockBase;
import mod.mores.particle.FlameParticle;
import mod.mores.particle.ParticleCustom;
import mod.mores.util.Reference;
import net.minecraft.block.Block;
import net.minecraft.block.BlockHorizontal;
import net.minecraft.block.ITileEntityProvider;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool;
import net.minecraft.block.properties.PropertyDirection;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.particle.Particle;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.SoundEvents;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemBucket;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.*;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidActionResult;
import net.minecraftforge.fluids.FluidUtil;
import net.minecraftforge.fluids.UniversalBucket;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.items.CapabilityItemHandler;
import java.util.Random;
public class BlockAlloyFurnace extends Block {
public static final PropertyDirection FACING = BlockHorizontal.FACING;
public static final PropertyBool BURNING = PropertyBool.create("burning");
public BlockAlloyFurnace(String name, Material material, CreativeTabs creativeTab) {
super(material);
setUnlocalizedName(name);
setRegistryName(name);
setCreativeTab(creativeTab);
setSoundType(SoundType.ANVIL);
setHardness(5.0f);
setResistance(30.0f);
setHarvestLevel("pickaxe", 1);
setLightLevel(0.0f);
// setLightOpacity(1);
// setBlockUnbreakable();
this.setDefaultState(
this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH).withProperty(BURNING, false));
BlockInit.BLOCKS.add(this);
ItemInit.ITEMS.add(new ItemBlock(this).setRegistryName(this.getRegistryName()));
}
@Override
public Item getItemDropped(IBlockState state, Random rand, int fortune) {
return Item.getItemFromBlock(BlockInit.ALLOY_FURNACE);
}
@Override
public ItemStack getItem(World worldIn, BlockPos pos, IBlockState state) {
return new ItemStack(BlockInit.ALLOY_FURNACE);
}
@Override
public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn,
EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
if(!worldIn.isRemote)
{
playerIn.openGui(Mores.instance, Reference.GUI_ALLOY_FURNACE, worldIn, pos.getX(), pos.getY(), pos.getZ());
}
return true;
}
@Override
public void onBlockAdded(World worldIn, BlockPos pos, IBlockState state) {
// TODO Auto-generated method stub
if (!worldIn.isRemote) {
IBlockState north = worldIn.getBlockState(pos.north());
IBlockState south = worldIn.getBlockState(pos.south());
IBlockState west = worldIn.getBlockState(pos.west());
IBlockState east = worldIn.getBlockState(pos.east());
EnumFacing face = (EnumFacing) state.getValue(FACING);
if (face == EnumFacing.NORTH)
face = EnumFacing.SOUTH;
if (face == EnumFacing.SOUTH)
face = EnumFacing.NORTH;
if (face == EnumFacing.WEST)
face = EnumFacing.EAST;
if (face == EnumFacing.EAST)
face = EnumFacing.WEST;
worldIn.setBlockState(pos, state.withProperty(FACING, face), 2);
}
}
@Override
public int getLightValue(IBlockState state, IBlockAccess world, BlockPos pos) {
// TODO Auto-generated method stub
return state.getValue(BURNING).booleanValue() ? 15 : 0;
}
@Override
public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY,
float hitZ, int meta, EntityLivingBase placer, EnumHand hand) {
// TODO Auto-generated method stub
return this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite());
}
@Override
public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer,
ItemStack stack) {
// TODO Auto-generated method stub
worldIn.setBlockState(pos,
this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite()), 2);
}
@Override
public IBlockState withRotation(IBlockState state, Rotation rot) {
// TODO Auto-generated method stub
return state.withProperty(FACING, rot.rotate((EnumFacing) state.getValue(FACING)));
}
@Override
public IBlockState withMirror(IBlockState state, Mirror mirrorIn) {
// TODO Auto-generated method stub
return state.withRotation(mirrorIn.toRotation((EnumFacing) state.getValue(FACING)));
}
@Override
protected BlockStateContainer createBlockState() {
// TODO Auto-generated method stub
return new BlockStateContainer(this, new IProperty[] { BURNING, FACING });
}
@Override
public IBlockState getStateFromMeta(int meta) {
// TODO Auto-generated method stub
EnumFacing facing = EnumFacing.getFront(meta);
if (facing.getAxis() == EnumFacing.Axis.Y)
facing = EnumFacing.NORTH;
return this.getDefaultState().withProperty(FACING, facing);
}
@Override
public int getMetaFromState(IBlockState state) {
// TODO Auto-generated method stub
return ((EnumFacing) state.getValue(FACING)).getIndex();
}
@Override
public boolean hasTileEntity(IBlockState state) {
// TODO Auto-generated method stub
return true;
}
@Override
public TileEntityAlloyFurnace createTileEntity(World world, IBlockState state) {
// TODO Auto-generated method stub
return new TileEntityAlloyFurnace();
}
@Override
public void breakBlock(World worldIn, BlockPos pos, IBlockState state) {
// TODO Auto-generated method stub
TileEntity te = worldIn.getTileEntity(pos);
if (te instanceof TileEntityAlloyFurnace) {
for (ItemStack stack : ((TileEntityAlloyFurnace) te).containerLists()) {
spawnAsEntity(worldIn, pos, stack);
}
}
super.breakBlock(worldIn, pos, state);
}
@SideOnly(Side.CLIENT)
@SuppressWarnings("incomplete-switch")
public void randomDisplayTick(IBlockState stateIn, World worldIn, BlockPos pos, Random rand)
{
if (stateIn.getValue(BURNING))
{
EnumFacing enumfacing = (EnumFacing)stateIn.getValue(FACING);
double d0 = (double)pos.getX() + 0.5D;
double d1 = (double)pos.getY() + rand.nextDouble() * 6.0D / 16.0D;
double d2 = (double)pos.getZ() + 0.5D;
double d3 = 0.52D;
double d4 = rand.nextDouble() * 0.6D - 0.3D;
if (rand.nextDouble() < 0.1D)
{
worldIn.playSound((double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, SoundEvents.BLOCK_FURNACE_FIRE_CRACKLE, SoundCategory.BLOCKS, 1.0F, 1.0F, false);
}
switch (enumfacing) {
case WEST:
worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 - 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D);
Particle newEffectWest = new ParticleCustom(new ParticleCustom.TextureDefinition("flame_fx"), worldIn, d0 - 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D);
Minecraft.getMinecraft().effectRenderer.addEffect(newEffectWest);
break;
case EAST:
worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D);
Particle newEffectEast = new ParticleCustom(new ParticleCustom.TextureDefinition("flame_fx"), worldIn, d0 + 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D);
Minecraft.getMinecraft().effectRenderer.addEffect(newEffectEast);
break;
case NORTH:
worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 - 0.52D, 0.0D, 0.0D, 0.0D);
Particle newEffectNorth = new ParticleCustom(new ParticleCustom.TextureDefinition("flame_fx"), worldIn, d0 + d4, d1, d2 - 0.52D, 0.0D, 0.0D, 0.0D);
Minecraft.getMinecraft().effectRenderer.addEffect(newEffectNorth);
break;
case SOUTH:
worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 + 0.52D, 0.0D, 0.0D, 0.0D);
Particle newEffectSouth = new ParticleCustom(new ParticleCustom.TextureDefinition("flame_fx"), worldIn, d0 + d4, d1, d2 + 0.52D, 0.0D, 0.0D, 0.0D);
Minecraft.getMinecraft().effectRenderer.addEffect(newEffectSouth);
}
}
}
}
This is what my code looks like, in case anyone does decide to help
The issues I have as of now is that removing the output items freezes all entities and removing an input or fuel will have the Furnace remaining in its burning state Have tried everything I could think of, searched every known 1.12.2 post known to man but to no avail *cries in 1.12.2*