2014-09-27 16:33:33 +02:00
|
|
|
package resonantinduction.electrical.battery
|
|
|
|
|
|
|
|
import java.util.ArrayList
|
|
|
|
|
|
|
|
import io.netty.buffer.ByteBuf
|
|
|
|
import net.minecraft.block.material.Material
|
|
|
|
import net.minecraft.entity.EntityLivingBase
|
|
|
|
import net.minecraft.entity.player.EntityPlayer
|
|
|
|
import net.minecraft.item.ItemStack
|
|
|
|
import net.minecraftforge.common.util.ForgeDirection
|
2014-10-25 18:32:05 +02:00
|
|
|
import resonant.content.prefab.java.TileAdvanced
|
|
|
|
import resonant.lib.content.prefab.TElectric
|
2014-09-27 16:33:33 +02:00
|
|
|
import resonant.lib.network.discriminator.{PacketTile, PacketType}
|
|
|
|
import resonant.lib.network.handle.IPacketReceiver
|
|
|
|
import resonant.lib.network.netty.AbstractPacket
|
2014-10-25 18:32:05 +02:00
|
|
|
import universalelectricity.core.transform.vector.Vector3
|
2014-09-27 16:33:33 +02:00
|
|
|
|
|
|
|
/** A modular battery box that allows shared connections with boxes next to it.
|
|
|
|
*
|
2014-10-12 11:04:54 +02:00
|
|
|
* @author Calclavia
|
|
|
|
*/
|
|
|
|
object TileBattery
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* @param tier - 0, 1, 2
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
def getEnergyForTier(tier: Int): Long =
|
|
|
|
{
|
2014-09-27 16:33:33 +02:00
|
|
|
return Math.round(Math.pow(500000000, (tier / (MAX_TIER + 0.7f)) + 1) / (500000000)) * (500000000)
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Tiers: 0, 1, 2 */
|
|
|
|
final val MAX_TIER: Int = 2
|
|
|
|
/** The transfer rate **/
|
|
|
|
final val DEFAULT_WATTAGE: Long = getEnergyForTier(0)
|
|
|
|
}
|
|
|
|
|
2014-10-25 18:32:05 +02:00
|
|
|
class TileBattery extends TileAdvanced(Material.iron) with TElectric with IPacketReceiver
|
2014-10-12 11:04:54 +02:00
|
|
|
{
|
2014-09-27 16:33:33 +02:00
|
|
|
private var markClientUpdate: Boolean = false
|
|
|
|
private var markDistributionUpdate: Boolean = false
|
|
|
|
var renderEnergyAmount: Double = 0
|
|
|
|
private var network: GridBattery = null
|
|
|
|
|
|
|
|
//Constructor
|
2014-10-25 18:32:05 +02:00
|
|
|
textureName = "material_metal_side"
|
2014-10-12 11:04:54 +02:00
|
|
|
ioMap = 0.toShort
|
|
|
|
saveIOMap = true
|
2014-10-25 18:32:05 +02:00
|
|
|
normalRender = false
|
|
|
|
isOpaqueCube = false
|
|
|
|
itemBlock = classOf[ItemBlockBattery]
|
2014-10-12 11:13:48 +02:00
|
|
|
|
|
|
|
override def update()
|
|
|
|
{
|
|
|
|
super.update()
|
|
|
|
|
|
|
|
if (!world.isRemote)
|
|
|
|
{
|
2014-10-25 18:32:05 +02:00
|
|
|
if (doCharge)
|
|
|
|
{
|
|
|
|
dcNode.negativeTerminals.addAll(getInputDirections())
|
|
|
|
//TODO: Test, remove this
|
|
|
|
dcNode.buffer(100)
|
|
|
|
dcNode.update(1/20f)
|
|
|
|
doCharge = false
|
|
|
|
}
|
2014-10-12 11:13:48 +02:00
|
|
|
|
2014-09-27 16:33:33 +02:00
|
|
|
if (markDistributionUpdate && ticks % 5 == 0)
|
|
|
|
{
|
|
|
|
markDistributionUpdate = false
|
|
|
|
}
|
|
|
|
if (markClientUpdate && ticks % 5 == 0)
|
|
|
|
{
|
|
|
|
markClientUpdate = false
|
|
|
|
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-10-25 18:32:05 +02:00
|
|
|
var doCharge = false
|
|
|
|
|
|
|
|
override def activate(player: EntityPlayer, side: Int, hit: Vector3): Boolean =
|
|
|
|
{
|
|
|
|
super.activate(player, side, hit)
|
|
|
|
|
|
|
|
if (!world.isRemote)
|
|
|
|
{
|
|
|
|
if (player.isSneaking)
|
|
|
|
doCharge = !doCharge
|
|
|
|
println(dcNode)
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2014-09-27 16:33:33 +02:00
|
|
|
override def getDescPacket: AbstractPacket =
|
|
|
|
{
|
2014-09-27 16:44:53 +02:00
|
|
|
return new PacketTile(this, Array[Any](renderEnergyAmount, ioMap))
|
2014-09-27 16:33:33 +02:00
|
|
|
}
|
|
|
|
|
2014-10-12 11:04:54 +02:00
|
|
|
def read(data: ByteBuf, player: EntityPlayer, `type`: PacketType)
|
|
|
|
{
|
2014-09-27 16:33:33 +02:00
|
|
|
this.energy.setEnergy(data.readLong)
|
|
|
|
this.ioMap_$eq(data.readShort)
|
|
|
|
}
|
|
|
|
|
2014-10-12 11:04:54 +02:00
|
|
|
override def setIO(dir: ForgeDirection, `type`: Int)
|
|
|
|
{
|
2014-09-27 16:33:33 +02:00
|
|
|
super.setIO(dir, `type`)
|
|
|
|
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord)
|
|
|
|
}
|
|
|
|
|
2014-10-12 11:04:54 +02:00
|
|
|
override def onPlaced(entityliving: EntityLivingBase, itemStack: ItemStack)
|
|
|
|
{
|
|
|
|
if (!world.isRemote && itemStack.getItem.isInstanceOf[ItemBlockBattery])
|
|
|
|
{
|
2014-09-27 16:33:33 +02:00
|
|
|
energy.setCapacity(TileBattery.getEnergyForTier(ItemBlockBattery.getTier(itemStack)))
|
|
|
|
energy.setEnergy((itemStack.getItem.asInstanceOf[ItemBlockBattery]).getEnergy(itemStack))
|
2014-10-20 19:45:50 +02:00
|
|
|
world.setBlockMetadataWithNotify(xi, yi, zi, ItemBlockBattery.getTier(itemStack), 3)
|
2014-09-27 16:33:33 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override def getDrops(metadata: Int, fortune: Int): ArrayList[ItemStack] =
|
|
|
|
{
|
|
|
|
val ret: ArrayList[ItemStack] = new ArrayList[ItemStack]
|
|
|
|
val itemStack: ItemStack = new ItemStack(getBlockType, 1)
|
|
|
|
val itemBlock: ItemBlockBattery = itemStack.getItem.asInstanceOf[ItemBlockBattery]
|
2014-10-20 19:45:50 +02:00
|
|
|
ItemBlockBattery.setTier(itemStack, world.getBlockMetadata(xi, yi, zi).asInstanceOf[Byte])
|
2014-09-27 16:33:33 +02:00
|
|
|
itemBlock.setEnergy(itemStack, energy.getEnergy)
|
|
|
|
ret.add(itemStack)
|
|
|
|
return ret
|
|
|
|
}
|
|
|
|
|
2014-10-12 11:04:54 +02:00
|
|
|
override def toString: String =
|
|
|
|
{
|
2014-09-27 16:33:33 +02:00
|
|
|
return "[TileBattery]" + x + "x " + y + "y " + z + "z "
|
|
|
|
}
|
|
|
|
}
|