diff --git a/common/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurret.scala b/common/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurret.scala index b0305305..082540cf 100644 --- a/common/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurret.scala +++ b/common/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurret.scala @@ -26,6 +26,7 @@ object FacilityTurret { } final case class RechargeAmmo() + final case class WeaponDischarged() import akka.actor.ActorContext /** diff --git a/common/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurretControl.scala b/common/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurretControl.scala index 4a65d656..4f139241 100644 --- a/common/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurretControl.scala +++ b/common/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurretControl.scala @@ -3,7 +3,7 @@ package net.psforever.objects.serverobject.turret import akka.actor.Actor import net.psforever.objects.ballistics.ResolvedProjectile -import net.psforever.objects.{GlobalDefinitions, Player, Tool} +import net.psforever.objects.{DefaultCancellable, GlobalDefinitions, Player, Tool} import net.psforever.objects.equipment.{Ammo, JammableMountedWeapons} import net.psforever.objects.serverobject.CommonMessages import net.psforever.objects.serverobject.mount.MountableBehavior @@ -39,10 +39,9 @@ class FacilityTurretControl(turret : FacilityTurret) extends Actor def JammableObject = turret def DamageableObject = turret def RepairableObject = turret - if(turret.Definition == GlobalDefinitions.vanu_sentry_turret) { - // todo: Schedule this to start when weapon is discharged, not all the time - context.system.scheduler.schedule(3 seconds, 200 milliseconds, self, FacilityTurret.RechargeAmmo()) - } + + // Used for timing ammo recharge for vanu turrets in caves + var weaponAmmoRechargeTimer = DefaultCancellable.obj def receive : Receive = checkBehavior .orElse(jammableBehavior) @@ -65,6 +64,13 @@ class FacilityTurretControl(turret : FacilityTurret) extends Actor case _ => ; } + case FacilityTurret.WeaponDischarged() => + if(weaponAmmoRechargeTimer != DefaultCancellable.obj) { + weaponAmmoRechargeTimer.cancel() + } + + weaponAmmoRechargeTimer = context.system.scheduler.schedule(3 seconds, 200 milliseconds, self, FacilityTurret.RechargeAmmo()) + case FacilityTurret.RechargeAmmo() => val weapon = turret.ControlledWeapon(1).get.asInstanceOf[net.psforever.objects.Tool] // recharge when last shot fired 3s delay, +1, 200ms interval @@ -77,6 +83,11 @@ class FacilityTurretControl(turret : FacilityTurret) extends Actor } } + if(weapon.Magazine == weapon.MaxMagazine && weaponAmmoRechargeTimer != DefaultCancellable.obj) { + weaponAmmoRechargeTimer.cancel() + weaponAmmoRechargeTimer = DefaultCancellable.obj + } + case _ => ; } diff --git a/pslogin/src/main/scala/WorldSessionActor.scala b/pslogin/src/main/scala/WorldSessionActor.scala index 3de9e5a3..680f58fc 100644 --- a/pslogin/src/main/scala/WorldSessionActor.scala +++ b/pslogin/src/main/scala/WorldSessionActor.scala @@ -265,7 +265,7 @@ class WorldSessionActor extends Actor def ValidObject(id : Option[PlanetSideGUID]) : Option[PlanetSideGameObject] = continent.GUID(id) match { case out@Some(obj) if obj.HasGUID => out - case None if id.nonEmpty => + case None if id.nonEmpty && id.get != PlanetSideGUID(0) => //delete stale entity reference from client log.warn(s"Player ${player.Name} has an invalid reference to GUID ${id.get} in zone ${continent.Id}.") //sendResponse(ObjectDeleteMessage(id.get, 0)) @@ -5850,6 +5850,12 @@ class WorldSessionActor extends Actor }) } projectilesToCleanUp(projectileIndex) = false + + obj match { + case turret : FacilityTurret if turret.Definition == GlobalDefinitions.vanu_sentry_turret => + turret.Actor ! FacilityTurret.WeaponDischarged() + case _ => ; + } } else { log.warn(s"WeaponFireMessage: $player's ${tool.Definition.Name} projectile is too far from owner position at time of discharge ($distanceToOwner > $acceptableDistanceToOwner); suspect")