/** * This class was created by <Vazkii>. It's distributed as * part of the Botania Mod. Get the Source Code in github: * https://github.com/Vazkii/Botania * * Botania is Open Source and distributed under the * Botania License: http://botaniamod.net/license.php * * File Created @ [Aug 28, 2015, 5:27:43 PM (GMT)] */ package vazkii.botania.common.block.tile.mana; import net.minecraft.block.BlockFurnace; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityFurnace; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.SoundCategory; import vazkii.botania.api.internal.VanillaPacketDispatcher; import vazkii.botania.api.sound.BotaniaSoundEvents; import vazkii.botania.api.state.BotaniaStateProps; import vazkii.botania.common.block.subtile.functional.SubTileExoflame; import vazkii.botania.common.block.tile.TileMod; public class TileBellows extends TileMod { private static final String TAG_ACTIVE = "active"; public float movePos; public boolean active = false; public float moving = 0F; public void interact() { if(moving == 0F) setActive(true); } @Override public void update() { boolean disable = true; TileEntity tile = getLinkedTile(); if(!active && tile instanceof TilePool) { TilePool pool = (TilePool) tile; boolean transfer = pool.isDoingTransfer; if(transfer) { if(!active && pool.ticksDoingTransfer >= getBlockMetadata() * 2 - 2) setActive(true); disable = false; } } float max = 0.9F; float min = 0F; float incr = max / 20F; if(movePos < max && active && moving >= 0F) { if(moving == 0F) world.playSound(null, pos, BotaniaSoundEvents.bellows, SoundCategory.BLOCKS, 0.1F, 3F); if(tile instanceof TileEntityFurnace) { TileEntityFurnace furnace = (TileEntityFurnace) tile; if(SubTileExoflame.canFurnaceSmelt(furnace)) { furnace.setField(2, Math.min(199, furnace.getField(2) + 20)); // cookTime furnace.setField(0, Math.max(0, furnace.getField(0) - 10)); // burnTime } if(furnace.hasWorld() && furnace.getBlockType() == Blocks.LIT_FURNACE) { // Copypasta from BlockFurnace EnumFacing enumfacing = world.getBlockState(furnace.getPos()).getValue(BlockFurnace.FACING); double d0 = pos.getX() + 0.5D; double d1 = pos.getY() + world.rand.nextDouble() * 6.0D / 16.0D; double d2 = pos.getZ() + 0.5D; double d3 = 0.52D; double d4 = world.rand.nextDouble() * 0.6D - 0.3D; switch (enumfacing) { case WEST: world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 - d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D); world.spawnParticle(EnumParticleTypes.FLAME, d0 - d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D); break; case EAST: world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D); world.spawnParticle(EnumParticleTypes.FLAME, d0 + d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D); break; case NORTH: world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 - d3, 0.0D, 0.0D, 0.0D); world.spawnParticle(EnumParticleTypes.FLAME, d0 + d4, d1, d2 - d3, 0.0D, 0.0D, 0.0D); break; case SOUTH: world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 + d3, 0.0D, 0.0D, 0.0D); world.spawnParticle(EnumParticleTypes.FLAME, d0 + d4, d1, d2 + d3, 0.0D, 0.0D, 0.0D); default: break; } } } movePos += incr * 3; moving = incr * 3; if(movePos >= max) { movePos = Math.min(max, movePos); moving = 0F; if(disable) setActive(false); } } else if(movePos > min) { movePos -= incr; moving = -incr; if(movePos <= min) { movePos = Math.max(min, movePos); moving = 0F; } } } public TileEntity getLinkedTile() { EnumFacing side = world.getBlockState(getPos()).getValue(BotaniaStateProps.CARDINALS); return world.getTileEntity(getPos().offset(side)); } @Override public void writePacketNBT(NBTTagCompound cmp) { cmp.setBoolean(TAG_ACTIVE, active); } @Override public void readPacketNBT(NBTTagCompound cmp) { active = cmp.getBoolean(TAG_ACTIVE); } public void setActive(boolean active) { if(!world.isRemote) { boolean diff = this.active != active; this.active = active; if(diff) VanillaPacketDispatcher.dispatchTEToNearbyPlayers(world, pos); } } }