buildcraftAdditions.tileEntities.TileKEBT2.java Source code

Java tutorial

Introduction

Here is the source code for buildcraftAdditions.tileEntities.TileKEBT2.java

Source

package buildcraftAdditions.tileEntities;

import java.util.ArrayList;

import io.netty.buffer.ByteBuf;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

import net.minecraftforge.common.util.ForgeDirection;

import cofh.api.energy.IEnergyReceiver;

import buildcraftAdditions.BuildcraftAdditions;
import buildcraftAdditions.api.configurableOutput.EnumPriority;
import buildcraftAdditions.blocks.multiBlocks.MultiBlockBase;
import buildcraftAdditions.config.ConfigurationHandler;
import buildcraftAdditions.multiBlocks.IMultiBlockTile;
import buildcraftAdditions.reference.ItemsAndBlocks;
import buildcraftAdditions.reference.Variables;
import buildcraftAdditions.tileEntities.Bases.TileKineticEnergyBufferBase;
import buildcraftAdditions.tileEntities.varHelpers.MultiBlockData;
import buildcraftAdditions.utils.Location;

import eureka.api.EurekaAPI;

/**
 * Copyright (c) 2014-2015, AEnterprise
 * http://buildcraftadditions.wordpress.com/
 * Buildcraft Additions is distributed under the terms of GNU GPL v3.0
 * Please check the contents of the license located in
 * http://buildcraftadditions.wordpress.com/wiki/licensing-stuff/
 */
public class TileKEBT2 extends TileKineticEnergyBufferBase implements IMultiBlockTile {
    private final MultiBlockData data = new MultiBlockData().setPatern(Variables.Paterns.KEBT2);
    public int energyState;
    public TileKEBT2 master;

    public TileKEBT2() {
        super(ConfigurationHandler.capacityKEBTier2, ConfigurationHandler.maxTransferKEBTier2,
                ConfigurationHandler.KEB2powerloss, 2);
    }

