diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm index 242385fa3e3..dc0293fb274 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm @@ -67,8 +67,6 @@ #define COMSIG_ATOM_ABSTRACT_EXITED "atom_abstract_exited" ///from base of atom/Bumped(): (/atom/movable) #define COMSIG_ATOM_BUMPED "atom_bumped" -///from base of atom/handle_atom_del(): (atom/deleted) -#define COMSIG_ATOM_CONTENTS_DEL "atom_contents_del" ///from base of atom/has_gravity(): (turf/location, list/forced_gravities) #define COMSIG_ATOM_HAS_GRAVITY "atom_has_gravity" ///from internal loop in atom/movable/proc/CanReach(): (list/next) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 0a62df0e485..8fe57dca07e 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1070,14 +1070,6 @@ /atom/proc/get_dumping_location() return null -/** - * This proc is called when an atom in our contents has it's [Destroy][/atom/proc/Destroy] called - * - * Default behaviour is to simply send [COMSIG_ATOM_CONTENTS_DEL] - */ -/atom/proc/handle_atom_del(atom/deleting_atom) - SEND_SIGNAL(src, COMSIG_ATOM_CONTENTS_DEL, deleting_atom) - /** * the vision impairment to give to the mob whose perspective is set to that atom * diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index b580ee5671d..d93d757eaba 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -201,7 +201,6 @@ if(((can_atmos_pass == ATMOS_PASS_DENSITY && density) || can_atmos_pass == ATMOS_PASS_NO) && isturf(loc)) can_atmos_pass = ATMOS_PASS_YES air_update_turf(TRUE, FALSE) - loc.handle_atom_del(src) if(opacity) RemoveElement(/datum/element/light_blocking) diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index 9c55051ca60..c9680744fcb 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -93,11 +93,12 @@ if(stored_id_card) SSexplosions.low_mov_atom += stored_id_card -/obj/machinery/pdapainter/handle_atom_del(atom/A) - if(A == stored_pda) +/obj/machinery/pdapainter/Exited(atom/movable/gone, direction) + . = ..() + if(gone == stored_pda) stored_pda = null update_appearance(UPDATE_ICON) - if(A == stored_id_card) + if(gone == stored_id_card) stored_id_card = null update_appearance(UPDATE_ICON) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index c78f27ffaac..9e2e493a811 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -198,14 +198,7 @@ end_processing() dump_inventory_contents() - if (!isnull(component_parts)) - // Don't delete the stock part singletons - for (var/atom/atom_part in component_parts) - qdel(atom_part) - component_parts.Cut() - component_parts = null - - QDEL_NULL(circuit) + clear_components() unset_static_power() return ..() @@ -818,6 +811,7 @@ new datum_part.physical_object_type(loc) else var/obj/item/obj_part = part + component_parts -= part obj_part.forceMove(loc) if(istype(obj_part, /obj/item/circuitboard/machine)) var/obj/item/circuitboard/machine/board = obj_part @@ -879,21 +873,33 @@ if(EXPLODE_LIGHT) SSexplosions.low_mov_atom += occupant -/obj/machinery/handle_atom_del(atom/deleting_atom) - if(deleting_atom == occupant) +/obj/machinery/Exited(atom/movable/gone, direction) + . = ..() + if(gone == occupant) set_occupant(null) update_appearance() - updateUsrDialog() - return ..() // The circuit should also be in component parts, so don't early return. - if(deleting_atom == circuit) + if(gone == circuit) circuit = null - if((deleting_atom in component_parts) && !QDELETED(src)) - component_parts.Remove(deleting_atom) + if((gone in component_parts) && !QDELETED(src)) + component_parts -= gone // It would be unusual for a component_part to be qdel'd ordinarily. deconstruct(FALSE) - return ..() + +/** + * This should be called before mass qdeling components to make space for replacements. + * If not done, things will go awry as Exited() destroys the machine when it detects + * even a single component exiting the atom. + */ +/obj/machinery/proc/clear_components() + if(!component_parts) + return + var/list/old_components = component_parts + circuit = null + component_parts = null + for(var/atom/atom_part in old_components) + qdel(atom_part) /obj/machinery/proc/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) if((flags_1 & NODECONSTRUCT_1) || screwdriver.tool_behaviour != TOOL_SCREWDRIVER) @@ -1117,14 +1123,6 @@ power -= power * 0.0005 return ..() -/obj/machinery/Exited(atom/movable/gone, direction) - . = ..() - if(gone == occupant) - set_occupant(null) - if(gone == circuit) - LAZYREMOVE(component_parts, gone) - circuit = null - /obj/machinery/proc/adjust_item_drop_location(atom/movable/dropped_atom) // Adjust item drop location to a 3x3 grid inside the tile, returns slot id from 0 to 8 var/md5 = md5(dropped_atom.name) // Oh, and it's deterministic too. A specific item will always drop from the same slot. for (var/i in 1 to 32) diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 0156c06a142..37907a5ba29 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -72,8 +72,9 @@ icon_state = "[xray_module ? "xray" : null][initial(icon_state)]" return ..() -/obj/structure/camera_assembly/handle_atom_del(atom/A) - if(A == xray_module) +/obj/structure/camera_assembly/Exited(atom/movable/gone, direction) + . = ..() + if(gone == xray_module) xray_module = null update_appearance() if(malf_xray_firmware_present) @@ -82,7 +83,7 @@ var/obj/machinery/camera/contained_camera = loc contained_camera.removeXRay(malf_xray_firmware_present) //make sure we don't remove MALF upgrades. - else if(A == emp_module) + else if(gone == emp_module) emp_module = null if(malf_emp_firmware_present) malf_emp_firmware_active = malf_emp_firmware_present //re-enable firmware based upgrades after the part is removed. @@ -90,14 +91,12 @@ var/obj/machinery/camera/contained_camera = loc contained_camera.removeEmpProof(malf_emp_firmware_present) //make sure we don't remove MALF upgrades - else if(A == proxy_module) + else if(gone == proxy_module) emp_module = null if(istype(loc, /obj/machinery/camera)) var/obj/machinery/camera/contained_camera = loc contained_camera.removeMotion() - return ..() - /obj/structure/camera_assembly/Destroy() QDEL_NULL(xray_module) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index a839322bff3..7d0dfaa127a 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -202,19 +202,7 @@ if(istype(new_machine, /obj/machinery/computer)) var/obj/machinery/computer/new_computer = new_machine - // Machines will init with a set of default components. - // Triggering handle_atom_del will make the machine realise it has lost a component_parts and then deconstruct. - // Move to nullspace so we don't trigger handle_atom_del, then qdel. - // Finally, replace new machine's parts with this frame's parts. - if(new_computer.circuit) - // Move to nullspace and delete. - new_computer.circuit.moveToNullspace() - QDEL_NULL(new_computer.circuit) - for(var/old_part in new_computer.component_parts) - var/atom/movable/movable_part = old_part - // Move to nullspace and delete. - movable_part.moveToNullspace() - qdel(movable_part) + new_machine.clear_components() // Set anchor state and move the frame's parts over to the new machine. // Then refresh parts and call on_construction(). diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index d1940d67edb..3bf44a9aa9e 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -269,15 +269,7 @@ P.play_tool_sound(src) var/obj/machinery/new_machine = new circuit.build_path(loc) if(istype(new_machine)) - // Machines will init with a set of default components. Move to nullspace so we don't trigger handle_atom_del, then qdel. - // Finally, replace with this frame's parts. - if(new_machine.circuit) - // Move to nullspace and delete. - new_machine.circuit.moveToNullspace() - QDEL_NULL(new_machine.circuit) - for(var/obj/old_part in new_machine.component_parts) - old_part.moveToNullspace() - qdel(old_part) + new_machine.clear_components() // Set anchor state new_machine.set_anchored(anchored) diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index e72f3f4ddf5..d212f2ba45d 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -27,16 +27,17 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28) MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28) /obj/machinery/defibrillator_mount/Destroy() - if(defib) - QDEL_NULL(defib) - . = ..() - -/obj/machinery/defibrillator_mount/handle_atom_del(atom/A) - if(A == defib) - defib = null - end_processing() + QDEL_NULL(defib) return ..() +/obj/machinery/defibrillator_mount/Exited(atom/movable/gone, direction) + . = ..() + if(gone == defib) + // Make sure processing ends before the defib is nulled + end_processing() + defib = null + update_appearance() + /obj/machinery/defibrillator_mount/examine(mob/user) . = ..() if(defib) @@ -171,10 +172,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28) user.visible_message(span_notice("[user] unhooks [defib] from [src]."), \ span_notice("You slide out [defib] from [src] and unhook the charging cables.")) playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) - // Make sure processing ends before the defib is nulled - end_processing() - defib = null - update_appearance() /obj/machinery/defibrillator_mount/charging name = "PENLITE defibrillator mount" diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 946dd00ddce..ef5fa7a9c38 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -310,11 +310,12 @@ diag_hud.remove_atom_from_hud(src) return ..() -/obj/machinery/door/airlock/handle_atom_del(atom/A) - if(A == note) +/obj/machinery/door/airlock/Exited(atom/movable/gone, direction) + . = ..() + if(gone == note) note = null update_appearance() - if(A == seal) + if(gone == seal) seal = null update_appearance() diff --git a/code/game/machinery/gulag_item_reclaimer.dm b/code/game/machinery/gulag_item_reclaimer.dm index 1a05ed756aa..9c649b2c8ee 100644 --- a/code/game/machinery/gulag_item_reclaimer.dm +++ b/code/game/machinery/gulag_item_reclaimer.dm @@ -11,10 +11,10 @@ ///Icon of the current screen status var/screen_icon = "gulag_on" -/obj/machinery/gulag_item_reclaimer/handle_atom_del(atom/deleting_atom) +/obj/machinery/gulag_item_reclaimer/Exited(atom/movable/gone, direction) + . = ..() for(var/person in stored_items) - stored_items[person] -= deleting_atom - return ..() + stored_items[person] -= gone /obj/machinery/gulag_item_reclaimer/update_overlays() . = ..() diff --git a/code/game/objects/effects/posters/poster.dm b/code/game/objects/effects/posters/poster.dm index 0b4255541b9..75a3a26ce26 100644 --- a/code/game/objects/effects/posters/poster.dm +++ b/code/game/objects/effects/posters/poster.dm @@ -74,11 +74,6 @@ if(!QDELING(src)) qdel(src) //we're now a poster, huzzah! -/obj/item/poster/handle_atom_del(atom/deleting_atom) - if(deleting_atom == poster_structure) - poster_structure.moveToNullspace() //get it the fuck out of us since atom/destroy qdels contents and it'll cause a qdel loop - return ..() - /obj/item/poster/Destroy(force) QDEL_NULL(poster_structure) return ..() diff --git a/code/game/objects/items/circuitboards/circuitboard.dm b/code/game/objects/items/circuitboards/circuitboard.dm index 6750cf85ff2..1e12576f686 100644 --- a/code/game/objects/items/circuitboards/circuitboard.dm +++ b/code/game/objects/items/circuitboards/circuitboard.dm @@ -34,9 +34,9 @@ // This really shouldn't happen. If it somehow does, print out a stack trace and gracefully handle it. stack_trace("apply_defauly_parts called on machine that already had component_parts: [machine]") - // Move to nullspace so you don't trigger handle_atom_del logic and remove existing parts. + // Remove references of components so it doesn't trigger Exited logic and remove existing parts. for(var/obj/item/part as anything in machine.component_parts) - part.moveToNullspace(loc) + machine.component_parts -= part qdel(part) // List of components always contains the circuit board used to build it. @@ -47,9 +47,7 @@ // This really shouldn't happen. If it somehow does, print out a stack trace and gracefully handle it. stack_trace("apply_default_parts called from a circuit board that does not belong to machine: [machine]") - // Move to nullspace so you don't trigger handle_atom_del logic, remove old circuit, add new circuit. - machine.circuit.moveToNullspace() - qdel(machine.circuit) + QDEL_NULL(machine.circuit) machine.circuit = src return diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index ab043bf46ed..496eec5659c 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -33,16 +33,14 @@ /obj/item/transfer_valve/IsAssemblyHolder() return TRUE -/obj/item/transfer_valve/handle_atom_del(atom/deleted_atom) +/obj/item/transfer_valve/Exited(atom/movable/gone, direction) . = ..() - if(deleted_atom == tank_one) + if(gone == tank_one) tank_one = null update_appearance() - return - if(deleted_atom == tank_two) + else if(gone == tank_two) tank_two = null update_appearance() - return /obj/item/transfer_valve/attackby(obj/item/item, mob/user, params) if(istype(item, /obj/item/tank)) @@ -152,7 +150,7 @@ T.Translate(-13, 0) J.transform = T underlays = list(J) - + if(wired) cable_overlay = mutable_appearance(icon, icon_state = "valve_cables", layer = layer + 0.05, appearance_flags = KEEP_TOGETHER) add_overlay(cable_overlay) @@ -160,12 +158,12 @@ else if(cable_overlay) cut_overlay(cable_overlay, TRUE) cable_overlay = null - + worn_icon_state = "[initial(worn_icon_state)][tank_two ? "l" : ""][tank_one ? "r" : ""]" if(ishuman(loc)) //worn var/mob/living/carbon/human/human = loc human.update_worn_back() - + if(!attached_device) return @@ -303,14 +301,12 @@ split_gases() valve_open = FALSE tank_one.forceMove(drop_location()) - tank_one = null . = TRUE if("tanktwo") if(tank_two) split_gases() valve_open = FALSE tank_two.forceMove(drop_location()) - tank_two = null . = TRUE if("toggle") toggle_valve() diff --git a/code/game/objects/items/implants/implantpad.dm b/code/game/objects/items/implants/implantpad.dm index e0a629f490b..c932886754c 100644 --- a/code/game/objects/items/implants/implantpad.dm +++ b/code/game/objects/items/implants/implantpad.dm @@ -25,12 +25,12 @@ if(case) . += span_warning("There seems to be something inside it, but you can't quite tell what from here...") -/obj/item/implantpad/handle_atom_del(atom/A) - if(A == case) - case = null - update_appearance() - updateSelfDialog() +/obj/item/implantpad/Exited(atom/movable/gone, direction) . = ..() + if(gone == case) + case = null + update_appearance() + updateSelfDialog() /obj/item/implantpad/AltClick(mob/user) ..() @@ -44,7 +44,6 @@ add_fingerprint(user) case.add_fingerprint(user) - case = null updateSelfDialog() update_appearance() diff --git a/code/game/objects/items/inspector.dm b/code/game/objects/items/inspector.dm index 53851334eea..ec4786c8cda 100644 --- a/code/game/objects/items/inspector.dm +++ b/code/game/objects/items/inspector.dm @@ -37,16 +37,10 @@ cell = new cell(src) // Clean up the cell on destroy -/obj/item/clothing/suit/space/Destroy() - if(isatom(cell)) - QDEL_NULL(cell) - return ..() - -// Clean up the cell on destroy -/obj/item/inspector/handle_atom_del(atom/A) - if(A == cell) +/obj/item/inspector/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) cell = null - return ..() // support for items that interact with the cell /obj/item/inspector/get_cell() diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 1be7f391e78..f24efb7d263 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -416,16 +416,15 @@ ..() if (held_sausage) user.put_in_hands(held_sausage) - held_sausage = null - update_appearance() /obj/item/melee/roastingstick/update_overlays() . = ..() if(held_sausage) . += mutable_appearance(icon, "roastingstick_sausage") -/obj/item/melee/roastingstick/handle_atom_del(atom/target) - if (target == held_sausage) +/obj/item/melee/roastingstick/Exited(atom/movable/gone, direction) + . = ..() + if (gone == held_sausage) held_sausage = null update_appearance() diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index b08e8dba9dd..86c548ea4de 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -32,17 +32,11 @@ return ..() /obj/item/pet_carrier/Exited(atom/movable/gone, direction) + . = ..() if(isliving(gone) && (gone in occupants)) - var/mob/living/L = gone + var/mob/living/living_gone = gone occupants -= gone - occupant_weight -= L.mob_size - -/obj/item/pet_carrier/handle_atom_del(atom/A) - if(A in occupants && isliving(A)) - var/mob/living/L = A - occupants -= L - occupant_weight -= L.mob_size - ..() + occupant_weight -= living_gone.mob_size /obj/item/pet_carrier/examine(mob/user) . = ..() diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 1f38102a083..77b76d85224 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -108,10 +108,10 @@ return ..() -/obj/item/toy/plush/handle_atom_del(atom/A) - if(A == grenade) +/obj/item/toy/plush/Exited(atom/movable/gone, direction) + . = ..() + if(gone == grenade) grenade = null - ..() /obj/item/toy/plush/attack_self(mob/user) . = ..() @@ -148,7 +148,6 @@ else to_chat(user, span_notice("You remove the grenade from [src].")) user.put_in_hands(grenade) - grenade = null return if(isgrenade(I)) if(stuffed) diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 4af1da629d7..bd31228f2fc 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -250,15 +250,15 @@ var/turf/newtarget = locate(new_x, new_y, starting.z) return newtarget -/obj/item/pneumatic_cannon/handle_atom_del(atom/A) +/obj/item/pneumatic_cannon/Exited(atom/movable/gone, direction) . = ..() - if (loadedItems.Remove(A)) - var/obj/item/I = A - if(istype(I)) - loadedWeightClass -= I.w_class + if(loadedItems.Remove(gone)) + var/obj/item/item = gone + if(istype(item)) + loadedWeightClass -= item.w_class else loadedWeightClass-- - else if (A == tank) + else if (gone == tank) tank = null update_appearance() diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 690a4e35a8b..b2a7d912cb2 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -46,16 +46,16 @@ if(AI_READY_CORE) . += span_notice("The monitor's connection can be cut[core_mmi?.brainmob?.mind && !suicide_check() ? " the neural interface can be screwed in." : "."]") -/obj/structure/ai_core/handle_atom_del(atom/A) - if(A == circuit) +/obj/structure/ai_core/Exited(atom/movable/gone, direction) + . = ..() + if(gone == circuit) circuit = null if((state != GLASS_CORE) && (state != AI_READY_CORE)) state = EMPTY_CORE update_appearance() - if(A == core_mmi) + if(gone == core_mmi) core_mmi = null - return ..() - + update_appearance() /obj/structure/ai_core/Destroy() QDEL_NULL(circuit) @@ -200,9 +200,7 @@ P.play_tool_sound(src) balloon_alert(user, "circuit board removed") state = EMPTY_CORE - update_appearance() circuit.forceMove(loc) - circuit = null return if(SCREWED_CORE) if(P.tool_behaviour == TOOL_SCREWDRIVER && circuit) @@ -298,8 +296,6 @@ P.play_tool_sound(src) balloon_alert(user, "removed [AI_CORE_BRAIN(core_mmi)]") core_mmi.forceMove(loc) - core_mmi = null - update_appearance() return if(GLASS_CORE) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 05b98b5ad9d..bb0918a4491 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -47,13 +47,13 @@ if(vname in list(NAMEOF(src, open), NAMEOF(src, showpiece), NAMEOF(src, custom_glass_overlay))) update_appearance() -/obj/structure/displaycase/handle_atom_del(atom/A) - if(A == electronics) +/obj/structure/displaycase/Exited(atom/movable/gone, direction) + . = ..() + if(gone == electronics) electronics = null - if(A == showpiece) + if(gone == showpiece) showpiece = null update_appearance() - return ..() /obj/structure/displaycase/Destroy() QDEL_NULL(electronics) @@ -73,8 +73,6 @@ if(QDELETED(showpiece)) return showpiece.forceMove(drop_location()) - showpiece = null - update_appearance() /obj/structure/displaycase/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 20ceee9a77e..04e48e489ac 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -46,8 +46,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) /obj/structure/extinguisher_cabinet/Destroy() if(stored_extinguisher) - qdel(stored_extinguisher) - stored_extinguisher = null + QDEL_NULL(stored_extinguisher) return ..() /obj/structure/extinguisher_cabinet/contents_explosion(severity, target) @@ -62,8 +61,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) if(EXPLODE_LIGHT) SSexplosions.low_mov_atom += stored_extinguisher -/obj/structure/extinguisher_cabinet/handle_atom_del(atom/A) - if(A == stored_extinguisher) +/obj/structure/extinguisher_cabinet/Exited(atom/movable/gone, direction) + if(gone == stored_extinguisher) stored_extinguisher = null update_appearance(UPDATE_ICON) @@ -104,11 +103,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) if(stored_extinguisher) user.put_in_hands(stored_extinguisher) user.balloon_alert(user, "extinguisher removed") - stored_extinguisher = null if(!opened) opened = 1 playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) - update_appearance(UPDATE_ICON) else toggle_cabinet(user) diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm index 0d4a1842b00..e4ca0419e3b 100644 --- a/code/game/objects/structures/guncase.dm +++ b/code/game/objects/structures/guncase.dm @@ -92,7 +92,6 @@ return if(!user.put_in_hands(weapon)) weapon.forceMove(get_turf(src)) - update_appearance() /** * check_menu: Checks if we are allowed to interact with a radial menu @@ -109,7 +108,8 @@ return FALSE return TRUE -/obj/structure/guncase/handle_atom_del(atom/A) +/obj/structure/guncase/Exited(atom/movable/gone, direction) + . = ..() update_appearance() /obj/structure/guncase/contents_explosion(severity, target) diff --git a/code/game/objects/structures/headpike.dm b/code/game/objects/structures/headpike.dm index ddafc91854c..7731af947f0 100644 --- a/code/game/objects/structures/headpike.dm +++ b/code/game/objects/structures/headpike.dm @@ -53,24 +53,26 @@ MA.pixel_x = pixel_x . += victim -/obj/structure/headpike/handle_atom_del(atom/A) - if(A == victim) +/obj/structure/headpike/Exited(atom/movable/gone, direction) + . = ..() + if(gone != victim && gone != spear) + return + if(gone == victim) victim = null - if(A == spear) + if(gone == spear) spear = null if(!QDELETED(src)) deconstruct(TRUE) - return ..() /obj/structure/headpike/deconstruct(disassembled) - if(victim) //Make sure the head always comes off - victim.forceMove(drop_location()) - victim = null + var/obj/item/bodypart/head/our_head = victim + var/obj/item/spear/our_spear = spear + victim = null + spear = null + our_head?.forceMove(drop_location()) //Make sure the head always comes off if(!disassembled) return ..() - if(spear) - spear.forceMove(drop_location()) - spear = null + our_spear?.forceMove(drop_location()) return ..() /obj/structure/headpike/attack_hand(mob/user, list/modifiers) diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm index 20582676ae4..e87e125ba6e 100644 --- a/code/game/objects/structures/petrified_statue.dm +++ b/code/game/objects/structures/petrified_statue.dm @@ -44,8 +44,9 @@ /obj/structure/statue/petrified/contents_explosion(severity, target) return -/obj/structure/statue/petrified/handle_atom_del(atom/A) - if(A == petrified_mob) +/obj/structure/statue/petrified/Exited(atom/movable/gone, direction) + . = ..() + if(gone == petrified_mob) petrified_mob = null /obj/structure/statue/petrified/Destroy() @@ -65,12 +66,11 @@ if(petrified_mob) petrified_mob.status_flags &= ~GODMODE - petrified_mob.forceMove(loc) REMOVE_TRAIT(petrified_mob, TRAIT_MUTE, STATUE_MUTE) REMOVE_TRAIT(petrified_mob, TRAIT_NOBLOOD, MAGIC_TRAIT) petrified_mob.take_overall_damage((petrified_mob.health - atom_integrity + 100)) //any new damage the statue incurred is transfered to the mob petrified_mob.faction -= FACTION_MIMIC - petrified_mob = null + petrified_mob.forceMove(loc) return ..() /obj/structure/statue/petrified/deconstruct(disassembled = TRUE) diff --git a/code/game/objects/structures/tank_holder.dm b/code/game/objects/structures/tank_holder.dm index e31d9837b14..9b5b33d8417 100644 --- a/code/game/objects/structures/tank_holder.dm +++ b/code/game/objects/structures/tank_holder.dm @@ -68,7 +68,6 @@ new /obj/item/stack/rods(Tsec, 2) if(tank) tank.forceMove(Tsec) - after_detach_tank() qdel(src) /obj/structure/tank_holder/attack_paw(mob/user, list/modifiers) @@ -83,12 +82,11 @@ add_fingerprint(user) tank.add_fingerprint(user) user.put_in_hands(tank) - after_detach_tank() -/obj/structure/tank_holder/handle_atom_del(atom/A) - if(A == tank) +/obj/structure/tank_holder/Exited(atom/movable/gone, direction) + . = ..() + if(gone == tank) after_detach_tank() - return ..() /obj/structure/tank_holder/contents_explosion(severity, target) if(!tank) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 73b7316d6cb..2c4fceed68c 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -208,9 +208,9 @@ if(EXPLODE_LIGHT) SSexplosions.low_mov_atom += beaker -/obj/machinery/atmospherics/components/unary/cryo_cell/handle_atom_del(atom/A) - ..() - if(A == beaker) +/obj/machinery/atmospherics/components/unary/cryo_cell/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) beaker = null /obj/machinery/atmospherics/components/unary/cryo_cell/on_deconstruction() diff --git a/code/modules/clothing/shoes/sneakers.dm b/code/modules/clothing/shoes/sneakers.dm index b0e51926d24..66af19f503c 100644 --- a/code/modules/clothing/shoes/sneakers.dm +++ b/code/modules/clothing/shoes/sneakers.dm @@ -92,11 +92,6 @@ . = ..() AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HANDCUFFED) -/obj/item/clothing/shoes/sneakers/orange/handle_atom_del(atom/deleting_atom) - if(deleting_atom == attached_cuffs) - moveToNullspace(attached_cuffs) - return ..() - /obj/item/clothing/shoes/sneakers/orange/Destroy() QDEL_NULL(attached_cuffs) return ..() diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index 2519443247b..6912e3bed4f 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -134,11 +134,11 @@ return ..() // Clean up the cell on destroy -/obj/item/clothing/suit/space/handle_atom_del(atom/A) - if(A == cell) +/obj/item/clothing/suit/space/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) cell = null thermal_on = FALSE - return ..() // support for items that interact with the cell /obj/item/clothing/suit/space/get_cell() diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm index 176a9c29f92..e22235084f9 100644 --- a/code/modules/detectivework/evidence.dm +++ b/code/modules/detectivework/evidence.dm @@ -19,7 +19,8 @@ if(evidencebagEquip(I, user)) return 1 -/obj/item/evidencebag/handle_atom_del(atom/A) +/obj/item/evidencebag/Exited(atom/movable/gone, direction) + . = ..() cut_overlays() w_class = initial(w_class) icon_state = initial(icon_state) diff --git a/code/modules/explorer_drone/exodrone.dm b/code/modules/explorer_drone/exodrone.dm index d2ddc6d2535..567d5a93412 100644 --- a/code/modules/explorer_drone/exodrone.dm +++ b/code/modules/explorer_drone/exodrone.dm @@ -418,8 +418,9 @@ GLOBAL_LIST_EMPTY(exodrone_launchers) playsound(src,'sound/effects/podwoosh.ogg',50, FALSE) do_smoke(1, holder = src, location = get_turf(src)) -/obj/machinery/exodrone_launcher/handle_atom_del(atom/A) - if(A == fuel_canister) +/obj/machinery/exodrone_launcher/Exited(atom/movable/gone, direction) + . = ..() + if(gone == fuel_canister) fuel_canister = null update_icon() diff --git a/code/modules/food_and_drinks/machinery/coffeemaker.dm b/code/modules/food_and_drinks/machinery/coffeemaker.dm index 122b2325b0f..ff6d3fd0c8a 100644 --- a/code/modules/food_and_drinks/machinery/coffeemaker.dm +++ b/code/modules/food_and_drinks/machinery/coffeemaker.dm @@ -56,11 +56,13 @@ return ..() /obj/machinery/coffeemaker/Exited(atom/movable/gone, direction) + . = ..() if(gone == coffeepot) coffeepot = null + update_appearance(UPDATE_OVERLAYS) if(gone == cartridge) cartridge = null - return ..() + update_appearance(UPDATE_OVERLAYS) /obj/machinery/coffeemaker/RefreshParts() . = ..() @@ -139,14 +141,6 @@ /obj/machinery/coffeemaker/attack_ai_secondary(mob/user, list/modifiers) return attack_hand_secondary(user, modifiers) -/obj/machinery/coffeemaker/handle_atom_del(atom/A) - . = ..() - if(A == coffeepot) - coffeepot = null - if(A == cartridge) - cartridge = null - update_appearance(UPDATE_OVERLAYS) - /obj/machinery/coffeemaker/update_overlays() . = ..() . += overlay_checks() @@ -527,13 +521,6 @@ QDEL_NULL(coffee) return ..() -/obj/machinery/coffeemaker/impressa/Exited(atom/movable/gone, direction) - if(gone == coffeepot) - coffeepot = null - if(gone == coffee) - coffee = null - return ..() - /obj/machinery/coffeemaker/impressa/examine(mob/user) . = ..() if(coffee) @@ -571,13 +558,11 @@ . += "grinder_full" return . -/obj/machinery/coffeemaker/impressa/handle_atom_del(atom/A) +/obj/machinery/coffeemaker/impressa/Exited(atom/movable/gone, direction) . = ..() - if(A == coffeepot) - coffeepot = null - if(A == coffee) - coffee.Cut() - update_appearance(UPDATE_OVERLAYS) + if(gone in coffee) + coffee -= gone + update_appearance(UPDATE_OVERLAYS) /obj/machinery/coffeemaker/impressa/try_brew() if(coffee_amount <= 0) diff --git a/code/modules/food_and_drinks/machinery/deep_fryer.dm b/code/modules/food_and_drinks/machinery/deep_fryer.dm index 0019dd7f870..4b5689383d6 100644 --- a/code/modules/food_and_drinks/machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/machinery/deep_fryer.dm @@ -155,11 +155,6 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list( if(gone == frying) reset_frying() -/obj/machinery/deepfryer/handle_atom_del(atom/deleting_atom) - . = ..() - if(deleting_atom == frying) - reset_frying() - /obj/machinery/deepfryer/proc/reset_frying() if(!QDELETED(frying)) frying.AddElement(/datum/element/fried_item, cook_time) diff --git a/code/modules/food_and_drinks/machinery/grill.dm b/code/modules/food_and_drinks/machinery/grill.dm index 0bf9aa91303..2ca81f36f90 100644 --- a/code/modules/food_and_drinks/machinery/grill.dm +++ b/code/modules/food_and_drinks/machinery/grill.dm @@ -96,15 +96,10 @@ grilled_item.AddComponent(/datum/component/sizzle) /obj/machinery/grill/Exited(atom/movable/gone, direction) + . = ..() if(gone == grilled_item) finish_grill() grilled_item = null - return ..() - -/obj/machinery/grill/handle_atom_del(atom/A) - if(A == grilled_item) - grilled_item = null - return ..() /obj/machinery/grill/wrench_act(mob/living/user, obj/item/I) . = ..() @@ -131,7 +126,7 @@ return ..() /obj/machinery/grill/proc/finish_grill() - if(grilled_item) + if(!QDELETED(grilled_item)) if(grill_time >= 20) grilled_item.AddElement(/datum/element/grilled_item, grill_time) UnregisterSignal(grilled_item, COMSIG_ITEM_GRILLED) diff --git a/code/modules/food_and_drinks/machinery/smartfridge.dm b/code/modules/food_and_drinks/machinery/smartfridge.dm index 74fce5c4002..33012584015 100644 --- a/code/modules/food_and_drinks/machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/machinery/smartfridge.dm @@ -349,7 +349,8 @@ .["name"] = name .["isdryer"] = FALSE -/obj/machinery/smartfridge/handle_atom_del(atom/A) // Update the UIs in case something inside gets deleted +/obj/machinery/smartfridge/Exited(atom/movable/gone, direction) // Update the UIs in case something inside is removed + . = ..() SStgui.update_uis(src) /obj/machinery/smartfridge/ui_act(action, params) diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 63ccab321d9..7a2b8f9841f 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -117,14 +117,12 @@ if(EXPLODE_LIGHT) SSexplosions.low_mov_atom += beaker -/obj/machinery/biogenerator/handle_atom_del(atom/deleting_atom) +/obj/machinery/biogenerator/Exited(atom/movable/gone, direction) . = ..() - - if(deleting_atom == beaker) + if(gone == beaker) beaker = null update_appearance() - /obj/machinery/biogenerator/RefreshParts() . = ..() diff --git a/code/modules/mob/living/basic/pets/dog/corgi.dm b/code/modules/mob/living/basic/pets/dog/corgi.dm index fe08d9648a6..763335fff50 100644 --- a/code/modules/mob/living/basic/pets/dog/corgi.dm +++ b/code/modules/mob/living/basic/pets/dog/corgi.dm @@ -42,16 +42,16 @@ UnregisterSignal(src, list(COMSIG_BASICMOB_LOOK_ALIVE, COMSIG_BASICMOB_LOOK_DEAD)) return ..() -/mob/living/basic/pet/dog/corgi/handle_atom_del(atom/deleting_atom) - if(deleting_atom == inventory_head) +/mob/living/basic/pet/dog/corgi/Exited(atom/movable/gone, direction) + . = ..() + if(gone == inventory_head) inventory_head = null update_corgi_fluff() update_appearance(UPDATE_OVERLAYS) - if(deleting_atom == inventory_back) + if(gone == inventory_back) inventory_back = null update_corgi_fluff() update_appearance(UPDATE_OVERLAYS) - return ..() /mob/living/basic/pet/dog/corgi/gib() if(inventory_head) diff --git a/code/modules/mob/living/basic/pets/pet.dm b/code/modules/mob/living/basic/pets/pet.dm index 6e8c87059e5..c8507454f77 100644 --- a/code/modules/mob/living/basic/pets/pet.dm +++ b/code/modules/mob/living/basic/pets/pet.dm @@ -69,10 +69,9 @@ . = ..() add_memory_in_range(src, 7, /datum/memory/pet_died, deuteragonist = src) //Protagonist is the person memorizing it -/mob/living/basic/pet/handle_atom_del(atom/deleting_atom) +/mob/living/basic/pet/Exited(atom/movable/gone, direction) . = ..() - - if(deleting_atom != collar) + if(gone != collar) return collar = null diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index 603e6fbfb4b..b4b4dd80f7f 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -128,10 +128,12 @@ return ..() /mob/living/simple_animal/bot/cleanbot/Exited(atom/movable/gone, direction) + . = ..() if(gone == build_bucket) build_bucket = null - return ..() - + if(gone == weapon) + weapon = null + update_appearance(UPDATE_ICON) /mob/living/simple_animal/bot/cleanbot/Destroy() QDEL_NULL(build_bucket) @@ -248,12 +250,6 @@ if(is_type_in_typecache(scan_target, target_types)) return scan_target -/mob/living/simple_animal/bot/cleanbot/handle_atom_del(atom/deleting_atom) - if(deleting_atom == weapon) - weapon = null - update_appearance(UPDATE_ICON) - return ..() - /mob/living/simple_animal/bot/cleanbot/handle_automated_action() . = ..() if(!.) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 2af81656139..c6ae677136a 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -86,14 +86,14 @@ AddElement(/datum/element/ridable, /datum/component/riding/creature/mulebot) diag_hud_set_mulebotcell() -/mob/living/simple_animal/bot/mulebot/handle_atom_del(atom/A) - if(A == load) +/mob/living/simple_animal/bot/mulebot/Exited(atom/movable/gone, direction) + . = ..() + if(gone == load) unload(0) - if(A == cell) + if(gone == cell) turn_off() cell = null diag_hud_set_mulebotcell() - return ..() /mob/living/simple_animal/bot/mulebot/examine(mob/user) . = ..() diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 28defd68aa3..04b62db59d3 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -158,11 +158,11 @@ playsound(src, 'sound/machines/defib_zap.ogg', 50) visible_message(span_warning("[src] shakes and speeds up!")) -/mob/living/simple_animal/bot/secbot/handle_atom_del(atom/deleting_atom) - if(deleting_atom == weapon) +/mob/living/simple_animal/bot/secbot/Exited(atom/movable/gone, direction) + . = ..() + if(gone == weapon) weapon = null update_appearance() - return ..() // Variables sent to TGUI /mob/living/simple_animal/bot/secbot/ui_data(mob/user) diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm index 2c509d799ee..084ce1577e4 100644 --- a/code/modules/mob/living/simple_animal/friendly/pet.dm +++ b/code/modules/mob/living/simple_animal/friendly/pet.dm @@ -75,10 +75,10 @@ . = ..() add_memory_in_range(src, 7, /datum/memory/pet_died, deuteragonist = src) //Protagonist is the person memorizing it -/mob/living/simple_animal/pet/handle_atom_del(atom/deleting_atom) +/mob/living/simple_animal/pet/Exited(atom/movable/gone, direction) . = ..() - if(deleting_atom != collar) + if(gone != collar) return collar = null diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm index 398ba2f216e..fdbcf47d379 100644 --- a/code/modules/mod/mod_construction.dm +++ b/code/modules/mod/mod_construction.dm @@ -281,18 +281,18 @@ QDEL_NULL(boots) return ..() -/obj/item/mod/construction/shell/handle_atom_del(atom/deleted_atom) - if(deleted_atom == core) +/obj/item/mod/construction/shell/Exited(atom/movable/gone, direction) + . = ..() + if(gone == core) core = null - if(deleted_atom == helmet) + if(gone == helmet) helmet = null - if(deleted_atom == chestplate) + if(gone == chestplate) chestplate = null - if(deleted_atom == gauntlets) + if(gone == gauntlets) gauntlets = null - if(deleted_atom == boots) + if(gone == boots) boots = null - return ..() #undef START_STEP #undef CORE_STEP diff --git a/code/modules/pai/card.dm b/code/modules/pai/card.dm index ef930cc2558..a652b745c9e 100644 --- a/code/modules/pai/card.dm +++ b/code/modules/pai/card.dm @@ -57,12 +57,13 @@ if(pai && !pai.holoform) pai.emp_act(severity) -/obj/item/pai_card/handle_atom_del(atom/thing) - if(thing == pai) //double check /mob/living/silicon/pai/Destroy() if you change these. - pai = null - emotion_icon = initial(emotion_icon) - update_appearance() - return ..() +/obj/item/pai_card/proc/on_pai_del(atom/source) + SIGNAL_HANDLER + if(QDELETED(src)) + return + pai = null + emotion_icon = initial(emotion_icon) + update_appearance() /obj/item/pai_card/Initialize(mapload) . = ..() @@ -269,6 +270,7 @@ if(pai) return FALSE pai = downloaded + RegisterSignal(pai, COMSIG_QDELETING, PROC_REF(on_pai_del)) emotion_icon = "null" update_appearance() playsound(src, 'sound/effects/pai_boot.ogg', 50, TRUE, -1) diff --git a/code/modules/pai/door_jack.dm b/code/modules/pai/door_jack.dm index 13717797f25..182cdc10027 100644 --- a/code/modules/pai/door_jack.dm +++ b/code/modules/pai/door_jack.dm @@ -35,6 +35,7 @@ /mob/living/silicon/pai/proc/extend_cable() QDEL_NULL(hacking_cable) //clear any old cables hacking_cable = new + RegisterSignal(hacking_cable, COMSIG_QDELETING, PROC_REF(on_hacking_cable_del)) var/mob/living/carbon/hacker = get_holder() if(iscarbon(hacker) && hacker.put_in_hands(hacking_cable)) //important to double check since get_holder can return non-null values that aren't carbons. hacker.visible_message(span_notice("A port on [src] opens to reveal a cable, which [hacker] quickly grabs."), span_notice("A port on [src] opens to reveal a cable, which you quickly grab."), span_hear("You hear the soft click of a plastic component and manage to catch the falling cable.")) @@ -89,7 +90,6 @@ */ /mob/living/silicon/pai/proc/retract_cable() balloon_alert(src, "cable retracted") - untrack_pai() QDEL_NULL(hacking_cable) return TRUE @@ -112,17 +112,11 @@ // Now begin hacking if(!do_after(src, 15 SECONDS, hacking_cable.machine, timed_action_flags = NONE, progress = TRUE)) balloon_alert(src, "failed! retracting...") - untrack_pai() - untrack_thing(hacking_cable) QDEL_NULL(hacking_cable) - if(!QDELETED(card)) - card.update_appearance() return FALSE var/obj/machinery/door/door = hacking_cable.machine balloon_alert(src, "success") door.open() - untrack_pai() - untrack_thing(hacking_cable) QDEL_NULL(hacking_cable) return TRUE diff --git a/code/modules/pai/pai.dm b/code/modules/pai/pai.dm index d2434b8257c..4dfaaca5437 100644 --- a/code/modules/pai/pai.dm +++ b/code/modules/pai/pai.dm @@ -184,30 +184,32 @@ else . += "Systems nonfunctional." -/mob/living/silicon/pai/handle_atom_del(atom/deleting_atom) - if(deleting_atom == hacking_cable) - untrack_pai() - untrack_thing(hacking_cable) - hacking_cable = null - SStgui.update_user_uis(src) - if(!QDELETED(card)) - card.update_appearance() - if(deleting_atom == atmos_analyzer) +/mob/living/silicon/pai/Exited(atom/movable/gone, direction) + if(gone == atmos_analyzer) atmos_analyzer = null - if(deleting_atom == camera) + else if(gone == camera) camera = null - if(deleting_atom == host_scan) + else if(gone == host_scan) host_scan = null - if(deleting_atom == internal_gps) + else if(gone == internal_gps) internal_gps = null - if(deleting_atom == instrument) + else if(gone == instrument) instrument = null - if(deleting_atom == newscaster) + else if(gone == newscaster) newscaster = null - if(deleting_atom == signaler) + else if(gone == signaler) signaler = null return ..() +/mob/living/silicon/pai/proc/on_hacking_cable_del(atom/source) + SIGNAL_HANDLER + untrack_pai() + untrack_thing(hacking_cable) + hacking_cable = null + SStgui.update_user_uis(src) + if(!QDELETED(card)) + card.update_appearance() + /mob/living/silicon/pai/Initialize(mapload) . = ..() START_PROCESSING(SSfastprocess, src) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index b0b7524e4fb..0f122c104eb 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -96,22 +96,19 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) /obj/machinery/photocopier/proc/setup_components() AddComponent(/datum/component/payment, PHOTOCOPIER_FEE, SSeconomy.get_dep_account(ACCOUNT_CIV), PAYMENT_CLINICAL) -/obj/machinery/photocopier/handle_atom_del(atom/deleting_atom) - if(deleting_atom == object_copy) +/obj/machinery/photocopier/Exited(atom/movable/gone, direction) + . = ..() + if(gone == object_copy) object_copy = null - if(deleting_atom == ass) - ass = null - if(deleting_atom == toner_cartridge) + if(gone == toner_cartridge) toner_cartridge = null - if(deleting_atom in paper_stack) - paper_stack -= deleting_atom - return ..() + if(gone in paper_stack) + paper_stack -= gone /obj/machinery/photocopier/Destroy() // object_copy can be a traitor objective, don't qdel if(object_copy) object_copy.forceMove(drop_location()) - object_copy = null QDEL_NULL(toner_cartridge) QDEL_LIST(paper_stack) @@ -623,10 +620,6 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) visible_message(span_warning("[object_copy] is shoved out of the way by [ass]!")) object_copy = null -/obj/machinery/photocopier/Exited(atom/movable/gone, direction) - check_ass() // There was potentially a person sitting on the copier, check if they're still there. - return ..() - /** * Checks the living mob `ass` exists and its location is the same as the photocopier. * diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index f5b2ffabee5..b9f60aea016 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -260,14 +260,14 @@ area.apc = null area = null -/obj/machinery/power/apc/handle_atom_del(atom/deleting_atom) - if(deleting_atom == cell) +/obj/machinery/power/apc/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) cell = null charging = APC_NOT_CHARGING update_appearance() if(!QDELING(src)) SStgui.update_uis(src) - return ..() /obj/machinery/power/apc/examine(mob/user) . = ..() diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index 0cedd170e9f..1f79e66e1ea 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -50,6 +50,15 @@ QDEL_LIST(stored_ammo) return ..() +/obj/item/ammo_box/Exited(atom/movable/gone, direction) + . = ..() + if(gone in stored_ammo) + remove_from_stored_ammo(gone) + +/obj/item/ammo_box/proc/remove_from_stored_ammo(atom/movable/gone) + stored_ammo -= gone + update_appearance() + /obj/item/ammo_box/add_weapon_description() AddElement(/datum/element/weapon_description, attached_proc = PROC_REF(add_notes_box)) @@ -84,19 +93,19 @@ return for(var/i in max(1, stored_ammo.len) to max_ammo) - stored_ammo += new round_check() //SKYRAT EDTI CHANGE - SEC_HUAL - Moving to nullspace seems to help with lag. + stored_ammo += new round_check(src) update_appearance() -///gets a round from the magazine, if keep is TRUE the round will stay in the gun +///gets a round from the magazine, if keep is TRUE the round will be moved to the bottom of the list. /obj/item/ammo_box/proc/get_round(keep = FALSE) - if (!stored_ammo.len) + var/ammo_len = length(stored_ammo) + if (!ammo_len) return null - else - var/b = stored_ammo[stored_ammo.len] - stored_ammo -= b - if (keep) - stored_ammo.Insert(1,b) - return b + var/casing = stored_ammo[ammo_len] + if (keep) + stored_ammo -= casing + stored_ammo.Insert(1,casing) + return casing ///puts a round into the magazine /obj/item/ammo_box/proc/give_round(obj/item/ammo_casing/R, replace_spent = 0) @@ -106,7 +115,7 @@ if (stored_ammo.len < max_ammo) stored_ammo += R - R.moveToNullspace() //SKYRAT EDTI CHANGE - SEC_HUAL - Moving to nullspace seems to help with lag. + R.forceMove(src) return TRUE //for accessibles magazines (e.g internal ones) when full, start replacing spent ammo @@ -117,7 +126,7 @@ AC.forceMove(get_turf(src.loc)) stored_ammo += R - R.moveToNullspace() //SKYRAT EDTI CHANGE - SEC_HUAL - Moving to nullspace seems to help with lag. + R.forceMove(src) return TRUE return FALSE @@ -173,7 +182,6 @@ desc = "[initial(desc)] There [(shells_left == 1) ? "is" : "are"] [shells_left] shell\s left!" /obj/item/ammo_box/update_icon_state() - . = ..() var/shells_left = LAZYLEN(stored_ammo) switch(multiple_sprites) if(AMMO_BOX_PER_BULLET) @@ -181,19 +189,20 @@ if(AMMO_BOX_FULL_EMPTY) icon_state = "[multiple_sprite_use_base ? base_icon_state : initial(icon_state)]-[shells_left ? "full" : "empty"]" -/obj/item/ammo_box/update_overlays() - . = ..() if(ammo_band_color && ammo_band_icon) - . += update_ammo_band() + update_ammo_band() + + return ..() /obj/item/ammo_box/proc/update_ammo_band() + overlays.Cut() var/band_icon = ammo_band_icon if(!(length(stored_ammo)) && ammo_band_icon_empty) band_icon = ammo_band_icon_empty var/image/ammo_band_image = image(icon, src, band_icon) ammo_band_image.color = ammo_band_color ammo_band_image.appearance_flags = RESET_COLOR|KEEP_APART - return ammo_band_image + overlays += ammo_band_image ///Count of number of bullets in the magazine /obj/item/ammo_box/magazine/proc/ammo_count(countempties = TRUE) @@ -204,11 +213,8 @@ return boolets ///list of every bullet in the magazine -/obj/item/ammo_box/magazine/proc/ammo_list(drop_list = FALSE) - var/list/L = stored_ammo.Copy() - if(drop_list) - stored_ammo.Cut() - return L +/obj/item/ammo_box/magazine/proc/ammo_list() + return stored_ammo.Copy() ///drops the entire contents of the magazine on the floor /obj/item/ammo_box/magazine/proc/empty_magazine() @@ -216,14 +222,3 @@ for(var/obj/item/ammo in stored_ammo) ammo.forceMove(turf_mag) stored_ammo -= ammo - -/obj/item/ammo_box/magazine/handle_atom_del(atom/A) - stored_ammo -= A - update_appearance() - -//SKRYAT EDIT ADDITION BEGIN - SEC_HAUL -/obj/item/ammo_box/Destroy() - . = ..() - for(var/i in stored_ammo) - qdel(i) -//SKYRAT EDIT END diff --git a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm index c4509b917c7..c60ec087c51 100644 --- a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm +++ b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm @@ -4,14 +4,18 @@ caliber = CALIBER_357 max_ammo = 7 -/obj/item/ammo_box/magazine/internal/cylinder/get_round(keep = 0) +///Here, we have to maintain the list size, to emulate a cylinder with several chambers, empty or otherwise. +/obj/item/ammo_box/magazine/internal/cylinder/remove_from_stored_ammo(atom/movable/gone) + for(var/index in 1 to length(stored_ammo)) + var/obj/item/ammo_casing/bullet = stored_ammo[index] + if(gone == bullet) + stored_ammo[index] = null + update_appearance() + return + +/obj/item/ammo_box/magazine/internal/cylinder/get_round() rotate() - - var/b = stored_ammo[1] - if(!keep) - stored_ammo[1] = null - - return b + return stored_ammo[1] /obj/item/ammo_box/magazine/internal/cylinder/proc/rotate() var/b = stored_ammo[1] @@ -22,15 +26,10 @@ for(var/i in 1 to rand(0, max_ammo*2)) rotate() -/obj/item/ammo_box/magazine/internal/cylinder/ammo_list(drop_list = FALSE) - var/list/L = list() - for(var/i=1 to stored_ammo.len) - var/obj/item/ammo_casing/bullet = stored_ammo[i] - if(bullet) - L.Add(bullet) - if(drop_list)//We have to maintain the list size, to emulate a cylinder - stored_ammo[i] = null - return L +/obj/item/ammo_box/magazine/internal/cylinder/ammo_list() + var/list/no_nulls_ammo = stored_ammo.Copy() + list_clear_nulls(no_nulls_ammo) + return no_nulls_ammo /obj/item/ammo_box/magazine/internal/cylinder/give_round(obj/item/ammo_casing/R, replace_spent = 0) if(!R || !(caliber ? (caliber == R.caliber) : (ammo_type == R.type))) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 5413e8eba2d..96900458922 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -111,22 +111,19 @@ /obj/item/gun/proc/add_seclight_point() return -/obj/item/gun/handle_atom_del(atom/A) - if(A == pin) +/obj/item/gun/Exited(atom/movable/gone, direction) + . = ..() + if(gone == pin) pin = null - if(A == chambered) + if(gone == chambered) chambered = null update_appearance() - if(A == suppressed) + if(gone == suppressed) clear_suppressor() - return ..() - -/obj/item/gun/Exited(atom/movable/gone, direction) if(gone == bayonet) bayonet = null if(!QDELING(src)) update_appearance() - return ..() ///Clears var and updates icon. In the case of ballistic weapons, also updates the gun's weight. /obj/item/gun/proc/clear_suppressor() diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 51341b68b61..b2ada727f11 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -259,27 +259,34 @@ stack_trace("Trying to move a qdeleted casing of type [casing.type]!") chambered = null else if(casing_ejector || !from_firing) - chambered = null casing.forceMove(drop_location()) //Eject casing onto ground. if(!QDELETED(casing)) casing.bounce_away(TRUE) SEND_SIGNAL(casing, COMSIG_CASING_EJECTED) else if(empty_chamber) + UnregisterSignal(chambered, COMSIG_MOVABLE_MOVED) chambered = null if (chamber_next_round && (magazine?.max_ammo > 1)) chamber_round() ///Used to chamber a new round and eject the old one -/obj/item/gun/ballistic/proc/chamber_round(keep_bullet = FALSE, spin_cylinder, replace_new_round) +/obj/item/gun/ballistic/proc/chamber_round(spin_cylinder, replace_new_round) if (chambered || !magazine) return if (magazine.ammo_count()) - chambered = magazine.get_round(keep_bullet || bolt_type == BOLT_TYPE_NO_BOLT) + chambered = magazine.get_round((bolt_type == BOLT_TYPE_OPEN && !bolt_locked) || bolt_type == BOLT_TYPE_NO_BOLT) if (bolt_type != BOLT_TYPE_OPEN) chambered.forceMove(src) + else + RegisterSignal(chambered, COMSIG_MOVABLE_MOVED, PROC_REF(clear_chambered)) if(replace_new_round) magazine.give_round(new chambered.type) +/obj/item/gun/ballistic/proc/clear_chambered(datum/source) + SIGNAL_HANDLER + UnregisterSignal(chambered, COMSIG_MOVABLE_MOVED) + chambered = null + ///updates a bunch of racking related stuff and also handles the sound effects and the like /obj/item/gun/ballistic/proc/rack(mob/user = null) if (bolt_type == BOLT_TYPE_NO_BOLT) //If there's no bolt, nothing to rack @@ -323,7 +330,7 @@ else playsound(src, load_empty_sound, load_sound_volume, load_sound_vary) if (bolt_type == BOLT_TYPE_OPEN && !bolt_locked) - chamber_round(TRUE) + chamber_round() update_appearance() return TRUE else @@ -510,7 +517,7 @@ if(bolt_type == BOLT_TYPE_NO_BOLT) chambered = null var/num_unloaded = 0 - for(var/obj/item/ammo_casing/CB in get_ammo_list(FALSE, TRUE)) + for(var/obj/item/ammo_casing/CB as anything in get_ammo_list(FALSE)) CB.forceMove(drop_location()) CB.bounce_away(FALSE, NONE) num_unloaded++ @@ -561,14 +568,12 @@ return bullets ///gets a list of every bullet in the gun -/obj/item/gun/ballistic/proc/get_ammo_list(countchambered = TRUE, drop_all = FALSE) +/obj/item/gun/ballistic/proc/get_ammo_list(countchambered = TRUE) var/list/rounds = list() if(chambered && countchambered) rounds.Add(chambered) - if(drop_all) - chambered = null if(magazine) - rounds.Add(magazine.ammo_list(drop_all)) + rounds.Add(magazine.ammo_list()) return rounds #define BRAINS_BLOWN_THROW_RANGE 3 diff --git a/code/modules/projectiles/guns/ballistic/bows/_bow.dm b/code/modules/projectiles/guns/ballistic/bows/_bow.dm index dc20a502592..c356d5b266c 100644 --- a/code/modules/projectiles/guns/ballistic/bows/_bow.dm +++ b/code/modules/projectiles/guns/ballistic/bows/_bow.dm @@ -33,38 +33,33 @@ if(isnull(chambered)) return ..() - chambered.forceMove(drop_location()) - magazine.get_round(keep = FALSE) - - var/obj/item/ammo_casing/arrow/our_arrow = chambered - user.put_in_hands(our_arrow) - - drawn = FALSE - chambered = null + user.put_in_hands(chambered) + chambered = magazine.get_round() update_appearance() /obj/item/gun/ballistic/bow/proc/drop_arrow() - drawn = FALSE - if(chambered) - chambered.forceMove(drop_location()) - magazine.get_round(keep = FALSE) - chambered = null + chambered.forceMove(drop_location()) + chambered = magazine.get_round() update_appearance() -/obj/item/gun/ballistic/bow/chamber_round(keep_bullet = FALSE, spin_cylinder, replace_new_round) +/obj/item/gun/ballistic/bow/chamber_round(spin_cylinder, replace_new_round) if(chambered || !magazine) return - if(magazine.ammo_count()) - chambered = magazine.get_round(TRUE) - chambered.forceMove(src) + chambered = magazine.get_round() + RegisterSignal(chambered, COMSIG_MOVABLE_MOVED, PROC_REF(clear_chambered)) + update_appearance() + +/obj/item/gun/ballistic/bow/clear_chambered(datum/source) + . = ..() + drawn = FALSE /obj/item/gun/ballistic/bow/attack_self(mob/user) if(!chambered) balloon_alert(user, "no arrow nocked!") - else - balloon_alert(user, "[drawn ? "string released" : "string drawn"]") - drawn = !drawn - playsound(src, 'sound/weapons/gun/bow/bow_draw.ogg', 25, TRUE) + return + balloon_alert(user, "[drawn ? "string released" : "string drawn"]") + drawn = !drawn + playsound(src, 'sound/weapons/gun/bow/bow_draw.ogg', 25, TRUE) update_appearance() /obj/item/gun/ballistic/bow/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE) @@ -74,11 +69,8 @@ if(!drawn) to_chat(user, span_warning("Without drawing the bow, the arrow uselessly falls to the ground.")) drop_arrow() - update_appearance() return - drawn = FALSE - . = ..() //fires, removing the arrow - update_appearance() + return ..() //fires, removing the arrow /obj/item/gun/ballistic/bow/equipped(mob/user, slot, initial) . = ..() @@ -94,10 +86,11 @@ addtimer(CALLBACK(src, PROC_REF(drop_arrow_if_not_held)), 0.1 SECONDS) /obj/item/gun/ballistic/bow/proc/drop_arrow_if_not_held() - if(!ismob(loc)) - if(drawn) - playsound(src, 'sound/weapons/gun/bow/bow_fire.ogg', 25, TRUE) - drop_arrow() + if(ismob(loc) || !chambered) + return + if(drawn) + playsound(src, 'sound/weapons/gun/bow/bow_fire.ogg', 25, TRUE) + drop_arrow() /obj/item/gun/ballistic/bow/shoot_with_empty_chamber(mob/living/user) return //no clicking sounds please diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index f77288f9b24..6439b78a9bd 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -21,13 +21,17 @@ last_fire = world.time -/obj/item/gun/ballistic/revolver/chamber_round(keep_bullet, spin_cylinder = TRUE, replace_new_round) +/obj/item/gun/ballistic/revolver/chamber_round(spin_cylinder = TRUE, replace_new_round) if(!magazine) //if it mag was qdel'd somehow. CRASH("revolver tried to chamber a round without a magazine!") + if(chambered) + UnregisterSignal(chambered, COMSIG_MOVABLE_MOVED) if(spin_cylinder) chambered = magazine.get_round(TRUE) else chambered = magazine.stored_ammo[1] + if(chambered) + RegisterSignal(chambered, COMSIG_MOVABLE_MOVED, PROC_REF(clear_chambered)) /obj/item/gun/ballistic/revolver/shoot_with_empty_chamber(mob/living/user as mob|obj) ..() diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 76246854e2b..811ba23122f 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -139,11 +139,11 @@ return ..() -/obj/item/gun/energy/handle_atom_del(atom/A) - if(A == cell) +/obj/item/gun/energy/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) cell = null update_appearance() - return ..() /obj/item/gun/energy/process(seconds_per_tick) if(selfcharge && cell && cell.percent() < 100) diff --git a/code/modules/projectiles/guns/special/blastcannon.dm b/code/modules/projectiles/guns/special/blastcannon.dm index 5029f2b2588..f9a8abf7ae3 100644 --- a/code/modules/projectiles/guns/special/blastcannon.dm +++ b/code/modules/projectiles/guns/special/blastcannon.dm @@ -62,11 +62,11 @@ cached_target = null return ..() -/obj/item/gun/blastcannon/handle_atom_del(atom/A) - if(A == bomb) +/obj/item/gun/blastcannon/Exited(atom/movable/gone, direction) + . = ..() + if(gone == bomb) bomb = null update_appearance() - return ..() /obj/item/gun/blastcannon/assume_air(datum/gas_mixture/giver) qdel(giver) diff --git a/code/modules/projectiles/guns/special/syringe_gun.dm b/code/modules/projectiles/guns/special/syringe_gun.dm index aa6f0aec572..270bb8744cc 100644 --- a/code/modules/projectiles/guns/special/syringe_gun.dm +++ b/code/modules/projectiles/guns/special/syringe_gun.dm @@ -38,10 +38,10 @@ max_syringes = reset_fantasy_variable("max_syringes", max_syringes) return ..() -/obj/item/gun/syringe/handle_atom_del(atom/A) +/obj/item/gun/syringe/Exited(atom/movable/gone, direction) . = ..() - if(A in syringes) - syringes.Remove(A) + if(gone in syringes) + syringes -= gone /obj/item/gun/syringe/recharge_newshot() if(!syringes.len) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 05a05a9a57a..516951e0e04 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -220,9 +220,9 @@ if(EXPLODE_LIGHT) SSexplosions.low_mov_atom += beaker -/obj/machinery/chem_dispenser/handle_atom_del(atom/A) - ..() - if(A == beaker) +/obj/machinery/chem_dispenser/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) beaker = null cut_overlays() diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index ab96de1586e..849052f2141 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -49,9 +49,9 @@ QDEL_NULL(beaker) return ..() -/obj/machinery/chem_heater/handle_atom_del(atom/A) +/obj/machinery/chem_heater/Exited(atom/movable/gone, direction) . = ..() - if(A == beaker) + if(gone == beaker) beaker = null update_appearance() diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 4ac2b60aa1c..2c4cff9c376 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -115,9 +115,9 @@ GLOBAL_LIST_INIT(chem_master_containers, list( replace_beaker() return ..() -/obj/machinery/chem_master/handle_atom_del(atom/deleted_atom) - ..() - if(deleted_atom == beaker) +/obj/machinery/chem_master/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) beaker = null update_appearance(UPDATE_ICON) diff --git a/code/modules/reagents/chemistry/machinery/chem_separator.dm b/code/modules/reagents/chemistry/machinery/chem_separator.dm index aa492ec2d75..2e5571fd431 100644 --- a/code/modules/reagents/chemistry/machinery/chem_separator.dm +++ b/code/modules/reagents/chemistry/machinery/chem_separator.dm @@ -43,9 +43,9 @@ QDEL_NULL(soundloop) return ..() -/obj/structure/chem_separator/handle_atom_del(atom/deleted_atom) - ..() - if(deleted_atom == beaker) +/obj/structure/chem_separator/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) beaker = null update_appearance(UPDATE_ICON) diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 273b2309c05..586cb0ce8fa 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -73,11 +73,11 @@ /obj/machinery/computer/pandemic/attack_ai_secondary(mob/user, list/modifiers) return attack_hand_secondary(user, modifiers) -/obj/machinery/computer/pandemic/handle_atom_del(atom/A) - if(A == beaker) +/obj/machinery/computer/pandemic/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) beaker = null update_appearance() - return ..() /obj/machinery/computer/pandemic/attackby(obj/item/held_item, mob/user, params) //Advanced science! Percision instruments (eg droppers and syringes) are precise enough to modify the loaded sample! diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index d0ba93f0535..15929e190cc 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -112,13 +112,13 @@ /obj/machinery/reagentgrinder/attack_ai_secondary(mob/user, list/modifiers) return attack_hand_secondary(user, modifiers) -/obj/machinery/reagentgrinder/handle_atom_del(atom/A) +/obj/machinery/reagentgrinder/Exited(atom/movable/gone, direction) . = ..() - if(A == beaker) + if(gone == beaker) beaker = null update_appearance() - if(holdingitems[A]) - holdingitems -= A + if(holdingitems[gone]) + holdingitems -= gone /obj/machinery/reagentgrinder/proc/drop_all_items() for(var/i in holdingitems) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index fe21a4bd742..93655ebee8f 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -88,8 +88,9 @@ trunk = null return ..() -/obj/machinery/disposal/handle_atom_del(atom/A) - if(A == stored && !QDELETED(src)) +/obj/machinery/disposal/Exited(atom/movable/gone, direction) + . = ..() + if(gone == stored && !QDELETED(src)) stored = null deconstruct(FALSE) @@ -279,11 +280,13 @@ var/turf/T = loc if(!(flags_1 & NODECONSTRUCT_1)) if(stored) - stored.forceMove(T) - src.transfer_fingerprints_to(stored) - stored.set_anchored(FALSE) - stored.set_density(TRUE) - stored.update_appearance() + var/obj/structure/disposalconstruct/construct = stored + stored = null + construct.forceMove(T) + transfer_fingerprints_to(construct) + construct.set_anchored(FALSE) + construct.set_density(TRUE) + construct.update_appearance() for(var/atom/movable/AM in src) //out, out, darned crowbar! AM.forceMove(T) ..() diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index c5d60979c58..c3eb99bf690 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -76,10 +76,13 @@ expel(holdplease, get_turf(src), 0) stored = null // It gets dumped out in expel() -/obj/structure/disposalpipe/handle_atom_del(atom/A) - if(A == stored && !QDELETED(src)) - spawn_pipe = FALSE - stored = null +/obj/structure/disposalpipe/Exited(atom/movable/gone, direction) + . = ..() + if(gone != stored || QDELETED(src)) + return + spawn_pipe = FALSE + stored = null + if(QDELETED(gone)) deconstruct(FALSE) //pipe has broken. // returns the direction of the next pipe object, given the entrance dir @@ -171,12 +174,13 @@ if(!(flags_1 & NODECONSTRUCT_1)) if(disassembled) if(spawn_pipe) - if(isnull(stored)) // Don't have something? Make one now - stored = new /obj/structure/disposalconstruct(src, null, SOUTH, FALSE, src) - stored.forceMove(loc) - transfer_fingerprints_to(stored) - stored.setDir(dir) + var/obj/structure/disposalconstruct/construct = stored + if(!construct) // Don't have something? Make one now + construct = new /obj/structure/disposalconstruct(src, null, SOUTH, FALSE, src) stored = null + construct.forceMove(loc) + transfer_fingerprints_to(construct) + construct.setDir(dir) spawn_pipe = FALSE else var/turf/T = get_turf(src) diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index c741743118f..ac148161b03 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -69,12 +69,12 @@ connected_recycler = null return ..() -/obj/machinery/computer/camera_advanced/xenobio/handle_atom_del(atom/A) - if(A == current_potion) +/obj/machinery/computer/camera_advanced/xenobio/Exited(atom/movable/gone, direction) + . = ..() + if(gone == current_potion) current_potion = null - if(A in stored_slimes) - stored_slimes -= A - return ..() + if(gone in stored_slimes) + stored_slimes -= gone /obj/machinery/computer/camera_advanced/xenobio/CreateEye() eyeobj = new /mob/camera/ai_eye/remote/xenobio(get_turf(src)) diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 0872ccbebb5..5aec52a7ba2 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -93,7 +93,7 @@ var/datum/worn_feature_offset/worn_face_offset /obj/item/bodypart/head/Destroy() - QDEL_NULL(brainmob) //order is sensitive, see warning in handle_atom_del() below + QDEL_NULL(brainmob) //order is sensitive, see warning in Exited() below QDEL_NULL(brain) QDEL_NULL(eyes) QDEL_NULL(ears) @@ -106,21 +106,21 @@ QDEL_NULL(worn_face_offset) return ..() -/obj/item/bodypart/head/handle_atom_del(atom/head_atom) - if(head_atom == brain) +/obj/item/bodypart/head/Exited(atom/movable/gone, direction) + if(gone == brain) brain = null update_icon_dropped() if(!QDELETED(brainmob)) //this shouldn't happen without badminnery. message_admins("Brainmob: ([ADMIN_LOOKUPFLW(brainmob)]) was left stranded in [src] at [ADMIN_VERBOSEJMP(src)] without a brain!") brainmob.log_message(", brainmob, was left stranded in [src] without a brain", LOG_GAME) - if(head_atom == brainmob) + if(gone == brainmob) brainmob = null - if(head_atom == eyes) + if(gone == eyes) eyes = null update_icon_dropped() - if(head_atom == ears) + if(gone == ears) ears = null - if(head_atom == tongue) + if(gone == tongue) tongue = null return ..() diff --git a/modular_skyrat/master_files/code/modules/clothing/back/antigravityharness.dm b/modular_skyrat/master_files/code/modules/clothing/back/antigravityharness.dm index 67e9314ce75..ebad5b1ea19 100644 --- a/modular_skyrat/master_files/code/modules/clothing/back/antigravityharness.dm +++ b/modular_skyrat/master_files/code/modules/clothing/back/antigravityharness.dm @@ -195,8 +195,9 @@ if(cell_cover_open) return current_cell -/obj/item/gravity_harness/handle_atom_del(atom/harness_cell) - if(harness_cell == current_cell) +/obj/item/gravity_harness/Exited(atom/movable/gone, direction) + . = ..() + if(gone == current_cell) change_mode(MODE_GRAVOFF) current_cell = null diff --git a/modular_skyrat/modules/microfusion/code/microfusion_energy_master.dm b/modular_skyrat/modules/microfusion/code/microfusion_energy_master.dm index 909fafffbac..a748f0ccb75 100644 --- a/modular_skyrat/modules/microfusion/code/microfusion_energy_master.dm +++ b/modular_skyrat/modules/microfusion/code/microfusion_energy_master.dm @@ -132,14 +132,14 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/gun/microfusion/handle_atom_del(atom/to_handle) - if(to_handle == cell) +/obj/item/gun/microfusion/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) cell = null update_appearance() - if(to_handle == phase_emitter) + else if(gone == phase_emitter) phase_emitter = null update_appearance() - return ..() /obj/item/gun/microfusion/can_shoot() return !QDELETED(cell) ? (cell.charge >= microfusion_lens.e_cost) : FALSE