[MIRROR] Fixes some stupid behavior in computer hardware code. (#8145)

* Fixes some stupid behavior in computer hardware code.  (#61350)

* Fixes some stupid behavior in computer hardware code.

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
This commit is contained in:
SkyratBot
2021-09-14 04:16:00 +02:00
committed by GitHub
parent dbb18a25fa
commit bf1914c794
9 changed files with 76 additions and 74 deletions
@@ -52,7 +52,6 @@
var/comp_light_luminosity = 3 //The brightness of that light
var/comp_light_color //The color of that light
/obj/item/modular_computer/Initialize()
. = ..()
START_PROCESSING(SSobj, src)
@@ -67,13 +66,10 @@
/obj/item/modular_computer/Destroy()
kill_program(forced = TRUE)
STOP_PROCESSING(SSobj, src)
for(var/H in all_components)
var/obj/item/computer_hardware/CH = all_components[H]
if(CH.holder == src)
CH.on_remove(src)
CH.holder = null
all_components.Remove(CH.device_type)
qdel(CH)
for(var/port in all_components)
var/obj/item/computer_hardware/component = all_components[port]
qdel(component)
all_components.Cut() //Die demon die
//Some components will actually try and interact with this, so let's do it later
QDEL_NULL(soundloop)
physical = null
@@ -1,67 +1,71 @@
/obj/item/modular_computer/proc/can_install_component(obj/item/computer_hardware/H, mob/living/user = null)
if(!H.can_install(src, user))
/obj/item/modular_computer/proc/can_install_component(obj/item/computer_hardware/try_install, mob/living/user = null)
if(!try_install.can_install(src, user))
return FALSE
if(H.w_class > max_hardware_size)
if(try_install.w_class > max_hardware_size)
to_chat(user, span_warning("This component is too large for \the [src]!"))
return FALSE
if(H.expansion_hw)
if(try_install.expansion_hw)
if(LAZYLEN(expansion_bays) >= max_bays)
to_chat(user, span_warning("All of the computer's expansion bays are filled."))
return FALSE
if(LAZYACCESS(expansion_bays, H.device_type))
to_chat(user, span_warning("The computer immediately ejects /the [H] and flashes an error: \"Hardware Address Conflict\"."))
if(LAZYACCESS(expansion_bays, try_install.device_type))
to_chat(user, span_warning("The computer immediately ejects /the [try_install] and flashes an error: \"Hardware Address Conflict\"."))
return FALSE
if(all_components[H.device_type])
to_chat(user, span_warning("This computer's hardware slot is already occupied by \the [all_components[H.device_type]]."))
if(all_components[try_install.device_type])
to_chat(user, span_warning("This computer's hardware slot is already occupied by \the [all_components[try_install.device_type]]."))
return FALSE
return TRUE
// Installs component.
/obj/item/modular_computer/proc/install_component(obj/item/computer_hardware/H, mob/living/user = null)
if(!can_install_component(H, user))
/// Installs component.
/obj/item/modular_computer/proc/install_component(obj/item/computer_hardware/install, mob/living/user = null)
if(!can_install_component(install, user))
return FALSE
if(user && !user.transferItemToLoc(H, src))
if(user && !user.transferItemToLoc(install, src))
return FALSE
if(H.expansion_hw)
LAZYSET(expansion_bays, H.device_type, H)
all_components[H.device_type] = H
if(install.expansion_hw)
LAZYSET(expansion_bays, install.device_type, install)
all_components[install.device_type] = install
to_chat(user, span_notice("You install \the [H] into \the [src]."))
H.holder = src
H.forceMove(src)
H.on_install(src, user)
to_chat(user, span_notice("You install \the [install] into \the [src]."))
install.holder = src
install.forceMove(src)
install.on_install(src, user)
// Uninstalls component.
/obj/item/modular_computer/proc/uninstall_component(obj/item/computer_hardware/H, mob/living/user = null)
if(H.holder != src) // Not our component at all.
/// Uninstalls component.
/obj/item/modular_computer/proc/uninstall_component(obj/item/computer_hardware/yeet, mob/living/user = null)
if(yeet.holder != src) // Not our component at all.
return FALSE
if(H.expansion_hw)
LAZYREMOVE(expansion_bays, H.device_type)
all_components.Remove(H.device_type)
to_chat(user, span_notice("You remove \the [yeet] from \the [src]."))
to_chat(user, span_notice("You remove \the [H] from \the [src]."))
H.forceMove(get_turf(src))
H.holder = null
H.on_remove(src, user)
yeet.forceMove(get_turf(src))
forget_component(yeet)
yeet.on_remove(src, user)
if(enabled && !use_power())
shutdown_computer()
update_appearance()
return TRUE
/// This isn't the "uninstall fully" proc, it just makes the computer lose all its references to the component
/obj/item/modular_computer/proc/forget_component(obj/item/computer_hardware/wipe_memory)
if(wipe_memory.holder != src)
return FALSE
if(wipe_memory.expansion_hw)
LAZYREMOVE(expansion_bays, wipe_memory.device_type)
all_components.Remove(wipe_memory.device_type)
wipe_memory.holder = null
// Checks all hardware pieces to determine if name matches, if yes, returns the hardware piece, otherwise returns null
/// Checks all hardware pieces to determine if name matches, if yes, returns the hardware piece, otherwise returns null
/obj/item/modular_computer/proc/find_hardware_by_name(name)
for(var/i in all_components)
var/obj/O = all_components[i]
if(O.name == name)
return O
var/obj/component = all_components[i]
if(component.name == name)
return component
return null