mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2026-08-30 08:07:03 +01:00
Merge branch 'master' of https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13
This commit is contained in:
@@ -134,6 +134,15 @@ GLOBAL_LIST_EMPTY(deletion_failures)
|
||||
DoSearchVar(GLOB, "GLOB") //globals
|
||||
log_reftracker("Finished searching globals")
|
||||
|
||||
//Yes we do actually need to do this. The searcher refuses to read weird lists
|
||||
//And global.vars is a really weird list
|
||||
var/global_vars = list()
|
||||
for(var/key in global.vars)
|
||||
global_vars[key] = global.vars[key]
|
||||
|
||||
DoSearchVar(global_vars, "Native Global", search_time = starting_time)
|
||||
log_reftracker("Finished searching native globals")
|
||||
|
||||
for(var/datum/thing in world) //atoms (don't beleive its lies)
|
||||
DoSearchVar(thing, "World -> [thing.type]", search_time = starting_time)
|
||||
log_reftracker("Finished searching atoms")
|
||||
@@ -143,9 +152,11 @@ GLOBAL_LIST_EMPTY(deletion_failures)
|
||||
log_reftracker("Finished searching datums")
|
||||
|
||||
//Warning, attempting to search clients like this will cause crashes if done on live. Watch yourself
|
||||
#ifndef REFERENCE_DOING_IT_LIVE
|
||||
for(var/client/thing) //clients
|
||||
DoSearchVar(thing, "Clients -> [thing.type]", search_time = starting_time)
|
||||
log_reftracker("Finished searching clients")
|
||||
#endif
|
||||
|
||||
log_reftracker("Completed search for references to a [type].")
|
||||
|
||||
@@ -159,7 +170,7 @@ GLOBAL_LIST_EMPTY(deletion_failures)
|
||||
|
||||
/datum/proc/DoSearchVar(potential_container, container_name, recursive_limit = 64, search_time = world.time)
|
||||
#ifdef REFERENCE_TRACKING_DEBUG
|
||||
if(!found_refs && SSgarbage.should_save_refs)
|
||||
if(SSgarbage.should_save_refs && !found_refs)
|
||||
found_refs = list()
|
||||
#endif
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
clockwork_desc = "A gateway in reality. It can only [sender ? "send" : "receive"] objects."
|
||||
if(is_stable)
|
||||
return
|
||||
timerid = QDEL_IN(src, lifetime) //We only need this if the gateway is not stable
|
||||
timerid = QDEL_IN_STOPPABLE(src, lifetime) //We only need this if the gateway is not stable
|
||||
|
||||
//set up a gateway with another gateway
|
||||
/obj/effect/clockwork/spatial_gateway/proc/setup_gateway(obj/effect/clockwork/spatial_gateway/gatewayB, set_duration, set_uses, two_way)
|
||||
@@ -108,12 +108,12 @@
|
||||
visible_message("<span class='warning'>[src] is disrupted!</span>")
|
||||
animate(src, alpha = 0, transform = matrix()*2, time = 10, flags = ANIMATION_END_NOW)
|
||||
deltimer(timerid)
|
||||
timerid = QDEL_IN(src, 10)
|
||||
timerid = QDEL_IN_STOPPABLE(src, 10)
|
||||
linked_gateway.uses = 0
|
||||
linked_gateway.visible_message("<span class='warning'>[linked_gateway] is disrupted!</span>")
|
||||
animate(linked_gateway, alpha = 0, transform = matrix()*2, time = 10, flags = ANIMATION_END_NOW)
|
||||
deltimer(linked_gateway.timerid)
|
||||
linked_gateway.timerid = QDEL_IN(linked_gateway, 10)
|
||||
linked_gateway.timerid = QDEL_IN_STOPPABLE(linked_gateway, 10)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -279,8 +279,8 @@
|
||||
/obj/effect/clockwork/spatial_gateway/stable/proc/start_shutdown()
|
||||
deltimer(timerid)
|
||||
deltimer(linked_gateway.timerid)
|
||||
timerid = QDEL_IN(src, 20)
|
||||
linked_gateway.timerid = QDEL_IN(linked_gateway, 20)
|
||||
timerid = QDEL_IN_STOPPABLE(src, 20)
|
||||
linked_gateway.timerid = QDEL_IN_STOPPABLE(linked_gateway, 20)
|
||||
animate(src, alpha = 0, transform = matrix()*2, time = 20, flags = ANIMATION_END_NOW)
|
||||
animate(linked_gateway, alpha = 0, transform = matrix()*2, time = 20, flags = ANIMATION_END_NOW)
|
||||
src.visible_message("<span class='warning'>[src] begins to destabilise!</span>")
|
||||
|
||||
+20
-18
@@ -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))
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
/obj/structure/destructible/clockwork/taunting_trail/Initialize(mapload)
|
||||
. = ..()
|
||||
timerid = QDEL_IN(src, 15)
|
||||
timerid = QDEL_IN_STOPPABLE(src, 15)
|
||||
var/obj/structure/destructible/clockwork/taunting_trail/Tt = locate(/obj/structure/destructible/clockwork/taunting_trail) in loc
|
||||
if(Tt && Tt != src)
|
||||
if(!step(src, pick(GLOB.alldirs)))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
var/active = 1
|
||||
|
||||
/obj/structure/firepit/Initialize(mapload)
|
||||
..()
|
||||
. = ..()
|
||||
toggleFirepit()
|
||||
|
||||
/obj/structure/firepit/interact(mob/living/user)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -234,7 +234,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8")
|
||||
var/list/choices = list()
|
||||
for(var/client/C in GLOB.clients)
|
||||
if(isobserver(C.mob) && see_ghost_names)
|
||||
choices["[C.mob]([C])"] = C
|
||||
choices["[C]"] = C //NONMODULARITY NOTE: Removes the ability to link CKEYs to Characters. Always reapply for privacy reasons.
|
||||
else
|
||||
choices[C] = C
|
||||
choices = sortList(choices)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
/obj/item/clothing/mask/gas/welding/up
|
||||
|
||||
/obj/item/clothing/mask/gas/welding/up/Initialize(mapload)
|
||||
..()
|
||||
. = ..()
|
||||
visor_toggling()
|
||||
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -128,7 +128,7 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0)
|
||||
#ifdef UNIT_TESTS
|
||||
if(GLOB.current_test)
|
||||
//good day, sir
|
||||
GLOB.current_test.Fail("[main_line]\n[desclines.Join("\n")]")
|
||||
GLOB.current_test.Fail("[main_line]\n[desclines.Join("\n")]", file = E.file, line = E.line)
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
var/mob/trapped_mob
|
||||
|
||||
/obj/structure/closet/Initialize(mapload)
|
||||
..()
|
||||
. = ..()
|
||||
if(prob(30))
|
||||
set_spooky_trap()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -270,6 +270,11 @@
|
||||
active_style = new /datum/gauntlet_style/brawler
|
||||
active_style.on_apply(src)
|
||||
|
||||
/obj/item/kinetic_crusher/glaive/gauntlets/Destroy()
|
||||
QDEL_NULL(active_style)
|
||||
current_target = null
|
||||
return ..()
|
||||
|
||||
/obj/item/kinetic_crusher/glaive/gauntlets/examine(mob/living/user)
|
||||
. = ..()
|
||||
. += "According to a very small display, the currently loaded style is \"[active_style.name]\"."
|
||||
|
||||
@@ -96,6 +96,7 @@
|
||||
new /obj/effect/temp_visual/resonance_crush(T)
|
||||
if(ismineralturf(T))
|
||||
var/turf/closed/mineral/M = T
|
||||
replicate(M)
|
||||
M.gets_drilled(creator)
|
||||
check_pressure(T)
|
||||
playsound(T,'sound/weapons/resonator_blast.ogg',50,1)
|
||||
@@ -115,3 +116,10 @@
|
||||
. = ..()
|
||||
transform = matrix()*1.5
|
||||
animate(src, transform = matrix()*0.1, alpha = 50, time = 4)
|
||||
|
||||
/obj/effect/temp_visual/resonance/proc/replicate(turf/closed/mineral/M) //yogs start: adds replication to resonator fields
|
||||
if(!istype(M) || !M.mineralType) // so we don't end up in the ultimate chain reaction
|
||||
return
|
||||
for(var/turf/closed/mineral/T in orange(1, M))
|
||||
if(istype(T) && T.mineralType)
|
||||
new /obj/effect/temp_visual/resonance(T, creator, null, duration) //yogs end
|
||||
|
||||
@@ -168,7 +168,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons)
|
||||
|
||||
/obj/structure/extraction_point/Destroy()
|
||||
GLOB.total_extraction_beacons -= src
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/effect/extraction_holder
|
||||
name = "extraction holder"
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
var/sap_amount
|
||||
|
||||
/obj/structure/flora/ashtree/Initialize(mapload)
|
||||
..()
|
||||
. = ..()
|
||||
if(prob(50))
|
||||
sap = TRUE
|
||||
icon_state = sap_icon_state
|
||||
|
||||
@@ -434,6 +434,12 @@
|
||||
var/obj/item/warp_cube/linked
|
||||
var/teleporting = FALSE
|
||||
|
||||
/obj/item/warp_cube/Destroy()
|
||||
if(!QDELETED(linked))
|
||||
linked.linked = null
|
||||
QDEL_NULL(linked)
|
||||
return ..()
|
||||
|
||||
/obj/item/warp_cube/attack_self(mob/user)
|
||||
if(!linked)
|
||||
to_chat(user, "[src] fizzles uselessly.")
|
||||
@@ -480,6 +486,12 @@
|
||||
linked = blue
|
||||
blue.linked = src
|
||||
|
||||
/obj/item/warp_cube/red/Destroy()
|
||||
if(!QDELETED(linked))
|
||||
linked.linked = null
|
||||
QDEL_NULL(linked)
|
||||
return ..()
|
||||
|
||||
/obj/effect/warp_cube
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
anchored = TRUE
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
if(!mind)
|
||||
mind = new /datum/mind(key)
|
||||
mind.active = 1
|
||||
mind.current = src
|
||||
mind.set_current(src)
|
||||
|
||||
..()
|
||||
|
||||
|
||||
@@ -708,7 +708,7 @@
|
||||
mind.late_joiner = TRUE
|
||||
mind.active = 0 //we wish to transfer the key manually
|
||||
mind.transfer_to(H) //won't transfer key since the mind is not active
|
||||
mind.original_character = H
|
||||
mind.set_original_character(H)
|
||||
|
||||
H.name = real_name
|
||||
client.init_verbs()
|
||||
|
||||
@@ -361,6 +361,8 @@
|
||||
var/obj/effect/decal/cleanable/blood/B = locate() in T
|
||||
if(!B)
|
||||
B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses())
|
||||
if(QDELETED(B)) //Give it up
|
||||
return
|
||||
if(B.bloodiness < MAX_SHOE_BLOODINESS) //add more blood, up to a limit
|
||||
B.bloodiness += BLOOD_AMOUNT_PER_DECAL
|
||||
B.transfer_mob_blood_dna(src) //give blood info to the blood decal.
|
||||
|
||||
@@ -34,10 +34,11 @@
|
||||
if(stat!=DEAD) //If not dead.
|
||||
death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA
|
||||
if(mind) //You aren't allowed to return to brains that don't exist
|
||||
mind.current = null
|
||||
mind.set_current(null)
|
||||
mind.active = FALSE //No one's using it anymore.
|
||||
ghostize() //Ghostize checks for key so nothing else is necessary.
|
||||
container = null
|
||||
QDEL_NULL(stored_dna)
|
||||
return ..()
|
||||
|
||||
/mob/living/brain/update_mobility()
|
||||
|
||||
@@ -286,6 +286,8 @@
|
||||
if(brainmob)
|
||||
QDEL_NULL(brainmob)
|
||||
QDEL_LIST(traumas)
|
||||
if(owner?.mind)
|
||||
owner.mind.set_current(null)
|
||||
return ..()
|
||||
|
||||
//other types of brains
|
||||
|
||||
@@ -17,8 +17,8 @@
|
||||
var/drooling = 0 //For Neruotoxic spit overlays
|
||||
bodyparts = list(/obj/item/bodypart/chest/alien, /obj/item/bodypart/head/alien, /obj/item/bodypart/l_arm/alien,
|
||||
/obj/item/bodypart/r_arm/alien, /obj/item/bodypart/r_leg/alien, /obj/item/bodypart/l_leg/alien)
|
||||
|
||||
can_ventcrawl = TRUE
|
||||
var/obj/effect/proc_holder/alien/regurgitate/regurg
|
||||
|
||||
GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list(
|
||||
/datum/strippable_item/hand/left,
|
||||
@@ -29,7 +29,13 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list(
|
||||
|
||||
//This is fine right now, if we're adding organ specific damage this needs to be updated
|
||||
/mob/living/carbon/alien/humanoid/Initialize(mapload)
|
||||
AddAbility(new/obj/effect/proc_holder/alien/regurgitate(null))
|
||||
regurg = new(null)
|
||||
AddAbility(regurg)
|
||||
. = ..()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/Destroy()
|
||||
RemoveAbility(regurg)
|
||||
QDEL_NULL(regurg)
|
||||
. = ..()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/ComponentInitialize()
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
health = 400
|
||||
icon_state = "alienq"
|
||||
var/datum/action/small_sprite/smallsprite = new/datum/action/small_sprite/queen()
|
||||
var/obj/effect/proc_holder/alien/royal/queen/promote/promote
|
||||
|
||||
/mob/living/carbon/alien/humanoid/royal/queen/Initialize(mapload)
|
||||
//there should only be one queen
|
||||
@@ -44,10 +45,17 @@
|
||||
real_name = src.name
|
||||
|
||||
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno(src))
|
||||
AddAbility(new/obj/effect/proc_holder/alien/royal/queen/promote())
|
||||
promote = new(null)
|
||||
AddAbility(promote)
|
||||
smallsprite.Grant(src)
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/royal/queen/Destroy()
|
||||
RemoveAbility(promote)
|
||||
QDEL_NULL(promote)
|
||||
QDEL_NULL(small_sprite)
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/royal/queen/create_internal_organs()
|
||||
internal_organs += new /obj/item/organ/alien/plasmavessel/large/queen
|
||||
internal_organs += new /obj/item/organ/alien/resinspinner
|
||||
|
||||
@@ -12,6 +12,9 @@
|
||||
alien_powers += new A(src)
|
||||
|
||||
/obj/item/organ/alien/Destroy()
|
||||
if(owner)
|
||||
Remove(TRUE)
|
||||
owner = null
|
||||
QDEL_LIST(alien_powers)
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -447,6 +447,14 @@
|
||||
var/datum/action/innate/use_extract/major/extract_major
|
||||
var/extract_cooldown = 0
|
||||
|
||||
/datum/species/jelly/luminescent/Destroy(force)
|
||||
current_extract = null
|
||||
QDEL_NULL(glow)
|
||||
QDEL_NULL(extract_major)
|
||||
QDEL_NULL(integrate_extract)
|
||||
QDEL_NULL(extract_minor)
|
||||
return ..()
|
||||
|
||||
/datum/species/jelly/luminescent/on_species_loss(mob/living/carbon/C)
|
||||
..()
|
||||
if(current_extract)
|
||||
@@ -621,6 +629,14 @@
|
||||
if(link_minds)
|
||||
link_minds.Remove(C)
|
||||
|
||||
//Species datums don't normally implement destroy, but JELLIES SUCK ASS OUT OF A STEEL STRAW ~LemonInTheDark, Tsurupeta
|
||||
/datum/species/jelly/stargazer/Destroy()
|
||||
QDEL_NULL(project_thought)
|
||||
QDEL_NULL(link_minds)
|
||||
QDEL_LIST(linked_actions)
|
||||
slimelink_owner = null
|
||||
return ..()
|
||||
|
||||
/datum/species/jelly/stargazer/spec_death(gibbed, mob/living/carbon/human/H)
|
||||
..()
|
||||
for(var/M in linked_mobs)
|
||||
@@ -673,6 +689,10 @@
|
||||
..()
|
||||
species = _species
|
||||
|
||||
/datum/action/innate/linked_speech/Destroy()
|
||||
species = null
|
||||
return ..()
|
||||
|
||||
/datum/action/innate/linked_speech/Activate()
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(!species || !(H in species.linked_mobs))
|
||||
@@ -750,6 +770,10 @@
|
||||
..()
|
||||
species = _species
|
||||
|
||||
/datum/action/innate/linked_speech/Destroy()
|
||||
species = null
|
||||
return ..()
|
||||
|
||||
/datum/action/innate/link_minds/Activate()
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(!is_species(H, /datum/species/jelly/stargazer))
|
||||
|
||||
@@ -184,6 +184,9 @@ GLOBAL_LIST_INIT(strippable_monkey_items, create_strippable_list(list(
|
||||
/mob/living/carbon/monkey/angry/Initialize(mapload)
|
||||
. = ..()
|
||||
if(prob(10))
|
||||
var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src)
|
||||
equip_to_slot_or_del(helmet,ITEM_SLOT_HEAD)
|
||||
INVOKE_ASYNC(helmet, /obj/item.proc/attack_self, src) // todo encapsulate toggle
|
||||
INVOKE_ASYNC(src, PROC_REF(give_ape_escape_helmet))
|
||||
|
||||
/mob/living/carbon/monkey/angry/proc/give_ape_escape_helmet()
|
||||
var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src)
|
||||
equip_to_slot_or_del(helmet,ITEM_SLOT_HEAD)
|
||||
helmet.attack_self(src) // todo encapsulate toggle
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
if(buckled)
|
||||
buckled.unbuckle_mob(src,force=1)
|
||||
QDEL_LIST_ASSOC_VAL(ability_actions)
|
||||
QDEL_LIST(abilities)
|
||||
|
||||
remove_from_all_data_huds()
|
||||
GLOB.mob_living_list -= src
|
||||
|
||||
@@ -187,6 +187,7 @@
|
||||
// TODO: Why these no work?
|
||||
// QDEL_NULL(robot_control)
|
||||
QDEL_NULL(aiMulti)
|
||||
QDEL_NULL(aiPDA)
|
||||
// QDEL_NULL(alert_control)
|
||||
malfhack = null
|
||||
current = null
|
||||
@@ -1036,9 +1037,9 @@
|
||||
return
|
||||
|
||||
/mob/living/silicon/ai/spawned/Initialize(mapload, datum/ai_laws/L, mob/target_ai)
|
||||
. = ..()
|
||||
if(!target_ai)
|
||||
target_ai = src //cheat! just give... ourselves as the spawned AI, because that's technically correct
|
||||
. = ..()
|
||||
|
||||
/mob/living/silicon/ai/proc/camera_visibility(mob/camera/aiEye/moved_eye)
|
||||
GLOB.cameranet.visibility(moved_eye, client, all_eyes, USE_STATIC_OPAQUE)
|
||||
|
||||
@@ -85,12 +85,15 @@
|
||||
var/icon/custom_holoform_icon
|
||||
|
||||
/mob/living/silicon/pai/Destroy()
|
||||
QDEL_NULL(signaler)
|
||||
QDEL_NULL(pda)
|
||||
QDEL_NULL(internal_instrument)
|
||||
if (loc != card)
|
||||
card.forceMove(drop_location())
|
||||
card.pai = null
|
||||
card.cut_overlays()
|
||||
card.add_overlay("pai-off")
|
||||
card = null
|
||||
GLOB.pai_list -= src
|
||||
return ..()
|
||||
|
||||
@@ -111,10 +114,9 @@
|
||||
|
||||
//PDA
|
||||
pda = new(src)
|
||||
spawn(5)
|
||||
pda.ownjob = "pAI Messenger"
|
||||
pda.owner = text("[]", src)
|
||||
pda.name = pda.owner + " (" + pda.ownjob + ")"
|
||||
pda.ownjob = "pAI Messenger"
|
||||
pda.owner = text("[]", src)
|
||||
pda.name = pda.owner + " (" + pda.ownjob + ")"
|
||||
|
||||
possible_chassis = typelist(NAMEOF(src, possible_chassis), list("cat" = TRUE, "mouse" = TRUE, "monkey" = TRUE, "corgi" = FALSE,
|
||||
"fox" = FALSE, "repairbot" = TRUE, "rabbit" = TRUE, "borgi" = FALSE ,
|
||||
|
||||
@@ -116,17 +116,19 @@
|
||||
if(connected_ai)
|
||||
set_connected_ai(null)
|
||||
if(shell) //??? why would you give an ai radio keys?
|
||||
GLOB.available_ai_shells -= src
|
||||
revert_shell()
|
||||
else
|
||||
if(T && istype(radio) && istype(radio.keyslot))
|
||||
radio.keyslot.forceMove(T)
|
||||
radio.keyslot = null
|
||||
QDEL_LIST(upgrades)
|
||||
QDEL_NULL(wires)
|
||||
QDEL_NULL(module)
|
||||
QDEL_NULL(eye_lights)
|
||||
QDEL_NULL(inv1)
|
||||
QDEL_NULL(inv2)
|
||||
QDEL_NULL(inv3)
|
||||
QDEL_NULL(aiPDA)
|
||||
cell = null
|
||||
return ..()
|
||||
|
||||
@@ -619,7 +621,7 @@
|
||||
|
||||
/mob/living/silicon/robot/proc/SetLockdown(state = TRUE)
|
||||
// They stay locked down if their wire is cut.
|
||||
if(wires.is_cut(WIRE_LOCKDOWN))
|
||||
if(wires?.is_cut(WIRE_LOCKDOWN))
|
||||
state = TRUE
|
||||
if(state)
|
||||
throw_alert("locked", /atom/movable/screen/alert/locked)
|
||||
@@ -693,7 +695,7 @@
|
||||
// set_light_color(COLOR_RED) //This should only matter for doomsday borgs, as any other time the lamp will be off and the color not seen
|
||||
// set_light_range(1) //Again, like above, this only takes effect when the light is forced on by doomsday mode.
|
||||
lamp_enabled = FALSE
|
||||
lampButton.update_icon()
|
||||
lampButton?.update_icon()
|
||||
update_icons()
|
||||
return
|
||||
set_light(lamp_intensity, l_color = (lamp_doom? COLOR_RED : lamp_color))
|
||||
@@ -701,7 +703,7 @@
|
||||
// set_light_color(lamp_doom? COLOR_RED : lamp_color) //Red for doomsday killborgs, borg's choice otherwise
|
||||
// set_light_on(TRUE)
|
||||
lamp_enabled = TRUE
|
||||
lampButton.update_icon()
|
||||
lampButton?.update_icon()
|
||||
update_icons()
|
||||
|
||||
/mob/living/silicon/robot/proc/deconstruct()
|
||||
@@ -1135,6 +1137,7 @@
|
||||
for(var/obj/item/borg/upgrade/ai/boris in src)
|
||||
//A player forced reset of a borg would drop the module before this is called, so this is for catching edge cases
|
||||
qdel(boris)
|
||||
upgrades -= boris
|
||||
shell = FALSE
|
||||
GLOB.available_ai_shells -= src
|
||||
name = "Unformatted Cyborg-[ident]"
|
||||
|
||||
@@ -411,7 +411,8 @@
|
||||
"Haydee" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "haydeemedical"), // SPLURT Addon (Hyper Port)
|
||||
"Borgi" = image(icon = 'modular_splurt/icons/mob/widerobot.dmi', icon_state = "borgi-medi-b"), // SPLURT Adoon (Skyrat Port)
|
||||
"Drake" = image(icon = 'modular_sand/icons/mob/cyborg/drakemech.dmi', icon_state = "drakemedbox"),
|
||||
"Assaultron" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "assaultron_medical") // SPLURT Addon
|
||||
"Assaultron" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "assaultron_medical"), // SPLURT Addon
|
||||
"Meka" = image(icon = 'modular_splurt/icons/mob/robots_32x64.dmi', icon_state = "mekamed"), // SPLURT Addon
|
||||
)
|
||||
var/list/L = list("Medihound" = "medihound", "Medihound Dark" = "medihounddark", "Vale" = "valemed")
|
||||
for(var/a in L)
|
||||
@@ -538,6 +539,10 @@
|
||||
cyborg_base_icon = "assaultron_medical"
|
||||
cyborg_icon_override = 'modular_splurt/icons/mob/robots.dmi'
|
||||
hat_offset = 3
|
||||
if("Meka")
|
||||
cyborg_base_icon = "mekamed"
|
||||
cyborg_icon_override = 'modular_splurt/icons/mob/robots_32x64.dmi'
|
||||
hat_offset = 3
|
||||
else
|
||||
return FALSE
|
||||
return ..()
|
||||
@@ -611,7 +616,8 @@
|
||||
"Engihound Dark" = image(icon = 'modular_splurt/icons/mob/widerobot.dmi', icon_state = "engihounddark-b"), // SPLURT Adoon (Skyrat Port)
|
||||
"Otie" = image(icon = 'modular_splurt/icons/mob/widerobot.dmi', icon_state = "otiee-b"), // SPLURT Adoon (Skyrat Port)
|
||||
"Drake" = image(icon = 'modular_sand/icons/mob/cyborg/drakemech.dmi', icon_state = "drakeengbox"),
|
||||
"Assaultron" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "assaultron_engi") // SPLURT Addon
|
||||
"Assaultron" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "assaultron_engi"), // SPLURT Addon
|
||||
"Haydee" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "haydeeengi") // SPLURT Addon
|
||||
)
|
||||
var/list/L = list("Pup Dozer" = "pupdozer", "Vale" = "valeeng")
|
||||
for(var/a in L)
|
||||
@@ -734,10 +740,14 @@
|
||||
cyborg_icon_override = 'modular_sand/icons/mob/cyborg/drakemech.dmi'
|
||||
sleeper_overlay = "drakesecsleeper"
|
||||
dogborg = TRUE
|
||||
if("Assaultron") // SPLURT Addon (Hyper Port)
|
||||
if("Assaultron") // SPLURT Addon
|
||||
cyborg_base_icon = "assaultron_engi"
|
||||
cyborg_icon_override = 'modular_splurt/icons/mob/robots.dmi'
|
||||
hat_offset = 3
|
||||
if("Haydee") // SPLURT Addon
|
||||
cyborg_base_icon = "haydeeengi"
|
||||
cyborg_icon_override = 'modular_splurt/icons/mob/robots.dmi'
|
||||
hat_offset = 3
|
||||
else
|
||||
return FALSE
|
||||
return ..()
|
||||
@@ -794,9 +804,8 @@
|
||||
"EdgyBoy" = image(icon = 'modular_splurt/icons/mob/widerobot.dmi', icon_state = "badboi-b"), // SPLURT Addon (VIRGO Port)
|
||||
"EdgyGirl" = image(icon = 'modular_splurt/icons/mob/widerobot.dmi', icon_state = "prettyboi-b"), // SPLURT Addon (VIRGO Port)
|
||||
"Drake" = image(icon = 'modular_sand/icons/mob/cyborg/drakemech.dmi', icon_state = "drakesecbox"),
|
||||
|
||||
"Assaultron" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "assaultron_sec") // SPLURT Addon
|
||||
|
||||
"Assaultron" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "assaultron_sec"), // SPLURT Addon
|
||||
"Haydee" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "haydeesec") // SPLURT Addon
|
||||
)
|
||||
var/list/L = list("K9" = "k9", "Vale" = "valesec", "K9 Dark" = "k9dark")
|
||||
for(var/a in L)
|
||||
@@ -920,12 +929,14 @@
|
||||
sleeper_overlay = "drakesecsleeper"
|
||||
cyborg_icon_override = 'modular_sand/icons/mob/cyborg/drakemech.dmi'
|
||||
dogborg = TRUE
|
||||
|
||||
if("Assaultron") // SPLURT Addon
|
||||
cyborg_base_icon = "assaultron_sec"
|
||||
cyborg_icon_override = 'modular_splurt/icons/mob/robots.dmi'
|
||||
hat_offset = 3
|
||||
|
||||
if("Haydee") // SPLURT Addon
|
||||
cyborg_base_icon = "haydeesec"
|
||||
cyborg_icon_override = 'modular_splurt/icons/mob/robots.dmi'
|
||||
hat_offset = 3
|
||||
else
|
||||
return FALSE
|
||||
return ..()
|
||||
@@ -982,6 +993,8 @@
|
||||
"Vale" = image(icon = 'modular_splurt/icons/mob/widerobot.dmi', icon_state = "valepeace-b"), // SPLURT Adoon (Skyrat Port)
|
||||
"Drake" = image(icon = 'modular_sand/icons/mob/cyborg/drakemech.dmi', icon_state = "drakepeacebox"),
|
||||
"Assaultron" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "assaultron_peacekeeper"), // SPLURT Adoon
|
||||
"Haydee" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "haydeepk"), // SPLURT Addon
|
||||
"Meka" = image(icon = 'modular_splurt/icons/mob/robots_32x64.dmi', icon_state = "mekapeace"), // SPLURT Addon
|
||||
))
|
||||
var/peace_borg_icon = show_radial_menu(R, R , peace_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE)
|
||||
switch(peace_borg_icon)
|
||||
@@ -1043,6 +1056,14 @@
|
||||
cyborg_base_icon = "assaultron_peacekeeper"
|
||||
cyborg_icon_override = 'modular_splurt/icons/mob/robots.dmi'
|
||||
hat_offset = 3
|
||||
if("Haydee") // SPLURT Addon
|
||||
cyborg_base_icon = "haydeepk"
|
||||
cyborg_icon_override = 'modular_splurt/icons/mob/robots.dmi'
|
||||
hat_offset = 3
|
||||
if("Meka")
|
||||
cyborg_base_icon = "mekapeace"
|
||||
cyborg_icon_override = 'modular_splurt/icons/mob/robots_32x64.dmi'
|
||||
hat_offset = 3
|
||||
else
|
||||
return FALSE
|
||||
return ..()
|
||||
@@ -1189,6 +1210,7 @@
|
||||
"(Service) BootyS" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "bootyserviceS"), // SPLURT Addon (Hyper Port)
|
||||
"(Service) K69" = image(icon = 'modular_splurt/icons/mob/widerobot.dmi', icon_state = "k69-b"), // SPLURT Addon (Skyrat Port) // The Cursed One
|
||||
"(Service) Borgi" = image(icon = 'modular_splurt/icons/mob/widerobot.dmi', icon_state = "borgi-serv-b"), // SPLURT Addon (Skyrat Port)
|
||||
"(Service) Meka" = image(icon = 'modular_splurt/icons/mob/robots_32x64.dmi', icon_state = "mekaserve"), // SPLURT Addon
|
||||
"(Janitor) Default" = image(icon = 'icons/mob/robots.dmi', icon_state = "janitor"),
|
||||
"(Janitor) Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinajan"),
|
||||
"(Janitor) Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekjan"),
|
||||
@@ -1211,6 +1233,9 @@
|
||||
"(Janitor) Fembot" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "fembot-service"), // SPLURT Addon
|
||||
"(Janitor) Drake" = image(icon = 'modular_sand/icons/mob/cyborg/drakemech.dmi', icon_state = "drakejanitbox"),
|
||||
"Assaultron" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "assaultron_service"), // SPLURT Addon
|
||||
"(Janitor) Haydee" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "haydeejan"), // SPLURT Addon
|
||||
"(Janitor) Meka" = image(icon = 'modular_splurt/icons/mob/robots_32x64.dmi', icon_state = "mekajani"), // SPLURT Addon
|
||||
"(Waiter) Meka" = image(icon = 'modular_splurt/icons/mob/robots_32x64.dmi', icon_state = "mekaserve_alt"), // SPLURT Addon
|
||||
)
|
||||
var/list/L = list("(Service) DarkK9" = "k50", "(Service) Vale" = "valeserv", "(Service) ValeDark" = "valeservdark",
|
||||
"(Janitor) Scrubpuppy" = "scrubpup")
|
||||
@@ -1305,6 +1330,10 @@
|
||||
cyborg_icon_override = 'modular_splurt/icons/mob/widerobot.dmi'
|
||||
sleeper_overlay = "borgi-sleeper"
|
||||
dogborg = TRUE
|
||||
if("(Service) Meka")
|
||||
cyborg_base_icon = "mekaserve"
|
||||
cyborg_icon_override = 'modular_splurt/icons/mob/robots_32x64.dmi'
|
||||
hat_offset = 3
|
||||
if("(Janitor) Default")
|
||||
cyborg_base_icon = "janitor"
|
||||
if("(Janitor) Marina")
|
||||
@@ -1395,6 +1424,18 @@
|
||||
cyborg_base_icon = "assaultron_service"
|
||||
cyborg_icon_override = 'modular_splurt/icons/mob/robots.dmi'
|
||||
hat_offset = 3
|
||||
if("(Janitor) Haydee") // SPLURT Addon
|
||||
cyborg_base_icon = "haydeejan"
|
||||
cyborg_icon_override = 'modular_splurt/icons/mob/robots.dmi'
|
||||
hat_offset = 3
|
||||
if("(Janitor) Meka")
|
||||
cyborg_base_icon = "mekajani"
|
||||
cyborg_icon_override = 'modular_splurt/icons/mob/robots_32x64.dmi'
|
||||
hat_offset = 3
|
||||
if("(Waiter) Meka")
|
||||
cyborg_base_icon = "mekaserve_alt"
|
||||
cyborg_icon_override = 'modular_splurt/icons/mob/robots_32x64.dmi'
|
||||
hat_offset = 3
|
||||
else
|
||||
return FALSE
|
||||
return ..()
|
||||
@@ -1456,7 +1497,9 @@
|
||||
"Cargohound Dark" = image(icon = 'modular_splurt/icons/mob/widerobot.dmi', icon_state = "cargohounddark-b"), // SPLURT Adoon (Skyrat Port)
|
||||
"Otie" = image(icon = 'modular_splurt/icons/mob/widerobot.dmi', icon_state = "otiec-b"), // SPLURT Adoon (Skyrat Port)
|
||||
"Drake" = image(icon = 'modular_sand/icons/mob/cyborg/drakemech.dmi', icon_state = "drakeminebox"),
|
||||
"Assaultron" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "assaultron_mining"), // SPLURT
|
||||
"Assaultron" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "assaultron_mining"), // SPLURT Addon
|
||||
"Haydee" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "haydeeminer"), // SPLURT Addon
|
||||
"Meka" = image(icon = 'modular_splurt/icons/mob/robots_32x64.dmi', icon_state = "mekamine"), // SPLURT Addon
|
||||
)
|
||||
var/list/L = list("Blade" = "blade", "Vale" = "valemine")
|
||||
for(var/a in L)
|
||||
@@ -1560,6 +1603,14 @@
|
||||
cyborg_base_icon = "assaultron_mining"
|
||||
cyborg_icon_override = 'modular_splurt/icons/mob/robots.dmi'
|
||||
hat_offset = 3
|
||||
if("Haydee") // SPLURT Addon
|
||||
cyborg_base_icon = "haydeeminer"
|
||||
cyborg_icon_override = 'modular_splurt/icons/mob/robots.dmi'
|
||||
hat_offset = 3
|
||||
if("Meka")
|
||||
cyborg_base_icon = "mekamine"
|
||||
cyborg_icon_override = 'modular_splurt/icons/mob/robots_32x64.dmi'
|
||||
hat_offset = 3
|
||||
else
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -53,21 +53,21 @@
|
||||
lasercolor = created_lasercolor
|
||||
icon_state = "[lasercolor]ed209[on]"
|
||||
set_weapon() //giving it the right projectile and firing sound.
|
||||
spawn(3)
|
||||
var/datum/job/detective/J = new/datum/job/detective
|
||||
access_card.access += J.get_access()
|
||||
prev_access = access_card.access
|
||||
|
||||
if(lasercolor)
|
||||
shot_delay = 6//Longer shot delay because JESUS CHRIST
|
||||
check_records = 0//Don't actively target people set to arrest
|
||||
arrest_type = 1//Don't even try to cuff
|
||||
bot_core.req_access = list(ACCESS_MAINT_TUNNELS, ACCESS_THEATRE)
|
||||
arrest_type = 1
|
||||
if((lasercolor == "b") && (name == "\improper ED-209 Security Robot"))//Picks a name if there isn't already a custome one
|
||||
name = pick("BLUE BALLER","SANIC","BLUE KILLDEATH MURDERBOT")
|
||||
if((lasercolor == "r") && (name == "\improper ED-209 Security Robot"))
|
||||
name = pick("RED RAMPAGE","RED ROVER","RED KILLDEATH MURDERBOT")
|
||||
var/datum/job/detective/J = new /datum/job/detective
|
||||
access_card.access += J.get_access()
|
||||
prev_access = access_card.access
|
||||
|
||||
if(lasercolor)
|
||||
shot_delay = 6//Longer shot delay because JESUS CHRIST
|
||||
check_records = 0//Don't actively target people set to arrest
|
||||
arrest_type = 1//Don't even try to cuff
|
||||
bot_core.req_access = list(ACCESS_MAINT_TUNNELS, ACCESS_THEATRE)
|
||||
arrest_type = 1
|
||||
if((lasercolor == "b") && (name == "\improper ED-209 Security Robot"))//Picks a name if there isn't already a custome one
|
||||
name = pick("BLUE BALLER","SANIC","BLUE KILLDEATH MURDERBOT")
|
||||
if((lasercolor == "r") && (name == "\improper ED-209 Security Robot"))
|
||||
name = pick("RED RAMPAGE","RED ROVER","RED KILLDEATH MURDERBOT")
|
||||
|
||||
//SECHUD
|
||||
var/datum/atom_hud/secsensor = GLOB.huds[DATA_HUD_SECURITY_ADVANCED]
|
||||
|
||||
@@ -45,9 +45,12 @@
|
||||
var/datum/job/engineer/J = new/datum/job/engineer
|
||||
access_card.access += J.get_access()
|
||||
prev_access = access_card.access
|
||||
|
||||
create_extinguisher()
|
||||
|
||||
/mob/living/simple_animal/bot/firebot/Destroy()
|
||||
QDEL_NULL(internal_ext)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/bot/firebot/bot_reset()
|
||||
create_extinguisher()
|
||||
|
||||
|
||||
@@ -68,8 +68,8 @@
|
||||
|
||||
/mob/living/simple_animal/bot/mulebot/Destroy()
|
||||
unload(0)
|
||||
qdel(wires)
|
||||
wires = null
|
||||
QDEL_NULL(wires)
|
||||
QDEL_NULL(cell)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/bot/mulebot/proc/set_id(new_id)
|
||||
|
||||
@@ -202,7 +202,7 @@
|
||||
|
||||
/mob/living/simple_animal/cow/random/Initialize(mapload)
|
||||
milk_reagent = get_random_reagent_id() //this has a blacklist so don't worry about romerol cows, etc
|
||||
..()
|
||||
. = ..()
|
||||
|
||||
//Wisdom cow, speaks and bestows great wisdoms
|
||||
/mob/living/simple_animal/cow/wisdom
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
|
||||
/obj/structure/receiving_pad/New(loc, mob/living/simple_animal/hostile/guardian/healer/G)
|
||||
. = ..()
|
||||
if(G.guardiancolor)
|
||||
if(G?.guardiancolor)
|
||||
add_atom_colour(G.guardiancolor, FIXED_COLOUR_PRIORITY)
|
||||
|
||||
/obj/structure/receiving_pad/proc/disappear()
|
||||
|
||||
@@ -396,10 +396,6 @@
|
||||
action_icon_state = "wrap_0"
|
||||
action_background_icon_state = "bg_alien"
|
||||
|
||||
/obj/effect/proc_holder/wrap/Initialize(mapload)
|
||||
. = ..()
|
||||
action = new(src)
|
||||
|
||||
/obj/effect/proc_holder/wrap/update_icon()
|
||||
action.button_icon_state = "wrap_[active]"
|
||||
action.UpdateButtonIcon()
|
||||
|
||||
@@ -62,6 +62,10 @@ Difficulty: Medium
|
||||
internal = new/obj/item/gps/internal/miner(src)
|
||||
miner_saw = new(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Destroy()
|
||||
QDEL_NULL(miner_saw)
|
||||
return ..()
|
||||
|
||||
/datum/action/innate/megafauna_attack/dash
|
||||
name = "Dash To Target"
|
||||
icon_icon = 'icons/mob/actions/actions_items.dmi'
|
||||
|
||||
@@ -249,6 +249,8 @@ Difficulty: Very Hard
|
||||
var/list/stored_items = list()
|
||||
var/list/blacklist = list()
|
||||
|
||||
GLOBAL_VAR(blackbox_smartfridge)
|
||||
|
||||
/obj/machinery/smartfridge/black_box/ComponentInitialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/update_icon_blocker)
|
||||
@@ -263,11 +265,10 @@ Difficulty: Very Hard
|
||||
|
||||
/obj/machinery/smartfridge/black_box/Initialize()
|
||||
. = ..()
|
||||
var/static/obj/machinery/smartfridge/black_box/current
|
||||
if(current && current != src)
|
||||
if(GLOB.blackbox_smartfridge && GLOB.blackbox_smartfridge != src)
|
||||
qdel(src, force=TRUE)
|
||||
return
|
||||
current = src
|
||||
GLOB.blackbox_smartfridge = src
|
||||
ReadMemory()
|
||||
|
||||
/obj/machinery/smartfridge/black_box/process()
|
||||
@@ -314,6 +315,8 @@ Difficulty: Very Hard
|
||||
if(force)
|
||||
for(var/thing in src)
|
||||
qdel(thing)
|
||||
if(GLOB.blackbox_smartfridge == src)
|
||||
GLOB.blackbox_smartfridge = null
|
||||
return ..()
|
||||
else
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/curseblob/Initialize(mapload)
|
||||
. = ..()
|
||||
timerid = QDEL_IN(src, 600)
|
||||
timerid = QDEL_IN_STOPPABLE(src, 600)
|
||||
playsound(src, 'sound/effects/curse1.ogg', 100, 1, -1)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/curseblob/Destroy()
|
||||
@@ -57,7 +57,8 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/curseblob/proc/check_for_target()
|
||||
if(QDELETED(set_target) || set_target.stat != CONSCIOUS || z != set_target.z)
|
||||
qdel(src)
|
||||
if(!QDELETED(src))
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/curseblob/GiveTarget(new_target)
|
||||
|
||||
@@ -204,7 +204,7 @@
|
||||
var/mob/living/simple_animal/hostile/asteroid/elite/herald/my_master = null
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/Initialize(mapload)
|
||||
..()
|
||||
. = ..()
|
||||
toggle_ai(AI_OFF)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/Destroy()
|
||||
|
||||
@@ -211,4 +211,4 @@
|
||||
/obj/effect/temp_visual/goliath_tentacle/proc/retract()
|
||||
icon_state = "Goliath_tentacle_retract"
|
||||
deltimer(timerid)
|
||||
timerid = QDEL_IN(src, 7)
|
||||
timerid = QDEL_IN_STOPPABLE(src, 7)
|
||||
|
||||
@@ -130,11 +130,6 @@
|
||||
/obj/item/udder/gutlunch
|
||||
name = "nutrient sac"
|
||||
|
||||
/obj/item/udder/gutlunch/Initialize(mapload)
|
||||
. = ..()
|
||||
reagents = new(50)
|
||||
reagents.my_atom = src
|
||||
|
||||
/obj/item/udder/gutlunch/generateMilk()
|
||||
if(prob(60))
|
||||
reagents.add_reagent(/datum/reagent/consumable/cream, rand(2, 5))
|
||||
|
||||
@@ -60,6 +60,12 @@
|
||||
blink.outer_tele_radius = 3
|
||||
AddSpell(blink)
|
||||
|
||||
/mob/living/simple_animal/hostile/wizard/Destroy()
|
||||
QDEL_NULL(fireball)
|
||||
QDEL_NULL(mm)
|
||||
QDEL_NULL(blink)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/wizard/handle_automated_action()
|
||||
. = ..()
|
||||
INVOKE_ASYNC(src, .proc/AutomatedCast)
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
remove_from_mob_list()
|
||||
remove_from_dead_mob_list()
|
||||
remove_from_alive_mob_list()
|
||||
QDEL_LIST(mob_spell_list)
|
||||
GLOB.all_clockwork_mobs -= src
|
||||
focus = null
|
||||
LAssailant = null
|
||||
@@ -40,6 +41,8 @@
|
||||
qdel(cc)
|
||||
client_colours = null
|
||||
ghostize()
|
||||
if(mind?.current == src) //Let's just be safe yeah? This will occasionally be cleared, but not always. Can't do it with ghostize without changing behavior
|
||||
mind.set_current(null)
|
||||
..()
|
||||
return QDEL_HINT_HARDDEL
|
||||
|
||||
|
||||
@@ -71,7 +71,6 @@
|
||||
for(var/H in all_components)
|
||||
var/obj/item/computer_hardware/CH = all_components[H]
|
||||
if(CH.holder == src)
|
||||
CH.on_remove(src)
|
||||
CH.holder = null
|
||||
all_components.Remove(CH.device_type)
|
||||
qdel(CH)
|
||||
|
||||
@@ -19,6 +19,11 @@
|
||||
set_frequency(signal_frequency)
|
||||
return ..()
|
||||
|
||||
/datum/computer_file/program/signaler/Destroy()
|
||||
SSradio.remove_object(src, signal_frequency)
|
||||
radio_connection = null
|
||||
return ..()
|
||||
|
||||
/datum/computer_file/program/signaler/ui_data(mob/user)
|
||||
var/list/data = get_header_data()
|
||||
data["frequency"] = signal_frequency
|
||||
|
||||
@@ -10,6 +10,10 @@
|
||||
var/obj/item/aicard/stored_card
|
||||
var/locked = FALSE
|
||||
|
||||
/obj/item/computer_hardware/ai_slot/Destroy()
|
||||
QDEL_NULL(stored_card)
|
||||
return ..()
|
||||
|
||||
///What happens when the intellicard is removed (or deleted) from the module, through try_eject() or not.
|
||||
/obj/item/computer_hardware/ai_slot/Exited(atom/movable/gone, direction)
|
||||
if(stored_card == gone)
|
||||
@@ -55,7 +59,7 @@
|
||||
if(Adjacent(user))
|
||||
user.put_in_hands(stored_card)
|
||||
else
|
||||
stored_card.forceMove(drop_location())
|
||||
stored_card.forceMove(get_turf(src))
|
||||
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
battery = new battery_type(src)
|
||||
|
||||
/obj/item/computer_hardware/battery/Destroy()
|
||||
battery = null
|
||||
QDEL_NULL(battery)
|
||||
return ..()
|
||||
|
||||
///What happens when the battery is removed (or deleted) from the module, through try_eject() or not.
|
||||
@@ -59,7 +59,7 @@
|
||||
user.put_in_hands(battery)
|
||||
to_chat(user, span_notice("You detach \the [battery] from \the [src]."))
|
||||
else
|
||||
battery.forceMove(drop_location())
|
||||
battery.forceMove(get_turf(src))
|
||||
return TRUE
|
||||
|
||||
/obj/item/stock_parts/cell/computer
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
if(user && !issilicon(user) && in_range(src, user))
|
||||
user.put_in_hands(stored_card)
|
||||
else
|
||||
stored_card.forceMove(drop_location())
|
||||
stored_card.forceMove(get_turf(src))
|
||||
|
||||
to_chat(user, span_notice("You remove the card from \the [src]."))
|
||||
playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE)
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
var/mod = CONFIG_GET(number/movedelay/walk_delay)
|
||||
multiplicative_slowdown = isnum(mod)? mod : initial(multiplicative_slowdown)
|
||||
|
||||
/datum/movespeed_modifier/config_wak_run/walk/apply_multiplicative(existing, mob/target)
|
||||
/datum/movespeed_modifier/config_walk_run/walk/apply_multiplicative(existing, mob/target)
|
||||
. = ..()
|
||||
if(HAS_TRAIT(target, TRAIT_SPEEDY_STEP))
|
||||
. -= 1.25
|
||||
|
||||
@@ -84,12 +84,14 @@
|
||||
cell.icon_state = "bscell"
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/Initialize(mapload)
|
||||
START_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
QDEL_NULL(spark_system)
|
||||
QDEL_NULL(cell)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
// Power usage
|
||||
/obj/item/clothing/suit/space/space_ninja/process(delta_time)
|
||||
|
||||
@@ -92,6 +92,8 @@
|
||||
|
||||
/obj/item/paper/contract/infernal/New(atom/loc, mob/living/nTarget, datum/mind/nOwner)
|
||||
..()
|
||||
if(!nOwner || !nTarget)
|
||||
return
|
||||
owner = nOwner
|
||||
devil_datum = owner.has_antag_datum(/datum/antagonist/devil)
|
||||
target = nTarget
|
||||
|
||||
@@ -80,6 +80,7 @@
|
||||
linked_turfs.Cut()
|
||||
mobs_in_pool.Cut()
|
||||
mist_off()
|
||||
QDEL_NULL(wires)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/pool/controller/proc/scan_things()
|
||||
|
||||
@@ -31,8 +31,9 @@
|
||||
|
||||
/obj/machinery/pool/drain/Destroy()
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
controller.linked_drain = null
|
||||
controller = null
|
||||
if(controller)
|
||||
controller.linked_drain = null
|
||||
controller = null
|
||||
whirling_mobs = null
|
||||
return ..()
|
||||
|
||||
@@ -129,8 +130,9 @@
|
||||
var/obj/machinery/pool/controller/controller
|
||||
|
||||
/obj/machinery/pool/filter/Destroy()
|
||||
controller.linked_filter = null
|
||||
controller = null
|
||||
if(controller)
|
||||
controller.linked_filter = null
|
||||
controller = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/pool/filter/emag_act(mob/living/user)
|
||||
|
||||
@@ -303,17 +303,18 @@
|
||||
|
||||
if(malfai && operating)
|
||||
malfai.malf_picker.processing_time = clamp(malfai.malf_picker.processing_time - 10,0,1000)
|
||||
area.power_light = FALSE
|
||||
area.power_equip = FALSE
|
||||
area.power_environ = FALSE
|
||||
area.power_change()
|
||||
area.poweralert(FALSE, src)
|
||||
if(area)
|
||||
area.power_light = FALSE
|
||||
area.power_equip = FALSE
|
||||
area.power_environ = FALSE
|
||||
area.power_change()
|
||||
area.poweralert(FALSE, src)
|
||||
if(occupier)
|
||||
malfvacate(1)
|
||||
qdel(wires)
|
||||
wires = null
|
||||
if(wires)
|
||||
QDEL_NULL(wires)
|
||||
if(cell)
|
||||
qdel(cell)
|
||||
QDEL_NULL(cell)
|
||||
if(terminal)
|
||||
disconnect_terminal()
|
||||
. = ..()
|
||||
|
||||
@@ -552,6 +552,11 @@ The reactor CHEWS through moderator. It does not do this slowly. Be very careful
|
||||
. = ..()
|
||||
addtimer(CALLBACK(src, .proc/link_to_reactor), 10 SECONDS)
|
||||
|
||||
/obj/machinery/computer/reactor/Destroy()
|
||||
reactor = null
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/machinery/computer/reactor/wrench_act(mob/living/user, obj/item/I)
|
||||
to_chat(user, "<span class='notice'>You start [anchored ? "un" : ""]securing [name]...</span>")
|
||||
if(I.use_tool(src, user, 40, volume=75))
|
||||
@@ -728,6 +733,11 @@ The reactor CHEWS through moderator. It does not do this slowly. Be very careful
|
||||
. = ..()
|
||||
radio_connection = SSradio.add_object(src, FREQ_RBMK_CONTROL,filter=RADIO_ATMOSIA)
|
||||
|
||||
/obj/machinery/computer/reactor/pump/Destroy()
|
||||
SSradio.remove_object(src, FREQ_RBMK_CONTROL)
|
||||
radio_connection = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/reactor/pump/proc/signal(power, set_output_pressure=null)
|
||||
var/datum/signal/signal
|
||||
if(!set_output_pressure) //Yes this is stupid, but technically if you pass through "set_output_pressure" onto the signal, it'll always try and set its output pressure and yeahhh...
|
||||
|
||||
@@ -13,12 +13,16 @@
|
||||
interaction_flags_machine = NONE
|
||||
light_range = 4
|
||||
layer = ABOVE_OBJ_LAYER
|
||||
var/obj/machinery/field/generator/FG1 = null
|
||||
var/obj/machinery/field/generator/FG2 = null
|
||||
var/obj/machinery/field/generator/field_gen_1 = null
|
||||
var/obj/machinery/field/generator/field_gen_2 = null
|
||||
|
||||
/obj/machinery/field/containment/Destroy()
|
||||
FG1.fields -= src
|
||||
FG2.fields -= src
|
||||
if(field_gen_1)
|
||||
field_gen_1.fields -= src
|
||||
field_gen_1 = null
|
||||
if(field_gen_2)
|
||||
field_gen_2.fields -= src
|
||||
field_gen_2 = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/field/containment/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
|
||||
@@ -46,12 +50,12 @@
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/field/containment/attack_animal(mob/living/simple_animal/M)
|
||||
if(!FG1 || !FG2)
|
||||
if(!field_gen_1 || !field_gen_2)
|
||||
qdel(src)
|
||||
return
|
||||
if(ismegafauna(M))
|
||||
M.visible_message("<span class='warning'>[M] glows fiercely as the containment field flickers out!</span>")
|
||||
FG1.calc_power(INFINITY) //rip that 'containment' field
|
||||
field_gen_1.calc_power(INFINITY) //rip that 'containment' field
|
||||
M.adjustHealth(-M.obj_damage)
|
||||
else
|
||||
..()
|
||||
@@ -68,12 +72,12 @@
|
||||
/obj/machinery/field/containment/proc/set_master(master1,master2)
|
||||
if(!master1 || !master2)
|
||||
return FALSE
|
||||
FG1 = master1
|
||||
FG2 = master2
|
||||
field_gen_1 = master1
|
||||
field_gen_2 = master2
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/field/containment/shock(mob/living/user)
|
||||
if(!FG1 || !FG2)
|
||||
if(!field_gen_1 || !field_gen_2)
|
||||
qdel(src)
|
||||
return FALSE
|
||||
..()
|
||||
|
||||
@@ -110,6 +110,7 @@
|
||||
log_game("Emitter deleted at [AREACOORD(T)]")
|
||||
investigate_log("<font color='red'>deleted</font> at [AREACOORD(T)]", INVESTIGATE_SINGULO)
|
||||
QDEL_NULL(sparks)
|
||||
QDEL_NULL(wires)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/power/emitter/update_icon_state()
|
||||
|
||||
@@ -28,6 +28,12 @@
|
||||
wires = new /datum/wires/tesla_coil(src)
|
||||
linked_techweb = SSresearch.science_tech
|
||||
|
||||
/obj/machinery/power/tesla_coil/Destroy()
|
||||
QDEL_NULL(wires)
|
||||
linked_techweb = null
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/machinery/power/tesla_coil/RefreshParts()
|
||||
var/power_multiplier = 0
|
||||
zap_cooldown = 100
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
projectile_type = /obj/item/projectile/beam/wormhole
|
||||
e_cost = 0
|
||||
fire_sound = 'sound/weapons/pulse3.ogg'
|
||||
var/obj/item/gun/energy/wormhole_projector/gun = null
|
||||
select_name = "blue"
|
||||
var/datum/weakref/gun
|
||||
|
||||
/obj/item/ammo_casing/energy/wormhole/orange
|
||||
projectile_type = /obj/item/projectile/beam/wormhole/orange
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
/obj/item/ammo_casing/energy/wormhole/Initialize(mapload, obj/item/gun/energy/wormhole_projector/wh)
|
||||
. = ..()
|
||||
gun = wh
|
||||
gun = WEAKREF(wh)
|
||||
|
||||
/obj/item/ammo_casing/energy/wormhole/throw_proj()
|
||||
. = ..()
|
||||
|
||||
@@ -150,7 +150,7 @@
|
||||
AddComponent(/datum/component/automatic_fire, fire_delay)
|
||||
|
||||
/obj/item/gun/Destroy()
|
||||
if(pin)
|
||||
if(isobj(pin))
|
||||
QDEL_NULL(pin)
|
||||
if(gun_light)
|
||||
QDEL_NULL(gun_light)
|
||||
@@ -162,6 +162,8 @@
|
||||
QDEL_NULL(azoom)
|
||||
if(firemode_action)
|
||||
QDEL_NULL(firemode_action)
|
||||
if(isatom(suppressed))
|
||||
QDEL_NULL(suppressed)
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/examine(mob/user)
|
||||
|
||||
@@ -49,9 +49,9 @@
|
||||
/obj/item/gun/ballistic/automatic/pistol/modular/update_overlays()
|
||||
. = ..()
|
||||
if(magazine && suppressed)
|
||||
. += "[unique_reskin[current_skin]["icon_state"]]-magazine-sup" //Yes, this means the default iconstate can't have a magazine overlay
|
||||
. += "[current_skin ? unique_reskin[current_skin]["icon_state"] : initial(icon_state)]-magazine-sup" //Yes, this means the default iconstate can't have a magazine overlay
|
||||
else if (magazine)
|
||||
. += "[unique_reskin[current_skin]["icon_state"]]-magazine"
|
||||
. += "[current_skin ? unique_reskin[current_skin]["icon_state"] : initial(icon_state)]-magazine"
|
||||
|
||||
/obj/item/gun/ballistic/automatic/pistol/m1911
|
||||
name = "\improper M1911"
|
||||
|
||||
@@ -69,6 +69,8 @@
|
||||
AddElement(/datum/element/update_icon_updates_onmob)
|
||||
|
||||
/obj/item/gun/energy/Destroy()
|
||||
if(cell)
|
||||
QDEL_NULL(cell)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -23,6 +23,9 @@
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
|
||||
/obj/item/minigunpack/Destroy()
|
||||
if(!QDELETED(gun))
|
||||
qdel(gun)
|
||||
gun = null
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
return ..()
|
||||
|
||||
@@ -120,6 +123,12 @@
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/energy/minigun/Destroy()
|
||||
if(!QDELETED(ammo_pack))
|
||||
qdel(ammo_pack)
|
||||
ammo_pack = null
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/energy/minigun/attack_self(mob/living/user)
|
||||
return
|
||||
|
||||
|
||||
@@ -243,10 +243,10 @@
|
||||
for(var/i in 1 to ammo_type.len)
|
||||
var/obj/item/ammo_casing/energy/wormhole/W = ammo_type[i]
|
||||
if(istype(W))
|
||||
W.gun = src
|
||||
W.gun = WEAKREF(src)
|
||||
var/obj/item/projectile/beam/wormhole/WH = W.BB
|
||||
if(istype(WH))
|
||||
WH.gun = src
|
||||
WH.gun = WEAKREF(src)
|
||||
|
||||
/obj/item/gun/energy/wormhole_projector/process_chamber()
|
||||
..()
|
||||
|
||||
@@ -52,7 +52,8 @@
|
||||
/obj/item/gun/magic/Initialize(mapload)
|
||||
. = ..()
|
||||
charges = max_charges
|
||||
chambered = new ammo_type(src)
|
||||
if(ammo_type)
|
||||
chambered = new ammo_type(src)
|
||||
if(can_charge)
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
|
||||
@@ -27,6 +27,10 @@
|
||||
. = ..()
|
||||
judgementcut = new(src)
|
||||
|
||||
/obj/item/gun/magic/staff/motivation/Destroy()
|
||||
QDEL_NULL(judgementcut)
|
||||
. = ..()
|
||||
|
||||
//lets the user know that their judgement cuts are recharging
|
||||
/obj/item/gun/magic/staff/motivation/shoot_with_empty_chamber(mob/living/user as mob|obj)
|
||||
to_chat(user, "<span class='warning'>Judgement Cut is recharging.</span>")
|
||||
|
||||
@@ -507,8 +507,8 @@
|
||||
duration = 0
|
||||
. = ..()
|
||||
if(!generation) //first one
|
||||
QDEL_LIST(gun.current_tracers)
|
||||
gun.current_tracers += .
|
||||
QDEL_LIST(gun?.current_tracers)
|
||||
gun?.current_tracers += .
|
||||
|
||||
/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam
|
||||
tracer_type = /obj/effect/projectile/tracer/tracer/aiming
|
||||
|
||||
@@ -20,6 +20,10 @@
|
||||
handedness = prob(50)
|
||||
icon_state = "cursehand[handedness]"
|
||||
|
||||
/obj/item/projectile/curse_hand/Destroy()
|
||||
QDEL_NULL(arm)
|
||||
. = ..()
|
||||
|
||||
/obj/item/projectile/curse_hand/update_icon_state()
|
||||
icon_state = "[initial(icon_state)][handedness]"
|
||||
|
||||
@@ -43,9 +47,10 @@
|
||||
for(var/obj/effect/temp_visual/dir_setting/curse/grasp_portal/G in starting)
|
||||
qdel(G)
|
||||
new /obj/effect/temp_visual/dir_setting/curse/grasp_portal/fading(starting, dir)
|
||||
var/datum/beam/D = starting.Beam(T, icon_state = "curse[handedness]", time = 32, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm, beam_sleep_time = 1)
|
||||
for(var/b in D.elements)
|
||||
var/obj/effect/ebeam/B = b
|
||||
animate(B, alpha = 0, time = 32)
|
||||
var/datum/beam/D = starting?.Beam(T, icon_state = "curse[handedness]", time = 32, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm, beam_sleep_time = 1)
|
||||
if(D)
|
||||
for(var/b in D.elements)
|
||||
var/obj/effect/ebeam/B = b
|
||||
animate(B, alpha = 0, time = 32)
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
. = ..()
|
||||
var/obj/item/ammo_casing/energy/gravity/G = loc
|
||||
if(istype(G))
|
||||
power = min(G.gun.power, 15)
|
||||
power = min(G.gun?.power, 15)
|
||||
|
||||
/obj/item/projectile/gravity/on_hit()
|
||||
. = ..()
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
hal_target.client.images += fake_icon
|
||||
|
||||
/obj/item/projectile/hallucination/Destroy()
|
||||
if(hal_target.client)
|
||||
if(hal_target?.client)
|
||||
hal_target.client.images -= fake_icon
|
||||
QDEL_NULL(fake_icon)
|
||||
return ..()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user