diff --git a/baystation12.dme b/baystation12.dme index 9b3973f721..3abe6716ee 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -815,6 +815,7 @@ #include "code\game\objects\structures\stool_bed_chair_nest\bed.dm" #include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm" #include "code\game\objects\structures\stool_bed_chair_nest\stools.dm" +#include "code\game\player\admin_report.dm" #include "code\game\turfs\simulated.dm" #include "code\game\turfs\turf.dm" #include "code\game\turfs\unsimulated.dm" @@ -1330,5 +1331,5 @@ #include "code\ZAS\ZAS_Zones.dm" #include "interface\interface.dm" #include "interface\skin.dmf" -#include "maps\tgstation.2.0.9.dmm" +#include "maps\tgstation.2.0.9.1.dmm" // END_INCLUDE diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm index 2af57a876d..d3e3a6b2a3 100644 --- a/code/controllers/shuttle_controller.dm +++ b/code/controllers/shuttle_controller.dm @@ -12,6 +12,8 @@ var/global/datum/shuttle_controller/emergency_shuttle/emergency_shuttle datum/shuttle_controller + var/alert = 0 //0 = emergency, 1 = crew cycle + var/location = 0 //0 = somewhere far away (in spess), 1 = at SS13, 2 = returned from SS13 var/online = 0 var/direction = 1 //-1 = going back to central command, 1 = going to SS13, 2 = in transit to centcom (not recalled) @@ -20,29 +22,52 @@ datum/shuttle_controller var/timelimit //important when the shuttle gets called for more than shuttlearrivetime //timeleft = 360 //600 var/fake_recall = 0 //Used in rounds to prevent "ON NOES, IT MUST [INSERT ROUND] BECAUSE SHUTTLE CAN'T BE CALLED" - + var/deny_shuttle = 0 //for admins not allowing it to be called. + var/departed = 0 // call the shuttle // if not called before, set the endtime to T+600 seconds // otherwise if outgoing, switch to incoming proc/incall(coeff = 1) + if(deny_shuttle && alert == 1) //crew transfer shuttle does not gets recalled by gamemode + return + if(endtime) if(direction == -1) setdirection(1) else settimeleft(SHUTTLEARRIVETIME*coeff) online = 1 + //turning on the red lights in hallways + if(alert == 0) + for(var/area/A in world) + if(istype(A, /area/hallway)) + A.readyalert() + + + proc/shuttlealert(var/X) + alert = X + proc/recall() if(direction == 1) var/timeleft = timeleft() - if(timeleft >= 600) + if(alert == 0) + if(timeleft >= 600) + return + captain_announce("The emergency shuttle has been recalled.") + world << sound('sound/AI/shuttlerecalled.ogg') + setdirection(-1) + online = 1 + for(var/area/A in world) + if(istype(A, /area/hallway)) + A.readyreset() + return + else //makes it possible to send shuttle back. + captain_announce("The shuttle has been recalled.") + setdirection(-1) + online = 1 return - captain_announce("The emergency shuttle has been recalled.") - world << sound('sound/AI/shuttlerecalled.ogg') - setdirection(-1) - online = 1 - // returns the time (in seconds) before shuttle arrival // note if direction = -1, gives a count-up to SHUTTLEARRIVETIME @@ -277,6 +302,7 @@ datum/shuttle_controller spawn() S.startspawn() */ + departed = 1 // It's going! location = 0 // in deep space direction = 2 // heading to centcom diff --git a/code/defines/procs/command_alert.dm b/code/defines/procs/command_alert.dm index 23ee3c1119..d7a97fe254 100644 --- a/code/defines/procs/command_alert.dm +++ b/code/defines/procs/command_alert.dm @@ -1,5 +1,5 @@ -/proc/command_alert(var/text, var/title = "") - world << "

[command_name()] Update

" +/proc/command_alert(var/text, var/title = "", var/maintitle = "NanoTrasen Update") + world << "

[maintitle]

" if (title && length(title) > 0) world << "

[html_encode(title)]

" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index e10782efb8..d24ad0796c 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -27,6 +27,9 @@ if(isobj(src))//Hate typecheckin for a child object but this is just fixing crap another guy broke so if someone wants to put the time in and make this proper feel free. M.take_organ_damage(src:throwforce) + log_attack("[hit_atom] ([M.ckey]) was hit by [src] thrown by ([src.fingerprintslast])") + log_admin("ATTACK: [hit_atom] ([M.ckey]) was hit by [src] thrown by ([src.fingerprintslast])") + msg_admin_attack("ATTACK: [hit_atom] ([M.ckey]) was hit by [src] thrown by ([src.fingerprintslast])") else if(isobj(hit_atom)) var/obj/O = hit_atom diff --git a/code/game/hud.dm b/code/game/hud.dm index c2859aad99..a7f407924d 100644 --- a/code/game/hud.dm +++ b/code/game/hud.dm @@ -84,12 +84,16 @@ //Intent small buttons +/* #define ui_help_small "12:8,1:1" #define ui_disarm_small "12:15,1:18" #define ui_grab_small "12:32,1:18" #define ui_harm_small "12:39,1:1" - - +*/ +#define ui_help_small "13:18,1:-3" +#define ui_disarm_small "13:18,1:12" +#define ui_grab_small "14:2,1:12" +#define ui_harm_small "14:2,1:-3" //#define ui_swapbutton "6:-16,1:5" //Unused @@ -160,6 +164,12 @@ obj/hud/New(var/type = 0) /obj/hud var/obj/screen/action_intent var/obj/screen/move_intent + + var/obj/screen/hurt_intent + var/obj/screen/disarm_intent + var/obj/screen/help_intent + var/obj/screen/grab_intent + var/hud_shown = 1 //Used for the HUD toggle (F12) var/inventory_shown = 1 //the inventory diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 0dfac8157e..c79438f8ba 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -366,7 +366,11 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept // --- Filter the message; place it in quotes apply a verb --- - var/quotedmsg = M.say_quote(message) + var/quotedmsg = "\"" + message + "\"" //BS12 EDIT For Arrivals Computer + if(job == "Automated Announcement") + quotedmsg = message + else if(M) + quotedmsg = M.say_quote(message) // --- This following recording is intended for research and feedback in the use of department radio channels --- diff --git a/code/game/objects/hud.dm b/code/game/objects/hud.dm index 7559f9044b..a3a712affb 100644 --- a/code/game/objects/hud.dm +++ b/code/game/objects/hud.dm @@ -12,7 +12,7 @@ var/list/darkMask = null var/obj/screen/r_hand_hud_object = null var/obj/screen/l_hand_hud_object = null - var/show_intent_icons = 0 + var/show_intent_icons = 1 var/list/obj/screen/hotkeybuttons = null var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 035ef2f3ee..3f2d4d576b 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -15,6 +15,11 @@ /obj/item/weapon/grenade/proc/clown_check(var/mob/living/user) if((CLUMSY in user.mutations) && prob(50)) user << "Huh? How does this thing work?" + + log_attack("[user.name] ([user.ckey]) clumsily primed \a [src]") + log_admin("ATTACK: [user] ([user.ckey]) clumsily primed \a [src]") + message_admins("ATTACK: [user] ([user.ckey]) clumsily primed \a [src]") + active = 1 icon_state = initial(icon_state) + "_active" playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) @@ -56,7 +61,12 @@ /obj/item/weapon/grenade/attack_self(mob/user as mob) if(!active) if(clown_check(user)) - user << "You prime the [name]! [det_time/10] seconds!" + user << "You prime \the [name]! [det_time/10] seconds!" + + log_attack("[user.name] ([user.ckey]) primed \a [src].") + log_admin("ATTACK: [user] ([user.ckey]) primed \a [src].") + message_admins("ATTACK: [user] ([user.ckey]) primed \a [src].") + active = 1 icon_state = initial(icon_state) + "_active" add_fingerprint(user) diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index a8d42da9ae..6aa859e851 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -1,5 +1,5 @@ /mob/verb/listen_ooc() - set name = "Un/Mute OOC" + set name = "Hear/Stop Hearing OOC" set category = "OOC" if (src.client) @@ -44,7 +44,7 @@ for (var/client/C) if(C.listen_ooc) - if (src.client.holder && (!src.client.stealth || (C.holder && C.holder.level > 0))) + if (src.client.holder && (!src.client.stealth || (C.holder && C.holder.level != 0))) if (src.client.holder.rank == "Admin Observer") C << "OOC: [src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]: [msg]" else if (src.client.holder.rank == "Retired Admin") diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm index 15fe7d38cf..3fe5bc613e 100644 --- a/code/game/verbs/who.dm +++ b/code/game/verbs/who.dm @@ -32,7 +32,7 @@ proc/get_all_admin_clients() else entry += "\t[C.key][C.stealth ? " (as [C.fakekey])" : ""]" - if(usr.client.holder) + if(usr.client.holder && (usr.client.holder.level != 0)) var/mob/M = C.mob entry += " - Playing as [M.real_name]" switch(M.stat) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 4274446b7a..178c17b529 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -9,19 +9,14 @@ var/global/floorIsLava = 0 log_adminwarn(rendered) for (var/client/C in admin_list) if (C) - var/msg = rendered - if (admin_ref) - msg = dd_replacetext(msg, "%admin_ref%", "\ref[C]") - if (admin_holder_ref && C.holder) - msg = dd_replacetext(msg, "%holder_ref%", "\ref[C.holder]") - C << msg - -/obj/admins/proc/player_has_info(var/key as text) - 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 + if(C.holder.level) + if(C.holder.level > -3 && C.holder.level != 0) + var/msg = rendered + if (admin_ref) + msg = dd_replacetext(msg, "%admin_ref%", "\ref[C]") + if (admin_holder_ref && C.holder) + msg = dd_replacetext(msg, "%holder_ref%", "\ref[C.holder]") + C << msg /proc/msg_admin_attack(var/text) //Toggleable Attack Messages var/rendered = "ADMIN LOG: [text]" @@ -202,6 +197,76 @@ var/global/floorIsLava = 0 M.change_mob_type( /mob/living/simple_animal/constructwraith , null, null, delmob) if("shade") M.change_mob_type( /mob/living/simple_animal/shade , null, null, delmob) + if(href_list["view_player_info"]) + show_player_info(href_list["view_player_info"]) + + if(href_list["add_player_info"]) + var/key = href_list["add_player_info"] + var/add = input("Add Player Info") as null|text + if(!add) return + + var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav") + var/list/infos + info >> infos + if(!infos) infos = list() + + var/datum/player_info/P = new + P.author = usr.key + P.rank = usr.client.holder.rank + P.content = add + var/modifyer = "th" + switch(time2text(world.timeofday, "DD")) + if("01","21","31") + modifyer = "st" + if("02","22",) + modifyer = "nd" + if("03","23") + modifyer = "rd" + var/day_string = "[time2text(world.timeofday, "DD")][modifyer]" + if(copytext(day_string,1,2) == "0") + day_string = copytext(day_string,2) + var/full_date = time2text(world.timeofday, "DDD, Month DD of YYYY") + var/day_loc = findtext(full_date, time2text(world.timeofday, "DD")) + P.timestamp = "[copytext(full_date,1,day_loc)][day_string][copytext(full_date,day_loc+2)]" + + infos += P + + info << infos + + message_admins("\blue [key_name_admin(usr)] has edited [key]'s notes.") + log_admin("[key_name(usr)] has edited [key]'s notes.") + + del info + + var/savefile/note_list = new("data/player_notes.sav") + var/list/note_keys + note_list >> note_keys + if(!note_keys) note_keys = list() + if(!note_keys.Find(key)) note_keys += key + note_list << note_keys + del note_list + + show_player_info(key) + + if(href_list["remove_player_info"]) + var/key = href_list["remove_player_info"] + var/index = text2num(href_list["remove_index"]) + + var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav") + var/list/infos + info >> infos + if(!infos || infos.len < index) return + + var/datum/player_info/item = infos[index] + infos.Remove(item) + info << infos + + message_admins("\blue [key_name_admin(usr)] deleted one of [key]'s notes.") + log_admin("[key_name(usr)] deleted one of [key]'s notes.") + + del info + + show_player_info(key) /////////////////////////////////////new ban stuff @@ -216,6 +281,13 @@ var/global/floorIsLava = 0 alert(usr,"This ban has already been lifted / does not exist.","Error","Ok") unbanpanel() + if(href_list["unban_cid"]) + var/banfolder = href_list["unban_cid"] + Banlist.cd = "/base/[banfolder]" + var/key = Banlist["key"] + if(alert(usr, "Are you sure you want to remove the computer ID for [key]'s ban? Without the ID, a different account could get on the server from [key]'s computer.", "Confirmation", "Yes", "No") == "Yes") + Banlist["skipIdCheck"] << 1 + if(href_list["unbane"]) UpdateTime() var/reason @@ -484,6 +556,24 @@ var/global/floorIsLava = 0 else jobs += "[dd_replacetext("Wizard", " ", " ")]" + //Emergency Response Team + if(jobban_isbanned(M, "Emergency Response Team" || isbanned_dept)) + jobs += "[dd_replacetext("Emergency Response Team", " ", " ")]" + else + jobs += "[dd_replacetext("Emergency Response Team", " ", " ")]" + + //Misc (Grey) + jobs += "" + jobs += "" + + //Records + if(jobban_isbanned(M, "Records")) + jobs += "" + else + jobs += "" + + + /* //Malfunctioning AI //Removed Malf-bans because they're a pain to impliment if(jobban_isbanned(M, "malf AI") || isbanned_dept) jobs += "" @@ -597,6 +687,8 @@ var/global/floorIsLava = 0 M << "\redYou have been jobbanned by [usr.client.ckey] from: [msg]." M << "\red The reason is: [reason]" M << "\red Jobban can be lifted only upon request." + if(config.banappeals) + M << "\red To try to resolve this matter head to [config.banappeals]" href_list["jobban2"] = 1 // lets it fall through and refresh return 1 @@ -864,7 +956,7 @@ var/global/floorIsLava = 0 return if (href_list["sendtoprison"]) - if ((src.rank in list( "Moderator", "Admin Candidate", "Temporary Admin", "Trial Admin", "Badmin", "Game Admin", "Game Master" ))) + if ((src.rank in list(/* "Moderator", */"Admin Candidate", "Temporary Admin", "Trial Admin", "Badmin", "Game Admin", "Game Master" ))) var/confirm = alert(usr, "Send to admin prison for the round?", "Message", "Yes", "No") if(confirm != "Yes") @@ -1149,6 +1241,41 @@ var/global/floorIsLava = 0 else alert("The mob must not be a new_player.") return + if (href_list["granttaj"]) + if (src.level>=5) + var/mob/M = locate(href_list["granttaj"]) + for (var/s in alien_whitelist) + if(findtext(s,"[M.ckey] - Tajaran")) + alert("This key is already on the whitelist!", null, null, null, null, null) + return + alien_whitelist += "[M.ckey] - Tajaran" + usr << "[M.ckey] added to Tajaran whitelist." + else + alert("You cannot perform this action. You must be of a higher administrative rank!") + return + + if (href_list["grantsog"]) + if (src.level>=5) + var/mob/M = locate(href_list["grantsog"]) + for (var/s in alien_whitelist) + if(findtext(s,"[M.ckey] - Soghun")) + alert("This key is already on the whitelist!", null, null, null, null, null) + return + alien_whitelist += "[M.ckey] - Soghun" + usr << "[M.ckey] added to Soghun whitelist." + else + alert("You cannot perform this action. You must be of a higher administrative rank!") + return + + if (href_list["grantskrell"]) + if (src.level>=5) + var/mob/M = locate(href_list["grantskrell"]) + for (var/s in alien_whitelist) + if(findtext(s,"[M.ckey] - Skrell")) + alert("This key is already on the whitelist!", null, null, null, null, null) + return + alien_whitelist += "[M.ckey] - Skrell" + usr << "[M.ckey] added to Skrell whitelist." else alert("You cannot perform this action. You must be of a higher administrative rank!") return @@ -1191,47 +1318,64 @@ var/global/floorIsLava = 0 // Now isn't that much better? IT IS NOW A PROC, i.e. kinda like a big panel like unstable if (href_list["adminplayeropts"]) - var/mob/M = locate(href_list["adminplayeropts"]) - show_player_panel(M) + if(rank in list("Admin Observer", "Temporary Admin", "Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master")) + var/mob/M = locate(href_list["adminplayeropts"]) + show_player_panel(M) + else + alert("You cannot perform this action. You must be of a higher administrative rank!") + + if (href_list["player_info"]) + var/key = href_list["player_info"] + show_player_info(key) if (href_list["adminplayervars"]) - var/mob/M = locate(href_list["adminplayervars"]) - if(src && src.owner) - if(istype(src.owner,/client)) - var/client/cl = src.owner - cl.debug_variables(M) - else if(ismob(src.owner)) - var/mob/MO = src.owner - if(MO.client) - var/client/cl = MO.client + if(rank in list("Admin Observer", "Temporary Admin", "Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master")) + var/mob/M = locate(href_list["adminplayervars"]) + if(src && src.owner) + if(istype(src.owner,/client)) + var/client/cl = src.owner cl.debug_variables(M) + else if(ismob(src.owner)) + var/mob/MO = src.owner + if(MO.client) + var/client/cl = MO.client + cl.debug_variables(M) + else + alert("You cannot perform this action. You must be of a higher administrative rank!") if (href_list["adminplayersubtlemessage"]) - var/mob/M = locate(href_list["adminplayersubtlemessage"]) - if(src && src.owner) - if(istype(src.owner,/client)) - var/client/cl = src.owner - cl.cmd_admin_subtle_message(M) - else if(ismob(src.owner)) - var/mob/MO = src.owner - if(MO.client) - var/client/cl = MO.client + if(rank in list("Admin Observer", "Temporary Admin", "Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master")) + var/mob/M = locate(href_list["adminplayersubtlemessage"]) + if(src && src.owner) + if(istype(src.owner,/client)) + var/client/cl = src.owner cl.cmd_admin_subtle_message(M) + else if(ismob(src.owner)) + var/mob/MO = src.owner + if(MO.client) + var/client/cl = MO.client + cl.cmd_admin_subtle_message(M) + else + alert("You cannot perform this action. You must be of a higher administrative rank!") if (href_list["adminplayerobservejump"]) - var/mob/M = locate(href_list["adminplayerobservejump"]) - if(src && src.owner) - var/client/C - if(istype(src.owner,/client)) - C = src.owner - else if(ismob(src.owner)) - var/mob/MO = src.owner - C = MO.client - if(C) - if(state == 1) - C.admin_ghost() - sleep(2) - C.jumptomob(M) + if(rank in list("Admin Observer", "Temporary Admin", "Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master")) + var/mob/M = locate(href_list["adminplayerobservejump"]) + if(src && src.owner) + var/client/C + if(istype(src.owner,/client)) + C = src.owner + else if(ismob(src.owner)) + var/mob/MO = src.owner + C = MO.client + if(C) + if(state == 1) + C.admin_ghost() + sleep(2) + C.jumptomob(M) + else + alert("You cannot perform this action. You must be of a higher administrative rank!") + if (href_list["adminplayerobservecoodjump"]) @@ -1336,14 +1480,19 @@ var/global/floorIsLava = 0 if (href_list["traitor_panel_pp"]) - var/mob/M = locate(href_list["traitor_panel_pp"]) - if(isnull(M)) - usr << "Mob doesn't seem to exist." - return - if(!ismob(M)) - usr << "This doen't seem to be a mob." - return - show_traitor_panel(M) + if(rank in list("Admin Observer", "Temporary Admin", "Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master")) + var/mob/M = locate(href_list["traitor_panel_pp"]) + if(isnull(M)) + usr << "Mob doesn't seem to exist." + return + if(!ismob(M)) + usr << "This doen't seem to be a mob." + return + show_traitor_panel(M) + else + alert("You cannot perform this action. You must be of a higher administrative rank!") + + if (href_list["BlueSpaceArtillery"]) var/mob/target = locate(href_list["BlueSpaceArtillery"]) @@ -1467,8 +1616,12 @@ var/global/floorIsLava = 0 return if (href_list["narrateto"]) - var/mob/M = locate(href_list["narrateto"]) - usr.client.cmd_admin_direct_narrate(M) + if(rank in list("Game Admin", "Game Master")) + var/mob/M = locate(href_list["narrateto"]) + usr.client.cmd_admin_direct_narrate(M) + else + alert("You cannot perform this action. You must be of a higher administrative rank!") + return if (href_list["subtlemessage"]) var/mob/M = locate(href_list["subtlemessage"]) @@ -1514,7 +1667,16 @@ var/global/floorIsLava = 0 return create_mob(usr) else alert("You are not a high enough administrator! Sorry!!!!") +/* + if (href_list["vmode"]) + vmode() + if (href_list["votekill"]) + votekill() + + if (href_list["voteres"]) + voteres() +*/ if (href_list["prom_demot"]) if ((src.rank in list("Trial Admin", "Badmin", "Game Admin", "Game Master" ))) var/client/C = locate(href_list["prom_demot"]) @@ -1532,6 +1694,7 @@ var/global/floorIsLava = 0 Temporary Admin // Secondary Admin
Moderator // Moderator
Admin Observer // Filthy Xeno
+ Retired Admin // Retired Administrator
Remove Admin
"} else if(src.level == 5) //coder @@ -1542,6 +1705,7 @@ var/global/floorIsLava = 0 Temporary Admin // Secondary Admin
Moderator // Moderator
Admin Observer // Filthy Xeno
+ Retired Admin // Retired Administrator
Remove Admin
"} else alert("Not a high enough level admin, sorry.") @@ -2267,7 +2431,7 @@ var/global/floorIsLava = 0 return if (href_list["secretsadmin"]) - if ((src.rank in list( "Moderator", "Temporary Admin", "Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master" ))) + if ((src.rank in list(/* "Moderator", */"Temporary Admin", "Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master" ))) var/ok = 0 switch(href_list["secretsadmin"]) if("clear_bombs") @@ -2381,6 +2545,46 @@ var/global/floorIsLava = 0 if(href_list["vsc"] == "default") vsc.SetDefault(usr) + if (href_list["rnd_max"]) + for(var/obj/machinery/computer/rdconsole/C in world) + for(var/datum/tech/T in C.files.known_tech) + T.level = 6 + C.files.RefreshResearch() + + for(var/obj/machinery/r_n_d/server/C in world) + for(var/datum/tech/T in C.files.known_tech) + T.level = 6 + C.files.RefreshResearch() + +// owner:rnd_check_designs() + #define AUTOBANTIME 10 + if(href_list["warn"]) + var/mob/M = locate(href_list["warn"]) + if (ismob(M)) + var/client/user + if(istype(usr, /client)) + user = usr + else if(istype(usr, /mob)) + user = usr.client + + if(!user.holder) + src << "Only administrators may use this command." + return + if(M.client && M.client.holder && (M.client.holder.level >= user.holder.level)) + alert("You cannot perform this action. You must be of a higher administrative rank!", null, null, null, null, null) + return + if(!M.client.warned) + M << "\red You have been warned by an administrator. This is the only warning you will recieve." + M.client.warned = 1 + message_admins("\blue [user.ckey] warned [M.ckey].") + else + AddBan(M.ckey, M.computer_id, "Autobanning due to previous warn", user.ckey, 1, AUTOBANTIME) + M << "\redYou have been autobanned by [user.ckey]." + M << "\red This is a temporary ban; it will automatically be removed in [AUTOBANTIME] minutes." + log_admin("[user.ckey] warned [M.ckey], resulting in a [AUTOBANTIME] minute autoban.") + ban_unban_log_save("[user.ckey] warned [M.ckey], resulting in a [AUTOBANTIME] minute autoban.") + message_admins("\blue [user.ckey] warned [M.ckey], resulting in a [AUTOBANTIME] minute autoban.") + //feedback_inc("ban_warn",1) if(href_list["ac_view_wanted"]) //Admin newscaster Topic() stuff be here src.admincaster_screen = 18 //The ac_ prefix before the hrefs stands for AdminCaster. @@ -2727,6 +2931,9 @@ var/global/floorIsLava = 0 body += "Thunderdome 2 | " body += "Thunderdome Admin | " body += "Thunderdome Observer | " + body += "Grant Tajaran (Temp) | " + body += "Grant Soghun (Temp) | " + body += "Grant Skrell (Temp) | " body += "
" body += "" @@ -2735,6 +2942,84 @@ var/global/floorIsLava = 0 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 + +/obj/admins/proc/player_has_info(var/key as text) + 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 + +/obj/admins/proc/show_player_info(var/key as text) + set category = "Admin" + set name = "Show Player Info" + if (!istype(src,/obj/admins)) + src = usr.client.holder + if (!istype(src,/obj/admins)) + usr << "Error: you are not an admin!" + return + var/dat = "Info on [key]" + dat += "" + + 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) + dat += "Remove" + dat += "

