Squads Again Again Again

Let's Try Squads Again
This commit is contained in:
ScrawnyRonnie 2025-08-05 13:05:35 -04:00 committed by GitHub
commit d76b41365c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 31 additions and 20 deletions

View file

@ -139,6 +139,12 @@ object MiddlewareActor {
packet.isInstanceOf[KeepAliveMessage]
}
/** `SquadDetailDefinitionUpdateMessage` [sometimes] doesn't make for a good travel partner
* as seen in issue #1176 and PR #1290 so deliver it alone */
private def squadDetailDefinitionMessageGuard(packet: PlanetSidePacket): Boolean = {
packet.isInstanceOf[SquadDetailDefinitionUpdateMessage]
}
/**
* A function for blanking tasks related to inbound packet resolution.
* Do nothing.
@ -246,7 +252,8 @@ class MiddlewareActor(
*/
private val packetsBundledByThemselves: List[PlanetSidePacket => Boolean] = List(
MiddlewareActor.keepAliveMessageGuard,
MiddlewareActor.characterInfoMessageGuard
MiddlewareActor.characterInfoMessageGuard,
MiddlewareActor.squadDetailDefinitionMessageGuard
)
private val smpHistoryLength: Int = 100

View file

@ -15,7 +15,7 @@ import net.psforever.objects.zones.Zone
import net.psforever.packet.game.{ChatMsg, SetChatFilterMessage}
import net.psforever.services.Service
import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage}
import net.psforever.services.chat.{ChatChannel, DefaultChannel, SpectatorChannel}
import net.psforever.services.chat.{ChatChannel, DefaultChannel, SpectatorChannel, SquadChannel}
import net.psforever.types.ChatMessageType.{CMT_TOGGLESPECTATORMODE, CMT_TOGGLE_GM}
import net.psforever.types.{ChatMessageType, PlanetSideEmpire}
import net.psforever.zones.Zones
@ -131,7 +131,7 @@ class ChatLogic(val ops: ChatOperations, implicit val context: ActorContext) ext
ops.commandSend(session, message, comms)
case (CMT_SQUAD, _, _) =>
ops.commandSquad(session, message, comms) //todo SquadChannel, but what is the guid
ops.commandSquad(session, message, SquadChannel(sessionLogic.squad.squad_guid))
case (CMT_WHO | CMT_WHO_CSR | CMT_WHO_CR | CMT_WHO_PLATOONLEADERS | CMT_WHO_SQUADLEADERS | CMT_WHO_TEAMS, _, _) =>
ops.commandWho(session)

View file

