var/global/BSACooldown = 0 var/global/floorIsLava = 0 //////////////////////////////// /proc/message_admins(var/msg) //writepanic("[__FILE__].[__LINE__] (no type)([usr ? usr.ckey : ""]) \\/proc/message_admins() called tick#: [world.time]") msg = "ADMIN LOG: [msg]" log_adminwarn(msg) for(var/client/C in admins) if(R_ADMIN & C.holder.rights) C << msg /proc/msg_admin_attack(var/text) //Toggleable Attack Messages //writepanic("[__FILE__].[__LINE__] (no type)([usr ? usr.ckey : ""]) \\/proc/msg_admin_attack() called tick#: [world.time]") var/rendered = "ADMIN LOG: [text]" log_adminwarn(rendered) for(var/client/C in admins) if(R_ADMIN & C.holder.rights) if(C.prefs.toggles & CHAT_ATTACKLOGS) var/msg = rendered C << msg ///////////////////////////////////////////////////////////////////////////////////////////////Panels /datum/admins/proc/show_player_panel(var/mob/M in mob_list) set category = "Admin" set name = "Show Player Panel" set desc="Edit player (respawn, ban, heal, etc)" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/show_player_panel() called tick#: [world.time]") if(!M) usr << "You seem to be selecting a mob that doesn't exist anymore." return if (!istype(src,/datum/admins)) src = usr.client.holder if (!istype(src,/datum/admins)) usr << "Error: you are not an admin!" return checkSessionKey() // AUTOFIXED BY fix_string_idiocy.py // C:\Users\Rob\\documents\\\projects\vgstation13\code\\modules\admin\admin.dm:40: var/body = "Options for [M.key]" var/body = {"Options for [M.key] Options panel for [M]"} // END AUTOFIX var/species_description if(M.client) // AUTOFIXED BY fix_string_idiocy.py // C:\Users\Rob\\documents\\\projects\vgstation13\code\\modules\admin\admin.dm:43: body += " played by [M.client] " body += {"played by [M.client] \[[M.client.holder ? M.client.holder.rank : "Player"]\]"} // END AUTOFIX if(istype(M, /mob/new_player)) body += " Hasn't Entered Game " else body += " \[Heal\] " if(ishuman(M)) var/mob/living/carbon/human/H = M species_description = "[H.species ? H.species.name : "No Species"]" body += {"

\[ VV - TP - Bans - PM - SM - JMP\]
Mob type = [M.type][species_description ? " - Species = [species_description]" : ""]

Kick | Warn | UNWarn | Ban | Jobban | Identity Ban | Notes "} if(M.client) body += "| Prison | " var/muted = M.client.prefs.muted body += {"
Mute: \[IC | OOC | PRAY | ADMINHELP | DEADCHAT\] (toggle all) "} body += {"

Jump to | Get | Send To

Traitor panel | Narrate to | Subtle message "} // Mob-specific controls. body += M.player_panel_controls(usr) if (M.client) if(!istype(M, /mob/new_player)) // AUTOFIXED BY fix_string_idiocy.py // C:\Users\Rob\\documents\\\projects\vgstation13\code\\modules\admin\admin.dm:90: body += "

" body += {"

Transformation:
"} // END AUTOFIX //Monkey if(ismonkey(M)) body += "Monkeyized | " else body += "Monkeyize | " //Corgi if(iscorgi(M)) body += "Corgized | " else body += "Corgize | " //AI / Cyborg if(isAI(M)) body += "Is an AI " else if(ishuman(M)) body += {"Make AI | Make Robot | Make MoMMI | Make Alien | Make slime | Make Cluwne | "} //Simple Animals if(isanimal(M)) body += "Re-Animalize | " else body += "Animalize | " // DNA2 - Admin Hax if(iscarbon(M) && !isbrain(M) && !isalien(M)) body += "

" body += "DNA Blocks:
" var/bname for(var/block=1;block<=DNA_SE_LENGTH;block++) if(((block-1)%5)==0) body += "" bname = assigned_blocks[block] body += "" body += "
 12345
[block-1]" if(bname) var/bstate=M.dna.GetSEState(block) var/bcolor="[(bstate)?"#006600":"#ff0000"]" body += "[bname][block]" else body += "[block]" body+="
" // Law Admin Hax if(issilicon(M) && M:laws) body += "

" body += "Laws:
" var/datum/ai_laws/L = M:laws body += L.display_admin_tools(M) body += "
Add Law" body += " | Clear Laws" body += " | Reset Lawset" body += "
Send Laws - User is not notified of changes until this button pushed!
" body += {"

Rudimentary transformation:
These transformations only create a new mob type and copy stuff over. They do not take into account MMIs and similar mob-specific things. The buttons in 'Transformations' are preferred, when possible.

Observer | \[ Alien: Drone, Hunter, Queen, Sentinel, Larva \] Human \[ slime: Baby, Adult \] Monkey | Cyborg | Cat | Runtime | Corgi | Ian | Crab | Coffee | \[ Construct: Armoured , Builder , Wraith \] Shade
"} if (M.client) body += {"

Other actions:
Forcesay | Thunderdome Green | Thunderdome Red | Thunderdome Admin | Thunderdome Observer | "} // language toggles body += "

