diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 7288e48a28a..3f556a4338e 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -184,6 +184,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_SHOCKIMMUNE "shock_immunity" /// Are we immune to specifically tesla / SM shocks? #define TRAIT_TESLA_SHOCKIMMUNE "tesla_shock_immunity" +#define TRAIT_AIRLOCK_SHOCKIMMUNE "airlock_shock_immunity" /// Is this atom being actively shocked? Used to prevent repeated shocks. #define TRAIT_BEING_SHOCKED "shocked" #define TRAIT_STABLEHEART "stable_heart" diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 096a3b5bba7..80ab0fc64b3 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -436,6 +436,8 @@ /obj/machinery/door/airlock/proc/shock(mob/living/user, prb) if(!istype(user) || !hasPower()) // unpowered, no shock return FALSE + if(HAS_TRAIT(user, TRAIT_AIRLOCK_SHOCKIMMUNE)) // Be a bit more clever man come on + return FALSE if(!COOLDOWN_FINISHED(src, shockCooldown)) return FALSE //Already shocked someone recently? if(!prob(prb)) @@ -444,6 +446,9 @@ var/check_range = TRUE if(electrocute_mob(user, get_area(src), src, 1, check_range)) COOLDOWN_START(src, shockCooldown, 1 SECONDS) + // Provides timed airlock shock immunity, to prevent overly cheesy deathtraps + ADD_TRAIT(user, TRAIT_AIRLOCK_SHOCKIMMUNE, REF(src)) + addtimer(TRAIT_CALLBACK_REMOVE(user, TRAIT_AIRLOCK_SHOCKIMMUNE, REF(src)), 1 SECONDS) return TRUE else return FALSE diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 56fffcc63ed..99a01246b1e 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -153,8 +153,10 @@ return if(isliving(AM)) var/mob/living/M = AM - if(world.time - M.last_bumped <= 10) - return //Can bump-open one airlock per second. This is to prevent shock spam. + //Can bump-open maybe 3 airlocks per second. This is to prevent weird mass door openings + //While keeping things feeling snappy + if(world.time - M.last_bumped <= 0.3 SECONDS) + return M.last_bumped = world.time if(HAS_TRAIT(M, TRAIT_HANDS_BLOCKED) && !check_access(null) && !emergency) return diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index c1d82f868f5..f4b4c7ca260 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -76,13 +76,11 @@ if(isSwitchingStates || !anchored) return if(isliving(user)) - var/mob/living/M = user - if(world.time - M.last_bumped <= 60) - return //NOTE do we really need that? - if(M.client) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(!C.handcuffed) + var/mob/living/matters = user + if(matters.client) + if(iscarbon(matters)) + var/mob/living/carbon/carbon_user = matters + if(!carbon_user.handcuffed) SwitchState() else SwitchState()