diff --git a/src/main/scala/net/psforever/actors/net/MiddlewareActor.scala b/src/main/scala/net/psforever/actors/net/MiddlewareActor.scala index 4e5c594a8..0be4fffa0 100644 --- a/src/main/scala/net/psforever/actors/net/MiddlewareActor.scala +++ b/src/main/scala/net/psforever/actors/net/MiddlewareActor.scala @@ -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 diff --git a/src/main/scala/net/psforever/actors/session/csr/ChatLogic.scala b/src/main/scala/net/psforever/actors/session/csr/ChatLogic.scala index f90de34da..55e947a8a 100644 --- a/src/main/scala/net/psforever/actors/session/csr/ChatLogic.scala +++ b/src/main/scala/net/psforever/actors/session/csr/ChatLogic.scala @@ -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) 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 70e789621..9c2a07b20 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) { + 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/ChatLogic.scala b/src/main/scala/net/psforever/actors/session/normal/ChatLogic.scala index 052a1ebb4..0d0cd12db 100644 --- a/src/main/scala/net/psforever/actors/session/normal/ChatLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/ChatLogic.scala @@ -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) 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 8a0ae9f3c..79a472c83 100644 --- a/src/main/scala/net/psforever/actors/session/normal/SquadHandlerLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/SquadHandlerLogic.scala @@ -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 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 25c43274f..8f5e0e5b2 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionSquadHandlers.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionSquadHandlers.scala @@ -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, 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 68b5d1405..f9dd3a062 100644 --- a/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala +++ b/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala @@ -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 = { diff --git a/src/main/scala/net/psforever/services/teamwork/SquadInvitationManager.scala b/src/main/scala/net/psforever/services/teamwork/SquadInvitationManager.scala index eb7dd3224..123f0c93f 100644 --- a/src/main/scala/net/psforever/services/teamwork/SquadInvitationManager.scala +++ b/src/main/scala/net/psforever/services/teamwork/SquadInvitationManager.scala @@ -368,6 +368,7 @@ class SquadInvitationManager(subs: SquadSubscriptionEntity, parent: ActorRef) { charId, SquadResponse.Membership(SquadResponseType.Cancel, charId, Some(0L), name, unk5 = false) ) + 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 a3d731a60..afb5c9cf0 100644 --- a/src/main/scala/net/psforever/services/teamwork/SquadService.scala +++ b/src/main/scala/net/psforever/services/teamwork/SquadService.scala @@ -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") diff --git a/src/main/scala/net/psforever/services/teamwork/SquadSwitchboard.scala b/src/main/scala/net/psforever/services/teamwork/SquadSwitchboard.scala index ea8a55718..1366a59b7 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") diff --git a/src/main/scala/net/psforever/services/teamwork/invitations/IndirectInvite.scala b/src/main/scala/net/psforever/services/teamwork/invitations/IndirectInvite.scala index cb90cb786..7d73ba7fe 100644 --- a/src/main/scala/net/psforever/services/teamwork/invitations/IndirectInvite.scala +++ b/src/main/scala/net/psforever/services/teamwork/invitations/IndirectInvite.scala @@ -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, diff --git a/src/main/scala/net/psforever/services/teamwork/invitations/InvitationToCreateASquad.scala b/src/main/scala/net/psforever/services/teamwork/invitations/InvitationToCreateASquad.scala index efbdd9088..5f50bdd96 100644 --- a/src/main/scala/net/psforever/services/teamwork/invitations/InvitationToCreateASquad.scala +++ b/src/main/scala/net/psforever/services/teamwork/invitations/InvitationToCreateASquad.scala @@ -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.") ) } diff --git a/src/main/scala/net/psforever/services/teamwork/invitations/InvitationToJoinSquad.scala b/src/main/scala/net/psforever/services/teamwork/invitations/InvitationToJoinSquad.scala index 8f43482dd..708238729 100644 --- a/src/main/scala/net/psforever/services/teamwork/invitations/InvitationToJoinSquad.scala +++ b/src/main/scala/net/psforever/services/teamwork/invitations/InvitationToJoinSquad.scala @@ -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(