diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm
index 5e44dcf20cc..00fddd5b1f0 100644
--- a/code/LINDA/LINDA_fire.dm
+++ b/code/LINDA/LINDA_fire.dm
@@ -189,7 +189,7 @@
T.to_be_destroyed = 0
T.max_fire_temperature_sustained = 0
-/obj/effect/hotspot/Crossed(mob/living/L)
+/obj/effect/hotspot/Crossed(mob/living/L, oldloc)
..()
if(isliving(L))
L.fire_act()
diff --git a/code/datums/beam.dm b/code/datums/beam.dm
index e3a3ca6033a..befe5c0765a 100644
--- a/code/datums/beam.dm
+++ b/code/datums/beam.dm
@@ -119,7 +119,7 @@
owner = null
return ..()
-/obj/effect/ebeam/deadly/Crossed(atom/A)
+/obj/effect/ebeam/deadly/Crossed(atom/A, oldloc)
..()
A.ex_act(1)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 486b553bb8e..1a23dc71070 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -219,7 +219,7 @@
// Previously known as HasEntered()
// This is automatically called when something enters your square
-/atom/movable/Crossed(atom/movable/AM)
+/atom/movable/Crossed(atom/movable/AM, oldloc)
SEND_SIGNAL(src, COMSIG_MOVABLE_CROSSED, AM)
/atom/movable/Bump(atom/A, yes) //the "yes" arg is to differentiate our Bump proc from byond's, without it every Bump() call would become a double Bump().
@@ -245,7 +245,9 @@
if(destination)
destination.Entered(src)
for(var/atom/movable/AM in destination)
- AM.Crossed(src)
+ if(AM == src)
+ continue
+ AM.Crossed(src, old_loc)
var/turf/oldturf = get_turf(old_loc)
var/turf/destturf = get_turf(destination)
var/old_z = (oldturf ? oldturf.z : null)
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index bf56d1687c5..ed06ec4086d 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -142,7 +142,7 @@
take_damage(Proj.damage, Proj.damage_type)
return 0
-/obj/structure/blob/Crossed(var/mob/living/L)
+/obj/structure/blob/Crossed(var/mob/living/L, oldloc)
..()
L.blob_act(src)
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index c2dd811d640..c6a6a3b7490 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -271,7 +271,7 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
return
return
-/obj/effect/gateway/Crossed(AM as mob|obj)
+/obj/effect/gateway/Crossed(AM as mob|obj, oldloc)
spawn(0)
return
return
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index e73474bad7d..fb3c10e25ec 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -545,7 +545,7 @@
light_color = LIGHT_COLOR_CYAN
health = 10
-/obj/structure/swarmer/trap/Crossed(var/atom/movable/AM)
+/obj/structure/swarmer/trap/Crossed(var/atom/movable/AM, oldloc)
if(isliving(AM))
var/mob/living/L = AM
if(!istype(L, /mob/living/simple_animal/hostile/swarmer))
diff --git a/code/game/gamemodes/miniantags/guardian/types/fire.dm b/code/game/gamemodes/miniantags/guardian/types/fire.dm
index 58f4873e800..0c5052f48bd 100644
--- a/code/game/gamemodes/miniantags/guardian/types/fire.dm
+++ b/code/game/gamemodes/miniantags/guardian/types/fire.dm
@@ -42,7 +42,7 @@
do_teleport(M, M, 10)
new /obj/effect/temp_visual/guardian/phase/out(get_turf(M))
-/mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj)
+/mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj, oldloc)
..()
collision_ignite(AM)
diff --git a/code/game/gamemodes/miniantags/guardian/types/ranged.dm b/code/game/gamemodes/miniantags/guardian/types/ranged.dm
index 3e57a059d10..fe8a566ad52 100644
--- a/code/game/gamemodes/miniantags/guardian/types/ranged.dm
+++ b/code/game/gamemodes/miniantags/guardian/types/ranged.dm
@@ -103,7 +103,7 @@
invisibility = 1
-/obj/item/effect/snare/Crossed(AM as mob|obj)
+/obj/item/effect/snare/Crossed(AM as mob|obj, oldloc)
if(isliving(AM))
var/turf/snare_loc = get_turf(loc)
if(spawner)
diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm
index 2ee1e93683d..af73a13f27c 100644
--- a/code/game/machinery/OpTable.dm
+++ b/code/game/machinery/OpTable.dm
@@ -99,7 +99,7 @@
icon_state = "table2-idle"
return 0
-/obj/machinery/optable/Crossed(atom/movable/AM)
+/obj/machinery/optable/Crossed(atom/movable/AM, oldloc)
. = ..()
if(iscarbon(AM) && LAZYLEN(injected_reagents))
to_chat(AM, "You feel a series of tiny pricks!")
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 3c5fea2a967..c410a9130a0 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -88,7 +88,7 @@ var/global/list/image/splatter_cache = list()
return TRUE
//Add "bloodiness" of this blood's type, to the human's shoes
-/obj/effect/decal/cleanable/blood/Crossed(atom/movable/O)
+/obj/effect/decal/cleanable/blood/Crossed(atom/movable/O, oldloc)
if(!off_floor && ishuman(O))
var/mob/living/carbon/human/H = O
var/obj/item/organ/external/l_foot = H.get_organ("l_foot")
diff --git a/code/game/objects/effects/decals/Cleanable/tracks.dm b/code/game/objects/effects/decals/Cleanable/tracks.dm
index 8598381aaf1..1e45c2aa4cf 100644
--- a/code/game/objects/effects/decals/Cleanable/tracks.dm
+++ b/code/game/objects/effects/decals/Cleanable/tracks.dm
@@ -29,7 +29,7 @@ var/global/list/image/fluidtrack_cache = list()
blood_state = BLOOD_STATE_HUMAN //the icon state to load images from
-/obj/effect/decal/cleanable/blood/footprints/Crossed(atom/movable/O)
+/obj/effect/decal/cleanable/blood/footprints/Crossed(atom/movable/O, oldloc)
if(ishuman(O))
var/mob/living/carbon/human/H = O
var/obj/item/clothing/shoes/S = H.shoes
diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm
index d061aca8d95..8bb117b832c 100644
--- a/code/game/objects/effects/effect_system.dm
+++ b/code/game/objects/effects/effect_system.dm
@@ -345,7 +345,7 @@ steam.start() -- spawns the effect
return 1
-/obj/effect/effect/bad_smoke/Crossed(mob/living/carbon/M as mob )
+/obj/effect/effect/bad_smoke/Crossed(mob/living/carbon/M as mob, oldloc)
..()
if(istype(M, /mob/living/carbon))
if(M.internal != null && M.wear_mask && (M.wear_mask.flags & AIRTIGHT))
@@ -569,7 +569,7 @@ steam.start() -- spawns the effect
M.coughedtime = 0
return
-/obj/effect/effect/sleep_smoke/Crossed(mob/living/carbon/M as mob )
+/obj/effect/effect/sleep_smoke/Crossed(mob/living/carbon/M as mob, oldloc)
..()
if(istype(M, /mob/living/carbon))
if(M.internal != null && M.wear_mask && (M.wear_mask.flags & AIRTIGHT))
@@ -672,7 +672,7 @@ steam.start() -- spawns the effect
R.updatehealth()
return
-/obj/effect/effect/mustard_gas/Crossed(mob/living/carbon/human/R as mob )
+/obj/effect/effect/mustard_gas/Crossed(mob/living/carbon/human/R as mob, oldloc)
..()
if(istype(R, /mob/living/carbon/human))
if(R.internal != null && usr.wear_mask && (R.wear_mask.flags & AIRTIGHT) && R.wear_suit != null && !istype(R.wear_suit, /obj/item/clothing/suit/storage/labcoat) && !istype(R.wear_suit, /obj/item/clothing/suit/straight_jacket) && !istype(R.wear_suit, /obj/item/clothing/suit/straight_jacket && !istype(R.wear_suit, /obj/item/clothing/suit/armor)))
@@ -984,7 +984,7 @@ steam.start() -- spawns the effect
qdel(src)
-/obj/structure/foam/Crossed(var/atom/movable/AM)
+/obj/structure/foam/Crossed(var/atom/movable/AM, oldloc)
if(metal)
return
diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm
index b44c4e3dd1b..f134bd44b10 100644
--- a/code/game/objects/effects/effect_system/effects_foam.dm
+++ b/code/game/objects/effects/effect_system/effects_foam.dm
@@ -94,7 +94,7 @@
spawn(5)
qdel(src)
-/obj/effect/particle_effect/foam/Crossed(atom/movable/AM)
+/obj/effect/particle_effect/foam/Crossed(atom/movable/AM, oldloc)
if(metal)
return
diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm
index 0eed8fcba00..93ab0c8e51b 100644
--- a/code/game/objects/effects/effect_system/effects_smoke.dm
+++ b/code/game/objects/effects/effect_system/effects_smoke.dm
@@ -52,7 +52,7 @@
steps--
return 1
-/obj/effect/particle_effect/smoke/Crossed(mob/living/M)
+/obj/effect/particle_effect/smoke/Crossed(mob/living/M, oldloc)
if(!istype(M))
return
smoke_mob(M)
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index 547df1b96ef..76e28f013a1 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -11,7 +11,7 @@
/obj/effect/mine/proc/mineEffect(mob/living/victim)
to_chat(victim, "*click*")
-/obj/effect/mine/Crossed(AM as mob|obj)
+/obj/effect/mine/Crossed(AM as mob|obj, oldloc)
if(!isliving(AM))
return
var/mob/living/M = AM
diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm
index 691ed994875..f36902664f8 100644
--- a/code/game/objects/effects/portals.dm
+++ b/code/game/objects/effects/portals.dm
@@ -3,7 +3,6 @@
desc = "Looks unstable. Best to test it with the clown."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "portal"
- density = TRUE
unacidable = TRUE
anchored = TRUE
@@ -17,9 +16,6 @@
var/can_multitool_to_remove = FALSE
var/ignore_tele_proof_area_setting = FALSE
-/obj/effect/portal/Bumped(mob/M as mob|obj)
- teleport(M)
-
/obj/effect/portal/New(loc, turf/target, creator = null, lifespan = 300)
..()
@@ -49,10 +45,13 @@
/obj/effect/portal/singularity_act()
return
-/obj/effect/portal/Crossed(atom/movable/AM)
+/obj/effect/portal/Crossed(atom/movable/AM, oldloc)
if(isobserver(AM))
return ..()
+ if(target && (get_turf(oldloc) == get_turf(target)))
+ return ..()
+
if(!teleport(AM))
return ..()
diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm
index a9721dd43d0..c1231e698fc 100644
--- a/code/game/objects/effects/step_triggers.dm
+++ b/code/game/objects/effects/step_triggers.dm
@@ -10,7 +10,7 @@
/obj/effect/step_trigger/proc/Trigger(var/atom/movable/A)
return FALSE
-/obj/effect/step_trigger/Crossed(var/H)
+/obj/effect/step_trigger/Crossed(var/H, oldloc)
. = ..()
if(!H)
return
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 073cd0df669..9dbb02553ca 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -578,7 +578,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
/obj/item/proc/is_equivalent(obj/item/I)
return I == src
-/obj/item/Crossed(atom/movable/AM)
+/obj/item/Crossed(atom/movable/AM, oldloc)
. = ..()
if(prob(trip_chance) && ishuman(AM))
var/mob/living/carbon/human/H = AM
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index 75decb95413..f0830f34c40 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -31,7 +31,7 @@
if(S.merge_type == merge_type)
merge(S)
-/obj/item/stack/Crossed(obj/O)
+/obj/item/stack/Crossed(obj/O, oldloc)
if(amount >= max_amount || ismob(loc)) // Prevents unnecessary call. Also prevents merging stack automatically in a mob's inventory
return
if(istype(O, merge_type) && !O.throwing)
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 8a40233bbdd..a8ddcf6d315 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -284,7 +284,7 @@
..()
pop_burst()
-/obj/item/toy/snappop/Crossed(H as mob|obj)
+/obj/item/toy/snappop/Crossed(H as mob|obj, oldloc)
if(ishuman(H) || issilicon(H)) //i guess carp and shit shouldn't set them off
var/mob/living/carbon/M = H
if(issilicon(H) || M.m_intent == MOVE_INTENT_RUN)
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index d17287b01a6..c35eed4fae5 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -48,9 +48,9 @@
/obj/item/grenade/plastic/receive_signal()
prime()
-/obj/item/grenade/plastic/Crossed(atom/movable/AM)
+/obj/item/grenade/plastic/Crossed(atom/movable/AM, oldloc)
if(nadeassembly)
- nadeassembly.Crossed(AM)
+ nadeassembly.Crossed(AM, oldloc)
/obj/item/grenade/plastic/on_found(mob/finder)
if(nadeassembly)
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 31bc6bcf556..2b027bfeee0 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -239,9 +239,9 @@
if(nadeassembly)
nadeassembly.process_movement()
-/obj/item/grenade/chem_grenade/Crossed(atom/movable/AM)
+/obj/item/grenade/chem_grenade/Crossed(atom/movable/AM, oldloc)
if(nadeassembly)
- nadeassembly.Crossed(AM)
+ nadeassembly.Crossed(AM, oldloc)
/obj/item/grenade/chem_grenade/on_found(mob/finder)
if(nadeassembly)
diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm
index 66e0ba6b110..77ae8fc73bb 100644
--- a/code/game/objects/items/weapons/legcuffs.dm
+++ b/code/game/objects/items/weapons/legcuffs.dm
@@ -87,7 +87,7 @@
return
..()
-/obj/item/restraints/legcuffs/beartrap/Crossed(AM as mob|obj)
+/obj/item/restraints/legcuffs/beartrap/Crossed(AM as mob|obj, oldloc)
if(armed && isturf(src.loc))
if( (iscarbon(AM) || isanimal(AM)) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/hostile/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator))
var/mob/living/L = AM
@@ -193,6 +193,6 @@
/obj/item/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom)
if(iscarbon(hit_atom))
var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom))
- B.Crossed(hit_atom)
+ B.Crossed(hit_atom, null)
qdel(src)
..()
diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm
index 428bfcd8fab..4c8697da247 100644
--- a/code/game/objects/items/weapons/shards.dm
+++ b/code/game/objects/items/weapons/shards.dm
@@ -67,7 +67,7 @@
else
return ..()
-/obj/item/shard/Crossed(AM as mob|obj)
+/obj/item/shard/Crossed(AM as mob|obj, oldloc)
if(isliving(AM))
var/mob/living/M = AM
if(M.incorporeal_move || M.flying || M.throwing)//you are incorporal or flying or being thrown ..no shard stepping!
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 03b0172c959..2037293d734 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -452,7 +452,7 @@
icon_closed = transparent ? "bluespacetrans" : "bluespace"
icon_state = opened ? icon_opened : icon_closed
-/obj/structure/closet/bluespace/Crossed(atom/movable/AM)
+/obj/structure/closet/bluespace/Crossed(atom/movable/AM, oldloc)
if(AM.density)
icon_state = opened ? "bluespaceopentrans" : "bluespacetrans"
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 999e90cd89f..ac013ebcf93 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -377,7 +377,7 @@
qdel(i)
. = ..()
-/obj/structure/table/glass/Crossed(atom/movable/AM)
+/obj/structure/table/glass/Crossed(atom/movable/AM, oldloc)
. = ..()
if(!can_deconstruct)
return
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 726d9a88a7f..ada70921c99 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -363,7 +363,7 @@
qdel(mymist)
ismist = 0
-/obj/machinery/shower/Crossed(atom/movable/O)
+/obj/machinery/shower/Crossed(atom/movable/O, oldloc)
..()
wash(O)
if(ismob(O))
diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm
index 2c5a2d28883..058dd4cd0f2 100644
--- a/code/modules/assembly/bomb.dm
+++ b/code/modules/assembly/bomb.dm
@@ -77,9 +77,9 @@
if(bombassembly)
bombassembly.HasProximity(AM)
-/obj/item/onetankbomb/Crossed(atom/movable/AM) //for mousetraps
+/obj/item/onetankbomb/Crossed(atom/movable/AM, oldloc) //for mousetraps
if(bombassembly)
- bombassembly.Crossed(AM)
+ bombassembly.Crossed(AM, oldloc)
/obj/item/onetankbomb/on_found(mob/finder) //for mousetraps
if(bombassembly)
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index f2fde8df758..d19682d1eb9 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -85,11 +85,11 @@
a_right.HasProximity(AM)
-/obj/item/assembly_holder/Crossed(atom/movable/AM)
+/obj/item/assembly_holder/Crossed(atom/movable/AM, oldloc)
if(a_left)
- a_left.Crossed(AM)
+ a_left.Crossed(AM, oldloc)
if(a_right)
- a_right.Crossed(AM)
+ a_right.Crossed(AM, oldloc)
/obj/item/assembly_holder/on_found(mob/finder)
if(a_left)
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index 98e59a7cbb5..37f5916d535 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -269,7 +269,7 @@
/obj/effect/beam/i_beam/Bumped()
hit()
-/obj/effect/beam/i_beam/Crossed(atom/movable/AM)
+/obj/effect/beam/i_beam/Crossed(atom/movable/AM, oldloc)
if(!isobj(AM) && !isliving(AM))
return
if(istype(AM, /obj/effect))
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index 09e049b3921..258212f0ab6 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -93,7 +93,7 @@
return
..()
-/obj/item/assembly/mousetrap/Crossed(atom/movable/AM)
+/obj/item/assembly/mousetrap/Crossed(atom/movable/AM, oldloc)
if(armed)
if(ishuman(AM))
var/mob/living/carbon/H = AM
diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm
index ef576760ada..ca79a1ea2a6 100644
--- a/code/modules/awaymissions/mission_code/wildwest.dm
+++ b/code/modules/awaymissions/mission_code/wildwest.dm
@@ -140,7 +140,7 @@
/obj/effect/meatgrinder/New()
icon_state = "blobpod"
-/obj/effect/meatgrinder/Crossed(AM as mob|obj)
+/obj/effect/meatgrinder/Crossed(AM as mob|obj, oldloc)
Bumped(AM)
/obj/effect/meatgrinder/Bumped(mob/M as mob|obj)
diff --git a/code/modules/awaymissions/zvis.dm b/code/modules/awaymissions/zvis.dm
index de60531e590..102554f2e6e 100644
--- a/code/modules/awaymissions/zvis.dm
+++ b/code/modules/awaymissions/zvis.dm
@@ -65,7 +65,7 @@
STOP_PROCESSING(SSobj, src)
return ..()
-/obj/effect/portal_sensor/Crossed(A)
+/obj/effect/portal_sensor/Crossed(A, oldloc)
trigger()
/obj/effect/portal_sensor/Uncrossed(A)
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index ced084f05a3..9199d8ca3bd 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -514,7 +514,7 @@
/obj/structure/spacevine/obj_destruction()
wither()
-/obj/structure/spacevine/Crossed(mob/crosser)
+/obj/structure/spacevine/Crossed(mob/crosser, oldloc)
if(isliving(crosser))
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_cross(src, crosser)
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 6be1d3bcf70..af366683570 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -589,7 +589,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
health -= P.force
return
-/obj/effect/fake_attacker/Crossed(mob/M, somenumber)
+/obj/effect/fake_attacker/Crossed(mob/M, oldloc)
if(M == my_target)
step_away(src,my_target,2)
if(prob(30))
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 7b84956a804..361c305bb8d 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -151,7 +151,7 @@
T.on_consume(src, usr)
..()
-/obj/item/reagent_containers/food/snacks/grown/Crossed(atom/movable/AM)
+/obj/item/reagent_containers/food/snacks/grown/Crossed(atom/movable/AM, oldloc)
if(seed)
for(var/datum/plant_gene/trait/T in seed.genes)
T.on_cross(src, AM)
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index 461781503e2..33ef72db471 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -160,7 +160,7 @@
..()
StartBurning()
-/obj/structure/bonfire/Crossed(atom/movable/AM)
+/obj/structure/bonfire/Crossed(atom/movable/AM, oldloc)
if(burning)
Burn()
diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm
index d8938683d75..b665f171285 100644
--- a/code/modules/hydroponics/growninedible.dm
+++ b/code/modules/hydroponics/growninedible.dm
@@ -51,7 +51,7 @@
return 0
-/obj/item/grown/Crossed(atom/movable/AM)
+/obj/item/grown/Crossed(atom/movable/AM, oldloc)
if(seed)
for(var/datum/plant_gene/trait/T in seed.genes)
T.on_cross(src, AM)
diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm
index c8f4739d13a..d9747a3a1f4 100644
--- a/code/modules/mining/lavaland/ash_flora.dm
+++ b/code/modules/mining/lavaland/ash_flora.dm
@@ -148,7 +148,7 @@
regrowth_time_low = 4800
regrowth_time_high = 7200
-/obj/structure/flora/ash/cacti/Crossed(mob/AM)
+/obj/structure/flora/ash/cacti/Crossed(mob/AM, oldloc)
if(ishuman(AM) && has_gravity(loc) && prob(70))
var/mob/living/carbon/human/H = AM
if(!H.shoes && !H.lying) //ouch, my feet.
diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm
index c1f474ccd64..ecf394a8734 100644
--- a/code/modules/mining/ore.dm
+++ b/code/modules/mining/ore.dm
@@ -31,7 +31,7 @@
else if(W.isOn())
to_chat(user, "Not enough fuel to smelt [src].")
-/obj/item/stack/ore/Crossed(atom/movable/AM)
+/obj/item/stack/ore/Crossed(atom/movable/AM, oldloc)
var/obj/item/storage/bag/ore/OB
var/turf/simulated/floor/F = get_turf(src)
if(loc != F)
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index 04dcb0c60ef..78bc0004b15 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -72,7 +72,7 @@ var/const/MAX_ACTIVE_TIME = 400
/obj/item/clothing/mask/facehugger/equipped(mob/M)
Attach(M)
-/obj/item/clothing/mask/facehugger/Crossed(atom/target)
+/obj/item/clothing/mask/facehugger/Crossed(atom/target, oldloc)
HasProximity(target)
return
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 6481f6bc04a..643319dc8dd 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -453,7 +453,7 @@
popup.open()
-/mob/living/carbon/human/Crossed(atom/movable/AM)
+/mob/living/carbon/human/Crossed(atom/movable/AM, oldloc)
var/mob/living/simple_animal/bot/mulebot/MB = AM
if(istype(MB))
MB.RunOver(src)
diff --git a/code/modules/mob/living/simple_animal/bot/griefsky.dm b/code/modules/mob/living/simple_animal/bot/griefsky.dm
index 67c3780fac0..4dc50fca8f8 100644
--- a/code/modules/mob/living/simple_animal/bot/griefsky.dm
+++ b/code/modules/mob/living/simple_animal/bot/griefsky.dm
@@ -48,7 +48,7 @@
..()
light_color = LIGHT_COLOR_PURE_RED //if you see a red one. RUN!!
-/mob/living/simple_animal/bot/secbot/griefsky/Crossed(atom/movable/AM)
+/mob/living/simple_animal/bot/secbot/griefsky/Crossed(atom/movable/AM, oldloc)
..()
if(ismob(AM) && AM == target)
var/mob/living/carbon/C = AM
diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm
index 45b10950669..3499ae06649 100644
--- a/code/modules/mob/living/simple_animal/bot/honkbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm
@@ -298,7 +298,7 @@
target = user
mode = BOT_HUNT
-/mob/living/simple_animal/bot/honkbot/Crossed(atom/movable/AM)
+/mob/living/simple_animal/bot/honkbot/Crossed(atom/movable/AM, oldloc)
if(ismob(AM) && on) //only if its online
if(prob(30)) //you're far more likely to trip on a honkbot
var/mob/living/carbon/C = AM
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index 14a72c43fac..ea559fdc597 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -439,7 +439,7 @@ Auto Patrol: []"},
target = user
mode = BOT_HUNT
-/mob/living/simple_animal/bot/secbot/Crossed(atom/movable/AM)
+/mob/living/simple_animal/bot/secbot/Crossed(atom/movable/AM, oldloc)
if(ismob(AM) && target)
var/mob/living/carbon/C = AM
if(!istype(C) || !C || in_range(src, target))
diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm
index 5be21c8646e..b52140922f1 100644
--- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm
@@ -24,7 +24,7 @@
/mob/living/simple_animal/cockroach/can_die()
return ..() && !SSticker.cinematic //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes.
-/mob/living/simple_animal/cockroach/Crossed(var/atom/movable/AM)
+/mob/living/simple_animal/cockroach/Crossed(var/atom/movable/AM, oldloc)
if(isliving(AM))
var/mob/living/A = AM
if(A.mob_size > MOB_SIZE_SMALL)
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 4faa821701c..cbc125beeab 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -91,7 +91,7 @@
to_chat(src, "You are too small to pull anything.")
return
-/mob/living/simple_animal/mouse/Crossed(AM as mob|obj)
+/mob/living/simple_animal/mouse/Crossed(AM as mob|obj, oldloc)
if(ishuman(AM))
if(!stat)
var/mob/M = AM
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index 6af11b10b14..6caee40ba80 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -526,7 +526,7 @@ Difficulty: Hard
sleep(1.3) //slightly forgiving; the burst animation is 1.5 deciseconds
bursting = FALSE //we no longer damage crossers
-/obj/effect/temp_visual/hierophant/blast/Crossed(atom/movable/AM)
+/obj/effect/temp_visual/hierophant/blast/Crossed(atom/movable/AM, oldloc)
..()
if(bursting)
do_damage(get_turf(src))
diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
index e2c9194abc5..52ec406fcbd 100644
--- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
+++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
@@ -36,7 +36,7 @@
desc = "A thick vine, painful to the touch."
-/obj/effect/ebeam/vine/Crossed(atom/movable/AM)
+/obj/effect/ebeam/vine/Crossed(atom/movable/AM, oldloc)
if(isliving(AM))
var/mob/living/L = AM
if(!("vines" in L.faction))
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index 6c8eba8fb62..89e37b88c5c 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -33,11 +33,10 @@
return 0
-/obj/machinery/field/containment/Crossed(mob/mover)
+/obj/machinery/field/containment/Crossed(mob/mover, oldloc)
if(isliving(mover))
shock_field(mover)
-/obj/machinery/field/containment/Crossed(obj/mover)
if(istype(mover, /obj/machinery) || istype(mover, /obj/structure) || istype(mover, /obj/mecha))
bump_field(mover)
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 420a112c352..b2f172deb72 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -287,7 +287,7 @@ field_generator power level display
fields += CF
G.fields += CF
for(var/mob/living/L in T)
- CF.Crossed(L)
+ CF.Crossed(L, null)
connected_gens |= G
G.connected_gens |= src
diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm
index 2b6695b9e85..befb2a4931a 100644
--- a/code/modules/power/singularity/particle_accelerator/particle.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle.dm
@@ -39,7 +39,7 @@
var/obj/singularity/S = A
S.energy += energy
-/obj/effect/accelerated_particle/Crossed(atom/A)
+/obj/effect/accelerated_particle/Crossed(atom/A, oldloc)
if(isliving(A))
toxmob(A)
diff --git a/code/modules/power/supermatter/sm_shard.dm b/code/modules/power/supermatter/sm_shard.dm
index 1d946fee0c8..c5d7549e0a7 100644
--- a/code/modules/power/supermatter/sm_shard.dm
+++ b/code/modules/power/supermatter/sm_shard.dm
@@ -41,7 +41,7 @@
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return ..()
-/obj/item/shard/supermatter/Crossed(AM as mob|obj)
+/obj/item/shard/supermatter/Crossed(AM as mob|obj, oldloc)
if(ismob(AM))
var/mob/M = AM
to_chat(M, "You step on \the [src]!")
diff --git a/code/modules/power/treadmill.dm b/code/modules/power/treadmill.dm
index 1548738f3f5..36f3ac15df4 100644
--- a/code/modules/power/treadmill.dm
+++ b/code/modules/power/treadmill.dm
@@ -25,7 +25,7 @@
/obj/machinery/power/treadmill/update_icon()
icon_state = speed ? "conveyor-1" : "conveyor0"
-/obj/machinery/power/treadmill/Crossed(mob/living/M)
+/obj/machinery/power/treadmill/Crossed(mob/living/M, oldloc)
if(anchored && !M.anchored)
if(!istype(M) || M.dir != dir)
throw_off(M)
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 949983d45ba..a8d368d6aef 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -281,7 +281,7 @@
Range()
sleep(1)
-obj/item/projectile/Crossed(atom/movable/AM) //A mob moving on a tile with a projectile is hit by it.
+obj/item/projectile/Crossed(atom/movable/AM, oldloc) //A mob moving on a tile with a projectile is hit by it.
..()
if(isliving(AM) && AM.density && !checkpass(PASSMOB))
Bump(AM, 1)
diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm
index 1d6f46bf46c..d408db7f2f0 100644
--- a/code/modules/reagents/reagent_containers/glass_containers.dm
+++ b/code/modules/reagents/reagent_containers/glass_containers.dm
@@ -247,9 +247,9 @@
if(assembly)
assembly.HasProximity(AM)
-/obj/item/reagent_containers/glass/beaker/Crossed(atom/movable/AM)
+/obj/item/reagent_containers/glass/beaker/Crossed(atom/movable/AM, oldloc)
if(assembly)
- assembly.Crossed(AM)
+ assembly.Crossed(AM, oldloc)
/obj/item/reagent_containers/glass/beaker/on_found(mob/finder) //for mousetraps
if(assembly)
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index e06a0dcb3fb..fc9d5d56134 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -187,9 +187,9 @@
if(rig)
rig.HasProximity(AM)
-/obj/structure/reagent_dispensers/fueltank/Crossed(atom/movable/AM)
+/obj/structure/reagent_dispensers/fueltank/Crossed(atom/movable/AM, oldloc)
if(rig)
- rig.Crossed(AM)
+ rig.Crossed(AM, oldloc)
/obj/structure/reagent_dispensers/fueltank/hear_talk(mob/living/M, list/message_pieces)
if(rig)
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index 5d3a3536d62..933f223d120 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -178,7 +178,7 @@ GLOBAL_LIST_INIT(conveyor_switches, list())
else if(still_stuff_to_move && !speed_process)
makeSpeedProcess()
-/obj/machinery/conveyor/Crossed(atom/movable/AM)
+/obj/machinery/conveyor/Crossed(atom/movable/AM, oldloc)
if(!speed_process && !AM.anchored)
makeSpeedProcess()
..()
diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
index a725d3d5d5f..3c9f093921e 100644
--- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
+++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
@@ -266,7 +266,7 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate)
/obj/structure/stone_tile/singularity_pull()
return
-/obj/structure/stone_tile/Crossed(atom/movable/AM)
+/obj/structure/stone_tile/Crossed(atom/movable/AM, oldloc)
if(falling || fallen)
return
var/turf/T = get_turf(src)
@@ -310,7 +310,7 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate)
falling = FALSE
fallen = FALSE
-/obj/structure/stone_tile/proc/crossed_effect(atom/movable/AM)
+/obj/structure/stone_tile/proc/crossed_effect(atom/movable/AM, oldloc)
return
/obj/structure/stone_tile/block