From 3dcf2d9d8ea5925100742c1e682bf30ef2dd37cd Mon Sep 17 00:00:00 2001 From: ROdenFL Date: Sun, 25 Aug 2024 19:22:00 +0300 Subject: [PATCH] add: Replays v1 (#5731) * demo * direction light * the forgoten * transit space * mark turf after lighting object update * feat: add repo path to code revision info and to demo * feat: set demo version format 1.1 * tweak: disable demo recording by default * remove empty line * confidential * confidetial fix --------- Co-authored-by: Aziz Chynaliev --- code/__DEFINES/subsystems.dm | 24 + code/__HELPERS/icon_smoothing.dm | 2 + code/_globalvars/configuration.dm | 2 + code/_globalvars/logging.dm | 2 + code/_onclick/item_attack.dm | 15 +- .../configuration/entries/config.dm | 3 + code/controllers/subsystem/chat.dm | 4 +- code/controllers/subsystem/demo.dm | 483 ++++++++++++++++++ code/controllers/subsystem/garbage.dm | 5 + code/controllers/subsystem/tickets/tickets.dm | 28 +- code/datums/components/overlay_lighting.dm | 2 + code/datums/datumvars.dm | 168 +++--- code/datums/revision.dm | 2 + code/game/atoms.dm | 2 + code/game/atoms_movable.dm | 2 + code/game/machinery/doors/airlock.dm | 2 +- code/game/machinery/doors/firedoor.dm | 3 +- code/game/machinery/doors/poddoor.dm | 2 +- code/game/machinery/doors/windowdoor.dm | 2 +- code/game/turfs/turf.dm | 1 + code/game/world.dm | 1 + code/modules/admin/admin.dm | 24 +- code/modules/admin/admin_memo.dm | 14 +- code/modules/admin/admin_ranks.dm | 2 +- code/modules/admin/admin_verbs.dm | 50 +- code/modules/admin/db_ban/functions.dm | 36 +- code/modules/admin/topic.dm | 322 ++++++------ code/modules/admin/verbs/SDQL2/SDQL_2.dm | 44 +- .../admin/verbs/SDQL2/SDQL_2_parser.dm | 2 +- code/modules/admin/verbs/adminpm.dm | 32 +- code/modules/admin/verbs/randomverbs.dm | 56 +- code/modules/client/client_procs.dm | 74 +-- code/modules/demo/hooks.dm | 30 ++ code/modules/lighting/lighting_object.dm | 1 + code/modules/lighting/lighting_source.dm | 5 + code/modules/mob/login.dm | 3 + .../lavalandruin_code/necropolis_lavalend.dm | 1 + code/modules/shuttle/on_move.dm | 1 + code/modules/tgui/tgui_panel/to_chat.dm | 5 +- config/example/config.txt | 3 + paradise.dme | 2 + 41 files changed, 1029 insertions(+), 433 deletions(-) create mode 100644 code/controllers/subsystem/demo.dm create mode 100644 code/modules/demo/hooks.dm diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index c5c4e8f95f1..81d6166a3f6 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -103,6 +103,7 @@ #define INIT_ORDER_PATH -50 #define INIT_ORDER_PERSISTENCE -95 #define INIT_ORDER_STATPANELS -98 +#define INIT_ORDER_DEMO -99 // To avoid a bunch of changes related to initialization being written, do this last #define INIT_ORDER_CHAT -100 // Should be last to ensure chat remains smooth during init. // Subsystem fire priority, from lowest to highest priority @@ -156,3 +157,26 @@ #define SS_CPUDISPLAY_LOW 1 #define SS_CPUDISPLAY_DEFAULT 2 #define SS_CPUDISPLAY_HIGH 3 + +// Truly disgusting, TG. Truly disgusting. +//! ## Overlays subsystem + +#define POST_OVERLAY_CHANGE(changed_on) \ + if(length(changed_on.overlays) >= MAX_ATOM_OVERLAYS) { \ + var/text_lays = overlays2text(changed_on.overlays); \ + stack_trace("Too many overlays on [changed_on.type] - [length(changed_on.overlays)], refusing to update and cutting.\ + \n What follows is a printout of all existing overlays at the time of the overflow \n[text_lays]"); \ + changed_on.overlays.Cut(); \ + changed_on.add_overlay(mutable_appearance('icons/Testing/greyscale_error.dmi')); \ + } \ + if(alternate_appearances) { \ + for(var/I in changed_on.alternate_appearances){\ + var/datum/atom_hud/alternate_appearance/AA = changed_on.alternate_appearances[I];\ + if(AA.transfer_overlays){\ + AA.copy_overlays(changed_on, TRUE);\ + }\ + } \ + }\ + if(isturf(changed_on)){SSdemo.mark_turf(changed_on);}\ + if(isobj(changed_on) || ismob(changed_on)){SSdemo.mark_dirty(changed_on);}\ + diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index c38b4f39548..7d02649e2d5 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -197,6 +197,8 @@ GLOBAL_LIST_INIT(adjacent_direction_lookup, generate_adjacent_directions()) else if(A.smooth & SMOOTH_BITMASK) A.bitmask_smooth() + if(isturf(A)) + SSdemo.mark_turf(A) /atom/proc/bitmask_smooth() var/new_junction = NONE diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm index ea2e732016c..e4b2bc1b1fa 100644 --- a/code/_globalvars/configuration.dm +++ b/code/_globalvars/configuration.dm @@ -1,5 +1,7 @@ GLOBAL_REAL(config, /datum/controller/configuration) +GLOBAL_DATUM(revdata, /datum/getrev) + GLOBAL_VAR(host) GLOBAL_VAR(join_motd) GLOBAL_VAR(join_tos) diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index 6fbfde6168d..e049ed5b2e9 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -17,6 +17,8 @@ GLOBAL_VAR(runtime_summary_log) GLOBAL_PROTECT(runtime_summary_log) GLOBAL_VAR(tgui_log) GLOBAL_PROTECT(tgui_log) +GLOBAL_VAR(demo_log) +GLOBAL_PROTECT(demo_log) GLOBAL_VAR(http_log) GLOBAL_PROTECT(http_log) GLOBAL_VAR(sql_log) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 341e5e2ae2d..13ec0af78d2 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -30,27 +30,40 @@ . |= tool_chain_result if(ATTACK_CHAIN_CANCEL_CHECK(.)) + mark_target(target) return . var/pre_attackby_result = pre_attackby(target, user, params) if(!(pre_attackby_result & ATTACK_CHAIN_CORE_RETURN_BITFLAGS)) + mark_target(target) CRASH("pre_attackby() must return one of the core ATTACK_CHAIN_* bitflags, please consult code/__DEFINES/combat.dm; user = [user_type]; item = [item_type]; target = [target_type]") . |= pre_attackby_result if(ATTACK_CHAIN_CANCEL_CHECK(.)) + mark_target(target) return . var/attackby_result = target.attackby(src, user, params) if(!(attackby_result & ATTACK_CHAIN_CORE_RETURN_BITFLAGS)) + mark_target(target) CRASH("attackby() must return one of the core ATTACK_CHAIN_* bitflags, please consult code/__DEFINES/combat.dm; user = [user_type]; item = [item_type]; target = [target_type]") . |= attackby_result // yes a lot of QDELETED checks but attackby is a longest spaghetti code in the entire game if((. & ATTACK_CHAIN_NO_AFTERATTACK) || QDELETED(src) || QDELETED(target) || QDELETED(user)) + mark_target(target) return . afterattack(target, user, TRUE, params) + mark_target(target) +/// Used to mark a target for the demo system during a melee attack chain, call this before return +/obj/item/proc/mark_target(atom/target) + SSdemo.mark_dirty(src) + if(isturf(target)) + SSdemo.mark_turf(target) + else + SSdemo.mark_dirty(target) /** * Called on the item to check if it has any of the tool's behavior @@ -77,6 +90,7 @@ return FALSE if(signal_ret & COMPONENT_CANCEL_ATTACK_CHAIN) return TRUE + SSdemo.mark_dirty(src) /obj/item/attack_self_tk(mob/user) @@ -305,4 +319,3 @@ ignored_mobs = user, ) to_chat(user, span_danger("You have [message_verb] [src] with [I]!")) - diff --git a/code/controllers/configuration/entries/config.dm b/code/controllers/configuration/entries/config.dm index c6c0f5f1d50..5da930d43d3 100644 --- a/code/controllers/configuration/entries/config.dm +++ b/code/controllers/configuration/entries/config.dm @@ -700,6 +700,9 @@ /datum/config_entry/flag/config_errors_runtime +/// Whether demos are written, if not set demo SS never initializes +/datum/config_entry/flag/demos_enabled + //Needs proper testing /datum/config_entry/keyed_list/probability key_mode = KEY_MODE_TEXT diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm index 604f18c2d7c..8ecfa773d5c 100644 --- a/code/controllers/subsystem/chat.dm +++ b/code/controllers/subsystem/chat.dm @@ -60,7 +60,9 @@ SUBSYSTEM_DEF(chat) if(MC_TICK_CHECK) return -/datum/controller/subsystem/chat/proc/queue(queue_target, list/message_data) +/datum/controller/subsystem/chat/proc/queue(queue_target, list/message_data, confidential = FALSE) + if(!confidential) + SSdemo.write_chat(queue_target, message_data) var/list/targets = islist(queue_target) ? queue_target : list(queue_target) for(var/target in targets) var/client/client = CLIENT_FROM_VAR(target) diff --git a/code/controllers/subsystem/demo.dm b/code/controllers/subsystem/demo.dm new file mode 100644 index 00000000000..026c36b7b57 --- /dev/null +++ b/code/controllers/subsystem/demo.dm @@ -0,0 +1,483 @@ +SUBSYSTEM_DEF(demo) + name = "Demo" + wait = 1 + flags = SS_TICKER | SS_BACKGROUND + ///Adding Lobby to the runlevel because we want it to start writing before the game starts since there's a of atoms queued to be written during init + runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY + init_order = INIT_ORDER_DEMO + + // loading_points = 12.6 SECONDS // Yogs -- loading times + + var/list/pre_init_lines = list() // stuff like chat before the init + var/list/icon_cache = list() + var/list/icon_state_caches = list() + var/list/name_cache = list() + + var/list/marked_dirty = list() + var/list/marked_new = list() + var/list/marked_turfs = list() + var/list/del_list = list() + + var/last_written_time = null + var/last_chat_message = null + + // stats stuff + var/last_queued = 0 + var/last_completed = 0 + +/datum/controller/subsystem/demo/proc/write_time() + if(!can_fire) + return + + var/new_time = world.time + if(last_written_time != new_time) + if(initialized) + WRITE_LOG_NO_FORMAT(GLOB.demo_log, "time [new_time]\n") + else + pre_init_lines += "time [new_time]" + last_written_time = new_time + +/datum/controller/subsystem/demo/proc/write_event_line(line) + if(!can_fire) + return + + write_time() + if(initialized) + WRITE_LOG_NO_FORMAT(GLOB.demo_log, "[line]\n") + else + pre_init_lines += line + +/datum/controller/subsystem/demo/proc/write_chat(target, text) + if(!can_fire) + return + + var/target_text = "" + if(target == GLOB.clients) + target_text = "world" + else if(islist(target)) + var/list/target_keys = list() + for(var/T in target) + var/client/C = CLIENT_FROM_VAR(T) + if(C) + target_keys += C.ckey + if(!target_keys.len) + return + target_text = jointext(target_keys, ",") + else + var/client/C = CLIENT_FROM_VAR(target) + if(C) + target_text = C.ckey + else + return + var/json_encoded = json_encode(text) + write_event_line("chat [target_text] [last_chat_message == json_encoded ? "=" : json_encoded]") + last_chat_message = json_encoded + +/datum/controller/subsystem/demo/Initialize() + if(!CONFIG_GET(flag/demos_enabled)) + flags |= SS_NO_FIRE + can_fire = FALSE + marked_dirty.Cut() + marked_new.Cut() + marked_turfs.Cut() + return SS_INIT_SUCCESS + + WRITE_LOG_NO_FORMAT(GLOB.demo_log, "demo version 1.1\n") // increment this if you change the format + if(GLOB.revision_info) + var/repo = GLOB.revision_info.repo + var/commit = GLOB.revision_info.commit_hash || GLOB.revision_info.originmastercommit + if(GLOB.revision_info.repo) + WRITE_LOG_NO_FORMAT(GLOB.demo_log, "commit [repo]@[commit]\n") + else + WRITE_LOG_NO_FORMAT(GLOB.demo_log, "commit [commit]\n") + + // write a "snapshot" of the world at this point. + // start with turfs + log_world("Writing turfs...") + WRITE_LOG_NO_FORMAT(GLOB.demo_log, "init [world.maxx] [world.maxy] [world.maxz]\n") + marked_turfs.Cut() + for(var/z in 1 to world.maxz) + var/row_list = list() + var/last_appearance + var/rle_count = 1 + for(var/y in 1 to world.maxy) + for(var/x in 1 to world.maxx) + var/turf/T = locate(x,y,z) + T.demo_last_appearance = T.appearance + var/this_appearance + // space turfs are difficult to RLE otherwise, because they all + // have different appearances despite being the same thing. + if(T.type == /turf/space || T.type == /turf/space/openspace) + this_appearance = "s" // save the bytes + else if(istype(T, /turf/space/transit)) + this_appearance = "t[T.dir]" + else + this_appearance = T.appearance + if(this_appearance == last_appearance) + rle_count++ + else + if(rle_count > 1) + row_list += rle_count + rle_count = 1 + if(istext(this_appearance)) + row_list += this_appearance + else + // do a diff with the previous turf to save those bytes + row_list += encode_appearance(this_appearance, istext(last_appearance) ? null : last_appearance) + last_appearance = this_appearance + if(rle_count > 1) + row_list += rle_count + WRITE_LOG_NO_FORMAT(GLOB.demo_log, jointext(row_list, ",") + "\n") + CHECK_TICK + // then do objects + log_world("Writing objects") + marked_new.Cut() + marked_dirty.Cut() + for(var/z in 1 to world.maxz) + var/spacing = 0 + var/row_list = list() + for(var/y in 1 to world.maxy) + for(var/x in 1 to world.maxx) + var/turf/T = locate(x,y,z) + var/list/turf_list = list() + for(var/C in T.contents) + var/atom/movable/as_movable = C + if(as_movable.loc != T) + continue + if(isobj(C) || ismob(C)) + turf_list += encode_init_obj(C) + if(turf_list.len) + if(spacing) + row_list += spacing + spacing = 0 + row_list += turf_list + spacing++ + CHECK_TICK // This is a bit risky because something might change but meh, its not a big deal. + WRITE_LOG_NO_FORMAT(GLOB.demo_log, jointext(row_list, ",") + "\n") + + // track objects that exist in nullspace + var/nullspace_list = list() + for(var/M in world) + if(!isobj(M) && !ismob(M)) + continue + var/atom/movable/AM = M + if(AM.loc != null) + continue + nullspace_list += encode_init_obj(AM) + CHECK_TICK + WRITE_LOG_NO_FORMAT(GLOB.demo_log, jointext(nullspace_list, ",") + "\n") + + for(var/line in pre_init_lines) + WRITE_LOG_NO_FORMAT(GLOB.demo_log, "[line]\n") + + return SS_INIT_SUCCESS + +/datum/controller/subsystem/demo/fire() + if(!src.marked_new.len && !src.marked_dirty.len && !src.marked_turfs.len && !src.del_list.len) + return // nothing to do + + last_queued = src.marked_new.len + src.marked_dirty.len + src.marked_turfs.len + last_completed = 0 + + write_time() + if(src.del_list.len) + var/s = "del [jointext(src.del_list, ",")]\n" // if I don't do it like this I get "incorrect number of macro arguments" because byond is stupid and sucks + WRITE_LOG_NO_FORMAT(GLOB.demo_log, s) + src.del_list.Cut() + + var/canceled = FALSE + + var/list/marked_dirty = src.marked_dirty + var/list/dirty_updates = list() + while(marked_dirty.len) + last_completed++ + var/atom/movable/M = marked_dirty[marked_dirty.len] + marked_dirty.len-- + if(M.gc_destroyed || !M) + continue + if(M.loc == M.demo_last_loc && M.appearance == M.demo_last_appearance) + continue + var/loc_string = "=" + if(M.loc != M.demo_last_loc) + loc_string = "null" + if(isturf(M.loc)) + loc_string = "[M.x],[M.y],[M.z]" + else if(ismovable(M.loc)) + loc_string = "\ref[M.loc]" + M.demo_last_loc = M.loc + var/appearance_string = "=" + if(ismob(M)) + appearance_string = encode_appearance(M.appearance, target = M) + M.demo_last_appearance = M.appearance + else if(M.appearance != M.demo_last_appearance) + appearance_string = encode_appearance(M.appearance, M.demo_last_appearance, TRUE, M) + M.demo_last_appearance = M.appearance + dirty_updates += "\ref[M] [loc_string] [appearance_string]" + if(MC_TICK_CHECK) + canceled = TRUE + break + if(dirty_updates.len) + var/s = "update [jointext(dirty_updates, ",")]\n" + WRITE_LOG_NO_FORMAT(GLOB.demo_log, s) + if(canceled) + return + + + var/list/marked_new = src.marked_new + var/list/new_updates = list() + while(marked_new.len) + last_completed++ + var/atom/movable/M = marked_new[marked_new.len] + marked_new.len-- + if(M.gc_destroyed || !M) + continue + var/loc_string = "null" + if(isturf(M.loc)) + loc_string = "[M.x],[M.y],[M.z]" + else if(ismovable(M.loc)) + loc_string = "\ref[M.loc]" + M.demo_last_appearance = M.appearance + new_updates += "\ref[M] [loc_string] [encode_appearance(M.appearance, target = M)]" + if(MC_TICK_CHECK) + canceled = TRUE + break + if(new_updates.len) + var/s = "new [jointext(new_updates, ",")]\n" + WRITE_LOG_NO_FORMAT(GLOB.demo_log, s) + if(canceled) + return + + + var/list/marked_turfs = src.marked_turfs + var/list/turf_updates = list() + while(marked_turfs.len) + last_completed++ + var/turf/T = marked_turfs[marked_turfs.len] + marked_turfs.len-- + if(T && T.appearance != T.demo_last_appearance) + turf_updates += "([T.x],[T.y],[T.z])=[encode_appearance(T.appearance, T.demo_last_appearance)]" + T.demo_last_appearance = T.appearance + if(MC_TICK_CHECK) + canceled = TRUE + break + if(turf_updates.len) + var/s = "turf [jointext(turf_updates, ",")]\n" + WRITE_LOG_NO_FORMAT(GLOB.demo_log, s) + if(canceled) + return + +/datum/controller/subsystem/demo/proc/encode_init_obj(atom/movable/M) + M.demo_last_loc = M.loc + M.demo_last_appearance = M.appearance + var/encoded_appearance = encode_appearance(M.appearance, target = M) + var/list/encoded_contents = list() + for(var/C in M.contents) + if(isobj(C) || ismob(C)) + encoded_contents += encode_init_obj(C) + return "\ref[M]=[encoded_appearance][(encoded_contents.len ? "([jointext(encoded_contents, ",")])" : "")]" + +// please make sure the order you call this function in is the same as the order you write +/datum/controller/subsystem/demo/proc/encode_appearance(image/appearance, image/diff_appearance, diff_remove_overlays = FALSE, atom/movable/target) + if(appearance == null) + return "n" + if(appearance == diff_appearance) + return "=" + + var/icon_txt = "[appearance.icon]" + var/cached_icon = icon_cache[icon_txt] || icon_txt + var/list/icon_state_cache + if(!isnum(cached_icon)) + icon_cache[icon_txt] = icon_cache.len + 1 + icon_state_cache = (icon_state_caches[++icon_state_caches.len] = list()) + else + icon_state_cache = icon_state_caches[cached_icon] + + var/list/cached_icon_state = icon_state_cache[appearance.icon_state] || appearance.icon_state + if(!isnum(cached_icon_state)) + icon_state_cache[appearance.icon_state] = icon_state_cache.len + 1 + + var/cached_name = name_cache[appearance.name] || appearance.name + if(!isnum(cached_name)) + name_cache[appearance.name] = name_cache.len + 1 + + var/color_string = appearance.color || "w" + if(islist(color_string)) + var/list/old_list = appearance.color + var/list/inted = list() + inted.len = old_list.len + for(var/i in 1 to old_list.len) + inted[i] += round(old_list[i] * 255) + color_string = jointext(inted, ",") + var/overlays_string = "\[]" + var/list/appearance_overlays = appearance.overlays + if(appearance_overlays.len) + var/list/overlays_list = list() + for(var/i in 1 to appearance_overlays.len) + var/image/overlay = appearance_overlays[i] + overlays_list += encode_appearance(overlay, appearance, TRUE, target = target) + overlays_string = "\[[jointext(overlays_list, ",")]]" + + var/underlays_string = "\[]" + var/list/appearance_underlays = appearance.underlays + if(appearance_underlays.len) + var/list/underlays_list = list() + for(var/i in 1 to appearance_underlays.len) + var/image/underlay = appearance_underlays[i] + underlays_list += encode_appearance(underlay, appearance, TRUE, target = target) + underlays_string = "\[[jointext(underlays_list, ",")]]" + + var/appearance_transform_string = "i" + if(appearance.transform) + var/matrix/M = appearance.transform + appearance_transform_string = "[M.a],[M.b],[M.c],[M.d],[M.e],[M.f]" + if(appearance_transform_string == "1,0,0,0,1,0") + appearance_transform_string = "i" + + var/tmp_dir = appearance.dir + + if(target) + tmp_dir = target.dir + + var/list/appearance_list = list( + json_encode(cached_icon), + json_encode(cached_icon_state), + json_encode(cached_name), + appearance.appearance_flags, + appearance.layer, + appearance.plane == -32767 ? "" : PLANE_TO_TRUE(appearance.plane), + tmp_dir == 2 ? "" : tmp_dir, + appearance.color ? color_string : "", + appearance.alpha == 255 ? "" : appearance.alpha, + appearance.pixel_x == 0 ? "" : appearance.pixel_x, + appearance.pixel_y == 0 ? "" : appearance.pixel_y, + appearance.blend_mode <= 1 ? "" : appearance.blend_mode, + appearance_transform_string != "i" ? appearance_transform_string : "", + appearance:invisibility == 0 ? "" : appearance:invisibility, // colon because dreamchecker is dumb + appearance.pixel_w == 0 ? "" : appearance.pixel_w, + appearance.pixel_z == 0 ? "" : appearance.pixel_z, + appearance.overlays.len ? overlays_string : "", + appearance.underlays.len ? underlays_string : "" + ) + while(appearance_list[appearance_list.len] == "" && appearance_list.len > 0) + appearance_list.len-- + + var/undiffed_string = "{[jointext(appearance_list, ";")]}" + + if(diff_appearance) + var/overlays_identical = TRUE + if(diff_remove_overlays) + overlays_identical = (appearance.overlays.len == 0) + else if(appearance.overlays.len != diff_appearance.overlays.len) + overlays_identical = FALSE + else + for(var/i in 1 to appearance.overlays.len) + if(appearance.overlays[i] != diff_appearance.overlays[i]) + overlays_identical = FALSE + break + + var/underlays_identical = TRUE + if(diff_remove_overlays) + underlays_identical = (appearance.underlays.len == 0) + else if(appearance.underlays.len != diff_appearance.underlays.len) + underlays_identical = FALSE + else + for(var/i in 1 to appearance.underlays.len) + if(appearance.underlays[i] != diff_appearance.underlays[i]) + underlays_identical = FALSE + break + + var/diff_transform_string = "i" + if(diff_appearance.transform) + var/matrix/M = diff_appearance.transform + diff_transform_string = "[M.a],[M.b],[M.c],[M.d],[M.e],[M.f]" + if(diff_transform_string == "1,0,0,0,1,0") + diff_transform_string = "i" + + var/list/diffed_appearance_list = list( + json_encode(cached_icon), + json_encode(cached_icon_state), + json_encode(cached_name), + appearance.appearance_flags == diff_appearance.appearance_flags ? "" : appearance.appearance_flags, + appearance.layer == diff_appearance.layer ? "" : appearance.layer, + PLANE_TO_TRUE(appearance.plane) == PLANE_TO_TRUE(diff_appearance.plane) ? "" : PLANE_TO_TRUE(appearance.plane), + appearance.dir == diff_appearance.dir ? "" : appearance.dir, + appearance.color == diff_appearance.color ? "" : color_string, + appearance.alpha == diff_appearance.alpha ? "" : appearance.alpha, + appearance.pixel_x == diff_appearance.pixel_x ? "" : appearance.pixel_x, + appearance.pixel_y == diff_appearance.pixel_y ? "" : appearance.pixel_y, + appearance.blend_mode == diff_appearance.blend_mode ? "" : appearance.blend_mode, + appearance_transform_string == diff_transform_string ? "" : appearance_transform_string, + appearance:invisibility == diff_appearance:invisibility ? "" : appearance:invisibility, // colon because dreamchecker is too dumb + appearance.pixel_w == diff_appearance.pixel_w ? "" : appearance.pixel_w, + appearance.pixel_z == diff_appearance.pixel_z ? "" : appearance.pixel_z, + overlays_identical ? "" : overlays_string, + underlays_identical ? "" :underlays_string + ) + while(diffed_appearance_list[diffed_appearance_list.len] == "" && diffed_appearance_list.len > 0) + diffed_appearance_list.len-- + + var/diffed_string = "~{[jointext(diffed_appearance_list, ";")]}" + if(length(diffed_string) < length(undiffed_string)) + return diffed_string + return undiffed_string + +/datum/controller/subsystem/demo/stat_entry(msg) + msg += "Remaining: {" + msg += "Trf:[marked_turfs.len]|" + msg += "New:[marked_new.len]|" + msg += "Upd:[marked_dirty.len]|" + msg += "Del:[del_list.len]" + msg += "}" + return ..(msg) + +/datum/controller/subsystem/demo/get_metrics() + . = ..() + .["remaining_turfs"] = marked_turfs.len + .["remaining_new"] = marked_new.len + .["remaining_updated"] = marked_dirty.len + .["remaining_deleted"] = del_list.len + +/datum/controller/subsystem/demo/proc/mark_turf(turf/T) + if(!can_fire) + return + if(!isturf(T)) + return + marked_turfs[T] = TRUE + +/datum/controller/subsystem/demo/proc/mark_new(atom/movable/M) + if(!can_fire) + return + if(!ismovable(M)) + return + if(M.gc_destroyed || QDELETED(M)) + return + marked_new[M] = TRUE + if(marked_dirty[M]) + marked_dirty -= M + +// I can't wait for when TG ports this and they make this a #define macro. +/datum/controller/subsystem/demo/proc/mark_dirty(atom/movable/M) + if(!can_fire) + return + if(!ismovable(M)) + return + if(M.gc_destroyed || QDELETED(M)) + return + if(isturf(M)) + mark_turf(M) + return + if(marked_new[M]) + return + marked_dirty[M] = TRUE + +/datum/controller/subsystem/demo/proc/mark_destroyed(atom/movable/M) + if(!can_fire) + return + if(!ismovable(M)) + return + if(marked_new[M]) + marked_new -= M + if(marked_dirty[M]) + marked_dirty -= M + if(initialized) + del_list["\ref[M]"] = 1 diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index afb19ec439b..0371efa9a3e 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -382,6 +382,7 @@ SUBSYSTEM_DEF(garbage) SSgarbage.Queue(to_delete) if (QDEL_HINT_IWILLGC) to_delete.gc_destroyed = world.time + SSdemo.mark_destroyed(to_delete) return if (QDEL_HINT_LETMELIVE) //qdel should let the object live after calling destory. if(!force) @@ -402,8 +403,10 @@ SUBSYSTEM_DEF(garbage) SSgarbage.Queue(to_delete) if (QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete SSgarbage.Queue(to_delete, GC_QUEUE_HARDDELETE) + SSdemo.mark_destroyed(to_delete) if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. SSgarbage.HardDelete(to_delete) + SSdemo.mark_destroyed(to_delete) #ifdef REFERENCE_TRACKING if (QDEL_HINT_FINDREFERENCE) //qdel will, if REFERENCE_TRACKING is enabled, display all references to this object, then queue the object for deletion. SSgarbage.Queue(to_delete) @@ -420,6 +423,8 @@ SUBSYSTEM_DEF(garbage) trash.no_hint++ SSgarbage.Queue(to_delete) + if(to_delete) + SSdemo.mark_destroyed(to_delete) #ifdef REFERENCE_TRACKING diff --git a/code/controllers/subsystem/tickets/tickets.dm b/code/controllers/subsystem/tickets/tickets.dm index 410e1b4e2e1..fa1fa67118e 100644 --- a/code/controllers/subsystem/tickets/tickets.dm +++ b/code/controllers/subsystem/tickets/tickets.dm @@ -102,7 +102,7 @@ SUBSYSTEM_DEF(tickets) ticketNum = T.ticketNum T.addResponse(C, text) T.setCooldownPeriod() - to_chat(C.mob, "Ваш [ticket_name] #[ticketNum] остаётся открытым! Его можно найти в «My tickets» во вкладке «Admin».") + to_chat(C.mob, "Ваш [ticket_name] #[ticketNum] остаётся открытым! Его можно найти в «My tickets» во вкладке «Admin».", confidential=TRUE) var/url_message = makeUrlMessage(C, text, ticketNum) message_staff(url_message, NONE, TRUE) else @@ -143,7 +143,7 @@ SUBSYSTEM_DEF(tickets) T.mobControlled = C.mob //Inform the user that they have opened a ticket - to_chat(C, "Вы открыли [ticket_name] номер #[(getTicketCounter() - 1)]! Пожалуйста, ожидайте. Вам скоро ответят.") + to_chat(C, "Вы открыли [ticket_name] номер #[(getTicketCounter() - 1)]! Пожалуйста, ожидайте. Вам скоро ответят.", confidential=TRUE) var/ticket_open_sound = sound('sound/effects/adminticketopen.ogg') SEND_SOUND(C, ticket_open_sound) @@ -163,7 +163,7 @@ SUBSYSTEM_DEF(tickets) if(T.ticketState != TICKET_RESOLVED) T.ticketState = TICKET_RESOLVED message_staff("[usr.client] / ([usr]) решил [ticket_name] номер [N]") - to_chat_safe(returnClient(N), "Ваш [ticket_name] был решён.") + to_chat_safe(returnClient(N), "Ваш [ticket_name] был решён.", confidential=TRUE) return TRUE /datum/controller/subsystem/tickets/proc/convert_to_other_ticket(ticketId) @@ -175,7 +175,7 @@ SUBSYSTEM_DEF(tickets) return var/datum/ticket/T = allTickets[ticketId] if(T.ticket_converted) - to_chat(usr, "This ticket has already been converted!") + to_chat(usr, "This ticket has already been converted!", confidential=TRUE) return convert_ticket(T) @@ -192,7 +192,7 @@ SUBSYSTEM_DEF(tickets) var/client/C = usr.client var/client/owner = get_client_by_ckey(T.client_ckey) to_chat_safe(owner, list("[key_name_hidden(C)] перевёл ваш тикет в [other_ticket_name] тикет.",\ - "Be sure to use the correct type of help next time!")) + "Be sure to use the correct type of help next time!"), confidential=TRUE) message_staff("[C] перевёл тикет под номером #[T.ticketNum] в [other_ticket_name] тикет.") add_game_logs("[C] has converted ticket number [T.ticketNum] to a [other_ticket_name] ticket.") create_other_system_ticket(T) @@ -238,7 +238,7 @@ SUBSYSTEM_DEF(tickets) return if("Отказано") if(!closeTicket(N)) - to_chat(C, "Невозможно закрыть тикет.") + to_chat(C, "Невозможно закрыть тикет.", confidential=TRUE) if("Мужайся") C.man_up(returnClient(N)) T.lastStaffResponse = "Автоматический ответ: [message_key]" @@ -250,7 +250,7 @@ SUBSYSTEM_DEF(tickets) else var/msg_sound = sound('sound/effects/adminhelp.ogg') SEND_SOUND(returnClient(N), msg_sound) - to_chat_safe(returnClient(N), "[key_name_hidden(C)] is autoresponding with: [response_phrases[message_key]]")//for this we want the full value of whatever key this is to tell the player so we do response_phrases[message_key] + to_chat_safe(returnClient(N), "[key_name_hidden(C)] is autoresponding with: [response_phrases[message_key]]", confidential=TRUE)//for this we want the full value of whatever key this is to tell the player so we do response_phrases[message_key] message_staff("[C] has auto responded to [ticket_owner]\'s adminhelp with: [message_key]") //we want to use the short named keys for this instead of the full sentence which is why we just do message_key T.lastStaffResponse = "Autoresponse: [message_key]" resolveTicket(N) @@ -261,7 +261,7 @@ SUBSYSTEM_DEF(tickets) var/datum/ticket/T = allTickets[N] if(T.ticketState != TICKET_CLOSED) message_staff("[usr.client] / ([usr]) закрыл [ticket_name] под номером [N]") - to_chat_safe(returnClient(N), close_messages) + to_chat_safe(returnClient(N), close_messages, confidential=TRUE) T.ticketState = TICKET_CLOSED return TRUE @@ -501,14 +501,14 @@ UI STUFF popup.open() //Sends a message to the target safely. If the target left the server it won't throw a runtime. Also accepts lists of text -/datum/controller/subsystem/tickets/proc/to_chat_safe(target, text) +/datum/controller/subsystem/tickets/proc/to_chat_safe(target, text, confidential = FALSE) if(!target) return FALSE if(istype(text, /list)) for(var/T in text) - to_chat(target, T) + to_chat(target, T, confidential = confidential) else - to_chat(target, text) + to_chat(target, text, confidential = confidential) return TRUE /** @@ -566,7 +566,7 @@ UI STUFF if(href_list["detailclose"]) var/indexNum = text2num(href_list["detailclose"]) if(!check_rights(close_rights)) - to_chat(usr, "Недостаточно прав чтобы закрыть тикет.") + to_chat(usr, "Недостаточно прав чтобы закрыть тикет.", confidential=TRUE) return if(alert("Вы уверены? Это отправит отрицательное сообщение.", "Уверены?", "Да","Нет") != "Да") return @@ -608,13 +608,13 @@ UI STUFF message_staff("[usr.client] / ([usr]) взял [ticket_name] номер [index]") else message_staff("[usr.client] / ([usr]) взял [ticket_name] номер [index]", TICKET_STAFF_MESSAGE_ADMIN_CHANNEL) - to_chat_safe(returnClient(index), "Ваш [ticket_name] обрабатывает [usr.client].") + to_chat_safe(returnClient(index), "Ваш [ticket_name] обрабатывает [usr.client].", confidential=TRUE) /datum/controller/subsystem/tickets/proc/unassignTicket(index) var/datum/ticket/T = allTickets[index] if(T.staffAssigned != null && (T.staffAssigned == usr.client || alert("Тикет уже назначен [T.staffAssigned]. Вы хотите снять с тикета?","Снять с тикета","Нет","Да") == "Да")) T.staffAssigned = null - to_chat_safe(returnClient(index), "Ваш [ticket_name] больше не обрабатывают. Другой сотрудник скоро вам поможет.") + to_chat_safe(returnClient(index), "Ваш [ticket_name] больше не обрабатывают. Другой сотрудник скоро вам поможет.", confidential=TRUE) if(span_class == "mentorhelp") message_staff("[usr.client] / ([usr]) снят с тикета [ticket_name] номер [index]") else diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm index 572f0a8cb15..2249aec3f12 100644 --- a/code/datums/components/overlay_lighting.dm +++ b/code/datums/components/overlay_lighting.dm @@ -166,6 +166,7 @@ /datum/component/overlay_lighting/proc/clean_old_turfs() for(var/turf/lit_turf as anything in affected_turfs) lit_turf.dynamic_lumcount -= lum_power + SSdemo.mark_turf(lit_turf) affected_turfs = null @@ -176,6 +177,7 @@ . = list() for(var/turf/lit_turf in view(lumcount_range, get_turf(current_holder))) lit_turf.dynamic_lumcount += lum_power + SSdemo.mark_turf(lit_turf) . += lit_turf if(length(.)) affected_turfs = . diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 629fffa8adf..1bd0c889eb9 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -63,7 +63,7 @@ var/static/cookieoffset = rand(1, 9999) //to force cookies to reset after the round. if(!check_rights(R_ADMIN|R_VIEWRUNTIMES)) - to_chat(usr, "You need to be an administrator to access this.") + to_chat(usr, "You need to be an administrator to access this.", confidential=TRUE) return if(!D) @@ -536,7 +536,7 @@ var/mob/M = locateUID(href_list["rename"]) if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return var/new_name = reject_bad_name(sanitize(copytext_char(input(usr, "What would you like to name this mob?", "Input a name", M.real_name) as text|null, 1, MAX_NAME_LEN)), allow_numbers = TRUE) @@ -553,7 +553,7 @@ var/D = locateUID(href_list["datumedit"]) if(!isdatum(D) && !isclient(D)) - to_chat(usr, "This can only be used on instances of types /client or /datum") + to_chat(usr, "This can only be used on instances of types /client or /datum", confidential=TRUE) return modify_variables(D, href_list["varnameedit"], 1) @@ -563,10 +563,10 @@ var/atom/D = locateUID(href_list["subject"]) if(!isdatum(D) && !isclient(D)) - to_chat(usr, "This can only be used on instances of types /client or /datum") + to_chat(usr, "This can only be used on instances of types /client or /datum", confidential=TRUE) return if(!(href_list["var"] in D.vars)) - to_chat(usr, "Unable to find variable specified.") + to_chat(usr, "Unable to find variable specified.", confidential=TRUE) return var/value = D.vars[href_list["var"]] value ^= 1 << text2num(href_list["togbit"]) @@ -578,7 +578,7 @@ var/D = locateUID(href_list["datumchange"]) if(!isdatum(D) && !isclient(D)) - to_chat(usr, "This can only be used on instances of types /client or /datum") + to_chat(usr, "This can only be used on instances of types /client or /datum", confidential=TRUE) return modify_variables(D, href_list["varnamechange"], 0) @@ -588,7 +588,7 @@ var/atom/A = locateUID(href_list["datummass"]) if(!istype(A)) - to_chat(usr, "This can only be used on instances of type /atom") + to_chat(usr, "This can only be used on instances of type /atom", confidential=TRUE) return cmd_mass_modify_object_variables(A, href_list["varnamemass"]) @@ -599,7 +599,7 @@ var/mob/M = locateUID(href_list["mob_player_panel"]) if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return src.holder.show_player_panel(M) @@ -610,7 +610,7 @@ var/mob/M = locateUID(href_list["give_spell"]) if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return src.give_spell(M) @@ -621,7 +621,7 @@ var/mob/living/carbon/C = locateUID(href_list["givemartialart"]) if(!istype(C)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") + to_chat(usr, "This can only be done to instances of type /mob/living/carbon", confidential=TRUE) return var/list/artpaths = subtypesof(/datum/martial_art) @@ -634,7 +634,7 @@ if(!usr) return if(QDELETED(C)) - to_chat(usr, "Mob doesn't exist anymore") + to_chat(usr, "Mob doesn't exist anymore", confidential=TRUE) return if(result) @@ -649,7 +649,7 @@ var/mob/M = locateUID(href_list["give_disease"]) if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return src.give_disease(M) @@ -660,12 +660,12 @@ var/mob/living/M = locateUID(href_list["give_taipan_hud"]) if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob/living") + to_chat(usr, "This can only be used on instances of type /mob/living", confidential=TRUE) return var/selected_job = tgui_input_list(usr, "Select a job", "Hud Job Selection", GLOB.all_taipan_jobs) if(!selected_job) - to_chat(usr, "No job selected!") + to_chat(usr, "No job selected!", confidential=TRUE) return var/selected_role = M.find_taipan_hud_number_by_job(job = selected_job) @@ -676,7 +676,7 @@ var/mob/M = locateUID(href_list["godmode"]) if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return src.cmd_admin_godmode(M) @@ -687,7 +687,7 @@ var/mob/M = locateUID(href_list["gib"]) if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return src.cmd_admin_gib(M) @@ -697,7 +697,7 @@ var/mob/M = locateUID(href_list["build_mode"]) if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return togglebuildmode(M) @@ -708,7 +708,7 @@ var/mob/M = locateUID(href_list["drop_everything"]) if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return if(usr.client) @@ -719,7 +719,7 @@ var/mob/M = locateUID(href_list["direct_control"]) if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return if(usr.client) @@ -730,7 +730,7 @@ var/mob/living/carbon/human/H = locateUID(href_list["make_skeleton"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human", confidential=TRUE) return var/confirm = alert("Are you sure you want to turn this mob into a skeleton?","Confirm Skeleton Transformation","Yes","No") @@ -746,7 +746,7 @@ var/mob/M = locateUID(href_list["offer_control"]) if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return offer_control(M) @@ -756,7 +756,7 @@ var/datum/D = locateUID(href_list["delete"]) if(!D) - to_chat(usr, "Unable to locate item!") + to_chat(usr, "Unable to locate item!", confidential=TRUE) admin_delete(D) href_list["datumrefresh"] = href_list["delete"] @@ -765,7 +765,7 @@ var/obj/O = locateUID(href_list["delall"]) if(!isobj(O)) - to_chat(usr, "This can only be used on instances of type /obj") + to_chat(usr, "This can only be used on instances of type /obj", confidential=TRUE) return var/action_type = alert("Strict type ([O.type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel") @@ -787,7 +787,7 @@ i++ qdel(Obj) if(!i) - to_chat(usr, "No objects of this type exist") + to_chat(usr, "No objects of this type exist", confidential=TRUE) return log_and_message_admins("deleted all objects of type [O_type] ([i] objects deleted)") if("Type and subtypes") @@ -797,7 +797,7 @@ i++ qdel(Obj) if(!i) - to_chat(usr, "No objects of this type exist") + to_chat(usr, "No objects of this type exist", confidential=TRUE) return log_and_message_admins("deleted all objects of type or subtype of [O_type] ([i] objects deleted)") @@ -899,7 +899,7 @@ if(ID == chosen_id) valid_id = 1 if(!valid_id) - to_chat(usr, "A reagent with that ID doesn't exist!") + to_chat(usr, "A reagent with that ID doesn't exist!", confidential=TRUE) if("Choose ID") chosen_id = tgui_input_list(usr, "Choose a reagent to add.", "Choose a reagent.", reagent_options) if(chosen_id) @@ -913,7 +913,7 @@ var/atom/A = locateUID(href_list["explode"]) if(!isobj(A) && !ismob(A) && !isturf(A)) - to_chat(usr, "This can only be done to instances of type /obj, /mob and /turf") + to_chat(usr, "This can only be done to instances of type /obj, /mob and /turf", confidential=TRUE) return src.cmd_admin_explosion(A) @@ -924,7 +924,7 @@ var/atom/A = locateUID(href_list["emp"]) if(!isobj(A) && !ismob(A) && !isturf(A)) - to_chat(usr, "This can only be done to instances of type /obj, /mob and /turf") + to_chat(usr, "This can only be done to instances of type /obj, /mob and /turf", confidential=TRUE) return src.cmd_admin_emp(A) @@ -935,7 +935,7 @@ var/datum/D = locateUID(href_list["mark_object"]) if(!istype(D)) - to_chat(usr, "This can only be done to instances of type /datum") + to_chat(usr, "This can only be done to instances of type /datum", confidential=TRUE) return src.holder.marked_datum = D @@ -966,13 +966,13 @@ if(!usr || result == "---Components---" || result == "---Elements---") return if(QDELETED(target)) - to_chat(usr, "That thing doesn't exist anymore!") + to_chat(usr, "That thing doesn't exist anymore!", confidential=TRUE) return var/list/lst = get_callproc_args() if(!lst) return if(QDELETED(target)) - to_chat(usr, "That thing doesn't exist anymore!") + to_chat(usr, "That thing doesn't exist anymore!", confidential=TRUE) return var/datumname = "error" lst.Insert(1, result) @@ -1047,7 +1047,7 @@ var/atom/A = locateUID(href_list["rotatedatum"]) if(!istype(A)) - to_chat(usr, "This can only be done to instances of type /atom") + to_chat(usr, "This can only be done to instances of type /atom", confidential=TRUE) return switch(href_list["rotatedir"]) @@ -1062,12 +1062,12 @@ var/mob/living/carbon/human/H = locateUID(href_list["makemonkey"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human", confidential=TRUE) return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!H) - to_chat(usr, "Mob doesn't exist anymore") + to_chat(usr, "Mob doesn't exist anymore", confidential=TRUE) return holder.Topic(href, list("monkeyone"=href_list["makemonkey"])) @@ -1076,12 +1076,12 @@ var/mob/living/carbon/human/H = locateUID(href_list["makerobot"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human", confidential=TRUE) return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!H) - to_chat(usr, "Mob doesn't exist anymore") + to_chat(usr, "Mob doesn't exist anymore", confidential=TRUE) return holder.Topic(href, list("makerobot"=href_list["makerobot"])) @@ -1090,12 +1090,12 @@ var/mob/living/carbon/human/H = locateUID(href_list["makealien"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human", confidential=TRUE) return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!H) - to_chat(usr, "Mob doesn't exist anymore") + to_chat(usr, "Mob doesn't exist anymore", confidential=TRUE) return holder.Topic(href, list("makealien"=href_list["makealien"])) @@ -1104,12 +1104,12 @@ var/mob/living/carbon/human/H = locateUID(href_list["makeslime"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human", confidential=TRUE) return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!H) - to_chat(usr, "Mob doesn't exist anymore") + to_chat(usr, "Mob doesn't exist anymore", confidential=TRUE) return holder.Topic(href, list("makeslime"=href_list["makeslime"])) @@ -1118,12 +1118,12 @@ var/mob/living/carbon/human/H = locateUID(href_list["makesuper"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human", confidential=TRUE) return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!H) - to_chat(usr, "Mob doesn't exist anymore") + to_chat(usr, "Mob doesn't exist anymore", confidential=TRUE) return holder.Topic(href, list("makesuper"=href_list["makesuper"])) @@ -1132,12 +1132,12 @@ var/mob/living/carbon/human/H = locateUID(href_list["makeai"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human", confidential=TRUE) return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!H) - to_chat(usr, "Mob doesn't exist anymore") + to_chat(usr, "Mob doesn't exist anymore", confidential=TRUE) return holder.Topic(href, list("makeai"=href_list["makeai"])) @@ -1146,7 +1146,7 @@ var/mob/living/carbon/human/H = locateUID(href_list["setspecies"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human", confidential=TRUE) return var/new_species = tgui_input_list(usr, "Please choose a new species.","Species", GLOB.all_species) @@ -1155,23 +1155,23 @@ return if(!H) - to_chat(usr, "Mob doesn't exist anymore") + to_chat(usr, "Mob doesn't exist anymore", confidential=TRUE) return var/datum/species/S = GLOB.all_species[new_species] if(H.set_species(S.type)) - to_chat(usr, "Set species of [H] to [H.dna.species].") + to_chat(usr, "Set species of [H] to [H.dna.species].", confidential=TRUE) H.regenerate_icons() log_and_message_admins("has changed the species of [key_name_admin(H)] to [new_species]") else - to_chat(usr, "Failed! Something went wrong.") + to_chat(usr, "Failed! Something went wrong.", confidential=TRUE) else if(href_list["addlanguage"]) if(!check_rights(R_SPAWN)) return var/mob/H = locateUID(href_list["addlanguage"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob") + to_chat(usr, "This can only be done to instances of type /mob", confidential=TRUE) return var/new_language = tgui_input_list(usr, "Please choose a language to add.","Language", GLOB.all_languages) @@ -1180,25 +1180,25 @@ return if(!H) - to_chat(usr, "Mob doesn't exist anymore") + to_chat(usr, "Mob doesn't exist anymore", confidential=TRUE) return if(H.add_language(new_language)) - to_chat(usr, "Added [new_language] to [H].") + to_chat(usr, "Added [new_language] to [H].", confidential=TRUE) log_and_message_admins("has given [key_name_admin(H)] the language [new_language]") else - to_chat(usr, "Mob already knows that language.") + to_chat(usr, "Mob already knows that language.", confidential=TRUE) else if(href_list["remlanguage"]) if(!check_rights(R_SPAWN)) return var/mob/H = locateUID(href_list["remlanguage"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob") + to_chat(usr, "This can only be done to instances of type /mob", confidential=TRUE) return if(!LAZYLEN(H.languages)) - to_chat(usr, "This mob knows no languages.") + to_chat(usr, "This mob knows no languages.", confidential=TRUE) return var/datum/language/rem_language = tgui_input_list(usr, "Please choose a language to remove.","Language", H.languages) @@ -1207,14 +1207,14 @@ return if(!H) - to_chat(usr, "Mob doesn't exist anymore") + to_chat(usr, "Mob doesn't exist anymore", confidential=TRUE) return if(H.remove_language(rem_language)) - to_chat(usr, "Removed [rem_language] from [H].") + to_chat(usr, "Removed [rem_language] from [H].", confidential=TRUE) log_and_message_admins("has removed language [rem_language] from [key_name(H)]") else - to_chat(usr, "Mob doesn't know that language.") + to_chat(usr, "Mob doesn't know that language.", confidential=TRUE) else if(href_list["grantalllanguage"]) if(!check_rights(R_SPAWN)) return @@ -1222,12 +1222,12 @@ var/mob/H = locateUID(href_list["grantalllanguage"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob") + to_chat(usr, "This can only be done to instances of type /mob", confidential=TRUE) return H.grant_all_languages() - to_chat(usr, "Added all languages to [H].") + to_chat(usr, "Added all languages to [H].", confidential=TRUE) log_and_message_admins("has given [key_name(H)] all languages") else if(href_list["changevoice"]) @@ -1236,7 +1236,7 @@ var/mob/H = locateUID(href_list["changevoice"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob") + to_chat(usr, "This can only be done to instances of type /mob", confidential=TRUE) return var/old_tts_seed = H.tts_seed @@ -1244,8 +1244,8 @@ if(!new_tts_seed) return - to_chat(usr, "Changed voice from [old_tts_seed] to [new_tts_seed] for [H].") - to_chat(H, "Your voice has been changed from [old_tts_seed] to [new_tts_seed].") + to_chat(usr, "Changed voice from [old_tts_seed] to [new_tts_seed] for [H].", confidential=TRUE) + to_chat(H, "Your voice has been changed from [old_tts_seed] to [new_tts_seed].", confidential=TRUE) log_and_message_admins("has changed [key_name(H)]'s voice from [old_tts_seed] to [new_tts_seed]") else if(href_list["addverb"]) @@ -1254,7 +1254,7 @@ var/mob/living/H = locateUID(href_list["addverb"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living") + to_chat(usr, "This can only be done to instances of type /mob/living", confidential=TRUE) return var/list/possibleverbs = list() possibleverbs += "Cancel" // One for the top... @@ -1271,7 +1271,7 @@ var/verb = input("Select a verb!", "Verbs",null) as anything in possibleverbs if(!H) - to_chat(usr, "Mob doesn't exist anymore") + to_chat(usr, "Mob doesn't exist anymore", confidential=TRUE) return if(!verb || verb == "Cancel") return @@ -1285,11 +1285,11 @@ var/mob/H = locateUID(href_list["remverb"]) if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob") + to_chat(usr, "This can only be done to instances of type /mob", confidential=TRUE) return var/verb = tgui_input_list(usr, "Please choose a verb to remove.","Verbs", H.verbs) if(!H) - to_chat(usr, "Mob doesn't exist anymore") + to_chat(usr, "Mob doesn't exist anymore", confidential=TRUE) return if(!verb) return @@ -1302,18 +1302,18 @@ var/mob/living/carbon/M = locateUID(href_list["addorgan"]) if(!istype(M)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") + to_chat(usr, "This can only be done to instances of type /mob/living/carbon", confidential=TRUE) return var/new_organ = tgui_input_list(usr, "Please choose an organ to add.","Organ", subtypesof(/obj/item/organ)-/obj/item/organ) if(!new_organ) return if(!M) - to_chat(usr, "Mob doesn't exist anymore") + to_chat(usr, "Mob doesn't exist anymore", confidential=TRUE) return if(locateUID(new_organ) in M.internal_organs) - to_chat(usr, "Mob already has that organ.") + to_chat(usr, "Mob already has that organ.", confidential=TRUE) return new new_organ(M) M.regenerate_icons() @@ -1324,20 +1324,20 @@ var/mob/living/carbon/M = locateUID(href_list["remorgan"]) if(!istype(M)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") + to_chat(usr, "This can only be done to instances of type /mob/living/carbon", confidential=TRUE) return var/obj/item/organ/internal/rem_organ = tgui_input_list(usr, "Please choose an organ to remove.", "Organ", M.internal_organs) if(!M) - to_chat(usr, "Mob doesn't exist anymore") + to_chat(usr, "Mob doesn't exist anymore", confidential=TRUE) return if(!(rem_organ in M.internal_organs)) - to_chat(usr, "Mob does not have that organ.") + to_chat(usr, "Mob does not have that organ.", confidential=TRUE) return - to_chat(usr, "Removed [rem_organ] from [M].") + to_chat(usr, "Removed [rem_organ] from [M].", confidential=TRUE) rem_organ.remove(M) log_and_message_admins("has removed the organ [rem_organ] from [key_name(M)]") qdel(rem_organ) @@ -1347,7 +1347,7 @@ var/mob/M = locateUID(href_list["regenerateicons"]) if(!ismob(M)) - to_chat(usr, "This can only be done to instances of type /mob") + to_chat(usr, "This can only be done to instances of type /mob", confidential=TRUE) return M.regenerate_icons() @@ -1362,7 +1362,7 @@ var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num if(!L) - to_chat(usr, "Mob doesn't exist anymore") + to_chat(usr, "Mob doesn't exist anymore", confidential=TRUE) return switch(Text) @@ -1389,7 +1389,7 @@ if("stamina") L.adjustStaminaLoss(amount) else - to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]") + to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]", confidential=TRUE) return if(amount != 0) @@ -1429,7 +1429,7 @@ var/list/L = locate(href_list["listedit"]) if(!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") + to_chat(usr, "This can only be used on instances of type /list", confidential=TRUE) return mod_list(L, null, "list", "contents", index, autodetect_class = TRUE) @@ -1442,7 +1442,7 @@ var/list/L = locate(href_list["listchange"]) if(!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") + to_chat(usr, "This can only be used on instances of type /list", confidential=TRUE) return mod_list(L, null, "list", "contents", index, autodetect_class = FALSE) @@ -1455,7 +1455,7 @@ var/list/L = locate(href_list["listremove"]) if(!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") + to_chat(usr, "This can only be used on instances of type /list", confidential=TRUE) return var/variable = L[index] @@ -1471,7 +1471,7 @@ if(href_list["listadd"]) var/list/L = locate(href_list["listadd"]) if(!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") + to_chat(usr, "This can only be used on instances of type /list", confidential=TRUE) return TRUE mod_list_add(L, null, "list", "contents") @@ -1480,7 +1480,7 @@ if(href_list["listdupes"]) var/list/L = locate(href_list["listdupes"]) if(!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") + to_chat(usr, "This can only be used on instances of type /list", confidential=TRUE) return TRUE uniqueList_inplace(L) @@ -1492,7 +1492,7 @@ if(href_list["listnulls"]) var/list/L = locate(href_list["listnulls"]) if(!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") + to_chat(usr, "This can only be used on instances of type /list", confidential=TRUE) return TRUE listclearnulls(L) @@ -1504,7 +1504,7 @@ if(href_list["listlen"]) var/list/L = locate(href_list["listlen"]) if(!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") + to_chat(usr, "This can only be used on instances of type /list", confidential=TRUE) return TRUE var/value = vv_get_value(VV_NUM) if(value["class"] != VV_NUM) @@ -1519,7 +1519,7 @@ if(href_list["listshuffle"]) var/list/L = locate(href_list["listshuffle"]) if(!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") + to_chat(usr, "This can only be used on instances of type /list", confidential=TRUE) return TRUE shuffle_inplace(L) diff --git a/code/datums/revision.dm b/code/datums/revision.dm index 7eabaf56c07..33bdcb8ff7b 100644 --- a/code/datums/revision.dm +++ b/code/datums/revision.dm @@ -13,6 +13,8 @@ GLOBAL_PROTECT(revision_info) // Dont mess with this var/commit_date // git rev-parse origin/master220 var/originmastercommit + // repo name + var/repo = "ss220-space/Paradise" /datum/code_revision/New() commit_hash = rustg_git_revparse("HEAD") diff --git a/code/game/atoms.dm b/code/game/atoms.dm index bff05a57633..920746bdfc8 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -115,6 +115,8 @@ GLOB._preloader.load(src) . = ..() attempt_init(arglist(args)) + if(SSdemo?.initialized) + SSdemo.mark_new(src) // This is distinct from /tg/ because of our space management system // This is overriden in /atom/movable and the parent isn't called if the SMS wants to deal with it's init diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 8c218692c47..538adf53084 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -725,6 +725,8 @@ for (var/datum/light_source/light as anything in light_sources) // Cycle through the light sources on this atom and tell them to update. light.source_atom.update_light() + + SSdemo.mark_dirty(src) return TRUE diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 7a903bd6061..c9aa47892aa 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -344,7 +344,7 @@ About the new airlock wires panel: . = ..(UPDATE_ICON_STATE) // Sent after the icon_state is changed set_airlock_overlays(state) - + SSdemo.mark_dirty(src) /obj/machinery/door/airlock/update_icon_state() return diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 46b63c92770..c199753a2e9 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -235,7 +235,7 @@ /obj/machinery/door/firedoor/update_icon_state() icon_state = "door_[density ? "closed" : "open"]" - + SSdemo.mark_dirty(src) /obj/machinery/door/firedoor/update_overlays() . = ..() @@ -245,6 +245,7 @@ if(light_on) . += emissive_appearance('icons/obj/doors/doorfire.dmi', "alarmlights_lightmask", src) . += image('icons/obj/doors/doorfire.dmi', "alarmlights") + SSdemo.mark_dirty(src) /obj/machinery/door/firedoor/proc/activate_alarm() diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 79b10d9d253..9953735c604 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -56,7 +56,7 @@ /obj/machinery/door/poddoor/update_icon_state() icon_state = density ? "closed" : "open" - + SSdemo.mark_dirty(src) /obj/machinery/door/poddoor/try_to_activate_door(mob/user) return diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 9080029c923..1e44d53661e 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -174,7 +174,7 @@ icon_state = base_state else icon_state = base_state - + SSdemo.mark_dirty(src) /obj/machinery/door/window/open(forced=0) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index a54fe33f97f..337e11f4264 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -389,6 +389,7 @@ var/area/our_area = W.loc if(our_area.lighting_effects) W.add_overlay(our_area.lighting_effects[SSmapping.z_level_to_plane_offset[z] + 1]) + SSdemo.mark_turf(W) return W diff --git a/code/game/world.dm b/code/game/world.dm index 6b89f481652..cdef55bc6d1 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -271,6 +271,7 @@ GLOBAL_LIST_EMPTY(world_topic_handlers) GLOB.world_qdel_log = "[GLOB.log_directory]/qdel.log" GLOB.world_asset_log = "[GLOB.log_directory]/asset.log" GLOB.tgui_log = "[GLOB.log_directory]/tgui.log" + GLOB.demo_log = "[GLOB.log_directory]/demo.txt" GLOB.http_log = "[GLOB.log_directory]/http.log" GLOB.sql_log = "[GLOB.log_directory]/sql.log" start_log(GLOB.world_game_log) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index de159876236..f6e0edaad4c 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -71,7 +71,7 @@ GLOBAL_VAR_INIT(nologevent, 0) set desc="Edit player (respawn, ban, heal, etc)" if(!M) - to_chat(usr, "You seem to be selecting a mob that doesn't exist anymore.") + to_chat(usr, "You seem to be selecting a mob that doesn't exist anymore.", confidential=TRUE) return if(!check_rights(R_ADMIN|R_MOD)) @@ -564,7 +564,7 @@ GLOBAL_VAR_INIT(nologevent, 0) SSblackbox.record_feedback("tally", "admin_verb", 1, "Start Game") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! return 1 else - to_chat(usr, "Error: Start Now: Game has already started.") + to_chat(usr, "Error: Start Now: Game has already started.", confidential=TRUE) return /datum/admins/proc/toggleenter() @@ -816,10 +816,10 @@ GLOBAL_VAR_INIT(nologevent, 0) return if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return if(!M.mind) - to_chat(usr, "This mob has no mind!") + to_chat(usr, "This mob has no mind!", confidential=TRUE) return M.mind.edit_memory() @@ -846,26 +846,26 @@ GLOBAL_VAR_INIT(nologevent, 0) for(var/mob/living/silicon/S in GLOB.mob_list) ai_number++ if(isAI(S)) - to_chat(usr, "AI [key_name(S, TRUE)]'s laws:") + to_chat(usr, "AI [key_name(S, TRUE)]'s laws:", confidential=TRUE) else if(isrobot(S)) var/mob/living/silicon/robot/R = S - to_chat(usr, "CYBORG [key_name(S, TRUE)]'s [R.connected_ai?"(Slaved to: [R.connected_ai])":"(Independent)"] laws:") + to_chat(usr, "CYBORG [key_name(S, TRUE)]'s [R.connected_ai?"(Slaved to: [R.connected_ai])":"(Independent)"] laws:", confidential=TRUE) else if(ispAI(S)) var/mob/living/silicon/pai/P = S - to_chat(usr, "pAI [key_name(S, TRUE)]'s laws:") - to_chat(usr, "[P.pai_law0]") + to_chat(usr, "pAI [key_name(S, TRUE)]'s laws:", confidential=TRUE) + to_chat(usr, "[P.pai_law0]", confidential=TRUE) if(P.pai_laws) to_chat(usr, "[P.pai_laws]") continue // Skip showing normal silicon laws for pAIs - they don't have any else - to_chat(usr, "SILICON [key_name(S, TRUE)]'s laws:") + to_chat(usr, "SILICON [key_name(S, TRUE)]'s laws:", confidential=TRUE) if(S.laws == null) - to_chat(usr, "[key_name(S, TRUE)]'s laws are null. Contact a coder.") + to_chat(usr, "[key_name(S, TRUE)]'s laws are null. Contact a coder.", confidential=TRUE) else S.laws.show_laws(usr) if(!ai_number) - to_chat(usr, "No AI's located.")//Just so you know the thing is actually working and not just ignoring you. + to_chat(usr, "No AI's located.", confidential=TRUE)//Just so you know the thing is actually working and not just ignoring you. log_and_message_admins("checked the AI laws") @@ -915,7 +915,7 @@ GLOBAL_VAR_INIT(nologevent, 0) if(kick_only_afk && !C.is_afk()) //Ignore clients who are not afk continue if(message) - to_chat(C, message) + to_chat(C, message, confidential=TRUE) kicked_client_names.Add("[C.ckey]") qdel(C) return kicked_client_names diff --git a/code/modules/admin/admin_memo.dm b/code/modules/admin/admin_memo.dm index 81daeac71e9..eaef3ef4534 100644 --- a/code/modules/admin/admin_memo.dm +++ b/code/modules/admin/admin_memo.dm @@ -4,7 +4,7 @@ if(!check_rights(R_SERVER)) return if(!SSdbcore.IsConnected()) - to_chat(src, "Failed to establish database connection.") + to_chat(src, "Failed to establish database connection.", confidential=TRUE) return var/memotask = input(usr,"Choose task.","Memo") in list("Show","Write","Edit","Remove") if(!memotask) @@ -17,7 +17,7 @@ if(!task) return if(!SSdbcore.IsConnected()) - to_chat(src, "Failed to establish database connection.") + to_chat(src, "Failed to establish database connection.", confidential=TRUE) return switch(task) if("Write") @@ -31,7 +31,7 @@ return if(query_memocheck.NextRow()) - to_chat(src, "You already have set a memo.") + to_chat(src, "You already have set a memo.", confidential=TRUE) qdel(query_memocheck) return @@ -70,7 +70,7 @@ qdel(query_memolist) if(!length(memolist)) - to_chat(src, "No memos found in database.") + to_chat(src, "No memos found in database.", confidential=TRUE) return var/target_ckey = input(src, "Select whose memo to edit", "Select memo") as null|anything in memolist @@ -135,9 +135,9 @@ output += "
Last edit by [last_editor] (Click here to see edit log)" output += "
[memotext]

" if(output) - to_chat(src, output) + to_chat(src, output, confidential=TRUE) else if(!silent) - to_chat(src, "No memos found in database.") + to_chat(src, "No memos found in database.", confidential=TRUE) qdel(query_memoshow) if("Remove") @@ -153,7 +153,7 @@ qdel(query_memodellist) if(!memolist.len) - to_chat(src, "No memos found in database.") + to_chat(src, "No memos found in database.", confidential=TRUE) return var/target_ckey = input(src, "Select whose memo to delete", "Select memo") as null|anything in memolist diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index cd8485285ee..3f93fb73f4c 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -59,7 +59,7 @@ GLOBAL_PROTECT(admin_ranks) // this shit is being protected for obvious reasons /proc/load_admins(run_async = FALSE) if(IsAdminAdvancedProcCall()) - to_chat(usr, span_boldannounceooc("Admin reload blocked: Advanced ProcCall detected.")) + to_chat(usr, span_boldannounceooc("Admin reload blocked: Advanced ProcCall detected."), confidential=TRUE) log_and_message_admins("attempted to reload admins via advanced proc-call") return //clear the datums references diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 63b76ad1028..fc0b7cfccb9 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -309,7 +309,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( )) add_verb(src, /client/proc/show_verbs) - to_chat(src, "Almost all of your adminverbs have been hidden.") + to_chat(src, "Almost all of your adminverbs have been hidden.", confidential=TRUE) SSblackbox.record_feedback("tally", "admin_verb", 1, "Hide Admin Verbs") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! return @@ -323,7 +323,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( remove_verb(src, /client/proc/show_verbs) add_admin_verbs() - to_chat(src, "All of your adminverbs are now visible.") + to_chat(src, "All of your adminverbs are now visible.", confidential=TRUE) SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Admin Verbs") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/admin_ghost() @@ -344,7 +344,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( var/mob/living/carbon/human/H = mob H.regenerate_icons() // workaround for #13269 else if(isnewplayer(mob)) - to_chat(src, "Error: Aghost: Can't admin-ghost whilst in the lobby. Join or observe first.") + to_chat(src, "Error: Aghost: Can't admin-ghost whilst in the lobby. Join or observe first.", confidential=TRUE) else //ghostize var/mob/body = mob @@ -368,12 +368,12 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( if(mob.invisibility == INVISIBILITY_OBSERVER) mob.invisibility = initial(mob.invisibility) mob.add_to_all_human_data_huds() - to_chat(mob, "Invisimin off. Invisibility reset.") + to_chat(mob, "Invisimin off. Invisibility reset.", confidential=TRUE) log_admin("[key_name(mob)] has turned Invisimin OFF") else mob.invisibility = INVISIBILITY_OBSERVER mob.remove_from_all_data_huds() - to_chat(mob, "Invisimin on. You are now as invisible as a ghost.") + to_chat(mob, "Invisimin on. You are now as invisible as a ghost.", confidential=TRUE) log_admin("[key_name(mob)] has turned Invisimin ON") SSblackbox.record_feedback("tally", "admin_verb", 1, "Invisimin") @@ -538,7 +538,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( if(!check_rights(R_EVENT)) return if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob/living") + to_chat(usr, "This can only be used on instances of type /mob/living", confidential=TRUE) return var/btypes = list("To Arrivals", "Moderate Heal") var/mob/living/carbon/human/H @@ -571,7 +571,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( logmsg = "spawn cookie." if("To Arrivals") M.forceMove(pick(GLOB.latejoin)) - to_chat(M, "You are abruptly pulled through space!") + to_chat(M, "You are abruptly pulled through space!", confidential=TRUE) logmsg = "a teleport to arrivals." if("Moderate Heal") var/update = NONE @@ -579,7 +579,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( update |= M.heal_damages(tox = 25, oxy = 25, updating_health = FALSE) if(update) M.updatehealth() - to_chat(M,"You feel invigorated!") + to_chat(M,"You feel invigorated!", confidential=TRUE) logmsg = "a moderate heal." if("Heal Over Time") H.reagents.add_reagent("salglu_solution", 30) @@ -643,7 +643,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( P.mind.name = newname logmsg = "pet ([P])." else - to_chat(usr, "WARNING: Nobody volunteered to play the special event pet.") + to_chat(usr, "WARNING: Nobody volunteered to play the special event pet.", confidential=TRUE) logmsg = "pet (no volunteers)." if("Human Protector") usr.client.create_eventmob_for(H, 0) @@ -657,7 +657,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( // don't have it - add it I.access |= this_access else - to_chat(usr, "ERROR: [H] is not wearing an ID card.") + to_chat(usr, "ERROR: [H] is not wearing an ID card.", confidential=TRUE) logmsg = "all access." if(logmsg) log_and_message_admins("blessed [key_name_log(M)] with: [logmsg]") @@ -669,7 +669,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( return var/mob/living/carbon/human/H if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob/living") + to_chat(usr, "This can only be used on instances of type /mob/living", confidential=TRUE) return var/ptypes = list("Lightning bolt", "Fire Death", "Gib") if(ishuman(M)) @@ -763,7 +763,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( logmsg = "hunter." if("Crew Traitor") if(!H.mind) - to_chat(usr, "ERROR: This mob ([H]) has no mind!") + to_chat(usr, "ERROR: This mob ([H]) has no mind!", confidential=TRUE) return var/list/possible_traitors = list() for(var/mob/living/player in GLOB.alive_mob_list) @@ -788,7 +788,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( to_chat(newtraitormind.current, "Goal: KILL [H.real_name], currently in [get_area(H.loc)]") newtraitormind.add_antag_datum(T) else - to_chat(usr, "ERROR: Unable to find any valid candidate to send after [H].") + to_chat(usr, "ERROR: Unable to find any valid candidate to send after [H].", confidential=TRUE) return logmsg = "crew traitor." if("Floor Cluwne") @@ -946,7 +946,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( add_verb(src, /client/proc/readmin) GLOB.deadmins += ckey update_active_keybindings() - to_chat(src, "You are now a normal player.") + to_chat(src, "You are now a normal player.", confidential=TRUE) SSblackbox.record_feedback("tally", "admin_verb", 1, "De-admin") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/readmin() @@ -973,7 +973,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( else if(!SSdbcore.IsConnected()) - to_chat(src, "Warning, MYSQL database is not connected.") + to_chat(src, "Warning, MYSQL database is not connected.", confidential=TRUE) return var/datum/db_query/rank_read = SSdbcore.NewQuery( @@ -993,13 +993,13 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( if(CONFIG_GET(flag/admin_legacy_system)) if(GLOB.admin_ranks[rank] == null) error("Error while re-adminning [src], admin rank ([rank]) does not exist.") - to_chat(src, "Error while re-adminning, admin rank ([rank]) does not exist.") + to_chat(src, "Error while re-adminning, admin rank ([rank]) does not exist.", confidential=TRUE) return D = new(rank, GLOB.admin_ranks[rank], ckey) else if(!SSdbcore.IsConnected()) - to_chat(src, "Warning, MYSQL database is not connected.") + to_chat(src, "Warning, MYSQL database is not connected.", confidential=TRUE) return var/datum/db_query/admin_read = SSdbcore.NewQuery( @@ -1016,11 +1016,11 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( var/admin_rank = admin_read.item[2] var/flags = admin_read.item[3] if(!admin_ckey) - to_chat(src, "Error while re-adminning, ckey [admin_ckey] was not found in the admin database.") + to_chat(src, "Error while re-adminning, ckey [admin_ckey] was not found in the admin database.", confidential=TRUE) qdel(admin_read) return if(admin_rank == "Удален") //This person was de-adminned. They are only in the admin list for archive purposes. - to_chat(src, "Error while re-adminning, ckey [admin_ckey] is not an admin.") + to_chat(src, "Error while re-adminning, ckey [admin_ckey] is not an admin.", confidential=TRUE) qdel(admin_read) return @@ -1040,7 +1040,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( SSblackbox.record_feedback("tally", "admin_verb", 1, "Re-admin") return else - to_chat(src, "You are already an admin.") + to_chat(src, "You are already an admin.", confidential=TRUE) remove_verb(src, /client/proc/readmin) GLOB.deadmins -= ckey return @@ -1071,10 +1071,10 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( if(config) if(CONFIG_GET(flag/log_hrefs)) CONFIG_SET(flag/log_hrefs, FALSE) - to_chat(src, "Stopped logging hrefs") + to_chat(src, "Stopped logging hrefs", confidential=TRUE) else CONFIG_SET(flag/log_hrefs, TRUE) - to_chat(src, "Started logging hrefs") + to_chat(src, "Started logging hrefs", confidential=TRUE) /client/proc/toggle_twitch_censor() set name = "Toggle Twitch censor" @@ -1085,7 +1085,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( if(config) CONFIG_SET(flag/twitch_censor, !CONFIG_GET(flag/twitch_censor)) - to_chat(src, "Twitch censor is [CONFIG_GET(flag/twitch_censor) ? "enabled" : "disabled"]") + to_chat(src, "Twitch censor is [CONFIG_GET(flag/twitch_censor) ? "enabled" : "disabled"]", confidential=TRUE) /client/proc/check_ai_laws() set name = "Check AI Laws" @@ -1151,7 +1151,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( return if(!H.client) - to_chat(usr, "Only mobs with clients can alter their own appearance.") + to_chat(usr, "Only mobs with clients can alter their own appearance.", confidential=TRUE) return switch(alert("Do you wish for [H] to be allowed to select non-whitelisted races?","Alter Mob Appearance","Yes","No","Cancel")) @@ -1175,7 +1175,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( if(J.current_positions >= J.total_positions && J.total_positions != -1) jobs += J.title if(!jobs.len) - to_chat(usr, "There are no fully staffed jobs.") + to_chat(usr, "There are no fully staffed jobs.", confidential=TRUE) return var/job = input("Please select job slot to free", "Free Job Slot") as null|anything in jobs if(job) diff --git a/code/modules/admin/db_ban/functions.dm b/code/modules/admin/db_ban/functions.dm index 52b03d3c385..01266f6cd0d 100644 --- a/code/modules/admin/db_ban/functions.dm +++ b/code/modules/admin/db_ban/functions.dm @@ -5,7 +5,7 @@ if(!check_rights(R_BAN)) return if(!SSdbcore.IsConnected()) - to_chat(usr, span_boldannounceooc("Database connection failure when attempting to make DB ban. Please freeze them and write their ckey in notepad, so they can be banned when the DB returns.")) + to_chat(usr, span_boldannounceooc("Database connection failure when attempting to make DB ban. Please freeze them and write their ckey in notepad, so they can be banned when the DB returns."), confidential=TRUE) return var/serverip = "[world.internet_address]:[world.port]" @@ -113,7 +113,7 @@ if(blockselfban) if(a_ckey == ckey) - to_chat(usr, "You cannot apply this ban type on yourself.") + to_chat(usr, "You cannot apply this ban type on yourself.", confidential=TRUE) return var/who @@ -140,7 +140,7 @@ if(adm_query.NextRow()) var/adm_bans = text2num(adm_query.item[1]) if(adm_bans >= MAX_ADMIN_BANS_PER_ADMIN) - to_chat(usr, "You already logged [MAX_ADMIN_BANS_PER_ADMIN] admin ban(s) or more. Do not abuse this function!") + to_chat(usr, "You already logged [MAX_ADMIN_BANS_PER_ADMIN] admin ban(s) or more. Do not abuse this function!", confidential=TRUE) qdel(adm_query) return qdel(adm_query) @@ -170,7 +170,7 @@ return qdel(query_insert) - to_chat(usr, "Ban saved to database.") + to_chat(usr, "Ban saved to database.", confidential=TRUE) message_admins("[key_name_admin(usr)] has added a [bantype_str] for [ckey] [(job)?"([job])":""] [(duration > 0)?"([duration] minutes)":""] with the reason: \"[reason]\" to the ban database.") if(announce_in_discord) @@ -190,7 +190,7 @@ if(!check_rights(R_BAN)) return if(!SSdbcore.IsConnected()) - to_chat(usr, span_boldannounceooc("Database connection failure when attempting to remove DB ban. Please remember to unban them at a later date!.")) + to_chat(usr, span_boldannounceooc("Database connection failure when attempting to remove DB ban. Please remember to unban them at a later date!."), confidential=TRUE) return var/bantype_str @@ -255,17 +255,17 @@ qdel(query) if(ban_number == 0) - to_chat(usr, "Database update failed due to no bans fitting the search criteria. If this is not a legacy ban you should contact the database admin.") + to_chat(usr, "Database update failed due to no bans fitting the search criteria. If this is not a legacy ban you should contact the database admin.", confidential=TRUE) return if(ban_number > 1) - to_chat(usr, "Database update failed due to multiple bans fitting the search criteria. Note down the ckey, job and current time and contact the database admin.") + to_chat(usr, "Database update failed due to multiple bans fitting the search criteria. Note down the ckey, job and current time and contact the database admin.", confidential=TRUE) return if(istext(ban_id)) ban_id = text2num(ban_id) if(!isnum(ban_id)) - to_chat(usr, "Database update failed due to a ban ID mismatch. Contact the database admin.") + to_chat(usr, "Database update failed due to a ban ID mismatch. Contact the database admin.", confidential=TRUE) return DB_ban_unban_by_id(ban_id) @@ -279,7 +279,7 @@ if(!check_rights(R_BAN)) return if(!isnum(banid) || !istext(param)) - to_chat(usr, "Cancelled") + to_chat(usr, "Cancelled", confidential=TRUE) return var/datum/db_query/query = SSdbcore.NewQuery("SELECT ckey, duration, reason, job FROM [CONFIG_GET(string/utility_database)].[format_table_name("ban")] WHERE id=:banid", list( @@ -301,7 +301,7 @@ reason = query.item[3] job = query.item[4] else - to_chat(usr, "Invalid ban id. Contact the database admin") + to_chat(usr, "Invalid ban id. Contact the database admin", confidential=TRUE) qdel(query) return @@ -313,7 +313,7 @@ if(!value) value = input("Insert the new reason for [pckey]'s ban", "New Reason", "[reason]", null) as null|text if(!value) - to_chat(usr, "Cancelled") + to_chat(usr, "Cancelled", confidential=TRUE) return var/edit_reason = "- [eckey] changed ban reason from \\\"[reason]\\\" to \\\"[value]\\\"
" @@ -332,7 +332,7 @@ if(!value) value = input("Insert the new duration (in minutes) for [pckey]'s ban", "New Duration", "[duration]", null) as null|num if(!isnum(value) || !value) - to_chat(usr, "Cancelled") + to_chat(usr, "Cancelled", confidential=TRUE) return var/edittext = "- [eckey] changed ban duration from [duration] to [value]
" @@ -354,10 +354,10 @@ jobban_unban_client(pckey, job) return else - to_chat(usr, "Cancelled") + to_chat(usr, "Cancelled", confidential=TRUE) return else - to_chat(usr, "Cancelled") + to_chat(usr, "Cancelled", confidential=TRUE) return /datum/admins/proc/DB_ban_unban_by_id(var/id) @@ -366,7 +366,7 @@ return if(!SSdbcore.IsConnected()) - to_chat(usr, span_boldannounceooc("Database connection failure when attempting to remove DB ban. Please remember to unban them at a later date!")) + to_chat(usr, span_boldannounceooc("Database connection failure when attempting to remove DB ban. Please remember to unban them at a later date!"), confidential=TRUE) return var/ban_number = 0 //failsafe @@ -385,11 +385,11 @@ qdel(query) if(ban_number == 0) - to_chat(usr, "Database update failed due to a ban id not being present in the database.") + to_chat(usr, "Database update failed due to a ban id not being present in the database.", confidential=TRUE) return if(ban_number > 1) - to_chat(usr, "Database update failed due to multiple bans having the same ID. Contact the database admin.") + to_chat(usr, "Database update failed due to multiple bans having the same ID. Contact the database admin.", confidential=TRUE) return if(!src.owner || !isclient(src.owner)) @@ -435,7 +435,7 @@ return if(!SSdbcore.IsConnected()) - to_chat(usr, "Failed to establish database connection") + to_chat(usr, "Failed to establish database connection", confidential=TRUE) return var/output = {"
"} diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 8279f605b04..4a25b97ff16 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -19,9 +19,9 @@ C << 'sound/effects/adminhelp.ogg' - to_chat(C, "- AdminHelp Rejected! -") - to_chat(C, "Your admin help was rejected.") - to_chat(C, "Please try to be calm, clear, and descriptive in admin helps, do not assume the admin has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.") + to_chat(C, "- AdminHelp Rejected! -", confidential=TRUE) + to_chat(C, "Your admin help was rejected.", confidential=TRUE) + to_chat(C, "Please try to be calm, clear, and descriptive in admin helps, do not assume the admin has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.", confidential=TRUE) message_admins("[key_name_admin(usr)] rejected [key_name_admin(C.mob)]'s admin help") log_admin("[key_name(usr)] rejected [key_name(C.mob)]'s admin help") @@ -45,51 +45,51 @@ if("1") log_admin("[key_name(usr)] has spawned a traitor.") if(!makeTraitors()) - to_chat(usr, "Unfortunately there weren't enough candidates available.") + to_chat(usr, "Unfortunately there weren't enough candidates available.", confidential=TRUE) if("2") log_admin("[key_name(usr)] has spawned a changeling.") if(!makeChangelings()) - to_chat(usr, "Unfortunately there weren't enough candidates available.") + to_chat(usr, "Unfortunately there weren't enough candidates available.", confidential=TRUE) if("3") log_admin("[key_name(usr)] has spawned revolutionaries.") if(!makeRevs()) - to_chat(usr, "Unfortunately there weren't enough candidates available.") + to_chat(usr, "Unfortunately there weren't enough candidates available.", confidential=TRUE) if("4") log_admin("[key_name(usr)] has spawned a cultists.") if(!makeCult()) - to_chat(usr, "Unfortunately there weren't enough candidates available.") + to_chat(usr, "Unfortunately there weren't enough candidates available.", confidential=TRUE) if("5") log_admin("[key_name(usr)] has spawned a clockers.") if(!makeClockwork()) - to_chat(usr, "Unfortunately there weren't enough candidates available.") + to_chat(usr, "Unfortunately there weren't enough candidates available.", confidential=TRUE) if("6") log_admin("[key_name(usr)] has spawned a wizard.") if(!makeWizard()) - to_chat(usr, "Unfortunately there weren't enough candidates available.") + to_chat(usr, "Unfortunately there weren't enough candidates available.", confidential=TRUE) if("7") log_admin("[key_name(usr)] has spawned vampires.") if(!makeVampires()) - to_chat(usr, "Unfortunately there weren't enough candidates available.") + to_chat(usr, "Unfortunately there weren't enough candidates available.", confidential=TRUE) if("8") log_admin("[key_name(usr)] has spawned vox raiders.") if(!makeVoxRaiders()) - to_chat(usr, "Unfortunately there weren't enough candidates available.") + to_chat(usr, "Unfortunately there weren't enough candidates available.", confidential=TRUE) if("9") log_admin("[key_name(usr)] has spawned an abductor team.") if(!makeAbductorTeam()) - to_chat(usr, "Unfortunately there weren't enough candidates available.") + to_chat(usr, "Unfortunately there weren't enough candidates available.", confidential=TRUE) if("10") log_admin("[key_name(usr)] has spawned a space ninja.") if(!makeSpaceNinja()) - to_chat(usr, "Unfortunately there weren't enough candidates available.") + to_chat(usr, "Unfortunately there weren't enough candidates available.", confidential=TRUE) if("11") log_admin("[key_name(usr)] has spawned a thief.") if(!makeThieves()) - to_chat(usr, "Unfortunately there weren't enough candidates available.") + to_chat(usr, "Unfortunately there weren't enough candidates available.", confidential=TRUE) if("12") log_admin("[key_name(usr)] has spawned a blob.") if(!makeBlobs()) - to_chat(usr, "Unfortunately there weren't enough candidates available.") + to_chat(usr, "Unfortunately there weren't enough candidates available.", confidential=TRUE) else if(href_list["dbsearchckey"] || href_list["dbsearchadmin"] || href_list["dbsearchip"] || href_list["dbsearchcid"] || href_list["dbsearchbantype"]) var/adminckey = href_list["dbsearchadmin"] @@ -131,45 +131,45 @@ switch(bantype) if(BANTYPE_PERMA) if(!banckey || !banreason) - to_chat(usr, "Not enough parameters (Requires ckey and reason)") + to_chat(usr, "Not enough parameters (Requires ckey and reason)", confidential=TRUE) return banduration = null banjob = null bantype_str = "PERMABAN" if(BANTYPE_TEMP) if(!banckey || !banreason || !banduration) - to_chat(usr, "Not enough parameters (Requires ckey, reason and duration)") + to_chat(usr, "Not enough parameters (Requires ckey, reason and duration)", confidential=TRUE) return banjob = null bantype_str = "TEMPBAN" if(BANTYPE_JOB_PERMA) if(!banckey || !banreason || !banjob) - to_chat(usr, "Not enough parameters (Requires ckey, reason and job)") + to_chat(usr, "Not enough parameters (Requires ckey, reason and job)", confidential=TRUE) return banduration = null bantype_str = "JOB_PERMABAN" if(BANTYPE_JOB_TEMP) if(!banckey || !banreason || !banjob || !banduration) - to_chat(usr, "Not enough parameters (Requires ckey, reason and job)") + to_chat(usr, "Not enough parameters (Requires ckey, reason and job)", confidential=TRUE) return bantype_str = "JOB_TEMPBAN" if(BANTYPE_APPEARANCE) if(!banckey || !banreason) - to_chat(usr, "Not enough parameters (Requires ckey and reason)") + to_chat(usr, "Not enough parameters (Requires ckey and reason)", confidential=TRUE) return banduration = null banjob = null bantype_str = "APPEARANCE_BAN" if(BANTYPE_ADMIN_PERMA) if(!banckey || !banreason) - to_chat(usr, "Not enough parameters (Requires ckey and reason)") + to_chat(usr, "Not enough parameters (Requires ckey and reason)", confidential=TRUE) return banduration = null banjob = null bantype_str = "ADMIN_PERMABAN" if(BANTYPE_ADMIN_TEMP) if(!banckey || !banreason || !banduration) - to_chat(usr, "Not enough parameters (Requires ckey, reason and duration)") + to_chat(usr, "Not enough parameters (Requires ckey, reason and duration)", confidential=TRUE) return banjob = null bantype_str = "ADMIN_TEMPBAN" @@ -270,14 +270,14 @@ var/new_ckey = ckey(clean_input("Сикей нового админа","Добавление админа", null)) if(!new_ckey) return if(new_ckey in GLOB.admin_datums) - to_chat(usr, "Ошибка: Topic 'editrights': [new_ckey] уже админ!") + to_chat(usr, "Ошибка: Topic 'editrights': [new_ckey] уже админ!", confidential=TRUE) return adm_ckey = new_ckey task = "rank" else if(task != "show") adm_ckey = ckey(href_list["ckey"]) if(!adm_ckey) - to_chat(usr, "Ошибка: Topic 'editrights': Неверный сикей") + to_chat(usr, "Ошибка: Topic 'editrights': Неверный сикей", confidential=TRUE) return var/datum/admins/D = GLOB.admin_datums[adm_ckey] @@ -308,7 +308,7 @@ if("*Новый Ранг*") new_rank = trim(input("Введите название нового ранга", "Новый Ранг", null, null) as null|text) if(!new_rank) - to_chat(usr, "Ошибка: Topic 'editrights': Неверный ранг") + to_chat(usr, "Ошибка: Topic 'editrights': Неверный ранг", confidential=TRUE) return if(new_rank in GLOB.admin_ranks) rights = GLOB.admin_ranks[new_rank] //we typed a rank which already exists, use its rights @@ -430,7 +430,7 @@ var/mob/M = locateUID(href_list["mob"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return var/delmob = 0 @@ -537,10 +537,10 @@ return var/mob/M = locateUID(href_list["appearanceban"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return if(!M.ckey) //sanity - to_chat(usr, "This mob has no ckey") + to_chat(usr, "This mob has no ckey", confidential=TRUE) return var/ban_ckey_param = href_list["dbbanaddckey"] @@ -557,7 +557,7 @@ DB_ban_unban(M.ckey, BANTYPE_APPEARANCE) appearance_unban(M) message_admins("[key_name_admin(usr)] removed [key_name_admin(M)]'s appearance ban") - to_chat(M, "[usr.client.ckey] has removed your appearance ban.") + to_chat(M, "[usr.client.ckey] has removed your appearance ban.", confidential=TRUE) else switch(alert("Appearance ban [M.ckey]?",,"Yes","No", "Cancel")) if("Yes") @@ -571,13 +571,13 @@ appearance_fullban(M, "[reason]; By [usr.ckey] on [time2text(world.realtime)]") add_note(M.ckey, "Appearance banned - [reason]", null, usr.ckey, 0) message_admins("[key_name_admin(usr)] appearance banned [key_name_admin(M)]") - to_chat(M, "You have been appearance banned by [usr.client.ckey].") - to_chat(M, "The reason is: [reason]") - to_chat(M, "Appearance ban can be lifted only upon request.") + to_chat(M, "You have been appearance banned by [usr.client.ckey].", confidential=TRUE) + to_chat(M, "The reason is: [reason]", confidential=TRUE) + to_chat(M, "Appearance ban can be lifted only upon request.", confidential=TRUE) if(CONFIG_GET(string/banappeals)) - to_chat(M, "To try to resolve this matter head to [CONFIG_GET(string/banappeals)]") + to_chat(M, "To try to resolve this matter head to [CONFIG_GET(string/banappeals)]", confidential=TRUE) else - to_chat(M, "No ban appeals URL has been set.") + to_chat(M, "No ban appeals URL has been set.", confidential=TRUE) if("No") return @@ -586,14 +586,14 @@ var/mob/M = locateUID(href_list["jobban2"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return if(!M.ckey) //sanity - to_chat(usr, "This mob has no ckey") + to_chat(usr, "This mob has no ckey", confidential=TRUE) return if(!SSjobs) - to_chat(usr, "SSjobs has not been setup!") + to_chat(usr, "SSjobs has not been setup!", confidential=TRUE) return var/dat = "" @@ -834,7 +834,7 @@ var/mob/M = locateUID(href_list["jobban4"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return if(M != usr) //we can jobban ourselves @@ -845,7 +845,7 @@ var/ban_ckey_param = href_list["dbbanaddckey"] if(!SSjobs) - to_chat(usr, "SSjobs has not been setup!") + to_chat(usr, "SSjobs has not been setup!", confidential=TRUE) return //get jobs for department if specified, otherwise just returnt he one job in a list. @@ -914,7 +914,7 @@ switch(alert("Temporary Ban of [M.ckey]?",,"Yes","No", "Cancel")) if("Yes") if(CONFIG_GET(flag/ban_legacy_system)) - to_chat(usr, "Your server is using the legacy banning system, which does not support temporary job bans. Consider upgrading. Aborting ban.") + to_chat(usr, "Your server is using the legacy banning system, which does not support temporary job bans. Consider upgrading. Aborting ban.", confidential=TRUE) return var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null if(!mins) @@ -936,9 +936,9 @@ msg += ", [job]" add_note(M.ckey, "Banned from [msg] - [reason]", null, usr.ckey, 0) message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes") - to_chat(M, "You have been jobbanned by [usr.client.ckey] from: [msg].") - to_chat(M, "The reason is: [reason]") - to_chat(M, "This jobban will be lifted in [mins] minutes.") + to_chat(M, "You have been jobbanned by [usr.client.ckey] from: [msg].", confidential=TRUE) + to_chat(M, "The reason is: [reason]", confidential=TRUE) + to_chat(M, "This jobban will be lifted in [mins] minutes.", confidential=TRUE) href_list["jobban2"] = 1 // lets it fall through and refresh return 1 if("No") @@ -955,9 +955,9 @@ else msg += ", [job]" add_note(M.ckey, "Banned from [msg] - [reason]", null, usr.ckey, 0) message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg]") - to_chat(M, "You have been jobbanned by [usr.client.ckey] from: [msg].") - to_chat(M, "The reason is: [reason]") - to_chat(M, "Jobban can be lifted only upon request.") + to_chat(M, "You have been jobbanned by [usr.client.ckey] from: [msg].", confidential=TRUE) + to_chat(M, "The reason is: [reason]", confidential=TRUE) + to_chat(M, "Jobban can be lifted only upon request.", confidential=TRUE) href_list["jobban2"] = 1 // lets it fall through and refresh return 1 if("Cancel") @@ -967,7 +967,7 @@ //all jobs in joblist are banned already OR we didn't give a reason (implying they shouldn't be banned) if(joblist.len) //at least 1 banned job exists in joblist so we have stuff to unban. if(!CONFIG_GET(flag/ban_legacy_system)) - to_chat(usr, "Unfortunately, database based unbanning cannot be done through this panel") + to_chat(usr, "Unfortunately, database based unbanning cannot be done through this panel", confidential=TRUE) DB_ban_panel(M.ckey) return var/msg @@ -986,7 +986,7 @@ continue if(msg) message_admins("[key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg]") - to_chat(M, "You have been un-jobbanned by [usr.client.ckey] from [msg].") + to_chat(M, "You have been un-jobbanned by [usr.client.ckey] from [msg].", confidential=TRUE) href_list["jobban2"] = 1 // lets it fall through and refresh return 1 return 0 //we didn't do anything! @@ -997,13 +997,13 @@ return var/client/C = M.client if(C == null) - to_chat(usr, "Mob has no client to kick.") + to_chat(usr, "Mob has no client to kick.", confidential=TRUE) return if(alert("Kick [C.ckey]?",,"Yes","No") == "Yes") if(C && C.holder && (C.holder.rights & R_BAN)) - to_chat(usr, "[key_name_admin(C)] cannot be kicked from the server.") + to_chat(usr, "[key_name_admin(C)] cannot be kicked from the server.", confidential=TRUE) return - to_chat(C, "You have been kicked from the server") + to_chat(C, "You have been kicked from the server", confidential=TRUE) log_and_message_admins("booted [key_name_admin(C)].") //C = null qdel(C) @@ -1111,15 +1111,15 @@ M = admin_ban_mobsearch(M, ban_ckey_param, usr) AddBan(M.ckey, M.computer_id, reason, usr.ckey, 1, mins) ban_unban_log_save("[usr.client.ckey] has banned [M.ckey]. - Reason: [reason] - This will be removed in [mins] minutes.") - to_chat(M, "You have been banned by [usr.client.ckey].\nReason: [reason].") - to_chat(M, "This is a temporary ban, it will be removed in [mins] minutes.") + to_chat(M, "You have been banned by [usr.client.ckey].\nReason: [reason].", confidential=TRUE) + to_chat(M, "This is a temporary ban, it will be removed in [mins] minutes.", confidential=TRUE) DB_ban_record(BANTYPE_TEMP, M, mins, reason) if(M.client) M.client.link_forum_account(TRUE) if(CONFIG_GET(string/banappeals)) - to_chat(M, "To try to resolve this matter head to [CONFIG_GET(string/banappeals)]") + to_chat(M, "To try to resolve this matter head to [CONFIG_GET(string/banappeals)]", confidential=TRUE) else - to_chat(M, "No ban appeals URL has been set.") + to_chat(M, "No ban appeals URL has been set.", confidential=TRUE) log_admin("[key_name(usr)] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") message_admins("[key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") @@ -1129,14 +1129,14 @@ if(!reason) return AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0, M.lastKnownIP) - to_chat(M, "You have been banned by [usr.client.ckey].\nReason: [reason].") - to_chat(M, "This ban does not expire automatically and must be appealed.") + to_chat(M, "You have been banned by [usr.client.ckey].\nReason: [reason].", confidential=TRUE) + to_chat(M, "This ban does not expire automatically and must be appealed.", confidential=TRUE) if(M.client) M.client.link_forum_account(TRUE) if(CONFIG_GET(string/banappeals)) - to_chat(M, "To try to resolve this matter head to [CONFIG_GET(string/banappeals)]") + to_chat(M, "To try to resolve this matter head to [CONFIG_GET(string/banappeals)]", confidential=TRUE) else - to_chat(M, "No ban appeals URL has been set.") + to_chat(M, "No ban appeals URL has been set.", confidential=TRUE) ban_unban_log_save("[usr.client.ckey] has permabanned [M.ckey]. - Reason: [reason] - This ban does not expire automatically and must be appealed.") log_admin("[key_name(usr)] has banned [M.ckey].\nReason: [reason]\nThis ban does not expire automatically and must be appealed.") message_admins("[key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis ban does not expire automatically and must be appealed.") @@ -1348,7 +1348,7 @@ var/mob/living/carbon/human/H = locateUID(href_list["monkeyone"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human", confidential=TRUE) return if(alert(usr, "Confirm make monkey?",, "Yes", "No") != "Yes") return @@ -1361,7 +1361,7 @@ var/mob/M = locateUID(href_list["forcespeech"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return var/speech = input("What will [key_name(M)] say?.", "Force speech", "")// Don't need to sanitize, since it does that in say(), we also trust our admins. @@ -1379,10 +1379,10 @@ var/mob/M = locateUID(href_list["sendtoprison"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return if(istype(M, /mob/living/silicon/ai)) - to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai") + to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai", confidential=TRUE) return var/turf/prison_cell = pick(GLOB.prisonwarp) @@ -1421,11 +1421,11 @@ var/mob/M = locateUID(href_list["sendbacktolobby"]) if(!isobserver(M)) - to_chat(usr, "You can only send ghost players back to the Lobby.") + to_chat(usr, "You can only send ghost players back to the Lobby.", confidential=TRUE) return if(!M.client) - to_chat(usr, "[M] doesn't seem to have an active client.") + to_chat(usr, "[M] doesn't seem to have an active client.", confidential=TRUE) return if(alert(usr, "Send [key_name(M)] back to Lobby?", "Message", "Yes", "No") != "Yes") @@ -1446,15 +1446,15 @@ var/mob/M = locateUID(href_list["eraseflavortext"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return if(!M.client) - to_chat(usr, "[M] doesn't seem to have an active client.") + to_chat(usr, "[M] doesn't seem to have an active client.", confidential=TRUE) return if(M.flavor_text == "" && M.client.prefs.flavor_text == "") - to_chat(usr, "[M] has no flavor text set.") + to_chat(usr, "[M] has no flavor text set.", confidential=TRUE) return if(alert(usr, "Erase [key_name(M)]'s flavor text?", "Message", "Yes", "No") != "Yes") @@ -1477,11 +1477,11 @@ var/mob/M = locateUID(href_list["userandomname"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return if(!M.client) - to_chat(usr, "[M] doesn't seem to have an active client.") + to_chat(usr, "[M] doesn't seem to have an active client.", confidential=TRUE) return if(alert(usr, "Force [key_name(M)] to use a random name?", "Message", "Yes", "No") != "Yes") @@ -1504,7 +1504,7 @@ var/mob/M = locateUID(href_list["cma_admin"]) if(!ishuman(M)) - to_chat(usr, "This can only be used on instances of type /human") + to_chat(usr, "This can only be used on instances of type /human", confidential=TRUE) return usr.client.change_human_appearance_admin(M) @@ -1514,7 +1514,7 @@ var/mob/M = locateUID(href_list["cma_self"]) if(!ishuman(M)) - to_chat(usr, "This can only be used on instances of type /human") + to_chat(usr, "This can only be used on instances of type /human", confidential=TRUE) return usr.client.change_human_appearance_self(M) @@ -1524,7 +1524,7 @@ var/mob/M = locateUID(href_list["check_contents"]) if(!isliving(M)) - to_chat(usr, "This can only be used on instances of type /living") + to_chat(usr, "This can only be used on instances of type /living", confidential=TRUE) return usr.client.cmd_admin_check_contents(M) @@ -1534,7 +1534,7 @@ var/mob/M = locateUID(href_list["man_up"]) if(!ismob(M)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return usr.client.man_up(M) @@ -1544,7 +1544,7 @@ var/mob/M = locateUID(href_list["select_equip"]) if(!ishuman(M)) - to_chat(usr, "This can only be used on instances of type /human") + to_chat(usr, "This can only be used on instances of type /human", confidential=TRUE) return usr.client.cmd_admin_dress(M) else if(href_list["change_voice"]) @@ -1553,11 +1553,11 @@ var/mob/M = locateUID(href_list["change_voice"]) if(!isliving(M)) - to_chat(usr, "This can only be used on instances of type /living") + to_chat(usr, "This can only be used on instances of type /living", confidential=TRUE) return var/old_tts_seed = M.tts_seed var/new_tts_seed = M.change_voice(usr, override = TRUE) - to_chat(M, "Your voice has been changed from [old_tts_seed] to [new_tts_seed].") + to_chat(M, "Your voice has been changed from [old_tts_seed] to [new_tts_seed].", confidential=TRUE) log_and_message_admins("has changed [key_name_admin(M)]'s voice from [old_tts_seed] to [new_tts_seed]") else if(href_list["update_mob_sprite"]) @@ -1566,7 +1566,7 @@ var/mob/M = locateUID(href_list["update_mob_sprite"]) if(!ishuman(M)) - to_chat(usr, "This can only be used on instances of type /human") + to_chat(usr, "This can only be used on instances of type /human", confidential=TRUE) return usr.client.update_mob_sprite(M) @@ -1584,10 +1584,10 @@ var/mob/M = locateUID(href_list["tdome1"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return if(istype(M, /mob/living/silicon/ai)) - to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai") + to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai", confidential=TRUE) return for(var/obj/item/I in M) @@ -1610,10 +1610,10 @@ var/mob/M = locateUID(href_list["tdome2"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return if(istype(M, /mob/living/silicon/ai)) - to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai") + to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai", confidential=TRUE) return for(var/obj/item/I in M) @@ -1636,10 +1636,10 @@ var/mob/M = locateUID(href_list["tdomeadmin"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return if(istype(M, /mob/living/silicon/ai)) - to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai") + to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai", confidential=TRUE) return if(isliving(M)) @@ -1659,10 +1659,10 @@ var/mob/M = locateUID(href_list["tdomeobserve"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return if(istype(M, /mob/living/silicon/ai)) - to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai") + to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai", confidential=TRUE) return for(var/obj/item/I in M) @@ -1687,20 +1687,20 @@ var/mob/M = locateUID(href_list["contractor_stop"]) if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob.") + to_chat(usr, "This can only be used on instances of type /mob.", confidential=TRUE) return var/datum/syndicate_contract/contract = LAZYACCESS(GLOB.prisoner_belongings.prisoners, M) if(!contract) - to_chat(usr, "[M] is currently not imprisoned by the Syndicate.") + to_chat(usr, "[M] is currently not imprisoned by the Syndicate.", confidential=TRUE) return if(!contract.prisoner_timer_handle) - to_chat(usr, "[M] is already NOT scheduled to return from the Syndicate Jail.") + to_chat(usr, "[M] is already NOT scheduled to return from the Syndicate Jail.", confidential=TRUE) return deltimer(contract.prisoner_timer_handle) contract.prisoner_timer_handle = null - to_chat(usr, "Stopped automatic return of [M] from the Syndicate Jail.") + to_chat(usr, "Stopped automatic return of [M] from the Syndicate Jail.", confidential=TRUE) message_admins("[key_name_admin(usr)] has stopped the automatic return of [key_name_admin(M)] from the Syndicate Jail") log_admin("[key_name(usr)] has stopped the automatic return of [key_name(M)] from the Syndicate Jail") @@ -1710,15 +1710,15 @@ var/mob/M = locateUID(href_list["contractor_start"]) if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob.") + to_chat(usr, "This can only be used on instances of type /mob.", confidential=TRUE) return var/datum/syndicate_contract/contract = LAZYACCESS(GLOB.prisoner_belongings.prisoners, M) if(!contract) - to_chat(usr, "[M] is currently not imprisoned by the Syndicate.") + to_chat(usr, "[M] is currently not imprisoned by the Syndicate.", confidential=TRUE) return if(contract.prisoner_timer_handle) - to_chat(usr, "[M] is already scheduled to return from the Syndicate Jail.") + to_chat(usr, "[M] is already scheduled to return from the Syndicate Jail.", confidential=TRUE) return var/time_seconds = input(usr, "Enter the jail time in seconds:", "Start Syndicate Jail Timer") as num|null @@ -1727,7 +1727,7 @@ return contract.prisoner_timer_handle = addtimer(CALLBACK(contract, TYPE_PROC_REF(/datum/syndicate_contract, handle_target_return), M), time_seconds * 10, TIMER_STOPPABLE) - to_chat(usr, "Started automatic return of [M] from the Syndicate Jail in [time_seconds] second\s.") + to_chat(usr, "Started automatic return of [M] from the Syndicate Jail in [time_seconds] second\s.", confidential=TRUE) message_admins("[key_name_admin(usr)] has started the automatic return of [key_name_admin(M)] from the Syndicate Jail in [time_seconds] second\s") log_admin("[key_name(usr)] has started the automatic return of [key_name(M)] from the Syndicate Jail in [time_seconds] second\s") @@ -1737,17 +1737,17 @@ var/mob/M = locateUID(href_list["contractor_release"]) if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob.") + to_chat(usr, "This can only be used on instances of type /mob.", confidential=TRUE) return var/datum/syndicate_contract/contract = LAZYACCESS(GLOB.prisoner_belongings.prisoners, M) if(!contract) - to_chat(usr, "[M] is currently not imprisoned by the Syndicate.") + to_chat(usr, "[M] is currently not imprisoned by the Syndicate.", confidential=TRUE) return deltimer(contract.prisoner_timer_handle) contract.handle_target_return(M) - to_chat(usr, "Immediately returned [M] from the Syndicate Jail.") + to_chat(usr, "Immediately returned [M] from the Syndicate Jail.", confidential=TRUE) message_admins("[key_name_admin(usr)] has immediately returned [key_name_admin(M)] from the Syndicate Jail") log_admin("[key_name(usr)] has immediately returned [key_name(M)] from the Syndicate Jail") @@ -1760,10 +1760,10 @@ var/mob/M = locateUID(href_list["aroomwarp"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return if(istype(M, /mob/living/silicon/ai)) - to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai") + to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai", confidential=TRUE) return if(isliving(M)) @@ -1778,7 +1778,7 @@ else if(href_list["togglerespawnability"]) var/mob/dead/observer/O = locateUID(href_list["togglerespawnability"]) if(!istype(O)) - to_chat(usr, "This can only be used on instances of type /mob/dead/observer") + to_chat(usr, "This can only be used on instances of type /mob/dead/observer", confidential=TRUE) return if(!(O in GLOB.respawnable_list)) GLOB.respawnable_list += O @@ -1792,7 +1792,7 @@ var/mob/living/L = locateUID(href_list["revive"]) if(!istype(L)) - to_chat(usr, "This can only be used on instances of type /mob/living") + to_chat(usr, "This can only be used on instances of type /mob/living", confidential=TRUE) return L.revive() @@ -1803,7 +1803,7 @@ var/mob/living/carbon/human/H = locateUID(href_list["makeai"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human", confidential=TRUE) return if(alert(usr, "Confirm make ai?",, "Yes", "No") != "Yes") @@ -1819,7 +1819,7 @@ var/mob/living/carbon/human/H = locateUID(href_list["makesuper"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human", confidential=TRUE) return if(alert(usr, "Confirm make superhero?",, "Yes", "No") != "Yes") @@ -1832,7 +1832,7 @@ var/mob/living/carbon/human/H = locateUID(href_list["makerobot"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human", confidential=TRUE) return if(alert(usr, "Confirm make robot?",, "Yes", "No") != "Yes") return @@ -1844,7 +1844,7 @@ var/mob/M = locateUID(href_list["makeanimal"]) if(isnewplayer(M)) - to_chat(usr, "This cannot be used on instances of type /mob/new_player") + to_chat(usr, "This cannot be used on instances of type /mob/new_player", confidential=TRUE) return if(alert(usr, "Confirm make animal?",, "Yes", "No") != "Yes") return @@ -1857,7 +1857,7 @@ var/bespai = FALSE var/mob/living/carbon/human/H = locateUID(href_list["makePAI"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human", confidential=TRUE) return if(alert(usr, "Confirm make pAI?",,"Yes","No") == "No") @@ -1885,7 +1885,7 @@ var/mob/M = locateUID(href_list["makegorilla"]) if(isnewplayer(M)) - to_chat(usr, span_warning("This cannot be used on instances of type /mob/new_player")) + to_chat(usr, span_warning("This cannot be used on instances of type /mob/new_player"), confidential=TRUE) return usr.client.cmd_admin_gorillize(M) @@ -1896,7 +1896,7 @@ var/mob/dead/observer/G = locateUID(href_list["incarn_ghost"]) if(!istype(G)) - to_chat(usr, "This will only work on /mob/dead/observer") + to_chat(usr, "This will only work on /mob/dead/observer", confidential=TRUE) return var/posttransformoutfit = usr.client.robust_dress_shop() @@ -1929,7 +1929,7 @@ var/mob/M = locateUID(href_list["adminplayeropts"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return show_player_panel(M) @@ -1943,7 +1943,7 @@ var/mob/M = locateUID(href_list["adminplayerobservefollow"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return var/mob/dead/observer/A = C.mob @@ -2022,13 +2022,13 @@ if(href_list["team"]) team = locateUID(href_list["team"]) if(QDELETED(team)) - to_chat(usr, "This team doesn't exist anymore!") + to_chat(usr, "This team doesn't exist anymore!", confidential=TRUE) return if(href_list["member"]) member = locateUID(href_list["member"]) if(QDELETED(member)) - to_chat(usr, "This team member doesn't exist anymore!") + to_chat(usr, "This team member doesn't exist anymore!", confidential=TRUE) return switch(href_list["team_command"]) @@ -2069,10 +2069,10 @@ //exists? if( !M ) return if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return if(isobserver(M)) - to_chat(usr, "This can only be used on living") + to_chat(usr, "This can only be used on living", confidential=TRUE) return //rename mob var/old_name = M.real_name @@ -2129,7 +2129,7 @@ else if(href_list["autorespond"]) if(href_list["is_mhelp"]) - to_chat(usr, "Auto responses are not available for mentor helps.") + to_chat(usr, "Auto responses are not available for mentor helps.", confidential=TRUE) return var/index = text2num(href_list["autorespond"]) if(!check_rights(R_ADMIN|R_MOD)) @@ -2286,7 +2286,7 @@ var/mob/M = locateUID(href_list["adminmoreinfo"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return admin_mob_info(M) @@ -2296,7 +2296,7 @@ var/mob/living/carbon/human/H = locateUID(href_list["adminspawncookie"]) if(!ishuman(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human", confidential=TRUE) return H.equip_to_slot_or_del( new /obj/item/reagent_containers/food/snacks/cookie(H), ITEM_SLOT_HAND_LEFT ) @@ -2320,7 +2320,7 @@ var/mob/living/M = locateUID(href_list["BlueSpaceArtillery"]) if(!isliving(M)) - to_chat(usr, "This can only be used on instances of type /mob/living") + to_chat(usr, "This can only be used on instances of type /mob/living", confidential=TRUE) return if(alert(owner, "Are you sure you wish to hit [key_name(M)] with Bluespace Artillery?", "Confirm Firing?" , "Yes" , "No") != "Yes") @@ -2359,7 +2359,7 @@ var/mob/M = locateUID(href_list["CentcommReply"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return usr.client.admin_headset_message(M, "Centcomm") @@ -2371,7 +2371,7 @@ var/mob/M = locateUID(href_list["SyndicateReply"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return usr.client.admin_headset_message(M, "Syndicate") @@ -2383,7 +2383,7 @@ var/mob/M = locateUID(href_list["HeadsetMessage"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return usr.client.admin_headset_message(M) @@ -2393,7 +2393,7 @@ return var/mob/living/carbon/human/H = locateUID(href_list["EvilFax"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human", confidential=TRUE) return var/etypes = list("Borgification", "Corgification", "Death By Fire", "Total Brain Death", "Honk Tumor", "Cluwne", "Demote", "Demote with Bot", "Revoke Fax Access", "Angry Fax Machine") var/eviltype = input(src.owner, "Which type of evil fax do you wish to send [H]?","Its good to be baaaad...", "") as null|anything in etypes @@ -2424,7 +2424,7 @@ return var/mob/living/M = locateUID(href_list["Bless"]) if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob/living") + to_chat(usr, "This can only be used on instances of type /mob/living", confidential=TRUE) return usr.client.bless(M) else if(href_list["Smite"]) @@ -2432,7 +2432,7 @@ return var/mob/living/M = locateUID(href_list["Smite"]) if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob/living") + to_chat(usr, "This can only be used on instances of type /mob/living", confidential=TRUE) return usr.client.smite(M) else if(href_list["cryossd"]) @@ -2440,10 +2440,10 @@ return var/mob/living/carbon/human/H = locateUID(href_list["cryossd"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human", confidential=TRUE) return if(!href_list["cryoafk"] && !isLivingSSD(H)) - to_chat(usr, "This can only be used on living, SSD players.") + to_chat(usr, "This can only be used on living, SSD players.", confidential=TRUE) return if(istype(H.loc, /obj/machinery/cryopod)) var/obj/machinery/cryopod/P = H.loc @@ -2463,7 +2463,7 @@ return var/mob/living/carbon/human/H = locateUID(href_list["FaxReplyTemplate"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human", confidential=TRUE) return var/obj/item/paper/P = new /obj/item/paper(null) var/obj/machinery/photocopier/faxmachine/fax = locate(href_list["originfax"]) @@ -2493,23 +2493,23 @@ fax.receivefax(P) if(istype(H) && H.stat == CONSCIOUS && (istype(H.l_ear, /obj/item/radio/headset) || istype(H.r_ear, /obj/item/radio/headset))) to_chat(H, "Your headset pings, notifying you that a reply to your fax has arrived.") - to_chat(src.owner, "You sent a standard '[stype]' fax to [H]") + to_chat(src.owner, "You sent a standard '[stype]' fax to [H]", confidential=TRUE) log_admin("[key_name(src.owner)] sent [key_name(H)] a standard '[stype]' fax") message_admins("[key_name_admin(src.owner)] replied to [key_name_admin(H)] with a standard '[stype]' fax") else if(href_list["HONKReply"]) var/mob/living/carbon/human/H = locateUID(href_list["HONKReply"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human", confidential=TRUE) return if(!istype(H.l_ear, /obj/item/radio/headset) && !istype(H.r_ear, /obj/item/radio/headset)) - to_chat(usr, "The person you are trying to contact is not wearing a headset") + to_chat(usr, "The person you are trying to contact is not wearing a headset", confidential=TRUE) return var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via [H.p_their()] headset.","Outgoing message from HONKplanet", "") if(!input) return - to_chat(src.owner, "You sent [input] to [H] via a secure channel.") + to_chat(src.owner, "You sent [input] to [H] via a secure channel.", confidential=TRUE) log_admin("[src.owner] replied to [key_name(H)]'s HONKplanet message with the message [input].") to_chat(H, "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from your HONKbrothers. Message as follows, HONK. [input]. Message ends, HONK.\"") @@ -2520,19 +2520,19 @@ if(alert(src.owner, "Accept or Deny ERT request?", "CentComm Response", "Accept", "Deny") == "Deny") var/mob/living/carbon/human/H = locateUID(href_list["ErtReply"]) if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human", confidential=TRUE) return if(H.stat != 0) - to_chat(usr, "The person you are trying to contact is not conscious.") + to_chat(usr, "The person you are trying to contact is not conscious.", confidential=TRUE) return if(!istype(H.l_ear, /obj/item/radio/headset) && !istype(H.r_ear, /obj/item/radio/headset)) - to_chat(usr, "The person you are trying to contact is not wearing a headset") + to_chat(usr, "The person you are trying to contact is not wearing a headset", confidential=TRUE) return var/input = input(src.owner, "Please enter a reason for denying [key_name(H)]'s ERT request.","Outgoing message from CentComm", "") if(!input) return GLOB.ert_request_answered = TRUE - to_chat(src.owner, "You sent [input] to [H] via a secure channel.") + to_chat(src.owner, "You sent [input] to [H] via a secure channel.", confidential=TRUE) log_admin("[src.owner] denied [key_name(H)]'s ERT request with the message [input].") to_chat(H, "Incoming priority transmission from Central Command. Message as follows, Your ERT request has been denied for the following reasons: [input].") else @@ -2562,7 +2562,7 @@ usr << browse(data, "window=PaperBundle[bundle.UID()]") else - to_chat(usr, "The faxed item is not viewable. This is probably a bug, and should be reported on the tracker: [fax.type]") + to_chat(usr, "The faxed item is not viewable. This is probably a bug, and should be reported on the tracker: [fax.type]", confidential=TRUE) else if(href_list["AdminFaxViewPage"]) if(!check_rights(R_ADMIN)) @@ -2688,14 +2688,14 @@ if(destination != "All Departments") if(!fax.receivefax(P)) - to_chat(src.owner, "Message transmission failed.") + to_chat(src.owner, "Message transmission failed.", confidential=TRUE) return else for(var/obj/machinery/photocopier/faxmachine/F in GLOB.allfaxes) if(is_station_level(F.z)) spawn(0) if(!F.receivefax(P)) - to_chat(src.owner, "Message transmission to [F.department] failed.") + to_chat(src.owner, "Message transmission to [F.department] failed.", confidential=TRUE) var/datum/fax/admin/A = new /datum/fax/admin() A.name = P.name @@ -2710,11 +2710,11 @@ A.sent_by = usr A.sent_at = world.time - to_chat(src.owner, "Message transmitted successfully.") + to_chat(src.owner, "Message transmitted successfully.", confidential=TRUE) if(notify == "Yes") var/mob/living/carbon/human/H = sender if(istype(H) && H.stat == CONSCIOUS && (istype(H.l_ear, /obj/item/radio/headset) || istype(H.r_ear, /obj/item/radio/headset))) - to_chat(sender, "Your headset pings, notifying you that a reply to your fax has arrived.") + to_chat(sender, "Your headset pings, notifying you that a reply to your fax has arrived.", confidential=TRUE) if(sender) log_admin("[key_name(src.owner)] replied to a fax message from [key_name(sender)]: [input]") message_admins("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(sender)] (VIEW).") @@ -2741,7 +2741,7 @@ return var/mob/M = locateUID(href_list["getplaytimewindow"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return cmd_mentor_show_exp_panel(M.client) @@ -2750,7 +2750,7 @@ var/mob/M = locateUID(href_list["jumpto"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return usr.client.jumptomob(M) @@ -2760,7 +2760,7 @@ if(alert(usr, "Confirm?", "Message", "Yes", "No") != "Yes") return var/mob/M = locateUID(href_list["getmob"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return usr.client.Getmob(M) @@ -2769,7 +2769,7 @@ var/mob/M = locateUID(href_list["sendmob"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return usr.client.sendmob(M) @@ -2778,7 +2778,7 @@ var/mob/M = locateUID(href_list["narrateto"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return usr.client.cmd_admin_direct_narrate(M) @@ -2788,7 +2788,7 @@ var/mob/M = locateUID(href_list["subtlemessage"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return usr.client.cmd_admin_subtle_message(M) @@ -2801,7 +2801,7 @@ var/mob/M = locateUID(href_list["traitor"]) if(!istype(M, /mob)) - to_chat(usr, "This can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob", confidential=TRUE) return show_traitor_panel(M) @@ -2870,7 +2870,7 @@ switch(where) if("inhand") if(!iscarbon(usr) && !isrobot(usr)) - to_chat(usr, "Can only spawn in hand when you're a carbon mob or cyborg.") + to_chat(usr, "Can only spawn in hand when you're a carbon mob or cyborg.", confidential=TRUE) where = "onfloor" target = usr @@ -2882,10 +2882,10 @@ target = locate(loc.x + X,loc.y + Y,loc.z + Z) if("inmarked") if(!marked_datum) - to_chat(usr, "You don't have any object marked. Abandoning spawn.") + to_chat(usr, "You don't have any object marked. Abandoning spawn.", confidential=TRUE) return else if(!istype(marked_datum,/atom)) - to_chat(usr, "The object you have marked cannot be used as a target. Target must be of type /atom. Abandoning spawn.") + to_chat(usr, "The object you have marked cannot be used as a target. Target must be of type /atom. Abandoning spawn.", confidential=TRUE) return else target = marked_datum @@ -2950,7 +2950,7 @@ message_admins("[key_name_admin(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]") log_admin("[key_name(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]") else - to_chat(usr, "You may only use this when the game is running.") + to_chat(usr, "You may only use this when the game is running.", confidential=TRUE) else if(href_list["memoeditlist"]) if(!check_rights(R_SERVER)) return @@ -3031,7 +3031,7 @@ SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Triple AI") if("gravity") if(!(SSticker && SSticker.mode)) - to_chat(usr, "Please wait until the game starts! Not sure how it will work otherwise.") + to_chat(usr, "Please wait until the game starts! Not sure how it will work otherwise.", confidential=TRUE) return var/static/list/gravity_states = list( @@ -3240,7 +3240,7 @@ return SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Mass Braindamage") for(var/mob/living/carbon/human/H in GLOB.player_list) - to_chat(H, "You suddenly feel stupid.") + to_chat(H, "You suddenly feel stupid.", confidential=TRUE) H.setBrainLoss(60) message_admins("[key_name_admin(usr)] made everybody stupid") if("fakeguns") @@ -3523,8 +3523,8 @@ if("check_antagonist") check_antagonists() if("view_codewords") - to_chat(usr, "Code Phrases:[GLOB.syndicate_code_phrase]") - to_chat(usr, "Code Responses:[GLOB.syndicate_code_response]") + to_chat(usr, "Code Phrases:[GLOB.syndicate_code_phrase]", confidential=TRUE) + to_chat(usr, "Code Responses:[GLOB.syndicate_code_response]", confidential=TRUE) if("DNA") var/dat = {"Showing DNA from blood.
"} dat += "
" @@ -3557,15 +3557,15 @@ SSnightshift.fire() else SSnightshift.update_nightshift(FALSE, TRUE) - to_chat(usr, "Night shift set to automatic.") + to_chat(usr, "Night shift set to automatic.", confidential=TRUE) if("On") SSnightshift.can_fire = FALSE SSnightshift.update_nightshift(TRUE, FALSE) - to_chat(usr, "Night shift forced on.") + to_chat(usr, "Night shift forced on.", confidential=TRUE) if("Off") SSnightshift.can_fire = FALSE SSnightshift.update_nightshift(FALSE, FALSE) - to_chat(usr, "Night shift forced off.") + to_chat(usr, "Night shift forced off.", confidential=TRUE) else if(usr) log_admin("[key_name(usr)] used secret [href_list["secretsadmin"]]") @@ -3616,7 +3616,7 @@ else if(href_list["viewruntime"]) var/datum/error_viewer/error_viewer = locate(href_list["viewruntime"]) if(!istype(error_viewer)) - to_chat(usr, span_warning("That runtime viewer no longer exists.")) + to_chat(usr, span_warning("That runtime viewer no longer exists."), confidential=TRUE) return if(href_list["viewruntime_backto"]) @@ -3775,12 +3775,12 @@ var/image/source = image('icons/obj/cardboard_cutout.dmi', "cutout_traitor") var/list/candidates = SSghost_spawns.poll_candidates("Play as a [killthem ? "murderous" : "protective"] [dresscode]?", ROLE_TRAITOR, TRUE, source = source, role_cleanname = "[killthem ? "murderous" : "protective"] [dresscode]") if(!candidates.len) - to_chat(usr, "ERROR: Could not create eventmob. No valid candidates.") + to_chat(usr, "ERROR: Could not create eventmob. No valid candidates.", confidential=TRUE) return var/mob/C = pick(candidates) var/key_of_hunter = C.key if(!key_of_hunter) - to_chat(usr, "ERROR: Could not create eventmob. Could not pick key.") + to_chat(usr, "ERROR: Could not create eventmob. Could not pick key.", confidential=TRUE) return var/datum/mind/hunter_mind = new /datum/mind(key_of_hunter) hunter_mind.active = 1 diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index ce4dee6fdd9..ff2d88ee5dc 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -242,7 +242,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick) var/list/results = world.SDQL2_query(query_text, key_name_admin(usr), "[key_name(usr)]") if(length(results) == 3) for(var/I in 1 to 3) - to_chat(usr, results[I]) + to_chat(usr, results[I], confidential=TRUE) /world/proc/SDQL2_query(query_text, log_entry1, log_entry2) log_and_message_admins("executed SDQL query: \"[query_text]\".") @@ -276,7 +276,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick) running += query var/msg = "Starting query #[query.id] - [query.get_query_text()]." if(usr) - to_chat(usr, span_admin("[msg]")) + to_chat(usr, span_admin("[msg]"), confidential=TRUE) log_admin(msg) query.ARun() else //Start all @@ -284,7 +284,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick) running += query var/msg = "Starting query #[query.id] - [query.get_query_text()]." if(usr) - to_chat(usr, span_admin("[msg]")) + to_chat(usr, span_admin("[msg]"), confidential=TRUE) log_admin(msg) query.ARun() @@ -305,7 +305,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick) finished = FALSE if(query.state == SDQL2_STATE_ERROR) if(usr) - to_chat(usr, span_admin("SDQL query [query.get_query_text()] errored. It will NOT be automatically garbage collected. Please remove manually.")) + to_chat(usr, span_admin("SDQL query [query.get_query_text()] errored. It will NOT be automatically garbage collected. Please remove manually."), confidential=TRUE) running -= query else if(query.finished) @@ -322,12 +322,12 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick) running += next_query var/msg = "Starting query #[next_query.id] - [next_query.get_query_text()]." if(usr) - to_chat(usr, span_admin("[msg]")) + to_chat(usr, span_admin("[msg]"), confidential=TRUE) log_admin(msg) next_query.ARun() else if(usr) - to_chat(usr, span_admin("SDQL query [query.get_query_text()] was halted. It will NOT be automatically garbage collected. Please remove manually.")) + to_chat(usr, span_admin("SDQL query [query.get_query_text()] was halted. It will NOT be automatically garbage collected. Please remove manually."), confidential=TRUE) running -= query while(!finished) @@ -898,7 +898,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/sdql2_vv_all, new(null if("or", "||") result = (result || val) else - to_chat(usr, span_danger("SDQL2: Unknown op [op]")) + to_chat(usr, span_danger("SDQL2: Unknown op [op]"), confidential=TRUE) result = null else result = val @@ -1008,7 +1008,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/sdql2_vv_all, new(null querys[querys_pos] = parsed_tree querys_pos++ else //There was an error so don't run anything, and tell the user which query has errored. - to_chat(usr, span_danger("Parsing error on [querys_pos]\th query. Nothing was executed.")) + to_chat(usr, span_danger("Parsing error on [querys_pos]\th query. Nothing was executed."), confidential=TRUE) return list() query_tree = list() do_parse = 0 @@ -1028,22 +1028,22 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/sdql2_vv_all, new(null for(var/item in query_tree) if(istype(item, /list)) - to_chat(usr, "[spaces](") + to_chat(usr, "[spaces](", confidential=TRUE) SDQL_testout(item, indent + 1) - to_chat(usr, "[spaces])") + to_chat(usr, "[spaces])", confidential=TRUE) else - to_chat(usr, "[spaces][item]") + to_chat(usr, "[spaces][item]", confidential=TRUE) if(!isnum(item) && query_tree[item]) if(istype(query_tree[item], /list)) - to_chat(usr, "[spaces][whitespace](") + to_chat(usr, "[spaces][whitespace](", confidential=TRUE) SDQL_testout(query_tree[item], indent + 2) - to_chat(usr, "[spaces][whitespace])") + to_chat(usr, "[spaces][whitespace])", confidential=TRUE) else - to_chat(usr, "[spaces][whitespace][query_tree[item]]") + to_chat(usr, "[spaces][whitespace][query_tree[item]]", confidential=TRUE) //Staying as a world proc as this is called too often for changes to offset the potential IsAdminAdvancedProcCall checking overhead. /world/proc/SDQL_var(object, list/expression, start = 1, source, superuser, datum/sdql2_query/query) @@ -1055,16 +1055,16 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/sdql2_vv_all, new(null D = object if (object == world && (!long || expression[start + 1] == ".") && !(expression[start] in exclude) && copytext(expression[start], 1, 3) != "SS") //3 == length("SS") + 1 - to_chat(usr, span_danger("World variables are not allowed to be accessed. Use global.")) + to_chat(usr, span_danger("World variables are not allowed to be accessed. Use global."), confidential=TRUE) return null else if(expression [start] == "{" && long) if(lowertext(copytext(expression[start + 1], 1, 3)) != "0x") //3 == length("0x") + 1 - to_chat(usr, span_danger("Invalid pointer syntax: [expression[start + 1]]")) + to_chat(usr, span_danger("Invalid pointer syntax: [expression[start + 1]]"), confidential=TRUE) return null var/datum/located = locate("\[[expression[start + 1]]]") if(!istype(located)) - to_chat(usr, span_danger("Invalid pointer: [expression[start + 1]] - null or not datum")) + to_chat(usr, span_danger("Invalid pointer: [expression[start + 1]] - null or not datum"), confidential=TRUE) return null v = located start++ @@ -1128,7 +1128,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/sdql2_vv_all, new(null var/list/L = v var/index = query.SDQL_expression(source, expression[start + 2]) if(isnum(index) && (!ISINTEGER(index) || L.len < index)) - to_chat(usr, span_danger("Invalid list index: [index]")) + to_chat(usr, span_danger("Invalid list index: [index]"), confidential=TRUE) return null return L[index] return v @@ -1180,7 +1180,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/sdql2_vv_all, new(null else if(char == "'") if(word != "") - to_chat(usr, "\red SDQL2: You have an error in your SDQL syntax, unexpected ' in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again.") + to_chat(usr, "\red SDQL2: You have an error in your SDQL syntax, unexpected ' in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again.", confidential=TRUE) return null word = "'" @@ -1200,7 +1200,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/sdql2_vv_all, new(null word += char if(i > len) - to_chat(usr, "\red SDQL2: You have an error in your SDQL syntax, unmatched ' in query: \"[query_text]\". Please check your syntax, and try again.") + to_chat(usr, "\red SDQL2: You have an error in your SDQL syntax, unmatched ' in query: \"[query_text]\". Please check your syntax, and try again.", confidential=TRUE) return null query_list += "[word]'" @@ -1208,7 +1208,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/sdql2_vv_all, new(null else if(char == "\"") if(word != "") - to_chat(usr, "\red SDQL2: You have an error in your SDQL syntax, unexpected \" in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again.") + to_chat(usr, "\red SDQL2: You have an error in your SDQL syntax, unexpected \" in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again.", confidential=TRUE) return null word = "\"" @@ -1228,7 +1228,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/sdql2_vv_all, new(null word += char if(i > len) - to_chat(usr, "\red SDQL2: You have an error in your SDQL syntax, unmatched \" in query: \"[query_text]\". Please check your syntax, and try again.") + to_chat(usr, "\red SDQL2: You have an error in your SDQL syntax, unmatched \" in query: \"[query_text]\". Please check your syntax, and try again.", confidential=TRUE) return null query_list += "[word]\"" diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm index a3caac2d1be..3d827e47f35 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm @@ -82,7 +82,7 @@ /datum/sdql_parser/proc/parse_error(error_message) error = 1 - to_chat(usr, span_warning("SDQL2 Parsing Error: [error_message]")) + to_chat(usr, span_warning("SDQL2 Parsing Error: [error_message]"), confidential=TRUE) return query.len + 1 /datum/sdql_parser/proc/parse() diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 8670b230434..0bd7976e413 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -62,7 +62,7 @@ //Fetching a message if needed. src is the sender and C is the target client /client/proc/cmd_admin_pm(whom, msg, type = "PM") if(check_mute(ckey, MUTE_ADMINHELP)) - to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).") + to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).", confidential=TRUE) return var/client/C @@ -73,7 +73,7 @@ if(!C) if(holder) - to_chat(src, "Error: Private-Message: Client not found.") + to_chat(src, "Error: Private-Message: Client not found.", confidential=TRUE) else adminhelp(msg) //admin we are replying to left. adminhelp instead return @@ -97,7 +97,7 @@ return if(!C) if(holder) - to_chat(src, "Error: Admin-PM: Client not found.") + to_chat(src, "Error: Admin-PM: Client not found.", confidential=TRUE) else adminhelp(msg) //admin we are replying to has vanished, adminhelp instead return @@ -131,7 +131,7 @@ recieve_pm_type = holder.rank else if(!C.holder) - to_chat(src, "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.") + to_chat(src, "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.", confidential=TRUE) return var/recieve_message = "" @@ -142,7 +142,7 @@ recieve_message = "-- Click the [recieve_pm_type]'s name to reply --\n" if(C.adminhelped) window_flash(C) - to_chat(C, recieve_message) + to_chat(C, recieve_message, confidential=TRUE) C.adminhelped = 0 //AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn @@ -160,11 +160,11 @@ var/emoji_msg = "[msg]" recieve_message = chat_box_red("[type] from-[recieve_pm_type] [C.holder ? key_name(src, TRUE, type) : key_name_hidden(src, TRUE, type)]:

