From 1430d3b5849bcb42c25ef7780be920c386f05c9f Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Sun, 22 Dec 2024 15:13:32 -0500 Subject: [PATCH 01/22] variable hack timer --- src/main/resources/application.conf | 3 +++ .../objects/global/GlobalDefinitionsMiscellaneous.scala | 5 +++-- src/main/scala/net/psforever/util/Config.scala | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf index 806a23ff..d912b591 100644 --- a/src/main/resources/application.conf +++ b/src/main/resources/application.conf @@ -88,6 +88,9 @@ game { # Purchases timers for the battleframe robotics vehicles all update at the same time when either of them would update shared-bfr-cooldown = yes + # How long the countdown timer is when a facility (main overworld base) is hacked + facility-hack-time = 15.minutes + # HART system, shuttles and facilities hart { # How long the shuttle is not boarding passengers (going through the motions) diff --git a/src/main/scala/net/psforever/objects/global/GlobalDefinitionsMiscellaneous.scala b/src/main/scala/net/psforever/objects/global/GlobalDefinitionsMiscellaneous.scala index 3c465013..d60c9d5e 100644 --- a/src/main/scala/net/psforever/objects/global/GlobalDefinitionsMiscellaneous.scala +++ b/src/main/scala/net/psforever/objects/global/GlobalDefinitionsMiscellaneous.scala @@ -19,6 +19,7 @@ import net.psforever.objects.vital.base.DamageType import net.psforever.objects.vital.etc.ExplodingRadialDegrade import net.psforever.objects.vital.prop.DamageWithPosition import net.psforever.types.{ExoSuitType, Vector3} +import net.psforever.util.Config import scala.collection.mutable import scala.concurrent.duration._ @@ -485,7 +486,7 @@ object GlobalDefinitionsMiscellaneous { repair_silo.TargetValidation += EffectTarget.Category.Vehicle -> EffectTarget.Validation.RepairSilo repair_silo.Damageable = false repair_silo.Repairable = false - + recharge_terminal.Name = "recharge_terminal" recharge_terminal.Interval = 1000 recharge_terminal.UseRadius = 20 @@ -707,7 +708,7 @@ object GlobalDefinitionsMiscellaneous { capture_terminal.Name = "capture_terminal" capture_terminal.Damageable = false capture_terminal.Repairable = false - capture_terminal.FacilityHackTime = 15.minutes + capture_terminal.FacilityHackTime = Config.app.game.facilityHackTime secondary_capture.Name = "secondary_capture" secondary_capture.Damageable = false diff --git a/src/main/scala/net/psforever/util/Config.scala b/src/main/scala/net/psforever/util/Config.scala index 419e66cb..13d7d5c9 100644 --- a/src/main/scala/net/psforever/util/Config.scala +++ b/src/main/scala/net/psforever/util/Config.scala @@ -163,7 +163,8 @@ case class GameConfig( doorsCanBeOpenedByMedAppFromThisDistance: Float, experience: Experience, maxBattleRank: Int, - promotion: PromotionSystem + promotion: PromotionSystem, + facilityHackTime: FiniteDuration ) case class InstantActionConfig( From d9c913e3ffe9a2f818d9b1c2155708e57a51fee1 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Sun, 19 Jan 2025 16:37:48 -0500 Subject: [PATCH 02/22] grant exp for captures --- .../actors/session/support/SessionAvatarHandlers.scala | 7 +++++-- .../participation/FacilityHackParticipation.scala | 4 ++-- .../participation/MajorFacilityHackParticipation.scala | 8 +++++--- .../structures/participation/TowerHackParticipation.scala | 5 ++++- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala b/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala index 995f7666..1fa6bf7c 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala @@ -59,7 +59,7 @@ class SessionAvatarHandlers( //TODO squad services deactivated, participation trophy rewards for now - 11-20-2023 //must be in a squad to earn experience val charId = player.CharId - val squadUI = sessionLogic.squad.squadUI + /*val squadUI = sessionLogic.squad.squadUI val participation = continent .Building(buildingId) .map { building => @@ -117,7 +117,10 @@ class SessionAvatarHandlers( exp.ToDatabase.reportFacilityCapture(charId, buildingId, zoneNumber, modifiedExp, expType="bep") avatarActor ! AvatarActor.AwardFacilityCaptureBep(modifiedExp) Some(modifiedExp) - } + }*/ + //if not in squad (temporary) + exp.ToDatabase.reportFacilityCapture(charId, buildingId, zoneNumber, cep, expType="bep") + avatarActor ! AvatarActor.AwardFacilityCaptureBep(cep) } /** diff --git a/src/main/scala/net/psforever/objects/serverobject/structures/participation/FacilityHackParticipation.scala b/src/main/scala/net/psforever/objects/serverobject/structures/participation/FacilityHackParticipation.scala index f8521186..90c750b0 100644 --- a/src/main/scala/net/psforever/objects/serverobject/structures/participation/FacilityHackParticipation.scala +++ b/src/main/scala/net/psforever/objects/serverobject/structures/participation/FacilityHackParticipation.scala @@ -41,13 +41,13 @@ trait FacilityHackParticipation extends ParticipationLogic { .filterNot { case (_, (_, _, t)) => curr - t > hackTime } .partition { case (p, _) => uniqueList2.contains(p) } } - val newParticipaants = list + val newParticipants = list .filterNot { p => playerContribution.exists { case (u, _) => p.CharId == u } } playerContribution = vanguardParticipants.map { case (u, (p, d, _)) => (u, (p, d + 1, curr)) } ++ - newParticipaants.map { p => (p.CharId, (p, 1, curr)) } ++ + newParticipants.map { p => (p.CharId, (p, 1, curr)) } ++ missingParticipants } } diff --git a/src/main/scala/net/psforever/objects/serverobject/structures/participation/MajorFacilityHackParticipation.scala b/src/main/scala/net/psforever/objects/serverobject/structures/participation/MajorFacilityHackParticipation.scala index 6b7b3f95..634ad019 100644 --- a/src/main/scala/net/psforever/objects/serverobject/structures/participation/MajorFacilityHackParticipation.scala +++ b/src/main/scala/net/psforever/objects/serverobject/structures/participation/MajorFacilityHackParticipation.scala @@ -28,7 +28,9 @@ final case class MajorFacilityHackParticipation(building: Building) extends Faci def TryUpdate(): Unit = { val list = building.PlayersInSOI - updatePlayers(list) + if (list.nonEmpty) { + updatePlayers(list) + } val now = System.currentTimeMillis() if (now - lastInfoRequest > 60000L) { updatePopulationOverTime(list, now, before = 900000L) @@ -123,7 +125,7 @@ final case class MajorFacilityHackParticipation(building: Building) extends Faci hackStart, completionTime, opposingFaction, - contributionOpposing + contributionVictor ) ) //1) experience from killing opposingFaction across duration of hack @@ -336,7 +338,7 @@ final case class MajorFacilityHackParticipation(building: Building) extends Faci val towerRadius = math.pow(tower.Definition.SOIRadius.toDouble * 0.7d, 2d).toFloat list .map { case (p, f, kills) => - val filteredKills = kills.filter { kill => Vector3.DistanceSquared(kill.victim.Position.xy, towerPosition) <= towerRadius } + val filteredKills = kills.filter { kill => Vector3.DistanceSquared(kill.victim.Position.xy, towerPosition) >= towerRadius } (p, f, filteredKills) } .filter { case (_, _, kills) => kills.nonEmpty } diff --git a/src/main/scala/net/psforever/objects/serverobject/structures/participation/TowerHackParticipation.scala b/src/main/scala/net/psforever/objects/serverobject/structures/participation/TowerHackParticipation.scala index 824f6089..505c401a 100644 --- a/src/main/scala/net/psforever/objects/serverobject/structures/participation/TowerHackParticipation.scala +++ b/src/main/scala/net/psforever/objects/serverobject/structures/participation/TowerHackParticipation.scala @@ -11,11 +11,14 @@ import net.psforever.util.Config final case class TowerHackParticipation(building: Building) extends FacilityHackParticipation { def TryUpdate(): Unit = { val list = building.PlayersInSOI - updatePlayers(building.PlayersInSOI) + if (list.nonEmpty) { + updatePlayers(list) + } val now = System.currentTimeMillis() if (now - lastInfoRequest > 60000L) { updatePopulationOverTime(list, now, before = 300000L) } + lastInfoRequest = now } def RewardFacilityCapture( From 3969543cde5731c3fc5d89e30d514d9868ef5b1f Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Mon, 20 Jan 2025 10:41:15 -0500 Subject: [PATCH 03/22] fix resecure reward --- .../local/support/HackCaptureActor.scala | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/scala/net/psforever/services/local/support/HackCaptureActor.scala b/src/main/scala/net/psforever/services/local/support/HackCaptureActor.scala index 1a88b0e0..d561cd75 100644 --- a/src/main/scala/net/psforever/services/local/support/HackCaptureActor.scala +++ b/src/main/scala/net/psforever/services/local/support/HackCaptureActor.scala @@ -106,7 +106,7 @@ class HackCaptureActor extends Actor { NotifyHackStateChange(target, isResecured = true) building.Participation.RewardFacilityCapture( target.Faction, - faction, + HackCaptureActor.GetAttackingFaction(building, faction), hacker, facilityHackTime, hackTime, @@ -347,6 +347,30 @@ object HackCaptureActor { .get } + def GetAttackingFaction( + building: Building, + excludeThisFaction: PlanetSideEmpire.Value + ): PlanetSideEmpire.Value = { + // Use PlayerContributionRaw to calculate attacking faction + val factionEfforts = building.Participation + .PlayerContributionRaw + .values + .foldLeft(Array.fill(4)(0L)) { case (efforts, (player, duration, _)) => + val factionId = player.Faction.id + efforts.update(factionId, efforts(factionId) + duration) + efforts + } + + // Exclude the specified faction + factionEfforts.update(excludeThisFaction.id, Long.MinValue) + + // Find the faction with the highest contribution + factionEfforts.indices + .maxByOption(factionEfforts) + .map(PlanetSideEmpire.apply) + .getOrElse(PlanetSideEmpire.NEUTRAL) + } + def GetHackingFaction(terminal: CaptureTerminal): Option[PlanetSideEmpire.Value] = { terminal.HackedBy.map { a => a.player.Faction } } From ed09a9a4e5deece8f620186a9a329ec8c5a8f966 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Thu, 23 Jan 2025 13:31:21 -0500 Subject: [PATCH 04/22] reward contributors still in zone --- .../session/support/SessionAvatarHandlers.scala | 2 +- .../MajorFacilityHackParticipation.scala | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala b/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala index 1fa6bf7c..a85c2dcf 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala @@ -119,7 +119,7 @@ class SessionAvatarHandlers( Some(modifiedExp) }*/ //if not in squad (temporary) - exp.ToDatabase.reportFacilityCapture(charId, buildingId, zoneNumber, cep, expType="bep") + exp.ToDatabase.reportFacilityCapture(charId, zoneNumber, buildingId, cep, expType="bep") avatarActor ! AvatarActor.AwardFacilityCaptureBep(cep) } diff --git a/src/main/scala/net/psforever/objects/serverobject/structures/participation/MajorFacilityHackParticipation.scala b/src/main/scala/net/psforever/objects/serverobject/structures/participation/MajorFacilityHackParticipation.scala index 634ad019..230aa222 100644 --- a/src/main/scala/net/psforever/objects/serverobject/structures/participation/MajorFacilityHackParticipation.scala +++ b/src/main/scala/net/psforever/objects/serverobject/structures/participation/MajorFacilityHackParticipation.scala @@ -251,11 +251,14 @@ final case class MajorFacilityHackParticipation(building: Building) extends Faci overallTimeMultiplier * Config.app.game.experience.cep.rate + competitionBonus ).toLong - //8. reward participants - //Classically, only players in the SOI are rewarded, and the llu runner too + //8. reward participants that are still in the zone val hackerId = hacker.CharId + val contributingPlayers = contributionVictor + .filter { case (player, _, _) => player.Zone.id == building.Zone.id } + .map { case (player, _, _) => player } + .toList //terminal hacker (always cep) - if (playersInSoi.exists(_.CharId == hackerId) && flagCarrier.map(_.CharId).getOrElse(0L) != hackerId) { + if (contributingPlayers.exists(_.CharId == hackerId) && flagCarrier.map(_.CharId).getOrElse(0L) != hackerId) { ToDatabase.reportFacilityCapture( hackerId, zoneNumber, @@ -266,7 +269,7 @@ final case class MajorFacilityHackParticipation(building: Building) extends Faci events ! AvatarServiceMessage(hacker.Name, AvatarAction.AwardCep(hackerId, finalCep)) } //bystanders (cep if squad leader, bep otherwise) - playersInSoi + contributingPlayers .filterNot { _.CharId == hackerId } .foreach { player => val charId = player.CharId From c0a357974f785363cc1abb4e598ad2b7de62a68c Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Sun, 26 Jan 2025 16:25:37 -0500 Subject: [PATCH 05/22] doors change player's sideness --- .../net/psforever/objects/avatar/interaction/WithEntrance.scala | 2 +- .../objects/serverobject/environment/EnvironmentAttribute.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/net/psforever/objects/avatar/interaction/WithEntrance.scala b/src/main/scala/net/psforever/objects/avatar/interaction/WithEntrance.scala index 8263b762..9064efb1 100644 --- a/src/main/scala/net/psforever/objects/avatar/interaction/WithEntrance.scala +++ b/src/main/scala/net/psforever/objects/avatar/interaction/WithEntrance.scala @@ -65,7 +65,7 @@ class WithEntrance() obj: InteractsWithZone, door: Door ): Sidedness = { - //debugInteriorCheck(obj, door) + debugInteriorCheck(obj, door) strictInteriorCheck(obj, door) } diff --git a/src/main/scala/net/psforever/objects/serverobject/environment/EnvironmentAttribute.scala b/src/main/scala/net/psforever/objects/serverobject/environment/EnvironmentAttribute.scala index 23292395..74d9e474 100644 --- a/src/main/scala/net/psforever/objects/serverobject/environment/EnvironmentAttribute.scala +++ b/src/main/scala/net/psforever/objects/serverobject/environment/EnvironmentAttribute.scala @@ -82,7 +82,7 @@ object EnvironmentAttribute { /** only interact with living player characters or vehicles */ def canInteractWith(obj: PlanetSideGameObject): Boolean = canInteractWithPlayersAndVehicles(obj) - def testingDepth(obj: _root_.net.psforever.objects.PlanetSideGameObject): Float = 0f + def testingDepth(obj: _root_.net.psforever.objects.PlanetSideGameObject): Float = 4f } /** From a758911a261ef21fea192a749d15fc569d8b98b8 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Mon, 27 Jan 2025 13:46:32 -0500 Subject: [PATCH 06/22] comment out debugInteriorCheck --- .../net/psforever/objects/avatar/interaction/WithEntrance.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/net/psforever/objects/avatar/interaction/WithEntrance.scala b/src/main/scala/net/psforever/objects/avatar/interaction/WithEntrance.scala index 9064efb1..8263b762 100644 --- a/src/main/scala/net/psforever/objects/avatar/interaction/WithEntrance.scala +++ b/src/main/scala/net/psforever/objects/avatar/interaction/WithEntrance.scala @@ -65,7 +65,7 @@ class WithEntrance() obj: InteractsWithZone, door: Door ): Sidedness = { - debugInteriorCheck(obj, door) + //debugInteriorCheck(obj, door) strictInteriorCheck(obj, door) } From 6597e8be32051e84c698350b72655e8c94e0f75e Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Tue, 28 Jan 2025 11:55:15 -0500 Subject: [PATCH 07/22] squad kill experience --- .../actors/session/AvatarActor.scala | 2 ++ .../session/normal/AvatarHandlerLogic.scala | 3 +++ .../support/SessionAvatarHandlers.scala | 27 ++++++++++++++++++- .../services/avatar/AvatarService.scala | 9 +++++++ .../avatar/AvatarServiceMessage.scala | 1 + .../avatar/AvatarServiceResponse.scala | 1 + 6 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/main/scala/net/psforever/actors/session/AvatarActor.scala b/src/main/scala/net/psforever/actors/session/AvatarActor.scala index 1dd805e3..b0899301 100644 --- a/src/main/scala/net/psforever/actors/session/AvatarActor.scala +++ b/src/main/scala/net/psforever/actors/session/AvatarActor.scala @@ -3039,6 +3039,8 @@ class AvatarActor( if (exp > 0L) { setBep(avatar.bep + exp, msg) zone.actor ! ZoneActor.RewardOurSupporters(playerSource, historyTranscript, killStat, exp) + zone.AvatarEvents ! AvatarServiceMessage( + player.Name, AvatarAction.ShareKillExperienceWithSquad(player, exp)) } } diff --git a/src/main/scala/net/psforever/actors/session/normal/AvatarHandlerLogic.scala b/src/main/scala/net/psforever/actors/session/normal/AvatarHandlerLogic.scala index 96ef7e81..eb430a45 100644 --- a/src/main/scala/net/psforever/actors/session/normal/AvatarHandlerLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/AvatarHandlerLogic.scala @@ -473,6 +473,9 @@ class AvatarHandlerLogic(val ops: SessionAvatarHandlers, implicit val context: A case AvatarResponse.FacilityCaptureRewards(buildingId, zoneNumber, cep) => ops.facilityCaptureRewards(buildingId, zoneNumber, cep) + case AvatarResponse.ShareKillExperienceWithSquad(killer, exp) => + ops.shareKillExperienceWithSquad(killer, exp) + case AvatarResponse.SendResponse(msg) => sendResponse(msg) diff --git a/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala b/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala index a85c2dcf..37e2d03d 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala @@ -3,7 +3,7 @@ package net.psforever.actors.session.support import akka.actor.{ActorContext, typed} import net.psforever.objects.serverobject.mount.Mountable -import net.psforever.objects.{Default, PlanetSideGameObject} +import net.psforever.objects.{Default, PlanetSideGameObject, Player} import net.psforever.objects.sourcing.{PlayerSource, SourceEntry} import net.psforever.packet.game.objectcreate.ConstructorData import net.psforever.objects.zones.exp @@ -123,6 +123,31 @@ class SessionAvatarHandlers( avatarActor ! AvatarActor.AwardFacilityCaptureBep(cep) } + /** + * + * @param killer the player who got the kill + * @param exp the amount of bep they received for the kill + * Squad members of a "killer" will receive a split of the experience if they are both alive + * and in the same zone as the killer. The amount received is + * based on the size of the squad. Each squad member that meets the criteria will receive a fractional split. + */ + def shareKillExperienceWithSquad(killer: Player, exp: Long): Unit = { + //TODO consider squad experience waypoint in exp calculation + val squadUI = sessionLogic.squad.squadUI + val squadSize = squadUI.size + if (squadSize > 1) { + val expSplit = exp / squadSize + val squadMembers = squadUI.filterNot(_._1 == killer.CharId).map { case (_, member) => member }.toList.map(_.name) + val playersInZone = killer.Zone.Players.map { avatar => (avatar.id, avatar.basic.name) } + val squadMembersHere = playersInZone.filter(member => squadMembers.contains(member._2)) + squadMembersHere.foreach { member => + killer.Zone.AvatarEvents ! AvatarServiceMessage( + member._2, + AvatarAction.AwardBep(member._1, expSplit, ExperienceType.Normal)) + } + } + } + /** * Properly format a `DestroyDisplayMessage` packet * given sufficient information about a target (victim) and an actor (killer). diff --git a/src/main/scala/net/psforever/services/avatar/AvatarService.scala b/src/main/scala/net/psforever/services/avatar/AvatarService.scala index d7e585f0..f61e4394 100644 --- a/src/main/scala/net/psforever/services/avatar/AvatarService.scala +++ b/src/main/scala/net/psforever/services/avatar/AvatarService.scala @@ -458,6 +458,15 @@ class AvatarService(zone: Zone) extends Actor { ) ) + case AvatarAction.ShareKillExperienceWithSquad(killer, exp) => + AvatarEvents.publish( + AvatarServiceResponse( + s"/$forChannel/Avatar", + Service.defaultPlayerGUID, + AvatarResponse.ShareKillExperienceWithSquad(killer, exp) + ) + ) + case _ => () } diff --git a/src/main/scala/net/psforever/services/avatar/AvatarServiceMessage.scala b/src/main/scala/net/psforever/services/avatar/AvatarServiceMessage.scala index ec2959b1..5cea9482 100644 --- a/src/main/scala/net/psforever/services/avatar/AvatarServiceMessage.scala +++ b/src/main/scala/net/psforever/services/avatar/AvatarServiceMessage.scala @@ -160,6 +160,7 @@ object AvatarAction { final case class AwardBep(charId: Long, bep: Long, expType: ExperienceType) extends Action final case class AwardCep(charId: Long, bep: Long) extends Action final case class FacilityCaptureRewards(building_id: Int, zone_number: Int, exp: Long) extends Action + final case class ShareKillExperienceWithSquad(killer: Player, exp: Long) extends Action final case class TeardownConnection() extends Action // final case class PlayerStateShift(killer : PlanetSideGUID, victim : PlanetSideGUID) extends Action diff --git a/src/main/scala/net/psforever/services/avatar/AvatarServiceResponse.scala b/src/main/scala/net/psforever/services/avatar/AvatarServiceResponse.scala index 897d105b..5c26d9a0 100644 --- a/src/main/scala/net/psforever/services/avatar/AvatarServiceResponse.scala +++ b/src/main/scala/net/psforever/services/avatar/AvatarServiceResponse.scala @@ -132,4 +132,5 @@ object AvatarResponse { final case class AwardBep(charId: Long, bep: Long, expType: ExperienceType) extends Response final case class AwardCep(charId: Long, bep: Long) extends Response final case class FacilityCaptureRewards(building_id: Int, zone_number: Int, exp: Long) extends Response + final case class ShareKillExperienceWithSquad(killer: Player, exp: Long) extends Response } From 53ba117f233083a35a7b1138c9908365ce360687 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Wed, 29 Jan 2025 12:55:34 -0500 Subject: [PATCH 08/22] include towers --- src/main/scala/net/psforever/actors/zone/ZoneActor.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/scala/net/psforever/actors/zone/ZoneActor.scala b/src/main/scala/net/psforever/actors/zone/ZoneActor.scala index 63bf8170..c5747619 100644 --- a/src/main/scala/net/psforever/actors/zone/ZoneActor.scala +++ b/src/main/scala/net/psforever/actors/zone/ZoneActor.scala @@ -182,7 +182,8 @@ class ZoneActor( case ZoneMapUpdate() => zone.Buildings - .filter(_._2.BuildingType == StructureType.Facility) + .filter(building => + building._2.BuildingType == StructureType.Facility || building._2.BuildingType == StructureType.Tower) .values .foreach(_.Actor ! BuildingActor.MapUpdate()) Behaviors.same From a685f71d6ed85d7249bca29e5047677e972bbe88 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Thu, 30 Jan 2025 12:11:13 -0500 Subject: [PATCH 09/22] killed player lifespan calculation --- src/main/scala/net/psforever/objects/zones/exp/Support.scala | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/scala/net/psforever/objects/zones/exp/Support.scala b/src/main/scala/net/psforever/objects/zones/exp/Support.scala index 0233426c..1ad7ead6 100644 --- a/src/main/scala/net/psforever/objects/zones/exp/Support.scala +++ b/src/main/scala/net/psforever/objects/zones/exp/Support.scala @@ -29,8 +29,13 @@ object Support { //setup val historyList = history.toList val withKills = victim.progress.kills.nonEmpty + //TODO Issue #1259 - Use another method to capture time of death than current time ("kill shots" aren't working) + /* val fullLifespan = (historyList.headOption, historyList.lastOption) match { case (Some(spawn), Some(death)) => death.time - spawn.time + */ + val fullLifespan = historyList.headOption match { + case Some(spawn) => System.currentTimeMillis() - spawn.time case _ => 0L } val recordOfWornTimes = countTimeWhileExoSuitOrMounted(historyList) From dd87d5da89baf0c4f9b8e943763512aa5822cd40 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Sun, 2 Feb 2025 21:33:32 -0500 Subject: [PATCH 10/22] misc deployables fixes --- .../session/support/ZoningOperations.scala | 5 +++++ .../objects/ce/DeployableBehavior.scala | 18 ++++++++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) 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 5e7501c3..cdbb2cdc 100644 --- a/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala +++ b/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala @@ -2494,6 +2494,11 @@ class ZoningOperations( reclaimOurDeployables(continent.DeployableList, player.Name, reassignDeployablesTo(player.GUID)) ) ) + //do this to make my deployed telepad appear that way + continent.Vehicles.filter(router => router.Definition == GlobalDefinitions.router && router.OwnerName.contains(player.Name)) + .foreach { obj => + sessionLogic.general.toggleTeleportSystem(obj, TelepadLike.AppraiseTeleportationSystem(obj, continent)) + } //begin looking for conditions to set the avatar context.system.scheduler.scheduleOnce(delay = 250 millisecond, context.self, SessionActor.SetCurrentAvatar(player, 200)) } diff --git a/src/main/scala/net/psforever/objects/ce/DeployableBehavior.scala b/src/main/scala/net/psforever/objects/ce/DeployableBehavior.scala index b363b63e..dc5bd06f 100644 --- a/src/main/scala/net/psforever/objects/ce/DeployableBehavior.scala +++ b/src/main/scala/net/psforever/objects/ce/DeployableBehavior.scala @@ -68,7 +68,7 @@ trait DeployableBehavior { if DeployableObject.OwnerGuid.nonEmpty => val obj = DeployableObject if (constructed.contains(true)) { - loseOwnership(obj, PlanetSideEmpire.NEUTRAL) + loseOwnership(obj, obj.Faction) } else { obj.OwnerGuid = None } @@ -290,11 +290,17 @@ object DeployableBehavior { originalFaction.toString, LocalAction.DeployableMapIcon(Service.defaultPlayerGUID, DeploymentAction.Dismiss, info) ) + //remove deployable from original owner's toolbox and UI counter + zone.AllPlayers.filter(p => obj.OriginalOwnerName.contains(p.Name)) + .foreach { originalOwner => + originalOwner.avatar.deployables.Remove(obj) + originalOwner.Zone.LocalEvents ! LocalServiceMessage(originalOwner.Name, LocalAction.DeployableUIFor(obj.Definition.Item)) + } + //display to the given faction + localEvents ! LocalServiceMessage( + toFaction.toString, + LocalAction.DeployableMapIcon(Service.defaultPlayerGUID, DeploymentAction.Build, info) + ) } - //display to the given faction - localEvents ! LocalServiceMessage( - toFaction.toString, - LocalAction.DeployableMapIcon(Service.defaultPlayerGUID, DeploymentAction.Build, info) - ) } } From e9336f52a6e40d8a8f68720565e2876d739f5c69 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Mon, 3 Feb 2025 06:46:22 -0500 Subject: [PATCH 11/22] boomers still go neutral --- .../net/psforever/objects/ce/DeployableBehavior.scala | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/scala/net/psforever/objects/ce/DeployableBehavior.scala b/src/main/scala/net/psforever/objects/ce/DeployableBehavior.scala index dc5bd06f..fbdfa85c 100644 --- a/src/main/scala/net/psforever/objects/ce/DeployableBehavior.scala +++ b/src/main/scala/net/psforever/objects/ce/DeployableBehavior.scala @@ -68,7 +68,12 @@ trait DeployableBehavior { if DeployableObject.OwnerGuid.nonEmpty => val obj = DeployableObject if (constructed.contains(true)) { - loseOwnership(obj, obj.Faction) + if (obj.Definition.DeployCategory == DeployableCategory.Boomers) { + loseOwnership(obj, PlanetSideEmpire.NEUTRAL) + } + else { + loseOwnership(obj, obj.Faction) + } } else { obj.OwnerGuid = None } From 009e9bc3617b720b94beba82f062249b97a83d48 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Wed, 19 Feb 2025 21:49:17 -0500 Subject: [PATCH 12/22] lock the driver door --- .../actors/session/support/ZoningOperations.scala | 10 +++++++--- src/main/scala/net/psforever/objects/Vehicles.scala | 4 +++- 2 files changed, 10 insertions(+), 4 deletions(-) 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 cdbb2cdc..49bb0833 100644 --- a/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala +++ b/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala @@ -2495,9 +2495,13 @@ class ZoningOperations( ) ) //do this to make my deployed telepad appear that way - continent.Vehicles.filter(router => router.Definition == GlobalDefinitions.router && router.OwnerName.contains(player.Name)) - .foreach { obj => - sessionLogic.general.toggleTeleportSystem(obj, TelepadLike.AppraiseTeleportationSystem(obj, continent)) + if (continent.DeployableList.exists(telepad => telepad.Definition == GlobalDefinitions.router_telepad_deployable + && telepad.OwnerName.contains(player.Name))) + { + continent.Vehicles.filter(router => router.Definition == GlobalDefinitions.router && router.Faction == player.Faction) + .foreach { obj => + sessionLogic.general.toggleTeleportSystem(obj, TelepadLike.AppraiseTeleportationSystem(obj, continent)) + } } //begin looking for conditions to set the avatar context.system.scheduler.scheduleOnce(delay = 250 millisecond, context.self, SessionActor.SetCurrentAvatar(player, 200)) diff --git a/src/main/scala/net/psforever/objects/Vehicles.scala b/src/main/scala/net/psforever/objects/Vehicles.scala index 6a66afe3..259dc284 100644 --- a/src/main/scala/net/psforever/objects/Vehicles.scala +++ b/src/main/scala/net/psforever/objects/Vehicles.scala @@ -42,11 +42,13 @@ object Vehicles { case Some(tplayer) => tplayer.avatar.vehicle = Some(vehicle.GUID) vehicle.AssignOwnership(playerOpt) + val locked = VehicleLockState.Locked.id + Array(0, 3).foreach(group => vehicle.PermissionGroup(group, locked)) + Vehicles.ReloadAccessPermissions(vehicle, tplayer.Faction.toString) vehicle.Zone.VehicleEvents ! VehicleServiceMessage( vehicle.Zone.id, VehicleAction.Ownership(tplayer.GUID, vehicle.GUID) ) - Vehicles.ReloadAccessPermissions(vehicle, tplayer.Faction.toString) Some(vehicle) case None => None From 4600e5ebc3decd972fdfa7d1597bc832cb494fb5 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Wed, 21 May 2025 07:23:07 -0400 Subject: [PATCH 13/22] slower captureall, squads off, log typo fix --- .../session/csr/SquadHandlerLogic.scala | 12 ++++---- .../session/normal/SquadHandlerLogic.scala | 8 ++--- .../session/support/ChatOperations.scala | 30 +++++++++++++++---- .../WeaponAndProjectileOperations.scala | 2 +- 4 files changed, 36 insertions(+), 16 deletions(-) diff --git a/src/main/scala/net/psforever/actors/session/csr/SquadHandlerLogic.scala b/src/main/scala/net/psforever/actors/session/csr/SquadHandlerLogic.scala index f6be5623..70e78962 100644 --- a/src/main/scala/net/psforever/actors/session/csr/SquadHandlerLogic.scala +++ b/src/main/scala/net/psforever/actors/session/csr/SquadHandlerLogic.scala @@ -28,21 +28,21 @@ class SquadHandlerLogic(val ops: SessionSquadHandlers, implicit val context: Act /* packet */ def handleSquadDefinitionAction(pkt: SquadDefinitionActionMessage): Unit = { - if (!player.spectator) { - val SquadDefinitionActionMessage(u1, u2, action) = pkt - squadService ! SquadServiceMessage(player, continent, SquadServiceAction.Definition(u1, u2, action)) - } + /*if (!player.spectator) { + val SquadDefinitionActionMessage(u1, u2, action) = pkt + squadService ! SquadServiceMessage(player, continent, SquadServiceAction.Definition(u1, u2, action)) + }*/ } def handleSquadMemberRequest(pkt: SquadMembershipRequest): Unit = { - if (!player.spectator) { + /* if (!player.spectator) { val SquadMembershipRequest(request_type, char_id, unk3, player_name, unk5) = pkt squadService ! SquadServiceMessage( player, continent, SquadServiceAction.Membership(request_type, char_id, unk3, player_name, unk5) ) - } + }*/ } def handleSquadWaypointRequest(pkt: SquadWaypointRequest): Unit = { diff --git a/src/main/scala/net/psforever/actors/session/normal/SquadHandlerLogic.scala b/src/main/scala/net/psforever/actors/session/normal/SquadHandlerLogic.scala index 71bbc20a..b80eb01c 100644 --- a/src/main/scala/net/psforever/actors/session/normal/SquadHandlerLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/SquadHandlerLogic.scala @@ -28,17 +28,17 @@ class SquadHandlerLogic(val ops: SessionSquadHandlers, implicit val context: Act /* packet */ def handleSquadDefinitionAction(pkt: SquadDefinitionActionMessage): Unit = { - val SquadDefinitionActionMessage(u1, u2, action) = pkt - squadService ! SquadServiceMessage(player, continent, SquadServiceAction.Definition(u1, u2, action)) + /*val SquadDefinitionActionMessage(u1, u2, action) = pkt + squadService ! SquadServiceMessage(player, continent, SquadServiceAction.Definition(u1, u2, action))*/ } def handleSquadMemberRequest(pkt: SquadMembershipRequest): Unit = { - val SquadMembershipRequest(request_type, char_id, unk3, player_name, unk5) = pkt + /*val SquadMembershipRequest(request_type, char_id, unk3, player_name, unk5) = pkt squadService ! SquadServiceMessage( player, continent, SquadServiceAction.Membership(request_type, char_id, unk3, player_name, unk5) - ) + )*/ } def handleSquadWaypointRequest(pkt: SquadWaypointRequest): Unit = { diff --git a/src/main/scala/net/psforever/actors/session/support/ChatOperations.scala b/src/main/scala/net/psforever/actors/session/support/ChatOperations.scala index 0e72be69..3a585f7b 100644 --- a/src/main/scala/net/psforever/actors/session/support/ChatOperations.scala +++ b/src/main/scala/net/psforever/actors/session/support/ChatOperations.scala @@ -15,6 +15,7 @@ import net.psforever.services.local.{LocalAction, LocalServiceMessage} import net.psforever.types.ChatMessageType.CMT_QUIT import org.log4s.Logger +import java.util.concurrent.{Executors, TimeUnit} import scala.annotation.unused import scala.collection.{Seq, mutable} import scala.concurrent.duration._ @@ -59,6 +60,7 @@ class ChatOperations( private var channels: List[ChatChannel] = List() private var silenceTimer: Cancellable = Default.Cancellable private[session] var transitoryCommandEntered: Option[ChatMessageType] = None + private val scheduler = Executors.newScheduledThreadPool(2) /** * when another player is listed as one of our ignored players, * and that other player sends an emote, @@ -352,8 +354,25 @@ class ChatOperations( //evaluate results (resolvedFacilities, resolvedFaction, resolvedTimer) match { case (Some(buildings), Some(faction), Some(_)) => - buildings.foreach { building => //TODO implement timer + //schedule processing of buildings with a delay + processBuildingsWithDelay(buildings, faction, 1000) //delay of 1000ms between each building operation + true + case _ => + false + } + } + + def processBuildingsWithDelay( + buildings: Seq[Building], + faction: PlanetSideEmpire.Value, + delayMillis: Long + ): Unit = { + val buildingIterator = buildings.iterator + scheduler.scheduleAtFixedRate( + () => { + if (buildingIterator.hasNext) { + val building = buildingIterator.next() val terminal = building.CaptureTerminal.get val zone = building.Zone val zoneActor = zone.actor @@ -373,10 +392,11 @@ class ChatOperations( //push for map updates again zoneActor ! ZoneActor.ZoneMapUpdate() } - true - case _ => - false - } + }, + 0, + delayMillis, + TimeUnit.MILLISECONDS + ) } def commandVoice(session: Session, message: ChatMsg, contents: String, toChannel: ChatChannel): Unit = { 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 5633e76f..5ade93f0 100644 --- a/src/main/scala/net/psforever/actors/session/support/WeaponAndProjectileOperations.scala +++ b/src/main/scala/net/psforever/actors/session/support/WeaponAndProjectileOperations.scala @@ -343,7 +343,7 @@ class WeaponAndProjectileOperations( case citem: ConstructionItem => log.info(s"${player.Name} switched ${player.Sex.possessive} ${obj.Definition.Name} to construct ${citem.AmmoType} (mode #$modeIndex)") case _ => - log.info(s"${player.Name} changed ${player.Sex.possessive} her ${obj.Definition.Name}'s fire mode to #$modeIndex") + log.info(s"${player.Name} changed ${player.Sex.possessive} ${obj.Definition.Name}'s fire mode to #$modeIndex") } sendResponse(ChangeFireModeMessage(item_guid, modeIndex)) continent.AvatarEvents ! AvatarServiceMessage( From 9590ac4721cdb781e9c1e7c86b96fad8a4527ef8 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Wed, 21 May 2025 16:10:54 -0400 Subject: [PATCH 14/22] all weapons and vehicles on Deso --- .../overrides/game_objects31.adb.lst | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/server/src/main/resources/overrides/game_objects31.adb.lst b/server/src/main/resources/overrides/game_objects31.adb.lst index 86dcd92e..d0101a6e 100644 --- a/server/src/main/resources/overrides/game_objects31.adb.lst +++ b/server/src/main/resources/overrides/game_objects31.adb.lst @@ -156,3 +156,101 @@ add_property portable_order_terminal forsale_six_shooter ordertype_weapon add_property portable_order_terminal forsale_six_shooter_ammo add_property portable_order_terminal forsale_winchester ordertype_weapon add_property portable_order_terminal forsale_winchester_ammo +add_property bullet_105mm purchase_empire all +add_property bullet_150mm purchase_empire all +add_property bullet_15mm purchase_empire all +add_property anniversary_gun purchase_empire all +add_property anniversary_guna purchase_empire all +add_property anniversary_gunb purchase_empire all +add_property apc_nc purchase_empire all +add_property apc_tr purchase_empire all +add_property apc_vs purchase_empire all +add_property aphelion purchase_empire all +add_property aphelion_flight purchase_empire all +add_property aphelion_gunner purchase_empire all +add_property aphelion_armor_siphon purchase_empire all +add_property aphelion_immolation_cannon purchase_empire all +add_property aphelion_immolation_cannon_ammo purchase_empire all +add_property aphelion_laser purchase_empire all +add_property aphelion_laser_ammo purchase_empire all +add_property aphelion_ntu_siphon purchase_empire all +add_property aphelion_plasma_rocket_ammo purchase_empire all +add_property aphelion_plasma_rocket_pod purchase_empire all +add_property aphelion_ppa purchase_empire all +add_property aphelion_ppa_ammo purchase_empire all +add_property aphelion_starfire purchase_empire all +add_property aphelion_starfire_ammo purchase_empire all +add_property aurora purchase_empire all +add_property battlewagon purchase_empire all +add_property beamer purchase_empire all +add_property burster_ammo purchase_empire all +add_property colossus purchase_empire all +add_property colossus_flight purchase_empire all +add_property colossus_gunner purchase_empire all +add_property colossus_100mm_cannon_ammo purchase_empire all +add_property colossus_armor_siphon purchase_empire all +add_property colossus_burster purchase_empire all +add_property colossus_burster_ammo purchase_empire all +add_property colossus_chaingun purchase_empire all +add_property colossus_chaingun_ammo purchase_empire all +add_property colossus_cluster_bomb_ammo purchase_empire all +add_property colossus_cluster_bomb_pod purchase_empire all +add_property colossus_dual_100mm_cannons purchase_empire all +add_property colossus_ntu_siphon purchase_empire all +add_property colossus_tank_cannon purchase_empire all +add_property colossus_tank_cannon_ammo purchase_empire all +add_property comet_ammo purchase_empire all +add_property cycler purchase_empire all +add_property cycler_v2 purchase_empire all +add_property cycler_v3 purchase_empire all +add_property cycler_v4 purchase_empire all +add_property dualcycler_ammo purchase_empire all +add_property energy_cell purchase_empire all +add_property falcon_ammo purchase_empire all +add_property firebird_missile purchase_empire all +add_property flux_cannon_thresher_battery purchase_empire all +add_property fluxpod_ammo purchase_empire all +add_property gauss purchase_empire all +add_property gauss_cannon_ammo purchase_empire all +add_property heavy_rail_beam_battery purchase_empire all +add_property hunter_seeker_missile purchase_empire all +add_property hunterseeker purchase_empire all +add_property isp purchase_empire all +add_property lancer purchase_empire all +add_property lancer_cartridge purchase_empire all +add_property lasher purchase_empire all +add_property magrider purchase_empire all +add_property mini_chaingun purchase_empire all +add_property peregrine purchase_empire all +add_property peregrine_flight purchase_empire all +add_property peregrine_gunner purchase_empire all +add_property peregrine_armor_siphon purchase_empire all +add_property peregrine_dual_machine_gun purchase_empire all +add_property peregrine_dual_machine_gun_ammo purchase_empire all +add_property peregrine_dual_rocket_pods purchase_empire all +add_property peregrine_mechhammer purchase_empire all +add_property peregrine_mechhammer_ammo purchase_empire all +add_property peregrine_ntu_siphon purchase_empire all +add_property peregrine_particle_cannon purchase_empire all +add_property peregrine_particle_cannon_ammo purchase_empire all +add_property peregrine_rocket_pod_ammo purchase_empire all +add_property peregrine_sparrow purchase_empire all +add_property peregrine_sparrow_ammo purchase_empire all +add_property phoenix_missile purchase_empire all +add_property pounder_ammo purchase_empire all +add_property prowler purchase_empire all +add_property pulsar purchase_empire all +add_property pulse_battery purchase_empire all +add_property quasar_ammo purchase_empire all +add_property r_shotgun purchase_empire all +add_property repeater purchase_empire all +add_property scattercannon_ammo purchase_empire all +add_property sparrow_ammo purchase_empire all +add_property starfire_ammo purchase_empire all +add_property striker purchase_empire all +add_property striker_missile_ammo purchase_empire all +add_property threemanheavybuggy purchase_empire all +add_property thunderer purchase_empire all +add_property twomanheavybuggy purchase_empire all +add_property twomanhoverbuggy purchase_empire all +add_property vanguard purchase_empire all From 0621cb4fcd21fd8b1ad5661ba895f09c90e6068d Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Thu, 22 May 2025 09:20:30 -0400 Subject: [PATCH 15/22] allow enemy equip in fav --- .../scala/net/psforever/objects/avatar/PlayerControl.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala b/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala index ee5fef56..16df2a05 100644 --- a/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala +++ b/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala @@ -448,11 +448,11 @@ class PlayerControl(player: Player, avatarActor: typed.ActorRef[AvatarActor.Comm //loadout for a MAX player.ResistArmMotion(PlayerControl.maxRestriction) player.DrawnSlot = Player.HandsDownSlot - (newHolsters.filter(_.start == 4), newInventory.filterNot(dropPred)) + (newHolsters.filter(_.start == 4), newInventory) } else { //loadout for a vanilla exo-suit player.ResistArmMotion(Player.neverRestrict) - (newHolsters.filterNot(dropPred), newInventory.filterNot(dropPred)) + (newHolsters, newInventory) } } else { //proposed loadout conforms to a different inventory layout than the projected exo-suit @@ -460,7 +460,7 @@ class PlayerControl(player: Player, avatarActor: typed.ActorRef[AvatarActor.Comm //holsters (matching holsters will be inserted, the rest will deposited into the inventory) val (finalHolsters, leftoversForInventory) = Players.fillEmptyHolsters( player.Holsters().iterator, - (newHolsters.filterNot(_.obj.Size == EquipmentSize.Max) ++ newInventory).filterNot(dropPred) + (newHolsters.filterNot(_.obj.Size == EquipmentSize.Max) ++ newInventory) ) //inventory (items will be placed to accommodate the change, or dropped) val (finalInventory, _) = GridInventory.recoverInventory(leftoversForInventory, player.Inventory) From 5d00a10e80fe168f4fa84aaee669aa475acb8d1c Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Thu, 22 May 2025 12:08:56 -0400 Subject: [PATCH 16/22] don't drop --- .../scala/net/psforever/objects/avatar/PlayerControl.scala | 6 +++--- .../serverobject/containable/ContainableBehavior.scala | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala b/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala index 16df2a05..ee5fef56 100644 --- a/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala +++ b/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala @@ -448,11 +448,11 @@ class PlayerControl(player: Player, avatarActor: typed.ActorRef[AvatarActor.Comm //loadout for a MAX player.ResistArmMotion(PlayerControl.maxRestriction) player.DrawnSlot = Player.HandsDownSlot - (newHolsters.filter(_.start == 4), newInventory) + (newHolsters.filter(_.start == 4), newInventory.filterNot(dropPred)) } else { //loadout for a vanilla exo-suit player.ResistArmMotion(Player.neverRestrict) - (newHolsters, newInventory) + (newHolsters.filterNot(dropPred), newInventory.filterNot(dropPred)) } } else { //proposed loadout conforms to a different inventory layout than the projected exo-suit @@ -460,7 +460,7 @@ class PlayerControl(player: Player, avatarActor: typed.ActorRef[AvatarActor.Comm //holsters (matching holsters will be inserted, the rest will deposited into the inventory) val (finalHolsters, leftoversForInventory) = Players.fillEmptyHolsters( player.Holsters().iterator, - (newHolsters.filterNot(_.obj.Size == EquipmentSize.Max) ++ newInventory) + (newHolsters.filterNot(_.obj.Size == EquipmentSize.Max) ++ newInventory).filterNot(dropPred) ) //inventory (items will be placed to accommodate the change, or dropped) val (finalInventory, _) = GridInventory.recoverInventory(leftoversForInventory, player.Inventory) diff --git a/src/main/scala/net/psforever/objects/serverobject/containable/ContainableBehavior.scala b/src/main/scala/net/psforever/objects/serverobject/containable/ContainableBehavior.scala index d3680de9..04ffa27a 100644 --- a/src/main/scala/net/psforever/objects/serverobject/containable/ContainableBehavior.scala +++ b/src/main/scala/net/psforever/objects/serverobject/containable/ContainableBehavior.scala @@ -678,8 +678,8 @@ object ContainableBehavior { val faction = GlobalDefinitions.isFactionEquipment(objDef) GlobalDefinitions.isCavernEquipment(objDef) || objDef == GlobalDefinitions.router_telepad || - entry.obj.isInstanceOf[BoomerTrigger] || - (faction != tplayer.Faction && faction != PlanetSideEmpire.NEUTRAL) + entry.obj.isInstanceOf[BoomerTrigger] /*|| + (faction != tplayer.Faction && faction != PlanetSideEmpire.NEUTRAL)*/ } } From bc978f177be6cd6dd1b5858d65d3e13ba1e4eee4 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Mon, 26 May 2025 07:17:26 -0400 Subject: [PATCH 17/22] normal minus bfr --- .../resources/overrides/game_objects0.adb.lst | 9 ++ .../overrides/game_objects31.adb.lst | 98 ------------------- .../containable/ContainableBehavior.scala | 4 +- 3 files changed, 11 insertions(+), 100 deletions(-) diff --git a/server/src/main/resources/overrides/game_objects0.adb.lst b/server/src/main/resources/overrides/game_objects0.adb.lst index 5e08278e..d476e61a 100644 --- a/server/src/main/resources/overrides/game_objects0.adb.lst +++ b/server/src/main/resources/overrides/game_objects0.adb.lst @@ -96,3 +96,12 @@ add_property suppressor holstertime 600 add_property trek equiptime 500 add_property trek holstertime 500 add_property vulture requirement_award0 false +add_property aphelion allowed false +add_property aphelion_flight allowed false +add_property aphelion_gunner allowed false +add_property colossus allowed false +add_property colossus_flight allowed false +add_property colossus_gunner allowed false +add_property peregrine allowed false +add_property peregrine_flight allowed false +add_property peregrine_gunner allowed false diff --git a/server/src/main/resources/overrides/game_objects31.adb.lst b/server/src/main/resources/overrides/game_objects31.adb.lst index d0101a6e..86dcd92e 100644 --- a/server/src/main/resources/overrides/game_objects31.adb.lst +++ b/server/src/main/resources/overrides/game_objects31.adb.lst @@ -156,101 +156,3 @@ add_property portable_order_terminal forsale_six_shooter ordertype_weapon add_property portable_order_terminal forsale_six_shooter_ammo add_property portable_order_terminal forsale_winchester ordertype_weapon add_property portable_order_terminal forsale_winchester_ammo -add_property bullet_105mm purchase_empire all -add_property bullet_150mm purchase_empire all -add_property bullet_15mm purchase_empire all -add_property anniversary_gun purchase_empire all -add_property anniversary_guna purchase_empire all -add_property anniversary_gunb purchase_empire all -add_property apc_nc purchase_empire all -add_property apc_tr purchase_empire all -add_property apc_vs purchase_empire all -add_property aphelion purchase_empire all -add_property aphelion_flight purchase_empire all -add_property aphelion_gunner purchase_empire all -add_property aphelion_armor_siphon purchase_empire all -add_property aphelion_immolation_cannon purchase_empire all -add_property aphelion_immolation_cannon_ammo purchase_empire all -add_property aphelion_laser purchase_empire all -add_property aphelion_laser_ammo purchase_empire all -add_property aphelion_ntu_siphon purchase_empire all -add_property aphelion_plasma_rocket_ammo purchase_empire all -add_property aphelion_plasma_rocket_pod purchase_empire all -add_property aphelion_ppa purchase_empire all -add_property aphelion_ppa_ammo purchase_empire all -add_property aphelion_starfire purchase_empire all -add_property aphelion_starfire_ammo purchase_empire all -add_property aurora purchase_empire all -add_property battlewagon purchase_empire all -add_property beamer purchase_empire all -add_property burster_ammo purchase_empire all -add_property colossus purchase_empire all -add_property colossus_flight purchase_empire all -add_property colossus_gunner purchase_empire all -add_property colossus_100mm_cannon_ammo purchase_empire all -add_property colossus_armor_siphon purchase_empire all -add_property colossus_burster purchase_empire all -add_property colossus_burster_ammo purchase_empire all -add_property colossus_chaingun purchase_empire all -add_property colossus_chaingun_ammo purchase_empire all -add_property colossus_cluster_bomb_ammo purchase_empire all -add_property colossus_cluster_bomb_pod purchase_empire all -add_property colossus_dual_100mm_cannons purchase_empire all -add_property colossus_ntu_siphon purchase_empire all -add_property colossus_tank_cannon purchase_empire all -add_property colossus_tank_cannon_ammo purchase_empire all -add_property comet_ammo purchase_empire all -add_property cycler purchase_empire all -add_property cycler_v2 purchase_empire all -add_property cycler_v3 purchase_empire all -add_property cycler_v4 purchase_empire all -add_property dualcycler_ammo purchase_empire all -add_property energy_cell purchase_empire all -add_property falcon_ammo purchase_empire all -add_property firebird_missile purchase_empire all -add_property flux_cannon_thresher_battery purchase_empire all -add_property fluxpod_ammo purchase_empire all -add_property gauss purchase_empire all -add_property gauss_cannon_ammo purchase_empire all -add_property heavy_rail_beam_battery purchase_empire all -add_property hunter_seeker_missile purchase_empire all -add_property hunterseeker purchase_empire all -add_property isp purchase_empire all -add_property lancer purchase_empire all -add_property lancer_cartridge purchase_empire all -add_property lasher purchase_empire all -add_property magrider purchase_empire all -add_property mini_chaingun purchase_empire all -add_property peregrine purchase_empire all -add_property peregrine_flight purchase_empire all -add_property peregrine_gunner purchase_empire all -add_property peregrine_armor_siphon purchase_empire all -add_property peregrine_dual_machine_gun purchase_empire all -add_property peregrine_dual_machine_gun_ammo purchase_empire all -add_property peregrine_dual_rocket_pods purchase_empire all -add_property peregrine_mechhammer purchase_empire all -add_property peregrine_mechhammer_ammo purchase_empire all -add_property peregrine_ntu_siphon purchase_empire all -add_property peregrine_particle_cannon purchase_empire all -add_property peregrine_particle_cannon_ammo purchase_empire all -add_property peregrine_rocket_pod_ammo purchase_empire all -add_property peregrine_sparrow purchase_empire all -add_property peregrine_sparrow_ammo purchase_empire all -add_property phoenix_missile purchase_empire all -add_property pounder_ammo purchase_empire all -add_property prowler purchase_empire all -add_property pulsar purchase_empire all -add_property pulse_battery purchase_empire all -add_property quasar_ammo purchase_empire all -add_property r_shotgun purchase_empire all -add_property repeater purchase_empire all -add_property scattercannon_ammo purchase_empire all -add_property sparrow_ammo purchase_empire all -add_property starfire_ammo purchase_empire all -add_property striker purchase_empire all -add_property striker_missile_ammo purchase_empire all -add_property threemanheavybuggy purchase_empire all -add_property thunderer purchase_empire all -add_property twomanheavybuggy purchase_empire all -add_property twomanhoverbuggy purchase_empire all -add_property vanguard purchase_empire all diff --git a/src/main/scala/net/psforever/objects/serverobject/containable/ContainableBehavior.scala b/src/main/scala/net/psforever/objects/serverobject/containable/ContainableBehavior.scala index 04ffa27a..d3680de9 100644 --- a/src/main/scala/net/psforever/objects/serverobject/containable/ContainableBehavior.scala +++ b/src/main/scala/net/psforever/objects/serverobject/containable/ContainableBehavior.scala @@ -678,8 +678,8 @@ object ContainableBehavior { val faction = GlobalDefinitions.isFactionEquipment(objDef) GlobalDefinitions.isCavernEquipment(objDef) || objDef == GlobalDefinitions.router_telepad || - entry.obj.isInstanceOf[BoomerTrigger] /*|| - (faction != tplayer.Faction && faction != PlanetSideEmpire.NEUTRAL)*/ + entry.obj.isInstanceOf[BoomerTrigger] || + (faction != tplayer.Faction && faction != PlanetSideEmpire.NEUTRAL) } } From a1b7fe01ff4eb266a54723fd258582df60ac8688 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Mon, 26 May 2025 17:54:39 -0400 Subject: [PATCH 18/22] sideness check --- .../net/psforever/objects/avatar/interaction/WithEntrance.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/net/psforever/objects/avatar/interaction/WithEntrance.scala b/src/main/scala/net/psforever/objects/avatar/interaction/WithEntrance.scala index 8263b762..9064efb1 100644 --- a/src/main/scala/net/psforever/objects/avatar/interaction/WithEntrance.scala +++ b/src/main/scala/net/psforever/objects/avatar/interaction/WithEntrance.scala @@ -65,7 +65,7 @@ class WithEntrance() obj: InteractsWithZone, door: Door ): Sidedness = { - //debugInteriorCheck(obj, door) + debugInteriorCheck(obj, door) strictInteriorCheck(obj, door) } From 2f2fcd94f15c1e9d9762491f8d0e5c865f678677 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Mon, 26 May 2025 21:01:22 -0400 Subject: [PATCH 19/22] force spit sideness --- .../psforever/actors/session/normal/GeneralLogic.scala | 8 +++++++- .../objects/avatar/interaction/WithEntrance.scala | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala b/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala index 3a84a432..32e9bc6c 100644 --- a/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala @@ -18,6 +18,7 @@ import net.psforever.objects.serverobject.affinity.FactionAffinity import net.psforever.objects.serverobject.containable.Containable import net.psforever.objects.serverobject.doors.Door import net.psforever.objects.serverobject.generator.Generator +import net.psforever.objects.serverobject.interior.Sidedness.OutsideOf import net.psforever.objects.serverobject.llu.CaptureFlag import net.psforever.objects.serverobject.locks.IFFLock import net.psforever.objects.serverobject.mblocker.Locker @@ -406,7 +407,12 @@ class GeneralLogic(val ops: GeneralOperations, implicit val context: ActorContex } log.info(s"${player.Name} is constructing a $ammoType deployable") sessionLogic.zoning.CancelZoningProcessWithDescriptiveReason("cancel_use") - ops.handleDeployObject(continent, ammoType, pos, orient, player.WhichSide, player.Faction, player, obj) + if (obj.AmmoType == DeployedItem.spitfire_turret || obj.AmmoType == DeployedItem.spitfire_cloaked) { + ops.handleDeployObject(continent, ammoType, pos, orient, OutsideOf, player.Faction, player, obj) + } + else { + ops.handleDeployObject(continent, ammoType, pos, orient, player.WhichSide, player.Faction, player, obj) + } case Some(obj) => log.warn(s"DeployObject: what is $obj, ${player.Name}? It's not a construction tool!") case None => diff --git a/src/main/scala/net/psforever/objects/avatar/interaction/WithEntrance.scala b/src/main/scala/net/psforever/objects/avatar/interaction/WithEntrance.scala index 9064efb1..8263b762 100644 --- a/src/main/scala/net/psforever/objects/avatar/interaction/WithEntrance.scala +++ b/src/main/scala/net/psforever/objects/avatar/interaction/WithEntrance.scala @@ -65,7 +65,7 @@ class WithEntrance() obj: InteractsWithZone, door: Door ): Sidedness = { - debugInteriorCheck(obj, door) + //debugInteriorCheck(obj, door) strictInteriorCheck(obj, door) } From a98b5fd9f84301f1d19f7320e370c1cff7ac2426 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Mon, 2 Jun 2025 13:12:59 -0400 Subject: [PATCH 20/22] more sideness --- .../net/psforever/actors/session/normal/GeneralLogic.scala | 3 ++- .../psforever/actors/session/normal/VehicleHandlerLogic.scala | 2 ++ .../actors/session/support/SessionMountHandlers.scala | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala b/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala index 32e9bc6c..35fb4f45 100644 --- a/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala @@ -407,7 +407,8 @@ class GeneralLogic(val ops: GeneralOperations, implicit val context: ActorContex } log.info(s"${player.Name} is constructing a $ammoType deployable") sessionLogic.zoning.CancelZoningProcessWithDescriptiveReason("cancel_use") - if (obj.AmmoType == DeployedItem.spitfire_turret || obj.AmmoType == DeployedItem.spitfire_cloaked) { + if (ammoType == DeployedItem.spitfire_turret || ammoType == DeployedItem.spitfire_cloaked || + ammoType == DeployedItem.spitfire_aa || ammoType == DeployedItem.he_mine || ammoType == DeployedItem.jammer_mine) { ops.handleDeployObject(continent, ammoType, pos, orient, OutsideOf, player.Faction, player, obj) } else { diff --git a/src/main/scala/net/psforever/actors/session/normal/VehicleHandlerLogic.scala b/src/main/scala/net/psforever/actors/session/normal/VehicleHandlerLogic.scala index 55d01d2a..64a7a67a 100644 --- a/src/main/scala/net/psforever/actors/session/normal/VehicleHandlerLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/VehicleHandlerLogic.scala @@ -8,6 +8,7 @@ import net.psforever.objects.avatar.SpecialCarry import net.psforever.objects.{GlobalDefinitions, Player, Tool, Vehicle, Vehicles} import net.psforever.objects.equipment.{Equipment, JammableMountedWeapons, JammableUnit} import net.psforever.objects.guid.{GUIDTask, TaskWorkflow} +import net.psforever.objects.serverobject.interior.Sidedness.OutsideOf import net.psforever.objects.serverobject.mount.Mountable import net.psforever.objects.serverobject.pad.VehicleSpawnPad import net.psforever.packet.game.objectcreate.ObjectCreateMessageParent @@ -187,6 +188,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: s"${player.Sex.possessive} ride" } log.info(s"${player.Name} has been kicked from $typeOfRide!") + player.WhichSide = OutsideOf case VehicleResponse.KickPassenger(_, wasKickedByDriver, _) => //seat number (first field) seems to be correct if passenger is kicked manually by driver 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 bc9f30b1..3ee687b1 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionMountHandlers.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionMountHandlers.scala @@ -3,6 +3,7 @@ package net.psforever.actors.session.support import akka.actor.{ActorContext, typed} import net.psforever.objects.serverobject.affinity.FactionAffinity +import net.psforever.objects.serverobject.interior.Sidedness.OutsideOf import net.psforever.objects.{PlanetSideGameObject, Tool, Vehicle} import net.psforever.objects.vehicles.{CargoBehavior, MountableWeapons} import net.psforever.objects.vital.InGameHistory @@ -197,6 +198,7 @@ class SessionMountHandlers( */ def DismountVehicleAction(tplayer: Player, obj: PlanetSideGameObject with FactionAffinity with InGameHistory, seatNum: Int): Unit = { DismountAction(tplayer, obj, seatNum) + tplayer.WhichSide = OutsideOf //until vehicles maintain synchronized momentum without a driver obj match { case v: Vehicle From ca15790a36f0d65b78727370588bd44046727f39 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Tue, 3 Jun 2025 07:28:31 -0400 Subject: [PATCH 21/22] don't shoot mossie --- .../net/psforever/objects/equipment/EffectTarget.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/scala/net/psforever/objects/equipment/EffectTarget.scala b/src/main/scala/net/psforever/objects/equipment/EffectTarget.scala index 101b1cc5..689fcf65 100644 --- a/src/main/scala/net/psforever/objects/equipment/EffectTarget.scala +++ b/src/main/scala/net/psforever/objects/equipment/EffectTarget.scala @@ -324,7 +324,7 @@ object EffectTarget { def FacilityTurretValidateAircraftTarget(target: PlanetSideGameObject): Boolean = target match { case v: Vehicle - if GlobalDefinitions.isFlightVehicle(v.Definition) && v.Seats.values.exists(_.isOccupied) => + if GlobalDefinitions.isFlightVehicle(v.Definition) && v.Seats.values.exists(_.isOccupied) && v.Definition != GlobalDefinitions.mosquito => val now = System.currentTimeMillis() val pos = v.Position lazy val sector = v.Zone.blockMap.sector(pos, range = 51f) @@ -332,10 +332,10 @@ object EffectTarget { .collect { case t: Tool => now - t.LastDischarge } .exists(_ < 2000L) // from the perspective of a mosquito, at 5th gauge, forward velocity is 59~60 - lazy val movingFast = Vector3.MagnitudeSquared(v.Velocity.getOrElse(Vector3.Zero).xy) > 3721f //61 + //lazy val movingFast = Vector3.MagnitudeSquared(v.Velocity.getOrElse(Vector3.Zero).xy) > 3721f //61 lazy val isMoving = v.isMoving(test = 1d) if (v.Cloaked || radarCloakedAms(sector, pos) || radarCloakedAegis(sector, pos)) false - else if (v.Definition == GlobalDefinitions.mosquito) movingFast + //else if (v.Definition == GlobalDefinitions.mosquito) movingFast else v.isFlying && (isMoving || entityTookDamage(v, now) || usedEquipment) case _ => false From 863fa4ca7575540e4081418acf144a06c4bc0b0c Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Tue, 3 Jun 2025 09:02:28 -0400 Subject: [PATCH 22/22] don't force mines --- .../net/psforever/actors/session/normal/GeneralLogic.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala b/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala index 35fb4f45..fdfa1c9b 100644 --- a/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala @@ -408,7 +408,7 @@ class GeneralLogic(val ops: GeneralOperations, implicit val context: ActorContex log.info(s"${player.Name} is constructing a $ammoType deployable") sessionLogic.zoning.CancelZoningProcessWithDescriptiveReason("cancel_use") if (ammoType == DeployedItem.spitfire_turret || ammoType == DeployedItem.spitfire_cloaked || - ammoType == DeployedItem.spitfire_aa || ammoType == DeployedItem.he_mine || ammoType == DeployedItem.jammer_mine) { + ammoType == DeployedItem.spitfire_aa) { ops.handleDeployObject(continent, ammoType, pos, orient, OutsideOf, player.Faction, player, obj) } else {