mirror of
https://github.com/Aurorastation/Aurora-Old.git
synced 2026-08-31 08:36:32 +01:00
Merging Development
Merging the development branch.
This commit is contained in:
@@ -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())
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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."
|
||||
@@ -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
|
||||
@@ -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'> </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'> </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.")*/
|
||||
@@ -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
|
||||
@@ -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)]->[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)]->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
|
||||
|
||||
@@ -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!
|
||||
|
||||
@@ -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].")
|
||||
|
||||
@@ -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'> </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())
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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"
|
||||
@@ -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)
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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! "
|
||||
|
||||
@@ -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
|
||||
@@ -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?"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user