From a59b8244fe98762bf2758f8ab6e22c01bb2aab07 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Mon, 18 Dec 2023 18:58:30 -0500 Subject: [PATCH 01/15] test squads --- .../actors/session/support/SessionData.scala | 2 +- .../session/support/SessionSquadHandlers.scala | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 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 a4ca457d1..d82688bd6 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionData.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionData.scala @@ -2805,7 +2805,7 @@ class SessionData( } def charSaved(): Unit = { - sendResponse(ChatMsg(ChatMessageType.UNK_227, wideContents=false, "", "@charsaved", None)) + sendResponse(ChatMsg(ChatMessageType.UNK_227, wideContents=false, "", s"@charsaved ${player.Position.x} ${player.Position.y} ${player.Position.z} ", None)) } def startDeconstructing(obj: SpawnTube): Unit = { diff --git a/src/main/scala/net/psforever/actors/session/support/SessionSquadHandlers.scala b/src/main/scala/net/psforever/actors/session/support/SessionSquadHandlers.scala index 9daeac6fa..132924a16 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionSquadHandlers.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionSquadHandlers.scala @@ -55,17 +55,17 @@ class SessionSquadHandlers( /* 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 -// squadService ! SquadServiceMessage( -// player, -// continent, -// SquadServiceAction.Membership(request_type, char_id, unk3, player_name, unk5) -// ) + 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 = { From bf5eb191dd11a90a145c74767417f0b5376b33cc Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Thu, 21 Dec 2023 06:57:16 -0500 Subject: [PATCH 02/15] a few tweaks --- .../teamwork/SquadInvitationManager.scala | 6 ++-- .../services/teamwork/SquadService.scala | 32 ++++++------------- 2 files changed, 12 insertions(+), 26 deletions(-) diff --git a/src/main/scala/net/psforever/services/teamwork/SquadInvitationManager.scala b/src/main/scala/net/psforever/services/teamwork/SquadInvitationManager.scala index 9b7f3eb8f..3e9fb8a38 100644 --- a/src/main/scala/net/psforever/services/teamwork/SquadInvitationManager.scala +++ b/src/main/scala/net/psforever/services/teamwork/SquadInvitationManager.scala @@ -165,7 +165,7 @@ class SquadInvitationManager(subs: SquadSubscriptionEntity, parent: ActorRef) { val availableForJoiningSquad = notLimitedByEnrollmentInSquad(invitedPlayerSquadOpt, invitedPlayer) acceptedInvite match { case Some(RequestRole(petitioner, features, position)) - if availableForJoiningSquad && canEnrollInSquad(features, petitioner.CharId) => + if canEnrollInSquad(features, petitioner.CharId) => //player requested to join a squad's specific position //invitedPlayer is actually the squad leader; petitioner is the actual "invitedPlayer" if (JoinSquad(petitioner, features, position)) { @@ -174,7 +174,7 @@ class SquadInvitationManager(subs: SquadSubscriptionEntity, parent: ActorRef) { } case Some(IndirectInvite(recruit, features)) - if availableForJoiningSquad && canEnrollInSquad(features, recruit.CharId) => + if canEnrollInSquad(features, recruit.CharId) => //tplayer / invitedPlayer is actually the squad leader val recruitCharId = recruit.CharId HandleVacancyInvite(features, recruitCharId, invitedPlayer, recruit) match { @@ -456,7 +456,7 @@ class SquadInvitationManager(subs: SquadSubscriptionEntity, parent: ActorRef) { (Some(rejectingPlayer), Some(leaderCharId)) case Some(RequestRole(rejected, features, _)) - if notLeaderOfThisSquad(squadsToLeaders, features.Squad.GUID, rejectingPlayer) => + if notLeaderOfThisSquad(squadsToLeaders, features.Squad.GUID, rejected.CharId) => //rejected is the would-be squad member; rejectingPlayer is the squad leader who rejected the request features.DeniedPlayers(rejected.CharId) (Some(rejectingPlayer), None) diff --git a/src/main/scala/net/psforever/services/teamwork/SquadService.scala b/src/main/scala/net/psforever/services/teamwork/SquadService.scala index b2149fa84..c54b51937 100644 --- a/src/main/scala/net/psforever/services/teamwork/SquadService.scala +++ b/src/main/scala/net/psforever/services/teamwork/SquadService.scala @@ -6,7 +6,7 @@ import java.io.{PrintWriter, StringWriter} import scala.collection.concurrent.TrieMap import scala.collection.mutable // -import net.psforever.objects.{Default, LivePlayerList, Player} +import net.psforever.objects.{LivePlayerList, Player} import net.psforever.objects.teamwork.{Member, Squad, SquadFeatures} import net.psforever.objects.avatar.{Avatar, Certification} import net.psforever.objects.definition.converter.StatConverter @@ -902,9 +902,8 @@ class SquadService extends Actor { val squad = features.Squad subs.UserEvents.get(charId) match { case Some(events) - if !memberToSquad.contains(charId) && - squad.Leader.CharId != charId && - squad.isAvailable(position, player.avatar.certifications) => + if squad.isAvailable(position, player.avatar.certifications) && + EnsureEmptySquad(charId) => memberToSquad(charId) = squad.GUID subs.MonitorSquadDetails.subtractOne(charId) invitations.handleCleanup(charId) @@ -1083,6 +1082,7 @@ class SquadService extends Actor { pSquadOpt match { //member of the squad; leave the squad case Some(features) => + LeaveSquad(charId, features) val squad = features.Squad val size = squad.Size subs.UserEvents.remove(charId) match { @@ -1093,25 +1093,11 @@ class SquadService extends Actor { if (size > 2) { GetLeadingSquad(charId, pSquadOpt) match { case Some(_) => - //leader of a squad; search for a suitable substitute leader - squad.Membership.drop(1).find { _.CharId > 0 } match { - case Some(member) => - //leader was shifted into a subordinate position and will retire from duty - SquadActionMembershipPromote( - charId, - member.CharId, - features, - SquadServiceMessage(null, null, SquadAction.Membership(SquadRequestType.Promote, charId, Some(member.CharId), "", None)), - Default.Actor - ) - LeaveSquad(charId, features) - case _ => - //the squad will be disbanded - PanicDisbandSquad( - features, - squad.Membership.collect { case member if member.CharId > 0 && member.CharId != charId => member.CharId } - ) - } + //leader of a squad; the squad will be disbanded. Same logic as when a SL uses /leave and the squad is disband. + PanicDisbandSquad( + features, + squad.Membership.collect { case member if member.CharId > 0 && member.CharId != charId => member.CharId } + ) case None => //not the leader of a full squad; tell other members that we are leaving SquadSwitchboard.PanicLeaveSquad( From 350f78f46af210c979554787ea5399b233701e34 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Fri, 22 Dec 2023 07:57:38 -0500 Subject: [PATCH 03/15] chat msg undo --- .../net/psforever/actors/session/support/SessionData.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d82688bd6..a4ca457d1 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionData.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionData.scala @@ -2805,7 +2805,7 @@ class SessionData( } def charSaved(): Unit = { - sendResponse(ChatMsg(ChatMessageType.UNK_227, wideContents=false, "", s"@charsaved ${player.Position.x} ${player.Position.y} ${player.Position.z} ", None)) + sendResponse(ChatMsg(ChatMessageType.UNK_227, wideContents=false, "", "@charsaved", None)) } def startDeconstructing(obj: SpawnTube): Unit = { From 8d483ea63ab69710ba44cafdef79bdcc980565d8 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Mon, 25 Dec 2023 21:01:24 -0500 Subject: [PATCH 04/15] reject and remove --- .../services/teamwork/SquadInvitationManager.scala | 9 +++++---- .../net/psforever/services/teamwork/SquadService.scala | 2 ++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/scala/net/psforever/services/teamwork/SquadInvitationManager.scala b/src/main/scala/net/psforever/services/teamwork/SquadInvitationManager.scala index 3e9fb8a38..9e58d2fa2 100644 --- a/src/main/scala/net/psforever/services/teamwork/SquadInvitationManager.scala +++ b/src/main/scala/net/psforever/services/teamwork/SquadInvitationManager.scala @@ -426,14 +426,14 @@ class SquadInvitationManager(subs: SquadSubscriptionEntity, parent: ActorRef) { Refused(rejectingPlayer, invitingPlayerCharId) (Some(rejectingPlayer), Some(invitingPlayerCharId)) - case Some(VacancyInvite(leader, _, features)) - if notLeaderOfThisSquad(squadsToLeaders, features.Squad.GUID, rejectingPlayer) => + case Some(VacancyInvite(leader, _, _)) + /*if notLeaderOfThisSquad(squadsToLeaders, features.Squad.GUID, rejectingPlayer)*/ => //rejectingPlayer is the would-be squad member; the squad leader sent the request and was rejected Refused(rejectingPlayer, leader) (Some(rejectingPlayer), Some(leader)) case Some(ProximityInvite(_, features, position)) - if notLeaderOfThisSquad(squadsToLeaders, features.Squad.GUID, rejectingPlayer) => + /*if notLeaderOfThisSquad(squadsToLeaders, features.Squad.GUID, rejectingPlayer)*/ => //rejectingPlayer is the would-be squad member; the squad leader sent the request and was rejected ReloadProximityInvite( tplayer.Zone.Players, @@ -2028,7 +2028,8 @@ class SquadInvitationManager(subs: SquadSubscriptionEntity, parent: ActorRef) { avatar.lookingForSquad && !deniedAndExcluded.contains(charId) && !refused(charId).contains(squadLeader) && - requirementsToMeet.intersect(avatar.certifications) == requirementsToMeet + requirementsToMeet.intersect(avatar.certifications) == requirementsToMeet && + charId != invitingPlayerCharId //don't send invite to yourself. can cause issues if rejected } match { case None => None diff --git a/src/main/scala/net/psforever/services/teamwork/SquadService.scala b/src/main/scala/net/psforever/services/teamwork/SquadService.scala index c54b51937..714bc8ac8 100644 --- a/src/main/scala/net/psforever/services/teamwork/SquadService.scala +++ b/src/main/scala/net/psforever/services/teamwork/SquadService.scala @@ -1009,6 +1009,8 @@ class SquadService extends Actor { subs.Publish(charId, SquadResponse.Detail(PlanetSideGUID(0), completelyBlankSquadDetail)) } UpdateSquadListWhenListed(features.Stop, None) + //I think this is right, otherwise squadFeatures will never be empty and TryResetSquadId will not reset to 1 + squadFeatures.remove(guid) } /** From e62e46e3c3c243d51315e4450b0f7c91afef2723 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Wed, 27 Dec 2023 14:52:45 -0500 Subject: [PATCH 05/15] switch order --- .../net/psforever/services/teamwork/SquadSwitchboard.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/net/psforever/services/teamwork/SquadSwitchboard.scala b/src/main/scala/net/psforever/services/teamwork/SquadSwitchboard.scala index 40d35a3c4..953b3e517 100644 --- a/src/main/scala/net/psforever/services/teamwork/SquadSwitchboard.scala +++ b/src/main/scala/net/psforever/services/teamwork/SquadSwitchboard.scala @@ -177,7 +177,6 @@ class SquadSwitchboard( } else { //joining an active squad; different people update differently //new member gets full squad UI updates - subscriptions.InitSquadDetail(squad.GUID, Seq(charId), squad) subscriptions.Publish( charId, SquadResponse.Join( @@ -203,6 +202,7 @@ class SquadSwitchboard( //update for leader subscriptions.Publish(leaderId, SquadResponse.CharacterKnowledge(charId, role.Name, role.Certifications, 40, 5, role.ZoneId)) subscriptions.SquadEvents.subscribe(sendTo, s"/$toChannel/Squad") + subscriptions.InitSquadDetail(squad.GUID, Seq(charId), squad) } context.parent ! SquadService.UpdateSquadListWhenListed( features, From 11e5834c02bdf4695f2558cc156aa5e11339344d Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Wed, 27 Dec 2023 21:39:07 -0500 Subject: [PATCH 06/15] e --- .../scala/net/psforever/services/teamwork/SquadService.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/net/psforever/services/teamwork/SquadService.scala b/src/main/scala/net/psforever/services/teamwork/SquadService.scala index 714bc8ac8..04515e6fa 100644 --- a/src/main/scala/net/psforever/services/teamwork/SquadService.scala +++ b/src/main/scala/net/psforever/services/teamwork/SquadService.scala @@ -1095,7 +1095,7 @@ class SquadService extends Actor { if (size > 2) { GetLeadingSquad(charId, pSquadOpt) match { case Some(_) => - //leader of a squad; the squad will be disbanded. Same logic as when a SL uses /leave and the squad is disband. + //leader of a squad; the squad will be disbanded. Same logic as when a SL uses /leave and the squad is disbanded. PanicDisbandSquad( features, squad.Membership.collect { case member if member.CharId > 0 && member.CharId != charId => member.CharId } From 3c508d34e8a5815842072ff824e9e4ccae9298e6 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Thu, 28 Dec 2023 18:41:09 -0500 Subject: [PATCH 07/15] comment --- .../scala/net/psforever/services/teamwork/SquadService.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/net/psforever/services/teamwork/SquadService.scala b/src/main/scala/net/psforever/services/teamwork/SquadService.scala index 04515e6fa..1202dbd79 100644 --- a/src/main/scala/net/psforever/services/teamwork/SquadService.scala +++ b/src/main/scala/net/psforever/services/teamwork/SquadService.scala @@ -1084,7 +1084,7 @@ class SquadService extends Actor { pSquadOpt match { //member of the squad; leave the squad case Some(features) => - LeaveSquad(charId, features) + LeaveSquad(charId, features) //adding this fixed issue of rejoining the squad on login. val squad = features.Squad val size = squad.Size subs.UserEvents.remove(charId) match { From 1f6e3d741e1ec8824298a0d86e3228bfdb05f65a Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Mon, 1 Jan 2024 13:03:24 -0500 Subject: [PATCH 08/15] actual br and cr (mostly) --- .../psforever/services/teamwork/SquadService.scala | 1 + .../services/teamwork/SquadSwitchboard.scala | 11 ++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/scala/net/psforever/services/teamwork/SquadService.scala b/src/main/scala/net/psforever/services/teamwork/SquadService.scala index 1202dbd79..dcfb949c5 100644 --- a/src/main/scala/net/psforever/services/teamwork/SquadService.scala +++ b/src/main/scala/net/psforever/services/teamwork/SquadService.scala @@ -950,6 +950,7 @@ class SquadService extends Actor { membership.find { case (_member, _) => _member.CharId == charId } match { case Some(_) if squad.Leader.CharId != charId => memberToSquad.remove(charId) + subs.MonitorSquadDetails.subtractOne(charId) features.Switchboard ! SquadSwitchboard.Leave(charId) true case _ => diff --git a/src/main/scala/net/psforever/services/teamwork/SquadSwitchboard.scala b/src/main/scala/net/psforever/services/teamwork/SquadSwitchboard.scala index 953b3e517..1366a59b7 100644 --- a/src/main/scala/net/psforever/services/teamwork/SquadSwitchboard.scala +++ b/src/main/scala/net/psforever/services/teamwork/SquadSwitchboard.scala @@ -171,7 +171,7 @@ class SquadSwitchboard( //update for leader features.InitialAssociation = false subscriptions.Publish(leaderId, SquadResponse.IdentifyAsSquadLeader(squad.GUID)) - subscriptions.Publish(leaderId, SquadResponse.CharacterKnowledge(charId, role.Name, role.Certifications, 40, 5, role.ZoneId)) + subscriptions.Publish(leaderId, SquadResponse.CharacterKnowledge(charId, role.Name, role.Certifications, player.avatar.br.value, player.avatar.cr.value, role.ZoneId)) //everyone subscriptions.InitSquadDetail(features) } else { @@ -200,7 +200,7 @@ class SquadSwitchboard( ) subscriptions.Publish(toChannel, SquadResponse.Join(squad, List(position), "", self), Seq(charId)) //update for leader - subscriptions.Publish(leaderId, SquadResponse.CharacterKnowledge(charId, role.Name, role.Certifications, 40, 5, role.ZoneId)) + subscriptions.Publish(leaderId, SquadResponse.CharacterKnowledge(charId, role.Name, role.Certifications, player.avatar.br.value, player.avatar.cr.value, role.ZoneId)) subscriptions.SquadEvents.subscribe(sendTo, s"/$toChannel/Squad") subscriptions.InitSquadDetail(squad.GUID, Seq(charId), squad) } @@ -729,6 +729,7 @@ class SquadSwitchboard( _.CharId == promotedPlayer } .foreach { member => + //todo: get member br & cr to replace 40, 5 subscriptions.Publish(promotedPlayer, SquadResponse.CharacterKnowledge(member.CharId, member.Name, member.Certifications, 40, 5, member.ZoneId)) } //to old and to new squad leader @@ -904,18 +905,18 @@ class SquadSwitchboard( if (leaderCharId != charId) { subscriptions.Publish( leaderCharId, - SquadResponse.CharacterKnowledge(charId, member.Name, certifications, 40, 5, zoneNumber) + SquadResponse.CharacterKnowledge(charId, member.Name, certifications, player.avatar.br.value, player.avatar.cr.value, zoneNumber) ) } context.parent ! SquadServiceMessage(player, player.Zone, SquadAction.ReloadDecoration()) } else if (zoneBefore != zoneNumber && leaderCharId != charId) { subscriptions.Publish( leaderCharId, - SquadResponse.CharacterKnowledge(charId, member.Name, certifications, 40, 5, 0) + SquadResponse.CharacterKnowledge(charId, member.Name, certifications, player.avatar.br.value, player.avatar.cr.value, 0) ) subscriptions.Publish( leaderCharId, - SquadResponse.CharacterKnowledge(charId, member.Name, certifications, 40, 5, zoneNumber) + SquadResponse.CharacterKnowledge(charId, member.Name, certifications, player.avatar.br.value, player.avatar.cr.value, zoneNumber) ) } if (features.LocationFollowsSquadLead) { From 69b5dec127cb027c79b72cb62fe970e87986747b Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Tue, 2 Jan 2024 21:22:48 -0500 Subject: [PATCH 09/15] no reset --- .../psforever/services/teamwork/SquadService.scala | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/scala/net/psforever/services/teamwork/SquadService.scala b/src/main/scala/net/psforever/services/teamwork/SquadService.scala index dcfb949c5..f52b4323e 100644 --- a/src/main/scala/net/psforever/services/teamwork/SquadService.scala +++ b/src/main/scala/net/psforever/services/teamwork/SquadService.scala @@ -974,6 +974,7 @@ class SquadService extends Actor { def CloseSquad(squad: Squad): Unit = { val guid = squad.GUID val membership = squad.Membership.zipWithIndex + val factionListings = publishedLists(squad.Faction) val (updateMembers, updateIndices) = membership.collect { case (member, index) if member.CharId > 0 => ((member, member.CharId, index, subs.UserEvents.get(member.CharId)), (member.CharId, index)) @@ -1012,6 +1013,13 @@ class SquadService extends Actor { UpdateSquadListWhenListed(features.Stop, None) //I think this is right, otherwise squadFeatures will never be empty and TryResetSquadId will not reset to 1 squadFeatures.remove(guid) + //for the rare case of a phantom squad that no longer exists but is still on the publishedLists + factionListings.find(_ == guid) match { + case Some(squad) => + val index = factionListings.indexOf(squad) + factionListings.remove(index) + case None => + } } /** @@ -1125,7 +1133,8 @@ class SquadService extends Actor { } subs.SquadEvents.unsubscribe(sender) //just to make certain searchData.remove(charId) - TryResetSquadId() + //todo turn this back on. See PR 1157 for why it was commented out. + //TryResetSquadId() } /** From 892cd376bc3ebe562229694f6f1637cdccf20bf3 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Sun, 7 Jan 2024 20:43:56 -0500 Subject: [PATCH 10/15] no search --- .../support/SessionSquadHandlers.scala | 26 +++++++++---------- .../services/teamwork/SquadService.scala | 6 ++--- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/scala/net/psforever/actors/session/support/SessionSquadHandlers.scala b/src/main/scala/net/psforever/actors/session/support/SessionSquadHandlers.scala index 132924a16..e3ff2bb0e 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionSquadHandlers.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionSquadHandlers.scala @@ -336,19 +336,19 @@ class SessionSquadHandlers( sendResponse(CharacterKnowledgeMessage(charId, Some(CharacterKnowledgeInfo(name, certs, u1, u2, zone)))) case SquadResponse.SquadSearchResults(results) => - //TODO positive squad search results message? - if(results.nonEmpty) { - results.foreach { guid => - sendResponse(SquadDefinitionActionMessage( - guid, - 0, - SquadAction.SquadListDecorator(SquadListDecoration.SearchResult)) - ) - } - } else { - sendResponse(SquadDefinitionActionMessage(player.GUID, 0, SquadAction.NoSquadSearchResults())) - } - sendResponse(SquadDefinitionActionMessage(player.GUID, 0, SquadAction.CancelSquadSearch())) + //TODO positive squad search results message? +// if(results.nonEmpty) { +// results.foreach { guid => +// sendResponse(SquadDefinitionActionMessage( +// guid, +// 0, +// SquadAction.SquadListDecorator(SquadListDecoration.SearchResult)) +// ) +// } +// } else { +// sendResponse(SquadDefinitionActionMessage(player.GUID, 0, SquadAction.NoSquadSearchResults())) +// } +// sendResponse(SquadDefinitionActionMessage(player.GUID, 0, SquadAction.CancelSquadSearch())) case SquadResponse.InitWaypoints(char_id, waypoints) => waypoints.foreach { diff --git a/src/main/scala/net/psforever/services/teamwork/SquadService.scala b/src/main/scala/net/psforever/services/teamwork/SquadService.scala index f52b4323e..932105217 100644 --- a/src/main/scala/net/psforever/services/teamwork/SquadService.scala +++ b/src/main/scala/net/psforever/services/teamwork/SquadService.scala @@ -76,7 +76,7 @@ class SquadService extends Actor { //squads and members (users) squadFeatures.foreach { case (_, features) => - CloseSquad(features.Squad) + DisbandSquad(features) } memberToSquad.clear() publishedLists.clear() @@ -686,10 +686,10 @@ class SquadService extends Actor { } None case search: SearchForSquadsWithParticularRole => - SquadActionDefinitionSearchForSquadsWithParticularRole(tplayer, search) +// SquadActionDefinitionSearchForSquadsWithParticularRole(tplayer, search) None case _: CancelSquadSearch => - SquadActionDefinitionCancelSquadSearch(tplayer.CharId) +// SquadActionDefinitionCancelSquadSearch(tplayer.CharId) None case _: DisplaySquad => GetSquad(guid) match { From bcb3c43211ef16ef8540022408b108c235a925d9 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Mon, 8 Jan 2024 20:36:38 -0500 Subject: [PATCH 11/15] console? --- .../services/teamwork/SquadService.scala | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/main/scala/net/psforever/services/teamwork/SquadService.scala b/src/main/scala/net/psforever/services/teamwork/SquadService.scala index 932105217..967b89915 100644 --- a/src/main/scala/net/psforever/services/teamwork/SquadService.scala +++ b/src/main/scala/net/psforever/services/teamwork/SquadService.scala @@ -974,7 +974,6 @@ class SquadService extends Actor { def CloseSquad(squad: Squad): Unit = { val guid = squad.GUID val membership = squad.Membership.zipWithIndex - val factionListings = publishedLists(squad.Faction) val (updateMembers, updateIndices) = membership.collect { case (member, index) if member.CharId > 0 => ((member, member.CharId, index, subs.UserEvents.get(member.CharId)), (member.CharId, index)) @@ -1011,15 +1010,12 @@ class SquadService extends Actor { subs.Publish(charId, SquadResponse.Detail(PlanetSideGUID(0), completelyBlankSquadDetail)) } UpdateSquadListWhenListed(features.Stop, None) - //I think this is right, otherwise squadFeatures will never be empty and TryResetSquadId will not reset to 1 - squadFeatures.remove(guid) - //for the rare case of a phantom squad that no longer exists but is still on the publishedLists - factionListings.find(_ == guid) match { - case Some(squad) => - val index = factionListings.indexOf(squad) - factionListings.remove(index) - case None => - } + squadFeatures -= guid + //really make sure it is removed + publishedLists(squad.Faction) -= guid + //testing + println(s"AllSquads Removed: $guid - Remaining: $squadFeatures") + println(s"ListedSquads: $publishedLists") } /** From 89ac6ec48fc4aa61731ff63b63d83e2438d94da2 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Tue, 9 Jan 2024 22:11:40 -0500 Subject: [PATCH 12/15] fix phantom listed squad --- .../net/psforever/services/teamwork/SquadService.scala | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/scala/net/psforever/services/teamwork/SquadService.scala b/src/main/scala/net/psforever/services/teamwork/SquadService.scala index 967b89915..60b99d421 100644 --- a/src/main/scala/net/psforever/services/teamwork/SquadService.scala +++ b/src/main/scala/net/psforever/services/teamwork/SquadService.scala @@ -1101,10 +1101,7 @@ class SquadService extends Actor { GetLeadingSquad(charId, pSquadOpt) match { case Some(_) => //leader of a squad; the squad will be disbanded. Same logic as when a SL uses /leave and the squad is disbanded. - PanicDisbandSquad( - features, - squad.Membership.collect { case member if member.CharId > 0 && member.CharId != charId => member.CharId } - ) + DisbandSquad(features) case None => //not the leader of a full squad; tell other members that we are leaving SquadSwitchboard.PanicLeaveSquad( @@ -1118,10 +1115,7 @@ class SquadService extends Actor { } } else { //with only two members before our leave, the squad will be disbanded - PanicDisbandSquad( - features, - squad.Membership.collect { case member if member.CharId > 0 && member.CharId != charId => member.CharId } - ) + DisbandSquad(features) } case None => //not a member of any squad; nothing really to do here From ea6b6d69a40c0e8c3f804a1f20c207f8a3657818 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Wed, 10 Jan 2024 13:28:58 -0500 Subject: [PATCH 13/15] actually remove them --- .../scala/net/psforever/services/teamwork/SquadService.scala | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/scala/net/psforever/services/teamwork/SquadService.scala b/src/main/scala/net/psforever/services/teamwork/SquadService.scala index 60b99d421..5c173f2b4 100644 --- a/src/main/scala/net/psforever/services/teamwork/SquadService.scala +++ b/src/main/scala/net/psforever/services/teamwork/SquadService.scala @@ -863,6 +863,11 @@ class SquadService extends Actor { val sguid = GetNextSquadId() val squad = new Squad(sguid, faction) val leadPosition = squad.Membership(0) + //keep publishedLists clear of old squads. PR 1157 for details + val factionListings = publishedLists(faction) + val guidsToRemove = factionListings.filterNot(squadFeatures.contains).toList + guidsToRemove.foreach(factionListings -= _) + leadPosition.Name = name leadPosition.CharId = player.CharId leadPosition.Health = StatConverter.Health(player.Health, player.MaxHealth, min = 1, max = 64) From 7de49b091c4dc7cac1476b430d49a2e33d9c86a6 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Thu, 11 Jan 2024 13:07:37 -0500 Subject: [PATCH 14/15] no print --- .../net/psforever/services/teamwork/SquadService.scala | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/scala/net/psforever/services/teamwork/SquadService.scala b/src/main/scala/net/psforever/services/teamwork/SquadService.scala index 5c173f2b4..922368c81 100644 --- a/src/main/scala/net/psforever/services/teamwork/SquadService.scala +++ b/src/main/scala/net/psforever/services/teamwork/SquadService.scala @@ -1015,12 +1015,10 @@ class SquadService extends Actor { subs.Publish(charId, SquadResponse.Detail(PlanetSideGUID(0), completelyBlankSquadDetail)) } UpdateSquadListWhenListed(features.Stop, None) + //remove from list of squads squadFeatures -= guid - //really make sure it is removed + //really make sure it is removed from listed squads publishedLists(squad.Faction) -= guid - //testing - println(s"AllSquads Removed: $guid - Remaining: $squadFeatures") - println(s"ListedSquads: $publishedLists") } /** From 587e0f4d2bba216ab58fa9503de9f9bb2662e526 Mon Sep 17 00:00:00 2001 From: ScrawnyRonnie Date: Mon, 12 Feb 2024 09:57:35 -0500 Subject: [PATCH 15/15] disable promote --- .../scala/net/psforever/services/teamwork/SquadService.scala | 2 +- .../net/psforever/services/teamwork/SquadSwitchboard.scala | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/scala/net/psforever/services/teamwork/SquadService.scala b/src/main/scala/net/psforever/services/teamwork/SquadService.scala index 922368c81..5a1edb560 100644 --- a/src/main/scala/net/psforever/services/teamwork/SquadService.scala +++ b/src/main/scala/net/psforever/services/teamwork/SquadService.scala @@ -377,7 +377,7 @@ class SquadService extends Actor { SquadActionMembershipCancel(cancellingPlayer) case SquadAction.Membership(SquadRequestType.Promote, promotingPlayer, Some(_promotedPlayer), promotedName, _) => - SquadActionMembershipPromote(promotingPlayer, _promotedPlayer, promotedName, SquadServiceMessage(tplayer, zone, action), sender()) + //SquadActionMembershipPromote(promotingPlayer, _promotedPlayer, promotedName, SquadServiceMessage(tplayer, zone, action), sender()) case SquadAction.Membership(event, _, _, _, _) => debug(s"SquadAction.Membership: $event is not yet supported") diff --git a/src/main/scala/net/psforever/services/teamwork/SquadSwitchboard.scala b/src/main/scala/net/psforever/services/teamwork/SquadSwitchboard.scala index 1366a59b7..ea8a55718 100644 --- a/src/main/scala/net/psforever/services/teamwork/SquadSwitchboard.scala +++ b/src/main/scala/net/psforever/services/teamwork/SquadSwitchboard.scala @@ -653,7 +653,7 @@ class SquadSwitchboard( if (squad.Leader.CharId == char_id) { membership.lift(position) match { case Some(toMember) => - SquadActionMembershipPromote(char_id, toMember.CharId) + //SquadActionMembershipPromote(char_id, toMember.CharId) case _ => ; } } else { @@ -684,7 +684,7 @@ class SquadSwitchboard( def SquadActionMembership(action: Any): Unit = { action match { case SquadAction.Membership(SquadRequestType.Promote, promotingPlayer, Some(promotedPlayer), _, _) => - SquadActionMembershipPromote(promotingPlayer, promotedPlayer) + //SquadActionMembershipPromote(promotingPlayer, promotedPlayer) case SquadAction.Membership(event, _, _, _, _) => log.debug(s"SquadAction.Membership: $event is not supported here")