blob: 7a1e0799adb9d5623453d6a1b19b26f554b8d99b [file] [log] [blame] [raw]
Florian Nücke40239422014-05-21 11:36:06 +02001package li.cil.oc.server.component
2
Florian Nücke3841fb42014-10-05 16:19:19 +02003import li.cil.oc.OpenComputers
4import li.cil.oc.Settings
5import li.cil.oc.api
Florian Nücke0005aac2014-09-19 20:14:22 +02006import li.cil.oc.api.driver.EnvironmentHost
Florian Nücke3841fb42014-10-05 16:19:19 +02007import li.cil.oc.api.machine.Arguments
8import li.cil.oc.api.machine.Callback
9import li.cil.oc.api.machine.Context
Florian Nücke40239422014-05-21 11:36:06 +020010import li.cil.oc.api.network._
Florian Nücke3841fb42014-10-05 16:19:19 +020011import li.cil.oc.api.prefab
Florian Nücke40239422014-05-21 11:36:06 +020012import li.cil.oc.common.event.ChunkloaderUpgradeHandler
Florian Nücke40239422014-05-21 11:36:06 +020013import net.minecraftforge.common.ForgeChunkManager
14import net.minecraftforge.common.ForgeChunkManager.Ticket
15
Florian Nücke3841fb42014-10-05 16:19:19 +020016class UpgradeChunkloader(val host: EnvironmentHost) extends prefab.ManagedEnvironment {
17 override val node = api.Network.newNode(this, Visibility.Network).
Florian Nücke40239422014-05-21 11:36:06 +020018 withComponent("chunkloader").
19 withConnector().
20 create()
21
22 var ticket: Option[Ticket] = None
23
24 override val canUpdate = true
25
26 override def update() {
27 super.update()
Florian Nücke5d908fc2014-09-19 19:54:44 +020028 if (host.world.getTotalWorldTime % Settings.get.tickFrequency == 0 && ticket.isDefined) {
Florian Nücke40239422014-05-21 11:36:06 +020029 if (!node.tryChangeBuffer(-Settings.get.chunkloaderCost * Settings.get.tickFrequency)) {
Florian Nücke2947ded2014-12-05 00:31:44 +010030 ticket.foreach(ticket => try ForgeChunkManager.releaseTicket(ticket) catch {
31 case _: Throwable => // Ignored.
32 })
Florian Nücke40239422014-05-21 11:36:06 +020033 ticket = None
34 }
35 }
36 }
37
Florian Nücke5e268af2014-07-11 14:10:54 +020038 @Callback(doc = """function():boolean -- Gets whether the chunkloader is currently active.""")
Florian Nücke40239422014-05-21 11:36:06 +020039 def isActive(context: Context, args: Arguments): Array[AnyRef] = result(ticket.isDefined)
40
Florian Nücke5e268af2014-07-11 14:10:54 +020041 @Callback(doc = """function(enabled:boolean):boolean -- Enables or disables the chunkloader.""")
Florian Nücke4c576a82014-07-30 17:27:37 +020042 def setActive(context: Context, args: Arguments): Array[AnyRef] = result(setActive(args.checkBoolean(0)))
Florian Nücke40239422014-05-21 11:36:06 +020043
44 override def onConnect(node: Node) {
45 super.onConnect(node)
46 if (node == this.node) {
47 ticket = ChunkloaderUpgradeHandler.restoredTickets.remove(node.address).
Florian Nücke5d908fc2014-09-19 19:54:44 +020048 orElse(host match {
49 case context: Context if context.isRunning => Option(ForgeChunkManager.requestTicket(OpenComputers, host.world, ForgeChunkManager.Type.NORMAL))
Florian Nücke4c576a82014-07-30 17:27:37 +020050 case _ => None
51 })
Florian Nücke40239422014-05-21 11:36:06 +020052 ChunkloaderUpgradeHandler.updateLoadedChunk(this)
53 }
54 }
55
56 override def onDisconnect(node: Node) {
57 super.onDisconnect(node)
58 if (node == this.node) {
Florian Nücke2947ded2014-12-05 00:31:44 +010059 ticket.foreach(ticket => try ForgeChunkManager.releaseTicket(ticket) catch {
60 case _: Throwable => // Ignored.
61 })
Florian Nücke40239422014-05-21 11:36:06 +020062 ticket = None
63 }
64 }
Florian Nücke4c576a82014-07-30 17:27:37 +020065
66 override def onMessage(message: Message) {
67 super.onMessage(message)
68 if (message.name == "computer.stopped") {
69 setActive(enabled = false)
70 }
71 else if (message.name == "computer.started") {
72 setActive(enabled = true)
73 }
74 }
75
76 private def setActive(enabled: Boolean) = {
77 if (enabled && ticket.isEmpty) {
Florian Nücke5d908fc2014-09-19 19:54:44 +020078 ticket = Option(ForgeChunkManager.requestTicket(OpenComputers, host.world, ForgeChunkManager.Type.NORMAL))
Florian Nücke4c576a82014-07-30 17:27:37 +020079 ChunkloaderUpgradeHandler.updateLoadedChunk(this)
80 }
81 else if (!enabled && ticket.isDefined) {
Florian Nücke2947ded2014-12-05 00:31:44 +010082 ticket.foreach(ticket => try ForgeChunkManager.releaseTicket(ticket) catch {
83 case _: Throwable => // Ignored.
84 })
Florian Nücke4c576a82014-07-30 17:27:37 +020085 ticket = None
86 }
87 ticket.isDefined
88 }
Florian Nücke40239422014-05-21 11:36:06 +020089}