diff --git a/code/datums/beam.dm b/code/datums/beam.dm
index 3276a5f5b9..252a305af2 100644
--- a/code/datums/beam.dm
+++ b/code/datums/beam.dm
@@ -149,6 +149,11 @@
owner = null
return ..()
+/obj/effect/ebeam/singularity_pull()
+ return
+/obj/effect/ebeam/singularity_act()
+ return
+
/atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=50, maxdistance=10,beam_type=/obj/effect/ebeam,beam_sleep_time = 3)
var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type,beam_sleep_time)
INVOKE_ASYNC(newbeam, /datum/beam/.proc/Start)
diff --git a/code/game/gamemodes/clock_cult/clock_effects/city_of_cogs_rift.dm b/code/game/gamemodes/clock_cult/clock_effects/city_of_cogs_rift.dm
index e41acb421a..ab47f1af55 100644
--- a/code/game/gamemodes/clock_cult/clock_effects/city_of_cogs_rift.dm
+++ b/code/game/gamemodes/clock_cult/clock_effects/city_of_cogs_rift.dm
@@ -10,6 +10,13 @@
light_power = 3
light_color = "#6A4D2F"
+
+/obj/effect/clockwork/city_of_cogs_rift/singularity_act()
+ return
+
+/obj/effect/clockwork/city_of_cogs_rift/singularity_pull()
+ return
+
/obj/effect/clockwork/city_of_cogs_rift/Initialize()
. = ..()
visible_message("The air above [loc] shimmers and pops as a [name] forms there!")
diff --git a/code/game/gamemodes/clock_cult/clock_effects/clock_overlay.dm b/code/game/gamemodes/clock_cult/clock_effects/clock_overlay.dm
index e8cba1a39d..f3de8d04a8 100644
--- a/code/game/gamemodes/clock_cult/clock_effects/clock_overlay.dm
+++ b/code/game/gamemodes/clock_cult/clock_effects/clock_overlay.dm
@@ -10,6 +10,11 @@
/obj/effect/clockwork/overlay/ex_act()
return FALSE
+/obj/effect/clockwork/overlay/singularity_act()
+ return
+/obj/effect/clockwork/overlay/singularity_pull()
+ return
+
/obj/effect/clockwork/overlay/singularity_pull(S, current_size)
return
diff --git a/code/game/gamemodes/clock_cult/clock_effects/general_markers.dm b/code/game/gamemodes/clock_cult/clock_effects/general_markers.dm
index a3465fac05..6e6704a68c 100644
--- a/code/game/gamemodes/clock_cult/clock_effects/general_markers.dm
+++ b/code/game/gamemodes/clock_cult/clock_effects/general_markers.dm
@@ -11,6 +11,12 @@
animate(src, alpha = 0, time = 10)
QDEL_IN(src, 10)
+/obj/effect/clockwork/general_marker/singularity_act()
+ return
+
+/obj/effect/clockwork/general_marker/singularity_pull()
+ return
+
/obj/effect/clockwork/general_marker/inathneq
name = "Inath-neq, the Resonant Cogwheel"
desc = "A humanoid form blazing with blue fire. It radiates an aura of kindness and caring."
diff --git a/code/game/gamemodes/clock_cult/clock_effects/servant_blocker.dm b/code/game/gamemodes/clock_cult/clock_effects/servant_blocker.dm
index 988c00b2f5..194747cefc 100644
--- a/code/game/gamemodes/clock_cult/clock_effects/servant_blocker.dm
+++ b/code/game/gamemodes/clock_cult/clock_effects/servant_blocker.dm
@@ -18,3 +18,9 @@
to_chat(L, "The space beyond here can't be accessed by you or other servants.")
return
return TRUE
+
+/obj/effect/clockwork/servant_blocker/singularity_act()
+ return
+
+/obj/effect/clockwork/servant_blocker/singularity_pull()
+ return
diff --git a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm
index cbfe5d043c..50076e0919 100644
--- a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm
+++ b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm
@@ -109,6 +109,14 @@
return TRUE
return FALSE
+
+/obj/effect/clockwork/spatial_gateway/singularity_act()
+ return
+
+/obj/effect/clockwork/spatial_gateway/singularity_pull()
+ return
+
+
/obj/effect/clockwork/spatial_gateway/CollidedWith(atom/movable/AM)
..()
if(!QDELETED(AM))
diff --git a/code/game/gamemodes/clock_cult/clock_items/judicial_visor.dm b/code/game/gamemodes/clock_cult/clock_items/judicial_visor.dm
index 51ffdd9e10..4f6485310b 100644
--- a/code/game/gamemodes/clock_cult/clock_items/judicial_visor.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/judicial_visor.dm
@@ -162,6 +162,12 @@
user = caster
INVOKE_ASYNC(src, .proc/judicialblast)
+/obj/effect/clockwork/judicial_marker/singularity_act()
+ return
+
+/obj/effect/clockwork/judicial_marker/singularity_pull()
+ return
+
/obj/effect/clockwork/judicial_marker/proc/judicialblast()
playsound(src, 'sound/magic/magic_missile.ogg', 50, 1, 1, 1)
flick("judicial_marker", src)
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index 2dcaf23bc6..440dfaede6 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -240,3 +240,9 @@
icon_state = "hole"
density = TRUE
anchored = TRUE
+
+/obj/effect/gateway/singularity_act()
+ return
+
+/obj/effect/gateway/singularity_pull()
+ return
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index 3007ec51ba..cd50f52d5f 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -66,6 +66,12 @@
else
return ..()
+/obj/effect/rend/singularity_pull()
+ return
+
+/obj/effect/rend/singularity_pull()
+ return
+
/obj/item/veilrender/vealrender
name = "veal render"
desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast farm."
diff --git a/code/game/objects/effects/bump_teleporter.dm b/code/game/objects/effects/bump_teleporter.dm
index 5ba643e943..8eb4c986de 100644
--- a/code/game/objects/effects/bump_teleporter.dm
+++ b/code/game/objects/effects/bump_teleporter.dm
@@ -1,30 +1,36 @@
-/obj/effect/bump_teleporter
- name = "bump-teleporter"
- icon = 'icons/mob/screen_gen.dmi'
- icon_state = "x2"
- var/id = null //id of this bump_teleporter.
- var/id_target = null //id of bump_teleporter which this moves you to.
- invisibility = INVISIBILITY_ABSTRACT //nope, can't see this
+/obj/effect/bump_teleporter
+ name = "bump-teleporter"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "x2"
+ var/id = null //id of this bump_teleporter.
+ var/id_target = null //id of bump_teleporter which this moves you to.
+ invisibility = INVISIBILITY_ABSTRACT //nope, can't see this
anchored = TRUE
density = TRUE
- opacity = 0
-
- var/static/list/AllTeleporters
-
-/obj/effect/bump_teleporter/New()
- ..()
- LAZYADD(AllTeleporters, src)
-
-/obj/effect/bump_teleporter/Destroy()
- LAZYREMOVE(AllTeleporters, src)
- return ..()
-
+ opacity = 0
+
+ var/static/list/AllTeleporters
+
+/obj/effect/bump_teleporter/New()
+ ..()
+ LAZYADD(AllTeleporters, src)
+
+/obj/effect/bump_teleporter/Destroy()
+ LAZYREMOVE(AllTeleporters, src)
+ return ..()
+
+/obj/effect/bump_teleporter/singularity_act()
+ return
+
+/obj/effect/bump_teleporter/singularity_pull()
+ return
+
/obj/effect/bump_teleporter/CollidedWith(atom/movable/AM)
if(!ismob(AM))
- return
- if(!id_target)
- return
-
- for(var/obj/effect/bump_teleporter/BT in AllTeleporters)
- if(BT.id == src.id_target)
+ return
+ if(!id_target)
+ return
+
+ for(var/obj/effect/bump_teleporter/BT in AllTeleporters)
+ if(BT.id == src.id_target)
AM.forceMove(BT.loc) //Teleport to location with correct id.
diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm
index f4b67b7df2..8448e2a7e7 100644
--- a/code/game/objects/effects/countdown.dm
+++ b/code/game/objects/effects/countdown.dm
@@ -154,3 +154,9 @@
else
var/time_left = max(0, (A.death_time - world.time) / 10)
return round(time_left)
+
+/obj/effect/countdown/singularity_pull()
+ return
+
+/obj/effect/countdown/singularity_act()
+ return
diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm
index d5f8e28d2a..2b456b2ed7 100644
--- a/code/game/objects/effects/effects.dm
+++ b/code/game/objects/effects/effects.dm
@@ -56,3 +56,9 @@
/obj/effect/abstract/singularity_act()
return
+
+/obj/effect/dummy/singularity_pull()
+ return
+
+/obj/effect/dummy/singularity_act()
+ return
diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm
index 024fb4b4ea..edf7b4f519 100644
--- a/code/game/objects/effects/forcefields.dm
+++ b/code/game/objects/effects/forcefields.dm
@@ -7,6 +7,9 @@
density = TRUE
CanAtmosPass = ATMOS_PASS_DENSITY
+/obj/effect/forcefield/singularity_pull()
+ return
+
/obj/effect/forcefield/cult
desc = "An unholy shield that blocks all attacks."
name = "glowing wall"
diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm
index cadee92161..d7d36acde1 100644
--- a/code/game/objects/effects/misc.dm
+++ b/code/game/objects/effects/misc.dm
@@ -12,6 +12,12 @@
var/def_zone
pass_flags = PASSTABLE
+/obj/effect/beam/singularity_act()
+ return
+
+/obj/effect/beam/singularity_pull()
+ return
+
/obj/effect/spawner
name = "object spawner"
diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm
index f932ec9830..427e9eefe2 100644
--- a/code/game/objects/effects/portals.dm
+++ b/code/game/objects/effects/portals.dm
@@ -75,6 +75,12 @@
if(isturf(hard_target_override))
hard_target = hard_target_override
+/obj/effect/portal/singularity_pull()
+ return
+
+/obj/effect/portal/singularity_act()
+ return
+
/obj/effect/portal/proc/link_portal(obj/effect/portal/newlink)
linked = newlink
if(atmos_link)
diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm
index 93faacbf68..bfed048eff 100644
--- a/code/game/objects/effects/step_triggers.dm
+++ b/code/game/objects/effects/step_triggers.dm
@@ -1,194 +1,201 @@
-/* Simple object type, calls a proc when "stepped" on by something */
-
-/obj/effect/step_trigger
- var/affect_ghosts = 0
- var/stopper = 1 // stops throwers
- var/mobs_only = FALSE
- invisibility = INVISIBILITY_ABSTRACT // nope cant see this shit
+/* Simple object type, calls a proc when "stepped" on by something */
+
+/obj/effect/step_trigger
+ var/affect_ghosts = 0
+ var/stopper = 1 // stops throwers
+ var/mobs_only = FALSE
+ invisibility = INVISIBILITY_ABSTRACT // nope cant see this shit
anchored = TRUE
-
-/obj/effect/step_trigger/proc/Trigger(atom/movable/A)
- return 0
-
-/obj/effect/step_trigger/Crossed(H as mob|obj)
- ..()
- if(!H)
- return
- if(isobserver(H) && !affect_ghosts)
- return
- if(!ismob(H) && mobs_only)
- return
- Trigger(H)
-
-/* Sends a message to mob when triggered*/
-
-/obj/effect/step_trigger/message
- var/message //the message to give to the mob
- var/once = 1
- mobs_only = TRUE
-
-/obj/effect/step_trigger/message/Trigger(mob/M)
- if(M.client)
- to_chat(M, "[message]")
- if(once)
- qdel(src)
-
-/* Tosses things in a certain direction */
-
-/obj/effect/step_trigger/thrower
- var/direction = SOUTH // the direction of throw
- var/tiles = 3 // if 0: forever until atom hits a stopper
- var/immobilize = 1 // if nonzero: prevents mobs from moving while they're being flung
- var/speed = 1 // delay of movement
- var/facedir = 0 // if 1: atom faces the direction of movement
- var/nostop = 0 // if 1: will only be stopped by teleporters
- var/list/affecting = list()
-
-/obj/effect/step_trigger/thrower/Trigger(atom/A)
- if(!A || !ismovableatom(A))
- return
- var/atom/movable/AM = A
- var/curtiles = 0
- var/stopthrow = 0
- for(var/obj/effect/step_trigger/thrower/T in orange(2, src))
- if(AM in T.affecting)
- return
-
- if(ismob(AM))
- var/mob/M = AM
- if(immobilize)
- M.canmove = 0
-
- affecting.Add(AM)
- while(AM && !stopthrow)
- if(tiles)
- if(curtiles >= tiles)
- break
- if(AM.z != src.z)
- break
-
- curtiles++
-
- sleep(speed)
-
- // Calculate if we should stop the process
- if(!nostop)
- for(var/obj/effect/step_trigger/T in get_step(AM, direction))
- if(T.stopper && T != src)
- stopthrow = 1
- else
- for(var/obj/effect/step_trigger/teleporter/T in get_step(AM, direction))
- if(T.stopper)
- stopthrow = 1
-
- if(AM)
- var/predir = AM.dir
- step(AM, direction)
- if(!facedir)
- AM.setDir(predir)
-
-
-
- affecting.Remove(AM)
-
- if(ismob(AM))
- var/mob/M = AM
- if(immobilize)
- M.canmove = 1
-
-/* Stops things thrown by a thrower, doesn't do anything */
-
-/obj/effect/step_trigger/stopper
-
-/* Instant teleporter */
-
-/obj/effect/step_trigger/teleporter
- var/teleport_x = 0 // teleportation coordinates (if one is null, then no teleport!)
- var/teleport_y = 0
- var/teleport_z = 0
-
-/obj/effect/step_trigger/teleporter/Trigger(atom/movable/A)
- if(teleport_x && teleport_y && teleport_z)
-
- A.x = teleport_x
- A.y = teleport_y
- A.z = teleport_z
-
-/* Random teleporter, teleports atoms to locations ranging from teleport_x - teleport_x_offset, etc */
-
-/obj/effect/step_trigger/teleporter/random
- var/teleport_x_offset = 0
- var/teleport_y_offset = 0
- var/teleport_z_offset = 0
-
-/obj/effect/step_trigger/teleporter/random/Trigger(atom/movable/A)
- if(teleport_x && teleport_y && teleport_z)
- if(teleport_x_offset && teleport_y_offset && teleport_z_offset)
-
- A.x = rand(teleport_x, teleport_x_offset)
- A.y = rand(teleport_y, teleport_y_offset)
- A.z = rand(teleport_z, teleport_z_offset)
-
-/* Fancy teleporter, creates sparks and smokes when used */
-
-/obj/effect/step_trigger/teleport_fancy
- var/locationx
- var/locationy
- var/uses = 1 //0 for infinite uses
- var/entersparks = 0
- var/exitsparks = 0
- var/entersmoke = 0
- var/exitsmoke = 0
-
-/obj/effect/step_trigger/teleport_fancy/Trigger(mob/M)
- var/dest = locate(locationx, locationy, z)
- M.Move(dest)
-
- if(entersparks)
- var/datum/effect_system/spark_spread/s = new
- s.set_up(4, 1, src)
- s.start()
- if(exitsparks)
- var/datum/effect_system/spark_spread/s = new
- s.set_up(4, 1, dest)
- s.start()
-
- if(entersmoke)
- var/datum/effect_system/smoke_spread/s = new
- s.set_up(4, 1, src, 0)
- s.start()
- if(exitsmoke)
- var/datum/effect_system/smoke_spread/s = new
- s.set_up(4, 1, dest, 0)
- s.start()
-
- uses--
- if(uses == 0)
- qdel(src)
-
-/* Simple sound player, Mapper friendly! */
-
-/obj/effect/step_trigger/sound_effect
- var/sound //eg. path to the sound, inside '' eg: 'growl.ogg'
- var/volume = 100
- var/freq_vary = 1 //Should the frequency of the sound vary?
- var/extra_range = 0 // eg World.view = 7, extra_range = 1, 7+1 = 8, 8 turfs radius
- var/happens_once = 0
- var/triggerer_only = 0 //Whether the triggerer is the only person who hears this
-
-
-/obj/effect/step_trigger/sound_effect/Trigger(atom/movable/A)
- var/turf/T = get_turf(A)
-
- if(!T)
- return
-
- if(triggerer_only && ismob(A))
- var/mob/B = A
- B.playsound_local(T, sound, volume, freq_vary)
- else
- playsound(T, sound, volume, freq_vary, extra_range)
-
- if(happens_once)
- qdel(src)
-
+
+/obj/effect/step_trigger/proc/Trigger(atom/movable/A)
+ return 0
+
+/obj/effect/step_trigger/Crossed(H as mob|obj)
+ ..()
+ if(!H)
+ return
+ if(isobserver(H) && !affect_ghosts)
+ return
+ if(!ismob(H) && mobs_only)
+ return
+ Trigger(H)
+
+
+/obj/effect/step_trigger/singularity_act()
+ return
+
+/obj/effect/step_trigger/singularity_pull()
+ return
+
+/* Sends a message to mob when triggered*/
+
+/obj/effect/step_trigger/message
+ var/message //the message to give to the mob
+ var/once = 1
+ mobs_only = TRUE
+
+/obj/effect/step_trigger/message/Trigger(mob/M)
+ if(M.client)
+ to_chat(M, "[message]")
+ if(once)
+ qdel(src)
+
+/* Tosses things in a certain direction */
+
+/obj/effect/step_trigger/thrower
+ var/direction = SOUTH // the direction of throw
+ var/tiles = 3 // if 0: forever until atom hits a stopper
+ var/immobilize = 1 // if nonzero: prevents mobs from moving while they're being flung
+ var/speed = 1 // delay of movement
+ var/facedir = 0 // if 1: atom faces the direction of movement
+ var/nostop = 0 // if 1: will only be stopped by teleporters
+ var/list/affecting = list()
+
+/obj/effect/step_trigger/thrower/Trigger(atom/A)
+ if(!A || !ismovableatom(A))
+ return
+ var/atom/movable/AM = A
+ var/curtiles = 0
+ var/stopthrow = 0
+ for(var/obj/effect/step_trigger/thrower/T in orange(2, src))
+ if(AM in T.affecting)
+ return
+
+ if(ismob(AM))
+ var/mob/M = AM
+ if(immobilize)
+ M.canmove = 0
+
+ affecting.Add(AM)
+ while(AM && !stopthrow)
+ if(tiles)
+ if(curtiles >= tiles)
+ break
+ if(AM.z != src.z)
+ break
+
+ curtiles++
+
+ sleep(speed)
+
+ // Calculate if we should stop the process
+ if(!nostop)
+ for(var/obj/effect/step_trigger/T in get_step(AM, direction))
+ if(T.stopper && T != src)
+ stopthrow = 1
+ else
+ for(var/obj/effect/step_trigger/teleporter/T in get_step(AM, direction))
+ if(T.stopper)
+ stopthrow = 1
+
+ if(AM)
+ var/predir = AM.dir
+ step(AM, direction)
+ if(!facedir)
+ AM.setDir(predir)
+
+
+
+ affecting.Remove(AM)
+
+ if(ismob(AM))
+ var/mob/M = AM
+ if(immobilize)
+ M.canmove = 1
+
+/* Stops things thrown by a thrower, doesn't do anything */
+
+/obj/effect/step_trigger/stopper
+
+/* Instant teleporter */
+
+/obj/effect/step_trigger/teleporter
+ var/teleport_x = 0 // teleportation coordinates (if one is null, then no teleport!)
+ var/teleport_y = 0
+ var/teleport_z = 0
+
+/obj/effect/step_trigger/teleporter/Trigger(atom/movable/A)
+ if(teleport_x && teleport_y && teleport_z)
+
+ A.x = teleport_x
+ A.y = teleport_y
+ A.z = teleport_z
+
+/* Random teleporter, teleports atoms to locations ranging from teleport_x - teleport_x_offset, etc */
+
+/obj/effect/step_trigger/teleporter/random
+ var/teleport_x_offset = 0
+ var/teleport_y_offset = 0
+ var/teleport_z_offset = 0
+
+/obj/effect/step_trigger/teleporter/random/Trigger(atom/movable/A)
+ if(teleport_x && teleport_y && teleport_z)
+ if(teleport_x_offset && teleport_y_offset && teleport_z_offset)
+
+ A.x = rand(teleport_x, teleport_x_offset)
+ A.y = rand(teleport_y, teleport_y_offset)
+ A.z = rand(teleport_z, teleport_z_offset)
+
+/* Fancy teleporter, creates sparks and smokes when used */
+
+/obj/effect/step_trigger/teleport_fancy
+ var/locationx
+ var/locationy
+ var/uses = 1 //0 for infinite uses
+ var/entersparks = 0
+ var/exitsparks = 0
+ var/entersmoke = 0
+ var/exitsmoke = 0
+
+/obj/effect/step_trigger/teleport_fancy/Trigger(mob/M)
+ var/dest = locate(locationx, locationy, z)
+ M.Move(dest)
+
+ if(entersparks)
+ var/datum/effect_system/spark_spread/s = new
+ s.set_up(4, 1, src)
+ s.start()
+ if(exitsparks)
+ var/datum/effect_system/spark_spread/s = new
+ s.set_up(4, 1, dest)
+ s.start()
+
+ if(entersmoke)
+ var/datum/effect_system/smoke_spread/s = new
+ s.set_up(4, 1, src, 0)
+ s.start()
+ if(exitsmoke)
+ var/datum/effect_system/smoke_spread/s = new
+ s.set_up(4, 1, dest, 0)
+ s.start()
+
+ uses--
+ if(uses == 0)
+ qdel(src)
+
+/* Simple sound player, Mapper friendly! */
+
+/obj/effect/step_trigger/sound_effect
+ var/sound //eg. path to the sound, inside '' eg: 'growl.ogg'
+ var/volume = 100
+ var/freq_vary = 1 //Should the frequency of the sound vary?
+ var/extra_range = 0 // eg World.view = 7, extra_range = 1, 7+1 = 8, 8 turfs radius
+ var/happens_once = 0
+ var/triggerer_only = 0 //Whether the triggerer is the only person who hears this
+
+
+/obj/effect/step_trigger/sound_effect/Trigger(atom/movable/A)
+ var/turf/T = get_turf(A)
+
+ if(!T)
+ return
+
+ if(triggerer_only && ismob(A))
+ var/mob/B = A
+ B.playsound_local(T, sound, volume, freq_vary)
+ else
+ playsound(T, sound, volume, freq_vary, extra_range)
+
+ if(happens_once)
+ qdel(src)
+
diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm
index 6f1ab39013..d65ef6fc2a 100644
--- a/code/game/objects/items/chrono_eraser.dm
+++ b/code/game/objects/items/chrono_eraser.dm
@@ -252,6 +252,9 @@
/obj/effect/chrono_field/singularity_act()
return
+/obj/effect/chrono_field/singularity_pull()
+ return
+
/obj/effect/chrono_field/ex_act()
return
diff --git a/code/modules/admin/sound_emitter.dm b/code/modules/admin/sound_emitter.dm
index 129c6c92c8..b7ec8c36b5 100644
--- a/code/modules/admin/sound_emitter.dm
+++ b/code/modules/admin/sound_emitter.dm
@@ -30,6 +30,9 @@
/obj/effect/sound_emitter/singularity_act()
return
+/obj/effect/sound_emitter/singularity_pull()
+ return
+
/obj/effect/sound_emitter/examine(mob/user)
..()
if(!isobserver(user))
diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm
index ca234308d8..d0c0979366 100644
--- a/code/modules/atmospherics/environmental/LINDA_fire.dm
+++ b/code/modules/atmospherics/environmental/LINDA_fire.dm
@@ -179,6 +179,9 @@
var/mob/living/L = AM
L.fire_act(temperature, volume)
+/obj/effect/hotspot/singularity_pull()
+ return
+
/obj/effect/dummy/fire
name = "fire"
desc = "OWWWWWW. IT BURNS. Tell a coder if you're seeing this."
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index c5a4f3a58a..a2b5a864c4 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -252,6 +252,12 @@
var/obj/screen/chronos_target/target_ui = null
var/obj/item/clothing/suit/space/chronos/chronosuit
+/obj/effect/chronos_cam/singularity_act()
+ return
+
+/obj/effect/chronos_cam/singularity_pull()
+ return
+
/obj/effect/chronos_cam/proc/create_target_ui()
if(holder && holder.client && chronosuit)
if(target_ui)
diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm
index 3b0cb1921a..b933e566be 100644
--- a/code/modules/events/immovable_rod.dm
+++ b/code/modules/events/immovable_rod.dm
@@ -68,6 +68,12 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
/obj/effect/immovablerod/ex_act(severity, target)
return 0
+/obj/effect/immovablerod/singularity_act()
+ return
+
+/obj/effect/immovablerod/singularity_pull()
+ return
+
/obj/effect/immovablerod/Collide(atom/clong)
if(prob(10))
playsound(src, 'sound/effects/bang.ogg', 50, 1)
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 749b98c09a..866b763fe6 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -98,6 +98,12 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
var/image_layer = MOB_LAYER
var/active = TRUE //qdelery
+/obj/effect/hallucination/singularity_pull()
+ return
+
+/obj/effect/hallucination/singularity_act()
+ return
+
/obj/effect/hallucination/simple/Initialize(mapload, var/mob/living/carbon/T)
. = ..()
target = T
diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm
index ecbd8a4135..743e84aca4 100644
--- a/code/modules/mining/fulton.dm
+++ b/code/modules/mining/fulton.dm
@@ -183,3 +183,9 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons)
if(L.stat != DEAD)
return 1
return 0
+
+/obj/effect/extraction_holder/singularity_pull()
+ return
+
+/obj/effect/extraction_holder/singularity_pull()
+ return
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index d7fca5c84f..18eb52c8f8 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -366,7 +366,7 @@
return
/obj/effect/immortality_talisman/singularity_pull()
- return 0
+ return
/obj/effect/immortality_talisman/Destroy(force)
if(!can_destroy && !force)
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 9625a47cf8..8d36922bdf 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -12,6 +12,12 @@
..()
set_light(set_luminosity, set_cap)
+/obj/effect/light_emitter/singularity_pull()
+ return
+
+/obj/effect/light_emitter/singularity_act()
+ return
+
/**********************Miner Lockers**************************/
/obj/structure/closet/wardrobe/miner
diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
index e3792d40ba..ccec94bea8 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
@@ -117,3 +117,9 @@
var/list/guardians = spawner.summoner.hasparasites()
for(var/para in guardians)
to_chat(para, "[AM] has crossed surveillance snare, [name].")
+
+/obj/effect/snare/singularity_act()
+ return
+
+/obj/effect/snare/singularity_pull()
+ return
diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm
index f04c61426b..2756d879d1 100644
--- a/code/modules/power/singularity/particle_accelerator/particle.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle.dm
@@ -51,6 +51,9 @@
/obj/effect/accelerated_particle/ex_act(severity, target)
qdel(src)
+/obj/effect/accelerated_particle/singularity_pull()
+ return
+
/obj/effect/accelerated_particle/proc/toxmob(mob/living/M)
M.rad_act(energy*6)
diff --git a/code/modules/projectiles/guns/beam_rifle.dm b/code/modules/projectiles/guns/beam_rifle.dm
index f2d99bc849..a88e271056 100644
--- a/code/modules/projectiles/guns/beam_rifle.dm
+++ b/code/modules/projectiles/guns/beam_rifle.dm
@@ -772,3 +772,9 @@
icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "zoom_mode"
background_icon_state = "bg_tech"
+
+/obj/effect/projectile_beam/singularity_pull()
+ return
+
+/obj/effect/projectile_beam/singularity_act()
+ return
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index 4bf6ea43b1..d19079d563 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -86,6 +86,12 @@
qdel(src)
+/obj/effect/nettingportal/singularity_act()
+ return
+
+/obj/effect/nettingportal/singularity_pull()
+ return
+
/obj/item/projectile/energy/trap
name = "energy snare"
diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm
index e8d65cae9f..85956b0c6d 100644
--- a/code/modules/spells/spell.dm
+++ b/code/modules/spells/spell.dm
@@ -38,6 +38,12 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
remove_ranged_ability()
return ..()
+/obj/effect/proc_holder/singularity_act()
+ return
+
+/obj/effect/proc_holder/singularity_pull()
+ return
+
/obj/effect/proc_holder/proc/InterceptClickOn(mob/living/caller, params, atom/A)
if(caller.ranged_ability != src || ranged_ability_user != caller) //I'm not actually sure how these would trigger, but, uh, safety, I guess?
to_chat(caller, "[caller.ranged_ability.name] has been disabled.")
diff --git a/code/modules/spells/spell_types/spacetime_distortion.dm b/code/modules/spells/spell_types/spacetime_distortion.dm
index 25b170745f..ed6abe1410 100644
--- a/code/modules/spells/spell_types/spacetime_distortion.dm
+++ b/code/modules/spells/spell_types/spacetime_distortion.dm
@@ -73,6 +73,12 @@
var/sound
var/walks_left = 50 //prevents the game from hanging in extreme cases (such as minigun fire)
+/obj/effect/cross_action/singularity_act()
+ return
+
+/obj/effect/cross_action/singularity_pull()
+ return
+
/obj/effect/cross_action/spacetime_dist/Initialize(mapload)
. = ..()
sound = "sound/guitar/[safepick(GLOB.guitar_notes)]"