This commit is contained in:
Tsurupeta
2023-08-05 20:46:13 +03:00
parent d4f3793f8f
commit d4ec25e748
180 changed files with 800 additions and 374 deletions

View File

@@ -30,46 +30,46 @@ GLOBAL_LIST_INIT(bitflags, list(
//FLAGS BITMASK
///This flag is what recursive_hear_check() uses to determine wether to add an item to the hearer list or not.
#define HEAR_1 (1<<3)
#define HEAR_1 (1<<0)
///Projectiles will use default chance-based ricochet handling on things with this.
#define DEFAULT_RICOCHET_1 (1<<4)
#define DEFAULT_RICOCHET_1 (1<<1)
///Conducts electricity (metal etc.).
#define CONDUCT_1 (1<<5)
#define CONDUCT_1 (1<<2)
///For machines and structures that should not break into parts, eg, holodeck stuff.
#define NODECONSTRUCT_1 (1<<7)
#define NODECONSTRUCT_1 (1<<3)
///Atom queued to SSoverlay.
#define OVERLAY_QUEUED_1 (1<<8)
#define OVERLAY_QUEUED_1 (1<<4)
///Item has priority to check when entering or leaving.
#define ON_BORDER_1 (1<<9)
#define ON_BORDER_1 (1<<5)
///Whether or not this atom shows screentips when hovered over
#define NO_SCREENTIPS_1 (1<<10)
#define NO_SCREENTIPS_1 (1<<6)
///Prevent clicking things below it on the same turf eg. doors/ fulltile windows.
#define PREVENT_CLICK_UNDER_1 (1<<11)
#define HOLOGRAM_1 (1<<12)
#define PREVENT_CLICK_UNDER_1 (1<<7)
#define HOLOGRAM_1 (1<<8)
///Prevents mobs from getting chainshocked by teslas and the supermatter.
#define SHOCKED_1 (1<<13)
#define SHOCKED_1 (1<<9)
///Whether /atom/Initialize() has already run for the object.
#define INITIALIZED_1 (1<<14)
#define INITIALIZED_1 (1<<10)
///was this spawned by an admin? used for stat tracking stuff.
#define ADMIN_SPAWNED_1 (1<<15)
#define ADMIN_SPAWNED_1 (1<<11)
/// should not get harmed if this gets caught by an explosion?
#define PREVENT_CONTENTS_EXPLOSION_1 (1<<16)
#define PREVENT_CONTENTS_EXPLOSION_1 (1<<12)
/// Early returns mob.face_atom()
#define BLOCK_FACE_ATOM_1 (1<<17)
#define BLOCK_FACE_ATOM_1 (1<<13)
//turf-only flags
#define NOJAUNT_1 (1<<0)
#define UNUSED_RESERVATION_TURF_1 (1<<1)
#define NOJAUNT_1 (1<<14)
#define UNUSED_RESERVATION_TURF_1 (1<<15)
/// If a turf can be made dirty at roundstart. This is also used in areas.
#define CAN_BE_DIRTY_1 (1<<2)
#define CAN_BE_DIRTY_1 (1<<16)
/// Blocks lava rivers being generated on the turf
#define NO_LAVA_GEN_1 (1<<6)
#define NO_LAVA_GEN_1 (1<<17)
/// Blocks ruins spawning on the turf
#define NO_RUINS_1 (1<<10)
#define NO_RUINS_1 (1<<18)
/// Should this tile be cleaned up and reinserted into an excited group?
#define EXCITED_CLEANUP_1 (1 << 13)
#define EXCITED_CLEANUP_1 (1 << 19)
/// Whether or not this atom has contextual screentips when hovered OVER
#define HAS_CONTEXTUAL_SCREENTIPS_1 (1 << 14)
#define HAS_CONTEXTUAL_SCREENTIPS_1 (1 << 20)
////////////////Area flags\\\\\\\\\\\\\\
/// If it's a valid territory for cult summoning or the CRAB-17 phone to spawn

View File

@@ -78,7 +78,7 @@
#define COOLDOWN_DECLARE(cd_index) var/##cd_index = 0
#define COOLDOWN_START(cd_source, cd_index, cd_time) (cd_source.cd_index = world.time + cd_time)
#define COOLDOWN_START(cd_source, cd_index, cd_time) (cd_source.cd_index = world.time + (cd_time))
//Returns true if the cooldown has run its course, false otherwise
#define COOLDOWN_FINISHED(cd_source, cd_index) (cd_source.cd_index < world.time)

View File

@@ -40,6 +40,6 @@
#define GC_DEL_QUEUE 10 SECONDS
#define QDELING(X) (X.gc_destroyed)
#define QDELETED(X) (!X || QDELING(X))
#define QDELETED(X) (isnull(X) || QDELING(X))
#define QDESTROYING(X) (!X || X.gc_destroyed == GC_CURRENTLY_BEING_QDELETED)

View File

@@ -87,6 +87,9 @@
///Call qdel on the atom after intialization
#define INITIALIZE_HINT_QDEL 2
//Call qdel with a force of TRUE after initialization
#define INITIALIZE_HINT_QDEL_FORCE 3
///type and all subtypes should always immediately call Initialize in New()
#define INITIALIZE_IMMEDIATE(X) ##X/New(loc, ...){\
..();\

View File

@@ -185,7 +185,8 @@
while (world.time + resume_time < endtime)
stoplag(1)
if (progress)
progbar.update(world.time - starttime + resume_time)
if(!QDELETED(progbar))
progbar.update(world.time - starttime + resume_time)
if(QDELETED(user) || QDELETED(target))
. = 0
break
@@ -264,7 +265,8 @@
while (world.time + resume_time < endtime)
stoplag(1)
if (progress)
progbar.update(world.time - starttime + resume_time)
if(!QDELETED(progbar))
progbar.update(world.time - starttime + resume_time)
if(drifting && !user.inertia_dir)
drifting = 0
@@ -339,7 +341,8 @@
while(world.time < endtime)
stoplag(1)
if(progress)
progbar.update(world.time - starttime)
if(!QDELETED(progbar))
progbar.update(world.time - starttime)
if(QDELETED(user) || !targets)
. = 0
break

View File

@@ -89,6 +89,7 @@
#define REFERENCE_TRACKING
#define REFERENCE_TRACKING_DEBUG
#define FIND_REF_NO_CHECK_TICK
// #define GC_FAILURE_HARD_LOOKUP // Uncomment this to have harddel reftracking in unit tests (takes 3-5min to run per single harddel)
#endif
#ifdef TGS

View File

@@ -55,14 +55,15 @@
animate(src, alpha = 255, time = CREDIT_EASE_DURATION, flags = ANIMATION_PARALLEL)
addtimer(CALLBACK(src, .proc/FadeOut), CREDIT_ROLL_SPEED - CREDIT_EASE_DURATION)
QDEL_IN(src, CREDIT_ROLL_SPEED)
P.screen += src
if(parent)
parent.screen += src
/atom/movable/screen/credit/Destroy()
var/client/P = parent
P.screen -= src
icon = null
LAZYREMOVE(P.credits, src)
parent = null
if(parent)
parent.screen -= src
LAZYREMOVE(parent.credits, src)
parent = null
return ..()
/atom/movable/screen/credit/proc/FadeOut()

View File

@@ -9,6 +9,17 @@ GLOBAL_LIST_EMPTY(radial_menus)
plane = ABOVE_HUD_PLANE
var/datum/radial_menu/parent
/atom/movable/screen/radial/proc/set_parent(new_value)
if(parent)
UnregisterSignal(parent, COMSIG_PARENT_QDELETING)
parent = new_value
if(parent)
RegisterSignal(parent, COMSIG_PARENT_QDELETING, .proc/handle_parent_del)
/atom/movable/screen/radial/proc/handle_parent_del()
SIGNAL_HANDLER
set_parent(null)
/atom/movable/screen/radial/slice
icon_state = "radial_slice"
var/choice
@@ -124,7 +135,7 @@ GLOBAL_LIST_EMPTY(radial_menus)
for(var/i in 1 to elements_to_add) //Create all elements
var/atom/movable/screen/radial/slice/new_element = new /atom/movable/screen/radial/slice
new_element.tooltips = use_tooltips
new_element.parent = src
new_element.set_parent(src)
elements += new_element
var/page = 1
@@ -210,7 +221,7 @@ GLOBAL_LIST_EMPTY(radial_menus)
/datum/radial_menu/New()
close_button = new
close_button.parent = src
close_button.set_parent(src)
/datum/radial_menu/proc/Reset()
choices.Cut()

View File

@@ -302,8 +302,9 @@
icon_state = "lamp_off"
/atom/movable/screen/robot/lamp/Destroy()
robot.lampButton = null
robot = null
if(robot)
robot.lampButton = null
robot = null
return ..()
/atom/movable/screen/robot/alerts
@@ -343,8 +344,9 @@
var/mob/living/silicon/robot/robot
/atom/movable/screen/robot/modPC/Destroy()
robot.interfaceButton = null
robot = null
if(robot)
robot.interfaceButton = null
robot = null
return ..()
/atom/movable/screen/robot/modPC/Click()

View File

@@ -97,6 +97,9 @@ SUBSYSTEM_DEF(atoms)
if(INITIALIZE_HINT_QDEL)
qdel(A)
qdeleted = TRUE
if(INITIALIZE_HINT_QDEL_FORCE)
qdel(A, force = TRUE)
qdeleted = TRUE
else
BadInitializeCalls[the_type] |= BAD_INIT_NO_HINT

View File

@@ -74,6 +74,8 @@ SUBSYSTEM_DEF(jukeboxes)
activejukeboxes[IDtoupdate][JUKE_FALLOFF] = jukefalloff
/datum/controller/subsystem/jukeboxes/proc/removejukebox(IDtoremove)
if(!IDtoremove)
return
if(islist(activejukeboxes[IDtoremove]))
var/jukechannel = activejukeboxes[IDtoremove][JUKE_CHANNEL]
for(var/mob/M in GLOB.player_list)

View File

@@ -335,7 +335,7 @@ SUBSYSTEM_DEF(persistence)
if(!istype(ending_human) || !ending_human.mind || !ending_human.client || !ending_human.client.prefs || !ending_human.client.prefs.persistent_scars)
continue
var/mob/living/carbon/human/original_human = ending_human.mind.original_character
var/mob/living/carbon/human/original_human = ending_human.mind.original_character.resolve()
if(!original_human || original_human.stat == DEAD || !original_human.all_scars || !(original_human == ending_human))
if(ending_human.client) // i was told if i don't check this every step of the way byond might decide a client ceases to exist mid proc so here we go
ending_human.client.prefs.scars_list["[ending_human.client.prefs.scars_index]"] = ""
@@ -356,7 +356,7 @@ SUBSYSTEM_DEF(persistence)
if(!istype(ending_human) || !ending_human.mind || !ending_human.client || !ending_human.client.prefs || !ending_human.client.prefs.tcg_cards)
continue
var/mob/living/carbon/human/original_human = ending_human.mind.original_character
var/mob/living/carbon/human/original_human = ending_human.mind.original_character.resolve()
if(!original_human || original_human.stat == DEAD || !(original_human == ending_human))
continue

View File

@@ -648,6 +648,7 @@
/datum/action/spell_action/Destroy()
var/obj/effect/proc_holder/S = target
S.action = null
target = null
return ..()
/datum/action/spell_action/Trigger()

View File

@@ -87,6 +87,8 @@
to_chat(src, "<span class='notice'>You cannot directly influence the world around you, but you can see what [owner] cannot.</span>")
/mob/camera/imaginary_friend/Initialize(mapload, _trauma)
if(!_trauma)
return INITIALIZE_HINT_QDEL
. = ..()
trauma = _trauma
@@ -129,7 +131,7 @@
client.images |= current_image
/mob/camera/imaginary_friend/Destroy()
if(owner.client)
if(owner?.client)
owner.client.images.Remove(human_image)
if(client)
client.images.Remove(human_image)

View File

@@ -43,6 +43,7 @@
hud.show_hud(hud.hud_version)
/datum/component/mood/Destroy()
QDEL_LIST_ASSOC_VAL(mood_events)
STOP_PROCESSING(SSobj, src)
unmodify_hud()
return ..()

View File

@@ -266,7 +266,7 @@
var/w_bonus = wound_info_by_part[hit_part][CLOUD_POSITION_W_BONUS]
var/bw_bonus = wound_info_by_part[hit_part][CLOUD_POSITION_BW_BONUS]
var/wound_type = (initial(P.damage_type) == BRUTE) ? WOUND_BLUNT : WOUND_BURN // sharpness is handled in the wound rolling
wound_info_by_part[hit_part] = null
wound_info_by_part -= hit_part
hit_part.painless_wound_roll(wound_type, damage_dealt, w_bonus, bw_bonus, initial(P.sharpness))
if(num_hits > 1)

View File

@@ -111,7 +111,7 @@
if(AM.movement_type & (FLYING|FLOATING) || !AM.has_gravity())
return
var/atom/current_parent = parent
if(isturf(current_parent.loc))
if(isturf(current_parent?.loc))
if(do_play_squeak())
SEND_SIGNAL(AM, COMSIG_CROSS_SQUEAKED)

View File

@@ -49,7 +49,7 @@
var/mob/living/carbon/P = parent
to_chat(P, "<span class='notice'>You can no longer tackle.</span>")
P.tackling = FALSE
..()
return ..()
/datum/component/tackler/RegisterWithParent()
RegisterSignal(parent, COMSIG_MOB_CLICKON, .proc/checkTackle)

View File

@@ -19,6 +19,10 @@
dashing_item = dasher
holder = user
/datum/action/innate/dash/Destroy()
dashing_item = null
return ..()
/datum/action/innate/dash/IsAvailable(silent = FALSE)
if(current_charges > 0)
return TRUE

View File

@@ -31,6 +31,8 @@
/datum/element/dwarfism/Detach(mob/living/L)
. = ..()
attached_targets -= L
UnregisterSignal(L, comsig)
if(QDELETED(L))
return
if(L.lying != 0)
@@ -39,8 +41,6 @@
else
L.transform = L.transform.Scale(1, TALL)
L.transform = L.transform.Translate(0, 16*(TALL-1)) //Makes sure you stand on the tile no matter the size - sand
UnregisterSignal(L, comsig)
attached_targets -= L
#undef SHORT
#undef TALL

View File

@@ -24,6 +24,7 @@
UnregisterSignal(target, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_MOB_SPELL_CAN_CAST))
if(users_by_item[target])
var/mob/user = users_by_item[target]
users_by_item -= target
stacked_spellcasting_by_user[user]--
if(!stacked_spellcasting_by_user[user])
stacked_spellcasting_by_user -= user

View File

@@ -205,8 +205,8 @@ GLOBAL_LIST_EMPTY(explosions)
//lists are guaranteed to contain at least 1 turf at this point
var/iteration = 0
var/affTurfLen = affected_turfs.len
var/expBlockLen = cached_exp_block.len
var/affTurfLen = length(affected_turfs)
var/expBlockLen = length(cached_exp_block)
for(var/TI in affected_turfs)
var/turf/T = TI
++iteration
@@ -282,8 +282,8 @@ GLOBAL_LIST_EMPTY(explosions)
break
//update the trackers
affTurfLen = affected_turfs.len
expBlockLen = cached_exp_block.len
affTurfLen = length(affected_turfs)
expBlockLen = length(cached_exp_block)
if(break_condition)
if(reactionary)
@@ -299,8 +299,8 @@ GLOBAL_LIST_EMPTY(explosions)
break
//update the trackers
affTurfLen = affected_turfs.len
expBlockLen = cached_exp_block.len
affTurfLen = length(affected_turfs)
expBlockLen = length(cached_exp_block)
var/circumference = (PI * (init_dist + 4) * 2) //+4 to radius to prevent shit gaps
if(exploded_this_tick.len > circumference) //only do this every revolution
@@ -357,7 +357,7 @@ GLOBAL_LIST_EMPTY(explosions)
var/processed = 0
while(running)
var/I
for(I in (processed + 1) to affected_turfs.len) // we cache the explosion block rating of every turf in the explosion area
for(I in (processed + 1) to length(affected_turfs)) // we cache the explosion block rating of every turf in the explosion area
var/turf/T = affected_turfs[I]
var/current_exp_block = T.density ? T.explosion_block : 0

View File

@@ -80,8 +80,8 @@
var/list/ambitions
//ambition end
///What character we spawned in as- either at roundstart or latejoin, so we know for persistent scars if we ended as the same person or not
var/mob/original_character
///Weakref to the character we spawned in as- either at roundstart or latejoin, so we know for persistent scars if we ended as the same person or not
var/datum/weakref/original_character
/// A lazy list of statuses to add next to this mind in the traitor panel
var/list/special_statuses
@@ -101,8 +101,26 @@
qdel(i)
antag_datums = null
QDEL_NULL(skill_holder)
set_current(null)
soulOwner = null
return ..()
/datum/mind/proc/set_current(mob/new_current)
if(new_current && QDELETED(new_current))
CRASH("Tried to set a mind's current var to a qdeleted mob, what the fuck")
if(current)
UnregisterSignal(src, COMSIG_PARENT_QDELETING)
current = new_current
if(current)
RegisterSignal(src, COMSIG_PARENT_QDELETING, PROC_REF(clear_current))
/datum/mind/proc/clear_current(datum/source)
SIGNAL_HANDLER
set_current(null)
/datum/mind/proc/set_original_character(new_original_character)
original_character = WEAKREF(new_original_character)
/datum/mind/proc/get_language_holder()
if(!language_holder)
language_holder = new (src)
@@ -125,13 +143,13 @@
key = new_character.key
if(new_character.mind) //disassociate any mind currently in our new body's mind variable
new_character.mind.current = null
new_character.mind.set_current(null)
var/datum/atom_hud/antag/hud_to_transfer = antag_hud//we need this because leave_hud() will clear this list
var/mob/living/old_current = current
if(current)
current.transfer_observers_to(new_character) //transfer anyone observing the old character to the new one
current = new_character //associate ourself with our new body
set_current(new_character) //associate ourself with our new body
new_character.mind = src //and associate our new body with ourself
for(var/a in antag_datums) //Makes sure all antag datums effects are applied in the new body
var/datum/antagonist/A = a
@@ -1704,7 +1722,7 @@ GLOBAL_LIST(objective_choices)
SEND_SIGNAL(src, COMSIG_MOB_ON_NEW_MIND)
if(!mind.name)
mind.name = real_name
mind.current = src
mind.set_current(src)
mind.hide_ckey = client?.prefs?.hide_ckey
/mob/living/carbon/mind_initialize()

View File

@@ -11,6 +11,7 @@
/datum/mood_event/Destroy()
remove_effects()
owner = null
return ..()
/datum/mood_event/proc/add_effects(param)

View File

@@ -15,7 +15,7 @@
icon_state = "walkietalkie"
/obj/item/implant/radio/antenna/Initialize(mapload)
..()
. = ..()
if (radio)
radio.name = "internal antenna"

View File

@@ -245,7 +245,7 @@
AA.remove_from_hud(src)
if(reagents)
qdel(reagents)
QDEL_NULL(reagents)
orbiters = null // The component is attached to us normaly and will be deleted elsewhere

View File

@@ -175,6 +175,8 @@ Class Procs:
for(var/atom/A in component_parts)
qdel(A)
component_parts.Cut()
if(circuit)
QDEL_NULL(circuit)
return ..()
/obj/machinery/proc/locate_machinery()
@@ -454,6 +456,7 @@ Class Procs:
for(var/obj/item/I in component_parts)
I.forceMove(loc)
LAZYCLEARLIST(component_parts)
circuit = null
qdel(src)
/obj/machinery/proc/spawn_frame(disassembled)

View File

@@ -440,7 +440,8 @@ GLOBAL_LIST_EMPTY(cryopod_computers)
else
if(ishuman(mob_occupant))
var/mob/living/carbon/human/H = mob_occupant
if(H.mind && H.client && H.client.prefs && H == H.mind.original_character)
var/mob/living/carbon/human/H_original_caharcter = H.mind.original_character.resolve()
if(H.mind && H.client && H.client.prefs && H == H_original_caharcter)
H.SaveTCGCards()
var/list/gear = list()

View File

@@ -39,9 +39,10 @@
MA.plane = 0
holder.appearance = MA
update_indicator()
/obj/machinery/launchpad/Destroy()
qdel(hud_list[DIAG_LAUNCHPAD_HUD])
for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
diag_hud.remove_from_hud(src)
return ..()
/obj/machinery/launchpad/examine(mob/user)
@@ -229,7 +230,9 @@
src.briefcase = briefcase
/obj/machinery/launchpad/briefcase/Destroy()
QDEL_NULL(briefcase)
if(!QDELETED(briefcase))
qdel(briefcase)
briefcase = null
return ..()
/obj/machinery/launchpad/briefcase/isAvailable(silent = FALSE)
@@ -271,7 +274,8 @@
/obj/item/storage/briefcase/launchpad/Destroy()
if(!QDELETED(pad))
QDEL_NULL(pad)
qdel(pad)
pad = null
return ..()
/obj/item/storage/briefcase/launchpad/PopulateContents()

View File

@@ -26,20 +26,13 @@
set_codes()
glob_lists_register(init=TRUE)
var/turf/T = loc
hide(T.intact)
if(codes["patrol"])
if(!GLOB.navbeacons["[z]"])
GLOB.navbeacons["[z]"] = list()
GLOB.navbeacons["[z]"] += src //Register with the patrol list!
if(codes["delivery"])
GLOB.deliverybeacons += src
GLOB.deliverybeacontags += location
/obj/machinery/navbeacon/Destroy()
if (GLOB.navbeacons["[z]"])
GLOB.navbeacons["[z]"] -= src //Remove from beacon list, if in one.
GLOB.deliverybeacons -= src
glob_lists_deregister()
return ..()
/obj/machinery/navbeacon/onTransitZ(old_z, new_z)
@@ -67,6 +60,26 @@
else
codes[e] = "1"
/obj/machinery/navbeacon/proc/glob_lists_deregister()
if (GLOB.navbeacons["[z]"])
GLOB.navbeacons["[z]"] -= src //Remove from beacon list, if in one.
GLOB.deliverybeacons -= src
GLOB.deliverybeacontags -= location
///Registers the navbeacon to the global beacon lists
/obj/machinery/navbeacon/proc/glob_lists_register(init=FALSE)
if(!init)
glob_lists_deregister()
if(!codes)
return
if(codes["patrol"])
if(!GLOB.navbeacons["[z]"])
GLOB.navbeacons["[z]"] = list()
GLOB.navbeacons["[z]"] += src //Register with the patrol list!
if(codes["delivery"])
GLOB.deliverybeacons += src
GLOB.deliverybeacontags += location
// called when turf state changes
// hide the object if turf is intact

View File

@@ -232,6 +232,7 @@
QDEL_NULL(shoes)
QDEL_NULL(mod)
QDEL_NULL(storage)
QDEL_NULL(wires)
return ..()
/obj/machinery/suit_storage_unit/update_overlays()

View File

@@ -97,7 +97,7 @@ GLOBAL_LIST_EMPTY(telecomms_list)
/obj/machinery/telecomms/proc/add_link(obj/machinery/telecomms/T)
var/turf/position = get_turf(src)
var/turf/T_position = get_turf(T)
if((position.z == T_position.z) || (long_range_link && T.long_range_link))
if((position?.z == T_position?.z) || (long_range_link && T.long_range_link))
if(src != T)
for(var/x in autolinkers)
if(x in T.autolinkers)

View File

@@ -57,7 +57,7 @@
/obj/effect/anomaly/Destroy()
GLOB.poi_list.Remove(src)
STOP_PROCESSING(SSobj, src)
qdel(countdown)
QDEL_NULL(countdown)
if(aSignal)
QDEL_NULL(aSignal)
return ..()

View File

@@ -81,4 +81,4 @@ GLOBAL_LIST(gang_tags)
/obj/effect/decal/cleanable/crayon/gang/Destroy()
LAZYREMOVE(GLOB.gang_tags, src)
..()
return ..()

View File

@@ -43,12 +43,12 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark)
qdel(src)
/obj/effect/landmark/start/Initialize(mapload)
. = ..()
GLOB.start_landmarks_list += src
if(jobspawn_override)
if(!GLOB.jobspawn_overrides[name])
GLOB.jobspawn_overrides[name] = list()
GLOB.jobspawn_overrides[name] += src
..()
if(name != "start")
tag = "start*[name]"

