diff --git a/code/game/gamemodes/nations/nations.dm b/code/game/gamemodes/nations/nations.dm
index 38a7633e6d4..ec180e07279 100644
--- a/code/game/gamemodes/nations/nations.dm
+++ b/code/game/gamemodes/nations/nations.dm
@@ -22,6 +22,9 @@ datum/game_mode/nations
split_teams()
spawn_flags()
populate_vars()
+ for(var/mob/M in player_list)
+ if(!istype(M,/mob/new_player))
+ M << sound('sound/effects/purge_siren.ogg')
return ..()
/datum/game_mode/nations/send_intercept()
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index a4f2b29e8b9..121f4d9e098 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -19,6 +19,21 @@ REAGENT SCANNER
item_state = "electronic"
m_amt = 150
origin_tech = "magnets=1;engineering=1"
+ var/scan_range = 1
+ var/pulse_duration = 10
+
+/obj/item/device/t_scanner/longer_pulse
+ origin_tech = "magnets=2;engineering=2"
+ pulse_duration = 50
+
+/obj/item/device/t_scanner/extended_range
+ origin_tech = "magnets=1;engineering=3"
+ scan_range = 3
+
+/obj/item/device/t_scanner/extended_range/longer_pulse
+ origin_tech = "magnets=2;engineering=3"
+ scan_range = 3
+ pulse_duration = 50
/obj/item/device/t_scanner/Destroy()
if(on)
@@ -39,7 +54,7 @@ REAGENT SCANNER
processing_objects.Remove(src)
return null
- for(var/turf/T in range(1, src.loc) )
+ for(var/turf/T in range(scan_range, src.loc) )
if(!T.intact)
continue
@@ -51,7 +66,7 @@ REAGENT SCANNER
if(O.invisibility == 101)
O.invisibility = 0
- spawn(10)
+ spawn(pulse_duration)
if(O)
var/turf/U = O.loc
if(U.intact)
@@ -65,6 +80,7 @@ REAGENT SCANNER
M.alpha = oldalpha
var/mob/living/M = locate() in T
+
if(M && M.invisibility == 2)
M.invisibility = 0
spawn(2)
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 8b8411f7012..dbba84f5559 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -176,12 +176,24 @@
return W.afterattack(target,src)
var/randn = rand(1, 100)
- if (randn <= 25)
- apply_effect(4, WEAKEN, run_armor_check(affecting, "melee"))
+
+ if(!src.handcuffed) // Bone White - disarm knockdown only occurs if you have an aggressive grab on the target, Longer duration (8) to allow handcuffing.
+ //check for an aggressive grab
+ for (var/obj/item/weapon/grab/G in src.grabbed_by)
+ if (G.assailant == M && G.state >= GRAB_AGGRESSIVE)
+ world << "aggressive grab"
+ randn -= 30 // this value is the % chance of knockdown if you disarm someone whilst you have an aggressive grab.
+ else
+ //if target is handcuffed, always push them over
+ randn = 0
+
+ if (randn <= 0)
+ world << "push over success"
+ apply_effect(4, WEAKEN, run_armor_check(affecting, "melee")) // first var here is the length of the knockdown
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- visible_message("\red [M] has pushed [src]!")
- M.attack_log += text("\[[time_stamp()]\] Pushed [src.name] ([src.ckey])")
- src.attack_log += text("\[[time_stamp()]\] Has been pushed by [M.name] ([M.ckey])")
+ visible_message("\red [M] has floored [src]!")
+ M.attack_log += text("\[[time_stamp()]\] Floored [src.name] ([src.ckey])")
+ src.attack_log += text("\[[time_stamp()]\] Has been floored by [M.name] ([M.ckey])")
if(!iscarbon(M))
LAssailant = null
else
diff --git a/sound/effects/purge_siren.ogg b/sound/effects/purge_siren.ogg
new file mode 100644
index 00000000000..1cdaca1f60f
Binary files /dev/null and b/sound/effects/purge_siren.ogg differ