diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 900baea3f3..967c0e78a6 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -4,6 +4,7 @@
var/climbable
var/breakable
var/parts
+ var/list/climbers = list()
/obj/structure/proc/destroy()
if(parts)
@@ -20,6 +21,12 @@
var/mob/living/carbon/human/H = user
if(H.species.can_shred(user))
attack_generic(user,1,"slices")
+
+ if(climbers.len && !(user in climbers))
+ user.visible_message("[user.name] shakes \the [src].", \
+ "You shake \the [src].")
+ structure_shaken()
+
return ..()
/obj/structure/blob_act()
@@ -73,7 +80,7 @@
return ..()
/obj/structure/proc/can_climb(var/mob/living/user)
- if (!can_touch(user) || !climbable)
+ if (!can_touch(user) || !climbable || (user in climbers))
return 0
if (!user.Adjacent(src))
@@ -103,25 +110,32 @@
return
usr.visible_message("[user] starts climbing onto \the [src]!")
+ climbers |= user
if(!do_after(user,50))
+ climbers -= user
return
if (!can_climb(user))
+ climbers -= user
return
usr.forceMove(get_turf(src))
if (get_turf(user) == get_turf(src))
usr.visible_message("[user] climbs onto \the [src]!")
+ climbers -= user
/obj/structure/proc/structure_shaken()
+ for(var/mob/living/M in climbers)
+ M.Weaken(1)
+ M << "You topple as you are shaken off \the [src]!"
+ climbers.Cut(1,2)
for(var/mob/living/M in get_turf(src))
-
if(M.lying) return //No spamming this on people.
- M.Weaken(5)
+ M.Weaken(3)
M << "You topple as \the [src] moves under you!"
if(prob(25))
diff --git a/html/changelogs/PsiOmegaDelta-PR-8901.yml b/html/changelogs/PsiOmegaDelta-PR-8901.yml
new file mode 100644
index 0000000000..5fd81a14bc
--- /dev/null
+++ b/html/changelogs/PsiOmegaDelta-PR-8901.yml
@@ -0,0 +1,5 @@
+author: PsiOmegaDelta
+delete-after: True
+
+changes:
+ - rscadd: "Makes it possible to shake tables with one's bare hands to stop climbers."