View File

@@ -209,6 +209,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
LAZYADD(used_skills[path], S.skill_traits)
/obj/item/Destroy()
master = null
item_flags &= ~DROPDEL //prevent reqdels
if(ismob(loc))
var/mob/m = loc

View File

@@ -783,6 +783,7 @@
/obj/item/card/id/departmental_budget/Destroy()
SSeconomy.dep_cards -= src
registered_account.bank_cards -= src
return ..()
/obj/item/card/id/departmental_budget/update_label()

View File

@@ -130,6 +130,11 @@
if(istype(C))
gun = C.gun
/obj/item/projectile/energy/chrono_beam/Destroy()
gun = null
return ..()
/obj/item/projectile/energy/chrono_beam/on_hit(atom/target)
if(target && gun && isliving(target))
var/obj/effect/chrono_field/F = new(target.loc, target, gun)
@@ -148,7 +153,9 @@
gun = loc
. = ..()
/obj/item/ammo_casing/energy/chrono_beam/Destroy()
gun = null
return ..()

View File

@@ -81,6 +81,14 @@
addtimer(CALLBACK(src, .proc/startUp), 50)
QDEL_IN(src, 8 MINUTES) //Self destruct after 8 min
/obj/structure/checkoutmachine/Destroy()
bogdanoff = null
stop_dumping()
STOP_PROCESSING(SSfastprocess, src)
priority_announce("The credit deposit machine at [get_area(src)] has been destroyed. Station funds have stopped draining!", sender_override = "CRAB-17 Protocol")
explosion(src, 0,0,1, flame_range = 2)
return ..()
/obj/structure/checkoutmachine/proc/startUp() //very VERY snowflake code that adds a neat animation when the pod lands.
start_dumping() //The machine doesnt move during this time, giving people close by a small window to grab their funds before it starts running around
@@ -145,13 +153,6 @@
canwalk = TRUE
START_PROCESSING(SSfastprocess, src)
/obj/structure/checkoutmachine/Destroy()
stop_dumping()
STOP_PROCESSING(SSfastprocess, src)
priority_announce("The credit deposit machine at [get_area(src)] has been destroyed. Station funds have stopped draining!", sender_override = "CRAB-17 Protocol")
explosion(src, 0,0,1, flame_range = 2)
return ..()
/obj/structure/checkoutmachine/proc/start_dumping()
accounts_to_rob = SSeconomy.bank_accounts.Copy()
accounts_to_rob -= bogdanoff.get_bank_account()
@@ -220,7 +221,10 @@
playsound(src, 'sound/weapons/mortar_whistle.ogg', 70, TRUE, 6)
addtimer(CALLBACK(src, .proc/endLaunch), 5, TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation
/obj/effect/dumpeetTarget/Destroy()
dump = null
bogdanoff = null
return ..()
/obj/effect/dumpeetTarget/proc/endLaunch()
QDEL_NULL(DF) //Delete the falling machine effect, because at this point its animation is over. We dont use temp_visual because we want to manually delete it as soon as the pod appears

View File

@@ -175,5 +175,7 @@
return
/obj/effect/dummy/chameleon/Destroy()
master.disrupt(0)
if(master)
master.disrupt(0)
master = null
return ..()

View File

@@ -98,8 +98,9 @@
/obj/structure/projected_forcefield/Destroy()
visible_message("<span class='warning'>[src] flickers and disappears!</span>")
playsound(src,'sound/weapons/resonator_blast.ogg',25,1)
generator.current_fields -= src
generator = null
if(generator)
generator.current_fields -= src
generator = null
return ..()
/obj/structure/projected_forcefield/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
@@ -108,4 +109,5 @@
/obj/structure/projected_forcefield/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
if(sound_effect)
play_attack_sound(damage_amount, damage_type, damage_flag)
generator.shield_integrity = max(generator.shield_integrity - damage_amount, 0)
if(generator)
generator.shield_integrity = max(generator.shield_integrity - damage_amount, 0)

View File

@@ -270,10 +270,6 @@ GLOBAL_LIST_INIT(channel_tokens, list(
name = "\proper mini Integrated Subspace Transceiver "
subspace_transmission = FALSE
/obj/item/radio/headset/silicon/pai/ComponentInitialize()
. = ..()
AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES)
/obj/item/radio/headset/silicon/pai/emp_act(severity)
. = ..()
return EMP_PROTECT_SELF

View File

@@ -19,6 +19,23 @@
/obj/item/transfer_valve/IsAssemblyHolder()
return TRUE
/obj/item/transfer_valve/Destroy()
attached_device = null
QDEL_NULL(tank_one)
QDEL_NULL(tank_two)
return ..()
/obj/item/transfer_valve/handle_atom_del(atom/deleted_atom)
. = ..()
if(deleted_atom == tank_one)
tank_one = null
update_appearance()
return
if(deleted_atom == 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))
if(tank_one && tank_two)

View File

@@ -70,7 +70,8 @@
/////////////////////////////////
/obj/effect/payload_spawner/Initialize(mapload, type, numspawned)
..()
spawn_payload(type, numspawned)
if(type && isnum(numspawned))
spawn_payload(type, numspawned)
return INITIALIZE_HINT_QDEL
/obj/effect/payload_spawner/proc/spawn_payload(type, numspawned)

View File

@@ -33,7 +33,7 @@
qdel(nadeassembly)
nadeassembly = null
target = null
..()
return ..()
/obj/item/grenade/plastic/attackby(obj/item/I, mob/user, params)
if(!nadeassembly && istype(I, /obj/item/assembly_holder))

View File

@@ -332,6 +332,10 @@
spark_system.set_up(5, 0, src)
spark_system.attach(src)
/obj/item/melee/transforming/energy/blade/Destroy()
QDEL_NULL(spark_system)
. = ..()
/obj/item/melee/transforming/energy/blade/transform_weapon(mob/living/user, supress_message_text)
return

View File

@@ -467,7 +467,7 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
can_random_spawn = FALSE
/obj/item/toy/plush/random/Initialize(mapload)
..()
. = ..()
var/newtype
var/list/snowflake_list = CONFIG_GET(keyed_list/snowflake_plushies)

View File

@@ -294,19 +294,13 @@
name = "Crusader's Armour Set" //i can't into ck2 references
desc = "This armour is said to be based on the armor of kings on another world thousands of years ago, who tended to assassinate, conspire, and plot against everyone who tried to do the same to them. Some things never change."
/obj/item/storage/box/itemset/crusader/blue/New()
..()
contents = list()
sleep(1)
/obj/item/storage/box/itemset/crusader/blue/PopulateContents()
new /obj/item/clothing/suit/armor/plate/crusader/blue(src)
new /obj/item/clothing/head/helmet/plate/crusader/blue(src)
new /obj/item/clothing/gloves/plate/blue(src)
new /obj/item/clothing/shoes/plate/blue(src)
/obj/item/storage/box/itemset/crusader/red/New()
..()
contents = list()
sleep(1)
/obj/item/storage/box/itemset/crusader/red/PopulateContents()
new /obj/item/clothing/suit/armor/plate/crusader/red(src)
new /obj/item/clothing/head/helmet/plate/crusader/red(src)
new /obj/item/clothing/gloves/plate/red(src)

View File

@@ -16,7 +16,7 @@
AddComponent(component_type)
/obj/item/storage/AllowDrop()
return TRUE
return !QDELETED(src)
/obj/item/storage/contents_explosion(severity, target, origin)
var/in_storage = istype(loc, /obj/item/storage)? (max(0, severity - 1)) : (severity)

View File

@@ -633,7 +633,8 @@
STR.max_items = 8
/obj/item/storage/box/snappops/PopulateContents()
SEND_SIGNAL(src, COMSIG_TRY_STORAGE_FILL_TYPE, /obj/item/toy/snappop)
for(var/i in 1 to 8)
new /obj/item/toy/snappop(src)
/obj/item/storage/box/matches
name = "matchbox"
@@ -654,7 +655,8 @@
STR.can_hold = typecacheof(list(/obj/item/match))
/obj/item/storage/box/matches/PopulateContents()
SEND_SIGNAL(src, COMSIG_TRY_STORAGE_FILL_TYPE, /obj/item/match)
for(var/i in 1 to 10)
new /obj/item/match(src)
/obj/item/storage/box/matches/attackby(obj/item/match/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/match))

