ADMIN_VERB(cmd_player_panel, R_ADMIN, "Player Panel", "See all players and their Player Panel.", ADMIN_CATEGORY_GAME) user.holder.player_panel_new() ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_ADMIN, "Show Player Panel", mob/player in world) log_admin("[key_name(user)] checked the individual player panel for [key_name(player)][isobserver(user.mob)?"":" while in game"].") if(!player) to_chat(user, span_warning("You seem to be selecting a mob that doesn't exist anymore."), confidential = TRUE) return var/body = "Options for [player.key]" body += "Options panel for [player]" if(player.client) body += " played by [player.client] " body += "\[[player.client.holder ? player.client.holder.rank_names() : "Player"]\]" if(CONFIG_GET(flag/use_exp_tracking)) body += "\[" + player.client.get_exp_living(FALSE) + "\]" // BUBBERS EDIT START - Job exemption body += "
\[Job Exemption Menu\]" // BUBBERS EDIT END if(isnewplayer(player)) body += " Hasn't Entered Game " else body += " \[Heal\] " if(player.ckey) body += "
\[Find Updated Panel\]" if(player.client) body += "
\[First Seen: [player.client.player_join_date]\]\[Byond account registered on: [player.client.account_join_date]\]" // SKYRAT EDIT ADDITION START - Player Ranks var/list/player_ranks = list() if(SSplayer_ranks.is_donator(player.client, admin_bypass = FALSE)) player_ranks += "Donator" if(SSplayer_ranks.is_mentor(player.client, admin_bypass = FALSE)) player_ranks += "Mentor" //BUBBER ADDITION START if(SSplayer_ranks.is_vetted(player.client, admin_bypass = FALSE)) player_ranks |= "Vetted" // BUBBER ADDITION END body += "

Player Ranks: [length(player_ranks) ? player_ranks.Join(", ") : "None"]" // SKYRAT EDIT END body += "

CentCom Galactic Ban DB: " if(CONFIG_GET(string/centcom_ban_db)) body += "Search" else body += "Disabled" body += "

Show related accounts by: " body += "\[ CID | " body += "IP \]" var/full_version = "Unknown" if(player.client.byond_version) full_version = "[player.client.byond_version].[player.client.byond_build ? player.client.byond_build : "xxx"]" body += "
\[Byond version: [full_version]\]
" body += "

\[ " body += "VV - " if(player.mind) body += "TP - " body += "SKILLS - " else body += "Init Mind - " if (iscyborg(player)) body += "BP - " body += "PM - " body += "SM - " if (ishuman(player) && player.mind) body += "HM - " body += "FLW - " //Default to client logs if available var/source = LOGSRC_MOB if(player.ckey) source = LOGSRC_CKEY body += "LOGS\]
" body += "Mob type = [player.type]

" if(player.client) body += "Old names: " var/datum/player_details/deets = GLOB.player_details[player.ckey] if(deets) body += deets.get_played_names() else body += "None?!" body += "

" body += "Kick | " if(player.client) body += "Ban | " else body += "Ban | " body += "Notes | Messages | Watchlist | " if(player.client) body += "| Prison | " body += "\ Send back to Lobby | " var/muted = player.client.prefs.muted body += "
Mute: " body += "\[IC | " body += "OOC | " body += "PRAY | " body += "ADMINHELP | " //Skyrat Addition Begin - LOOC muting again. body += "DEADCHAT | " body += "LOOC\]" //Skyrat Addition End - LOOC muting again. body += "WEBREQ | " body += "DEADCHAT\]" body += "(toggle all)" body += "

" body += "Jump to | " body += "Get | " body += "Send To" body += "

" body += "Traitor panel | " body += "Narrate to | " body += "Subtle message | " body += "Play sound to | " body += "Language Menu" if(player.client) if(!isnewplayer(player)) body += "

" body += "Transformation:
" if(isobserver(player)) body += "Ghost | " else body += "Make Ghost | " if(ishuman(player) && !ismonkey(player)) body += "Human | " else body += "Make Human | " if(ismonkey(player)) body += "Monkey | " else body += "Make Monkey | " if(iscyborg(player)) body += "Cyborg | " else body += "Make Cyborg | " if(isAI(player)) body += "AI" else body += "Make AI" body += "

