package zmaster587.advancedRocketry.tile.multiblock.energy;
import io.netty.buffer.ByteBuf;
import java.util.LinkedList;
import java.util.List;
import cpw.mods.fml.relauncher.Side;
import net.minecraft.block.Block;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import zmaster587.advancedRocketry.api.AdvancedRocketryBlocks;
import zmaster587.advancedRocketry.api.Configuration;
import zmaster587.advancedRocketry.api.satellite.SatelliteBase;
import zmaster587.advancedRocketry.dimension.DimensionManager;
import zmaster587.advancedRocketry.dimension.DimensionProperties;
import zmaster587.advancedRocketry.item.ItemSatelliteIdentificationChip;
import zmaster587.libVulpes.api.IUniversalEnergyTransmitter;
import zmaster587.libVulpes.block.BlockMeta;
import zmaster587.libVulpes.inventory.modules.ModuleBase;
import zmaster587.libVulpes.inventory.modules.ModuleText;
import zmaster587.libVulpes.network.PacketHandler;
import zmaster587.libVulpes.network.PacketMachine;
import zmaster587.libVulpes.tile.multiblock.TileMultiBlock;
import zmaster587.libVulpes.tile.multiblock.TileMultiPowerProducer;
import zmaster587.libVulpes.util.Vector3F;
public class TileMicrowaveReciever extends TileMultiPowerProducer {
static final BlockMeta iron_block = new BlockMeta(AdvancedRocketryBlocks.blockSolarPanel);
static final Object[][][] structure = new Object[][][] {
{
{iron_block, '*', '*', '*', iron_block},
{'*', iron_block, iron_block, iron_block, '*'},
{'*', iron_block, 'c', iron_block,'*'},
{'*', iron_block, iron_block, iron_block, '*'},
{iron_block, '*', '*', '*', iron_block},
}};
List<Long> connectedSatellites;
boolean initialCheck;
int powerMadeLastTick, prevPowerMadeLastTick;
ModuleText textModule;
public TileMicrowaveReciever() {
connectedSatellites = new LinkedList<Long>();
initialCheck = false;
textModule = new ModuleText(40, 20, "Generating 0 RF/t", 0x2b2b2b);
}
@Override
public List<ModuleBase> getModules(int ID, EntityPlayer player) {
List<ModuleBase> modules = super.getModules(ID, player);
modules.add(textModule);
return modules;
}
@Override
public AxisAlignedBB getRenderBoundingBox() {
return super.getRenderBoundingBox().expand(0, 2000, 0).offset(0, 1000, 0);
}
@Override
public boolean shouldHideBlock(World world, int x, int y, int z, Block tile) {
return false;
}
@Override
public Object[][][] getStructure() {
return structure;
}
@Override
public List<BlockMeta> getAllowableWildCardBlocks() {
List<BlockMeta> blocks = super.getAllowableWildCardBlocks();
blocks.addAll(TileMultiBlock.getMapping('I'));
blocks.add(iron_block);
blocks.addAll(TileMultiBlock.getMapping('p'));
return blocks;
}
@Override
public boolean canUpdate() {
return true;
}
@Override
public String getMachineName() {
return "tile.microwaveReciever.name";
}
public int getPowerMadeLastTick() {
return powerMadeLastTick;
}
@Override
public void onInventoryUpdated() {
super.onInventoryUpdated();
List list = new LinkedList<Long>();
for(IInventory inv : itemInPorts) {
for(int i = 0; i < inv.getSizeInventory(); i++) {
ItemStack stack = inv.getStackInSlot(i);
if(stack != null && stack.getItem() instanceof ItemSatelliteIdentificationChip) {
ItemSatelliteIdentificationChip item = (ItemSatelliteIdentificationChip)stack.getItem();
list.add(item.getSatelliteId(stack));
}
}
}
connectedSatellites = list;
}
@Override
public void updateEntity() {
super.updateEntity();
if(!initialCheck && !worldObj.isRemote) {
completeStructure = attemptCompleteStructure();
onInventoryUpdated();
initialCheck = true;
}
if(!isComplete())
return;
//Periodically check for obstructing blocks above the panel
if(!worldObj.isRemote && getPowerMadeLastTick() > 0 && worldObj.getTotalWorldTime() % 100 == 0) {
Vector3F<Integer> offset = getControllerOffset(getStructure());
List<Entity> entityList = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(xCoord - offset.x, yCoord, zCoord - offset.z, xCoord - offset.x + getStructure()[0][0].length, 256, zCoord - offset.z + getStructure()[0].length));
for(Entity e : entityList) {
e.setFire(5);
}
for(int x=0 ; x < getStructure()[0][0].length; x++) {
for(int z=0 ; z < getStructure()[0].length; z++) {
int y = worldObj.getHeightValue(xCoord + x - offset.x, zCoord + z - offset.z);
Block block = worldObj.getBlock(xCoord + x - offset.x, y-1, zCoord + z - offset.z);
if(y > this.yCoord + 1) {
if(!block.isAir(worldObj, xCoord + x - offset.x, y, zCoord + z - offset.z)) {
worldObj.setBlockToAir(xCoord + x - offset.x, y - 1, zCoord + z - offset.z);
worldObj.playSoundEffect(xCoord + x - offset.x, y - 1, zCoord + z - offset.z, "fire.fire", 1, 3);
}
}
}
}
}
DimensionProperties properties;
if(!worldObj.isRemote && (DimensionManager.getInstance().isDimensionCreated(worldObj.provider.dimensionId) || worldObj.provider.dimensionId == 0)) {
properties = DimensionManager.getInstance().getDimensionProperties(worldObj.provider.dimensionId);
int energyRecieved = 0;
if(enabled) {
for(long lng : connectedSatellites) {
SatelliteBase satellite = properties.getSatellite(lng);
if(satellite instanceof IUniversalEnergyTransmitter) {
energyRecieved += ((IUniversalEnergyTransmitter)satellite).transmitEnergy(ForgeDirection.UNKNOWN, false);
}
}
}
powerMadeLastTick = (int) (energyRecieved*Configuration.microwaveRecieverMulitplier);
if(powerMadeLastTick != prevPowerMadeLastTick) {
prevPowerMadeLastTick = powerMadeLastTick;
PacketHandler.sendToNearby(new PacketMachine(this, (byte)1), worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 128);
}
producePower(powerMadeLastTick);
}
if(worldObj.isRemote)
textModule.setText("Generating " + powerMadeLastTick + " RF/t");
}
@Override
public Packet getDescriptionPacket() {
NBTTagCompound nbt = new NBTTagCompound();
nbt.setBoolean("canRender", canRender);
nbt.setInteger("amtPwr", powerMadeLastTick);
writeNetworkData(nbt);
return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0, nbt);
}
@Override
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
NBTTagCompound nbt = pkt.func_148857_g();
canRender = nbt.getBoolean("canRender");
powerMadeLastTick = nbt.getInteger("amtPwr");
readNetworkData(nbt);
}
@Override
public void writeDataToNetwork(ByteBuf out, byte id) {
super.writeDataToNetwork(out, id);
if(id == 1) {
out.writeInt(powerMadeLastTick);
}
}
@Override
public void readDataFromNetwork(ByteBuf in, byte packetId,
NBTTagCompound nbt) {
super.readDataFromNetwork(in, packetId, nbt);
if(packetId == 1) {
nbt.setInteger("amtPwr", in.readInt());
}
}
@Override
public void useNetworkData(EntityPlayer player, Side side, byte id,
NBTTagCompound nbt) {
super.useNetworkData(player, side, id, nbt);
if(id == 1) {
powerMadeLastTick = nbt.getInteger("amtPwr");
}
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
int[] intArray = new int[connectedSatellites.size()*2];
for( int i =0; i < connectedSatellites.size()*2; i += 2 ) {
connectedSatellites.get(i/2);
intArray[i] = (int) (connectedSatellites.get(i/2) & 0xFFFFFFFF);
intArray[i+1] = (int) ((connectedSatellites.get(i/2) >>> 32) & 0xFFFFFFFF);
}
nbt.setIntArray("satilliteList", intArray);
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
int intArray[] = nbt.getIntArray("satilliteList");
connectedSatellites.clear();
for( int i =0; i < intArray.length/2; i+=2 ) {
connectedSatellites.add(intArray[i] | (((long)intArray[i+1]) << 32));
}
}
}