From f875218284b235c9e61559f606523d55611e36f0 Mon Sep 17 00:00:00 2001 From: Sneakyrat6 Date: Sat, 6 Mar 2021 03:48:52 -0500 Subject: [PATCH] Fixes material component --- code/datums/components/material_container.dm | 54 +++++++++++++++++++- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index 7adc634621..e1886e2180 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -83,6 +83,8 @@ set waitfor = FALSE var/requested_amount var/active_held = user.get_active_held_item() // differs from I when using TK + + //handle stacks specially if(istype(I, /obj/item/stack) && precise_insertion) var/atom/current_parent = parent var/obj/item/stack/S = I @@ -91,10 +93,18 @@ return if(QDELETED(I) || QDELETED(user) || QDELETED(src) || parent != current_parent || user.physical_can_use_topic(current_parent) < UI_INTERACTIVE || user.get_active_held_item() != active_held) return + var/amt = insert_stack(S, requested_amount) + if(S.singular_name) + to_chat(user, "You insert [amt] [S.singular_name]\s into [parent].") + else + to_chat(user, "You insert [amt] into [parent].") + return + if(!user.temporarilyRemoveItemFromInventory(I)) to_chat(user, "[I] is stuck to you and cannot be placed into [parent].") return - var/inserted = insert_item(I, stack_amt = requested_amount) + + var/inserted = insert_item(I) if(inserted) to_chat(user, "You insert a material total of [inserted] into [parent].") qdel(I) @@ -103,8 +113,46 @@ else if(I == active_held) user.put_in_active_hand(I) +//Inserts a number of sheets from a stack, returns the amount of sheets used. +/datum/component/material_container/proc/insert_stack(obj/item/stack/S, amt, multiplier = 1) + if(isnull(amt)) + amt = S.amount + + if(amt <= 0) + return FALSE + + if(amt > S.amount) + amt = S.amount + + var/material_amt = get_item_material_amount(S) + if(!material_amt) + return FALSE + + //get max number of sheets we have room to add + var/mat_per_sheet = material_amt/S.amount + amt = min(amt, round((max_amount - total_amount) / (mat_per_sheet))) + if(!amt) + return FALSE + + //add the mats + for(var/MAT in materials) + materials[MAT] += S.mats_per_unit[MAT] * amt * multiplier + total_amount += S.mats_per_unit[MAT] * amt * multiplier + + //update last_inserted_id with mat making up majority of the stack + var/primary_mat + var/max_mat_value = 0 + for(var/MAT in materials) + if(S.mats_per_unit[MAT] > max_mat_value) + max_mat_value = S.mats_per_unit[MAT] + primary_mat = MAT + last_inserted_id = primary_mat + + S.use(amt) + return amt + /// Proc specifically for inserting items, returns the amount of materials entered. -/datum/component/material_container/proc/insert_item(obj/item/I, var/multiplier = 1, stack_amt) +/datum/component/material_container/proc/insert_item(obj/item/I, var/multiplier = 1) if(QDELETED(I)) return FALSE @@ -124,6 +172,7 @@ materials[MAT] += I.custom_materials[MAT] * multiplier total_amount += I.custom_materials[MAT] * multiplier if(I.custom_materials[MAT] > max_mat_value) + max_mat_value = I.custom_materials[MAT] primary_mat = MAT return primary_mat @@ -135,6 +184,7 @@ var/total_amount_saved = total_amount if(mat) materials[mat] += amt + total_amount += amt else for(var/i in materials) materials[i] += amt