" + if(update_file) info << infos + + dat += "
" + dat += "Add Comment
" + + dat += "" + usr << browse(dat, "window=adminplayerinfo;size=480x480") + +/obj/admins/proc/show_skills(var/mob/living/carbon/human/M as mob in world) + set category = "Admin" + set name = "Show Skills" + + if (!istype(src,/obj/admins)) + src = usr.client.holder + if (!istype(src,/obj/admins)) + usr << "Error: you are not an admin!" + return + + show_skill_window(usr, M) + + return + +/client/proc/update_mob_sprite(mob/living/carbon/human/H as mob) + set category = "Admin" + set name = "Update Mob Sprite" + set desc = "Should fix any mob sprite update errors." + + if (!holder) + src << "Only administrators may use this command." + return + + if(istype(H)) + H.regenerate_icons() + + /obj/admins/proc/access_news_network() //MARKER set category = "Fun" set name = "Access Newscaster Network" @@ -2940,6 +3225,21 @@ var/global/floorIsLava = 0 dat += "
Misc Positions
[dd_replacetext("Records", " ", " ")][dd_replacetext("Records", " ", " ")][dd_replacetext("Malf AI", " ", " ")]
" usr << browse(dat, "window=ban;size=400x400") +/obj/admins/proc/PlayerNotes() + 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 + sortList(note_keys) + for(var/t in note_keys) + dat += text("") + dat += "
[t]
" + usr << browse(dat, "window=player_notes;size=400x400") + /obj/admins/proc/Game() var/dat @@ -2978,6 +3278,10 @@ var/global/floorIsLava = 0 dat += "Create Turf
" if(lvl >= 5) dat += "Create Mob
" + if(lvl >= 3 ) + dat += "
Edit Airflow Settings
" + dat += "Edit Plasma Settings
" + dat += "Choose a default ZAS setting
" // if(lvl == 6 ) usr << browse(dat, "window=admin2;size=210x180") return @@ -3046,6 +3350,7 @@ var/global/floorIsLava = 0 Irradiate the station
Trigger a Prison Break
Trigger a Virus Outbreak
+Trigger the Emergency Response Team
Spawn an Immovable Rod
Toggle a "lights out" event
Spawn an Ion Storm
@@ -3076,6 +3381,7 @@ var/global/floorIsLava = 0 Move Alien Dinghy
Move Mining Shuttle
Break all lights
+Trigger Electrical Storm
" Fix all lights
Best Friend AI
The floor is lava! (DANGEROUS)
"} @@ -3105,12 +3411,160 @@ var/global/floorIsLava = 0 usr << browse(dat, "window=secrets") return +/obj/admins/proc/Voting() + + var/dat + var/lvl = 0 + switch(src.rank) + if("Moderator") + lvl = 1 + if("Temporary Admin") + lvl = 2 + if("Admin Candidate") + lvl = 3 + if("Trial Admin") + lvl = 4 + if("Badmin") + lvl = 5 + if("Game Admin") + lvl = 6 + if("Game Master") + lvl = 7 + + + dat += "
Voting

