Files
Kashargul 6c768b06ec reimplements attack and player logs (#19313)
* reomplements attack and player logs

* right log cat

* updates logging, makesDB optional

* regex serarch

* .

* .

* .

* sucks

* db load

* .

* .

* db logging
2026-03-19 22:37:45 +01:00

137 lines
4.4 KiB
Plaintext

//
// Mobs Subsystem - Process mob.Life()
//
//VOREStation Edits - Contains temporary debugging code to diagnose extreme tick consumption.
//Revert file to Polaris version when done.
SUBSYSTEM_DEF(mobs)
name = "Mobs"
priority = FIRE_PRIORITY_MOBS
wait = 2 SECONDS
flags = SS_KEEP_TIMING|SS_NO_INIT
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
dependencies = list(
/datum/controller/subsystem/atoms,
/datum/controller/subsystem/points_of_interest,
/datum/controller/subsystem/shuttles
)
var/list/currentrun = list()
var/log_extensively = FALSE
var/list/timelog = list()
var/slept_mobs = 0
var/list/process_z = list()
var/list/death_list = list()
/datum/controller/subsystem/mobs/stat_entry(msg)
msg = "P: [length(GLOB.mob_list)] | S: [slept_mobs] | D: [length(death_list)]"
return ..()
/datum/controller/subsystem/mobs/fire(resumed = 0)
if (!resumed)
src.currentrun = GLOB.mob_list.Copy()
process_z.len = length(GLOB.living_players_by_zlevel)
slept_mobs = 0
for(var/level in 1 to length(process_z))
process_z[level] = length(GLOB.living_players_by_zlevel[level])
// Lets handle all of these while we have time, should always remain extremely small...
if(length(death_list)) // Don't contact DB if this list is empty
if(CONFIG_GET(flag/sql_enabled))
if(!SSdbcore.IsConnected())
log_game("SQL ERROR during death reporting. Failed to connect.")
else
SSdbcore.MassInsert(format_table_name("death"), death_list)
death_list.Cut()
//cache for sanic speed (lists are references anyways)
var/list/currentrun = src.currentrun
var/times_fired = src.times_fired
while(length(currentrun))
var/mob/M = currentrun[length(currentrun)]
currentrun.len--
if(!M || QDELETED(M))
GLOB.mob_list -= M
continue
else if(M.low_priority && !(M.loc && get_z(M) && process_z[get_z(M)]))
slept_mobs++
continue
M.Life(times_fired)
if (MC_TICK_CHECK)
return
/datum/controller/subsystem/mobs/proc/log_recent()
var/msg = "Debug output from the [name] subsystem:\n"
msg += "- This subsystem is processed tail-first -\n"
if(!currentrun || !GLOB.mob_list)
msg += "ERROR: A critical list [currentrun ? "mob_list" : "currentrun"] is gone!"
log_game(msg)
log_world(msg)
return
msg += "Lists: currentrun: [length(currentrun)], mob_list: [length(GLOB.mob_list)]\n"
if(!length(currentrun))
msg += "!!The subsystem just finished the mob_list list, and currentrun is empty (or has never run).\n"
msg += "!!The info below is the tail of mob_list instead of currentrun.\n"
var/datum/D = length(currentrun) ? currentrun[length(currentrun)] : GLOB.mob_list[length(GLOB.mob_list)]
msg += "Tail entry: [describeThis(D)] (this is likely the item AFTER the problem item)\n"
var/position = GLOB.mob_list.Find(D)
if(!position)
msg += "Unable to find context of tail entry in mob_list list.\n"
else
if(position != length(GLOB.mob_list))
var/additional = GLOB.mob_list.Find(D, position+1)
if(additional)
msg += "WARNING: Tail entry found more than once in mob_list list! Context is for the first found.\n"
var/start = clamp(position-2,1,length(GLOB.mob_list))
var/end = clamp(position+2,1,length(GLOB.mob_list))
msg += "2 previous elements, then tail, then 2 next elements of mob_list list for context:\n"
msg += "---\n"
for(var/i in start to end)
msg += "[describeThis(GLOB.mob_list[i])][i == position ? " << TAIL" : ""]\n"
msg += "---\n"
log_game(msg)
log_world(msg)
/datum/controller/subsystem/mobs/proc/report_death(var/mob/living/L)
if(!L)
return
if(!L.key || !L.mind)
return
if(!SSticker || !SSticker.mode)
return
SSticker.mode.check_win()
// Don't bother with the rest if we've not got a DB to do anything with
if(!CONFIG_GET(flag/enable_stat_tracking) || !CONFIG_GET(flag/sql_enabled))
return
var/area/placeofdeath = get_area(L)
var/podname = placeofdeath ? placeofdeath.name : "Unknown area"
var/list/data = list(
"name" = "[L.real_name]",
"byondkey" = "[L.key]",
"job" = "[L.mind.assigned_role]",
"special" = "[L.mind.special_role]",
"pod" = podname,
"tod" = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss"),
"laname" = L.lastattacker ? L.lastattacker:real_name : "",
"lakey" = L.lastattacker ? L.lastattacker:key : "",
"gender" = L.gender,
"bruteloss" = L.getBruteLoss(),
"fireloss" = L.getFireLoss(),
"brainloss" = L.brainloss,
"oxyloss" = L.getOxyLoss(),
"coord" = "[L.x], [L.y], [L.z]"
)
death_list += list(data)