Fix quitting causing connection drop screen

This commit is contained in:
Jakob Gillich 2020-09-27 06:32:42 +02:00
parent fdc87516c1
commit 145d78ddcd
3 changed files with 23 additions and 22 deletions

View file

@ -30,13 +30,7 @@ import net.psforever.packet.control.{
TeardownConnection TeardownConnection
} }
import net.psforever.packet.crypto.{ClientChallengeXchg, ClientFinished, ServerChallengeXchg, ServerFinished} import net.psforever.packet.crypto.{ClientChallengeXchg, ClientFinished, ServerChallengeXchg, ServerFinished}
import net.psforever.packet.game.{ import net.psforever.packet.game.{ChangeFireModeMessage, CharacterInfoMessage, KeepAliveMessage, PingMsg}
ChangeFireModeMessage,
CharacterInfoMessage,
KeepAliveMessage,
ObjectCreateDetailedMessage,
PingMsg
}
import scodec.Attempt.{Failure, Successful} import scodec.Attempt.{Failure, Successful}
import scodec.bits.{BitVector, ByteVector, HexStringSyntax} import scodec.bits.{BitVector, ByteVector, HexStringSyntax}
import scodec.interop.akka.EnrichedByteVector import scodec.interop.akka.EnrichedByteVector
@ -78,6 +72,9 @@ object MiddlewareActor {
/** Send outgoing packet */ /** Send outgoing packet */
final case class Send(msg: PlanetSidePacket) extends Command final case class Send(msg: PlanetSidePacket) extends Command
/** Teardown connection */
final case class Teardown() extends Command
/** Close connection */ /** Close connection */
final case class Close() extends Command final case class Close() extends Command
} }
@ -329,15 +326,15 @@ class MiddlewareActor(
case _ => case _ =>
log.error(s"Unexpected packet type $packet in cryptoSetup") log.error(s"Unexpected packet type $packet in cryptoSetup")
stop() connectionClose()
} }
case Failure(e) => case Failure(e) =>
log.error(s"Could not decode packet in cryptoSetup: ${e}") log.error(s"Could not decode packet in cryptoSetup: ${e}")
stop() connectionClose()
} }
case other => case other =>
log.error(s"Invalid message '$other' received in cryptoSetup") log.error(s"Invalid message '$other' received in cryptoSetup")
stop() connectionClose()
} }
.receiveSignal(onSignal) .receiveSignal(onSignal)
} }
@ -397,15 +394,15 @@ class MiddlewareActor(
case other => case other =>
log.error(s"Unexpected packet '$other' in cryptoFinish") log.error(s"Unexpected packet '$other' in cryptoFinish")
stop() connectionClose()
} }
case Failure(e) => case Failure(e) =>
log.error(s"Could not decode packet in cryptoFinish: $e") log.error(s"Could not decode packet in cryptoFinish: $e")
stop() connectionClose()
} }
case other => case other =>
log.error(s"Invalid message '$other' received in cryptoFinish") log.error(s"Invalid message '$other' received in cryptoFinish")
stop() connectionClose()
} }
.receiveSignal(onSignal) .receiveSignal(onSignal)
} }
@ -431,11 +428,16 @@ class MiddlewareActor(
out(packet) out(packet)
Behaviors.same Behaviors.same
case Teardown() =>
send(TeardownConnection(clientNonce))
context.self ! Close()
Behaviors.same
case Close() => case Close() =>
outQueue outQueue
.dequeueAll(_ => true) .dequeueAll(_ => true)
.foreach(p => send(smp(0, p._2.bytes), Some(nextSequence), crypto)) .foreach(p => send(smp(0, p._2.bytes), Some(nextSequence), crypto))
stop() connectionClose()
} }
.receiveSignal(onSignal) .receiveSignal(onSignal)
} }
@ -505,7 +507,7 @@ class MiddlewareActor(
Behaviors.stopped Behaviors.stopped
case TeardownConnection(_) => case TeardownConnection(_) =>
stop() Behaviors.stopped
case ClientStart(_) => case ClientStart(_) =>
start() start()
@ -573,7 +575,7 @@ class MiddlewareActor(
ByteVector.view(array) ByteVector.view(array)
} }
def stop(): Behavior[Command] = { def connectionClose(): Behavior[Command] = {
send(ConnectionClose()) send(ConnectionClose())
Behaviors.stopped Behaviors.stopped
} }

View file

@ -9306,17 +9306,14 @@ class SessionActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], con
def KickedByAdministration(): Unit = { def KickedByAdministration(): Unit = {
sendResponse(DisconnectMessage("@kick_w")) sendResponse(DisconnectMessage("@kick_w"))
Thread.sleep(300) Thread.sleep(300)
// sendResponse(DropSession(session.id, "kick by GM")) middlewareActor ! MiddlewareActor.Teardown()
middlewareActor ! MiddlewareActor.Close()
} }
def ImmediateDisconnect(): Unit = { def ImmediateDisconnect(): Unit = {
if (avatar != null) { if (avatar != null) {
accountPersistence ! AccountPersistenceService.Logout(avatar.name) accountPersistence ! AccountPersistenceService.Logout(avatar.name)
} }
// sendResponse(DropCryptoSession()) middlewareActor ! MiddlewareActor.Teardown()
// sendResponse(DropSession(session.id, "user quit"))
middlewareActor ! MiddlewareActor.Close()
} }
def HandleWeaponFire(weaponGUID: PlanetSideGUID, projectileGUID: PlanetSideGUID, shotOrigin: Vector3): Unit = { def HandleWeaponFire(weaponGUID: PlanetSideGUID, projectileGUID: PlanetSideGUID, shotOrigin: Vector3): Unit = {
@ -9450,7 +9447,7 @@ class SessionActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], con
def failWithError(error: String) = { def failWithError(error: String) = {
log.error(error) log.error(error)
middlewareActor ! MiddlewareActor.Close() middlewareActor ! MiddlewareActor.Teardown()
} }
def sendResponse(packet: PlanetSidePacket): Unit = { def sendResponse(packet: PlanetSidePacket): Unit = {

View file

@ -428,6 +428,8 @@ object ObjectClass {
final val stealth_armor = 837 final val stealth_armor = 837
final val vehicle_terminal_combined = 952 final val vehicle_terminal_combined = 952
final val game_properties = 343
final val objectClassMap = scala.collection.mutable.Map[String, Int]() final val objectClassMap = scala.collection.mutable.Map[String, Int]()
def ByName(name: String): Int = { def ByName(name: String): Int = {