Languages:
" var/f = 1 for(var/k in all_languages) var/datum/language/L = all_languages[k] if(!f) body += " | " else f = 0 if(L in M.languages) body += "[k]" else body += "[k]" body += {"
"} usr << browse(body, "window=adminplayeropts-\ref[M];size=550x515") feedback_add_details("admin_verb","SPP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/player_info/var/author // admin who authored the information /datum/player_info/var/rank //rank of admin who made the notes /datum/player_info/var/content // text content of the information /datum/player_info/var/timestamp // Because this is bloody annoying #define PLAYER_NOTES_ENTRIES_PER_PAGE 50 /datum/admins/proc/PlayerNotes() set category = "Admin" set name = "Player Notes" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/PlayerNotes() called tick#: [world.time]") if (!istype(src,/datum/admins)) src = usr.client.holder if (!istype(src,/datum/admins)) usr << "Error: you are not an admin!" return PlayerNotesPage(1) /datum/admins/proc/checkCID() set category = "Admin" set name = "Lookup bans on Computer ID" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/checkCID() called tick#: [world.time]") if(!usr) return if (!istype(src,/datum/admins)) src = usr.client.holder if (!istype(src,/datum/admins)) usr << "Error: you are not an admin!" return checkSessionKey() var/cid = input("Type computer ID", "CID", 0) as num | null if(cid) usr << link(getVGPanel("rapsheet",admin=1,query=list("cid"=cid))) //usr << link("[config.vgws_base_url]/index.php/rapsheet/?s=[sessKey]&cid=[cid]") return /datum/admins/proc/checkCKEY() set category = "Admin" set name = "Lookup bans on CKEY" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/checkCKEY() called tick#: [world.time]") if(!usr) return if (!istype(src,/datum/admins)) src = usr.client.holder if (!istype(src,/datum/admins)) usr << "Error: you are not an admin!" return checkSessionKey() var/ckey = lowertext(input("Type player ckey", "ckey", null) as text | null) usr << link(getVGPanel("rapsheet",admin=1,query=list("ckey"=ckey))) //usr << link("[config.vgws_base_url]/index.php/rapsheet/?s=[sessKey]&ckey=[ckey]") return /datum/admins/proc/PlayerNotesPage(page) //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/PlayerNotesPage() called tick#: [world.time]") var/dat = "Player notes
" var/savefile/S=new("data/player_notes.sav") var/list/note_keys S >> note_keys if(!note_keys) dat += "No notes found." else dat += "" note_keys = sortList(note_keys) // Display the notes on the current page var/number_pages = note_keys.len / PLAYER_NOTES_ENTRIES_PER_PAGE // Emulate ceil(why does BYOND not have ceil) if(number_pages != round(number_pages)) number_pages = round(number_pages) + 1 var/page_index = page - 1 if(page_index < 0 || page_index >= number_pages) return var/lower_bound = page_index * PLAYER_NOTES_ENTRIES_PER_PAGE + 1 var/upper_bound = (page_index + 1) * PLAYER_NOTES_ENTRIES_PER_PAGE upper_bound = min(upper_bound, note_keys.len) for(var/index = lower_bound, index <= upper_bound, index++) var/t = note_keys[index] dat += "" dat += "
[t]

" // Display a footer to select different pages for(var/index = 1, index <= number_pages, index++) if(index == page) dat += "" dat += "[index] " if(index == page) dat += "" usr << browse(dat, "window=player_notes;size=400x400") /datum/admins/proc/player_has_info(var/key as text) //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/player_has_info() called tick#: [world.time]") var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav") var/list/infos info >> infos if(!infos || !infos.len) return 0 else return 1 /proc/exportnotes(var/key as text) //writepanic("[__FILE__].[__LINE__] (no type)([usr ? usr.ckey : ""]) \\/proc/exportnotes() called tick#: [world.time]") var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav") var/list/infos info >> infos var/list/noteslist = list() if(!infos) return list("1" = "No notes found for [key]") else var/i = 0 for(var/datum/player_info/I in infos) i += 1 if(!I.timestamp) I.timestamp = "Pre-4/3/2012" if(!I.rank) I.rank = "N/A" /*noteslist["note:[i]"] = "[I.content]" noteslist["author:[i]"] = "[I.author]" noteslist["rank:[i]"] = "[I.rank]" noteslist["timestamp:[i]"] = "[I.timestamp]"*/ noteslist["[i]"] = "[I.content] by [I.author] ([I.rank]) on [I.timestamp]" if(!noteslist.len) noteslist["1"] = "No notes found for [key]" return noteslist /datum/admins/proc/show_player_info(var/key as text) set category = "Admin" set name = "Show Player Info" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/show_player_info() called tick#: [world.time]") if (!istype(src,/datum/admins)) src = usr.client.holder if (!istype(src,/datum/admins)) usr << "Error: you are not an admin!" return // AUTOFIXED BY fix_string_idiocy.py // C:\Users\Rob\\documents\\\projects\vgstation13\code\\modules\admin\admin.dm:247: var/dat = "Info on [key]" var/dat = {"Info on [key] "} // END AUTOFIX var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav") var/list/infos info >> infos if(!infos) dat += "No information found on the given key.
" else var/update_file = 0 var/i = 0 for(var/datum/player_info/I in infos) i += 1 if(!I.timestamp) I.timestamp = "Pre-4/3/2012" update_file = 1 if(!I.rank) I.rank = "N/A" update_file = 1 dat += "[I.content] by [I.author] ([I.rank]) on [I.timestamp] " if(I.author == usr.key || check_rights(R_PERMISSIONS, show_msg = 0)) dat += "Remove" dat += "

