package org.halvors.electrometrics.common.block;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.IIcon;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.World;
import org.halvors.electrometrics.Electrometrics;
import org.halvors.electrometrics.client.render.BlockRenderer;
import org.halvors.electrometrics.client.render.DefaultIcon;
import org.halvors.electrometrics.common.Reference;
import org.halvors.electrometrics.common.base.IElectricTier;
import org.halvors.electrometrics.common.base.ITier;
import org.halvors.electrometrics.common.base.MachineType;
import org.halvors.electrometrics.common.base.Tier;
import org.halvors.electrometrics.common.base.tile.ITileOwnable;
import org.halvors.electrometrics.common.base.tile.ITileRedstoneControl;
import org.halvors.electrometrics.common.item.ItemBlockMachine;
import org.halvors.electrometrics.common.tile.TileEntity;
import org.halvors.electrometrics.common.tile.machine.TileEntityElectricMachine;
import org.halvors.electrometrics.common.tile.machine.TileEntityElectricityMeter;
import org.halvors.electrometrics.common.tile.machine.TileEntityElectricityStorage;
import org.halvors.electrometrics.common.util.LanguageUtils;
import org.halvors.electrometrics.common.util.MachineUtils;
import org.halvors.electrometrics.common.util.PlayerUtils;
import java.util.List;
/**
* Block class for handling multiple machine block IDs.
*
* 0: Basic Electricity Meter
* 1: Advanced Electricity Meter
* 2: Elite Electricity Meter
* 3: Ultimate Electricity Meter
*/
public class BlockMachine extends BlockRotatable {
public BlockMachine() {
super("Machine", Material.iron);
setHardness(2F);
setResistance(4F);
setStepSound(soundTypeMetal);
}
@Override
public TileEntity createNewTileEntity(World world, int metadata) {
MachineType machineType = MachineType.getType(this, metadata);
return machineType.getTileEntity();
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister iconRegister) {
super.registerIcons(iconRegister);
IIcon topIcon = iconRegister.registerIcon(Reference.PREFIX + name + "Top");
IIcon inputIcon = iconRegister.registerIcon(Reference.PREFIX + name + "Input");
IIcon outputIcon = iconRegister.registerIcon(Reference.PREFIX + name + "Output");
DefaultIcon defaultTopIcon = DefaultIcon.getActivePair(topIcon, 1);
// Adding all icons for the machine types.
for (MachineType machineType : MachineType.values()) {
BlockRenderer.loadDynamicTextures(iconRegister,
machineType.getUnlocalizedName(),
iconMetadataList[machineType.getMetadata()],
defaultBlockIcon,
defaultTopIcon,
DefaultIcon.getActivePair(outputIcon, 4),
DefaultIcon.getActivePair(inputIcon, 5));
}
}
@SuppressWarnings("unchecked")
@Override
@SideOnly(Side.CLIENT)
public void getSubBlocks(Item item, CreativeTabs creativetabs, List list) {
// Making all MachineTypes available in creative mode.
for (MachineType machineType : MachineType.values()) {
if (machineType.isEnabled()) {
switch (machineType) {
case BASIC_ELECTRICITY_METER:
case ADVANCED_ELECTRICITY_METER:
case ELITE_ELECTRICITY_METER:
case ULTIMATE_ELECTRICITY_METER:
ItemStack itemStack = machineType.getItemStack();
ItemBlockMachine itemBlockMachine = (ItemBlockMachine) itemStack.getItem();
itemBlockMachine.setElectricTier(itemStack, Tier.Electric.getFromMachineType(machineType));
list.add(itemStack);
break;
default:
list.add(machineType.getItemStack());
break;
}
}
}
}
@Override
public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) {
if (!world.isRemote) {
TileEntity tileEntity = TileEntity.getTileEntity(world, x, y, z);
MachineType machineType = MachineType.getType(this, world.getBlockMetadata(x, y, z));
// Display a message the the player clicking this block if not the owner.
if (tileEntity instanceof ITileOwnable) {
ITileOwnable tileOwnable = (ITileOwnable) tileEntity;
if (!tileOwnable.isOwner(player)) {
player.addChatMessage(new ChatComponentText(String.format(LanguageUtils.localize("tooltip.blockOwnedBy"), machineType.getLocalizedName(), tileOwnable.getOwnerName())));
}
}
}
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int facing, float playerX, float playerY, float playerZ) {
TileEntity tileEntity = TileEntity.getTileEntity(world, x, y, z);
if (!MachineUtils.hasUsableWrench(player, x, y, z)) {
if (!player.isSneaking()) {
// Check whether or not this ITileOwnable has a owner, if not set the current player as owner.
if (tileEntity instanceof ITileOwnable) {
ITileOwnable tileOwnable = (ITileOwnable) tileEntity;
if (!tileOwnable.hasOwner()) {
tileOwnable.setOwner(player);
}
}
// Open the GUI.
player.openGui(Electrometrics.getInstance(), 0, world, x, y, z);
return true;
}
} else {
if (!world.isRemote && player.isSneaking()) {
dismantleBlock(world, x, y, z, false);
return true;
}
}
return super.onBlockActivated(world, x, y, z, player, facing, playerX, playerY, playerZ);
}
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack itemStack) {
TileEntity tileEntity = TileEntity.getTileEntity(world, x, y, z);
// If this TileEntity implements ITileRedstoneControl, check if it's getting powered.
if (tileEntity instanceof ITileRedstoneControl) {
ITileRedstoneControl tileRedstoneControl = (ITileRedstoneControl) tileEntity;
tileRedstoneControl.setPowered(world.isBlockIndirectlyGettingPowered(x, y, z));
}
// Check if this entity is a player.
if (entity instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) entity;
// If this TileEntity implements ITileOwnable, we set the owner.
if (tileEntity instanceof ITileOwnable) {
ITileOwnable tileOwnable = (ITileOwnable) tileEntity;
tileOwnable.setOwner(player);
}
}
super.onBlockPlacedBy(world, x, y, z, entity, itemStack);
}
@Override
public void onNeighborBlockChange(World world, int x, int y, int z, Block block) {
if (!world.isRemote) {
TileEntity tileEntity = TileEntity.getTileEntity(world, x, y, z);
if (tileEntity instanceof TileEntityElectricMachine) {
TileEntityElectricMachine tileEntityElectricMachine = (TileEntityElectricMachine) tileEntity;
tileEntityElectricMachine.onNeighborChange();
}
}
}
@Override
public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z, boolean willHarvest) {
if (!player.capabilities.isCreativeMode && !world.isRemote && canHarvestBlock(player, world.getBlockMetadata(x, y, z))) {
dismantleBlock(world, x, y, z, false);
}
return world.setBlockToAir(x, y, z);
}
@Override
public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) {
TileEntity tileEntity = TileEntity.getTileEntity(world, x, y, z);
MachineType machineType = MachineType.getType(this, tileEntity.getBlockMetadata());
ItemStack itemStack = machineType.getItemStack();
ItemBlockMachine itemBlockMachine = (ItemBlockMachine) itemStack.getItem();
if (tileEntity instanceof ITier) {
ITier tiered = (ITier) tileEntity;
itemBlockMachine.setTier(itemStack, tiered.getTier());
}
if (tileEntity instanceof IElectricTier) {
IElectricTier electricTiered = (IElectricTier) tileEntity;
itemBlockMachine.setElectricTier(itemStack, electricTiered.getElectricTier());
}
if (tileEntity instanceof ITileRedstoneControl) {
ITileRedstoneControl tileRedstoneControl = (ITileRedstoneControl) tileEntity;
itemBlockMachine.setRedstoneControlType(itemStack, tileRedstoneControl.getControlType());
}
if (tileEntity instanceof TileEntityElectricityStorage) {
TileEntityElectricityStorage tileEntityElectricityStorage = (TileEntityElectricityStorage) tileEntity;
itemBlockMachine.setElectricityStored(itemStack, tileEntityElectricityStorage.getStorage().getEnergyStored());
}
if (tileEntity instanceof TileEntityElectricityMeter) {
TileEntityElectricityMeter tileEntityElectricityMeter = (TileEntityElectricityMeter) tileEntity;
itemBlockMachine.setElectricityCount(itemStack, tileEntityElectricityMeter.getElectricityCount());
itemBlockMachine.setElectricityStored(itemStack, tileEntityElectricityMeter.getStorage().getEnergyStored());
}
return itemStack;
}
@Override
public float getBlockHardness(World world, int x, int y, int z) {
if (world.isRemote) {
TileEntity tileEntity = TileEntity.getTileEntity(world, x, y, z);
// If this TileEntity implements ITileOwnable, we check if there is a owner.
if (tileEntity instanceof ITileOwnable) {
ITileOwnable tileOwnable = (ITileOwnable) tileEntity;
return tileOwnable.isOwner(PlayerUtils.getClientPlayer()) ? blockHardness : -1;
}
}
return blockHardness;
}
@Override
public float getExplosionResistance(Entity entity, World world, int x, int y, int z, double explosionX, double explosionY, double explosionZ) {
if (world.isRemote) {
TileEntity tileEntity = TileEntity.getTileEntity(world, x, y, z);
if (tileEntity instanceof ITileOwnable) {
ITileOwnable tileOwnable = (ITileOwnable) tileEntity;
return tileOwnable.isOwner(PlayerUtils.getClientPlayer()) ? blockResistance : -1;
}
}
return blockResistance;
}
}