/*
* This file is part of Matter Overdrive
* Copyright (c) 2015., Simeon Radivoev, All rights reserved.
*
* Matter Overdrive is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Matter Overdrive is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Matter Overdrive. If not, see <http://www.gnu.org/licenses>.
*/
package matteroverdrive.tile;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import matteroverdrive.api.inventory.UpgradeTypes;
import matteroverdrive.api.machines.IUpgradeHandler;
import matteroverdrive.data.BlockPos;
import matteroverdrive.entity.player.AndroidPlayer;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.MathHelper;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Simeon on 7/8/2015.
*/
public class TileEntityMachineChargingStation extends MOTileEntityMachineEnergy implements IMultiBlockTileEntity {
public static final int ENERGY_CAPACITY = 512000;
public static final int ENERGY_TRANSFER = 512;
public static int BASE_MAX_RANGE = 8;
private static UpgradeHandler upgradeHandler = new UpgradeHandler();
public TileEntityMachineChargingStation()
{
super(2);
energyStorage.setCapacity(ENERGY_CAPACITY);
energyStorage.setMaxExtract(ENERGY_TRANSFER);
energyStorage.setMaxReceive(ENERGY_TRANSFER);
playerSlotsHotbar = true;
playerSlotsMain = true;
}
@Override
public void updateEntity()
{
super.updateEntity();
manageAndroidCharging();
}
private void manageAndroidCharging()
{
if (!worldObj.isRemote && getEnergyStored(ForgeDirection.UNKNOWN) > 0) {
int range = getRage();
AxisAlignedBB radius = AxisAlignedBB.getBoundingBox(xCoord - range, yCoord - range, zCoord - range, xCoord + range, yCoord + range, zCoord + range);
List<EntityPlayer> players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, radius);
for (EntityPlayer player : players) {
if (AndroidPlayer.get(player).isAndroid()) {
int required = getRequiredEnergy(player,range);
int max = Math.min(getEnergyStored(ForgeDirection.UNKNOWN),getMaxCharging());
int toExtract = Math.min(required, max);
extractEnergy(ForgeDirection.UNKNOWN, AndroidPlayer.get(player).receiveEnergy(toExtract, false), false);
}
}
}
}
public int getRage()
{
return (int)(BASE_MAX_RANGE * getUpgradeMultiply(UpgradeTypes.Range));
}
public int getMaxCharging()
{
return (int)(ENERGY_TRANSFER / getUpgradeMultiply(UpgradeTypes.PowerUsage));
}
private int getRequiredEnergy(EntityPlayer player,int maxRange)
{
return (int)(ENERGY_TRANSFER * (1.0D - MathHelper.clamp_double((Vec3.createVectorHelper(player.posX,player.posY,player.posZ).subtract(Vec3.createVectorHelper(xCoord,yCoord,zCoord)).lengthVector() / (double)maxRange),0,1)));
}
@Override
public String getSound() {
return null;
}
@Override
public boolean hasSound() {
return false;
}
@Override
public boolean getServerActive() {
return false;
}
@Override
public float soundVolume() {
return 0;
}
@Override
protected void onActiveChange() {
}
@Override
public void onAdded(World world, int x, int y, int z) {
}
@Override
public void onPlaced(World world, EntityLivingBase entityLiving) {
}
@Override
public void onDestroyed() {
}
@Override
public boolean isAffectedByUpgrade(UpgradeTypes type)
{
return type.equals(UpgradeTypes.Range) || type.equals(UpgradeTypes.PowerStorage) || type.equals(UpgradeTypes.PowerUsage);
}
@Override
protected void onAwake(Side side) {
}
@SideOnly(Side.CLIENT)
public double getMaxRenderDistanceSquared()
{
return 8192.0D;
}
@Override
public List<BlockPos> getBoundingBlocks() {
List<BlockPos> coords = new ArrayList<>();
coords.add(new BlockPos(xCoord, yCoord + 1, zCoord));
coords.add(new BlockPos(xCoord, yCoord + 2, zCoord));
return coords;
}
public IUpgradeHandler getUpgradeHandler(){return upgradeHandler;}
public static class UpgradeHandler implements IUpgradeHandler
{
@Override
public double affectUpgrade(UpgradeTypes type, double multiply)
{
if (type.equals(UpgradeTypes.Range))
{
return Math.min(8,multiply);
}
return multiply;
}
}
}