View File

@@ -23,6 +23,8 @@
var/fancy_open = FALSE
/obj/item/storage/fancy/PopulateContents()
if(!spawn_type)
return
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
for(var/i = 1 to STR.max_items)
new spawn_type(src)

View File

@@ -34,6 +34,10 @@
if(host_type)
host = new host_type(src, summon_count, range)
/obj/item/summon/Destroy()
QDEL_NULL(host)
return ..()
/obj/item/summon/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
if(!host)
@@ -329,7 +333,9 @@
if(del_no_host)
qdel(src)
return
HardReset(null)
if(animation_timerid)
deltimer(animation_timerid)
atom.transform = null
atom.moveToNullspace()
return
if(immediate)

View File

@@ -119,11 +119,17 @@
/obj/item/reagent_containers/spray/mister/Initialize(mapload)
. = ..()
QDEL_NULL(reagents)
tank = loc
if(!istype(tank))
return INITIALIZE_HINT_QDEL
reagents = tank.reagents //This mister is really just a proxy for the tank's reagents
/obj/item/reagent_containers/spray/mister/Destroy()
tank = null
reagents = null
return ..()
/obj/item/reagent_containers/spray/mister/attack_self()
return
@@ -221,12 +227,18 @@
/obj/item/extinguisher/mini/nozzle/Initialize(mapload)
. = ..()
QDEL_NULL(reagents)
tank = loc
if (!istype(tank))
return INITIALIZE_HINT_QDEL
reagents = tank.reagents
max_water = tank.volume
/obj/item/extinguisher/mini/nozzle/Destroy()
reagents = null //This is a borrowed reference from the tank.
tank = null
return ..()
/obj/item/extinguisher/mini/nozzle/doMove(atom/destination)
if(destination && (destination != tank.loc || !ismob(destination)))

