From da16c10dcc80c0e679467c424d580a528ed85e76 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Wed, 29 Nov 2023 14:47:03 -0500 Subject: [PATCH 01/13] keep jamming --- .../scala/net/psforever/objects/equipment/JammingUnit.scala | 2 +- .../net/psforever/objects/vehicles/control/VehicleControl.scala | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/scala/net/psforever/objects/equipment/JammingUnit.scala b/src/main/scala/net/psforever/objects/equipment/JammingUnit.scala index dfd1d601..ac33cae0 100644 --- a/src/main/scala/net/psforever/objects/equipment/JammingUnit.scala +++ b/src/main/scala/net/psforever/objects/equipment/JammingUnit.scala @@ -253,7 +253,7 @@ trait JammableMountedWeapons extends JammableBehavior { override def StartJammeredStatus(target: Any, dur: Int): Unit = { target match { - case obj: PlanetSideServerObject with MountedWeapons with JammableUnit if !obj.Jammed => + case obj: PlanetSideServerObject with MountedWeapons with JammableUnit => JammableMountedWeaponsJammeredStatus(obj, statusCode = 1) super.StartJammeredStatus(target, dur) case _ => ; diff --git a/src/main/scala/net/psforever/objects/vehicles/control/VehicleControl.scala b/src/main/scala/net/psforever/objects/vehicles/control/VehicleControl.scala index 2cdbb12b..caf21001 100644 --- a/src/main/scala/net/psforever/objects/vehicles/control/VehicleControl.scala +++ b/src/main/scala/net/psforever/objects/vehicles/control/VehicleControl.scala @@ -859,10 +859,8 @@ class VehicleControl(vehicle: Vehicle) override def StartJammeredStatus(target: Any, dur: Int): Unit = { super.StartJammeredStatus(target, dur) val subsystems = vehicle.Subsystems() - if (!subsystems.exists { _.Jammed }) { subsystems.foreach { _.jam() } vehicleSubsystemMessages(subsystems.flatMap { _.changedMessages(vehicle) }) - } } override def CancelJammeredStatus(target: Any): Unit = { From e12cb38f228f4b462b5eee0370b73b2fe0e88cff Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Wed, 29 Nov 2023 19:27:09 -0500 Subject: [PATCH 02/13] more jam --- src/main/scala/net/psforever/objects/SensorDeployable.scala | 2 +- .../scala/net/psforever/objects/ShieldGeneratorDeployable.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/net/psforever/objects/SensorDeployable.scala b/src/main/scala/net/psforever/objects/SensorDeployable.scala index ff6d5a91..2b4fe67a 100644 --- a/src/main/scala/net/psforever/objects/SensorDeployable.scala +++ b/src/main/scala/net/psforever/objects/SensorDeployable.scala @@ -84,7 +84,7 @@ class SensorDeployableControl(sensor: SensorDeployable) override def StartJammeredStatus(target: Any, dur: Int): Unit = target match { - case obj: PlanetSideServerObject with JammableUnit if !obj.Jammed => + case obj: PlanetSideServerObject with JammableUnit => val zone = obj.Zone zone.LocalEvents ! LocalServiceMessage( zone.id, diff --git a/src/main/scala/net/psforever/objects/ShieldGeneratorDeployable.scala b/src/main/scala/net/psforever/objects/ShieldGeneratorDeployable.scala index afce1d3f..15a7cead 100644 --- a/src/main/scala/net/psforever/objects/ShieldGeneratorDeployable.scala +++ b/src/main/scala/net/psforever/objects/ShieldGeneratorDeployable.scala @@ -124,7 +124,7 @@ class ShieldGeneratorControl(gen: ShieldGeneratorDeployable) override def StartJammeredStatus(target: Any, dur: Int): Unit = target match { - case obj: PlanetSideServerObject with JammableUnit if !obj.Jammed => + case obj: PlanetSideServerObject with JammableUnit => obj.Zone.VehicleEvents ! VehicleServiceMessage( obj.Zone.id, VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, obj.GUID, 27, 1) From 1b0b15e4da9a53d6dcfb241e098b2179bc99e559 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Wed, 29 Nov 2023 20:05:45 -0500 Subject: [PATCH 03/13] slower recharge --- .../scala/net/psforever/objects/GlobalDefinitions.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/scala/net/psforever/objects/GlobalDefinitions.scala b/src/main/scala/net/psforever/objects/GlobalDefinitions.scala index b7776d09..ae8797c0 100644 --- a/src/main/scala/net/psforever/objects/GlobalDefinitions.scala +++ b/src/main/scala/net/psforever/objects/GlobalDefinitions.scala @@ -7568,7 +7568,7 @@ object GlobalDefinitions { apc_tr.UnderwaterLifespan(suffocation = 15000L, recovery = 7500L) apc_tr.Geometry = apcForm apc_tr.MaxCapacitor = 300 - apc_tr.CapacitorRecharge = 10 + apc_tr.CapacitorRecharge = 1 apc_tr.collision.avatarCollisionDamageMax = 300 apc_tr.collision.xy = CollisionXYData(Array((0.1f, 1), (0.25f, 10), (0.5f, 40), (0.75f, 70), (1f, 110))) apc_tr.collision.z = CollisionZData(Array((2f, 1), (6f, 50), (10f, 300), (12f, 1000), (13f, 3000))) @@ -7638,7 +7638,7 @@ object GlobalDefinitions { apc_nc.UnderwaterLifespan(suffocation = 15000L, recovery = 7500L) apc_nc.Geometry = apcForm apc_nc.MaxCapacitor = 300 - apc_nc.CapacitorRecharge = 10 + apc_nc.CapacitorRecharge = 1 apc_nc.collision.avatarCollisionDamageMax = 300 apc_nc.collision.xy = CollisionXYData(Array((0.1f, 1), (0.25f, 10), (0.5f, 40), (0.75f, 70), (1f, 110))) apc_nc.collision.z = CollisionZData(Array((2f, 1), (6f, 50), (10f, 300), (12f, 1000), (13f, 3000))) @@ -7708,7 +7708,7 @@ object GlobalDefinitions { apc_vs.UnderwaterLifespan(suffocation = 15000L, recovery = 7500L) apc_vs.Geometry = apcForm apc_vs.MaxCapacitor = 300 - apc_vs.CapacitorRecharge = 10 + apc_vs.CapacitorRecharge = 1 apc_vs.collision.avatarCollisionDamageMax = 300 apc_vs.collision.xy = CollisionXYData(Array((0.1f, 1), (0.25f, 10), (0.5f, 40), (0.75f, 70), (1f, 110))) apc_vs.collision.z = CollisionZData(Array((2f, 1), (6f, 50), (10f, 300), (12f, 1000), (13f, 3000))) From ebf821865a3e5c9410ad7149e6f64f9fe95f5f62 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Sat, 2 Dec 2023 20:58:50 -0500 Subject: [PATCH 04/13] no wrong health --- src/main/scala/net/psforever/objects/Vehicles.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/scala/net/psforever/objects/Vehicles.scala b/src/main/scala/net/psforever/objects/Vehicles.scala index ed661d16..c25073e0 100644 --- a/src/main/scala/net/psforever/objects/Vehicles.scala +++ b/src/main/scala/net/psforever/objects/Vehicles.scala @@ -76,10 +76,10 @@ object Vehicles { val factionChannel = s"${vehicle.Faction}" (0 to 2).foreach(group => { vehicle.PermissionGroup(group, empire) - vehicle.Zone.VehicleEvents ! VehicleServiceMessage( + /*vehicle.Zone.VehicleEvents ! VehicleServiceMessage( factionChannel, VehicleAction.SeatPermissions(Service.defaultPlayerGUID, guid, group, empire) - ) + )*/ }) ReloadAccessPermissions(vehicle, player.Name) Some(vehicle) @@ -135,10 +135,10 @@ object Vehicles { val empire = VehicleLockState.Empire.id (0 to 2).foreach(group => { vehicle.PermissionGroup(group, empire) - vehicle.Zone.VehicleEvents ! VehicleServiceMessage( + /*vehicle.Zone.VehicleEvents ! VehicleServiceMessage( s"${vehicle.Faction}", VehicleAction.SeatPermissions(pguid, vguid, group, empire) - ) + )*/ }) ReloadAccessPermissions(vehicle, player.Name) Some(vehicle) From c24e46f7356d0b525556f4121cc17068b859590a Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Thu, 7 Dec 2023 08:25:21 -0500 Subject: [PATCH 05/13] let me explore --- .../objects/avatar/PlayerControl.scala | 5 ++++- .../vehicles/control/VehicleControl.scala | 20 +++++++++++-------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala b/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala index bc6e1d01..a757e162 100644 --- a/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala +++ b/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala @@ -1309,7 +1309,10 @@ class PlayerControl(player: Player, avatarActor: typed.ActorRef[AvatarActor.Comm * @param data additional interaction information, if applicable */ def doInteractingWithDeath(obj: PlanetSideServerObject, body: PieceOfEnvironment, data: Option[OxygenStateTarget]): Unit = { - suicide() + player.History.findLast { entry => entry.isInstanceOf[ReconstructionActivity] } match { + case Some(entry) if System.currentTimeMillis() - entry.time > 3000L => suicide() + case _ => + } } //noinspection ScalaUnusedSymbol diff --git a/src/main/scala/net/psforever/objects/vehicles/control/VehicleControl.scala b/src/main/scala/net/psforever/objects/vehicles/control/VehicleControl.scala index caf21001..59d1deab 100644 --- a/src/main/scala/net/psforever/objects/vehicles/control/VehicleControl.scala +++ b/src/main/scala/net/psforever/objects/vehicles/control/VehicleControl.scala @@ -679,14 +679,18 @@ class VehicleControl(vehicle: Vehicle) */ def doInteractingWithDeath(obj: PlanetSideServerObject, body: PieceOfEnvironment, data: Option[OxygenStateTarget]): Unit = { if (!obj.Destroyed) { - PerformDamage( - vehicle, - DamageInteraction( - VehicleSource(vehicle), - SuicideReason(), - vehicle.Position - ).calculate() - ) + vehicle.History.findLast { entry => entry.isInstanceOf[SpawningActivity] } match { + case Some(entry) if System.currentTimeMillis() - entry.time > 3000L => + PerformDamage( + vehicle, + DamageInteraction( + VehicleSource(vehicle), + SuicideReason(), + vehicle.Position + ).calculate() + ) + case _ => + } } } From 0d09d9d6fc62b9b9e4f2bc1ad85d96c7adec0550 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Thu, 7 Dec 2023 12:44:45 -0500 Subject: [PATCH 06/13] adjust --- .../scala/net/psforever/objects/avatar/PlayerControl.scala | 2 +- .../psforever/objects/vehicles/control/VehicleControl.scala | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala b/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala index a757e162..8c701ef1 100644 --- a/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala +++ b/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala @@ -1310,7 +1310,7 @@ class PlayerControl(player: Player, avatarActor: typed.ActorRef[AvatarActor.Comm */ def doInteractingWithDeath(obj: PlanetSideServerObject, body: PieceOfEnvironment, data: Option[OxygenStateTarget]): Unit = { player.History.findLast { entry => entry.isInstanceOf[ReconstructionActivity] } match { - case Some(entry) if System.currentTimeMillis() - entry.time > 3000L => suicide() + case Some(entry) if System.currentTimeMillis() - entry.time > 4000L => suicide() case _ => } } diff --git a/src/main/scala/net/psforever/objects/vehicles/control/VehicleControl.scala b/src/main/scala/net/psforever/objects/vehicles/control/VehicleControl.scala index 59d1deab..29dd31ce 100644 --- a/src/main/scala/net/psforever/objects/vehicles/control/VehicleControl.scala +++ b/src/main/scala/net/psforever/objects/vehicles/control/VehicleControl.scala @@ -23,7 +23,7 @@ import net.psforever.objects.serverobject.terminals.Terminal import net.psforever.objects.sourcing.{PlayerSource, SourceEntry, VehicleSource} import net.psforever.objects.vehicles._ import net.psforever.objects.vital.interaction.{DamageInteraction, DamageResult} -import net.psforever.objects.vital.{DamagingActivity, InGameActivity, ShieldCharge, SpawningActivity, VehicleDismountActivity, VehicleMountActivity} +import net.psforever.objects.vital.{DamagingActivity, InGameActivity, ReconstructionActivity, ShieldCharge, SpawningActivity, VehicleDismountActivity, VehicleMountActivity} import net.psforever.objects.vital.environment.EnvironmentReason import net.psforever.objects.vital.etc.SuicideReason import net.psforever.objects.zones._ @@ -679,8 +679,8 @@ class VehicleControl(vehicle: Vehicle) */ def doInteractingWithDeath(obj: PlanetSideServerObject, body: PieceOfEnvironment, data: Option[OxygenStateTarget]): Unit = { if (!obj.Destroyed) { - vehicle.History.findLast { entry => entry.isInstanceOf[SpawningActivity] } match { - case Some(entry) if System.currentTimeMillis() - entry.time > 3000L => + vehicle.History.findLast { entry => entry.isInstanceOf[ReconstructionActivity] } match { + case Some(entry) if System.currentTimeMillis() - entry.time > 4000L => PerformDamage( vehicle, DamageInteraction( From 689f67ec3972466ac2d71e7c72a6d541d6435640 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Sat, 9 Dec 2023 07:08:04 -0500 Subject: [PATCH 07/13] drop the llu --- src/main/resources/zonemaps/map07.json | 6 +++--- .../services/account/AccountPersistenceService.scala | 10 ++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/resources/zonemaps/map07.json b/src/main/resources/zonemaps/map07.json index 2b34ec57..a906d291 100644 --- a/src/main/resources/zonemaps/map07.json +++ b/src/main/resources/zonemaps/map07.json @@ -8926,7 +8926,7 @@ "AbsY": 3742.29175, "AbsZ": 42.3043633, "Yaw": 198.0, - "GUID": 713, + "GUID": 715, "MapID": null, "IsChildObject": true }, @@ -8939,7 +8939,7 @@ "AbsY": 3729.643, "AbsZ": 42.3043633, "Yaw": 288.0, - "GUID": 714, + "GUID": 713, "MapID": null, "IsChildObject": true }, @@ -8952,7 +8952,7 @@ "AbsY": 3729.643, "AbsZ": 49.8043633, "Yaw": 108.0, - "GUID": 715, + "GUID": 714, "MapID": null, "IsChildObject": true }, diff --git a/src/main/scala/net/psforever/services/account/AccountPersistenceService.scala b/src/main/scala/net/psforever/services/account/AccountPersistenceService.scala index 4441cfb4..4bbcaeed 100644 --- a/src/main/scala/net/psforever/services/account/AccountPersistenceService.scala +++ b/src/main/scala/net/psforever/services/account/AccountPersistenceService.scala @@ -365,6 +365,11 @@ class PersistenceMonitor( def PerformLogout(): Unit = { (inZone.Players.find(p => p.name == name), inZone.LivePlayers.find(p => p.Name == name)) match { case (Some(avatar), Some(player)) if player.VehicleSeated.nonEmpty => + //in case the player is holding the llu and disconnects + val zone = player.Zone + val events = zone.AvatarEvents + val nameChannel = player.Name + events ! AvatarServiceMessage(nameChannel, AvatarAction.DropSpecialItem()) //alive or dead in a vehicle //if the avatar is dead while in a vehicle, they haven't released yet AvatarActor.saveAvatarData(avatar) @@ -381,6 +386,11 @@ class PersistenceMonitor( PlayerAvatarLogout(avatar, player) case (Some(avatar), Some(player)) => + //in case the player is holding the llu and disconnects + val zone = player.Zone + val events = zone.AvatarEvents + val nameChannel = player.Name + events ! AvatarServiceMessage(nameChannel, AvatarAction.DropSpecialItem()) //alive or dead, as standard Infantry AvatarActor.saveAvatarData(avatar) AvatarActor.finalSavePlayerData(player) From 35bfab5768d3d0100f957f650166363e42f46ea2 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Sat, 9 Dec 2023 14:49:06 -0500 Subject: [PATCH 08/13] passenger llu --- .../objects/serverobject/damage/DamageableMountable.scala | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/scala/net/psforever/objects/serverobject/damage/DamageableMountable.scala b/src/main/scala/net/psforever/objects/serverobject/damage/DamageableMountable.scala index 37034e7c..009aedcf 100644 --- a/src/main/scala/net/psforever/objects/serverobject/damage/DamageableMountable.scala +++ b/src/main/scala/net/psforever/objects/serverobject/damage/DamageableMountable.scala @@ -79,6 +79,11 @@ object DamageableMountable { .values .flatMap { _.occupant } .collect { case player if player.isAlive => + //make llu visible to others in zone if passenger is carrying one + val zone = player.Zone + val events = zone.AvatarEvents + val nameChannel = player.Name + events ! AvatarServiceMessage(nameChannel, AvatarAction.DropSpecialItem()) //player.LogActivity(cause) player.Actor ! Player.Die( DamageInteraction(interaction.resolution, SourceEntry(player), interaction.cause, interaction.hitPos) From 46b446048d2e9db618eded880a5726231d3d8e0f Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Sun, 10 Dec 2023 18:55:18 -0500 Subject: [PATCH 09/13] don't need vals --- .../serverobject/damage/DamageableMountable.scala | 5 +---- .../services/account/AccountPersistenceService.scala | 10 ++-------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/src/main/scala/net/psforever/objects/serverobject/damage/DamageableMountable.scala b/src/main/scala/net/psforever/objects/serverobject/damage/DamageableMountable.scala index 009aedcf..06403f5f 100644 --- a/src/main/scala/net/psforever/objects/serverobject/damage/DamageableMountable.scala +++ b/src/main/scala/net/psforever/objects/serverobject/damage/DamageableMountable.scala @@ -80,10 +80,7 @@ object DamageableMountable { .flatMap { _.occupant } .collect { case player if player.isAlive => //make llu visible to others in zone if passenger is carrying one - val zone = player.Zone - val events = zone.AvatarEvents - val nameChannel = player.Name - events ! AvatarServiceMessage(nameChannel, AvatarAction.DropSpecialItem()) + player.Zone.AvatarEvents ! AvatarServiceMessage(player.Name, AvatarAction.DropSpecialItem()) //player.LogActivity(cause) player.Actor ! Player.Die( DamageInteraction(interaction.resolution, SourceEntry(player), interaction.cause, interaction.hitPos) diff --git a/src/main/scala/net/psforever/services/account/AccountPersistenceService.scala b/src/main/scala/net/psforever/services/account/AccountPersistenceService.scala index 4bbcaeed..2576bfed 100644 --- a/src/main/scala/net/psforever/services/account/AccountPersistenceService.scala +++ b/src/main/scala/net/psforever/services/account/AccountPersistenceService.scala @@ -366,10 +366,7 @@ class PersistenceMonitor( (inZone.Players.find(p => p.name == name), inZone.LivePlayers.find(p => p.Name == name)) match { case (Some(avatar), Some(player)) if player.VehicleSeated.nonEmpty => //in case the player is holding the llu and disconnects - val zone = player.Zone - val events = zone.AvatarEvents - val nameChannel = player.Name - events ! AvatarServiceMessage(nameChannel, AvatarAction.DropSpecialItem()) + player.Zone.AvatarEvents ! AvatarServiceMessage(player.Name, AvatarAction.DropSpecialItem()) //alive or dead in a vehicle //if the avatar is dead while in a vehicle, they haven't released yet AvatarActor.saveAvatarData(avatar) @@ -387,10 +384,7 @@ class PersistenceMonitor( case (Some(avatar), Some(player)) => //in case the player is holding the llu and disconnects - val zone = player.Zone - val events = zone.AvatarEvents - val nameChannel = player.Name - events ! AvatarServiceMessage(nameChannel, AvatarAction.DropSpecialItem()) + player.Zone.AvatarEvents ! AvatarServiceMessage(player.Name, AvatarAction.DropSpecialItem()) //alive or dead, as standard Infantry AvatarActor.saveAvatarData(avatar) AvatarActor.finalSavePlayerData(player) From 213943dc1d423c44487740e2479030f395bab779 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Tue, 12 Dec 2023 12:21:33 -0500 Subject: [PATCH 10/13] cancel zoning, driver rejoin, implant --- .../actors/session/support/SessionData.scala | 2 +- .../support/WeaponAndProjectileOperations.scala | 8 ++++++-- .../session/support/ZoningOperations.scala | 16 +++------------- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/main/scala/net/psforever/actors/session/support/SessionData.scala b/src/main/scala/net/psforever/actors/session/support/SessionData.scala index 87c998a5..a4ca457d 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionData.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionData.scala @@ -219,7 +219,7 @@ class SessionData( if (isMovingPlus) { if (zoning.zoningStatus == Zoning.Status.Deconstructing) { stopDeconstructing() - } else { + } else if (zoning.zoningStatus != Zoning.Status.None) { zoning.CancelZoningProcessWithDescriptiveReason("cancel_motion") } } diff --git a/src/main/scala/net/psforever/actors/session/support/WeaponAndProjectileOperations.scala b/src/main/scala/net/psforever/actors/session/support/WeaponAndProjectileOperations.scala index 34c832e0..2e7c8484 100644 --- a/src/main/scala/net/psforever/actors/session/support/WeaponAndProjectileOperations.scala +++ b/src/main/scala/net/psforever/actors/session/support/WeaponAndProjectileOperations.scala @@ -2,6 +2,7 @@ package net.psforever.actors.session.support import akka.actor.{ActorContext, typed} +import net.psforever.objects.zones.Zoning import net.psforever.objects.zones.exp.ToDatabase import scala.collection.mutable @@ -50,7 +51,8 @@ private[support] class WeaponAndProjectileOperations( private[support] var shotsWhileDead: Int = 0 private val projectiles: Array[Option[Projectile]] = Array.fill[Option[Projectile]](Projectile.rangeUID - Projectile.baseUID)(None) - + private var zoningOpt: Option[ZoningOperations] = None + def zoning: ZoningOperations = zoningOpt.orNull /* packets */ def handleWeaponFire(pkt: WeaponFireMessage): Unit = { @@ -536,7 +538,9 @@ private[support] class WeaponAndProjectileOperations( weaponGUID: PlanetSideGUID, projectileGUID: PlanetSideGUID ): (Option[PlanetSideGameObject with Container], Option[Tool]) = { - sessionData.zoning.CancelZoningProcessWithDescriptiveReason("cancel_fire") + if (player.ZoningRequest != Zoning.Method.None) { + sessionData.zoning.CancelZoningProcessWithDescriptiveReason("cancel_fire") + } if (player.isShielded) { // Cancel NC MAX shield if it's active sessionData.toggleMaxSpecialState(enable = false) diff --git a/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala b/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala index ce23bd53..c678b180 100644 --- a/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala +++ b/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala @@ -889,7 +889,7 @@ class ZoningOperations( def beginZoningCountdown(runnable: Runnable): Unit = { val descriptor = zoningType.toString.toLowerCase if (zoningStatus == Zoning.Status.Request) { - avatarActor ! AvatarActor.DeinitializeImplants() + avatarActor ! AvatarActor.DeactivateActiveImplants() zoningStatus = Zoning.Status.Countdown val (time, origin) = ZoningStartInitialMessageAndTimer() zoningCounter = time @@ -2300,18 +2300,8 @@ class ZoningOperations( //vehicle and driver/passenger val vdef = vehicle.Definition val vguid = vehicle.GUID - val vdata = if (seat == 0) { - val seat = vehicle.Seats(0) - seat.unmount(player) - val _vdata = vdef.Packet.ConstructorData(vehicle).get - sendResponse(ObjectCreateMessage(vehicle.Definition.ObjectId, vguid, _vdata)) - seat.mount(player) - _vdata - } else { - val _vdata = vdef.Packet.ConstructorData(vehicle).get - sendResponse(ObjectCreateMessage(vehicle.Definition.ObjectId, vguid, _vdata)) - _vdata - } + val vdata = vdef.Packet.ConstructorData(vehicle).get + sendResponse(ObjectCreateMessage(vehicle.Definition.ObjectId, vguid, vdata)) Vehicles.ReloadAccessPermissions(vehicle, continent.id) log.debug(s"AvatarCreate (vehicle): ${player.Name}'s ${vehicle.Definition.Name}") log.trace(s"AvatarCreate (vehicle): ${player.Name}'s ${vehicle.Definition.Name} - $vguid -> $vdata") From f415b028a8a49281321a913673976673f25761b7 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Tue, 12 Dec 2023 22:07:16 -0500 Subject: [PATCH 11/13] last llu change? --- .../local/support/CaptureFlagManager.scala | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/scala/net/psforever/services/local/support/CaptureFlagManager.scala b/src/main/scala/net/psforever/services/local/support/CaptureFlagManager.scala index 42560209..91bf2499 100644 --- a/src/main/scala/net/psforever/services/local/support/CaptureFlagManager.scala +++ b/src/main/scala/net/psforever/services/local/support/CaptureFlagManager.scala @@ -113,6 +113,7 @@ class CaptureFlagManager(zone: Zone) extends Actor { case CaptureFlagManager.DropFlag(flag: CaptureFlag) => flag.Carrier match { case Some(player: Player) => + val newFlag = flag // Set the flag position to where the player is that dropped it flag.Position = player.Position // Remove attached player from flag @@ -121,6 +122,27 @@ class CaptureFlagManager(zone: Zone) extends Actor { flag.Zone.LocalEvents ! LocalServiceMessage(flag.Zone.id, LocalAction.SendPacket(ObjectDetachMessage(player.GUID, flag.GUID, player.Position, 0, 0, 0))) // Send dropped chat message ChatBroadcast(flag.Zone, CaptureFlagChatMessageStrings.CTF_FlagDropped(player.Name, player.Faction, flag.Owner.asInstanceOf[Building].Name), fanfare = false) + HandleFlagDespawn(flag) + // Register LLU object create task and callback to create on clients + val replacementLlu = CaptureFlag.Constructor( + newFlag.Position, + newFlag.Orientation, + newFlag.Target, + newFlag.Owner, + player.Faction + ) + // Add the flag as an amenity and track it internally + val socket = newFlag.Owner.asInstanceOf[Building].GetFlagSocket.get + socket.captureFlag = replacementLlu + TrackFlag(replacementLlu) + TaskWorkflow.execute(WorldSession.CallBackForTask( + GUIDTask.registerObject(socket.Zone.GUID, replacementLlu), + socket.Zone.LocalEvents, + LocalServiceMessage( + socket.Zone.id, + LocalAction.LluSpawned(Service.defaultPlayerGUID, replacementLlu) + ) + )) case _ => log.warn("Tried to drop flag but flag has no carrier") } From 9a8bcf9bc1e82ab705425dae73230e2663d62d31 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Thu, 14 Dec 2023 20:15:38 -0500 Subject: [PATCH 12/13] implants stay initialized --- .../actors/session/AvatarActor.scala | 66 +++++++++++++++++-- .../session/support/ZoningOperations.scala | 5 +- 2 files changed, 63 insertions(+), 8 deletions(-) diff --git a/src/main/scala/net/psforever/actors/session/AvatarActor.scala b/src/main/scala/net/psforever/actors/session/AvatarActor.scala index 013ccd21..1cd96d61 100644 --- a/src/main/scala/net/psforever/actors/session/AvatarActor.scala +++ b/src/main/scala/net/psforever/actors/session/AvatarActor.scala @@ -10,7 +10,7 @@ import net.psforever.actors.zone.ZoneActor import net.psforever.objects.avatar.scoring.{Assist, Death, EquipmentStat, KDAStat, Kill, Life, ScoreCard, SupportActivity} import net.psforever.objects.serverobject.affinity.FactionAffinity import net.psforever.objects.sourcing.VehicleSource -import net.psforever.objects.vital.InGameHistory +import net.psforever.objects.vital.{InGameHistory, ReconstructionActivity} import net.psforever.objects.vehicles.MountedWeapons import net.psforever.types.{ChatMessageType, StatisticalCategory, StatisticalElement} import org.joda.time.{LocalDateTime, Seconds} @@ -235,7 +235,7 @@ object AvatarActor { final case class SetStamina(stamina: Int) extends Command - private case class SetImplantInitialized(implantType: ImplantType) extends Command + final case class SetImplantInitialized(implantType: ImplantType) extends Command final case class MemberListRequest(action: MemberAction.Value, name: String) extends Command @@ -1588,8 +1588,66 @@ class AvatarActor( Behaviors.same case ResetImplants() => - deinitializeImplants() - initializeImplants() + val player = session.get.player + // Get time of when you spawned after a deconstruction or zoning activity. + val lastDecon: Long = player.History.findLast {entry => entry.isInstanceOf[ReconstructionActivity]} match { + case Some(entry) => entry.time + case _ => 0L + } + // Get time of when you entered the world or respawned after death. + val lastRespawn: Long = player.History.findLast {entry => entry.isInstanceOf[SpawningActivity]} match { + case Some(entry) => entry.time + case _ => 0L + } + // You didn't die. You deconstructed or changed zones via warpgate/IA/recall. + // When you respawn after death, it does both recon and spawn activities, hence the minus 3000 to make sure + // this doesn't happen at respawn after death. + if (lastDecon - 3000 > lastRespawn) { + deinitializeImplants() + val implants = avatar.implants + implants.zipWithIndex.foreach { + case (Some(implant), slot) => + sessionActor ! SessionActor.SendResponse( + CreateShortcutMessage( + session.get.player.GUID, + slot + 2, + Some(implant.definition.implantType.shortcut) + ) + ) + // If the amount of time that has passed since you entered the world or died is > how long it takes to + // initialize this implant, initialize it after 1 second. + if ((System.currentTimeMillis() / 1000) - (lastRespawn / 1000) > implant.definition.InitializationDuration) { + implantTimers(slot) = context.scheduleOnce( + 1.seconds, + context.self, + SetImplantInitialized(implant.definition.implantType) + ) + session.get.zone.AvatarEvents ! AvatarServiceMessage( + avatar.name, + AvatarAction.SendResponse(Service.defaultPlayerGUID, ActionProgressMessage(slot + 6, 0)) + ) + } + // If the implant initialization timer hasn't quite finished, calculate a reduced timer based on last spawn activity + else { + val remainingTime = (lastRespawn / 1000).seconds - (System.currentTimeMillis() / 1000).seconds + implant.definition.InitializationDuration.seconds + implantTimers(slot) = context.scheduleOnce( + remainingTime, + context.self, + SetImplantInitialized(implant.definition.implantType) + ) + session.get.zone.AvatarEvents ! AvatarServiceMessage( + avatar.name, + AvatarAction.SendResponse(Service.defaultPlayerGUID, ActionProgressMessage(slot + 6, 0)) + ) + } + case (None, _) => + } + } + // You just entered the world or died. Implants reset and timers start from scratch + else { + deinitializeImplants() + initializeImplants() + } Behaviors.same case UpdateToolDischarge(stats) => diff --git a/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala b/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala index c678b180..17731a01 100644 --- a/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala +++ b/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala @@ -2767,10 +2767,7 @@ class ZoningOperations( } val originalDeadState = deadState deadState = DeadState.Alive - if (originalDeadState != DeadState.Alive) { - avatarActor ! AvatarActor.ResetImplants() - } - + avatarActor ! AvatarActor.ResetImplants() sendResponse(PlanetsideAttributeMessage(PlanetSideGUID(0), 82, 0)) initializeShortcutsAndBank(guid) //Favorites lists From e757d8e795a3c8a30ba9c1697ba9a8305adfa87b Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Fri, 15 Dec 2023 08:35:09 -0500 Subject: [PATCH 13/13] remove old timers --- src/main/scala/net/psforever/actors/session/AvatarActor.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/scala/net/psforever/actors/session/AvatarActor.scala b/src/main/scala/net/psforever/actors/session/AvatarActor.scala index 1cd96d61..9f740303 100644 --- a/src/main/scala/net/psforever/actors/session/AvatarActor.scala +++ b/src/main/scala/net/psforever/actors/session/AvatarActor.scala @@ -1617,6 +1617,7 @@ class AvatarActor( // If the amount of time that has passed since you entered the world or died is > how long it takes to // initialize this implant, initialize it after 1 second. if ((System.currentTimeMillis() / 1000) - (lastRespawn / 1000) > implant.definition.InitializationDuration) { + implantTimers.get(slot).foreach(_.cancel()) implantTimers(slot) = context.scheduleOnce( 1.seconds, context.self, @@ -1630,6 +1631,7 @@ class AvatarActor( // If the implant initialization timer hasn't quite finished, calculate a reduced timer based on last spawn activity else { val remainingTime = (lastRespawn / 1000).seconds - (System.currentTimeMillis() / 1000).seconds + implant.definition.InitializationDuration.seconds + implantTimers.get(slot).foreach(_.cancel()) implantTimers(slot) = context.scheduleOnce( remainingTime, context.self,