diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 7657b443daa..7efa81863b6 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -35,6 +35,7 @@
var/lights = 0
var/lights_power = 6
var/emagged = FALSE
+ var/frozen = FALSE
//inner atmos
var/use_internal_tank = 0
@@ -263,7 +264,7 @@
return 1
/obj/mecha/relaymove(mob/user, direction)
- if(!direction)
+ if(!direction || frozen)
return
if(user != occupant) //While not "realistic", this piece is player friendly.
user.forceMove(get_turf(src))
@@ -1049,6 +1050,9 @@
log_message("Now taking air from [use_internal_tank ? "internal airtank" : "environment"].")
/obj/mecha/MouseDrop_T(mob/M, mob/user)
+ if(frozen)
+ to_chat(user, "Do not enter Admin-Frozen mechs.")
+ return
if(user.incapacitated())
return
if(user != M)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index a8e3f33aa2c..62cb627db17 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -68,7 +68,6 @@ GLOBAL_LIST_INIT(admin_verbs_admin, list(
/client/proc/empty_ai_core_toggle_latejoin,
/client/proc/aooc,
/client/proc/freeze,
- /client/proc/freezemecha,
/client/proc/alt_check,
/client/proc/secrets,
/client/proc/change_human_appearance_admin, /* Allows an admin to change the basic appearance of human-based mobs */
diff --git a/code/modules/admin/verbs/freeze.dm b/code/modules/admin/verbs/freeze.dm
index f775ba0e917..0f52680acea 100644
--- a/code/modules/admin/verbs/freeze.dm
+++ b/code/modules/admin/verbs/freeze.dm
@@ -5,121 +5,99 @@
//////Allows admin's to right click on any mob/mech and freeze them in place.///
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
-GLOBAL_LIST_EMPTY(frozen_mob_list)
-/client/proc/freeze(var/mob/living/M as mob in GLOB.mob_list)
+
+GLOBAL_LIST_EMPTY(frozen_atom_list) // A list of admin-frozen atoms.
+
+/client/proc/freeze(atom/movable/M)
set name = "Freeze"
set category = null
if(!check_rights(R_ADMIN))
return
- if(!istype(M))
- return
+ M.admin_Freeze(src)
- if(M in GLOB.frozen_mob_list)
- M.admin_unFreeze(src)
- else
- M.admin_Freeze(src)
+/// Created here as a base proc. Override as needed for any type of object or mob you want able to be frozen.
+/atom/movable/proc/admin_Freeze(client/admin)
+ to_chat(admin, "Freeze is not able to be called on this type of object.You have been frozen by [admin]")
- message_admins("[key_name_admin(admin)] froze [key_name_admin(src)]")
- log_admin("[key_name(admin)] froze [key_name(src)]")
+/mob/living/admin_Freeze(client/admin, skip_overlays = FALSE, mech = null)
+ if(!istype(admin))
+ return
- var/obj/effect/overlay/adminoverlay/AO = new
- if(skip_overlays)
- overlays += AO
+ if(!(src in GLOB.frozen_atom_list))
+ GLOB.frozen_atom_list += src
- anchored = TRUE
- canmove = FALSE
- admin_prev_sleeping = sleeping
- AdjustSleeping(20000)
- frozen = AO
- if(!(src in GLOB.frozen_mob_list))
- GLOB.frozen_mob_list += src
+ var/obj/effect/overlay/adminoverlay/AO = new
+ if(skip_overlays)
+ overlays += AO
-/mob/living/proc/admin_unFreeze(client/admin, skip_overlays = FALSE)
- if(istype(admin))
- to_chat(src, "You have been unfrozen by [admin]")
- message_admins("[key_name_admin(admin)] unfroze [key_name_admin(src)]")
- log_admin("[key_name(admin)] unfroze [key_name(src)]")
+ anchored = TRUE
+ canmove = FALSE
+ admin_prev_sleeping = sleeping
+ AdjustSleeping(20000)
+ frozen = AO
- if(skip_overlays)
- overlays -= frozen
+ else
+ GLOB.frozen_atom_list -= src
- anchored = FALSE
- canmove = TRUE
- frozen = null
- SetSleeping(admin_prev_sleeping)
- admin_prev_sleeping = null
- if(src in GLOB.frozen_mob_list)
- GLOB.frozen_mob_list -= src
+ if(skip_overlays)
+ overlays -= frozen
+ anchored = FALSE
+ canmove = TRUE
+ frozen = null
+ SetSleeping(admin_prev_sleeping)
+ admin_prev_sleeping = null
+
+ to_chat(src, "You have been [frozen ? "frozen" : "unfrozen"] by [admin]")
+ message_admins("[key_name_admin(admin)] [frozen ? "froze" : "unfroze"] [key_name_admin(src)] [mech ? "in a [mech]" : ""]")
+ log_admin("[key_name(admin)] [frozen ? "froze" : "unfroze"] [key_name(src)] [mech ? "in a [mech]" : ""]")
update_icons()
+ return frozen
+
/mob/living/simple_animal/slime/admin_Freeze(admin)
- ..(admin)
- adjustHealth(1000) //arbitrary large value
-
-/mob/living/simple_animal/slime/admin_unFreeze(admin)
- ..(admin)
- revive()
-
+ if(..()) // The result of the parent call here will be the value of the mob's `frozen` variable after they get (un)frozen.
+ adjustHealth(1000) //arbitrary large value
+ else
+ revive()
/mob/living/simple_animal/var/admin_prev_health = null
/mob/living/simple_animal/admin_Freeze(admin)
- ..(admin)
- admin_prev_health = health
- health = 0
-
-/mob/living/simple_animal/admin_unFreeze(admin)
- ..(admin)
- revive()
- overlays.Cut()
+ if(..()) // The result of the parent call here will be the value of the mob's `frozen` variable after they get (un)frozen.
+ admin_prev_health = health
+ health = 0
+ else
+ revive()
+ overlays.Cut()
//////////////////////////Freeze Mech
-/client/proc/freezemecha(var/obj/mecha/O as obj in GLOB.mechas_list)
- set name = "Freeze Mech"
- set category = null
-
- if(!check_rights(R_ADMIN))
- return
-
- var/obj/mecha/M = O
- if(!istype(M,/obj/mecha))
- to_chat(src, "This can only be used on mechs!")
- return
+/obj/mecha/admin_Freeze(client/admin)
+ var/obj/effect/overlay/adminoverlay/freeze_overlay = new
+ if(!frozen)
+ GLOB.frozen_atom_list += src
+ frozen = TRUE
+ overlays += freeze_overlay
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)
- to_chat(M.occupant, "You have been frozen by [key]")
- message_admins("[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("[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)
- to_chat(M.occupant, "You have been unfrozen by [key]")
- message_admins("[key_name_admin(usr)] unfroze [key_name(M.occupant)] in a [M.name]")
- log_admin("[key_name(usr)] unfroze [key_name(M.occupant)] in a [M.name]")
- else
- message_admins("[key_name_admin(usr)] unfroze an empty [M.name]")
- log_admin("[key_name(usr)] unfroze an empty [M.name]")
+ GLOB.frozen_atom_list -= src
+ frozen = FALSE
+ overlays -= freeze_overlay
+
+ if(occupant)
+ occupant.admin_Freeze(admin, mech = name) // We also want to freeze the driver of the mech.
+ else
+ message_admins("[key_name_admin(admin)] [frozen ? "froze" : "unfroze"] an empty [name]")
+ log_admin("[key_name(admin)] [frozen ? "froze" : "unfroze"] an empty [name]")
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 4769153e1fd..d86f6f8f4c5 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -189,4 +189,4 @@
var/mob/living/simple_animal/diona/D = M
D.consume(src)
else
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 90ba1e7fe4f..1ca19ead32b 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -1290,15 +1290,12 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
apply_overlay(MISC_LAYER)
-/mob/living/carbon/human/admin_Freeze(client/admin, skip_overlays = TRUE)
- . = ..()
- overlays_standing[FROZEN_LAYER] = mutable_appearance(frozen, layer = -FROZEN_LAYER)
- apply_overlay(FROZEN_LAYER)
-
-/mob/living/carbon/human/admin_unFreeze(client/admin, skip_overlays = TRUE)
- . = ..()
- remove_overlay(FROZEN_LAYER)
-
+/mob/living/carbon/human/admin_Freeze(client/admin, skip_overlays = TRUE, mech = null)
+ if(..())
+ overlays_standing[FROZEN_LAYER] = mutable_appearance(frozen, layer = -FROZEN_LAYER)
+ apply_overlay(FROZEN_LAYER)
+ else
+ remove_overlay(FROZEN_LAYER)
/mob/living/carbon/human/proc/force_update_limbs()
for(var/obj/item/organ/external/O in bodyparts)