mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-25 04:57:12 +01:00
Completely Overhaul Logging
This is a merged port from /tg/station and Virgo on logging standards. The diary has been replaced with GLOB.world_game_log, diaryofmeanpeople is gone (because it wasn't actually used) and a whole bunch of logging procs have been changed to optimize Splunk.
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
//Blocks an attempt to connect before even creating our client datum thing.
|
||||
world/IsBanned(key,address,computer_id)
|
||||
if(!key || !address || !computer_id)
|
||||
log_access("Failed Login (invalid data): [key] [address]-[computer_id]")
|
||||
log_adminwarn("Failed Login (invalid data): [key] [address]-[computer_id]")
|
||||
return list("reason"="invalid login data", "desc"="Error: Could not check ban status, please try again. Error message: Your computer provided invalid or blank information to the server on connection (BYOND Username, IP, and Computer ID). Provided information for reference: Username: '[key]' IP: '[address]' Computer ID: '[computer_id]'. If you continue to get this error, please restart byond or contact byond support.")
|
||||
|
||||
if(text2num(computer_id) == 2147483647) //this cid causes stickybans to go haywire
|
||||
log_access("Failed Login (invalid cid): [key] [address]-[computer_id]")
|
||||
log_adminwarn("Failed Login (invalid cid): [key] [address]-[computer_id]")
|
||||
return list("reason"="invalid login data", "desc"="Error: Could not check ban status, Please try again. Error message: Your computer provided an invalid Computer ID.")
|
||||
var/admin = 0
|
||||
var/ckey = ckey(key)
|
||||
@@ -16,13 +16,13 @@ world/IsBanned(key,address,computer_id)
|
||||
|
||||
//Guest Checking
|
||||
if(!guests_allowed && IsGuestKey(key))
|
||||
log_access("Failed Login: [key] [computer_id] [address] - Guests not allowed")
|
||||
log_adminwarn("Failed Login: [key] [computer_id] [address] - Guests not allowed")
|
||||
// message_admins("<span class='notice'>Failed Login: [key] - Guests not allowed</span>")
|
||||
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
|
||||
if(config.ToRban && ToRban_isbanned(address))
|
||||
log_access("Failed Login: [key] [computer_id] [address] - Banned: Tor")
|
||||
log_adminwarn("Failed Login: [key] [computer_id] [address] - Banned: Tor")
|
||||
message_admins("<span class='adminnotice'>Failed Login: [key] - Banned: Tor</span>")
|
||||
//ban their computer_id and ckey for posterity
|
||||
AddBan(ckey(key), computer_id, "Use of Tor", "Automated Ban", 0, 0)
|
||||
@@ -41,14 +41,13 @@ world/IsBanned(key,address,computer_id)
|
||||
message_admins("<span class='adminnotice'>The admin [key] has been allowed to bypass a matching ban on [.["key"]]</span>")
|
||||
addclientmessage(ckey,"<span class='adminnotice'>You have been allowed to bypass a matching ban on [.["key"]].</span>")
|
||||
else
|
||||
log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]")
|
||||
log_adminwarn("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]")
|
||||
return .
|
||||
else
|
||||
var/ckeytext = ckey(key)
|
||||
|
||||
if(!establish_db_connection())
|
||||
log_to_dd("Ban database connection failure. Key [ckeytext] not checked")
|
||||
diary << "Ban database connection failure. Key [ckeytext] not checked"
|
||||
log_world("Ban database connection failure. Key [ckeytext] not checked")
|
||||
return
|
||||
|
||||
var/ipquery = ""
|
||||
@@ -100,7 +99,7 @@ world/IsBanned(key,address,computer_id)
|
||||
|
||||
. = list("reason"="[bantype]", "desc"="[desc]")
|
||||
|
||||
log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]")
|
||||
log_adminwarn("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]")
|
||||
return .
|
||||
|
||||
. = ..() //default pager ban stuff
|
||||
@@ -114,6 +113,6 @@ world/IsBanned(key,address,computer_id)
|
||||
addclientmessage(ckey,"<span class='adminnotice'>You have been allowed to bypass a matching host/sticky ban.</span>")
|
||||
return null
|
||||
else
|
||||
log_access("Failed Login: [key] [computer_id] [address] - Banned [.["message"]]")
|
||||
log_adminwarn("Failed Login: [key] [computer_id] [address] - Banned [.["message"]]")
|
||||
|
||||
return .
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
/proc/ToRban_update()
|
||||
spawn(0)
|
||||
diary << "Downloading updated ToR data..."
|
||||
log_world("Downloading updated ToR data...")
|
||||
var/http[] = world.Export("http://exitlist.torproject.org/exit-addresses")
|
||||
|
||||
var/list/rawlist = file2list(http["CONTENT"])
|
||||
@@ -36,11 +36,11 @@
|
||||
if(!cleaned) continue
|
||||
F[cleaned] << 1
|
||||
to_chat(F["last_update"], world.realtime)
|
||||
diary << "ToR data updated!"
|
||||
log_world("ToR data updated!")
|
||||
if(usr)
|
||||
to_chat(usr, "ToRban updated.")
|
||||
return 1
|
||||
diary << "ToR data update aborted: no data."
|
||||
log_world("ToR data update aborted: no data.")
|
||||
return 0
|
||||
|
||||
/client/proc/ToRban(task in list("update","toggle","show","remove","remove all","find"))
|
||||
|
||||
@@ -4,14 +4,12 @@ var/global/nologevent = 0
|
||||
////////////////////////////////
|
||||
/proc/message_admins(var/msg)
|
||||
msg = "<span class=\"admin\"><span class=\"prefix\">ADMIN LOG:</span> <span class=\"message\">[msg]</span></span>"
|
||||
log_adminwarn(msg)
|
||||
for(var/client/C in admins)
|
||||
if(R_ADMIN & C.holder.rights)
|
||||
if(C.prefs && !(C.prefs.toggles & CHAT_NO_ADMINLOGS))
|
||||
to_chat(C, msg)
|
||||
|
||||
/proc/msg_admin_attack(var/text) //Toggleable Attack Messages
|
||||
log_attack(text)
|
||||
if(!nologevent)
|
||||
var/rendered = "<span class=\"admin\"><span class=\"prefix\">ATTACK:</span> <span class=\"message\">[text]</span></span>"
|
||||
for(var/client/C in admins)
|
||||
@@ -866,13 +864,13 @@ var/global/nologevent = 0
|
||||
for(var/mob/living/silicon/S in mob_list)
|
||||
ai_number++
|
||||
if(isAI(S))
|
||||
to_chat(usr, "<b>AI [key_name(S, usr)]'s laws:</b>")
|
||||
to_chat(usr, "<b>AI [key_name(S, TRUE)]'s laws:</b>")
|
||||
else if(isrobot(S))
|
||||
var/mob/living/silicon/robot/R = S
|
||||
to_chat(usr, "<b>CYBORG [key_name(S, usr)]'s [R.connected_ai?"(Slaved to: [R.connected_ai])":"(Independent)"] laws:</b>")
|
||||
to_chat(usr, "<b>CYBORG [key_name(S, TRUE)]'s [R.connected_ai?"(Slaved to: [R.connected_ai])":"(Independent)"] laws:</b>")
|
||||
else if(ispAI(S))
|
||||
var/mob/living/silicon/pai/P = S
|
||||
to_chat(usr, "<b>pAI [key_name(S, usr)]'s laws:</b>")
|
||||
to_chat(usr, "<b>pAI [key_name(S, TRUE)]'s laws:</b>")
|
||||
to_chat(usr, "[P.pai_law0]")
|
||||
if(P.pai_laws)
|
||||
to_chat(usr, "[P.pai_laws]")
|
||||
|
||||
@@ -40,8 +40,8 @@
|
||||
|
||||
if("hrefs") //persistant logs and stuff
|
||||
if(config && config.log_hrefs)
|
||||
if(href_logfile)
|
||||
src << browse(href_logfile,"window=investigate[subject];size=800x300")
|
||||
if(GLOB.world_href_log)
|
||||
src << browse(GLOB.world_href_log,"window=investigate[subject];size=800x300")
|
||||
else
|
||||
to_chat(src, "<font color='red'>Error: admin_investigate: No href logfile found.</font>")
|
||||
return
|
||||
|
||||
@@ -104,8 +104,7 @@ var/list/admin_ranks = list() //list of all ranks with associated rights
|
||||
|
||||
establish_db_connection()
|
||||
if(!dbcon.IsConnected())
|
||||
log_to_dd("Failed to connect to database in load_admins(). Reverting to legacy system.")
|
||||
diary << "Failed to connect to database in load_admins(). Reverting to legacy system."
|
||||
log_world("Failed to connect to database in load_admins(). Reverting to legacy system.")
|
||||
config.admin_legacy_system = 1
|
||||
load_admins()
|
||||
return
|
||||
@@ -124,8 +123,7 @@ var/list/admin_ranks = list() //list of all ranks with associated rights
|
||||
//find the client for a ckey if they are connected and associate them with the new admin datum
|
||||
D.associate(directory[ckey])
|
||||
if(!admin_datums)
|
||||
log_to_dd("The database query in load_admins() resulted in no admins being added to the list. Reverting to legacy system.")
|
||||
diary << "The database query in load_admins() resulted in no admins being added to the list. Reverting to legacy system."
|
||||
log_world("The database query in load_admins() resulted in no admins being added to the list. Reverting to legacy system.")
|
||||
config.admin_legacy_system = 1
|
||||
load_admins()
|
||||
return
|
||||
|
||||
@@ -27,8 +27,6 @@ var/list/admin_verbs_admin = 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*/
|
||||
/client/proc/giveruntimelog, /*allows us to give access to runtime logs to somebody*/
|
||||
/client/proc/getruntimelog, /*allows us to access 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*/
|
||||
|
||||
@@ -52,8 +52,7 @@ DEBUG
|
||||
log_admin("appearance_keylist was empty")
|
||||
else
|
||||
if(!establish_db_connection())
|
||||
log_to_dd("Database connection failed. Reverting to the legacy ban system.")
|
||||
diary << "Database connection failed. Reverting to the legacy ban system."
|
||||
log_world("Database connection failed. Reverting to the legacy ban system.")
|
||||
config.ban_legacy_system = 1
|
||||
appearance_loadbanfile()
|
||||
return
|
||||
|
||||
@@ -78,8 +78,7 @@ DEBUG
|
||||
log_runtime(EXCEPTION("Skipping malformed job ban: [s]"))
|
||||
else
|
||||
if(!establish_db_connection())
|
||||
log_to_dd("Database connection failed. Reverting to the legacy ban system.")
|
||||
diary << "Database connection failed. Reverting to the legacy ban system."
|
||||
log_world("Database connection failed. Reverting to the legacy ban system.")
|
||||
config.ban_legacy_system = 1
|
||||
jobban_loadbanfile()
|
||||
return
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
|
||||
//get message text, limit it's length.and clean/escape html
|
||||
if(!msg)
|
||||
msg = input(src,"Message:", "Private message to [key_name(C, 0, 0)]") as text|null
|
||||
msg = input(src,"Message:", "Private message to [key_name(C, 0)]") as text|null
|
||||
|
||||
if(!msg)
|
||||
return
|
||||
@@ -152,9 +152,9 @@
|
||||
|
||||
|
||||
var/emoji_msg = "<span class='emoji_enabled'>[msg]</span>"
|
||||
recieve_message = "<span class='[recieve_span]'>[type] from-<b>[recieve_pm_type][key_name(src, C, C.holder ? 1 : 0, type)]</b>: [emoji_msg]</span>"
|
||||
recieve_message = "<span class='[recieve_span]'>[type] from-<b>[recieve_pm_type][key_name(src, TRUE, type)]</b>: [emoji_msg]</span>"
|
||||
to_chat(C, recieve_message)
|
||||
to_chat(src, "<font color='blue'>[send_pm_type][type] to-<b>[key_name(C, src, holder ? 1 : 0, type)]</b>: [emoji_msg]</font>")
|
||||
to_chat(src, "<font color='blue'>[send_pm_type][type] to-<b>[key_name(C, TRUE, type)]</b>: [emoji_msg]</font>")
|
||||
|
||||
/*if(holder && !C.holder)
|
||||
C.last_pm_recieved = world.time
|
||||
@@ -175,13 +175,13 @@
|
||||
switch(type)
|
||||
if("Mentorhelp")
|
||||
if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob))
|
||||
to_chat(X, "<span class='mentorhelp'>[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [emoji_msg]</span>")
|
||||
to_chat(X, "<span class='mentorhelp'>[type]: [key_name(src, TRUE, type)]->[key_name(C, TRUE, type)]: [emoji_msg]</span>")
|
||||
if("Adminhelp")
|
||||
if(check_rights(R_ADMIN|R_MOD, 0, X.mob))
|
||||
to_chat(X, "<span class='adminhelp'>[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [emoji_msg]</span>")
|
||||
to_chat(X, "<span class='adminhelp'>[type]: [key_name(src, TRUE, type)]->[key_name(C, TRUE, type)]: [emoji_msg]</span>")
|
||||
else
|
||||
if(check_rights(R_ADMIN|R_MOD, 0, X.mob))
|
||||
to_chat(X, "<span class='boldnotice'>[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [emoji_msg]</span>")
|
||||
to_chat(X, "<span class='boldnotice'>[type]: [key_name(src, TRUE, type)]->[key_name(C, TRUE, type)]: [emoji_msg]</span>")
|
||||
|
||||
//Check if the mob being PM'd has any open admin tickets.
|
||||
var/tickets = list()
|
||||
@@ -226,4 +226,4 @@
|
||||
if(X == src)
|
||||
continue
|
||||
if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob))
|
||||
to_chat(X, "<B><font color='blue'>PM: [key_name(src, X, 0)]->IRC-Admins:</B> <span class='notice'>[msg]</span></font>")
|
||||
to_chat(X, "<B><font color='blue'>PM: [key_name(src, TRUE, 0)]->IRC-Admins:</B> <span class='notice'>[msg]</span></font>")
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
msg = sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))
|
||||
if(!msg) return
|
||||
|
||||
log_admin("[key_name(src)] : [msg]")
|
||||
log_adminsay(msg, src)
|
||||
|
||||
if(check_rights(R_ADMIN,0))
|
||||
for(var/client/C in admins)
|
||||
@@ -25,7 +25,7 @@
|
||||
return
|
||||
|
||||
msg = sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))
|
||||
log_admin("MENTOR: [key_name(src)] : [msg]")
|
||||
log_mentorsay(msg, src)
|
||||
|
||||
if(!msg)
|
||||
return
|
||||
|
||||
@@ -17,4 +17,4 @@
|
||||
to_chat(M, "<font color='#960018'><span class='ooc'><span class='prefix'>AOOC:</span> <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></font>")
|
||||
|
||||
|
||||
log_ooc("(ANTAG) [key] : [msg]")
|
||||
log_aooc(msg, src)
|
||||
|
||||
@@ -14,50 +14,6 @@
|
||||
*/
|
||||
|
||||
|
||||
//This proc allows Game Masters to grant a client access to the .getruntimelog verb
|
||||
//Permissions expire at the end of each round.
|
||||
//Runtimes can be used to meta or spot game-crashing exploits so it's advised to only grant coders that
|
||||
//you trust access. Also, it may be wise to ensure that they are not going to play in the current round.
|
||||
/client/proc/giveruntimelog()
|
||||
set name = ".giveruntimelog"
|
||||
set desc = "Give somebody access to any session logfiles saved to the /log/runtime/ folder."
|
||||
set category = null
|
||||
|
||||
if(!src.holder)
|
||||
to_chat(src, "<font color='red'>Only Admins may use this command.</font>")
|
||||
return
|
||||
|
||||
var/client/target = input(src,"Choose somebody to grant access to the server's runtime logs (permissions expire at the end of each round):","Grant Permissions",null) as null|anything in clients
|
||||
if(!istype(target,/client))
|
||||
to_chat(src, "<font color='red'>Error: giveruntimelog(): Client not found.</font>")
|
||||
return
|
||||
|
||||
target.verbs |= /client/proc/getruntimelog
|
||||
to_chat(target, "<font color='red'>You have been granted access to runtime logs. Please use them responsibly or risk being banned.</font>")
|
||||
return
|
||||
|
||||
|
||||
//This proc allows download of runtime logs saved within the data/logs/ folder by dreamdeamon.
|
||||
//It works similarly to show-server-log.
|
||||
/client/proc/getruntimelog()
|
||||
set name = ".getruntimelog"
|
||||
set desc = "Retrieve any session logfiles saved by dreamdeamon."
|
||||
set category = null
|
||||
|
||||
var/path = browse_files("data/logs/runtime/")
|
||||
if(!path)
|
||||
return
|
||||
|
||||
if(file_spam_check())
|
||||
return
|
||||
|
||||
message_admins("[key_name_admin(src)] accessed file: [path]")
|
||||
src << ftp(file(path))
|
||||
|
||||
to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.")
|
||||
return
|
||||
|
||||
|
||||
//This proc allows download of past server logs saved within the data/logs/ folder.
|
||||
//It works similarly to show-server-log.
|
||||
/client/proc/getserverlog()
|
||||
@@ -87,7 +43,7 @@
|
||||
set name = "Show Server Log"
|
||||
set desc = "Shows today's server log."
|
||||
|
||||
var/path = "data/logs/[time2text(world.realtime,"YYYY/MM-Month/DD-Day")].log"
|
||||
var/path = "[GLOB.log_directory]/game.log"
|
||||
if( fexists(path) )
|
||||
src << ftp(file(path))
|
||||
|
||||
@@ -103,8 +59,8 @@
|
||||
set name = "Show Server Attack Log"
|
||||
set desc = "Shows today's server attack log."
|
||||
|
||||
var/path = "data/logs/[time2text(world.realtime,"YYYY/MM-Month/DD-Day")] Attack.log"
|
||||
if( fexists(path) )
|
||||
var/path = "[GLOB.log_directory]/attack.log"
|
||||
if(fexists(path))
|
||||
src << ftp(file(path))
|
||||
|
||||
else
|
||||
|
||||
@@ -201,7 +201,7 @@
|
||||
if(rejected)
|
||||
to_chat(src, "[rejected] out of [count] objects rejected your edit")
|
||||
|
||||
log_to_dd("### MassVarEdit by [src]: [O.type] (A/R [accepted]/[rejected]) [variable]=[html_encode("[O.vars[variable]]")]([list2params(value)])")
|
||||
log_world("### MassVarEdit by [src]: [O.type] (A/R [accepted]/[rejected]) [variable]=[html_encode("[O.vars[variable]]")]([list2params(value)])")
|
||||
log_admin("[key_name(src)] mass modified [original_name]'s [variable] to [O.vars[variable]] ([accepted] objects modified)")
|
||||
message_admins("[key_name_admin(src)] mass modified [original_name]'s [variable] to [O.vars[variable]] ([accepted] objects modified)")
|
||||
|
||||
|
||||
@@ -342,7 +342,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height",
|
||||
if(!O.vv_edit_var(objectvar, L))
|
||||
to_chat(src, "Your edit was rejected by the object.")
|
||||
return
|
||||
log_to_dd("### ListVarEdit by [src]: [(O ? O.type : "/list")] [objectvar]: ADDED=[var_value]")
|
||||
log_world("### ListVarEdit by [src]: [(O ? O.type : "/list")] [objectvar]: ADDED=[var_value]")
|
||||
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: ADDED=[var_value]")
|
||||
message_admins("[key_name_admin(src)] modified [original_name]'s [objectvar]: ADDED=[var_value]")
|
||||
|
||||
@@ -385,7 +385,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height",
|
||||
if(!O.vv_edit_var(objectvar, L))
|
||||
to_chat(src, "Your edit was rejected by the object.")
|
||||
return
|
||||
log_to_dd("### ListVarEdit by [src]: [O.type] [objectvar]: CLEAR NULLS")
|
||||
log_world("### ListVarEdit by [src]: [O.type] [objectvar]: CLEAR NULLS")
|
||||
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: CLEAR NULLS")
|
||||
message_admins("[key_name_admin(src)] modified [original_name]'s list [objectvar]: CLEAR NULLS")
|
||||
return
|
||||
@@ -395,7 +395,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height",
|
||||
if(!O.vv_edit_var(objectvar, L))
|
||||
to_chat(src, "Your edit was rejected by the object.")
|
||||
return
|
||||
log_to_dd("### ListVarEdit by [src]: [O.type] [objectvar]: CLEAR DUPES")
|
||||
log_world("### ListVarEdit by [src]: [O.type] [objectvar]: CLEAR DUPES")
|
||||
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: CLEAR DUPES")
|
||||
message_admins("[key_name_admin(src)] modified [original_name]'s list [objectvar]: CLEAR DUPES")
|
||||
return
|
||||
@@ -405,7 +405,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height",
|
||||
if(!O.vv_edit_var(objectvar, L))
|
||||
to_chat(src, "Your edit was rejected by the object.")
|
||||
return
|
||||
log_to_dd("### ListVarEdit by [src]: [O.type] [objectvar]: SHUFFLE")
|
||||
log_world("### ListVarEdit by [src]: [O.type] [objectvar]: SHUFFLE")
|
||||
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: SHUFFLE")
|
||||
message_admins("[key_name_admin(src)] modified [original_name]'s list [objectvar]: SHUFFLE")
|
||||
return
|
||||
@@ -482,7 +482,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height",
|
||||
if(!O.vv_edit_var(objectvar, L))
|
||||
to_chat(src, "Your edit was rejected by the object.")
|
||||
return
|
||||
log_to_dd("### ListVarEdit by [src]: [O.type] [objectvar]: REMOVED=[html_encode("[original_var]")]")
|
||||
log_world("### ListVarEdit by [src]: [O.type] [objectvar]: REMOVED=[html_encode("[original_var]")]")
|
||||
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: REMOVED=[original_var]")
|
||||
message_admins("[key_name_admin(src)] modified [original_name]'s [objectvar]: REMOVED=[original_var]")
|
||||
return
|
||||
@@ -501,7 +501,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height",
|
||||
if(!O.vv_edit_var(objectvar, L))
|
||||
to_chat(src, "Your edit was rejected by the object.")
|
||||
return
|
||||
log_to_dd("### ListVarEdit by [src]: [(O ? O.type : "/list")] [objectvar]: [original_var]=[new_var]")
|
||||
log_world("### ListVarEdit by [src]: [(O ? O.type : "/list")] [objectvar]: [original_var]=[new_var]")
|
||||
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: [original_var]=[new_var]")
|
||||
message_admins("[key_name_admin(src)] modified [original_name]'s varlist [objectvar]: [original_var]=[new_var]")
|
||||
|
||||
@@ -612,7 +612,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height",
|
||||
if(!O.vv_edit_var(variable, var_new))
|
||||
to_chat(src, "Your edit was rejected by the object.")
|
||||
return
|
||||
log_to_dd("### VarEdit by [src]: [O.type] [variable]=[html_encode("[var_new]")]")
|
||||
log_world("### VarEdit by [src]: [O.type] [variable]=[html_encode("[var_new]")]")
|
||||
log_admin("[key_name(src)] modified [original_name]'s [variable] to [var_new]")
|
||||
var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] to [var_new]"
|
||||
message_admins(msg)
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
status = 1
|
||||
bombers += "[key_name(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]"
|
||||
msg_admin_attack("[key_name_admin(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]")
|
||||
log_game("[key_name(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature - T0C]")
|
||||
to_chat(user, "<span class='notice'>A pressure hole has been bored to [bombtank] valve. \The [bombtank] can now be ignited.</span>")
|
||||
else
|
||||
status = 0
|
||||
|
||||
@@ -584,7 +584,7 @@ proc/SwapMaps_CreateFromTemplate(template_id)
|
||||
else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[template_id].txt"))
|
||||
text=1
|
||||
else
|
||||
log_to_dd("SwapMaps error in SwapMaps_CreateFromTemplate(): map_[template_id] file not found.")
|
||||
log_world("SwapMaps error in SwapMaps_CreateFromTemplate(): map_[template_id] file not found.")
|
||||
return
|
||||
if(text)
|
||||
S=new
|
||||
@@ -611,7 +611,7 @@ proc/SwapMaps_LoadChunk(chunk_id,turf/locorner)
|
||||
else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[chunk_id].txt"))
|
||||
text=1
|
||||
else
|
||||
log_to_dd("SwapMaps error in SwapMaps_LoadChunk(): map_[chunk_id] file not found.")
|
||||
log_world("SwapMaps error in SwapMaps_LoadChunk(): map_[chunk_id] file not found.")
|
||||
return
|
||||
if(text)
|
||||
S=new
|
||||
@@ -629,9 +629,9 @@ proc/SwapMaps_LoadChunk(chunk_id,turf/locorner)
|
||||
|
||||
proc/SwapMaps_SaveChunk(chunk_id,turf/corner1,turf/corner2)
|
||||
if(!corner1 || !corner2)
|
||||
log_to_dd("SwapMaps error in SwapMaps_SaveChunk():")
|
||||
if(!corner1) log_to_dd(" corner1 turf is null")
|
||||
if(!corner2) log_to_dd(" corner2 turf is null")
|
||||
log_world("SwapMaps error in SwapMaps_SaveChunk():")
|
||||
if(!corner1) log_world(" corner1 turf is null")
|
||||
if(!corner2) log_world(" corner2 turf is null")
|
||||
return
|
||||
var/swapmap/M=new
|
||||
M.id=chunk_id
|
||||
@@ -658,7 +658,7 @@ proc/SwapMaps_GetSize(id)
|
||||
else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[id].txt"))
|
||||
text=1
|
||||
else
|
||||
log_to_dd("SwapMaps error in SwapMaps_GetSize(): map_[id] file not found.")
|
||||
log_world("SwapMaps error in SwapMaps_GetSize(): map_[id] file not found.")
|
||||
return
|
||||
if(text)
|
||||
S=new
|
||||
|
||||
@@ -57,7 +57,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
|
||||
maploader.load_map(file, z_offset = zlev)
|
||||
late_setup_level(block(locate(1, 1, zlev), locate(world.maxx, world.maxy, zlev)))
|
||||
space_manager.remove_dirt(zlev)
|
||||
log_to_dd(" Away mission loaded: [map]")
|
||||
log_world(" Away mission loaded: [map]")
|
||||
|
||||
for(var/obj/effect/landmark/L in landmarks_list)
|
||||
if(L.name != "awaystart")
|
||||
@@ -88,7 +88,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
|
||||
maploader.load_map(file, z_offset = zlev)
|
||||
late_setup_level(block(locate(1, 1, zlev), locate(world.maxx, world.maxy, zlev)))
|
||||
space_manager.remove_dirt(zlev)
|
||||
log_to_dd(" Away mission loaded: [map]")
|
||||
log_world(" Away mission loaded: [map]")
|
||||
|
||||
//map_transition_config.Add(AWAY_MISSION_LIST)
|
||||
|
||||
@@ -168,7 +168,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
|
||||
if(!valid)
|
||||
continue
|
||||
|
||||
log_to_dd(" Ruin \"[ruin.name]\" loaded in [stop_watch(watch)]s at ([T.x], [T.y], [T.z]).")
|
||||
log_world(" Ruin \"[ruin.name]\" loaded in [stop_watch(watch)]s at ([T.x], [T.y], [T.z]).")
|
||||
|
||||
var/obj/effect/ruin_loader/R = new /obj/effect/ruin_loader(T)
|
||||
R.Load(ruins,ruin)
|
||||
@@ -179,7 +179,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
|
||||
|
||||
|
||||
if(initialbudget == budget) //Kill me
|
||||
log_to_dd(" No ruins loaded.")
|
||||
log_world(" No ruins loaded.")
|
||||
|
||||
|
||||
/obj/effect/ruin_loader
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
|
||||
//search the href for script injection
|
||||
if( findtext(href,"<script",1,0) )
|
||||
log_to_dd("Attempted use of scripts within a topic call, by [src]")
|
||||
log_world("Attempted use of scripts within a topic call, by [src]")
|
||||
log_runtime(EXCEPTION("Attempted use of scripts within a topic call, by [src]"), src)
|
||||
message_admins("Attempted use of scripts within a topic call, by [src]")
|
||||
return
|
||||
@@ -94,8 +94,8 @@
|
||||
|
||||
|
||||
//Logs all hrefs
|
||||
if(config && config.log_hrefs && href_logfile)
|
||||
to_chat(href_logfile, "<small>[time2text(world.timeofday,"hh:mm")] [src] (usr:[usr])</small> || [hsrc ? "[hsrc] " : ""][href]<br>")
|
||||
if(config && config.log_hrefs)
|
||||
WRITE_LOG(GLOB.world_href_log, "<small>[time2text(world.timeofday,"hh:mm")] [src] (usr:[usr])</small> || [hsrc ? "[hsrc] " : ""][href]<br>")
|
||||
|
||||
if(href_list["karmashop"])
|
||||
if(config.disable_karma)
|
||||
@@ -559,7 +559,7 @@
|
||||
|
||||
//Log all the alts
|
||||
if(related_accounts_cid.len)
|
||||
log_access("Alts: [key_name(src)]:[jointext(related_accounts_cid, " - ")]")
|
||||
log_admin("[key_name(src)] alts:[jointext(related_accounts_cid, " - ")]")
|
||||
|
||||
|
||||
var/watchreason = check_watchlist(ckey)
|
||||
@@ -668,7 +668,7 @@
|
||||
cidcheck_failedckeys[ckey] = TRUE
|
||||
note_randomizer_user()
|
||||
|
||||
log_access("Failed Login: [key] [computer_id] [address] - CID randomizer confirmed (oldcid: [oldcid])")
|
||||
log_adminwarn("Failed Login: [key] [computer_id] [address] - CID randomizer confirmed (oldcid: [oldcid])")
|
||||
|
||||
del(src)
|
||||
return TRUE
|
||||
@@ -710,7 +710,7 @@
|
||||
/client/proc/cid_check_reconnect()
|
||||
var/token = md5("[rand(0,9999)][world.time][rand(0,9999)][ckey][rand(0,9999)][address][rand(0,9999)][computer_id][rand(0,9999)]")
|
||||
. = token
|
||||
log_access("Failed Login: [key] [computer_id] [address] - CID randomizer check")
|
||||
log_adminwarn("Failed Login: [key] [computer_id] [address] - CID randomizer check")
|
||||
var/url = winget(src, null, "url")
|
||||
//special javascript to make them reconnect under a new window.
|
||||
src << browse("<a id='link' href='byond://[url]?token=[token]'>\
|
||||
|
||||
@@ -17,19 +17,19 @@ atom/proc/add_fibers(mob/living/carbon/human/M)
|
||||
if(M.wear_suit)
|
||||
fibertext = "Material from \a [M.wear_suit]."
|
||||
if(prob(10*item_multiplier) && !(fibertext in suit_fibers) && M.wear_suit.can_leave_fibers)
|
||||
//log_to_dd("Added fibertext: [fibertext]")
|
||||
//log_world("Added fibertext: [fibertext]")
|
||||
suit_fibers += fibertext
|
||||
if(!(M.wear_suit.body_parts_covered & UPPER_TORSO))
|
||||
if(M.w_uniform)
|
||||
fibertext = "Fibers from \a [M.w_uniform]."
|
||||
if(prob(12*item_multiplier) && !(fibertext in suit_fibers) && M.w_uniform.can_leave_fibers) //Wearing a suit means less of the uniform exposed.
|
||||
//log_to_dd("Added fibertext: [fibertext]")
|
||||
//log_world("Added fibertext: [fibertext]")
|
||||
suit_fibers += fibertext
|
||||
if(!(M.wear_suit.body_parts_covered & HANDS))
|
||||
if(M.gloves)
|
||||
fibertext = "Material from a pair of [M.gloves.name]."
|
||||
if(prob(20*item_multiplier) && !(fibertext in suit_fibers) && M.gloves.can_leave_fibers)
|
||||
//log_to_dd("Added fibertext: [fibertext]")
|
||||
//log_world("Added fibertext: [fibertext]")
|
||||
suit_fibers += fibertext
|
||||
else if(M.w_uniform)
|
||||
fibertext = "Fibers from \a [M.w_uniform]."
|
||||
@@ -39,10 +39,10 @@ atom/proc/add_fibers(mob/living/carbon/human/M)
|
||||
if(M.gloves)
|
||||
fibertext = "Material from a pair of [M.gloves.name]."
|
||||
if(prob(20*item_multiplier) && !(fibertext in suit_fibers) && M.gloves.can_leave_fibers)
|
||||
//log_to_dd("Added fibertext: [fibertext]")
|
||||
//log_world("Added fibertext: [fibertext]")
|
||||
suit_fibers += "Material from a pair of [M.gloves.name]."
|
||||
else if(M.gloves)
|
||||
fibertext = "Material from a pair of [M.gloves.name]."
|
||||
if(prob(20*item_multiplier) && !(fibertext in suit_fibers) && M.gloves.can_leave_fibers)
|
||||
//log_to_dd("Added fibertext: [fibertext]")
|
||||
//log_world("Added fibertext: [fibertext]")
|
||||
suit_fibers += "Material from a pair of [M.gloves.name]."
|
||||
|
||||
@@ -8,7 +8,7 @@ var/total_runtimes_skipped = 0
|
||||
#ifdef DEBUG
|
||||
/world/Error(var/exception/e, var/datum/e_src)
|
||||
if(!istype(e)) // Something threw an unusual exception
|
||||
log_to_dd("\[[time_stamp()]] Uncaught exception: [e]")
|
||||
log_world("\[[time_stamp()]] Uncaught exception: [e]")
|
||||
return ..()
|
||||
if(!error_last_seen) // A runtime is occurring too early in start-up initialization
|
||||
return ..()
|
||||
@@ -39,7 +39,7 @@ var/total_runtimes_skipped = 0
|
||||
var/skipcount = abs(error_cooldown[erroruid]) - 1
|
||||
error_cooldown[erroruid] = 0
|
||||
if(skipcount > 0)
|
||||
log_to_dd("\[[time_stamp()]] Skipped [skipcount] runtimes in [e.file],[e.line].")
|
||||
log_world("\[[time_stamp()]] Skipped [skipcount] runtimes in [e.file],[e.line].")
|
||||
error_cache.logError(e, skipCount = skipcount)
|
||||
error_last_seen[erroruid] = world.time
|
||||
error_cooldown[erroruid] = cooldown
|
||||
@@ -95,12 +95,13 @@ var/total_runtimes_skipped = 0
|
||||
desclines += " (This error will now be silenced for [ERROR_SILENCE_TIME / 600] minutes)"
|
||||
|
||||
// Now to actually output the error info...
|
||||
log_to_dd("\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]")
|
||||
log_world("\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]")
|
||||
log_runtime_txt("\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]")
|
||||
for(var/line in desclines)
|
||||
log_to_dd(line)
|
||||
log_world(line)
|
||||
log_runtime_txt(line)
|
||||
if(error_cache)
|
||||
error_cache.logError(e, desclines, e_src = e_src)
|
||||
|
||||
#endif
|
||||
|
||||
/proc/log_runtime(exception/e, datum/e_src, extra_info)
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
"<span class='userdanger'>[target] hits \himself with a bottle of [name][head_attack_message]!</span>")
|
||||
|
||||
//Attack logs
|
||||
add_logs(user, target, "attacked", src)
|
||||
add_attack_logs(user, target, "Hit with [src]")
|
||||
|
||||
//The reagents in the bottle splash all over the target, thanks for the idea Nodrak
|
||||
SplashReagents(target)
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
if(!reagents || !reagents.total_volume)
|
||||
return // The condiment might be empty after the delay.
|
||||
user.visible_message("<span class='warning'>[user] feeds [M] from [src].</span>")
|
||||
add_logs(user, M, "fed", reagentlist(src))
|
||||
add_attack_logs(user, M, "Fed [src] containing [reagentlist(src)]")
|
||||
|
||||
var/fraction = min(10/reagents.total_volume, 1)
|
||||
reagents.reaction(M, INGEST, fraction)
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
C.apply_damage(25, BURN, "head") //25 fire damage and disfigurement because your face was just deep fried!
|
||||
head.disfigure("burn")
|
||||
add_logs(user, G.affecting, "deep-fried", addition="'s face")
|
||||
add_attack_logs(user, G.affecting, "Deep-fried with [src]")
|
||||
qdel(G) //Removes the grip so the person MIGHT have a small chance to run the fuck away and to prevent rapid dunks.
|
||||
return 0
|
||||
return 0
|
||||
|
||||
@@ -221,7 +221,8 @@
|
||||
return
|
||||
|
||||
if(UserOverride)
|
||||
msg_admin_attack("[key_name_admin(occupant)] was gibbed by an autogibber (\the [src]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
msg_admin_attack("[key_name_admin(occupant)] was gibbed by an autogibber (\the [src]) [ADMIN_JMP(src)]")
|
||||
log_game("[key_name(occupant)] was gibbed by an autogibber ([src]) (X:[x] Y:[y] Z:[z])")
|
||||
|
||||
if(operating)
|
||||
return
|
||||
@@ -259,11 +260,7 @@
|
||||
new /obj/effect/decal/cleanable/blood/gibs(src)
|
||||
|
||||
if(!UserOverride)
|
||||
occupant.create_attack_log("Was gibbed by [key_name(user)]") //One shall not simply gib a mob unnoticed!)
|
||||
user.create_attack_log("Gibbed [key_name(occupant)]")
|
||||
|
||||
if(occupant.ckey)
|
||||
msg_admin_attack("[key_name_admin(user)] gibbed [key_name_admin(occupant)]")
|
||||
add_attack_logs(user, occupant, "Gibbed in [src]", !!occupant.ckey)
|
||||
|
||||
if(!iscarbon(user))
|
||||
occupant.LAssailant = null
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
C.emote("scream")
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
C.adjustFireLoss(30)
|
||||
add_logs(user, G.affecting, "burned", src)
|
||||
add_attack_logs(user, G.affecting, "Burned with [src]")
|
||||
qdel(G) //Removes the grip to prevent rapid sears and give you a chance to run
|
||||
return 0
|
||||
return 0
|
||||
@@ -61,7 +61,7 @@
|
||||
C.apply_damage(5, BURN, "head") //5 fire damage, 15 brute damage, and weakening because your head was just in a hot oven with the door bashing into your neck!
|
||||
C.apply_damage(15, BRUTE, "head")
|
||||
C.Weaken(2)
|
||||
add_logs(user, G.affecting, "smashed", addition="'s head on [src]")
|
||||
add_attack_logs(user, G.affecting, "Smashed with [src]")
|
||||
qdel(G) //Removes the grip to prevent rapid bashes. With the weaken, you PROBABLY can't run unless they are slow to grab you again...
|
||||
return 0
|
||||
return 0
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
..()
|
||||
if(isliving(M))
|
||||
to_chat(M, "<span class='danger'>You are stunned by the powerful acid of the Deathnettle!</span>")
|
||||
add_logs(user, M, "attacked", src)
|
||||
add_attack_logs(user, M, "Hit with [src]")
|
||||
|
||||
M.AdjustEyeBlurry(force/7)
|
||||
if(prob(20))
|
||||
|
||||
@@ -136,7 +136,7 @@ var/list/karma_spenders = list()
|
||||
|
||||
var/special_role = "None"
|
||||
var/assigned_role = "None"
|
||||
var/karma_diary = file("data/logs/karma_[time2text(world.realtime, "YYYY/MM-Month/DD-Day")].log")
|
||||
var/karma_diary = file("[GLOB.log_directory]/karma.log")
|
||||
if(M.mind)
|
||||
if(M.mind.special_role)
|
||||
special_role = M.mind.special_role
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
var/DBQuery/_query = dbcon.NewQuery(sql)
|
||||
_query.Execute()
|
||||
if(_query.ErrorMsg())
|
||||
log_to_dd(_query.ErrorMsg())
|
||||
log_world(_query.ErrorMsg())
|
||||
|
||||
var/list/results = list()
|
||||
while(_query.NextRow())
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
if(!damage)
|
||||
playsound(D.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
D.visible_message("<span class='warning'>[A] has attempted to hit [D] with a [atk_verb]!</span>")
|
||||
add_logs(A, D, "attempted to hit", atk_verb)
|
||||
add_attack_logs(A, D, "Melee attacked with [src] (miss/block)")
|
||||
return 0
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
"<span class='userdanger'>[A] has hit [D] with a [atk_verb]!</span>")
|
||||
|
||||
D.apply_damage(damage, STAMINA, affecting, armor_block)
|
||||
add_logs(A, D, "punched")
|
||||
add_attack_logs(A, D, "Melee attacked with [src]")
|
||||
if(D.getStaminaLoss() > 50)
|
||||
var/knockout_prob = D.getStaminaLoss() + rand(-15,15)
|
||||
if((D.stat != DEAD) && prob(knockout_prob))
|
||||
@@ -61,7 +61,7 @@
|
||||
return 1
|
||||
|
||||
/datum/martial_art/drunk_brawling/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
|
||||
add_logs(A, D, "punched")
|
||||
add_attack_logs(A, D, "Melee attacked with [src]")
|
||||
A.do_attack_animation(D)
|
||||
|
||||
var/atk_verb = pick("jab","uppercut","overhand punch","drunken right hook","drunken left hook")
|
||||
|
||||
@@ -108,7 +108,7 @@ datum/martial_art/krav_maga/grab_act(var/mob/living/carbon/human/A, var/mob/livi
|
||||
/datum/martial_art/krav_maga/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
|
||||
if(check_streak(A,D))
|
||||
return 1
|
||||
add_logs(A, D, "punched")
|
||||
add_attack_logs(A, D, "Melee attacked with [src]")
|
||||
A.do_attack_animation(D)
|
||||
var/picked_hit_type = pick("punches", "kicks")
|
||||
var/bonus_damage = 10
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
|
||||
D.apply_damage(damage, BRUTE, affecting, armor_block)
|
||||
|
||||
add_logs(A, D, "punched")
|
||||
add_attack_logs(A, D, "Melee attacked with [src]")
|
||||
|
||||
if((D.stat != DEAD) && damage >= A.species.punchstunthreshold)
|
||||
D.visible_message("<span class='danger'>[A] has weakened [D]!!</span>", \
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
|
||||
D.apply_damage(damage, STAMINA, affecting, armor_block)
|
||||
add_logs(A, D, "mimechucked")
|
||||
add_attack_logs(A, D, "Melee attacked with [src] (mimechuck)")
|
||||
|
||||
return 1
|
||||
return basic_hit(A,D)
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
var/armor_block = D.run_armor_check(null, "melee")
|
||||
D.apply_damage(30, BRUTE, null, armor_block)
|
||||
D.apply_effect(6, WEAKEN, armor_block)
|
||||
add_logs(A, D, "suplexed")
|
||||
add_attack_logs(A, D, "Melee attacked with [src] (SUPLEX)")
|
||||
|
||||
A.SpinAnimation(10,1)
|
||||
|
||||
|
||||
@@ -682,7 +682,7 @@
|
||||
playsound(src,'sound/weapons/resonator_blast.ogg',50,1)
|
||||
if(creator)
|
||||
for(var/mob/living/L in src.loc)
|
||||
add_logs(creator, L, "used a resonator field on", object="resonator")
|
||||
add_attack_logs(creator, L, "Resonance field'ed")
|
||||
to_chat(L, "<span class='danger'>The [src.name] ruptured with you in it!</span>")
|
||||
L.adjustBruteLoss(resonance_damage)
|
||||
else
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
if(proximity_flag)
|
||||
spawn(0)
|
||||
aoe_burst(T, user)
|
||||
add_logs(user, target, "fired 3x3 blast at", src)
|
||||
add_attack_logs(user, target, "Fired 3x3 blast at [src]")
|
||||
else
|
||||
if(ismineralturf(target) && get_dist(user, target) < 6) //target is minerals, we can hit it(even if we can't see it)
|
||||
spawn(0)
|
||||
@@ -39,11 +39,11 @@
|
||||
if(isliving(target) && chaser_timer <= world.time) //living and chasers off cooldown? fire one!
|
||||
chaser_timer = world.time + chaser_cooldown
|
||||
new /obj/effect/temp_visual/hierophant/chaser(get_turf(user), user, target, 1.5, friendly_fire_check)
|
||||
add_logs(user, target, "fired a chaser at", src)
|
||||
add_attack_logs(user, target, "Fired a chaser at [src]")
|
||||
else
|
||||
spawn(0)
|
||||
cardinal_blasts(T, user) //otherwise, just do cardinal blast
|
||||
add_logs(user, target, "fired cardinal blast at", src)
|
||||
add_attack_logs(user, target, "Fired cardinal blast at [src]")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>That target is out of range!</span>") //too far away
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
to_chat(user, "<span class='warning'>The rune is blocked by something, preventing teleportation!</span>")
|
||||
user.update_action_buttons_icon()
|
||||
return
|
||||
add_logs(user, rune, "teleported self from ([source.x],[source.y],[source.z]) to")
|
||||
add_attack_logs(user, rune, "Teleported self from ([source.x],[source.y],[source.z]) to ([T.x],[T.y],[T.z])")
|
||||
new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, user)
|
||||
new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, user)
|
||||
for(var/t in RANGE_TURFS(1, T))
|
||||
@@ -150,7 +150,7 @@
|
||||
return
|
||||
M.visible_message("<span class='hierophant_warning'>[M] fades in!</span>")
|
||||
if(user != M)
|
||||
add_logs(user, M, "teleported", null, "from ([source.x],[source.y],[source.z])")
|
||||
add_attack_logs(user, M, "Teleported from ([source.x],[source.y],[source.z])")
|
||||
|
||||
/obj/item/hierophant_staff/proc/cardinal_blasts(turf/T, mob/living/user) //fire cardinal cross blasts with a delay
|
||||
if(!T)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
if(!message)
|
||||
return
|
||||
|
||||
log_say("Ghost/[src.key] : [message]")
|
||||
log_ghostsay(message, src)
|
||||
|
||||
if(src.client)
|
||||
if(src.client.prefs.muted & MUTE_DEADCHAT)
|
||||
@@ -26,7 +26,7 @@
|
||||
if(act != "me")
|
||||
return
|
||||
|
||||
log_emote("Ghost/[src.key] : [message]")
|
||||
log_ghostemote(message, src)
|
||||
|
||||
if(src.client)
|
||||
if(src.client.prefs.muted & MUTE_DEADCHAT)
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
|
||||
|
||||
if(message)
|
||||
log_emote("[name]/[key] : [message]")
|
||||
log_emote(message, src)
|
||||
|
||||
//Hearing gasp and such every five seconds is not good emotes were not global for a reason.
|
||||
// Maybe some people are okay with that.
|
||||
@@ -94,7 +94,6 @@
|
||||
O.show_message(message, m_type)
|
||||
|
||||
/mob/proc/emote_dead(var/message)
|
||||
|
||||
if(client.prefs.muted & MUTE_DEADCHAT)
|
||||
to_chat(src, "<span class='warning'>You cannot send deadchat emotes (muted).</span>")
|
||||
return
|
||||
@@ -122,8 +121,6 @@
|
||||
|
||||
|
||||
if(message)
|
||||
log_emote("Ghost/[src.key] : [message]")
|
||||
|
||||
for(var/mob/M in player_list)
|
||||
if(istype(M, /mob/new_player))
|
||||
continue
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
if(!check_can_speak(speaker))
|
||||
return FALSE
|
||||
|
||||
log_say("[key_name(speaker)]: ([name]) [message]")
|
||||
log_say("([name]-HIVE) [message]", speaker)
|
||||
|
||||
if(!speaker_mask)
|
||||
speaker_mask = speaker.name
|
||||
@@ -553,14 +553,13 @@
|
||||
var/drone_only
|
||||
|
||||
/datum/language/binary/broadcast(mob/living/speaker, message, speaker_mask)
|
||||
|
||||
if(!speaker.binarycheck())
|
||||
return
|
||||
|
||||
if(!message)
|
||||
return
|
||||
|
||||
log_robot("[key_name(speaker)] : [message]")
|
||||
log_say("(ROBOT) [message]", speaker)
|
||||
var/message_start = "<i><span class='game say'>[name], <span class='name'>[speaker.name]</span>"
|
||||
var/message_body = "<span class='message'>[speaker.say_quote(message)],</i><span class='robot'>\"[message]\"</span></span></span>"
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ In all, this is a lot like the monkey code. /N
|
||||
visible_message("<span class='danger'>[M.name] bites [src]!</span>", \
|
||||
"<span class='userdanger'>[M.name] bites [src]!</span>")
|
||||
adjustBruteLoss(damage)
|
||||
add_logs(M, src, "attacked", admin=0, print_attack_log = 0)
|
||||
add_attack_logs(M, src, "Alien attack", FALSE)
|
||||
updatehealth()
|
||||
else
|
||||
to_chat(M, "<span class='warning'>[name] is too injured for that.</span>")
|
||||
|
||||
@@ -43,7 +43,7 @@ Doesn't work on other aliens/AI.*/
|
||||
adjustPlasma(-10)
|
||||
var/msg = sanitize(input("Message:", "Alien Whisper") as text|null)
|
||||
if(msg)
|
||||
log_say("Alien Whisper: [key_name(src)]->[key_name(M)]: [msg]")
|
||||
log_say("(AWHISPER to [key_name(M)]) [msg]", src)
|
||||
to_chat(M, "<span class='noticealien'>You hear a strange, alien voice in your head...<span class='noticealien'>[msg]")
|
||||
to_chat(src, "<span class='noticealien'>You said: [msg] to [M]</span>")
|
||||
for(var/mob/dead/observer/G in player_list)
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
else
|
||||
to_chat(src, text("Invalid Emote: []", act))
|
||||
if((message && src.stat == 0))
|
||||
log_emote("[name]/[key] : [message]")
|
||||
log_emote(message, src)
|
||||
if(m_type & 1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(message, m_type)
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
"<span class='userdanger'>[M] [M.attacktext] [src]!</span>")
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
adjustBruteLoss(damage)
|
||||
add_logs(M, src, "attacked", admin=0, print_attack_log = 0)
|
||||
add_attack_logs(M, src, "Animal attacked", FALSE)
|
||||
updatehealth()
|
||||
|
||||
|
||||
|
||||
@@ -564,7 +564,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
var/start_T_descriptor = "<font color='#6b5d00'>tile at [start_T.x], [start_T.y], [start_T.z] in area [get_area(start_T)]</font>"
|
||||
var/end_T_descriptor = "<font color='#6b4400'>tile at [end_T.x], [end_T.y], [end_T.z] in area [get_area(end_T)]</font>"
|
||||
|
||||
add_logs(src, throwable_mob, "thrown", addition="from [start_T_descriptor] with the target [end_T_descriptor]")
|
||||
add_attack_logs(src, throwable_mob, "Thrown from [start_T_descriptor] with the target [end_T_descriptor]")
|
||||
|
||||
else if(!(I.flags & ABSTRACT)) //can't throw abstract items
|
||||
thrown_thing = I
|
||||
@@ -1018,9 +1018,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/proc/forceFedAttackLog(var/obj/item/reagent_containers/food/toEat, mob/user)
|
||||
create_attack_log("<font color='orange'>Has been fed [toEat.name] by [user.name] ([user.ckey]) Reagents: [toEat.reagentlist(toEat)]</font>")
|
||||
user.create_attack_log("<font color='red'>Fed [toEat.name] to [name] ([ckey]) Reagents: [toEat.reagentlist(toEat)]</font>")
|
||||
log_attack("[user.name] ([user.ckey]) fed [name] ([ckey]) with [toEat.name] Reagents: [toEat.reagentlist(toEat)] (INTENT: [uppertext(user.a_intent)])")
|
||||
add_attack_logs(user, src, "Fed [toEat]. Reagents: [toEat.reagentlist(toEat)]")
|
||||
if(!iscarbon(user))
|
||||
LAssailant = null
|
||||
else
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
med_hud_set_status()
|
||||
if(mind) mind.store_memory("Time of death: [station_time_timestamp("hh:mm:ss", timeofdeath)]", 0)
|
||||
if(ticker && ticker.mode)
|
||||
// log_to_dd("k")
|
||||
// log_world("k")
|
||||
sql_report_death(src)
|
||||
ticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
|
||||
|
||||
|
||||
@@ -898,7 +898,7 @@
|
||||
to_chat(src, "<span class='notice'>Unusable emote '[act]'. Say *help for a list.</span>")
|
||||
|
||||
if(message) //Humans are special fucking snowflakes and have 800 lines of emotes, they get to handle their own emotes, not call the parent.
|
||||
log_emote("[name]/[key] : [message]")
|
||||
log_emote(message, src)
|
||||
|
||||
//Hearing gasp and such every five seconds is not good emotes were not global for a reason.
|
||||
// Maybe some people are okay with that.
|
||||
|
||||
@@ -315,7 +315,7 @@
|
||||
M.do_attack_animation(src)
|
||||
visible_message("<span class='danger'>[M] [M.attacktext] [src]!</span>", \
|
||||
"<span class='userdanger'>[M] [M.attacktext] [src]!</span>")
|
||||
add_logs(M, src, "attacked")
|
||||
add_attack_logs(M, src, "Animal attacked")
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
if(check_shields(damage, "the [M.name]", null, MELEE_ATTACK, M.armour_penetration))
|
||||
return 0
|
||||
@@ -753,12 +753,12 @@
|
||||
unEquip(pocket_item)
|
||||
if(thief_mode)
|
||||
usr.put_in_hands(pocket_item)
|
||||
add_logs(usr, src, "stripped", addition="of [pocket_item]", print_attack_log = isLivingSSD(src))
|
||||
add_attack_logs(usr, src, "Stripped of [pocket_item]", isLivingSSD(src))
|
||||
else
|
||||
if(place_item)
|
||||
usr.unEquip(place_item)
|
||||
equip_to_slot_if_possible(place_item, pocket_id, 0, 1)
|
||||
add_logs(usr, src, "equipped", addition="with [pocket_item]", print_attack_log = isLivingSSD(src))
|
||||
add_attack_logs(usr, src, "Equipped with [pocket_item]", isLivingSSD(src))
|
||||
|
||||
// Update strip window
|
||||
if(usr.machine == src && in_range(src, usr))
|
||||
@@ -767,7 +767,7 @@
|
||||
// Display a warning if the user mocks up if they don't have pickpocket gloves.
|
||||
if(!thief_mode)
|
||||
to_chat(src, "<span class='warning'>You feel your [pocket_side] pocket being fumbled with!</span>")
|
||||
add_logs(usr, src, "attempted to strip", addition="of [pocket_item]", print_attack_log = isLivingSSD(src))
|
||||
add_attack_logs(usr, src, "Attempted strip of [pocket_item]", isLivingSSD(src))
|
||||
|
||||
if(href_list["set_sensor"])
|
||||
if(istype(w_uniform, /obj/item/clothing/under))
|
||||
@@ -782,7 +782,7 @@
|
||||
"<span class='danger'>You have dislodged everything from [src]'s headpocket!</span>")
|
||||
var/obj/item/organ/internal/headpocket/C = get_int_organ(/obj/item/organ/internal/headpocket)
|
||||
C.empty_contents()
|
||||
add_logs(usr, src, "stripped", addition="of headpocket items", print_attack_log=isLivingSSD(src))
|
||||
add_attack_logs(usr, src, "Stripped of headpocket items", isLivingSSD(src))
|
||||
|
||||
if(href_list["strip_accessory"])
|
||||
if(istype(w_uniform, /obj/item/clothing/under))
|
||||
|
||||
@@ -18,35 +18,6 @@
|
||||
|
||||
..()
|
||||
|
||||
if((M != src) && M.a_intent != INTENT_HELP && check_shields(0, M.name, attack_type = UNARMED_ATTACK))
|
||||
add_logs(M, src, "attempted to touch")
|
||||
visible_message("<span class='warning'>[M] attempted to touch [src]!</span>")
|
||||
return 0
|
||||
|
||||
if(istype(M.gloves , /obj/item/clothing/gloves/boxing/hologlove))
|
||||
|
||||
var/damage = rand(0, 9)
|
||||
if(!damage)
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has attempted to punch [src]!</span>")
|
||||
return 0
|
||||
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
|
||||
if(HULK in M.mutations)
|
||||
damage += 5
|
||||
Weaken(4)
|
||||
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
|
||||
visible_message("<span class='danger'>[M] has punched [src]!</span>")
|
||||
|
||||
apply_damage(damage, STAMINA, affecting, armor_block)
|
||||
if(damage >= 9)
|
||||
visible_message("<span class='danger'>[M] has weakened [src]!</span>")
|
||||
apply_effect(4, WEAKEN, armor_block)
|
||||
|
||||
return
|
||||
|
||||
var/datum/martial_art/attacker_style = M.martial_art
|
||||
|
||||
@@ -63,11 +34,11 @@
|
||||
if(S.next_step(M, src))
|
||||
return 1
|
||||
help_shake_act(M)
|
||||
add_logs(M, src, "shaked")
|
||||
add_attack_logs(M, src, "Shaked")
|
||||
return 1
|
||||
if(health >= config.health_threshold_crit)
|
||||
help_shake_act(M)
|
||||
add_logs(M, src, "shaked")
|
||||
add_attack_logs(M, src, "Shaked")
|
||||
return 1
|
||||
if(!H.check_has_mouth())
|
||||
to_chat(H, "<span class='danger'>You don't have a mouth, you cannot perform CPR!</span>")
|
||||
@@ -94,7 +65,7 @@
|
||||
|
||||
to_chat(src, "<span class='notice'>You feel a breath of fresh air enter your lungs. It feels good.</span>")
|
||||
to_chat(M, "<span class='alert'>Repeat at least every 7 seconds.")
|
||||
add_logs(M, src, "CPRed")
|
||||
add_attack_logs(M, src, "CPRed", FALSE)
|
||||
return 1
|
||||
else
|
||||
to_chat(M, "<span class='danger'>You need to stay still while performing CPR!</span>")
|
||||
@@ -123,8 +94,7 @@
|
||||
return
|
||||
//we're good to suck the blood, blaah
|
||||
M.mind.vampire.handle_bloodsucking(src)
|
||||
add_logs(M, src, "vampirebit")
|
||||
msg_admin_attack("[key_name_admin(M)] vampirebit [key_name_admin(src)]")
|
||||
add_attack_logs(M, src, "vampirebit")
|
||||
return
|
||||
//end vampire codes
|
||||
if(attacker_style && attacker_style.harm_act(H, src))
|
||||
@@ -133,7 +103,7 @@
|
||||
var/datum/unarmed_attack/attack = M.species.unarmed
|
||||
|
||||
M.do_attack_animation(src)
|
||||
add_logs(M, src, "[pick(attack.attack_verb)]ed")
|
||||
add_attack_logs(M, src, "Melee attacked with fists")
|
||||
|
||||
if(!iscarbon(M))
|
||||
LAssailant = null
|
||||
@@ -172,7 +142,7 @@
|
||||
if(attacker_style && attacker_style.disarm_act(H, src))
|
||||
return 1
|
||||
else
|
||||
add_logs(M, src, "disarmed")
|
||||
add_attack_logs(M, src, "Disarmed")
|
||||
|
||||
if(w_uniform)
|
||||
w_uniform.add_fingerprint(M)
|
||||
@@ -182,14 +152,11 @@
|
||||
apply_effect(2, WEAKEN, run_armor_check(affecting, "melee"))
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has pushed [src]!</span>")
|
||||
M.create_attack_log("<font color='red'>Pushed [src.name] ([src.ckey])</font>")
|
||||
src.create_attack_log("<font color='orange'>Has been pushed by [M.name] ([M.ckey])</font>")
|
||||
add_attack_logs(M, src, "Pushed over")
|
||||
if(!iscarbon(M))
|
||||
LAssailant = null
|
||||
else
|
||||
LAssailant = M
|
||||
|
||||
log_attack("[M.name] ([M.ckey]) pushed [src.name] ([src.ckey])")
|
||||
return
|
||||
|
||||
var/talked = 0 // BubbleWrap
|
||||
|
||||
@@ -191,9 +191,7 @@ emp_act
|
||||
--meatleft
|
||||
to_chat(user, "<span class='warning'>You hack off a chunk of meat from [name]</span>")
|
||||
if(!meatleft)
|
||||
create_attack_log("Was chopped up into meat by <b>[key_name(user)]</b>")
|
||||
user.create_attack_log("Chopped up <b>[key_name(src)]</b> into meat</b>")
|
||||
msg_admin_attack("[key_name_admin(user)] chopped up [key_name_admin(src)] into meat")
|
||||
add_attack_logs(user, src, "Chopped up into meat")
|
||||
if(!iscarbon(user))
|
||||
LAssailant = null
|
||||
else
|
||||
@@ -371,10 +369,7 @@ emp_act
|
||||
visible_message("<span class='danger'>[src] has been hit by [M.name].</span>", \
|
||||
"<span class='userdanger'>[src] has been hit by [M.name].</span>")
|
||||
|
||||
create_attack_log("<font color='orange'>Has been attacked by \the [M] controlled by [key_name(M.occupant)] (INTENT: [uppertext(M.occupant.a_intent)])</font>")
|
||||
M.occupant.create_attack_log("<font color='red'>Attacked [src] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)])</font>")
|
||||
msg_admin_attack("[key_name_admin(M.occupant)] attacked [key_name_admin(src)] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)])")
|
||||
|
||||
add_attack_logs(M.occupant, src, "Mecha-meleed with [M]")
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
@@ -78,9 +78,7 @@
|
||||
head_organ.h_style = "Bald"
|
||||
H.update_hair()
|
||||
|
||||
M.create_attack_log("<font color='red'>removed antennae [H.name] ([H.ckey])</font>")
|
||||
H.create_attack_log("<font color='orange'>Has had their antennae removed by [M.name] ([M.ckey])</font>")
|
||||
msg_admin_attack("[key_name(M)] removed [key_name(H)]'s antennae")
|
||||
add_attack_logs(M, H, "Antennae removed")
|
||||
return 0
|
||||
|
||||
/datum/species/nucleation
|
||||
|
||||
@@ -816,7 +816,7 @@
|
||||
who.unEquip(what)
|
||||
if(silent)
|
||||
put_in_hands(what)
|
||||
add_logs(src, who, "stripped", addition="of [what]", print_attack_log = isLivingSSD(who))
|
||||
add_attack_logs(src, who, "Stripped of [what]", isLivingSSD(who))
|
||||
|
||||
// The src mob is trying to place an item on someone
|
||||
// Override if a certain mob should be behave differently when placing items (can't, for example)
|
||||
@@ -835,7 +835,7 @@
|
||||
if(what && Adjacent(who))
|
||||
unEquip(what)
|
||||
who.equip_to_slot_if_possible(what, where, 0, 1)
|
||||
add_logs(src, who, "equipped", what, print_attack_log = isLivingSSD(who))
|
||||
add_attack_logs(src, who, "Equipped [what]", isLivingSSD(who))
|
||||
|
||||
|
||||
/mob/living/singularity_act()
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].", I.armour_penetration)
|
||||
apply_damage(I.throwforce, dtype, zone, armor, is_sharp(I), I)
|
||||
if(I.thrownby)
|
||||
add_logs(I.thrownby, src, "hit", I)
|
||||
add_attack_logs(I.thrownby, src, "Hit with thrown [I]")
|
||||
else
|
||||
return 1
|
||||
else
|
||||
@@ -126,14 +126,10 @@
|
||||
M.occupant_message("<span class='danger'>You hit [src].</span>")
|
||||
visible_message("<span class='danger'>[src] has been hit by [M.name].</span>", \
|
||||
"<span class='userdanger'>[src] has been hit by [M.name].</span>")
|
||||
create_attack_log("<font color='orange'>Has been attacked by \the [M] controlled by [key_name(M.occupant)] (INTENT: [uppertext(M.occupant.a_intent)])</font>")
|
||||
M.occupant.create_attack_log("<font color='red'>Attacked [src] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)])</font>")
|
||||
msg_admin_attack("[key_name_admin(M.occupant)] attacked [key_name_admin(src)] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)])")
|
||||
|
||||
add_attack_logs(M.occupant, src, "Mecha-meleed with [M]")
|
||||
else
|
||||
|
||||
step_away(src,M)
|
||||
add_logs(M.occupant, src, "pushed", object=M, admin=0, print_attack_log = 0)
|
||||
add_attack_logs(M.occupant, src, "Mecha-pushed with [M]", FALSE)
|
||||
M.occupant_message("<span class='warning'>You push [src] out of the way.</span>")
|
||||
visible_message("<span class='warning'>[M] pushes [src] out of the way.</span>")
|
||||
return
|
||||
@@ -244,7 +240,7 @@
|
||||
to_chat(user, "<span class='notice'>You already grabbed [src].</span>")
|
||||
return
|
||||
|
||||
add_logs(user, src, "grabbed", addition="passively")
|
||||
add_attack_logs(user, src, "Grabbed passively")
|
||||
|
||||
var/obj/item/grab/G = new /obj/item/grab(user, src)
|
||||
if(buckled)
|
||||
|
||||
@@ -286,7 +286,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
//Log of what we've said, plain message, no spans or junk
|
||||
say_log += message
|
||||
|
||||
log_say("[name]/[key] : [message]")
|
||||
log_say(message, src)
|
||||
return 1
|
||||
|
||||
/mob/living/proc/say_signlang(var/message, var/verb="gestures", var/datum/language/language)
|
||||
@@ -313,7 +313,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
return 1
|
||||
|
||||
if(act && type && message) //parent call
|
||||
log_emote("[name]/[key] : [message]")
|
||||
log_emote(message, src)
|
||||
|
||||
for(var/mob/M in dead_mob_list)
|
||||
if(!M.client || istype(M, /mob/new_player))
|
||||
@@ -485,7 +485,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
for(var/mob/M in watching)
|
||||
M.show_message(rendered, 2)
|
||||
|
||||
log_whisper("[name]/[key] : [message]")
|
||||
log_whisper(message, src)
|
||||
return 1
|
||||
|
||||
/mob/living/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list())
|
||||
|
||||
@@ -725,7 +725,7 @@ var/list/ai_verbs_default = list(
|
||||
if(M.attack_sound)
|
||||
playsound(loc, M.attack_sound, 50, 1, 1)
|
||||
visible_message("<span class='danger'><B>[M]</B> [M.attacktext] [src]!")
|
||||
add_logs(M, src, "attacked", admin=0, print_attack_log = 0)
|
||||
add_attack_logs(M, src, "Animal attacked", FALSE)
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
switch(M.melee_damage_type)
|
||||
if(BRUTE)
|
||||
|
||||
@@ -913,7 +913,7 @@ var/list/robot_verbs_default = list(
|
||||
if(M.attack_sound)
|
||||
playsound(loc, M.attack_sound, 50, 1, 1)
|
||||
visible_message("<span class='danger'><B>[M]</B> [M.attacktext] [src]!</span>")
|
||||
add_logs(M, src, "attacked", admin=0, print_attack_log = 0)
|
||||
add_attack_logs(M, src, "Animal attacked", FALSE)
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
switch(M.melee_damage_type)
|
||||
if(BRUTE)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/mob/living/silicon/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
|
||||
log_say("[key_name(src)] : [message]")
|
||||
log_say(message, src)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
@@ -67,8 +67,7 @@
|
||||
|
||||
//For holopads only. Usable by AI.
|
||||
/mob/living/silicon/ai/proc/holopad_talk(var/message, verb, datum/language/speaking)
|
||||
|
||||
log_say("[key_name(src)] : [message]")
|
||||
log_say("(HPAD) [message]", src)
|
||||
|
||||
message = trim(message)
|
||||
|
||||
@@ -108,9 +107,6 @@
|
||||
return 1
|
||||
|
||||
/mob/living/silicon/ai/proc/holopad_emote(var/message) //This is called when the AI uses the 'me' verb while using a holopad.
|
||||
|
||||
log_emote("[key_name(src)] : [message]")
|
||||
|
||||
message = trim(message)
|
||||
|
||||
if(!message)
|
||||
@@ -123,6 +119,8 @@
|
||||
|
||||
for(var/mob/M in viewers(T.loc))
|
||||
M.show_message(rendered, 2)
|
||||
|
||||
log_emote("(HPAD) [message]", src)
|
||||
else //This shouldn't occur, but better safe then sorry.
|
||||
to_chat(src, "No holopad connected.")
|
||||
return
|
||||
|
||||
@@ -219,7 +219,7 @@
|
||||
turn_on() //The bot automatically turns on when emagged, unless recently hit with EMP.
|
||||
to_chat(src, "<span class='userdanger'>(#$*#$^^( OVERRIDE DETECTED</span>")
|
||||
show_laws()
|
||||
add_logs(user, src, "emagged")
|
||||
add_attack_logs(user, src, "Emagged")
|
||||
return
|
||||
else //Bot is unlocked, but the maint panel has not been opened with a screwdriver yet.
|
||||
to_chat(user, "<span class='warning'>You need to open maintenance panel first!</span>")
|
||||
@@ -273,7 +273,7 @@
|
||||
return
|
||||
apply_damage(M.melee_damage_upper, BRUTE)
|
||||
visible_message("<span class='userdanger'>[M] has [M.attacktext] [src]!</span>")
|
||||
add_logs(M, src, "attacked", admin=0, print_attack_log = 0)
|
||||
add_attack_logs(M, src, "Animal attacked", FALSE)
|
||||
if(prob(10))
|
||||
new /obj/effect/decal/cleanable/blood/oil(loc)
|
||||
|
||||
@@ -333,7 +333,7 @@
|
||||
bot_name = name
|
||||
name = paicard.pai.name
|
||||
faction = user.faction
|
||||
add_logs(user, paicard.pai, "uploaded to [src.bot_name],")
|
||||
add_attack_logs(user, paicard.pai, "Uploaded to [src.bot_name]")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[W] is inactive.</span>")
|
||||
else
|
||||
@@ -865,7 +865,7 @@ Pass a positive integer as an argument to override a bot's default speed.
|
||||
to_chat(usr, "<span class='warning'>[text_hack]</span>")
|
||||
show_laws()
|
||||
bot_reset()
|
||||
add_logs(usr, src, "hacked")
|
||||
add_attack_logs(usr, src, "Hacked")
|
||||
else if(!hacked)
|
||||
to_chat(usr, "<span class='userdanger'>[text_dehack_fail]</span>")
|
||||
else
|
||||
@@ -874,7 +874,7 @@ Pass a positive integer as an argument to override a bot's default speed.
|
||||
to_chat(usr, "<span class='notice'>[text_dehack]</span>")
|
||||
show_laws()
|
||||
bot_reset()
|
||||
add_logs(usr, src, "dehacked")
|
||||
add_attack_logs(usr, src, "Dehacked")
|
||||
if("ejectpai")
|
||||
if(paicard && (!locked || issilicon(usr) || usr.can_admin_interact()))
|
||||
to_chat(usr, "<span class='notice'>You eject [paicard] from [bot_name]</span>")
|
||||
@@ -946,9 +946,9 @@ Pass a positive integer as an argument to override a bot's default speed.
|
||||
key = null
|
||||
paicard.forceMove(loc)
|
||||
if(user)
|
||||
add_logs(user, paicard.pai, "ejected from [src.bot_name],")
|
||||
add_attack_logs(user, paicard.pai, "Ejected from [src.bot_name],")
|
||||
else
|
||||
add_logs(src, paicard.pai, "ejected")
|
||||
add_attack_logs(src, paicard.pai, "Ejected")
|
||||
if(announce)
|
||||
to_chat(paicard.pai, "<span class='notice'>You feel your control fade as [paicard] ejects from [bot_name].</span>")
|
||||
paicard = null
|
||||
|
||||
@@ -550,7 +550,7 @@ Auto Patrol[]"},
|
||||
C.Weaken(5)
|
||||
C.stuttering = 5
|
||||
C.Stun(5)
|
||||
add_logs(src, C, "stunned")
|
||||
add_attack_logs(src, C, "Stunned by [src]")
|
||||
if(declare_arrests)
|
||||
var/area/location = get_area(src)
|
||||
speak("[arrest_type ? "Detaining" : "Arresting"] level [threat] scumbag <b>[C]</b> in [location].", radio_channel)
|
||||
|
||||
@@ -684,7 +684,7 @@
|
||||
visible_message("<span class='danger'>[src] bumps into [M]!</span>")
|
||||
else
|
||||
if(!paicard)
|
||||
add_logs(src, M, "knocked down")
|
||||
add_attack_logs(src, M, "Knocked down")
|
||||
visible_message("<span class='danger'>[src] knocks over [M]!</span>")
|
||||
M.stop_pulling()
|
||||
M.Stun(8)
|
||||
@@ -692,7 +692,7 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/bot/mulebot/proc/RunOver(mob/living/carbon/human/H)
|
||||
add_logs(src, H, "run over", null, "(DAMTYPE: [uppertext(BRUTE)])")
|
||||
add_attack_logs(src, H, "Run over (DAMTYPE: [uppertext(BRUTE)])")
|
||||
H.visible_message("<span class='danger'>[src] drives over [H]!</span>", \
|
||||
"<span class='userdanger'>[src] drives over you!<span>")
|
||||
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
|
||||
|
||||
@@ -260,7 +260,7 @@ Auto Patrol: []"},
|
||||
C.Weaken(5)
|
||||
C.stuttering = 5
|
||||
C.Stun(5)
|
||||
add_logs(src, C, "stunned")
|
||||
add_attack_logs(src, C, "Stunned by [src]")
|
||||
if(declare_arrests)
|
||||
var/area/location = get_area(src)
|
||||
speak("[arrest_type ? "Detaining" : "Arresting"] level [threat] scumbag <b>[C]</b> in [location].", radio_channel)
|
||||
|
||||
@@ -137,7 +137,7 @@
|
||||
to_chat(user, "<span class='notice'>You short out the security protocols and rewrite [src]'s internal memory.</span>")
|
||||
to_chat(src, "<span class='userdanger'>You have been emagged; you are now completely loyal to [user] and their every order!</span>")
|
||||
emagged_master = user.name
|
||||
add_logs(user, src, "emagged")
|
||||
add_attack_logs(user, src, "Emagged")
|
||||
maxHealth = 60
|
||||
health = 60
|
||||
melee_damage_lower = 15
|
||||
|
||||
@@ -547,7 +547,7 @@ Difficulty: Hard
|
||||
L.apply_damage(damage, BURN, limb_to_hit, armor)
|
||||
if(ismegafauna(L) || istype(L, /mob/living/simple_animal/hostile/asteroid))
|
||||
L.adjustBruteLoss(damage)
|
||||
add_logs(caster, L, "struck with a [name]")
|
||||
add_attack_logs(caster, L, "Struck with a [name]")
|
||||
for(var/obj/mecha/M in T.contents - hit_things) //and mechs.
|
||||
hit_things += M
|
||||
if(M.occupant)
|
||||
|
||||
@@ -273,7 +273,7 @@
|
||||
playsound(loc, M.attack_sound, 50, 1, 1)
|
||||
visible_message("<span class='danger'>\The [M] [M.attacktext] [src]!</span>", \
|
||||
"<span class='userdanger'>\The [M] [M.attacktext] [src]!</span>")
|
||||
add_logs(M, src, "attacked", admin=0, print_attack_log = 0)
|
||||
add_attack_logs(M, src, "Animal attacked")
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
attack_threshold_check(damage,M.melee_damage_type)
|
||||
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
return 0
|
||||
else if(stat == UNCONSCIOUS)
|
||||
return 0
|
||||
add_logs(src, null, "fallen unconscious at [atom_loc_line(get_turf(src))]", admin=0, print_attack_log = 0)
|
||||
create_attack_log("<font color='red'>Fallen unconscious at [atom_loc_line(get_turf(src))]</font>")
|
||||
log_game("[key_name(src)] fell unconscious at [atom_loc_line(get_turf(src))]")
|
||||
stat = UNCONSCIOUS
|
||||
if(updating)
|
||||
// update_blind_effects()
|
||||
@@ -19,7 +20,8 @@
|
||||
return 0
|
||||
else if(stat == CONSCIOUS)
|
||||
return 0
|
||||
add_logs(src, null, "woken up at [atom_loc_line(get_turf(src))]", admin=0, print_attack_log = 0)
|
||||
create_attack_log("<font color='red'>Woken up at [atom_loc_line(get_turf(src))]</font>")
|
||||
log_game("[key_name(src)] woke up at [atom_loc_line(get_turf(src))]")
|
||||
stat = CONSCIOUS
|
||||
if(updating)
|
||||
// update_blind_effects()
|
||||
@@ -40,7 +42,8 @@
|
||||
return 0
|
||||
if(!can_be_revived())
|
||||
return 0
|
||||
add_logs(src, null, "came back to life at [atom_loc_line(get_turf(src))]", admin=0, print_attack_log = 0)
|
||||
create_attack_log("<font color='red'>Came back to life at [atom_loc_line(get_turf(src))]</font>")
|
||||
log_game("[key_name(src)] came back to life at [atom_loc_line(get_turf(src))]")
|
||||
stat = CONSCIOUS
|
||||
dead_mob_list -= src
|
||||
living_mob_list += src
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
//Multikey checks and logging
|
||||
lastKnownIP = client.address
|
||||
computer_id = client.computer_id
|
||||
log_access("Login: [key_name(src)] from [lastKnownIP ? lastKnownIP : "localhost"]-[computer_id] || BYOND v[client.byond_version]")
|
||||
log_access_in(client)
|
||||
if(config.log_access)
|
||||
for(var/mob/M in player_list)
|
||||
if(M == src) continue
|
||||
@@ -19,10 +19,10 @@
|
||||
if(matches)
|
||||
if(M.client)
|
||||
message_admins("<font color='red'><B>Notice: </B><font color='blue'><A href='?src=[usr.UID()];priv_msg=\ref[src]'>[key_name_admin(src)]</A> has the same [matches] as <A href='?src=[usr.UID()];priv_msg=\ref[M]'>[key_name_admin(M)]</A>.</font>", 1)
|
||||
log_access("Notice: [key_name(src)] has the same [matches] as [key_name(M)].")
|
||||
log_adminwarn("Notice: [key_name(src)] has the same [matches] as [key_name(M)].")
|
||||
else
|
||||
message_admins("<font color='red'><B>Notice: </B><font color='blue'><A href='?src=[usr.UID()];priv_msg=\ref[src]'>[key_name_admin(src)]</A> has the same [matches] as [key_name_admin(M)] (no longer logged in). </font>", 1)
|
||||
log_access("Notice: [key_name(src)] has the same [matches] as [key_name(M)] (no longer logged in).")
|
||||
log_adminwarn("Notice: [key_name(src)] has the same [matches] as [key_name(M)] (no longer logged in).")
|
||||
|
||||
/mob/Login()
|
||||
player_list |= src
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
SSnanoui.user_logout(src) // this is used to clean up (remove) this user's Nano UIs
|
||||
unset_machine()
|
||||
player_list -= src
|
||||
log_access("Logout: [key_name(src)]")
|
||||
log_access_out(src)
|
||||
// `holder` is nil'd out by now, so we check the `admin_datums` array directly
|
||||
//Only report this stuff if we are currently playing.
|
||||
if(admin_datums[ckey] && ticker && ticker.current_state == GAME_STATE_PLAYING)
|
||||
|
||||
@@ -272,9 +272,7 @@
|
||||
state = GRAB_NECK
|
||||
icon_state = "grabbed+1"
|
||||
assailant.setDir(get_dir(assailant, affecting))
|
||||
affecting.create_attack_log("<font color='orange'>Has had their neck grabbed by [assailant.name] ([assailant.ckey])</font>")
|
||||
assailant.create_attack_log("<font color='red'>Grabbed the neck of [affecting.name] ([affecting.ckey])</font>")
|
||||
log_attack("<font color='red'>[assailant.name] ([assailant.ckey]) grabbed the neck of [affecting.name] ([affecting.ckey])</font>")
|
||||
add_attack_logs(assailant, affecting, "Neck grabbed")
|
||||
if(!iscarbon(assailant))
|
||||
affecting.LAssailant = null
|
||||
else
|
||||
@@ -288,9 +286,7 @@
|
||||
|
||||
state = GRAB_KILL
|
||||
assailant.visible_message("<span class='danger'>[assailant] has tightened \his grip on [affecting]'s neck!</span>")
|
||||
affecting.create_attack_log("<font color='orange'>Has been strangled (kill intent) by [assailant.name] ([assailant.ckey])</font>")
|
||||
assailant.create_attack_log("<font color='red'>Strangled (kill intent) [affecting.name] ([affecting.ckey])</font>")
|
||||
msg_admin_attack("[key_name(assailant)] strangled (kill intent) [key_name(affecting)]")
|
||||
add_attack_logs(assailant, affecting, "Strangled")
|
||||
|
||||
assailant.next_move = world.time + 10
|
||||
if(!affecting.get_organ_slot("breathing_tube"))
|
||||
@@ -342,9 +338,7 @@
|
||||
damage += hat.force * 3
|
||||
affecting.apply_damage(damage*rand(90, 110)/100, BRUTE, "head", affected.run_armor_check(affecting, "melee"))
|
||||
playsound(assailant.loc, "swing_hit", 25, 1, -1)
|
||||
assailant.create_attack_log("<font color='red'>Headbutted [affecting.name] ([affecting.ckey])</font>")
|
||||
affecting.create_attack_log("<font color='orange'>Headbutted by [assailant.name] ([assailant.ckey])</font>")
|
||||
msg_admin_attack("[key_name(assailant)] has headbutted [key_name(affecting)]")
|
||||
add_attack_logs(assailant, affecting, "Headbutted")
|
||||
return
|
||||
|
||||
/*if(last_hit_zone == "eyes")
|
||||
@@ -361,9 +355,7 @@
|
||||
return
|
||||
assailant.visible_message("<span class='danger'>[assailant] presses \his fingers into [affecting]'s eyes!</span>")
|
||||
to_chat(affecting, "<span class='danger'>You feel immense pain as digits are being pressed into your eyes!</span>")
|
||||
assailant.create_attack_log("<font color='red'>Pressed fingers into the eyes of [affecting.name] ([affecting.ckey])</font>")
|
||||
affecting.create_attack_log("<font color='orange'>Had fingers pressed into their eyes by [assailant.name] ([assailant.ckey])</font>")
|
||||
msg_admin_attack("[key_name(assailant)] has pressed his fingers into [key_name(affecting)]'s eyes.")
|
||||
add_attack_logs(assailant, affecting, "Eye-fucked with their fingers")
|
||||
var/obj/item/organ/internal/eyes/eyes = affected.get_int_organ(/obj/item/organ/internal/eyes)
|
||||
eyes.damage += rand(3,4)
|
||||
if(eyes.damage >= eyes.min_broken_damage)
|
||||
@@ -400,9 +392,7 @@
|
||||
|
||||
user.visible_message("<span class='danger'>[user] devours \the [affecting]!</span>")
|
||||
if(affecting.mind)
|
||||
affecting.create_attack_log("<font color='orange'>Has been devoured by [attacker.name] ([attacker.ckey])</font>")
|
||||
attacker.create_attack_log("<font color='red'>Devoured [affecting.name] ([affecting.ckey])</font>")
|
||||
msg_admin_attack("[key_name(attacker)] devoured [key_name(affecting)]")
|
||||
add_attack_logs(attacker, affecting, "Devoured")
|
||||
|
||||
affecting.loc = user
|
||||
attacker.stomach_contents.Add(affecting)
|
||||
|
||||
@@ -331,7 +331,7 @@
|
||||
return 1
|
||||
Nuke_request(input, usr)
|
||||
to_chat(usr, "<span class='notice'>Request sent.</span>")
|
||||
log_say("[key_name(usr)] has requested the nuclear codes from Centcomm")
|
||||
log_game("[key_name(usr)] has requested the nuclear codes from Centcomm")
|
||||
priority_announcement.Announce("The codes for the on-station nuclear self-destruct have been requested by [usr]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self Destruct Codes Requested",'sound/AI/commandreport.ogg')
|
||||
centcomm_message_cooldown = 1
|
||||
spawn(6000)//10 minute cooldown
|
||||
@@ -350,7 +350,7 @@
|
||||
return 1
|
||||
Centcomm_announce(input, usr)
|
||||
to_chat(usr, "Message transmitted.")
|
||||
log_say("[key_name(usr)] has made a Centcomm announcement: [input]")
|
||||
log_game("[key_name(usr)] has made a Centcomm announcement: [input]")
|
||||
centcomm_message_cooldown = 1
|
||||
spawn(6000)//10 minute cooldown
|
||||
centcomm_message_cooldown = 0
|
||||
@@ -369,7 +369,7 @@
|
||||
return 1
|
||||
Syndicate_announce(input, usr)
|
||||
to_chat(usr, "Message transmitted.")
|
||||
log_say("[key_name(usr)] has made a Syndicate announcement: [input]")
|
||||
log_game("[key_name(usr)] has made a Syndicate announcement: [input]")
|
||||
centcomm_message_cooldown = 1
|
||||
spawn(6000)//10 minute cooldown
|
||||
centcomm_message_cooldown = 0
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
if(!message || !channel)
|
||||
return
|
||||
channel.add_message(message, username)
|
||||
log_chat("[user]/([user.ckey]) as [username] sent to [channel.title]: [message]")
|
||||
log_chat("[username] sent to [channel.title]: [message]", user)
|
||||
|
||||
if("PRG_joinchannel")
|
||||
. = 1
|
||||
|
||||
@@ -50,11 +50,11 @@
|
||||
|
||||
var/icon/Tile = icon(file("nano/mapbase1024.png"))
|
||||
if(Tile.Width() != NANOMAP_MAX_ICON_DIMENSION || Tile.Height() != NANOMAP_MAX_ICON_DIMENSION)
|
||||
log_to_dd("NanoMapGen: <B>ERROR: BASE IMAGE DIMENSIONS ARE NOT [NANOMAP_MAX_ICON_DIMENSION]x[NANOMAP_MAX_ICON_DIMENSION]</B>")
|
||||
log_world("NanoMapGen: <B>ERROR: BASE IMAGE DIMENSIONS ARE NOT [NANOMAP_MAX_ICON_DIMENSION]x[NANOMAP_MAX_ICON_DIMENSION]</B>")
|
||||
sleep(3)
|
||||
return NANOMAP_TERMINALERR
|
||||
|
||||
log_to_dd("NanoMapGen: <B>GENERATE MAP ([startX],[startY],[currentZ]) to ([endX],[endY],[currentZ])</B>")
|
||||
log_world("NanoMapGen: <B>GENERATE MAP ([startX],[startY],[currentZ]) to ([endX],[endY],[currentZ])</B>")
|
||||
to_chat(usr, "NanoMapGen: <B>GENERATE MAP ([startX],[startY],[currentZ]) to ([endX],[endY],[currentZ])</B>")
|
||||
|
||||
var/count = 0;
|
||||
@@ -71,16 +71,16 @@
|
||||
count++
|
||||
|
||||
if(count % 8000 == 0)
|
||||
log_to_dd("NanoMapGen: <B>[count] tiles done</B>")
|
||||
log_world("NanoMapGen: <B>[count] tiles done</B>")
|
||||
sleep(1)
|
||||
|
||||
var/mapFilename = "nanomap_z[currentZ]-new.png"
|
||||
|
||||
log_to_dd("NanoMapGen: <B>sending [mapFilename] to client</B>")
|
||||
log_world("NanoMapGen: <B>sending [mapFilename] to client</B>")
|
||||
|
||||
usr << browse(Tile, "window=picture;file=[mapFilename];display=0")
|
||||
|
||||
log_to_dd("NanoMapGen: <B>Done.</B>")
|
||||
log_world("NanoMapGen: <B>Done.</B>")
|
||||
|
||||
to_chat(usr, "NanoMapGen: <B>Done. File [mapFilename] uploaded to your cache.</B>")
|
||||
|
||||
|
||||
@@ -669,5 +669,5 @@
|
||||
if(!istype(G) || G.transfer_prints)
|
||||
H.reagents.add_reagent(contact_poison, contact_poison_volume)
|
||||
contact_poison = null
|
||||
add_logs(user, src, "picked up [src], the paper poisoned by [contact_poison_poisoner]")
|
||||
add_attack_logs(src, user, "Picked up [src], the paper poisoned by [contact_poison_poisoner]")
|
||||
..()
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
// to_chat(M, "<span class='danger'>You feel a tiny prick!</span>")
|
||||
. = 1
|
||||
|
||||
add_logs(user, M, "stabbed", object="[name]")
|
||||
add_attack_logs(user, M, "Stabbed with [src]")
|
||||
|
||||
else
|
||||
. = ..()
|
||||
@@ -201,7 +201,7 @@
|
||||
P.contact_poison = "amanitin"
|
||||
P.contact_poison_volume = 15
|
||||
P.contact_poison_poisoner = user.name
|
||||
add_logs(user, P, "used poison pen on")
|
||||
add_attack_logs(user, P, "Poison pen'ed")
|
||||
to_chat(user, "<span class='warning'>You apply the poison to [P].</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[src] clicks. It seems to be depleted.</span>")
|
||||
|
||||
@@ -180,7 +180,7 @@
|
||||
|
||||
SSnanoui.update_user_uis(U, P) // Update the sending user's PDA UI so that they can see the new message
|
||||
PM.notify("<b>Message from [pda.owner] ([pda.ownjob]), </b>\"[t]\" (<a href='?src=[PM.UID()];choice=Message;target=\ref[pda]'>Reply</a>)")
|
||||
log_pda("[usr] (PDA: [src.name]) sent \"[t]\" to [P.name]")
|
||||
log_pda("(PDA: [src.name]) sent \"[t]\" to [P.name]", usr)
|
||||
else
|
||||
to_chat(U, "<span class='notice'>ERROR: Messaging server is not responding.</span>")
|
||||
|
||||
|
||||
@@ -254,7 +254,7 @@
|
||||
|
||||
//remove the old powernet and replace it with a new one throughout the network.
|
||||
/proc/propagate_network(var/obj/O, var/datum/powernet/PN)
|
||||
//log_to_dd("propagating new network")
|
||||
//log_world("propagating new network")
|
||||
var/list/worklist = list()
|
||||
var/list/found_machines = list()
|
||||
var/index = 1
|
||||
|
||||
@@ -120,7 +120,7 @@
|
||||
if(radio_controller)
|
||||
radio_controller.remove_object(src, frequency)
|
||||
radio_connection = null
|
||||
msg_admin_attack("Emitter deleted at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
||||
msg_admin_attack("Emitter deleted at ([x],[y],[z] - [ADMIN_JMP(src)])", 0, 1)
|
||||
log_game("Emitter deleted at ([x],[y],[z])")
|
||||
investigate_log("<font color='red'>deleted</font> at ([x],[y],[z])","singulo")
|
||||
return ..()
|
||||
|
||||
@@ -227,9 +227,9 @@
|
||||
active = !active
|
||||
investigate_log("turned [active?"<font color='red'>ON</font>":"<font color='green'>OFF</font>"] by [usr ? usr.key : "outside forces"]","singulo")
|
||||
if(active)
|
||||
msg_admin_attack("PA Control Computer turned ON by [key_name(usr, usr.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
||||
log_game("PA Control Computer turned ON by [usr.ckey]([usr]) in ([x],[y],[z])")
|
||||
use_log += text("\[[time_stamp()]\] <font color='red'>[usr.name] ([usr.ckey]) has turned on the PA Control Computer.</font>")
|
||||
msg_admin_attack("PA Control Computer turned ON by [key_name_admin(usr)]",0,1)
|
||||
log_game("PA Control Computer turned ON by [key_name(usr)] in ([x],[y],[z])")
|
||||
use_log += text("\[[time_stamp()]\] <font color='red'>[key_name(usr)] has turned on the PA Control Computer.</font>")
|
||||
if(active)
|
||||
use_power = 2
|
||||
for(var/obj/structure/particle_accelerator/part in connected_parts)
|
||||
|
||||
@@ -173,19 +173,12 @@
|
||||
R += A.id + " ("
|
||||
R += num2text(A.volume) + "),"
|
||||
if(istype(M, /mob))
|
||||
M.create_attack_log("<b>[user]/[user.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>dartgun</b> ([R])")
|
||||
user.create_attack_log("<b>[user]/[user.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>dartgun</b> ([R])")
|
||||
if(M.ckey)
|
||||
msg_admin_attack("[key_name_admin(user)] shot [M] ([M.ckey]) with a dartgun ([R]).")
|
||||
if(!iscarbon(user))
|
||||
M.LAssailant = null
|
||||
else
|
||||
M.LAssailant = user
|
||||
|
||||
else
|
||||
M.create_attack_log("<b>UNKNOWN SUBJECT (No longer exists)</b> shot <b>[key_name_admin(M)]</b> with a <b>dartgun</b> ([R])")
|
||||
msg_admin_attack("UNKNOWN shot [key_name(M)] with a <b>dartgun</b> ([R]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
|
||||
add_attack_logs(user, M, "Shot with dartgun containing [R]", !!M.ckey)
|
||||
if(D.reagents)
|
||||
D.reagents.trans_to(M, 15)
|
||||
to_chat(M, "<span class='danger'>You feel a slight prick.</span>")
|
||||
|
||||
@@ -120,7 +120,7 @@
|
||||
reagent_note += R.id + " ("
|
||||
reagent_note += num2text(R.volume) + ") "
|
||||
if(!log_override && firer && original)
|
||||
add_logs(firer, L, "shot", src, reagent_note)
|
||||
add_attack_logs(firer, L, "Shot with a [type] (potentially containing [reagent_note])")
|
||||
return L.apply_effects(stun, weaken, paralyze, irradiate, slur, stutter, eyeblur, drowsy, blocked, stamina, jitter)
|
||||
|
||||
/obj/item/projectile/proc/get_splatter_blockage(var/turf/step_over, var/atom/target, var/splatter_dir, var/target_loca) //Check whether the place we want to splatter blood is blocked (i.e. by windows).
|
||||
|
||||
@@ -666,7 +666,7 @@
|
||||
|
||||
M.update_revive()
|
||||
M.stat = UNCONSCIOUS
|
||||
add_logs(M, M, "revived", object="strange reagent") //Yes, the logs say you revived yourself.
|
||||
add_attack_logs(M, M, "Revived with strange reagent") //Yes, the logs say you revived yourself.
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/mannitol
|
||||
|
||||
@@ -84,13 +84,9 @@
|
||||
if(M.reagents)
|
||||
var/datum/reagent/injected = chemical_reagents_list[reagent_ids[mode]]
|
||||
var/contained = injected.name
|
||||
M.create_attack_log("<font color='orange'>Has been injected with [name] by [key_name(user)]. Reagents: [contained]</font>")
|
||||
user.create_attack_log("<font color='red'>Used the [name] to inject [key_name(M)]. Reagents: [contained]</font>")
|
||||
if(M.ckey)
|
||||
msg_admin_attack("[key_name_admin(user)] injected [key_name_admin(M)] with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])")
|
||||
M.LAssailant = user
|
||||
|
||||
var/trans = R.trans_to(M, amount_per_transfer_from_this)
|
||||
add_attack_logs(M, user, "Injected with [name] containing [contained], transfered [trans] units", !!M.ckey)
|
||||
M.LAssailant = user
|
||||
to_chat(user, "<span class='notice'>[trans] units injected. [R.total_volume] units remaining.</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
injected += R.name
|
||||
var/contained = english_list(injected)
|
||||
add_logs(user, C, "dripped", src, "([contained])")
|
||||
add_attack_logs(user, C, "Dripped with [src] containing ([contained]), transfering [to_transfer]")
|
||||
|
||||
to_transfer = reagents.trans_to(C, amount_per_transfer_from_this)
|
||||
to_chat(user, "<span class='notice'>You transfer [to_transfer] units of the solution.</span>")
|
||||
|
||||
@@ -82,10 +82,7 @@
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
injected += R.name
|
||||
var/contained = english_list(injected)
|
||||
M.create_attack_log("<font color='orange'>Has been splashed with [name] by [key_name(user)]. Reagents: [contained]</font>")
|
||||
user.create_attack_log("<font color='red'>Used the [name] to splash [key_name(M)]. Reagents: [contained]</font>")
|
||||
if(M.ckey)
|
||||
msg_admin_attack("[key_name_admin(user)] splashed [key_name_admin(M)] with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])")
|
||||
add_attack_logs(M, user, "Splashed with [name] containing [contained]", !!M.ckey)
|
||||
if(!iscarbon(user))
|
||||
M.LAssailant = null
|
||||
else
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
var/contained = english_list(injected)
|
||||
|
||||
add_logs(user, M, "injected", src, "([contained])")
|
||||
add_attack_logs(user, M, "Injected with [src] containing ([contained])")
|
||||
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -145,10 +145,7 @@
|
||||
rinject += R.name
|
||||
var/contained = english_list(rinject)
|
||||
|
||||
if(L != user)
|
||||
add_logs(user, L, "injected", src, addition="which had [contained]")
|
||||
else
|
||||
log_attack("<font color='red'>[user.name] ([user.ckey]) injected [L.name] ([L.ckey]) with [src.name], which had [contained] (INTENT: [uppertext(user.a_intent)])</font>")
|
||||
add_attack_logs(user, L, "Injected with [name] containing [contained], transfered [amount_per_transfer_from_this] units")
|
||||
|
||||
var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1)
|
||||
reagents.reaction(L, INGEST, fraction)
|
||||
|
||||
@@ -133,10 +133,7 @@
|
||||
for(var/mob/C in viewers(src))
|
||||
C.show_message("<span class='warning'>[GM.name] has been placed in the [src] by [user].</span>", 3)
|
||||
qdel(G)
|
||||
usr.create_attack_log("<font color='red'>Has placed [key_name(GM)] in disposals.</font>")
|
||||
GM.create_attack_log("<font color='orange'>Has been placed in disposals by [key_name(user)]</font>")
|
||||
if(GM.ckey)
|
||||
msg_admin_attack("[key_name_admin(user)] placed [key_name_admin(GM)] in a disposals unit. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
add_attack_logs(usr, GM, "Disposal'ed", !!GM.ckey)
|
||||
return
|
||||
|
||||
if(!I)
|
||||
@@ -182,10 +179,7 @@
|
||||
msg = "[user.name] stuffs [target.name] into the [src]!"
|
||||
to_chat(user, "You stuff [target.name] into the [src]!")
|
||||
|
||||
user.create_attack_log("<font color='red'>Has placed [key_name(target)] in disposals.</font>")
|
||||
target.create_attack_log("<font color='orange'>Has been placed in disposals by [key_name(user)]</font>")
|
||||
if(target.ckey)
|
||||
msg_admin_attack("[key_name_admin(user)] placed [key_name_admin(target)] in a disposals unit")
|
||||
add_attack_logs(user, target, "Disposal'ed", !!target.ckey)
|
||||
else
|
||||
return
|
||||
target.forceMove(src)
|
||||
|
||||
@@ -435,7 +435,7 @@
|
||||
G.change_gender(pick(MALE,FEMALE))
|
||||
G.loc = src.loc
|
||||
G.key = ghost.key
|
||||
add_logs(user, G, "summoned", null, "as a golem")
|
||||
add_attack_logs(user, G, "Summoned as a golem")
|
||||
to_chat(G, "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost.")
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
if(!..())
|
||||
return
|
||||
to_chat(owner, "<span class='caution'>You grit your teeth and burst the implanted [target]!</span>")
|
||||
add_logs(owner, null, "swallowed an implanted pill", target)
|
||||
add_attack_logs(owner, owner, "Swallowed implanted [target]")
|
||||
if(target.reagents.total_volume)
|
||||
target.reagents.reaction(owner, INGEST)
|
||||
target.reagents.trans_to(owner, target.reagents.total_volume)
|
||||
|
||||
@@ -227,7 +227,7 @@
|
||||
user.visible_message("<span class='notice'> [user] amputates [target]'s [affected.name] at the [affected.amputation_point] with \the [tool].</span>", \
|
||||
"<span class='notice'> You amputate [target]'s [affected.name] with \the [tool].</span>")
|
||||
|
||||
add_logs(user, target, "surgically removed [affected.name] from", addition="INTENT: [uppertext(user.a_intent)]")//log it
|
||||
add_attack_logs(user, target, "Surgically removed [affected.name]. INTENT: [uppertext(user.a_intent)]")//log it
|
||||
|
||||
var/atom/movable/thing = affected.droplimb(1,DROPLIMB_SHARP)
|
||||
if(istype(thing,/obj/item))
|
||||
|
||||
@@ -306,10 +306,7 @@
|
||||
processing_objects |= src
|
||||
|
||||
if(owner && vital && is_primary_organ()) // I'd do another check for species or whatever so that you couldn't "kill" an IPC by removing a human head from them, but it doesn't matter since they'll come right back from the dead
|
||||
if(user)
|
||||
user.create_attack_log("<font color='red'> removed a vital organ ([src]) from [key_name(owner)] (INTENT: [uppertext(user.a_intent)])</font>")
|
||||
owner.create_attack_log("<font color='orange'> had a vital organ ([src]) removed by [key_name(user)] (INTENT: [uppertext(user.a_intent)])</font>")
|
||||
msg_admin_attack("[key_name_admin(user)] removed a vital organ ([src]) from [key_name_admin(owner)]")
|
||||
add_attack_logs(user, owner, "Removed vital organ ([src])", !!user)
|
||||
owner.death()
|
||||
owner = null
|
||||
return src
|
||||
|
||||
@@ -276,14 +276,14 @@
|
||||
if(target_zone == "head" && B && B.host == target)
|
||||
user.visible_message("[user] successfully extracts [B] from [target]'s [parse_zone(target_zone)]!",
|
||||
"<span class='notice'>You successfully extract [B] from [target]'s [parse_zone(target_zone)].</span>")
|
||||
add_logs(user, target, "surgically removed [B] from", addition="INTENT: [uppertext(user.a_intent)]")
|
||||
add_attack_logs(user, target, "Surgically removed [B]. INTENT: [uppertext(user.a_intent)]")
|
||||
B.leave_host()
|
||||
return FALSE
|
||||
if(I && I.owner == target)
|
||||
user.visible_message("<span class='notice'> [user] has separated and extracts [target]'s [I] with [tool].</span>",
|
||||
"<span class='notice'> You have separated and extracted [target]'s [I] with [tool].</span>")
|
||||
|
||||
add_logs(user, target, "surgically removed [I.name] from", addition="INTENT: [uppertext(user.a_intent)]")
|
||||
add_attack_logs(user, target, "Surgically removed [I.name]. INTENT: [uppertext(user.a_intent)]")
|
||||
spread_germs_to_organ(I, user, tool)
|
||||
var/obj/item/thing = I.remove(target)
|
||||
if(!istype(thing))
|
||||
|
||||
@@ -455,7 +455,7 @@
|
||||
user.visible_message("<span class='notice'> [user] has decoupled [target]'s [I] with \the [tool].</span>" , \
|
||||
"<span class='notice'> You have decoupled [target]'s [I] with \the [tool].</span>")
|
||||
|
||||
add_logs(user, target, "surgically removed [I.name] from", addition="INTENT: [uppertext(user.a_intent)]")
|
||||
add_attack_logs(user, target, "Surgically removed [I.name]. INTENT: [uppertext(user.a_intent)]")
|
||||
spread_germs_to_organ(I, user)
|
||||
var/obj/item/thing = I.remove(target)
|
||||
if(!istype(thing))
|
||||
@@ -531,7 +531,7 @@
|
||||
"<span class='notice'> You have decoupled [target]'s [affected.name] with \the [tool].</span>")
|
||||
|
||||
|
||||
add_logs(user, target, "surgically removed [affected.name] from", addition="INTENT: [uppertext(user.a_intent)]")//log it
|
||||
add_attack_logs(user, target, "Surgically removed [affected.name] from. INTENT: [uppertext(user.a_intent)]")//log it
|
||||
|
||||
var/atom/movable/thing = affected.droplimb(1,DROPLIMB_SHARP)
|
||||
if(istype(thing,/obj/item))
|
||||
|
||||
Reference in New Issue
Block a user