From 5a9aedb4d544dc65dd2de077e83a8b384f306773 Mon Sep 17 00:00:00 2001 From: bdew Date: Thu, 4 Sep 2014 15:54:35 +0300 Subject: [PATCH] Refactoring multiblock outputs, TileOutput (&co) now has a type parameter for config object type --- .../bdew/lib/multiblock/block/BlockOutput.scala | 2 +- .../bdew/lib/multiblock/data/OutputConfig.scala | 2 +- .../lib/multiblock/interact/CIOutputFaces.scala | 14 +++++++------- .../bdew/lib/multiblock/interact/MIOutput.scala | 9 +++++++-- .../lib/multiblock/tile/RSControllableOutput.scala | 3 ++- src/net/bdew/lib/multiblock/tile/TileOutput.scala | 14 ++++++++++++-- 6 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/net/bdew/lib/multiblock/block/BlockOutput.scala b/src/net/bdew/lib/multiblock/block/BlockOutput.scala index 0ec5a83..3af7229 100644 --- a/src/net/bdew/lib/multiblock/block/BlockOutput.scala +++ b/src/net/bdew/lib/multiblock/block/BlockOutput.scala @@ -15,7 +15,7 @@ import net.bdew.lib.render.connected.{BlockAdditionalRender, ConnectedHelper, Fa import net.minecraft.world.IBlockAccess import net.minecraftforge.common.util.ForgeDirection -trait BlockOutput[T <: TileOutput] extends BlockModule[T] with BlockAdditionalRender { +trait BlockOutput[T <: TileOutput[_]] extends BlockModule[T] with BlockAdditionalRender { def getAdjancedFaces(face: ForgeDirection, bp: BlockRef) = { val sides = ConnectedHelper.faceAdjanced(face) Seq( diff --git a/src/net/bdew/lib/multiblock/data/OutputConfig.scala b/src/net/bdew/lib/multiblock/data/OutputConfig.scala index 70b9109..165f09e 100644 --- a/src/net/bdew/lib/multiblock/data/OutputConfig.scala +++ b/src/net/bdew/lib/multiblock/data/OutputConfig.scala @@ -19,7 +19,7 @@ abstract class OutputConfig { def handleConfigPacket(m: MsgOutputCfg) } -trait OutputConfigRSControllable { +trait OutputConfigRSControllable extends OutputConfig { var rsMode: RSMode.Value } diff --git a/src/net/bdew/lib/multiblock/interact/CIOutputFaces.scala b/src/net/bdew/lib/multiblock/interact/CIOutputFaces.scala index af8db6f..0fd5e87 100644 --- a/src/net/bdew/lib/multiblock/interact/CIOutputFaces.scala +++ b/src/net/bdew/lib/multiblock/interact/CIOutputFaces.scala @@ -52,13 +52,13 @@ trait CIOutputFaces extends TileController { } def doOutputs() { - for ((x, n) <- outputFaces) { - val t = x.origin.getTile[MIOutput](getWorldObj) - if (t.isDefined) { - if (!outputConfig.isDefinedAt(n) || outputConfig(n).isInstanceOf[OutputConfigInvalid]) - outputConfig(n) = t.get.makeCfgObject(x.face) - t.get.doOutput(x.face, outputConfig(n)) - } + for { + (x, n) <- outputFaces + t <- x.origin.getTile[MIOutput[_]](getWorldObj) + } { + if (!outputConfig.isDefinedAt(n) || !t.outputConfigType.isInstance(outputConfig(n))) + outputConfig(n) = t.makeCfgObject(x.face) + t.doOutput(x.face, outputConfig(n).asInstanceOf[t.OCType]) } } diff --git a/src/net/bdew/lib/multiblock/interact/MIOutput.scala b/src/net/bdew/lib/multiblock/interact/MIOutput.scala index 153a479..ae5691b 100644 --- a/src/net/bdew/lib/multiblock/interact/MIOutput.scala +++ b/src/net/bdew/lib/multiblock/interact/MIOutput.scala @@ -9,11 +9,16 @@ package net.bdew.lib.multiblock.interact +import net.bdew.lib.BdLib import net.bdew.lib.multiblock.data.OutputConfig import net.bdew.lib.multiblock.tile.TileModule import net.minecraftforge.common.util.ForgeDirection -trait MIOutput extends TileModule { - def doOutput(face: ForgeDirection, cfg: OutputConfig) +trait MIOutput[T <: OutputConfig] extends TileModule { + val outputConfigType: Class[T] + type OCType = T + + def doOutput(face: ForgeDirection, cfg: OCType) + def makeCfgObject(face: ForgeDirection): OutputConfig } diff --git a/src/net/bdew/lib/multiblock/tile/RSControllableOutput.scala b/src/net/bdew/lib/multiblock/tile/RSControllableOutput.scala index 9a11696..8417291 100644 --- a/src/net/bdew/lib/multiblock/tile/RSControllableOutput.scala +++ b/src/net/bdew/lib/multiblock/tile/RSControllableOutput.scala @@ -10,8 +10,9 @@ package net.bdew.lib.multiblock.tile import net.bdew.lib.multiblock.data.{OutputConfigRSControllable, RSMode} +import net.minecraft.tileentity.TileEntity -trait RSControllableOutput extends TileOutput { +trait RSControllableOutput extends TileEntity { def checkCanOutput(cfg: OutputConfigRSControllable): Boolean = { if (cfg.rsMode == RSMode.ALWAYS) return true if (cfg.rsMode == RSMode.NEVER) return false diff --git a/src/net/bdew/lib/multiblock/tile/TileOutput.scala b/src/net/bdew/lib/multiblock/tile/TileOutput.scala index e1d2b69..193c992 100644 --- a/src/net/bdew/lib/multiblock/tile/TileOutput.scala +++ b/src/net/bdew/lib/multiblock/tile/TileOutput.scala @@ -9,17 +9,27 @@ package net.bdew.lib.multiblock.tile +import net.bdew.lib.Misc +import net.bdew.lib.block.BlockFace import net.bdew.lib.multiblock.data.OutputConfig import net.bdew.lib.multiblock.interact.{CIOutputFaces, MIOutput} import net.minecraftforge.common.util.ForgeDirection -abstract class TileOutput extends TileModule with MIOutput { +abstract class TileOutput[T <: OutputConfig] extends TileModule with MIOutput[T] { override def getCore = getCoreAs[CIOutputFaces] - def makeCfgObject(face: ForgeDirection): OutputConfig + def makeCfgObject(face: ForgeDirection): T var rescanFaces = false + def getCfg(dir: ForgeDirection): Option[T] = + for { + core <- getCore + onum <- core.outputFaces.get(BlockFace(mypos, dir)) + cfggen <- core.outputConfig.get(onum) + cfg <- Misc.asInstanceOpt(cfggen, outputConfigType) + } yield cfg + serverTick.listen(() => { if (rescanFaces) { rescanFaces = false