diff --git a/code/datums/riding.dm b/code/datums/riding.dm
index 20bbc1552ad..3524e663479 100644
--- a/code/datums/riding.dm
+++ b/code/datums/riding.dm
@@ -9,6 +9,13 @@
var/slowed = FALSE
var/slowvalue = 1
+/datum/riding/New(atom/movable/_ridden)
+ ridden = _ridden
+
+/datum/riding/Destroy()
+ ridden = null
+ return ..()
+
/datum/riding/proc/handle_vehicle_layer()
if(ridden.dir != NORTH)
ridden.layer = ABOVE_MOB_LAYER
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 308b80a9610..e43b088b5dc 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -911,8 +911,7 @@
M.visible_message("[M] really can't seem to mount [src]...")
return
if(!riding_datum)
- riding_datum = new /datum/riding/human
- riding_datum.ridden = src
+ riding_datum = new /datum/riding/human(src)
if(buckled_mobs && ((M in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)))
return
if(buckled) //NO INFINITE STACKING!!
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 7abcefe143e..648d38c63b8 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -55,6 +55,9 @@
//End bloody footprints
S.step_action()
+
+/mob/living/carbon/human/Moved()
+ . = ..()
if(buckled_mobs && buckled_mobs.len && riding_datum)
riding_datum.on_vehicle_move()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 6142f2ccd71..a6a267ba40f 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -31,6 +31,7 @@
ranged_ability.remove_ranged_ability(src)
if(buckled)
buckled.unbuckle_mob(src,force=1)
+ QDEL_NULL(riding_datum)
for(var/mob/living/simple_animal/drone/D in player_list)
for(var/image/I in staticOverlays)
@@ -915,3 +916,8 @@
"[C] topples over [src]!", \
"[C] leaps out of [src]'s way!")]")
C.Weaken(2)
+
+/mob/living/post_buckle_mob(mob/living/M)
+ if(riding_datum)
+ riding_datum.handle_vehicle_offsets()
+ riding_datum.handle_vehicle_layer()
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index b09fb96b09f..3d95b2bb756 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -75,3 +75,5 @@
var/list/implants = null
var/tesla_ignore = FALSE
+
+ var/datum/riding/riding_datum
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index d9d9b23457e..adf03be3273 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -1010,8 +1010,7 @@
M.visible_message("[M] really can't seem to mount the [src]...")
return
if(!riding_datum)
- riding_datum = new /datum/riding/cyborg
- riding_datum.ridden = src
+ riding_datum = new /datum/riding/cyborg(src)
if(buckled_mobs)
if(buckled_mobs.len >= max_buckled_mobs)
return
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index b7a4161c6b3..b729b964e14 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -540,11 +540,10 @@
if(tame && riding_datum)
riding_datum.handle_ride(user, direction)
-/mob/living/simple_animal/Move(NewLoc,Dir=0,step_x=0,step_y=0)
+/mob/living/simple_animal/Moved()
. = ..()
if(riding_datum)
- riding_datum.handle_vehicle_layer()
- riding_datum.handle_vehicle_offsets()
+ riding_datum.on_vehicle_move()
/mob/living/simple_animal/buckle_mob(mob/living/buckled_mob, force = 0, check_loc = 1)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index be7b382a87f..0b1f565e194 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -962,9 +962,4 @@ var/next_mob_id = 0
switch(var_name)
if ("attack_log")
return debug_variable(var_name, attack_log, 0, src, FALSE)
- . = ..()
-
-/mob/post_buckle_mob(mob/living/M)
- if(riding_datum)
- riding_datum.handle_vehicle_offsets()
- riding_datum.handle_vehicle_layer()
+ . = ..()
\ No newline at end of file
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index db64420414e..b00302473dd 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -146,5 +146,4 @@
var/list/observers = null //The list of people observing this mob.
var/list/progressbars = null //for stacking do_after bars
- var/datum/riding/riding_datum
var/list/can_ride_typecache = list()
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
index 74c8e1647e4..343a103fc3a 100644
--- a/code/modules/vehicles/vehicle.dm
+++ b/code/modules/vehicles/vehicle.dm
@@ -15,6 +15,10 @@
var/view_range = 7
var/datum/riding/riding_datum = null
+/obj/vehicle/Destroy()
+ QDEL_NULL(riding_datum)
+ return ..()
+
/obj/vehicle/update_icon()
return
@@ -53,7 +57,7 @@
riding_datum.handle_ride(user, direction)
-/obj/vehicle/Move(NewLoc,Dir=0,step_x=0,step_y=0)
+/obj/vehicle/Moved()
. = ..()
if(riding_datum)
riding_datum.handle_vehicle_layer()