diff --git a/code/__HELPERS/trait_helpers.dm b/code/__HELPERS/trait_helpers.dm
index 4672f249459..0cfe2282881 100644
--- a/code/__HELPERS/trait_helpers.dm
+++ b/code/__HELPERS/trait_helpers.dm
@@ -265,6 +265,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
//quirk traits
#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance"
+#define TRAIT_TABLE_LEAP "table_leap"
//traits that should be properly converted to genetic mutations one day
#define TRAIT_LASEREYES "laser_eyes"
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
index ab5000d45d0..feedd77ab72 100644
--- a/code/_globalvars/traits.dm
+++ b/code/_globalvars/traits.dm
@@ -77,7 +77,8 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_FLATTENED" = TRAIT_FLATTENED,
"TRAIT_SM_HALLUCINATION_IMMUNE" = SM_HALLUCINATION_IMMUNE,
"TRAIT_CONTORTED_BODY" = TRAIT_CONTORTED_BODY,
- "TRAIT_DEFLECTS_PROJECTILES" = TRAIT_DEFLECTS_PROJECTILES
+ "TRAIT_DEFLECTS_PROJECTILES" = TRAIT_DEFLECTS_PROJECTILES,
+ "TRAIT_TABLE_LEAP" = TRAIT_TABLE_LEAP
),
/obj/item = list(
"TRAIT_SHOW_WIRE_INFO" = TRAIT_SHOW_WIRE_INFO,
diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm
index 44a234f3f49..e92418a3fae 100644
--- a/code/game/jobs/job/support.dm
+++ b/code/game/jobs/job/support.dm
@@ -164,6 +164,7 @@
singlemutcheck(H, GLOB.soberblock, MUTCHK_FORCED)
H.dna.default_blocks.Add(GLOB.soberblock)
H.check_mutations = 1
+ ADD_TRAIT(H, TRAIT_TABLE_LEAP, ROUNDSTART_TRAIT)
@@ -205,6 +206,7 @@
return
var/datum/martial_art/cqc/under_siege/justacook = new
justacook.teach(H)
+ ADD_TRAIT(H, TRAIT_TABLE_LEAP, ROUNDSTART_TRAIT)
/datum/job/hydro
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 724c3269131..4b6c23dbddf 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -71,21 +71,30 @@
var/turf/T = src.loc
if(!T || !istype(T)) return FALSE
- usr.visible_message("[user] starts climbing onto \the [src]!")
climber = user
- if(!do_after(user, 50, target = src))
- climber = null
- return FALSE
+ if(HAS_TRAIT(climber, TRAIT_TABLE_LEAP))
+ user.visible_message("[user] gets ready to vault up onto [src]!")
+ if(!do_after(user, 0.5 SECONDS, target = src))
+ climber = null
+ return FALSE
+ else
+ user.visible_message("[user] starts climbing onto [src]!")
+ if(!do_after(user, 5 SECONDS, target = src))
+ climber = null
+ return FALSE
if(!can_touch(user) || !climbable)
climber = null
return FALSE
var/old_loc = usr.loc
- usr.loc = get_turf(src)
- usr.Moved(old_loc, get_dir(old_loc, usr.loc), FALSE)
+ user.loc = get_turf(src)
+ user.Moved(old_loc, get_dir(old_loc, usr.loc), FALSE)
if(get_turf(user) == get_turf(src))
- usr.visible_message("[user] climbs onto \the [src]!")
+ if(HAS_TRAIT(climber, TRAIT_TABLE_LEAP))
+ user.visible_message("[user] leaps up onto [src]!")
+ else
+ user.visible_message("[user] climbs onto [src]!")
climber = null
return TRUE