electrodynamics/src/main/scala/edx/core/prefab/part/connector/PartFramedNode.scala
2015-01-26 19:40:54 +08:00

87 lines
2.6 KiB
Scala

package edx.core.prefab.part.connector
import java.lang.{Iterable => JIterable}
import java.util.Set
import codechicken.lib.data.{MCDataInput, MCDataOutput}
import codechicken.lib.raytracer.IndexedCuboid6
import codechicken.lib.vec.Cuboid6
import codechicken.multipart._
import edx.core.prefab.part.CuboidShapes
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.util.MovingObjectPosition
import net.minecraftforge.common.util.ForgeDirection
import resonantengine.lib.grid.core.NodeConnector
import resonantengine.lib.wrapper.BitmaskWrapper._
import scala.collection.convert.wrapAll._
import scala.collection.mutable
abstract class PartFramedNode extends PartAbstract with TPartNodeProvider with TSlottedPart with TNormalOcclusion
{
protected val node: NodeConnector[_]
/** Bitmask connections */
var clientRenderMask = 0x00
/** Client Side */
protected var testingSide: ForgeDirection = null
//Check if lazy val will be null?
nodes.add(node)
override def getStrength(hit: MovingObjectPosition, player: EntityPlayer): Float = 10f
def getOcclusionBoxes: Set[Cuboid6] = getCollisionBoxes
/** Rendering and block bounds. */
override def getCollisionBoxes: Set[Cuboid6] = mutable.Set.empty[Cuboid6] ++ getSubParts
override def getSubParts: JIterable[IndexedCuboid6] =
{
val sideCuboids = if (this.isInstanceOf[TInsulatable] && this.asInstanceOf[TInsulatable].insulated) CuboidShapes.thickSegment else CuboidShapes.segment
val list = mutable.Set.empty[IndexedCuboid6]
list += CuboidShapes.center
list ++= ForgeDirection.VALID_DIRECTIONS.filter(s => clientRenderMask.mask(s) || s == testingSide).map(s => sideCuboids(s.ordinal()))
return list
}
override def getSlotMask = PartMap.CENTER.mask
def isBlockedOnSide(side: ForgeDirection): Boolean =
{
val blocker: TMultiPart = tile.partMap(side.ordinal)
testingSide = side
val expandable = NormalOcclusionTest.apply(this, blocker)
testingSide = null
return !expandable
}
def isCurrentlyConnected(side: ForgeDirection): Boolean = clientRenderMask.mask(side)
override def write(packet: MCDataOutput, id: Int)
{
super.write(packet, id)
if (id == 0)
{
packet.writeByte(node.connectedMask.toByte)
}
}
override def read(packet: MCDataInput, id: Int)
{
super.read(packet, id)
if (id == 0)
{
clientRenderMask = packet.readByte()
}
}
@deprecated
def connectionMapContainsSide(connections: Int, side: ForgeDirection): Boolean =
{
val tester = 1 << side.ordinal
return (connections & tester) > 0
}
}