View File

@@ -548,9 +548,10 @@
/obj/effect/decal/cleanable/ash/snappop_phoenix
var/respawn_time = 300
/obj/effect/decal/cleanable/ash/snappop_phoenix/New()
/obj/effect/decal/cleanable/ash/snappop_phoenix/Initialize(mapload)
. = ..()
addtimer(CALLBACK(src, .proc/respawn), respawn_time)
if(!QDELETED(src))
addtimer(CALLBACK(src, .proc/respawn), respawn_time)
/obj/effect/decal/cleanable/ash/snappop_phoenix/proc/respawn()
new /obj/item/toy/snappop/phoenix(get_turf(src))

View File

@@ -226,9 +226,9 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/claymore/highlander/robot/Initialize(mapload)
var/obj/item/robot_module/kiltkit = loc
robot = kiltkit.loc
. = ..()
if(!istype(robot))
qdel(src)
return ..()
return INITIALIZE_HINT_QDEL
/obj/item/claymore/highlander/robot/process()
loc.layer = LARGE_MOB_LAYER

View File

@@ -293,7 +293,7 @@ GLOBAL_LIST_INIT(double_bedsheets, list(/obj/item/bedsheet/double,
desc = "If you're reading this description ingame, something has gone wrong! Honk!"
/obj/item/bedsheet/random/Initialize(mapload)
..()
. = ..()
if(bedsheet_type == BEDSHEET_SINGLE)
var/type = pick(typesof(/obj/item/bedsheet) - (list(/obj/item/bedsheet/random, /obj/item/bedsheet/chameleon) + typesof(/obj/item/bedsheet/unlockable) + GLOB.double_bedsheets))
new type(loc)
@@ -454,7 +454,7 @@ GLOBAL_LIST_INIT(double_bedsheets, list(/obj/item/bedsheet/double,
bedsheet_type = BEDSHEET_DOUBLE
/obj/item/bedsheet/random/double/Initialize(mapload)
..()
. = ..()
if(bedsheet_type == BEDSHEET_DOUBLE)
var/type = pick(GLOB.double_bedsheets)
new type(loc)

View File

@@ -376,8 +376,9 @@
I = icon('icons/obj/stationobjs.dmi',"laserbox_broken")
if(showpiece)
var/icon/S = getFlatIcon(showpiece)
S.Scale(17,17)
I.Blend(S,ICON_UNDERLAY,8,12)
if(S)
S.Scale(17,17)
I.Blend(S,ICON_UNDERLAY,8,12)
src.icon = I
return

View File

@@ -433,7 +433,7 @@
/obj/effect/mob_spawn/human/hotel_staff/Destroy()
new/obj/structure/fluff/empty_sleeper/syndicate(get_turf(src))
..()
return ..()
/obj/effect/mob_spawn/human/hotel_staff/special(mob/living/carbon/human/new_spawn)
ADD_TRAIT(new_spawn,TRAIT_EXEMPT_HEALTH_EVENTS,GHOSTROLE_TRAIT)
@@ -457,6 +457,8 @@
/obj/effect/mob_spawn/human/demonic_friend/Initialize(mapload, datum/mind/owner_mind, obj/effect/proc_holder/spell/targeted/summon_friend/summoning_spell)
. = ..()
if(!owner_mind)
return
owner = owner_mind
flavour_text = "You have been given a reprieve from your eternity of torment, to be [owner.name]'s friend for [owner.p_their()] short mortal coil."
important_info = "Be aware that if you do not live up to [owner.name]'s expectations, they can send you back to hell with a single thought. [owner.name]'s death will also return you to hell."

View File

@@ -13,7 +13,7 @@
var/capacity = 4
/obj/structure/guncase/Initialize(mapload)
..()
. = ..()
if(mapload)
for(var/obj/item/I in loc.contents)
if(istype(I, gun_category))

View File

@@ -193,7 +193,7 @@
/obj/item/gun_control/Destroy()
turret = null
..()
return ..()
/obj/item/gun_control/CanItemAutoclick()
return TRUE

View File

@@ -121,7 +121,8 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
playsound(src, 'sound/effects/roll.ogg', 5, 1)
var/turf/T = get_step(src, dir)
connected.setDir(dir)
if(connected)
connected.setDir(dir)
for(var/atom/movable/AM in src)
AM.forceMove(T)
update_icon()

View File

@@ -169,6 +169,12 @@
. = ..()
time_between_triggers = 10
/obj/structure/trap/stun/hunter/Destroy()
if(!QDELETED(stored_item))
qdel(stored_item)
stored_item = null
return ..()
/obj/structure/trap/stun/hunter/Crossed(atom/movable/AM)
if(isliving(AM))
var/mob/living/L = AM
@@ -179,6 +185,11 @@
/obj/structure/trap/stun/hunter/flare()
..()
var/turf/our_turf = get_turf(src)
if(!our_turf)
return
if(!stored_item)
return
stored_item.forceMove(get_turf(src))
forceMove(stored_item)
if(caught)
@@ -208,6 +219,12 @@
stored_trap.name = name
stored_trap.stored_item = src
/obj/item/bountytrap/Destroy()
QDEL_NULL(stored_trap)
QDEL_NULL(radio)
QDEL_NULL(spark_system)
. = ..()
/obj/item/bountytrap/proc/announce_fugitive()
spark_system.start()
playsound(src, 'sound/machines/ding.ogg', 50, TRUE)
@@ -220,9 +237,3 @@
to_chat(user, "<span class=notice>You set up [src]. Examine while close to disarm it.</span>")
stored_trap.forceMove(T)//moves trap to ground
forceMove(stored_trap)//moves item into trap
/obj/item/bountytrap/Destroy()
qdel(stored_trap)
QDEL_NULL(radio)
QDEL_NULL(spark_system)
. = ..()

View File

@@ -72,7 +72,7 @@
/obj/structure/shuttle/engine/Destroy()
if(state == ENGINE_WELDED)
alter_engine_power(-engine_power)
. = ..()
return ..()
//Propagates the change to the shuttle.
/obj/structure/shuttle/engine/proc/alter_engine_power(mod)

View File

@@ -48,6 +48,7 @@
initial_gas_mix = AIRLESS_ATMOS
/turf/open/lava/Entered(atom/movable/AM)
. = ..()
if(burn_stuff(AM))
START_PROCESSING(SSobj, src)
@@ -126,7 +127,6 @@
///Proc that sets on fire something or everything on the turf that's not immune to lava. Returns TRUE to make the turf start processing.
/turf/open/lava/proc/burn_stuff(atom/movable/to_burn, delta_time = 1)
if(is_safe())
return FALSE

View File

@@ -168,6 +168,8 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr
/turf/open/openspace/icemoon/Initialize(mapload)
. = ..()
var/turf/T = below()
if(!T)
return
if(T.flags_1 & NO_RUINS_1 && protect_ruin)
ChangeTurf(replacement_turf, null, CHANGETURF_IGNORE_AIR)
return

View File

@@ -92,9 +92,11 @@
_y = min
var/turf/T = locate(_x, _y, _z)
AM.forceMove(T)
var/turf/throwturf = get_ranged_target_turf(T, dir, 1)
AM.safe_throw_at(throwturf, 1, 4, null, FALSE)
if(!QDELETED(AM))
AM.forceMove(T)
var/turf/throwturf = get_ranged_target_turf(T, dir, 1)
AM.safe_throw_at(throwturf, 1, 4, null, FALSE)
/turf/open/space/transit/CanBuildHere()

View File

@@ -9,6 +9,7 @@
complementary_color = "#AD6570"
blobbernaut_message = "synchronously strikes"
message = "The blobs strike you"
reagent = /datum/reagent/blob/synchronous_mesh
/datum/blobstrain/reagent/synchronous_mesh/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) //the cause isn't fire or bombs, so split the damage

View File

@@ -72,19 +72,23 @@ GLOBAL_LIST_EMPTY(blob_nodes)
forceMove(T)
/mob/camera/blob/proc/set_strain(datum/blobstrain/new_strain)
if (ispath(new_strain))
var/hadstrain = FALSE
if (istype(blobstrain))
blobstrain.on_lose()
qdel(blobstrain)
hadstrain = TRUE
blobstrain = new new_strain(src)
blobstrain.on_gain()
if (hadstrain)
to_chat(src, "Your strain is now: <b><font color=\"[blobstrain.color]\">[blobstrain.name]</b></font>!")
to_chat(src, "The <b><font color=\"[blobstrain.color]\">[blobstrain.name]</b></font> strain [blobstrain.description]")
if(blobstrain.effectdesc)
to_chat(src, "The <b><font color=\"[blobstrain.color]\">[blobstrain.name]</b></font> strain [blobstrain.effectdesc]")
if(!ispath(new_strain))
return FALSE
var/had_strain = FALSE
if(istype(blobstrain))
blobstrain.on_lose()
qdel(blobstrain)
had_strain = TRUE
blobstrain = new new_strain(src)
blobstrain.on_gain()
if(had_strain)
to_chat(src, "Your strain is now: <b><font color=\"[blobstrain.color]\">[blobstrain.name]</b></font>!")
to_chat(src, "The <b><font color=\"[blobstrain.color]\">[blobstrain.name]</b></font> strain [blobstrain.description]")
if(blobstrain.effectdesc)
to_chat(src, "The <b><font color=\"[blobstrain.color]\">[blobstrain.name]</b></font> strain [blobstrain.effectdesc]")
/mob/camera/blob/proc/is_valid_turf(turf/T)
var/area/A = get_area(T)

View File

@@ -40,6 +40,24 @@
if(!GLOB.ark_of_the_clockwork_justiciar)
GLOB.ark_of_the_clockwork_justiciar = src
/obj/structure/destructible/clockwork/massive/celestial_gateway/Destroy()
STOP_PROCESSING(SSprocessing, src)
if(!purpose_fulfilled)
var/area/gate_area = get_area(src)
hierophant_message("<span class='large_brass'><b>An Ark of the Clockwork Justicar has fallen at [gate_area.map_name]!</b></span>")
send_to_playing_players(sound(null, 0, channel = CHANNEL_JUSTICAR_ARK))
var/was_stranded = SSshuttle.emergency.mode == SHUTTLE_STRANDED
SSshuttle.clearHostileEnvironment(src)
if(!was_stranded && !purpose_fulfilled)
priority_announce("Massive energy anomaly no longer on short-range scanners, bluespace distortions still detected.","Central Command Higher Dimensional Affairs")
if(glow)
QDEL_NULL(glow)
if(countdown)
QDEL_NULL(countdown)
if(GLOB.ark_of_the_clockwork_justiciar == src)
GLOB.ark_of_the_clockwork_justiciar = null
. = ..()
/obj/structure/destructible/clockwork/massive/celestial_gateway/on_attack_hand(mob/user, act_intent, unarmed_attack_flags)
if(!active && is_servant_of_ratvar(user) && user.canUseTopic(src, !issilicon(user), NO_DEXTERY))
if(alert(user, "Are you sure you want to activate the ark? Once enabled, there will be no turning back.", "Enabling the ark", "Activate!", "Cancel") == "Activate!")
@@ -125,7 +143,7 @@
L.forceMove(pick(open_turfs))
glow = new(get_turf(src))
var/area/gate_area = get_area(src)
hierophant_message("<span class='large_brass'><b>An Ark of the Clockwork Justicar has been created in [gate_area.map_name]!</b></span>", FALSE, src)
hierophant_message("<span class='large_brass'><b>An Ark of the Clockwork Justicar has been created in [gate_area?.map_name]!</b></span>", FALSE, src)
/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/initiate_mass_recall()
recalling = TRUE
@@ -149,23 +167,7 @@
transform = matrix() * 2
animate(src, transform = matrix() * 0.5, time = 30, flags = ANIMATION_END_NOW)
/obj/structure/destructible/clockwork/massive/celestial_gateway/Destroy()
STOP_PROCESSING(SSprocessing, src)
if(!purpose_fulfilled)
var/area/gate_area = get_area(src)
hierophant_message("<span class='large_brass'><b>An Ark of the Clockwork Justicar has fallen at [gate_area.map_name]!</b></span>")
send_to_playing_players(sound(null, 0, channel = CHANNEL_JUSTICAR_ARK))
var/was_stranded = SSshuttle.emergency.mode == SHUTTLE_STRANDED
SSshuttle.clearHostileEnvironment(src)
if(!was_stranded && !purpose_fulfilled)
priority_announce("Massive energy anomaly no longer on short-range scanners, bluespace distortions still detected.","Central Command Higher Dimensional Affairs")
if(glow)
qdel(glow)
glow = null
if(countdown)
qdel(countdown)
countdown = null
. = ..()
/obj/structure/destructible/clockwork/massive/celestial_gateway/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1))

View File

@@ -357,9 +357,10 @@
/obj/item/melee/blood_magic/Initialize(mapload, spell)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
source = spell
uses = source.charges
health_cost = source.health_cost
if(spell)
source = spell
uses = source.charges
health_cost = source.health_cost
/obj/item/melee/blood_magic/Destroy()
@@ -374,7 +375,7 @@
source.desc = source.base_desc
source.desc += "<br><b><u>Has [uses] use\s remaining</u></b>."
source.UpdateButtonIcon()
..()
return ..()
/obj/item/melee/blood_magic/attack_self(mob/living/user)
afterattack(user, user, TRUE)

View File

@@ -137,6 +137,11 @@
jaunt = new(src)
linked_action = new(src)
/obj/item/cult_bastard/Destroy()
QDEL_NULL(jaunt)
QDEL_NULL(linked_action)
. = ..()
/obj/item/cult_bastard/ComponentInitialize()
. = ..()
AddComponent(/datum/component/butchering, 50, 80)
@@ -740,7 +745,7 @@
/obj/item/cult_spear/Destroy()
if(spear_act)
qdel(spear_act)
..()
return ..()
/obj/item/cult_spear/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
var/turf/T = get_turf(hit_atom)

View File

@@ -45,7 +45,7 @@
of intentionally harming a fellow devil.</B>"
/mob/living/simple_animal/imp/Initialize(mapload)
..()
. = ..()
boost = world.time + 30
/mob/living/simple_animal/imp/BiologicalLife(delta_time, times_fired)

View File

@@ -29,7 +29,7 @@
create_bodyparts() //initialize bodyparts
create_internal_organs()
grant_all_languages()
..()
. = ..()
/mob/living/carbon/true_devil/create_internal_organs()
internal_organs += new /obj/item/organ/brain

View File

@@ -314,6 +314,10 @@
. = ..()
linked_action = new(src)
/obj/item/melee/rune_knife/Destroy()
QDEL_NULL(linked_action)
. = ..()
/obj/item/melee/rune_knife/pickup(mob/user)
. = ..()
linked_action.Grant(user, src)

View File

@@ -453,7 +453,7 @@
/obj/item/ectoplasm/revenant/Destroy()
if(!QDELETED(revenant))
qdel(revenant)
..()
return ..()
/proc/RevenantThrow(over, mob/user, obj/item/throwable)
var/mob/living/simple_animal/revenant/spooker = user

View File

@@ -71,7 +71,7 @@
var/datum/action/cooldown/slam
/mob/living/simple_animal/slaughter/Initialize(mapload)
..()
. = ..()
var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new
AddSpell(bloodspell)
slam = new /datum/action/cooldown/slam

View File

@@ -194,9 +194,11 @@
return 0
/obj/item/IntegrateAmount() //returns the amount of resources gained when eating this item
. = ..()
if(!custom_materials)
return
if(custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)] || custom_materials[SSmaterials.GetMaterialRef(/datum/material/glass)])
return 1
return ..()
/obj/item/gun/swarmer_act()//Stops you from eating the entire armory
return FALSE

