Attack logging, better intent switcher HUD, alien species fixes, misc admin commands, moderator commands.
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/proc/command_alert(var/text, var/title = "")
|
||||
world << "<h1 class='alert'>[command_name()] Update</h1>"
|
||||
/proc/command_alert(var/text, var/title = "", var/maintitle = "NanoTrasen Update")
|
||||
world << "<h1 class='alert'>[maintitle]</h1>"
|
||||
|
||||
if (title && length(title) > 0)
|
||||
world << "<h2 class='alert'>[html_encode(title)]</h2>"
|
||||
|
||||
@@ -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("<font color='red'>[hit_atom] ([M.ckey]) was hit by [src] thrown by ([src.fingerprintslast])</font>")
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 ---
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -15,6 +15,11 @@
|
||||
/obj/item/weapon/grenade/proc/clown_check(var/mob/living/user)
|
||||
if((CLUMSY in user.mutations) && prob(50))
|
||||
user << "<span class='warning'>Huh? How does this thing work?</span>"
|
||||
|
||||
log_attack("<font color='red'>[user.name] ([user.ckey]) clumsily primed \a [src]</font>")
|
||||
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 << "<span class='warning'>You prime the [name]! [det_time/10] seconds!</span>"
|
||||
user << "<span class='warning'>You prime \the [name]! [det_time/10] seconds!</span>"
|
||||
|
||||
log_attack("<font color='red'>[user.name] ([user.ckey]) primed \a [src].</font>")
|
||||
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)
|
||||
|
||||
@@ -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 << "<span class='adminobserverooc'><span class='prefix'>OOC:</span> <EM>[src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]:</EM> <span class='message'>[msg]</span></span>"
|
||||
else if (src.client.holder.rank == "Retired Admin")
|
||||
|
||||
@@ -32,7 +32,7 @@ proc/get_all_admin_clients()
|
||||
else
|
||||
entry += "\t[C.key][C.stealth ? " <i>(as [C.fakekey])</i>" : ""]"
|
||||
|
||||
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)
|
||||
|
||||
@@ -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 = "<span class=\"admin\"><span class=\"prefix\">ADMIN LOG:</span> <span class=\"message\">[text]</span></span>"
|
||||
@@ -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 += "<td width='20%'><a href='?src=\ref[src];jobban3=wizard;jobban4=\ref[M]'>[dd_replacetext("Wizard", " ", " ")]</a></td>"
|
||||
|
||||
//Emergency Response Team
|
||||
if(jobban_isbanned(M, "Emergency Response Team" || isbanned_dept))
|
||||
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=Emergency Response Team;jobban4=\ref[M]'><font color=red>[dd_replacetext("Emergency Response Team", " ", " ")]</font></a></td>"
|
||||
else
|
||||
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=Emergency Response Team;jobban4=\ref[M]'>[dd_replacetext("Emergency Response Team", " ", " ")]</a></td>"
|
||||
|
||||
//Misc (Grey)
|
||||
jobs += "<table cellpadding='1' cellspacing='0' width='100%'>"
|
||||
jobs += "<tr bgcolor='B5B5B5'><th colspan='10'>Misc Positions</th></tr><tr align='center'>"
|
||||
|
||||
//Records
|
||||
if(jobban_isbanned(M, "Records"))
|
||||
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=Records;jobban4=\ref[M]'><font color=red>[dd_replacetext("Records", " ", " ")]</font></a></td>"
|
||||
else
|
||||
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=Records;jobban4=\ref[M]'>[dd_replacetext("Records", " ", " ")]</a></td>"
|
||||
|
||||
|
||||
|
||||
/* //Malfunctioning AI //Removed Malf-bans because they're a pain to impliment
|
||||
if(jobban_isbanned(M, "malf AI") || isbanned_dept)
|
||||
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=malf AI;jobban4=\ref[M]'><font color=red>[dd_replacetext("Malf AI", " ", " ")]</font></a></td>"
|
||||
@@ -597,6 +687,8 @@ var/global/floorIsLava = 0
|
||||
M << "\red<BIG><B>You have been jobbanned by [usr.client.ckey] from: [msg].</B></BIG>"
|
||||
M << "\red <B>The reason is: [reason]</B>"
|
||||
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
|
||||
<A href='?src=\ref[src];chgadlvl=Temporary Admin;client4ad=\ref[C]'>Temporary Admin</A> // Secondary Admin<BR>
|
||||
<A href='?src=\ref[src];chgadlvl=Moderator;client4ad=\ref[C]'>Moderator</A> // Moderator<BR>
|
||||
<A href='?src=\ref[src];chgadlvl=Admin Observer;client4ad=\ref[C]'>Admin Observer</A> // Filthy Xeno<BR>
|
||||
<A href='?src=\ref[src];chgadlvl=Retired Admin;client4ad=\ref[C]'>Retired Admin</A> // Retired Administrator<BR>
|
||||
<A href='?src=\ref[src];chgadlvl=Remove;client4ad=\ref[C]'>Remove Admin</A><BR>"}
|
||||
else if(src.level == 5)
|
||||
//coder
|
||||
@@ -1542,6 +1705,7 @@ var/global/floorIsLava = 0
|
||||
<A href='?src=\ref[src];chgadlvl=Temporary Admin;client4ad=\ref[C]'>Temporary Admin</A> // Secondary Admin<BR>
|
||||
<A href='?src=\ref[src];chgadlvl=Moderator;client4ad=\ref[C]'>Moderator</A> // Moderator<BR>
|
||||
<A href='?src=\ref[src];chgadlvl=Admin Observer;client4ad=\ref[C]'>Admin Observer</A> // Filthy Xeno<BR>
|
||||
<A href='?src=\ref[src];chgadlvl=Retired Admin;client4ad=\ref[C]'>Retired Admin</A> // Retired Administrator<BR>
|
||||
<A href='?src=\ref[src];chgadlvl=Remove;client4ad=\ref[C]'>Remove Admin</A><BR>"}
|
||||
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 <B>You have been warned by an administrator. This is the only warning you will recieve.</B>"
|
||||
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 << "\red<BIG><B>You have been autobanned by [user.ckey].</B></BIG>"
|
||||
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 += "<A href='?src=\ref[src];tdome2=\ref[M]'>Thunderdome 2</A> | "
|
||||
body += "<A href='?src=\ref[src];tdomeadmin=\ref[M]'>Thunderdome Admin</A> | "
|
||||
body += "<A href='?src=\ref[src];tdomeobserve=\ref[M]'>Thunderdome Observer</A> | "
|
||||
body += "<A href='?src=\ref[src];granttaj=\ref[M]'>Grant Tajaran (Temp)</A> | "
|
||||
body += "<A href='?src=\ref[src];grantsog=\ref[M]'>Grant Soghun (Temp)</A> | "
|
||||
body += "<A href='?src=\ref[src];grantskrell=\ref[M]'>Grant Skrell (Temp)</A> | "
|
||||
|
||||
body += "<br>"
|
||||
body += "</body></html>"
|
||||
@@ -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 = "<html><head><title>Info on [key]</title></head>"
|
||||
dat += "<body>"
|
||||
|
||||
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.<br>"
|
||||
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 += "<font color=#008800>[I.content]</font> <i>by [I.author] ([I.rank])</i> on <i><font color=blue>[I.timestamp]</i></font> "
|
||||
if(I.author == usr.key)
|
||||
dat += "<A href='?src=\ref[src];remove_player_info=[key];remove_index=[i]'>Remove</A>"
|
||||
dat += "<br><br>"
|
||||
if(update_file) info << infos
|
||||
|
||||
dat += "<br>"
|
||||
dat += "<A href='?src=\ref[src];add_player_info=[key]'>Add Comment</A><br>"
|
||||
|
||||
dat += "</body></html>"
|
||||
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 += "</table>"
|
||||
usr << browse(dat, "window=ban;size=400x400")
|
||||
|
||||
/obj/admins/proc/PlayerNotes()
|
||||
var/dat = "<B>Player notes</B><HR><table>"
|
||||
|
||||
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("<tr><td><A href='?src=\ref[src];view_player_info=[t]'>[t]</A></td></tr>")
|
||||
dat += "</table>"
|
||||
usr << browse(dat, "window=player_notes;size=400x400")
|
||||
|
||||
/obj/admins/proc/Game()
|
||||
|
||||
var/dat
|
||||
@@ -2978,6 +3278,10 @@ var/global/floorIsLava = 0
|
||||
dat += "<A href='?src=\ref[src];create_turf=1'>Create Turf</A><br>"
|
||||
if(lvl >= 5)
|
||||
dat += "<A href='?src=\ref[src];create_mob=1'>Create Mob</A><br>"
|
||||
if(lvl >= 3 )
|
||||
dat += "<br><A href='?src=\ref[src];vsc=airflow'>Edit Airflow Settings</A><br>"
|
||||
dat += "<A href='?src=\ref[src];vsc=plasma'>Edit Plasma Settings</A><br>"
|
||||
dat += "<A href='?src=\ref[src];vsc=default'>Choose a default ZAS setting</A><br>"
|
||||
// if(lvl == 6 )
|
||||
usr << browse(dat, "window=admin2;size=210x180")
|
||||
return
|
||||
@@ -3046,6 +3350,7 @@ var/global/floorIsLava = 0
|
||||
<A href='?src=\ref[src];secretsfun=radiation'>Irradiate the station</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=prison_break'>Trigger a Prison Break</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=virus'>Trigger a Virus Outbreak</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=trigger_armed_response_team'>Trigger the Emergency Response Team</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=immovable'>Spawn an Immovable Rod</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=lightsout'>Toggle a "lights out" event</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=ionstorm'>Spawn an Ion Storm</A><BR>
|
||||
@@ -3076,6 +3381,7 @@ var/global/floorIsLava = 0
|
||||
<A href='?src=\ref[src];secretsfun=movealienship'>Move Alien Dinghy</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=moveminingshuttle'>Move Mining Shuttle</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=blackout'>Break all lights</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=electric'>Trigger Electrical Storm</A><BR>"
|
||||
<A href='?src=\ref[src];secretsfun=whiteout'>Fix all lights</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=friendai'>Best Friend AI</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=floorlava'>The floor is lava! (DANGEROUS)</A><BR>"}
|
||||
@@ -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 += "<center><B>Voting</B></center><hr>\n"
|
||||
|
||||
if(lvl > 0)
|
||||
dat += {"
|
||||
<A href='?src=\ref[src];votekill=1'>Abort Vote</A><br>
|
||||
<A href='?src=\ref[src];vmode=1'>Start Vote</A><br>
|
||||
<A href='?src=\ref[src];voteres=1'>Toggle Voting</A><br>
|
||||
"}
|
||||
|
||||
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 << "<B>The game start has been delayed.</B>"
|
||||
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<B>*** A custom vote has been initiated by [usr.key].</B>"
|
||||
world << "\red You have [vote.timetext(config.vote_period)] to vote."
|
||||
else
|
||||
world << "\red<B>*** A vote to [vote.mode?"change game mode":"restart"] has been initiated by [usr.key].</B>"
|
||||
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 <b>*** Voting aborted by [usr.client.stealth ? "Admin Candidate" : usr.key].</b>"
|
||||
|
||||
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 << "<b>Player restart voting toggled to [config.allow_vote_restart ? "On" : "Off"]</b>."
|
||||
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 << "<b>Player mode voting toggled to [config.allow_vote_mode ? "On" : "Off"]</b>."
|
||||
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"
|
||||
|
||||
@@ -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 << "<b>Started logging hrefs</b>"
|
||||
|
||||
/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"
|
||||
|
||||
@@ -1,3 +1,227 @@
|
||||
/obj/admins/proc/player_panel_new()//The new one
|
||||
if (!usr.client.holder)
|
||||
return
|
||||
var/dat = "<html><head><title>Player Menu</title></head>"
|
||||
dat += "<body><table border=1 cellspacing=5><B><tr><th>Name/Real Name</th><th>Type</th><th>Assigned Job</th><th>Info</th><th>Options</th><th>Traitor?</th></tr></B>"
|
||||
//add <th>IP:</th> to this if wanting to add back in IP checking
|
||||
//add <td>(IP: [M.lastKnownIP])</td> 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 ? "<b>[M.name]/[M.real_name]</b>" : "<b>[M.real_name] (as [M.name]/[M.real_name])</b>")
|
||||
var/turf/T = get_turf(M)
|
||||
var/client_key = (M.key? M.key : "No key")
|
||||
dat += "<tr align='center' bgcolor='[color]'><td>[real] <br>[M.client ? M.client : "No client ([client_key])"] at ([T.x], [T.y], [T.z])</td>" // Adds current name
|
||||
if(isobserver(M))
|
||||
dat += "<td>Ghost</td>"
|
||||
else if(isalien(M))
|
||||
dat += "<td>Alien</td>"
|
||||
else if(islarva(M))
|
||||
dat += "<td>Alien larva</td>"
|
||||
else if(istajaran(M))
|
||||
dat += "<td>Tajaran</td>"
|
||||
else if(ishuman(M))
|
||||
dat += "<td>[M.job]</td>"
|
||||
else if(ismetroid(M))
|
||||
dat += "<td>Metroid</td>"
|
||||
else if(ismonkey(M))
|
||||
dat += "<td>Monkey</td>"
|
||||
else if(isAI(M))
|
||||
dat += "<td>AI</td>"
|
||||
else if(ispAI(M))
|
||||
dat += "<td>pAI</td>"
|
||||
else if(isrobot(M))
|
||||
dat += "<td>Cyborg</td>"
|
||||
else if(isanimal(M))
|
||||
dat += "<td>Animal</td>"
|
||||
else if(iscorgi(M))
|
||||
dat += "<td>Corgi</td>"
|
||||
else if(istype(M,/mob/new_player))
|
||||
dat += "<td>New Player</td>"
|
||||
else
|
||||
dat += "<td>\red ERROR</td>\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 += "<td>[M.mind.assigned_role] (No ID)</td>"
|
||||
|
||||
else if(isnull(id.assignment)) // Preventing runtime errors blocking the player panel
|
||||
if(istype(id, /obj/item/weapon/card/id/syndicate))
|
||||
dat += "<td><font color=purple>Antagonist</font></td>"
|
||||
else
|
||||
usr << "<font color=red>ERROR:</font> Inform the coders that an [id.name] was checked for its assignment variable, and it was null."
|
||||
dat += "<td><font color=red>ERROR</font></td>"
|
||||
|
||||
else
|
||||
if(M.mind.assigned_role == id.assignment) // Polymorph
|
||||
dat += "<td>[M.mind.assigned_role]</td>"
|
||||
|
||||
else
|
||||
dat += "<td>[M.mind.assigned_role] ([id.assignment])"
|
||||
|
||||
else
|
||||
dat += "<td>[M.mind.assigned_role] (No ID)</td>"
|
||||
|
||||
else
|
||||
dat += "<td>No Assigned Role</td>"
|
||||
|
||||
var/muting = "Not Currently Working"
|
||||
// if(M.client)
|
||||
// muting = {"<A href='?src=\ref[src];mute2=\ref[M]'>Mute: [(M.client.muted ? "Muted" : "Voiced")]</A> |
|
||||
// <A href='?src=\ref[src];mute_complete=\ref[M]'>Complete mute: [(M.client.muted ? "Completely Muted" : "Voiced")]</A>
|
||||
// "}
|
||||
|
||||
dat += {"<td><A HREF='?src=\ref[src];player_info=[M.ckey]'>[player_has_info(M.ckey) ? "Info" : "N/A"] </A></td>
|
||||
<td><A href='?src=\ref[usr];priv_msg=\ref[M]'><b>PM</b></A> |
|
||||
<A HREF='?src=\ref[src];adminplayeropts=\ref[M]'>PP</A> |
|
||||
<A HREF='?src=\ref[src];adminplayervars=\ref[M]'>VV</A> |
|
||||
<A HREF='?src=\ref[src];traitor_panel_pp=\ref[M]'>TP</A> |
|
||||
<A HREF='?src=\ref[src];adminplayersubtlemessage=\ref[M]'>SM</A> |
|
||||
<A HREF='?src=\ref[src];adminplayerobservejump=\ref[M]'>JMP</A></font>
|
||||
<br><font size="2">[muting]</font><br>
|
||||
<font size="2"><A href='?src=\ref[src];warn=\ref[M]'>Warn</A> | <A href='?src=\ref[src];boot2=\ref[M]'>Boot</A> | <A href='?src=\ref[src];newban=\ref[M]'>Ban</A> | <A href='?src=\ref[src];jobban2=\ref[M]'>Jobban</A></td>
|
||||
"}
|
||||
|
||||
switch(is_special_character(M))
|
||||
if(0)
|
||||
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'>Traitor?</A></td>"}
|
||||
if(1)
|
||||
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'><font color=red>Traitor?</font></A></td>"}
|
||||
if(2)
|
||||
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'><font color=red><b>Traitor?</b></font></A></td>"}
|
||||
|
||||
dat += "</table></body></html>"
|
||||
|
||||
usr << browse(dat, "window=players;size=905x600")
|
||||
|
||||
|
||||
/obj/admins/proc/mod_panel()//The new one
|
||||
if (!usr.client.holder)
|
||||
return
|
||||
var/dat = "<html><head><title>Player Menu</title></head>"
|
||||
dat += "<body><table border=1 cellspacing=5><B><tr><th>Name/Real Name</th><th>IP/CID</th><th>Info</th><th>Options</th><th>Traitor?</th></tr></B>"
|
||||
//add <th>IP:</th> to this if wanting to add back in IP checking <th>Type</th> <th>Assigned Job</th> <th>Traitor?</th>
|
||||
//add <td>(IP: [M.lastKnownIP])</td> 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 ? "<b>[M.name]/[M.real_name]</b>" : "<b>[M.real_name] (as [M.name]/[M.real_name])</b>")
|
||||
var/turf/T = get_turf(M)
|
||||
var/client_key = (M.key? M.key : "No key")
|
||||
dat += "<tr align='center' bgcolor='[color]'><td>[real] <br>[M.client ? M.client : "No client ([client_key])"] at ([T.x], [T.y], [T.z])</td>" // Adds current name
|
||||
/* if(isobserver(M))
|
||||
dat += "<td>Ghost</td>"
|
||||
else if(isalien(M))
|
||||
dat += "<td>Alien</td>"
|
||||
else if(islarva(M))
|
||||
dat += "<td>Alien larva</td>"
|
||||
else if(istajaran(M))
|
||||
dat += "<td>Tajaran</td>"
|
||||
else if(ishuman(M))
|
||||
dat += "<td>[M.job]</td>"
|
||||
else if(ismetroid(M))
|
||||
dat += "<td>Metroid</td>"
|
||||
else if(ismonkey(M))
|
||||
dat += "<td>Monkey</td>"
|
||||
else if(isAI(M))
|
||||
dat += "<td>AI</td>"
|
||||
else if(ispAI(M))
|
||||
dat += "<td>pAI</td>"
|
||||
else if(isrobot(M))
|
||||
dat += "<td>Cyborg</td>"
|
||||
else if(isanimal(M))
|
||||
dat += "<td>Animal</td>"
|
||||
else if(iscorgi(M))
|
||||
dat += "<td>Corgi</td>"
|
||||
else if(istype(M,/mob/new_player))
|
||||
dat += "<td>New Player</td>"
|
||||
else
|
||||
dat += "<td>\red ERROR</td>\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 += "<td>[M.mind.assigned_role] (No ID)</td>"
|
||||
|
||||
else if(isnull(id.assignment)) // Preventing runtime errors blocking the player panel
|
||||
if(istype(id, /obj/item/weapon/card/id/syndicate))
|
||||
dat += "<td><font color=purple>Antagonist</font></td>"
|
||||
else
|
||||
usr << "<font color=red>ERROR:</font> Inform the coders that an [id.name] was checked for its assignment variable, and it was null."
|
||||
dat += "<td><font color=red>ERROR</font></td>"
|
||||
|
||||
else
|
||||
if(M.mind.assigned_role == id.assignment) // Polymorph
|
||||
dat += "<td>[M.mind.assigned_role]</td>"
|
||||
|
||||
else
|
||||
dat += "<td>[M.mind.assigned_role] ([id.assignment])"
|
||||
|
||||
else
|
||||
dat += "<td>[M.mind.assigned_role] (No ID)</td>"
|
||||
|
||||
else
|
||||
dat += "<td>No Assigned Role</td>"
|
||||
*/
|
||||
dat += {"<td>IP: [M.client ? M.client.address : "Disconnected"]<br>
|
||||
CID: [M.client ? M.client.computer_id : "Disconnected"]</td>
|
||||
"}
|
||||
|
||||
dat += {"<td><A HREF='?src=\ref[src];player_info=[M.ckey]'>[player_has_info(M.ckey) ? "Info" : "N/A"] </A></td>
|
||||
<td><A href='?src=\ref[usr];priv_msg=\ref[M]'><b>PM</b></A></td>
|
||||
"}
|
||||
|
||||
switch(is_special_character(M))
|
||||
if(0)
|
||||
dat += {"<td align=center>Loyal</td>"}
|
||||
if(1)
|
||||
dat += {"<td align=center><font color=red>Antag</font></td>"}
|
||||
if(2)
|
||||
dat += {"<td align=center><font color=red><b>Mode-Antag</b></font></td>"}
|
||||
|
||||
dat += "</table></body></html>"
|
||||
|
||||
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 += "</body></html>"
|
||||
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 = "<html><head><title>Player Menu</title></head>"
|
||||
dat += "<body><table border=1 cellspacing=5><B><tr><th>Name/Real Name</th><th>IP/CID</th><th>Info</th><th>Options</th><th>Traitor?</th></tr></B>"
|
||||
//add <th>IP:</th> to this if wanting to add back in IP checking <th>Type</th> <th>Assigned Job</th> <th>Traitor?</th>
|
||||
//add <td>(IP: [M.lastKnownIP])</td> 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 ? "<b>[M.name]/[M.real_name]</b>" : "<b>[M.original_name] (as [M.name]/[M.real_name])</b>")
|
||||
var/real = "<b>[M.name]/[M.real_name]</b>"
|
||||
var/turf/T = get_turf(M)
|
||||
var/client_key = (M.key? M.key : "No key")
|
||||
dat += "<tr align='center' bgcolor='[color]'><td>[real] <br>[M.client ? M.client : "No client ([client_key])"] at ([T.x], [T.y], [T.z])</td>" // Adds current name
|
||||
/* if(isobserver(M))
|
||||
dat += "<td>Ghost</td>"
|
||||
else if(isalien(M))
|
||||
dat += "<td>Alien</td>"
|
||||
else if(islarva(M))
|
||||
dat += "<td>Alien larva</td>"
|
||||
else if(istajaran(M))
|
||||
dat += "<td>Tajaran</td>"
|
||||
else if(ishuman(M))
|
||||
dat += "<td>[M.job]</td>"
|
||||
else if(ismetroid(M))
|
||||
dat += "<td>Metroid</td>"
|
||||
else if(ismonkey(M))
|
||||
dat += "<td>Monkey</td>"
|
||||
else if(isAI(M))
|
||||
dat += "<td>AI</td>"
|
||||
else if(ispAI(M))
|
||||
dat += "<td>pAI</td>"
|
||||
else if(isrobot(M))
|
||||
dat += "<td>Cyborg</td>"
|
||||
else if(isanimal(M))
|
||||
dat += "<td>Animal</td>"
|
||||
else if(iscorgi(M))
|
||||
dat += "<td>Corgi</td>"
|
||||
else if(istype(M,/mob/new_player))
|
||||
dat += "<td>New Player</td>"
|
||||
else
|
||||
dat += "<td>\red ERROR</td>\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 += "<td>[M.mind.assigned_role] (No ID)</td>"
|
||||
|
||||
else if(isnull(id.assignment)) // Preventing runtime errors blocking the player panel
|
||||
if(istype(id, /obj/item/weapon/card/id/syndicate))
|
||||
dat += "<td><font color=purple>Antagonist</font></td>"
|
||||
else
|
||||
usr << "<font color=red>ERROR:</font> Inform the coders that an [id.name] was checked for its assignment variable, and it was null."
|
||||
dat += "<td><font color=red>ERROR</font></td>"
|
||||
|
||||
else
|
||||
if(M.mind.assigned_role == id.assignment) // Polymorph
|
||||
dat += "<td>[M.mind.assigned_role]</td>"
|
||||
|
||||
else
|
||||
dat += "<td>[M.mind.assigned_role] ([id.assignment])"
|
||||
|
||||
else
|
||||
dat += "<td>[M.mind.assigned_role] (No ID)</td>"
|
||||
|
||||
else
|
||||
dat += "<td>No Assigned Role</td>"
|
||||
*/
|
||||
dat += {"<td>IP: [M.client ? M.client.address : "Disconnected"]<br>
|
||||
CID: [M.client ? M.client.computer_id : "Disconnected"]</td>
|
||||
"}
|
||||
|
||||
dat += {"<td><A HREF='?src=\ref[src];player_info=[M.ckey]'>[player_has_info(M.ckey) ? "Info" : "N/A"] </A></td>
|
||||
<td><A href='?src=\ref[usr];priv_msg=\ref[M]'><b>PM</b></A></td>
|
||||
"}
|
||||
|
||||
switch(is_special_character(M))
|
||||
if(0)
|
||||
dat += {"<td align=center>Loyal</td>"}
|
||||
if(1)
|
||||
dat += {"<td align=center><font color=red>Antag</font></td>"}
|
||||
if(2)
|
||||
dat += {"<td align=center><font color=red><b>Mode-Antag</b></font></td>"}
|
||||
|
||||
dat += "</table></body></html>"
|
||||
|
||||
usr << browse(dat, "window=players;size=600x600")
|
||||
alert("The game hasn't started yet!")
|
||||
@@ -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"
|
||||
|
||||
@@ -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 <i>spooky</i> code here!
|
||||
return
|
||||
|
||||
*/
|
||||
/mob/dead/observer/verb/toggle_alien_candidate()
|
||||
set name = "Toggle Be Alien Candidate"
|
||||
set category = "Ghost"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -393,6 +393,10 @@
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been thrown by [usr.name] ([usr.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]</font>")
|
||||
usr.attack_log += text("\[[time_stamp()]\] <font color='red'>Has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]</font>")
|
||||
|
||||
log_attack("<font color='red'>[usr.name] ([usr.ckey]) Has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]</font>")
|
||||
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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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("<font color='red'>[usr] ([usr.ckey]) placed [GM] ([GM.ckey]) in a disposals unit.</font>")
|
||||
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
|
||||
|
||||
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 139 KiB After Width: | Height: | Size: 130 KiB |
|
Before Width: | Height: | Size: 145 KiB After Width: | Height: | Size: 146 KiB |
|
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 133 KiB |
|
Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 113 KiB |