mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-13 09:05:11 +01:00
21b4095dfd
Upstream 04/17/2026 fixes https://github.com/Bubberstation/Bubberstation/issues/5549 --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: tgstation-ci[bot] <179393467+tgstation-ci[bot]@users.noreply.github.com> Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com> Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Co-authored-by: Rhials <28870487+Rhials@users.noreply.github.com> Co-authored-by: rageguy505 <54517726+rageguy505@users.noreply.github.com> Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Co-authored-by: Aliceee2ch <160794176+Aliceee2ch@users.noreply.github.com> Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com> Co-authored-by: Tsar-Salat <62388554+Tsar-Salat@users.noreply.github.com> Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Co-authored-by: Maxipat <108554989+Maxipat112@users.noreply.github.com> Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com> Co-authored-by: SimplyLogan <47579821+loganuk@users.noreply.github.com> Co-authored-by: loganuk <fakeemail123@aol.com> Co-authored-by: Leland Kemble <70413276+lelandkemble@users.noreply.github.com> Co-authored-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com> Co-authored-by: Lucy <lucy@absolucy.moe> Co-authored-by: siliconOpossum <138069572+siliconOpossum@users.noreply.github.com> Co-authored-by: Isratosh <Isratosh@hotmail.com> Co-authored-by: TheRyeGuyWhoWillNowDie <70169560+TheRyeGuyWhoWillNowDie@users.noreply.github.com> Co-authored-by: Neocloudy <88008002+Neocloudy@users.noreply.github.com> Co-authored-by: Alexander V. <volas@ya.ru> Co-authored-by: ElGitificador <168473461+ElGitificador@users.noreply.github.com> Co-authored-by: Twaticus <46540570+Twaticus@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> Co-authored-by: Cameron Lennox <killer65311@gmail.com> Co-authored-by: Tim <timothymtorres@gmail.com> Co-authored-by: Iamgoofball <iamgoofball@gmail.com> Co-authored-by: Layzu666 <121319428+Layzu666@users.noreply.github.com> Co-authored-by: Arturlang <24881678+Arturlang@users.noreply.github.com> Co-authored-by: _0Steven <42909981+00-Steven@users.noreply.github.com> Co-authored-by: mrmanlikesbt <99309552+mrmanlikesbt@users.noreply.github.com> Co-authored-by: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com> Co-authored-by: John F. Kennedy <54908920+MacaroniCritter@users.noreply.github.com> Co-authored-by: Cursor <102828457+theselfish@users.noreply.github.com> Co-authored-by: Josh <josh.adam.powell@gmail.com> Co-authored-by: Josh Powell <josh.powell@softwire.com> Co-authored-by: Yobrocharlie <Charliemiller5617@gmail.com> Co-authored-by: Hardly3D <66234359+Hardly3D@users.noreply.github.com> Co-authored-by: shayoki <96078776+shayoki@users.noreply.github.com> Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
212 lines
6.6 KiB
Plaintext
212 lines
6.6 KiB
Plaintext
/**
|
|
* # Dispenser
|
|
*
|
|
* Immobile (but not dense) shell that can receive and dispense items.
|
|
*/
|
|
/obj/structure/dispenser_bot
|
|
name = "dispenser"
|
|
icon = 'icons/obj/science/circuits.dmi'
|
|
icon_state = "setup_drone_arms"
|
|
|
|
density = FALSE
|
|
light_system = OVERLAY_LIGHT
|
|
light_on = FALSE
|
|
|
|
var/max_weight = WEIGHT_CLASS_NORMAL
|
|
var/capacity = 20
|
|
|
|
var/list/obj/item/stored_items = list()
|
|
var/locked = FALSE
|
|
|
|
/obj/structure/dispenser_bot/atom_deconstruct(disassembled = TRUE)
|
|
for(var/obj/item/stored_item as anything in stored_items)
|
|
remove_item(stored_item)
|
|
|
|
/obj/structure/dispenser_bot/Destroy()
|
|
QDEL_LIST(stored_items)
|
|
return ..()
|
|
|
|
|
|
/obj/structure/dispenser_bot/proc/add_item(mob/user, obj/item/to_add)
|
|
balloon_alert(user, "inserted item")
|
|
stored_items += to_add
|
|
to_add.forceMove(src)
|
|
RegisterSignal(to_add, COMSIG_MOVABLE_MOVED, PROC_REF(handle_stored_item_moved))
|
|
RegisterSignal(to_add, COMSIG_QDELETING, PROC_REF(handle_stored_item_deleted))
|
|
SEND_SIGNAL(src, COMSIG_DISPENSERBOT_ADD_ITEM, to_add)
|
|
|
|
/obj/structure/dispenser_bot/proc/handle_stored_item_moved(obj/item/moving_item, atom/location)
|
|
SIGNAL_HANDLER
|
|
if(location != src)
|
|
remove_item(moving_item)
|
|
|
|
/obj/structure/dispenser_bot/proc/handle_stored_item_deleted(obj/item/deleting_item)
|
|
SIGNAL_HANDLER
|
|
remove_item(deleting_item)
|
|
|
|
/obj/structure/dispenser_bot/proc/remove_item(obj/item/to_remove)
|
|
UnregisterSignal(to_remove, list(
|
|
COMSIG_MOVABLE_MOVED,
|
|
COMSIG_QDELETING,
|
|
))
|
|
to_remove.forceMove(drop_location())
|
|
stored_items -= to_remove
|
|
SEND_SIGNAL(src, COMSIG_DISPENSERBOT_REMOVE_ITEM, to_remove)
|
|
|
|
|
|
/obj/structure/dispenser_bot/Initialize(mapload)
|
|
. = ..()
|
|
AddComponent(/datum/component/shell, list(
|
|
new /obj/item/circuit_component/dispenser_bot()
|
|
), SHELL_CAPACITY_LARGE)
|
|
|
|
/obj/structure/dispenser_bot/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
|
|
if (user.combat_mode)
|
|
return NONE
|
|
|
|
if (tool.w_class > max_weight && !istype(tool, /obj/item/storage/bag))
|
|
balloon_alert(user, "item too big!")
|
|
return ITEM_INTERACT_BLOCKING
|
|
|
|
if(length(stored_items) >= capacity)
|
|
balloon_alert(user, "at maximum capacity!")
|
|
return ITEM_INTERACT_BLOCKING
|
|
|
|
if(!istype(tool, /obj/item/storage/bag))
|
|
add_item(user, tool)
|
|
return ITEM_INTERACT_SUCCESS
|
|
|
|
for(var/obj/item/bag_item in tool.contents)
|
|
if(length(stored_items) >= capacity)
|
|
break
|
|
if(bag_item.w_class > max_weight || istype(bag_item, /obj/item/storage/bag))
|
|
continue
|
|
add_item(user, bag_item)
|
|
return ITEM_INTERACT_SUCCESS
|
|
|
|
/obj/structure/dispenser_bot/wrench_act(mob/living/user, obj/item/tool)
|
|
if(locked)
|
|
return
|
|
set_anchored(!anchored)
|
|
tool.play_tool_sound(src)
|
|
balloon_alert(user, "[anchored? "secured" : "unsecured"]")
|
|
return TRUE
|
|
|
|
/obj/item/circuit_component/dispenser_bot
|
|
display_name = "Dispenser"
|
|
desc = "A dispenser bot that can dispense items "
|
|
|
|
/// The list of items
|
|
var/datum/port/output/item_list
|
|
/// The item that was added/removed.
|
|
var/datum/port/output/item
|
|
/// Called when an item is added.
|
|
var/datum/port/output/on_item_added
|
|
/// Called when an item is removed.
|
|
var/datum/port/output/on_item_removed
|
|
|
|
ui_buttons = list(
|
|
"plus" = "add_vend_component",
|
|
)
|
|
|
|
/// Vendor components attached to this dispenser bot
|
|
var/list/obj/item/circuit_component/vendor_component/vendor_components = list()
|
|
|
|
var/max_vendor_components = 20
|
|
|
|
|
|
/obj/item/circuit_component/dispenser_bot/populate_ports()
|
|
item_list = add_output_port("Items", PORT_TYPE_LIST(PORT_TYPE_ATOM))
|
|
|
|
item = add_output_port("Item", PORT_TYPE_ATOM)
|
|
on_item_added = add_output_port("On Item Added", PORT_TYPE_SIGNAL)
|
|
on_item_removed = add_output_port("On Item Removed", PORT_TYPE_SIGNAL)
|
|
|
|
/obj/item/circuit_component/dispenser_bot/register_shell(atom/movable/shell)
|
|
. = ..()
|
|
RegisterSignal(shell, COMSIG_DISPENSERBOT_ADD_ITEM, PROC_REF(on_shell_add_item))
|
|
RegisterSignal(shell, COMSIG_DISPENSERBOT_REMOVE_ITEM, PROC_REF(on_shell_remove_item))
|
|
|
|
/obj/item/circuit_component/dispenser_bot/unregister_shell(atom/movable/shell)
|
|
UnregisterSignal(shell, list(
|
|
COMSIG_DISPENSERBOT_ADD_ITEM,
|
|
COMSIG_DISPENSERBOT_REMOVE_ITEM,
|
|
))
|
|
return ..()
|
|
|
|
/obj/item/circuit_component/dispenser_bot/proc/on_shell_add_item(obj/structure/dispenser_bot/source, obj/item/added_item)
|
|
SIGNAL_HANDLER
|
|
item.set_output(added_item)
|
|
item_list.set_output(source.stored_items)
|
|
on_item_added.set_output(COMPONENT_SIGNAL)
|
|
|
|
/obj/item/circuit_component/dispenser_bot/proc/on_shell_remove_item(obj/structure/dispenser_bot/source, obj/item/added_item)
|
|
SIGNAL_HANDLER
|
|
item.set_output(added_item)
|
|
item_list.set_output(source.stored_items)
|
|
on_item_added.set_output(COMPONENT_SIGNAL)
|
|
|
|
/obj/item/circuit_component/dispenser_bot/proc/remove_vendor_component(obj/item/circuit_component/vendor_component/vendor_component)
|
|
SIGNAL_HANDLER
|
|
UnregisterSignal(vendor_component, list(
|
|
COMSIG_QDELETING,
|
|
COMSIG_CIRCUIT_COMPONENT_REMOVED,
|
|
))
|
|
if(!QDELING(vendor_component))
|
|
qdel(vendor_component)
|
|
vendor_components -= vendor_component
|
|
|
|
/obj/item/circuit_component/dispenser_bot/ui_perform_action(mob/user, action)
|
|
switch(action)
|
|
if("add_vend_component")
|
|
if(length(vendor_components) >= max_vendor_components)
|
|
balloon_alert(user, "you have hit vendor component limit!")
|
|
return
|
|
var/obj/item/circuit_component/vendor_component/vendor_component = new(parent)
|
|
parent.add_component(vendor_component, user)
|
|
vendor_components += vendor_component
|
|
RegisterSignals(vendor_component, list(
|
|
COMSIG_QDELETING,
|
|
COMSIG_CIRCUIT_COMPONENT_REMOVED,
|
|
), PROC_REF(remove_vendor_component))
|
|
|
|
/obj/item/circuit_component/vendor_component
|
|
display_name = "Vend"
|
|
desc = "A component used to vend out specific objects from the dispenser bot."
|
|
|
|
circuit_flags = CIRCUIT_FLAG_OUTPUT_SIGNAL
|
|
|
|
var/obj/structure/dispenser_bot/attached_bot
|
|
|
|
/// The item this vendor component should vend
|
|
var/datum/port/input/item_to_vend
|
|
/// Used to vend the item
|
|
var/datum/port/input/vend_item
|
|
|
|
circuit_size = 0
|
|
|
|
/obj/item/circuit_component/vendor_component/register_shell(atom/movable/shell)
|
|
. = ..()
|
|
if(istype(shell, /obj/structure/dispenser_bot))
|
|
attached_bot = shell
|
|
|
|
/obj/item/circuit_component/vendor_component/unregister_shell(atom/movable/shell)
|
|
attached_bot = null
|
|
return ..()
|
|
|
|
/obj/item/circuit_component/vendor_component/populate_ports()
|
|
item_to_vend = add_input_port("Item", PORT_TYPE_ATOM, trigger = null)
|
|
vend_item = add_input_port("Vend Item", PORT_TYPE_SIGNAL, trigger = PROC_REF(vend_item))
|
|
|
|
/obj/item/circuit_component/vendor_component/proc/vend_item(datum/port/input/port, list/return_values)
|
|
CIRCUIT_TRIGGER
|
|
if(!attached_bot)
|
|
return
|
|
|
|
var/obj/item/vending_item = locate(item_to_vend.value) in attached_bot.stored_items
|
|
|
|
if(!vending_item)
|
|
return
|
|
|
|
attached_bot.remove_item(vending_item)
|