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 05750743b..06d7e44f1 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionAvatarHandlers.scala @@ -83,7 +83,10 @@ class SessionAvatarHandlers( val currentDistance = Vector3.DistanceSquared(ourPosition, pos) //sq.m val inDrawableRange = currentDistance <= maxRange val now = System.currentTimeMillis() //ms - if (!isNotRendered && inDrawableRange) { + if ( + sessionData.zoning.zoningStatus != Zoning.Status.Deconstructing && + !isNotRendered && inDrawableRange + ) { //conditions where visibility is assured val durationSince = now - lastTime //ms lazy val previouslyInDrawableRange = Vector3.DistanceSquared(ourPosition, lastPosition) <= maxRange 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 bafe56070..74243d913 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionData.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionData.scala @@ -1441,20 +1441,10 @@ class SessionData( sendUseGeneralEntityMessage(obj, item) case None if player.Faction == obj.Faction => //deconstruction - log.info(s"${player.Name} is deconstructing at the ${obj.Owner.Definition.Name}'s spawns") zoning.CancelZoningProcessWithDescriptiveReason("cancel_use") playerActionsToCancel() - avatar.implants.collect { - case Some(implant) if implant.active && !implant.definition.Passive => - avatarActor ! AvatarActor.DeactivateImplant(implant.definition.implantType) - } - player.Actor ! PlayerControl.ObjectHeld(Player.HandsDownSlot, updateMyHolsterArm = true) - zoning.zoningStatus = Zoning.Status.Deconstructing - if (player.death_by == 0) { - player.death_by = 1 - } terminals.CancelAllProximityUnits() - zoning.spawn.GoToDeploymentMap() + startDeconstructing(obj) case _ => () } } @@ -2779,9 +2769,32 @@ class SessionData( sendResponse(ChatMsg(ChatMessageType.UNK_227, wideContents=false, "", "@charsaved", None)) } + def startDeconstructing(obj: SpawnTube): Unit = { + log.info(s"${player.Name} is deconstructing at the ${obj.Owner.Definition.Name}'s spawns") + avatar.implants.collect { + case Some(implant) if implant.active && !implant.definition.Passive => + avatarActor ! AvatarActor.DeactivateImplant(implant.definition.implantType) + } + if (player.ExoSuit != ExoSuitType.MAX) { + player.Actor ! PlayerControl.ObjectHeld(Player.HandsDownSlot, updateMyHolsterArm = true) + } + zoning.spawn.nextSpawnPoint = Some(obj) //set fallback + zoning.zoningStatus = Zoning.Status.Deconstructing + player.allowInteraction = false + if (player.death_by == 0) { + player.death_by = 1 + } + zoning.spawn.GoToDeploymentMap() + } + def stopDeconstructing(): Unit = { zoning.zoningStatus = Zoning.Status.None player.death_by = math.min(player.death_by, 0) + player.allowInteraction = true + zoning.spawn.nextSpawnPoint.foreach { tube => + sendResponse(PlayerStateShiftMessage(ShiftState(0, tube.Position, tube.Orientation.z))) + zoning.spawn.nextSpawnPoint = None + } } def failWithError(error: String): Unit = { 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 e3d47ad47..41264f420 100644 --- a/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala +++ b/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala @@ -1920,7 +1920,9 @@ class ZoningOperations( TurnCounterDuringInterim } sessionData.keepAliveFunc = NormalKeepAlive - zoningStatus = Zoning.Status.None + if (zoningStatus == Zoning.Status.Deconstructing) { + sessionData.stopDeconstructing() + } upstreamMessageCount = 0 setAvatar = false sessionData.persist() @@ -1951,7 +1953,9 @@ class ZoningOperations( TurnCounterDuringInterim } sessionData.keepAliveFunc = NormalKeepAlive - zoningStatus = Zoning.Status.None + if (zoningStatus == Zoning.Status.Deconstructing) { + sessionData.stopDeconstructing() + } upstreamMessageCount = 0 setAvatar = false sessionData.persist()