" if(update_file) info << infos // AUTOFIXED BY fix_string_idiocy.py // C:\Users\Rob\\documents\\\projects\vgstation13\code\\modules\admin\admin.dm:265: dat += "
" dat += {"
Add Comment
"} // END AUTOFIX usr << browse(dat, "window=adminplayerinfo;size=480x480") /datum/admins/proc/access_news_network() //MARKER set category = "Fun" set name = "Access Newscaster Network" set desc = "Allows you to view, add and edit news feeds." //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/access_news_network() called tick#: [world.time]") if (!istype(src,/datum/admins)) src = usr.client.holder if (!istype(src,/datum/admins)) usr << "Error: you are not an admin!" return var/dat dat = text("Admin Newscaster

Admin Newscaster Unit

") switch(admincaster_screen) if(0) dat += {"Welcome to the admin newscaster.
Here you can add, edit and censor every newspiece on the network.
Feed channels and stories entered through here will be uneditable and handled as official news by the rest of the units.
Note that this panel allows full freedom over the news network, there are no constrictions except the few basic ones. Don't break things! "} if(news_network.wanted_issue) dat+= "
Read Wanted Issue" dat+= {"

Create Feed Channel
View Feed Channels
Submit new Feed story

Exit "} var/wanted_already = 0 if(news_network.wanted_issue) wanted_already = 1 dat+={"
Feed Security functions:

[(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue
Censor Feed Stories
Mark Feed Channel with Nanotrasen D-Notice (disables and locks the channel.

The newscaster recognises you as:
[src.admincaster_signature]
"} if(1) dat+= "Station Feed Channels
" if( isemptylist(news_network.network_channels) ) dat+="No active channels found..." else for(var/datum/feed_channel/CHANNEL in news_network.network_channels) if(CHANNEL.is_admin_channel) dat+="[CHANNEL.channel_name]
" else dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
" dat+={"

Refresh
Back "} if(2) dat+={" Creating new Feed Channel...
Channel Name: [src.admincaster_feed_channel.channel_name]
Channel Author: [src.admincaster_signature]
Will Accept Public Feeds: [(src.admincaster_feed_channel.locked) ? ("NO") : ("YES")]


Submit

Cancel
"} if(3) dat+={" Creating new Feed Message...
Receiving Channel: [src.admincaster_feed_channel.channel_name]
" //MARK Message Author: [src.admincaster_signature]
Message Body: [src.admincaster_feed_message.body]

Submit

Cancel
"} if(4) dat+={" Feed story successfully submitted to [src.admincaster_feed_channel.channel_name].


Return
"} if(5) dat+={" Feed Channel [src.admincaster_feed_channel.channel_name] created successfully.


Return
"} if(6) dat+="ERROR: Could not submit Feed story to Network.

" if(src.admincaster_feed_channel.channel_name=="") dat+="•Invalid receiving channel name.
" if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]") dat+="•Invalid message body.
" dat+="
Return
" if(7) dat+="ERROR: Could not submit Feed Channel to Network.

" if(src.admincaster_feed_channel.channel_name =="" || src.admincaster_feed_channel.channel_name == "\[REDACTED\]") dat+="•Invalid channel name.
" var/check = 0 for(var/datum/feed_channel/FC in news_network.network_channels) if(FC.channel_name == src.admincaster_feed_channel.channel_name) check = 1 break if(check) dat+="•Channel name already in use.
" dat+="
Return
" if(9) dat+="[src.admincaster_feed_channel.channel_name]: \[created by: [src.admincaster_feed_channel.author]\]
" if(src.admincaster_feed_channel.censored) dat+={" ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
No further feed story additions are allowed while the D-Notice is in effect.

"} else if( isemptylist(src.admincaster_feed_channel.messages) ) dat+="No feed messages found in channel...
" else var/i = 0 for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages) i++ dat+="-[MESSAGE.body]
" if(MESSAGE.img) usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png") dat+="

" dat+="\[Story by [MESSAGE.author]\]
" dat+={"

Refresh
Back "} if(10) dat+={" Nanotrasen Feed Censorship Tool
NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible.
Keep in mind that users attempting to view a censored feed will instead see the \[REDACTED\] tag above it.

Select Feed channel to get Stories from:
"} if(isemptylist(news_network.network_channels)) dat+="No feed channels found active...
" else for(var/datum/feed_channel/CHANNEL in news_network.network_channels) dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
" dat+="
Cancel" if(11) dat+={" Nanotrasen D-Notice Handler
A D-Notice is to be bestowed upon the channel if the handling Authority deems it as harmful for the station's morale, integrity or disciplinary behaviour. A D-Notice will render a channel unable to be updated by anyone, without deleting any feed stories it might contain at the time. You can lift a D-Notice if you have the required access at any time.
"} if(isemptylist(news_network.network_channels)) dat+="No feed channels found active...
" else for(var/datum/feed_channel/CHANNEL in news_network.network_channels) dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
" dat+="
Back" if(12) dat+={" [src.admincaster_feed_channel.channel_name]: \[ created by: [src.admincaster_feed_channel.author] \]
[(src.admincaster_feed_channel.author=="\[REDACTED\]") ? ("Undo Author censorship") : ("Censor channel Author")]
"} if( isemptylist(src.admincaster_feed_channel.messages) ) dat+="No feed messages found in channel...
" else for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages) dat+={" -[MESSAGE.body]
\[Story by [MESSAGE.author]\]
[(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")] - [(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]
"} dat+="
Back" if(13) dat+={" [src.admincaster_feed_channel.channel_name]: \[ created by: [src.admincaster_feed_channel.author] \]
Channel messages listed below. If you deem them dangerous to the station, you can Bestow a D-Notice upon the channel.
"} if(src.admincaster_feed_channel.censored) dat+={" ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
No further feed story additions are allowed while the D-Notice is in effect.

"} else if( isemptylist(src.admincaster_feed_channel.messages) ) dat+="No feed messages found in channel...
" else for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages) dat+="-[MESSAGE.body]
\[Story by [MESSAGE.author]\]
" dat+="
Back" if(14) dat+="Wanted Issue Handler:" var/wanted_already = 0 var/end_param = 1 if(news_network.wanted_issue) wanted_already = 1 end_param = 2 if(wanted_already) dat+="
A wanted issue is already in Feed Circulation. You can edit or cancel it below.
" dat+={"
Criminal Name: [src.admincaster_feed_message.author]
Description: [src.admincaster_feed_message.body]
"} if(wanted_already) dat+="Wanted Issue created by: [news_network.wanted_issue.backup_author]
" else dat+="Wanted Issue will be created under prosecutor: [src.admincaster_signature]
" dat+="
[(wanted_already) ? ("Edit Issue") : ("Submit")]" if(wanted_already) dat+="
Take down Issue" dat+="
Cancel" if(15) dat+={" Wanted issue for [src.admincaster_feed_message.author] is now in Network Circulation.


Return
"} if(16) dat+="ERROR: Wanted Issue rejected by Network.

" if(src.admincaster_feed_message.author =="" || src.admincaster_feed_message.author == "\[REDACTED\]") dat+="•Invalid name for person wanted.
" if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]") dat+="•Invalid description.
" dat+="
Return
" if(17) dat+={" Wanted Issue successfully deleted from Circulation

Return
"} if(18) dat+={" -- STATIONWIDE WANTED ISSUE --
\[Submitted by: [news_network.wanted_issue.backup_author]\]
Criminal: [news_network.wanted_issue.author]
Description: [news_network.wanted_issue.body]
Photo:: "} if(news_network.wanted_issue.img) usr << browse_rsc(news_network.wanted_issue.img, "tmp_photow.png") dat+="
" else dat+="None" dat+="
Back
" if(19) dat+={" Wanted issue for [src.admincaster_feed_message.author] successfully edited.


Return
"} else dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" //world << "Channelname: [src.admincaster_feed_channel.channel_name] [src.admincaster_feed_channel.author]" //world << "Msg: [src.admincaster_feed_message.author] [src.admincaster_feed_message.body]" usr << browse(dat, "window=admincaster_main;size=400x600") onclose(usr, "admincaster_main") /datum/admins/proc/Jobbans() //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/Jobbans() called tick#: [world.time]") if(!check_rights(R_BAN)) return var/dat = "Job Bans!
" for(var/t in jobban_keylist) var/r = t if( findtext(r,"##") ) r = copytext( r, 1, findtext(r,"##") )//removes the description dat += text("") dat += "
[t] (unban)
" usr << browse(dat, "window=ban;size=400x400") /datum/admins/proc/Game() //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/Game() called tick#: [world.time]") if(!check_rights(0)) return var/dat = {"
Game Panel

\n Change Game Mode
"} if(master_mode == "secret") dat += "(Force Secret Mode)
" dat += {"

Create Object
Quick Create Object
Create Turf
Create Mob

Edit ZAS Settings
Choose a default ZAS setting
"} usr << browse(dat, "window=admin2;size=280x370") return /datum/admins/proc/Secrets() //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/Secrets() called tick#: [world.time]") if(!check_rights(0)) return var/dat = "The first rule of adminbuse is: you don't talk about the adminbuse.
" if(check_rights(R_FUN,0) || check_rights(R_ADMINBUS,0)) dat += {" Fourth-Wall Demolition

"} if(check_rights(R_ADMINBUS,0)) dat += {" Spawn an Adminbus
"} if(check_rights(R_FUN,0)) dat += {" Spawn yourself as a Test Dummy

"} if(check_rights(R_ADMIN,0)) dat += {" Admin Secrets

Remove all bombs currently in existence
Bombing List
Show current traitors and objectives
Show last [length(lastsignalers)] signalers
Show last [length(lawchanges)] law changes
Show AI Laws
Show Game Mode
Show Crew Manifest
List DNA (Blood)
List Fingerprints


"} if(check_rights(R_FUN,0)) dat += {" 'Random' Events

Toggle station artificial gravity
Spawn a wave of meteors (aka lagocolyptic shower)
Spawn a gravitational anomaly (aka lagitational anomolag)
Spawn wormholes
Spawn blob
Trigger an Alien infestation
Spawn an Alien silently
Trigger a Spider infestation
Send in a strike team
Trigger a Carp migration
Irradiate the station
Trigger a Prison Break
Trigger a Virus Outbreak
Spawn an Immovable Rod
Toggle a "lights out" event
Spawn an Ion Storm
Spawn Space-Vines
Trigger a communication blackout
Trigger a wave of PDA spams

Fun Secrets

Remove 'internal' clothing
Remove ALL clothing
Turn all humans into monkeys
Remove firesuits, grilles, and pods
Make all areas powered
Make all areas unpowered
Power all SMES
Toggle Prison Shuttle Status(Use with S/R)
Send Prison Shuttle
Return Prison Shuttle
Warp all Players to Prison
Triple AI mode (needs to be used in the lobby)
Everyone is the traitor
There can only be one!
Ghost Mode
Make all players retarded
Make all items look like guns
Distribute experimental guns to the crew
Japanese Animes Mode
Egalitarian Station Mode
Move Administration Shuttle
Move Ferry
Move Alien Dinghy
Break all lights
Fix all lights
Unleash THE BEES onto the crew
The floor is lava! (DANGEROUS: extremely lame)
Toggle Nar-Sie's behaviour
Trigger a fake alert
Adds in some Micheal Bay to the shift without major destruction
Turn every players into Bomberman
Make Bomberman Bombs actually hurt players
Make Bomberman Bombs actually destroy stuff
Make Bomberman Bombs harmless to players(default)
Make Bomberman Bombs harmless to the environnement(default)
Create a turret

Final Solutions
(Warning, these will end the round!)

Summon Nar-Sie
Start a Supermatter Cascade
"} if(check_rights(R_SERVER,0)) dat += {"
Server

Toggle bomb cap
Toggle explosion method
"} dat += "
" if(check_rights(R_DEBUG,0)) dat += {" Security Level Elevated

Change all maintenance doors to engie/brig access only
Change all maintenance doors to brig access only
Remove cap on security officers
Custom Virus Outbreak

Coder Secrets

Show Job Debug
Admin Log

"} usr << browse(dat, "window=secrets") return /datum/admins/var/datum/shuttle/selected_shuttle /datum/admins/proc/shuttle_magic() var/dat = "WARNING: server may explode!

" if(!istype(selected_shuttle)) dat += "Select a shuttle
" else dat += {"Selected shuttle: [selected_shuttle.name] ([selected_shuttle.type])
view variables | teleport to | select another shuttle
cooldown: [selected_shuttle.cooldown] | pre-flight delay: [selected_shuttle.pre_flight_delay] | transit delay: [selected_shuttle.transit_delay]
rotation [selected_shuttle.can_rotate ? "ENABLED" : "DISABLED"] | transit [selected_shuttle.use_transit ? "ENABLED" : "DISABLED"]
Create a destination docking port
Add a destination docking port
Modify transit area
Get control console
Modify parameters[selected_shuttle.is_special() ? " and pre-defined areas" : ""]
Send
Teleport
Make movement instant
Draw outline
[selected_shuttle.lockdown ? "Lift lockdown" : "Lock down"]
Reset
Delete
"} //The following commands don't need a selected shuttle dat += {" Turn current area into a shuttle
Lock down all shuttles "} usr << browse(dat, "window=shuttlemagic") /////////////////////////////////////////////////////////////////////////////////////////////////admins2.dm merge //i.e. buttons/verbs /datum/admins/proc/restart() set category = "Server" set name = "Restart" set desc="Restarts the world" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/restart() called tick#: [world.time]") if (!usr.client.holder) return var/confirm = alert("Restart the game world?", "Restart", "Yes", "Cancel") if(confirm == "Cancel") return if(confirm == "Yes") world << "Restarting world! Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]!" log_admin("[key_name(usr)] initiated a reboot.") feedback_set_details("end_error","admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]") feedback_add_details("admin_verb","R") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! if(blackbox) blackbox.save_all_data_to_sql() CallHook("Reboot",list()) if (watchdog.waiting) world << "Server will shut down for an automatic update in a few seconds." watchdog.signal_ready() return sleep(50) world.Reboot() /datum/admins/proc/announce() set category = "Special Verbs" set name = "Announce" set desc="Announce your desires to the world" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/announce() called tick#: [world.time]") if(!check_rights(0)) return var/message = input("Global message to send:", "Admin Announce", null, null) as message if(message) if(!check_rights(R_SERVER,0)) message = adminscrub(message,500) world << "[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:\n \t [message]" log_admin("Announce: [key_name(usr)] : [message]") feedback_add_details("admin_verb","A") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleooc() set category = "Server" set desc="Globally Toggles OOC" set name="Toggle OOC" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/toggleooc() called tick#: [world.time]") ooc_allowed = !( ooc_allowed ) if (ooc_allowed) world << "The OOC channel has been globally enabled!" else world << "The OOC channel has been globally disabled!" log_admin("[key_name(usr)] toggled OOC.") message_admins("[key_name_admin(usr)] toggled OOC.", 1) feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleoocdead() set category = "Server" set desc="Toggle dis bitch" set name="Toggle Dead OOC" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/toggleoocdead() called tick#: [world.time]") dooc_allowed = !( dooc_allowed ) log_admin("[key_name(usr)] toggled OOC.") message_admins("[key_name_admin(usr)] toggled Dead OOC.", 1) feedback_add_details("admin_verb","TDOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggletraitorscaling() set category = "Server" set desc="Toggle traitor scaling" set name="Toggle Traitor Scaling" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/toggletraitorscaling() called tick#: [world.time]") traitor_scaling = !traitor_scaling log_admin("[key_name(usr)] toggled Traitor Scaling to [traitor_scaling].") message_admins("[key_name_admin(usr)] toggled Traitor Scaling [traitor_scaling ? "on" : "off"].", 1) feedback_add_details("admin_verb","TTS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/startnow() set category = "Server" set desc="Start the round RIGHT NOW" set name="Start Now" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/startnow() called tick#: [world.time]") if(!ticker) alert("Unable to start the game as it is not set up.") return if(ticker.current_state == GAME_STATE_PREGAME) ticker.current_state = GAME_STATE_SETTING_UP log_admin("[usr.key] has started the game.") message_admins("[usr.key] has started the game.") feedback_add_details("admin_verb","SN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return 1 else usr << "Error: Start Now: Game has already started." return 0 /datum/admins/proc/toggleenter() set category = "Server" set desc="People can't enter" set name="Toggle Entering" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/toggleenter() called tick#: [world.time]") enter_allowed = !( enter_allowed ) if (!( enter_allowed )) world << "New players may no longer enter the game." else world << "New players may now enter the game." log_admin("[key_name(usr)] toggled new player game entering.") message_admins("[key_name_admin(usr)] toggled new player game entering.", 1) world.update_status() feedback_add_details("admin_verb","TE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleAI() set category = "Server" set desc="People can't be AI" set name="Toggle AI" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/toggleAI() called tick#: [world.time]") config.allow_ai = !( config.allow_ai ) if (!( config.allow_ai )) world << "The AI job is no longer chooseable." else world << "The AI job is chooseable now." log_admin("[key_name(usr)] toggled AI allowed.") world.update_status() feedback_add_details("admin_verb","TAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleaban() set category = "Server" set desc="Respawn basically" set name="Toggle Respawn" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/toggleaban() called tick#: [world.time]") abandon_allowed = !( abandon_allowed ) if (abandon_allowed) world << "You may now respawn." else world << "You may no longer respawn :(" message_admins("[key_name_admin(usr)] toggled respawn to [abandon_allowed ? "On" : "Off"].", 1) log_admin("[key_name(usr)] toggled respawn to [abandon_allowed ? "On" : "Off"].") world.update_status() feedback_add_details("admin_verb","TR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggle_aliens() set category = "Server" set desc="Toggle alien mobs" set name="Toggle Aliens" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/toggle_aliens() called tick#: [world.time]") aliens_allowed = !aliens_allowed log_admin("[key_name(usr)] toggled Aliens to [aliens_allowed].") message_admins("[key_name_admin(usr)] toggled Aliens [aliens_allowed ? "on" : "off"].", 1) feedback_add_details("admin_verb","TA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! #define LOBBY_TICKING_STOPPED 0 #define LOBBY_TICKING_RESTARTED 2 /datum/admins/proc/delay() set category = "Server" set desc="Delay the game start/end" set name="Delay" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/delay() called tick#: [world.time]") if(!check_rights(R_ADMIN)) return if (!ticker || ticker.current_state != GAME_STATE_PREGAME) if(ticker.delay_end == 2) world << "World Reboot triggered by [key_name(usr)]!" log_admin("World Reboot triggered by [key_name(usr)]!") if(watchdog.waiting) watchdog.signal_ready() else world.Reboot() ticker.delay_end = !ticker.delay_end log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].") message_admins("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) return //alert("Round end delayed", null, null, null, null, null) if (!( going )) going = LOBBY_TICKING_RESTARTED ticker.pregame_timeleft = world.timeofday + ticker.remaining_time world << "The game will start soon." log_admin("[key_name(usr)] removed the delay.") else going = LOBBY_TICKING_STOPPED world << "The game start has been delayed." log_admin("[key_name(usr)] delayed the game.") feedback_add_details("admin_verb","DELAY") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! #undef LOBBY_TICKING_STOPPED #undef LOBBY_TICKING_RESTARTED /datum/admins/proc/adjump() set category = "Server" set desc="Toggle admin jumping" set name="Toggle Jump" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/adjump() called tick#: [world.time]") config.allow_admin_jump = !(config.allow_admin_jump) message_admins("Toggled admin jumping to [config.allow_admin_jump].") feedback_add_details("admin_verb","TJ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/adspawn() set category = "Server" set desc="Toggle admin spawning" set name="Toggle Spawn" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/adspawn() called tick#: [world.time]") config.allow_admin_spawning = !(config.allow_admin_spawning) message_admins("Toggled admin item spawning to [config.allow_admin_spawning].") feedback_add_details("admin_verb","TAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/adrev() set category = "Server" set desc="Toggle admin revives" set name="Toggle Revive" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/adrev() called tick#: [world.time]") config.allow_admin_rev = !(config.allow_admin_rev) message_admins("Toggled reviving to [config.allow_admin_rev].") feedback_add_details("admin_verb","TAR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/immreboot() set category = "Server" set desc="Reboots the server post haste" set name="Immediate Reboot" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/immreboot() called tick#: [world.time]") if(!usr.client.holder) return if( alert("Reboot server?",,"Yes","No") == "No") return world << "Rebooting world! Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]!" log_admin("[key_name(usr)] initiated an immediate reboot.") feedback_set_details("end_error","immediate admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]") feedback_add_details("admin_verb","IR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! if(blackbox) blackbox.save_all_data_to_sql() CallHook("Reboot",list()) if (watchdog.waiting) world << "Server will shut down for an automatic update in a few seconds." watchdog.signal_ready() return world.Reboot() /datum/admins/proc/unprison(var/mob/M in mob_list) set category = "Admin" set name = "Unprison" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/unprison() called tick#: [world.time]") if (M.z == 2) if (config.allow_admin_jump) M.loc = pick(latejoin) message_admins("[key_name_admin(usr)] has unprisoned [key_name_admin(M)]", 1) log_admin("[key_name(usr)] has unprisoned [key_name(M)]") else alert("Admin jumping disabled") else alert("[M.name] is not prisoned.") feedback_add_details("admin_verb","UP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! ////////////////////////////////////////////////////////////////////////////////////////////////ADMIN HELPER PROCS /proc/is_special_character(mob/M as mob) // returns 1 for specail characters and 2 for heroes of gamemode //writepanic("[__FILE__].[__LINE__] (no type)([usr ? usr.ckey : ""]) \\/proc/is_special_character() called tick#: [world.time]") if(!ticker || !ticker.mode) return 0 if (!istype(M)) return 0 if(isrev(M) || isrevhead(M)) if (ticker.mode.config_tag == "revolution") return 2 return 1 if(iscult(M)) if (ticker.mode.config_tag == "cult") return 2 return 1 if(ismalf(M)) if (ticker.mode.config_tag == "malfunction") return 2 return 1 if(isnukeop(M)) if (ticker.mode.config_tag == "nuclear") return 2 return 1 if(iswizard(M)) if (ticker.mode.config_tag == "wizard") return 2 return 1 if(ischangeling(M)) if (ticker.mode.config_tag == "changeling") return 2 return 1 if(isborer(M)) if (ticker.mode.config_tag == "borer") return 2 return 1 if(isbadmonkey(M)) if (ticker.mode.config_tag == "monkey") return 2 return 1 if(isrobot(M)) var/mob/living/silicon/robot/R = M if(R.emagged) return 1 if(M.mind&&M.mind.special_role)//If they have a mind and special role, they are some type of traitor or antagonist. return 1 return 0 /* /datum/admins/proc/get_sab_desc(var/target) //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/get_sab_desc() called tick#: [world.time]") switch(target) if(1) return "Destroy at least 70% of the plasma canisters on the station" if(2) return "Destroy the AI" if(3) var/count = 0 for(var/mob/living/carbon/monkey/Monkey in world) if(Monkey.z == 1) count++ return "Kill all [count] of the monkeys on the station" if(4) return "Cut power to at least 80% of the station" else return "Error: Invalid sabotage target: [target]" */ /datum/admins/proc/spawn_atom(var/object as text) set category = "Debug" set desc = "(atom path) Spawn an atom" set name = "Spawn" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/spawn_atom() called tick#: [world.time]") if(!check_rights(R_SPAWN)) return var/list/matches = new() for(var/path in typesof(/atom)) if(findtext("[path]", object)) matches += path if(matches.len==0) return var/chosen if(matches.len==1) chosen = matches[1] else chosen = input("Select an atom type", "Spawn Atom", matches[1]) as null|anything in matches if(!chosen) return if(ispath(chosen,/turf)) var/turf/T = get_turf(usr.loc) T.ChangeTurf(chosen) else new chosen(usr.loc) log_admin("[key_name(usr)] spawned [chosen] at ([usr.x],[usr.y],[usr.z])") feedback_add_details("admin_verb","SA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/show_traitor_panel(var/mob/M in mob_list) set category = "Admin" set desc = "Edit mobs's memory and role" set name = "Show Traitor Panel" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/show_traitor_panel() called tick#: [world.time]") if(!istype(M)) usr << "This can only be used on instances of type /mob" return if(!M.mind) usr << "This mob has no mind!" return M.mind.edit_memory() feedback_add_details("admin_verb","STP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggletintedweldhelmets() set category = "Debug" set desc="Reduces view range when wearing welding helmets" set name="Toggle tinted welding helmes" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/toggletintedweldhelmets() called tick#: [world.time]") tinted_weldhelh = !( tinted_weldhelh ) if (tinted_weldhelh) world << "The tinted_weldhelh has been enabled!" else world << "The tinted_weldhelh has been disabled!" log_admin("[key_name(usr)] toggled tinted_weldhelh.") message_admins("[key_name_admin(usr)] toggled tinted_weldhelh.", 1) feedback_add_details("admin_verb","TTWH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleguests() set category = "Server" set desc="Guests can't enter" set name="Toggle guests" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/toggleguests() called tick#: [world.time]") guests_allowed = !( guests_allowed ) if (!( guests_allowed )) world << "Guests may no longer enter the game." else world << "Guests may now enter the game." log_admin("[key_name(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.") message_admins("[key_name_admin(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.", 1) feedback_add_details("admin_verb","TGU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/unjobban_panel() set name = "Unjobban Panel" set category = "Admin" //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/client/proc/unjobban_panel() called tick#: [world.time]") if (src.holder) src.holder.unjobbanpanel() feedback_add_details("admin_verb","UJBP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return /datum/admins/proc/output_ai_laws() //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/output_ai_laws() called tick#: [world.time]") var/ai_number = 0 for(var/mob/living/silicon/S in mob_list) ai_number++ if(isAI(S)) usr << "AI [key_name(S, usr)]'s laws:" else if(isrobot(S)) var/mob/living/silicon/robot/R = S usr << "CYBORG [key_name(S, usr)] [R.connected_ai?"(Slaved to: [R.connected_ai])":"(Independant)"]: laws:" else if (ispAI(S)) usr << "pAI [key_name(S, usr)]'s laws:" else usr << "SOMETHING SILICON [key_name(S, usr)]'s laws:" if (S.laws == null) usr << "[key_name(S, usr)]'s laws are null?? Contact a coder." else S.laws.show_laws(usr) if(!ai_number) usr << "No AIs located" //Just so you know the thing is actually working and not just ignoring you. /client/proc/update_mob_sprite(mob/living/carbon/human/H as mob in mob_list) set category = "Admin" set name = "Update Mob Sprite" set desc = "Should fix any mob sprite update errors." //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/client/proc/update_mob_sprite() called tick#: [world.time]") if (!holder) src << "Only administrators may use this command." return if(istype(H)) H.regenerate_icons() // // //ALL DONE //********************************************************************************************************* //TO-DO: // // /**********************Administration Shuttle**************************/ var/admin_shuttle_location = 0 // 0 = centcom 13, 1 = station proc/move_admin_shuttle() //writepanic("[__FILE__].[__LINE__] \\/proc/move_admin_shuttle() called tick#: [world.time]") var/area/fromArea var/area/toArea if (admin_shuttle_location == 1) fromArea = locate(/area/shuttle/administration/station) toArea = locate(/area/shuttle/administration/centcom) else fromArea = locate(/area/shuttle/administration/centcom) toArea = locate(/area/shuttle/administration/station) fromArea.move_contents_to(toArea) if (admin_shuttle_location) admin_shuttle_location = 0 else admin_shuttle_location = 1 return /**********************Alien ship**************************/ var/alien_ship_location = 1 // 0 = base , 1 = mine proc/move_alien_ship() //writepanic("[__FILE__].[__LINE__] \\/proc/move_alien_ship() called tick#: [world.time]") var/area/fromArea var/area/toArea if (alien_ship_location == 1) fromArea = locate(/area/shuttle/alien/mine) toArea = locate(/area/shuttle/alien/base) else fromArea = locate(/area/shuttle/alien/base) toArea = locate(/area/shuttle/alien/mine) fromArea.move_contents_to(toArea) if (alien_ship_location) alien_ship_location = 0 else alien_ship_location = 1 return proc/formatJumpTo(location, where = "") //writepanic("[__FILE__].[__LINE__] \\/proc/formatJumpTo() called tick#: [world.time]") var/turf/loc if (isturf(location)) loc = location else loc = get_turf(location) if (where == "") where = formatLocation(loc) return "[where]" proc/formatLocation(location) //writepanic("[__FILE__].[__LINE__] \\/proc/formatLocation() called tick#: [world.time]") var/turf/loc if (isturf(location)) loc = location else loc = get_turf(location) var/area/A = get_area(location) var/answer = "[istype(A) ? "[A.name]" : "UNKNOWN"] - [istype(loc) ? "[loc.x],[loc.y],[loc.z]" : "UNKNOWN"]" return answer proc/formatPlayerPanel(var/mob/U,var/text="PP") //writepanic("[__FILE__].[__LINE__] \\/proc/formatPlayerPanel() called tick#: [world.time]") return "[text]" //Credit to MrStonedOne from TG for this QoL improvement //returns 1 to let the dragdrop code know we are trapping this event //returns 0 if we don't plan to trap the event /datum/admins/proc/cmd_ghost_drag(var/mob/dead/observer/frommob, var/mob/living/tomob) //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/admins/proc/cmd_ghost_drag() called tick#: [world.time]") //if we couldn't do it manually, we can't do it here - the 0 means no message is displayed for failure if (!check_rights(R_VAREDIT, 0)) return 0 if (!frommob.ckey) return 0 var/question = "" if (tomob.ckey) question = "This mob already has a user ([tomob.key]) in control of it! " question += "Are you sure you want to place [frommob.name]([frommob.key]) in control of [tomob.name]?" if(alert(question, "Place ghost in control of mob?", "Yes", "No") != "Yes") return 1 if (!frommob || !tomob) //make sure the mobs don't go away while we waited for a response return 1 tomob.ghostize(0) //boot the old mob out message_admins("[key_name_admin(usr)] has put [frommob.ckey] in control of [tomob.name].") log_admin("[key_name(usr)] stuffed [frommob.ckey] into [tomob.name].") feedback_add_details("admin_verb","CGD") tomob.ckey = frommob.ckey qdel(frommob) return 1