Files
Bubberstation/code/modules/client/player_details.dm
T
san7890andGitHub 25229440c6 Adds Mob Tag data to log messages + player panel (#79994)
## About The Pull Request

Closes #79969 

In administration, things shouldn't be _required_ to have unique names.
I think that searching by ckey/key in logs should still work fine but I
can see the value in having the mob tag (which is also exposed in places
like `debug.log`, and in public spots too like `hallucinations.html`)
being added with all this data for even more trimming if you wanna find
all the rule-breaking stuff someone does as a very specific mob.

Anyways, the player details datum tracks both the name as well as the
mob tag in an associated list that we can access in order to do work
with it in stuff like the player panel.

We do this by the following
* Rework the player details list to be associated, as well as updating
all instances of the proc that sets this list.
* Make the code for handling duplicates a bit more explicit so it
actually works.
* Make the formatting in the player panel better as well.
* Also add the mob tag information to wherever we might need to log it
via a new proc `key_name_and_tag()`
* Also adds this information to the per-player player panel

## Why It's Good For The Game

Better administration tools, should be more helpful when it comes to
filtering as well as post-mortem cross-comparison for coders in order to
find out exactly _which_ mob was problematic when looking at debug.log
or whatever you may have.

```txt
[2023-11-28 01:25:37.434] GAME-SAY: San7890/(Katie Yossarian) (mob_2759) (DEAD) "deez nuts" (Primary Tool Storage (138,140,2))
[2023-11-28 01:25:39.478] GAME-SAY: San7890/(Katie Yossarian) (mob_2759) (DEAD) "as big chungus" (Primary Tool Storage (138,140,2))
[2023-11-28 01:25:40.617] GAME: *no key*/(Katie Yossarian) (mob_2759) *no key*/(Katie Yossarian) is no longer owning mob Katie Yossarian(/mob/dead/observer) (Primary Tool Storage (138,140,2))
[2023-11-28 01:25:40.618] GAME-ACCESS: Mob Login: San7890/(Katie Yossarian) was assigned to a /mob/living/carbon/human
[2023-11-28 01:25:40.624] GAME: San7890/(Katie Yossarian) (mob_2760) Client San7890/(Katie Yossarian) has taken ownership of mob Katie Yossarian(/mob/living/carbon/human) (Primary Tool Storage (138,140,2))
[2023-11-28 01:25:42.305] GAME-EMOTE: *no key*/(chasm lobstrosity) (mob_88) chitters. (Lavaland Wastes (126,178,3))
[2023-11-28 01:25:42.435] GAME-SAY: San7890/(Katie Yossarian) (mob_2760) "i hate it here" (Primary Tool Storage (138,140,2))
[2023-11-28 01:25:43.058] GAME-COMPAT: ADMIN: San7890/(Katie Yossarian) admin ghosted.
```


![image](https://github.com/tgstation/tgstation/assets/34697715/bbcfb021-2d1f-4e6b-8844-63c6ea4e4bd1)


![image](https://github.com/tgstation/tgstation/assets/34697715/8ae02f7c-8b68-45f9-94c0-41d679bc0b69)

this was taken over three rounds ignore discrepancies

i'm rather fond of having this information in the per-player panel
because otherwise you need to
A) scroll through the F6 window until you find your match
B) pull up three different VV windows

## Changelog

🆑
admin: The Player Panel should now contain the unique mob tag associated
to a certain mob that a player might inhabit at one time, which is
stored on their player details datum on their client (which is
guaranteed to always exist).
admin: The "Old Names" details of a player is now visible in their own
personal per-player player panel.
/🆑
2023-12-01 05:58:47 +00:00

57 lines
2.0 KiB
Plaintext

///assoc list of ckey -> /datum/player_details
GLOBAL_LIST_EMPTY(player_details)
/// Tracks information about a client between log in and log outs
/datum/player_details
/// Action datums assigned to this player
var/list/datum/action/player_actions = list()
/// Tracks client action logging
var/list/logging = list()
/// Callbacks invoked when this client logs in again
var/list/post_login_callbacks = list()
/// Callbacks invoked when this client logs out
var/list/post_logout_callbacks = list()
/// List of names this key played under this round
/// assoc list of name -> mob tag
var/list/played_names = list()
/// Lazylist of preference slots this client has joined the round under
/// Numbers are stored as strings
var/list/joined_as_slots
/// Version of byond this client is using
var/byond_version = "Unknown"
/// Tracks achievements they have earned
var/datum/achievement_data/achievements
/// World.time this player last died
var/time_of_death = 0
/datum/player_details/New(key)
achievements = new(key)
/// Writes all of the `played_names` into an HTML-escaped string.
/datum/player_details/proc/get_played_names()
var/list/previous_names = list()
for(var/previous_name in played_names)
previous_names += html_encode("[previous_name] ([played_names[previous_name]])")
return previous_names.Join("; ")
/// Adds the new names to the player's played_names list on their /datum/player_details for use of admins.
/// `ckey` should be their ckey, and `data` should be an associative list with the keys being the names they played under and the values being the unique mob ID tied to that name.
/proc/log_played_names(ckey, data)
if(!ckey)
return
var/datum/player_details/writable = GLOB.player_details[ckey]
if(isnull(writable))
return
for(var/name in data)
if(!name)
continue
var/mob_tag = data[name]
var/encoded_name = html_encode(name)
if(writable.played_names.Find("[encoded_name]"))
continue
writable.played_names += list("[encoded_name]" = mob_tag)