diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index 1963e2fb29a..a040e460b2c 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -32,4 +32,10 @@
/obj/effect/overlay/coconut
name = "Coconuts"
icon = 'icons/misc/beach.dmi'
- icon_state = "coconuts"
\ No newline at end of file
+ icon_state = "coconuts"
+
+/obj/effect/overlay/adminoverlay
+ name = "adminoverlay"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "admin"
+ layer = 4.1
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index b4d24b90ec1..ce3ca49fd22 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -60,7 +60,10 @@ var/list/admin_verbs_admin = list(
/client/proc/man_up,
/client/proc/global_man_up,
/client/proc/delbook,
- /client/proc/empty_ai_core_toggle_latejoin
+ /client/proc/empty_ai_core_toggle_latejoin,
+ /client/proc/freeze,
+ /client/proc/freezemecha
+
)
var/list/admin_verbs_ban = list(
/client/proc/unban_panel,
diff --git a/code/modules/admin/verbs/freeze.dm b/code/modules/admin/verbs/freeze.dm
new file mode 100644
index 00000000000..502060933ee
--- /dev/null
+++ b/code/modules/admin/verbs/freeze.dm
@@ -0,0 +1,125 @@
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+//////Freeze Mob/Mech Verb -- Ported from NSS Pheonix (Unbound Travels)/////////
+////////////////////////////////////////////////////////////////////////////////
+//////Allows admin's to right click on any mob/mech and freeze them in place.///
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+/client/proc/freeze(mob/living/M as mob in mob_list)
+ set category = "Special Verbs"
+ set name = "Freeze"
+ if(!holder)
+ src << "Only administrators may use this command."
+ return
+ if(!mob)
+ return
+ if(!istype(M))
+ alert("Cannot freeze a ghost")
+ return
+ if(usr)
+ if (usr.client)
+ if(usr.client.holder)
+ if (istype(M, /mob/living/carbon/slime))
+ if(!M.paralysis)
+ M.adjustToxLoss(2147483647)
+ M.AdjustParalysis(2147483647)
+ var/adminomaly = new/obj/effect/overlay/adminoverlay
+ spawn(50)
+ M.overlays += adminomaly
+ M << "You have been frozen by [key]"
+ message_admins("\blue [key_name_admin(usr)] froze [key_name(M)]")
+ log_admin("[key_name(usr)] froze [key_name(M)]")
+ else if (M.paralysis)
+ M.AdjustParalysis(-2147483647)
+ M.blinded = 0
+ M.lying = 0
+ M.stat = 0
+ M << " You have been unfrozen by [key]"
+ message_admins("\blue [key_name_admin(usr)] unfroze [key_name(M)]")
+ log_admin("[key_name(usr)] unfroze [key_name(M)]")
+ M.revive()
+ else if (istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/FM = M
+
+ if(!FM.paralysis)
+ FM.anchored = 1
+ FM.frozen = 1
+ FM.AdjustParalysis(2147483647)
+ var/adminomaly = new/obj/effect/overlay/adminoverlay
+ spawn(50)
+ FM.overlays += adminomaly
+ FM << "You have been frozen by [key]"
+ message_admins("\blue [key_name_admin(usr)] froze [key_name(FM)]")
+ log_admin("[key_name(usr)] froze [key_name(FM)]")
+ else if (M.paralysis)
+ FM.anchored = 0
+ FM.frozen = 0
+ FM.AdjustParalysis(-2147483647)
+ FM.blinded = 0
+ FM.lying = 0
+ FM.stat = 0
+
+ FM << " You have been unfrozen by [key]"
+ message_admins("\blue [key_name_admin(usr)] unfroze [key_name(FM)]")
+ log_admin("[key_name(usr)] unfroze [key_name(FM)]")
+
+ else
+
+ if(!M.paralysis)
+ M.anchored = 1
+ M.AdjustParalysis(2147483647)
+ var/adminomaly = new/obj/effect/overlay/adminoverlay
+ spawn(50)
+ M.overlays += adminomaly
+ M << "You have been frozen by [key]"
+ message_admins("\blue [key_name_admin(usr)] froze [key_name(M)]")
+ log_admin("[key_name(usr)] froze [key_name(M)]")
+ else if (M.paralysis)
+ M.anchored = 0
+ M.AdjustParalysis(-2147483647)
+ M.blinded = 0
+ M.lying = 0
+ M.stat = 0
+
+ M << " You have been unfrozen by [key]"
+ message_admins("\blue [key_name_admin(usr)] unfroze [key_name(M)]")
+ log_admin("[key_name(usr)] unfroze [key_name(M)]")
+
+
+/client/proc/freezemecha(obj/mecha/O as obj in mechas_list)
+ set category = "Special Verbs"
+ set name = "Freeze Mech"
+ if(!holder)
+ src << "Only administrators may use this command."
+ return
+ var/obj/mecha/M = O
+ if(!istype(M,/obj/mecha))
+ src << "\red This can only be used on Mechs!"
+ return
+ else
+ if(usr)
+ if (usr.client)
+ if(usr.client.holder)
+ var/adminomaly = new/obj/effect/overlay/adminoverlay
+ if(M.can_move == 1)
+ M.can_move = 0
+ M.overlays += adminomaly
+ if(M.occupant)
+ M.removeVerb(/obj/mecha/verb/eject)
+ M.occupant << "You have been frozen by [key]"
+ message_admins("\blue [key_name_admin(usr)] froze [key_name(M.occupant)] in a [M.name]")
+ log_admin("[key_name(usr)] froze [key_name(M.occupant)] in a [M.name]")
+ else
+ message_admins("\blue [key_name_admin(usr)] froze an empty [M.name]")
+ log_admin("[key_name(usr)] froze an empty [M.name]")
+ else if(M.can_move == 0)
+ M.can_move = 1
+ M.overlays -= adminomaly
+ if(M.occupant)
+ M.addVerb(/obj/mecha/verb/eject)
+ M.occupant << "You have been unfrozen by [key]"
+ message_admins("\blue [key_name_admin(usr)] unfroze [key_name(M.occupant)] in a [M.name]")
+ log_admin("[key_name(usr)] unfroze [M.occupant.name]/[M.occupant.ckey] in a [M.name]")
+ else
+ message_admins("\blue [key_name_admin(usr)] unfroze an empty [M.name]")
+ log_admin("[key_name(usr)] unfroze an empty [M.name]")
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index d88d19fe99e..2fdf3c42498 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -3,6 +3,10 @@
M << "No attacking people at spawn, you jackass."
return
+ if(frozen)
+ M << "\red Do not touch Admin-Frozen people."
+ return
+
var/datum/organ/external/temp = M:organs_by_name["r_hand"]
if (M.hand)
temp = M:organs_by_name["l_hand"]
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 6f99995aba4..b98ea2c790f 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -71,5 +71,7 @@
var/lastFart = 0 // Toxic fart cooldown.
+ var/frozen = 0 //used for preventing attacks on admin-frozen people
+
fire_dmi = 'icons/mob/OnFire.dmi'
fire_sprite = "Standing"
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index b4f71ada72d..30e3f9dc5f5 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -395,6 +395,11 @@
del(src)
var/message=null
+ if(target.frozen)
+ source << "\red Do not attempt to strip frozen people."
+ return
+
+
switch(place)
if("syringe")
message = "\red [source] is trying to inject [target]!"
@@ -598,6 +603,10 @@ It can still be worn/put on as normal.
if (LinkBlockedUnclimbable(t_loc, s_loc)) return
if(item && source.get_active_hand() != item) return //Swapped hands / removed item from the active one
if ((source.restrained() || source.stat)) return //Source restrained or unconscious / dead
+ if(target.frozen)
+ source << "\red Do not attempt to strip frozen people."
+ return
+
var/slot_to_process
var/strip_item //this will tell us which item we will be stripping - if any.
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 17667aab4e9..5cfba55a6c9 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/paradise.dme b/paradise.dme
index b77e1e61f50..fa33cb1324b 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -885,6 +885,7 @@
#include "code\modules\admin\verbs\deadsay.dm"
#include "code\modules\admin\verbs\debug.dm"
#include "code\modules\admin\verbs\diagnostics.dm"
+#include "code\modules\admin\verbs\freeze.dm"
#include "code\modules\admin\verbs\getlogs.dm"
#include "code\modules\admin\verbs\honksquad.dm"
#include "code\modules\admin\verbs\mapping.dm"