\n" + + if(lvl > 0) + dat += {" +Abort Vote
+Start Vote
+Toggle Voting
+"} + + usr << browse(dat, "window=admin2;size=210x160") + return + /////////////////////////////////////////////////////////////////////////////////////////////////admins2.dm merge //i.e. buttons/verbs +/* +/obj/admins/proc/vmode() + set category = "Server" + set hidden = 1 // It doesn't have a cancel button, so it shouldn't be autocompleted. Should be started via Voting() instead + if (!usr.client.holder) + return + var/confirm = alert("What vote would you like to start?", "Vote", "Restart", "Custom Vote", "Change Game Mode") + switch(confirm) + if("Cancel") + return + if("Restart") + vote.mode = 0 + // hack to yield 0=restart, 1=changemode + if("Change Game Mode") + vote.mode = 1 + if(!ticker) + if(going) + world << "The game start has been delayed." + going = 0 + if("Custom Vote") + vote.mode = 2 + vote.enteringchoices = 1 + vote.customname = input(usr, "What are you voting for?", "Custom Vote") as text + if(!vote.customname) + vote.enteringchoices = 0 + vote.voting = 0 + return + + var/N = input(usr, "How many options does this vote have?", "Custom Vote", 0) as num + if(!N) + vote.enteringchoices = 0 + vote.voting = 0 + return + + var/i + vote.choices = list() + for(i=1; i<=N; i++) + var/addvote = input(usr, "What is option #[i]?", "Enter Option #[i]") as text + vote.choices += addvote + vote.enteringchoices = 0 + + vote.voting = 1 + // now voting + vote.votetime = world.timeofday + config.vote_period*10 + // when the vote will end + spawn(config.vote_period*10) + vote.endvote() + if(vote.mode == 2) + world << "\red*** A custom vote has been initiated by [usr.key]." + world << "\red You have [vote.timetext(config.vote_period)] to vote." + else + world << "\red*** A vote to [vote.mode?"change game mode":"restart"] has been initiated by [usr.key]." + world << "\red You have [vote.timetext(config.vote_period)] to vote." + + log_admin("Voting to [vote.mode?"change mode":"restart round"] forced by admin [key_name(usr)]") + + for(var/mob/CM in world) + if(CM.client) + if(config.vote_no_default || (config.vote_no_dead && CM.stat == 2)) + CM.client.vote = "none" + else + CM.client.vote = "default" + + for(var/mob/CM in world) + if(CM.client) + if(config.vote_no_default || (config.vote_no_dead && CM.stat == 2)) + CM.client.vote = "none" + else + CM.client.vote = "default" + //feedback_add_details("admin_verb","SV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/obj/admins/proc/votekill() + set category = "Server" + set name = "Abort Vote" + set desc="Aborts a vote" + if(vote.voting == 0) + alert("No votes in progress") + return + world << "\red *** Voting aborted by [usr.client.stealth ? "Admin Candidate" : usr.key]." + + log_admin("Voting aborted by [key_name(usr)]") + + vote.voting = 0 + vote.nextvotetime = world.timeofday + 10*config.vote_delay + + for(var/mob/M in world) + // clear vote window from all clients + if(M.client) + M << browse(null, "window=vote") + M.client.showvote = 0 + //feedback_add_details("admin_verb","AV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/obj/admins/proc/voteres() + set category = "Server" + set name = "Toggle Voting" + set desc="Toggles Votes" + var/confirm = alert("What vote would you like to toggle?", "Vote", "Restart [config.allow_vote_restart ? "Off" : "On"]", "Change Game Mode [config.allow_vote_mode ? "Off" : "On"]", "Cancel") + if(confirm == "Cancel") + return + if(confirm == "Restart [config.allow_vote_restart ? "Off" : "On"]") + config.allow_vote_restart = !config.allow_vote_restart + world << "Player restart voting toggled to [config.allow_vote_restart ? "On" : "Off"]." + log_admin("Restart voting toggled to [config.allow_vote_restart ? "On" : "Off"] by [key_name(usr)].") + + if(config.allow_vote_restart) + vote.nextvotetime = world.timeofday + if(confirm == "Change Game Mode [config.allow_vote_mode ? "Off" : "On"]") + config.allow_vote_mode = !config.allow_vote_mode + world << "Player mode voting toggled to [config.allow_vote_mode ? "On" : "Off"]." + log_admin("Mode voting toggled to [config.allow_vote_mode ? "On" : "Off"] by [key_name(usr)].") + + if(config.allow_vote_mode) + vote.nextvotetime = world.timeofday + //feedback_add_details("admin_verb","TV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +*/ /obj/admins/proc/restart() set category = "Server" set name = "Restart" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index cc8877b50c..2d7090f08b 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -93,6 +93,9 @@ del(src) return + if ("Retired Admin") + holder.level = -3 + else del(holder) return @@ -104,43 +107,34 @@ if (holder.level >= -1) verbs += /client/proc/investigate_show verbs += /client/proc/cmd_admin_say + verbs += /client/proc/cmd_mod_say verbs += /client/proc/cmd_admin_gib_self + verbs += /client/proc/update_mob_sprite verbs += /client/proc/deadmin_self + else if (holder.level == -3) // Retired Admin + verbs += /client/proc/cmd_admin_say + verbs += /client/proc/cmd_mod_say + return else return //Moderator if (holder.level >= 0) - verbs += /obj/admins/proc/announce - verbs += /obj/admins/proc/startnow - verbs += /obj/admins/proc/toggleAI //Toggle the AI - verbs += /obj/admins/proc/toggleenter //Toggle enterting - verbs += /obj/admins/proc/toggleguests //Toggle guests entering - verbs += /obj/admins/proc/toggleooc //toggle ooc - verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc - verbs += /obj/admins/proc/show_player_panel - verbs += /client/proc/deadchat //toggles deadchat - //verbs += /client/proc/cmd_admin_mute --was never used (according to stats trackind) - use show player panel --erro verbs += /client/proc/cmd_admin_pm_context verbs += /client/proc/cmd_admin_pm_panel - verbs += /client/proc/cmd_admin_subtle_message - //verbs += /client/proc/warn - was never used - verbs += /client/proc/dsay - verbs += /client/proc/admin_ghost - verbs += /client/proc/game_panel - verbs += /client/proc/player_panel - verbs += /client/proc/player_panel_new - verbs += /client/proc/unban_panel - verbs += /client/proc/jobbans - verbs += /client/proc/unjobban_panel verbs += /client/proc/hide_verbs - verbs += /client/proc/general_report - verbs += /client/proc/air_report verbs += /client/proc/deadmin_self - verbs += /client/proc/check_ai_laws - //verbs += /client/proc/cmd_admin_prison --Merged with player panel - //verbs += /obj/admins/proc/unprison --Merged with player panel + verbs += /client/proc/admin_ghost + verbs += /client/proc/Report + verbs += /client/proc/display_admin_reports + verbs += /obj/admins/proc/show_skills else return + if(holder.level == 0) //Moderators don't get asay, only msay + verbs -= /client/proc/cmd_admin_say + verbs -= /client/proc/investigate_show + verbs -= /client/proc/cmd_admin_gib_self + verbs += /client/proc/mod_panel + //Temporary Admin if (holder.level >= 1) verbs += /obj/admins/proc/delay //game start delay @@ -152,6 +146,33 @@ verbs += /client/proc/toggle_hear_radio verbs += /client/proc/deadmin_self //verbs += /client/proc/cmd_admin_attack_log --Merged with view variables + + // + //MOVED FROM MODERATOR + // + verbs += /obj/admins/proc/announce + verbs += /obj/admins/proc/startnow + verbs += /obj/admins/proc/toggleAI //Toggle the AI + verbs += /obj/admins/proc/toggleenter //Toggle enterting + verbs += /obj/admins/proc/toggleguests //Toggle guests entering + verbs += /obj/admins/proc/toggleooc //toggle ooc + verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc + verbs += /obj/admins/proc/show_player_panel + verbs += /client/proc/deadchat //toggles deadchat + //verbs += /client/proc/cmd_admin_mute --was never used (according to stats trackind) - use show player panel --erro + verbs += /client/proc/cmd_admin_subtle_message + //verbs += /client/proc/warn - was never used + verbs += /client/proc/dsay + + verbs += /client/proc/game_panel + verbs += /client/proc/player_panel + verbs += /client/proc/player_panel_new + verbs += /client/proc/unban_panel + verbs += /client/proc/jobbans + verbs += /client/proc/unjobban_panel + verbs += /client/proc/check_ai_laws + //verbs += /client/proc/cmd_admin_prison --Merged with player panel + //verbs += /obj/admins/proc/unprison --Merged with player panel else return //Admin Candidate @@ -187,8 +208,9 @@ verbs += /proc/possess verbs += /proc/release verbs += /client/proc/one_click_antag - - +//BS12 Commands + verbs += /client/proc/admin_deny_shuttle + verbs += /client/proc/editappear else return //Badmin @@ -429,6 +451,15 @@ verbs -= /obj/admins/proc/access_news_network verbs -= /client/proc/one_click_antag verbs -= /client/proc/invisimin +//BS12 Admin Verbs + verbs -= /client/proc/update_mob_sprite + verbs -= /client/proc/mod_panel + verbs -= /client/proc/admin_deny_shuttle + verbs -= /client/proc/playernotes + verbs -= /obj/admins/proc/show_skills + verbs -= /client/proc/Report + verbs -= /client/proc/display_admin_reports + verbs -= /client/proc/editappear return /client/proc/admin_ghost() @@ -490,6 +521,14 @@ feedback_add_details("admin_verb","PPN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return +/client/proc/mod_panel() + set name = "Moderator Panel" + set category = "Admin" + if(holder) + holder.mod_panel() + feedback_add_details("admin_verb","MDRP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + return + /client/proc/check_antagonists() set name = "Check Antagonists" set category = "Admin" @@ -560,6 +599,13 @@ message_admins("[key_name_admin(usr)] has turned stealth mode [stealth ? "ON" : "OFF"]", 1) feedback_add_details("admin_verb","SM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/proc/playernotes() + set name = "Show Player Info" + set category = "Admin" + if(holder) + holder.PlayerNotes() + return + #define AUTOBATIME 10 /client/proc/warn(var/mob/M in player_list) /*set category = "Special Verbs" @@ -807,6 +853,98 @@ config.log_hrefs = 1 src << "Started logging hrefs" +/client/proc/editappear(mob/living/carbon/human/M as mob in world) + set name = "Edit Appearance" + set category = "Fun" + if(!istype(M, /mob/living/carbon/human)) + usr << "\red You can only do this to humans!" + return + switch(alert("You sure you wish to edit this mob's appearance?",,"Yes","No")) + if("No") + return + if(!ishuman(M)) + usr << "\red Non-humans are not editable yet!" + else + var/new_facial = input("Please select facial hair color.", "Character Generation") as color + if(new_facial) + M.r_facial = hex2num(copytext(new_facial, 2, 4)) + M.g_facial = hex2num(copytext(new_facial, 4, 6)) + M.b_facial = hex2num(copytext(new_facial, 6, 8)) + + var/new_hair = input("Please select hair color.", "Character Generation") as color + if(new_facial) + M.r_hair = hex2num(copytext(new_hair, 2, 4)) + M.g_hair = hex2num(copytext(new_hair, 4, 6)) + M.b_hair = hex2num(copytext(new_hair, 6, 8)) + + var/new_eyes = input("Please select eye color.", "Character Generation") as color + if(new_eyes) + M.r_eyes = hex2num(copytext(new_eyes, 2, 4)) + M.g_eyes = hex2num(copytext(new_eyes, 4, 6)) + M.b_eyes = hex2num(copytext(new_eyes, 6, 8)) + + var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation") as text + + if (new_tone) + M.s_tone = max(min(round(text2num(new_tone)), 220), 1) + M.s_tone = -M.s_tone + 35 + + // hair + var/list/all_hairs = typesof(/datum/sprite_accessory/hair) - /datum/sprite_accessory/hair + var/list/hairs = list() + + // loop through potential hairs + for(var/x in all_hairs) + var/datum/sprite_accessory/hair/H = new x // create new hair datum based on type x + hairs.Add(H.name) // add hair name to hairs + del(H) // delete the hair after it's all done + + var/new_style = input("Please select hair style", "Character Generation") as null|anything in hairs + + // if new style selected (not cancel) + if (new_style) + M.h_style = new_style + + for(var/x in all_hairs) // loop through all_hairs again. Might be slightly CPU expensive, but not significantly. + var/datum/sprite_accessory/hair/H = new x // create new hair datum + if(H.name == new_style) + M.h_style = H // assign the hair_style variable a new hair datum + break + else + del(H) // if hair H not used, delete. BYOND can garbage collect, but better safe than sorry + + // facial hair + var/list/all_fhairs = typesof(/datum/sprite_accessory/facial_hair) - /datum/sprite_accessory/facial_hair + var/list/fhairs = list() + + for(var/x in all_fhairs) + var/datum/sprite_accessory/facial_hair/H = new x + fhairs.Add(H.name) + del(H) + + new_style = input("Please select facial style", "Character Generation") as null|anything in fhairs + + if(new_style) + M.f_style = new_style + for(var/x in all_fhairs) + var/datum/sprite_accessory/facial_hair/H = new x + if(H.name == new_style) + M.f_style = H + break + else + del(H) + + var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female") + if (new_gender) + if(new_gender == "Male") + M.gender = MALE + else + M.gender = FEMALE + M.regenerate_icons() + M.update_body() + M.check_dna(M) + + /client/proc/check_ai_laws() set name = "Check AI Laws" set category = "Admin" diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 1d5778ae82..0595e9682e 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -1,3 +1,227 @@ +/obj/admins/proc/player_panel_new()//The new one + if (!usr.client.holder) + return + var/dat = "Player Menu" + dat += "" + //add to this if wanting to add back in IP checking + //add if you want to know their ip to the lists below + var/list/mobs = get_sorted_mobs() + var/i = 1 + + for(var/mob/M in mobs) + if(M.ckey) + var/color = "#e6e6e6" + i++ + if(i%2 == 0) + color = "#f2f2f2" + var/real = (M.name == M.real_name ? "[M.name]/[M.real_name]" : "[M.real_name] (as [M.name]/[M.real_name])") + var/turf/T = get_turf(M) + var/client_key = (M.key? M.key : "No key") + dat += "" // Adds current name + if(isobserver(M)) + dat += "" + else if(isalien(M)) + dat += "" + else if(islarva(M)) + dat += "" + else if(istajaran(M)) + dat += "" + else if(ishuman(M)) + dat += "" + else if(ismetroid(M)) + dat += "" + else if(ismonkey(M)) + dat += "" + else if(isAI(M)) + dat += "" + else if(ispAI(M)) + dat += "" + else if(isrobot(M)) + dat += "" + else if(isanimal(M)) + dat += "" + else if(iscorgi(M)) + dat += "" + else if(istype(M,/mob/new_player)) + dat += "" + else + dat += "\black" + + if(M.mind && M.mind.assigned_role && istype(M, /mob/living/carbon/human)) // Adds a column to Player Panel that shows their current job. + var/mob/living/carbon/human/H = M + + if (H.wear_id) + var/obj/item/weapon/card/id/id + + if(istype(H.wear_id, /obj/item/device/pda)) + var/obj/item/device/pda/PDA = H.wear_id + if(!isnull(PDA.id)) // The PDA may contain no ID + id = PDA.id // The ID is contained inside the PDA + + else + id = H.wear_id // The ID was on the ID slot + + if(!id) // Happens when there's no ID in the PDA located on the wear_id slot + dat += "" + + else if(isnull(id.assignment)) // Preventing runtime errors blocking the player panel + if(istype(id, /obj/item/weapon/card/id/syndicate)) + dat += "" + else + usr << "ERROR: Inform the coders that an [id.name] was checked for its assignment variable, and it was null." + dat += "" + + else + if(M.mind.assigned_role == id.assignment) // Polymorph + dat += "" + + else + dat += "" + + else + dat += "" + + var/muting = "Not Currently Working" +// if(M.client) +// muting = {"Mute: [(M.client.muted ? "Muted" : "Voiced")] | +// Complete mute: [(M.client.muted ? "Completely Muted" : "Voiced")] +// "} + + dat += {" + + "} + + switch(is_special_character(M)) + if(0) + dat += {""} + if(1) + dat += {""} + if(2) + dat += {""} + + dat += "
Name/Real NameTypeAssigned JobInfoOptionsTraitor?
IP:(IP: [M.lastKnownIP])
[real]
[M.client ? M.client : "No client ([client_key])"] at ([T.x], [T.y], [T.z])
GhostAlienAlien larvaTajaran[M.job]MetroidMonkeyAIpAICyborgAnimalCorgiNew Player\red ERROR[M.mind.assigned_role] (No ID)AntagonistERROR[M.mind.assigned_role][M.mind.assigned_role] ([id.assignment])" + + else + dat += "[M.mind.assigned_role] (No ID)No Assigned Role[player_has_info(M.ckey) ? "Info" : "N/A"] PM | + PP | + VV | + TP | + SM | + JMP +
[muting]
+ Warn | Boot | Ban | Jobban
Traitor?Traitor?Traitor?
" + + usr << browse(dat, "window=players;size=905x600") + + +/obj/admins/proc/mod_panel()//The new one + if (!usr.client.holder) + return + var/dat = "Player Menu" + dat += "" + //add to this if wanting to add back in IP checking + //add if you want to know their ip to the lists below + var/list/mobs = get_sorted_mobs() + var/i = 1 + + for(var/mob/M in mobs) + if(M.ckey) + var/color = "#e6e6e6" + i++ + if(i%2 == 0) + color = "#f2f2f2" + var/real = (M.name == M.real_name ? "[M.name]/[M.real_name]" : "[M.real_name] (as [M.name]/[M.real_name])") + var/turf/T = get_turf(M) + var/client_key = (M.key? M.key : "No key") + dat += "" // Adds current name +/* if(isobserver(M)) + dat += "" + else if(isalien(M)) + dat += "" + else if(islarva(M)) + dat += "" + else if(istajaran(M)) + dat += "" + else if(ishuman(M)) + dat += "" + else if(ismetroid(M)) + dat += "" + else if(ismonkey(M)) + dat += "" + else if(isAI(M)) + dat += "" + else if(ispAI(M)) + dat += "" + else if(isrobot(M)) + dat += "" + else if(isanimal(M)) + dat += "" + else if(iscorgi(M)) + dat += "" + else if(istype(M,/mob/new_player)) + dat += "" + else + dat += "\black" + + if(M.mind && M.mind.assigned_role && istype(M, /mob/living/carbon/human)) // Adds a column to Player Panel that shows their current job. + var/mob/living/carbon/human/H = M + + if (H.wear_id) + var/obj/item/weapon/card/id/id + + if(istype(H.wear_id, /obj/item/device/pda)) + var/obj/item/device/pda/PDA = H.wear_id + if(!isnull(PDA.id)) // The PDA may contain no ID + id = PDA.id // The ID is contained inside the PDA + + else + id = H.wear_id // The ID was on the ID slot + + if(!id) // Happens when there's no ID in the PDA located on the wear_id slot + dat += "" + + else if(isnull(id.assignment)) // Preventing runtime errors blocking the player panel + if(istype(id, /obj/item/weapon/card/id/syndicate)) + dat += "" + else + usr << "ERROR: Inform the coders that an [id.name] was checked for its assignment variable, and it was null." + dat += "" + + else + if(M.mind.assigned_role == id.assignment) // Polymorph + dat += "" + + else + dat += "" + + else + dat += "" +*/ + dat += {" + "} + + dat += {" + + "} + + switch(is_special_character(M)) + if(0) + dat += {""} + if(1) + dat += {""} + if(2) + dat += {""} + + dat += "
Name/Real NameIP/CIDInfoOptionsTraitor?
IP:Type Assigned Job Traitor?(IP: [M.lastKnownIP])
[real]
[M.client ? M.client : "No client ([client_key])"] at ([T.x], [T.y], [T.z])
GhostAlienAlien larvaTajaran[M.job]MetroidMonkeyAIpAICyborgAnimalCorgiNew Player\red ERROR[M.mind.assigned_role] (No ID)AntagonistERROR[M.mind.assigned_role][M.mind.assigned_role] ([id.assignment])" + + else + dat += "[M.mind.assigned_role] (No ID)No Assigned RoleIP: [M.client ? M.client.address : "Disconnected"]
+ CID: [M.client ? M.client.computer_id : "Disconnected"]
[player_has_info(M.ckey) ? "Info" : "N/A"] PMLoyalAntagMode-Antag
" + + usr << browse(dat, "window=players;size=600x600") + + +/* //TG Player Panel /obj/admins/proc/player_panel_new()//The new one if (!usr.client.holder) return @@ -316,7 +540,7 @@ "} usr << browse(dat, "window=players;size=600x480") - +*/ //The old one /obj/admins/proc/player_panel_old() if (!usr.client.holder) @@ -492,113 +716,4 @@ dat += "" usr << browse(dat, "window=roundstatus;size=400x500") else - alert("The game hasn't started yet!") - - -/obj/admins/proc/mod_panel()//The new one - if (!usr.client.holder) - return - var/dat = "Player Menu" - dat += "" - //add to this if wanting to add back in IP checking - //add if you want to know their ip to the lists below - var/list/mobs = get_sorted_mobs() - var/i = 1 - - for(var/mob/M in mobs) - if(M.ckey) - var/color = "#e6e6e6" - i++ - if(i%2 == 0) - color = "#f2f2f2" - //no idea what tg used to replace original_name, probably a proc floating around somewhere - //var/real = (M.real_name == M.original_name ? "[M.name]/[M.real_name]" : "[M.original_name] (as [M.name]/[M.real_name])") - var/real = "[M.name]/[M.real_name]" - var/turf/T = get_turf(M) - var/client_key = (M.key? M.key : "No key") - dat += "" // Adds current name -/* if(isobserver(M)) - dat += "" - else if(isalien(M)) - dat += "" - else if(islarva(M)) - dat += "" - else if(istajaran(M)) - dat += "" - else if(ishuman(M)) - dat += "" - else if(ismetroid(M)) - dat += "" - else if(ismonkey(M)) - dat += "" - else if(isAI(M)) - dat += "" - else if(ispAI(M)) - dat += "" - else if(isrobot(M)) - dat += "" - else if(isanimal(M)) - dat += "" - else if(iscorgi(M)) - dat += "" - else if(istype(M,/mob/new_player)) - dat += "" - else - dat += "\black" - - if(M.mind && M.mind.assigned_role && istype(M, /mob/living/carbon/human)) // Adds a column to Player Panel that shows their current job. - var/mob/living/carbon/human/H = M - - if (H.wear_id) - var/obj/item/weapon/card/id/id - - if(istype(H.wear_id, /obj/item/device/pda)) - var/obj/item/device/pda/PDA = H.wear_id - if(!isnull(PDA.id)) // The PDA may contain no ID - id = PDA.id // The ID is contained inside the PDA - - else - id = H.wear_id // The ID was on the ID slot - - if(!id) // Happens when there's no ID in the PDA located on the wear_id slot - dat += "" - - else if(isnull(id.assignment)) // Preventing runtime errors blocking the player panel - if(istype(id, /obj/item/weapon/card/id/syndicate)) - dat += "" - else - usr << "ERROR: Inform the coders that an [id.name] was checked for its assignment variable, and it was null." - dat += "" - - else - if(M.mind.assigned_role == id.assignment) // Polymorph - dat += "" - - else - dat += "" - - else - dat += "" -*/ - dat += {" - "} - - dat += {" - - "} - - switch(is_special_character(M)) - if(0) - dat += {""} - if(1) - dat += {""} - if(2) - dat += {""} - - dat += "
Name/Real NameIP/CIDInfoOptionsTraitor?
IP:Type Assigned Job Traitor?(IP: [M.lastKnownIP])
[real]
[M.client ? M.client : "No client ([client_key])"] at ([T.x], [T.y], [T.z])
GhostAlienAlien larvaTajaran[M.job]MetroidMonkeyAIpAICyborgAnimalCorgiNew Player\red ERROR[M.mind.assigned_role] (No ID)AntagonistERROR[M.mind.assigned_role][M.mind.assigned_role] ([id.assignment])" - - else - dat += "[M.mind.assigned_role] (No ID)No Assigned RoleIP: [M.client ? M.client.address : "Disconnected"]
- CID: [M.client ? M.client.computer_id : "Disconnected"]
[player_has_info(M.ckey) ? "Info" : "N/A"] PMLoyalAntagMode-Antag
" - - usr << browse(dat, "window=players;size=600x600") + alert("The game hasn't started yet!") \ No newline at end of file diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 47094d151c..c72eb3f1b7 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -819,6 +819,22 @@ Traitors and the like can also be revived with the previous role mostly intact. return +/client/proc/admin_deny_shuttle() + set category = "Admin" + set name = "Toggle Deny Shuttle" + + if (!ticker) + return + + if (!holder) + src << "Only administrators may use this command." + 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" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 5631600084..f7a12a1906 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -217,7 +217,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp A.loc = T else A << "This mob is not located in the game world." - +/* /mob/dead/observer/verb/boo() set category = "Ghost" set name = "Boo!" @@ -231,7 +231,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return //Maybe in the future we can add more spooky code here! return - +*/ /mob/dead/observer/verb/toggle_alien_candidate() set name = "Toggle Be Alien Candidate" set category = "Ghost" diff --git a/code/modules/mob/living/carbon/alien/humanoid/hud.dm b/code/modules/mob/living/carbon/alien/humanoid/hud.dm index 1438bf63ca..7fd43c9699 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/hud.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/hud.dm @@ -46,6 +46,45 @@ src.adding += using action_intent = using +//intent small hud objects + using = new src.h_type( src ) + using.name = "help" + using.icon = 'screen1_alien.dmi' + using.icon_state = (mymob.a_intent == "help" ? "help_small_active" : "help_small") + using.screen_loc = ui_help_small + using.layer = 21 + src.adding += using + help_intent = using + + using = new src.h_type( src ) + using.name = "disarm" + using.icon = 'screen1_alien.dmi' + using.icon_state = (mymob.a_intent == "disarm" ? "disarm_small_active" : "disarm_small") + using.screen_loc = ui_disarm_small + using.layer = 21 + src.adding += using + disarm_intent = using + + using = new src.h_type( src ) + using.name = "grab" + using.icon = 'screen1_alien.dmi' + using.icon_state = (mymob.a_intent == "grab" ? "grab_small_active" : "grab_small") + using.screen_loc = ui_grab_small + using.layer = 21 + src.adding += using + grab_intent = using + + using = new src.h_type( src ) + using.name = "harm" + using.icon = 'screen1_alien.dmi' + using.icon_state = (mymob.a_intent == "hurt" ? "harm_small_active" : "harm_small") + using.screen_loc = ui_harm_small + using.layer = 21 + src.adding += using + hurt_intent = using + +//end intent small hud objects + using = new src.h_type( src ) using.name = "mov_intent" using.dir = SOUTHWEST diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index f8ef9f4ee3..1f18f16227 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -393,6 +393,10 @@ M.attack_log += text("\[[time_stamp()]\] Has been thrown by [usr.name] ([usr.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]") usr.attack_log += text("\[[time_stamp()]\] Has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]") + log_attack("[usr.name] ([usr.ckey]) Has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]") + log_admin("ATTACK: [usr.name] ([usr.ckey]) Has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]") + msg_admin_attack("ATTACK: [usr.name] ([usr.ckey]) Has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]") + if(!item) return //Grab processing has a chance of returning null u_equip(item) diff --git a/code/modules/mob/living/carbon/human/hud.dm b/code/modules/mob/living/carbon/human/hud.dm index e0e3361924..1e49b2ecde 100644 --- a/code/modules/mob/living/carbon/human/hud.dm +++ b/code/modules/mob/living/carbon/human/hud.dm @@ -51,6 +51,45 @@ src.adding += using action_intent = using +//intent small hud objects + using = new src.h_type( src ) + using.name = "help" + using.icon = ui_style + using.icon_state = (mymob.a_intent == "help" ? "help_small_active" : "help_small") + using.screen_loc = ui_help_small + using.layer = 21 + src.adding += using + help_intent = using + + using = new src.h_type( src ) + using.name = "disarm" + using.icon = ui_style + using.icon_state = (mymob.a_intent == "disarm" ? "disarm_small_active" : "disarm_small") + using.screen_loc = ui_disarm_small + using.layer = 21 + src.adding += using + disarm_intent = using + + using = new src.h_type( src ) + using.name = "grab" + using.icon = ui_style + using.icon_state = (mymob.a_intent == "grab" ? "grab_small_active" : "grab_small") + using.screen_loc = ui_grab_small + using.layer = 21 + src.adding += using + grab_intent = using + + using = new src.h_type( src ) + using.name = "harm" + using.icon = ui_style + using.icon_state = (mymob.a_intent == "hurt" ? "harm_small_active" : "harm_small") + using.screen_loc = ui_harm_small + using.layer = 21 + src.adding += using + hurt_intent = using + +//end intent small hud objects + using = new src.h_type( src ) using.name = "mov_intent" using.dir = SOUTHWEST diff --git a/code/modules/mob/living/carbon/monkey/hud.dm b/code/modules/mob/living/carbon/monkey/hud.dm index 4c8821b020..bf7663e818 100644 --- a/code/modules/mob/living/carbon/monkey/hud.dm +++ b/code/modules/mob/living/carbon/monkey/hud.dm @@ -54,6 +54,45 @@ src.adding += using action_intent = using +//intent small hud objects + using = new src.h_type( src ) + using.name = "help" + using.icon = ui_style + using.icon_state = (mymob.a_intent == "help" ? "help_small_active" : "help_small") + using.screen_loc = ui_help_small + using.layer = 21 + src.adding += using + help_intent = using + + using = new src.h_type( src ) + using.name = "disarm" + using.icon = ui_style + using.icon_state = (mymob.a_intent == "disarm" ? "disarm_small_active" : "disarm_small") + using.screen_loc = ui_disarm_small + using.layer = 21 + src.adding += using + disarm_intent = using + + using = new src.h_type( src ) + using.name = "grab" + using.icon = ui_style + using.icon_state = (mymob.a_intent == "grab" ? "grab_small_active" : "grab_small") + using.screen_loc = ui_grab_small + using.layer = 21 + src.adding += using + grab_intent = using + + using = new src.h_type( src ) + using.name = "harm" + using.icon = ui_style + using.icon_state = (mymob.a_intent == "hurt" ? "harm_small_active" : "harm_small") + using.screen_loc = ui_harm_small + using.layer = 21 + src.adding += using + hurt_intent = using + +//end intent small hud objects + using = new src.h_type( src ) using.name = "mov_intent" using.dir = SOUTHWEST diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 0f386d734f..8c79d4db9c 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -69,15 +69,31 @@ if("help") usr.a_intent = "disarm" usr.hud_used.action_intent.icon_state = "disarm" + usr.hud_used.hurt_intent.icon_state = "harm_small" + usr.hud_used.help_intent.icon_state = "help_small" + usr.hud_used.grab_intent.icon_state = "grab_small" + usr.hud_used.disarm_intent.icon_state = "disarm_small_active" if("disarm") usr.a_intent = "grab" usr.hud_used.action_intent.icon_state = "grab" + usr.hud_used.hurt_intent.icon_state = "harm_small" + usr.hud_used.help_intent.icon_state = "help_small" + usr.hud_used.grab_intent.icon_state = "grab_small_active" + usr.hud_used.disarm_intent.icon_state = "disarm_small" if("grab") usr.a_intent = "hurt" usr.hud_used.action_intent.icon_state = "harm" + usr.hud_used.hurt_intent.icon_state = "harm_small_active" + usr.hud_used.help_intent.icon_state = "help_small" + usr.hud_used.grab_intent.icon_state = "grab_small" + usr.hud_used.disarm_intent.icon_state = "disarm_small" if("hurt") usr.a_intent = "help" usr.hud_used.action_intent.icon_state = "help" + usr.hud_used.hurt_intent.icon_state = "harm_small" + usr.hud_used.help_intent.icon_state = "help_small_active" + usr.hud_used.grab_intent.icon_state = "grab_small" + usr.hud_used.disarm_intent.icon_state = "disarm_small" else if(isrobot(usr)) if(usr.a_intent == "help") usr.a_intent = "hurt" diff --git a/code/modules/mob/screen.dm b/code/modules/mob/screen.dm index 244743fe57..741e8faeff 100644 --- a/code/modules/mob/screen.dm +++ b/code/modules/mob/screen.dm @@ -241,13 +241,26 @@ return switch(name) if("act_intent") - if(ishuman(usr) || istype(usr,/mob/living/carbon/alien/humanoid) || islarva(usr)) - var/intent = usr.a_intent - if(intent == "hurt") - intent = "harm" //hurt and harm have different sprite names for some reason. - usr.hud_used.action_intent.icon_state = "[intent]" + if (usr.hud_used.show_intent_icons) + usr.hud_used.show_intent_icons = 0 + usr.client.screen -= usr.hud_used.intent_small_hud_objects + if("harm") + if (usr.hud_used.show_intent_icons) + usr.hud_used.show_intent_icons = 0 + usr.client.screen -= usr.hud_used.intent_small_hud_objects + if("help") + if (usr.hud_used.show_intent_icons) + usr.hud_used.show_intent_icons = 0 + usr.client.screen -= usr.hud_used.intent_small_hud_objects + if("disarm") + if (usr.hud_used.show_intent_icons) + usr.hud_used.show_intent_icons = 0 + usr.client.screen -= usr.hud_used.intent_small_hud_objects + if("grab") + if (usr.hud_used.show_intent_icons) + usr.hud_used.show_intent_icons = 0 + usr.client.screen -= usr.hud_used.intent_small_hud_objects */ - /obj/screen/Click(location, control, params) switch(name) if("map") @@ -381,19 +394,39 @@ if("help") usr.a_intent = "help" usr.hud_used.action_intent.icon_state = "help" - usr.hud_used.show_intent_icons = 0 + usr.hud_used.hurt_intent.icon_state = "harm_small" + usr.hud_used.help_intent.icon_state = "help_small_active" + usr.hud_used.grab_intent.icon_state = "grab_small" + usr.hud_used.disarm_intent.icon_state = "disarm_small" +// usr.hud_used.show_intent_icons = 0 +// usr.client.screen -= usr.hud_used.intent_small_hud_objects if("harm") usr.a_intent = "hurt" usr.hud_used.action_intent.icon_state = "harm" - usr.hud_used.show_intent_icons = 0 + usr.hud_used.hurt_intent.icon_state = "harm_small_active" + usr.hud_used.help_intent.icon_state = "help_small" + usr.hud_used.grab_intent.icon_state = "grab_small" + usr.hud_used.disarm_intent.icon_state = "disarm_small" +// usr.hud_used.show_intent_icons = 0 +// usr.client.screen -= usr.hud_used.intent_small_hud_objects if("grab") usr.a_intent = "grab" usr.hud_used.action_intent.icon_state = "grab" - usr.hud_used.show_intent_icons = 0 + usr.hud_used.hurt_intent.icon_state = "harm_small" + usr.hud_used.help_intent.icon_state = "help_small" + usr.hud_used.grab_intent.icon_state = "grab_small_active" + usr.hud_used.disarm_intent.icon_state = "disarm_small" +// usr.hud_used.show_intent_icons = 0 +// usr.client.screen -= usr.hud_used.intent_small_hud_objects if("disarm") usr.a_intent = "disarm" usr.hud_used.action_intent.icon_state = "disarm" - usr.hud_used.show_intent_icons = 0 + usr.hud_used.hurt_intent.icon_state = "harm_small" + usr.hud_used.help_intent.icon_state = "help_small" + usr.hud_used.grab_intent.icon_state = "grab_small" + usr.hud_used.disarm_intent.icon_state = "disarm_small_active" +// usr.hud_used.show_intent_icons = 0 +// usr.client.screen -= usr.hud_used.intent_small_hud_objects if("pull") usr.stop_pulling() if("throw") diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 627ad8ce37..b6af3e115c 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -114,6 +114,9 @@ for (var/mob/C in viewers(src)) C.show_message("\red [GM.name] has been placed in the [src] by [user].", 3) del(G) + log_attack("[usr] ([usr.ckey]) placed [GM] ([GM.ckey]) in a disposals unit.") + log_admin("ATTACK: [usr] ([usr.ckey]) placed [GM] ([GM.ckey]) in a disposals unit.") + msg_admin_attack("ATTACK: [usr] ([usr.ckey]) placed [GM] ([GM.ckey]) in a disposals unit.") return if(!I) return diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index 1dff87d69e..9b0f9f2bef 100644 Binary files a/icons/mob/human.dmi and b/icons/mob/human.dmi differ diff --git a/icons/mob/screen1_Midnight.dmi b/icons/mob/screen1_Midnight.dmi index 6436722767..ea585974ef 100644 Binary files a/icons/mob/screen1_Midnight.dmi and b/icons/mob/screen1_Midnight.dmi differ diff --git a/icons/mob/screen1_Orange.dmi b/icons/mob/screen1_Orange.dmi index cc24f679eb..2a8973a8b5 100644 Binary files a/icons/mob/screen1_Orange.dmi and b/icons/mob/screen1_Orange.dmi differ diff --git a/icons/mob/screen1_alien.dmi b/icons/mob/screen1_alien.dmi index 01deb3feee..9ede101e7c 100644 Binary files a/icons/mob/screen1_alien.dmi and b/icons/mob/screen1_alien.dmi differ diff --git a/icons/mob/screen1_old.dmi b/icons/mob/screen1_old.dmi index 63e1e5d2ca..d5ad356389 100644 Binary files a/icons/mob/screen1_old.dmi and b/icons/mob/screen1_old.dmi differ