diff --git a/code/datums/material_container.dm b/code/datums/material_container.dm
index d7c5c307bc5..21752e31bd6 100644
--- a/code/datums/material_container.dm
+++ b/code/datums/material_container.dm
@@ -120,8 +120,7 @@
/datum/material_container/proc/use_amount_type(amt, material_type)
- var/datum/material/M
- M = materials[material_type]
+ var/datum/material/M = materials[material_type]
if(M)
if(M.amount >= amt)
M.amount -= amt
@@ -129,6 +128,20 @@
return amt
return 0
+/datum/material_container/proc/can_use_amount(amt, material_type, list/mats)
+ if(amt && material_type)
+ var/datum/material/M = materials[material_type]
+ if(M && M.amount >= amt)
+ return TRUE
+ else if(istype(mats))
+ for(var/M in mats)
+ if(materials[M] && mats[M] <= materials[M])
+ continue
+ else
+ return FALSE
+ return TRUE
+ return FALSE
+
//For spawning mineral sheets; internal use only
/datum/material_container/proc/retrieve(sheet_amt, datum/material/M)
if(sheet_amt > 0)
diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm
index c2743105444..045136f8caf 100644
--- a/code/game/machinery/droneDispenser.dm
+++ b/code/game/machinery/droneDispenser.dm
@@ -14,8 +14,8 @@
var/icon_recharging = "recharge"
var/icon_creating = "make"
- var/metal = 0
- var/glass = 0
+ var/datum/material_container/materials
+ var/list/using_materials
var/metal_cost = 1000
var/glass_cost = 1000
var/power_used = 1000
@@ -39,25 +39,31 @@
/obj/machinery/droneDispenser/New()
..()
health = max_health
+ materials = new(src, list(MAT_METAL=1, MAT_GLASS=1), MINERAL_MATERIAL_AMOUNT*MAX_STACK_SIZE*2)
+ using_materials = list(MAT_METAL=metal_cost, MAT_GLASS=glass_cost)
SSmachine.processing |= src
/obj/machinery/droneDispenser/Destroy()
SSmachine.processing -= src
+ qdel(materials)
+ materials = null
return ..()
-/obj/machinery/droneDispenser/preloaded
- metal = 5000
- glass = 5000
+/obj/machinery/droneDispenser/preloaded/New()
+ ..()
+ materials.insert_amount(5000)
/obj/machinery/droneDispenser/syndrone //Please forgive me
name = "syndrone shell dispenser"
desc = "A suspicious machine that will create Syndicate exterminator drones when supplied with metal and glass. Disgusting."
- metal = 25000
- glass = 25000
dispense_type = /obj/item/drone_shell/syndrone
cooldownTime = 100 //If we're gonna be a jackass, go the full mile - 10 second recharge timer
end_create_message = "dispenses a suspicious drone shell."
+/obj/machinery/droneDispenser/syndrone/New()
+ ..()
+ materials.insert_amount(25000)
+
/obj/machinery/droneDispenser/syndrone/badass //Please forgive me
name = "badass syndrone shell dispenser"
desc = "A suspicious machine that will create Syndicate exterminator drones when supplied with metal and glass. Disgusting. This one seems ominous."
@@ -74,9 +80,9 @@
glass_cost = 2000
power_used = 2000
-/obj/machinery/droneDispenser/snowflake/preloaded
- metal = 10000
- glass = 10000
+/obj/machinery/droneDispenser/snowflake/preloaded/New()
+ ..()
+ materials.insert_amount(10000)
/obj/machinery/droneDispenser/hivebot //An example of a custom drone dispenser. This one requires no materials and creates basic hivebots
name = "hivebot fabricator"
@@ -125,9 +131,9 @@
if(stat & BROKEN)
user << "[src] is smoking and steadily buzzing. It seems to be broken."
if(metal_cost)
- user << "It has [metal] units of metal stored."
+ user << "It has [materials.amount(MAT_METAL)] units of metal stored."
if(glass_cost)
- user << "It has [glass] units of glass stored."
+ user << "It has [materials.amount(MAT_GLASS)] units of glass stored."
/obj/machinery/droneDispenser/power_change()
..()
@@ -144,7 +150,7 @@
..()
if(stat & (NOPOWER|BROKEN) || !anchored)
return
- if((metal_cost && glass_cost) && (metal < metal_cost || glass < glass_cost))
+ if((metal_cost && glass_cost) && materials.can_use_amount(mats=using_materials))
return
if(droneMadeRecently)
icon_state = icon_recharging
@@ -157,12 +163,7 @@
icon_state = icon_creating
sleep(30)
icon_state = icon_on
- metal -= metal_cost
- glass -= glass_cost
- if(metal < 0)
- metal = 0
- if(glass < 0)
- glass = 0
+ materials.use_amount(using_materials)
if(power_used)
use_power(power_used)
new dispense_type(loc)
@@ -197,19 +198,16 @@
return
if(!user.canUseTopic(src))
return
- stack = Clamp(stack, 0, sheets.max_amount)
- sheets.use(stack)
- if(!stack)
- if(!user.unEquip(O))
- user << "[O] is stuck to your hand, you can't get it off!"
- return
- user.drop_item()
- O.loc = src
- metal += O.materials[MAT_METAL] * stack
- glass += O.materials[MAT_GLASS] * stack
- user << "You insert [stack] sheet[stack > 1 ? "s" : ""] to [src]."
- if((O && O.loc == src) || !stack)
- qdel(O)
+ if(!user.canUnEquip(sheets))
+ user << "[O] is stuck to your hand, you can't get it off!"
+ return
+ stack = Clamp(stack, 1, sheets.max_amount)
+ stack = materials.insert_stack(sheets, stack)
+ if(stack)
+ user << "You insert [stack] sheet[stack > 1 ? "s" : ""] into [src]."
+ else
+ user << "The [src] can't use [sheets]."
+
else if(istype(O, /obj/item/weapon/weldingtool))
if(stat & BROKEN)
var/obj/item/weapon/weldingtool/WT = O