Merge remote-tracking branch 'tgstation/master' into upstream-6-2-2026

This commit is contained in:
shayoki
2026-06-03 01:23:54 -05:00
1259 changed files with 50763 additions and 28726 deletions
@@ -98,6 +98,10 @@
src.workspace = workspace
src.source_photo_or_painting = source_photo_or_painting
/datum/computer_file/data/paint_project/Destroy(force)
source_photo_or_painting = null
return ..()
/datum/computer_file/data/paint_project/clone(rename)
var/datum/computer_file/data/paint_project/temp = ..()
temp.workspace = workspace.copy()
@@ -27,6 +27,10 @@
src.image_name = image_name
set_source(source_photo_or_painting)
/datum/computer_file/image/Destroy(force)
source_photo_or_painting = null
return ..()
/datum/computer_file/image/on_install(datum/computer_file/source, obj/item/modular_computer/computer_installing)
. = ..()
assign_path()
@@ -64,7 +64,7 @@
var/datum/bank_account/buyer = SSeconomy.get_dep_account(cargo_account)
var/obj/item/card/id/id_card = computer.stored_id?.GetID()
if(id_card?.registered_account)
if(id_card?.registered_account?.account_job?.paycheck_department)
buyer = SSeconomy.get_dep_account(id_card?.registered_account.account_job.paycheck_department)
if((ACCESS_BUDGET in id_card.access))
requestonly = FALSE
@@ -46,13 +46,13 @@
return ..()
/datum/ntnet_conversation/proc/add_message(message, username)
message = "[station_time_timestamp(format = "hh:mm")] [username]: [message]"
message = "[round_timestamp(format = "hh:mm")] [username]: [message]"
messages["[next_message_id]"] = message
next_message_id++
trim_message_list()
/datum/ntnet_conversation/proc/add_status_message(message)
message = "[station_time_timestamp(format = "hh:mm")] -!- [message]"
message = "[round_timestamp(format = "hh:mm")] -!- [message]"
messages["[next_message_id]"] = message
next_message_id++
trim_message_list()
@@ -126,8 +126,8 @@
if("PRG_savelog")
if(!channel)
return
var/logname = stripped_input(params["log_name"])
if(!logname)
var/logname = trim(params["log_name"], MAX_MESSAGE_LEN)
if(!length(logname) || !filter_filename_pda(logname))
return
var/datum/computer_file/data/text/logfile = new()
// Now we will generate HTML-compliant file that can actually be viewed/printed.
@@ -23,7 +23,7 @@
<br>
[GLOB.manifest ? GLOB.manifest.get_html(0) : ""]
"}
if(!computer.print_text(contents, "crew manifest ([station_time_timestamp()])"))
if(!computer.print_text(contents, "crew manifest ([round_timestamp()])"))
to_chat(usr, span_notice("Printer is out of paper."))
return
else
@@ -119,8 +119,8 @@ GLOBAL_LIST_INIT(print_types, init_print_types())
var/datum/computer_file/file = computer.find_file_by_name(params["name"])
if(!file)
return
var/newname = reject_bad_name(params["new_name"], allow_numbers = TRUE, cap_after_symbols = FALSE, cap_at_start = FALSE)
if(!newname || newname != params["new_name"])
var/newname = trim(params["new_name"], MAX_MESSAGE_LEN)
if(!length(newname) || !filter_filename_pda(newname))
playsound(computer, 'sound/machines/terminal/terminal_error.ogg', 25, FALSE)
return
file.filename = newname
@@ -131,8 +131,8 @@ GLOBAL_LIST_INIT(print_types, init_print_types())
var/datum/computer_file/file = computer.find_file_by_name(params["name"], computer.inserted_disk)
if(!file)
return
var/newname = reject_bad_name(params["new_name"], allow_numbers = TRUE, cap_after_symbols = FALSE, cap_at_start = FALSE)
if(!newname || newname != params["new_name"])
var/newname = trim(params["new_name"], MAX_MESSAGE_LEN)
if(!length(newname) || !filter_filename_pda(newname))
playsound(computer, 'sound/machines/terminal/terminal_error.ogg', 25, FALSE)
return
file.filename = newname
@@ -552,7 +552,7 @@
return FALSE
// Log it in our logs
var/datum/pda_message/message_datum = new(message, TRUE, station_time_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), photo_asset_key, everyone, subtle = subtle) // BUBBER EDIT CHANGE - SUBTLE MESSAGES - Original: var/datum/pda_message/message_datum = new(message, TRUE, station_time_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), photo_asset_key, everyone)
var/datum/pda_message/message_datum = new(message, TRUE, round_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), photo_asset_key, everyone, subtle = subtle) // BUBBER EDIT CHANGE - SUBTLE MESSAGES - Original: var/datum/pda_message/message_datum = new(message, TRUE, round_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), photo_asset_key, everyone)
for(var/datum/pda_chat/target_chat as anything in target_chats)
target_chat.add_message(message_datum, show_in_recents = !everyone)
target_chat.unread_messages = 0
@@ -705,7 +705,7 @@
// don't create a new chat for rigged messages, make it a one off notif
if(!is_rigged)
var/datum/pda_message/message = new(signal.data["message"], FALSE, station_time_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), signal.data["photo"], signal.data["everyone"], signal.data["subtle"]) // BUBBER EDIT CHANGE - SUBTLE MESSAGES - Original: var/datum/pda_message/message = new(signal.data["message"], FALSE, station_time_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), signal.data["photo"], signal.data["everyone"])
var/datum/pda_message/message = new(signal.data["message"], FALSE, round_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), signal.data["photo"], signal.data["everyone"], signal.data["subtle"]) // BUBBER EDIT CHANGE - SUBTLE MESSAGES - Original: var/datum/pda_message/message = new(signal.data["message"], FALSE, round_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), signal.data["photo"], signal.data["everyone"])
chat = find_chat_by_recipient(is_fake_user ? fake_name : sender_ref, is_fake_user)
if(!istype(chat))
@@ -175,11 +175,14 @@ GLOBAL_LIST_INIT(nanopaint_supported_filetypes, zebra_typecacheof(list(\
return
dialog = null
var/uid = params["uid"]
var/new_file_name = params["name"]
var/new_file_name = trim(params["name"], MAX_MESSAGE_LEN)
var/saving_to_disk = params["onDisk"]
var/datum/computer_file/new_file_type = text2path(params["typepath"])
var/extension = new_file_type::filetype
var/datum/computer_file/existing_file
if(!length(new_file_name))
dialog = list("type" = "error", "message" = "No name specified.")
return TRUE
if(saving_to_disk)
if(!computer.inserted_disk)
dialog = list("type" = "error", "message" = "[new_file_name] - The disk has been removed.")
@@ -208,6 +211,12 @@ GLOBAL_LIST_INIT(nanopaint_supported_filetypes, zebra_typecacheof(list(\
else
INVOKE_ASYNC(src, PROC_REF(write_to_file), user, existing_file)
return TRUE
if(is_ic_filtered_for_pdas(new_file_name) || is_soft_ic_filtered_for_pdas(new_file_name))
dialog = list("type" = "error", "message" = "The entered file name violates company policy.")
return TRUE
if(!filter_illegal_filename_chars(new_file_name))
dialog = list("type" = "error", "message" = "[new_file_name] - File names cannot include the following characters. \n \\ / : * ? \" < > |")
return TRUE
INVOKE_ASYNC(src, PROC_REF(save_file), user, new_file_name, new_file_type, saving_to_disk && computer.inserted_disk)
return TRUE
@@ -283,7 +292,7 @@ GLOBAL_LIST_INIT(nanopaint_supported_filetypes, zebra_typecacheof(list(\
/datum/computer_file/program/nanopaint/proc/save_file(mob/user, name, file_type, obj/item/disk/computer/target_disk)
var/datum/computer_file/file = new file_type()
file.filename = reject_bad_name(name, allow_numbers = TRUE, cap_after_symbols = FALSE, cap_at_start = FALSE)
file.filename = name
var/file_stored
if(target_disk)
file_stored = target_disk.add_file(file)
@@ -174,7 +174,7 @@
CRASH("[src] was able to track [target] through /datum/trackable, but was not on a visible turf to cameras.")
for(var/obj/machinery/camera/cameras as anything in target_camerachunk.cameras["[target.z]"])
// We need to find a particular camera that can see this turf
if(length(cameras.can_see() & list(target_turf)))
if(!(length(cameras.can_see() & list(target_turf))))
continue
var/new_camera = WEAKREF(cameras)
if(camera_ref == new_camera)