| package li.cil.oc.common.multipart |
| |
| import codechicken.lib.data.{MCDataInput, MCDataOutput} |
| import codechicken.lib.vec.{Cuboid6, Vector3} |
| import codechicken.multipart._ |
| import cpw.mods.fml.relauncher.{Side, SideOnly} |
| import li.cil.oc.api.network.{Message, Node, Visibility} |
| import li.cil.oc.api.{Items, network} |
| import li.cil.oc.common.block.Cable |
| import li.cil.oc.common.tileentity |
| import li.cil.oc.util.Color |
| import li.cil.oc.util.ExtendedNBT._ |
| import li.cil.oc.{Settings, api, client, common} |
| import net.minecraft.client.renderer.RenderBlocks |
| import net.minecraft.entity.player.EntityPlayer |
| import net.minecraft.item.ItemStack |
| import net.minecraft.nbt.NBTTagCompound |
| import net.minecraft.util.{AxisAlignedBB, MovingObjectPosition} |
| |
| import scala.collection.convert.WrapAsJava |
| import scala.collection.convert.WrapAsScala._ |
| |
| class CablePart(val original: Option[tileentity.Cable] = None) extends SimpleBlockPart with TCuboidPart with TNormalOcclusion with network.Environment { |
| val node = api.Network.newNode(this, Visibility.None).create() |
| |
| private var _color = 0 |
| |
| original.foreach(cable => _color = cable.color) |
| |
| // ----------------------------------------------------------------------- // |
| |
| def color = _color |
| |
| def color_=(value: Int) = if (value != _color) { |
| _color = value |
| onColorChanged() |
| } |
| |
| protected def onColorChanged() { |
| if (world != null && !world.isRemote) { |
| sendDescUpdate() |
| api.Network.joinOrCreateNetwork(tile) |
| } |
| } |
| |
| // ----------------------------------------------------------------------- // |
| |
| override def simpleBlock = Items.get("cable").block().asInstanceOf[Cable] |
| |
| def getType = Settings.namespace + "cable" |
| |
| override def doesTick = false |
| |
| override def getBounds = new Cuboid6(Cable.bounds(world, x, y, z)) |
| |
| override def getOcclusionBoxes = WrapAsJava.asJavaIterable(Iterable(new Cuboid6(AxisAlignedBB.getBoundingBox(-0.125 + 0.5, -0.125 + 0.5, -0.125 + 0.5, 0.125 + 0.5, 0.125 + 0.5, 0.125 + 0.5)))) |
| |
| override def getRenderBounds = new Cuboid6(Cable.bounds(world, x, y, z).offset(x, y, z)) |
| |
| // ----------------------------------------------------------------------- // |
| |
| override def activate(player: EntityPlayer, hit: MovingObjectPosition, item: ItemStack) = { |
| if (Color.isDye(player.getHeldItem)) { |
| color = Color.dyeColor(player.getHeldItem) |
| tile.markDirty() |
| true |
| } |
| else super.activate(player, hit, item) |
| } |
| |
| // ----------------------------------------------------------------------- // |
| |
| override def invalidateConvertedTile() { |
| super.invalidateConvertedTile() |
| original.foreach(_.node.neighbors.foreach(_.connect(this.node))) |
| } |
| |
| override def onPartChanged(part: TMultiPart) { |
| super.onPartChanged(part) |
| api.Network.joinOrCreateNetwork(tile) |
| } |
| |
| override def onWorldJoin() { |
| super.onWorldJoin() |
| common.EventHandler.schedule(() => tile) |
| } |
| |
| override def onWorldSeparate() { |
| super.onWorldSeparate() |
| Option(node).foreach(_.remove) |
| } |
| |
| // ----------------------------------------------------------------------- // |
| |
| override def load(nbt: NBTTagCompound) { |
| super.load(nbt) |
| node.load(nbt.getCompoundTag(Settings.namespace + "node")) |
| if (nbt.hasKey(Settings.namespace + "renderColor")) { |
| _color = nbt.getInteger(Settings.namespace + "renderColor") |
| } |
| } |
| |
| override def save(nbt: NBTTagCompound) { |
| super.save(nbt) |
| // Null check for Waila (and other mods that may call this client side). |
| if (node != null) { |
| nbt.setNewCompoundTag(Settings.namespace + "node", node.save) |
| } |
| nbt.setInteger(Settings.namespace + "renderColor", _color) |
| } |
| |
| override def readDesc(packet: MCDataInput) { |
| super.readDesc(packet) |
| _color = packet.readInt() |
| } |
| |
| override def writeDesc(packet: MCDataOutput) { |
| super.writeDesc(packet) |
| packet.writeInt(_color) |
| } |
| |
| // ----------------------------------------------------------------------- // |
| |
| @SideOnly(Side.CLIENT) |
| override def renderStatic(pos: Vector3, pass: Int) = { |
| val (x, y, z) = (pos.x.toInt, pos.y.toInt, pos.z.toInt) |
| val renderer = RenderBlocks.getInstance |
| renderer.blockAccess = world |
| simpleBlock.colorMultiplierOverride = Some(_color) |
| client.renderer.block.Cable.render(world, x, y, z, simpleBlock, renderer) |
| simpleBlock.colorMultiplierOverride = None |
| true |
| } |
| |
| // ----------------------------------------------------------------------- // |
| |
| override def onMessage(message: Message) {} |
| |
| override def onDisconnect(node: Node) {} |
| |
| override def onConnect(node: Node) {} |
| } |