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)