diff --git a/li/cil/oc/Blocks.scala b/li/cil/oc/Blocks.scala index fd38d59a3..d5b56f9ed 100644 --- a/li/cil/oc/Blocks.scala +++ b/li/cil/oc/Blocks.scala @@ -9,7 +9,7 @@ object Blocks { var screen: Screen = null var keyboard: Keyboard = null var powersupply: PowerSupply = null - var powerdistributer: PowerDistributer = null + var powerdistributer: PowerDistributor = null def init() { // IMPORTANT: the multi block must come first, since the sub blocks will // try to register with it. Also, the order the sub blocks are created in @@ -21,6 +21,6 @@ object Blocks { screen = new Screen(blockSimple) keyboard = new Keyboard(blockSpecial) powersupply = new PowerSupply(blockSimple) - powerdistributer = new PowerDistributer(blockSimple) + powerdistributer = new PowerDistributor(blockSimple) } } \ No newline at end of file diff --git a/li/cil/oc/api/network/PoweredNode.scala b/li/cil/oc/api/network/PoweredNode.scala index 8946b4851..e4a0f522e 100644 --- a/li/cil/oc/api/network/PoweredNode.scala +++ b/li/cil/oc/api/network/PoweredNode.scala @@ -1,30 +1,34 @@ package li.cil.oc.api.network -/** - * Created with IntelliJ IDEA. - * User: lordjoda - * Date: 04.10.13 - * Time: 17:29 - * To change this template use File | Settings | File Templates. - */ -trait PoweredNode extends Node{ - var main:Node = null - var demand = 2; + +trait PoweredNode extends Node { + var main: Node = null + var demand = 2 + override def receive(message: Message): Option[Array[Any]] = { val ret = super.receive(message) message.name match { case "power.connect" => { - println("connect") - if(main != message.source){ - println("setting main") + if (main != message.source) { + if (main != null) + network.foreach(_.sendToAddress(this, main.address.get, "power.disconnect")) main = message.source - network.foreach(_.sendToAddress(this,message.source.address.get,"power.request",demand)) + network.foreach(_.sendToAddress(this, message.source.address.get, "power.request", demand, 1)) } } - case "network.disconnect"=> {if(message.source == main)main = null} + case "network.disconnect" => { + if (message.source == main) main = null + } case _ => // Ignore. } - return ret + ret + } + + override protected def onDisconnect() { + println("sending disc") + network.foreach(_.sendToAddress(this, main.address.get, "power.disconnect")) + + super.onDisconnect() } } diff --git a/li/cil/oc/common/block/PowerDistributer.scala b/li/cil/oc/common/block/PowerDistributor.scala similarity index 69% rename from li/cil/oc/common/block/PowerDistributer.scala rename to li/cil/oc/common/block/PowerDistributor.scala index d72d5ab6b..20415f84a 100644 --- a/li/cil/oc/common/block/PowerDistributer.scala +++ b/li/cil/oc/common/block/PowerDistributor.scala @@ -4,16 +4,10 @@ import cpw.mods.fml.common.registry.GameRegistry import li.cil.oc.common.tileentity import net.minecraft.world.World -/** - * Created with IntelliJ IDEA. - * User: lordjoda - * Date: 03.10.13 - * Time: 19:48 - * To change this template use File | Settings | File Templates. - */ -class PowerDistributer (val parent: Delegator) extends Delegate { - GameRegistry.registerTileEntity(classOf[tileentity.PowerDistributer], "oc.powerdistributer" ) - val unlocalizedName = "PowerDistributer" + +class PowerDistributor (val parent: Delegator) extends Delegate { + GameRegistry.registerTileEntity(classOf[tileentity.PowerDistributor], "oc.powerdistributor" ) + val unlocalizedName = "PowerDistributor" override def breakBlock(world: World, x: Int, y: Int, z: Int, blockId: Int, metadata: Int) = { //world.getBlockTileEntity(x, y, z).asInstanceOf[tileentity.PowerDistributer] @@ -25,6 +19,6 @@ class PowerDistributer (val parent: Delegator) extends Delegate { override def hasTileEntity = true - override def createTileEntity(world: World, metadata: Int) = Some(new tileentity.PowerDistributer) + override def createTileEntity(world: World, metadata: Int) = Some(new tileentity.PowerDistributor) } diff --git a/li/cil/oc/common/tileentity/PowerDistributer.scala b/li/cil/oc/common/tileentity/PowerDistributer.scala deleted file mode 100644 index 4413ff7e3..000000000 --- a/li/cil/oc/common/tileentity/PowerDistributer.scala +++ /dev/null @@ -1,72 +0,0 @@ -package li.cil.oc.common.tileentity - -import li.cil.oc.api.network.{PoweredNode, Message, Visibility, Node} - -/** - * Created with IntelliJ IDEA. - * User: lordjoda - * Date: 03.10.13 - * Time: 19:51 - * To change this template use File | Settings | File Templates. - */ -class PowerDistributer extends Rotatable with PoweredNode { - - var powerDemand:Int = 0 - override def name = "powerdistributer" - - override def visibility = Visibility.Network - - - override def receive(message: Message): Option[Array[Any]] = { - - message.name match { - case "network.disconnect"=> { - println("recieved disc") - if(message.source == main){ - main = this - network.foreach(_.sendToAddress(this,address.get,"power.request",demand)) - network.foreach(_.sendToVisible(this, "power.connect")) - } - } - case _ => // Ignore. - } - val ret = super.receive(message) - message.name match { - case "network.connect"=>{ - if(main==this){ - network.foreach(_.sendToAddress(this,message.source.address.get,"power.connect")) - } - } - case "power.find"=>{ - if(main==this){ - network.foreach(_.sendToAddress(this,message.source.address.get,"power.connect")) - message.cancel() - } - } - case "power.request"=>{ - println("recieved power request") - if(main == this){ - println("this is main") - message.data match { - case Array(value:Int)=> { - powerDemand+=value - println("now demanding "+powerDemand) - } - case _ => // Ignore. - } - } - } - case _ => // Ignore. - } - return ret - } - - override protected def onConnect() { - network.foreach(_.sendToVisible(this, "power.find")) - if(main==null) - { main = this - network.foreach(_.sendToAddress(this,address.get,"power.request",demand)) - } - super.onConnect() - } -} diff --git a/li/cil/oc/common/tileentity/PowerDistributor.scala b/li/cil/oc/common/tileentity/PowerDistributor.scala new file mode 100644 index 000000000..510e5ec55 --- /dev/null +++ b/li/cil/oc/common/tileentity/PowerDistributor.scala @@ -0,0 +1,98 @@ +package li.cil.oc.common.tileentity + +import li.cil.oc.api.network.{PoweredNode, Message, Visibility, Node} +import scala.collection.mutable.ArrayBuffer + + +class PowerDistributor extends Rotatable with PoweredNode { + + + var arrayBuffer = ArrayBuffer[EnergyStorage]() + var energyDemand = 0 + demand = 1 + + override def name = "powerdistributor" + + override def visibility = Visibility.Network + + + override def receive(message: Message): Option[Array[Any]] = { + + message.name match { + case "network.disconnect" => { + if (message.source == main) { + main = this + network.foreach(_.sendToAddress(this, address.get, "power.request", 1, -1)) + network.foreach(_.sendToVisible(this, "power.connect")) + } + disconnectNode(message.source) + + } + case _ => // Ignore. + } + val ret = super.receive(message) + message.name match { + case "network.connect" => { + if (main == this) { + network.foreach(_.sendToAddress(this, message.source.address.get, "power.connect")) + } + } + case "power.find" => { + if (main == this) { + network.foreach(_.sendToAddress(this, message.source.address.get, "power.connect")) + message.cancel() + } + } + case "power.request" => { + if (main == this) { + + message.data match { + case Array(value: Int, priority: Int) => { + if (arrayBuffer.filter(_.node == message.source).isEmpty) { + arrayBuffer += new EnergyStorage(message.source, value, priority) + + energyDemand += value + println("demand now " + energyDemand) + } + } + case _ => println("unknown format") + } + } + } + case "power.disconnect" => { + println("received disc asd") + disconnectNode(message.source) + + } + case _ => // Ignore. + } + ret + } + def disconnectNode(node:Node){ + arrayBuffer.clone().foreach(e => { + if (e == null || node == null) { + println("something null") + + } + else if (e.node == node) { + arrayBuffer -= e + energyDemand -= e.amount + } + + }) + println("demand now after " + energyDemand) + } + override protected def onConnect() { + network.foreach(_.sendToVisible(this, "power.find")) + if (main == null) { + main = this + network.foreach(_.sendToAddress(this, address.get, "power.request", demand, 0)) + } + super.onConnect() + } + + class EnergyStorage(var node: Node, var amount: Int, var priority: Int) { + + } + +}