    @Override
    public void updateEntity() {
        super.updateEntity();
        if (data.moved) {
            data.afterMoveCheck(worldObj);
            worldObj.scheduleBlockUpdate(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord), 80);
        }
        if (!data.isMaster || worldObj.isRemote) {
            return;
        }
        super.updateEntity();
        energyState = (energy * 5) / capacity;
    }

    @Override
    public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate) {
        if (!data.partOfMultiBlock)
            return 0;
        if (data.isMaster)
            return super.receiveEnergy(from, maxReceive, simulate);
        if (master == null)
            findMaster();
        if (master == null)
            return 0;
        return master.receiveEnergy(from, maxReceive, simulate);
    }

    @Override
    public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate) {
        if (!data.partOfMultiBlock)
            return 0;
        if (data.isMaster)
            return super.extractEnergy(from, maxExtract, simulate);
        if (master == null)
            findMaster();
        if (master == null)
            return 0;
        return master.receiveEnergy(from, maxExtract, simulate);
    }

    @Override
    public int getEnergyStored(ForgeDirection from) {
        if (!data.partOfMultiBlock)
            return 0;
        if (data.isMaster)
            return super.getEnergyStored(from);
        if (master == null)
            findMaster();
        if (master == null)
            return 0;
        return master.getEnergyStored(from);
    }

    @Override
    public int getMaxEnergyStored(ForgeDirection from) {
        if (!data.partOfMultiBlock)
            return 0;
        if (data.isMaster)
            return super.getMaxEnergyStored(from);
        if (master == null)
            findMaster();
        if (master == null)
            return 0;
        return master.getMaxEnergyStored(from);
    }

    @Override
    public void readFromNBT(NBTTagCompound tag) {
        super.readFromNBT(tag);
        data.readFromNBT(tag);
    }

    @Override
    public void writeToNBT(NBTTagCompound tag) {
        super.writeToNBT(tag);
        data.writeToNBT(tag);
    }

    @Override
    public boolean canConnectEnergy(ForgeDirection from) {
        if (!data.partOfMultiBlock)
            return false;
        if (data.isMaster)
            return super.canConnectEnergy(from);
        if (master == null)
            findMaster();
        return master != null && master.canConnectEnergy(from);
    }

    @Override
    public void outputEnergy() {
        if (energy == 0)
            return;
        ArrayList<Location> list = data.patern.getLocations(worldObj, xCoord, yCoord, zCoord, data.rotationIndex);
        for (Location from : list) {
            for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
                for (EnumPriority priority : EnumPriority.values()) {
                    if (configuration.getPriority(direction) != priority)
                        continue;
                    if (!configuration.canSend(direction))
                        continue;
                    Location location = from.copy();
                    location.move(direction);
                    if (location.getTileEntity() == null || !(location.getTileEntity() instanceof IEnergyReceiver))
                        continue;
                    IEnergyReceiver target = (IEnergyReceiver) location.getTileEntity();
                    if (target instanceof IMultiBlockTile && isPartOfSameMultiblock((IMultiBlockTile) target))
                        continue;
                    int output = maxTransfer;
                    if (location.getTileEntity() instanceof TileKEBT2) {
                        TileKEBT2 keb = (TileKEBT2) location.getTileEntity();
                        TileKEBT2 keb2;
                        if (keb.isMaster()) {
                            keb2 = keb;
                        } else {
                            keb.findMaster();
                            if (keb.master == null)
                                continue;
                            keb2 = keb.master;
                        }
                        if (keb2.configuration.canSend(direction.getOpposite())
                                && keb2.configuration.canReceive(direction.getOpposite())) {
                            if (blocked[direction.ordinal()]) {
                                blocked[direction.ordinal()] = false;
                            } else {
                                output = ((energy + keb2.energy) / 2) - keb2.energy;
                            }
                        }
                    }
                    if (output < 0)
                        output = 0;
                    if (output > energy)
                        output = energy;
                    energy -= target.receiveEnergy(direction.getOpposite(), output, false);
                }
            }
        }
    }

    private boolean isPartOfSameMultiblock(IMultiBlockTile tile) {
        return tile.getMasterX() == xCoord && tile.getMasterY() == yCoord && tile.getMasterZ() == zCoord;
    }

    @Override
    public boolean onBlockActivated(EntityPlayer player) {
        if (!data.partOfMultiBlock)
            return false;
        if (!worldObj.isRemote)
            sync();
        if (data.isMaster)
            player.openGui(BuildcraftAdditions.instance, Variables.Gui.KEB.ordinal(), worldObj, xCoord, yCoord,
                    zCoord);
        else if (master == null)
            findMaster();
        if (master != null)
            master.onBlockActivated(player);
        return true;
    }

    public void destroyMultiblock() {
        data.patern.destroyMultiblock(worldObj, xCoord, yCoord, zCoord, data.rotationIndex);
    }

    private void findMaster() {
        if (data.isMaster)
            master = (TileKEBT2) worldObj.getTileEntity(xCoord, yCoord, zCoord);
        TileEntity tileEntity = worldObj.getTileEntity(data.masterX, data.masterY, data.masterZ);
        if (tileEntity != null && tileEntity instanceof TileKEBT2 && ((TileKEBT2) tileEntity).isMaster())
            master = (TileKEBT2) tileEntity;
        else {
            MultiBlockBase block = (MultiBlockBase) worldObj.getBlock(xCoord, yCoord, zCoord);
            block.patern.destroyMultiblock(worldObj, data.masterX, data.masterY, data.masterZ, data.rotationIndex);
        }
    }

    @Override
    public void makeMaster(int rotationIndex) {
        data.isMaster = true;
        data.partOfMultiBlock = true;
        EurekaAPI.API.makeProgress(Variables.Eureka.KEBT3, destroyer);
        data.rotationIndex = rotationIndex;
    }

    @Override
    public void writeToByteBuff(ByteBuf buf) {
        super.writeToByteBuff(buf);
        buf.writeInt(energyState);
        data.writeToByteBuff(buf);
    }

    @Override
    public void readFromByteBuff(ByteBuf buf) {
        super.readFromByteBuff(buf);
        energyState = buf.readInt();
        data.readFromByteBuff(buf);
    }

    @Override
    public void formMultiblock(int masterX, int masterY, int masterZ, int rotationIndex) {
        data.formMultiBlock(masterX, masterY, masterZ, rotationIndex);
    }

    @Override
    public void invalidateMultiblock() {
        if (data.isMaster) {
            data.patern.destroyMultiblock(worldObj, xCoord, yCoord, zCoord, data.rotationIndex);
            EurekaAPI.API.revertProgress(Variables.Eureka.KEBT3, destroyer);
        } else
            data.patern.destroyMultiblock(worldObj, data.masterX, data.masterY, data.masterZ, data.rotationIndex);

    }

    @Override
    public void invalidateBlock() {
        data.invalidate();
        energy = 0;
        configuration.invalidate();
        energyState = 0;
        worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 2);
        worldObj.scheduleBlockUpdate(xCoord, yCoord, zCoord, ItemsAndBlocks.kebT2, 80);
        sync();
    }

    @Override
    public void moved(ForgeDirection direction) {
        worldObj.scheduleBlockUpdate(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord), 80);
        data.onMove(direction);
        master = null;
    }

    @Override
    public int getMasterX() {
        return data.masterX;
    }

    @Override
    public void setMasterX(int masterX) {
        data.masterX = masterX;
    }

    @Override
    public int getMasterY() {
        return data.masterY;
    }

    @Override
    public void setMasterY(int masterY) {
        data.masterY = masterY;
    }

    @Override
    public int getMasterZ() {
        return data.masterZ;
    }

    @Override
    public void setMasterZ(int masterZ) {
        data.masterZ = masterZ;
    }

    @Override
    public int getRotationIndex() {
        return data.rotationIndex;
    }

    @Override
    public void setRotationIndex(int rotationIndex) {
        data.rotationIndex = rotationIndex;
    }

    @Override
    public boolean isMaster() {
        return data.isMaster;
    }

    @Override
    public boolean isPartOfMultiblock() {
        return data.partOfMultiBlock;
    }

    @Override
    @SideOnly(Side.CLIENT)
    public AxisAlignedBB getRenderBoundingBox() {
        return AxisAlignedBB.getBoundingBox(xCoord - 2, yCoord - 1, zCoord - 2, xCoord + 2, yCoord + 2, zCoord + 2);
    }

    @Override
    public void setIsMaster(boolean isMaster) {
        data.isMaster = isMaster;
    }

    @Override
    public void setPartOfMultiBlock(boolean partOfMultiBlock) {
        data.partOfMultiBlock = partOfMultiBlock;
    }

    public void destruction() {
        if (data.isMaster)
            byeBye();
        if (master == null)
            findMaster();
        if (master != null)
            master.byeBye();
    }
}