View File

@@ -88,7 +88,10 @@
if(T.taur_mode & S.accepted_taurs) //looks out of place on those.
lowershape = "taur, [lowershape]"
desc = "You see [aroused_state ? "an erect" : "a flaccid"] [lowershape] [name]. You estimate it's about [round(length*get_size(owner), 0.25)] inch[round(length*get_size(owner), 0.25) != 1 ? "es" : ""] long and [round(diameter*get_size(owner), 0.25)] inch[round(diameter*get_size(owner), 0.25) != 1 ? "es" : ""] in diameter."
var/adjusted_length = round(length * (owner ? get_size(owner) : 1), 0.25)
var/adjusted_diameter = round(diameter * (owner ? get_size(owner) : 1), 0.25)
desc = "You see [aroused_state ? "an erect" : "a flaccid"] [lowershape] [name]. You estimate it's about [adjusted_length] inch[adjusted_length != 1 ? "es" : ""] long and [adjusted_diameter] inch[adjusted_diameter != 1 ? "es" : ""] in diameter."
/obj/item/organ/genital/penis/get_features(mob/living/carbon/human/H)
var/datum/dna/D = H.dna

View File

@@ -234,6 +234,10 @@
var/obj/item/organ/cyberimp/arm/flash/I = null
var/active_light_strength = 7
/obj/item/assembly/flash/armimplant/Destroy()
I = null
return ..()
/obj/item/assembly/flash/armimplant/burn_out()
if(I && I.owner)
to_chat(I.owner, "<span class='warning'>Your photon projector implant overheats and deactivates!</span>")