@ -28,21 +28,21 @@ class SquadHandlerLogic(val ops: SessionSquadHandlers, implicit val context: Act
/* packet */
def handleSquadDefinitionAction(pkt: SquadDefinitionActionMessage): Unit = {
/*if (!player.spectator) {
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 = {

View file

@ -7,7 +7,7 @@ import net.psforever.actors.session.spectator.SpectatorMode
import net.psforever.actors.session.support.{ChatFunctions, ChatOperations, SessionData}
import net.psforever.objects.Session
import net.psforever.packet.game.{ChatMsg, ServerType, SetChatFilterMessage}
import net.psforever.services.chat.DefaultChannel
import net.psforever.services.chat.{DefaultChannel, SquadChannel}
import net.psforever.types.ChatMessageType
import net.psforever.types.ChatMessageType.{CMT_TOGGLESPECTATORMODE, CMT_TOGGLE_GM}
import net.psforever.util.Config
@ -77,7 +77,7 @@ class ChatLogic(val ops: ChatOperations, implicit val context: ActorContext) ext
ops.commandSend(session, message, DefaultChannel)
case (CMT_SQUAD, _, _) =>
ops.commandSquad(session, message, DefaultChannel) //todo SquadChannel, but what is the guid
ops.commandSquad(session, message, SquadChannel(sessionLogic.squad.squad_guid))
case (CMT_WHO | CMT_WHO_CSR | CMT_WHO_CR | CMT_WHO_PLATOONLEADERS | CMT_WHO_SQUADLEADERS | CMT_WHO_TEAMS, _, _) =>
ops.commandWho(session)

View file

@ -210,6 +210,7 @@ class SquadHandlerLogic(val ops: SessionSquadHandlers, implicit val context: Act
case Some((ourMember, ourIndex)) =>
//we are joining the squad
//load each member's entry (our own too)
ops.squad_guid = squad.GUID
ops.squad_supplement_id = squad.GUID.guid + 1
membershipPositions.foreach {
case (member, index) =>
@ -300,6 +301,7 @@ class SquadHandlerLogic(val ops: SessionSquadHandlers, implicit val context: Act
avatarActor ! AvatarActor.SetLookingForSquad(false)
//a finalization? what does this do?
sendResponse(SquadDefinitionActionMessage(PlanetSideGUID(0), 0, SquadAction.Unknown(18)))
ops.squad_guid = PlanetSideGUID(0)
ops.squad_supplement_id = 0
ops.squadUpdateCounter = 0
ops.updateSquad = ops.NoSquadUpdates

View file

@ -53,6 +53,7 @@ class SessionSquadHandlers(
private[session] val squadUI: mutable.LongMap[SquadUIElement] = new mutable.LongMap[SquadUIElement]()
private[session] var squad_supplement_id: Int = 0
private[session] var squad_guid: PlanetSideGUID = PlanetSideGUID(0)
/**
* When joining or creating a squad, the original state of the avatar's internal LFS variable is blanked.
* This `WorldSessionActor`-local variable is then used to indicate the ongoing state of the LFS UI component,

View file

@ -3853,7 +3853,7 @@ class ZoningOperations(
}
def startEnqueueSquadMessages: Boolean = {
sessionLogic.zoning.zoneReload && sessionLogic.zoning.spawn.setAvatar && player.isAlive
!sessionLogic.zoning.zoneReload && sessionLogic.zoning.spawn.setAvatar && player.isAlive
}
def enqueueNewActivity(newTasking: SpawnOperations.ActivityQueuedTask): Unit = {

View file

@ -368,6 +368,7 @@ class SquadInvitationManager(subs: SquadSubscriptionEntity, parent: ActorRef) {
charId,
SquadResponse.Membership(SquadResponseType.Cancel, charId, Some(0L), name, unk5 = false)
)
case None => ()
}
None
}

View file

@ -274,8 +274,8 @@ class SquadService extends Actor {
SquadActionMembershipCancel(cancellingPlayer, tplayer)
case SquadAction.Membership(SquadRequestType.Promote, _, _, _, _) => ()
// case SquadAction.Membership(SquadRequestType.Promote, promotingPlayer, Some(_promotedPlayer), promotedName, _) =>
// SquadActionMembershipPromote(promotingPlayer, _promotedPlayer, promotedName, SquadServiceMessage(tplayer, zone, action), sender())
case SquadAction.Membership(SquadRequestType.Promote, promotingPlayer, Some(_promotedPlayer), promotedName, _) =>
SquadActionMembershipPromote(promotingPlayer, _promotedPlayer, promotedName, SquadServiceMessage(tplayer, zone, action), sender())
case SquadAction.Membership(event, _, _, _, _) =>
info(s"SquadAction.Membership: $event is not yet supported")

View file

@ -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")

View file

@ -40,10 +40,10 @@ final case class IndirectInvite(originalRequester: Player, features: SquadFeatur
val leaderCharId = player.CharId
val invitedPlayer = originalRequester.CharId
manager
.handleVacancyInvite(features, invitedPlayer, invitedPlayer, originalRequester)
.handleVacancyInvite(features, invitedPlayer, leaderCharId, originalRequester)
.collect {
case (_, position) if manager.joinSquad(originalRequester, features, position) =>
manager.acceptanceMessages(invitedPlayer, invitedPlayer, originalRequester.Name)
manager.acceptanceMessages(leaderCharId, invitedPlayer, originalRequester.Name)
//clean up invitations specifically for this squad and this position
val cleanedUpActiveInvitesForSquadAndPosition = manager.cleanUpActiveInvitesForSquadAndPosition(features.Squad.GUID, position)
cleanedUpActiveInvitesForSquadAndPosition.collect { case (id, _) =>
@ -79,7 +79,7 @@ final case class IndirectInvite(originalRequester: Player, features: SquadFeatur
.orElse {
manager.publish(
leaderCharId,
SquadResponse.SquadRelatedComment(s"Your invitation to ${player.Name} was accepted, but failed.")
SquadResponse.SquadRelatedComment(s"Your invitation to ${originalRequester.Name} was accepted, but failed.")
)
manager.publish(
invitedPlayer,

View file

@ -114,7 +114,7 @@ final case class InvitationToCreateASquad(futureSquadLeader: Player)
SquadResponse.Membership(SquadResponseType.Reject, invitingPlayerCharId, Some(rejectingPlayer), player.Name, unk5 = false)
)
manager.publish(
rejectingPlayer,
invitingPlayerCharId,
SquadResponse.SquadRelatedComment(s"Your request to form a squad has been refused.")
)
}

View file

@ -109,10 +109,10 @@ final case class InvitationToJoinSquad(charId: Long, name: String, features: Squ
//rejectingPlayer is the would-be squad member; the squad leader sent the request and was rejected
doRejection(manager, player, rejectingPlayer)
manager.rejectionMessages(rejectingPlayer, charId, player.Name)
manager.publish(
/*manager.publish(
rejectingPlayer,
SquadResponse.SquadRelatedComment(s"Your request to join squad '${features.Squad.Task}' has been refused.")
)
)*/
}
def doRejection(