diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 7e0f0bdc69..0022bd4dd9 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -71,7 +71,7 @@ /obj/machinery/gateway/centerstation/attack_ghost(mob/user as mob) if(awaygate) - if(user.client.holder) + if(check_rights_for(user.client, R_HOLDER)) user.loc = awaygate.loc else if(active) user.loc = awaygate.loc @@ -95,7 +95,7 @@ // commented out, of course. /* /atom/proc/attack_admin(mob/user as mob) - if(!user || !user.client || !user.client.holder) + if(!user || !user.client || !check_rights_for(user.client, R_HOLDER)) return attack_hand(user) diff --git a/code/controllers/admin.dm b/code/controllers/admin.dm index ff386cd196..69ec6de5cb 100644 --- a/code/controllers/admin.dm +++ b/code/controllers/admin.dm @@ -27,7 +27,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick) var/class /obj/effect/statclick/debug/Click() - if(!usr.client.holder || !target) + if(!check_rights_for(usr.client, R_HOLDER) || !target) return if(!class) if(istype(target, /datum/controller/subsystem)) diff --git a/code/controllers/subsystems/persistence.dm b/code/controllers/subsystems/persistence.dm index 4d4bdc4f01..2b1cef0e77 100644 --- a/code/controllers/subsystems/persistence.dm +++ b/code/controllers/subsystems/persistence.dm @@ -49,7 +49,7 @@ SUBSYSTEM_DEF(persistence) /datum/controller/subsystem/persistence/proc/show_info(var/mob/user) - if(!user.client.holder) + if(!check_rights_for(user.client, R_HOLDER)) return var/list/dat = list("") diff --git a/code/controllers/subsystems/plants.dm b/code/controllers/subsystems/plants.dm index dbcc40e8f9..922a2c42e5 100644 --- a/code/controllers/subsystems/plants.dm +++ b/code/controllers/subsystems/plants.dm @@ -152,7 +152,7 @@ SUBSYSTEM_DEF(plants) set name = "Show Plant Genes" set desc = "Prints the round's plant gene masks." - if(!holder) return + if(!check_rights_for(src, R_HOLDER)) return if(!SSplants || !SSplants.gene_tag_masks) to_chat(usr, "Gene masks not set.") diff --git a/code/controllers/subsystems/webhooks.dm b/code/controllers/subsystems/webhooks.dm index a47e8933d9..3a8031b4ea 100644 --- a/code/controllers/subsystems/webhooks.dm +++ b/code/controllers/subsystems/webhooks.dm @@ -60,7 +60,7 @@ SUBSYSTEM_DEF(webhooks) set name = "Reload Webhooks" set category = "Debug" - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return if(!SSwebhooks.subsystem_initialized) @@ -75,7 +75,7 @@ SUBSYSTEM_DEF(webhooks) set name = "Ping Webhook" set category = "Debug" - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return if(!length(SSwebhooks.webhook_decls)) diff --git a/code/datums/components/species/shadekin/powers/phase_shift.dm b/code/datums/components/species/shadekin/powers/phase_shift.dm new file mode 100644 index 0000000000..4580277558 --- /dev/null +++ b/code/datums/components/species/shadekin/powers/phase_shift.dm @@ -0,0 +1,258 @@ +///////////////////// +/// PHASE SHIFT /// +///////////////////// +//Visual effect for phase in/out +/obj/effect/temp_visual/shadekin + randomdir = FALSE + duration = 5 + icon = 'icons/mob/vore_shadekin.dmi' + +/obj/effect/temp_visual/shadekin/phase_in + icon_state = "tp_in" + +/obj/effect/temp_visual/shadekin/phase_out + icon_state = "tp_out" + +/datum/power/shadekin/phase_shift + name = "Phase Shift (100)" + desc = "Shift yourself out of alignment with realspace to travel quickly to different areas." + verbpath = /mob/living/proc/phase_shift + ability_icon_state = "phase_shift" + +/mob/living/proc/phase_shift() + set name = "Phase Shift (100)" + set desc = "Shift yourself out of alignment with realspace to travel quickly to different areas." + set category = "Abilities.Shadekin" + + var/datum/component/shadekin/SK = get_shadekin_component() + if(!SK) + return FALSE + if(stat) + to_chat(src, span_warning("Can't use that ability in your state!")) + return FALSE + var/area/A = get_area(src) + if(!check_rights_for(client, R_HOLDER) && A.flag_check(AREA_BLOCK_PHASE_SHIFT)) + to_chat(src, span_warning("You can't do that here!")) + return + + var/ability_cost = 100 + + var/darkness = 1 + var/turf/T = get_turf(src) + if(!T) + to_chat(src,span_warning("You can't use that here!")) + return FALSE + + if(SK.doing_phase) + return FALSE + + var/brightness = T.get_lumcount() //Brightness in 0.0 to 1.0 + darkness = 1-brightness //Invert + + var/watcher = 0 + for(var/mob/living/carbon/human/watchers in oview(7,src )) // If we can see them... + if(watchers in oviewers(7,src)) // And they can see us... + if(!(watchers.stat) && !isbelly(watchers.loc) && !istype(watchers.loc, /obj/item/holder)) // And they are alive and not being held by someone... + watcher++ // They are watching us! + + ability_cost = CLAMP(ability_cost/(0.01+darkness*2),50, 80)//This allows for 1 watcher in full light + if(watcher>0) + ability_cost = ability_cost + ( 15 * watcher ) + /* + if(!(SK.in_phase)) + log_debug("[src] attempted to shift with [watcher] visible Carbons with a cost of [ability_cost] in a darkness level of [darkness]") + */ + + if(SK.doing_phase) + to_chat(src, span_warning("You are already trying to phase!")) + return FALSE + else if(SK.shadekin_get_energy() < ability_cost && !(SK.in_phase)) + to_chat(src, span_warning("Not enough energy for that ability!")) + return FALSE + + if(!(SK.in_phase)) + SK.shadekin_adjust_energy(-ability_cost) + playsound(src, 'sound/effects/stealthoff.ogg', 75, 1) + + if(!T.CanPass(src,T) || loc != T) + to_chat(src,span_warning("You can't use that here!")) + return FALSE + + //Shifting in + if(SK.in_phase) + phase_in(T, SK) + //Shifting out + else + phase_out(T, SK) + + +/mob/living/proc/phase_in(var/turf/T, var/datum/component/shadekin/SK) + if(SK.in_phase) + + // pre-change + if(!isturf(T)) //Sanity + return + forceMove(T) + var/original_canmove = canmove + SetStunned(0) + SetWeakened(0) + if(buckled) + buckled.unbuckle_mob() + if(pulledby) + pulledby.stop_pulling() + stop_pulling() + + // change + canmove = FALSE + SK.in_phase = FALSE + SK.doing_phase = TRUE + throwpass = FALSE + name = get_visible_name() + for(var/obj/belly/B as anything in vore_organs) + B.escapable = initial(B.escapable) + + //cut_overlays() + invisibility = initial(invisibility) + see_invisible = initial(see_invisible) + incorporeal_move = initial(incorporeal_move) + density = initial(density) + can_pull_size = initial(can_pull_size) + can_pull_mobs = initial(can_pull_mobs) + hovering = initial(hovering) + update_icon() + + //Cosmetics mostly + var/obj/effect/temp_visual/shadekin/phase_in/phaseanim = new /obj/effect/temp_visual/shadekin/phase_in(src.loc) + phaseanim.pixel_y = (src.size_multiplier - 1) * 16 // Pixel shift for the animation placement + phaseanim.adjust_scale(src.size_multiplier, src.size_multiplier) + phaseanim.dir = dir + alpha = 0 + automatic_custom_emote(VISIBLE_MESSAGE,"phases in!") + + addtimer(CALLBACK(src, PROC_REF(shadekin_complete_phase_in), original_canmove, SK), 5, TIMER_DELETE_ME) + + +/mob/living/proc/shadekin_complete_phase_in(var/original_canmove, var/datum/component/shadekin/SK) + canmove = original_canmove + alpha = initial(alpha) + remove_modifiers_of_type(/datum/modifier/shadekin_phase_vision) + remove_modifiers_of_type(/datum/modifier/phased_out) + + //Potential phase-in vore + + if(can_be_drop_pred || can_be_drop_prey) //Toggleable in vore panel + var/list/potentials = living_mobs(0) + var/mob/living/our_prey + if(potentials.len) + var/mob/living/target = pick(potentials) + if(can_be_drop_pred && istype(target) && target.devourable && target.can_be_drop_prey && target.phase_vore && vore_selected && phase_vore) + target.forceMove(vore_selected) + to_chat(target, span_vwarning("\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!")) + to_chat(src, span_vwarning("You phase around [target], [vore_selected.vore_verb]ing them into your [vore_selected.name]!")) + our_prey = target + else if(can_be_drop_prey && istype(target) && devourable && target.can_be_drop_pred && target.phase_vore && target.vore_selected && phase_vore) + our_prey = src + forceMove(target.vore_selected) + to_chat(target, span_vwarning("\The [src] phases into you, [target.vore_selected.vore_verb]ing them into your [target.vore_selected.name]!")) + to_chat(src, span_vwarning("You phase into [target], having them [target.vore_selected.vore_verb] you into their [target.vore_selected.name]!")) + if(our_prey) + for(var/obj/item/flashlight/held_lights in our_prey.contents) + if(istype(held_lights,/obj/item/flashlight/glowstick) ||istype(held_lights,/obj/item/flashlight/flare) ) //No affecting glowsticks or flares...As funny as that is + continue + held_lights.on = 0 + held_lights.update_brightness() + + SK.doing_phase = FALSE + if(!SK.flicker_time) + return //Early return. No time, no flickering. + //Affect nearby lights + for(var/obj/machinery/light/L in range(SK.flicker_distance, src)) + if(prob(SK.flicker_break_chance)) + addtimer(CALLBACK(L, TYPE_PROC_REF(/obj/machinery/light, broken)), rand(5,25), TIMER_DELETE_ME) + else + if(SK.flicker_color) + L.flicker(SK.flicker_time, SK.flicker_color) + else + L.flicker(SK.flicker_time) + for(var/obj/item/flashlight/flashlights in range(SK.flicker_distance, src)) //Find any flashlights near us and make them flicker too! + if(istype(flashlights,/obj/item/flashlight/glowstick) ||istype(flashlights,/obj/item/flashlight/flare)) //No affecting glowsticks or flares...As funny as that is + continue + flashlights.flicker(SK.flicker_time, SK.flicker_color, TRUE) + for(var/mob/living/creatures in range(SK.flicker_distance, src)) + if(isbelly(creatures.loc)) //don't flicker anyone that gets nomphed. + continue + for(var/obj/item/flashlight/held_lights in creatures.contents) + if(istype(held_lights,/obj/item/flashlight/glowstick) ||istype(held_lights,/obj/item/flashlight/flare) ) //No affecting glowsticks or flares...As funny as that is + continue + held_lights.flicker(SK.flicker_time, SK.flicker_color, TRUE) + +/mob/living/proc/phase_out(var/turf/T) + var/datum/component/shadekin/SK = get_shadekin_component() + if(!(SK.in_phase)) + // pre-change + forceMove(T) + var/original_canmove = canmove + SetStunned(0) + SetWeakened(0) + if(buckled) + buckled.unbuckle_mob() + if(pulledby) + pulledby.stop_pulling() + stop_pulling() + if(SK.normal_phase && SK.drop_items_on_phase) + drop_both_hands() + if(back) + unEquip(back) + + can_pull_size = 0 + can_pull_mobs = MOB_PULL_NONE + hovering = TRUE + canmove = FALSE + + // change + SK.in_phase = TRUE + SK.doing_phase = TRUE + throwpass = TRUE + automatic_custom_emote(VISIBLE_MESSAGE,"phases out!") + + if(real_name) //If we a real name, perfect, let's just set our name to our newfound visible name. + name = get_visible_name() + else //If we don't, let's put our real_name as our initial name. + real_name = initial(name) + name = get_visible_name() + + for(var/obj/belly/B as anything in vore_organs) + B.escapable = FALSE + + var/obj/effect/temp_visual/shadekin/phase_out/phaseanim = new /obj/effect/temp_visual/shadekin/phase_out(src.loc) + phaseanim.pixel_y = (src.size_multiplier - 1) * 16 // Pixel shift for the animation placement + phaseanim.adjust_scale(src.size_multiplier, src.size_multiplier) + phaseanim.dir = dir + alpha = 0 + add_modifier(/datum/modifier/shadekin_phase_vision) + if(SK.normal_phase) + add_modifier(/datum/modifier/phased_out) + addtimer(CALLBACK(src, PROC_REF(complete_phase_out), original_canmove, SK), 5, TIMER_DELETE_ME) + + +/mob/living/proc/complete_phase_out(original_canmove, var/datum/component/shadekin/SK) + invisibility = INVISIBILITY_SHADEKIN + see_invisible = INVISIBILITY_SHADEKIN + see_invisible_default = INVISIBILITY_SHADEKIN // Allow seeing phased entities while phased. + update_icon() + alpha = 127 + + canmove = original_canmove + incorporeal_move = TRUE + density = FALSE + SK.doing_phase = FALSE + +/datum/modifier/shadekin_phase_vision + name = "Shadekin Phase Vision" + vision_flags = SEE_THRU + +/datum/modifier/phased_out + name = "Phased Out" + desc = "You are currently phased out of realspace, and cannot interact with it." + hidden = TRUE + //Stops you from using guns. See /obj/item/gun/proc/special_check(var/mob/user) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 4ce089e0e6..b39856f8e6 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -569,7 +569,7 @@ GLOBAL_DATUM(spoiler_obfuscation_image, /image) return if(!isliving(ourmob)) return - if(ourmob.client?.holder) + if(check_rights_for(ourmob.client, R_HOLDER)) return if(issimplekin(ourmob)) var/mob/living/simple_mob/shadekin/SK = ourmob diff --git a/code/game/base_turf.dm b/code/game/base_turf.dm index c327c8e54f..62318b67d8 100644 --- a/code/game/base_turf.dm +++ b/code/game/base_turf.dm @@ -17,7 +17,7 @@ set name = "Set Base Turf" set desc = "Set the base turf for a z-level." - if(!holder) return + if(!check_rights_for(src, R_HOLDER)) return var/choice = tgui_input_number(usr, "Which Z-level do you wish to set the base turf for?") if(!choice) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 3b7ff3f3c7..2db118cfd7 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -551,7 +551,7 @@ GLOBAL_LIST_EMPTY(additional_antag_types) msg = span_notice(msg)// close the span from right at the top for(var/mob/M in mob_list) - if(M.client && M.client.holder) + if(M.client && check_rights_for(M.client, R_HOLDER)) to_chat(M,msg) /proc/get_nt_opposed() diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index 42ae36dfa9..6da57c6149 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -22,7 +22,7 @@ mob if(GLOB.master_mode == "sandbox") sandbox = new/datum/hSB sandbox.owner = src.ckey - if(src.client.holder) + if(check_rights_for(src.client, R_HOLDER)) sandbox.admin = 1 add_verb(src, /mob/proc/sandbox_panel) sandbox_panel() diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 61f1d7c63a..412dea4f99 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -406,7 +406,7 @@ GLOBAL_VAR_INIT(message_delay, 0) // To make sure restarting the recentmessages /* --- Loop through the receivers and categorize them --- */ // Allows admins to disable radio - if(R?.client?.holder) + if(check_rights_for(R?.client, R_HOLDER)) if(!R.client?.prefs?.read_preference(/datum/preference/toggle/holder/hear_radio)) continue @@ -623,7 +623,7 @@ GLOBAL_VAR_INIT(message_delay, 0) // To make sure restarting the recentmessages /* --- Loop through the receivers and categorize them --- */ // Allow admins to disable radios completely - if(R?.client?.holder) + if(check_rights_for(R?.client, R_HOLDER)) if(!R.client?.prefs?.read_preference(/datum/preference/toggle/holder/hear_radio)) continue diff --git a/code/game/objects/micro_event.dm b/code/game/objects/micro_event.dm index 13f2214191..2b800f24e8 100644 --- a/code/game/objects/micro_event.dm +++ b/code/game/objects/micro_event.dm @@ -7,7 +7,7 @@ var/size_limit = 0.5 /obj/structure/portal_event/resize/attack_ghost(var/mob/observer/dead/user) - if(!target && user?.client?.holder) + if(!target && check_rights_for(user?.client, R_HOLDER)) if(tgui_alert(user, "Would you like to adjust the portal's size settings?", "Change portal size settings", list("No","Yes")) == "Yes") var/our_message if(tgui_alert(user, "Should this portal shrink people who are over the limit, or grow people who are under the limit?", "Change portal size settings", list("Shrink","Grow")) == "Shrink") diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index c2d8133296..2551fabfeb 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -541,7 +541,7 @@ * For now, we do it this way because calling this on a canvas itself might cause issues due to the whole dimension thing. */ /obj/structure/sign/painting/proc/admin_lateload_painting(var/spawn_specific = 0, var/which_painting = 0) - if(!usr.client.holder) + if(!check_rights_for(usr.client, R_HOLDER)) return 0 if(spawn_specific && isnum(which_painting)) var/list/painting = SSpersistence.all_paintings[which_painting] diff --git a/code/game/objects/structures/props/machines.dm b/code/game/objects/structures/props/machines.dm index 2ece08ea99..b58a05dd02 100644 --- a/code/game/objects/structures/props/machines.dm +++ b/code/game/objects/structures/props/machines.dm @@ -640,7 +640,7 @@ return if(!ismovable(AM)) return - if(!user.client?.holder) + if(!check_rights_for(user.client, R_HOLDER)) return if(changing_state) return diff --git a/code/game/response_team.dm b/code/game/response_team.dm index d00cbb559e..cfdcd54e1b 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -12,7 +12,7 @@ GLOBAL_VAR_INIT(silent_ert, 0) set category = "Fun.Event Kit" set desc = "Send an emergency response team to the station" - if(!holder) + if(!check_rights_for(src, R_HOLDER)) to_chat(usr, span_danger("Only administrators may use this command.")) return if(!ticker) diff --git a/code/modules/admin/ToRban.dm b/code/modules/admin/ToRban.dm index 2152fa9759..8cdae64876 100644 --- a/code/modules/admin/ToRban.dm +++ b/code/modules/admin/ToRban.dm @@ -46,7 +46,7 @@ /client/proc/ToRban(task in list("update","toggle","show","remove","remove all","find")) set name = "ToRban" set category = "Server.Config" - if(!holder) return + if(!check_rights_for(src, R_HOLDER)) return switch(task) if("update") ToRban_update() diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 25085f7176..9a45d67338 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -630,7 +630,7 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_HOLDER, "Show Player Panel", m set category = "Server.Game" set name = "Restart" set desc="Restarts the world" - if (!usr.client.holder) + if (!check_rights_for(usr.client, R_HOLDER)) return var/confirm = alert(usr, "Restart the game world?", "Restart", "Yes", "Cancel") // Not tgui_alert for safety if(!confirm || confirm == "Cancel") @@ -1021,7 +1021,7 @@ var/datum/announcement/minor/admin_min_announcer = new set category = "Server.Game" set desc="Reboots the server post haste" set name="Immediate Reboot" - if(!usr.client.holder) return + if(!check_rights_for(usr.client, R_HOLDER)) return if(alert(usr, "Reboot server?","Reboot!","Yes","No") != "Yes") // Not tgui_alert for safety return to_world(span_filter_system("[span_red(span_bold("Rebooting world!"))] [span_blue("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]!")]")) @@ -1299,7 +1299,7 @@ var/datum/announcement/minor/admin_min_announcer = new set name = "Update Mob Sprite" set desc = "Should fix any mob sprite update errors." - if (!holder) + if (!check_rights_for(src, R_HOLDER)) to_chat(src, "Only administrators may use this command.") return diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index a1dd87e65d..8005c3535e 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -29,7 +29,7 @@ /client/proc/investigate_show( subject in list("hrefs","notes","singulo","telesci") ) set name = "Investigate" set category = "Admin.Investigate" - if(!holder) return + if(!check_rights_for(src, R_HOLDER)) return switch(subject) if("singulo", "telesci") //general one-round-only stuff var/F = investigate_subject2file(subject) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 6a87e5f0df..b160234141 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -67,7 +67,7 @@ /client/proc/admin_ghost() set category = "Admin.Game" set name = "Aghost" - if(!holder) return + if(!check_rights_for(src, R_HOLDER)) return var/build_mode if(src.buildmode) diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index b4006982ca..f2ac1eeb14 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -245,7 +245,7 @@ you will have to do something like if(client.rights & R_ADMIN) yourself. //probably a bit iffy - will hopefully figure out a better solution /proc/check_if_greater_rights_than(client/other) if(usr?.client) - if(usr.client.holder) + if(check_rights_for(usr.client, R_HOLDER)) if(!other || !other.holder) return TRUE return usr.client.holder.check_if_greater_rights_than_holder(other.holder) diff --git a/code/modules/admin/player_effects.dm b/code/modules/admin/player_effects.dm index b557600ae6..ea882bb755 100644 --- a/code/modules/admin/player_effects.dm +++ b/code/modules/admin/player_effects.dm @@ -623,7 +623,7 @@ var/mob/living/carbon/human/Tar = target if(!istype(Tar)) return - if(!user.client.holder) + if(!check_rights_for(user.client, R_HOLDER)) return var/obj/item/X = user.client.holder.marked_datum if(!istype(X)) @@ -634,7 +634,7 @@ var/mob/living/carbon/human/Tar = target if(!istype(Tar)) return - if(!user.client.holder) + if(!check_rights_for(user.client, R_HOLDER)) return var/obj/item/X = user.client.holder.marked_datum if(!istype(X)) diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 9c844fac91..6fd7cc9716 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -1,6 +1,6 @@ /datum/admins/proc/player_panel_new()//The new one - if (!usr.client.holder) + if (!check_rights_for(usr.client, R_HOLDER)) return var/ui_scale = owner.prefs.read_preference(/datum/preference/toggle/ui_scale) var/dat = "Admin Player Panel" @@ -324,7 +324,7 @@ //The old one /datum/admins/proc/player_panel_old() - if (!usr.client.holder) + if (!check_rights_for(usr.client, R_HOLDER)) return var/dat = "Player Menu" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 4e2d1fe2bf..2baa74e7c1 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -835,7 +835,7 @@ var/mob/M = locate(href_list["newban"]) if(!ismob(M)) return - if(M.client && M.client.holder) return //admins cannot be banned. Even if they could, the ban doesn't affect them anyway + if(M.client && check_rights_for(M.client, R_HOLDER)) return //admins cannot be banned. Even if they could, the ban doesn't affect them anyway switch(tgui_alert(usr, "Temporary Ban?","Temporary Ban",list("Yes","No","Cancel"))) if(null) diff --git a/code/modules/admin/verbs/antag-ooc.dm b/code/modules/admin/verbs/antag-ooc.dm index 8309e19091..792bbb650b 100644 --- a/code/modules/admin/verbs/antag-ooc.dm +++ b/code/modules/admin/verbs/antag-ooc.dm @@ -31,7 +31,7 @@ for(var/mob/M in mob_list) if(check_rights_for(M.client, R_ADMIN|R_MOD|R_EVENT)) // Staff can see AOOC unconditionally, and with more details. - to_chat(M, span_ooc(span_aooc("[create_text_tag("aooc", "Antag-OOC:", M.client)] [get_options_bar(src, 0, 1, 1)]([admin_jump_link(usr, M.client.holder)]): " + span_message("[msg]")))) + to_chat(M, span_ooc(span_aooc("[create_text_tag("aooc", "Antag-OOC:", M.client)] [get_options_bar(src, 0, 1, 1)]([admin_jump_link(usr, check_rights_for(M.client, R_HOLDER))]): " + span_message("[msg]")))) else if(M.client) // Players can only see AOOC if observing, or if they are an antag type allowed to use AOOC. var/datum/antagonist/A = null if(M.mind) // Observers don't have minds, but they should still see AOOC. diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index e73e6abef9..3cf0dab812 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -2,7 +2,7 @@ set category = "Mapping" set name = "Check Piping" set background = 1 - if(!src.holder) + if(!check_rights_for(src, R_HOLDER)) return feedback_add_details("admin_verb","CP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -43,7 +43,7 @@ /client/proc/powerdebug() set category = "Mapping" set name = "Check Power" - if(!src.holder) + if(!check_rights_for(src, R_HOLDER)) return feedback_add_details("admin_verb","CPOW") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/custom_event.dm b/code/modules/admin/verbs/custom_event.dm index fe341f7932..18ad5adc9e 100644 --- a/code/modules/admin/verbs/custom_event.dm +++ b/code/modules/admin/verbs/custom_event.dm @@ -3,7 +3,7 @@ set category = "Fun.Event Kit" set name = "Change Custom Event" - if(!holder) + if(!check_rights_for(src, R_HOLDER)) to_chat(src, "Only administrators may use this command.") return diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 4a0ceb1554..b8b296ab3c 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -2,7 +2,7 @@ set category = "Admin.Chat" set name = "Dsay" //Gave this shit a shorter name so you only have to time out "dsay" rather than "dead say" to use it --NeoFite set hidden = 1 - if(!src.holder) + if(!check_rights_for(src, R_HOLDER)) to_chat(src, "Only administrators may use this command.") return if(!src.mob) diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 4fb01a3b31..36b940d255 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -245,7 +245,7 @@ var/list/sounds_cache = list() /client/proc/stop_sounds() set category = "Debug.Dangerous" set name = "Stop All Playing Sounds" - if(!src.holder) + if(!check_rights_for(src, R_HOLDER)) return log_admin("[key_name(src)] stopped all currently playing sounds.") diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index aee7076944..d043effd6c 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -20,7 +20,7 @@ ADMIN_VERB(drop_everything, R_ADMIN, "Drop Everything", ADMIN_VERB_NO_DESCRIPTIO /client/proc/cmd_admin_prison(mob/M as mob in mob_list) set category = "Admin.Game" set name = "Prison" - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return if (ismob(M)) @@ -48,7 +48,7 @@ ADMIN_VERB(drop_everything, R_ADMIN, "Drop Everything", ADMIN_VERB_NO_DESCRIPTIO /client/proc/cmd_check_new_players() set category = "Admin.Investigate" set name = "Check new Players" - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return var/age = tgui_alert(src, "Age check", "Show accounts yonger then _____ days", list("7","30","All")) @@ -86,7 +86,7 @@ ADMIN_VERB(drop_everything, R_ADMIN, "Drop Everything", ADMIN_VERB_NO_DESCRIPTIO set name = "Subtle Message" if(!ismob(M)) return - if (!holder) + if (!check_rights_for(src, R_HOLDER)) return var/msg = tgui_input_text(usr, "Message:", text("Subtle PM to [M.key]")) @@ -99,7 +99,7 @@ ADMIN_VERB(drop_everything, R_ADMIN, "Drop Everything", ADMIN_VERB_NO_DESCRIPTIO if(usr) if (usr.client) - if(usr.client.holder) + if(check_rights_for(usr.client, R_HOLDER)) to_chat(M, span_bold("You hear a voice in your head...") + " " + span_italics("[msg]")) log_admin("SubtlePM: [key_name(usr)] -> [key_name(M)] : [msg]") @@ -112,7 +112,7 @@ ADMIN_VERB(drop_everything, R_ADMIN, "Drop Everything", ADMIN_VERB_NO_DESCRIPTIO set category = "Fun.Narrate" set name = "Global Narrate" - if (!holder) + if (!check_rights_for(src, R_HOLDER)) return var/msg = tgui_input_text(usr, "Message:", text("Enter the text you wish to appear to everyone:")) @@ -133,7 +133,7 @@ ADMIN_VERB(drop_everything, R_ADMIN, "Drop Everything", ADMIN_VERB_NO_DESCRIPTIO set category = "Fun.Narrate" set name = "Direct Narrate" - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return if(!M) @@ -160,7 +160,7 @@ ADMIN_VERB(drop_everything, R_ADMIN, "Drop Everything", ADMIN_VERB_NO_DESCRIPTIO set category = "Admin.Game" set name = "Godmode" - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return M.status_flags ^= GODMODE @@ -180,16 +180,16 @@ ADMIN_VERB(drop_everything, R_ADMIN, "Drop Everything", ADMIN_VERB_NO_DESCRIPTIO else if(!usr || !usr.client) return - if(!usr.client.holder) + if(!check_rights_for(usr.client, R_HOLDER)) to_chat(usr, span_red("Error: cmd_admin_mute: You don't have permission to do this.")) return if(!M.client) to_chat(usr, span_red("Error: cmd_admin_mute: This mob doesn't have a client tied to it.")) - if(M.client.holder) + if(check_rights_for(M.client, R_HOLDER)) to_chat(usr, span_red("Error: cmd_admin_mute: You cannot mute an admin/mod.")) if(!M.client) return - if(M.client.holder) + if(check_rights_for(M.client, R_HOLDER)) return var/muteunmute @@ -230,7 +230,7 @@ ADMIN_VERB(drop_everything, R_ADMIN, "Drop Everything", ADMIN_VERB_NO_DESCRIPTIO set category = "Fun.Silicon" set name = "Add Random AI Law" - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return var/confirm = tgui_alert(src, "You sure?", "Confirm", list("Yes", "No")) @@ -282,7 +282,7 @@ Ccomp's first proc. set name = "Allow player to respawn" set desc = "Let a player bypass the wait to respawn or allow them to re-enter their corpse." - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return var/target = tgui_input_list(usr, "Select a ckey to allow to rejoin", "Allow Respawn Selector", GLOB.respawn_timers) @@ -319,13 +319,13 @@ Ccomp's first proc. set name = "Toggle antagHUD usage" set desc = "Toggles antagHUD usage for observers" - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return var/action="" if(CONFIG_GET(flag/antag_hud_allowed)) for(var/mob/observer/dead/g in get_ghosts()) - if(!g.client.holder) //Remove the verb from non-admin ghosts + if(!check_rights_for(g.client, R_HOLDER)) //Remove the verb from non-admin ghosts remove_verb(g, /mob/observer/dead/verb/toggle_antagHUD) if(g.antagHUD) g.antagHUD = 0 // Disable it on those that have it enabled @@ -336,7 +336,7 @@ Ccomp's first proc. action = "disabled" else for(var/mob/observer/dead/g in get_ghosts()) - if(!g.client.holder) // Add the verb back for all non-admin ghosts + if(!check_rights_for(g.client, R_HOLDER)) // Add the verb back for all non-admin ghosts add_verb(g, /mob/observer/dead/verb/toggle_antagHUD) to_chat(g, span_boldnotice("The Administrator has enabled AntagHUD")) // Notify all observers they can now use AntagHUD CONFIG_SET(flag/antag_hud_allowed, TRUE) @@ -354,7 +354,7 @@ Ccomp's first proc. set name = "Toggle antagHUD Restrictions" set desc = "Restricts players that have used antagHUD from being able to join this round." - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return var/action="" @@ -614,7 +614,7 @@ ADMIN_VERB(respawn_character, (R_ADMIN|R_REJUVINATE), "Spawn Character", "(Re)Sp set category = "Fun.Silicon" set name = "Add Custom AI law" - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return var/input = sanitize(tgui_input_text(usr, "Please enter anything you want the AI to do. Anything. Serious.", "What?", "")) @@ -643,7 +643,7 @@ ADMIN_VERB(respawn_character, (R_ADMIN|R_REJUVINATE), "Spawn Character", "(Re)Sp set category = "Admin.Game" set name = "Rejuvenate" - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return if(!mob) @@ -666,7 +666,7 @@ ADMIN_VERB(respawn_character, (R_ADMIN|R_REJUVINATE), "Spawn Character", "(Re)Sp set category = "Fun.Event Kit" set name = "Create Command Report" - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return var/input = sanitize(tgui_input_text(usr, "Please enter anything you want. Anything. Serious.", "What?", "", multiline = TRUE, prevent_enter = TRUE), extra = 0) @@ -696,7 +696,7 @@ ADMIN_VERB(respawn_character, (R_ADMIN|R_REJUVINATE), "Spawn Character", "(Re)Sp set category = "Admin.Game" set name = "Delete" - if (!holder) + if (!check_rights_for(src, R_HOLDER)) return admin_delete(O) @@ -705,7 +705,7 @@ ADMIN_VERB(respawn_character, (R_ADMIN|R_REJUVINATE), "Spawn Character", "(Re)Sp set category = "Admin.Investigate" set name = "List free slots" - if (!holder) + if (!check_rights_for(src, R_HOLDER)) return if(job_master) @@ -717,7 +717,7 @@ ADMIN_VERB(respawn_character, (R_ADMIN|R_REJUVINATE), "Spawn Character", "(Re)Sp /client/proc/cmd_manual_ban() set name = "Manual Ban" set category = "Admin.Moderation" - if(!authenticated || !holder) + if(!authenticated || !check_rights_for(src, R_HOLDER)) to_chat(src, "Only administrators may use this command.") return var/mob/M = null @@ -730,7 +730,7 @@ ADMIN_VERB(respawn_character, (R_ADMIN|R_REJUVINATE), "Spawn Character", "(Re)Sp if(!selection) return M = selection:mob - if ((M.client && M.client.holder && (M.client.holder.level >= holder.level))) + if ((M.client && check_rights_for(M.client, R_HOLDER) && (M.client.holder.level >= holder.level))) tgui_alert_async(usr, "You cannot perform this action. You must be of a higher administrative rank!") return @@ -780,7 +780,7 @@ ADMIN_VERB(respawn_character, (R_ADMIN|R_REJUVINATE), "Spawn Character", "(Re)Sp set name = "Check Contents" set popup_menu = FALSE - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return var/list/L = M.get_contents() @@ -792,7 +792,7 @@ ADMIN_VERB(respawn_character, (R_ADMIN|R_REJUVINATE), "Spawn Character", "(Re)Sp /client/proc/cmd_admin_remove_phoron() set category = "Debug.Game" set name = "Stabilize Atmos." - if(!holder) + if(!check_rights_for(src, R_HOLDER)) to_chat(src, "Only administrators may use this command.") return feedback_add_details("admin_verb","STATM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -824,7 +824,7 @@ ADMIN_VERB(respawn_character, (R_ADMIN|R_REJUVINATE), "Spawn Character", "(Re)Sp set name = "Change View Range" set desc = "switches between 1x and custom views" - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return var/view = src.view diff --git a/code/modules/admin/verbs/smite.dm b/code/modules/admin/verbs/smite.dm index 38e71e3738..f85b2f34a5 100644 --- a/code/modules/admin/verbs/smite.dm +++ b/code/modules/admin/verbs/smite.dm @@ -317,7 +317,7 @@ var/redspace_abduction_z target.forceMove(locate(target.x,target.y,redspace_abduction_z)) to_chat(target,span_danger("The tug relaxes, but everything around you looks... slightly off.")) - to_chat(user,span_notice("The mob has been moved. ([admin_jump_link(target,usr.client.holder)])")) + to_chat(user, span_notice("The mob has been moved. ([admin_jump_link(target, check_rights_for(usr.client, R_HOLDER))])")) target.transforming = FALSE diff --git a/code/modules/admin/verbs/special_verbs.dm b/code/modules/admin/verbs/special_verbs.dm index 4dd67e052d..db33a14795 100644 --- a/code/modules/admin/verbs/special_verbs.dm +++ b/code/modules/admin/verbs/special_verbs.dm @@ -17,7 +17,7 @@ A.associate(src) - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return //This can happen if an admin attempts to vv themself into somebody elses's deadmin datum by getting ref via brute force to_chat(src, span_interface("You are now an admin."), confidential = TRUE) diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index a3eea5b9b6..5056447292 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -6,7 +6,7 @@ var/const/commandos_possible = 6 //if more Commandos are needed in the future set name = "Spawn Strike Team" set desc = "Spawns a strike team if you want to run an admin event." - if(!src.holder) + if(!check_rights_for(src, R_HOLDER)) to_chat(src, "Only administrators may use this command.") return diff --git a/code/modules/admin/view_variables/tag_datum.dm b/code/modules/admin/view_variables/tag_datum.dm index b4ca42860c..ff8afb955f 100644 --- a/code/modules/admin/view_variables/tag_datum.dm +++ b/code/modules/admin/view_variables/tag_datum.dm @@ -12,5 +12,5 @@ else holder.add_tagged_datum(target_datum) -ADMIN_VERB_ONLY_CONTEXT_MENU(tag_datum, R_NONE, "Tag Datum", datum/target_datum as mob|obj|turf|area in view()) +ADMIN_VERB_ONLY_CONTEXT_MENU(tag_datum, R_HOLDER, "Tag Datum", datum/target_datum as mob|obj|turf|area in view()) user.tag_datum(target_datum) diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm index e477ad7bc3..2ed195dd02 100644 --- a/code/modules/admin/view_variables/view_variables.dm +++ b/code/modules/admin/view_variables/view_variables.dm @@ -11,7 +11,7 @@ ADMIN_VERB_AND_CONTEXT_MENU(debug_variables, (R_DEBUG|R_SERVER|R_ADMIN|R_SPAWN|R //set src in world var/static/cookieoffset = rand(1, 9999) //to force cookies to reset after the round. - if(!usr.client || !usr.client.holder) //This is usr because admins can call the proc on other clients, even if they're not admins, to show them VVs. + if(!usr.client || !check_rights_for(usr.client, R_HOLDER)) //This is usr because admins can call the proc on other clients, even if they're not admins, to show them VVs. to_chat(usr, span_danger("You need to be an administrator to access this."), confidential = TRUE) return diff --git a/code/modules/awaymissions/redgate.dm b/code/modules/awaymissions/redgate.dm index af3a8c0122..5e2282322b 100644 --- a/code/modules/awaymissions/redgate.dm +++ b/code/modules/awaymissions/redgate.dm @@ -135,7 +135,7 @@ /obj/structure/redgate/attack_ghost(var/mob/observer/dead/user) if(target) - if(!(secret || target.secret) || user?.client?.holder) + if(!(secret || target.secret) || check_rights_for(user?.client, R_HOLDER)) user.forceMove(get_turf(target)) else return ..() diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 99edb2c08a..7ed4c158d7 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -55,7 +55,7 @@ // Rate limiting var/mtl = CONFIG_GET(number/minute_topic_limit) - if (!holder && mtl) + if (!check_rights_for(src, R_HOLDER) && mtl) var/minute = round(world.time, 600) if (!topiclimiter) topiclimiter = new(LIMITER_SIZE) @@ -73,7 +73,7 @@ return var/stl = CONFIG_GET(number/second_topic_limit) - if (!holder && stl && href_list["window_id"] != "statbrowser") + if (!check_rights_for(src, R_HOLDER) && stl && href_list["window_id"] != "statbrowser") var/second = round(world.time, 10) if (!topiclimiter) topiclimiter = new(LIMITER_SIZE) @@ -113,7 +113,7 @@ return if(href_list["irc_msg"]) - if(!holder && received_irc_pm < world.time - 6000) //Worse they can do is spam IRC for 10 minutes + if(!check_rights_for(src, R_HOLDER) && received_irc_pm < world.time - 6000) //Worse they can do is spam IRC for 10 minutes to_chat(src, span_warning("You are no longer able to use this, it's been more than 10 minutes since an admin on IRC has responded to you")) return if(mute_irc) @@ -782,7 +782,7 @@ // Mouse stuff /client/Click(atom/object, atom/location, control, params) var/mcl = CONFIG_GET(number/minute_click_limit) - if (!holder && mcl) + if (!check_rights_for(src, R_HOLDER) && mcl) var/minute = round(world.time, 600) if (!clicklimiter) @@ -805,7 +805,7 @@ return var/scl = CONFIG_GET(number/second_click_limit) - if (!holder && scl) + if (!check_rights_for(src, R_HOLDER) && scl) var/second = round(world.time, 10) if (!clicklimiter) clicklimiter = new(LIMITER_SIZE) @@ -827,13 +827,13 @@ window_scaling = text2num(winget(src, null, "dpi")) /client/proc/open_filter_editor(atom/in_atom) - if(holder) + if(check_rights_for(src, R_HOLDER)) holder.filteriffic = new /datum/filter_editor(in_atom) holder.filteriffic.tgui_interact(mob) ///opens the particle editor UI for the in_atom object for this client /client/proc/open_particle_editor(atom/movable/in_atom) - if(holder) + if(check_rights_for(src, R_HOLDER)) holder.particle_test = new /datum/particle_editor(in_atom) holder.particle_test.tgui_interact(mob) diff --git a/code/modules/client/preferences/types/game/admin.dm b/code/modules/client/preferences/types/game/admin.dm index 89ee5b6bd4..9b72658b89 100644 --- a/code/modules/client/preferences/types/game/admin.dm +++ b/code/modules/client/preferences/types/game/admin.dm @@ -46,7 +46,7 @@ if(!.) return - return preferences.client.holder + return check_rights_for(preferences.client, R_HOLDER) /datum/preference/toggle/holder/play_adminhelp_ping category = PREFERENCE_CATEGORY_GAME_PREFERENCES diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index 33545d6cdd..8e55fda987 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -16,7 +16,7 @@ to_chat(src, span_warning("You have OOC muted.")) return - if(!holder) + if(!check_rights_for(src, R_HOLDER)) if(!CONFIG_GET(flag/ooc_allowed)) to_chat(src, span_danger("OOC is globally muted.")) return diff --git a/code/modules/eventkit/generic_objects/generic_item.dm b/code/modules/eventkit/generic_objects/generic_item.dm index 573eacccf9..cd83e46c0e 100644 --- a/code/modules/eventkit/generic_objects/generic_item.dm +++ b/code/modules/eventkit/generic_objects/generic_item.dm @@ -173,7 +173,7 @@ var/check_togglable - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return var/s_name = tgui_input_text(src, "Item Name:", "Name") diff --git a/code/modules/eventkit/generic_objects/generic_structure.dm b/code/modules/eventkit/generic_objects/generic_structure.dm index 8a79e11419..02d3fa75be 100644 --- a/code/modules/eventkit/generic_objects/generic_structure.dm +++ b/code/modules/eventkit/generic_objects/generic_structure.dm @@ -226,7 +226,7 @@ var/check_togglable - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return var/s_name = tgui_input_text(src, "Structure Name:", "Name") diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm index 96e69623dc..e321978043 100644 --- a/code/modules/events/event_manager.dm +++ b/code/modules/events/event_manager.dm @@ -226,7 +226,7 @@ set name = "Trigger Event (Debug Only)" set category = "Debug.Dangerous" - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return if(ispath(type)) diff --git a/code/modules/food/recipe_dump.dm b/code/modules/food/recipe_dump.dm index 3908e1750d..a64f5d6485 100644 --- a/code/modules/food/recipe_dump.dm +++ b/code/modules/food/recipe_dump.dm @@ -3,7 +3,7 @@ set category = "Server.Admin" set desc = "Dumps food and drink recipe info and images for wiki or other use." - if(!holder) + if(!check_rights_for(src, R_HOLDER)) return //////////////////////// DRINK diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 8aac9beb41..df35d3e74f 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -214,7 +214,7 @@ Works together with spawning an observer, noted above. //RS Port #658 Start /mob/observer/dead/proc/check_area() - if(client?.holder) + if(check_rights_for(client, R_HOLDER)) return if(!isturf(loc)) return @@ -251,7 +251,7 @@ Works together with spawning an observer, noted above. B.update() if(ghost.client) ghost.client.time_died_as_mouse = ghost.timeofdeath - if(ghost.client && !ghost.client.holder && !CONFIG_GET(flag/antag_hud_allowed)) // For new ghosts we remove the verb from even showing up if it's not allowed. + if(ghost.client && !check_rights_for(ghost.client, R_HOLDER) && !CONFIG_GET(flag/antag_hud_allowed)) // For new ghosts we remove the verb from even showing up if it's not allowed. remove_verb(ghost, /mob/observer/dead/verb/toggle_antagHUD) // Poor guys, don't know what they are missing! return ghost @@ -368,18 +368,18 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Toggle AntagHUD" set desc = "Toggles AntagHUD allowing you to see who is the antagonist" - if(!CONFIG_GET(flag/antag_hud_allowed) && !client.holder) + if(!CONFIG_GET(flag/antag_hud_allowed) && !check_rights_for(client, R_HOLDER)) to_chat(src, span_filter_notice(span_red("Admins have disabled this for this round."))) return if(jobban_isbanned(src, JOB_ANTAGHUD)) to_chat(src, span_filter_notice(span_red(span_bold("You have been banned from using this feature")))) return - if(CONFIG_GET(flag/antag_hud_restricted) && !has_enabled_antagHUD && !client.holder) + if(CONFIG_GET(flag/antag_hud_restricted) && !has_enabled_antagHUD && !check_rights_for(client, R_HOLDER)) var/response = tgui_alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?",list("Yes","No")) if(response != "Yes") return can_reenter_corpse = FALSE set_respawn_timer(-1) // Foreeeever - if(!has_enabled_antagHUD && !client.holder) + if(!has_enabled_antagHUD && !check_rights_for(client, R_HOLDER)) has_enabled_antagHUD = TRUE antagHUD = !antagHUD @@ -388,7 +388,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/observer/dead/proc/jumpable_areas() var/list/areas = return_sorted_areas() - if(client?.holder) + if(check_rights_for(client, R_HOLDER)) return areas for(var/key in areas) @@ -402,7 +402,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/observer/dead/proc/jumpable_mobs() var/list/mobs = getmobs() - if(client?.holder) + if(check_rights_for(client, R_HOLDER)) return mobs for(var/key in mobs) @@ -466,7 +466,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ManualFollow(M || jumpable_mobs()[mobname]) /mob/observer/dead/forceMove(atom/destination, direction, movetime, just_spawned = FALSE) // pass movetime through - if(client?.holder) + if(check_rights_for(client, R_HOLDER)) return ..() if(get_z(destination) in using_map?.secret_levels) @@ -486,7 +486,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return ..() /mob/observer/dead/Move(atom/newloc, direct = 0, movetime) - if(client?.holder) + if(check_rights_for(client, R_HOLDER)) return ..() if(get_z(newloc) in using_map?.secret_levels) @@ -770,7 +770,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp //This is called when a ghost is drag clicked to something. /mob/observer/dead/MouseDrop(atom/over) if(!usr || !over) return - if (isobserver(usr) && usr.client && usr.client.holder && isliving(over)) + if (isobserver(usr) && usr.client && check_rights_for(usr.client, R_HOLDER) && isliving(over)) if (usr.client.holder.cmd_ghost_drag(src,over)) return diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 89e9c6c59c..75aa32a1b7 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -15,7 +15,7 @@ to_chat(src, span_danger("You have deadchat muted.")) return - if(!src.client.holder && !check_rights(R_HOLDER, FALSE)) + if(!check_rights(R_HOLDER, FALSE)) if(!CONFIG_GET(flag/dsay_allowed)) to_chat(src, span_danger("Deadchat is globally muted.")) return diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index c821b3f506..bf59e73ca7 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -378,7 +378,7 @@ var/list/channel_to_radio_key = list() if(M && src) //If we still exist, when the spawn processes //VOREStation Add - Ghosts don't hear whispers if(whispering && isobserver(M) && (!M.client?.prefs?.read_preference(/datum/preference/toggle/ghost_see_whisubtle) || \ - (!(client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) || (isbelly(M.loc) && src == M.loc:owner)) && !M.client?.holder))) + (!(client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) || (isbelly(M.loc) && src == M.loc:owner)) && !check_rights_for(M.client, R_HOLDER)))) M.show_message(span_game(span_say(span_name(src.name) + " [w_not_heard].")), 2) return //VOREStation Add End diff --git a/code/modules/mob/living/silicon/pai/pai_vr.dm b/code/modules/mob/living/silicon/pai/pai_vr.dm index 76880a72ea..5479997cf3 100644 --- a/code/modules/mob/living/silicon/pai/pai_vr.dm +++ b/code/modules/mob/living/silicon/pai/pai_vr.dm @@ -537,7 +537,7 @@ if (isnewplayer(G)) continue else if(isobserver(G) && G.client?.prefs?.read_preference(/datum/preference/toggle/ghost_ears)) - if((client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) || G.client.holder) && \ + if((client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) || check_rights_for(G.client, R_HOLDER)) && \ G.client?.prefs?.read_preference(/datum/preference/toggle/ghost_see_whisubtle)) to_chat(G, span_filter_say(span_cult("[src.name]'s screen prints, \"[message]\""))) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm index f5dfaead33..27a6f1aab6 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm @@ -501,7 +501,7 @@ if(isnewplayer(M)) continue if(isobserver(M) && (!M.client?.prefs?.read_preference(/datum/preference/toggle/ghost_see_whisubtle) || \ - !L.client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) && !M.client?.holder)) + !L.client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) && !check_rights_for(M.client, R_HOLDER))) spawn(0) M.show_message(undisplayed_message, 2) else @@ -1166,7 +1166,7 @@ if(isnewplayer(M)) continue if(isobserver(M) && (!M.client?.prefs?.read_preference(/datum/preference/toggle/ghost_see_whisubtle) || \ - !L.client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) && !M.client?.holder)) + !L.client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) && !check_rights_for(M.client, R_HOLDER))) spawn(0) M.show_message(undisplayed_message, 2) else diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm index b5fd1359e9..524f03eeb8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm @@ -11,7 +11,7 @@ return FALSE //CHOMPAdd End //RS Port #658 Start - if(!client?.holder && A.flag_check(AREA_BLOCK_PHASE_SHIFT)) + if(!check_rights_for(client, R_HOLDER) && A.flag_check(AREA_BLOCK_PHASE_SHIFT)) to_chat(src,span_warning("You can't use that here!")) return FALSE //RS Port #658 End diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 36ed1856e0..12684c4cb0 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -471,14 +471,14 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) else name = realname - if(subject && subject.forbid_seeing_deadchat && !subject.client.holder) + if(subject && subject.forbid_seeing_deadchat && !check_rights_for(subject.client, R_HOLDER)) return // Can't talk in deadchat if you can't see it. for(var/mob/M in player_list) - if(M.client && ((!isnewplayer(M) && M.stat == DEAD) || (M.client.holder && check_rights_for(M.client, R_HOLDER) && M.client?.prefs?.read_preference(/datum/preference/toggle/holder/show_staff_dsay))) && M.client?.prefs?.read_preference(/datum/preference/toggle/show_dsay)) + if(M.client && ((!isnewplayer(M) && M.stat == DEAD) || (check_rights_for(M.client, R_HOLDER) && M.client?.prefs?.read_preference(/datum/preference/toggle/holder/show_staff_dsay))) && M.client?.prefs?.read_preference(/datum/preference/toggle/show_dsay)) var/follow var/lname - if(M.forbid_seeing_deadchat && !M.client.holder) + if(M.forbid_seeing_deadchat && !check_rights_for(M.client, R_HOLDER)) continue if(subject) @@ -486,12 +486,12 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) continue if(subject != M) follow = "([ghost_follow_link(subject, M)]) " - if(M.stat != DEAD && M.client.holder) - follow = "([admin_jump_link(subject, M.client.holder)]) " + if(M.stat != DEAD && check_rights_for(M.client, R_HOLDER)) + follow = "([admin_jump_link(subject, check_rights_for(M.client, R_HOLDER))]) " var/mob/observer/dead/DM if(isobserver(subject)) DM = subject - if(M.client.holder) // What admins see + if(check_rights_for(M.client, R_HOLDER)) // What admins see lname = "[keyname][(DM && DM.anonsay) ? "*" : (DM ? "" : "^")] ([name])" else if(DM && DM.anonsay) // If the person is actually observer they have the option to be anonymous @@ -505,10 +505,10 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) /proc/say_dead_object(var/message, var/obj/subject = null) for(var/mob/M in player_list) - if(M.client && ((!isnewplayer(M) && M.stat == DEAD) || (M.client.holder && check_rights_for(M.client, R_HOLDER) && M.client?.prefs?.read_preference(/datum/preference/toggle/holder/show_staff_dsay))) && M.client?.prefs?.read_preference(/datum/preference/toggle/show_dsay)) + if(M.client && ((!isnewplayer(M) && M.stat == DEAD) || (check_rights_for(M.client, R_HOLDER) && M.client?.prefs?.read_preference(/datum/preference/toggle/holder/show_staff_dsay))) && M.client?.prefs?.read_preference(/datum/preference/toggle/show_dsay)) var/follow var/lname = "Game Master" - if(M.forbid_seeing_deadchat && !M.client.holder) + if(M.forbid_seeing_deadchat && !check_rights_for(M.client, R_HOLDER)) continue if(subject) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 158cb1d265..72ec492b8f 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -415,7 +415,7 @@ else if(!istype(mob, /mob/observer/dead) && T.blocks_nonghost_incorporeal) return //RS Port #658 Start - if(!holder) + if(!check_rights_for(src, R_HOLDER)) if(isliving(mob) && A.flag_check(AREA_BLOCK_PHASE_SHIFT)) to_chat(mob, span_warning("Something blocks you from entering this location while phased out.")) return diff --git a/code/modules/mob/new_player/lobby_browser.dm b/code/modules/mob/new_player/lobby_browser.dm index 05fbd309a1..40aeb4d61b 100644 --- a/code/modules/mob/new_player/lobby_browser.dm +++ b/code/modules/mob/new_player/lobby_browser.dm @@ -129,7 +129,7 @@ client.prefs.real_name = random_name(client.prefs.identifying_gender) observer.real_name = client.prefs.real_name observer.name = observer.real_name - if(!client.holder && !CONFIG_GET(flag/antag_hud_allowed)) // For new ghosts we remove the verb from even showing up if it's not allowed. + if(!check_rights_for(client, R_HOLDER) && !CONFIG_GET(flag/antag_hud_allowed)) // For new ghosts we remove the verb from even showing up if it's not allowed. remove_verb(observer, /mob/observer/dead/verb/toggle_antagHUD) // Poor guys, don't know what they are missing! observer.key = key diff --git a/code/modules/mob/new_player/poll.dm b/code/modules/mob/new_player/poll.dm index 0c8c11a5a2..ba7bf5a09c 100644 --- a/code/modules/mob/new_player/poll.dm +++ b/code/modules/mob/new_player/poll.dm @@ -50,7 +50,7 @@ establish_db_connection() if(SSdbcore.IsConnected()) var/isadmin = 0 - if(src.client && src.client.holder) + if(src.client && check_rights_for(src.client, R_HOLDER)) isadmin = 1 var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT id, question FROM erro_poll_question WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime") diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index a40d9ccc5b..ed3cc1c608 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -50,7 +50,7 @@ if(!client) return // Clientless mobs shouldn't be trying to talk in deadchat. - if(!client.holder) + if(!check_rights_for(client, R_HOLDER)) if(!CONFIG_GET(flag/dsay_allowed)) to_chat(src, span_danger("Deadchat is globally muted.")) return diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index 6cc54fbf57..66d053177b 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -196,7 +196,7 @@ if(src.client && M && !(get_z(src) == get_z(M))) message = span_multizsay("[message]") if(isobserver(M) && (!M.read_preference(/datum/preference/toggle/ghost_see_whisubtle) || \ - (!(read_preference(/datum/preference/toggle/whisubtle_vis) || (isbelly(M.loc) && src == M.loc:owner)) && !M.client?.holder))) + (!(read_preference(/datum/preference/toggle/whisubtle_vis) || (isbelly(M.loc) && src == M.loc:owner)) && !check_rights_for(M.client, R_HOLDER)))) spawn(0) M.show_message(undisplayed_message, 2) else @@ -351,7 +351,7 @@ continue else if(isobserver(G) && G.client?.prefs?.read_preference(/datum/preference/toggle/ghost_ears) && \ G.client?.prefs?.read_preference(/datum/preference/toggle/ghost_see_whisubtle)) - if(client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) || G.client.holder) + if(client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) || check_rights_for(G.client, R_HOLDER)) to_chat(G, span_psay("\The [M] thinks, \"[message]\"")) log_say(message,M) else //There wasn't anyone to send the message to, pred or prey, so let's just say it instead and correct our psay just in case. @@ -456,7 +456,7 @@ continue else if(isobserver(G) && G.client?.prefs?.read_preference(/datum/preference/toggle/ghost_ears) && \ G.client?.prefs?.read_preference(/datum/preference/toggle/ghost_see_whisubtle)) - if(client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) || G.client.holder) + if(client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) || check_rights_for(G.client, R_HOLDER)) to_chat(G, span_pemote("\The [M] [message]")) log_say(message,M) else //There wasn't anyone to send the message to, pred or prey, so let's just emote it instead and correct our psay just in case. diff --git a/code/modules/multiz/portals_vr.dm b/code/modules/multiz/portals_vr.dm index 0422b50d70..4d7e7cc2bb 100644 --- a/code/modules/multiz/portals_vr.dm +++ b/code/modules/multiz/portals_vr.dm @@ -39,12 +39,12 @@ to_chat(user, span_notice("Your hand scatters \the [src]...")) qdel(src) //Delete portals which aren't set that people mess with. else return //do not send ghosts, zshadows, ai eyes, etc - else if(isliving(user) || isobserver(user) && user?.client?.holder) //unless they're staff + else if(isliving(user) || isobserver(user) && check_rights_for(user?.client, R_HOLDER)) //unless they're staff spawn(0) src.teleport(user) /obj/structure/portal_event/attack_ghost(var/mob/observer/dead/user) - if(!target && user?.client?.holder) + if(!target && check_rights_for(user?.client, R_HOLDER)) to_chat(user, span_notice("Selecting 'Portal Here' will create and link a portal at your location, while 'Target Here' will create an object that is only visible to ghosts which will act as the target, again at your location. Each option will give you the ability to change portal types, but for all options except 'Select Type' you only get one shot at it, so be sure to experiment with 'Select Type' first if you're not familiar with them.")) var/response = tgui_alert(user, "You appear to be staff. This portal has no exit point. If you want to make one, move to where you want it to go, and click the appropriate option, see chat for more info, otherwise click 'Cancel'", "Unbound Portal", list("Cancel","Portal Here","Target Here", "Select Type")) if(response == "Portal Here") @@ -69,7 +69,7 @@ return if(target) message_admins("The [src]([x],[y],[z]) was given [target]([target.x],[target.y],[target.z]) as a target, and should be ready to use.") - else if(user?.client?.holder) + else if(check_rights_for(user?.client, R_HOLDER)) src.teleport(user) else return diff --git a/code/modules/overmap/bluespace_rift_vr.dm b/code/modules/overmap/bluespace_rift_vr.dm index 51189e1e13..1a2d078470 100644 --- a/code/modules/overmap/bluespace_rift_vr.dm +++ b/code/modules/overmap/bluespace_rift_vr.dm @@ -31,7 +31,7 @@ return ..() /obj/effect/overmap/bluespace_rift/attack_ghost(var/mob/observer/dead/user) - if(!partner && user?.client?.holder) + if(!partner && check_rights_for(user?.client, R_HOLDER)) var/response = tgui_alert(user, "You appear to be staff. This rift has no exit point. If you want to make one, move to where you want it to go, and click 'Make Here', otherwise click 'Cancel'", "Bluespace Rift", list("Cancel","Make Here")) if(response == "Make Here") new type(get_turf(user), src) diff --git a/code/modules/random_map/random_map_verbs.dm b/code/modules/random_map/random_map_verbs.dm index 8bef0f3231..bcaac9ab43 100644 --- a/code/modules/random_map/random_map_verbs.dm +++ b/code/modules/random_map/random_map_verbs.dm @@ -3,7 +3,7 @@ set name = "Display Random Map" set desc = "Show the contents of a random map." - if(!holder) return + if(!check_rights_for(src, R_HOLDER)) return var/choice = tgui_input_list(usr, "Choose a map to display.", "Map Choice", random_maps) if(!choice) @@ -17,7 +17,7 @@ set name = "Delete Random Map" set desc = "Delete a random map." - if(!holder) return + if(!check_rights_for(src, R_HOLDER)) return var/choice = tgui_input_list(usr, "Choose a map to delete.", "Map Choice", random_maps) if(!choice) @@ -34,7 +34,7 @@ set name = "Create Random Map" set desc = "Create a random map." - if(!holder) return + if(!check_rights_for(src, R_HOLDER)) return var/map_datum = tgui_input_list(usr, "Choose a map to create.", "Map Choice", subtypesof(/datum/random_map)) if(!map_datum) @@ -58,7 +58,7 @@ set name = "Apply Random Map" set desc = "Apply a map to the game world." - if(!holder) return + if(!check_rights_for(src, R_HOLDER)) return var/choice = tgui_input_list(usr, "Choose a map to apply.", "Map Choice", random_maps) if(!choice) @@ -83,7 +83,7 @@ set name = "Overlay Random Map" set desc = "Apply a map to another map." - if(!holder) return + if(!check_rights_for(src, R_HOLDER)) return var/choice = tgui_input_list(usr, "Choose a map as base.", "Map Choice", random_maps) if(!choice) diff --git a/code/modules/rogueminer_vr/debug.dm b/code/modules/rogueminer_vr/debug.dm index 198f7281fc..2bba2f003f 100644 --- a/code/modules/rogueminer_vr/debug.dm +++ b/code/modules/rogueminer_vr/debug.dm @@ -3,6 +3,6 @@ set name = "Debug RogueMiner" set desc = "Debug the RogueMiner controller." - if(!holder) return + if(!check_rights_for(src, R_HOLDER)) return debug_variables(rm_controller) feedback_add_details("admin_verb","DRM") diff --git a/code/modules/tickets/tickets.dm b/code/modules/tickets/tickets.dm index a48b2a173d..b018c87cdb 100644 --- a/code/modules/tickets/tickets.dm +++ b/code/modules/tickets/tickets.dm @@ -351,7 +351,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list) /datum/ticket/proc/AddInteraction(formatted_message) var/curinteraction = "[gameTimestamp()]: [formatted_message]" if(CONFIG_GET(flag/discord_ahelps_all)) - ahelp_discord_message("ADMINHELP: TICKETID:[id] [strip_html_properly(curinteraction)]") + ahelp_discord_message("ADMINHELP: TICKETID: [id] [strip_html_properly(curinteraction)]") _interactions += curinteraction /datum/ticket/proc/TicketPanel() diff --git a/interface/interface.dm b/interface/interface.dm index cfd0f8851c..fe4c3062c2 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -221,7 +221,7 @@ Any-Mode: (hotkey doesn't need to be on) else to_chat(src,hotkey_mode) to_chat(src,other) - if(holder) + if(check_rights_for(src, R_HOLDER)) to_chat(src,admin) // Set the DreamSeeker input macro to the type appropriate for its mob