From f46a300a93f7ec24fdb7f73b1fe2ab88adf7c3f4 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Sat, 29 Jul 2023 21:59:35 +0200 Subject: [PATCH] [MIRROR] [NO GBP]Mat container Final clean-up & patches [MDB IGNORE] (#22765) * [NO GBP]Mat container Final clean-up & patches (#77092) ## About The Pull Request 1. Fixes #77177 Some things were not connecting to the ore silo round start because the silo was not initialized yet so it went to local storage. Now it connects with the ore silo again 3. Removed some unused code in remote materials 4. Protolathe uses `eject_sheets()` defined in remote materials and not it's own version because that's redundant 5. Don't put the item back in the players hand when inserting it in the material container cause we haven't even removed it yet 6. `fast_split()` is now even faster & robust and is a global proc 7. Some code cleanup for RHD silo link ## Changelog :cl: fix: some things not connecting to the ore silo round start /:cl: * [NO GBP]Mat container Final clean-up & patches --------- Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> --- code/__HELPERS/construction.dm | 8 +-- .../components/material/material_container.dm | 4 -- .../components/material/remote_materials.dm | 49 ++++++++++++------- code/game/objects/items/rcd/RHD.dm | 14 +++--- .../modules/research/machinery/_production.dm | 30 ++---------- .../modules/vehicles/mecha/mech_fabricator.dm | 4 -- .../modules/wiremod/core/component_printer.dm | 8 --- 7 files changed, 44 insertions(+), 73 deletions(-) diff --git a/code/__HELPERS/construction.dm b/code/__HELPERS/construction.dm index add76c0f9ce..384aee42737 100644 --- a/code/__HELPERS/construction.dm +++ b/code/__HELPERS/construction.dm @@ -37,15 +37,11 @@ * Has special internal uses for e.g. by the material container * * Arguments: - * - [target][obj/item]: the stack to splot + * - [target][obj/item/stack]: the stack to split * - [amount]: amount to split by */ -/datum/component/material_container/proc/fast_split_stack(obj/item/stack/target, amount) +/proc/fast_split_stack(obj/item/stack/target, amount) if(!target.use(amount, TRUE, FALSE)) return null . = new target.type(target.drop_location(), amount, FALSE, target.mats_per_unit) - target.loc.atom_storage?.refresh_views() - - target.is_zero_amount(delete_if_zero = TRUE) - diff --git a/code/datums/components/material/material_container.dm b/code/datums/components/material/material_container.dm index 02d73b51055..99769ce7996 100644 --- a/code/datums/components/material/material_container.dm +++ b/code/datums/components/material/material_container.dm @@ -286,16 +286,12 @@ //not a solid subtype or an hologram if((target.item_flags & ABSTRACT) || (target.flags_1 & HOLOGRAM_1)) - if(target == active_held) //was this the original item in the players hand? put it back because we coudn't salvage it - user.put_in_active_hand(target) continue //item is either not allowed for redemption, not in the allowed types if((target.item_flags & NO_MAT_REDEMPTION) || (allowed_item_typecache && !is_type_in_typecache(target, allowed_item_typecache))) if(!(mat_container_flags & MATCONTAINER_SILENT)) to_chat(user, span_warning("[parent] won't accept [target]!")) - if(target == active_held) //was this the original item in the players hand? put it back because we coudn't salvage it - user.put_in_active_hand(target) continue //untouchable, move it out the way, code copied from recycler diff --git a/code/datums/components/material/remote_materials.dm b/code/datums/components/material/remote_materials.dm index e20a4dbdaec..8d91ba7a75c 100644 --- a/code/datums/components/material/remote_materials.dm +++ b/code/datums/components/material/remote_materials.dm @@ -11,19 +11,24 @@ handles linking back and forth. // 2. silo is null, materials is parented to parent // 3. silo is null, materials is null - /// The silo machine this container is connected to + ///The silo machine this container is connected to var/obj/machinery/ore_silo/silo - //material container. the value is either the silo or local + ///Material container. the value is either the silo or local var/datum/component/material_container/mat_container - //should we create a local storage if we can't connect to silo + ///Should we create a local storage if we can't connect to silo var/allow_standalone - //are we trying to connect to the silo - var/connecting - //local size of container when silo = null + ///Local size of container when silo = null var/local_size = INFINITY ///Flags used when converting inserted materials into their component materials. var/mat_container_flags = NONE + //Internal vars + + ///Prepare storage when component is registered to parent. This allows local material container(if created) to be first in the component list so it gets GC'd properly + var/_prepare_on_register = FALSE + ///Are we trying to to connect to remote ore silo or not + var/_connect_to_silo = FALSE + /datum/component/remote_materials/Initialize(mapload, allow_standalone = TRUE, force_connect = FALSE, mat_container_flags = NONE) if (!isatom(parent)) return COMPONENT_INCOMPATIBLE @@ -35,16 +40,25 @@ handles linking back and forth. RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(OnMultitool)) var/turf/T = get_turf(parent) + _connect_to_silo = FALSE if(force_connect || (mapload && is_station_level(T.z))) - connecting = TRUE + _connect_to_silo = TRUE + + if(mapload) // wait for silo to initialize during mapload + addtimer(CALLBACK(src, PROC_REF(_PrepareStorage), _connect_to_silo)) + else //directly register in round + _prepare_on_register = TRUE /datum/component/remote_materials/RegisterWithParent() - if (connecting) + if(_prepare_on_register) + _PrepareStorage(_connect_to_silo) + +/datum/component/remote_materials/proc/_PrepareStorage(connect_to_silo) + if (connect_to_silo) silo = GLOB.ore_silo_default if (silo) silo.ore_connected_machines += src mat_container = silo.GetComponent(/datum/component/material_container) - connecting = FALSE if (!mat_container && allow_standalone) _MakeLocal() @@ -163,24 +177,25 @@ handles linking back and forth. if (silo) silo.silo_log(M || parent, action, amount, noun, mats) -/datum/component/remote_materials/proc/format_amount() - if (mat_container) - return "[mat_container.total_amount()] / [mat_container.max_amount == INFINITY ? "Unlimited" : mat_container.max_amount] ([silo ? "remote" : "local"])" - else - return "0 / 0" - /// Ejects the given material ref and logs it, or says out loud the problem. /datum/component/remote_materials/proc/eject_sheets(datum/material/material_ref, eject_amount) var/atom/movable/movable_parent = parent if (!istype(movable_parent)) return 0 - if (!mat_container) + if (!mat_container) //no silolink & local storage not supported movable_parent.say("No access to material storage, please contact the quartermaster.") return 0 - if (on_hold()) + if(!mat_container.can_hold_material(material_ref)) //material not supported by container + movable_parent.say("Invalid material requested.") + return 0 + if(eject_amount <= 0) //invalid amount + movable_parent.say("Invalid amount requested.") + return 0 + if(on_hold()) //silo on hold movable_parent.say("Mineral access is on hold, please contact the quartermaster.") return 0 + var/count = mat_container.retrieve_sheets(eject_amount, material_ref, movable_parent.drop_location()) var/list/matlist = list() matlist[material_ref] = eject_amount diff --git a/code/game/objects/items/rcd/RHD.dm b/code/game/objects/items/rcd/RHD.dm index 68355267315..4d97f21a5a8 100644 --- a/code/game/objects/items/rcd/RHD.dm +++ b/code/game/objects/items/rcd/RHD.dm @@ -55,7 +55,7 @@ /obj/item/construction/proc/get_silo_iron() if(silo_link && silo_mats.mat_container && !silo_mats.on_hold()) return silo_mats.mat_container.get_material_amount(/datum/material/iron) / SILO_USE_AMOUNT - return FALSE + return 0 ///returns local matter units available. overriden by rcd borg to return power units available /obj/item/construction/proc/get_matter(mob/user) @@ -176,15 +176,15 @@ if(user) balloon_alert(user, "no silo detected!") return FALSE - if(!silo_mats.mat_container.has_materials(list(/datum/material/iron = SILO_USE_AMOUNT), multiplier = amount)) + + if(!silo_mats.mat_container.has_enough_of_material(/datum/material/iron, amount * SILO_USE_AMOUNT)) if(user) balloon_alert(user, "not enough silo material!") return FALSE - var/list/materials = list() - materials[GET_MATERIAL_REF(/datum/material/iron)] = SILO_USE_AMOUNT - silo_mats.mat_container.use_materials(materials, multiplier = amount) - silo_mats.silo_log(src, "consume", -amount, "build", materials) + silo_mats.mat_container.use_amount_mat(amount * SILO_USE_AMOUNT, /datum/material/iron) + var/static/list/mats = list(GET_MATERIAL_REF(/datum/material/iron) = SILO_USE_AMOUNT) + silo_mats.silo_log(src, "consume", -amount, "build", mats) return TRUE ///shared data for rcd,rld & plumbing @@ -238,7 +238,7 @@ if(user) balloon_alert(user, "silo on hold!") return FALSE - . = silo_mats.mat_container.has_materials(list(/datum/material/iron = SILO_USE_AMOUNT), multiplier = amount) + . = silo_mats.mat_container.has_enough_of_material(/datum/material/iron, amount * SILO_USE_AMOUNT) if(!. && user) balloon_alert(user, "low ammo!") if(has_ammobar) diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index 29615bb95dc..081dc7b6ab6 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -174,13 +174,9 @@ switch (action) if("remove_mat") var/datum/material/material = locate(params["ref"]) - - if(!materials.mat_container.can_hold_material(material)) - // I don't know who you are or what you want, but whatever it is, - // we don't have it. - return - - eject_sheets(material, params["amount"]) + var/amount = text2num(params["amount"]) + // SAFETY: eject_sheets checks for valid mats + materials.eject_sheets(material, amount) if("build") user_try_print_id(params["ref"], params["amount"]) @@ -323,26 +319,6 @@ return TRUE -/obj/machinery/rnd/production/proc/eject_sheets(eject_sheet, eject_amt) - var/datum/component/material_container/mat_container = materials.mat_container - - if(!mat_container) - say("No access to material storage, please contact the quartermaster.") - return 0 - - if(materials.on_hold()) - say("Mineral access is on hold, please contact the quartermaster.") - return 0 - - var/count = mat_container.retrieve_sheets(text2num(eject_amt), eject_sheet, drop_location()) - - var/list/matlist = list() - matlist[eject_sheet] = SHEET_MATERIAL_AMOUNT * count - - materials.silo_log(src, "ejected", -count, "sheets", matlist) - - return count - // Stuff for the stripe on the department machines /obj/machinery/rnd/production/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) . = ..() diff --git a/code/modules/vehicles/mecha/mech_fabricator.dm b/code/modules/vehicles/mecha/mech_fabricator.dm index f6f54aae05d..033378d496b 100644 --- a/code/modules/vehicles/mecha/mech_fabricator.dm +++ b/code/modules/vehicles/mecha/mech_fabricator.dm @@ -469,10 +469,6 @@ if("remove_mat") var/datum/material/material = locate(params["ref"]) var/amount = text2num(params["amount"]) - - if (!amount) - return - // SAFETY: eject_sheets checks for valid mats rmat.eject_sheets(material, amount) return diff --git a/code/modules/wiremod/core/component_printer.dm b/code/modules/wiremod/core/component_printer.dm index b0365fa0b14..eb6a0afa7c4 100644 --- a/code/modules/wiremod/core/component_printer.dm +++ b/code/modules/wiremod/core/component_printer.dm @@ -148,10 +148,6 @@ if ("remove_mat") var/datum/material/material = locate(params["ref"]) var/amount = text2num(params["amount"]) - - if (!amount) - return TRUE - // SAFETY: eject_sheets checks for valid mats materials.eject_sheets(material, amount) @@ -393,10 +389,6 @@ if ("remove_mat") var/datum/material/material = locate(params["ref"]) var/amount = text2num(params["amount"]) - - if (!amount) - return TRUE - // SAFETY: eject_sheets checks for valid mats materials.eject_sheets(material, amount)