power calculation on merge splitting and removing nodes

This commit is contained in:
Johannes Lohrer 2013-10-06 22:47:39 +02:00
parent 26dbecd80f
commit 35eae71b29
5 changed files with 125 additions and 101 deletions

View File

@ -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)
}
}

View File

@ -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()
}
}

View File

@ -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)
}

View File

@ -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()
}
}

View File

@ -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) {
}
}