Working login to TR Sancuary!

Packet: SetCurrentAvatarMessage

Lots of hacks to get here, but wow, what a milestone.
This commit is contained in:
Chord 2016-07-15 01:45:10 -04:00
parent e0db8ec2b7
commit 5fa0610208
10 changed files with 76 additions and 13 deletions

View file

@ -64,7 +64,7 @@ class CryptoSessionActor extends Actor with MDCContextAware {
def NewClient : Receive = {
case RawPacket(msg) =>
PacketCoding.UnmarshalPacket(msg) match {
case Failure(e) => log.error("Could not decode packet: " + e)
case Failure(e) => log.error("Could not decode packet: " + e + s", msg ${msg.toString}")
case Successful(p) =>
//println("RECV: " + p)

View file

@ -90,7 +90,7 @@ class LoginSessionActor extends Actor with MDCContextAware {
}
val serverName = "PSForever"
val serverAddress = new InetSocketAddress(InetAddress.getLocalHost, 51001)
val serverAddress = new InetSocketAddress("192.168.0.2", 51001)
def handleGamePkt(pkt : PlanetSideGamePacket) = pkt match {
case LoginMessage(majorVersion, minorVersion, buildDate, username,
@ -112,7 +112,7 @@ class LoginSessionActor extends Actor with MDCContextAware {
case ConnectToWorldRequestMessage(name, _, _, _, _, _, _) =>
log.info(s"Connect to world request for '${name}'")
val response = ConnectToWorldMessage(serverName, serverAddress.getHostName, serverAddress.getPort)
val response = ConnectToWorldMessage(serverName, serverAddress.getHostString, serverAddress.getPort)
sendResponse(PacketCoding.CreateGamePacket(0, response))
case default => log.debug(s"Unhandled GamePacket ${pkt}")
}

View file

@ -11,7 +11,7 @@ import scodec.bits._
class WorldSessionActor extends Actor with MDCContextAware {
private[this] val log = org.log4s.getLogger
private case class UpdateServerList()
private case class PokeClient()
var leftRef : ActorRef = ActorRef.noSender
var rightRef : ActorRef = ActorRef.noSender
@ -34,6 +34,9 @@ class WorldSessionActor extends Actor with MDCContextAware {
handlePktContainer(ctrl)
case game @ GamePacket(_, _, _) =>
handlePktContainer(game)
// temporary hack to keep the client from disconnecting
case PokeClient() =>
sendResponse(PacketCoding.CreateGamePacket(0, KeepAliveMessage(0)))
case default => failWithError(s"Invalid packet class received: $default")
}
@ -92,6 +95,9 @@ class WorldSessionActor extends Actor with MDCContextAware {
}
}
// XXX: hard coded ObjectCreateMessage
val objectHex = hex"18 57 0C 00 00 BC 84 B0 06 C2 D7 65 53 5C A1 60 00 01 34 40 00 09 70 49 00 6C 00 6C 00 6C 00 49 00 49 00 49 00 6C 00 6C 00 6C 00 49 00 6C 00 49 00 6C 00 6C 00 49 00 6C 00 6C 00 6C 00 49 00 6C 00 6C 00 49 00 84 52 70 76 1E 80 80 00 00 00 00 00 3F FF C0 00 00 00 20 00 00 0F F6 A7 03 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FD 90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 90 01 90 00 64 00 00 01 00 7E C8 00 C8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 C0 00 42 C5 46 86 C7 00 00 00 80 00 00 12 40 78 70 65 5F 73 61 6E 63 74 75 61 72 79 5F 68 65 6C 70 90 78 70 65 5F 74 68 5F 66 69 72 65 6D 6F 64 65 73 8B 75 73 65 64 5F 62 65 61 6D 65 72 85 6D 61 70 31 33 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 0A 23 02 60 04 04 40 00 00 10 00 06 02 08 14 D0 08 0C 80 00 02 00 02 6B 4E 00 82 88 00 00 02 00 00 C0 41 C0 9E 01 01 90 00 00 64 00 44 2A 00 10 91 00 00 00 40 00 18 08 38 94 40 20 32 00 00 00 80 19 05 48 02 17 20 00 00 08 00 70 29 80 43 64 00 00 32 00 0E 05 40 08 9C 80 00 06 40 01 C0 AA 01 19 90 00 00 C8 00 3A 15 80 28 72 00 00 19 00 04 0A B8 05 26 40 00 03 20 06 C2 58 00 A7 88 00 00 02 00 00 80 00 00 "
def handleGamePkt(pkt : PlanetSideGamePacket) = pkt match {
case ConnectToWorldRequestMessage(server, token, majorVersion, minorVersion, revision, buildDate, unk) =>
@ -99,8 +105,14 @@ class WorldSessionActor extends Actor with MDCContextAware {
log.info(s"New world login to ${server} with Token:${token}. ${clientVersion}")
// ObjectCreateMessage
sendRawResponse(objectHex)
// XXX: hard coded message
sendRawResponse(hex"14 0F 00 00 00 10 27 00 00 C1 D8 7A 02 4B 00 26 5C B0 80 00 ")
// NOTE: PlanetSideZoneID just chooses the background
sendResponse(PacketCoding.CreateGamePacket(0,
CharacterInfoMessage(PlanetSideZoneID(0), 0, PlanetSideGUID(0), true, 0)))
CharacterInfoMessage(PlanetSideZoneID(1), 0, PlanetSideGUID(0), true, 0)))
case msg @ CharacterRequestMessage(charId, action) =>
log.info("Handling " + msg)
@ -108,6 +120,18 @@ class WorldSessionActor extends Actor with MDCContextAware {
case CharacterRequestAction.Delete =>
sendResponse(PacketCoding.CreateGamePacket(0, ActionResultMessage(false, Some(1))))
case CharacterRequestAction.Select =>
PacketCoding.DecodeGamePacket(objectHex).require match {
case ObjectCreateMessage(len, cls, guid, _) =>
// LoadMapMessage 13714 in mossy .gcap
// XXX: hardcoded shit
sendRawResponse(hex"31 85 6D 61 70 31 32 85 68 6F 6D 65 32 6C 9D 19 00 00 00 5F 40 B2 1C 80 ")
sendRawResponse(objectHex)
sendResponse(PacketCoding.CreateGamePacket(0, SetCurrentAvatarMessage(PlanetSideGUID(guid),0,0)))
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
context.system.scheduler.schedule(0 seconds, 1000 milliseconds, self, PokeClient())
}
case default =>
log.error("Unsupported " + default + " in " + msg)
}