mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-17 11:15:12 -04:00
Merge branch 'master' of cil.li:oc
Conflicts: li/cil/oc/common/tileentity/ComponentInventory.scala li/cil/oc/common/tileentity/Screen.scala
This commit is contained in:
commit
efe25b35e8
@ -1,62 +0,0 @@
|
|||||||
package li.cil.oc.api.network
|
|
||||||
|
|
||||||
import li.cil.oc.common.tileentity.PowerDistributor
|
|
||||||
import scala.collection.mutable.ArrayBuffer
|
|
||||||
|
|
||||||
|
|
||||||
trait PoweredNode extends Node {
|
|
||||||
var arrayBuffer = ArrayBuffer[PowerDistributor]()
|
|
||||||
var demand = 2
|
|
||||||
|
|
||||||
override def receive(message: Message): Option[Array[Any]] = {
|
|
||||||
message.name match {
|
|
||||||
case "system.connect" => {
|
|
||||||
message.source match {
|
|
||||||
case distributor: PowerDistributor => {
|
|
||||||
println("connect")
|
|
||||||
if (arrayBuffer.filter(p => p == distributor).isEmpty) {
|
|
||||||
arrayBuffer += distributor
|
|
||||||
distributor.connectNode(this, getDemand, getPriority)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case _ =>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case "system.disconnect" => {
|
|
||||||
message.source match {
|
|
||||||
case distributor: PowerDistributor => {
|
|
||||||
println("connect")
|
|
||||||
if (arrayBuffer.contains(distributor)) {
|
|
||||||
arrayBuffer -= distributor
|
|
||||||
distributor.disconnectNode(this)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case _ =>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case _ =>
|
|
||||||
}
|
|
||||||
super.receive(message)
|
|
||||||
}
|
|
||||||
|
|
||||||
def removeBuffer(distributor: PowerDistributor) = {
|
|
||||||
distributor.disconnectNode(this)
|
|
||||||
arrayBuffer -= distributor
|
|
||||||
}
|
|
||||||
|
|
||||||
override protected def onDisconnect() {
|
|
||||||
|
|
||||||
arrayBuffer.foreach(e => {
|
|
||||||
e.disconnectNode(this)
|
|
||||||
})
|
|
||||||
super.onDisconnect()
|
|
||||||
}
|
|
||||||
|
|
||||||
def getDemand: Int = 2
|
|
||||||
|
|
||||||
def getPriority: Int = 1
|
|
||||||
|
|
||||||
def updateDemand(demand: Int) {
|
|
||||||
arrayBuffer.foreach(e => e.updateDemand(this, getDemand))
|
|
||||||
}
|
|
||||||
}
|
|
30
li/cil/oc/api/network/Producer.scala
Normal file
30
li/cil/oc/api/network/Producer.scala
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package li.cil.oc.api.network
|
||||||
|
|
||||||
|
trait Producer extends Receiver {
|
||||||
|
demand = 0
|
||||||
|
|
||||||
|
def powerDemand:Double= {
|
||||||
|
if (main != null) {
|
||||||
|
main.getDemand
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
0.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def maxEnergy:Double= {
|
||||||
|
if (main != null) {
|
||||||
|
main.MAXENERGY
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
0.0
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
def addEnergy(amount: Double) {
|
||||||
|
if (main != null) {
|
||||||
|
main.addEnergy(amount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
188
li/cil/oc/api/network/Provider.scala
Normal file
188
li/cil/oc/api/network/Provider.scala
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
package li.cil.oc.api.network
|
||||||
|
|
||||||
|
import scala.collection.mutable
|
||||||
|
import net.minecraft.nbt.NBTTagCompound
|
||||||
|
|
||||||
|
|
||||||
|
trait Provider extends Node{
|
||||||
|
|
||||||
|
var isActive = false
|
||||||
|
var updateNodes = false
|
||||||
|
var energyDemand =0.0
|
||||||
|
var storedEnergy =0.0
|
||||||
|
var MAXENERGY :Double =2000.0
|
||||||
|
|
||||||
|
|
||||||
|
var energyStorageList = mutable.Set[EnergyStorage]()
|
||||||
|
|
||||||
|
override def load(nbt: NBTTagCompound) = {
|
||||||
|
super.load(nbt)
|
||||||
|
storedEnergy = nbt.getDouble("storedEnergy")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override def save(nbt: NBTTagCompound) = {
|
||||||
|
super.save(nbt)
|
||||||
|
nbt.setDouble("storedEnergy",storedEnergy)
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override def receive(message: Message): Option[Array[Any]] = {
|
||||||
|
if (message.source != this) {
|
||||||
|
message.name match {
|
||||||
|
case "system.connect" => {
|
||||||
|
message.source match {
|
||||||
|
case distributor: Provider =>
|
||||||
|
//if other powerDistributor connected and is active set inactive
|
||||||
|
if (distributor.isActive) {
|
||||||
|
isActive = false
|
||||||
|
println("demand now (disabled) " + 0)
|
||||||
|
}
|
||||||
|
case _ =>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case "power.find" => {
|
||||||
|
message.source match {
|
||||||
|
case distributor: Provider =>
|
||||||
|
if (isActive) {
|
||||||
|
message.cancel()
|
||||||
|
return result(this)
|
||||||
|
}
|
||||||
|
case _ =>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case "system.disconnect" => {
|
||||||
|
message.source match {
|
||||||
|
case distributor: Provider =>
|
||||||
|
println("distri disc recieved")
|
||||||
|
if (distributor.isActive) {
|
||||||
|
searchMain()
|
||||||
|
}
|
||||||
|
case _ =>
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
case _ => // Ignore.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.receive(message)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Connect a reciever to the provider
|
||||||
|
* @param receiver
|
||||||
|
* @param amount
|
||||||
|
*/
|
||||||
|
def connectNode(receiver: Receiver, amount: Double) {
|
||||||
|
if (energyStorageList.filter(x => x.node == receiver).isEmpty) {
|
||||||
|
energyStorageList += new EnergyStorage(receiver, amount)
|
||||||
|
energyDemand += amount
|
||||||
|
updateNodes = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isActive)
|
||||||
|
println("demand now (connect)" + energyDemand)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the demand of the node to the given value
|
||||||
|
* @param receiver
|
||||||
|
* @param demand
|
||||||
|
*/
|
||||||
|
def updateDemand(receiver: Receiver, demand: Double) {
|
||||||
|
energyStorageList.filter(n => n.node == receiver).foreach(n => {
|
||||||
|
energyDemand -= n.amount
|
||||||
|
energyDemand += demand
|
||||||
|
n.amount = demand
|
||||||
|
})
|
||||||
|
if (isActive)
|
||||||
|
println("demand now (update)" + energyDemand)
|
||||||
|
}
|
||||||
|
|
||||||
|
def disconnectNode(receiver: Receiver) {
|
||||||
|
energyStorageList.clone().foreach(e => {
|
||||||
|
if (e == null || receiver == null) {
|
||||||
|
println("something null")
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (e.node == receiver) {
|
||||||
|
energyStorageList -= e
|
||||||
|
energyDemand -= e.amount
|
||||||
|
if(isActive)
|
||||||
|
{
|
||||||
|
receiver.unConnect()
|
||||||
|
updateNodes = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
if (isActive)
|
||||||
|
println("demand now (disc) " + energyDemand)
|
||||||
|
}
|
||||||
|
|
||||||
|
override protected def onConnect() {
|
||||||
|
//check if other distributors already are in the network
|
||||||
|
searchMain()
|
||||||
|
super.onConnect()
|
||||||
|
}
|
||||||
|
|
||||||
|
private var hasEnergy = false
|
||||||
|
override def update() {
|
||||||
|
super.update()
|
||||||
|
//check if is main
|
||||||
|
if (isActive) {
|
||||||
|
//if enough energy is available to supply all recievers
|
||||||
|
if(storedEnergy>energyDemand){
|
||||||
|
storedEnergy-=energyDemand
|
||||||
|
if(!hasEnergy)
|
||||||
|
updateNodes = true
|
||||||
|
hasEnergy = true
|
||||||
|
println("energy level now "+storedEnergy)
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if(hasEnergy)
|
||||||
|
updateNodes = true
|
||||||
|
hasEnergy = false
|
||||||
|
}
|
||||||
|
//if nodes must be updated send message to them
|
||||||
|
if(updateNodes){
|
||||||
|
if(hasEnergy)
|
||||||
|
energyStorageList.foreach(storage=>storage.node.connect())
|
||||||
|
else
|
||||||
|
energyStorageList.foreach(storage=>storage.node.unConnect())
|
||||||
|
updateNodes = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def getDemand = {
|
||||||
|
MAXENERGY - storedEnergy max 0.0
|
||||||
|
}
|
||||||
|
|
||||||
|
def addEnergy(amount: Double) {
|
||||||
|
storedEnergy += amount
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
def searchMain() {
|
||||||
|
network.foreach(_.sendToVisible(this, "power.find") match {
|
||||||
|
case Some(Array(powerDistributor: Provider)) => {
|
||||||
|
println("found other distri")
|
||||||
|
isActive = false
|
||||||
|
}
|
||||||
|
case _ => {
|
||||||
|
println("no other")
|
||||||
|
isActive = true
|
||||||
|
updateNodes = true
|
||||||
|
println("demand now (new main) " + energyDemand)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
class EnergyStorage(var node: Receiver, var amount: Double) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
141
li/cil/oc/api/network/Receiver.scala
Normal file
141
li/cil/oc/api/network/Receiver.scala
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
package li.cil.oc.api.network
|
||||||
|
|
||||||
|
import li.cil.oc.common.tileentity.PowerDistributor
|
||||||
|
import scala.collection.mutable
|
||||||
|
import net.minecraft.nbt.NBTTagCompound
|
||||||
|
|
||||||
|
|
||||||
|
trait Receiver extends Node {
|
||||||
|
var powerDistributors = mutable.Set[PowerDistributor]()
|
||||||
|
|
||||||
|
private var _demand = 2.0
|
||||||
|
|
||||||
|
def demand = _demand
|
||||||
|
|
||||||
|
def demand_=(value: Double) = {
|
||||||
|
|
||||||
|
powerDistributors.foreach(e => e.updateDemand(this, value))
|
||||||
|
_demand = value
|
||||||
|
}
|
||||||
|
|
||||||
|
override def receive(message: Message): Option[Array[Any]] = {
|
||||||
|
message.name match {
|
||||||
|
case "system.connect" => {
|
||||||
|
message.source match {
|
||||||
|
case distributor: PowerDistributor => {
|
||||||
|
println("connect")
|
||||||
|
if (!powerDistributors.contains(distributor)) {
|
||||||
|
powerDistributors += distributor
|
||||||
|
distributor.connectNode(this, _demand)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case _ =>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case "system.disconnect" => {
|
||||||
|
message.source match {
|
||||||
|
case distributor: PowerDistributor => {
|
||||||
|
println("connect")
|
||||||
|
if (powerDistributors.contains(distributor)) {
|
||||||
|
powerDistributors -= distributor
|
||||||
|
distributor.disconnectNode(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case _ =>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case _ =>
|
||||||
|
}
|
||||||
|
super.receive(message)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
override protected def onDisconnect() {
|
||||||
|
super.onDisconnect()
|
||||||
|
powerDistributors.foreach(e => {
|
||||||
|
e.disconnectNode(this)
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def main: PowerDistributor = {
|
||||||
|
powerDistributors.find(p => p.isActive) match {
|
||||||
|
case Some(p: PowerDistributor) => p
|
||||||
|
case _ => null
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
override def load(nbt: NBTTagCompound) = {
|
||||||
|
super.load(nbt)
|
||||||
|
buffer = nbt.getDouble("buffer")
|
||||||
|
}
|
||||||
|
|
||||||
|
override def save(nbt: NBTTagCompound) = {
|
||||||
|
super.save(nbt)
|
||||||
|
nbt.setDouble("buffer",buffer)
|
||||||
|
}
|
||||||
|
|
||||||
|
private var buffer = 0.0
|
||||||
|
private val maxBuffer = 100.0
|
||||||
|
private var hasEnergy = false
|
||||||
|
private var isConnected = false
|
||||||
|
|
||||||
|
override def update() {
|
||||||
|
super.update()
|
||||||
|
//if has enough energy to operate
|
||||||
|
if (isConnected) {
|
||||||
|
//increase buffer
|
||||||
|
if (maxBuffer > buffer + 1)
|
||||||
|
buffer += 1
|
||||||
|
//notify if energy wasn't available before
|
||||||
|
if (!hasEnergy) {
|
||||||
|
hasEnergy = true
|
||||||
|
onPowerAvailable()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
//continue running until we are out of energy
|
||||||
|
if (buffer - demand < 0) {
|
||||||
|
if (hasEnergy) {
|
||||||
|
hasEnergy = false
|
||||||
|
onPowerLoss()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
buffer -= demand
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* called from the producer when he has enough energy to operate
|
||||||
|
*/
|
||||||
|
final def connect() {
|
||||||
|
isConnected = true
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called from the producer when there is not enough energy to operate
|
||||||
|
*/
|
||||||
|
final def unConnect() {
|
||||||
|
isConnected = false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the receiver has enough power to operate.
|
||||||
|
*/
|
||||||
|
def onPowerAvailable() {
|
||||||
|
println("received energy")
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the receiver has no power to operate. This can happen at a later time
|
||||||
|
* then unConnect was called, because of the internal capacity
|
||||||
|
*/
|
||||||
|
def onPowerLoss() {
|
||||||
|
println("no more energy")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,7 +2,7 @@ package li.cil.oc.common.tileentity
|
|||||||
|
|
||||||
import java.util.concurrent.atomic.AtomicBoolean
|
import java.util.concurrent.atomic.AtomicBoolean
|
||||||
import li.cil.oc.api.driver.Slot
|
import li.cil.oc.api.driver.Slot
|
||||||
import li.cil.oc.api.network.PoweredNode
|
import li.cil.oc.api.network.Receiver
|
||||||
import li.cil.oc.client.{PacketSender => ClientPacketSender}
|
import li.cil.oc.client.{PacketSender => ClientPacketSender}
|
||||||
import li.cil.oc.server.component
|
import li.cil.oc.server.component
|
||||||
import li.cil.oc.server.component.Redstone
|
import li.cil.oc.server.component.Redstone
|
||||||
@ -14,7 +14,7 @@ import net.minecraft.item.ItemStack
|
|||||||
import net.minecraft.nbt.NBTTagCompound
|
import net.minecraft.nbt.NBTTagCompound
|
||||||
import net.minecraftforge.common.ForgeDirection
|
import net.minecraftforge.common.ForgeDirection
|
||||||
|
|
||||||
class Computer(isClient: Boolean) extends Rotatable with component.Computer.Environment with ComponentInventory with Redstone with PoweredNode {
|
class Computer(isClient: Boolean) extends Rotatable with component.Computer.Environment with ComponentInventory with Redstone with Receiver {
|
||||||
def this() = this(false)
|
def this() = this(false)
|
||||||
|
|
||||||
// ----------------------------------------------------------------------- //
|
// ----------------------------------------------------------------------- //
|
||||||
@ -65,7 +65,7 @@ class Computer(isClient: Boolean) extends Rotatable with component.Computer.Envi
|
|||||||
|
|
||||||
override def updateEntity() = if (!worldObj.isRemote) {
|
override def updateEntity() = if (!worldObj.isRemote) {
|
||||||
computer.update()
|
computer.update()
|
||||||
|
update()
|
||||||
if (hasChanged.get)
|
if (hasChanged.get)
|
||||||
worldObj.markTileEntityChunkModified(xCoord, yCoord, zCoord, this)
|
worldObj.markTileEntityChunkModified(xCoord, yCoord, zCoord, this)
|
||||||
if (isRunning != computer.isRunning)
|
if (isRunning != computer.isRunning)
|
||||||
|
@ -1,141 +1,30 @@
|
|||||||
package li.cil.oc.common.tileentity
|
package li.cil.oc.common.tileentity
|
||||||
|
|
||||||
import li.cil.oc.api.network.{PoweredNode, Message, Visibility}
|
import li.cil.oc.api.network._
|
||||||
import scala.collection.mutable.ArrayBuffer
|
import scala.collection.mutable
|
||||||
|
import net.minecraft.nbt.NBTTagCompound
|
||||||
|
|
||||||
|
class PowerDistributor extends Rotatable with Provider {
|
||||||
|
|
||||||
|
|
||||||
class PowerDistributor extends Rotatable with PoweredNode {
|
//MAXENERGY = 2000.0.toDouble
|
||||||
|
|
||||||
var isActive = true
|
|
||||||
var energyStorageList = ArrayBuffer[EnergyStorage]()
|
|
||||||
var energyDemand = 0
|
|
||||||
demand = 1
|
|
||||||
|
|
||||||
override val name = "powerdistributor"
|
override val name = "powerdistributor"
|
||||||
|
|
||||||
override val visibility = Visibility.Network
|
override val visibility = Visibility.Network
|
||||||
|
|
||||||
|
|
||||||
override def receive(message: Message): Option[Array[Any]] = {
|
|
||||||
|
|
||||||
message.name match {
|
|
||||||
case "system.connect" => {
|
|
||||||
message.source match {
|
|
||||||
case distributor: PowerDistributor =>
|
|
||||||
//if other powerDistributor connected and is active set inactive
|
|
||||||
if (message.source != this && distributor.isActive) {
|
|
||||||
isActive = false
|
|
||||||
|
|
||||||
println("demand now (disabled) " + 0)
|
|
||||||
}
|
|
||||||
case _ =>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case "power.find" => {
|
|
||||||
message.source match {
|
|
||||||
case distributor: PowerDistributor =>
|
|
||||||
//received request from other distributor that is newly connected... set it to inactive
|
|
||||||
|
|
||||||
if (isActive && message.source != this) {
|
|
||||||
distributor.isActive = false
|
|
||||||
}
|
|
||||||
case _ =>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case "system.disconnect" => {
|
|
||||||
message.source match {
|
|
||||||
case distributor: PowerDistributor =>
|
|
||||||
println("distri disc recieved")
|
|
||||||
if (distributor.isActive && distributor != this) {
|
|
||||||
isActive = true
|
|
||||||
network.foreach(_.sendToVisible(this, "power.find"))
|
|
||||||
|
|
||||||
println("demand now (new main) " + energyDemand)
|
|
||||||
}
|
|
||||||
case _ =>
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
case _ => // Ignore.
|
|
||||||
}
|
|
||||||
super.receive(message)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
def connectNode(node: PoweredNode, amount: Int, priority: Int) {
|
|
||||||
if (energyStorageList.filter(x => x.node == node).isEmpty) {
|
|
||||||
energyStorageList += new EnergyStorage(node, amount, priority)
|
|
||||||
energyDemand += amount
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isActive)
|
|
||||||
println("demand now (connect)" + energyDemand)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates the demand of the node to the given value
|
|
||||||
* @param node
|
|
||||||
* @param demand
|
|
||||||
*/
|
|
||||||
def updateDemand(node: PoweredNode, demand: Int) {
|
|
||||||
energyStorageList.filter(n => n.node == node).foreach(n => {
|
|
||||||
energyDemand -= n.amount
|
|
||||||
energyDemand += demand
|
|
||||||
n.amount = demand
|
|
||||||
})
|
|
||||||
if (isActive)
|
|
||||||
println("demand now (update)" + energyDemand)
|
|
||||||
}
|
|
||||||
|
|
||||||
def disconnectNode(node: PoweredNode) {
|
|
||||||
energyStorageList.clone().foreach(e => {
|
|
||||||
if (e == null || node == null) {
|
|
||||||
println("something null")
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (e.node == node) {
|
|
||||||
energyStorageList -= e
|
|
||||||
energyDemand -= e.amount
|
|
||||||
}
|
|
||||||
|
|
||||||
})
|
|
||||||
if (isActive)
|
|
||||||
println("demand now (disc) " + energyDemand)
|
|
||||||
}
|
|
||||||
|
|
||||||
override protected def onConnect() {
|
|
||||||
//check if other distributors already are in the network
|
|
||||||
network.foreach(_.sendToVisible(this, "power.find"))
|
|
||||||
super.onConnect()
|
|
||||||
}
|
|
||||||
|
|
||||||
override protected def onDisconnect() {
|
|
||||||
println("disc distri other " + arrayBuffer.length)
|
|
||||||
super.onDisconnect()
|
|
||||||
energyStorageList.clone().foreach(e => {
|
|
||||||
|
|
||||||
e.node.removeBuffer(this)
|
|
||||||
if (energyStorageList.contains(e)) {
|
|
||||||
|
|
||||||
energyStorageList -= e
|
|
||||||
energyDemand -= e.amount
|
|
||||||
}
|
|
||||||
|
|
||||||
})
|
|
||||||
if (isActive)
|
|
||||||
println("demand now (close) " + energyDemand)
|
|
||||||
}
|
|
||||||
|
|
||||||
override def updateEntity(){
|
override def updateEntity(){
|
||||||
super.updateEntity()
|
super.updateEntity()
|
||||||
if (isActive) {
|
update()
|
||||||
|
|
||||||
}
|
|
||||||
//TODO remove energy
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class EnergyStorage(var node: PoweredNode, var amount: Int, var priority: Int) {
|
override def readFromNBT(nbt: NBTTagCompound) = {
|
||||||
|
super.readFromNBT(nbt)
|
||||||
|
load(nbt)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override def writeToNBT(nbt: NBTTagCompound) = {
|
||||||
|
super.writeToNBT(nbt)
|
||||||
|
save(nbt)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
package li.cil.oc.common.tileentity
|
package li.cil.oc.common.tileentity
|
||||||
|
|
||||||
import net.minecraft.tileentity.TileEntity
|
import net.minecraft.tileentity.TileEntity
|
||||||
import li.cil.oc.api.network.{PoweredNode, Visibility, Node}
|
import li.cil.oc.api.network._
|
||||||
|
|
||||||
import net.minecraftforge.common.{ForgeDirection, MinecraftForge}
|
import net.minecraftforge.common.{ForgeDirection, MinecraftForge}
|
||||||
import ic2.api.energy.event.{EnergyTileLoadEvent, EnergyTileUnloadEvent}
|
import ic2.api.energy.event.{EnergyTileLoadEvent, EnergyTileUnloadEvent}
|
||||||
import cpw.mods.fml.common.FMLCommonHandler
|
import cpw.mods.fml.common.FMLCommonHandler
|
||||||
@ -19,9 +20,10 @@ import universalelectricity.core.electricity.ElectricityPack
|
|||||||
* Time: 20:37
|
* Time: 20:37
|
||||||
* To change this template use File | Settings | File Templates.
|
* To change this template use File | Settings | File Templates.
|
||||||
*/
|
*/
|
||||||
class PowerSupply extends Rotatable with PoweredNode with IEnergySink with IPowerReceptor with IElectrical{
|
class PowerSupply extends Rotatable with Producer with IEnergySink with IPowerReceptor with IElectrical {
|
||||||
var addedToEnet = false
|
var addedToEnet = false
|
||||||
var powerHandler: PowerHandler = null
|
var powerHandler: PowerHandler = null
|
||||||
|
|
||||||
override val name = "powersupply"
|
override val name = "powersupply"
|
||||||
|
|
||||||
override val visibility = Visibility.Network
|
override val visibility = Visibility.Network
|
||||||
@ -30,6 +32,7 @@ class PowerSupply extends Rotatable with PoweredNode with IEnergySink with IPowe
|
|||||||
super.onChunkUnload()
|
super.onChunkUnload()
|
||||||
onUnload()
|
onUnload()
|
||||||
}
|
}
|
||||||
|
|
||||||
def onUnload() {
|
def onUnload() {
|
||||||
if (addedToEnet) {
|
if (addedToEnet) {
|
||||||
MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this))
|
MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this))
|
||||||
@ -40,12 +43,13 @@ class PowerSupply extends Rotatable with PoweredNode with IEnergySink with IPowe
|
|||||||
|
|
||||||
override def updateEntity() {
|
override def updateEntity() {
|
||||||
super.updateEntity()
|
super.updateEntity()
|
||||||
|
update()
|
||||||
if (!addedToEnet) {
|
if (!addedToEnet) {
|
||||||
onLoaded()
|
onLoaded()
|
||||||
}
|
}
|
||||||
if(!FMLCommonHandler.instance.getEffectiveSide.isClient)
|
if (!FMLCommonHandler.instance.getEffectiveSide.isClient) {
|
||||||
{
|
|
||||||
storedEnergy+=getPowerProvider().useEnergy(1,(MAXENERGY-storedEnergy).toFloat/5.0f,true)*5;
|
addEnergy((getPowerProvider().useEnergy(1, powerDemand.toFloat / 5.0f, true) * 5).toDouble)
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -53,12 +57,13 @@ class PowerSupply extends Rotatable with PoweredNode with IEnergySink with IPowe
|
|||||||
override def readFromNBT(nbt: NBTTagCompound) = {
|
override def readFromNBT(nbt: NBTTagCompound) = {
|
||||||
super.readFromNBT(nbt)
|
super.readFromNBT(nbt)
|
||||||
getPowerProvider().readFromNBT(nbt)
|
getPowerProvider().readFromNBT(nbt)
|
||||||
storedEnergy = nbt.getDouble("storedEnergy")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override def writeToNBT(nbt: NBTTagCompound) = {
|
override def writeToNBT(nbt: NBTTagCompound) = {
|
||||||
super.writeToNBT(nbt)
|
super.writeToNBT(nbt)
|
||||||
getPowerProvider().writeToNBT(nbt)
|
getPowerProvider().writeToNBT(nbt)
|
||||||
nbt.setDouble("storedEnergy",storedEnergy)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,9 +78,8 @@ class PowerSupply extends Rotatable with PoweredNode with IEnergySink with IPowe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var storedEnergy = 0.0;
|
|
||||||
var lastInjectedEnergy =0.0;
|
var lastInjectedEnergy = 0.0
|
||||||
var MAXENERGY = 1000;
|
|
||||||
//IC2 stuff
|
//IC2 stuff
|
||||||
/**
|
/**
|
||||||
* Determine how much energy the sink accepts.
|
* Determine how much energy the sink accepts.
|
||||||
@ -87,10 +91,13 @@ class PowerSupply extends Rotatable with PoweredNode with IEnergySink with IPowe
|
|||||||
* @return max accepted input in eu
|
* @return max accepted input in eu
|
||||||
*/
|
*/
|
||||||
override def demandedEnergyUnits: Double = {
|
override def demandedEnergyUnits: Double = {
|
||||||
val needed = MAXENERGY-storedEnergy
|
|
||||||
if(needed>lastInjectedEnergy||needed>MAXENERGY/2)
|
val needed = powerDemand
|
||||||
|
if (needed > lastInjectedEnergy || needed > (maxEnergy / 2.0)) {
|
||||||
return needed / 2
|
return needed / 2
|
||||||
0
|
}
|
||||||
|
0.0
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -104,8 +111,8 @@ class PowerSupply extends Rotatable with PoweredNode with IEnergySink with IPowe
|
|||||||
* @return Energy not consumed (leftover)
|
* @return Energy not consumed (leftover)
|
||||||
*/
|
*/
|
||||||
override def injectEnergyUnits(directionFrom: ForgeDirection, amount: Double): Double = {
|
override def injectEnergyUnits(directionFrom: ForgeDirection, amount: Double): Double = {
|
||||||
lastInjectedEnergy = amount*2;
|
lastInjectedEnergy = amount * 2.0
|
||||||
storedEnergy+=amount*2;
|
addEnergy(amount * 2.0)
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,19 +155,19 @@ class PowerSupply extends Rotatable with PoweredNode with IEnergySink with IPowe
|
|||||||
*/
|
*/
|
||||||
def getPowerReceiver(side: ForgeDirection): PowerHandler#PowerReceiver = {
|
def getPowerReceiver(side: ForgeDirection): PowerHandler#PowerReceiver = {
|
||||||
|
|
||||||
return getPowerProvider().getPowerReceiver
|
getPowerProvider().getPowerReceiver
|
||||||
}
|
}
|
||||||
def getPowerProvider():PowerHandler=
|
|
||||||
{
|
def getPowerProvider(): PowerHandler = {
|
||||||
if (powerHandler == null)
|
if (powerHandler == null) {
|
||||||
{
|
|
||||||
powerHandler = new PowerHandler(this, PowerHandler.Type.STORAGE);
|
powerHandler = new PowerHandler(this, PowerHandler.Type.STORAGE);
|
||||||
if (powerHandler != null) {
|
if (powerHandler != null) {
|
||||||
powerHandler.configure(1.0F, 320.0F, 800.0F, 640.0F);
|
powerHandler.configure(1.0F, 320.0F, 800.0F, 640.0F);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return powerHandler;
|
powerHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Call back from the PowerHandler that is called when the stored power exceeds the activation
|
* Call back from the PowerHandler that is called when the stored power exceeds the activation
|
||||||
* power.
|
* power.
|
||||||
@ -189,14 +196,13 @@ class PowerSupply extends Rotatable with PoweredNode with IEnergySink with IPowe
|
|||||||
* @return Amount of energy that was accepted by the block.
|
* @return Amount of energy that was accepted by the block.
|
||||||
*/
|
*/
|
||||||
def receiveElectricity(from: ForgeDirection, receive: ElectricityPack, doReceive: Boolean): Float = {
|
def receiveElectricity(from: ForgeDirection, receive: ElectricityPack, doReceive: Boolean): Float = {
|
||||||
if (receive == null) return 0.0F;
|
if (receive == null) return 0.0F
|
||||||
|
|
||||||
if (doReceive)
|
if (doReceive) {
|
||||||
{
|
val energy = receive.getWatts / 0.2F
|
||||||
val energy = receive.getWatts() / 0.2F;
|
addEnergy(energy.toDouble)
|
||||||
storedEnergy += energy;
|
|
||||||
}
|
}
|
||||||
return receive.getWatts();
|
receive.getWatts
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -214,8 +220,8 @@ class PowerSupply extends Rotatable with PoweredNode with IEnergySink with IPowe
|
|||||||
* @return How much energy does this TileEntity want?
|
* @return How much energy does this TileEntity want?
|
||||||
*/
|
*/
|
||||||
def getRequest(direction: ForgeDirection): Float = {
|
def getRequest(direction: ForgeDirection): Float = {
|
||||||
val diff = Math.floor((MAXENERGY - storedEnergy) * 0.2F)
|
val diff = Math.floor(powerDemand * 0.2F)
|
||||||
return diff.toFloat max 0
|
diff.toFloat max 0
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
package li.cil.oc.common.tileentity
|
package li.cil.oc.common.tileentity
|
||||||
|
|
||||||
import li.cil.oc.api.network.PoweredNode
|
import li.cil.oc.api.network.Receiver
|
||||||
import li.cil.oc.client.gui
|
import li.cil.oc.client.gui
|
||||||
import li.cil.oc.client.{PacketSender => ClientPacketSender}
|
import li.cil.oc.client.{PacketSender => ClientPacketSender}
|
||||||
import li.cil.oc.common.component
|
import li.cil.oc.common.component
|
||||||
import li.cil.oc.server.{PacketSender => ServerPacketSender}
|
import li.cil.oc.server.{PacketSender => ServerPacketSender}
|
||||||
import net.minecraft.nbt.NBTTagCompound
|
import net.minecraft.nbt.NBTTagCompound
|
||||||
|
|
||||||
class Screen extends Rotatable with component.Screen.Environment with PoweredNode {
|
class Screen extends Rotatable with component.Screen.Environment with Receiver {
|
||||||
var guiScreen: Option[gui.Screen] = None
|
var guiScreen: Option[gui.Screen] = None
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user