mirror of
https://github.com/CHOMPstation/CHOMPstation.git
synced 2026-07-14 16:43:05 +01:00
768887d85a
* Move pilot helmets from southern_cross to main files, they are used on multiple maps now. * Ports export reports (#5051) * Ports export reports * Absolute pathing, small touchups * remove both layers * POLARIS: No string compare for assistants * Make turf obfuscation lists lazy * Improve two image cleanups * POLARIS: zshadows should be as invisible as their origin * POLARIS: Allow alteration of mob default see_invisible * say() safety check on client Spawn keeps it from destroying all say(), thankfully, but needs to be fixed. * POLARIS: Reduce double admin logs * POLARIS: Clean up adminpm logs * POLARIS: Communicator small refactor * POLARIS: UI Tweak involving species rarity * POLARIS: Allow species-specific statpanels * POLARIS: "0x32" is not a valid single-bit flag * POLARIS: Lazylen species restricted list * POLARIS: Prevent ghosts from ejecting borgs from rechargers * POLARIS: Make borg recharger test more robust * POLARIS: Another recharger fix * Fix nif logs * Removes some problematic HIDEJUMPSUIT flags * Camera fix * adds statue * adds statue * Revert "adds statue" This reverts commitf1c9193797. * POLARIS: Improve robot and typing overlays * Change to Teshari to test for bug Removing these, to see if they are related to the Teshari bug. These are the only two unique sprite features that I can see. * Promethean tweaks (hunger, regen time) * Xenoarch Multitool & Xenoarch Excavation Drill (#5058) * Xenoarch Multitool & Xenoarch Excavation Drill * Makes the tool work better * Cuts down on lines & left comments * change to m * Ports antibiotics overhaul (#5050) * Ports antibiotics overhaul * Update the rest of the places "spaceacillin" is used where antibiotics is meant. * Antibiotics port compiles * Fixes the drone borg ID thing AGAIN. (#5080) * Fixes the drone borg ID thing * Updates tracking implant description * Update tools_pickaxe_vr.dm * Removes excavation drill * Fixes default synth tails necessitating potentially harmful mystery delays in mannequin generation. -Now get_tail_image() can check the owner's syntheticness without having to wait for something else to call it whenever/wherever the fuck it happens. * Fixes missing pixel on human ass. * Update update_icons_vr.dm * absolute pathing * added slashes. No idea for what, but I don't want anyone to ask me to do it because they have OCD * Some size stuff for Proteans * Removes a bunch of my unused fluff stuff * fixed vale borg flashlight eye sprites * Changes to objects random - Fixed the icon_state for 'structure/plushie/carp' and the random first aid kit spawner - Added a random chance tool spawn for power tools (most of the time it should still just be regular tools) - Adjusted the spawn rate of medkits, combat medkits should be more rare - Cash split into its own loot item - Plushies split into large and small plushies - All the extra plushie spawns added to the random plushie spawn - Eightball and conch shell added to toy spawns - Added spawn points for the large plushies, cash, and the power tools * Removes an inconsistency in custom species code This line had no real use at all. It may even have contributed to various issues. All basic humanoid species have had their appearances constructed onto an existing blank 32x32 icon_state named and called for as "nothing" inside the effects.dmi. There are no untitled blanks either inside the effects.dmi file, so the funky deviant custom species icon_states would never have had any proper fallback. * Re-establishes existing foundations for human icon This line had no real use at all that I could find. It may even have contributed to various issues. Before this line was added, all basic humanoid species have had their appearances constructed onto an actually existing blank 32x32 icon_state named and called for as "nothing" inside the effects.dmi. There are no untitled blanks either inside the effects.dmi file, so the funky deviant species specific icon_states would never have had any proper fallback either. No negative effects whatsoever detected in testing runs. Maybe slight framerate increase, but that was likely unrelated/placebo lmao * Couple security otie fixes -Fixes sec oties failing to announce arrests for sec comms. -Adds another announcement for sec oties to confirm successfully detained crimester. * Fixes custom accessories not showing up on things Contradictory hardcoding babe. * Fixes inconsistencies in organ system -Seems the years old conversion to turn old limb names and tags and such to BP constants was never finished. -This also fixes warning spammy diona organ tags. * Balance pass on custom species traits * Revert "Fixes cameras making completely black photos" * Fixes handheld cameras * Resh - Navy HoS Jacket https://forum.vore-station.net/viewtopic.php?f=27&t=1065 - approved fluff app. Long time coming, lol. (And first time 'coding'/using github to change files. hope I did it right. Oof.) * Increase prom limb health by 60% * changes hairstyles to use species defines * Correct Resh custom_items.txt for HoS jacket * (SQ-Merge) Adds in Floppy Bunny ears. (#3348) * (SQ-Merge) Possible fix for drop-nomming (#3331) * possible drop-nomming fix * no longer 100% fall cushion on non-aligning prefs * fixed some checks * (SQ-Merge) Makes rads not kill people in stomachs (#3342) * Makes rads not kill people in stomachs * There we go * Update radiation.dm * POLARIS: Fixes #3308 (VS) - Skrell lack eyes * POLARIS: Fixes #3280 (VS) - Typing as ghost removes overlays Also gives them the proper ghost speech bubble. Unsure why it wasn't used! * POLARIS: Fixes #3298 (VS) - Observer-ghosts were naked instead of dressed * POLARIS: Fixes #3270 (VS) - Cleanbots make noise too often, reduce chance * POLARIS: Fixes #3264 (VS) - MMI insertion sanitizes w/o numbers allowed * POLARIS: Fixes #3237 (VS) - Cryoconsoles are lit even when unpowered * POLARIS: Fixes #3238 (VS) - Nothing but humans can understand silicons talking * POLARIS: Fixes #3221 (VS) - No explanation of what to do in the case of system instability * POLARIS: Fixes #2601 (VS) - Allows mechs to continue charging after battery swap w/o moving * POLARIS: Fixes #5282 (VS) - Allow use of pens to label pill bottles, like glass bottles * POLARIS: Fixes #2573 (VS) - Slap cigarettes off people's faces * POLARIS: Ventcrawling assistance * POLARIS: Fix holders to avoid forcemoving held mob to nullspace * POLARIS: Allow crawling through vertical pipes * POLARIS: Weird snacks runtime * POLARIS: Sometimes items have this set to null because they are bad. * POLARIS: Beam weapons runtime when you shoot yourself * POLARIS: Fix a call to the wrong update icons in prom regen * POLARIS: Fix incorrect robolimb checks * POLARIS: Heal robolimbs when you heal everything Typically only used in magic and stuff, makes sense to heal both (otherwise there's no way to heal whole FBP bodies) * POLARIS: Add eye color to shapeshifters * POLARIS: Adds an animation thing, uses it on ventcrawls * Fixes Suit Storage Icons Items in suit storage should no longer vanish. * Adds Keypad Auth to CE Office * 44 revolvers Port from Bay - Addition of two more revolvers in 44 cal for variety - Creation of rubber rounds for 44 cal (stats taken from virgo no idea how good they are in actual fights) - Includes 44 ammo speedloaders, regular and rubber speedloaders - Slight adjustments to allow for firing animations taken from Bay (the mosley revolver has a firing animation that plays) - Includes in hand sprites We did already have the 'webley' sprite (it exists in a recolored sprite). However it is a alternate sprite for the detective's 45 revolver. This brings it in as a actual proper revolver with sprites that are different than the detectives revolver, and maybe in the future can be thrown into loot lists and PoIs. * Adds bioprinter to medical Only internal organs work well * Fixes feathered tesh tail and removes an useless piece of code. -Feathered tesh tail now uses the proper dual color system now that it no longer comes with the default tail. -Removes completely redundant body hair code from robolimb icon generation. * byond beta back on its bullshit * Update organ_icon.dm * Update organ_icon.dm * Probably maybe fixes blank lines for prey * Fixes incorrect camera naming/networks. Fixes #3353 * Nanoui now supports use of multiple templates (#5105) * Nanoui now supports use of multiple templates * Removing debug code, indentation * Indentation * Arranges lots of things into planes (#5072) * Rearranges a billion things into planes * Make cryotubes fancy * Update Travis * Fix hiding logic * Lore-Compliant Oculum News Channel (#5111) * adds an e-reader full of news to the loadout * Political Almanac -> Pocket Newscaster * new news channel containing lore-compliant news that's not bad * prettified lorecodex, added a month's worth of news (#5112) * prettified lorecodex : added a month's worth of news * what the hell elgie * all according to kaikoku * Grant remote profile access to R_DEBUG holders * Fix for MOB_CAN_SEE_PLANE * Normal brute kits disinfect wounds * Fixes fullbright mode hiding lighting overlays. Fullbright plane master being above lighting plane master is important, shouldn't be removed. * Fixes machines being below tables they should sit upon. * Fixes Runtime in logging.dm,61 * Removes vials * Update and rename pai_manifest.tmpl to crew_manifest.tmpl * Change of template * Fixes infinite loop in FBP naming w/o client * Adds Map Template Groups Adds ability to have many different 'versions' of a PoI, yet only having one show up per round. An example on how to do this is provided with Radio Free Sif (aka DJOutpost). Just make sure all the different versions have the same 'template_group' value. * Adds a message on emag to the battle arcade machine. (#5129) * Updates one arcade machine emag message to to_chat, adds another. * Returns 1 in emag_act for orion trail. * Converts a bunch of stuff to macros. Should probably not break anything. * Fixes an improper macro usage. * Attempts to fix all 20 errors. * Makes syndie dufflebags hint that they let you move faster * Fixes untagged sorting junction * Actually adds adhoc_fallback to pilot headsets * Map fixes and tweaks - Flashers in brig cells now should work, extra floor flash in communal brig to deal with crims. - Inproper access, SMES rooms. - Trader start point being dark now fixed. - Medical Vendor Plus has more advanced burn and trauma kits. Also splints. - Cell 1 and 2 in the brig can now be accessed by detectives. - Additional r-walls next to the engine room to help with rads. - Floor decals in a couple areas. - RD office now has its telescreen back. * Fix unused variable warnings. * Fix light/camera layers for macros and fix constants for them too. * Updates changelog * Camera types exist to determine networks! * Reverted use of 'usr' back to 'user' from commit05fd53ebcc* Fixes a bug. It's flatland zorren. Fixes #3376 * Fixes wallet-HUD interaction issues. (#5130) * Fixes wallet-HUD interaction issues. * Fixes HUDs, too. Forgot to commit this the first time. Also hopefully didn't change the map to examplemap. * Fixes an indentation error. * Nerfs solargrub drain speed. Due to the lack of saturation in the moderate event container, solargrubs show up way too frequently, and changing the frequency doesn't help. The container has to pick. This change will just bump the drain speed down so severely, that if you kill one or two grubs, the station should barely feel the impact anymore. As opposed to having to kill 4/5 grubs on average. Gradual nerfs seem logical, as grubs get more and mroe of a day-to-day experience, and most people know about them now. Time to stop the witch hunting for those annoying grubs :p * In which MC is dumb. Actually removes network override * Initial cleanup/changes * More optimizations for character joins * Switch cables and pipes to use define constants instead of literals for layers. Also fix a few things to be on the correct plane. Basically the under-floor stuff is supposed to be on PLATING_PLANE. Portable atmospherics go on object layer so they are above stationary machinery, given that they move around. Fixed wires to be on top of pipes like they used to be, otherwise they'd be obscured too often. * Don't kick admin observers for inactivity. They might be waiting for ahelps. * Fixes vox not having hardsuit sprites. Uses the new defines. * Replaces base egun sprite * Small fixes and ports discovered during merge. (#5138) * POLARIS: No string compare for assistants * POLARIS: Move these planes to more useful places * POLARIS: Only spam ghosts with chat messages from things with real clients * Fix small forgotten lines of text accidentally left out of VS syncs. * Fix typo'd plane in lighting.dm and remove redundant definitions. * Fixes a bunch of simple animal vore icon issues. * Fixes Pathing * Small Shock/Holo collar tweaks. -Updates their old >> dialogue. -Makes shock collars taggable. Was gonna fix them showing up in forced lowercase on people but that turned out to be a separate polaris issue that I just opened a fix for up there. * more fixes etc * Update solargrub.dm * Improves contrasts on sprites and removes the need for mirroring upstream sprites * adds generic gibs to vore mob icons to prevent sneks * Adds a bunch of stuff to cargo selection. -Xenowear crate, 13 non-random xenowear items for 100 points. -Teshari smocks crate, comes with all the 5 basic colors for 25 points. -Teshari undercoats, comes with 4 random colors from basic and grey selection for 20 points. -Teshari undercoats black, comes with 4 random colors from the black trim selection for 20 points. -Teshari cloaks, comes with 4 random colors from basic and grey selection for 40 points. -Teshari cloaks black, comes with 4 random colors from the black trim selection for 40 points. -Utility uniforms, comes with the 3 loadout utility uniforms (black/blue/grey) for 30 points. -Skirts crate, comes with the 10 regular type skirts for 40 points. -Varsity jackets, comes with the set of 6 colors for 60 points. -Leather gear crate, comes with 5 random items from a selection of 21 more or less tough/kinky gear for 50 points. -Eyewear crate, comes with 11 cosmetic and/or prescription pieces for 50 points. -Gloves crate, comes with 4 random gloves with a chance to hit a couple fancier ones among the basic colors for 40 points. -Boots crate, comes with 3 random pairs of boots freely available in loadout for 60 points. -Taurbags crate, comes with the 3 universal saddlebags we have (basic/robust/vest) for 60 points. -Cuisine crate, comes with 5 random foods from a list of varying cultural fanciness for 25 points. -Burger crate, comes with 5 random basic burgers for 15 points. -Special burger crate, comes with 3 random special burgers for 60 points. -Bakery products, comes with 5 random bakery products for 15 points. -Cakes crate, comes with 5 random cakes for 50 points. -Mexican food crate, comes with 5 random mexican foods for 15 points. -Asian food crate, comes with 5 random asian foods for 15 points. -Action figures crate, comes with 5 random figures for 50 points. -Tabletop miniatures crate, delivers the set of those characters for 30 points. -Plushies crate, comes with 3 random plushies for 30 points. * Changes wedding rings to be a subtype of ring Also moves them to their own .dm, since they're now a subtype of the thing in rings.dm. Also changed bethrothed to spouse, as the former is usually before marriage and not after. Benefits of this include: Being able to wear gloves over wedding rings. Making them tiny instead of small. Making their gender neuter instead of plural, so it wont say "some wedding ring" when you examine someone wearing them. Probably more good things. Issue reported by HzDonut. * Cargo pack tweaks. * Adds a machine for recoloring apparel ingame. -Not mapped in currently. -Still unsure whether to have it whitelisted for white/grey items only or to let people have their fun experimenting on nasty aesthetics. -Also supports bags and belts. Yes, I've heard the pleas of the people not liking the default grey being the only public backpack option there is. * Reverts gauze disinfecting until a proper solution can be put in place. * Fixed mesons NIFSoft overlay not highlighting open spaces above * Fixes #3368 - Teleporting now often respects dropnom pref * Fixes #3344 - Holocarp set DM_HOLD when holodeck is safe * Squashed commit of the following: commit f55edb98499b600186be9f58c0d245b454479b74 Author: Verkister <superverkelian@hotmail.com> Date: Sun Apr 8 17:05:19 2018 +0300 we'll see about that whitelist crap later then commit 186ce2aba274c4009c42a730d1ba7c67dddf8ea6 Author: Verkister <superverkelian@hotmail.com> Date: Sun Apr 8 16:32:08 2018 +0300 screw you too travis commit 470789300bda3949de4027dc8e2c25ae8427eaae Author: Verkister <superverkelian@hotmail.com> Date: Sun Apr 8 16:10:29 2018 +0300 Update painter_vr.dm commit e9dee86b0cb84172c95f3a91ba73ce0b2661820c Author: Verkister <superverkelian@hotmail.com> Date: Sun Apr 8 15:51:37 2018 +0300 Update painter_vr.dm * allows meteors to be deflected by baseball bats * snib * oh, and the DME, too * fixes the meteor refusing to move at all after being deflected * done * Fix shuttle corner turfs disappearing when shuttle moves. When shuttles land on a turf, it takes the appearance of the turf it lands on as an underlay. Must make sure this underlay is on FLOAT_PLANE otherwise it will likely end up OVER the turf itself. * Set appropriate vars for persisting adminspawned characters * Minor Psych office tweaks. Closes 2090 * Adds compact defib to CC medbay. Closes #2287 * Makes the door button in EVA ACTUALLY WORK * Squashed commit of the following: commit bd470fd0276e83fa1516cc1b966308165d081b1b Author: Verkister <superverkelian@hotmail.com> Date: Tue Apr 10 20:45:00 2018 +0300 Update painter_vr.dm commit 12e39bcec9b717d477a64aca0f8dfe917917986b Author: Verkister <superverkelian@hotmail.com> Date: Mon Apr 9 09:34:50 2018 +0300 Update painter_vr.dm * Reduce abduction chance 1%->0.5%, add logs * Removes Camilla's plush as per request * Some protean fixes (regen, size as blob, gender) * switch map to tgm for merge * convert map to tgm for merge
1009 lines
38 KiB
Plaintext
1009 lines
38 KiB
Plaintext
/client/proc/cmd_admin_drop_everything(mob/M as mob in mob_list)
|
|
set category = null
|
|
set name = "Drop Everything"
|
|
if(!holder)
|
|
src << "Only administrators may use this command."
|
|
return
|
|
|
|
var/confirm = alert(src, "Make [M] drop everything?", "Message", "Yes", "No")
|
|
if(confirm != "Yes")
|
|
return
|
|
|
|
for(var/obj/item/W in M)
|
|
M.drop_from_inventory(W)
|
|
|
|
log_admin("[key_name(usr)] made [key_name(M)] drop everything!")
|
|
message_admins("[key_name_admin(usr)] made [key_name_admin(M)] drop everything!", 1)
|
|
feedback_add_details("admin_verb","DEVR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
/client/proc/cmd_admin_prison(mob/M as mob in mob_list)
|
|
set category = "Admin"
|
|
set name = "Prison"
|
|
if(!holder)
|
|
src << "Only administrators may use this command."
|
|
return
|
|
if (ismob(M))
|
|
if(istype(M, /mob/living/silicon/ai))
|
|
alert("The AI can't be sent to prison you jerk!", null, null, null, null, null)
|
|
return
|
|
//strip their stuff before they teleport into a cell :downs:
|
|
for(var/obj/item/W in M)
|
|
M.drop_from_inventory(W)
|
|
//teleport person to cell
|
|
M.Paralyse(5)
|
|
sleep(5) //so they black out before warping
|
|
M.loc = pick(prisonwarp)
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/mob/living/carbon/human/prisoner = M
|
|
prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(prisoner), slot_w_uniform)
|
|
prisoner.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(prisoner), slot_shoes)
|
|
spawn(50)
|
|
M << "<font color='red'>You have been sent to the prison station!</font>"
|
|
log_admin("[key_name(usr)] sent [key_name(M)] to the prison station.")
|
|
message_admins("<font color='blue'>[key_name_admin(usr)] sent [key_name_admin(M)] to the prison station.</font>", 1)
|
|
feedback_add_details("admin_verb","PRISON") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
//Allows staff to determine who the newer players are.
|
|
/client/proc/cmd_check_new_players()
|
|
set category = "Admin"
|
|
set name = "Check new Players"
|
|
if(!holder)
|
|
src << "Only staff members may use this command."
|
|
|
|
var/age = alert(src, "Age check", "Show accounts yonger then _____ days","7", "30" , "All")
|
|
|
|
if(age == "All")
|
|
age = 9999999
|
|
else
|
|
age = text2num(age)
|
|
|
|
var/missing_ages = 0
|
|
var/msg = ""
|
|
|
|
var/highlight_special_characters = 1
|
|
|
|
for(var/client/C in clients)
|
|
if(C.player_age == "Requires database")
|
|
missing_ages = 1
|
|
continue
|
|
if(C.player_age < age)
|
|
msg += "[key_name(C, 1, 1, highlight_special_characters)]: account is [C.player_age] days old<br>"
|
|
|
|
if(missing_ages)
|
|
src << "Some accounts did not have proper ages set in their clients. This function requires database to be present."
|
|
|
|
if(msg != "")
|
|
src << browse(msg, "window=Player_age_check")
|
|
else
|
|
src << "No matches for that age range found."
|
|
|
|
/client/proc/cmd_admin_subtle_message(mob/M as mob in mob_list)
|
|
set category = "Special Verbs"
|
|
set name = "Subtle Message"
|
|
|
|
if(!ismob(M)) return
|
|
if (!holder)
|
|
src << "Only administrators may use this command."
|
|
return
|
|
|
|
var/msg = sanitize(input("Message:", text("Subtle PM to [M.key]")) as text)
|
|
|
|
if (!msg)
|
|
return
|
|
if(usr)
|
|
if (usr.client)
|
|
if(usr.client.holder)
|
|
M << "<B>You hear a voice in your head...</B> <i>[msg]</i>"
|
|
|
|
log_admin("SubtlePM: [key_name(usr)] -> [key_name(M)] : [msg]")
|
|
message_admins("<font color='blue'><B>SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]</B></font>", 1)
|
|
feedback_add_details("admin_verb","SMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
/client/proc/cmd_admin_world_narrate() // Allows administrators to fluff events a little easier -- TLE
|
|
set category = "Special Verbs"
|
|
set name = "Global Narrate"
|
|
|
|
if (!holder)
|
|
src << "Only administrators may use this command."
|
|
return
|
|
|
|
var/msg = sanitize(input("Message:", text("Enter the text you wish to appear to everyone:")) as text)
|
|
|
|
if (!msg)
|
|
return
|
|
world << "[msg]"
|
|
log_admin("GlobalNarrate: [key_name(usr)] : [msg]")
|
|
message_admins("<font color='blue'><B> GlobalNarrate: [key_name_admin(usr)] : [msg]<BR></B></font>", 1)
|
|
feedback_add_details("admin_verb","GLN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
/client/proc/cmd_admin_direct_narrate(var/mob/M) // Targetted narrate -- TLE
|
|
set category = "Special Verbs"
|
|
set name = "Direct Narrate"
|
|
|
|
if(!holder)
|
|
src << "Only administrators and moderators may use this command."
|
|
return
|
|
|
|
if(!M)
|
|
M = input("Direct narrate to who?", "Active Players") as null|anything in get_mob_with_client_list()
|
|
|
|
if(!M)
|
|
return
|
|
|
|
var/msg = sanitize(input("Message:", text("Enter the text you wish to appear to your target:")) as text)
|
|
|
|
if( !msg )
|
|
return
|
|
|
|
M << msg
|
|
log_admin("DirectNarrate: [key_name(usr)] to ([M.name]/[M.key]): [msg]")
|
|
message_admins("<font color='blue'><B> DirectNarrate: [key_name(usr)] to ([M.name]/[M.key]): [msg]<BR></B></font>", 1)
|
|
feedback_add_details("admin_verb","DIRN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
/client/proc/cmd_admin_godmode(mob/M as mob in mob_list)
|
|
set category = "Special Verbs"
|
|
set name = "Godmode"
|
|
if(!holder)
|
|
src << "Only administrators may use this command."
|
|
return
|
|
M.status_flags ^= GODMODE
|
|
usr << "<font color='blue'> Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]</font>"
|
|
|
|
log_admin("[key_name(usr)] has toggled [key_name(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]")
|
|
message_admins("[key_name_admin(usr)] has toggled [key_name_admin(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]", 1)
|
|
feedback_add_details("admin_verb","GOD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
|
|
proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0)
|
|
if(automute)
|
|
if(!config.automute_on)
|
|
return
|
|
else
|
|
if(!usr || !usr.client)
|
|
return
|
|
if(!usr.client.holder)
|
|
usr << "<font color='red'>Error: cmd_admin_mute: You don't have permission to do this.</font>"
|
|
return
|
|
if(!M.client)
|
|
usr << "<font color='red'>Error: cmd_admin_mute: This mob doesn't have a client tied to it.</font>"
|
|
if(M.client.holder)
|
|
usr << "<font color='red'>Error: cmd_admin_mute: You cannot mute an admin/mod.</font>"
|
|
if(!M.client)
|
|
return
|
|
if(M.client.holder)
|
|
return
|
|
|
|
var/muteunmute
|
|
var/mute_string
|
|
|
|
switch(mute_type)
|
|
if(MUTE_IC) mute_string = "IC (say and emote)"
|
|
if(MUTE_OOC) mute_string = "OOC"
|
|
if(MUTE_PRAY) mute_string = "pray"
|
|
if(MUTE_ADMINHELP) mute_string = "adminhelp, admin PM and ASAY"
|
|
if(MUTE_DEADCHAT) mute_string = "deadchat and DSAY"
|
|
if(MUTE_ALL) mute_string = "everything"
|
|
else return
|
|
|
|
if(automute)
|
|
muteunmute = "auto-muted"
|
|
M.client.prefs.muted |= mute_type
|
|
log_admin("SPAM AUTOMUTE: [muteunmute] [key_name(M)] from [mute_string]")
|
|
message_admins("SPAM AUTOMUTE: [muteunmute] [key_name_admin(M)] from [mute_string].", 1)
|
|
M << "<span class='alert'>You have been [muteunmute] from [mute_string] by the SPAM AUTOMUTE system. Contact an admin.</span>"
|
|
feedback_add_details("admin_verb","AUTOMUTE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
return
|
|
|
|
if(M.client.prefs.muted & mute_type)
|
|
muteunmute = "unmuted"
|
|
M.client.prefs.muted &= ~mute_type
|
|
else
|
|
muteunmute = "muted"
|
|
M.client.prefs.muted |= mute_type
|
|
|
|
log_admin("[key_name(usr)] has [muteunmute] [key_name(M)] from [mute_string]")
|
|
message_admins("[key_name_admin(usr)] has [muteunmute] [key_name_admin(M)] from [mute_string].", 1)
|
|
M << "<span class = 'alert'>You have been [muteunmute] from [mute_string].</span>"
|
|
feedback_add_details("admin_verb","MUTE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
/client/proc/cmd_admin_add_random_ai_law()
|
|
set category = "Fun"
|
|
set name = "Add Random AI Law"
|
|
if(!holder)
|
|
src << "Only administrators may use this command."
|
|
return
|
|
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
|
|
if(confirm != "Yes") return
|
|
log_admin("[key_name(src)] has added a random AI law.")
|
|
message_admins("[key_name_admin(src)] has added a random AI law.", 1)
|
|
|
|
var/show_log = alert(src, "Show ion message?", "Message", "Yes", "No")
|
|
if(show_log == "Yes")
|
|
command_announcement.Announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", new_sound = 'sound/AI/ionstorm.ogg')
|
|
|
|
IonStorm(0)
|
|
feedback_add_details("admin_verb","ION") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
/*
|
|
Allow admins to set players to be able to respawn/bypass 30 min wait, without the admin having to edit variables directly
|
|
Ccomp's first proc.
|
|
*/
|
|
|
|
/client/proc/get_ghosts(var/notify = 0,var/what = 2)
|
|
// what = 1, return ghosts ass list.
|
|
// what = 2, return mob list
|
|
|
|
var/list/mobs = list()
|
|
var/list/ghosts = list()
|
|
var/list/sortmob = sortAtom(mob_list) // get the mob list.
|
|
var/any=0
|
|
for(var/mob/observer/dead/M in sortmob)
|
|
mobs.Add(M) //filter it where it's only ghosts
|
|
any = 1 //if no ghosts show up, any will just be 0
|
|
if(!any)
|
|
if(notify)
|
|
src << "There doesn't appear to be any ghosts for you to select."
|
|
return
|
|
|
|
for(var/mob/M in mobs)
|
|
var/name = M.name
|
|
ghosts[name] = M //get the name of the mob for the popup list
|
|
if(what==1)
|
|
return ghosts
|
|
else
|
|
return mobs
|
|
|
|
|
|
/client/proc/allow_character_respawn()
|
|
set category = "Special Verbs"
|
|
set name = "Allow player to respawn"
|
|
set desc = "Let's the player bypass the wait to respawn or allow them to re-enter their corpse."
|
|
if(!holder)
|
|
src << "Only administrators and moderators may use this command."
|
|
var/list/ghosts= get_ghosts(1,1)
|
|
|
|
var/target = input("Please, select a ghost!", "COME BACK TO LIFE!", null, null) as null|anything in ghosts
|
|
if(!target)
|
|
src << "Hrm, appears you didn't select a ghost" // Sanity check, if no ghosts in the list we don't want to edit a null variable and cause a runtime error.
|
|
return
|
|
|
|
var/mob/observer/dead/G = ghosts[target]
|
|
if(G.has_enabled_antagHUD && config.antag_hud_restricted)
|
|
var/response = alert(src, "Are you sure you wish to allow this individual to play?","Ghost has used AntagHUD","Yes","No")
|
|
if(response == "No") return
|
|
G.timeofdeath=-19999 /* time of death is checked in /mob/verb/abandon_mob() which is the Respawn verb.
|
|
timeofdeath is used for bodies on autopsy but since we're messing with a ghost I'm pretty sure
|
|
there won't be an autopsy.
|
|
*/
|
|
G.has_enabled_antagHUD = 2
|
|
G.can_reenter_corpse = 1
|
|
|
|
G:show_message(text("<font color='blue'><B>You may now respawn. You should roleplay as if you learned nothing about the round during your time with the dead.</B></font>"), 1)
|
|
log_admin("[key_name(usr)] allowed [key_name(G)] to bypass the respawn time limit")
|
|
message_admins("Admin [key_name_admin(usr)] allowed [key_name_admin(G)] to bypass the respawn time limit", 1)
|
|
|
|
|
|
/client/proc/toggle_antagHUD_use()
|
|
set category = "Server"
|
|
set name = "Toggle antagHUD usage"
|
|
set desc = "Toggles antagHUD usage for observers"
|
|
|
|
if(!holder)
|
|
src << "Only administrators may use this command."
|
|
var/action=""
|
|
if(config.antag_hud_allowed)
|
|
for(var/mob/observer/dead/g in get_ghosts())
|
|
if(!g.client.holder) //Remove the verb from non-admin ghosts
|
|
g.verbs -= /mob/observer/dead/verb/toggle_antagHUD
|
|
if(g.antagHUD)
|
|
g.antagHUD = 0 // Disable it on those that have it enabled
|
|
g.has_enabled_antagHUD = 2 // We'll allow them to respawn
|
|
g << "<font color='red'><B>The Administrator has disabled AntagHUD </B></font>"
|
|
config.antag_hud_allowed = 0
|
|
src << "<font color='red'><B>AntagHUD usage has been disabled</B></font>"
|
|
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
|
|
g.verbs += /mob/observer/dead/verb/toggle_antagHUD
|
|
g << "<font color='blue'><B>The Administrator has enabled AntagHUD </B></font>" // Notify all observers they can now use AntagHUD
|
|
config.antag_hud_allowed = 1
|
|
action = "enabled"
|
|
src << "<font color='blue'><B>AntagHUD usage has been enabled</B></font>"
|
|
|
|
|
|
log_admin("[key_name(usr)] has [action] antagHUD usage for observers")
|
|
message_admins("Admin [key_name_admin(usr)] has [action] antagHUD usage for observers", 1)
|
|
|
|
|
|
|
|
/client/proc/toggle_antagHUD_restrictions()
|
|
set category = "Server"
|
|
set name = "Toggle antagHUD Restrictions"
|
|
set desc = "Restricts players that have used antagHUD from being able to join this round."
|
|
if(!holder)
|
|
src << "Only administrators may use this command."
|
|
var/action=""
|
|
if(config.antag_hud_restricted)
|
|
for(var/mob/observer/dead/g in get_ghosts())
|
|
g << "<font color='blue'><B>The administrator has lifted restrictions on joining the round if you use AntagHUD</B></font>"
|
|
action = "lifted restrictions"
|
|
config.antag_hud_restricted = 0
|
|
src << "<font color='blue'><B>AntagHUD restrictions have been lifted</B></font>"
|
|
else
|
|
for(var/mob/observer/dead/g in get_ghosts())
|
|
g << "<font color='red'><B>The administrator has placed restrictions on joining the round if you use AntagHUD</B></font>"
|
|
g << "<font color='red'><B>Your AntagHUD has been disabled, you may choose to re-enabled it but will be under restrictions </B></font>"
|
|
g.antagHUD = 0
|
|
g.has_enabled_antagHUD = 0
|
|
action = "placed restrictions"
|
|
config.antag_hud_restricted = 1
|
|
src << "<font color='red'><B>AntagHUD restrictions have been enabled</B></font>"
|
|
|
|
log_admin("[key_name(usr)] has [action] on joining the round if they use AntagHUD")
|
|
message_admins("Admin [key_name_admin(usr)] has [action] on joining the round if they use AntagHUD", 1)
|
|
|
|
/*
|
|
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 */
|
|
/client/proc/respawn_character()
|
|
set category = "Special Verbs"
|
|
set name = "Spawn Character"
|
|
set desc = "(Re)Spawn a client's loaded character."
|
|
if(!holder)
|
|
src << "Only administrators may use this command."
|
|
return
|
|
|
|
//I frontload all the questions so we don't have a half-done process while you're reading.
|
|
var/client/picked_client = input(src, "Please specify which client's character to spawn.", "Client", "") as null|anything in clients
|
|
if(!picked_client)
|
|
return
|
|
|
|
var/location = alert(src,"Please specify where to spawn them.", "Location", "Right Here", "Arrivals", "Cancel")
|
|
if(!location)
|
|
return
|
|
|
|
var/announce = alert(src,"Announce as if they had just arrived?", "Announce", "Yes", "No", "Cancel")
|
|
if(announce == "Cancel")
|
|
return
|
|
else if(announce == "Yes") //Too bad buttons can't just have 1/0 values and different display strings
|
|
announce = 1
|
|
else
|
|
announce = 0
|
|
|
|
var/inhabit = alert(src,"Put the person into the spawned mob?", "Inhabit", "Yes", "No", "Cancel")
|
|
if(inhabit == "Cancel")
|
|
return
|
|
else if(inhabit == "Yes")
|
|
inhabit = 1
|
|
else
|
|
inhabit = 0
|
|
|
|
//Name matching is ugly but mind doesn't persist to look at.
|
|
var/charjob
|
|
var/records
|
|
var/datum/data/record/record_found
|
|
record_found = find_general_record("name",picked_client.prefs.real_name)
|
|
|
|
//Found their record, they were spawned previously
|
|
if(record_found)
|
|
var/samejob = alert(src,"Found [picked_client.prefs.real_name] in data core. They were [record_found.fields["real_rank"]] this round. Assign same job? They will not be re-added to the manifest/records, either way.","Previously spawned","Yes","Assistant","No")
|
|
if(samejob == "Yes")
|
|
charjob = record_found.fields["real_rank"]
|
|
else if(samejob == USELESS_JOB) //VOREStation Edit - Visitor not Assistant
|
|
charjob = USELESS_JOB //VOREStation Edit - Visitor not Assistant
|
|
else
|
|
records = alert(src,"No data core entry detected. Would you like add them to the manifest, and sec/med/HR records?","Records","Yes","No","Cancel")
|
|
if(records == "Cancel")
|
|
return
|
|
if(records == "Yes")
|
|
records = 1
|
|
else
|
|
records = 0
|
|
|
|
//Well you're not reloading their job or they never had one.
|
|
if(!charjob)
|
|
var/pickjob = input(src,"Pick a job to assign them (or none).","Job Select","-No Job-") as null|anything in joblist + "-No Job-"
|
|
if(!pickjob)
|
|
return
|
|
if(pickjob != "-No Job-")
|
|
charjob = pickjob
|
|
|
|
//If you've picked a job by now, you can equip them.
|
|
var/equipment
|
|
if(charjob)
|
|
equipment = alert(src,"Spawn them with equipment?", "Equipment", "Yes", "No", "Cancel")
|
|
if(equipment == "Cancel")
|
|
return
|
|
else if(equipment == "Yes")
|
|
equipment = 1
|
|
else
|
|
equipment = 0
|
|
|
|
//For logging later
|
|
var/admin = key_name_admin(src)
|
|
var/player_key = picked_client.key
|
|
//VOREStation Add - Needed for persistence
|
|
var/picked_ckey = picked_client.ckey
|
|
var/picked_slot = picked_client.prefs.default_slot
|
|
//VOREStation Add End
|
|
|
|
var/mob/living/carbon/human/new_character
|
|
var/spawnloc
|
|
|
|
//Where did you want to spawn them?
|
|
switch(location)
|
|
if("Right Here") //Spawn them on your turf
|
|
if(!src.mob)
|
|
src << "You can't use 'Right Here' when you are not 'Right Anywhere'!"
|
|
return
|
|
|
|
spawnloc = get_turf(src.mob)
|
|
|
|
if("Arrivals") //Spawn them at a latejoin spawnpoint
|
|
spawnloc = pick(latejoin)
|
|
|
|
else //I have no idea how you're here
|
|
src << "Invalid spawn location choice."
|
|
return
|
|
|
|
//Did we actually get a loc to spawn them?
|
|
if(!spawnloc)
|
|
src << "Couldn't get valid spawn location."
|
|
return
|
|
|
|
new_character = new(spawnloc)
|
|
|
|
//We were able to spawn them, right?
|
|
if(!new_character)
|
|
src << "Something went wrong and spawning failed."
|
|
return
|
|
|
|
//Write the appearance and whatnot out to the character
|
|
picked_client.prefs.copy_to(new_character)
|
|
if(new_character.dna)
|
|
new_character.dna.ResetUIFrom(new_character)
|
|
new_character.sync_organ_dna()
|
|
if(inhabit)
|
|
new_character.key = player_key
|
|
//Were they any particular special role? If so, copy.
|
|
if(new_character.mind)
|
|
var/datum/antagonist/antag_data = get_antag_data(new_character.mind.special_role)
|
|
if(antag_data)
|
|
antag_data.add_antagonist(new_character.mind)
|
|
antag_data.place_mob(new_character)
|
|
|
|
//VOREStation Add - Required for persistence
|
|
if(new_character.mind)
|
|
new_character.mind.loaded_from_ckey = picked_ckey
|
|
new_character.mind.loaded_from_slot = picked_slot
|
|
//VOREStation Add End
|
|
|
|
//If desired, apply equipment.
|
|
if(equipment)
|
|
if(charjob)
|
|
job_master.EquipRank(new_character, charjob, 1)
|
|
equip_custom_items(new_character)
|
|
|
|
//If desired, add records.
|
|
if(records)
|
|
data_core.manifest_inject(new_character)
|
|
|
|
//A redraw for good measure
|
|
new_character.update_icons_all()
|
|
|
|
//If we're announcing their arrival
|
|
if(announce)
|
|
AnnounceArrival(new_character, new_character.mind.assigned_role)
|
|
|
|
log_admin("[admin] has spawned [player_key]'s character [new_character.real_name].")
|
|
message_admins("[admin] has spawned [player_key]'s character [new_character.real_name].", 1)
|
|
|
|
new_character << "You have been fully spawned. Enjoy the game."
|
|
|
|
feedback_add_details("admin_verb","RSPCH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
return new_character
|
|
|
|
/client/proc/cmd_admin_add_freeform_ai_law()
|
|
set category = "Fun"
|
|
set name = "Add Custom AI law"
|
|
if(!holder)
|
|
src << "Only administrators may use this command."
|
|
return
|
|
var/input = sanitize(input(usr, "Please enter anything you want the AI to do. Anything. Serious.", "What?", "") as text|null)
|
|
if(!input)
|
|
return
|
|
for(var/mob/living/silicon/ai/M in mob_list)
|
|
if (M.stat == 2)
|
|
usr << "Upload failed. No signal is being detected from the AI."
|
|
else if (M.see_in_dark == 0)
|
|
usr << "Upload failed. Only a faint signal is being detected from the AI, and it is not responding to our requests. It may be low on power."
|
|
else
|
|
M.add_ion_law(input)
|
|
for(var/mob/living/silicon/ai/O in mob_list)
|
|
O << input + "<font color='red'>... LAWS UPDATED!</font>"
|
|
O.show_laws()
|
|
|
|
log_admin("Admin [key_name(usr)] has added a new AI law - [input]")
|
|
message_admins("Admin [key_name_admin(usr)] has added a new AI law - [input]", 1)
|
|
|
|
var/show_log = alert(src, "Show ion message?", "Message", "Yes", "No")
|
|
if(show_log == "Yes")
|
|
command_announcement.Announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", new_sound = 'sound/AI/ionstorm.ogg')
|
|
feedback_add_details("admin_verb","IONC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
/client/proc/cmd_admin_rejuvenate(mob/living/M as mob in mob_list)
|
|
set category = "Special Verbs"
|
|
set name = "Rejuvenate"
|
|
if(!holder)
|
|
src << "Only administrators may use this command."
|
|
return
|
|
if(!mob)
|
|
return
|
|
if(!istype(M))
|
|
alert("Cannot revive a ghost")
|
|
return
|
|
if(config.allow_admin_rev)
|
|
M.revive()
|
|
|
|
log_admin("[key_name(usr)] healed / revived [key_name(M)]")
|
|
message_admins("<font color='red'>Admin [key_name_admin(usr)] healed / revived [key_name_admin(M)]!</font>", 1)
|
|
else
|
|
alert("Admin revive disabled")
|
|
feedback_add_details("admin_verb","REJU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
/client/proc/cmd_admin_create_centcom_report()
|
|
set category = "Special Verbs"
|
|
set name = "Create Command Report"
|
|
if(!holder)
|
|
src << "Only administrators may use this command."
|
|
return
|
|
var/input = sanitize(input(usr, "Please enter anything you want. Anything. Serious.", "What?", "") as message|null, extra = 0)
|
|
var/customname = sanitizeSafe(input(usr, "Pick a title for the report.", "Title") as text|null)
|
|
if(!input)
|
|
return
|
|
if(!customname)
|
|
customname = "[using_map.company_name] Update"
|
|
for (var/obj/machinery/computer/communications/C in machines)
|
|
if(! (C.stat & (BROKEN|NOPOWER) ) )
|
|
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc )
|
|
P.name = "'[command_name()] Update.'"
|
|
P.info = replacetext(input, "\n", "<br/>")
|
|
P.update_space(P.info)
|
|
P.update_icon()
|
|
C.messagetitle.Add("[command_name()] Update")
|
|
C.messagetext.Add(P.info)
|
|
|
|
switch(alert("Should this be announced to the general population?",,"Yes","No"))
|
|
if("Yes")
|
|
command_announcement.Announce(input, customname, new_sound = 'sound/AI/commandreport.ogg', msg_sanitized = 1);
|
|
if("No")
|
|
world << "<font color='red'>New [using_map.company_name] Update available at all communication consoles.</font>"
|
|
world << sound('sound/AI/commandreport.ogg')
|
|
|
|
log_admin("[key_name(src)] has created a command report: [input]")
|
|
message_admins("[key_name_admin(src)] has created a command report", 1)
|
|
feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in view())
|
|
set category = "Admin"
|
|
set name = "Delete"
|
|
|
|
if (!holder)
|
|
src << "Only administrators may use this command."
|
|
return
|
|
|
|
if (alert(src, "Are you sure you want to delete:\n[O]\nat ([O.x], [O.y], [O.z])?", "Confirmation", "Yes", "No") == "Yes")
|
|
log_admin("[key_name(usr)] deleted [O] at ([O.x],[O.y],[O.z])")
|
|
message_admins("[key_name_admin(usr)] deleted [O] at ([O.x],[O.y],[O.z])", 1)
|
|
feedback_add_details("admin_verb","DEL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
qdel(O)
|
|
|
|
/client/proc/cmd_admin_list_open_jobs()
|
|
set category = "Admin"
|
|
set name = "List free slots"
|
|
|
|
if (!holder)
|
|
src << "Only administrators may use this command."
|
|
return
|
|
if(job_master)
|
|
for(var/datum/job/job in job_master.occupations)
|
|
src << "[job.title]: [job.total_positions]"
|
|
feedback_add_details("admin_verb","LFS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world)
|
|
set category = "Special Verbs"
|
|
set name = "Explosion"
|
|
|
|
if(!check_rights(R_DEBUG|R_FUN|R_EVENT)) return
|
|
|
|
var/devastation = input("Range of total devastation. -1 to none", text("Input")) as num|null
|
|
if(devastation == null) return
|
|
var/heavy = input("Range of heavy impact. -1 to none", text("Input")) as num|null
|
|
if(heavy == null) return
|
|
var/light = input("Range of light impact. -1 to none", text("Input")) as num|null
|
|
if(light == null) return
|
|
var/flash = input("Range of flash. -1 to none", text("Input")) as num|null
|
|
if(flash == null) return
|
|
|
|
if ((devastation != -1) || (heavy != -1) || (light != -1) || (flash != -1))
|
|
if ((devastation > 20) || (heavy > 20) || (light > 20))
|
|
if (alert(src, "Are you sure you want to do this? It will laaag.", "Confirmation", "Yes", "No") == "No")
|
|
return
|
|
|
|
explosion(O, devastation, heavy, light, flash)
|
|
log_admin("[key_name(usr)] created an explosion ([devastation],[heavy],[light],[flash]) at ([O.x],[O.y],[O.z])")
|
|
message_admins("[key_name_admin(usr)] created an explosion ([devastation],[heavy],[light],[flash]) at ([O.x],[O.y],[O.z])", 1)
|
|
feedback_add_details("admin_verb","EXPL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
return
|
|
else
|
|
return
|
|
|
|
/client/proc/cmd_admin_emp(atom/O as obj|mob|turf in world)
|
|
set category = "Special Verbs"
|
|
set name = "EM Pulse"
|
|
|
|
if(!check_rights(R_DEBUG|R_FUN|R_EVENT)) return
|
|
|
|
var/heavy = input("Range of heavy pulse.", text("Input")) as num|null
|
|
if(heavy == null) return
|
|
var/med = input("Range of medium pulse.", text("Input")) as num|null
|
|
if(med == null) return
|
|
var/light = input("Range of light pulse.", text("Input")) as num|null
|
|
if(light == null) return
|
|
var/long = input("Range of long pulse.", text("Input")) as num|null
|
|
if(long == null) return
|
|
|
|
if (heavy || med || light || long)
|
|
|
|
empulse(O, heavy, med, light, long)
|
|
log_admin("[key_name(usr)] created an EM Pulse ([heavy],[med],[light],[long]) at ([O.x],[O.y],[O.z])")
|
|
message_admins("[key_name_admin(usr)] created an EM PUlse ([heavy],[med],[light],[long]) at ([O.x],[O.y],[O.z])", 1)
|
|
feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
return
|
|
else
|
|
return
|
|
|
|
/client/proc/cmd_admin_gib(mob/M as mob in mob_list)
|
|
set category = "Special Verbs"
|
|
set name = "Gib"
|
|
|
|
if(!check_rights(R_ADMIN|R_FUN|R_EVENT)) return
|
|
|
|
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
|
|
if(confirm != "Yes") return
|
|
//Due to the delay here its easy for something to have happened to the mob
|
|
if(!M) return
|
|
|
|
log_admin("[key_name(usr)] has gibbed [key_name(M)]")
|
|
message_admins("[key_name_admin(usr)] has gibbed [key_name_admin(M)]", 1)
|
|
|
|
if(istype(M, /mob/observer/dead))
|
|
gibs(M.loc)
|
|
return
|
|
|
|
M.gib()
|
|
feedback_add_details("admin_verb","GIB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
/client/proc/cmd_admin_gib_self()
|
|
set name = "Gibself"
|
|
set category = "Fun"
|
|
|
|
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
|
|
if(confirm == "Yes")
|
|
if (istype(mob, /mob/observer/dead)) // so they don't spam gibs everywhere
|
|
return
|
|
else
|
|
mob.gib()
|
|
|
|
log_admin("[key_name(usr)] used gibself.")
|
|
message_admins("<font color='blue'>[key_name_admin(usr)] used gibself.</font>", 1)
|
|
feedback_add_details("admin_verb","GIBS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
/*
|
|
/client/proc/cmd_manual_ban()
|
|
set name = "Manual Ban"
|
|
set category = "Special Verbs"
|
|
if(!authenticated || !holder)
|
|
src << "Only administrators may use this command."
|
|
return
|
|
var/mob/M = null
|
|
switch(alert("How would you like to ban someone today?", "Manual Ban", "Key List", "Enter Manually", "Cancel"))
|
|
if("Key List")
|
|
var/list/keys = list()
|
|
for(var/mob/M in world)
|
|
keys += M.client
|
|
var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in keys
|
|
if(!selection)
|
|
return
|
|
M = selection:mob
|
|
if ((M.client && M.client.holder && (M.client.holder.level >= holder.level)))
|
|
alert("You cannot perform this action. You must be of a higher administrative rank!")
|
|
return
|
|
|
|
switch(alert("Temporary Ban?",,"Yes","No"))
|
|
if("Yes")
|
|
var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num
|
|
if(!mins)
|
|
return
|
|
if(mins >= 525600) mins = 525599
|
|
var/reason = input(usr,"Reason?","reason","Griefer") as text
|
|
if(!reason)
|
|
return
|
|
if(M)
|
|
AddBan(M.ckey, M.computer_id, reason, usr.ckey, 1, mins)
|
|
M << "<font color='red'><BIG><B>You have been banned by [usr.client.ckey].\nReason: [reason].</B></BIG></font>"
|
|
M << "<font color='red'>This is a temporary ban, it will be removed in [mins] minutes</font>."
|
|
M << "<font color='red'>To try to resolve this matter head to http://ss13.donglabs.com/forum/</font>"
|
|
log_admin("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.")
|
|
message_admins("<font color='blue'>[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.</font>")
|
|
world.Export("http://216.38.134.132/adminlog.php?type=ban&key=[usr.client.key]&key2=[M.key]&msg=[html_decode(reason)]&time=[mins]&server=[replacetext(config.server_name, "#", "")]")
|
|
del(M.client)
|
|
qdel(M)
|
|
else
|
|
|
|
if("No")
|
|
var/reason = input(usr,"Reason?","reason","Griefer") as text
|
|
if(!reason)
|
|
return
|
|
AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0)
|
|
M << "<font color='red'><BIG><B>You have been banned by [usr.client.ckey].\nReason: [reason].</B></BIG></font>"
|
|
M << "<font color='red'>This is a permanent ban.</font>"
|
|
M << "<font color='red'>To try to resolve this matter head to http://ss13.donglabs.com/forum/</font>"
|
|
log_admin("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.")
|
|
message_admins("<font color='blue'>[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.</font>")
|
|
world.Export("http://216.38.134.132/adminlog.php?type=ban&key=[usr.client.key]&key2=[M.key]&msg=[html_decode(reason)]&time=perma&server=[replacetext(config.server_name, "#", "")]")
|
|
del(M.client)
|
|
qdel(M)
|
|
*/
|
|
|
|
/client/proc/update_world()
|
|
// If I see anyone granting powers to specific keys like the code that was here,
|
|
// I will both remove their SVN access and permanently ban them from my servers.
|
|
return
|
|
|
|
/client/proc/cmd_admin_check_contents(mob/living/M as mob in mob_list)
|
|
set category = "Special Verbs"
|
|
set name = "Check Contents"
|
|
set popup_menu = FALSE //VOREStation Edit - Declutter.
|
|
|
|
var/list/L = M.get_contents()
|
|
for(var/t in L)
|
|
usr << "[t]"
|
|
feedback_add_details("admin_verb","CC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
/* This proc is DEFERRED. Does not do anything.
|
|
/client/proc/cmd_admin_remove_phoron()
|
|
set category = "Debug"
|
|
set name = "Stabilize Atmos."
|
|
if(!holder)
|
|
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!
|
|
// DEFERRED
|
|
spawn(0)
|
|
for(var/turf/T in view())
|
|
T.poison = 0
|
|
T.oldpoison = 0
|
|
T.tmppoison = 0
|
|
T.oxygen = 755985
|
|
T.oldoxy = 755985
|
|
T.tmpoxy = 755985
|
|
T.co2 = 14.8176
|
|
T.oldco2 = 14.8176
|
|
T.tmpco2 = 14.8176
|
|
T.n2 = 2.844e+006
|
|
T.on2 = 2.844e+006
|
|
T.tn2 = 2.844e+006
|
|
T.tsl_gas = 0
|
|
T.osl_gas = 0
|
|
T.sl_gas = 0
|
|
T.temp = 293.15
|
|
T.otemp = 293.15
|
|
T.ttemp = 293.15
|
|
*/
|
|
|
|
/client/proc/toggle_view_range()
|
|
set category = "Special Verbs"
|
|
set name = "Change View Range"
|
|
set desc = "switches between 1x and custom views"
|
|
|
|
if(view == world.view)
|
|
view = input("Select view range:", "FUCK YE", 7) in list(1,2,3,4,5,6,7,8,9,10,11,12,13,14,128)
|
|
else
|
|
view = world.view
|
|
|
|
log_admin("[key_name(usr)] changed their view range to [view].")
|
|
//message_admins("<font color='blue'>[key_name_admin(usr)] changed their view range to [view].</font>", 1) //why? removed by order of XSI
|
|
|
|
feedback_add_details("admin_verb","CVRA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
/client/proc/admin_call_shuttle()
|
|
|
|
set category = "Admin"
|
|
set name = "Call Shuttle"
|
|
|
|
if ((!( ticker ) || !emergency_shuttle.location()))
|
|
return
|
|
|
|
if(!check_rights(R_ADMIN|R_EVENT)) return
|
|
|
|
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
|
|
if(confirm != "Yes") return
|
|
|
|
var/choice
|
|
if(ticker.mode.auto_recall_shuttle)
|
|
choice = input("The shuttle will just return if you call it. Call anyway?") in list("Confirm", "Cancel")
|
|
if(choice == "Confirm")
|
|
emergency_shuttle.auto_recall = 1 //enable auto-recall
|
|
else
|
|
return
|
|
|
|
choice = input("Is this an emergency evacuation or a crew transfer?") in list("Emergency", "Crew Transfer")
|
|
if (choice == "Emergency")
|
|
emergency_shuttle.call_evac()
|
|
else
|
|
emergency_shuttle.call_transfer()
|
|
|
|
|
|
feedback_add_details("admin_verb","CSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
log_admin("[key_name(usr)] admin-called the emergency shuttle.")
|
|
message_admins("<font color='blue'>[key_name_admin(usr)] admin-called the emergency shuttle.</font>", 1)
|
|
return
|
|
|
|
/client/proc/admin_cancel_shuttle()
|
|
set category = "Admin"
|
|
set name = "Cancel Shuttle"
|
|
|
|
if(!check_rights(R_ADMIN|R_EVENT)) return
|
|
|
|
if(alert(src, "You sure?", "Confirm", "Yes", "No") != "Yes") return
|
|
|
|
if(!ticker || !emergency_shuttle.can_recall())
|
|
return
|
|
|
|
emergency_shuttle.recall()
|
|
feedback_add_details("admin_verb","CCSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
log_admin("[key_name(usr)] admin-recalled the emergency shuttle.")
|
|
message_admins("<font color='blue'>[key_name_admin(usr)] admin-recalled the emergency shuttle.</font>", 1)
|
|
|
|
return
|
|
|
|
/client/proc/admin_deny_shuttle()
|
|
set category = "Admin"
|
|
set name = "Toggle Deny Shuttle"
|
|
|
|
if (!ticker)
|
|
return
|
|
|
|
if(!check_rights(R_ADMIN|R_EVENT)) return
|
|
|
|
emergency_shuttle.deny_shuttle = !emergency_shuttle.deny_shuttle
|
|
|
|
log_admin("[key_name(src)] has [emergency_shuttle.deny_shuttle ? "denied" : "allowed"] the shuttle to be called.")
|
|
message_admins("[key_name_admin(usr)] has [emergency_shuttle.deny_shuttle ? "denied" : "allowed"] the shuttle to be called.")
|
|
|
|
/client/proc/cmd_admin_attack_log(mob/M as mob in mob_list)
|
|
set category = "Special Verbs"
|
|
set name = "Attack Log"
|
|
|
|
usr << text("<font color='red'><b>Attack Log for []</b></font>", mob)
|
|
for(var/t in M.attack_log)
|
|
usr << t
|
|
feedback_add_details("admin_verb","ATTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
|
|
/client/proc/everyone_random()
|
|
set category = "Fun"
|
|
set name = "Make Everyone Random"
|
|
set desc = "Make everyone have a random appearance. You can only use this before rounds!"
|
|
|
|
if(!check_rights(R_FUN)) return
|
|
|
|
if (ticker && ticker.mode)
|
|
usr << "Nope you can't do this, the game's already started. This only works before rounds!"
|
|
return
|
|
|
|
if(ticker.random_players)
|
|
ticker.random_players = 0
|
|
message_admins("Admin [key_name_admin(usr)] has disabled \"Everyone is Special\" mode.", 1)
|
|
usr << "Disabled."
|
|
return
|
|
|
|
|
|
var/notifyplayers = alert(src, "Do you want to notify the players?", "Options", "Yes", "No", "Cancel")
|
|
if(notifyplayers == "Cancel")
|
|
return
|
|
|
|
log_admin("Admin [key_name(src)] has forced the players to have random appearances.")
|
|
message_admins("Admin [key_name_admin(usr)] has forced the players to have random appearances.", 1)
|
|
|
|
if(notifyplayers == "Yes")
|
|
world << "<font color='blue'><b>Admin [usr.key] has forced the players to have completely random identities!</font></b>"
|
|
|
|
usr << "<i>Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet</i>."
|
|
|
|
ticker.random_players = 1
|
|
feedback_add_details("admin_verb","MER") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
|
|
/client/proc/toggle_random_events()
|
|
set category = "Server"
|
|
set name = "Toggle random events on/off"
|
|
|
|
set desc = "Toggles random events such as meteors, black holes, blob (but not space dust) on/off"
|
|
if(!check_rights(R_SERVER|R_EVENT)) return
|
|
|
|
if(!config.allow_random_events)
|
|
config.allow_random_events = 1
|
|
usr << "Random events enabled"
|
|
message_admins("Admin [key_name_admin(usr)] has enabled random events.", 1)
|
|
else
|
|
config.allow_random_events = 0
|
|
usr << "Random events disabled"
|
|
message_admins("Admin [key_name_admin(usr)] has disabled random events.", 1)
|
|
feedback_add_details("admin_verb","TRE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
/client/proc/despawn_player(var/mob/M in living_mob_list)
|
|
set name = "Cryo Player"
|
|
set category = "Admin"
|
|
set desc = "Removes a player from the round as if they'd cryo'd."
|
|
set popup_menu = FALSE
|
|
|
|
if(!check_rights(R_ADMIN))
|
|
return
|
|
|
|
if(!M)
|
|
return
|
|
|
|
var/confirm = alert("Are you sure you want to cryo [M]?","Confirmation","No","Yes")
|
|
if(confirm == "No")
|
|
return
|
|
|
|
var/list/human_cryopods = list()
|
|
var/list/robot_cryopods = list()
|
|
|
|
for(var/obj/machinery/cryopod/CP in machines)
|
|
if(!CP.control_computer)
|
|
continue //Broken pod w/o computer, move on.
|
|
|
|
var/listname = "[CP.name] ([CP.x],[CP.y],[CP.z])"
|
|
if(istype(CP,/obj/machinery/cryopod/robot))
|
|
robot_cryopods[listname] = CP
|
|
else
|
|
human_cryopods[listname] = CP
|
|
|
|
//Gotta log this up here before they get ghostized and lose their key or anything.
|
|
log_and_message_admins("[key_name(src)] admin cryo'd [key_name(M)].")
|
|
feedback_add_details("admin_verb","ACRYO") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
if(ishuman(M))
|
|
var/obj/machinery/cryopod/CP = human_cryopods[input(usr,"Select a cryopod to use","Cryopod Choice") as null|anything in human_cryopods]
|
|
if(!CP)
|
|
return
|
|
M.ghostize()
|
|
CP.despawn_occupant(M)
|
|
return
|
|
|
|
else if(issilicon(M))
|
|
if(isAI(M))
|
|
var/mob/living/silicon/ai/ai = M
|
|
empty_playable_ai_cores += new /obj/structure/AIcore/deactivated(ai.loc)
|
|
global_announcer.autosay("[ai] has been moved to intelligence storage.", "Artificial Intelligence Oversight")
|
|
ai.clear_client()
|
|
return
|
|
else
|
|
var/obj/machinery/cryopod/robot/CP = robot_cryopods[input(usr,"Select a cryopod to use","Cryopod Choice") as null|anything in robot_cryopods]
|
|
if(!CP)
|
|
return
|
|
M.ghostize()
|
|
CP.despawn_occupant(M)
|
|
return
|
|
|
|
else if(isliving(M))
|
|
M.ghostize()
|
|
qdel(M) //Bye
|