Merging Development

Merging the development branch.
This commit is contained in:
jack-fractal
2015-06-30 22:11:33 -04:00
110 changed files with 14370 additions and 13629 deletions
+32 -20
View File
@@ -1,7 +1,7 @@
datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = -1, var/reason, var/job = "", var/rounds = 0, var/banckey = null)
datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = -1, var/reason, var/job = "", var/rounds = 0, var/banckey = null, var/autobanner = 0, var/autoip = null, var/autocid = null)
if(!check_rights(R_MOD,0) && !check_rights(R_BAN)) return
if(!check_rights(R_MOD,0) && !check_rights(R_BAN) && !autobanner) return
establish_db_connection()
if(!dbcon.IsConnected())
@@ -41,15 +41,20 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration =
else if(banckey)
ckey = ckey(banckey)
var/DBQuery/query = dbcon.NewQuery("SELECT id FROM erro_player WHERE ckey = '[ckey]'")
query.Execute()
var/validckey = 0
if(query.NextRow())
validckey = 1
if(!validckey)
if(!banned_mob || (banned_mob && !IsGuestKey(banned_mob.key)))
message_admins("<font color='red'>[key_name_admin(usr)] attempted to ban [ckey], but [ckey] has not been seen yet. Please only ban actual players.</font>",1)
return
if(!autobanner)
var/DBQuery/query = dbcon.NewQuery("SELECT id, ip, computerid FROM ss13_player WHERE ckey = '[ckey]'")
query.Execute()
var/validckey = 0
if(query.NextRow())
validckey = 1
if(!ip)
ip = query.item[2]
if(!computerid)
computerid = query.item[3]
if(!validckey)
if(!banned_mob || (banned_mob && !IsGuestKey(banned_mob.key)))
message_admins("<font color='red'>[key_name_admin(usr)] attempted to ban [ckey], but [ckey] has not been seen yet. Please only ban actual players.</font>",1)
return
var/a_ckey
var/a_computerid
@@ -60,6 +65,13 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration =
a_computerid = src.owner:computer_id
a_ip = src.owner:address
if(autobanner)
a_ckey = "Adminbot"
a_computerid = ""
a_ip = "[world.internet_address]"
computerid = autocid
ip = autoip
var/who
for(var/client/C in clients)
if(!who)
@@ -76,11 +88,11 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration =
reason = sql_sanitize_text(reason)
var/sql = "INSERT INTO erro_ban (`id`,`bantime`,`serverip`,`bantype`,`reason`,`job`,`duration`,`rounds`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`,`edits`,`unbanned`,`unbanned_datetime`,`unbanned_ckey`,`unbanned_computerid`,`unbanned_ip`) VALUES (null, Now(), '[serverip]', '[bantype_str]', '[reason]', '[job]', [(duration)?"[duration]":"0"], [(rounds)?"[rounds]":"0"], Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[ckey]', '[computerid]', '[ip]', '[a_ckey]', '[a_computerid]', '[a_ip]', '[who]', '[adminwho]', '', null, null, null, null, null)"
var/sql = "INSERT INTO ss13_ban (`id`,`bantime`,`serverip`,`bantype`,`reason`,`job`,`duration`,`rounds`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`,`edits`,`unbanned`,`unbanned_datetime`,`unbanned_ckey`,`unbanned_computerid`,`unbanned_ip`) VALUES (null, Now(), '[serverip]', '[bantype_str]', '[reason]', '[job]', [(duration)?"[duration]":"0"], [(rounds)?"[rounds]":"0"], Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[ckey]', '[computerid]', '[ip]', '[a_ckey]', '[a_computerid]', '[a_ip]', '[who]', '[adminwho]', '', null, null, null, null, null)"
var/DBQuery/query_insert = dbcon.NewQuery(sql)
query_insert.Execute()
usr << "\blue Ban saved to database."
message_admins("[key_name_admin(usr)] has added a [bantype_str] for [ckey] [(job)?"([job])":""] [(duration > 0)?"([duration] minutes)":""] with the reason: \"[reason]\" to the ban database.",1)
message_admins("[autobanner ? "Adminbot" : key_name_admin(usr)] has added a [bantype_str] for [ckey] [(job)?"([job])":""] [(duration > 0)?"([duration] minutes)":""] with the reason: \"[reason]\" to the ban database.",1)
@@ -115,7 +127,7 @@ datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "")
else
bantype_sql = "bantype = '[bantype_str]'"
var/sql = "SELECT id FROM erro_ban WHERE ckey = '[ckey]' AND [bantype_sql] AND (unbanned is null OR unbanned = false)"
var/sql = "SELECT id FROM ss13_ban WHERE ckey = '[ckey]' AND [bantype_sql] AND (unbanned is null OR unbanned = false)"
if(job)
sql += " AND job = '[job]'"
@@ -156,7 +168,7 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null)
usr << "Cancelled"
return
var/DBQuery/query = dbcon.NewQuery("SELECT ckey, duration, reason FROM erro_ban WHERE id = [banid]")
var/DBQuery/query = dbcon.NewQuery("SELECT ckey, duration, reason FROM ss13_ban WHERE id = [banid]")
query.Execute()
var/eckey = usr.ckey //Editing admin ckey
@@ -184,7 +196,7 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null)
usr << "Cancelled"
return
var/DBQuery/update_query = dbcon.NewQuery("UPDATE erro_ban SET reason = '[value]', edits = CONCAT(edits,'- [eckey] changed ban reason from <cite><b>\\\"[reason]\\\"</b></cite> to <cite><b>\\\"[value]\\\"</b></cite><BR>') WHERE id = [banid]")
var/DBQuery/update_query = dbcon.NewQuery("UPDATE ss13_ban SET reason = '[value]', edits = CONCAT(edits,'- [eckey] changed ban reason from <cite><b>\\\"[reason]\\\"</b></cite> to <cite><b>\\\"[value]\\\"</b></cite><BR>') WHERE id = [banid]")
update_query.Execute()
message_admins("[key_name_admin(usr)] has edited a ban for [pckey]'s reason from [reason] to [value]",1)
if("duration")
@@ -194,7 +206,7 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null)
usr << "Cancelled"
return
var/DBQuery/update_query = dbcon.NewQuery("UPDATE erro_ban SET duration = [value], edits = CONCAT(edits,'- [eckey] changed ban duration from [duration] to [value]<br>'), expiration_time = DATE_ADD(bantime, INTERVAL [value] MINUTE) WHERE id = [banid]")
var/DBQuery/update_query = dbcon.NewQuery("UPDATE ss13_ban SET duration = [value], edits = CONCAT(edits,'- [eckey] changed ban duration from [duration] to [value]<br>'), expiration_time = DATE_ADD(bantime, INTERVAL [value] MINUTE) WHERE id = [banid]")
message_admins("[key_name_admin(usr)] has edited a ban for [pckey]'s duration from [duration] to [value]",1)
update_query.Execute()
if("unban")
@@ -212,7 +224,7 @@ datum/admins/proc/DB_ban_unban_by_id(var/id)
if(!check_rights(R_BAN)) return
var/sql = "SELECT ckey FROM erro_ban WHERE id = [id]"
var/sql = "SELECT ckey FROM ss13_ban WHERE id = [id]"
establish_db_connection()
if(!dbcon.IsConnected())
@@ -242,7 +254,7 @@ datum/admins/proc/DB_ban_unban_by_id(var/id)
var/unban_computerid = src.owner:computer_id
var/unban_ip = src.owner:address
var/sql_update = "UPDATE erro_ban SET unbanned = 1, unbanned_datetime = Now(), unbanned_ckey = '[unban_ckey]', unbanned_computerid = '[unban_computerid]', unbanned_ip = '[unban_ip]' WHERE id = [id]"
var/sql_update = "UPDATE ss13_ban SET unbanned = 1, unbanned_datetime = Now(), unbanned_ckey = '[unban_ckey]', unbanned_computerid = '[unban_computerid]', unbanned_ip = '[unban_ip]' WHERE id = [id]"
message_admins("[key_name_admin(usr)] has lifted [pckey]'s ban.",1)
var/DBQuery/query_update = dbcon.NewQuery(sql_update)
@@ -341,7 +353,7 @@ datum/admins/proc/DB_ban_unban_by_id(var/id)
if(playerckey)
playersearch = "AND ckey = '[playerckey]' "
var/DBQuery/select_query = dbcon.NewQuery("SELECT id, bantime, bantype, reason, job, duration, expiration_time, ckey, a_ckey, unbanned, unbanned_ckey, unbanned_datetime, edits FROM erro_ban WHERE 1 [playersearch] [adminsearch] ORDER BY bantime DESC")
var/DBQuery/select_query = dbcon.NewQuery("SELECT id, bantime, bantype, reason, job, duration, expiration_time, ckey, a_ckey, unbanned, unbanned_ckey, unbanned_datetime, edits FROM ss13_ban WHERE 1 [playersearch] [adminsearch] ORDER BY bantime DESC")
select_query.Execute()
while(select_query.NextRow())
+81 -19
View File
@@ -1,3 +1,10 @@
#define IPBAN 1
#define IPBANPASS 2
#define IDBAN 4
#define IDBANPASS 8
#define KEYBAN 16
#define KEYBANPASS 32
var/global/list/blacklist = list()
//Blocks an attempt to connect before even creating our client datum thing.
@@ -5,10 +12,14 @@ world/IsBanned(key,address,computer_id)
if(ckey(key) in admin_datums)
return ..()
//Making the adminbot for automated bans.
var/datum/admins/Adminbot = new /datum/admins("Friendly Robot", 8196, "Adminbot")
//Guest Checking
if(!guests_allowed && IsGuestKey(key))
log_access("Failed Login: [key] - Guests not allowed")
message_admins("\blue Failed Login: [key] - Guests not allowed")
del Adminbot
return list("reason"="guest", "desc"="\nReason: Guests not allowed. Please sign in with a byond account.")
//check if the IP address is a known TOR node
@@ -17,6 +28,7 @@ world/IsBanned(key,address,computer_id)
message_admins("\blue Failed Login: [src] - Banned: ToR")
//ban their computer_id and ckey for posterity
AddBan(ckey(key), computer_id, "Use of ToR", "Automated Ban", 0, 0)
del Adminbot
return list("reason"="Using ToR", "desc"="\nReason: The network you are using to connect has been banned.\nIf you believe this is a mistake, please request help at [config.banappeals]")
if(config && config.ip_blacklist_enabled)
@@ -36,21 +48,23 @@ world/IsBanned(key,address,computer_id)
msg_scopes("Where is the blacklist!")
else
//Have data, will base.
var/DBQuery/query = dbcon.NewQuery("SELECT ip FROM aurora_ipblacklist WHERE ip = '[address]'")
var/DBQuery/query = dbcon.NewQuery("SELECT ip FROM ss13_ipblacklist WHERE ip = '[address]'")
query.Execute()
while(query.NextRow())
var/bip = query.item[1]
if(query.NextRow())
banhe = 1
if(bip == address)
banhe = 1
if(banhe)
log_access("Failed Login: [key] - Blacklisted IP. User banned.")
message_admins("\blue Failed Login: [key] - Blacklisted IP. User banned.")
message_mods("\blue Failed Login: [key] - Blacklisted IP. User banned.")
if(banhe == 1)
log_access("Failed Login: [key] - Blacklisted IP")
message_admins("\blue Failed Login: [key] - Blacklisted IP")
message_mods("\blue Failed Login: [key] - Blacklisted IP")
AddBan(ckey(key), computer_id, "Bad IP", "Automated Ban", 0, 0)
return list("reason"="IP Blacklisted", "desc"="\nReason: This IP has been blacklisted from the server.\nIf you believe this is a mistake, please request help at [config.banappeals]")
var/reason = "This IP has been blacklisted from the server."
Adminbot.DB_ban_record(1, null, null, reason, null, null, ckey(key), 1, address, computer_id)
notes_add_sql(key, reason, null, address, computer_id)
del Adminbot
return list("reason"="IP Blacklisted", "desc"="\nReason: [reason]\nIf you believe this is a mistake, please request help at [config.banappeals]")
msg_scopes("[key]'s blacklist check completed.")
@@ -61,8 +75,10 @@ world/IsBanned(key,address,computer_id)
if(.)
log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]")
message_admins("\blue Failed Login: [key] id:[computer_id] ip:[address] - Banned [.["reason"]]")
del Adminbot
return .
del Adminbot
return ..() //default pager ban stuff
else
@@ -72,10 +88,18 @@ world/IsBanned(key,address,computer_id)
if(!establish_db_connection())
error("Ban database connection failure. Key [ckeytext] not checked")
log_misc("Ban database connection failure. Key [ckeytext] not checked")
del Adminbot
return
var/failedcid = 1
var/failedip = 1
var/toban = 0
var/banFlag = 0
var/desc = null
var/tobantype = null
var/multireason = null
var/newreason = null
var/ipquery = ""
var/cidquery = ""
@@ -87,14 +111,14 @@ world/IsBanned(key,address,computer_id)
failedcid = 0
cidquery = " OR computerid = '[computer_id]' "
var/DBQuery/query = dbcon.NewQuery("SELECT ckey, ip, computerid, a_ckey, reason, expiration_time, duration, bantime, bantype FROM erro_ban WHERE (ckey = '[ckeytext]' [ipquery] [cidquery]) AND (bantype = 'PERMABAN' OR (bantype = 'TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)")
var/DBQuery/query = dbcon.NewQuery("SELECT ckey, ip, computerid, a_ckey, reason, expiration_time, duration, bantime, bantype FROM ss13_ban WHERE (ckey = '[ckeytext]' [ipquery] [cidquery]) AND (bantype = 'PERMABAN' OR (bantype = 'TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)")
query.Execute()
while(query.NextRow())
var/pckey = query.item[1]
//var/pip = query.item[2]
//var/pcid = query.item[3]
var/pip = query.item[2]
var/pcid = query.item[3]
var/ackey = query.item[4]
var/reason = query.item[5]
var/expiration = query.item[6]
@@ -106,15 +130,53 @@ world/IsBanned(key,address,computer_id)
if(text2num(duration) > 0)
expires = " The ban is for [duration] minutes and expires on [expiration] (server time)."
var/desc = "\nReason: You, or another user of this computer or connection ([pckey]) is banned from playing here. The ban reason is:\n[reason]\nThis ban was applied by [ackey] on [bantime], [expires]"
if(!desc) //No desc then none of the others are set
desc = "\nReason: You, or another user of this computer or connection ([pckey]) is banned from playing here. The ban reason is:\n[reason]\nThis ban was applied by [ackey] on [bantime], [expires]"
multireason = reason
tobantype = bantype
log_access("Failed Login: [key] [computer_id] [address] - Banned [reason]")
message_admins("\blue Failed Login: [key] id:[computer_id] ip:[address] - Banned [reason]")
if(bantype == "PERMABAN")
if(!(banFlag & KEYBANPASS) && ckey(key) != ckey(pckey))
banFlag |= KEYBAN
return list("reason"="[bantype]", "desc"="[desc]")
if(!(banFlag & IDBANPASS) && computer_id != pcid)
banFlag |= IDBAN
if(!(banFlag & IPBANPASS) && address != pip)
banFlag |= IPBAN
if(banFlag & (KEYBAN|IDBAN|IPBAN))
if(banFlag & KEYBAN && ckey(key) == ckey(pckey))
banFlag &= ~KEYBAN
banFlag |= KEYBANPASS
if(banFlag & IDBAN && computer_id == pcid)
banFlag &= ~IDBAN
banFlag |= IDBANPASS
if(banFlag & IPBAN && address == pip)
banFlag &= ~IPBAN
banFlag |= IPBANPASS
if(banFlag && !newreason)
newreason = "This is an automatic ban for attempted bandodging. The original ban reason: [multireason]."
if(!toban)
toban = 1
if(banFlag & (KEYBAN|IDBAN|IPBAN))
Adminbot.DB_ban_record(1, null, null, multireason, null, null, ckey(key), 1, address, computer_id)
notes_add_sql(key, newreason, null, address, computer_id)
if(toban)
log_access("Failed Login: [key] [computer_id] [address] - Banned [multireason]")
message_admins("\blue Failed Login: [key] id:[computer_id] ip:[address] - Banned [multireason]")
del Adminbot
return list("reason"="[tobantype]", "desc"="[desc]")
if (failedcid)
message_admins("[key] has logged in with a blank computer id in the ban check.")
if (failedip)
message_admins("[key] has logged in with a blank ip in the ban check.")
return ..() //default pager ban stuff
del Adminbot
return ..() //default pager ban stuff
+2 -2
View File
@@ -299,9 +299,9 @@ var/savefile/Banlist
message_admins("Query data: [serverip], [bantype_str], [duration], [key], [id], [ip], [reason], [banckey]")
message_admins("Executing query")
var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO `erro_ban` (`id`,`bantime`,`serverip`,`bantype`,`reason`,`job`,`duration`,`rounds`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`,`edits`,`unbanned`,`unbanned_datetime`,`unbanned_ckey`,`unbanned_computerid`,`unbanned_ip`) VALUES (null, Now(), '[serverip]', '[bantype_str]', '[reason]', '[job]', '[minutes]', '[rounds]', Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[key]', '[id]', '[ip]', '[banckey]', '', '', '', '', null, null, null, null, null, null);")
var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO `ss13_ban` (`id`,`bantime`,`serverip`,`bantype`,`reason`,`job`,`duration`,`rounds`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`,`edits`,`unbanned`,`unbanned_datetime`,`unbanned_ckey`,`unbanned_computerid`,`unbanned_ip`) VALUES (null, Now(), '[serverip]', '[bantype_str]', '[reason]', '[job]', '[minutes]', '[rounds]', Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[key]', '[id]', '[ip]', '[banckey]', '', '', '', '', null, null, null, null, null, null);")
insert_query.Execute()
var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Attempted to transfer the ban of [key].');")
var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `ss13_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Attempted to transfer the ban of [key].');")
log_query.Execute()
message_admins("Salvo complete, stand by.")
-107
View File
@@ -229,113 +229,6 @@ 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
#define PLAYER_NOTES_ENTRIES_PER_PAGE 50
/datum/admins/proc/PlayerNotes()
set category = "Admin"
set name = "Player Notes"
if (!istype(src,/datum/admins))
src = usr.client.holder
/* if (!istype(src,/datum/admins))
usr << "Error: you are not an admin!"
return
*/
if(!check_rights(R_ADMIN|R_MOD))
return
PlayerNotesPage(1)
/datum/admins/proc/PlayerNotesPage(page)
var/dat = "<B>Player notes</B><HR>"
var/savefile/S=new("data/player_notes.sav")
var/list/note_keys
S >> note_keys
if(!note_keys)
dat += "No notes found."
else
dat += "<table>"
note_keys = sortList(note_keys)
// Display the notes on the current page
var/number_pages = note_keys.len / PLAYER_NOTES_ENTRIES_PER_PAGE
// Emulate ceil(why does BYOND not have ceil)
if(number_pages != round(number_pages))
number_pages = round(number_pages) + 1
var/page_index = page - 1
if(page_index < 0 || page_index >= number_pages)
return
var/lower_bound = page_index * PLAYER_NOTES_ENTRIES_PER_PAGE + 1
var/upper_bound = (page_index + 1) * PLAYER_NOTES_ENTRIES_PER_PAGE
upper_bound = min(upper_bound, note_keys.len)
for(var/index = lower_bound, index <= upper_bound, index++)
var/t = note_keys[index]
dat += "<tr><td><a href='?src=\ref[src];notes=show;ckey=[t]'>[t]</a></td></tr>"
dat += "</table><br>"
// Display a footer to select different pages
for(var/index = 1, index <= number_pages, index++)
if(index == page)
dat += "<b>"
dat += "<a href='?src=\ref[src];notes=list;index=[index]'>[index]</a> "
if(index == page)
dat += "</b>"
usr << browse(dat, "window=player_notes;size=400x400")
/datum/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
/datum/admins/proc/show_player_info(var/key as text)
set category = "Admin"
set name = "Show Player Info"
if (!istype(src,/datum/admins))
src = usr.client.holder
if (!istype(src,/datum/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 || I.author == "Adminbot")
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")
/datum/admins/proc/access_news_network() //MARKER
set category = "Fun"
set name = "Access Newscaster Network"
+1 -1
View File
@@ -110,7 +110,7 @@ var/list/admin_ranks = list() //list of all ranks with associated rights
load_admins()
return
var/DBQuery/query = dbcon.NewQuery("SELECT ckey, rank, level, flags FROM erro_admin")
var/DBQuery/query = dbcon.NewQuery("SELECT ckey, rank, level, flags FROM ss13_admin")
query.Execute()
while(query.NextRow())
var/ckey = query.item[1]
-395
View File
@@ -1,398 +1,3 @@
/*
//admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless
var/list/admin_verbs_default = list(
/client/proc/player_panel,
/client/proc/toggleadminhelpsound, /*toggles whether we hear a sound when adminhelps/PMs are used*/
/client/proc/deadmin_self, /*destroys our own admin datum so we can play as a regular player*/
/client/proc/hide_verbs, /*hides all our adminverbs*/
/client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/
/client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify*/
// /client/proc/deadchat /*toggles deadchat on/off*/
)
var/list/admin_verbs_admin = list(
/datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/
/client/proc/check_antagonists, /*shows all antags*/
/client/proc/alertlevels,
/client/proc/cmd_admin_wind,
/client/proc/cmd_admin_unwind,
/client/proc/player_panel, /*shows an interface for all players, with links to various panels (old style)*/
/client/proc/player_panel_new, /*shows an interface for all players, with links to various panels*/
/client/proc/invisimin, /*allows our mob to go invisible/visible*/
// /datum/admins/proc/show_traitor_panel, /*interface which shows a mob's mind*/ -Removed due to rare practical use. Moved to debug verbs ~Errorage
/datum/admins/proc/toggleenter, /*toggles whether people can join the current game*/
/datum/admins/proc/toggleguests, /*toggles whether guests can join the current game*/
/datum/admins/proc/announce, /*priority announce something to all clients.*/
/client/proc/colorooc, /*allows us to set a custom colour for everythign we say in ooc*/
/client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/
/client/proc/toggle_view_range, /*changes how far we can see*/
/datum/admins/proc/view_txt_log, /*shows the server log (diary) for today*/
/datum/admins/proc/view_atk_log, /*shows the server combat-log, doesn't do anything presently*/
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/
/client/proc/cmd_admin_subtle_message, /*send an message to somebody as a 'voice in their head'*/
/client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/
/client/proc/cmd_admin_check_contents, /*displays the contents of an instance*/
/datum/admins/proc/access_news_network, /*allows access of newscasters*/
/client/proc/giveruntimelog, /*allows us to give access to runtime logs to somebody*/
/client/proc/getserverlog, /*allows us to fetch server logs (diary) for other days*/
/client/proc/jumptocoord, /*we ghost and jump to a coordinate*/
/client/proc/Getmob, /*teleports a mob to our location*/
/client/proc/Getkey, /*teleports a mob with a certain ckey to our location*/
// /client/proc/sendmob, /*sends a mob somewhere*/ -Removed due to it needing two sorting procs to work, which were executed every time an admin right-clicked. ~Errorage
/client/proc/Jump,
/client/proc/jumptokey, /*allows us to jump to the location of a mob with a certain ckey*/
/client/proc/jumptomob, /*allows us to jump to a specific mob*/
/client/proc/jumptoturf, /*allows us to jump to a specific turf*/
/client/proc/admin_call_shuttle, /*allows us to call the emergency shuttle*/
/client/proc/admin_cancel_shuttle, /*allows us to cancel the emergency shuttle, sending it back to centcomm*/
/client/proc/cmd_admin_direct_narrate, /*send text directly to a player with no padding. Useful for narratives and fluff-text*/
/client/proc/cmd_admin_world_narrate, /*sends text to all players with no padding*/
/client/proc/cmd_admin_create_centcom_report,
/client/proc/cmd_mentor_check_new_players,
/client/proc/check_words, /*displays cult-words*/
/client/proc/check_ai_laws, /*shows AI and borg laws*/
/client/proc/check_antagonists,
/client/proc/admin_memo, /*admin memo system. show/delete/write. +SERVER needed to delete admin memos of others*/
/client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/
// /client/proc/toggle_hear_deadcast, /*toggles whether we hear deadchat*/
/client/proc/toggle_hear_radio, /*toggles whether we hear the radio*/
/client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/
/client/proc/secrets,
/client/proc/toggleprayers,
/datum/admins/proc/toggleooc, /*toggles ooc on/off for everyone*/
/datum/admins/proc/toggledevooc,
/datum/admins/proc/togglemodooc,
/datum/admins/proc/togglelooc,
/datum/admins/proc/togglemodlooc,
/datum/admins/proc/toggledevlooc,
/datum/admins/proc/toggleoocdead, /*toggles ooc on/off for everyone who is dead*/
/datum/admins/proc/toggledsay, /*toggles dsay on/off for everyone*/
/client/proc/game_panel, /*game panel, allows to change game-mode etc*/
/client/proc/cmd_admin_say, /*admin-only ooc chat*/
/datum/admins/proc/PlayerNotes,
/client/proc/cmd_mod_say,
/datum/admins/proc/show_player_info,
/client/proc/free_slot, /*frees slot for chosen job*/
/client/proc/cmd_admin_change_custom_event,
/client/proc/cmd_admin_rejuvenate,
/client/proc/toggleattacklogs,
/client/proc/toggledebuglogs,
/client/proc/toggleghostwriters,
/client/proc/toggledrones,
/datum/admins/proc/show_skills,
/client/proc/check_customitem_activity,
/client/proc/man_up,
/client/proc/global_man_up,
/client/proc/response_team, // Response Teams admin verb
/client/proc/toggle_antagHUD_use,
/client/proc/toggle_antagHUD_restrictions,
/client/proc/allow_character_respawn, /* Allows a ghost to respawn */
/client/proc/set_ooc,
/client/proc/cleartox
)
var/list/admin_verbs_ban = list(
/client/proc/unban_panel,
/client/proc/jobbans,
/client/proc/warning_panel
)
var/list/admin_verbs_sounds = list(
/client/proc/play_local_sound,
/client/proc/play_sound
)
var/list/admin_verbs_fun = list(
//Hey look it's in order of letters ^_^
/datum/admins/proc/access_news_network,
/datum/admins/proc/Game,
/datum/admins/proc/toggle_aliens,
/datum/admins/proc/toggle_space_ninja,
/client/proc/admin_ghost,
/client/proc/alertlevels,
/client/proc/check_ai_laws,
/client/proc/cinematic,
/client/proc/cmd_admin_add_freeform_ai_law,
/client/proc/cmd_admin_add_random_ai_law,
/client/proc/cmd_admin_change_custom_event,
/client/proc/cmd_admin_create_centcom_report,
/client/proc/cmd_admin_delete,
/client/proc/cmd_admin_direct_narrate,
/client/proc/cmd_admin_dress,
/client/proc/cmd_admin_gib_self,
/client/proc/cmd_admin_pm_context,
/client/proc/cmd_admin_pm_panel,
/client/proc/cmd_admin_subtle_message,
/client/proc/cmd_admin_world_narrate,
/client/proc/cmd_debug_tog_aliens,
/client/proc/cmd_mod_say,
/client/proc/drop_bomb,
/client/proc/dsay,
/client/proc/editappear,
/client/proc/everyone_random,
/client/proc/Getmob,
/client/proc/Getkey,
/client/proc/Jump,
/client/proc/jumptokey,
/client/proc/jumptomob,
/client/proc/make_area_sound,
/client/proc/make_sound,
/client/proc/object_talk,
/client/proc/one_click_antag,
/client/proc/secrets,
/client/proc/send_space_ninja,
/client/proc/toggle_view_range
)
var/list/admin_verbs_dev = list(
/client/proc/dsay,
/client/proc/togglebuildmodeself,
/client/proc/giveruntimelog,
/client/proc/getruntimelog,
/client/proc/cmd_admin_list_open_jobs,
/client/proc/Debug2,
/client/proc/admin_ghost,
/client/proc/kill_air,
/client/proc/ZASSettings,
/client/proc/cmd_debug_make_powernets,
/client/proc/kill_airgroup,
/client/proc/debug_controller,
/client/proc/cmd_debug_mob_lists,
/client/proc/cmd_admin_delete,
/client/proc/cmd_debug_del_all,
/datum/admins/proc/restart,
/client/proc/air_report,
/client/proc/reload_admins,
/client/proc/restart_controller,
/client/proc/enable_debug_verbs,
/client/proc/toggledebuglogs,
/client/proc/cmd_dev_say,
/client/proc/cmd_dev_bst,
/client/proc/cmd_dev_reset_gravity,
/client/proc/cmd_dev_reset_floating,
/client/proc/togglescopeslogs
)
var/list/admin_verbs_spawn = list(
/datum/admins/proc/spawn_atom, /*allows us to spawn instances*/
/client/proc/respawn_character
)
var/list/admin_verbs_server = list(
/client/proc/Set_Holiday,
/client/proc/ToRban,
/datum/admins/proc/startnow,
/datum/admins/proc/restart,
/datum/admins/proc/delay,
/datum/admins/proc/toggleaban,
/client/proc/toggle_log_hrefs,
/datum/admins/proc/immreboot,
/client/proc/everyone_random,
/datum/admins/proc/toggleAI,
/client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/
/client/proc/cmd_debug_del_all,
/client/proc/SDQL_query,
/client/proc/SDQL2_query,
/datum/admins/proc/adrev,
/datum/admins/proc/adspawn,
/datum/admins/proc/adjump,
/datum/admins/proc/toggle_aliens,
/datum/admins/proc/toggle_space_ninja,
/client/proc/toggle_random_events,
/client/proc/check_customitem_activity,
/client/proc/nanomapgen_DumpImage
)
var/list/admin_verbs_debug = list(
/client/proc/getruntimelog, /*allows us to access runtime logs to somebody*/
/client/proc/cmd_admin_list_open_jobs,
/datum/admins/proc/restart,
/datum/admins/proc/delay,
/client/proc/Debug2,
/client/proc/kill_air,
/client/proc/ZASSettings,
/client/proc/cmd_debug_make_powernets,
/client/proc/kill_airgroup,
/client/proc/debug_controller,
/client/proc/cmd_debug_mob_lists,
/client/proc/cmd_admin_delete,
/client/proc/cmd_debug_del_all,
/client/proc/cmd_debug_tog_aliens,
/client/proc/air_report,
/client/proc/reload_admins,
/client/proc/restart_controller,
/client/proc/remake_distribution_map,
/client/proc/show_distribution_map,
/client/proc/enable_debug_verbs,
/client/proc/callproc,
/client/proc/toggledebuglogs,
/client/proc/cmd_dev_reset_gravity,
/client/proc/cmd_dev_reset_floating,
/client/proc/fillspace,
/client/proc/hide_activity
)
var/list/admin_verbs_possess = list(
/proc/possess,
/proc/release
)
var/list/admin_verbs_permissions = list(
/client/proc/edit_admin_permissions
)
var/list/admin_verbs_rejuv = list(
/client/proc/respawn_character
)
//verbs which can be hidden - needs work
var/list/admin_verbs_hideable = list(
/client/proc/set_ooc,
/client/proc/deadmin_self,
// /client/proc/deadchat,
/client/proc/toggleprayers,
/client/proc/toggle_hear_radio,
/datum/admins/proc/show_traitor_panel,
/datum/admins/proc/toggleenter,
/datum/admins/proc/toggleguests,
/datum/admins/proc/announce,
/client/proc/colorooc,
/client/proc/admin_ghost,
/client/proc/toggle_view_range,
/datum/admins/proc/view_txt_log,
/datum/admins/proc/view_atk_log,
/client/proc/cmd_admin_subtle_message,
/client/proc/cmd_admin_check_contents,
/datum/admins/proc/access_news_network,
/client/proc/admin_call_shuttle,
/client/proc/admin_cancel_shuttle,
/client/proc/cmd_admin_direct_narrate,
/client/proc/cmd_admin_world_narrate,
/client/proc/check_words,
/client/proc/play_local_sound,
/client/proc/play_sound,
/client/proc/object_talk,
/client/proc/cmd_admin_dress,
/client/proc/cmd_admin_gib_self,
/client/proc/drop_bomb,
/client/proc/cinematic,
/datum/admins/proc/toggle_aliens,
/datum/admins/proc/toggle_space_ninja,
/client/proc/send_space_ninja,
/client/proc/cmd_admin_add_freeform_ai_law,
/client/proc/cmd_admin_add_random_ai_law,
/client/proc/cmd_admin_create_centcom_report,
/client/proc/make_sound,
/client/proc/make_area_sound,
/client/proc/toggle_random_events,
/client/proc/cmd_admin_add_random_ai_law,
/client/proc/Set_Holiday,
/client/proc/ToRban,
/datum/admins/proc/startnow,
/datum/admins/proc/restart,
/datum/admins/proc/delay,
/datum/admins/proc/toggleaban,
/client/proc/toggle_log_hrefs,
/datum/admins/proc/immreboot,
/client/proc/everyone_random,
/datum/admins/proc/toggleAI,
/datum/admins/proc/adrev,
/datum/admins/proc/adspawn,
/datum/admins/proc/adjump,
/client/proc/restart_controller,
/client/proc/cmd_admin_list_open_jobs,
/client/proc/callproc,
/client/proc/Debug2,
/client/proc/reload_admins,
/client/proc/kill_air,
/client/proc/cmd_debug_make_powernets,
/client/proc/kill_airgroup,
/client/proc/debug_controller,
/client/proc/startSinglo,
/client/proc/cmd_debug_mob_lists,
/client/proc/cmd_debug_del_all,
/client/proc/cmd_debug_tog_aliens,
/client/proc/air_report,
/client/proc/enable_debug_verbs,
/proc/possess,
/proc/release
)
var/list/admin_verbs_mod = list(
/client/proc/check_antagonists, /*shows all antags*/
/client/proc/cmd_admin_check_contents,
/client/proc/cmd_admin_wind,
/client/proc/cmd_admin_unwind,
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/
/client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game.*/
/client/proc/toggleattacklogs,
/client/proc/toggledebuglogs,
/client/proc/toggleprayers,
/datum/admins/proc/PlayerNotes,
/client/proc/cmd_mentor_check_new_players,
/client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/
/client/proc/cmd_mod_say,
/client/proc/check_ai_laws,
/datum/admins/proc/show_player_info,
/client/proc/player_panel_new,
/client/proc/dsay,
/datum/admins/proc/show_skills,
/datum/admins/proc/show_player_panel,
/client/proc/check_antagonists,
/client/proc/jobbans,
/client/proc/cmd_admin_subtle_message /*send an message to somebody as a 'voice in their head'*/
)
/client/proc/add_admin_verbs()
if(holder)
verbs += admin_verbs_default
if(holder.rights & R_BUILDMODE) verbs += /client/proc/togglebuildmodeself
if(holder.rights & R_ADMIN) verbs += admin_verbs_admin
if(holder.rights & R_BAN) verbs += admin_verbs_ban
if(holder.rights & R_FUN) verbs += admin_verbs_fun
if(holder.rights & R_SERVER) verbs += admin_verbs_server
if(holder.rights & R_DEBUG) verbs += admin_verbs_debug
if(holder.rights & R_POSSESS) verbs += admin_verbs_possess
if(holder.rights & R_PERMISSIONS) verbs += admin_verbs_permissions
if(holder.rights & R_STEALTH) verbs += /client/proc/stealth
if(holder.rights & R_REJUVINATE) verbs += admin_verbs_rejuv
if(holder.rights & R_SOUNDS) verbs += admin_verbs_sounds
if(holder.rights & R_SPAWN) verbs += admin_verbs_spawn
if(holder.rights & R_MOD) verbs += admin_verbs_mod
if(holder.rights & R_DEV) verbs += admin_verbs_dev
/client/proc/remove_admin_verbs()
verbs.Remove(
admin_verbs_default,
/client/proc/togglebuildmodeself,
admin_verbs_admin,
admin_verbs_ban,
admin_verbs_fun,
admin_verbs_server,
admin_verbs_debug,
admin_verbs_possess,
admin_verbs_permissions,
/client/proc/stealth,
admin_verbs_rejuv,
admin_verbs_sounds,
admin_verbs_spawn,
admin_verbs_dev,
/*Debug verbs added by "show debug verbs"*/
/client/proc/Cell,
/client/proc/do_not_use_these,
/client/proc/camera_view,
/client/proc/sec_camera_report,
/client/proc/intercom_view,
/client/proc/air_status,
/client/proc/atmosscan,
/client/proc/powerdebug,
/client/proc/count_objects_on_z_level,
/client/proc/count_objects_all,
/client/proc/cmd_assume_direct_control,
/client/proc/jump_to_dead_group,
/client/proc/startSinglo,
/client/proc/ticklag,
/client/proc/cmd_admin_grantfullaccess,
/client/proc/kaboom,
/client/proc/splash,
/client/proc/cmd_admin_areatest,
/client/proc/view_power_update_stats_area,
/client/proc/view_power_update_stats_machines,
/client/proc/toggle_power_update_profiling,
/client/proc/atmos_toggle_debug
)
*/
/client/proc/hide_most_verbs()//Allows you to keep some functionality while hiding some verbs
set name = "Adminverbs - Hide Most"
set category = "Admin"
+2 -2
View File
@@ -73,7 +73,7 @@ DEBUG
return
//Job permabans
var/DBQuery/query = dbcon.NewQuery("SELECT ckey, job FROM erro_ban WHERE bantype = 'JOB_PERMABAN' AND isnull(unbanned)")
var/DBQuery/query = dbcon.NewQuery("SELECT ckey, job FROM ss13_ban WHERE bantype = 'JOB_PERMABAN' AND isnull(unbanned)")
query.Execute()
while(query.NextRow())
@@ -83,7 +83,7 @@ DEBUG
jobban_keylist.Add("[ckey] - [job]")
//Job tempbans
var/DBQuery/query1 = dbcon.NewQuery("SELECT ckey, job FROM erro_ban WHERE bantype = 'JOB_TEMPBAN' AND isnull(unbanned) AND expiration_time > Now()")
var/DBQuery/query1 = dbcon.NewQuery("SELECT ckey, job FROM ss13_ban WHERE bantype = 'JOB_TEMPBAN' AND isnull(unbanned) AND expiration_time > Now()")
query1.Execute()
while(query1.NextRow())
@@ -71,7 +71,7 @@
if(!istext(adm_ckey) || !istext(new_rank))
return
var/DBQuery/select_query = dbcon.NewQuery("SELECT id FROM erro_admin WHERE ckey = '[adm_ckey]'")
var/DBQuery/select_query = dbcon.NewQuery("SELECT id FROM ss13_admin WHERE ckey = '[adm_ckey]'")
select_query.Execute()
var/new_admin = 1
@@ -107,16 +107,16 @@
admin_id = text2num(select_query.item[1])
if(new_admin)
var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO `erro_admin` (`id`, `ckey`, `rank`, `level`, `flags`) VALUES (null, '[adm_ckey]', '[new_rank]', -1, '[flags]')")
var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO `ss13_admin` (`id`, `ckey`, `rank`, `level`, `flags`) VALUES (null, '[adm_ckey]', '[new_rank]', -1, '[flags]')")
insert_query.Execute()
var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added new admin [adm_ckey] to rank [new_rank]');")
var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `ss13_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added new admin [adm_ckey] to rank [new_rank]');")
log_query.Execute()
usr << "\blue New admin added. Don't forget to manually reload the admins for the permissions to load!"
else
if(!isnull(admin_id) && isnum(admin_id))
var/DBQuery/insert_query = dbcon.NewQuery("UPDATE `erro_admin` SET rank = '[new_rank]' WHERE id = [admin_id]")
var/DBQuery/insert_query = dbcon.NewQuery("UPDATE `ss13_admin` SET rank = '[new_rank]' WHERE id = [admin_id]")
insert_query.Execute()
var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Edited the rank of [adm_ckey] to [new_rank]');")
var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `ss13_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Edited the rank of [adm_ckey] to [new_rank]');")
log_query.Execute()
usr << "\blue Admin rank changed."
@@ -149,7 +149,7 @@
if(!istext(adm_ckey) || !isnum(new_permission))
return
var/DBQuery/select_query = dbcon.NewQuery("SELECT id, flags FROM erro_admin WHERE ckey = '[adm_ckey]'")
var/DBQuery/select_query = dbcon.NewQuery("SELECT id, flags FROM ss13_admin WHERE ckey = '[adm_ckey]'")
select_query.Execute()
var/admin_id
@@ -162,14 +162,14 @@
return
if(admin_rights & new_permission) //This admin already has this permission, so we are removing it.
var/DBQuery/insert_query = dbcon.NewQuery("UPDATE `erro_admin` SET flags = [admin_rights & ~new_permission] WHERE id = [admin_id]")
var/DBQuery/insert_query = dbcon.NewQuery("UPDATE `ss13_admin` SET flags = [admin_rights & ~new_permission] WHERE id = [admin_id]")
insert_query.Execute()
var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Removed permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]');")
var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `ss13_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Removed permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]');")
log_query.Execute()
usr << "\blue Permission removed."
else //This admin doesn't have this permission, so we are adding it.
var/DBQuery/insert_query = dbcon.NewQuery("UPDATE `erro_admin` SET flags = '[admin_rights | new_permission]' WHERE id = [admin_id]")
var/DBQuery/insert_query = dbcon.NewQuery("UPDATE `ss13_admin` SET flags = '[admin_rights | new_permission]' WHERE id = [admin_id]")
insert_query.Execute()
var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]')")
var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `ss13_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]')")
log_query.Execute()
usr << "\blue Permission added."
+121 -1
View File
@@ -85,10 +85,130 @@ datum/admins/proc/notes_gethtml(var/ckey)
//Hijacking this file for BS12 playernotes functions. I like this ^ one systemm alright, but converting sounds too bothersome~ Chinsky.
//Moved stuff here because well, this is the notes file >_<
/datum/player_info/var/author // admin who authored the information
/datum/player_info/var/rank //rank of admin who made the notes
/datum/player_info/var/content // text content of the information
/datum/player_info/var/timestamp // Because this is bloody annoying
#define PLAYER_NOTES_ENTRIES_PER_PAGE 50
/datum/admins/proc/PlayerNotes()
set category = "Admin"
set name = "Player Notes"
if (!istype(src,/datum/admins))
src = usr.client.holder
/* if (!istype(src,/datum/admins))
usr << "Error: you are not an admin!"
return
*/
if(!check_rights(R_ADMIN|R_MOD))
return
if(config.ban_legacy_system)
PlayerNotesPage(1)
else
show_notes_sql()
/datum/admins/proc/PlayerNotesPage(page)
var/dat = "<B>Player notes</B><HR>"
var/savefile/S=new("data/player_notes.sav")
var/list/note_keys
S >> note_keys
if(!note_keys)
dat += "No notes found."
else
dat += "<table>"
note_keys = sortList(note_keys)
// Display the notes on the current page
var/number_pages = note_keys.len / PLAYER_NOTES_ENTRIES_PER_PAGE
// Emulate ceil(why does BYOND not have ceil)
if(number_pages != round(number_pages))
number_pages = round(number_pages) + 1
var/page_index = page - 1
if(page_index < 0 || page_index >= number_pages)
return
var/lower_bound = page_index * PLAYER_NOTES_ENTRIES_PER_PAGE + 1
var/upper_bound = (page_index + 1) * PLAYER_NOTES_ENTRIES_PER_PAGE
upper_bound = min(upper_bound, note_keys.len)
for(var/index = lower_bound, index <= upper_bound, index++)
var/t = note_keys[index]
dat += "<tr><td><a href='?src=\ref[src];notes=show;ckey=[t]'>[t]</a></td></tr>"
dat += "</table><br>"
// Display a footer to select different pages
for(var/index = 1, index <= number_pages, index++)
if(index == page)
dat += "<b>"
dat += "<a href='?src=\ref[src];notes=list;index=[index]'>[index]</a> "
if(index == page)
dat += "</b>"
usr << browse(dat, "window=player_notes;size=400x400")
/datum/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
/datum/admins/proc/show_player_info(var/key as text)
set category = "Admin"
set name = "Show Player Info"
if (!istype(src,/datum/admins))
src = usr.client.holder
if (!istype(src,/datum/admins))
usr << "Error: you are not an admin!"
return
if(config.ban_legacy_system)
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 || I.author == "Adminbot")
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")
else
show_notes_sql(key)
/proc/notes_add(var/key, var/note, var/mob/usr)
if (!key || !note)
return
//Master safety and override for SQL based noting:
if(!config.ban_legacy_system)
notes_add_sql(key, note, usr)
return
//Loading list of notes for this key
var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav")
var/list/infos
@@ -164,4 +284,4 @@ datum/admins/proc/notes_gethtml(var/ckey)
for(var/datum/player_info/I in infos)
dat += "[I.content]%0D%0Aby [I.author] ([I.rank]) on [I.timestamp]%0D%0A%0D%0A"
return dat
return dat
+275
View File
@@ -0,0 +1,275 @@
//System will now support SQL pulls for fetching player notes.
//Yay!
/proc/notes_add_sql(var/key, var/note, var/mob/usr, var/IP, var/CID)
if(!key || !note)
return
var/ckey = sanitizeSQL(key)
var/content = sanitizeSQL(note)
var/a_ckey
if(usr)
a_ckey = sanitizeSQL(usr.key)
else
a_ckey = "Adminbot"
establish_db_connection()
if(!dbcon.IsConnected())
error("SQL connection failed while trying to add a note!")
return
if(!IP || !CID)
var/DBQuery/initquery = dbcon.NewQuery("SELECT ip, computerid FROM ss13_player WHERE ckey = '[ckey]'")
initquery.Execute()
if(initquery.NextRow())
IP = initquery.item[1]
CID = initquery.item[2]
var/querycontents
if(IP && CID)
querycontents = "INSERT INTO ss13_notes (id, adddate, ckey, ip, computerid, a_ckey, content) VALUES (null, Now(), '[ckey]', '[IP]', '[CID]', '[a_ckey]', '[content]')"
else
querycontents = "INSERT INTO ss13_notes (id, adddate, ckey, ip, computerid, a_ckey, content) VALUES (null, Now(), '[ckey]', null, null, '[a_ckey]', '[content]')"
//We aren't suppose to end up here, but just in case.
if(!querycontents)
return
var/DBQuery/insertquery = dbcon.NewQuery(querycontents)
insertquery.Execute()
if(insertquery.ErrorMsg())
error("Inserting notes into SQL failed. Reason: [insertquery.ErrorMsg()].")
else
message_admins("\blue [key_name_admin(usr)] has edited [key]'s notes.")
log_admin("[key_name(usr)] has edited [key]'s notes.")
/proc/notes_edit_sql(var/noteid, var/noteedit)
if(!noteid || !noteedit)
return
establish_db_connection()
if(!dbcon.IsConnected())
error("SQL connection failed while attempting to delete a note!")
return
var/count = 0 //failsafe from unban procs
var/ackey = usr.ckey
var/ckey
var/content
var/DBQuery/initquery = dbcon.NewQuery("SELECT ckey, content FROM ss13_notes WHERE id = '[noteid]'")
initquery.Execute()
while(initquery.NextRow())
ckey = initquery.item[1]
content = initquery.item[2]
count++
if(count == 0)
usr << "\red Database update failed due to a note id not being present in the database."
error("Database update failed due to a note id not being present in the database.")
return
if(count > 1)
usr << "\red Database update failed due to multiple notes having the same ID. Contact the database admin."
error("Database update failed due to multiple notes having the same ID. Contact the database admin.")
return
switch(noteedit)
if("delete")
if(alert("Delete this note?", "Delete?", "Yes", "No") == "Yes")
var/DBQuery/deletequery = dbcon.NewQuery("UPDATE ss13_notes SET visible = 0 WHERE id = '[noteid]'")
deletequery.Execute()
message_admins("\blue [key_name_admin(usr)] deleted one of [ckey]'s notes.")
log_admin("[key_name(usr)] deleted one of [ckey]'s notes.")
else
usr << "Cancelled"
return
if("content")
var/newcontent = input("Edit this note's contents.", "New Contents", "[content]", null) as null|text
newcontent = sql_sanitize_text(newcontent)
if(!newcontent)
usr << "Cancelled"
return
var/DBQuery/editquery = dbcon.NewQuery("UPDATE ss13_notes SET content = '[newcontent]', lasteditor = '[ackey]', lasteditdate = Now(), edited = 1 WHERE id = [noteid]")
editquery.Execute()
/datum/admins/proc/show_notes_sql(var/playerckey = null, var/adminckey = null)
if(!check_rights(R_ADMIN|R_MOD))
return
if(adminckey == "Adminbot")
usr << "Adminbot is not an actual admin. You were lied to."
//The fucking size of this request would be astronomical. Please do not!
return
establish_db_connection()
if(!dbcon.IsConnected())
error("SQL connection failed while attempting to view a player's notes!")
return
var/dat = "<div align='center'><h3>Notes Look-up Panel</h3><br>"
//Totally not stealing code from the DB_ban_panel
dat += "<form method='GET' action='?src=\ref[src]'><b>Search:</b> "
dat += "<input type='hidden' name='src' value='\ref[src]'>"
dat += "<b>Ckey:</b> <input type='text' name='notessearchckey' value='[playerckey]'>"
dat += "<b>Admin ckey:</b> <input type='text' name='notessearchadmin' value='[adminckey]'>"
dat += "<input type='submit' value='search'>"
dat += "</form></div>"
dat += "<table width='90%' bgcolor='#e3e3e3' cellpadding='5' cellspacing='0' align='center'>"
dat += "<tr>"
dat += "<th width='10%'>ISSUED TO</th>"
dat += "<th width='10%'>ISSUED BY</th>"
dat += "<th width='20%'>TIME ISSUED</th>"
dat += "<th width='50%'>CONTENT</th>"
dat += "</tr>"
if(playerckey)
dat += "<tr><td align='center' colspan='4' bgcolor='white'><b><a href='?src=\ref[src];add_player_info=[playerckey]'>Add Note</a></b></td></tr>"
var/ckey = sanitizeSQL(playerckey)
var/IP
var/CID
var/DBQuery/initquery = dbcon.NewQuery("SELECT ip, computerid FROM ss13_player WHERE ckey = '[ckey]'")
initquery.Execute()
if(initquery.NextRow())
IP = initquery.item[1]
CID = initquery.item[2]
var/querycontent = "SELECT id, adddate, ckey, a_ckey, content, edited, lasteditor, lasteditdate FROM ss13_notes WHERE ckey = '[ckey]' AND visible = '1'"
if(IP)
querycontent += " OR ip = '[IP]' AND visible = '1'"
if(CID)
querycontent += " OR computerid = '[CID]' AND visible = '1'"
querycontent += " ORDER BY adddate ASC"
var/DBQuery/query = dbcon.NewQuery(querycontent)
query.Execute()
while(query.NextRow())
var/id = text2num(query.item[1])
var/date = query.item[2]
var/p_ckey = query.item[3]
var/a_ckey = query.item[4]
var/content = query.item[5]
var/edited = text2num(query.item[6])
if(adminckey && ckey(a_ckey) != ckey(adminckey))
continue
else
dat += "<tr bgcolor='#ffeeee'><td align='center'><b>[p_ckey]</b></td><td align='center'><b>[a_ckey]</b></td><td align='center'>[date]</td><td align='center'>[content]</td></tr>"
if(edited)
var/lasteditor = query.item[7]
var/editdate = query.item[8]
dat += "<tr><td align='center' colspan='4'><b>Note last edited: [editdate], by: [lasteditor].</b></td></tr>"
dat += "<tr><td align='center' colspan='4'><b>(<a href=\"byond://?src=\ref[src];dbnoteedit=delete;dbnoteid=[id]\">Delete</a>) (<a href=\"byond://?src=\ref[src];dbnoteedit=content;dbnoteid=[id]\">Edit</a>)</b></td></tr>"
dat += "<tr><td colspan='4' bgcolor='white'>&nbsp</td></tr>"
else if(adminckey && !playerckey)
var/adminkey = sanitizeSQL(adminckey)
var/aquerycontent = "SELECT id, adddate, ckey, content, edited, lasteditor, lasteditdate FROM ss13_notes WHERE a_ckey = '[ckey(adminkey)]' AND visible = '1' ORDER BY adddate ASC"
var/DBQuery/adminquery = dbcon.NewQuery(aquerycontent)
adminquery.Execute()
while(adminquery.NextRow())
var/id = text2num(adminquery.item[1])
var/date = adminquery.item[2]
var/p_ckey = adminquery.item[3]
var/content = adminquery.item[4]
var/edited = text2num(adminquery.item[5])
dat += "<tr bgcolor='#ffeeee'><td align='center'><b>[p_ckey]</b></td><td align='center'><b>[adminckey]</b></td><td align='center'>[date]</td><td align='center'>[content]</td></tr>"
if(edited)
var/lasteditor = adminquery.item[6]
var/editdate = adminquery.item[7]
dat += "<tr><td align='center' colspan='4'><b>Note last edited: [editdate], by: [lasteditor].</b></td></tr>"
dat += "<tr><td align='center' colspan='4'><b>(<a href=\"byond://?src=\ref[src];dbnoteedit=delete;dbnoteid=[id]\">Delete</a>) (<a href=\"byond://?src=\ref[src];dbnoteedit=content;dbnoteid=[id]\">Edit</a>)</b></td></tr>"
dat += "<tr><td colspan='4' bgcolor='white'>&nbsp</td></tr>"
dat += "</table>"
usr << browse(dat,"window=lookupnotes;size=900x500")
/*/proc/notes_transfer()
msg_scopes("Locating master list.")
var/savefile/note_list = new("data/player_notes.sav")
var/list/note_keys
note_list >> note_keys
msg_scopes("Establishing DB connection!")
establish_db_connection()
if(!dbcon.IsConnected())
msg_scopes("No DB connection!")
return
for(var/t in note_keys)
var/IP = null
var/CID = null
var/DBQuery/query = dbcon.NewQuery("SELECT ip, computerid FROM ss13_player WHERE ckey = '[t]'")
query.Execute()
if(query.NextRow())
IP = query.item[1]
CID = query.item[2]
var/savefile/info = new("data/player_saves/[copytext(t, 1, 2)]/[t]/info.sav")
var/list/infos
info >> infos
for(var/datum/player_info/I in infos)
var/a_ckey = sanitizeSQL(I.author)
var/timeY = copytext(I.timestamp, findtext(I.timestamp, "of") + 3)
var/timeM
var/timeD = copytext(I.timestamp, findtext(I.timestamp, " ", 6) + 1, findtext(I.timestamp, " ", 6) + 3)
if(findtext(timeD, "s") || findtext(timeD, "n") || findtext(timeD, "r") || findtext(timeD, "t"))
timeD = "0[copytext(timeD, 1, 2)]"
// msg_scopes("Timestamp: [I.timestamp].")
var/temp = copytext(I.timestamp, 6, findtext(I.timestamp, " ", 6))
// msg_scopes("The day? [timeD].")
// msg_scopes("The month? [temp].")
// msg_scopes("The year? [timeY].")
switch(temp)
if("January")
timeM = "01"
if("February")
timeM = "02"
if("March")
timeM = "03"
if("April")
timeM = "04"
if("May")
timeM = "05"
if("June")
timeM = "06"
if("July")
timeM = "07"
if("August")
timeM = "08"
if("September")
timeM = "09"
if("October")
timeM = "10"
if("November")
timeM = "11"
if("December")
timeM = "12"
var/DTG = "[timeY]-[timeM]-[timeD] 00:00:00"
// msg_scopes("Full DTG: [DTG]")
var/insertionstuff
if(IP && CID)
insertionstuff = "INSERT INTO ss13_notes (id, adddate, ckey, ip, computerid, a_ckey, content) VALUES (null, '[DTG]', '[t]', '[IP]', '[CID]', '[a_ckey]', '[I.content]')"
else
insertionstuff = "INSERT INTO ss13_notes (id, adddate, ckey, ip, computerid, a_ckey, content) VALUES (null, '[DTG]', '[t]', null, null, '[a_ckey]', '[I.content]')"
var/DBQuery/insertquery = dbcon.NewQuery(insertionstuff)
insertquery.Execute()
if(insertquery.ErrorMsg())
msg_scopes(insertquery.ErrorMsg())
else
msg_scopes("Transfer successful.")*/
+42 -4
View File
@@ -297,7 +297,7 @@
if("queen") M.change_mob_type( /mob/living/carbon/alien/humanoid/queen , null, null, delmob )
if("sentinel") M.change_mob_type( /mob/living/carbon/alien/humanoid/sentinel , null, null, delmob )
if("larva") M.change_mob_type( /mob/living/carbon/alien/larva , null, null, delmob )
if("nymph") M.change_mob_type( /mob/living/carbon/alien/diona , null, null, delmob )
if("nymph") M.change_mob_type( /mob/living/carbon/monkey/diona , null, null, delmob )
if("human") M.change_mob_type( /mob/living/carbon/human , null, null, delmob )
if("slime") M.change_mob_type( /mob/living/carbon/slime , null, null, delmob )
if("monkey") M.change_mob_type( /mob/living/carbon/monkey , null, null, delmob )
@@ -908,6 +908,9 @@
log_admin("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.")
message_admins("\blue[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.")
if(!config.ban_legacy_system)
notes_add_sql(M.ckey, "Banned for: [reason]. Duration: [mins] minutes.", usr, M.lastKnownIP, M.computer_id)
del(M.client)
//del(M) // See no reason why to delete mob. Important stuff can be lost. And ban can be lifted before round ends.
if("No")
@@ -933,6 +936,9 @@
feedback_inc("ban_perma",1)
DB_ban_record(BANTYPE_PERMA, M, -1, reason)
if(!config.ban_legacy_system)
notes_add_sql(M.ckey, "Banned for: [reason]. The ban is permanent.", usr, M.lastKnownIP, M.computer_id)
del(M.client)
//del(M)
if("Cancel")
@@ -2763,7 +2769,19 @@
var/add = input("Add Player Info") as null|text
if(!add) return
notes_add(key,add,usr)
if(config.ban_legacy_system)
notes_add(key,add,usr)
else
var/IP
var/CID
if(directory[key])
var/client/C = directory[key]
if(C)
IP = C.address
CID = C.computer_id
notes_add_sql(key, add, usr, IP, CID)
show_player_info(key)
if(href_list["remove_player_info"])
@@ -2825,10 +2843,14 @@
if(!check_rights(R_ADMIN|R_MOD)) return
var/mob/M = locate(href_list["admindibs"])
if(!M || !M.client)
usr << "<font color=red><b>The client has lost connection.</b></font>"
return
if(M.client.adminhelped == 2)
log_admin("[key_name(usr)] called dibs on [key_name(M)]'s adminhelp!")
message_admins("[key_name_admin(usr)] has called dibs on [key_name_admin(M)]'s adminhelp!")
message_mods("[key_name_admin(usr)] has called dibs on [key_name_admin(M)]'s adminhelp!")
message_admins("[key_name_admin(usr)] has called <font color=red>dibs</font> on [key_name_admin(M)]'s adminhelp!")
message_mods("[key_name_admin(usr)] has called <font color=red>dibs</font> on [key_name_admin(M)]'s adminhelp!")
usr << "<font color=blue><b>You have taken over [key_name_admin(M)]'s adminhelp.</b></font>"
usr << "[get_options_bar(M, 2, 1, 1)]"
@@ -2836,4 +2858,20 @@
M.client.adminhelped = 1
else
usr << "<font color=red><b>The adminhelp has already been claimed.</b></font>"
return
else if(href_list["dbnoteedit"])
var/noteedit = href_list["dbnoteedit"]
var/noteid = text2num(href_list["dbnoteid"])
if(!noteedit || !noteid)
return
notes_edit_sql(noteid, noteedit)
return
else if(href_list["notessearchckey"] || href_list["notessearchadmin"])
var/adminckey = href_list["notessearchadmin"]
var/playerckey = href_list["notessearchckey"]
show_notes_sql(playerckey, adminckey)
return
+12 -5
View File
@@ -78,7 +78,7 @@
else
recieve_color = "maroon"
send_pm_type = holder.rank + " "
if(!C.holder && holder && holder.fakekey)
if(!C.holder && holder && holder.fakekey)
recieve_pm_type = "Admin"
else
recieve_pm_type = holder.rank
@@ -108,9 +108,16 @@
adminhelp(reply) //sender has left, adminhelp instead
return
recieve_message = "<font color='[recieve_color]'>[recieve_pm_type] PM from-<b>[get_options_bar(src, C.holder ? 1 : 0, C.holder ? 1 : 0, 1)]</b>: [msg]</font>"
var/options = ""
if(C.holder && C.holder.rights & (R_ADMIN|R_MOD|R_FUN|R_DEV))
options = "[get_options_bar(src, 1, 1, 1)]" //Gib the information om nom nom
else
options = "[get_options_bar(src, 0, 0, 1)]" //Hide it, just gib name
recieve_message = "<font color='[recieve_color]'>[recieve_pm_type] PM from-<b>[options]</b>: [msg]</font>"
C << recieve_message
src << "<font color='blue'>[send_pm_type]PM to-<b>[get_options_bar(C, holder ? 1 : 0, holder ? 1 : 0, 1)]</b>: [msg]</font>"
src << "<font color='blue'>[send_pm_type]PM to-<b>[get_options_bar(C, 0, 0, 1)]</b>: [msg]</font>"
//play the recieving admin the adminhelp sound (if they have them enabled)
//non-admins shouldn't be able to disable this
@@ -124,7 +131,7 @@
//check client/X is an admin and isn't the sender or recipient
if(X == C || X == src)
continue
if(X.key!=key && X.key!=C.key && (X.holder.rights & R_ADMIN) || (X.holder.rights & R_MOD) )
if(X.key != key && X.key != C.key && (X.holder.rights & (R_ADMIN|R_MOD)))
X << "<B><font color='blue'>PM: [key_name(src, X, 0)]-&gt;[key_name(C, X, 0)]:</B> \blue [msg]</font>" //inform X
/client/proc/cmd_admin_irc_pm()
@@ -152,6 +159,6 @@
for(var/client/X in admins)
if(X == src)
continue
if((X.holder.rights & R_ADMIN) || (X.holder.rights & R_MOD))
if(X.holder.rights & (R_ADMIN|R_MOD))
X << "<B><font color='blue'>PM: [key_name(src, X, 0)]-&gt;IRC-Admins:</B> \blue [msg]</font>"
@@ -36,7 +36,7 @@ var/inactive_keys = "None<br>"
//grab all ckeys associated with custom items
var/list/ckeys_with_customitems = list()
var/DBQuery/query_ckeys = dbcon.NewQuery("SELECT ckey FROM aurora_customitems")
var/DBQuery/query_ckeys = dbcon.NewQuery("SELECT ckey FROM ss13_customitems")
query_ckeys.Execute()
while(query_ckeys.NextRow())
var/cur_key = query_ckeys.item[1]
@@ -46,7 +46,7 @@ var/inactive_keys = "None<br>"
//run a query to get all ckeys inactive for over 2 months
var/list/inactive_ckeys = list()
if(ckeys_with_customitems.len)
var/DBQuery/query_inactive = dbcon.NewQuery("SELECT ckey, lastseen FROM erro_player WHERE datediff(Now(), lastseen) > 60")
var/DBQuery/query_inactive = dbcon.NewQuery("SELECT ckey, lastseen FROM ss13_player WHERE datediff(Now(), lastseen) > 60")
query_inactive.Execute()
while(query_inactive.NextRow())
var/cur_ckey = query_inactive.item[1]
@@ -58,7 +58,7 @@ var/inactive_keys = "None<br>"
//if there are ckeys left over, check whether they have a database entry at all
if(ckeys_with_customitems.len)
for(var/cur_ckey in ckeys_with_customitems)
var/DBQuery/query_inactive = dbcon.NewQuery("SELECT ckey FROM erro_player WHERE ckey = '[cur_ckey]'")
var/DBQuery/query_inactive = dbcon.NewQuery("SELECT ckey FROM ss13_player WHERE ckey = '[cur_ckey]'")
query_inactive.Execute()
if(!query_inactive.RowCount())
inactive_ckeys += cur_ckey
+11 -7
View File
@@ -30,10 +30,12 @@
stafftype = "EVENT"
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
if (!msg) //We don't want to log empty messages
return
log_admin("DSAY: [key_name(src)] : [msg]")
if (!msg)
return
var/rendered = "<span class='game deadsay'><span class='prefix'>DEAD:</span> <span class='name'>[stafftype]([src.holder.fakekey ? pick("BADMIN", "hornigranny", "TLF", "scaredforshadows", "KSI", "Silnazi", "HerpEs", "BJ69", "SpoofedEdd", "Uhangay", "Wario90900", "Regarity", "MissPhareon", "LastFish", "unMportant", "Deurpyn", "Fatbeaver") : src.key])</span> says, <span class='message'>\"[msg]\"</span></span>"
@@ -44,12 +46,14 @@
if(!M.client)
continue
if(M.client && M.client.holder && (M.client.prefs.toggles & CHAT_DEAD)) // show the message to admins who have deadchat toggled on
if((M.client.holder.rights & R_DUTYOFF) && !(M.client.holder.rights & (R_ADMIN|R_MOD|R_DEV|R_FUN)))
continue
M.show_message(rendered, 2)
if(!(M.client.prefs.toggles & CHAT_DEAD))
continue
else if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_DEAD)) // show the message to regular ghosts who have deadchat toggled on
if(M.client.holder && (M.client.holder.rights & (R_ADMIN|R_MOD|R_DEV|R_FUN))) // show the message to admins who have deadchat toggled on
M.show_message(rendered, 2)
continue
if(M.stat == DEAD) // show the message to regular ghosts who have deadchat toggled on
M.show_message(rendered, 2)
feedback_add_details("admin_verb","D") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+8 -6
View File
@@ -565,8 +565,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
"central command duty officer",
"nanotrasen officer",
"nanotrasen captain",
"shadowling"
// "iac_medic"
"shadowling",
"iac_medic"
)
var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in dresspacks
if (isnull(dresscode))
@@ -1127,14 +1127,15 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
W.assignment = "Field Operator"
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
/* REMOVED BECAUSE STUCK
if("iac_medic")
var/obj/item/clothing/under/rank/medical/iac = new(M)
iac.aband = new /obj/item/clothing/tie/armband/iac(iac)
iac.aband = new /obj/item/clothing/tie/armband/iac_armband(iac)
M.equip_to_slot_or_del(iac, slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/iac(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/iac_vest(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/beret/iac(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/latex(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(M), slot_l_ear)
@@ -1156,6 +1157,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/device/flash(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/emt(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(M), slot_s_store)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/iac(M.back), slot_in_backpack)
var/obj/item/weapon/card/id/silver/W = new(src)
W.name = "[M.real_name]'s ID Card"
@@ -1165,7 +1167,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
W.assignment = "IAC Worker"
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
*/
M.regenerate_icons()
log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].")
+64 -11
View File
@@ -108,12 +108,17 @@
ip = C.address
var/a_ckey = sanitizeSQL(ckey)
var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO aurora_warnings (id, time, severity, reason, notes, ckey, computerid, ip, a_ckey) VALUES (null, Now(), '[severity]', '[reason]', '[notes]', '[sqlkey]', '[computerid]', '[ip]', '[a_ckey]')")
var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO ss13_warnings (id, time, severity, reason, notes, ckey, computerid, ip, a_ckey) VALUES (null, Now(), '[severity]', '[reason]', '[notes]', '[sqlkey]', '[computerid]', '[ip]', '[a_ckey]')")
query_insert.Execute()
notes_add(warned_ckey, "Warning added by [a_ckey], for: [reason]. || Notes regarding the warning: [notes].")
if(config.ban_legacy_system)
notes_add(warned_ckey, "Warning added by [a_ckey], for: [reason]. || Notes regarding the warning: [notes].")
else
notes_add_sql(warned_ckey, "Warning added by [a_ckey], for: [reason]. || Notes regarding the warning: [notes].", src, ip, computerid)
feedback_add_details("admin_verb","WARN-DB")
if(C)
C << "<font color='red'><BIG><B>You have been formally warned by an administrator.</B></BIG><br>You can look up your warnings through the OOC panel, with the 'My Warnings' button.</font>"
C << "<font color='red'><BIG><B>You have been formally warned by an administrator.</B></BIG><br>Click <a href='byond://?src=\ref[src];warnview=1'>here</a> to review and acknowledge them!</font>"
message_admins("[key_name_admin(src)] has warned [warned_ckey] for: [reason].")
message_mods("[key_name_admin(src)] has warned [warned_ckey].")
@@ -121,7 +126,7 @@
* A proc for a player to check their own warnings
*/
/client/verb/check_warns()
/client/verb/warnings_check()
set name = "My warnings"
set category = "OOC"
set desc = "Display warnings issued to you."
@@ -146,18 +151,20 @@
var/sqlkey = sanitizeSQL(ckey)
var/DBQuery/search_query = dbcon.NewQuery("SELECT time, severity, reason, a_ckey FROM aurora_warnings WHERE ckey='[sqlkey]' ORDER BY time DESC")
var/DBQuery/search_query = dbcon.NewQuery("SELECT id, time, severity, reason, a_ckey, acknowledged FROM ss13_warnings WHERE visible = '1' AND (ckey='[sqlkey]' OR computerid='[computer_id]' OR ip='[address]') ORDER BY time DESC")
search_query.Execute()
while(search_query.NextRow())
var/time = search_query.item[1]
var/severity = search_query.item[2]
var/reason = search_query.item[3]
var/a_ckey = search_query.item[4]
var/id = text2num(search_query.item[1])
var/time = search_query.item[2]
var/severity = text2num(search_query.item[3])
var/reason = search_query.item[4]
var/a_ckey = search_query.item[5]
var/ackn = text2num(search_query.item[6])
var/bgcolor = lcolor
if(severity == "1")
if(severity)
bgcolor = dcolor
dat += "<tr bgcolor='[bgcolor]' align='center'>"
@@ -166,6 +173,11 @@
dat += "<td>[reason]</td>"
dat += "</tr>"
if(!ackn)
dat += "<tr><td align='center' colspan='3'><b>(<a href='byond://?src=\ref[src];warnacknowledge=[id]'>Acknowledge Warning</a>)</b></td></tr>"
else
dat += "<tr><td align='center' colspan='3'><b>Warning Acknowledged!</b></td></tr>"
dat += "<tr>"
dat += "<td colspan='5' bgcolor='white'>&nbsp</td>"
dat += "</tr>"
@@ -173,6 +185,47 @@
dat += "</table>"
usr << browse(dat, "window=mywarnings;size=900x500")
/*
* A proc for acknowledging a warning, so you don't get pestered about it anymore.
*/
/client/proc/warnings_acknowledge(id)
if(!id)
return
establish_db_connection()
if(!dbcon.IsConnected())
error("Connection to SQL database failed while attempting to update a player's warnings.")
return
var/DBQuery/query = dbcon.NewQuery("UPDATE ss13_warnings SET acknowledged = 1 WHERE id = '[id]'")
query.Execute()
warnings_check()
/*
* A proc to alert you if you have unacknowledged warnings.
* Called in /client/New (client procs.dm)
*/
/client/proc/warnings_alert()
var/sqlkey = sanitizeSQL(ckey)
var/count = 0
establish_db_connection()
if(!dbcon.IsConnected())
error("Connection to SQL database failed while attempting to alert a player of their warnings.")
return
var/DBQuery/query = dbcon.NewQuery("SELECT id FROM ss13_warnings WHERE (visible = '1' AND acknowledged = '0') AND (ckey='[sqlkey]' OR computerid='[computer_id]' OR ip='[address]')")
query.Execute()
while(query.NextRow())
count++
if(count)
src << "<br>"
src << "<font color=red><b>You have [count] unread [count > 1 ? "warnings" : "warning"]! Click <a href='byond://?src=\ref[src];warnview=1'>here</a> to review and acknowledge them!</b></font>"
/*
* A proc for an admin/moderator to look up a member's warnings.
*/
@@ -229,7 +282,7 @@
if(playerckey)
paramtwo = "AND ckey = '[playerckey]' "
var/DBQuery/search_query = dbcon.NewQuery("SELECT time, severity, reason, notes, ckey, a_ckey FROM aurora_warnings WHERE 1 [paramone] [paramtwo] ORDER BY time DESC")
var/DBQuery/search_query = dbcon.NewQuery("SELECT time, severity, reason, notes, ckey, a_ckey FROM ss13_warnings WHERE 1 [paramone] [paramtwo] ORDER BY time DESC")
search_query.Execute()
while(search_query.NextRow())
+2 -2
View File
@@ -45,7 +45,7 @@ datum/sqlnews/proc/update() //Updates the stored variables and preppes it for a
fails++
return
var/DBQuery/query = dbcon.NewQuery("SELECT id, publishtime FROM aurora_news WHERE isnull(notpublishing) ORDER BY publishtime ASC LIMIT [count],1")
var/DBQuery/query = dbcon.NewQuery("SELECT id, publishtime FROM ss13_news WHERE isnull(notpublishing) ORDER BY publishtime ASC LIMIT [count],1")
query.Execute()
if(!query.RowCount())
@@ -68,7 +68,7 @@ datum/sqlnews/proc/publish() //Uses data stored from the update() proc and: pull
fails++
return
var/DBQuery/fetchquery = dbcon.NewQuery("SELECT channel, author, body FROM aurora_news WHERE id=[id]")
var/DBQuery/fetchquery = dbcon.NewQuery("SELECT channel, author, body FROM ss13_news WHERE id=[id]")
fetchquery.Execute()
while(fetchquery.NextRow())
+2 -2
View File
@@ -20,7 +20,7 @@
switch(screen)
if(1)
var/DBQuery/query = dbcon.NewQuery("SELECT id, name FROM aurora_directives")
var/DBQuery/query = dbcon.NewQuery("SELECT id, name FROM ss13_directives")
query.Execute()
dat += "<div align='center'><table width='90%' cellpadding='2' cellspacing='0'>"
dat += "<tr><td colspan='3' bgcolor='white' align='center'><a href='?src=\ref[src];directivescreen=3'>Regarding Station Directives</a><br></td></tr>"
@@ -38,7 +38,7 @@
if(!queryid)
return //this should never happen
var/DBQuery/searchquery = dbcon.NewQuery("SELECT id, name, data FROM aurora_directives WHERE id=[queryid]")
var/DBQuery/searchquery = dbcon.NewQuery("SELECT id, name, data FROM ss13_directives WHERE id=[queryid]")
searchquery.Execute()
while(searchquery.NextRow())
+15 -6
View File
@@ -79,6 +79,13 @@
var/queryid = sanitizeSQL(href_list["directiveview"])
directiveslookup(2, queryid)
if(href_list["warnacknowledge"])
var/queryid = text2num(href_list["warnacknowledge"])
warnings_acknowledge(queryid)
if(href_list["warnview"])
warnings_check()
..() //redirect to hsrc.Topic()
/client/proc/handle_spam_prevention(var/message, var/mute_type)
@@ -175,6 +182,8 @@
if(!dsay_allowed)
src << "<span class='alert'>Deadchat is Disabled</span>"
warnings_alert()
log_client_to_db()
send_resources()
@@ -207,7 +216,7 @@
var/sql_ckey = sql_sanitize_text(src.ckey)
var/DBQuery/query = dbcon.NewQuery("SELECT id, datediff(Now(),firstseen) as age FROM erro_player WHERE ckey = '[sql_ckey]'")
var/DBQuery/query = dbcon.NewQuery("SELECT id, datediff(Now(),firstseen) as age FROM ss13_player WHERE ckey = '[sql_ckey]'")
query.Execute()
var/sql_id = 0
player_age = 0 // New players won't have an entry so knowing we have a connection we set this to zero to be updated if their is a record.
@@ -216,14 +225,14 @@
player_age = text2num(query.item[2])
break
var/DBQuery/query_ip = dbcon.NewQuery("SELECT ckey FROM erro_player WHERE ip = '[address]'")
var/DBQuery/query_ip = dbcon.NewQuery("SELECT ckey FROM ss13_player WHERE ip = '[address]'")
query_ip.Execute()
related_accounts_ip = ""
while(query_ip.NextRow())
related_accounts_ip += "[query_ip.item[1]], "
break
var/DBQuery/query_cid = dbcon.NewQuery("SELECT ckey FROM erro_player WHERE computerid = '[computer_id]'")
var/DBQuery/query_cid = dbcon.NewQuery("SELECT ckey FROM ss13_player WHERE computerid = '[computer_id]'")
query_cid.Execute()
related_accounts_cid = ""
while(query_cid.NextRow())
@@ -248,16 +257,16 @@
if(sql_id)
//Player already identified previously, we need to just update the 'lastseen', 'ip' and 'computer_id' variables
var/DBQuery/query_update = dbcon.NewQuery("UPDATE erro_player SET lastseen = Now(), ip = '[sql_ip]', computerid = '[sql_computerid]', lastadminrank = '[sql_admin_rank]' WHERE id = [sql_id]")
var/DBQuery/query_update = dbcon.NewQuery("UPDATE ss13_player SET lastseen = Now(), ip = '[sql_ip]', computerid = '[sql_computerid]', lastadminrank = '[sql_admin_rank]' WHERE id = [sql_id]")
query_update.Execute()
else
//New player!! Need to insert all the stuff
var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO erro_player (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, '[sql_ckey]', Now(), Now(), '[sql_ip]', '[sql_computerid]', '[sql_admin_rank]')")
var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO ss13_player (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, '[sql_ckey]', Now(), Now(), '[sql_ip]', '[sql_computerid]', '[sql_admin_rank]')")
query_insert.Execute()
//Logging player access
var/serverip = "[world.internet_address]:[world.port]"
var/DBQuery/query_accesslog = dbcon.NewQuery("INSERT INTO `erro_connection_log`(`id`,`datetime`,`serverip`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),'[serverip]','[sql_ckey]','[sql_ip]','[sql_computerid]');")
var/DBQuery/query_accesslog = dbcon.NewQuery("INSERT INTO `ss13_connection_log`(`id`,`datetime`,`serverip`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),'[serverip]','[sql_ckey]','[sql_ip]','[sql_computerid]');")
query_accesslog.Execute()
+9
View File
@@ -76,3 +76,12 @@
armor = list(melee = 62, bullet = 50, laser = 50,energy = 35, bomb = 10, bio = 2, rad = 0)
flags_inv = HIDEEARS
siemens_coefficient = 0.7
/obj/item/clothing/head/helmet/iac
name = "IAC helmet"
desc = "A helmet worn by medical workers of the Interstellar Aid Corps."
icon = 'icons/obj/clothing/iac_uniform.dmi'
item_state = "iac_helmet"
icon_state = "iac_helmet"
armor = list(melee = 50, bullet = 30, laser = 30,energy = 15, bomb = 10, bio = 20, rad = 0)
flags_inv = HIDEEARS|HIDEEYES
+6
View File
@@ -83,3 +83,9 @@
/obj/item/clothing/head/surgery/green
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is dark green."
icon_state = "surgcap_green"
/obj/item/clothing/head/beret/iac
name = "IAC beret"
desc = "A beret worn by medical workers of the Interstellar Aid Corps."
icon = 'icons/obj/clothing/iac_uniform.dmi'
icon_state = "iac_beret"
+9 -1
View File
@@ -396,4 +396,12 @@
else
usr << "You attempt to button-up the velcro on your [src], before promptly realising how retarded you are."
return
usr.update_inv_wear_suit()*/ //so our overlays update
usr.update_inv_wear_suit()*/ //so our overlays update
/obj/item/clothing/suit/storage/iac_vest
name = "IAC responce vest"
desc = "An high durability vest worn by medical workers of the Interstellar Aid Corps"
icon_state = "iac_bib"
item_state = "iac_bib"
icon = 'icons/obj/clothing/iac_uniform.dmi'
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 30, rad = 20)
+17
View File
@@ -42,6 +42,23 @@
has_sensor = 2
sensor_mode = 3
flags = FPRINT | TABLEPASS
var/id
/obj/item/clothing/under/color/orange/cell1
desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position.\nThis one has \"Cell 1\" marked on it."
id = "Cell 1"
/obj/item/clothing/under/color/orange/cell2
desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position.\nThis one has \"Cell 2\" marked on it."
id = "Cell 2"
/obj/item/clothing/under/color/orange/cell3
desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position.\nThis one has \"Cell 3\" marked on it."
id = "Cell 3"
/obj/item/clothing/under/color/orange/cell4
desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position.\nThis one has \"Cell 4\" marked on it."
id = "Cell 4"
/obj/item/clothing/under/color/pink
name = "pink jumpsuit"
+5 -2
View File
@@ -146,8 +146,11 @@
/obj/item/clothing/under/rank/medical/iac
name = "iac scrubs"
desc = "A change of sterile medical scrubs worn by IAC workers. Has minor protection against biohazards."
icon_state = "scrubsblue"
item_state = "scrubsblue"
icon_state = "iac_s"
icon = 'icons/obj/clothing/iac_uniform.dmi'
item_state = "iac"
item_color = "iac"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
/*
+1 -1
View File
@@ -11,7 +11,7 @@
return
var/ckeyl = sanitizeSQL(M.ckey)
var/DBQuery/query = dbcon.NewQuery("SELECT item, job, real_name FROM aurora_customitems WHERE ckey='[ckeyl]'")
var/DBQuery/query = dbcon.NewQuery("SELECT item, job, real_name FROM ss13_customitems WHERE ckey='[ckeyl]'")
query.Execute()
while(query.NextRow())
+5 -4
View File
@@ -552,6 +552,7 @@
"scanning" = scanning,
"bloodsamp" = (bloodsamp ? bloodsamp.name : ""),
"bloodsamp_desc" = (bloodsamp ? (bloodsamp.desc ? bloodsamp.desc : "No information on record.") : ""),
"lidstate" = closed
)
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
@@ -592,6 +593,9 @@
bloodsamp.loc = src.loc
bloodsamp = null
if(href_list["toggleLid"])
toggle_lid()
return 1
/obj/machinery/dnaforensics/process()
@@ -650,13 +654,10 @@
set category = "Object"
set name = "Toggle Lid"
set src in oview(1)
if(usr.stat || !(istype(usr,/mob/living/carbon/human)))
if(usr.stat || !isliving(usr))
usr << "No."
return
if(issilicon(usr))
return
if(scanning)
usr << "<span class='warning'>You can't do that while [src] is scanning!</span>"
return
+2 -1
View File
@@ -24,7 +24,7 @@
/datum/event/prison_break/start()
for(var/area/A in world)
if(istype(A, /area/security/prison) || istype(A, /area/security/brig) || istype(A, /area/security/lobby) || istype(A, /area/security/main))
if(istype(A, /area/security/prison) || istype(A, /area/security/brig) || istype(A, /area/security/lobby))
prisonAreas += A
if(prisonAreas && prisonAreas.len > 0)
@@ -35,6 +35,7 @@
/datum/event/prison_break/tick()
if(activeFor == releaseWhen)
if(prisonAreas && prisonAreas.len > 0)
msg_scopes_list(prisonAreas, "Area's")
for(var/area/A in prisonAreas)
for(var/obj/machinery/power/apc/temp_apc in A)
temp_apc.overload_lighting()
+1 -1
View File
@@ -25,7 +25,7 @@
/datum/seed/proc/request_player(var/mob/living/host)
if(!host) return
for(var/mob/dead/observer/O in player_list)
if(jobban_isbanned(O, "Dionaea") || (!is_alien_whitelisted(O, "Diona") && config.usealienwhitelist))
if(jobban_isbanned(O, "Dionaea"))
continue
if(O.client)
if(O.client.prefs.be_special & BE_PLANT && !(O.client in currently_querying))
+13 -13
View File
@@ -43,8 +43,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
<A href='?src=\ref[src];setauthor=1'>Filter by Author: [author]</A><BR>
<A href='?src=\ref[src];search=1'>\[Start Search\]</A><BR>"}
if(1)
establish_old_db_connection()
if(!dbcon_old.IsConnected())
establish_db_connection()
if(!dbcon.IsConnected())
dat += "<font color=red><b>ERROR</b>: Unable to contact External Archive. Please contact your system administrator for assistance.</font><BR>"
else if(!SQLquery)
dat += "<font color=red><b>ERROR</b>: Malformed search request. Please contact your system administrator for assistance.</font><BR>"
@@ -52,7 +52,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
dat += {"<table>
<tr><td>AUTHOR</td><td>TITLE</td><td>CATEGORY</td><td>SS<sup>13</sup>BN</td></tr>"}
var/DBQuery/query = dbcon_old.NewQuery(SQLquery)
var/DBQuery/query = dbcon.NewQuery(SQLquery)
query.Execute()
while(query.NextRow())
@@ -94,7 +94,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
author = null
author = sanitizeSQL(author)
if(href_list["search"])
SQLquery = "SELECT author, title, category, id FROM library WHERE "
SQLquery = "SELECT author, title, category, id FROM ss13_library WHERE "
if(category == "Any")
SQLquery += "author LIKE '%[author]%' AND title LIKE '%[title]%'"
else
@@ -189,15 +189,15 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
<A href='?src=\ref[src];switchscreen=0'>(Return to main menu)</A><BR>"}
if(4)
dat += "<h3>External Archive</h3>"
establish_old_db_connection()
if(!dbcon_old.IsConnected())
establish_db_connection()
if(!dbcon.IsConnected())
dat += "<font color=red><b>ERROR</b>: Unable to contact External Archive. Please contact your system administrator for assistance.</font>"
else
dat += {"<A href='?src=\ref[src];orderbyid=1'>(Order book by SS<sup>13</sup>BN)</A><BR><BR>
<table>
<tr><td>AUTHOR</td><td>TITLE</td><td>CATEGORY</td><td></td></tr>"}
var/DBQuery/query = dbcon_old.NewQuery("SELECT id, author, title, category FROM library")
var/DBQuery/query = dbcon.NewQuery("SELECT id, author, title, category FROM library")
query.Execute()
while(query.NextRow())
@@ -332,8 +332,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
if(scanner.cache.unique)
alert("This book has been rejected from the database. Aborting!")
else
establish_old_db_connection()
if(!dbcon_old.IsConnected())
establish_db_connection()
if(!dbcon.IsConnected())
alert("Connection to Archive has been severed. Aborting.")
else
/*
@@ -347,7 +347,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
var/sqlcontent = sanitizeSQL(scanner.cache.dat)
var/sqlcategory = sanitizeSQL(upload_category)
var/sqluploader = sanitizeSQL(usr.key)
var/DBQuery/query = dbcon_old.NewQuery("INSERT INTO library (author, title, content, category, uploadtime, uploader) VALUES ('[sqlauthor]', '[sqltitle]', '[sqlcontent]', '[sqlcategory]', Now(), '[sqluploader]')")
var/DBQuery/query = dbcon.NewQuery("INSERT INTO ss13_library (author, title, content, category, uploadtime, uploader) VALUES ('[sqlauthor]', '[sqltitle]', '[sqlcontent]', '[sqlcategory]', Now(), '[sqluploader]')")
if(!query.Execute())
usr << query.ErrorMsg()
else
@@ -356,8 +356,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
if(href_list["targetid"])
var/sqlid = sanitizeSQL(href_list["targetid"])
establish_old_db_connection()
if(!dbcon_old.IsConnected())
establish_db_connection()
if(!dbcon.IsConnected())
alert("Connection to Archive has been severed. Aborting.")
if(bibledelay)
for (var/mob/V in hearers(src))
@@ -366,7 +366,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
bibledelay = 1
spawn(60)
bibledelay = 0
var/DBQuery/query = dbcon_old.NewQuery("SELECT * FROM library WHERE id=[sqlid]")
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM ss13_library WHERE id=[sqlid]")
query.Execute()
while(query.NextRow())
+10 -4
View File
@@ -100,8 +100,14 @@
if(istype(M, /mob/new_player))
continue
if(M.client && M.client.holder && (M.client.holder.rights & R_ADMIN|R_MOD) && (M.client.prefs.toggles & CHAT_DEAD)) // Show the emote to admins/mods
M << message
if(!M.client)
continue
else if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_DEAD)) // Show the emote to regular ghosts with deadchat toggled on
M.show_message(message, 2)
if(M.client.prefs.toggles & CHAT_DEAD)
if(M.client.holder && M.client.holder.rights & (R_ADMIN|R_MOD)) // Show the emote to admins/mods
M << message
continue
if(M.stat == DEAD) // Show the emote to regular ghosts
M.show_message(message, 2)
@@ -14,7 +14,8 @@
prosthetic_name = "cyberbrain"
prosthetic_icon = "brain-prosthetic"
organ_tag = "brain"
organ_type = /datum/organ/internal/brain
var/mob/living/carbon/brain/brainmob = null
/obj/item/organ/brain/xeno
@@ -74,4 +75,4 @@
if(brainmob.mind)
brainmob.mind.transfer_to(target)
else
target.key = brainmob.key
target.key = brainmob.key
+4 -4
View File
@@ -287,7 +287,7 @@
usr << "\red You have nothing to drop in your hand."
return
return drop_item()
/mob/proc/throw_item(atom/target)
return
@@ -303,7 +303,7 @@
if (istype(item, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = item
item = G.throw() //throw the person instead of the grab
item = G.grabThrow() //throw the person instead of the grab
if(ismob(item))
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
var/turf/end_T = get_turf(target)
@@ -322,6 +322,8 @@
u_equip(item)
update_icons()
if(!item) return //Some items have a chance of being deleted when dropped
if (istype(usr, /mob/living/carbon)) //Check if a carbon mob is throwing. Modify/remove this line as required.
item.loc = src.loc
if(src.client)
@@ -339,14 +341,12 @@
src.inertia_dir = get_dir(target, src)
step(src, inertia_dir)
/*
if(istype(src.loc, /turf/space) || (src.flags & NOGRAV)) //they're in space, move em one space in the opposite direction
src.inertia_dir = get_dir(target, src)
step(src, inertia_dir)
*/
item.throw_at(target, item.throw_range, item.throw_speed, src)
/mob/living/carbon/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
@@ -66,6 +66,7 @@
//Ties
var/tie_msg
var/aband_msg
var/cell_msg
if(istype(w_uniform,/obj/item/clothing/under))
var/obj/item/clothing/under/U = w_uniform
if(U.hastie && U.aband)
@@ -81,12 +82,17 @@
else
aband_msg += " with \icon[U.webbing] \a [U.webbing]"
if(istype(w_uniform,/obj/item/clothing/under/color/orange))
var/obj/item/clothing/under/color/orange/V = w_uniform
if(V.id)
cell_msg = " It has a marker for \"[V.id]\" painted on the front and back."
if(w_uniform.blood_DNA)
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] blood-stained [w_uniform.name][tie_msg][aband_msg]!</span>\n"
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] blood-stained [w_uniform.name][tie_msg][aband_msg]![cell_msg]</span>\n"
else if(w_uniform.wasbloody == 2)
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] luminol-covered [w_uniform.name][tie_msg][aband_msg]!</span>\n"
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] luminol-covered [w_uniform.name][tie_msg][aband_msg]![cell_msg]</span>\n"
else
msg += "[t_He] [t_is] wearing \icon[w_uniform] \a [w_uniform][tie_msg][aband_msg].\n"
msg += "[t_He] [t_is] wearing \icon[w_uniform] \a [w_uniform][tie_msg][aband_msg].[cell_msg]\n"
//head
if(head)
@@ -22,7 +22,7 @@
if(G.cell)
if(M.a_intent == "hurt")//Stungloves. Any contact will stun the alien.
if(G.cell.charge >= 2500)
G.cell.use(2500)
G.cell.use(G.cell.charge) //So it drains the cell.
visible_message("\red <B>[src] has been touched with the stun gloves by [M]!</B>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Stungloved [src.name] ([src.ckey])</font>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been stungloved by [M.name] ([M.ckey])</font>")
@@ -31,6 +31,21 @@
var/armorblock = run_armor_check(M.zone_sel.selecting, "energy")
apply_effects(5,5,0,0,5,0,0,armorblock)
apply_damage(rand(5,25), BURN, M.zone_sel.selecting,armorblock)
if(prob(15))
playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1)
M.visible_message("\red The power source on [M]'s stun gloves overloads in a terrific fashion!", "\red Your jury rigged stun gloves malfunction!", "\red You hear a loud sparking.")
if(prob(50))
M.apply_damage(rand(1,5), BURN)
for(M in viewers(3, null))
var/safety = M:eyecheck()
if(!safety)
if(!M.blinded)
flick("flash", M.flash)
return 1
else
M << "\red Not enough charge! "
+13 -1
View File
@@ -78,6 +78,18 @@
if(!message || stat)
return
if(speaking && speaking.flags & SIGNLANG)
var/datum/organ/external/ORGAN
var/signOK = 2
ORGAN = organs_by_name["l_hand"]
if(!ORGAN || ORGAN.status == ORGAN_DESTROYED)
signOK -= 1
ORGAN = organs_by_name["r_hand"]
if(!ORGAN || ORGAN.status == ORGAN_DESTROYED)
signOK -= 1
if(!signOK)
src << "You look at where your hands used to be and a glimmer of sadness strikes you as you relise you can't do sign language anymore"
return
message_mode = null
..(message, speaking, verb, alt_name, italics, message_range)
return
@@ -208,7 +220,7 @@
//These only pertain to common. Languages are handled by mob/say_understands()
if (!speaking)
if (istype(other, /mob/living/carbon/alien/diona))
if (istype(other, /mob/living/carbon/monkey/diona))
if(other.languages.len >= 2) //They've sucked down some blood and can speak common now.
return 1
if (istype(other, /mob/living/silicon))
@@ -503,7 +503,7 @@ See code\modules\mob\new_player\preferences_setup.dm for where it's used.
deform = 'icons/mob/human_races/r_def_plant.dmi'
language = "Rootspeak"
unarmed_type = /datum/unarmed_attack/diona
primitive = /mob/living/carbon/alien/diona
primitive = /mob/living/carbon/monkey/diona
slowdown = 7
rarity_value = 3
@@ -537,7 +537,7 @@ See code\modules\mob\new_player\preferences_setup.dm for where it's used.
reagent_tag = IS_DIONA
/datum/species/diona/can_understand(var/mob/other)
var/mob/living/carbon/alien/diona/D = other
var/mob/living/carbon/monkey/diona/D = other
if(istype(D))
return 1
return 0
@@ -548,12 +548,12 @@ See code\modules\mob\new_player\preferences_setup.dm for where it's used.
/datum/species/diona/handle_death(var/mob/living/carbon/human/H)
var/mob/living/carbon/alien/diona/S = new(get_turf(H))
var/mob/living/carbon/monkey/diona/S = new(get_turf(H))
if(H.mind)
H.mind.transfer_to(S)
for(var/mob/living/carbon/alien/diona/D in H.contents)
for(var/mob/living/carbon/monkey/diona/D in H.contents)
if(D.client)
D.loc = H.loc
else
@@ -265,3 +265,6 @@
return
..(message, speaking, verb, null, null, message_range, null)
/mob/living/carbon/monkey/diona/can_use_vents()
return
+1 -1
View File
@@ -465,8 +465,8 @@
for(var/atom/A in M.contents)
if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder))
return
M.status_flags &= ~PASSEMOTES
M.status_flags &= ~PASSEMOTES
return
//Resisting control by an alien mind.
@@ -89,7 +89,8 @@
O.layer = 20 // this bit moves the target object into the robot, and moves it's location on screen
contents += O
if(istype(O,/obj/item/borg/sight))
sight_mode |= module_state_1:sight_mode
var/obj/item/borg/sight/S = O
sight_mode |= S.sight_mode
if (selected) // replaces your selection if you're swapping
select_module(selected)
@@ -135,7 +135,7 @@
wander = 0
else // My target's gone! But I might still be pissed! You there. You look like a good stinging target!
for(var/mob/living/carbon/G in view(src,7))
for(var/mob/living/carbon/human/G in view(src,7))
target_mob = G
break
@@ -0,0 +1,25 @@
//Foxxy
/mob/living/simple_animal/corgi/fox
name = "fox"
desc = "It's a fox. I wonder what it says?"
icon_state = "fox"
icon_living = "fox"
icon_dead = "fox_dead"
speak = list("Ack-Ack","Ack-Ack-Ack-Ackawoooo","Geckers","Awoo","Tchoff")
speak_emote = list("geckers", "barks")
emote_hear = list("howls","barks")
emote_see = list("shakes its head", "shivers")
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
meat_amount = 3
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
//Captain fox
/mob/living/simple_animal/corgi/fox/Chauncey
name = "Chauncey"
desc = "Chauncey, the Captain's trustworthy fox. I wonder what it says?"
+1 -1
View File
@@ -35,7 +35,7 @@
//Used by throw code to hand over the mob, instead of throwing the grab. The grab is then deleted by the throw code.
/obj/item/weapon/grab/proc/throw()
/obj/item/weapon/grab/proc/grabThrow()
if(affecting)
if(affecting.buckled)
return null
+3 -3
View File
@@ -50,7 +50,7 @@
var/isadmin = 0
if(src.client && src.client.holder)
isadmin = 1
var/DBQuery/query = dbcon.NewQuery("SELECT id FROM erro_poll_question WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM erro_poll_vote WHERE ckey = \"[ckey]\") AND id NOT IN (SELECT pollid FROM erro_poll_textreply WHERE ckey = \"[ckey]\")")
var/DBQuery/query = dbcon.NewQuery("SELECT id FROM ss13_poll_question WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM ss13_poll_vote WHERE ckey = \"[ckey]\") AND id NOT IN (SELECT pollid FROM ss13_poll_textreply WHERE ckey = \"[ckey]\")")
query.Execute()
var/newpoll = 0
while(query.NextRow())
@@ -188,7 +188,7 @@
var/voted = 0
//First check if the person has not voted yet.
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM erro_privacy WHERE ckey='[src.ckey]'")
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM ss13_privacy WHERE ckey='[src.ckey]'")
query.Execute()
while(query.NextRow())
voted = 1
@@ -213,7 +213,7 @@
return
if(!voted)
var/sql = "INSERT INTO erro_privacy VALUES (null, Now(), '[src.ckey]', '[option]')"
var/sql = "INSERT INTO ss13_privacy VALUES (null, Now(), '[src.ckey]', '[option]')"
var/DBQuery/query_insert = dbcon.NewQuery(sql)
query_insert.Execute()
usr << "<b>Thank you for your vote!</b>"
+21 -21
View File
@@ -5,7 +5,7 @@
return
var/voted = 0
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM erro_privacy WHERE ckey='[src.ckey]'")
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM ss13_privacy WHERE ckey='[src.ckey]'")
query.Execute()
while(query.NextRow())
voted = 1
@@ -53,7 +53,7 @@
if(src.client && src.client.holder)
isadmin = 1
var/DBQuery/select_query = dbcon.NewQuery("SELECT id, question FROM erro_poll_question WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime")
var/DBQuery/select_query = dbcon.NewQuery("SELECT id, question FROM ss13_poll_question WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime")
select_query.Execute()
var/output = "<div align='center'><B>Player polls</B>"
@@ -84,7 +84,7 @@
establish_db_connection()
if(dbcon.IsConnected())
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype, multiplechoiceoptions FROM erro_poll_question WHERE id = [pollid]")
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype, multiplechoiceoptions FROM ss13_poll_question WHERE id = [pollid]")
select_query.Execute()
var/pollstarttime = ""
@@ -109,7 +109,7 @@
switch(polltype)
//Polls that have enumerated options
if("OPTION")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM erro_poll_vote WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM ss13_poll_vote WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
voted_query.Execute()
var/voted = 0
@@ -121,7 +121,7 @@
var/list/datum/polloption/options = list()
var/DBQuery/options_query = dbcon.NewQuery("SELECT id, text FROM erro_poll_option WHERE pollid = [pollid]")
var/DBQuery/options_query = dbcon.NewQuery("SELECT id, text FROM ss13_poll_option WHERE pollid = [pollid]")
options_query.Execute()
while(options_query.NextRow())
var/datum/polloption/PO = new()
@@ -162,7 +162,7 @@
//Polls with a text input
if("TEXT")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT replytext FROM erro_poll_textreply WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT replytext FROM ss13_poll_textreply WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
voted_query.Execute()
var/voted = 0
@@ -204,7 +204,7 @@
//Polls with a text input
if("NUMVAL")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT o.text, v.rating FROM erro_poll_option o, erro_poll_vote v WHERE o.pollid = [pollid] AND v.ckey = '[usr.ckey]' AND o.id = v.optionid")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT o.text, v.rating FROM ss13_poll_option o, ss13_poll_vote v WHERE o.pollid = [pollid] AND v.ckey = '[usr.ckey]' AND o.id = v.optionid")
voted_query.Execute()
var/output = "<div align='center'><B>Player poll</B>"
@@ -230,7 +230,7 @@
var/minid = 999999
var/maxid = 0
var/DBQuery/option_query = dbcon.NewQuery("SELECT id, text, minval, maxval, descmin, descmid, descmax FROM erro_poll_option WHERE pollid = [pollid]")
var/DBQuery/option_query = dbcon.NewQuery("SELECT id, text, minval, maxval, descmin, descmid, descmax FROM ss13_poll_option WHERE pollid = [pollid]")
option_query.Execute()
while(option_query.NextRow())
var/optionid = text2num(option_query.item[1])
@@ -273,7 +273,7 @@
src << browse(output,"window=playerpoll;size=500x500")
if("MULTICHOICE")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM erro_poll_vote WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM ss13_poll_vote WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
voted_query.Execute()
var/list/votedfor = list()
@@ -286,7 +286,7 @@
var/maxoptionid = 0
var/minoptionid = 0
var/DBQuery/options_query = dbcon.NewQuery("SELECT id, text FROM erro_poll_option WHERE pollid = [pollid]")
var/DBQuery/options_query = dbcon.NewQuery("SELECT id, text FROM ss13_poll_option WHERE pollid = [pollid]")
options_query.Execute()
while(options_query.NextRow())
var/datum/polloption/PO = new()
@@ -345,7 +345,7 @@
establish_db_connection()
if(dbcon.IsConnected())
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype, multiplechoiceoptions FROM erro_poll_question WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime")
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype, multiplechoiceoptions FROM ss13_poll_question WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime")
select_query.Execute()
var/validpoll = 0
@@ -363,7 +363,7 @@
usr << "\red Poll is not valid."
return
var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM erro_poll_option WHERE id = [optionid] AND pollid = [pollid]")
var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM ss13_poll_option WHERE id = [optionid] AND pollid = [pollid]")
select_query2.Execute()
var/validoption = 0
@@ -378,7 +378,7 @@
var/alreadyvoted = 0
var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM erro_poll_vote WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM ss13_poll_vote WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
voted_query.Execute()
while(voted_query.NextRow())
@@ -399,7 +399,7 @@
adminrank = usr.client.holder.rank
var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO erro_poll_vote (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]')")
var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO ss13_poll_vote (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]')")
insert_query.Execute()
usr << "\blue Vote successful."
@@ -415,7 +415,7 @@
establish_db_connection()
if(dbcon.IsConnected())
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype FROM erro_poll_question WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime")
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype FROM ss13_poll_question WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime")
select_query.Execute()
var/validpoll = 0
@@ -432,7 +432,7 @@
var/alreadyvoted = 0
var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM erro_poll_textreply WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM ss13_poll_textreply WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
voted_query.Execute()
while(voted_query.NextRow())
@@ -457,7 +457,7 @@
usr << "The text you entered was blank, contained illegal characters or was too long. Please correct the text and submit again."
return
var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO erro_poll_textreply (id ,datetime ,pollid ,ckey ,ip ,replytext ,adminrank) VALUES (null, Now(), [pollid], '[usr.ckey]', '[usr.client.address]', '[replytext]', '[adminrank]')")
var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO ss13_poll_textreply (id ,datetime ,pollid ,ckey ,ip ,replytext ,adminrank) VALUES (null, Now(), [pollid], '[usr.ckey]', '[usr.client.address]', '[replytext]', '[adminrank]')")
insert_query.Execute()
usr << "\blue Feedback logging successful."
@@ -473,7 +473,7 @@
establish_db_connection()
if(dbcon.IsConnected())
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype FROM erro_poll_question WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime")
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype FROM ss13_poll_question WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime")
select_query.Execute()
var/validpoll = 0
@@ -488,7 +488,7 @@
usr << "\red Poll is not valid."
return
var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM erro_poll_option WHERE id = [optionid] AND pollid = [pollid]")
var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM ss13_poll_option WHERE id = [optionid] AND pollid = [pollid]")
select_query2.Execute()
var/validoption = 0
@@ -503,7 +503,7 @@
var/alreadyvoted = 0
var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM erro_poll_vote WHERE optionid = [optionid] AND ckey = '[usr.ckey]'")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM ss13_poll_vote WHERE optionid = [optionid] AND ckey = '[usr.ckey]'")
voted_query.Execute()
while(voted_query.NextRow())
@@ -519,7 +519,7 @@
adminrank = usr.client.holder.rank
var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO erro_poll_vote (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank, rating) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]', [(isnull(rating)) ? "null" : rating])")
var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO ss13_poll_vote (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank, rating) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]', [(isnull(rating)) ? "null" : rating])")
insert_query.Execute()
usr << "\blue Vote successful."
+1 -1
View File
@@ -53,7 +53,7 @@
del(src)
spawn(1) // So it has time to be thrown about by the gib() proc.
var/mob/living/carbon/alien/diona/D = new(get_turf(src))
var/mob/living/carbon/monkey/diona/D = new(get_turf(src))
diona.request_player(D)
del(src)
+4
View File
@@ -489,6 +489,10 @@
name = "paper- 'Standard Operating Procedure'"
info = "Alert Levels:<BR>\nBlue- Emergency<BR>\n\t1. Caused by fire<BR>\n\t2. Caused by manual interaction<BR>\n\tAction:<BR>\n\t\tClose all fire doors. These can only be opened by reseting the alarm<BR>\nRed- Ejection/Self Destruct<BR>\n\t1. Caused by module operating computer.<BR>\n\tAction:<BR>\n\t\tAfter the specified time the module will eject completely.<BR>\n<BR>\nEngine Maintenance Instructions:<BR>\n\tShut off ignition systems:<BR>\n\tActivate internal power<BR>\n\tActivate orbital balance matrix<BR>\n\tRemove volatile liquids from area<BR>\n\tWear a fire suit<BR>\n<BR>\n\tAfter<BR>\n\t\tDecontaminate<BR>\n\t\tVisit medical examiner<BR>\n<BR>\nToxin Laboratory Procedure:<BR>\n\tWear a gas mask regardless<BR>\n\tGet an oxygen tank.<BR>\n\tActivate internal atmosphere<BR>\n<BR>\n\tAfter<BR>\n\t\tDecontaminate<BR>\n\t\tVisit medical examiner<BR>\n<BR>\nDisaster Procedure:<BR>\n\tFire:<BR>\n\t\tActivate sector fire alarm.<BR>\n\t\tMove to a safe area.<BR>\n\t\tGet a fire suit<BR>\n\t\tAfter:<BR>\n\t\t\tAssess Damage<BR>\n\t\t\tRepair damages<BR>\n\t\t\tIf needed, Evacuate<BR>\n\tMeteor Shower:<BR>\n\t\tActivate fire alarm<BR>\n\t\tMove to the back of ship<BR>\n\t\tAfter<BR>\n\t\t\tRepair damage<BR>\n\t\t\tIf needed, Evacuate<BR>\n\tAccidental Reentry:<BR>\n\t\tActivate fire alarms in front of ship.<BR>\n\t\tMove volatile matter to a fire proof area!<BR>\n\t\tGet a fire suit.<BR>\n\t\tStay secure until an emergency ship arrives.<BR>\n<BR>\n\t\tIf ship does not arrive-<BR>\n\t\t\tEvacuate to a nearby safe area!"
/obj/item/weapon/paper/firingrange
name = "firing range instructions"
info = "Directions:<br><i>First you'll want to make sure there is a target stake in the center of the magnetic platform. Next, take an aluminum target from the crates back there and slip it into the stake. Make sure it clicks! Next, there should be a control console mounted on the wall somewhere in the room.<br><br> This control console dictates the behaviors of the magnetic platform, which can move your firing target around to simulate real-world combat situations. From here, you can turn off the magnets or adjust their electromagnetic levels and magnetic fields. The electricity level dictates the strength of the pull - you will usually want this to be the same value as the speed. The magnetic field level dictates how far the magnetic pull reaches.<br><br>Speed and path are the next two settings. Speed is associated with how fast the machine loops through the designated path. Paths dictate where the magnetic field will be centered at what times. There should be a pre-fabricated path input already. You can enable moving to observe how the path affects the way the stake moves. To script your own path, look at the following key:</i><br><br>N: North<br>S: South<br>E: East<br>W: West<br>C: Center<br>R: Random (results may vary)<br>; or &: separators. They are not necessary but can make the path string better visible."
/obj/item/weapon/paper/crumpled
name = "paper scrap"
icon_state = "scrap"
@@ -13,6 +13,12 @@
max_ammo = 6
multiple_sprites = 1
/obj/item/ammo_magazine/c38r
name = "speed loader (.38, rubber)"
icon_state = "38"
ammo_type = "/obj/item/ammo_casing/c38"
max_ammo = 6
multiple_sprites = 1
/obj/item/ammo_magazine/c45m
name = "magazine (.45)"
@@ -31,6 +31,10 @@
caliber = "38"
projectile_type = "/obj/item/projectile/bullet/midbullet2"
/obj/item/ammo_casing/c38r
desc = "A .38 rubber bullet casing."
caliber = "38"
projectile_type = "/obj/item/projectile/bullet/weakbullet/rubber"
/obj/item/ammo_casing/c9mm
desc = "A 9mm bullet casing."
+3 -2
View File
@@ -22,8 +22,9 @@
/obj/item/weapon/gun/projectile/New()
..()
for(var/i = 1, i <= max_shells, i++)
loaded += new ammo_type(src)
if(ammo_type) //So that we can have weapons spawn empty.
for(var/i = 1, i <= max_shells, i++)
loaded += new ammo_type(src)
update_icon()
return
@@ -158,11 +158,12 @@
/obj/item/weapon/reagent_containers/glass/beaker
name = "beaker"
desc = "A beaker. Can hold up to 50 units."
desc = "A beaker. Can hold up to 60 units."
icon = 'icons/obj/chemical.dmi'
icon_state = "beaker"
item_state = "beaker"
matter = list("glass" = 500)
volume = 60
on_reagent_change()
update_icon()
@@ -204,10 +205,10 @@
/obj/item/weapon/reagent_containers/glass/beaker/large
name = "large beaker"
desc = "A large beaker. Can hold up to 100 units."
desc = "A large beaker. Can hold up to 120 units."
icon_state = "beakerlarge"
matter = list("glass" = 5000)
volume = 100
volume = 120
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25,30,50,100)
flags = FPRINT | TABLEPASS | OPENCONTAINER
+2 -1
View File
@@ -121,7 +121,8 @@
del(G)
usr.attack_log += text("\[[time_stamp()]\] <font color='red'>Has placed [GM.name] ([GM.ckey]) in disposals.</font>")
GM.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been placed in disposals by [usr.name] ([usr.ckey])</font>")
msg_admin_attack("[key_name_admin(usr)] placed [key_name_admin(GM)] in a disposals unit. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[usr.x];Y=[usr.y];Z=[usr.z]'>JMP</a>)")
if(GM.ckey || istype(GM, /mob/living/carbon/human))
msg_admin_attack("[key_name_admin(usr)] placed [key_name_admin(GM)] in a disposals unit. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[usr.x];Y=[usr.y];Z=[usr.z]'>JMP</a>)")
return
if(!I) return
+190 -11
View File
@@ -38,6 +38,7 @@ other types of metals and chemistry for reagents).
#define CRAFTLATHE 8 //Uses fuck if I know. For use eventually.
#define MECHFAB 16 //Remember, objects utilising this flag should have construction_time and construction_cost vars.
//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable.
/var/global/list/protolathe_categories
datum/design //Datum for object designs, used in construction
var/name = "Name" //Name of the created object.
@@ -51,7 +52,7 @@ datum/design //Datum for object designs, used in construction
var/list/materials = list() //List of materials. Format: "id" = amount.
var/build_path = "" //The file path of the object that gets created
var/locked = 0 //If true it will spawn inside a lockbox with currently sec access
var/category = null //Primarily used for Mech Fabricators, but can be used for anything
var/category = "General" //Used for sorting designs. Currently by mech fabbers and the protolathe
//A proc to calculate the reliability of a design based on tech levels and innate modifiers.
@@ -586,6 +587,7 @@ datum/design/intellicard
build_type = PROTOLATHE
materials = list("$glass" = 1000, "$gold" = 200)
build_path = "/obj/item/device/aicard"
category = "Information Technology"
datum/design/paicard
name = "Personal Artificial Intelligence Card"
@@ -595,6 +597,7 @@ datum/design/paicard
build_type = PROTOLATHE
materials = list("$glass" = 500, "$metal" = 500)
build_path = "/obj/item/device/paicard"
category = "Information Technology"
datum/design/posibrain
name = "Positronic Brain"
@@ -605,6 +608,7 @@ datum/design/posibrain
build_type = PROTOLATHE
materials = list("$metal" = 2000, "$glass" = 1000, "$silver" = 1000, "$gold" = 500, "$plasma" = 500, "$diamond" = 100)
build_path = "/obj/item/device/mmi/posibrain"
category = "Information Technology"
///////////////////////////////////
//////////Mecha Module Disks///////
@@ -905,6 +909,7 @@ datum/design/design_disk
build_type = PROTOLATHE | AUTOLATHE
materials = list("$metal" = 30, "$glass" = 10)
build_path = "/obj/item/weapon/disk/design_disk"
category = "Information Technology"
datum/design/tech_disk
name = "Technology Data Storage Disk"
@@ -914,6 +919,16 @@ datum/design/tech_disk
build_type = PROTOLATHE | AUTOLATHE
materials = list("$metal" = 30, "$glass" = 10)
build_path = "/obj/item/weapon/disk/tech_disk"
category = "Information Technology"
datum/design/clone_disk
name = "Cloning Data Storage Disk"
desc = "Produce additional disks for storing genetic data."
id = "clone_disk"
req_tech = list("programming" = 1)
build_type = PROTOLATHE | AUTOLATHE
materials = list("$metal" = 30, "$glass" = 10)
build_path = "/obj/item/weapon/disk/data"
category = "Information Technology"
////////////////////////////////////////
/////////////Stock Parts////////////////
@@ -927,6 +942,7 @@ datum/design/basic_capacitor
build_type = PROTOLATHE | AUTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/stock_parts/capacitor"
category = "Components"
datum/design/basic_sensor
name = "Basic Sensor Module"
@@ -936,6 +952,7 @@ datum/design/basic_sensor
build_type = PROTOLATHE | AUTOLATHE
materials = list("$metal" = 50, "$glass" = 20)
build_path = "/obj/item/weapon/stock_parts/scanning_module"
category = "Components"
datum/design/micro_mani
name = "Micro Manipulator"
@@ -945,6 +962,7 @@ datum/design/micro_mani
build_type = PROTOLATHE | AUTOLATHE
materials = list("$metal" = 30)
build_path = "/obj/item/weapon/stock_parts/manipulator"
category = "Components"
datum/design/basic_micro_laser
name = "Basic Micro-Laser"
@@ -954,6 +972,7 @@ datum/design/basic_micro_laser
build_type = PROTOLATHE | AUTOLATHE
materials = list("$metal" = 10, "$glass" = 20)
build_path = "/obj/item/weapon/stock_parts/micro_laser"
category = "Components"
datum/design/basic_matter_bin
name = "Basic Matter Bin"
@@ -963,6 +982,7 @@ datum/design/basic_matter_bin
build_type = PROTOLATHE | AUTOLATHE
materials = list("$metal" = 80)
build_path = "/obj/item/weapon/stock_parts/matter_bin"
category = "Components"
datum/design/adv_capacitor
name = "Advanced Capacitor"
@@ -972,6 +992,7 @@ datum/design/adv_capacitor
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/stock_parts/capacitor/adv"
category = "Components"
datum/design/adv_sensor
name = "Advanced Sensor Module"
@@ -981,6 +1002,7 @@ datum/design/adv_sensor
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 20)
build_path = "/obj/item/weapon/stock_parts/scanning_module/adv"
category = "Components"
datum/design/nano_mani
name = "Nano Manipulator"
@@ -990,6 +1012,7 @@ datum/design/nano_mani
build_type = PROTOLATHE
materials = list("$metal" = 30)
build_path = "/obj/item/weapon/stock_parts/manipulator/nano"
category = "Components"
datum/design/high_micro_laser
name = "High-Power Micro-Laser"
@@ -999,6 +1022,7 @@ datum/design/high_micro_laser
build_type = PROTOLATHE
materials = list("$metal" = 10, "$glass" = 20)
build_path = "/obj/item/weapon/stock_parts/micro_laser/high"
category = "Components"
datum/design/adv_matter_bin
name = "Advanced Matter Bin"
@@ -1008,6 +1032,7 @@ datum/design/adv_matter_bin
build_type = PROTOLATHE
materials = list("$metal" = 80)
build_path = "/obj/item/weapon/stock_parts/matter_bin/adv"
category = "Components"
datum/design/super_capacitor
name = "Super Capacitor"
@@ -1018,6 +1043,7 @@ datum/design/super_capacitor
reliability_base = 71
materials = list("$metal" = 50, "$glass" = 50, "$gold" = 20)
build_path = "/obj/item/weapon/stock_parts/capacitor/super"
category = "Components"
datum/design/phasic_sensor
name = "Phasic Sensor Module"
@@ -1028,6 +1054,7 @@ datum/design/phasic_sensor
materials = list("$metal" = 50, "$glass" = 20, "$silver" = 10)
reliability_base = 72
build_path = "/obj/item/weapon/stock_parts/scanning_module/phasic"
category = "Components"
datum/design/pico_mani
name = "Pico Manipulator"
@@ -1038,6 +1065,7 @@ datum/design/pico_mani
materials = list("$metal" = 30)
reliability_base = 73
build_path = "/obj/item/weapon/stock_parts/manipulator/pico"
category = "Components"
datum/design/ultra_micro_laser
name = "Ultra-High-Power Micro-Laser"
@@ -1048,6 +1076,7 @@ datum/design/ultra_micro_laser
materials = list("$metal" = 10, "$glass" = 20, "$uranium" = 10)
reliability_base = 70
build_path = "/obj/item/weapon/stock_parts/micro_laser/ultra"
category = "Components"
datum/design/super_matter_bin
name = "Super Matter Bin"
@@ -1058,6 +1087,7 @@ datum/design/super_matter_bin
materials = list("$metal" = 80)
reliability_base = 75
build_path = "/obj/item/weapon/stock_parts/matter_bin/super"
category = "Components"
@@ -1069,6 +1099,7 @@ datum/design/subspace_ansible
build_type = PROTOLATHE
materials = list("$metal" = 80, "$silver" = 20)
build_path = "/obj/item/weapon/stock_parts/subspace/ansible"
category = "Bluespace Technology"
datum/design/hyperwave_filter
name = "Hyperwave Filter"
@@ -1078,6 +1109,7 @@ datum/design/hyperwave_filter
build_type = PROTOLATHE
materials = list("$metal" = 40, "$silver" = 10)
build_path = "/obj/item/weapon/stock_parts/subspace/filter"
category = "Bluespace Technology"
datum/design/subspace_amplifier
name = "Subspace Amplifier"
@@ -1087,6 +1119,7 @@ datum/design/subspace_amplifier
build_type = PROTOLATHE
materials = list("$metal" = 10, "$gold" = 30, "$uranium" = 15)
build_path = "/obj/item/weapon/stock_parts/subspace/amplifier"
category = "Bluespace Technology"
datum/design/subspace_treatment
name = "Subspace Treatment Disk"
@@ -1096,6 +1129,7 @@ datum/design/subspace_treatment
build_type = PROTOLATHE
materials = list("$metal" = 10, "$silver" = 20)
build_path = "/obj/item/weapon/stock_parts/subspace/treatment"
category = "Bluespace Technology"
datum/design/subspace_analyzer
name = "Subspace Analyzer"
@@ -1105,6 +1139,7 @@ datum/design/subspace_analyzer
build_type = PROTOLATHE
materials = list("$metal" = 10, "$gold" = 15)
build_path = "/obj/item/weapon/stock_parts/subspace/analyzer"
category = "Bluespace Technology"
datum/design/subspace_crystal
name = "Ansible Crystal"
@@ -1114,6 +1149,7 @@ datum/design/subspace_crystal
build_type = PROTOLATHE
materials = list("$glass" = 1000, "$silver" = 20, "$gold" = 20)
build_path = "/obj/item/weapon/stock_parts/subspace/crystal"
category = "Bluespace Technology"
datum/design/subspace_transmitter
name = "Subspace Transmitter"
@@ -1123,6 +1159,7 @@ datum/design/subspace_transmitter
build_type = PROTOLATHE
materials = list("$glass" = 100, "$silver" = 10, "$uranium" = 15)
build_path = "/obj/item/weapon/stock_parts/subspace/transmitter"
category = "Bluespace Technology"
////////////////////////////////////////
//////////////////Power/////////////////
@@ -1136,7 +1173,7 @@ datum/design/basic_cell
build_type = PROTOLATHE | AUTOLATHE |MECHFAB
materials = list("$metal" = 700, "$glass" = 50)
build_path = "/obj/item/weapon/cell"
category = "Misc"
category = "Engineering Equipment"
datum/design/high_cell
name = "High-Capacity Power Cell"
@@ -1146,7 +1183,7 @@ datum/design/high_cell
build_type = PROTOLATHE | AUTOLATHE | MECHFAB
materials = list("$metal" = 700, "$glass" = 60)
build_path = "/obj/item/weapon/cell/high"
category = "Misc"
category = "Engineering Equipment"
datum/design/super_cell
name = "Super-Capacity Power Cell"
@@ -1157,7 +1194,7 @@ datum/design/super_cell
build_type = PROTOLATHE | MECHFAB
materials = list("$metal" = 700, "$glass" = 70)
build_path = "/obj/item/weapon/cell/super"
category = "Misc"
category = "Engineering Equipment"
datum/design/hyper_cell
name = "Hyper-Capacity Power Cell"
@@ -1168,7 +1205,7 @@ datum/design/hyper_cell
build_type = PROTOLATHE | MECHFAB
materials = list("$metal" = 400, "$gold" = 150, "$silver" = 150, "$glass" = 70)
build_path = "/obj/item/weapon/cell/hyper"
category = "Misc"
category = "Engineering Equipment"
datum/design/light_replacer
name = "Light Replacer"
@@ -1178,6 +1215,8 @@ datum/design/light_replacer
build_type = PROTOLATHE
materials = list("$metal" = 1500, "$silver" = 150, "$glass" = 3000)
build_path = "/obj/item/device/lightreplacer"
category = "Engineering Equipment"
datum/design/heavy_flashlight
name = "heavy duty flashlight"
@@ -1187,6 +1226,7 @@ datum/design/heavy_flashlight
build_type = PROTOLATHE
materials = list("$metal" = 2000, "$glass" = 4000)
build_path = "/obj/item/device/flashlight/heavy"
category = "Engineering Equipment"
////////////////////////////////////////
//////////////MISC Boards///////////////
@@ -1313,6 +1353,7 @@ datum/design/mass_spectrometer
materials = list("$metal" = 30, "$glass" = 20)
reliability_base = 76
build_path = "/obj/item/device/mass_spectrometer"
category = "Medical Equipment"
datum/design/adv_mass_spectrometer
name = "Advanced Mass-Spectrometer"
@@ -1323,6 +1364,7 @@ datum/design/adv_mass_spectrometer
materials = list("$metal" = 30, "$glass" = 20)
reliability_base = 74
build_path = "/obj/item/device/mass_spectrometer/adv"
category = "Medical Equipment"
datum/design/reagent_scanner
name = "Reagent Scanner"
@@ -1333,6 +1375,7 @@ datum/design/reagent_scanner
materials = list("$metal" = 30, "$glass" = 20)
reliability_base = 76
build_path = "/obj/item/device/reagent_scanner"
category = "Medical Equipment"
datum/design/adv_reagent_scanner
name = "Advanced Reagent Scanner"
@@ -1343,6 +1386,7 @@ datum/design/adv_reagent_scanner
materials = list("$metal" = 30, "$glass" = 20)
reliability_base = 74
build_path = "/obj/item/device/reagent_scanner/adv"
category = "Medical Equipment"
datum/design/mmi
name = "Man-Machine Interface"
@@ -1353,7 +1397,7 @@ datum/design/mmi
materials = list("$metal" = 1000, "$glass" = 500)
reliability_base = 76
build_path = "/obj/item/device/mmi"
category = "Misc"
category = "Engineering Equipment"
datum/design/mmi_radio
name = "Radio-enabled Man-Machine Interface"
@@ -1364,7 +1408,7 @@ datum/design/mmi_radio
materials = list("$metal" = 1200, "$glass" = 500)
reliability_base = 74
build_path = "/obj/item/device/mmi/radio_enabled"
category = "Misc"
category = "Engineering Equipment"
datum/design/synthetic_flash
name = "Synthetic Flash"
@@ -1375,7 +1419,7 @@ datum/design/synthetic_flash
materials = list("$metal" = 750, "$glass" = 750)
reliability_base = 76
build_path = "/obj/item/device/flash/synthetic"
category = "Misc"
category = "Engineering Equipment"
datum/design/nanopaste
name = "nanopaste"
@@ -1385,6 +1429,7 @@ datum/design/nanopaste
build_type = PROTOLATHE
materials = list("$metal" = 7000, "$glass" = 7000)
build_path = "/obj/item/stack/nanopaste"
category = "Medical Equipment"
datum/design/laserpointer
name = "laser pointer"
@@ -1394,6 +1439,7 @@ datum/design/laserpointer
build_type = PROTOLATHE
materials = list("$metal" = 100, "$glass" = 50)
build_path = "/obj/item/device/laser_pointer"
category = "General"
datum/design/implant_loyal
name = "loyalty implant"
@@ -1403,6 +1449,7 @@ datum/design/implant_loyal
build_type = PROTOLATHE
materials = list("$metal" = 7000, "$glass" = 7000)
build_path = "/obj/item/weapon/implantcase/loyalty"
category = "Medical Equipment"
datum/design/implant_chem
name = "chemical implant"
@@ -1412,6 +1459,7 @@ datum/design/implant_chem
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/implantcase/chem"
category = "Medical Equipment"
datum/design/implant_free
name = "freedom implant"
@@ -1421,6 +1469,7 @@ datum/design/implant_free
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/implantcase/freedom"
category = "High-Risk Items"
datum/design/energy_shield
name = "energy shield"
@@ -1430,6 +1479,7 @@ datum/design/energy_shield
build_type = PROTOLATHE
materials = list("$metal" = 1000, "$glass" = 3000, "$plasma" = 1000)
build_path = "/obj/item/weapon/shield/energy"
category = "Weapons"
datum/design/implant_death_alarm
name = "death alarm implant"
@@ -1439,6 +1489,7 @@ datum/design/implant_death_alarm
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/implantcase/death_alarm"
category = "Medical Equipment"
datum/design/chameleon
name = "Chameleon Jumpsuit"
@@ -1448,7 +1499,7 @@ datum/design/chameleon
build_type = PROTOLATHE
materials = list("$metal" = 500)
build_path = "/obj/item/clothing/under/chameleon"
category = "High-Risk Items"
datum/design/bluespacebeaker
name = "bluespace beaker"
@@ -1459,6 +1510,7 @@ datum/design/bluespacebeaker
materials = list("$metal" = 3000, "$plasma" = 3000, "$diamond" = 500)
reliability_base = 76
build_path = "/obj/item/weapon/reagent_containers/glass/beaker/bluespace"
category = "Medical Equipment"
datum/design/noreactbeaker
name = "cryostasis beaker"
@@ -1469,7 +1521,7 @@ datum/design/noreactbeaker
materials = list("$metal" = 3000)
reliability_base = 76
build_path = "/obj/item/weapon/reagent_containers/glass/beaker/noreact"
category = "Misc"
category = "Medical Equipment"
datum/design/scalpel_laser1
name = "Basic Laser Scalpel"
@@ -1479,6 +1531,7 @@ datum/design/scalpel_laser1
build_type = PROTOLATHE
materials = list("$metal" = 12500, "$glass" = 7500)
build_path = "/obj/item/weapon/scalpel/laser1"
category = "Medical Equipment"
datum/design/scalpel_laser2
name = "Improved Laser Scalpel"
@@ -1488,6 +1541,7 @@ datum/design/scalpel_laser2
build_type = PROTOLATHE
materials = list("$metal" = 12500, "$glass" = 7500, "$silver" = 2500)
build_path = "/obj/item/weapon/scalpel/laser2"
category = "Medical Equipment"
datum/design/scalpel_laser3
name = "Advanced Laser Scalpel"
@@ -1497,6 +1551,7 @@ datum/design/scalpel_laser3
build_type = PROTOLATHE
materials = list("$metal" = 12500, "$glass" = 7500, "$silver" = 2000, "$gold" = 1500)
build_path = "/obj/item/weapon/scalpel/laser3"
category = "Medical Equipment"
datum/design/scalpel_manager
name = "Incision Management System"
@@ -1506,6 +1561,7 @@ datum/design/scalpel_manager
build_type = PROTOLATHE
materials = list ("$metal" = 12500, "$glass" = 7500, "$silver" = 1500, "$gold" = 1500, "$diamond" = 750)
build_path = "/obj/item/weapon/scalpel/manager"
category = "Medical Equipment"
/////////////////////////////////////////
/////////////////Weapons/////////////////
@@ -1521,6 +1577,7 @@ datum/design/nuclear_gun
reliability_base = 76
build_path = "/obj/item/weapon/gun/energy/rifle/gun/nuclear"
locked = 1
category = "Weapons"
datum/design/stunrevolver
name = "Stun Revolver"
@@ -1531,6 +1588,7 @@ datum/design/stunrevolver
materials = list("$metal" = 4000)
build_path = "/obj/item/weapon/gun/energy/stunrevolver"
locked = 1
category = "Weapons"
datum/design/lasercannon
name = "Laser Cannon"
@@ -1541,6 +1599,7 @@ datum/design/lasercannon
materials = list("$metal" = 10000, "$glass" = 1000, "$diamond" = 2000)
build_path = "/obj/item/weapon/gun/energy/rifle/lasercannon"
locked = 1
category = "Weapons"
datum/design/decloner
name = "Decloner"
@@ -1551,6 +1610,7 @@ datum/design/decloner
materials = list("$gold" = 5000,"$uranium" = 5000, "$plasma" = 1500) //"mutagen" = 40 Don't think protolathe can hold chems anymore. Not sure. It's redundant anyway. Mutagen is easy.
build_path = "/obj/item/weapon/gun/energy/decloner"
locked = 1
category = "Weapons"
datum/design/chemsprayer
name = "Chem Sprayer"
@@ -1561,6 +1621,7 @@ datum/design/chemsprayer
materials = list("$metal" = 5000, "$glass" = 1000, "$plasma" = 3000)
reliability_base = 100
build_path = "/obj/item/weapon/reagent_containers/spray/chemsprayer"
category = "Weapons"
datum/design/rapidsyringe
name = "Rapid Syringe Gun"
@@ -1570,6 +1631,7 @@ datum/design/rapidsyringe
build_type = PROTOLATHE
materials = list("$metal" = 5000, "$glass" = 1000)
build_path = "/obj/item/weapon/gun/syringe/rapidsyringe"
category = "Medical Equipment"
datum/design/largecrossbow
name = "Energy Crossbow"
@@ -1579,6 +1641,7 @@ datum/design/largecrossbow
build_type = PROTOLATHE
materials = list("$metal" = 5000, "$glass" = 1000, "$uranium" = 1000, "$silver" = 1000)
build_path = "/obj/item/weapon/gun/energy/crossbow/largecrossbow"
category = "High-Risk Items"
datum/design/temp_gun
name = "Freeze Ray"
@@ -1589,6 +1652,7 @@ datum/design/temp_gun
materials = list("$metal" = 5000, "$glass" = 500, "$silver" = 3000)
build_path = "/obj/item/weapon/gun/energy/temperature"
locked = 1
category = "General"
datum/design/flora_gun
name = "Floral Somatoray"
@@ -1598,6 +1662,7 @@ datum/design/flora_gun
build_type = PROTOLATHE
materials = list("$metal" = 2000, "$glass" = 500, "$uranium" = 500)
build_path = "/obj/item/weapon/gun/energy/floragun"
category = "General"
datum/design/large_grenade
name = "Large Grenade"
@@ -1608,6 +1673,7 @@ datum/design/large_grenade
materials = list("$metal" = 3000)
reliability_base = 79
build_path = "/obj/item/weapon/grenade/chem_grenade/large"
category = "General"
datum/design/smg
name = "Submachine Gun"
@@ -1618,6 +1684,7 @@ datum/design/smg
materials = list("$metal" = 8000, "$silver" = 2000, "$diamond" = 1000)
build_path = "/obj/item/weapon/gun/projectile/automatic"
locked = 1
category = "Weapons"
datum/design/rapidlaser
name = "Rapid-fire Laser"
@@ -1628,6 +1695,7 @@ datum/design/rapidlaser
materials = list("$metal" = 5000, "$uranium" = 1000)
build_path = "/obj/item/weapon/gun/energy/automatic/rapidlaser"
locked = 1
category = "Weapons"
datum/design/ammo_9mm
name = "Ammunition Box (9mm)"
@@ -1637,6 +1705,7 @@ datum/design/ammo_9mm
build_type = PROTOLATHE
materials = list("$metal" = 3750, "$silver" = 100)
build_path = "/obj/item/ammo_magazine/c9mm"
category = "Weapons"
datum/design/stunshell
name = "Stun Shell"
@@ -1646,6 +1715,7 @@ datum/design/stunshell
build_type = PROTOLATHE
materials = list("$metal" = 4000)
build_path = "/obj/item/ammo_casing/shotgun/stunshell"
category = "Weapons"
datum/design/stunshellbox
name = "Stun Shell box"
@@ -1655,6 +1725,7 @@ datum/design/stunshellbox
build_type = PROTOLATHE
materials = list("$metal" = 20000)
build_path = "/obj/item/ammo_magazine/shotgun/stun"
category = "Weapons"
datum/design/plasmapistol
name = "plasma pistol"
@@ -1664,6 +1735,7 @@ datum/design/plasmapistol
build_type = PROTOLATHE
materials = list("$metal" = 5000, "$glass" = 1000, "$plasma" = 3000)
build_path = "/obj/item/weapon/gun/energy/toxgun"
category = "Weapons"
datum/design/lawgiver
name = "Lawgiver Mk II"
@@ -1673,6 +1745,7 @@ datum/design/lawgiver
build_type = PROTOLATHE
materials = list("$metal" = 6000, "$glass" = 1000, "$uranium" = 1000, "$plasma" = 1000, "$diamond" = 3000)
build_path = "/obj/item/weapon/gun/energy/lawgiver"
category = "Weapons"
datum/design/bprotopistol
name = "Basic Protopistol"
@@ -1683,6 +1756,7 @@ datum/design/bprotopistol
materials = list("$metal" = 4000, "$glass" = 1000)
build_path = "/obj/item/weapon/gun/energy/laser/modular/pistol/crap"
locked = 1
category = "Weapons"
datum/design/protopistol
name = "Protopistol"
@@ -1693,6 +1767,7 @@ datum/design/protopistol
materials = list("$metal" = 8000, "$glass" = 3000, "$uranium" = 1000, "$plasma" = 1000)
build_path = "/obj/item/weapon/gun/energy/laser/modular/pistol"
locked = 1
category = "Weapons"
datum/design/aprotopistol
name = "Advanced Protopistol"
@@ -1703,7 +1778,19 @@ datum/design/aprotopistol
materials = list("$metal" = 8000, "$glass" = 4000, "$uranium" = 2000, "$plasma" = 2000, "$diamond" = 1000)
build_path = "/obj/item/weapon/gun/energy/laser/modular/pistol/advanced"
locked = 1
category = "Weapons"
/*This is all the station gets for producable force gloves. It's a high-risk item and thus considered contraband
outside of RnD without paperwork with the RD's stamp on it. */
datum/design/forcegloves
name = "Force Gloves"
desc = "These gloves bend gravity and bluespace, dampening inertia and augmenting the wearer's melee capabilities."
id = "forcegloves"
req_tech = list("combat" = 3,"bluespace" = 3, "engineering" = 3, "magnets" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 4000)
build_path = "/obj/item/clothing/gloves/force/basic"
locked = 1
category = "Weapons"
/////////////////////////////////////////
/////////////////Mining//////////////////
@@ -1717,6 +1804,7 @@ datum/design/jackhammer
build_type = PROTOLATHE
materials = list("$metal" = 2000, "$glass" = 500, "$silver" = 500)
build_path = "/obj/item/weapon/pickaxe/jackhammer"
category = "Engineering Equipment"
datum/design/drill
name = "Mining Drill"
@@ -1726,6 +1814,7 @@ datum/design/drill
build_type = PROTOLATHE
materials = list("$metal" = 6000, "$glass" = 1000) //expensive, but no need for miners.
build_path = "/obj/item/weapon/pickaxe/drill"
category = "Engineering Equipment"
datum/design/plasmacutter
name = "Plasma Cutter"
@@ -1736,6 +1825,8 @@ datum/design/plasmacutter
materials = list("$metal" = 1500, "$glass" = 500, "$gold" = 500, "$plasma" = 500)
reliability_base = 79
build_path = "/obj/item/weapon/pickaxe/plasmacutter"
category = "Engineering Equipment"
/* I'm sorry, but the diamond drill is pretty much redundant. And it messes with my immersions.
datum/design/pick_diamond
name = "Diamond Pickaxe"
@@ -1755,6 +1846,7 @@ datum/design/drill_diamond
materials = list("$metal" = 3000, "$glass" = 1000, "$diamond" = 3750) //Yes, a whole diamond is needed.
reliability_base = 79
build_path = "/obj/item/weapon/pickaxe/diamonddrill"
category = "Engineering Equipment"
datum/design/mesons
name = "Optical Meson Scanners"
@@ -1764,6 +1856,47 @@ datum/design/mesons
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/clothing/glasses/meson"
category = "Engineering Equipment"
datum/design/materialscan
name = "Optical Material Scanner"
desc = "Used for seeing objects through walls."
id = "optical_scanner"
build_type = PROTOLATHE
req_tech = list("magnets" = 3, "engineering" = 3)
materials = list("$metal" = 50, "$glass" = 50, "$silver" = 50)
build_path = "/obj/item/clothing/glasses/material"
category = "General"
datum/design/nightvisiongoggles
name = "Night Vision Goggles"
desc = "Used to see in the dark"
id = "night_vision_goggles"
build_type = PROTOLATHE
req_tech = list("magnets" = 4, "engineering" = 2, "combat" = 2)
materials = list("$metal" = 50, "$glass" = 50, "$gold" = 50)
build_path = "/obj/item/clothing/glasses/night"
category = "High-Risk Items"
datum/design/sciencegoggles
name = "Science Goggles"
desc = "They still do nothing."
id = "science_goggles"
build_type = PROTOLATHE
req_tech = list("magnets" = 1)
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/clothing/glasses/science"
category = "General"
datum/design/superiorweldgoggles
name = "Superior Welding Goggles"
desc = "Welding Goggles made of slightly better materials."
id = "s_weld_goggles"
build_type = PROTOLATHE
req_tech = list("materials" = 3)
materials = list("$metal" = 50, "$glass" = 50, "$plasma" = 50, "$uranium" = 50)
build_path = "/obj/item/clothing/glasses/welding/superior"
category = "Engineering Equipment"
/////////////////////////////////////////
//////////////Blue Space/////////////////
@@ -1777,6 +1910,7 @@ datum/design/beacon
build_type = PROTOLATHE
materials = list ("$metal" = 20, "$glass" = 10)
build_path = "/obj/item/device/radio/beacon"
category = "Bluespace Technology"
datum/design/bag_holding
name = "Bag of Holding"
@@ -1787,6 +1921,7 @@ datum/design/bag_holding
materials = list("$gold" = 3000, "$diamond" = 1500, "$uranium" = 250)
reliability_base = 80
build_path = "/obj/item/weapon/storage/backpack/holding"
category = "Bluespace Technology"
datum/design/bluespace_crystal
name = "Artificial Bluespace Crystal"
@@ -1797,6 +1932,7 @@ datum/design/bluespace_crystal
materials = list("$gold" = 1500, "$diamond" = 3000, "$plasma" = 1500)
reliability_base = 100
build_path = "/obj/item/bluespace_crystal/artificial"
category = "Bluespace Technology"
/////////////////////////////////////////
/////////////////HUDs////////////////////
@@ -1810,6 +1946,7 @@ datum/design/health_hud
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/clothing/glasses/hud/health"
category = "Information Technology"
datum/design/security_hud
name = "Security HUD"
@@ -1820,6 +1957,16 @@ datum/design/security_hud
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/clothing/glasses/hud/security"
locked = 1
category = "Information Technology"
datum/design/security_glasses //added to list 6/4/15
name = "Security HUD Sunglasses"
desc = "A combination security HUD and sunglasses commonly worn by high-ranking security officers."
id = "hudglasses"
req_tech = list("magnets" = 5, "combat" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50, "$gold" = 50, "$silver" = 50)
category = "Information Technology"
/////////////////////////////////////////
//////////////////Test///////////////////
@@ -1876,6 +2023,8 @@ datum/design/binaryencrypt
build_type = PROTOLATHE
materials = list("$metal" = 300, "$glass" = 300)
build_path = "/obj/item/device/encryptionkey/binary"
category = "High-Risk Items"
datum/design/pda
name = "PDA"
desc = "A portable microcomputer by Thinktronic Systems, LTD. Functionality determined by a preprogrammed ROM cartridge."
@@ -1884,6 +2033,8 @@ datum/design/pda
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/device/pda"
category = "PDA Cartridges"
datum/design/cart_basic
name = "Generic Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -1892,6 +2043,8 @@ datum/design/cart_basic
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/cartridge"
category = "PDA Cartridges"
datum/design/cart_engineering
name = "Power-ON Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -1900,6 +2053,8 @@ datum/design/cart_engineering
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/cartridge/engineering"
category = "PDA Cartridges"
datum/design/cart_atmos
name = "BreatheDeep Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -1908,6 +2063,8 @@ datum/design/cart_atmos
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/cartridge/atmos"
category = "PDA Cartridges"
datum/design/cart_medical
name = "Med-U Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -1916,6 +2073,8 @@ datum/design/cart_medical
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/cartridge/medical"
category = "PDA Cartridges"
datum/design/cart_chemistry
name = "ChemWhiz Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -1924,6 +2083,8 @@ datum/design/cart_chemistry
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/cartridge/chemistry"
category = "PDA Cartridges"
datum/design/cart_security
name = "R.O.B.U.S.T. Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -1933,6 +2094,8 @@ datum/design/cart_security
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/cartridge/security"
locked = 1
category = "PDA Cartridges"
datum/design/cart_janitor
name = "CustodiPRO Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -1941,6 +2104,7 @@ datum/design/cart_janitor
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/cartridge/janitor"
category = "PDA Cartridges"
/*
datum/design/cart_clown
@@ -1969,6 +2133,8 @@ datum/design/cart_toxins
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/cartridge/signal/science"
category = "PDA Cartridges"
datum/design/cart_quartermaster
name = "Space Parts & Space Vendors Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -1978,6 +2144,8 @@ datum/design/cart_quartermaster
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/cartridge/quartermaster"
locked = 1
category = "PDA Cartridges"
datum/design/cart_hop
name = "Human Resources 9001 Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -1987,6 +2155,8 @@ datum/design/cart_hop
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/cartridge/hop"
locked = 1
category = "PDA Cartridges"
datum/design/cart_hos
name = "R.O.B.U.S.T. DELUXE Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -1996,6 +2166,8 @@ datum/design/cart_hos
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/cartridge/hos"
locked = 1
category = "PDA Cartridges"
datum/design/cart_ce
name = "Power-On DELUXE Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -2005,6 +2177,8 @@ datum/design/cart_ce
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/cartridge/ce"
locked = 1
category = "PDA Cartridges"
datum/design/cart_cmo
name = "Med-U DELUXE Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -2014,6 +2188,8 @@ datum/design/cart_cmo
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/cartridge/cmo"
locked = 1
category = "PDA Cartridges"
datum/design/cart_rd
name = "Signal Ace DELUXE Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -2023,6 +2199,8 @@ datum/design/cart_rd
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/cartridge/rd"
locked = 1
category = "PDA Cartridges"
datum/design/cart_captain
name = "Value-PAK Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -2032,3 +2210,4 @@ datum/design/cart_captain
materials = list("$metal" = 50, "$glass" = 50)
build_path = "/obj/item/weapon/cartridge/captain"
locked = 1
category = "PDA Cartridges"
+2 -2
View File
@@ -301,7 +301,7 @@ var/obj/machinery/blackbox_recorder/blackbox
if(!dbcon.IsConnected()) return
var/round_id
var/DBQuery/query = dbcon.NewQuery("SELECT MAX(round_id) AS round_id FROM erro_feedback")
var/DBQuery/query = dbcon.NewQuery("SELECT MAX(round_id) AS round_id FROM ss13_feedback")
query.Execute()
while(query.NextRow())
round_id = query.item[1]
@@ -311,7 +311,7 @@ var/obj/machinery/blackbox_recorder/blackbox
round_id++
for(var/datum/feedback_variable/FV in feedback)
var/sql = "INSERT INTO erro_feedback VALUES (null, Now(), [round_id], \"[FV.get_variable()]\", [FV.get_value()], \"[FV.get_details()]\")"
var/sql = "INSERT INTO ss13_feedback VALUES (null, Now(), [round_id], \"[FV.get_variable()]\", [FV.get_value()], \"[FV.get_details()]\")"
var/DBQuery/query_insert = dbcon.NewQuery(sql)
query_insert.Execute()
+24 -2
View File
@@ -46,6 +46,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
var/screen = 1.0 //Which screen is currently showing.
var/id = 0 //ID of the computer (for server restrictions).
var/sync = 1 //If sync = 0, it doesn't show up on Server Control Console
var/show_category = "All" //Category code
req_access = list(access_research) //Data and setting manipulation requires scientist access.
@@ -132,7 +133,15 @@ won't update every console in existence) but it's more of a hassle to do. Also,
for(var/obj/machinery/r_n_d/server/centcom/S in machines)
S.initialize()
break
//Create global protolathe category list if it hasn't been made already.
//Category CODE: WIP
if(isnull(protolathe_categories))
protolathe_categories = list()
for(var/R in typesof(/datum/design)-/datum/design)
var/datum/design/design = new R
if(design.build_type == PROTOLATHE)
protolathe_categories |= design.category
//Category CODE: WIP
/obj/machinery/computer/rdconsole/initialize()
SyncRDevices()
@@ -159,7 +168,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
else if(istype(D, /obj/item/weapon/card/emag) && !emagged)
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
emagged = 1
user << "\blue You you disable the security protocols"
user << "\blue You disable the security protocols"
else
//The construction/deconstruction of the console code.
..()
@@ -237,7 +246,13 @@ won't update every console in existence) but it's more of a hassle to do. Also,
linked_destroy.loaded_item = null
linked_destroy.icon_state = "d_analyzer"
screen = 2.1
//Category code
else if(href_list["change_category"])
var/choice = input("Which category do you wish to display?") as null|anything in protolathe_categories+"All"
if(!choice) return
show_category = choice
//Category code
else if(href_list["deconstruct"]) //Deconstruct the item in the destructive analyzer and update the research holder.
if(linked_destroy)
if(linked_destroy.busy)
@@ -700,9 +715,16 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "Protolathe Menu:<BR><BR>"
dat += "<B>Material Amount:</B> [linked_lathe.TotalMaterials()] cm<sup>3</sup> (MAX: [linked_lathe.max_material_storage])<BR>"
dat += "<B>Chemical Volume:</B> [linked_lathe.reagents.total_volume] (MAX: [linked_lathe.reagents.maximum_volume])<HR>"
//START CATEGORY CODE. THIS IS WIP
dat += "<h2>Printable Designs</h2><h3>Showing: <a href='?src=\ref[src];change_category=1'>[show_category]</a>.</h3></center><table width = '100%'>"
//END CATEGORY CODE
for(var/datum/design/D in files.known_designs)
if(!(D.build_type & PROTOLATHE))
continue
//CATEGORY CODE START
if(!(show_category == "All" || show_category == D.category))
continue
//CATEGORY CODE END
var/temp_dat = "[D.name]"
var/check_materials = 1
for(var/M in D.materials)