diff --git a/code/__defines/flags.dm b/code/__defines/flags.dm
index 625dabbf280df..c75b46df1b934 100644
--- a/code/__defines/flags.dm
+++ b/code/__defines/flags.dm
@@ -22,6 +22,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define OBJ_FLAG_ANCHORABLE 0x0001 // This object can be stuck in place with a tool
#define OBJ_FLAG_CONDUCTIBLE 0x0002 // Conducts electricity. (metal etc.)
+#define OBJ_FLAG_TRIPPABLE 0x0003 // Objects like piping on the ground that can cause a trip
#define MOB_FLAG_HOLY_BAD 0x001 // If this mob is allergic to holiness
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 8f97cedf08fce..a0e066e445622 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -160,4 +160,24 @@
..()
/obj/is_fluid_pushable(var/amt)
- return ..() && w_class <= round(amt/20)
\ No newline at end of file
+ return ..() && w_class <= round(amt/20)
+
+/obj/proc/trip_dir_check(mob/user as mob)
+ if(user.get_skill_value(SKILL_HAULING) >= SKILL_ADEPT)
+ return 0
+ else if(obj_flags & OBJ_FLAG_TRIPPABLE)
+ return 1
+ return 0
+
+/obj/Crossed(mob/living/carbon/M as mob)
+ ..()
+ for(var/obj/structure/catwalk/C in get_turf(src))
+ return
+ if(!ishuman(M) || !has_gravity(src) || M.resting || M.can_overcome_gravity() || M.move_intent.flags & MOVE_INTENT_DELIBERATE)
+ return
+ if(prob(40) && trip_dir_check(M))
+ M.apply_damage(5,BRUTE)
+ M.slip(src, 6)
+ M.visible_message(\
+ "[M.name] trips over \the [src]!",\
+ "You trip over \the [src]!")
diff --git a/code/modules/atmospherics/pipes.dm b/code/modules/atmospherics/pipes.dm
index faf17845b519f..71c3b153d781b 100644
--- a/code/modules/atmospherics/pipes.dm
+++ b/code/modules/atmospherics/pipes.dm
@@ -17,6 +17,8 @@
buckle_lying = -1
var/datum/sound_token/sound_token
+ obj_flags = OBJ_FLAG_TRIPPABLE
+
/obj/machinery/atmospherics/pipe/drain_power()
return -1
@@ -1433,6 +1435,14 @@
..()
update_icon()
+/obj/machinery/atmospherics/pipe/trip_dir_check(mob/user as mob)
+ var/turf/T = src.loc
+ if(!T.is_plating())
+ return 0
+ if(initialize_directions & user.dir)
+ return 0
+ . = ..()
+
/obj/machinery/atmospherics/proc/universal_underlays(var/obj/machinery/atmospherics/node, var/direction)
var/turf/T = loc
if(node)
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 539b889e2cf10..400028e8a66e5 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -39,6 +39,8 @@ By design, d1 is the smallest direction and d2 is the highest
color = COLOR_MAROON
var/obj/machinery/power/breakerbox/breaker_box
+ obj_flags = OBJ_FLAG_TRIPPABLE
+
/obj/structure/cable/drain_power(var/drain_check, var/surge, var/amount = 0)
@@ -461,6 +463,14 @@ obj/structure/cable/proc/cableColor(var/colorC)
powernet = null // And finally null the powernet var.
+/obj/structure/cable/trip_dir_check(mob/user as mob)
+ var/turf/T = src.loc
+ if(!T.is_plating())
+ return 0
+ if((user.dir == d1 || user.dir == d2))
+ return 0
+ . = ..()
+
///////////////////////////////////////////////
// The cable coil object, used for laying cable
///////////////////////////////////////////////
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index c2c410a668528..a21cbee4d2346 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -663,6 +663,8 @@
var/base_icon_state // initial icon state on map
var/sortType = ""
var/subtype = 0
+
+ obj_flags = OBJ_FLAG_TRIPPABLE
// new pipe, set the icon_state as on map
New()
..()
@@ -959,6 +961,14 @@
/obj/structure/disposalpipe/hides_under_flooring()
return 1
+/obj/structure/disposalpipe/trip_dir_check(mob/user as mob)
+ var/turf/T = src.loc
+ if(!T.is_plating())
+ return 0
+ if(dpdir & user.dir)
+ return 0
+ . = ..()
+
// *** TEST verb
//client/verb/dispstop()
// for(var/obj/structure/disposalholder/H in world)