diff --git a/src/main/scala/net/psforever/actors/session/support/SessionMountHandlers.scala b/src/main/scala/net/psforever/actors/session/support/SessionMountHandlers.scala index 261b1fed..a10cd678 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionMountHandlers.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionMountHandlers.scala @@ -8,6 +8,7 @@ import net.psforever.actors.session.AvatarActor import net.psforever.actors.zone.ZoneActor import net.psforever.objects.{GlobalDefinitions, PlanetSideGameObject, Player, Vehicle, Vehicles} import net.psforever.objects.definition.{BasicDefinition, ObjectDefinition} +import net.psforever.objects.serverobject.hackable.GenericHackables.getTurretUpgradeTime import net.psforever.objects.serverobject.mount.Mountable import net.psforever.objects.serverobject.terminals.implant.ImplantTerminalMech import net.psforever.objects.serverobject.turret.{FacilityTurret, WeaponTurret} @@ -147,7 +148,8 @@ class SessionMountHandlers( MountingAction(tplayer, obj, seatNumber) case Mountable.CanMount(obj: FacilityTurret, seatNumber, _) - if !obj.isUpgrading => + if !obj.isUpgrading || System.currentTimeMillis() - getTurretUpgradeTime >= 1500L => + obj.setMiddleOfUpgrade(false) sessionData.zoning.CancelZoningProcessWithDescriptiveReason("cancel_mount") log.info(s"${player.Name} mounts the ${obj.Definition.Name}") sendResponse(PlanetsideAttributeMessage(obj.GUID, attribute_type=0, obj.Health)) diff --git a/src/main/scala/net/psforever/objects/serverobject/hackable/GenericHackables.scala b/src/main/scala/net/psforever/objects/serverobject/hackable/GenericHackables.scala index c50e016a..1f680769 100644 --- a/src/main/scala/net/psforever/objects/serverobject/hackable/GenericHackables.scala +++ b/src/main/scala/net/psforever/objects/serverobject/hackable/GenericHackables.scala @@ -1,6 +1,7 @@ // Copyright (c) 2020 PSForever package net.psforever.objects.serverobject.hackable +import net.psforever.objects.serverobject.turret.FacilityTurret import net.psforever.objects.{Player, Vehicle} import net.psforever.objects.serverobject.{CommonMessages, PlanetSideServerObject} import net.psforever.packet.game.{HackMessage, HackState} @@ -13,7 +14,23 @@ import scala.util.{Failure, Success} object GenericHackables { private val log = org.log4s.getLogger("HackableBehavior") + private var turretUpgradeTime: Long = System.currentTimeMillis() + private var turretUpgradeTimeSet: Boolean = false + def updateTurretUpgradeTime(): Long = { + turretUpgradeTime = System.currentTimeMillis() + turretUpgradeTimeSet = true + turretUpgradeTime + } + + // Used for checking the time without updating it + def getTurretUpgradeTime: Long = { + if (!turretUpgradeTimeSet) { + turretUpgradeTime = System.currentTimeMillis() + turretUpgradeTimeSet = true + } + turretUpgradeTime + } /** * na * @@ -91,6 +108,43 @@ object GenericHackables { vis != HackState.Cancelled } + /** + * Evaluate the progress of the user applying a tool to upgrade a facility turret. + * This action is using the nano dispenser and requires separate handling from REK hacking. + * Largely a copy/paste of the above, but some of it was removed as it doesn't work/apply with upgrading a turret. + * @see `HackMessage` + * @see `HackState` + * @param progressType 1 - remote electronics kit hack (various ...); + * 2 - nano dispenser (upgrade canister) turret upgrade + * @param tplayer the player performing the action + * @param turret the object being affected + * @param tool_guid the tool being used to affest the object + * @param progress the current progress value + * @return `true`, if the next cycle of progress should occur; + * `false`, otherwise + */ + def TurretUpgradingTickAction(progressType: Int, tplayer: Player, turret: FacilityTurret, tool_guid: PlanetSideGUID)( + progress: Float + ): Boolean = { + //hack state for progress bar visibility + val vis = if (progress <= 0L) { + HackState.Start + } else if (progress >= 100L) { + HackState.Finished + } else { + updateTurretUpgradeTime() + HackState.Ongoing + } + turret.Zone.AvatarEvents ! AvatarServiceMessage( + tplayer.Name, + AvatarAction.SendResponse( + Service.defaultPlayerGUID, + HackMessage(progressType, turret.GUID, tplayer.GUID, progress.toInt, 0L, vis, 8L) + ) + ) + vis != HackState.Cancelled + } + /** * The process of hacking an object is completed. * Pass the message onto the hackable object and onto the local events system. diff --git a/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurretControl.scala b/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurretControl.scala index c3ab7e93..cca1b92e 100644 --- a/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurretControl.scala +++ b/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurretControl.scala @@ -9,6 +9,7 @@ import net.psforever.objects.serverobject.mount.{Mountable, MountableBehavior} import net.psforever.objects.serverobject.affinity.FactionAffinityBehavior import net.psforever.objects.serverobject.damage.{Damageable, DamageableWeaponTurret} import net.psforever.objects.serverobject.hackable.GenericHackables +import net.psforever.objects.serverobject.hackable.GenericHackables.getTurretUpgradeTime import net.psforever.objects.serverobject.repair.{AmenityAutoRepair, RepairableWeaponTurret} import net.psforever.objects.serverobject.structures.PoweredAmenityControl import net.psforever.objects.serverobject.terminals.capture.CaptureTerminalAwareBehavior @@ -77,10 +78,11 @@ class FacilityTurretControl(turret: FacilityTurret) if turret.Upgrade != upgrade && turret.Definition.WeaponPaths.values .flatMap(_.keySet) .exists(_ == upgrade) => + turret.setMiddleOfUpgrade(true) sender() ! CommonMessages.Progress( 1.25f, WeaponTurrets.FinishUpgradingMannedTurret(turret, player, item, upgrade), - GenericHackables.HackingTickAction(progressType = 2, player, turret, item.GUID) + GenericHackables.TurretUpgradingTickAction(progressType = 2, player, turret, item.GUID) ) case _ => ; } @@ -133,7 +135,8 @@ class FacilityTurretControl(turret: FacilityTurret) obj: PlanetSideServerObject with Mountable, seatNumber: Int, player: Player): Boolean = { - (!turret.Definition.FactionLocked || player.Faction == obj.Faction) && !obj.Destroyed + (!turret.Definition.FactionLocked || player.Faction == obj.Faction) && !obj.Destroyed && !turret.isUpgrading || + System.currentTimeMillis() - getTurretUpgradeTime >= 1500L } override protected def DamageAwareness(target: Damageable.Target, cause: DamageResult, amount: Any) : Unit = { diff --git a/src/main/scala/net/psforever/objects/serverobject/turret/WeaponTurret.scala b/src/main/scala/net/psforever/objects/serverobject/turret/WeaponTurret.scala index f9a036c4..274a409e 100644 --- a/src/main/scala/net/psforever/objects/serverobject/turret/WeaponTurret.scala +++ b/src/main/scala/net/psforever/objects/serverobject/turret/WeaponTurret.scala @@ -48,7 +48,6 @@ trait WeaponTurret def Upgrade: TurretUpgrade.Value = upgradePath def Upgrade_=(upgrade: TurretUpgrade.Value): TurretUpgrade.Value = { - middleOfUpgrade = true //blocking flag; block early var updated = false //upgrade each weapon as long as that weapon has a valid option for that upgrade Definition match { @@ -64,8 +63,6 @@ trait WeaponTurret } if (updated) { upgradePath = upgrade - } else { - middleOfUpgrade = false //reset } Upgrade } @@ -79,6 +76,10 @@ trait WeaponTurret def isUpgrading: Boolean = middleOfUpgrade + def setMiddleOfUpgrade(value: Boolean): Unit = { + middleOfUpgrade = value + } + def Definition: TurretDefinition }