[emoji_msg]
") - to_chat(C, recieve_message) + to_chat(C, recieve_message, confidential=TRUE) var/ping_link = check_rights(R_MOD, 0, mob) ? "(PING)" : "" var/window_link = "(WINDOW)" var/alert_link = "(ALERT)" - to_chat(src, "[send_pm_type][type] to-[holder ? key_name(C, TRUE, type) : key_name_hidden(C, TRUE, type)]: [emoji_msg] [ping_link] [window_link] [alert_link]") + to_chat(src, "[send_pm_type][type] to-[holder ? key_name(C, TRUE, type) : key_name_hidden(C, TRUE, type)]: [emoji_msg] [ping_link] [window_link] [alert_link]", confidential=TRUE) /*if(holder && !C.holder) C.last_pm_recieved = world.time C.ckey_last_pm = ckey*/ @@ -184,13 +184,13 @@ switch(type) if("Mentorhelp") if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob)) - to_chat(X, "[type]: [key_name(src, TRUE, type)]->[key_name(C, TRUE, type)]: [emoji_msg]") + to_chat(X, "[type]: [key_name(src, TRUE, type)]->[key_name(C, TRUE, type)]: [emoji_msg]", confidential=TRUE) if("Adminhelp") if(check_rights(R_ADMIN|R_MOD, 0, X.mob)) - to_chat(X, "[type]: [key_name(src, TRUE, type)]->[key_name(C, TRUE, type)]: [emoji_msg]") + to_chat(X, "[type]: [key_name(src, TRUE, type)]->[key_name(C, TRUE, type)]: [emoji_msg]", confidential=TRUE) else if(check_rights(R_ADMIN|R_MOD, 0, X.mob)) - to_chat(X, "[type]: [key_name(src, TRUE, type)]->[key_name(C, TRUE, type)]: [emoji_msg]") + to_chat(X, "[type]: [key_name(src, TRUE, type)]->[key_name(C, TRUE, type)]: [emoji_msg]", confidential=TRUE) //Check if the mob being PM'd has any open admin tickets. var/tickets = list() @@ -216,11 +216,11 @@ /client/proc/cmd_admin_discord_pm() if(check_mute(ckey, MUTE_ADMINHELP)) - to_chat(src, "Error: Private-Message: You are unable to use PMs (muted).") + to_chat(src, "Error: Private-Message: You are unable to use PMs (muted).", confidential=TRUE) return if(last_discord_pm_time > world.time) - to_chat(usr, "Please wait [(last_discord_pm_time - world.time)/10] seconds, or for a reply, before sending another PM to Discord.") + to_chat(usr, "Please wait [(last_discord_pm_time - world.time)/10] seconds, or for a reply, before sending another PM to Discord.", confidential=TRUE) return // We only allow PMs once every 10 seconds, othewrise the channel can get spammed very quickly @@ -234,8 +234,8 @@ sanitize(msg) if(length(msg) > 400) // Dont want them super spamming - to_chat(src, "Your message was not sent because it was more then 400 characters find your message below for ease of copy/pasting") - to_chat(src, "[msg]") + to_chat(src, "Your message was not sent because it was more then 400 characters find your message below for ease of copy/pasting", confidential=TRUE) + to_chat(src, "[msg]", confidential=TRUE) return SSdiscord.send2discord_simple(DISCORD_WEBHOOK_ADMIN, "PM from [key_name(src)]: [html_decode(msg)]") @@ -247,7 +247,7 @@ if(X == src) continue if(check_rights(R_ADMIN, 0, X.mob)) - to_chat(X, "PM: [key_name_admin(src)]->Discord Admins: [msg]") + to_chat(X, "PM: [key_name_admin(src)]->Discord Admins: [msg]", confidential=TRUE) /client/verb/open_pms_ui() set name = "My PMs" @@ -396,7 +396,7 @@ C.pm_tracker.current_title = usr.key window_flash(C) C.pm_tracker.show_ui(C.mob) - to_chat(usr, "Forced open [C]'s messages window.") + to_chat(usr, "Forced open [C]'s messages window.", confidential=TRUE) return if(href_list["reply"]) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index fc08158558d..d614a9e623e 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -94,12 +94,12 @@ msg += "[key_name_mentor(C.mob)]: [C.player_age] days old
" if(missing_ages) - to_chat(src, "Some accounts did not have proper ages set in their clients. This function requires database to be present") + to_chat(src, "Some accounts did not have proper ages set in their clients. This function requires database to be present", confidential=TRUE) if(msg != "") src << browse({""}+msg, "window=Player_age_check") else - to_chat(src, "No matches for that age range found.") + to_chat(src, "No matches for that age range found.", confidential=TRUE) /client/proc/cmd_admin_world_narrate() // Allows administrators to fluff events a little easier -- TLE @@ -168,10 +168,10 @@ return if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human", confidential=TRUE) return if(!istype(H.l_ear, /obj/item/radio/headset) && !istype(H.r_ear, /obj/item/radio/headset)) - to_chat(usr, "The person you are trying to contact is not wearing a headset") + to_chat(usr, "The person you are trying to contact is not wearing a headset", confidential=TRUE) return if(!sender) @@ -200,7 +200,7 @@ return M.status_flags ^= GODMODE - to_chat(usr, "Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]") + to_chat(usr, "Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]", confidential=TRUE) log_and_message_admins("has toggled [key_name_admin(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]") SSblackbox.record_feedback("tally", "admin_verb", 1, "Godmode") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! @@ -214,10 +214,10 @@ if(!usr || !usr.client) return if(!check_rights(R_ADMIN|R_MOD)) - to_chat(usr, "Error: cmd_admin_mute: You don't have permission to do this.") + to_chat(usr, "Error: cmd_admin_mute: You don't have permission to do this.", confidential=TRUE) return if(!M.client) - to_chat(usr, "Error: cmd_admin_mute: This mob doesn't have a client tied to it.") + to_chat(usr, "Error: cmd_admin_mute: This mob doesn't have a client tied to it.", confidential=TRUE) if(!M.client) return @@ -249,7 +249,7 @@ force_add_mute(M.client.ckey, mute_type) log_admin("SPAM AUTOMUTE: [muteunmute] [key_name(M)] from [mute_string]") message_admins("SPAM AUTOMUTE: [muteunmute] [key_name_admin(M)] from [mute_string].") - to_chat(M, "You have been [muteunmute] from [mute_string] by the SPAM AUTOMUTE system. Contact an admin.") + to_chat(M, "You have been [muteunmute] from [mute_string] by the SPAM AUTOMUTE system. Contact an admin.", confidential=TRUE) SSblackbox.record_feedback("tally", "admin_verb", 1, "Automute") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! return @@ -261,7 +261,7 @@ muteunmute = "unmuted" log_and_message_admins("has [muteunmute] [key_name_admin(M)] from [mute_string].") - to_chat(M, "You have been [muteunmute] from [mute_string].") + to_chat(M, "You have been [muteunmute] from [mute_string].", confidential=TRUE) SSblackbox.record_feedback("tally", "admin_verb", 1, "Mute") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/cmd_admin_add_random_ai_law() @@ -300,7 +300,7 @@ to_chat(g, "The Administrator has disabled AntagHUD.") CONFIG_SET(flag/allow_antag_hud, FALSE) - to_chat(src, "AntagHUD usage has been disabled.") + to_chat(src, "AntagHUD usage has been disabled.", confidential=TRUE) action = "disabled" else for(var/mob/dead/observer/g in get_ghosts()) @@ -309,7 +309,7 @@ CONFIG_SET(flag/allow_antag_hud, TRUE) action = "enabled" - to_chat(src, "AntagHUD usage has been enabled.") + to_chat(src, "AntagHUD usage has been enabled.", confidential=TRUE) log_and_message_admins("has [action] antagHUD usage for observers") @@ -328,7 +328,7 @@ to_chat(g, "The administrator has lifted restrictions on joining the round if you use AntagHUD.") action = "lifted restrictions" CONFIG_SET(flag/antag_hud_restricted, FALSE) - to_chat(src, "AntagHUD restrictions have been lifted.") + to_chat(src, "AntagHUD restrictions have been lifted.", confidential=TRUE) else for(var/mob/dead/observer/g in get_ghosts()) to_chat(g, "The administrator has placed restrictions on joining the round if you use AntagHUD.") @@ -337,7 +337,7 @@ g.has_enabled_antagHUD = FALSE action = "placed restrictions" CONFIG_SET(flag/antag_hud_restricted, TRUE) - to_chat(src, "AntagHUD restrictions have been enabled.") + to_chat(src, "AntagHUD restrictions have been enabled.", confidential=TRUE) log_and_message_admins("has [action] on joining the round if they use AntagHUD") @@ -365,7 +365,7 @@ Traitors and the like can also be revived with the previous role mostly intact. break if(!G_found)//If a ghost was not found. - to_chat(usr, "There is no active key like that in the game or the person is not currently a ghost.") + to_chat(usr, "There is no active key like that in the game or the person is not currently a ghost.", confidential=TRUE) return if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something @@ -521,7 +521,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(candidates.len) ckey = input("Pick the player you want to respawn as a xeno.", "Suitable Candidates") as null|anything in candidates else - to_chat(usr, "Error: create_xeno(): no suitable candidates.") + to_chat(usr, "Error: create_xeno(): no suitable candidates.", confidential=TRUE) if(!istext(ckey)) return 0 var/alien_caste = input(usr, "Please choose which caste to spawn.","Pick a caste",null) as null|anything in list("Queen","Hunter","Sentinel","Drone","Larva") @@ -553,7 +553,7 @@ Traitors and the like can also be revived with the previous role mostly intact. any = 1 //if no ghosts show up, any will just be 0 if(!any) if(notify) - to_chat(src, "There doesn't appear to be any ghosts for you to select.") + to_chat(src, "There doesn't appear to be any ghosts for you to select.", confidential=TRUE) return for(var/mob/M in mobs) @@ -674,7 +674,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/admin_delete(datum/D) if(istype(D) && !D.can_vv_delete()) - to_chat(src, "[D] rejected your deletion") + to_chat(src, "[D] rejected your deletion", confidential=TRUE) return var/atom/A = D if(alert(src, "Are you sure you want to delete:\n[D]\nat [COORD(A)]?", "Confirmation", "Yes", "No") == "Yes") @@ -696,7 +696,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(SSjobs) var/currentpositiontally var/totalpositiontally - to_chat(src, "Job Name: Filled job slot / Total job slots (Free job slots)") + to_chat(src, "Job Name: Filled job slot / Total job slots (Free job slots)", confidential=TRUE) for(var/datum/job/job in SSjobs.occupations) to_chat(src, "[job.title]: [job.current_positions] / \ [job.total_positions == -1 ? "UNLIMITED" : job.total_positions] \ @@ -704,7 +704,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(job.total_positions != -1) // Only count position that isn't unlimited currentpositiontally += job.current_positions totalpositiontally += job.total_positions - to_chat(src, "Currently filled job slots (Excluding unlimited): [currentpositiontally] / [totalpositiontally] ([totalpositiontally - currentpositiontally])") + to_chat(src, "Currently filled job slots (Excluding unlimited): [currentpositiontally] / [totalpositiontally] ([totalpositiontally - currentpositiontally])", confidential=TRUE) SSblackbox.record_feedback("tally", "admin_verb", 1, "List Free Slots") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in view(maxview())) @@ -805,7 +805,7 @@ Traitors and the like can also be revived with the previous role mostly intact. var/list/L = M.get_contents() for(var/atom/t in L) - to_chat(usr, "[t] [ADMIN_VV(t,"VV")] ") + to_chat(usr, "[t] [ADMIN_VV(t,"VV")] ", confidential=TRUE) SSblackbox.record_feedback("tally", "admin_verb", 1, "Check Contents") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! @@ -985,13 +985,13 @@ Traitors and the like can also be revived with the previous role mostly intact. return if(SSticker && SSticker.mode) - to_chat(usr, "Nope you can't do this, the game's already started. This only works before rounds!") + to_chat(usr, "Nope you can't do this, the game's already started. This only works before rounds!", confidential=TRUE) return if(SSticker.random_players) SSticker.random_players = 0 message_admins("Admin [key_name_admin(usr)] has disabled \"Everyone is Special\" mode.") - to_chat(usr, "Disabled.") + to_chat(usr, "Disabled.", confidential=TRUE) return @@ -1004,7 +1004,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(notifyplayers == "Yes") to_chat(world, "Admin [usr.key] has forced the players to have completely random identities!") - to_chat(usr, "Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet.") + to_chat(usr, "Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet.", confidential=TRUE) SSticker.random_players = 1 SSblackbox.record_feedback("tally", "admin_verb", 1, "Make Everyone Random") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! @@ -1019,11 +1019,11 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!CONFIG_GET(flag/allow_random_events)) CONFIG_SET(flag/allow_random_events, TRUE) - to_chat(usr, "Random events enabled") + to_chat(usr, "Random events enabled", confidential=TRUE) log_and_message_admins("has enabled random events.") else CONFIG_SET(flag/allow_random_events, FALSE) - to_chat(usr, "Random events disabled") + to_chat(usr, "Random events disabled", confidential=TRUE) log_and_message_admins("has disabled random events.") SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle Random Events") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! @@ -1149,12 +1149,12 @@ Traitors and the like can also be revived with the previous role mostly intact. if(SSticker.mode.ert_disabled) SSticker.mode.ert_disabled = 0 - to_chat(usr, "ERT has been Enabled.") + to_chat(usr, "ERT has been Enabled.", confidential=TRUE) log_admin("Admin [key_name(src)] has enabled ERT calling.") log_and_message_admins("has enabled ERT calling.") else SSticker.mode.ert_disabled = 1 - to_chat(usr, "ERT has been Disabled.") + to_chat(usr, "ERT has been Disabled.", confidential=TRUE) log_admin("Admin [key_name(src)] has disabled ERT calling.") log_and_message_admins("has disabled ERT calling.") @@ -1194,7 +1194,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /datum/admins/proc/modify_goals() if(!SSticker || !SSticker.mode) - to_chat(usr, "This verb can only be used if the round has started.") + to_chat(usr, "This verb can only be used if the round has started.", confidential=TRUE) return var/dat = {""} diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 0bfeb7300d9..a8376cd1362 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -75,7 +75,7 @@ msg += " Administrators have been informed." add_game_logs("has hit the per-minute topic limit of [mtl] topic calls in a given game minute", src) message_admins("[ADMIN_LOOKUPFLW(usr)] Has hit the per-minute topic limit of [mtl] topic calls in a given game minute") - to_chat(src, "[msg]") + to_chat(src, "[msg]", confidential=TRUE) return var/stl = CONFIG_GET(number/second_topic_limit) @@ -89,7 +89,7 @@ topiclimiter[SECOND_COUNT] += 1 if (topiclimiter[SECOND_COUNT] > stl) - to_chat(src, "Your previous action was ignored because you've done too many in a second") + to_chat(src, "Your previous action was ignored because you've done too many in a second", confidential=TRUE) return //search the href for script injection @@ -108,10 +108,10 @@ if(href_list["discord_msg"]) if(!holder && received_discord_pm < world.time - 6000) // Worse they can do is spam discord for 10 minutes - to_chat(usr, "You are no longer able to use this, it's been more then 10 minutes since an admin on Discord has responded to you") + to_chat(usr, "You are no longer able to use this, it's been more then 10 minutes since an admin on Discord has responded to you", confidential=TRUE) return if(check_mute(ckey, MUTE_ADMINHELP)) - to_chat(usr, "You cannot use this as your client has been muted from sending messages to the admins on Discord") + to_chat(usr, "You cannot use this as your client has been muted from sending messages to the admins on Discord", confidential=TRUE) return cmd_admin_discord_pm() return @@ -129,7 +129,7 @@ if(href_list["ssdwarning"]) ssd_warning_acknowledged = TRUE - to_chat(src, span_notice("SSD warning acknowledged.")) + to_chat(src, span_notice("SSD warning acknowledged."), confidential=TRUE) return //Otherwise, we will get 30+ messages of acknowledgement. if(href_list["link_forum_account"]) link_forum_account() @@ -159,7 +159,7 @@ //byond bug ID:2256651 if(asset_cache_job && (asset_cache_job in completed_asset_jobs)) - to_chat(src, " An error has been detected in how your client is receiving resources. Attempting to correct.... (If you keep seeing these messages you might want to close byond and reconnect)") + to_chat(src, " An error has been detected in how your client is receiving resources. Attempting to correct.... (If you keep seeing these messages you might want to close byond and reconnect)", confidential=TRUE) src << browse("...", "window=asset_cache_browser") return @@ -185,7 +185,7 @@ /client/proc/is_content_unlocked() if(!prefs.unlock_content) - to_chat(src, "Become a BYOND member to access member-perks and features, as well as support the engine that makes this game possible. Click here to find out more.") + to_chat(src, "Become a BYOND member to access member-perks and features, as well as support the engine that makes this game possible. Click here to find out more.", confidential=TRUE) return 0 return 1 @@ -197,17 +197,17 @@ if(throttle) if((last_message_time + throttle > world.time) && !check_rights(R_ADMIN, 0)) var/wait_time = round(((last_message_time + throttle) - world.time) / 10, 1) - to_chat(src, "You are sending messages to quickly. Please wait [wait_time] [wait_time == 1 ? "second" : "seconds"] before sending another message.") + to_chat(src, "You are sending messages to quickly. Please wait [wait_time] [wait_time == 1 ? "second" : "seconds"] before sending another message.", confidential=TRUE) return 1 last_message_time = world.time if(CONFIG_GET(flag/automute_on) && !check_rights(R_ADMIN, 0) && last_message == message) last_message_count++ if(last_message_count >= SPAM_TRIGGER_AUTOMUTE) - to_chat(src, "You have exceeded the spam filter limit for identical messages. An auto-mute was applied.") + to_chat(src, "You have exceeded the spam filter limit for identical messages. An auto-mute was applied.", confidential=TRUE) cmd_admin_mute(mob, mute_type, 1) return 1 if(last_message_count >= SPAM_TRIGGER_WARNING) - to_chat(src, "You are nearing the spam filter limit for identical messages.") + to_chat(src, "You are nearing the spam filter limit for identical messages.", confidential=TRUE) return 0 else last_message = message @@ -217,7 +217,7 @@ //This stops files larger than UPLOAD_LIMIT being sent from client to server via input(), client.Import() etc. /client/AllowUpload(filename, filelength) if(filelength > UPLOAD_LIMIT) - to_chat(src, "Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT/1024]KiB.") + to_chat(src, "Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT/1024]KiB.", confidential=TRUE) return 0 /* //Don't need this at the moment. But it's here if it's needed later. //Helps prevent multiple files being uploaded at once. Or right after eachother. @@ -259,7 +259,7 @@ show_update_prompt = TRUE // Actually sent to client much later, so it appears after MOTD. - to_chat(src, "If the title screen is black, resources are still downloading. Please be patient until the title screen appears.") + to_chat(src, "If the title screen is black, resources are still downloading. Please be patient until the title screen appears.", confidential=TRUE) GLOB.directory[ckey] = src //Admin Authorisation @@ -352,7 +352,7 @@ send_resources() if(GLOB.changelog_hash && prefs.lastchangelog != GLOB.changelog_hash) //bolds the changelog button on the interface so we know there are updates. - to_chat(src, span_info("You have unread updates in the changelog.")) + to_chat(src, span_info("You have unread updates in the changelog."), confidential=TRUE) winset(src, "rpane.changelog", "font-style=bold") if(prefs.toggles & PREFTOGGLE_DISABLE_KARMA) // activates if karma is disabled @@ -373,7 +373,7 @@ to_chat(src, "
") if(!winexists(src, "asset_cache_browser")) // The client is using a custom skin, tell them. - to_chat(src, "Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you.") + to_chat(src, "Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you.", confidential=TRUE) update_ambience_pref() @@ -700,7 +700,7 @@ var/blockmsg = "Error: proxy/VPN detected. Proxy/VPN use is not allowed here. Deactivate it before you reconnect." if(CONFIG_GET(string/banappeals)) blockmsg += "\nIf you are not actually using a proxy/VPN, or have no choice but to use one, request whitelisting at: [CONFIG_GET(string/banappeals)]" - to_chat(src, blockmsg) + to_chat(src, blockmsg, confidential=TRUE) qdel(src) else message_admins("IPIntel: [key_name_admin(src)] on IP [address] is likely to be using a Proxy/VPN. [detailsurl]") @@ -713,7 +713,7 @@ var/living_hours = get_exp_type_num(EXP_TYPE_LIVING) / 60 if(living_hours < 20) return - to_chat(src, "You have no verified forum account. VERIFY FORUM ACCOUNT") + to_chat(src, "You have no verified forum account. VERIFY FORUM ACCOUNT", confidential=TRUE) /client/proc/create_oauth_token() var/datum/db_query/query_find_token = SSdbcore.NewQuery("SELECT token FROM [format_table_name("oauth_tokens")] WHERE ckey=:ckey limit 1", list( @@ -746,11 +746,11 @@ if(!CONFIG_GET(string/forum_link_url)) return if(IsGuestKey(key)) - to_chat(src, "Guest keys cannot be linked.") + to_chat(src, "Guest keys cannot be linked.", confidential=TRUE) return if(prefs && prefs.fuid) if(!fromban) - to_chat(src, "Your forum account is already set.") + to_chat(src, "Your forum account is already set.", confidential=TRUE) return var/datum/db_query/query_find_link = SSdbcore.NewQuery("SELECT fuid FROM [format_table_name("player")] WHERE ckey=:ckey LIMIT 1", list( "ckey" = ckey @@ -761,20 +761,20 @@ if(query_find_link.NextRow()) if(query_find_link.item[1]) if(!fromban) - to_chat(src, "Your forum account is already set. (" + query_find_link.item[1] + ")") + to_chat(src, "Your forum account is already set. (" + query_find_link.item[1] + ")", confidential=TRUE) qdel(query_find_link) return qdel(query_find_link) var/tokenid = create_oauth_token() if(!tokenid) - to_chat(src, "link_forum_account: unable to create token") + to_chat(src, "link_forum_account: unable to create token", confidential=TRUE) return var/url = "[CONFIG_GET(string/forum_link_url)][tokenid]" if(fromban) url += "&fwd=appeal" - to_chat(src, {"Now opening a window to verify your information with the forums, so that you can appeal your ban. If the window does not load, please copy/paste this link: [url]"}) + to_chat(src, {"Now opening a window to verify your information with the forums, so that you can appeal your ban. If the window does not load, please copy/paste this link: [url]"}, confidential=TRUE) else - to_chat(src, {"Now opening a window to verify your information with the forums. If the window does not load, please go to: [url]"}) + to_chat(src, {"Now opening a window to verify your information with the forums. If the window does not load, please go to: [url]"}, confidential=TRUE) src << link(url) return @@ -823,7 +823,7 @@ tokens[ckey] = cid_check_reconnect() sleep(10) // Since browse is non-instant, and kinda async - to_chat(src, "
you're a huge nerd. wakka wakka doodle doop nobody's ever gonna see this, the chat system shouldn't be online by this point
") + to_chat(src, "
you're a huge nerd. wakka wakka doodle doop nobody's ever gonna see this, the chat system shouldn't be online by this point
", confidential=TRUE) qdel(src) return TRUE else @@ -842,8 +842,8 @@ // Change detected, they are randomizing cidcheck -= ckey // To allow them to try again after removing CID randomization - to_chat(src, "Connection Error:") - to_chat(src, "Invalid ComputerID(spoofed). Please remove the ComputerID spoofer from your BYOND installation and try again.") + to_chat(src, "Connection Error:", confidential=TRUE) + to_chat(src, "Invalid ComputerID(spoofed). Please remove the ComputerID spoofer from your BYOND installation and try again.", confidential=TRUE) if(!cidcheck_failedckeys[ckey]) message_admins("[ADMIN_LOOKUP(src)] has been detected as using a CID randomizer. Connection rejected.") @@ -911,7 +911,7 @@ window.location=\"byond://winset?command=.quit\"\ ", "border=0;titlebar=0;size=1x1") - to_chat(src, "You will be automatically taken to the game, if not, click here to be taken manually. Except you can't, since the chat window doesn't exist yet.") + to_chat(src, "You will be automatically taken to the game, if not, click here to be taken manually. Except you can't, since the chat window doesn't exist yet.", confidential=TRUE) /client/proc/is_afk(duration = 5 MINUTES) if(inactivity > duration) @@ -959,7 +959,7 @@ var/message = "[lang.name] : [lang.type]" if(lang.flags & RESTRICTED) message += " (RESTRICTED)" - to_chat(world, "[message]") + to_chat(world, "[message]", confidential=TRUE) /client/proc/colour_transition(list/colour_to = null, time = 10) //Call this with no parameters to reset to default. animate(src, color = colour_to, time = time, easing = SINE_EASING) @@ -1004,7 +1004,7 @@ msg += " Administrators have been informed." add_game_logs("hit the per-minute click limit of [mcl] clicks in a given game minute", src) message_admins("[ADMIN_LOOKUPFLW(usr)] Has hit the per-minute click limit of [mcl] clicks in a given game minute") - to_chat(src, span_danger("[msg]")) + to_chat(src, span_danger("[msg]"), confidential=TRUE) return var/scl = CONFIG_GET(number/second_click_limit) @@ -1020,7 +1020,7 @@ clicklimiter[SECOND_COUNT] += 1 if(clicklimiter[SECOND_COUNT] > scl) - to_chat(src, span_danger("Your previous click was ignored because you've done too many in a second")) + to_chat(src, span_danger("Your previous click was ignored because you've done too many in a second"), confidential=TRUE) return //check if the server is overloaded and if it is then queue up the click for next tick @@ -1061,7 +1061,7 @@ return FALSE if(M && M.player_logged < SSD_WARNING_TIMER) return FALSE - to_chat(src, "Are you taking this person to cryo or giving them medical treatment? If you are, confirm that and proceed. Interacting with SSD players in other ways is against server rules unless you've ahelped first for permission.") + to_chat(src, "Are you taking this person to cryo or giving them medical treatment? If you are, confirm that and proceed. Interacting with SSD players in other ways is against server rules unless you've ahelped first for permission.", confidential=TRUE) return TRUE #undef SSD_WARNING_TIMER @@ -1180,23 +1180,23 @@ if(!CONFIG_GET(string/discordurl)) return if(IsGuestKey(key)) - to_chat(usr, "Гостевой аккаунт не может быть связан.") + to_chat(usr, "Гостевой аккаунт не может быть связан.", confidential=TRUE) return if(prefs) prefs.load_preferences(usr) if(prefs && prefs.discord_id && length(prefs.discord_id) < 32) - to_chat(usr, chat_box_red("Аккаунт Discord уже привязан!
Чтобы отвязать используйте команду [span_boldannounceooc("!отвязать_аккаунт")]
В канале #дом-бота в Discord-сообществе!
")) + to_chat(usr, chat_box_red("Аккаунт Discord уже привязан!
Чтобы отвязать используйте команду [span_boldannounceooc("!отвязать_аккаунт")]
В канале #дом-бота в Discord-сообществе!
"), confidential=TRUE) return var/token = md5("[world.time+rand(1000,1000000)]") if(SSdbcore.IsConnected()) var/datum/db_query/query_update_token = SSdbcore.NewQuery("UPDATE [format_table_name("player")] SET discord_id=:token WHERE ckey =:ckey", list("token" = token, "ckey" = ckey)) if(!query_update_token.warn_execute()) - to_chat(usr, "Ошибка записи токена в БД! Обратитесь к администрации.") + to_chat(usr, "Ошибка записи токена в БД! Обратитесь к администрации.", confidential=TRUE) log_debug("link_discord_account: failed db update discord_id for ckey [ckey]") qdel(query_update_token) return qdel(query_update_token) - to_chat(usr, chat_box_notice("Для завершения привязки используйте команду
[span_boldannounceooc("!привязать_аккаунт [token]")]
В канале #дом-бота в Discord-сообществе!
")) + to_chat(usr, chat_box_notice("Для завершения привязки используйте команду
[span_boldannounceooc("!привязать_аккаунт [token]")]
В канале #дом-бота в Discord-сообществе!
"), confidential=TRUE) if(prefs) prefs.load_preferences(usr) @@ -1215,7 +1215,7 @@ keysend_tripped = TRUE next_keysend_trip_reset = world.time + (2 SECONDS) else - to_chat(usr, "Вы были кикнуты из игры за спам. Пожалуйста постарайтесь не делать этого в следующий раз.") + to_chat(usr, "Вы были кикнуты из игры за спам. Пожалуйста постарайтесь не делать этого в следующий раз.", confidential=TRUE) log_admin("Client [ckey] was just autokicked for flooding Say/Emote sends; likely abuse but potentially lagspike.") message_admins("Client [ckey] was just autokicked for flooding Say/Emote sends; likely abuse but potentially lagspike.") qdel(src) @@ -1343,7 +1343,7 @@ msg += "Требуемая версия, чтобы убрать это окно: [SUGGESTED_CLIENT_VERSION].[SUGGESTED_CLIENT_BUILD] или выше
" msg += "Посетите сайт BYOND, чтобы скачать последнюю версию.
" src << browse(msg.Join(""), "window=warning_popup") - to_chat(src, span_userdanger("Ваш клиент BYOND (версия: [byond_version].[byond_build]) устарел. Это может вызвать лаги. Мы крайне рекомендуем скачать последнюю версию с byond.com Прежде чем играть. Также можете обновиться через приложение BYOND.")) + to_chat(src, span_userdanger("Ваш клиент BYOND (версия: [byond_version].[byond_build]) устарел. Это может вызвать лаги. Мы крайне рекомендуем скачать последнюю версию с byond.com Прежде чем играть. Также можете обновиться через приложение BYOND."), confidential=TRUE) /client/proc/update_ambience_pref() @@ -1432,7 +1432,7 @@ /client/proc/check_panel_loaded() if(stat_panel.is_ready()) return - to_chat(src, "Statpanel failed to load, click here to reload the panel ") + to_chat(src, "Statpanel failed to load, click here to reload the panel ", confidential=TRUE) /** * Handles incoming messages from the stat-panel TGUI. diff --git a/code/modules/demo/hooks.dm b/code/modules/demo/hooks.dm new file mode 100644 index 00000000000..4c4bc41d193 --- /dev/null +++ b/code/modules/demo/hooks.dm @@ -0,0 +1,30 @@ +/atom + /// Last appearance of the atom for demo saving purposes + var/image/demo_last_appearance + +/atom/movable + /// Last location of the atom for demo recording purposes + var/atom/demo_last_loc + +/* +/mob/Login() + . = ..() + SSdemo.write_event_line("setmob [client.ckey] \ref[src]") +* handled in code\modules\mob.dm +*/ + +/client/New() + SSdemo.write_event_line("login [ckey]") + . = ..() + +/client/Del() + . = ..() + SSdemo.write_event_line("logout [ckey]") + +/turf/setDir() + . = ..() + SSdemo.mark_turf(src) + +/atom/movable/setDir(newdir, forced = FALSE) + . = ..() + SSdemo.mark_dirty(src) diff --git a/code/modules/lighting/lighting_object.dm b/code/modules/lighting/lighting_object.dm index 67ac9976447..d1d543f68e8 100644 --- a/code/modules/lighting/lighting_object.dm +++ b/code/modules/lighting/lighting_object.dm @@ -111,6 +111,7 @@ GLOBAL_LIST_EMPTY(default_lighting_underlays_by_z) ) affected_turf.luminosity = set_luminosity + SSdemo.mark_turf(affected_turf) // Variety of overrides so the overlays don't get affected by weird things. diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index 355f7f96b5d..30c1fc20f0d 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -165,6 +165,10 @@ for (var/datum/lighting_corner/corner as anything in effect_str) REMOVE_CORNER(corner) LAZYREMOVE(corner.affecting, src) + SSdemo.mark_turf(corner.master_NE) + SSdemo.mark_turf(corner.master_SE) + SSdemo.mark_turf(corner.master_SW) + SSdemo.mark_turf(corner.master_NW) effect_str = null @@ -305,6 +309,7 @@ if(IS_OPAQUE_TURF(T)) continue INSERT_CORNERS(corners, T) + SSdemo.mark_turf(T) source_turf.luminosity = oldlum diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 9d9ff851057..d4134aae515 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -51,6 +51,9 @@ return FALSE next_move = 1 + + SSdemo.write_event_line("setmob [client.ckey] \ref[src]") + add_sight(SEE_SELF) // DO NOT CALL PARENT HERE diff --git a/code/modules/ruins/lavalandruin_code/necropolis_lavalend.dm b/code/modules/ruins/lavalandruin_code/necropolis_lavalend.dm index a5950eb7e48..9adbd143819 100644 --- a/code/modules/ruins/lavalandruin_code/necropolis_lavalend.dm +++ b/code/modules/ruins/lavalandruin_code/necropolis_lavalend.dm @@ -91,6 +91,7 @@ icon_state = "necr" else icon_state = "necropen" + SSdemo.mark_dirty(src) /obj/machinery/door/poddoor/impassable/necropolisdoor/try_to_activate_door(mob/user) return diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 8e0fdffef4a..466fa7050d5 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -5,6 +5,7 @@ if(rotation) shuttleRotate(rotation) forceMove(T1) + SSdemo.mark_dirty(src) return 1 /obj/effect/landmark/shuttle_import/onShuttleMove() diff --git a/code/modules/tgui/tgui_panel/to_chat.dm b/code/modules/tgui/tgui_panel/to_chat.dm index 5ec5d199057..eef20bc48fa 100644 --- a/code/modules/tgui/tgui_panel/to_chat.dm +++ b/code/modules/tgui/tgui_panel/to_chat.dm @@ -32,6 +32,9 @@ if(ticket_id != -1) message["ticket_id"] = ticket_id + if(!confidential) + SSdemo.write_chat(target, message) + // send it immediately SSchat.send_immediate(target, message) @@ -78,4 +81,4 @@ message["avoidHighlighting"] = avoid_highlighting if(ticket_id != -1) message["ticket_id"] = ticket_id - SSchat.queue(target, message) + SSchat.queue(target, message, confidential) diff --git a/config/example/config.txt b/config/example/config.txt index 4fa904cd5b8..ad4324f993c 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -729,3 +729,6 @@ CACHE_ASSETS 0 ## or your package manager ## The default value assumes yt-dlp is in your system PATH # INVOKE_YOUTUBEDL yt-dlp + +## Enable the replay demo recording subsystem +#DEMOS_ENABLED diff --git a/paradise.dme b/paradise.dme index 2a75f9a9f5d..31f91528efa 100644 --- a/paradise.dme +++ b/paradise.dme @@ -293,6 +293,7 @@ #include "code\controllers\subsystem\cleanup.dm" #include "code\controllers\subsystem\dbcore.dm" #include "code\controllers\subsystem\debugview.dm" +#include "code\controllers\subsystem\demo.dm" #include "code\controllers\subsystem\early_assets.dm" #include "code\controllers\subsystem\events.dm" #include "code\controllers\subsystem\fires.dm" @@ -1939,6 +1940,7 @@ #include "code\modules\crafting\tailoring.dm" #include "code\modules\customitems\item_defines.dm" #include "code\modules\customitems\item_spawning.dm" +#include "code\modules\demo\hooks.dm" #include "code\modules\detective_work\detective_work.dm" #include "code\modules\detective_work\evidence.dm" #include "code\modules\detective_work\footprints_and_rag.dm"
NameDNABlood TypeRace Blood Type