From 6ae3a719079c2097eefdcb5f6e600c4ed4fe8c26 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Mon, 1 Sep 2025 08:18:57 -0400 Subject: [PATCH] ants share exp with squad --- .../session/normal/AvatarHandlerLogic.scala | 3 +++ .../actors/session/normal/GeneralLogic.scala | 12 +++++++----- .../support/SessionAvatarHandlers.scala | 19 +++++++++++++++++-- .../support/SessionOutfitHandlers.scala | 2 +- .../resourcesilo/ResourceSiloControl.scala | 2 ++ .../services/avatar/AvatarService.scala | 9 +++++++++ .../avatar/AvatarServiceMessage.scala | 5 +++-- .../avatar/AvatarServiceResponse.scala | 5 +++-- 8 files changed, 45 insertions(+), 12 deletions(-) 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 c81be928c..03d6fe633 100644 --- a/src/main/scala/net/psforever/actors/session/normal/AvatarHandlerLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/AvatarHandlerLogic.scala @@ -479,6 +479,9 @@ class AvatarHandlerLogic(val ops: SessionAvatarHandlers, implicit val context: A case AvatarResponse.ShareKillExperienceWithSquad(killer, exp) => ops.shareKillExperienceWithSquad(killer, exp) + case AvatarResponse.ShareAntExperienceWithSquad(owner, exp, vehicle) => + ops.shareAntExperienceWithSquad(owner, exp, vehicle) + case AvatarResponse.SendResponse(msg) => sendResponse(msg) 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 6be7ec0eb..a51565378 100644 --- a/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/GeneralLogic.scala @@ -37,11 +37,9 @@ import net.psforever.objects.vital.etc.SuicideReason import net.psforever.objects.vital.interaction.DamageInteraction import net.psforever.objects.zones.{ZoneProjectile, Zoning} import net.psforever.packet.PlanetSideGamePacket -import net.psforever.packet.game.OutfitEventAction.{OutfitInfo, OutfitRankNames, Update} -import net.psforever.packet.game.{ActionCancelMessage, ActionResultMessage, AvatarFirstTimeEventMessage, AvatarImplantMessage, AvatarJumpMessage, BattleplanMessage, BindPlayerMessage, BugReportMessage, ChangeFireModeMessage, ChangeShortcutBankMessage, CharacterCreateRequestMessage, CharacterRequestAction, CharacterRequestMessage, ChatMsg, CollisionIs, ConnectToWorldRequestMessage, CreateShortcutMessage, DeadState, DeployObjectMessage, DisplayedAwardMessage, DropItemMessage, EmoteMsg, FacilityBenefitShieldChargeRequestMessage, FriendsRequest, GenericAction, GenericActionMessage, GenericCollisionMsg, GenericObjectActionAtPositionMessage, GenericObjectActionMessage, GenericObjectStateMsg, HitHint, InvalidTerrainMessage, LootItemMessage, MoveItemMessage, ObjectDetectedMessage, ObjectHeldMessage, OutfitEvent, OutfitMembershipRequest, OutfitMembershipRequestAction, OutfitMembershipResponse, OutfitRequest, OutfitRequestAction, PickupItemMessage, PlanetsideAttributeMessage, PlayerStateMessageUpstream, RequestDestroyMessage, TargetingImplantRequest, TerrainCondition, TradeMessage, UnuseItemMessage, UseItemMessage, VoiceHostInfo, VoiceHostRequest, ZipLineMessage} +import net.psforever.packet.game.{ActionCancelMessage, ActionResultMessage, AvatarFirstTimeEventMessage, AvatarImplantMessage, AvatarJumpMessage, BattleplanMessage, BindPlayerMessage, BugReportMessage, ChangeFireModeMessage, ChangeShortcutBankMessage, CharacterCreateRequestMessage, CharacterRequestAction, CharacterRequestMessage, ChatMsg, CollisionIs, ConnectToWorldRequestMessage, CreateShortcutMessage, DeadState, DeployObjectMessage, DisplayedAwardMessage, DropItemMessage, EmoteMsg, FacilityBenefitShieldChargeRequestMessage, FriendsRequest, GenericAction, GenericActionMessage, GenericCollisionMsg, GenericObjectActionAtPositionMessage, GenericObjectActionMessage, GenericObjectStateMsg, HitHint, InvalidTerrainMessage, LootItemMessage, MoveItemMessage, ObjectDetectedMessage, ObjectHeldMessage, OutfitMembershipRequest, OutfitMembershipRequestAction, OutfitMembershipResponse, OutfitRequest, OutfitRequestAction, PickupItemMessage, PlanetsideAttributeMessage, PlayerStateMessageUpstream, RequestDestroyMessage, TargetingImplantRequest, TerrainCondition, TradeMessage, UnuseItemMessage, UseItemMessage, VoiceHostInfo, VoiceHostRequest, ZipLineMessage} import net.psforever.services.account.{AccountPersistenceService, RetrieveAccountData} import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage} -import net.psforever.services.chat.OutfitChannel import net.psforever.services.local.{LocalAction, LocalServiceMessage} import net.psforever.services.local.support.CaptureFlagManager import net.psforever.types.{CapacitorStateType, ChatMessageType, Cosmetic, ExoSuitType, ImplantType, PlanetSideEmpire, PlanetSideGUID, Vector3} @@ -807,7 +805,9 @@ class GeneralLogic(val ops: GeneralOperations, implicit val context: ActorContex } case OutfitMembershipRequest(_, OutfitMembershipRequestAction.Invite(_, invitedName)) => - SessionOutfitHandlers.HandleOutfitInvite(zones, invitedName, player) + if (player.outfit_id != 0) { + SessionOutfitHandlers.HandleOutfitInvite(zones, invitedName, player) + } case OutfitMembershipRequest(_, OutfitMembershipRequestAction.AcceptInvite(_)) => SessionOutfitHandlers.HandleOutfitInviteAccept(player, sessionLogic) @@ -816,7 +816,9 @@ class GeneralLogic(val ops: GeneralOperations, implicit val context: ActorContex SessionOutfitHandlers.HandleOutfitInviteReject(player) case OutfitMembershipRequest(_, OutfitMembershipRequestAction.Kick(memberId, _)) => - SessionOutfitHandlers.HandleOutfitKick(zones, memberId, player, sessionLogic) + if (player.outfit_id != 0) { + SessionOutfitHandlers.HandleOutfitKick(zones, memberId, player, sessionLogic) + } case OutfitMembershipRequest(_, OutfitMembershipRequestAction.SetRank(memberId, newRank, _)) => SessionOutfitHandlers.HandleOutfitPromote(zones, memberId, newRank, player) 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 c00b4a835..da4cc1c96 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala @@ -3,8 +3,8 @@ package net.psforever.actors.session.support import akka.actor.{ActorContext, typed} import net.psforever.objects.serverobject.mount.Mountable -import net.psforever.objects.{Default, PlanetSideGameObject, Player} -import net.psforever.objects.sourcing.{PlayerSource, SourceEntry} +import net.psforever.objects.{Default, PlanetSideGameObject, Player, Vehicle} +import net.psforever.objects.sourcing.{PlayerSource, SourceEntry, UniquePlayer} import net.psforever.packet.game.objectcreate.ConstructorData import net.psforever.objects.zones.exp import net.psforever.services.Service @@ -145,6 +145,21 @@ class SessionAvatarHandlers( } } + def shareAntExperienceWithSquad(driver: UniquePlayer, exp: Long, vehicle: Vehicle): Unit = { + val squadUI = sessionLogic.squad.squadUI + val squadSize = squadUI.size + if (squadSize > 1) { + val squadMembers = squadUI.filterNot(_._1 == driver.charId).map { case (_, member) => member }.toList.map(_.name) + val playersInZone = vehicle.Zone.Players.map { avatar => (avatar.id, avatar.basic.name) } + val squadMembersHere = playersInZone.filter(member => squadMembers.contains(member._2)) + squadMembersHere.foreach { member => + vehicle.Zone.AvatarEvents ! AvatarServiceMessage( + member._2, + AvatarAction.AwardBep(member._1, exp, 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/actors/session/support/SessionOutfitHandlers.scala b/src/main/scala/net/psforever/actors/session/support/SessionOutfitHandlers.scala index 18495cbab..599adf708 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionOutfitHandlers.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionOutfitHandlers.scala @@ -252,7 +252,7 @@ object SessionOutfitHandlers { PlayerControl.sendResponse(kicked.Zone, kicked.Name, OutfitMembershipResponse(OutfitMembershipResponse.PacketType.YouGotKicked, 0, 1, - kickedBy.CharId, kicked.CharId, kicked.Name, kickedBy.Name, flag = false)) + kickedBy.CharId, kicked.CharId, kickedBy.Name, kicked.Name, flag = false)) kicked.Zone.AvatarEvents ! AvatarServiceMessage(kicked.Zone.id, AvatarAction.PlanetsideAttributeToAll(kicked.GUID, 39, 0)) diff --git a/src/main/scala/net/psforever/objects/serverobject/resourcesilo/ResourceSiloControl.scala b/src/main/scala/net/psforever/objects/serverobject/resourcesilo/ResourceSiloControl.scala index a892e21b0..ab4d3499c 100644 --- a/src/main/scala/net/psforever/objects/serverobject/resourcesilo/ResourceSiloControl.scala +++ b/src/main/scala/net/psforever/objects/serverobject/resourcesilo/ResourceSiloControl.scala @@ -197,6 +197,8 @@ class ResourceSiloControl(resourceSilo: ResourceSilo) owner.name, AvatarAction.AwardBep(owner.charId, deposit, ExperienceType.Normal) ) + vehicle.Zone.AvatarEvents ! AvatarServiceMessage( + owner.name, AvatarAction.ShareAntExperienceWithSquad(owner, deposit, vehicle)) zones.exp.ToDatabase.reportNtuActivity(owner.charId, resourceSilo.Zone.Number, resourceSilo.Owner.GUID.guid, deposit) } } diff --git a/src/main/scala/net/psforever/services/avatar/AvatarService.scala b/src/main/scala/net/psforever/services/avatar/AvatarService.scala index 54afc5bf1..6b5caaf0b 100644 --- a/src/main/scala/net/psforever/services/avatar/AvatarService.scala +++ b/src/main/scala/net/psforever/services/avatar/AvatarService.scala @@ -475,6 +475,15 @@ class AvatarService(zone: Zone) extends Actor { ) ) + case AvatarAction.ShareAntExperienceWithSquad(owner, exp, vehicle) => + AvatarEvents.publish( + AvatarServiceResponse( + s"/$forChannel/Avatar", + Service.defaultPlayerGUID, + AvatarResponse.ShareAntExperienceWithSquad(owner, exp, vehicle) + ) + ) + case _ => () } diff --git a/src/main/scala/net/psforever/services/avatar/AvatarServiceMessage.scala b/src/main/scala/net/psforever/services/avatar/AvatarServiceMessage.scala index c307c7b3e..3ab388dee 100644 --- a/src/main/scala/net/psforever/services/avatar/AvatarServiceMessage.scala +++ b/src/main/scala/net/psforever/services/avatar/AvatarServiceMessage.scala @@ -1,13 +1,13 @@ // Copyright (c) 2017 PSForever package net.psforever.services.avatar -import net.psforever.objects.Player +import net.psforever.objects.{Player, Vehicle} import net.psforever.objects.avatar.scoring.KDAStat import net.psforever.objects.ballistics.Projectile import net.psforever.objects.equipment.Equipment import net.psforever.objects.inventory.InventoryItem import net.psforever.objects.serverobject.environment.interaction.common.Watery.OxygenStateTarget -import net.psforever.objects.sourcing.SourceEntry +import net.psforever.objects.sourcing.{SourceEntry, UniquePlayer} import net.psforever.objects.vital.interaction.DamageResult import net.psforever.objects.zones.Zone import net.psforever.packet.PlanetSideGamePacket @@ -163,6 +163,7 @@ object AvatarAction { 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 ShareAntExperienceWithSquad(owner: UniquePlayer, exp: Long, vehicle: Vehicle) 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 cce788e73..370ec9fc7 100644 --- a/src/main/scala/net/psforever/services/avatar/AvatarServiceResponse.scala +++ b/src/main/scala/net/psforever/services/avatar/AvatarServiceResponse.scala @@ -1,13 +1,13 @@ // Copyright (c) 2017 PSForever package net.psforever.services.avatar -import net.psforever.objects.Player +import net.psforever.objects.{Player, Vehicle} import net.psforever.objects.avatar.scoring.KDAStat import net.psforever.objects.ballistics.Projectile import net.psforever.objects.equipment.Equipment import net.psforever.objects.inventory.InventoryItem import net.psforever.objects.serverobject.environment.interaction.common.Watery.OxygenStateTarget -import net.psforever.objects.sourcing.SourceEntry +import net.psforever.objects.sourcing.{SourceEntry, UniquePlayer} import net.psforever.objects.vital.interaction.DamageResult import net.psforever.packet.PlanetSideGamePacket import net.psforever.packet.game.objectcreate.ConstructorData @@ -134,4 +134,5 @@ object AvatarResponse { 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 + final case class ShareAntExperienceWithSquad(owner: UniquePlayer, exp: Long, vehicle: Vehicle) extends Response }