View File

@@ -173,7 +173,7 @@
/obj/machinery/capture_the_flag/Destroy()
GLOB.poi_list.Remove(src)
..()
return ..()
/obj/machinery/capture_the_flag/process(delta_time)
for(var/i in spawned_mobs)
@@ -642,7 +642,7 @@
invisibility = 0
/obj/effect/ctf/ammo/Initialize(mapload)
..()
. = ..()
QDEL_IN(src, AMMO_DROP_LIFETIME)
/obj/effect/ctf/ammo/Crossed(atom/movable/AM)
@@ -681,6 +681,11 @@
for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines)
CTF.dead_barricades += src
/obj/effect/ctf/dead_barricade/Destroy(force)
for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines)
CTF.dead_barricades -= src
return ..()
/obj/effect/ctf/dead_barricade/proc/respawn()
if(!QDELETED(src))
new /obj/structure/barricade/security/ctf(get_turf(src))

View File

@@ -44,7 +44,7 @@
var/active = 1
/obj/structure/firepit/Initialize(mapload)
..()
. = ..()
toggleFirepit()
/obj/structure/firepit/interact(mob/living/user)

View File

@@ -3,6 +3,9 @@
var/client/cl
/obj/effect/buildmode_line/New(client/C, atom/atom_a, atom/atom_b, linename)
if(!C || !atom_a || !atom_b)
stack_trace("Buildmode effect created with odd inputs")
return
name = linename
loc = get_turf(atom_a)
I = image('icons/misc/mark.dmi', src, "line", 19.0)

