diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 767567b4b0..4a7d6f2acb 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -14,6 +14,9 @@ var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. var/gun_click_time = -100 //I'm lazy. +/obj/screen/Destroy() + master = null + ..() /obj/screen/text icon = null diff --git a/code/datums/helper_datums/global_iterator.dm b/code/datums/helper_datums/global_iterator.dm index 0020859f1d..4f4d680e9e 100644 --- a/code/datums/helper_datums/global_iterator.dm +++ b/code/datums/helper_datums/global_iterator.dm @@ -151,4 +151,8 @@ Data storage vars: start() return active() - +/datum/global_iterator/Destroy() + tag = null + arg_list.Cut() + stop() + //Do not call ..() diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index d7e64c1ece..aba7a44944 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -76,6 +76,10 @@ ME.attach(src) return +/obj/mecha/combat/marauder/Destroy() + qdel(smoke_system) + ..() + /obj/mecha/combat/marauder/relaymove(mob/user,direction) if(user != src.occupant) //While not "realistic", this piece is player friendly. user.loc = get_turf(src) diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 08d6f2cca4..adf27da034 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -21,6 +21,10 @@ pr_mech_sleeper.set_delay(equip_cooldown) return + Destroy() + qdel(pr_mech_sleeper) + ..() + allow_drop() return 0 diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index b0ff7e633d..37ffbcebcf 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -15,7 +15,7 @@ action(atom/target) if(!action_checks(target)) return if(!cargo_holder) return - + //loading if(istype(target,/obj)) var/obj/O = target @@ -29,7 +29,7 @@ if(cargo_holder.cargo.len >= cargo_holder.cargo_capacity) occupant_message("Not enough room in cargo compartment.") return - + occupant_message("You lift [target] and start to load it into cargo compartment.") chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.") set_ready_state(0) @@ -637,6 +637,11 @@ pr_repair_droid.set_delay(equip_cooldown) return + Destroy() + qdel(pr_repair_droid) + pr_repair_droid = null + ..() + attach(obj/mecha/M as obj) ..() droid_overlay = new(src.icon, icon_state = "repair_droid") @@ -726,6 +731,11 @@ pr_energy_relay.set_delay(equip_cooldown) return + Destroy() + qdel(pr_energy_relay) + pr_energy_relay = null + ..() + detach() pr_energy_relay.stop() // chassis.proc_res["dynusepower"] = null @@ -842,6 +852,11 @@ init() return + Destroy() + qdel(pr_mech_generator) + pr_mech_generator = null + ..() + proc/init() fuel = new /obj/item/stack/sheet/mineral/phoron(src) fuel.amount = 0 diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 45abb3d6ea..d11bacbd80 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -82,6 +82,7 @@ /obj/mecha/New() ..() events = new + icon_state += "-open" add_radio() add_cabin() @@ -98,11 +99,60 @@ mechas_list += src //global mech list return -/obj/mecha/Del() +/obj/mecha/Destroy() src.go_out() + for(var/mob/M in src) //Let's just be ultra sure + M.Move(loc) + + if(loc) + loc.Exited(src) + loc = null + + if(prob(30)) + explosion(get_turf(loc), 0, 0, 1, 3) + + if(wreckage) + var/obj/effect/decal/mecha_wreckage/WR = new wreckage(loc) + for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) + if(E.salvageable && prob(30)) + WR.crowbar_salvage += E + E.forceMove(WR) + E.equip_ready = 1 + E.reliability = round(rand(E.reliability/3,E.reliability)) + else + E.forceMove(loc) + E.destroy() + if(cell) + WR.crowbar_salvage += cell + cell.forceMove(WR) + cell.charge = rand(0, cell.charge) + if(internal_tank) + WR.crowbar_salvage += internal_tank + internal_tank.forceMove(WR) + else + for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) + E.detach(loc) + E.destroy() + if(cell) + qdel(cell) + if(internal_tank) + qdel(internal_tank) + equipment.Cut() + cell = null + internal_tank = null + + qdel(pr_int_temp_processor) + qdel(pr_inertial_movement) + qdel(pr_give_air) + qdel(pr_internal_damage) + qdel(spark_system) + pr_int_temp_processor = null + pr_give_air = null + pr_internal_damage = null + spark_system = null + mechas_list -= src //global mech list ..() - return //////////////////////// ////// Helpers ///////// @@ -452,7 +502,7 @@ if(src.health > 0) src.spark_system.start() else - src.destroy() + qdel(src) return /obj/mecha/attack_hand(mob/user as mob) @@ -555,52 +605,6 @@ Proj.on_hit(src) return -/obj/mecha/proc/destroy() - spawn() - go_out() - var/turf/T = get_turf(src) - tag = "\ref[src]" //better safe then sorry - if(loc) - loc.Exited(src) - loc = null - if(T) - if(istype(src, /obj/mecha/working/ripley/)) - var/obj/mecha/working/ripley/R = src - if(R.cargo) - for(var/obj/O in R.cargo) //Dump contents of stored cargo - O.loc = T - R.cargo -= O - T.Entered(O) - - if(prob(30)) - explosion(T, 0, 0, 1, 3) - spawn(0) - if(wreckage) - var/obj/effect/decal/mecha_wreckage/WR = new wreckage(T) - for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) - if(E.salvageable && prob(30)) - WR.crowbar_salvage += E - E.forceMove(WR) - E.equip_ready = 1 - E.reliability = round(rand(E.reliability/3,E.reliability)) - else - E.forceMove(T) - E.destroy() - if(cell) - WR.crowbar_salvage += cell - cell.forceMove(WR) - cell.charge = rand(0, cell.charge) - if(internal_tank) - WR.crowbar_salvage += internal_tank - internal_tank.forceMove(WR) - else - for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) - E.forceMove(T) - E.destroy() - spawn(0) - del(src) - return - /obj/mecha/ex_act(severity) src.log_message("Affected by explosion of severity: [severity].",1) if(prob(src.deflect_chance)) @@ -608,16 +612,16 @@ src.log_append_to_last("Armor saved, changing severity to [severity].") switch(severity) if(1.0) - src.destroy() + qdel(src) if(2.0) if (prob(30)) - src.destroy() + qdel(src) else src.take_damage(initial(src.health)/2) src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1) if(3.0) if (prob(5)) - src.destroy() + qdel(src) else src.take_damage(initial(src.health)/5) src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 5beb3c7244..574b6b8823 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -9,6 +9,16 @@ wreckage = /obj/effect/decal/mecha_wreckage/ripley cargo_capacity = 10 +/obj/mecha/working/ripley/Destroy() + for(var/atom/movable/A in src.cargo) + A.loc = loc + var/turf/T = loc + if(istype(T)) + T.Entered(A) + step_rand(A) + cargo.Cut() + ..() + /obj/mecha/working/ripley/firefighter desc = "Standart APLU chassis was refitted with additional thermal protection and cistern." name = "APLU \"Firefighter\""