mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-18 13:43:27 +00:00
Checks if a machine has no research before connecting techweb (#72944) ## About The Pull Request Currently all machines, if the config to not have a techweb link is on, will set their node to science even if they were meant to be connected to another (like through subtypes). This fixes that by checking to ensure they don't have a techweb connected already before giving them a new one. Also as a minor fix, RD consoles will now properly add themselves to the list of accessing RD consoles if they aren't linking to the default. This list currently does nothing but I can see good uses of it in the future. ## Why It's Good For The Game Fixes an error that was found on a downstream, it's a worthwhile fix that thankfully was caught this early. ## Changelog Nothing player-facing. Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
137 lines
4.3 KiB
Plaintext
137 lines
4.3 KiB
Plaintext
|
|
//All devices that link into the R&D console fall into thise type for easy identification and some shared procs.
|
|
|
|
|
|
/obj/machinery/rnd
|
|
name = "R&D Device"
|
|
icon = 'icons/obj/machines/research.dmi'
|
|
density = TRUE
|
|
use_power = IDLE_POWER_USE
|
|
var/busy = FALSE
|
|
var/hacked = FALSE
|
|
var/console_link = TRUE //allow console link.
|
|
var/disabled = FALSE
|
|
var/obj/item/loaded_item = null //the item loaded inside the machine (currently only used by experimentor and destructive analyzer)
|
|
/// Ref to global science techweb.
|
|
var/datum/techweb/stored_research
|
|
|
|
/obj/machinery/rnd/proc/reset_busy()
|
|
busy = FALSE
|
|
|
|
/obj/machinery/rnd/Initialize(mapload)
|
|
. = ..()
|
|
if(!CONFIG_GET(flag/no_default_techweb_link) && !stored_research)
|
|
connect_techweb(SSresearch.science_tech)
|
|
wires = new /datum/wires/rnd(src)
|
|
|
|
/obj/machinery/rnd/Destroy()
|
|
if(stored_research)
|
|
log_research("[src] disconnected from techweb [stored_research] (destroyed).")
|
|
stored_research = null
|
|
QDEL_NULL(wires)
|
|
return ..()
|
|
|
|
/obj/machinery/rnd/proc/connect_techweb(datum/techweb/new_techweb)
|
|
if(stored_research)
|
|
log_research("[src] disconnected from techweb [stored_research] when connected to [new_techweb].")
|
|
stored_research = new_techweb
|
|
|
|
/obj/machinery/rnd/proc/shock(mob/user, prb)
|
|
if(machine_stat & (BROKEN|NOPOWER)) // unpowered, no shock
|
|
return FALSE
|
|
if(!prob(prb))
|
|
return FALSE
|
|
do_sparks(5, TRUE, src)
|
|
if (electrocute_mob(user, get_area(src), src, 0.7, TRUE))
|
|
return TRUE
|
|
else
|
|
return FALSE
|
|
|
|
/obj/machinery/rnd/attackby(obj/item/O, mob/user, params)
|
|
if(is_refillable() && O.is_drainable())
|
|
return FALSE //inserting reagents into the machine
|
|
if(Insert_Item(O, user))
|
|
return TRUE
|
|
|
|
return ..()
|
|
|
|
/obj/machinery/rnd/crowbar_act(mob/living/user, obj/item/tool)
|
|
return default_deconstruction_crowbar(tool)
|
|
|
|
/obj/machinery/rnd/crowbar_act_secondary(mob/living/user, obj/item/tool)
|
|
return default_deconstruction_crowbar(tool)
|
|
|
|
/obj/machinery/rnd/screwdriver_act(mob/living/user, obj/item/tool)
|
|
return default_deconstruction_screwdriver(user, "[initial(icon_state)]_t", initial(icon_state), tool)
|
|
|
|
/obj/machinery/rnd/screwdriver_act_secondary(mob/living/user, obj/item/tool)
|
|
return default_deconstruction_screwdriver(user, "[initial(icon_state)]_t", initial(icon_state), tool)
|
|
|
|
/obj/machinery/rnd/multitool_act(mob/living/user, obj/item/multitool/tool)
|
|
if(panel_open)
|
|
wires.interact(user)
|
|
return TRUE
|
|
if(!QDELETED(tool.buffer) && istype(tool.buffer, /datum/techweb))
|
|
connect_techweb(tool.buffer)
|
|
return TRUE
|
|
return FALSE
|
|
|
|
/obj/machinery/rnd/multitool_act_secondary(mob/living/user, obj/item/tool)
|
|
if(panel_open)
|
|
wires.interact(user)
|
|
return TRUE
|
|
|
|
/obj/machinery/rnd/wirecutter_act(mob/living/user, obj/item/tool)
|
|
if(panel_open)
|
|
wires.interact(user)
|
|
return TRUE
|
|
|
|
/obj/machinery/rnd/wirecutter_act_secondary(mob/living/user, obj/item/tool)
|
|
if(panel_open)
|
|
wires.interact(user)
|
|
return TRUE
|
|
|
|
//proc used to handle inserting items or reagents into rnd machines
|
|
/obj/machinery/rnd/proc/Insert_Item(obj/item/I, mob/user)
|
|
return
|
|
|
|
//whether the machine can have an item inserted in its current state.
|
|
/obj/machinery/rnd/proc/is_insertion_ready(mob/user)
|
|
if(panel_open)
|
|
to_chat(user, span_warning("You can't load [src] while it's opened!"))
|
|
return FALSE
|
|
if(disabled)
|
|
to_chat(user, span_warning("The insertion belts of [src] won't engage!"))
|
|
return FALSE
|
|
if(busy)
|
|
to_chat(user, span_warning("[src] is busy right now."))
|
|
return FALSE
|
|
if(machine_stat & BROKEN)
|
|
to_chat(user, span_warning("[src] is broken."))
|
|
return FALSE
|
|
if(machine_stat & NOPOWER)
|
|
to_chat(user, span_warning("[src] has no power."))
|
|
return FALSE
|
|
if(loaded_item)
|
|
to_chat(user, span_warning("[src] is already loaded."))
|
|
return FALSE
|
|
return TRUE
|
|
|
|
//we eject the loaded item when deconstructing the machine
|
|
/obj/machinery/rnd/on_deconstruction()
|
|
if(loaded_item)
|
|
loaded_item.forceMove(loc)
|
|
..()
|
|
|
|
/obj/machinery/rnd/proc/AfterMaterialInsert(item_inserted, id_inserted, amount_inserted)
|
|
var/stack_name
|
|
if(istype(item_inserted, /obj/item/stack/ore/bluespace_crystal))
|
|
stack_name = "bluespace"
|
|
use_power(MINERAL_MATERIAL_AMOUNT / 10)
|
|
else
|
|
var/obj/item/stack/S = item_inserted
|
|
stack_name = S.name
|
|
use_power(min(active_power_usage, (amount_inserted / 100)))
|
|
add_overlay("protolathe_[stack_name]")
|
|
addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, cut_overlay), "protolathe_[stack_name]"), 10)
|