/*
* Copyright (c) CovertJaguar, 2014 http://railcraft.info
*
* This code is the property of CovertJaguar
* and may only be used with explicit written
* permission unless otherwise specified on the
* license page at http://railcraft.info/wiki/info:license.
*/
package mods.railcraft.common.items.firestone;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import cpw.mods.fml.relauncher.Side;
import java.util.Random;
import mods.railcraft.common.blocks.ore.BlockOre;
import mods.railcraft.common.blocks.ore.EnumOre;
import mods.railcraft.common.plugins.forge.WorldPlugin;
import mods.railcraft.common.util.inventory.InvTools;
import mods.railcraft.common.util.misc.MiscTools;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
/**
*
* @author CovertJaguar <http://www.railcraft.info>
*/
public class FirestoneTickHandler {
private int clock;
private boolean shouldBurn(ItemStack stack) {
if (stack == null || stack.getItem() == null) return false;
if (stack.getItem() == ItemFirestoneRaw.item) return true;
if (stack.getItem() == ItemFirestoneCut.item) return true;
if (stack.getItem() == ItemFirestoneCracked.item) return true;
return InvTools.isStackEqualToBlock(stack, BlockOre.getBlock()) && stack.getItemDamage() == EnumOre.FIRESTONE.ordinal();
}
@SubscribeEvent
public void tick(TickEvent.PlayerTickEvent event) {
if (event.side == Side.CLIENT)
return;
clock++;
if (clock % 4 != 0)
return;
EntityPlayer player = (EntityPlayer) event.player;
if (player.openContainer != player.inventoryContainer) return;
for (ItemStack stack : player.inventory.mainInventory) {
if (shouldBurn(stack)) {
boolean spawnedFire = false;
for (int i = 0; i < stack.stackSize; i++) {
spawnedFire |= spawnFire(player);
}
if (spawnedFire && stack.isItemStackDamageable() && stack.getItemDamage() < stack.getMaxDamage() - 1)
InvTools.damageItem(stack, 1);
}
}
}
private boolean spawnFire(EntityPlayer player) {
Random rnd = player.getRNG();
int x = (int) Math.round(player.posX) - 5 + rnd.nextInt(12);
int y = (int) Math.round(player.posY) - 5 + rnd.nextInt(12);
int z = (int) Math.round(player.posZ) - 5 + rnd.nextInt(12);
if (y < 1)
y = 1;
if (y > player.worldObj.getActualHeight())
y = player.worldObj.getActualHeight() - 2;
if (canBurn(player.worldObj, x, y, z))
return player.worldObj.setBlock(x, y, z, Blocks.fire);
return false;
}
private boolean canBurn(World world, int x, int y, int z) {
if (world.getBlock(x, y, z) != Blocks.air)
return false;
for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
int sx = MiscTools.getXOnSide(x, side);
int sy = MiscTools.getYOnSide(y, side);
int sz = MiscTools.getZOnSide(z, side);
if (!world.isAirBlock(sx, sy, sz)) {
Block block = WorldPlugin.getBlock(world, sx, sy, sz);
if (block != Blocks.fire)
return true;
}
}
return false;
}
}