electrodynamics/src/main/scala/edx/electrical/circuit/transformer/PartElectricTransformer.scala
2015-01-27 17:05:20 +08:00

124 lines
3.4 KiB
Scala

package edx.electrical.circuit.transformer
import codechicken.lib.data.{MCDataInput, MCDataOutput}
import codechicken.lib.vec.Vector3
import cpw.mods.fml.relauncher.{Side, SideOnly}
import edx.core.prefab.part.PartFace
import edx.electrical.ElectricalContent
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.util.{ChatComponentText, MovingObjectPosition}
import net.minecraftforge.common.util.ForgeDirection
import resonantengine.api.graph.INodeProvider
import resonantengine.api.graph.node.INode
import resonantengine.lib.utility.WrenchUtility
/**
* TODO: We can't use face parts, need to use thicker ones. Also, transformer is currently NO-OP
*
* @author Calclavia
*
*/
class PartElectricTransformer extends PartFace with INodeProvider
{
/** Step the voltage up */
var stepUp = true
/** Amount to mulitply the step by (up x2. down /2) */
var multiplier: Byte = 2
var inputNode: ElectricTransformerNode = null
var outputNode: ElectricTransformerNode = null
override def preparePlacement(side: Int, facing: Int)
{
super.preparePlacement(side, facing)
outputNode = new ElectricTransformerNode(this, getAbsoluteFacing.getOpposite, false)
inputNode = new ElectricTransformerNode(this, getAbsoluteFacing, true)
outputNode.otherNode = inputNode
inputNode.otherNode = outputNode
}
override def read(packet: MCDataInput, id: Int)
{
super.read(packet, id)
multiplier = packet.readByte
}
override def write(packet: MCDataOutput, id: Int)
{
super.write(packet, id)
packet.writeByte(multiplier)
}
override def doesTick: Boolean = false
@SideOnly(Side.CLIENT)
override def renderDynamic(pos: Vector3, frame: Float, pass: Int)
{
if (pass == 0)
RenderTransformer.render(this, pos.x, pos.y, pos.z)
}
override def load(nbt: NBTTagCompound)
{
super.load(nbt)
stepUp = nbt.getBoolean("stepUp")
multiplier = nbt.getByte("multiplier")
}
override def save(nbt: NBTTagCompound)
{
super.save(nbt)
nbt.setBoolean("stepUp", stepUp)
nbt.setByte("multiplier", multiplier)
}
override def activate(player: EntityPlayer, hit: MovingObjectPosition, item: ItemStack): Boolean =
{
if (WrenchUtility.isUsableWrench(player, player.inventory.getCurrentItem, x, y, z))
{
if (!this.world.isRemote)
{
if (player.isSneaking)
{
multiplier = ((multiplier + 1) % 3).asInstanceOf[Byte]
}
else
{
facing = ((facing + 1) % 4).asInstanceOf[Byte]
}
WrenchUtility.damageWrench(player, player.inventory.getCurrentItem, x, y, z)
sendDescUpdate
tile.notifyPartChange(this)
if (stepUp)
outputNode.step = multiplier
else
outputNode.step = 1 / multiplier
}
return true
}
stepUp = !stepUp
if (!world.isRemote) player.addChatMessage(new ChatComponentText("Transformer set to step " + (if (stepUp) "up" else "down") + "."))
return true
}
override def getNode[N <: INode](nodeType: Class[_ <: N], from: ForgeDirection): N =
{
if (from == getAbsoluteFacing)
{
}
else if (from == getAbsoluteFacing.getOpposite)
{
}
return null.asInstanceOf[N]
}
protected def getItem: ItemStack =
{
return new ItemStack(ElectricalContent.itemTransformer)
}
}