Merge pull request #737 from Fate-JH/logging

Logging
This commit is contained in:
Mazo 2021-03-26 12:37:17 +00:00 committed by GitHub
commit a22f1118d1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
89 changed files with 1080 additions and 889 deletions

View file

@ -100,10 +100,9 @@ class LoginActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], conne
val clientVersion = s"Client Version: $majorVersion.$minorVersion.$revision, $buildDate"
if (token.isDefined)
log.info(s"New login UN:$username Token:${token.get}. $clientVersion")
log.trace(s"New login UN:$username Token:${token.get}. $clientVersion")
else {
// log.info(s"New login UN:$username PW:$password. $clientVersion")
log.info(s"New login UN:$username. $clientVersion")
log.trace(s"New login UN:$username. $clientVersion")
}
accountLogin(username, password.get)
@ -115,7 +114,7 @@ class LoginActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], conne
middlewareActor ! MiddlewareActor.Close()
case _ =>
log.debug(s"Unhandled GamePacket $pkt")
log.warn(s"Unhandled GamePacket $pkt")
}
def accountLogin(username: String, password: String): Unit = {
@ -197,7 +196,7 @@ class LoginActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], conne
}
def loginPwdFailureResponse(username: String, newToken: String) = {
log.info(s"Failed login to account $username")
log.warn(s"Failed login to account $username")
middlewareActor ! MiddlewareActor.Send(
LoginRespMessage(
newToken,
@ -212,7 +211,7 @@ class LoginActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], conne
}
def loginFailureResponse(username: String, newToken: String) = {
log.info("DB problem")
log.warn("DB problem")
middlewareActor ! MiddlewareActor.Send(
LoginRespMessage(
newToken,
@ -227,7 +226,7 @@ class LoginActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], conne
}
def loginAccountFailureResponse(username: String, newToken: String) = {
log.info(s"Account $username inactive")
log.warn(s"Account $username inactive")
middlewareActor ! MiddlewareActor.Send(
LoginRespMessage(
newToken,

View file

@ -292,7 +292,7 @@ class MiddlewareActor(
Behaviors.same
case _: ChangeFireModeMessage =>
log.trace(s"What is this packet that just arrived? ${msg.toString}")
log.trace(s"What is this packet that just arrived? $msg")
//ignore
Behaviors.same

View file

@ -82,7 +82,7 @@ object SocketActor {
socketActor ! toSocket(message)
}
} else {
log.info("Network simulator dropped packet")
log.trace("Network simulator dropped packet")
}
}

View file

@ -47,7 +47,7 @@ import net.psforever.packet.game.{
PlanetsideAttributeMessage
}
import net.psforever.types.{
CharacterGender,
CharacterSex,
CharacterVoice,
ExoSuitType,
ImplantType,
@ -98,7 +98,7 @@ object AvatarActor {
name: String,
head: Int,
voice: CharacterVoice.Value,
gender: CharacterGender.Value,
gender: CharacterSex,
empire: PlanetSideEmpire.Value
) extends Command
@ -306,7 +306,7 @@ class AvatarActor(
_.factionId -> lift(empire.id),
_.headId -> lift(head),
_.voiceId -> lift(voice.id),
_.genderId -> lift(gender.id),
_.genderId -> lift(gender.value),
_.bep -> lift(Config.app.game.newAvatar.br.experience),
_.cep -> lift(Config.app.game.newAvatar.cr.experience)
)
@ -326,7 +326,7 @@ class AvatarActor(
result.onComplete {
case Success(_) =>
log.debug(s"created character ${name} for account ${account.name}")
log.debug(s"AvatarActor: created character ${name} for account ${account.name}")
sessionActor ! SessionActor.SendResponse(ActionResultMessage.Pass)
sendAvatars(account)
case Failure(e) => log.error(e)("db failure")
@ -353,7 +353,7 @@ class AvatarActor(
result.onComplete {
case Success(_) =>
log.debug(s"avatar $id deleted")
log.debug(s"AvatarActor: avatar $id deleted")
sessionActor ! SessionActor.SendResponse(ActionResultMessage.Pass)
sendAvatars(account)
case Failure(e) => log.error(e)("db failure")
@ -485,14 +485,20 @@ class AvatarActor(
ItemTransactionResultMessage(terminalGuid, TransactionType.Learn, success = false)
)
} else {
val deps = Certification.values.filter(_.requires.contains(certification)).toSet
val remove = deps ++ Certification.values.filter(_.replaces.intersect(deps).nonEmpty).toSet + certification
var requiredByCert: Set[Certification] = Set(certification)
var removeThese: Set[Certification] = Set(certification)
val allCerts: Set[Certification] = Certification.values.toSet
do {
removeThese = allCerts.filter { testingCert =>
testingCert.requires.intersect(removeThese).nonEmpty
}
requiredByCert = requiredByCert ++ removeThese
} while(removeThese.nonEmpty)
Future
.sequence(
avatar.certifications
.intersect(remove)
.intersect(requiredByCert)
.map(cert => {
ctx
.run(
@ -511,7 +517,7 @@ class AvatarActor(
ItemTransactionResultMessage(terminalGuid, TransactionType.Sell, success = false)
)
case Success(certs) =>
context.self ! ReplaceAvatar(avatar.copy(certifications = avatar.certifications.diff(remove)))
context.self ! ReplaceAvatar(avatar.copy(certifications = avatar.certifications.diff(certs)))
certs.foreach { cert =>
sessionActor ! SessionActor.SendResponse(
PlanetsideAttributeMessage(session.get.player.GUID, 25, cert.value)
@ -1269,7 +1275,7 @@ class AvatarActor(
.run(query[persistence.Loadout].filter(_.avatarId == lift(avatar.id)))
.map { loadouts =>
loadouts.map { loadout =>
val doll = new Player(Avatar(0, "doll", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
val doll = new Player(Avatar(0, "doll", PlanetSideEmpire.TR, CharacterSex.Male, 0, CharacterVoice.Mute))
doll.ExoSuit = ExoSuitType(loadout.exosuitId)
loadout.items.split("/").foreach {

View file

@ -121,8 +121,6 @@ class ChatActor(
Behaviors.same
case Message(message) =>
log.info("Chat: " + message)
val gmCommandAllowed =
session.account.gm || Config.app.development.unprivilegedGmCommands.contains(message.messageType)
@ -916,7 +914,7 @@ class ChatActor(
}
case _ =>
log.info(s"unhandled chat message $message")
log.warn(s"Unhandled chat message $message")
}
Behaviors.same
@ -945,7 +943,7 @@ class ChatActor(
val args = message.contents.split(" ")
val (name, time) = (args.lift(0), args.lift(1)) match {
case (Some(name), _) if name != session.player.Name =>
log.error("received silence message for other player")
log.error("Received silence message for other player")
(None, None)
case (Some(name), None) => (Some(name), Some(5))
case (Some(name), Some(time)) if time.toIntOption.isDefined => (Some(name), Some(time.toInt))
@ -976,11 +974,11 @@ class ChatActor(
}
case (name, time) =>
log.error(s"bad silence args $name $time")
log.warn(s"Bad silence args $name $time")
}
case _ =>
log.error(s"unexpected messageType $message")
log.warn(s"Unexpected messageType $message")
}
Behaviors.same

View file

@ -26,7 +26,7 @@ class TcpListener[T <: Actor](actorClass: Class[T], nextActorName: String, liste
def receive = {
case Tcp.Bound(local) =>
log.info(s"Now listening on TCP:$local")
log.debug(s"Now listening on TCP:$local")
context.become(ready(sender()))
case Tcp.CommandFailed(Tcp.Bind(_, address, _, _, _)) =>

View file

@ -2,7 +2,7 @@
package net.psforever.objects
import akka.actor.ActorRef
import net.psforever.objects.avatar.Avatar
import net.psforever.objects.avatar.{Avatar, Certification}
import scala.concurrent.duration._
import net.psforever.objects.ce.{Deployable, DeployedItem}
@ -13,7 +13,7 @@ import net.psforever.services.RemoverActor
import net.psforever.services.local.{LocalAction, LocalServiceMessage}
object Deployables {
private val log = org.log4s.getLogger("Deployables")
//private val log = org.log4s.getLogger("Deployables")
object Make {
def apply(item: DeployedItem.Value): () => PlanetSideGameObject with Deployable = cemap(item)
@ -128,7 +128,6 @@ object Deployables {
* @param avatar the player's core
*/
def InitializeDeployableQuantities(avatar: Avatar): Boolean = {
log.info("Setting up combat engineering ...")
avatar.deployables.Initialize(avatar.certifications)
}
@ -137,8 +136,35 @@ object Deployables {
* @param avatar the player's core
*/
def InitializeDeployableUIElements(avatar: Avatar): List[(Int, Int, Int, Int)] = {
log.info("Setting up combat engineering UI ...")
avatar.deployables.UpdateUI()
}
/**
* Compare sets of certifications to determine if
* the requested `Engineering`-like certification requirements of the one group can be found in a another group.
* @see `CertificationType`
* @param sample the certifications to be compared against
* @param test the desired certifications
* @return `true`, if the desired certification requirements are met; `false`, otherwise
*/
def constructionItemPermissionComparison(
sample: Set[Certification],
test: Set[Certification]
): Boolean = {
import Certification._
val engineeringCerts: Set[Certification] = Set(AssaultEngineering, FortificationEngineering)
val testDiff: Set[Certification] = test diff (engineeringCerts ++ Set(AdvancedEngineering))
//substitute `AssaultEngineering` and `FortificationEngineering` for `AdvancedEngineering`
val sampleIntersect = if (sample contains AdvancedEngineering) {
engineeringCerts
} else {
sample intersect engineeringCerts
}
val testIntersect = if (test contains AdvancedEngineering) {
engineeringCerts
} else {
test intersect engineeringCerts
}
(sample intersect testDiff equals testDiff) && (sampleIntersect intersect testIntersect equals testIntersect)
}
}

View file

@ -1646,7 +1646,7 @@ object GlobalDefinitions {
1.093750f // same regardless of gender
} else if (p.ExoSuit == ExoSuitType.MAX) {
1.906250f // VS female MAX
} else if (p.Sex == CharacterGender.Male) {
} else if (p.Sex == CharacterSex.Male) {
obj.Definition.MaxDepth // male
} else {
1.546875f // female

View file

@ -79,7 +79,7 @@ class Player(var avatar: Avatar)
def Faction: PlanetSideEmpire.Value = avatar.faction
def Sex: CharacterGender.Value = avatar.sex
def Sex: CharacterSex = avatar.sex
def Head: Int = avatar.head

View file

@ -226,7 +226,7 @@ object Vehicles {
* @param unk na; used by `HackMessage` as `unk5`
*/
def FinishHackingVehicle(target: Vehicle, hacker: Player, unk: Long)(): Unit = {
log.info(s"Vehicle guid: ${target.GUID} has been jacked")
log.info(s"${hacker.Name} has jacked a ${target.Definition.Name}")
val zone = target.Zone
// Forcefully dismount any cargo
target.CargoHolds.values.foreach(cargoHold => {

View file

@ -72,7 +72,7 @@ case class Avatar(
id: Int,
name: String,
faction: PlanetSideEmpire.Value,
sex: CharacterGender.Value,
sex: CharacterSex,
head: Int,
voice: CharacterVoice.Value,
bep: Long = 0,

View file

@ -328,7 +328,7 @@ class PlayerControl(player: Player, avatarActor: typed.ActorRef[AvatarActor.Comm
)
case Terminal.InfantryLoadout(exosuit, subtype, holsters, inventory) =>
log.info(s"wants to change equipment loadout to their option #${msg.unk1 + 1}")
log.info(s"${player.Name} wants to change equipment loadout to their option #${msg.unk1 + 1}")
val fallbackSubtype = 0
val fallbackSuit = ExoSuitType.Standard
val originalSuit = player.ExoSuit
@ -371,7 +371,7 @@ class PlayerControl(player: Player, avatarActor: typed.ActorRef[AvatarActor.Comm
(exosuit, subtype)
} else {
log.warn(
s"no longer has permission to wear the exo-suit type $exosuit; will wear $fallbackSuit instead"
s"${player.Name} no longer has permission to wear the exo-suit type $exosuit; will wear $fallbackSuit instead"
)
(fallbackSuit, fallbackSubtype)
}
@ -710,6 +710,12 @@ class PlayerControl(player: Player, avatarActor: typed.ActorRef[AvatarActor.Comm
super.CancelJammeredStatus(target)
//uninitialize implants
avatarActor ! AvatarActor.DeinitializeImplants()
cause.adversarial match {
case Some(a) =>
damageLog.info(s"DisplayDestroy: ${a.defender} was killed by ${a.attacker}")
case _ =>
damageLog.info(s"DisplayDestroy: ${player.Name} killed ${player.Sex.pronounObject}self.")
}
events ! AvatarServiceMessage(
nameChannel,
AvatarAction.Killed(player_guid, target.VehicleSeated)

View file

@ -30,7 +30,7 @@ class CorpseConverter extends AvatarConverter {
*/
private def MakeAppearanceData(obj: Player): Int => CharacterAppearanceData = {
val aa: Int => CharacterAppearanceA = CharacterAppearanceA(
BasicCharacterData(obj.Name, obj.Faction, CharacterGender.Male, 0, CharacterVoice.Mute),
BasicCharacterData(obj.Name, obj.Faction, CharacterSex.Male, 0, CharacterVoice.Mute),
CommonFieldData(
obj.Faction,
bops = false,

View file

@ -44,7 +44,7 @@ class NumberPoolActor(pool: NumberPool) extends Actor {
sender() ! NumberPoolActor.ReturnNumberResult(number, ex, id)
case msg =>
log.info(s"received an unexpected message - ${msg.toString}")
log.warn(s"Received an unexpected message - ${msg.toString}")
}
}

View file

@ -103,7 +103,7 @@ class UniqueNumberSystem(private val guid: NumberPoolHub, private val poolActors
}
} catch {
case _: Exception =>
log.info(s"$obj is already unregistered")
log.warn(s"$obj is already unregistered")
callback ! Success(obj)
}

View file

@ -104,7 +104,7 @@ object GenericHackables {
def FinishHacking(target: PlanetSideServerObject with Hackable, user: Player, unk: Long)(): Unit = {
import akka.pattern.ask
import scala.concurrent.duration._
log.info(s"Hacked a $target")
log.info(s"${user.Name} hacked a ${target.Definition.Name}")
// Wait for the target actor to set the HackedBy property, otherwise LocalAction.HackTemporarily will not complete properly
import scala.concurrent.ExecutionContext.Implicits.global
val tplayer = user

View file

@ -41,7 +41,7 @@ class IFFLockControl(lock: IFFLock)
)
} else {
val log = org.log4s.getLogger
log.warn("IFF lock is being hacked, but don't know how to handle this state:")
log.warn(s"IFF lock is being hacked by ${player.Faction}, but don't know how to handle this state:")
log.warn(s"Lock - Faction=${lock.Faction}, HackedBy=${lock.HackedBy}")
log.warn(s"Player - Faction=${player.Faction}")
}

View file

@ -24,7 +24,7 @@ class PainboxControl(painbox: Painbox) extends PoweredAmenityControl {
if (painbox.Owner.Continent.matches("c[0-9]")) {
//are we in a safe zone?
// todo: handle non-radius painboxes in caverns properly
log.info(s"Skipping initialization of ${painbox.GUID} on ${painbox.Owner.Continent} - ${painbox.Position}")
log.debug(s"Skipping initialization of ${painbox.GUID} on ${painbox.Owner.Continent} - ${painbox.Position}")
disabled = true
} else {
if (painbox.Definition.HasNearestDoorDependency) {

View file

@ -99,7 +99,7 @@ class ResourceSiloControl(resourceSilo: ResourceSilo)
// Only send updated capacitor display value to all clients if it has actually changed
if (resourceSilo.CapacitorDisplay != siloDisplayBeforeChange) {
log.trace(
s"Silo ${resourceSilo.GUID} NTU bar level has changed from $siloDisplayBeforeChange to ${resourceSilo.CapacitorDisplay}"
s"UpdateChargeLevel: silo ${resourceSilo.GUID} NTU bar level has changed from $siloDisplayBeforeChange to ${resourceSilo.CapacitorDisplay}"
)
zone.AvatarEvents ! AvatarServiceMessage(
zone.id,

View file

@ -0,0 +1,57 @@
// Copyright (c) 2020 PSForever
package net.psforever.objects.serverobject.terminals
import net.psforever.objects.Player
import net.psforever.objects.serverobject.CommonMessages
import net.psforever.objects.serverobject.terminals.capture.CaptureTerminal
import net.psforever.services.local.{LocalAction, LocalServiceMessage}
import scala.util.{Failure, Success}
object CaptureTerminals {
private val log = org.log4s.getLogger("CaptureTerminals")
/**
* The process of hacking an object is completed.
* Pass the message onto the hackable object and onto the local events system.
* @param target the `Hackable` object that has been hacked
* @param unk na;
* used by `HackMessage` as `unk5`
* @see `HackMessage`
*/
//TODO add params here depending on which params in HackMessage are important
def FinishHackingCaptureConsole(target: CaptureTerminal, hackingPlayer: Player, unk: Long)(): Unit = {
import akka.pattern.ask
import scala.concurrent.duration._
log.info(s"${hackingPlayer.toString} hacked a ${target.Definition.Name}")
// Wait for the target actor to set the HackedBy property
import scala.concurrent.ExecutionContext.Implicits.global
ask(target.Actor, CommonMessages.Hack(hackingPlayer, target))(1 second).mapTo[Boolean].onComplete {
case Success(_) =>
target.Zone.LocalEvents ! LocalServiceMessage(
target.Zone.id,
LocalAction.TriggerSound(hackingPlayer.GUID, target.HackSound, hackingPlayer.Position, 30, 0.49803925f)
)
val isResecured = hackingPlayer.Faction == target.Faction
if (isResecured) {
// Resecure the CC
target.Zone.LocalEvents ! LocalServiceMessage(
target.Zone.id,
LocalAction.ResecureCaptureTerminal(
target
)
)
}
else {
// Start the CC hack timer
target.Zone.LocalEvents ! LocalServiceMessage(
target.Zone.id,
LocalAction.StartCaptureTerminalHack(
target
)
)
}
case Failure(_) => log.warn(s"Hack message failed on target guid: ${target.GUID}")
}
}
}

View file

@ -23,7 +23,7 @@ object CaptureTerminals {
import akka.pattern.ask
import scala.concurrent.duration._
log.info(s"${hackingPlayer.toString} Hacked a ${target.toString}")
log.info(s"${hackingPlayer.toString} hacked a ${target.Definition.Name}")
// Wait for the target actor to set the HackedBy property
import scala.concurrent.ExecutionContext.Implicits.global
ask(target.Actor, CommonMessages.Hack(hackingPlayer, target))(1 second).mapTo[Boolean].onComplete {

View file

@ -46,7 +46,7 @@ object WeaponTurrets {
* @param upgrade the upgrade being applied to the turret (usually, it's weapon system)
*/
def FinishUpgradingMannedTurret(target: FacilityTurret, upgrade: TurretUpgrade.Value): Unit = {
log.info(s"Converting manned wall turret weapon to $upgrade")
log.info(s"Manned wall turret weapon being converted to $upgrade")
val zone = target.Zone
val events = zone.VehicleEvents
events ! VehicleServiceMessage.TurretUpgrade(TurretUpgrader.ClearSpecific(List(target), zone))

View file

@ -147,7 +147,7 @@ object CargoBehavior {
)
if (distance <= 64) {
//cargo vehicle is close enough to assume to be physically within the carrier's hold; mount it
log.info(s"HandleCheckCargoMounting: mounting cargo vehicle in carrier at distance of $distance")
log.debug(s"HandleCheckCargoMounting: mounting cargo vehicle in carrier at distance of $distance")
cargo.MountedIn = carrierGUID
hold.mount(cargo)
cargo.Velocity = None
@ -160,12 +160,10 @@ object CargoBehavior {
VehicleAction.SendResponse(PlanetSideGUID(0), PlanetsideAttributeMessage(cargoGUID, 68, cargo.Shields))
)
val (attachMsg, mountPointMsg) = CargoMountBehaviorForAll(carrier, cargo, mountPoint)
log.info(s"HandleCheckCargoMounting: $attachMsg")
log.info(s"HandleCheckCargoMounting: $mountPointMsg")
false
} else if (distance > 625 || iteration >= 40) {
//vehicles moved too far away or took too long to get into proper position; abort mounting
log.info(
log.debug(
"HandleCheckCargoMounting: cargo vehicle is too far away or didn't mount within allocated time - aborting"
)
val cargoDriverGUID = cargo.Seats(0).occupant.get.GUID
@ -185,7 +183,7 @@ object CargoBehavior {
)
)
false
//sending packet to the cargo vehicle's client results in player locking himself in his vehicle
//sending packet to the cargo vehicle's client results in player being lock in own vehicle
//player gets stuck as "always trying to remount the cargo hold"
//obviously, don't do this
} else {
@ -263,7 +261,7 @@ object CargoBehavior {
)
if (distance > 225) {
//cargo vehicle has moved far enough away; close the carrier's hold door
log.info(
log.debug(
s"HandleCheckCargoDismounting: dismount of cargo vehicle from carrier complete at distance of $distance"
)
val cargoDriverGUID = cargo.Seats(0).occupant.get.GUID
@ -283,7 +281,7 @@ object CargoBehavior {
)
)
false
//sending packet to the cargo vehicle's client results in player locking himself in his vehicle
//sending packet to the cargo vehicle's client results in player being lock in own vehicle
//player gets stuck as "always trying to remount the cargo hold"
//obviously, don't do this
} else if (iteration > 40) {
@ -403,8 +401,7 @@ object CargoBehavior {
events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(GUID0, ejectCargoMsg))
events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(GUID0, detachCargoMsg))
events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(GUID0, resetCargoMsg))
log.debug(ejectCargoMsg.toString)
log.debug(detachCargoMsg.toString)
log.debug(s"HandleVehicleCargoDismount: eject - $ejectCargoMsg, detach - $detachCargoMsg")
if (driverOpt.isEmpty) {
//TODO cargo should drop like a rock like normal; until then, deconstruct it
cargo.Actor ! Vehicle.Deconstruct()

View file

@ -2,7 +2,7 @@
package net.psforever.packet.game
import net.psforever.packet.{GamePacketOpcode, Marshallable, PacketHelpers, PlanetSideGamePacket}
import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire}
import net.psforever.types.{CharacterSex, CharacterVoice, PlanetSideEmpire}
import scodec.{Attempt, Codec, Err}
import scodec.codecs._
import shapeless.{::, HNil}
@ -14,7 +14,7 @@ final case class CharacterCreateRequestMessage(
name: String,
headId: Int,
voiceId: CharacterVoice.Value,
gender: CharacterGender.Value,
gender: CharacterSex,
empire: PlanetSideEmpire.Value
) extends PlanetSideGamePacket {
type Packet = CharacterCreateRequestMessage
@ -29,7 +29,7 @@ object CharacterCreateRequestMessage extends Marshallable[CharacterCreateRequest
("name" | PacketHelpers.encodedWideString) ::
("headId" | uint8L) ::
("voiceId" | character_voice_codec) ::
("gender" | CharacterGender.codec) ::
("gender" | CharacterSex.codec) ::
("empire" | PlanetSideEmpire.codec)
).exmap[CharacterCreateRequestMessage](
{

View file

@ -9,7 +9,7 @@ import net.psforever.types._
* This partition of the data stream contains information used to represent how the player's avatar is presented.
* This appearance coincides with the data available from the `CharacterCreateRequestMessage` packet.
* @see `PlanetSideEmpire`<br>
* `CharacterGender`
* `CharacterSex`
* @param name the unique name of the avatar;
* minimum of two characters
* @param faction the empire to which the avatar belongs
@ -21,7 +21,7 @@ import net.psforever.types._
final case class BasicCharacterData(
name: String,
faction: PlanetSideEmpire.Value,
sex: CharacterGender.Value,
sex: CharacterSex,
head: Int,
voice: CharacterVoice.Value
)

View file

@ -304,7 +304,7 @@ object CharacterAppearanceData extends Marshallable[CharacterAppearanceData] {
("name" | PacketHelpers.encodedWideStringAligned(namePadding(name_padding, data.v2))) ::
("exosuit" | ExoSuitType.codec) ::
("unk5" | uint2) :: //unknown
("sex" | CharacterGender.codec) ::
("sex" | CharacterSex.codec) ::
("head" | uint8L) ::
("voice" | CharacterVoice.codec) ::
("unk6" | uint32L) ::

View file

@ -3,7 +3,7 @@ package net.psforever.persistence
import net.psforever.objects.avatar
import net.psforever.objects.avatar.Cosmetic
import org.joda.time.LocalDateTime
import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire}
import net.psforever.types.{CharacterSex, CharacterVoice, PlanetSideEmpire}
case class Avatar(
id: Int,
@ -27,7 +27,7 @@ case class Avatar(
id,
name,
PlanetSideEmpire(factionId),
CharacterGender(genderId),
CharacterSex.valuesToEntriesMap(genderId),
headId,
CharacterVoice(voiceId),
bep,

View file

@ -25,37 +25,33 @@ class AccountIntermediaryService extends Actor {
private val IPAddressBySessionID = mutable.Map[Long, IPAddress]()
private[this] val log = org.log4s.getLogger
override def preStart() = {
log.trace("Starting...")
}
def receive = {
// Called by the LoginSessionActor
case StoreAccountData(token, account) =>
accountsByToken += (token -> account)
log.info(s"Storing intermediary account data for ${account.id}")
log.trace(s"Storing intermediary account data for ${account.id}")
// Called by the WorldSessionActor
case RetrieveAccountData(token) =>
accountsByToken.remove(token) match {
case Some(acc) =>
sender() ! ReceiveAccountData(acc)
log.info(s"Retrieving intermediary account data for $acc")
log.trace(s"Retrieving intermediary account data for $acc")
case None =>
log.error(s"Unable to retrieve intermediary account data for $token")
}
case StoreIPAddress(sessionID, address) =>
IPAddressBySessionID += (sessionID -> address)
log.info(s"Storing IP address (${address.Address}) for sessionID : $sessionID")
log.trace(s"Storing IP address (${address.Address}) for sessionID : $sessionID")
case RetrieveIPAddress(sessionID) =>
val address: Option[IPAddress] = IPAddressBySessionID.remove(sessionID)
if (address.nonEmpty) {
sender() ! ReceiveIPAddress(address.get)
log.info(s"Retrieving IP address data for sessionID : ${sessionID}")
log.trace(s"Retrieving IP address data for sessionID : $sessionID")
} else {
log.error(s"Unable to retrieve IP address data for sessionID : ${sessionID}")
log.error(s"Unable to retrieve IP address data for sessionID : $sessionID")
}
case msg =>

View file

@ -59,7 +59,6 @@ class AccountPersistenceService extends Actor {
*/
override def preStart(): Unit = {
ServiceManager.serviceManager ! ServiceManager.Lookup("squad")
log.trace("Awaiting system service hooks ...")
}
override def postStop(): Unit = {
@ -410,7 +409,7 @@ class PersistenceMonitor(name: String, squadService: ActorRef) extends Actor {
Deployables.Disown(inZone, avatar, context.parent)
inZone.Population.tell(Zone.Population.Leave(avatar), context.parent)
inZone.tasks.tell(GUIDTask.UnregisterObjectTask(avatar.locker)(inZone.GUID), context.parent)
log.info(s"logout of ${avatar.name}")
log.info(s"Logout of ${avatar.name}")
}
}

View file

@ -15,17 +15,12 @@ class AvatarService(zone: Zone) extends Actor {
private[this] val log = org.log4s.getLogger
override def preStart() = {
log.trace(s"Awaiting ${zone.id} avatar events ...")
}
val AvatarEvents = new GenericEventBus[AvatarServiceResponse] //AvatarEventBus
def receive = {
case Service.Join(channel) =>
val path = s"/$channel/Avatar"
val who = sender()
log.info(s"$who has joined $path")
AvatarEvents.subscribe(who, path)
case Service.Leave(None) =>
@ -33,8 +28,6 @@ class AvatarService(zone: Zone) extends Actor {
case Service.Leave(Some(channel)) =>
val path = s"/$channel/Avatar"
val who = sender()
log.info(s"$who has left $path")
AvatarEvents.unsubscribe(sender(), path)
case Service.LeaveAll() =>

View file

@ -142,7 +142,7 @@ class ChatService(context: ActorContext[ChatService.Command]) extends AbstractBe
)
case (None, _, _, _) =>
log.error("received message from non-subscribed actor")
log.warn("received message from non-subscribed actor")
}

View file

@ -9,38 +9,26 @@ import net.psforever.services.{GenericEventBus, Service}
class GalaxyService extends Actor {
private[this] val log = org.log4s.getLogger
override def preStart() = {
log.info("Starting...")
}
val GalaxyEvents = new GenericEventBus[GalaxyServiceResponse]
def receive: Receive = {
case Service.Join(faction) if "TRNCVS".containsSlice(faction) =>
val path = s"/$faction/Galaxy"
val who = sender()
log.trace(s"$who has joined $path")
GalaxyEvents.subscribe(who, path)
GalaxyEvents.subscribe(sender(), path)
case Service.Join("galaxy") =>
val path = s"/Galaxy"
val who = sender()
log.trace(s"$who has joined $path")
GalaxyEvents.subscribe(who, path)
GalaxyEvents.subscribe(sender(), path)
case Service.Join(channel) =>
val path = s"/$channel/Galaxy"
val who = sender()
log.trace(s"$who has joined $path")
GalaxyEvents.subscribe(who, path)
GalaxyEvents.subscribe(sender(), path)
case Service.Leave(None) =>
GalaxyEvents.unsubscribe(sender())
case Service.Leave(Some(channel)) =>
val path = s"/$channel/Galaxy"
val who = sender()
log.trace(s"$who has left $path")
GalaxyEvents.unsubscribe(sender(), path)
case Service.LeaveAll() =>
@ -53,7 +41,7 @@ class GalaxyService extends Actor {
GalaxyServiceResponse(s"/Galaxy", GalaxyResponse.MapUpdate(msg))
)
case GalaxyAction.TransferPassenger(player_guid, temp_channel, vehicle, vehicle_to_delete, manifest) =>
case GalaxyAction.TransferPassenger(_, temp_channel, vehicle, vehicle_to_delete, manifest) =>
GalaxyEvents.publish(
GalaxyServiceResponse(
s"/$forChannel/Galaxy",
@ -69,6 +57,6 @@ class GalaxyService extends Actor {
)
case msg =>
log.info(s"Unhandled message $msg from ${sender()}")
log.warn(s"Unhandled message $msg from ${sender()}")
}
}

View file

@ -28,27 +28,19 @@ class LocalService(zone: Zone) extends Actor {
context.actorOf(Props[RouterTelepadActivation](), s"${zone.id}-telepad-activate-agent")
private[this] val log = org.log4s.getLogger
override def preStart() = {
log.trace(s"Awaiting ${zone.id} local events ...")
}
val LocalEvents = new GenericEventBus[LocalServiceResponse]
def receive: Receive = {
case Service.Join(channel) =>
val path = s"/$channel/Local"
val who = sender()
log.info(s"$who has joined $path")
LocalEvents.subscribe(who, path)
LocalEvents.subscribe(sender(), path)
case Service.Leave(None) =>
LocalEvents.unsubscribe(sender())
case Service.Leave(Some(channel)) =>
val path = s"/$channel/Local"
val who = sender()
log.info(s"$who has left $path")
LocalEvents.unsubscribe(who, path)
LocalEvents.unsubscribe(sender(), path)
case Service.LeaveAll() =>
LocalEvents.unsubscribe(sender())
@ -229,13 +221,6 @@ class LocalService(zone: Zone) extends Actor {
//response from HackClearActor
case HackClearActor.SendHackMessageHackCleared(target_guid, _, unk1, unk2) =>
log.info(s"Clearing hack for $target_guid")
LocalEvents.publish(
LocalServiceResponse(
s"/${zone.id}/Local",
Service.defaultPlayerGUID,
LocalResponse.SendHackMessageHackCleared(target_guid, unk1, unk2)
)
)
//message from ProximityTerminalControl
case Terminal.StartProximityEffect(terminal) =>
@ -323,7 +308,7 @@ class LocalService(zone: Zone) extends Actor {
//get rid of previous linked remote telepad (if any)
zone.GUID(internalTelepad.Telepad) match {
case Some(old: TelepadDeployable) =>
log.info(
log.trace(
s"ActivateTeleportSystem: old remote telepad@${old.GUID.guid} linked to internal@${internalTelepad.GUID.guid} will be deconstructed"
)
old.Active = false
@ -333,7 +318,7 @@ class LocalService(zone: Zone) extends Actor {
}
internalTelepad.Telepad = remoteTelepad.GUID
if (internalTelepad.Active) {
log.info(
log.trace(
s"ActivateTeleportSystem: fully deployed router@${router.GUID.guid} in ${zone.id} will link internal@${internalTelepad.GUID.guid} and remote@${remoteTelepad.GUID.guid}"
)
LocalEvents.publish(

View file

@ -50,7 +50,7 @@ class DeployableRemover(taskResolver: ActorRef) extends RemoverActor(taskResolve
override def SecondJob(entry: RemoverActor.Entry): Unit = {
val obj = entry.obj.asInstanceOf[PlanetSideGameObject with Deployable]
info(s"Deleting a ${obj.Definition.Name} deployable")
trace(s"Deleting a ${obj.Definition.Name} deployable")
context.parent ! DeployableRemover.EliminateDeployable(obj, obj.GUID, obj.Position, entry.zone)
super.SecondJob(entry)
}

View file

@ -25,7 +25,7 @@ class HackCaptureActor extends Actor {
def receive: Receive = {
case HackCaptureActor.StartCaptureTerminalHack(target, zone, unk1, unk2, startTime) =>
log.trace(s"${target.GUID} is hacked.")
log.trace(s"StartCaptureTerminalHack: ${target.GUID} is hacked.")
val duration = target.Definition match {
case GlobalDefinitions.capture_terminal =>
@ -49,7 +49,7 @@ class HackCaptureActor extends Actor {
hackedObjects.find(_.target == target) match {
case Some(_) =>
log.trace(
s"${target.GUID} was already hacked - removing it from the hacked objects list before re-adding it."
s"StartCaptureTerminalHack: ${target.GUID} was already hacked - removing it from the hacked objects list before re-adding it."
)
hackedObjects = hackedObjects.filterNot(x => x.target == target)
case _ => ;
@ -70,7 +70,7 @@ class HackCaptureActor extends Actor {
val finishedHacks = hackedObjects.filter(x => now - x.hack_timestamp >= x.duration.toNanos)
hackedObjects = stillHacked
finishedHacks.foreach(entry => {
log.trace(s"Capture terminal hack timeout reached for terminal ${entry.target.GUID}")
log.trace(s"ProcessCompleteHacks: capture terminal hack timeout reached for terminal ${entry.target.GUID}")
val hackedByFaction = entry.target.HackedBy.get.hackerFaction
entry.target.Actor ! CommonMessages.ClearHack()
@ -143,7 +143,7 @@ class HackCaptureActor extends Actor {
val short_timeout: FiniteDuration =
math.max(1, hackEntry.duration.toNanos - (System.nanoTime - hackEntry.hack_timestamp)) nanoseconds
log.trace(s"Still items left in hacked objects list. Checking again in ${short_timeout.toSeconds} seconds")
log.trace(s"RestartTimer: still items left in hacked objects list. Checking again in ${short_timeout.toSeconds} seconds")
import scala.concurrent.ExecutionContext.Implicits.global
clearTrigger = context.system.scheduler.scheduleOnce(short_timeout, self, HackCaptureActor.ProcessCompleteHacks())
}

View file

@ -83,12 +83,12 @@ class HackClearActor() extends Actor {
case Some(hackEntry) =>
val short_timeout: FiniteDuration = math.max(1, hackEntry.duration - (now - hackEntry.time)) nanoseconds
log.info(
s"HackClearActor: Still items left in hacked objects list. Checking again in ${short_timeout.toSeconds} seconds"
log.debug(
s"HackClearActor: still items left in hacked objects list. Checking again in ${short_timeout.toSeconds} seconds"
)
import scala.concurrent.ExecutionContext.Implicits.global
clearTrigger = context.system.scheduler.scheduleOnce(short_timeout, self, HackClearActor.TryClearHacks())
case None => log.info("HackClearActor: No objects left in hacked objects list. Not rescheduling check.")
case None => log.debug("HackClearActor: no objects left in hacked objects list. Not rescheduling check.")
}
}

View file

@ -31,16 +31,16 @@ class PropertyOverrideManager extends Actor {
}
private def LoadOverridesFromFile(zoneId: Int): Unit = {
val zoneOverrides = LoadFile(s"overrides/game_objects${zoneId}.adb.lst")
val zoneOverrides = LoadFile(s"overrides/game_objects$zoneId.adb.lst")
if (zoneOverrides == null) {
log.debug(s"No overrides found for zone ${zoneId} using filename game_objects${zoneId}.adb.lst")
log.debug(s"PropertyOverride: no overrides found for zone $zoneId using filename game_objects$zoneId.adb.lst")
return
}
val grouped = zoneOverrides.groupBy(_._1).view.mapValues(_.map(x => (x._2, x._3)).toList).toMap
log.debug(s"Loaded property overrides for zone $zoneId: ${grouped.toString}")
log.debug(s"PropertyOverride: loaded property overrides for zone $zoneId: ${grouped.toString}")
overrides += (zoneId -> grouped)
}

View file

@ -124,11 +124,7 @@ class SquadService extends Actor {
private[this] val log = org.log4s.getLogger
private def debug(msg: String): Unit = {
log.info(msg)
}
override def preStart(): Unit = {
log.info("Starting...")
log.debug(msg)
}
override def postStop(): Unit = {
@ -321,7 +317,7 @@ class SquadService extends Actor {
case str if str.matches("//d+") =>
Publish(to.toLong, msg, excluded)
case _ =>
log.error(s"Publish(String): subscriber information is an unhandled format - $to")
log.warn(s"Publish(String): subscriber information is an unhandled format - $to")
}
}
@ -336,7 +332,7 @@ class SquadService extends Actor {
case Some(user) =>
user ! SquadServiceResponse("", msg)
case None =>
log.error(s"Publish(Long): subscriber information can not be found - $to")
log.warn(s"Publish(Long): subscriber information can not be found - $to")
}
}
@ -383,7 +379,6 @@ class SquadService extends Actor {
case Service.Join(faction) if "TRNCVS".indexOf(faction) > -1 =>
val path = s"/$faction/Squad"
val who = sender()
debug(s"$who has joined $path")
SquadEvents.subscribe(who, path)
//subscribe to the player's personal channel - necessary for future and previous squad information
@ -392,7 +387,6 @@ class SquadService extends Actor {
val longCharId = char_id.toLong
val path = s"/$char_id/Squad"
val who = sender()
debug(s"$who has joined $path")
context.watch(who)
UserEvents += longCharId -> who
refused(longCharId) = Nil
@ -407,7 +401,6 @@ class SquadService extends Actor {
case Service.Leave(Some(faction)) if "TRNCVS".indexOf(faction) > -1 =>
val path = s"/$faction/Squad"
val who = sender()
debug(s"$who has left $path")
SquadEvents.unsubscribe(who, path)
case Service.Leave(Some(char_id)) =>

View file

@ -18,27 +18,19 @@ class VehicleService(zone: Zone) extends Actor {
private val turretUpgrade: ActorRef = context.actorOf(Props[TurretUpgrader](), s"${zone.id}-turret-upgrade-agent")
private[this] val log = org.log4s.getLogger
override def preStart() = {
log.trace(s"Awaiting ${zone.id} vehicle events ...")
}
val VehicleEvents = new GenericEventBus[VehicleServiceResponse]
def receive = {
case Service.Join(channel) =>
val path = s"/$channel/Vehicle"
val who = sender()
log.info(s"$who has joined $path")
VehicleEvents.subscribe(who, path)
VehicleEvents.subscribe(sender(), path)
case Service.Leave(None) =>
VehicleEvents.unsubscribe(sender())
case Service.Leave(Some(channel)) =>
val path = s"/$channel/Vehicle"
val who = sender()
log.info(s"$who has left $path")
VehicleEvents.unsubscribe(who, path)
VehicleEvents.unsubscribe(sender(), path)
case Service.LeaveAll() =>
VehicleEvents.unsubscribe(sender())
@ -387,7 +379,7 @@ class VehicleService(zone: Zone) extends Actor {
}
case msg =>
log.info(s"Unhandled message $msg from ${sender()}")
log.warn(s"Unhandled message $msg from ${sender()}")
}
import net.psforever.objects.serverobject.tube.SpawnTube

View file

@ -164,7 +164,7 @@ class TurretUpgrader extends SupportActor[TurretUpgrader.Entry] {
)
}
})
info(s"Converting manned wall turret weapon to $upgrade")
debug(s"Converting manned wall turret weapon to $upgrade")
val oldBoxes = AllMountedWeaponMagazines(target)
target.Upgrade = upgrade //perform upgrade
@ -228,7 +228,7 @@ class TurretUpgrader extends SupportActor[TurretUpgrader.Entry] {
def FinishUpgradingTurret(entry: TurretUpgrader.Entry)(): Unit = {
val target = entry.obj.asInstanceOf[FacilityTurret]
val zone = entry.zone
info(s"Wall turret finished ${target.Upgrade} upgrade")
trace(s"Wall turret finished ${target.Upgrade} upgrade")
target.ConfirmUpgrade(entry.upgrade)
val targetGUID = target.GUID
if (target.Health > 0) {

View file

@ -1,16 +0,0 @@
// Copyright (c) 2017 PSForever
package net.psforever.types
import net.psforever.packet.PacketHelpers
import scodec.codecs.uint2L
/**
* Values for two genders, Male and Female, starting at 1 = Male.
*/
object CharacterGender extends Enumeration(1) {
type Type = Value
val Male, Female = Value
implicit val codec = PacketHelpers.createEnumerationCodec(this, uint2L)
}

View file

@ -0,0 +1,45 @@
// Copyright (c) 2021 PSForever
package net.psforever.types
import enumeratum.values.{IntEnum, IntEnumEntry}
import net.psforever.packet.PacketHelpers
import scodec.codecs.uint2L
/**
* Values for two sexes, Male and Female, as required by `ObjectCreateMessage` parameters.
* Some quaint language for log decoration is provided.
* Blame the lack of gender dysphoria on the Terran Republic.
*/
sealed abstract class CharacterSex(
val value: Int,
val pronounSubject: String,
val pronounObject: String,
val possessive: String
) extends IntEnumEntry {
def possessiveNoObject: String = possessive
}
/**
* Values for two sexes, Male and Female.
*/
object CharacterSex extends IntEnum[CharacterSex] {
val values = findValues
case object Male extends CharacterSex(
value = 1,
pronounSubject = "he",
pronounObject = "him",
possessive = "his"
)
case object Female extends CharacterSex(
value = 2,
pronounSubject = "she",
pronounObject = "her",
possessive = "her"
) {
override def possessiveNoObject: String = "hers"
}
implicit val codec = PacketHelpers.createIntEnumCodec(enum = this, uint2L)
}

View file

@ -10,7 +10,7 @@ import scodec.codecs.uint
* While it is technically not valid to have a wrong-gendered voice,
* unlisted sixth and seventh entries would give a male character a female voice;
* a female character with either entry would become mute, however.
* @see `CharacterGender`
* @see `CharacterSex`
*/
object CharacterVoice extends Enumeration {
type Type = Value