blob: 4cdb079719c64e01f19994fd14a0e70afd51fa72 [file] [log] [blame] [raw]
package li.cil.oc.common.tileentity
import li.cil.oc.api.network._
import li.cil.oc.server.component.NetworkCard.Packet
import li.cil.oc.util.WirelessNetwork
import li.cil.oc.{api, Settings}
import net.minecraft.nbt.NBTTagCompound
import net.minecraftforge.common.ForgeDirection
class WirelessRouter extends Router with WirelessNetwork.Endpoint {
var strength = Settings.get.maxWirelessRange
override def owner = this
override def receivePacket(packet: Packet, distance: Double) {
if (queue.size < 20) {
queue += ForgeDirection.UNKNOWN -> packet.hop()
}
}
override protected def relayPacket(sourceSide: ForgeDirection, packet: Packet) {
super.relayPacket(sourceSide, packet)
if (sourceSide != ForgeDirection.UNKNOWN && strength > 0) {
val cost = Settings.get.wirelessCostPerRange
if (cost > 0 && !Settings.get.ignorePower) {
val connector = plugs(sourceSide.ordinal).node.asInstanceOf[Connector]
if (connector.tryChangeBuffer(-strength * cost)) {
for ((endpoint, distance) <- WirelessNetwork.computeReachableFrom(this)) {
endpoint.receivePacket(packet, distance)
}
}
}
}
}
override protected def onPlugConnect(plug: Plug, node: Node) {
super.onPlugConnect(plug, node)
if (node == plug.node) {
WirelessNetwork.add(this)
}
}
override protected def onPlugDisconnect(plug: Plug, node: Node) {
super.onPlugDisconnect(plug, node)
if (node == plug.node) {
WirelessNetwork.remove(this)
}
}
override def readFromNBT(nbt: NBTTagCompound) = {
super.readFromNBT(nbt)
if (nbt.hasKey("strength")) {
strength = nbt.getDouble("strength") max 0 min Settings.get.maxWirelessRange
}
}
override def writeToNBT(nbt: NBTTagCompound) = {
super.writeToNBT(nbt)
nbt.setDouble("strength", strength)
}
override protected def createNode(plug: Plug) = api.Network.newNode(plug, Visibility.Network).withConnector().create()
}