diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/DetailedCharacterData.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/DetailedCharacterData.scala
index cc3663a9..721f5978 100644
--- a/common/src/main/scala/net/psforever/packet/game/objectcreate/DetailedCharacterData.scala
+++ b/common/src/main/scala/net/psforever/packet/game/objectcreate/DetailedCharacterData.scala
@@ -71,10 +71,11 @@ final case class ImplantEntry(implant : ImplantType.Value,
* the first entry may be padded
* @param inventory the avatar's inventory
* @param drawn_slot the holster that is initially drawn
- * @see `CharacterAppearanceData`
- * @see `CharacterData`
- * @see `InventoryData`
- * @see `DrawnSlot`
+ * @see `CharacterAppearanceData`
+ * `CharacterData`
+ * `CertificationType`
+ * `InventoryData`
+ * `DrawnSlot`
*/
final case class DetailedCharacterData(appearance : CharacterAppearanceData,
bep : Long,
@@ -322,17 +323,15 @@ object DetailedCharacterData extends Marshallable[DetailedCharacterData] {
recursiveEnsureImplantSlots(implantCapacity, implants)
}
//shift the first elements off their lists
- var fteListCopy = fteList
- var firstEvent : Option[String] = None
- if(fteList.nonEmpty) {
- firstEvent = Some(fteList.head)
- fteListCopy = fteList.tail
+ val (firstEvent, fteListCopy) = fteList match {
+ case (f : String) +: Nil => (Some(f), Nil)
+ case ((f : String) +: (rest : List[String])) => (Some(f), rest)
+ case Nil => (None, Nil)
}
- var tutListCopy = tutList
- var firstTutorial : Option[String] = None
- if(tutList.nonEmpty) {
- firstTutorial = Some(tutList.head)
- tutListCopy = tutList.tail
+ val (firstTutorial, tutListCopy) = tutList match {
+ case (f : String) +: Nil => (Some(f), Nil)
+ case ((f : String) +: (rest : List[String])) => (Some(f), rest)
+ case Nil => (None, Nil)
}
Attempt.successful(app :: bep :: cep :: () :: hpmax :: hp :: () :: armor :: () :: u1 :: () :: u2 :: u3 :: stamax :: stam :: () :: certs :: None :: () :: implantList :: () :: fteList.size.toLong :: firstEvent :: fteListCopy :: tutList.size.toLong :: firstTutorial :: tutListCopy :: () :: inv :: drawn :: false :: HNil)
}
diff --git a/pslogin/src/main/scala/WorldSessionActor.scala b/pslogin/src/main/scala/WorldSessionActor.scala
index 56e0024d..c69ead66 100644
--- a/pslogin/src/main/scala/WorldSessionActor.scala
+++ b/pslogin/src/main/scala/WorldSessionActor.scala
@@ -394,25 +394,22 @@ class WorldSessionActor extends Actor with MDCContextAware {
case ListAccountCharacters =>
val gen : AtomicInteger = new AtomicInteger(1)
- //log.info(s"${PacketCoding.DecodePacket(objectHex)}")
- sendResponse(objectHex)
- sendResponse(PacketCoding.CreateGamePacket(0, CharacterInfoMessage(15,PlanetSideZoneID(10000), 41605313, PlanetSideGUID(75), false, 6404428)))
//load characters
-// SetCharacterSelectScreenGUID(player, gen)
-// val health = player.Health
-// val stamina = player.Stamina
-// val armor = player.Armor
-// player.Spawn
-// sendResponse(PacketCoding.CreateGamePacket(0,
-// ObjectCreateMessage(ObjectClass.avatar, player.GUID, player.Definition.Packet.ConstructorData(player).get)
-// ))
-// if(health > 0) { //player can not be dead; stay spawned as alive
-// player.Health = health
-// player.Stamina = stamina
-// player.Armor = armor
-// }
-// sendResponse(PacketCoding.CreateGamePacket(0, CharacterInfoMessage(15,PlanetSideZoneID(10000), 41605313, player.GUID, false, 6404428)))
-// RemoveCharacterSelectScreenGUID(player)
+ SetCharacterSelectScreenGUID(player, gen)
+ val health = player.Health
+ val stamina = player.Stamina
+ val armor = player.Armor
+ player.Spawn
+ sendResponse(PacketCoding.CreateGamePacket(0,
+ ObjectCreateMessage(ObjectClass.avatar, player.GUID, player.Definition.Packet.ConstructorData(player).get)
+ ))
+ if(health > 0) { //player can not be dead; stay spawned as alive
+ player.Health = health
+ player.Stamina = stamina
+ player.Armor = armor
+ }
+ sendResponse(PacketCoding.CreateGamePacket(0, CharacterInfoMessage(15,PlanetSideZoneID(10000), 41605313, player.GUID, false, 6404428)))
+ RemoveCharacterSelectScreenGUID(player)
sendResponse(PacketCoding.CreateGamePacket(0, CharacterInfoMessage(0, PlanetSideZoneID(1), 0, PlanetSideGUID(0), true, 0)))
@@ -453,16 +450,15 @@ class WorldSessionActor extends Actor with MDCContextAware {
sendResponse(PacketCoding.CreateGamePacket(0, LoadMapMessage("map13","home3",40100,25,true,3770441820L))) //VS Sanctuary
//load the now-registered player
tplayer.Spawn
-// sendResponse(PacketCoding.CreateGamePacket(0,
-// ObjectCreateDetailedMessage(ObjectClass.avatar, tplayer.GUID, tplayer.Definition.Packet.DetailedConstructorData(tplayer).get)
-// ))
- sendResponse(objectHex)
+ sendResponse(PacketCoding.CreateGamePacket(0,
+ ObjectCreateDetailedMessage(ObjectClass.avatar, tplayer.GUID, tplayer.Definition.Packet.DetailedConstructorData(tplayer).get)
+ ))
avatarService ! AvatarServiceMessage(tplayer.Continent, AvatarAction.LoadPlayer(tplayer.GUID, tplayer.Definition.Packet.ConstructorData(tplayer).get))
log.debug(s"ObjectCreateDetailedMessage: ${tplayer.Definition.Packet.DetailedConstructorData(tplayer).get}")
case SetCurrentAvatar(tplayer) =>
//avatar-specific
- val guid = PlanetSideGUID(75)//tplayer.GUID
+ val guid = tplayer.GUID
LivePlayerList.Assign(sessionId, guid)
sendResponse(PacketCoding.CreateGamePacket(0, SetCurrentAvatarMessage(guid,0,0)))
sendResponse(PacketCoding.CreateGamePacket(0, CreateShortcutMessage(guid, 1, 0, true, Shortcut.MEDKIT)))
@@ -495,54 +491,6 @@ class WorldSessionActor extends Actor with MDCContextAware {
failWithError(s"Invalid packet class received: $default")
}
-// 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"
- val objectHex = PacketCoding.CreateGamePacket(0,
- ObjectCreateDetailedMessage(
- 121,
- PlanetSideGUID(75),
- DetailedCharacterData(
- CharacterAppearanceData(
- PlacementData(Vector3(3674.8438f,2726.789f,91.15625f), Vector3(0.0f,0.0f,36.5625f)),
- BasicCharacterData("psemu2",PlanetSideEmpire.VS,CharacterGender.Female,41,1),
- 0,
- false,
- false,
- ExoSuitType.Standard,
- "",
- 0,
- false,
- 2.8125f, 210.9375f,
- true,
- GrenadeState.None,
- false,
- false,
- false,
- RibbonBars()
- ),
- 0,
- 0,
- 100, 100,
- 50,
- 1,7,7,
- 100,100,
- List(
- CertificationType.StandardAssault,
- CertificationType.MediumAssault,
- CertificationType.ATV,
- CertificationType.Harasser,
- CertificationType.StandardExoSuit,
- CertificationType.AgileExoSuit,
- CertificationType.ReinforcedExoSuit
- ),
- List(),
- List("xpe_blackops"),
- List(),
- None,
- DrawnSlot.None
- )
- )
- )
-
def handlePkt(pkt : PlanetSidePacket) : Unit = pkt match {
case ctrl : PlanetSideControlPacket =>
handleControlPkt(ctrl)
@@ -636,6 +584,13 @@ class WorldSessionActor extends Actor with MDCContextAware {
player.Position = Vector3(3674.8438f, 2726.789f, 91.15625f)
player.Orientation = Vector3(0f, 0f, 90f)
player.Continent = "home3"
+ player.Certifications += CertificationType.StandardAssault
+ player.Certifications += CertificationType.MediumAssault
+ player.Certifications += CertificationType.StandardExoSuit
+ player.Certifications += CertificationType.AgileExoSuit
+ player.Certifications += CertificationType.ReinforcedExoSuit
+ player.Certifications += CertificationType.ATV
+ player.Certifications += CertificationType.Harasser
player.Slot(0).Equipment = beamer1
player.Slot(2).Equipment = suppressor1
player.Slot(4).Equipment = forceblade1