Fixes silo logging + add log file based logging to silo (#74806)

## About The Pull Request
Fixes deposit logs not working for the silo because they passed in the
mats argument in the wrong format.
Also adds log file based logging to the silo with a new log file:
silo.log.
This log should contain every deposit and withdraw action performed on
the silo and from which machine and location inluding material amounts.
## Why It's Good For The Game
Fixes broken ingame logs + adds better external logs for potential stat
tracking.
## Changelog
🆑 Gamer025
fix: Ingame ore silo logs should now log deposit actions correctly
config: New config for silo logs
/🆑
This commit is contained in:
Gamer025
2023-04-24 22:47:12 +02:00
committed by GitHub
parent 21e358045b
commit a8457b91f3
8 changed files with 44 additions and 17 deletions
+1 -1
View File
@@ -74,7 +74,7 @@
var/mats = stack_mats & mat_container.materials
var/amount = gathered_ore.amount
mat_container.insert_item(gathered_ore, ore_multiplier, breakdown_flags=BREAKDOWN_FLAGS_ORM) //insert it
materials.silo_log(src, "smelted", amount, "someone", mats)
materials.silo_log(src, "smelted", amount, gathered_ore.name, mats)
qdel(gathered_ore)
SEND_SIGNAL(src, COMSIG_ORM_COLLECTED_ORE)
+34 -11
View File
@@ -66,7 +66,8 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
// assumes unlimited space...
var/amount = I.amount
materials.user_insert(I, user, breakdown_flags)
silo_log(M, "deposited", amount, "sheets", item_mats)
var/list/matlist = I.get_material_composition(breakdown_flags)
silo_log(M, "deposited", amount, I.name, matlist)
return TRUE
/obj/machinery/ore_silo/attackby(obj/item/W, mob/user, params)
@@ -173,7 +174,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
var/count = materials.retrieve_sheets(text2num(href_list["eject_amt"]), eject_sheet, drop_location())
var/list/matlist = list()
matlist[eject_sheet] = MINERAL_MATERIAL_AMOUNT
matlist[eject_sheet] = MINERAL_MATERIAL_AMOUNT * count
silo_log(src, "ejected", -count, "sheets", matlist)
return TRUE
else if(href_list["page"])
@@ -188,11 +189,20 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
I.buffer = src
return TRUE
/**
* Creates a log entry for depositing/withdrawing from the silo both ingame and in text based log
*
* Arguments:
* - [M][/obj/machinery]: The machine performing the action.
* - action: Text that visually describes the action (smelted/deposited/resupplied...)
* - amount: The amount of sheets/objects deposited/withdrawn by this action. Positive for depositing, negative for withdrawing.
* - noun: Name of the object the action was performed with (sheet, units, ore...)
* - [mats][list]: Assoc list in format (material datum = amount of raw materials). Wants the actual amount of raw (iron, glass...) materials involved in this action. If you have 10 metal sheets each worth 2000 iron you would pass a list with the iron material datum = 20000
*/
/obj/machinery/ore_silo/proc/silo_log(obj/machinery/M, action, amount, noun, list/mats)
if (!length(mats))
return
var/datum/ore_silo_log/entry = new(M, action, amount, noun, mats)
var/list/datum/ore_silo_log/logs = GLOB.silo_access_logs[REF(src)]
if(!LAZYLEN(logs))
GLOB.silo_access_logs[REF(src)] = logs = list(entry)
@@ -226,9 +236,21 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
amount = _amount
noun = _noun
materials = mats.Copy()
for(var/each in materials)
materials[each] *= abs(_amount)
format()
var/list/data = list(
"machine_name" = machine_name,
"area_name" = AREACOORD(M),
"action" = action,
"amount" = abs(amount),
"noun" = noun,
"raw_materials" = get_raw_materials(""),
"direction" = amount < 0 ? "withdrawn" : "deposited",
)
GLOB.logger.Log(
LOG_CATEGORY_SILO,
"[machine_name] in \[[AREACOORD(M)]\] [action] [abs(amount)]x [noun] | [get_raw_materials("")]",
data,
)
/datum/ore_silo_log/proc/merge(datum/ore_silo_log/other)
if (other == src || action != other.action || noun != other.noun)
@@ -245,13 +267,14 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
/datum/ore_silo_log/proc/format()
name = "[machine_name]: [action] [amount]x [noun]"
formatted = "([timestamp]) <b>[machine_name]</b> in [area_name]<br>[action] [abs(amount)]x [noun]<br> [get_raw_materials("")]"
var/list/msg = list("([timestamp]) <b>[machine_name]</b> in [area_name]<br>[action] [abs(amount)]x [noun]<br>")
var/sep = ""
/datum/ore_silo_log/proc/get_raw_materials(separator)
var/list/msg = list()
for(var/key in materials)
var/datum/material/M = key
var/val = round(materials[key]) / MINERAL_MATERIAL_AMOUNT
msg += sep
sep = ", "
var/val = round(materials[key])
msg += separator
separator = ", "
msg += "[amount < 0 ? "-" : "+"][val] [M.name]"
formatted = msg.Join()
return msg.Join()