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"