View File

@@ -28,6 +28,9 @@
var/obj/structure/closet/supplypod/centcompod/linked_pod
/mob/living/simple_animal/pet/gondola/gondolapod/Initialize(mapload, pod)
if(!pod)
stack_trace("Gondola pod created with no pod")
return INITIALIZE_HINT_QDEL
linked_pod = pod
name = linked_pod.name
. = ..()
@@ -71,6 +74,6 @@
update_icon()
/mob/living/simple_animal/pet/gondola/gondolapod/death()
qdel(linked_pod) //Will cause the open() proc for the linked supplypod to be called with the "broken" parameter set to true, meaning that it will dump its contents on death
QDEL_NULL(linked_pod) //Will cause the open() proc for the linked supplypod to be called with the "broken" parameter set to true, meaning that it will dump its contents on death
qdel(src)
..()

View File

@@ -538,6 +538,9 @@
/obj/effect/pod_landingzone_effect/Initialize(mapload, obj/structure/closet/supplypod/pod)
. = ..()
if(!pod)
stack_trace("Pod landingzone effect created with no pod")
return INITIALIZE_HINT_QDEL
transform = matrix() * 1.5
animate(src, transform = matrix()*0.01, time = pod.delays[POD_TRANSIT]+pod.delays[POD_FALLING])
@@ -556,6 +559,9 @@
/obj/effect/pod_landingzone/Initialize(mapload, podParam, single_order = null, clientman)
. = ..()
if(!podParam)
stack_trace("Pod landingzone created with no pod")
return INITIALIZE_HINT_QDEL
if (ispath(podParam)) //We can pass either a path for a pod (as expressconsoles do), or a reference to an instantiated pod (as the centcom_podlauncher does)
podParam = new podParam() //If its just a path, instantiate it
pod = podParam

View File

@@ -13,7 +13,7 @@
/obj/item/clothing/gloves/mittens/random
/obj/item/clothing/gloves/mittens/random/Initialize(mapload)
..()
. = ..()
var/colours = list("black", "yellow", "lightbrown", "brown", "orange", "red", "purple", "green", "blue", "kitten")
var/picked_c = pick(colours)
if(picked_c == "kitten")

View File

@@ -56,7 +56,7 @@
/obj/item/clothing/mask/gas/welding/up
/obj/item/clothing/mask/gas/welding/up/Initialize(mapload)
..()
. = ..()
visor_toggling()

View File

@@ -313,6 +313,10 @@
if(istype(loc, /obj/item/clothing/suit/space/hardsuit/syndi))
linkedsuit = loc
/obj/item/clothing/head/helmet/space/hardsuit/syndi/Destroy()
linkedsuit = null
return ..()
/obj/item/clothing/head/helmet/space/hardsuit/syndi/attack_self(mob/user) //Toggle Helmet
if(!isturf(user.loc))
to_chat(user, "<span class='warning'>You cannot toggle your helmet while in this [user.loc]!</span>" )
@@ -526,6 +530,10 @@
. = ..()
bomb_radar = new /obj/machinery/doppler_array/integrated(src)
/obj/item/clothing/head/helmet/space/hardsuit/rd/Destroy()
QDEL_NULL(bomb_radar)
return ..()
/obj/item/clothing/head/helmet/space/hardsuit/rd/equipped(mob/living/carbon/human/user, slot)
..()
if (slot == ITEM_SLOT_HEAD)
@@ -700,6 +708,10 @@
. = ..()
bomb_radar = new /obj/machinery/doppler_array/integrated(src)
/obj/item/clothing/head/helmet/space/hardsuit/ancient/mason/Destroy()
QDEL_NULL(bomb_radar)
return ..()
/obj/item/clothing/head/helmet/space/hardsuit/ancient/mason/equipped(mob/living/carbon/human/user, slot)
..()
if (slot == ITEM_SLOT_HEAD)
@@ -965,7 +977,7 @@
var/energy_color = "#35FFF0"
/obj/item/clothing/suit/space/hardsuit/lavaknight/Initialize(mapload)
..()
. = ..()
light_color = energy_color
set_light(1)
update_icon()

View File

@@ -153,8 +153,8 @@
/obj/item/clothing/suit/space/hardsuit/Destroy()
if(helmet)
helmet.suit = null
qdel(helmet)
qdel(jetpack)
QDEL_NULL(helmet)
QDEL_NULL(jetpack)
return ..()
/obj/item/clothing/head/helmet/space/hardsuit/Destroy()

View File

