diff --git a/common/src/main/scala/services/teamwork/SquadService.scala b/common/src/main/scala/services/teamwork/SquadService.scala index c0a69fbf..07b5d037 100644 --- a/common/src/main/scala/services/teamwork/SquadService.scala +++ b/common/src/main/scala/services/teamwork/SquadService.scala @@ -426,7 +426,7 @@ class SquadService extends Actor { case None => None } }) match { - case Some(invitedPlayer) => + case Some(invitedPlayer) if invitingPlayer != invitedPlayer => (memberToSquad.get(invitingPlayer), memberToSquad.get(invitedPlayer)) match { case (Some(squad1), Some(squad2)) if squad1.GUID == squad2.GUID => //both players are in the same squad; no need to do anything @@ -519,7 +519,7 @@ class SquadService extends Actor { case _ => ; } - case None => ; + case _ => ; } case SquadAction.Membership(SquadRequestType.ProximityInvite, invitingPlayer, _, _, _) => @@ -760,7 +760,6 @@ class SquadService extends Actor { } }) match { case out @ Some(leavingPlayer) if GetParticipatingSquad(leavingPlayer).contains(squad) => //kicked player must be in the same squad - log.info(s"leader=$leader, acting=$actingPlayer, leaving=$leavingPlayer") if(actingPlayer == leader) { if(leavingPlayer == leader || squad.Size == 2) { //squad leader is leaving his own squad, so it will be disbanded @@ -1254,11 +1253,15 @@ class SquadService extends Actor { val features = squadFeatures(squad.GUID) features.LocationFollowsSquadLead = true features.AutoApproveInvitationRequests = true - UpdateSquadListWhenListed(features, SquadInfo().Task("").ZoneId(None).Capacity(squad.Capacity)) + if(features.Listed) { + //unlist the squad + features.Listed = false + Publish(features.ToChannel, SquadResponse.SetListSquad(PlanetSideGUID(0))) + UpdateSquadList(squad, None) + } UpdateSquadDetail(squad) InitialAssociation(squad) squadFeatures(guid).InitialAssociation = true - //do not unlist an already listed squad case Some(squad) => //underutilized squad; just close it out CloseSquad(squad) @@ -2159,7 +2162,7 @@ class SquadService extends Actor { * The initial formation of a squad of two players is the most common expected situation. * While the underlying flag is normally only set once, its state can be reset and triggered anew if necessary. * @see `Publish` - * @see `ResetAll` + * @see ``ResetAll * @see `SquadResponse.AssociateWithSquad` * @see `SquadResponse.Detail` * @see `SquadService.Detail.Publish` @@ -2425,7 +2428,11 @@ class SquadService extends Actor { .unzip val updateIndicesList = updateIndices.toList val completelyBlankSquadDetail = SquadDetail().Complete - val channel = s"/${squadFeatures(squad.GUID).ToChannel}/Squad" + val features = squadFeatures(guid) + val channel = s"/${features.ToChannel}/Squad" + if(features.Listed) { + Publish(squad.Leader.CharId, SquadResponse.SetListSquad(PlanetSideGUID(0))) + } updateMembers .foreach { case (member, charId, _, None) => diff --git a/common/src/test/scala/objects/DamageModelTests.scala b/common/src/test/scala/objects/DamageModelTests.scala index 1230b043..5a477c88 100644 --- a/common/src/test/scala/objects/DamageModelTests.scala +++ b/common/src/test/scala/objects/DamageModelTests.scala @@ -70,11 +70,11 @@ class DamageCalculationsTests extends Specification { } "calculate distance between target and source" in { - DistanceBetweenTargetandSource(resprojectile) mustEqual 10 + DistanceBetweenTargetandSource(resprojectile) mustEqual 67.38225f } "calculate distance between target and explosion (splash)" in { - DistanceFromExplosionToTarget(resprojectile) mustEqual 64.03124f + DistanceFromExplosionToTarget(resprojectile) mustEqual 63.031242f } "calculate no damage from components" in { diff --git a/pslogin/src/main/scala/WorldSessionActor.scala b/pslogin/src/main/scala/WorldSessionActor.scala index cfb10565..8d263f31 100644 --- a/pslogin/src/main/scala/WorldSessionActor.scala +++ b/pslogin/src/main/scala/WorldSessionActor.scala @@ -131,6 +131,8 @@ class WorldSessionActor extends Actor with MDCContextAware { var lfs : Boolean = false var squadChannel : Option[String] = None var squadSetup : () => Unit = FirstTimeSquadSetup + var squadUpdateCounter : Int = 0 + val queuedSquadActions : Seq[() => Unit] = Seq(SquadUpdates, NoSquadUpdates, NoSquadUpdates, NoSquadUpdates) var amsSpawnPoints : List[SpawnPoint] = Nil var clientKeepAlive : Cancellable = DefaultCancellable.obj @@ -450,7 +452,7 @@ class WorldSessionActor extends Actor with MDCContextAware { sendResponse(PlanetsideAttributeMessage(playerGuid, 32, ourIndex)) //a finalization? what does this do? sendResponse(SquadDefinitionActionMessage(squad.GUID, 0, SquadAction.Unknown(18))) - updateSquad = UpdatesWhenEnrolledInSquad + updateSquad = PeriodicUpdatesWhenEnrolledInSquad squadChannel = Some(toChannel) case _ => //other player is joining our squad @@ -494,6 +496,7 @@ class WorldSessionActor extends Actor with MDCContextAware { //a finalization? what does this do? sendResponse(SquadDefinitionActionMessage(PlanetSideGUID(0), 0, SquadAction.Unknown(18))) squad_supplement_id = 0 + squadUpdateCounter = 0 updateSquad = NoSquadUpdates squadChannel = None case _ => @@ -9326,7 +9329,7 @@ class WorldSessionActor extends Actor with MDCContextAware { def NoSquadUpdates() : Unit = { } - def UpdatesWhenEnrolledInSquad() : Unit = { + def SquadUpdates() : Unit = { squadService ! SquadServiceMessage( player, continent, @@ -9341,6 +9344,11 @@ class WorldSessionActor extends Actor with MDCContextAware { ) } + def PeriodicUpdatesWhenEnrolledInSquad() : Unit = { + queuedSquadActions(squadUpdateCounter)() + squadUpdateCounter = (squadUpdateCounter + 1) % queuedSquadActions.length + } + def failWithError(error : String) = { log.error(error) sendResponse(ConnectionClose())