hack testing; RepairMessage is suitable for a progress bar for now but it needs replacing with the correct operation and the last part feels wrong

This commit is contained in:
FateJH 2017-10-03 20:32:21 -04:00
parent 7fcac7fc25
commit 249eb96cc5
2 changed files with 72 additions and 8 deletions

View file

@ -3,29 +3,58 @@ package net.psforever.objects.doors
import akka.actor.{Actor, ActorRef, Cancellable}
import net.psforever.packet.game.PlanetSideGUID
import scala.concurrent.duration._
import scala.collection.mutable.ListBuffer
import scala.annotation.tailrec
class DoorCloseControl(implicit val environment : ActorRef) extends Actor {
import DoorCloseControl._
private var doorCloser : Cancellable = DefaultCloser
private var doorCloserTrigger : Cancellable = DefaultCloser
private var openDoors : List[DoorEntry] = Nil
def receive : Receive = {
case DoorIsOpen(guid, time) =>
if(openDoors.isEmpty) {
//doorCloser = context.system.scheduler.scheduleOnce(timeout, environment, Door.DoorMessage())
openDoors = openDoors :+ DoorEntry(guid, time)
if(doorCloserTrigger.isCancelled) {
import scala.concurrent.ExecutionContext.Implicits.global
doorCloserTrigger = context.system.scheduler.scheduleOnce(timeout, self, DoorCloseControl.CloseTheDoor())
}
else {
openDoors = openDoors :+ DoorEntry(guid, time)
case CloseTheDoor() =>
doorCloserTrigger.cancel
val now : Long = System.nanoTime
recursiveCloseDoors(openDoors.iterator, now) match {
case entry :: rest =>
openDoors = entry :: rest
import scala.concurrent.ExecutionContext.Implicits.global
doorCloserTrigger = context.system.scheduler.scheduleOnce((now - entry.opened_at_time + timeout_time)*1000 milliseconds, self, DoorCloseControl.CloseTheDoor())
case Nil =>
openDoors = Nil
}
case _ => ;
}
@tailrec private def recursiveCloseDoors(iter : Iterator[DoorEntry], now : Long) : List[DoorEntry] = {
if(!iter.hasNext) {
Nil
}
else {
val entry = iter.next
if(now - entry.opened_at_time < timeout_time) {
entry +: iter.toList
}
else {
//TODO close this door entry
recursiveCloseDoors(iter, now)
}
}
}
}
object DoorCloseControl {
private final val timeout : Long = 5000L
private final val timeout_time = 5000
private final val timeout : FiniteDuration = timeout_time milliseconds
private final val DefaultCloser : Cancellable = new Cancellable() {
override def cancel : Boolean = true
@ -36,5 +65,5 @@ object DoorCloseControl {
final case class DoorIsOpen(door_guid : PlanetSideGUID, opened_at_time : Long = System.nanoTime())
final case class CloseTheDoor(door_guid : PlanetSideGUID)
private final case class CloseTheDoor()
}