@@ -12,7 +12,7 @@
icon_state = "random_jumpsuit"
/obj/item/clothing/under/color/random/Initialize(mapload)
..()
. = ..()
var/obj/item/clothing/under/color/C = pick(typesof(/obj/item/clothing/under/color) - subtypesof(/obj/item/clothing/under/color/jumpskirt) - /obj/item/clothing/under/color/random - /obj/item/clothing/under/color/grey/glorf - /obj/item/clothing/under/color/black/ghost)
if(ishuman(loc))
@@ -26,7 +26,7 @@
icon_state = "random_jumpsuit" //Skirt variant needed
/obj/item/clothing/under/color/jumpskirt/random/Initialize(mapload)
..()
. = ..()
var/obj/item/clothing/under/color/jumpskirt/C = pick(subtypesof(/obj/item/clothing/under/color/jumpskirt) - /obj/item/clothing/under/color/jumpskirt/random)
if(ishuman(loc))
var/mob/living/carbon/human/H = loc

View File

@@ -67,7 +67,7 @@
//Set ignoregloves to add prints irrespective of the mob having gloves on.
/atom/proc/add_fingerprint(mob/living/M, ignoregloves = FALSE)
if(!M || !M.key)
if(!istype(M))
return
add_hiddenprint(M)

View File

@@ -118,7 +118,7 @@
smoke.set_up(1, loc)
smoke.start()
visible_message("<b>[src]</b> disappears in a puff of smoke, leaving something on the ground!")
..()
return ..()
//travelling trader subtypes (the types that can actually spawn)
//so far there's: cook / botanist / bartender / animal hunter / artifact dealer / surgeon (6 types!)
@@ -144,7 +144,7 @@
requested_item = result
else
requested_item = /obj/item/reagent_containers/food/snacks/copypasta
..()
. = ..()
//botanist
/mob/living/carbon/human/dummy/travelling_trader/gardener
@@ -164,7 +164,7 @@
requested_item = pick(subtypesof(/obj/item/reagent_containers/food/snacks/grown) - list(/obj/item/reagent_containers/food/snacks/grown/shell,
/obj/item/reagent_containers/food/snacks/grown/shell/gatfruit,
/obj/item/reagent_containers/food/snacks/grown/cherry_bomb))
..()
. = ..()
//animal hunter
/mob/living/carbon/human/dummy/travelling_trader/animal_hunter
@@ -280,7 +280,7 @@
/mob/living/carbon/human/dummy/travelling_trader/artifact_dealer/Initialize(mapload)
possible_rewards += list(pick(subtypesof(/obj/item/clothing/head/collectable)) = 1) //this is slightly lower because it's absolutely useless
..()
. = ..()
/datum/outfit/artifact_dealer
name = "Artifact Dealer"

View File

@@ -39,6 +39,26 @@
roundend_callback = CALLBACK(src,.proc/check_winner)
SSticker.OnRoundend(roundend_callback)
/obj/item/greentext/Destroy(force)
if(!(resistance_flags & ON_FIRE) && !force)
return QDEL_HINT_LETMELIVE
SSticker.round_end_events -= roundend_callback
GLOB.poi_list.Remove(src)
roundend_callback = null
for(var/i in GLOB.player_list)
var/mob/M = i
var/message = "<span class='warning'>A dark temptation has passed from this world"
if(M in color_altered_mobs)
message += " and you're finally able to forgive yourself"
if(M.color == "#FF0000" || M.color == "#00FF00")
M.remove_atom_colour(ADMIN_COLOUR_PRIORITY)
message += "...</span>"
// can't skip the mob check as it also does the decolouring
if(!quiet)
to_chat(M, message)
. = ..()
/obj/item/greentext/equipped(mob/living/user as mob)
to_chat(user, "<font color='green'>So long as you leave this place with greentext in hand you know will be happy...</font>")
var/list/other_objectives = user.mind.get_all_objectives()
@@ -80,24 +100,7 @@
last_holder.add_atom_colour("#FF0000", ADMIN_COLOUR_PRIORITY)
last_holder = new_holder //long live the king
/obj/item/greentext/Destroy(force)
if(!(resistance_flags & ON_FIRE) && !force)
return QDEL_HINT_LETMELIVE
SSticker.round_end_events -= roundend_callback
GLOB.poi_list.Remove(src)
for(var/i in GLOB.player_list)
var/mob/M = i
var/message = "<span class='warning'>A dark temptation has passed from this world"
if(M in color_altered_mobs)
message += " and you're finally able to forgive yourself"
if(M.color == "#FF0000" || M.color == "#00FF00")
M.remove_atom_colour(ADMIN_COLOUR_PRIORITY)
message += "...</span>"
// can't skip the mob check as it also does the decolouring
if(!quiet)
to_chat(M, message)
. = ..()
/obj/item/greentext/quiet
quiet = TRUE

View File

@@ -34,7 +34,8 @@
INVOKE_ASYNC(src, .proc/domain_expansion)
/obj/effect/domain_expansion/Destroy()
qdel(chronofield)
QDEL_NULL(chronofield)
target = null
return ..()
/obj/effect/domain_expansion/proc/domain_expansion()

View File

@@ -106,6 +106,9 @@ GLOBAL_LIST_INIT(hallucination_list, list(
/obj/effect/hallucination/simple/Initialize(mapload, var/mob/living/carbon/T)
. = ..()
if(!T)
stack_trace("A hallucination was created with no target")
return INITIALIZE_HINT_QDEL
target = T
current_image = GetImage()
if(target.client)

View File

@@ -278,7 +278,7 @@
visible_message("[src] finishes cooking!")
new /obj/item/reagent_containers/food/snacks/meat/steak/goliath(loc)
qdel(src)
/obj/item/reagent_containers/food/snacks/meat/slab/dragon
name = "ash drake meat"
desc = "Meat from an ash drake. It's probably not a good idea to eat this raw."
@@ -408,7 +408,7 @@
trash = null
tastes = list("meat" = 1, "rock" = 1)
foodtype = MEAT
/obj/item/reagent_containers/food/snacks/meat/steak/dragon
name = "dragon steak"
desc = "Spicy."

View File

@@ -43,7 +43,7 @@
var/mob/trapped_mob
/obj/structure/closet/Initialize(mapload)
..()
. = ..()
if(prob(30))
set_spooky_trap()

View File

@@ -146,6 +146,8 @@
stop_playing()
SSinstruments.on_song_del(src)
lines = null
if(using_instrument)
using_instrument.songs_using -= src
using_instrument = null
allowed_instrument_ids = null
parent = null

View File

@@ -654,18 +654,19 @@
/obj/item/integrated_circuit/input/signaler/Initialize(mapload)
. = ..()
spawn(40)
set_frequency(frequency)
// Set the pins so when someone sees them, they won't show as null
set_pin_data(IC_INPUT, 1, frequency)
set_pin_data(IC_INPUT, 2, code)
addtimer(CALLBACK(src, .proc/init_frequency), 4 SECONDS)
/obj/item/integrated_circuit/input/signaler/Destroy()
SSradio.remove_object(src,frequency)
frequency = 0
return ..()
/obj/item/integrated_circuit/input/signaler/proc/init_frequency()
set_frequency(frequency)
// Set the pins so when someone sees them, they won't show as null
set_pin_data(IC_INPUT, 1, frequency)
set_pin_data(IC_INPUT, 2, code)
/obj/item/integrated_circuit/input/signaler/on_data_written()
var/new_freq = get_pin_data(IC_INPUT, 1)
var/new_code = get_pin_data(IC_INPUT, 2)

View File

@@ -177,7 +177,7 @@
/obj/item/integrated_circuit/input/mmi_tank/Destroy()
RemoveBrain()
..()
return ..()
/obj/item/integrated_circuit/input/mmi_tank/relaymove(var/n,var/dir)
set_pin_data(IC_OUTPUT, 2, dir)
@@ -320,7 +320,7 @@
/obj/item/integrated_circuit/input/pAI_connector/Destroy()
RemovepAI()
..()
return ..()
/obj/item/integrated_circuit/input/pAI_connector/proc/RemovepAI()
if(installed_pai)

View File

@@ -2,7 +2,7 @@
icon_state = "random_book"
/obj/item/book/manual/random/Initialize(mapload)
..()
. = ..()
var/static/banned_books = list(/obj/item/book/manual/random, /obj/item/book/manual/nuclear, /obj/item/book/manual/wiki)
var/newtype = pick(subtypesof(/obj/item/book/manual) - banned_books)
new newtype(loc)

Some files were not shown because too many files have changed in this diff Show More