115 lines
4.1 KiB
Java
115 lines
4.1 KiB
Java
package resonantinduction.mechanical.energy.turbine;
|
|
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.world.biome.BiomeGenBase;
|
|
import net.minecraft.world.biome.BiomeGenOcean;
|
|
import net.minecraft.world.biome.BiomeGenPlains;
|
|
import net.minecraftforge.common.ForgeDirection;
|
|
import resonant.lib.utility.inventory.InventoryUtility;
|
|
import resonantinduction.core.Settings;
|
|
import universalelectricity.api.vector.Vector3;
|
|
|
|
/** The vertical wind turbine collects airflow. The horizontal wind turbine collects steam from steam
|
|
* power plants.
|
|
*
|
|
* @author Calclavia */
|
|
public class TileWindTurbine extends TileTurbine
|
|
{
|
|
private final byte[] openBlockCache = new byte[224];
|
|
private int checkCount = 0;
|
|
private float efficiency = 0;
|
|
private long windPower = 0;
|
|
|
|
|
|
@Override
|
|
public void updateEntity()
|
|
{
|
|
/** Break under storm. */
|
|
if (tier == 0 && getDirection().offsetY == 0 && worldObj.isRaining() && worldObj.isThundering() && worldObj.rand.nextFloat() < 0.00000008)
|
|
{
|
|
InventoryUtility.dropItemStack(worldObj, new Vector3(this), new ItemStack(Block.cloth, 1 + worldObj.rand.nextInt(2)));
|
|
InventoryUtility.dropItemStack(worldObj, new Vector3(this), new ItemStack(Item.stick, 3 + worldObj.rand.nextInt(8)));
|
|
worldObj.setBlockToAir(xCoord, yCoord, zCoord);
|
|
return;
|
|
}
|
|
|
|
/** Only the primary turbine ticks. */
|
|
if (!getMultiBlock().isPrimary())
|
|
return;
|
|
|
|
/** If this is a vertical turbine. */
|
|
if (getDirection().offsetY == 0)
|
|
{
|
|
maxPower = 3000;
|
|
|
|
if (ticks % 20 == 0 && !worldObj.isRemote)
|
|
computePower();
|
|
|
|
getMultiBlock().get().power += windPower;
|
|
}
|
|
else
|
|
{
|
|
maxPower = 10000;
|
|
}
|
|
|
|
if (getMultiBlock().isConstructed())
|
|
mechanicalNode.torque = (long) (defaultTorque / (9d / multiBlockRadius));
|
|
else
|
|
mechanicalNode.torque = defaultTorque / 12;
|
|
|
|
super.updateEntity();
|
|
}
|
|
|
|
private void computePower()
|
|
{
|
|
int checkSize = 10;
|
|
int height = yCoord + checkCount / 28;
|
|
int deviation = checkCount % 7;
|
|
ForgeDirection checkDir;
|
|
|
|
Vector3 check = new Vector3(this);
|
|
|
|
switch (checkCount / 7 % 4)
|
|
{
|
|
case 0:
|
|
checkDir = ForgeDirection.NORTH;
|
|
check = new Vector3(xCoord - 3 + deviation, height, zCoord - 4);
|
|
break;
|
|
case 1:
|
|
checkDir = ForgeDirection.WEST;
|
|
check = new Vector3(xCoord - 4, height, zCoord - 3 + deviation);
|
|
break;
|
|
case 2:
|
|
checkDir = ForgeDirection.SOUTH;
|
|
check = new Vector3(xCoord - 3 + deviation, height, zCoord + 4);
|
|
break;
|
|
default:
|
|
checkDir = ForgeDirection.EAST;
|
|
check = new Vector3(xCoord + 4, height, zCoord - 3 + deviation);
|
|
}
|
|
|
|
byte openAirBlocks = 0;
|
|
|
|
while (openAirBlocks < checkSize && worldObj.isAirBlock(check.intX(), check.intY(), check.intZ()))
|
|
{
|
|
check.translate(checkDir);
|
|
openAirBlocks++;
|
|
}
|
|
|
|
efficiency = efficiency - openBlockCache[checkCount] + openAirBlocks;
|
|
openBlockCache[checkCount] = openAirBlocks;
|
|
checkCount = (checkCount + 1) % (openBlockCache.length - 1);
|
|
|
|
float multiblockMultiplier = (multiBlockRadius + 0.5f) * 2;
|
|
float materialMultiplier = tier == 0 ? 1.1f : tier == 1 ? 0.9f : 1;
|
|
|
|
BiomeGenBase biome = worldObj.getBiomeGenForCoords(xCoord, zCoord);
|
|
boolean hasBonus = biome instanceof BiomeGenOcean || biome instanceof BiomeGenPlains || biome == BiomeGenBase.river;
|
|
|
|
float windSpeed = (worldObj.rand.nextFloat() / 8) + (yCoord / 256f) * (hasBonus ? 1.2f : 1) + worldObj.getRainStrength(1.5f);
|
|
windPower = (long) Math.min(materialMultiplier * multiblockMultiplier * windSpeed * efficiency * Settings.WIND_POWER_RATIO, maxPower * Settings.WIND_POWER_RATIO);
|
|
}
|
|
}
|