mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-11 18:22:14 +00:00
This PR refactors Stacking Machine Console from using html based UI to tgui with some code cleanup and documentation. Also fixes a bug I noticed when using Stacking Machine Console - some materials could get stuck there if they were number subtypes (for example /obj/item/stack/sheet/metal/twenty), because console did not check for their merge_type for releasing like stacking machine itself does when the sheet is put inside. This is fixed now. Also fixes a small safe UI bug, where some buttons could be hard to press due to the dialer image being too close to the buttons. Bundling this together to prevent merge conflicts with other tgui PRs. Fixes #55169
138 lines
4.7 KiB
Plaintext
138 lines
4.7 KiB
Plaintext
/**********************Mineral stacking unit console**************************/
|
|
|
|
/obj/machinery/mineral/stacking_unit_console
|
|
name = "stacking machine console"
|
|
icon = 'icons/obj/machines/mining_machines.dmi'
|
|
icon_state = "console"
|
|
desc = "Controls a stacking machine... in theory."
|
|
density = FALSE
|
|
circuit = /obj/item/circuitboard/machine/stacking_unit_console
|
|
/// Connected stacking machine
|
|
var/obj/machinery/mineral/stacking_machine/machine
|
|
/// Direction for which console looks for stacking machine to connect to
|
|
var/machinedir = SOUTHEAST
|
|
|
|
/obj/machinery/mineral/stacking_unit_console/Initialize()
|
|
. = ..()
|
|
machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir))
|
|
if (machine)
|
|
machine.CONSOLE = src
|
|
|
|
/obj/machinery/mineral/stacking_unit_console/multitool_act(mob/living/user, obj/item/I)
|
|
if(!multitool_check_buffer(user, I))
|
|
return
|
|
var/obj/item/multitool/M = I
|
|
M.buffer = src
|
|
to_chat(user, "<span class='notice'>You store linkage information in [I]'s buffer.</span>")
|
|
return TRUE
|
|
|
|
/obj/machinery/mineral/stacking_unit_console/ui_interact(mob/user, datum/tgui/ui)
|
|
ui = SStgui.try_update_ui(user, src, ui)
|
|
if(!ui)
|
|
ui = new(user, src, "StackingConsole", name)
|
|
ui.open()
|
|
|
|
/obj/machinery/mineral/stacking_unit_console/ui_data(mob/user)
|
|
var/list/data = list()
|
|
data["machine"] = machine ? TRUE : FALSE
|
|
data["stacking_amount"] = null
|
|
data["contents"] = list()
|
|
if(machine)
|
|
data["stacking_amount"] = machine.stack_amt
|
|
for(var/stack_type in machine.stack_list)
|
|
var/obj/item/stack/sheet/stored_sheet = machine.stack_list[stack_type]
|
|
if(stored_sheet.amount <= 0)
|
|
continue
|
|
data["contents"] += list(list(
|
|
"type" = stored_sheet.type,
|
|
"name" = capitalize(stored_sheet.name),
|
|
"amount" = stored_sheet.amount,
|
|
))
|
|
return data
|
|
|
|
/obj/machinery/mineral/stacking_unit_console/ui_act(action, list/params)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
|
|
switch(action)
|
|
if("release")
|
|
var/obj/item/stack/sheet/released_type = text2path(params["type"])
|
|
if(!released_type || !(initial(released_type.merge_type) in machine.stack_list))
|
|
return //someone tried to spawn materials by spoofing hrefs
|
|
var/obj/item/stack/sheet/inp = machine.stack_list[initial(released_type.merge_type)]
|
|
var/obj/item/stack/sheet/out = new inp.type(null, inp.amount)
|
|
inp.amount = 0
|
|
machine.unload_mineral(out)
|
|
return TRUE
|
|
|
|
/**********************Mineral stacking unit**************************/
|
|
|
|
|
|
/obj/machinery/mineral/stacking_machine
|
|
name = "stacking machine"
|
|
icon = 'icons/obj/machines/mining_machines.dmi'
|
|
icon_state = "stacker"
|
|
desc = "A machine that automatically stacks acquired materials. Controlled by a nearby console."
|
|
density = TRUE
|
|
circuit = /obj/item/circuitboard/machine/stacking_machine
|
|
input_dir = EAST
|
|
output_dir = WEST
|
|
var/obj/machinery/mineral/stacking_unit_console/CONSOLE
|
|
var/stk_types = list()
|
|
var/stk_amt = list()
|
|
var/stack_list[0] //Key: Type. Value: Instance of type.
|
|
var/stack_amt = 50 //amount to stack before releassing
|
|
var/datum/component/remote_materials/materials
|
|
var/force_connect = FALSE
|
|
|
|
/obj/machinery/mineral/stacking_machine/Initialize(mapload)
|
|
. = ..()
|
|
proximity_monitor = new(src, 1)
|
|
materials = AddComponent(/datum/component/remote_materials, "stacking", mapload, FALSE, mapload && force_connect)
|
|
|
|
/obj/machinery/mineral/stacking_machine/Destroy()
|
|
CONSOLE = null
|
|
materials = null
|
|
return ..()
|
|
|
|
/obj/machinery/mineral/stacking_machine/HasProximity(atom/movable/AM)
|
|
if(QDELETED(AM))
|
|
return
|
|
if(istype(AM, /obj/item/stack/sheet) && AM.loc == get_step(src, input_dir))
|
|
process_sheet(AM)
|
|
|
|
/obj/machinery/mineral/stacking_machine/multitool_act(mob/living/user, obj/item/multitool/M)
|
|
if(istype(M))
|
|
if(istype(M.buffer, /obj/machinery/mineral/stacking_unit_console))
|
|
CONSOLE = M.buffer
|
|
CONSOLE.machine = src
|
|
to_chat(user, "<span class='notice'>You link [src] to the console in [M]'s buffer.</span>")
|
|
return TRUE
|
|
|
|
/obj/machinery/mineral/stacking_machine/proc/process_sheet(obj/item/stack/sheet/inp)
|
|
if(QDELETED(inp))
|
|
return
|
|
|
|
// Dump the sheets to the silo if attached
|
|
if(materials.silo && !materials.on_hold())
|
|
var/matlist = inp.custom_materials & materials.mat_container.materials
|
|
if (length(matlist))
|
|
var/inserted = materials.mat_container.insert_item(inp)
|
|
materials.silo_log(src, "collected", inserted, "sheets", matlist)
|
|
qdel(inp)
|
|
return
|
|
|
|
// No silo attached process to internal storage
|
|
var/key = inp.merge_type
|
|
var/obj/item/stack/sheet/storage = stack_list[key]
|
|
if(!storage) //It's the first of this sheet added
|
|
stack_list[key] = storage = new inp.type(src, 0)
|
|
storage.amount += inp.amount //Stack the sheets
|
|
qdel(inp)
|
|
|
|
while(storage.amount >= stack_amt) //Get rid of excessive stackage
|
|
var/obj/item/stack/sheet/out = new inp.type(null, stack_amt)
|
|
unload_mineral(out)
|
|
storage.amount -= stack_amt
|