" body += "Other actions:" body += "
" if(!isnewplayer(player)) body += "Forcesay | " body += "Apply Client Quirks | " body += "Thunderdome 1 | " body += "Thunderdome 2 | " body += "Thunderdome Admin | " body += "Thunderdome Observer | " body += "Commend Behavior | " body += "
" body += "" user << browse(body, "window=adminplayeropts-[REF(player)];size=550x515") BLACKBOX_LOG_ADMIN_VERB("Player Panel") /client/proc/cmd_admin_godmode(mob/mob in GLOB.mob_list) set category = "Admin.Game" set name = "Godmode" if(!check_rights(R_ADMIN)) return var/had_trait = HAS_TRAIT_FROM(mob, TRAIT_GODMODE, ADMIN_TRAIT) if(had_trait) REMOVE_TRAIT(mob, TRAIT_GODMODE, ADMIN_TRAIT) else ADD_TRAIT(mob, TRAIT_GODMODE, ADMIN_TRAIT) to_chat(usr, span_adminnotice("Toggled [had_trait ? "OFF" : "ON"]"), confidential = TRUE) log_admin("[key_name(usr)] has toggled [key_name(mob)]'s nodamage to [had_trait ? "Off" : "On"]") var/msg = "[key_name_admin(usr)] has toggled [ADMIN_LOOKUPFLW(mob)]'s nodamage to [had_trait ? "Off" : "On"]" message_admins(msg) admin_ticket_log(mob, msg) SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Godmode", "[had_trait ? "Disabled" : "Enabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /* If a guy was gibbed and you want to revive him, this is a good way to do so. Works kind of like entering the game with a new character. Character receives a new mind if they didn't have one. Traitors and the like can also be revived with the previous role mostly intact. /N */ ADMIN_VERB(respawn_character, R_ADMIN, "Respawn Character", "Respawn a player that has been round removed in some manner. They must be a ghost.", ADMIN_CATEGORY_GAME) var/input = ckey(input(user, "Please specify which key will be respawned.", "Key", "")) if(!input) return var/mob/dead/observer/G_found for(var/mob/dead/observer/G in GLOB.player_list) if(G.ckey == input) G_found = G break if(!G_found)//If a ghost was not found. to_chat(user, "There is no active key like that in the game or the person is not currently a ghost.", confidential = TRUE) return if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something //check if they were a monkey if(findtext(G_found.real_name,"monkey")) if(tgui_alert(user,"This character appears to have been a monkey. Would you like to respawn them as such?",,list("Yes","No")) == "Yes") var/mob/living/carbon/human/species/monkey/new_monkey = new SSjob.send_to_late_join(new_monkey) G_found.mind.transfer_to(new_monkey) //be careful when doing stuff like this! I've already checked the mind isn't in use new_monkey.key = G_found.key to_chat(new_monkey, "You have been fully respawned. Enjoy the game.", confidential = TRUE) var/msg = span_adminnotice("[key_name_admin(user)] has respawned [new_monkey.key] as a filthy monkey.") message_admins(msg) admin_ticket_log(new_monkey, msg) return //all done. The ghost is auto-deleted //Ok, it's not a monkey. So, spawn a human. var/mob/living/carbon/human/new_character = new//The mob being spawned. SSjob.send_to_late_join(new_character) var/datum/record/locked/record_found //Referenced to later to either randomize or not randomize the character. if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something record_found = find_record(G_found.name, locked_only = TRUE) if(record_found)//If they have a record we can determine a few things. new_character.real_name = record_found.name new_character.gender = LOWER_TEXT(record_found.gender) new_character.age = record_found.age var/datum/dna/found_dna = record_found.locked_dna new_character.hardset_dna(found_dna.unique_identity, found_dna.mutation_index, null, record_found.name, record_found.blood_type, new record_found.species_type, found_dna.features) else new_character.randomize_human_appearance() new_character.dna.update_dna_identity() new_character.name = new_character.real_name if(G_found.mind && !G_found.mind.active) G_found.mind.transfer_to(new_character) //be careful when doing stuff like this! I've already checked the mind isn't in use else new_character.mind_initialize() if(is_unassigned_job(new_character.mind.assigned_role)) new_character.mind.set_assigned_role(SSjob.get_job_type(SSjob.overflow_role)) new_character.key = G_found.key /* The code below functions with the assumption that the mob is already a traitor if they have a special role. So all it does is re-equip the mob with powers and/or items. Or not, if they have no special role. If they don't have a mind, they obviously don't have a special role. */ //Two variables to properly announce later on. var/admin = key_name_admin(user) var/player_key = G_found.key //Now for special roles and equipment. var/datum/antagonist/traitor/traitordatum = new_character.mind.has_antag_datum(/datum/antagonist/traitor) if(traitordatum) SSjob.equip_rank(new_character, new_character.mind.assigned_role, new_character.client) new_character.mind.give_uplink(silent = TRUE, antag_datum = traitordatum) switch(new_character.mind.special_role) if(ROLE_WIZARD) new_character.forceMove(pick(GLOB.wizardstart)) var/datum/antagonist/wizard/A = new_character.mind.has_antag_datum(/datum/antagonist/wizard,TRUE) A.equip_wizard() if(ROLE_SYNDICATE) new_character.forceMove(pick(GLOB.nukeop_start)) var/datum/antagonist/nukeop/N = new_character.mind.has_antag_datum(/datum/antagonist/nukeop,TRUE) N.equip_op() if(ROLE_NINJA) var/list/ninja_spawn = list() for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) ninja_spawn += L var/datum/antagonist/ninja/ninjadatum = new_character.mind.has_antag_datum(/datum/antagonist/ninja) ninjadatum.equip_space_ninja() if(ninja_spawn.len) new_character.forceMove(pick(ninja_spawn)) else//They may also be a cyborg or AI. switch(new_character.mind.assigned_role.type) if(/datum/job/cyborg)//More rigging to make em' work and check if they're traitor. new_character = new_character.Robotize(TRUE) if(/datum/job/ai) new_character = new_character.AIize() else if(!traitordatum) // Already equipped there. SSjob.equip_rank(new_character, new_character.mind.assigned_role, new_character.client)//Or we simply equip them. //Announces the character on all the systems, based on the record. if(!record_found && (new_character.mind.assigned_role.job_flags & JOB_CREW_MEMBER)) //Power to the user! if(tgui_alert(new_character,"Warning: No data core entry detected. Would you like to announce the arrival of this character by adding them to various databases, such as medical records?",,list("No","Yes")) == "Yes") GLOB.manifest.inject(new_character, src) // SKYRAT EDIT CHANGE - ALTERNATIVE_JOB_TITLES - Original: GLOB.manifest.inject(new_character) if(tgui_alert(new_character,"Would you like an active AI to announce this character?",,list("No","Yes")) == "Yes") announce_arrival(new_character, new_character.mind.assigned_role.title) var/msg = span_adminnotice("[admin] has respawned [player_key] as [new_character.real_name].") message_admins(msg) admin_ticket_log(new_character, msg) to_chat(new_character, "You have been fully respawned. Enjoy the game.", confidential = TRUE) BLACKBOX_LOG_ADMIN_VERB("Respawn Character") return new_character ADMIN_VERB(manage_job_slots, R_ADMIN, "Manage Job Slots", "Manage the number of available job slots.", ADMIN_CATEGORY_GAME) user.holder.manage_free_slots() BLACKBOX_LOG_ADMIN_VERB("Manage Job Slots") /datum/admins/proc/manage_free_slots() if(!check_rights()) return var/datum/browser/browser = new(usr, "jobmanagement", "Manage Free Slots", 520) var/list/dat = list() var/count = 0 if(!SSjob.initialized) tgui_alert(usr, "You cannot manage jobs before the job subsystem is initialized!") return if(SSlag_switch.measures[DISABLE_NON_OBSJOBS]) dat += "
Lag Switch \"Disable non-observer late joining\" is ON. Only Observers may join!
" dat += "" for(var/datum/job/job as anything in SSjob.joinable_occupations) count++ var/J_title = html_encode(job.title) var/J_opPos = html_encode(job.total_positions - (job.total_positions - job.current_positions)) var/J_totPos = html_encode(job.total_positions) dat += "" dat += "" else dat += "Limit" browser.height = min(100 + count * 20, 650) browser.set_content(dat.Join()) browser.open() ADMIN_VERB(toggle_view_range, R_ADMIN, "Change View Range", "Switch between 1x and custom views.", ADMIN_CATEGORY_GAME) if(user.view_size.getView() == user.view_size.default) user.view_size.setTo(input(user, "Select view range:", "FUCK YE", 7) in list(1,2,3,4,5,6,7,8,9,10,11,12,13,14,37) - 7) else user.view_size.resetToDefault(getScreenSize(user.prefs.read_preference(/datum/preference/toggle/widescreen))) log_admin("[key_name(user)] changed their view range to [user.view].") SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Change View Range", "[user.view]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! ADMIN_VERB(combo_hud, R_ADMIN, "Toggle Combo HUD", "Toggles the Admin Combo HUD.", ADMIN_CATEGORY_GAME) if(user.combo_hud_enabled) user.disable_combo_hud() else user.enable_combo_hud() to_chat(user, "You toggled your admin combo HUD [user.combo_hud_enabled ? "ON" : "OFF"].", confidential = TRUE) message_admins("[key_name_admin(user)] toggled their admin combo HUD [user.combo_hud_enabled ? "ON" : "OFF"].") log_admin("[key_name(user)] toggled their admin combo HUD [user.combo_hud_enabled ? "ON" : "OFF"].") SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Combo HUD", "[user.combo_hud_enabled ? "Enabled" : "Disabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/enable_combo_hud() if (combo_hud_enabled) return combo_hud_enabled = TRUE for (var/hudtype in list(DATA_HUD_SECURITY_ADVANCED, DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC, DATA_HUD_BOT_PATH)) var/datum/atom_hud/atom_hud = GLOB.huds[hudtype] atom_hud.show_to(mob) for (var/datum/atom_hud/alternate_appearance/basic/antagonist_hud/antag_hud in GLOB.active_alternate_appearances) antag_hud.show_to(mob) mob.lighting_cutoff = mob.default_lighting_cutoff() mob.update_sight() /client/proc/disable_combo_hud() if (!combo_hud_enabled) return combo_hud_enabled = FALSE for (var/hudtype in list(DATA_HUD_SECURITY_ADVANCED, DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC, DATA_HUD_BOT_PATH)) var/datum/atom_hud/atom_hud = GLOB.huds[hudtype] atom_hud.hide_from(mob) for (var/datum/atom_hud/alternate_appearance/basic/antagonist_hud/antag_hud in GLOB.active_alternate_appearances) antag_hud.hide_from(mob) mob.lighting_cutoff = mob.default_lighting_cutoff() mob.update_sight() ADMIN_VERB(show_traitor_panel, R_ADMIN, "Show Traitor Panel", "Edit mobs's memory and role", ADMIN_CATEGORY_GAME, mob/target_mob) var/datum/mind/target_mind = target_mob.mind if(!target_mind) to_chat(user, "This mob has no mind!", confidential = TRUE) return if(!istype(target_mob) && !istype(target_mind)) to_chat(user, "This can only be used on instances of type /mob and /mind", confidential = TRUE) return target_mind.traitor_panel() BLACKBOX_LOG_ADMIN_VERB("Traitor Panel") ADMIN_VERB(show_skill_panel, R_ADMIN, "Show Skill Panel", "Edit mobs's experience and skill levels", ADMIN_CATEGORY_GAME, mob/target_mob) var/datum/mind/target_mind if(istype(target_mob, /datum/mind)) target_mind = target_mob else target_mind = target_mob.mind var/datum/skill_panel/SP = new(user, target_mind) SP.ui_interact(user.mob) ADMIN_VERB(lag_switch_panel, R_ADMIN, "Show Lag Switches", "Display the controls for drastic lag mitigation.", ADMIN_CATEGORY_GAME) if(!SSlag_switch.initialized) to_chat(user, span_notice("The Lag Switch subsystem has not yet been initialized.")) return var/list/dat = list("Lag Switches

Lag (Reduction) Switches

") dat += "Automatic Trigger: [SSlag_switch.auto_switch ? "On" : "Off"]
" dat += "Population Threshold: [SSlag_switch.trigger_pop]
" dat += "Slowmode Cooldown (toggle On/Off below): [SSlag_switch.slowmode_cooldown/10] seconds
" dat += "
SET ALL MEASURES: ON | OFF
" dat += "
Disable ghosts zoom and t-ray verbs (except staff): [SSlag_switch.measures[DISABLE_GHOST_ZOOM_TRAY] ? "On" : "Off"]
" dat += "Disable late joining: [SSlag_switch.measures[DISABLE_NON_OBSJOBS] ? "On" : "Off"]
" dat += "
============! MAD GHOSTS ZONE !============
" dat += "Disable deadmob keyLoop (except staff, informs dchat): [SSlag_switch.measures[DISABLE_DEAD_KEYLOOP] ? "On" : "Off"]
" dat += "==========================================
" dat += "
Measures below can be bypassed with a special trait
" dat += "Slowmode say verb (informs world): [SSlag_switch.measures[SLOWMODE_SAY] ? "On" : "Off"]
" dat += "Disable runechat: [SSlag_switch.measures[DISABLE_RUNECHAT] ? "On" : "Off"] - trait applies to speaker
" dat += "Disable examine icons: [SSlag_switch.measures[DISABLE_USR_ICON2HTML] ? "On" : "Off"] - trait applies to examiner
" dat += "Disable parallax: [SSlag_switch.measures[DISABLE_PARALLAX] ? "On" : "Off"] - trait applies to character
" dat += "Disable footsteps: [SSlag_switch.measures[DISABLE_FOOTSTEPS] ? "On" : "Off"] - trait applies to character
" dat += "Disable character creator: [SSlag_switch.measures[DISABLE_CREATOR] ? "On" : "Off"] - trait applies to all
" // SKYRAT EDIT ADDITION dat += "" user << browse(dat.Join(), "window=lag_switch_panel;size=420x480")
[J_title]: [J_opPos]/[job.total_positions < 0 ? " (unlimited)" : J_totPos]" dat += "" if(job.total_positions >= 0) dat += "Custom | " dat += "Add 1 | " if(job.total_positions > job.current_positions) dat += "Remove | " else dat += "Remove | " dat += "Unlimit