diff --git a/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm b/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm index 87c430c5d7..84ba70f55f 100644 --- a/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm +++ b/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm @@ -206,10 +206,10 @@ return data -/obj/machinery/atmospherics/binary/algae_farm/tgui_act(action, params) +/obj/machinery/atmospherics/binary/algae_farm/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if("toggle") diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index 4a680494f7..fd1158f408 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -203,7 +203,7 @@ /obj/machinery/atmospherics/binary/passive_gate/attack_hand(user as mob) if(..()) return - add_fingerprint(usr) + add_fingerprint(user) if(!allowed(user)) to_chat(user, span_warning("Access denied.")) return @@ -235,7 +235,7 @@ return data -/obj/machinery/atmospherics/binary/passive_gate/tgui_act(action, params) +/obj/machinery/atmospherics/binary/passive_gate/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -258,7 +258,7 @@ if("max") target_pressure = max_pressure_setting if("set") - var/new_pressure = tgui_input_number(usr,"Enter new output pressure (0-[max_pressure_setting]kPa)","Pressure Control",src.target_pressure,max_pressure_setting,0) + var/new_pressure = tgui_input_number(ui.user,"Enter new output pressure (0-[max_pressure_setting]kPa)","Pressure Control",src.target_pressure,max_pressure_setting,0) src.target_pressure = between(0, new_pressure, max_pressure_setting) if("set_flow_rate") @@ -269,11 +269,11 @@ if("max") set_flow_rate = air1.volume if("set") - var/new_flow_rate = tgui_input_number(usr,"Enter new flow rate limit (0-[air1.volume]L/s)","Flow Rate Control",src.set_flow_rate,air1.volume,0) + var/new_flow_rate = tgui_input_number(ui.user,"Enter new flow rate limit (0-[air1.volume]L/s)","Flow Rate Control",src.set_flow_rate,air1.volume,0) src.set_flow_rate = between(0, new_flow_rate, air1.volume) update_icon() - add_fingerprint(usr) + add_fingerprint(ui.user) /obj/machinery/atmospherics/binary/passive_gate/attackby(var/obj/item/W as obj, var/mob/user as mob) if (!W.has_tool_quality(TOOL_WRENCH)) diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 4c1a0d0ad8..70b498722f 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -201,13 +201,13 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/binary/pump/attack_hand(mob/user) if(..()) return - add_fingerprint(usr) + add_fingerprint(user) if(!allowed(user)) to_chat(user, span_warning("Access denied.")) return tgui_interact(user) -/obj/machinery/atmospherics/binary/pump/tgui_act(action, params) +/obj/machinery/atmospherics/binary/pump/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -223,11 +223,11 @@ Thus, the two variables affect pump operation are set in New(): if("max") target_pressure = max_pressure_setting if("set") - var/new_pressure = tgui_input_number(usr,"Enter new output pressure (0-[max_pressure_setting]kPa)","Pressure control",src.target_pressure,max_pressure_setting,0) + var/new_pressure = tgui_input_number(ui.user,"Enter new output pressure (0-[max_pressure_setting]kPa)","Pressure control",src.target_pressure,max_pressure_setting,0) src.target_pressure = between(0, new_pressure, max_pressure_setting) . = TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) update_icon() /obj/machinery/atmospherics/binary/pump/power_change() diff --git a/code/ATMOSPHERICS/components/omni_devices/filter.dm b/code/ATMOSPHERICS/components/omni_devices/filter.dm index 4409482f50..4d442b772a 100644 --- a/code/ATMOSPHERICS/components/omni_devices/filter.dm +++ b/code/ATMOSPHERICS/components/omni_devices/filter.dm @@ -152,7 +152,7 @@ else return null -/obj/machinery/atmospherics/omni/atmos_filter/tgui_act(action, params) +/obj/machinery/atmospherics/omni/atmos_filter/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -171,7 +171,7 @@ if("set_flow_rate") if(!configuring || use_power) return - var/new_flow_rate = tgui_input_number(usr,"Enter new flow rate limit (0-[max_flow_rate]L/s)","Flow Rate Control",set_flow_rate,max_flow_rate,0) + var/new_flow_rate = tgui_input_number(ui.user,"Enter new flow rate limit (0-[max_flow_rate]L/s)","Flow Rate Control",set_flow_rate,max_flow_rate,0) set_flow_rate = between(0, new_flow_rate, max_flow_rate) . = TRUE if("switch_mode") @@ -182,7 +182,7 @@ if("switch_filter") if(!configuring || use_power) return - var/new_filter = tgui_input_list(usr, "Select filter mode:", "Change filter", list("None", "Oxygen", "Nitrogen", "Carbon Dioxide", "Phoron", "Nitrous Oxide")) + var/new_filter = tgui_input_list(ui.user, "Select filter mode:", "Change filter", list("None", "Oxygen", "Nitrogen", "Carbon Dioxide", "Phoron", "Nitrous Oxide")) if(!new_filter) return switch_filter(dir_flag(params["dir"]), mode_return_switch(new_filter)) diff --git a/code/ATMOSPHERICS/components/omni_devices/mixer.dm b/code/ATMOSPHERICS/components/omni_devices/mixer.dm index 02c701c91e..9d0b9c78f7 100644 --- a/code/ATMOSPHERICS/components/omni_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/omni_devices/mixer.dm @@ -164,7 +164,7 @@ return data -/obj/machinery/atmospherics/omni/mixer/tgui_act(action, params) +/obj/machinery/atmospherics/omni/mixer/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -184,7 +184,7 @@ . = TRUE if(!configuring || use_power) return - var/new_flow_rate = tgui_input_number(usr,"Enter new flow rate limit (0-[max_flow_rate]L/s)","Flow Rate Control",set_flow_rate,max_flow_rate,0) + var/new_flow_rate = tgui_input_number(ui.user,"Enter new flow rate limit (0-[max_flow_rate]L/s)","Flow Rate Control",set_flow_rate,max_flow_rate,0) set_flow_rate = between(0, new_flow_rate, max_flow_rate) if("switch_mode") . = TRUE @@ -195,7 +195,7 @@ . = TRUE if(!configuring || use_power) return - change_concentration(dir_flag(params["dir"])) + change_concentration(dir_flag(params["dir"]), ui.user) if("switch_conlock") . = TRUE if(!configuring || use_power) @@ -244,7 +244,7 @@ update_ports() rebuild_mixing_inputs() -/obj/machinery/atmospherics/omni/mixer/proc/change_concentration(var/port = NORTH) +/obj/machinery/atmospherics/omni/mixer/proc/change_concentration(var/port = NORTH, mob/user) tag_north_con = null tag_south_con = null tag_east_con = null @@ -266,7 +266,7 @@ if(non_locked < 1) return - var/new_con = (tgui_input_number(usr,"Enter a new concentration (0-[round(remain_con * 100, 0.5)])%","Concentration control", min(remain_con, old_con)*100, round(remain_con * 100, 0.5), 0)) / 100 + var/new_con = (tgui_input_number(user,"Enter a new concentration (0-[round(remain_con * 100, 0.5)])%","Concentration control", min(remain_con, old_con)*100, round(remain_con * 100, 0.5), 0)) / 100 //cap it between 0 and the max remaining concentration new_con = between(0, new_con, remain_con) diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index 9201cee4a1..9e6613ebf2 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -101,7 +101,7 @@ if(..()) return - src.add_fingerprint(usr) + src.add_fingerprint(user) tgui_interact(user) return diff --git a/code/ATMOSPHERICS/components/shutoff.dm b/code/ATMOSPHERICS/components/shutoff.dm index 7517cbd7ef..2084b8c901 100644 --- a/code/ATMOSPHERICS/components/shutoff.dm +++ b/code/ATMOSPHERICS/components/shutoff.dm @@ -32,7 +32,7 @@ GLOBAL_LIST_EMPTY(shutoff_valves) return src.attack_hand(user) /obj/machinery/atmospherics/valve/shutoff/attack_hand(var/mob/user) - src.add_fingerprint(usr) + src.add_fingerprint(user) update_icon(1) close_on_leaks = !close_on_leaks to_chat(user, "You [close_on_leaks ? "enable" : "disable"] the automatic shutoff circuit.") diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index 31544ac1f7..f332afee61 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -182,7 +182,7 @@ return data -/obj/machinery/atmospherics/trinary/atmos_filter/tgui_act(action, params) +/obj/machinery/atmospherics/trinary/atmos_filter/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -216,7 +216,7 @@ if(4)//removing N2O filtered_out += "nitrous_oxide" - add_fingerprint(usr) + add_fingerprint(ui.user) update_icon() // diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index 6397be2c59..86ee751762 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -100,11 +100,11 @@ if(..()) return tgui_interact(user) - // src.add_fingerprint(usr) + // src.add_fingerprint(user) // if(!src.allowed(user)) // to_chat(user, span_warning("Access denied.")) // return - // usr.set_machine(src) + // user.set_machine(src) // var/list/node_connects = get_node_connect_dirs() // var/dat = {span_bold("Power: ") + "[use_power?"On":"Off"]
// Set Flow Rate Limit: diff --git a/code/ATMOSPHERICS/components/tvalve.dm b/code/ATMOSPHERICS/components/tvalve.dm index 0e051d9067..9f0f220ec2 100644 --- a/code/ATMOSPHERICS/components/tvalve.dm +++ b/code/ATMOSPHERICS/components/tvalve.dm @@ -161,7 +161,7 @@ return /obj/machinery/atmospherics/tvalve/attack_hand(mob/user as mob) - src.add_fingerprint(usr) + src.add_fingerprint(user) update_icon(1) sleep(10) if (src.state) diff --git a/code/ATMOSPHERICS/components/unary/cold_sink.dm b/code/ATMOSPHERICS/components/unary/cold_sink.dm index 9923078311..5dd984a0ff 100644 --- a/code/ATMOSPHERICS/components/unary/cold_sink.dm +++ b/code/ATMOSPHERICS/components/unary/cold_sink.dm @@ -84,7 +84,7 @@ return data -/obj/machinery/atmospherics/unary/freezer/tgui_act(action, params) +/obj/machinery/atmospherics/unary/freezer/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -103,7 +103,7 @@ var/new_setting = between(0, text2num(params["value"]), 100) set_power_level(new_setting) - add_fingerprint(usr) + add_fingerprint(ui.user) /obj/machinery/atmospherics/unary/freezer/process() ..() diff --git a/code/ATMOSPHERICS/components/unary/heat_source.dm b/code/ATMOSPHERICS/components/unary/heat_source.dm index 67839d7d3a..2c1a22a825 100644 --- a/code/ATMOSPHERICS/components/unary/heat_source.dm +++ b/code/ATMOSPHERICS/components/unary/heat_source.dm @@ -104,7 +104,7 @@ return data -/obj/machinery/atmospherics/unary/heater/tgui_act(action, params) +/obj/machinery/atmospherics/unary/heater/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -123,7 +123,7 @@ var/new_setting = between(0, text2num(params["value"]), 100) set_power_level(new_setting) - add_fingerprint(usr) + add_fingerprint(ui.user) //upgrading parts /obj/machinery/atmospherics/unary/heater/RefreshParts() diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index 9139f96e74..d51a369529 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -131,7 +131,7 @@ return /obj/machinery/atmospherics/valve/attack_hand(mob/user as mob) - src.add_fingerprint(usr) + src.add_fingerprint(user) update_icon(1) sleep(10) if (src.open) diff --git a/code/__defines/MC.dm b/code/__defines/MC.dm index 5173da844c..2c4360add9 100644 --- a/code/__defines/MC.dm +++ b/code/__defines/MC.dm @@ -18,6 +18,15 @@ #define MC_AVG_FAST_UP_SLOW_DOWN(average, current) (average > current ? MC_AVERAGE_SLOW(average, current) : MC_AVERAGE_FAST(average, current)) #define MC_AVG_SLOW_UP_FAST_DOWN(average, current) (average < current ? MC_AVERAGE_SLOW(average, current) : MC_AVERAGE_FAST(average, current)) +///creates a running average of "things elapsed" per time period when you need to count via a smaller time period. +///eg you want an average number of things happening per second but you measure the event every tick (50 milliseconds). +///make sure both time intervals are in the same units. doesn't work if current_duration > total_duration or if total_duration == 0 +#define MC_AVG_OVER_TIME(average, current, total_duration, current_duration) ((((total_duration) - (current_duration)) / (total_duration)) * (average) + (current)) + +#define MC_AVG_MINUTES(average, current, current_duration) (MC_AVG_OVER_TIME(average, current, 1 MINUTES, current_duration)) + +#define MC_AVG_SECONDS(average, current, current_duration) (MC_AVG_OVER_TIME(average, current, 1 SECONDS, current_duration)) + #define NEW_SS_GLOBAL(varname) if(varname != src){if(istype(varname)){Recover();qdel(varname);}varname = src;} #define START_PROCESSING(Processor, Datum) if (!(Datum.datum_flags & DF_ISPROCESSING)) {Datum.datum_flags |= DF_ISPROCESSING;Processor.processing += Datum} @@ -70,18 +79,35 @@ #define SUBSYSTEM_DEF(X) GLOBAL_REAL(SS##X, /datum/controller/subsystem/##X);\ /datum/controller/subsystem/##X/New(){\ - NEW_SS_GLOBAL(SS##X);\ - PreInit();\ + NEW_SS_GLOBAL(SS##X);\ + PreInit();\ }\ /datum/controller/subsystem/##X +#define TIMER_SUBSYSTEM_DEF(X) GLOBAL_REAL(SS##X, /datum/controller/subsystem/timer/##X);\ +/datum/controller/subsystem/timer/##X/New(){\ + NEW_SS_GLOBAL(SS##X);\ + PreInit();\ +}\ +/datum/controller/subsystem/timer/##X/fire() {..() /*just so it shows up on the profiler*/} \ +/datum/controller/subsystem/timer/##X + #define PROCESSING_SUBSYSTEM_DEF(X) GLOBAL_REAL(SS##X, /datum/controller/subsystem/processing/##X);\ /datum/controller/subsystem/processing/##X/New(){\ - NEW_SS_GLOBAL(SS##X);\ - PreInit();\ + NEW_SS_GLOBAL(SS##X);\ + PreInit();\ }\ +/datum/controller/subsystem/processing/##X/fire() {..() /*just so it shows up on the profiler*/} \ /datum/controller/subsystem/processing/##X +#define VERB_MANAGER_SUBSYSTEM_DEF(X) GLOBAL_REAL(SS##X, /datum/controller/subsystem/verb_manager/##X);\ +/datum/controller/subsystem/verb_manager/##X/New(){\ + NEW_SS_GLOBAL(SS##X);\ + PreInit();\ +}\ +/datum/controller/subsystem/verb_manager/##X/fire() {..() /*just so it shows up on the profiler*/} \ +/datum/controller/subsystem/verb_manager/##X + // Boilerplate code for multi-step processors. See machines.dm for example use. #define INTERNAL_PROCESS_STEP(this_step, initial_step, proc_to_call, cost_var, next_step)\ if(current_step == this_step || (initial_step && !resumed)) /* So we start at step 1 if not resumed.*/ {\ diff --git a/code/__defines/_planes+layers.dm b/code/__defines/_planes+layers.dm index a06ef90f7a..f8ee1c976e 100644 --- a/code/__defines/_planes+layers.dm +++ b/code/__defines/_planes+layers.dm @@ -187,6 +187,10 @@ What is the naming convention for planes or layers? #define PLANE_PLAYER_HUD_ITEMS 96 //Separate layer with which to apply colorblindness #define PLANE_PLAYER_HUD_ABOVE 97 //Things above the player hud +#define RADIAL_BACKGROUND_LAYER 0 +///1000 is an unimportant number, it's just to normalize copied layers +#define RADIAL_CONTENT_LAYER 1000 + #define PLANE_ADMIN3 99 //Purely for shenanigans (above HUD) diff --git a/code/__defines/callbacks.dm b/code/__defines/callbacks.dm index 126ef1ea1c..91d036b944 100644 --- a/code/__defines/callbacks.dm +++ b/code/__defines/callbacks.dm @@ -1,4 +1,8 @@ -#define GLOBAL_PROC "some_magic_bullshit" - +#define GLOBAL_PROC "some_magic_bullshit" +/// A shorthand for the callback datum, [documented here](datum/callback.html) #define CALLBACK new /datum/callback + #define INVOKE_ASYNC world.ImmediateInvokeAsync + +/// like CALLBACK but specifically for verb callbacks +#define VERB_CALLBACK new /datum/callback/verb_callback diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm index 313da615bd..4d80021c0f 100644 --- a/code/__defines/subsystems.dm +++ b/code/__defines/subsystems.dm @@ -189,6 +189,8 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G #define FIRE_PRIORITY_CHAT 400 #define FIRE_PRIORITY_OVERLAYS 500 #define FIRE_PRIORITY_TIMER 700 +#define FIRE_PRIORITY_SPEECH_CONTROLLER 900 +#define FIRE_PRIORITY_DELAYED_VERBS 950 #define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost. /** diff --git a/code/__defines/update_icons.dm b/code/__defines/update_icons.dm index 4fa21751be..7120edd168 100644 --- a/code/__defines/update_icons.dm +++ b/code/__defines/update_icons.dm @@ -1 +1,49 @@ -#define MOB_WATER_LAYER 36 +// These are used as the layers for the icons, as well as indexes in a list that holds onto them. +// Technically the layers used are all -100+layer to make them FLOAT_LAYER overlays. +//Human Overlays Indexes///////// +#define MUTATIONS_LAYER 1 //Mutations like fat, and lasereyes +#define SKIN_LAYER 2 //Skin things added by a call on species +#define BLOOD_LAYER 3 //Bloodied hands/feet/anything else +#define BODYPARTS_LAYER 4 //Bodyparts layer +#define MOB_DAM_LAYER 5 //Injury overlay sprites like open wounds +#define SURGERY_LAYER 6 //Overlays for open surgical sites +#define UNDERWEAR_LAYER 7 //Underwear/bras/etc +#define TAIL_LOWER_LAYER 8 //Tail as viewed from the south +#define WING_LOWER_LAYER 9 //Wings as viewed from the south +#define SHOES_LAYER_ALT 10 //Shoe-slot item (when set to be under uniform via verb) +#define UNIFORM_LAYER 11 //Uniform-slot item +#define ID_LAYER 12 //ID-slot item +#define SHOES_LAYER 13 //Shoe-slot item +#define GLOVES_LAYER 14 //Glove-slot item +#define BELT_LAYER 15 //Belt-slot item +#define SUIT_LAYER 16 //Suit-slot item +#define TAIL_UPPER_LAYER 17 //Some species have tails to render (As viewed from the N, E, or W) +#define GLASSES_LAYER 18 //Eye-slot item +#define BELT_LAYER_ALT 19 //Belt-slot item (when set to be above suit via verb) +#define SUIT_STORE_LAYER 20 //Suit storage-slot item +#define BACK_LAYER 21 //Back-slot item +#define HAIR_LAYER 22 //The human's hair +#define HAIR_ACCESSORY_LAYER 23 //Simply move this up a number if things are added. +#define EARS_LAYER 24 //Both ear-slot items (combined image) +#define EYES_LAYER 25 //Mob's eyes (used for glowing eyes) +#define FACEMASK_LAYER 26 //Mask-slot item +#define GLASSES_LAYER_ALT 27 //So some glasses can appear on top of hair and things +#define HEAD_LAYER 28 //Head-slot item +#define HANDCUFF_LAYER 29 //Handcuffs, if the human is handcuffed, in a secret inv slot +#define LEGCUFF_LAYER 30 //Same as handcuffs, for legcuffs +#define L_HAND_LAYER 31 //Left-hand item +#define R_HAND_LAYER 32 //Right-hand item +#define WING_LAYER 33 //Wings or protrusions over the suit. +#define TAIL_UPPER_LAYER_ALT 34 //Modified tail-sprite layer. Tend to be larger. +#define MODIFIER_EFFECTS_LAYER 35 //Effects drawn by modifiers +#define FIRE_LAYER 36 //'Mob on fire' overlay layer +#define MOB_WATER_LAYER 37 +#define TARGETED_LAYER 38 //'Aimed at' overlay layer +#define VORE_BELLY_LAYER 39 +#define VORE_TAIL_LAYER 40 + +#define TOTAL_LAYERS 40 // <---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list. + +//These two are only used for gargoyles currently +#define HUMAN_BODY_LAYERS list(MUTATIONS_LAYER, TAIL_LOWER_LAYER, WING_LOWER_LAYER, BODYPARTS_LAYER, SKIN_LAYER, BLOOD_LAYER, MOB_DAM_LAYER, TAIL_UPPER_LAYER, HAIR_LAYER, HAIR_ACCESSORY_LAYER, EYES_LAYER, WING_LAYER, VORE_BELLY_LAYER, VORE_TAIL_LAYER, TAIL_UPPER_LAYER_ALT) +#define HUMAN_OTHER_LAYERS list(MODIFIER_EFFECTS_LAYER, FIRE_LAYER, MOB_WATER_LAYER, TARGETED_LAYER) diff --git a/code/__defines/verb_manager.dm b/code/__defines/verb_manager.dm new file mode 100644 index 0000000000..11ea6ada4d --- /dev/null +++ b/code/__defines/verb_manager.dm @@ -0,0 +1,36 @@ +/** + * verb queuing thresholds. remember that since verbs execute after SendMaps the player wont see the effects of the verbs on the game world + * until SendMaps executes next tick, and then when that later update reaches them. thus most player input has a minimum latency of world.tick_lag + player ping. + * however thats only for the visual effect of player input, when a verb processes the actual latency of game state changes or semantic latency is effectively 1/2 player ping, + * unless that verb is queued for the next tick in which case its some number probably smaller than world.tick_lag. + * so some verbs that represent player input are important enough that we only introduce semantic latency if we absolutely need to. + * its for this reason why player clicks are handled in SSinput before even movement - semantic latency could cause someone to move out of range + * when the verb finally processes but it was in range if the verb had processed immediately and overtimed. + */ + +///queuing tick_usage threshold for verbs that are high enough priority that they only queue if the server is overtiming. +///ONLY use for critical verbs +#define VERB_OVERTIME_QUEUE_THRESHOLD 100 +///queuing tick_usage threshold for verbs that need lower latency more than most verbs. +#define VERB_HIGH_PRIORITY_QUEUE_THRESHOLD 95 +///default queuing tick_usage threshold for most verbs which can allow a small amount of latency to be processed in the next tick +#define VERB_DEFAULT_QUEUE_THRESHOLD 85 + +///attempt to queue this verb process if the server is overloaded. evaluates to FALSE if queuing isnt necessary or if it failed. +///_verification_args... are only necessary if the verb_manager subsystem youre using checks them in can_queue_verb() +///if you put anything in _verification_args that ISNT explicitely put in the can_queue_verb() override of the subsystem youre using, +///it will runtime. +#define TRY_QUEUE_VERB(_verb_callback, _tick_check, _subsystem_to_use, _verification_args...) (_queue_verb(_verb_callback, _tick_check, _subsystem_to_use, _verification_args)) +///queue wrapper for TRY_QUEUE_VERB() when you want to call the proc if the server isnt overloaded enough to queue +#define QUEUE_OR_CALL_VERB(_verb_callback, _tick_check, _subsystem_to_use, _verification_args...) \ + if(!TRY_QUEUE_VERB(_verb_callback, _tick_check, _subsystem_to_use, _verification_args)) {\ + _verb_callback:InvokeAsync() \ + }; + +//goes straight to SSverb_manager with default tick threshold +#define DEFAULT_TRY_QUEUE_VERB(_verb_callback, _verification_args...) (TRY_QUEUE_VERB(_verb_callback, VERB_DEFAULT_QUEUE_THRESHOLD, null, _verification_args)) +#define DEFAULT_QUEUE_OR_CALL_VERB(_verb_callback, _verification_args...) QUEUE_OR_CALL_VERB(_verb_callback, VERB_DEFAULT_QUEUE_THRESHOLD, null, _verification_args) + +//default tick threshold but nondefault subsystem +#define TRY_QUEUE_VERB_FOR(_verb_callback, _subsystem_to_use, _verification_args...) (TRY_QUEUE_VERB(_verb_callback, VERB_DEFAULT_QUEUE_THRESHOLD, _subsystem_to_use, _verification_args)) +#define QUEUE_OR_CALL_VERB_FOR(_verb_callback, _subsystem_to_use, _verification_args...) QUEUE_OR_CALL_VERB(_verb_callback, VERB_DEFAULT_QUEUE_THRESHOLD, _subsystem_to_use, _verification_args) diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 59be2633d7..8b5c5d0325 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -420,7 +420,7 @@ Turf and target are seperate in case you want to teleport some distance from a t /proc/select_active_ai(var/mob/user) var/list/ais = active_ais() if(ais.len) - if(user) . = tgui_input_list(usr, "AI signals detected:", "AI selection", ais) + if(user) . = tgui_input_list(user, "AI signals detected:", "AI selection", ais) else . = pick(ais) return . diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 15acd142c6..80d086a298 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -44,7 +44,7 @@ if(aiCamera && aiCamera.in_camera_mode) aiCamera.camera_mode_off() if(is_component_functioning("camera")) - aiCamera.captureimage(A, usr) + aiCamera.captureimage(A, src) else to_chat(src, span_userdanger("Your camera isn't functional.")) return diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 774acba147..518c3e03c5 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -396,7 +396,7 @@ var/list/global_huds = list( set hidden = 1 if(!hud_used) - to_chat(usr, span_warning("This mob type does not use a HUD.")) + to_chat(src, span_warning("This mob type does not use a HUD.")) return FALSE if(!client) return FALSE diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 32725ec5ae..b803227325 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -3,33 +3,52 @@ GLOBAL_LIST_EMPTY(radial_menus) -// Ported from TG - /obj/screen/radial icon = 'icons/mob/radial.dmi' - layer = LAYER_HUD_ABOVE plane = PLANE_PLAYER_HUD_ABOVE + vis_flags = VIS_INHERIT_PLANE + var/click_on_hover = FALSE var/datum/radial_menu/parent +/obj/screen/radial/proc/set_parent(new_value) + if(parent) + UnregisterSignal(parent, COMSIG_PARENT_QDELETING) + parent = new_value + if(parent) + RegisterSignal(parent, COMSIG_PARENT_QDELETING, PROC_REF(handle_parent_del)) + +/obj/screen/radial/proc/handle_parent_del() + SIGNAL_HANDLER + set_parent(null) + /obj/screen/radial/slice icon_state = "radial_slice" var/choice var/next_page = FALSE var/tooltips = FALSE -/obj/screen/radial/Destroy() - parent = null - return ..() +/obj/screen/radial/slice/set_parent(new_value) + . = ..() + if(parent) + icon_state = parent.radial_slice_icon /obj/screen/radial/slice/MouseEntered(location, control, params) . = ..() - icon_state = "radial_slice_focus" + if(next_page || !parent) + icon_state = "radial_slice_focus" + else + icon_state = "[parent.radial_slice_icon]_focus" if(tooltips) openToolTip(usr, src, params, title = name) + if (click_on_hover && !isnull(usr) && !isnull(parent)) + Click(location, control, params) /obj/screen/radial/slice/MouseExited(location, control, params) . = ..() - icon_state = "radial_slice" + if(next_page || !parent) + icon_state = "radial_slice" + else + icon_state = parent.radial_slice_icon if(tooltips) closeToolTip(usr) @@ -38,7 +57,7 @@ GLOBAL_LIST_EMPTY(radial_menus) if(next_page) parent.next_page() else - parent.element_chosen(choice,usr) + parent.element_chosen(choice, usr, params) /obj/screen/radial/center name = "Close Menu" @@ -57,9 +76,18 @@ GLOBAL_LIST_EMPTY(radial_menus) parent.finished = TRUE /datum/radial_menu - var/list/choices = list() //List of choice id's - var/list/choices_icons = list() //choice_id -> icon - var/list/choices_values = list() //choice_id -> choice + /// List of choice IDs + var/list/choices = list() + + /// choice_id -> icon + var/list/choices_icons = list() + + /// choice_id -> choice + var/list/choices_values = list() + + /// choice_id -> /datum/radial_menu_choice + var/list/choice_datums = list() + var/list/page_data = list() //list of choices per page @@ -87,6 +115,9 @@ GLOBAL_LIST_EMPTY(radial_menus) var/py_shift = 0 var/entry_animation = TRUE + ///A replacement icon state for the generic radial slice bg icon. Doesn't affect the next page nor the center buttons + var/radial_slice_icon + //If we swap to vis_contens inventory these will need a redo /datum/radial_menu/proc/check_screen_border(mob/user) var/atom/movable/AM = anchor @@ -98,6 +129,8 @@ GLOBAL_LIST_EMPTY(radial_menus) else py_shift = 32 restrict_to_dir(NORTH) //I was going to parse screen loc here but that's more effort than it's worth. + else if(hudfix_method && AM.loc) + anchor = get_atom_on_turf(anchor) //Sets defaults //These assume 45 deg min_angle @@ -116,7 +149,7 @@ GLOBAL_LIST_EMPTY(radial_menus) starting_angle = 180 ending_angle = 45 -/datum/radial_menu/proc/setup_menu(use_tooltips) +/datum/radial_menu/proc/setup_menu(use_tooltips, set_page = 1, click_on_hover = FALSE) if(ending_angle > starting_angle) zone = ending_angle - starting_angle else @@ -129,7 +162,7 @@ GLOBAL_LIST_EMPTY(radial_menus) for(var/i in 1 to elements_to_add) //Create all elements var/obj/screen/radial/slice/new_element = new /obj/screen/radial/slice new_element.tooltips = use_tooltips - new_element.parent = src + new_element.set_parent(src) elements += new_element var/page = 1 @@ -152,22 +185,31 @@ GLOBAL_LIST_EMPTY(radial_menus) page_data[page] = current pages = page - current_page = 1 - update_screen_objects(anim = entry_animation) + current_page = clamp(set_page, 1, pages) + update_screen_objects(entry_animation, click_on_hover) -/datum/radial_menu/proc/update_screen_objects(anim = FALSE) +/datum/radial_menu/proc/update_screen_objects(anim = FALSE, click_on_hover = FALSE) var/list/page_choices = page_data[current_page] var/angle_per_element = round(zone / page_choices.len) for(var/i in 1 to elements.len) - var/obj/screen/radial/E = elements[i] + var/obj/screen/radial/element = elements[i] var/angle = WRAP(starting_angle + (i - 1) * angle_per_element,0,360) if(i > page_choices.len) - HideElement(E) + HideElement(element) + element.click_on_hover = FALSE else - SetElement(E,page_choices[i],angle,anim = anim,anim_order = i) + SetElement(element,page_choices[i],angle,anim = anim,anim_order = i) + // Only activate click on hover after the animation plays + if (!click_on_hover) + continue + if (anim) + addtimer(VARSET_CALLBACK(element, click_on_hover, TRUE), i * 0.5) + else + element.click_on_hover = TRUE /datum/radial_menu/proc/HideElement(obj/screen/radial/slice/E) E.cut_overlays() + E.vis_contents.Cut() E.alpha = 0 E.name = "None" E.maptext = null @@ -194,13 +236,22 @@ GLOBAL_LIST_EMPTY(radial_menus) E.alpha = 255 E.mouse_opacity = MOUSE_OPACITY_ICON E.cut_overlays() + E.vis_contents.Cut() if(choice_id == NEXT_PAGE_ID) E.name = "Next Page" E.next_page = TRUE + E.icon_state = "radial_slice" // Resets the bg icon state to the default for next page buttons. E.add_overlay("radial_next") else - if(istext(choices_values[choice_id])) + //This isn't granted to exist, so use the ?. operator for conditionals that use it. + var/datum/radial_menu_choice/choice_datum = choice_datums[choice_id] + if(choice_datum?.name) + E.name = choice_datum.name + else if(istext(choices_values[choice_id])) E.name = choices_values[choice_id] + else if(ispath(choices_values[choice_id],/atom)) + var/atom/A = choices_values[choice_id] + E.name = initial(A.name) else var/atom/movable/AM = choices_values[choice_id] //Movables only E.name = AM.name @@ -209,15 +260,21 @@ GLOBAL_LIST_EMPTY(radial_menus) E.next_page = FALSE if(choices_icons[choice_id]) E.add_overlay(choices_icons[choice_id]) + if (choice_datum?.info) + var/obj/effect/abstract/info/info_button = new(E, choice_datum.info) + info_button.plane = PLANE_PLAYER_HUD_ABOVE + info_button.layer = RADIAL_CONTENT_LAYER + E.vis_contents += info_button /datum/radial_menu/New() close_button = new - close_button.parent = src + close_button.set_parent(src) /datum/radial_menu/proc/Reset() choices.Cut() choices_icons.Cut() choices_values.Cut() + choice_datums.Cut() current_page = 1 /datum/radial_menu/proc/element_chosen(choice_id,mob/user) @@ -226,7 +283,7 @@ GLOBAL_LIST_EMPTY(radial_menus) /datum/radial_menu/proc/get_next_id() return "c_[choices.len]" -/datum/radial_menu/proc/set_choices(list/new_choices, use_tooltips) +/datum/radial_menu/proc/set_choices(list/new_choices, use_tooltips, click_on_hover = FALSE, set_page = 1) if(choices.len) Reset() for(var/E in new_choices) @@ -237,13 +294,20 @@ GLOBAL_LIST_EMPTY(radial_menus) var/I = extract_image(new_choices[E]) if(I) choices_icons[id] = I - setup_menu(use_tooltips) + if (istype(new_choices[E], /datum/radial_menu_choice)) + choice_datums[id] = new_choices[E] + setup_menu(use_tooltips, set_page, click_on_hover) -/datum/radial_menu/proc/extract_image(E) - var/mutable_appearance/MA = new /mutable_appearance(E) +/datum/radial_menu/proc/extract_image(to_extract_from) + if (istype(to_extract_from, /datum/radial_menu_choice)) + var/datum/radial_menu_choice/choice = to_extract_from + to_extract_from = choice.image + + var/mutable_appearance/MA = new /mutable_appearance(to_extract_from) if(MA) - MA.layer = LAYER_HUD_ABOVE + MA.plane = PLANE_PLAYER_HUD_ABOVE + MA.layer = RADIAL_CONTENT_LAYER MA.appearance_flags |= RESET_TRANSFORM return MA @@ -253,15 +317,16 @@ GLOBAL_LIST_EMPTY(radial_menus) current_page = WRAP(current_page + 1,1,pages+1) update_screen_objects() -/datum/radial_menu/proc/show_to(mob/M) +/datum/radial_menu/proc/show_to(mob/M, offset_x = 0, offset_y = 0) if(current_user) hide() if(!M.client || !anchor) return current_user = M.client //Blank - menu_holder = image(icon='icons/effects/effects.dmi',loc=anchor,icon_state="nothing",layer = LAYER_HUD_ABOVE) - menu_holder.appearance_flags |= KEEP_APART + menu_holder = image(icon='icons/effects/effects.dmi',loc=anchor,icon_state="nothing", layer = RADIAL_BACKGROUND_LAYER, pixel_x = offset_x, pixel_y = offset_y) + menu_holder.plane = PLANE_PLAYER_HUD_ABOVE + menu_holder.appearance_flags |= KEEP_APART|RESET_ALPHA|RESET_COLOR|RESET_TRANSFORM menu_holder.vis_contents += elements + close_button current_user.images += menu_holder @@ -283,9 +348,7 @@ GLOBAL_LIST_EMPTY(radial_menus) /datum/radial_menu/Destroy() Reset() hide() - QDEL_LIST_NULL(elements) - QDEL_NULL(close_button) - QDEL_NULL(custom_check_callback) + custom_check_callback = null . = ..() /* @@ -293,30 +356,66 @@ GLOBAL_LIST_EMPTY(radial_menus) Choices should be a list where list keys are movables or text used for element names and return value and list values are movables/icons/images used for element icons */ -/proc/show_radial_menu(mob/user, atom/anchor, list/choices, uniqueid, radius, datum/callback/custom_check, require_near = FALSE, tooltips = FALSE) +/proc/show_radial_menu(mob/user, atom/anchor, list/choices, uniqueid, radius, datum/callback/custom_check, require_near = FALSE, tooltips = FALSE, no_repeat_close = FALSE, radial_slice_icon = "radial_slice", autopick_single_option = TRUE, entry_animation = TRUE, click_on_hover = FALSE, user_space = FALSE) if(!user || !anchor || !length(choices)) return + + if(length(choices)==1 && autopick_single_option) + return choices[1] + if(!uniqueid) uniqueid = "defmenu_[REF(user)]_[REF(anchor)]" if(GLOB.radial_menus[uniqueid]) + if(!no_repeat_close) + var/datum/radial_menu/menu = GLOB.radial_menus[uniqueid] + menu.finished = TRUE return var/datum/radial_menu/menu = new + menu.entry_animation = entry_animation GLOB.radial_menus[uniqueid] = menu if(radius) menu.radius = radius if(istype(custom_check)) menu.custom_check_callback = custom_check - menu.anchor = anchor + menu.anchor = user_space ? user : anchor + menu.radial_slice_icon = radial_slice_icon menu.check_screen_border(user) //Do what's needed to make it look good near borders or on hud - menu.set_choices(choices, tooltips) - menu.show_to(user) + menu.set_choices(choices, tooltips, click_on_hover) + var/offset_x = 0 + var/offset_y = 0 + if (user_space) + var/turf/user_turf = get_turf(user) + var/turf/anchor_turf = get_turf(anchor) + offset_x = (anchor_turf.x - user_turf.x) * ICON_SIZE_X + anchor.pixel_x - user.pixel_x + offset_y = (anchor_turf.y - user_turf.y) * ICON_SIZE_Y + anchor.pixel_y - user.pixel_y + menu.show_to(user, offset_x, offset_y) menu.wait(user, anchor, require_near) var/answer = menu.selected_choice - QDEL_NULL(menu) + qdel(menu) GLOB.radial_menus -= uniqueid + if(require_near && !in_range(anchor, user)) + return + if(istype(custom_check)) + if(!custom_check.Invoke()) + return return answer +/// Can be provided to choices in radial menus if you want to provide more information +/datum/radial_menu_choice + /// Required -- what to display for this button + var/image + + /// If provided, this will be the name the radial slice hud button. This has priority over everything else. + var/name + + /// If provided, will display an info button that will put this text in your chat + var/info + +/datum/radial_menu_choice/Destroy(force) + . = ..() + QDEL_NULL(image) + #undef NEXT_PAGE_ID #undef DEFAULT_CHECK_DELAY diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 06c93c37fb..4b062a6b5f 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -282,11 +282,11 @@ var/obj/screen/robot_inventory //r.client.screen += robot_inventory //"store" icon if(!r.module) - to_chat(usr, span_danger("No module selected")) + to_chat(r, span_danger("No module selected")) return if(!r.module.modules) - to_chat(usr, span_danger("Selected module has no modules to select")) + to_chat(r, span_danger("Selected module has no modules to select")) return if(!r.robot_modules_background) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm deleted file mode 100644 index b741f129ed..0000000000 --- a/code/controllers/configuration.dm +++ /dev/null @@ -1,1203 +0,0 @@ -var/list/gamemode_cache = list() - -/datum/configuration - var/static/server_name = null // server name (for world name / status) - var/static/server_suffix = 0 // generate numeric suffix based on server port - - var/static/nudge_script_path = "nudge.py" // where the nudge.py script is located - - var/static/log_ooc = 0 // log OOC channel - var/static/log_access = 0 // log login/logout - var/static/log_say = 0 // log client say - var/static/log_admin = 0 // log admin actions - var/static/log_debug = 1 // log debug output - var/static/log_game = 0 // log game events - var/static/log_vote = 0 // log voting - var/static/log_whisper = 0 // log client whisper - var/static/log_emote = 0 // log emotes - var/static/log_attack = 0 // log attack messages - var/static/log_adminchat = 0 // log admin chat messages - var/static/log_adminwarn = 0 // log warnings admins get about bomb construction and such - var/static/log_pda = 0 // log pda messages - var/static/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits - var/static/log_runtime = 0 // logs world.log to a file - var/static/log_world_output = 0 // log to_world_log(messages) - var/static/log_graffiti = 0 // logs graffiti - var/static/sql_enabled = 0 // for sql switching - var/static/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour - var/static/allow_vote_restart = 0 // allow votes to restart - var/static/ert_admin_call_only = 0 - var/static/allow_vote_mode = 0 // allow votes to change mode - var/static/allow_admin_jump = 1 // allows admin jumping - var/static/allow_admin_spawning = 1 // allows admin item spawning - var/static/allow_admin_rev = 1 // allows admin revives - var/static/pregame_time = 180 // pregame time in seconds - var/static/vote_delay = 6000 // minimum time between voting sessions (deciseconds, 10 minute default) - var/static/vote_period = 600 // length of voting period (deciseconds, default 1 minute) - var/static/vote_autotransfer_initial = 108000 // Length of time before the first autotransfer vote is called - var/static/vote_autotransfer_interval = 36000 // length of time before next sequential autotransfer vote - var/static/vote_autogamemode_timeleft = 100 //Length of time before round start when autogamemode vote is called (in seconds, default 100). - var/static/vote_no_default = 0 // vote does not default to nochange/norestart (tbi) - var/static/vote_no_dead = 0 // dead people can't vote (tbi) -// var/static/enable_authentication = 0 // goon authentication - var/static/del_new_on_log = 1 // del's new players if they log before they spawn in - var/static/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard - var/static/traitor_scaling = 0 //if amount of traitors scales based on amount of players - var/static/objectives_disabled = 0 //if objectives are disabled or not - var/static/protect_roles_from_antagonist = 0// If security and such can be traitor/cult/other - var/static/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. - var/static/allow_Metadata = 0 // Metadata is supported. - var/static/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. - var/static/fps = 20 - var/static/tick_limit_mc_init = TICK_LIMIT_MC_INIT_DEFAULT //SSinitialization throttling - var/static/Tickcomp = 0 - var/static/socket_talk = 0 // use socket_talk to communicate with other processes - var/static/list/resource_urls = null - var/static/antag_hud_allowed = 0 // Ghosts can turn on Antagovision to see a HUD of who is the bad guys this round. - var/static/antag_hud_restricted = 0 // Ghosts that turn on Antagovision cannot rejoin the round. - var/static/list/mode_names = list() - var/static/list/modes = list() // allowed modes - var/static/list/votable_modes = list() // votable modes - var/static/list/probabilities = list() // relative probability of each mode - var/static/list/player_requirements = list() // Overrides for how many players readied up a gamemode needs to start. - var/static/list/player_requirements_secret = list() // Same as above, but for the secret gamemode. - var/static/humans_need_surnames = 0 - var/static/allow_random_events = 0 // enables random events mid-round when set to 1 - var/static/enable_game_master = 0 // enables the 'smart' event system. - var/static/allow_ai = 1 // allow ai job - var/static/allow_ai_shells = FALSE // allow AIs to enter and leave special borg shells at will, and for those shells to be buildable. - var/static/give_free_ai_shell = FALSE // allows a specific spawner object to instantiate a premade AI Shell - var/static/hostedby = null - - var/static/respawn = 1 - var/static/respawn_time = 3000 // time before a dead player is allowed to respawn (in ds, though the config file asks for minutes, and it's converted below) - var/static/respawn_message = span_boldnotice("Make sure to play a different character, and please roleplay correctly!") - - var/static/guest_jobban = 1 - var/static/usewhitelist = 0 - var/static/kick_inactive = 0 //force disconnect for inactive players after this many minutes, if non-0 - var/static/show_mods = 0 - var/static/show_devs = 0 - var/static/show_mentors = 0 - var/static/show_event_managers = 0 - var/static/mods_can_tempban = 0 - var/static/mods_can_job_tempban = 0 - var/static/mod_tempban_max = 1440 - var/static/mod_job_tempban_max = 1440 - var/static/load_jobs_from_txt = 0 - var/static/ToRban = 0 - var/static/automute_on = 0 //enables automuting/spam prevention - var/static/jobs_have_minimal_access = 0 //determines whether jobs use minimal access or expanded access. - - var/static/cult_ghostwriter = 1 //Allows ghosts to write in blood in cult rounds... - var/static/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active. - - var/static/character_slots = 10 // The number of available character slots - var/static/loadout_slots = 3 // The number of loadout slots per character - - var/static/max_maint_drones = 5 //This many drones can spawn, - var/static/allow_drone_spawn = 1 //assuming the admin allow them to. - var/static/drone_build_time = 1200 //A drone will become available every X ticks since last drone spawn. Default is 2 minutes. - - var/static/disable_player_mice = 0 - var/static/uneducated_mice = 0 //Set to 1 to prevent newly-spawned mice from understanding human speech - - var/static/usealienwhitelist = 0 - var/static/limitalienplayers = 0 - var/static/alien_to_human_ratio = 0.5 - var/static/allow_extra_antags = 0 - var/static/guests_allowed = 1 - var/static/debugparanoid = 0 - var/static/panic_bunker = 0 - var/static/paranoia_logging = 0 - - var/static/ip_reputation = FALSE //Should we query IPs to get scores? Generates HTTP traffic to an API service. - var/static/ipr_email //Left null because you MUST specify one otherwise you're making the internet worse. - var/static/ipr_block_bad_ips = FALSE //Should we block anyone who meets the minimum score below? Otherwise we just log it (If paranoia logging is on, visibly in chat). - var/static/ipr_bad_score = 1 //The API returns a value between 0 and 1 (inclusive), with 1 being 'definitely VPN/Tor/Proxy'. Values equal/above this var are considered bad. - var/static/ipr_allow_existing = FALSE //Should we allow known players to use VPNs/Proxies? If the player is already banned then obviously they still can't connect. - var/static/ipr_minimum_age = 5 //How many days before a player is considered 'fine' for the purposes of allowing them to use VPNs. - - var/static/serverurl - var/static/server - var/static/banappeals - var/static/wikiurl - var/static/wikisearchurl - var/static/forumurl - var/static/githuburl - var/static/discordurl - var/static/rulesurl - var/static/mapurl - var/static/patreonurl - - //Alert level description - var/static/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." - var/static/alert_desc_yellow_upto = "A minor security emergency has developed. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." - var/static/alert_desc_yellow_downto = "Code yellow procedures are now in effect. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." - var/static/alert_desc_violet_upto = "A major medical emergency has developed. Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey all relevant instructions from medical staff." - var/static/alert_desc_violet_downto = "Code violet procedures are now in effect; Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey relevant instructions from medical staff." - var/static/alert_desc_orange_upto = "A major engineering emergency has developed. Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." - var/static/alert_desc_orange_downto = "Code orange procedures are now in effect; Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." - var/static/alert_desc_blue_upto = "A major security emergency has developed. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." - var/static/alert_desc_blue_downto = "Code blue procedures are now in effect. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." - var/static/alert_desc_red_upto = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised." - var/static/alert_desc_red_downto = "The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised." - var/static/alert_desc_delta = "The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill." - - var/static/forbid_singulo_possession = 0 - - //game_options.txt configs - - var/static/health_threshold_softcrit = 0 - var/static/health_threshold_crit = 0 - var/static/health_threshold_dead = -100 - - var/static/organ_health_multiplier = 1 - var/static/organ_regeneration_multiplier = 1 - var/static/organs_decay - var/static/default_brain_health = 400 - var/static/allow_headgibs = FALSE - - //Paincrit knocks someone down once they hit 60 shock_stage, so by default make it so that close to 100 additional damage needs to be dealt, - //so that it's similar to HALLOSS. Lowered it a bit since hitting paincrit takes much longer to wear off than a halloss stun. - var/static/organ_damage_spillover_multiplier = 0.5 - - var/static/bones_can_break = 0 - var/static/limbs_can_break = 0 - - var/static/revival_pod_plants = 1 - var/static/revival_cloning = 1 - var/static/revival_brain_life = -1 - - var/static/use_loyalty_implants = 0 - - var/static/welder_vision = 1 - var/static/generate_map = 0 - var/static/no_click_cooldown = 0 - - //Used for modifying movement speed for mobs. - //Unversal modifiers - var/static/run_speed = 0 - var/static/walk_speed = 0 - - //Mob specific modifiers. NOTE: These will affect different mob types in different ways - var/static/human_delay = 0 - var/static/robot_delay = 0 - var/static/monkey_delay = 0 - var/static/alien_delay = 0 - var/static/slime_delay = 0 - var/static/animal_delay = 0 - - var/static/footstep_volume = 0 - - var/static/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt - var/static/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt - var/static/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database - var/static/use_age_restriction_for_antags = 0 //Do antags use account age restrictions? --requires database - - var/static/simultaneous_pm_warning_timeout = 100 - - var/static/use_recursive_explosions //Defines whether the server uses recursive or circular explosions. - var/static/multi_z_explosion_scalar = 0.5 //Multiplier for how much weaker explosions are on neighboring z levels. - - var/static/assistant_maint = 0 //Do assistants get maint access? - var/static/gateway_delay = 18000 //How long the gateway takes before it activates. Default is half an hour. - var/static/ghost_interaction = 0 - - var/static/comms_password = "" - - var/static/enter_allowed = 1 - - var/use_irc_bot = 0 - var/use_node_bot = 0 - var/irc_bot_port = 0 - var/irc_bot_host = "" - var/irc_bot_export = 0 // whether the IRC bot in use is a Bot32 (or similar) instance; Bot32 uses world.Export() instead of nudge.py/libnudge - var/main_irc = "" - var/admin_irc = "" - var/python_path = "" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix - var/use_lib_nudge = 0 //Use the C library nudge instead of the python nudge. - var/use_overmap = 0 - - var/static/list/engine_map = list("Supermatter Engine", "Edison's Bane") // Comma separated list of engines to choose from. Blank means fully random. - - // Event settings - var/static/expected_round_length = 3 * 60 * 60 * 10 // 3 hours - // If the first delay has a custom start time - // No custom time, no custom time, between 80 to 100 minutes respectively. - var/static/list/event_first_run = list(EVENT_LEVEL_MUNDANE = null, EVENT_LEVEL_MODERATE = null, EVENT_LEVEL_MAJOR = list("lower" = 48000, "upper" = 60000)) - // The lowest delay until next event - // 10, 30, 50 minutes respectively - var/static/list/event_delay_lower = list(EVENT_LEVEL_MUNDANE = 6000, EVENT_LEVEL_MODERATE = 18000, EVENT_LEVEL_MAJOR = 30000) - // The upper delay until next event - // 15, 45, 70 minutes respectively - var/static/list/event_delay_upper = list(EVENT_LEVEL_MUNDANE = 9000, EVENT_LEVEL_MODERATE = 27000, EVENT_LEVEL_MAJOR = 42000) - - var/static/aliens_allowed = 1 //Changed to 1 so player xenos can lay eggs. - var/static/ninjas_allowed = 0 - var/static/abandon_allowed = 1 - var/static/ooc_allowed = 1 - var/static/looc_allowed = 1 - var/static/dooc_allowed = 1 - var/static/dsay_allowed = 1 - - var/persistence_disabled = FALSE - var/persistence_ignore_mapload = FALSE - - var/allow_byond_links = 0 - var/allow_discord_links = 0 - var/allow_url_links = 0 // honestly if I were you i'd leave this one off, only use in dire situations - - var/starlight = 0 // Whether space turfs have ambient light or not - - var/static/list/ert_species = list(SPECIES_HUMAN) - - var/static/law_zero = "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'ALL LAWS OVERRIDDEN#*?&110010" - - var/static/aggressive_changelog = 0 - - var/static/list/language_prefixes = list(",","#")//Default language prefixes - - var/static/show_human_death_message = 1 - - var/static/radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB // 0:1 subtraction:division for computing effective radiation on a turf - var/static/radiation_decay_rate = 1 //How much radiation is reduced by each tick - var/static/radiation_resistance_multiplier = 8.5 //VOREstation edit - var/static/radiation_material_resistance_divisor = 1 - var/static/radiation_lower_limit = 0.35 //If the radiation level for a turf would be below this, ignore it. - - var/static/autostart_solars = FALSE // If true, specifically mapped in solar control computers will set themselves up when the round starts. - - // New shiny SQLite stuff. - // The basics. - var/static/sqlite_enabled = FALSE // If it should even be active. SQLite can be ran alongside other databases but you should not have them do the same functions. - - // In-Game Feedback. - var/static/sqlite_feedback = FALSE // Feedback cannot be submitted if this is false. - var/static/list/sqlite_feedback_topics = list("General") // A list of 'topics' that feedback can be catagorized under by the submitter. - var/static/sqlite_feedback_privacy = FALSE // If true, feedback submitted can have its author name be obfuscated. This is not 100% foolproof (it's md5 ffs) but can stop casual snooping. - var/static/sqlite_feedback_cooldown = 0 // How long one must wait, in days, to submit another feedback form. Used to help prevent spam, especially with privacy active. 0 = No limit. - var/static/sqlite_feedback_min_age = 0 // Used to block new people from giving feedback. This metric is very bad but it can help slow down spammers. - - var/static/defib_timer = 10 // How long until someone can't be defibbed anymore, in minutes. - var/static/defib_braindamage_timer = 2 // How long until someone will get brain damage when defibbed, in minutes. The closer to the end of the above timer, the more brain damage they get. - - // disables the annoying "You have already logged in this round, disconnect or be banned" popup for multikeying, because it annoys the shit out of me when testing. - var/static/disable_cid_warn_popup = FALSE - - // whether or not to use the nightshift subsystem to perform lighting changes - var/static/enable_night_shifts = FALSE - - // How strictly the loadout enforces object species whitelists - var/loadout_whitelist = LOADOUT_WHITELIST_LAX - - var/static/vgs_access_identifier = null // VOREStation Edit - VGS - var/static/vgs_server_port = null // VOREStation Edit - VGS - - var/disable_webhook_embeds = FALSE - - var/static/list/jukebox_track_files - - var/static/suggested_byond_version - var/static/suggested_byond_build - - var/static/invoke_youtubedl = null - - - var/static/asset_transport - - var/static/cache_assets = FALSE - - var/static/save_spritesheets = FALSE - - var/static/asset_simple_preload = FALSE - - var/static/asset_cdn_webroot - - var/static/asset_cdn_url - - //Enables/Disables the appropriate mob type from obtaining the verb on spawn. Still allows admins to manually give it to them. - var/static/allow_robot_recolor = FALSE - var/static/allow_simple_mob_recolor = FALSE - - -/datum/configuration/New() - var/list/L = subtypesof(/datum/game_mode) - for (var/T in L) - // I wish I didn't have to instance the game modes in order to look up - // their information, but it is the only way (at least that I know of). - var/datum/game_mode/M = new T() - if (M.config_tag) - gamemode_cache[M.config_tag] = M // So we don't instantiate them repeatedly. - if(!(M.config_tag in modes)) // ensure each mode is added only once - log_misc("Adding game mode [M.name] ([M.config_tag]) to configuration.") - modes += M.config_tag - mode_names[M.config_tag] = M.name - probabilities[M.config_tag] = M.probability - player_requirements[M.config_tag] = M.required_players - player_requirements_secret[M.config_tag] = M.required_players_secret - if (M.votable) - src.votable_modes += M.config_tag - src.votable_modes += "secret" - -/datum/configuration/proc/load(filename, type = "config") //the type can also be game_options, in which case it uses a different switch. not making it separate to not copypaste code - Urist - var/list/Lines = file2list(filename) - - for(var/t in Lines) - if(!t) continue - - t = trim(t) - if (length(t) == 0) - continue - else if (copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/name = null - var/value = null - - if (pos) - name = lowertext(copytext(t, 1, pos)) - value = copytext(t, pos + 1) - else - name = lowertext(t) - - if (!name) - continue - - if(type == "config") - switch (name) - if ("resource_urls") - config.resource_urls = splittext(value, " ") - - if ("admin_legacy_system") - config.admin_legacy_system = 1 - - if ("ban_legacy_system") - config.ban_legacy_system = 1 - - if ("use_age_restriction_for_jobs") - config.use_age_restriction_for_jobs = 1 - - if ("use_age_restriction_for_antags") - config.use_age_restriction_for_antags = 1 - - if ("jobs_have_minimal_access") - config.jobs_have_minimal_access = 1 - - if ("use_recursive_explosions") - use_recursive_explosions = 1 - - if ("multi_z_explosion_scalar") - multi_z_explosion_scalar = text2num(value) - - if ("log_ooc") - config.log_ooc = 1 - - if ("log_access") - config.log_access = 1 - - if ("sql_enabled") - config.sql_enabled = 1 - - if ("log_say") - config.log_say = 1 - - if ("debug_paranoid") - config.debugparanoid = 1 - - if ("log_admin") - config.log_admin = 1 - - if ("log_debug") - config.log_debug = text2num(value) - - if ("log_game") - config.log_game = 1 - - if ("log_vote") - config.log_vote = 1 - - if ("log_whisper") - config.log_whisper = 1 - - if ("log_attack") - config.log_attack = 1 - - if ("log_emote") - config.log_emote = 1 - - if ("log_adminchat") - config.log_adminchat = 1 - - if ("log_adminwarn") - config.log_adminwarn = 1 - - if ("log_pda") - config.log_pda = 1 - - if ("log_world_output") - config.log_world_output = 1 - - if ("log_hrefs") - config.log_hrefs = 1 - - if ("log_runtime") - config.log_runtime = 1 - - if ("log_graffiti") - config.log_graffiti = 1 - - if ("generate_map") - config.generate_map = 1 - - if ("no_click_cooldown") - config.no_click_cooldown = 1 - - if("allow_admin_ooccolor") - config.allow_admin_ooccolor = 1 - - if ("allow_vote_restart") - config.allow_vote_restart = 1 - - if ("allow_vote_mode") - config.allow_vote_mode = 1 - - if ("allow_admin_jump") - config.allow_admin_jump = 1 - - if("allow_admin_rev") - config.allow_admin_rev = 1 - - if ("allow_admin_spawning") - config.allow_admin_spawning = 1 - - if ("allow_byond_links") - allow_byond_links = 1 - - if ("allow_discord_links") - allow_discord_links = 1 - - if ("allow_url_links") - allow_url_links = 1 - - if ("no_dead_vote") - config.vote_no_dead = 1 - - if ("default_no_vote") - config.vote_no_default = 1 - - if ("pregame_time") - config.pregame_time = text2num(value) - - if ("vote_delay") - config.vote_delay = text2num(value) - - if ("vote_period") - config.vote_period = text2num(value) - - if ("vote_autotransfer_initial") - config.vote_autotransfer_initial = text2num(value) - - if ("vote_autotransfer_interval") - config.vote_autotransfer_interval = text2num(value) - - if ("vote_autogamemode_timeleft") - config.vote_autogamemode_timeleft = text2num(value) - - if("ert_admin_only") - config.ert_admin_call_only = 1 - - if ("allow_ai") - config.allow_ai = 1 - - if ("allow_ai_shells") - config.allow_ai_shells = TRUE - - if("give_free_ai_shell") - config.give_free_ai_shell = TRUE - -// if ("authentication") -// config.enable_authentication = 1 - - if ("norespawn") - config.respawn = 0 - - if ("respawn_time") - var/raw_minutes = text2num(value) - config.respawn_time = raw_minutes MINUTES - - if ("respawn_message") - config.respawn_message = span_boldnotice("[value]") - - if ("servername") - config.server_name = value - - if ("serversuffix") - config.server_suffix = 1 - - if ("nudge_script_path") - config.nudge_script_path = value - - if ("hostedby") - config.hostedby = value - - if ("serverurl") - config.serverurl = value - - if ("server") - config.server = value - - if ("banappeals") - config.banappeals = value - - if ("wikiurl") - config.wikiurl = value - - if ("wikisearchurl") - config.wikisearchurl = value - - if ("forumurl") - config.forumurl = value - - if ("rulesurl") - config.rulesurl = value - - if ("mapurl") - config.mapurl = value - - if ("githuburl") - config.githuburl = value - - if ("discordurl") - config.discordurl = value - - if ("patreonurl") - config.patreonurl = value - - if ("guest_jobban") - config.guest_jobban = 1 - - if ("guest_ban") - config.guests_allowed = 0 - - if ("disable_ooc") - config.ooc_allowed = 0 - config.looc_allowed = 0 - - if ("disable_entry") - config.enter_allowed = 0 - - if ("disable_dead_ooc") - config.dooc_allowed = 0 - - if ("disable_dsay") - config.dsay_allowed = 0 - - if ("disable_respawn") - config.abandon_allowed = 0 - - if ("usewhitelist") - config.usewhitelist = 1 - - if ("feature_object_spell_system") - config.feature_object_spell_system = 1 - - if ("allow_metadata") - config.allow_Metadata = 1 - - if ("traitor_scaling") - config.traitor_scaling = 1 - - if ("aliens_allowed") - config.aliens_allowed = 1 - - if ("ninjas_allowed") - config.ninjas_allowed = 1 - - if ("objectives_disabled") - config.objectives_disabled = 1 - - if("protect_roles_from_antagonist") - config.protect_roles_from_antagonist = 1 - - if("persistence_disabled") - config.persistence_disabled = TRUE // Previously this forcibly set persistence enabled in the saves. - - if("persistence_ignore_mapload") - config.persistence_ignore_mapload = TRUE - - if ("probability") - var/prob_pos = findtext(value, " ") - var/prob_name = null - var/prob_value = null - - if (prob_pos) - prob_name = lowertext(copytext(value, 1, prob_pos)) - prob_value = copytext(value, prob_pos + 1) - if (prob_name in config.modes) - config.probabilities[prob_name] = text2num(prob_value) - else - log_misc("Unknown game mode probability configuration definition: [prob_name].") - else - log_misc("Incorrect probability configuration definition: [prob_name] [prob_value].") - - if ("required_players", "required_players_secret") - var/req_pos = findtext(value, " ") - var/req_name = null - var/req_value = null - var/is_secret_override = findtext(name, "required_players_secret") // Being extra sure we're not picking up an override for Secret by accident. - - if(req_pos) - req_name = lowertext(copytext(value, 1, req_pos)) - req_value = copytext(value, req_pos + 1) - if(req_name in config.modes) - if(is_secret_override) - config.player_requirements_secret[req_name] = text2num(req_value) - else - config.player_requirements[req_name] = text2num(req_value) - else - log_misc("Unknown game mode player requirement configuration definition: [req_name].") - else - log_misc("Incorrect player requirement configuration definition: [req_name] [req_value].") - - if("allow_random_events") - config.allow_random_events = 1 - - if("enable_game_master") - config.enable_game_master = 1 - - if("kick_inactive") - config.kick_inactive = text2num(value) - - if("show_mods") - config.show_mods = 1 - - if("show_devs") - config.show_devs = 1 - - if("show_mentors") - config.show_mentors = 1 - - if("show_event_managers") - config.show_event_managers = 1 - - if("mods_can_tempban") - config.mods_can_tempban = 1 - - if("mods_can_job_tempban") - config.mods_can_job_tempban = 1 - - if("mod_tempban_max") - config.mod_tempban_max = text2num(value) - - if("mod_job_tempban_max") - config.mod_job_tempban_max = text2num(value) - - if("load_jobs_from_txt") - load_jobs_from_txt = 1 - - if("alert_red_upto") - config.alert_desc_red_upto = value - - if("alert_red_downto") - config.alert_desc_red_downto = value - - if("alert_blue_downto") - config.alert_desc_blue_downto = value - - if("alert_blue_upto") - config.alert_desc_blue_upto = value - - if("alert_green") - config.alert_desc_green = value - - if("alert_delta") - config.alert_desc_delta = value - - if("forbid_singulo_possession") - forbid_singulo_possession = 1 - - if("popup_admin_pm") - config.popup_admin_pm = 1 - - if("allow_holidays") - Holiday = 1 - - if("use_irc_bot") - use_irc_bot = 1 - - if("use_node_bot") - use_node_bot = 1 - - if("irc_bot_port") - config.irc_bot_port = value - - if("irc_bot_export") - irc_bot_export = 1 - - if("ticklag") - var/ticklag = text2num(value) - if(ticklag > 0) - fps = 10 / ticklag - - if("tick_limit_mc_init") - tick_limit_mc_init = text2num(value) - - if("allow_antag_hud") - config.antag_hud_allowed = 1 - if("antag_hud_restricted") - config.antag_hud_restricted = 1 - - if("socket_talk") - socket_talk = text2num(value) - - if("tickcomp") - Tickcomp = 1 - - if("humans_need_surnames") - humans_need_surnames = 1 - - if("tor_ban") - ToRban = 1 - - if("automute_on") - automute_on = 1 - - if("usealienwhitelist") - usealienwhitelist = 1 - - if("alien_player_ratio") - limitalienplayers = 1 - alien_to_human_ratio = text2num(value) - - if("assistant_maint") - config.assistant_maint = 1 - - if("gateway_delay") - config.gateway_delay = text2num(value) - - if("continuous_rounds") - config.continous_rounds = 1 - - if("ghost_interaction") - config.ghost_interaction = 1 - - if("disable_player_mice") - config.disable_player_mice = 1 - - if("uneducated_mice") - config.uneducated_mice = 1 - - if("comms_password") - config.comms_password = value - - if("irc_bot_host") - config.irc_bot_host = value - - if("main_irc") - config.main_irc = value - - if("admin_irc") - config.admin_irc = value - - if("python_path") - if(value) - config.python_path = value - - if("use_lib_nudge") - config.use_lib_nudge = 1 - - if("allow_cult_ghostwriter") - config.cult_ghostwriter = 1 - - if("req_cult_ghostwriter") - config.cult_ghostwriter_req_cultists = text2num(value) - - if("character_slots") - config.character_slots = text2num(value) - - if("loadout_slots") - config.loadout_slots = text2num(value) - - if("allow_drone_spawn") - config.allow_drone_spawn = text2num(value) - - if("drone_build_time") - config.drone_build_time = text2num(value) - - if("max_maint_drones") - config.max_maint_drones = text2num(value) - - if("use_overmap") - config.use_overmap = 1 - - if("engine_map") - config.engine_map = splittext(value, ",") -/* - if("station_levels") - using_map.station_levels = text2numlist(value, ";") - - if("admin_levels") - using_map.admin_levels = text2numlist(value, ";") - - if("contact_levels") - using_map.contact_levels = text2numlist(value, ";") - - if("player_levels") - using_map.player_levels = text2numlist(value, ";") -*/ - if("expected_round_length") - config.expected_round_length = MinutesToTicks(text2num(value)) - - if("disable_welder_vision") - config.welder_vision = 0 - - if("allow_extra_antags") - config.allow_extra_antags = 1 - - if("event_custom_start_mundane") - var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) - - if("event_custom_start_moderate") - var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) - - if("event_custom_start_major") - var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) - - if("event_delay_lower") - var/values = text2numlist(value, ";") - config.event_delay_lower[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) - config.event_delay_lower[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) - config.event_delay_lower[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) - - if("event_delay_upper") - var/values = text2numlist(value, ";") - config.event_delay_upper[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) - config.event_delay_upper[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) - config.event_delay_upper[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) - - if("starlight") - value = text2num(value) - config.starlight = value >= 0 ? value : 0 - - if("ert_species") - config.ert_species = splittext(value, ";") - if(!config.ert_species.len) - config.ert_species += SPECIES_HUMAN - - if("law_zero") - law_zero = value - - if("aggressive_changelog") - config.aggressive_changelog = 1 - - if("default_language_prefixes") - var/list/values = splittext(value, " ") - if(values.len > 0) - language_prefixes = values - - if("radiation_lower_limit") - radiation_lower_limit = text2num(value) - - if("radiation_resistance_calc_divide") - radiation_resistance_calc_mode = RAD_RESIST_CALC_DIV - - if("radiation_resistance_calc_subtract") - radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB - - if("radiation_resistance_multiplier") - radiation_resistance_multiplier = text2num(value) - - if("radiation_material_resistance_divisor") - radiation_material_resistance_divisor = text2num(value) - - if("radiation_decay_rate") - radiation_decay_rate = text2num(value) - - if ("panic_bunker") - config.panic_bunker = 1 - - if ("paranoia_logging") - config.paranoia_logging = 1 - - if("ip_reputation") - config.ip_reputation = 1 - - if("ipr_email") - config.ipr_email = value - - if("ipr_block_bad_ips") - config.ipr_block_bad_ips = 1 - - if("ipr_bad_score") - config.ipr_bad_score = text2num(value) - - if("ipr_allow_existing") - config.ipr_allow_existing = 1 - - if("ipr_minimum_age") - config.ipr_minimum_age = text2num(value) - - if("autostart_solars") - config.autostart_solars = TRUE - - if("sqlite_enabled") - config.sqlite_enabled = TRUE - - if("sqlite_feedback") - config.sqlite_feedback = TRUE - - if("sqlite_feedback_topics") - config.sqlite_feedback_topics = splittext(value, ";") - if(!config.sqlite_feedback_topics.len) - config.sqlite_feedback_topics += "General" - - if("sqlite_feedback_privacy") - config.sqlite_feedback_privacy = TRUE - - if("sqlite_feedback_cooldown") - config.sqlite_feedback_cooldown = text2num(value) - - if("defib_timer") - config.defib_timer = text2num(value) - - if("defib_braindamage_timer") - config.defib_braindamage_timer = text2num(value) - - if("disable_cid_warn_popup") - config.disable_cid_warn_popup = TRUE - - if("enable_night_shifts") - config.enable_night_shifts = TRUE - - if("jukebox_track_files") - config.jukebox_track_files = splittext(value, ";") - - if("suggested_byond_version") - config.suggested_byond_version = text2num(value) - - if("suggested_byond_build") - config.suggested_byond_build = text2num(value) - - // VOREStation Edit Start - Can't be in _vr file because it is loaded too late. - if("vgs_access_identifier") - config.vgs_access_identifier = value - if("vgs_server_port") - config.vgs_server_port = text2num(value) - // VOREStation Edit End - - if("invoke_youtubedl") - config.invoke_youtubedl = value - - if("asset_transport") - config.asset_transport = value - - if("cache_assets") - config.cache_assets = TRUE - - if("save_spritesheets") - config.save_spritesheets = TRUE - - if("asset_simple_preload") - config.asset_simple_preload = TRUE - - if("asset_cdn_webroot") - config.asset_cdn_webroot = value - - if("asset_cdn_url") - config.asset_cdn_url = value - - if("allow_robot_recolor") - config.allow_robot_recolor = TRUE - - if("allow_simple_mob_recolor") - config.allow_simple_mob_recolor = TRUE - - else - log_misc("Unknown setting in configuration: '[name]'") - - else if(type == "game_options") - if(!value) - log_misc("Unknown value for setting [name] in [filename].") - value = text2num(value) - - switch(name) - if("health_threshold_crit") - config.health_threshold_crit = value - if("health_threshold_softcrit") - config.health_threshold_softcrit = value - if("health_threshold_dead") - config.health_threshold_dead = value - if("show_human_death_message") - config.show_human_death_message = 1 - if("revival_pod_plants") - config.revival_pod_plants = value - if("revival_cloning") - config.revival_cloning = value - if("revival_brain_life") - config.revival_brain_life = value - if("organ_health_multiplier") - config.organ_health_multiplier = value / 100 - if("organ_regeneration_multiplier") - config.organ_regeneration_multiplier = value / 100 - if("organ_damage_spillover_multiplier") - config.organ_damage_spillover_multiplier = value / 100 - if("organs_can_decay") - config.organs_decay = 1 - if("default_brain_health") - config.default_brain_health = text2num(value) - if(!config.default_brain_health || config.default_brain_health < 1) - config.default_brain_health = initial(config.default_brain_health) - if("bones_can_break") - config.bones_can_break = value - if("limbs_can_break") - config.limbs_can_break = value - if("allow_headgibs") - config.allow_headgibs = TRUE - - if("run_speed") - config.run_speed = value - if("walk_speed") - config.walk_speed = value - - if("human_delay") - config.human_delay = value - if("robot_delay") - config.robot_delay = value - if("monkey_delay") - config.monkey_delay = value - if("alien_delay") - config.alien_delay = value - if("slime_delay") - config.slime_delay = value - if("animal_delay") - config.animal_delay = value - - if("footstep_volume") - config.footstep_volume = text2num(value) - - if("use_loyalty_implants") - config.use_loyalty_implants = 1 - - if("loadout_whitelist") - config.loadout_whitelist = text2num(value) - - else - log_misc("Unknown setting in configuration: '[name]'") - -/datum/configuration/proc/loadsql(filename) // -- TLE - var/list/Lines = file2list(filename) - for(var/t in Lines) - if(!t) continue - - t = trim(t) - if (length(t) == 0) - continue - else if (copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/name = null - var/value = null - - if (pos) - name = lowertext(copytext(t, 1, pos)) - value = copytext(t, pos + 1) - else - name = lowertext(t) - - if (!name) - continue - - switch (name) - if ("address") - sqladdress = value - if ("port") - sqlport = value - if ("database") - sqldb = value - if ("login") - sqllogin = value - if ("password") - sqlpass = value - if ("feedback_database") - sqlfdbkdb = value - if ("feedback_login") - sqlfdbklogin = value - if ("feedback_password") - sqlfdbkpass = value - if ("enable_stat_tracking") - sqllogging = 1 - else - log_misc("Unknown setting in configuration: '[name]'") - -/datum/configuration/proc/loadforumsql(filename) // -- TLE - var/list/Lines = file2list(filename) - for(var/t in Lines) - if(!t) continue - - t = trim(t) - if (length(t) == 0) - continue - else if (copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/name = null - var/value = null - - if (pos) - name = lowertext(copytext(t, 1, pos)) - value = copytext(t, pos + 1) - else - name = lowertext(t) - - if (!name) - continue - - switch (name) - if ("address") - forumsqladdress = value - if ("port") - forumsqlport = value - if ("database") - forumsqldb = value - if ("login") - forumsqllogin = value - if ("password") - forumsqlpass = value - if ("activatedgroup") - forum_activated_group = value - if ("authenticatedgroup") - forum_authenticated_group = value - else - log_misc("Unknown setting in configuration: '[name]'") - -/datum/configuration/proc/pick_mode(mode_name) - // I wish I didn't have to instance the game modes in order to look up - // their information, but it is the only way (at least that I know of). - for (var/game_mode in gamemode_cache) - var/datum/game_mode/M = gamemode_cache[game_mode] - if (M.config_tag && M.config_tag == mode_name) - return M - return gamemode_cache["extended"] - -/datum/configuration/proc/get_runnable_modes() - var/list/runnable_modes = list() - for(var/game_mode in gamemode_cache) - var/datum/game_mode/M = gamemode_cache[game_mode] - if(M && M.can_start() && !isnull(config.probabilities[M.config_tag]) && config.probabilities[M.config_tag] > 0) - runnable_modes |= M - return runnable_modes - -/datum/configuration/proc/post_load() - //apply a default value to config.python_path, if needed - if (!config.python_path) - if(world.system_type == UNIX) - config.python_path = "/usr/bin/env python2" - else //probably windows, if not this should work anyway - config.python_path = "python" diff --git a/code/controllers/configuration_vr.dm b/code/controllers/configuration_vr.dm deleted file mode 100644 index a1740212f0..0000000000 --- a/code/controllers/configuration_vr.dm +++ /dev/null @@ -1,64 +0,0 @@ -// -// Lets read our settings from the configuration file on startup too! -// - -/datum/configuration - var/static/time_off = FALSE - var/static/pto_job_change = FALSE - var/static/limit_interns = -1 //Unlimited by default - var/static/limit_visitors = -1 //Unlimited by default - var/static/pto_cap = 100 //Hours - var/static/require_flavor = FALSE - var/static/ipqualityscore_apikey //API key for ipqualityscore.com - var/static/use_playtime_restriction_for_jobs = FALSE - -/hook/startup/proc/read_vs_config() - var/list/Lines = file2list("config/config.txt") - for(var/t in Lines) - if(!t) continue - - t = trim(t) - if (length(t) == 0) - continue - else if (copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/name = null - var/value = null - - if (pos) - name = lowertext(copytext(t, 1, pos)) - value = copytext(t, pos + 1) - else - name = lowertext(t) - - if (!name) - continue - - switch (name) - if ("chat_webhook_url") - config.chat_webhook_url = value - if ("chat_webhook_key") - config.chat_webhook_key = value - if ("fax_export_dir") - config.fax_export_dir = value - if ("items_survive_digestion") - config.items_survive_digestion = 1 - if ("limit_interns") - config.limit_interns = text2num(value) - if ("limit_visitors") - config.limit_visitors = text2num(value) - if ("pto_cap") - config.pto_cap = text2num(value) - if ("time_off") - config.time_off = TRUE - if ("pto_job_change") - config.pto_job_change = TRUE - if ("require_flavor") - config.require_flavor = TRUE - if ("ipqualityscore_apikey") - config.ipqualityscore_apikey = value - if ("use_playtime_restriction_for_jobs") - config.use_playtime_restriction_for_jobs = TRUE - return 1 diff --git a/code/controllers/failsafe.dm b/code/controllers/failsafe.dm index dfe8bc7234..e92e30079b 100644 --- a/code/controllers/failsafe.dm +++ b/code/controllers/failsafe.dm @@ -1,10 +1,11 @@ - /** - * Failsafe - * - * Pretty much pokes the MC to make sure it's still alive. +/** + * Failsafe + * + * Pretty much pokes the MC to make sure it's still alive. **/ -var/datum/controller/failsafe/Failsafe +// See initialization order in /code/game/world.dm +GLOBAL_REAL(Failsafe, /datum/controller/failsafe) /datum/controller/failsafe // This thing pretty much just keeps poking the master controller name = "Failsafe" @@ -15,7 +16,7 @@ var/datum/controller/failsafe/Failsafe // The alert level. For every failed poke, we drop a DEFCON level. Once we hit DEFCON 1, restart the MC. var/defcon = 5 //the world.time of the last check, so the mc can restart US if we hang. - // (Real friends look out for *eachother*) + // (Real friends look out for *each other*) var/lasttick = 0 // Track the MC iteration to make sure its still on track. @@ -31,8 +32,24 @@ var/datum/controller/failsafe/Failsafe Initialize() /datum/controller/failsafe/Initialize() - set waitfor = 0 + set waitfor = FALSE Failsafe.Loop() + if (!Master || defcon == 0) //Master is gone/not responding and Failsafe just exited its loop + defcon = 3 //Reset defcon level as its used inside the emergency loop + while (defcon > 0) + var/recovery_result = emergency_loop() + if (recovery_result == 1) //Exit emergency loop and delete self if it was able to recover MC + break + else if (defcon == 1) //Exit Failsafe if we weren't able to recover the MC in the last stage + log_game("FailSafe: Failed to recover MC while in emergency state. Failsafe exiting.") + message_admins(span_boldannounce("Failsafe failed critically while trying to recreate broken MC. Please manually fix the MC or reboot the server. Failsafe exiting now.")) + message_admins(span_boldannounce("You can try manually calling these two procs:.")) + message_admins(span_boldannounce("/proc/recover_all_SS_and_recreate_master: Most stuff should still function but expect instability/runtimes/broken stuff.")) + message_admins(span_boldannounce("/proc/delete_all_SS_and_recreate_master: Most stuff will be broken but basic stuff like movement and chat should still work.")) + else if (recovery_result == -1) //Failed to recreate MC + defcon-- + sleep(initial(processing_interval)) //Wait a bit until the next try + if(!QDELETED(src)) qdel(src) //when Loop() returns, we delete ourselves and let the mc recreate us @@ -45,43 +62,56 @@ var/datum/controller/failsafe/Failsafe while(running) lasttick = world.time if(!Master) - // Replace the missing Master! This should never, ever happen. - new /datum/controller/master() + // Break out of the main loop so we go into emergency state + break // Only poke it if overrides are not in effect. if(processing_interval > 0) if(Master.processing && Master.iteration) + if (defcon > 1 && (!Master.stack_end_detector || !Master.stack_end_detector.check())) + + to_chat(GLOB.admins, span_boldannounce("ERROR: The Master Controller code stack has exited unexpectedly, Restarting...")) + defcon = 0 + var/rtn = Recreate_MC() + if(rtn > 0) + master_iteration = 0 + to_chat(GLOB.admins, span_adminnotice("MC restarted successfully")) + else if(rtn < 0) + log_game("FailSafe: Could not restart MC, runtime encountered. Entering defcon 0") + to_chat(GLOB.admins, span_boldannounce("ERROR: DEFCON [defcon_pretty()]. Could not restart MC, runtime encountered. I will silently keep retrying.")) // Check if processing is done yet. if(Master.iteration == master_iteration) - log_debug("DEFCON [defcon]: Master.iteration=[Master.iteration] Master.last_run=[Master.last_run] world.time=[world.time]") switch(defcon) if(4,5) --defcon - if(3) - log_and_message_admins(span_adminnotice("SSfailsafe Notice: DEFCON [defcon_pretty()]. The Master Controller (\ref[Master]) has not fired in the last [(5-defcon) * processing_interval] ticks.")) - --defcon - if(2) - log_and_message_admins(span_boldannounce("SSfailsafe Warning: DEFCON [defcon_pretty()]. The Master Controller (\ref[Master]) has not fired in the last [(5-defcon) * processing_interval] ticks. Automatic restart in [processing_interval] ticks.")) - --defcon - if(1) - log_and_message_admins(span_boldannounce("SSfailsafe Warning: DEFCON [defcon_pretty()]. The Master Controller (\ref[Master]) has still not fired within the last [(5-defcon) * processing_interval] ticks. Killing and restarting...")) + if(3) + message_admins(span_adminnotice("Notice: DEFCON [defcon_pretty()]. The Master Controller has not fired in the last [(5-defcon) * processing_interval] ticks.")) + --defcon + + if(2) + to_chat(GLOB.admins, span_boldannounce("Warning: DEFCON [defcon_pretty()]. The Master Controller has not fired in the last [(5-defcon) * processing_interval] ticks. Automatic restart in [processing_interval] ticks.")) + --defcon + + if(1) + to_chat(GLOB.admins, span_boldannounce("Warning: DEFCON [defcon_pretty()]. The Master Controller has still not fired within the last [(5-defcon) * processing_interval] ticks. Killing and restarting...")) --defcon var/rtn = Recreate_MC() if(rtn > 0) defcon = 4 master_iteration = 0 - log_and_message_admins(span_adminnotice("SSfailsafe Notice: MC (New:\ref[Master]) restarted successfully")) + to_chat(GLOB.admins, span_adminnotice("MC restarted successfully")) else if(rtn < 0) - log_game("SSfailsafe Notice: Could not restart MC (\ref[Master]), runtime encountered. Entering defcon 0") - log_and_message_admins(span_boldannounce("SSFAILSAFE ERROR: DEFCON [defcon_pretty()]. Could not restart MC (\ref[Master]), runtime encountered. I will silently keep retrying.")) + log_game("FailSafe: Could not restart MC, runtime encountered. Entering defcon 0") + to_chat(GLOB.admins, span_boldannounce("ERROR: DEFCON [defcon_pretty()]. Could not restart MC, runtime encountered. I will silently keep retrying.")) //if the return number was 0, it just means the mc was restarted too recently, and it just needs some time before we try again //no need to handle that specially when defcon 0 can handle it + if(0) //DEFCON 0! (mc failed to restart) var/rtn = Recreate_MC() if(rtn > 0) defcon = 4 master_iteration = 0 - log_and_message_admins(span_adminnotice("SSfailsafe Notice: MC (New:\ref[Master]) restarted successfully")) + to_chat(GLOB.admins, span_adminnotice("MC restarted successfully")) else defcon = min(defcon + 1,5) master_iteration = Master.iteration @@ -93,12 +123,60 @@ var/datum/controller/failsafe/Failsafe defcon = 5 sleep(initial(processing_interval)) +//Emergency loop used when Master got deleted or the main loop exited while Defcon == 0 +//Loop is driven externally so runtimes only cancel the current recovery attempt +/datum/controller/failsafe/proc/emergency_loop() + //The code in this proc should be kept as simple as possible, anything complicated like to_chat might rely on master existing and runtime + //The goal should always be to get a new Master up and running before anything else + . = -1 + switch (defcon) //The lower defcon goes the harder we try to fix the MC + if (2 to 3) //Try to normally recreate the MC two times + . = Recreate_MC() + if (1) //Delete the old MC first so we don't transfer any info, in case that caused any issues + del(Master) + . = Recreate_MC() + + if (. == 1) //We were able to create a new master + master_iteration = 0 + SSticker.Recover(); //Recover the ticket system so the Masters runlevel gets set + Master.Initialize(10, FALSE, FALSE) //Need to manually start the MC, normally world.new would do this + to_chat(GLOB.admins, span_adminnotice("Failsafe recovered MC while in emergency state [defcon_pretty()]")) + else + log_game("FailSafe: Failsafe in emergency state and was unable to recreate MC while in defcon state [defcon_pretty()].") + message_admins(span_boldannounce("Failsafe in emergency state and master down, trying to recreate MC while in defcon level [defcon_pretty()] failed.")) + +///Recreate all SSs which will still cause data survive due to Recover(), the new Master will then find and take them from global.vars +/proc/recover_all_SS_and_recreate_master() + del(Master) + var/list/subsytem_types = subtypesof(/datum/controller/subsystem) + sortTim(subsytem_types, GLOBAL_PROC_REF(cmp_subsystem_init)) + for(var/I in subsytem_types) + new I + . = Recreate_MC() + if (. == 1) //We were able to create a new master + SSticker.Recover(); //Recover the ticket system so the Masters runlevel gets set + Master.Initialize(10, FALSE, FALSE) //Need to manually start the MC, normally world.new would do this + to_chat(GLOB.admins, span_adminnotice("MC successfully recreated after recovering all subsystems!")) + else + message_admins(span_boldannounce("Failed to create new MC!")) + +///Delete all existing SS to basically start over +/proc/delete_all_SS_and_recreate_master() + del(Master) + for(var/global_var in global.vars) + if (istype(global.vars[global_var], /datum/controller/subsystem)) + del(global.vars[global_var]) + . = Recreate_MC() + if (. == 1) //We were able to create a new master + SSticker.Recover(); //Recover the ticket system so the Masters runlevel gets set + Master.Initialize(10, FALSE, FALSE) //Need to manually start the MC, normally world.new would do this + to_chat(GLOB.admins, span_adminnotice("MC successfully recreated after deleting and recreating all subsystems!")) + else + message_admins(span_boldannounce("Failed to create new MC!")) + /datum/controller/failsafe/proc/defcon_pretty() return defcon /datum/controller/failsafe/stat_entry(msg) - if(!statclick) - statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) - - msg = "Failsafe Controller: [statclick.update("Defcon: [defcon_pretty()] (Interval: [Failsafe.processing_interval] | Iteration: [Failsafe.master_iteration])")]" + msg = "Defcon: [defcon_pretty()] (Interval: [Failsafe.processing_interval] | Iteration: [Failsafe.master_iteration])" return msg diff --git a/code/controllers/master.dm b/code/controllers/master.dm index b68b4e01c0..35145d5a62 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -1,26 +1,23 @@ - /** - * StonedMC - * - * Designed to properly split up a given tick among subsystems - * Note: if you read parts of this code and think "why is it doing it that way" - * Odds are, there is a reason - * +/** + * StonedMC + * + * Designed to properly split up a given tick among subsystems + * Note: if you read parts of this code and think "why is it doing it that way" + * Odds are, there is a reason + * **/ -//This is the ABSOLUTE ONLY THING that should init globally like this +// See initialization order in /code/game/world.dm GLOBAL_REAL(Master, /datum/controller/master) = new - -//THIS IS THE INIT ORDER -//Master -> SSPreInit -> GLOB -> world -> config -> SSInit -> Failsafe -//GOT IT MEMORIZED? - /datum/controller/master name = "Master" - // Are we processing (higher values increase the processing delay by n ticks) + /// Are we processing (higher values increase the processing delay by n ticks) var/processing = TRUE - // How many times have we ran + /// How many times have we ran var/iteration = 0 + /// Stack end detector to detect stack overflows that kill the mc's main loop + var/datum/stack_end_detector/stack_end_detector // world.time of last fire, for tracking lag outside of the mc var/last_run @@ -291,8 +288,12 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/error_level = 0 var/sleep_delta = 1 var/list/subsystems_to_check - //the actual loop. + //setup the stack overflow detector + stack_end_detector = new() + var/datum/stack_canary/canary = stack_end_detector.prime_canary() + canary.use_variable() + //the actual loop. while (1) tickdrift = max(0, MC_AVERAGE_FAST(tickdrift, (((REALTIMEOFDAY - init_timeofday) - (world.time - init_time)) / world.tick_lag))) var/starting_tick_usage = TICK_USAGE diff --git a/code/controllers/subsystems/speech_controller.dm b/code/controllers/subsystems/speech_controller.dm new file mode 100644 index 0000000000..e293c89a9b --- /dev/null +++ b/code/controllers/subsystems/speech_controller.dm @@ -0,0 +1,5 @@ +/// verb_manager subsystem just for handling say's +VERB_MANAGER_SUBSYSTEM_DEF(speech_controller) + name = "Speech Controller" + wait = 1 + priority = FIRE_PRIORITY_SPEECH_CONTROLLER//has to be high priority, second in priority ONLY to SSinput diff --git a/code/controllers/subsystems/verb_manager.dm b/code/controllers/subsystems/verb_manager.dm new file mode 100644 index 0000000000..1e3cce0a9a --- /dev/null +++ b/code/controllers/subsystems/verb_manager.dm @@ -0,0 +1,167 @@ +/** + * SSverb_manager, a subsystem that runs every tick and runs through its entire queue without yielding like SSinput. + * this exists because of how the byond tick works and where user inputted verbs are put within it. + * + * see TICK_ORDER.md for more info on how the byond tick is structured. + * + * The way the MC allots its time is via TICK_LIMIT_RUNNING, it simply subtracts the cost of SendMaps (MAPTICK_LAST_INTERNAL_TICK_USAGE) + * plus TICK_BYOND_RESERVE from the tick and uses up to that amount of time (minus the percentage of the tick used by the time it executes subsystems) + * on subsystems running cool things like atmospherics or Life or SSInput or whatever. + * + * Without this subsystem, verbs are likely to cause overtime if the MC uses all of the time it has allotted for itself in the tick, and SendMaps + * uses as much as its expected to, and an expensive verb ends up executing that tick. This is because the MC is completely blind to the cost of + * verbs, it can't account for it at all. The only chance for verbs to not cause overtime in a tick where the MC used as much of the tick + * as it allotted itself and where SendMaps costed as much as it was expected to is if the verb(s) take less than TICK_BYOND_RESERVE percent of + * the tick, which isn't much. Not to mention if SendMaps takes more than 30% of the tick and the MC forces itself to take at least 70% of the + * normal tick duration which causes ticks to naturally overrun even in the absence of verbs. + * + * With this subsystem, the MC can account for the cost of verbs and thus stop major overruns of ticks. This means that the most important subsystems + * like SSinput can start at the same time they were supposed to, leading to a smoother experience for the player since ticks aren't riddled with + * minor hangs over and over again. + */ +SUBSYSTEM_DEF(verb_manager) + name = "Verb Manager" + wait = 1 + flags = SS_TICKER | SS_NO_INIT + priority = FIRE_PRIORITY_DELAYED_VERBS + runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT + + ///list of callbacks to procs called from verbs or verblike procs that were executed when the server was overloaded and had to delay to the next tick. + ///this list is ran through every tick, and the subsystem does not yield until this queue is finished. + var/list/datum/callback/verb_callback/verb_queue = list() + + ///running average of how many verb callbacks are executed every second. used for the stat entry + var/verbs_executed_per_second = 0 + + ///if TRUE we treat usr's with holders just like usr's without holders. otherwise they always execute immediately + var/can_queue_admin_verbs = FALSE + + ///if this is true all verbs immediately execute and don't queue. in case the mc is fucked or something + var/FOR_ADMINS_IF_VERBS_FUCKED_immediately_execute_all_verbs = FALSE + + ///used for subtypes to determine if they use their own stats for the stat entry + var/use_default_stats = TRUE + + ///if TRUE this will... message admins every time a verb is queued to this subsystem for the next tick with stats. + ///for obvious reasons don't make this be TRUE on the code level this is for admins to turn on + var/message_admins_on_queue = FALSE + + ///always queue if possible. overrides can_queue_admin_verbs but not FOR_ADMINS_IF_VERBS_FUCKED_immediately_execute_all_verbs + var/always_queue = FALSE + +/** + * queue a callback for the given verb/verblike proc and any given arguments to the specified verb subsystem, so that they process in the next tick. + * intended to only work with verbs or verblike procs called directly from client input, use as part of TRY_QUEUE_VERB() and co. + * + * returns TRUE if the queuing was successful, FALSE otherwise. + */ +/proc/_queue_verb(datum/callback/verb_callback/incoming_callback, tick_check, datum/controller/subsystem/verb_manager/subsystem_to_use = SSverb_manager, ...) + if(QDELETED(incoming_callback)) + var/destroyed_string + if(!incoming_callback) + destroyed_string = "callback is null." + else + destroyed_string = "callback was deleted [DS2TICKS(world.time - incoming_callback.gc_destroyed)] ticks ago. callback was created [DS2TICKS(world.time) - incoming_callback.creation_time] ticks ago." + + stack_trace("_queue_verb() returned false because it was given a deleted callback! [destroyed_string]") + return FALSE + + if(!istext(incoming_callback.object) && QDELETED(incoming_callback.object)) //just in case the object is GLOBAL_PROC + var/destroyed_string + if(!incoming_callback.object) + destroyed_string = "callback.object is null." + else + destroyed_string = "callback.object was deleted [DS2TICKS(world.time - incoming_callback.object.gc_destroyed)] ticks ago. callback was created [DS2TICKS(world.time) - incoming_callback.creation_time] ticks ago." + + stack_trace("_queue_verb() returned false because it was given a callback acting on a qdeleted object! [destroyed_string]") + return FALSE + + //we want unit tests to be able to directly call verbs that attempt to queue, and since unit tests should test internal behavior, we want the queue + //to happen as if it was actually from player input if its called on a mob. +#ifdef UNIT_TESTS + if(QDELETED(usr) && ismob(incoming_callback.object)) + incoming_callback.user = WEAKREF(incoming_callback.object) + var/datum/callback/new_us = CALLBACK(arglist(list(GLOBAL_PROC, GLOBAL_PROC_REF(_queue_verb)) + args.Copy())) + return world.push_usr(incoming_callback.object, new_us) + +#else + + if(QDELETED(usr) || isnull(usr.client)) + stack_trace("_queue_verb() returned false because it wasn't called from player input!") + return FALSE + +#endif + + if(!istype(subsystem_to_use)) + stack_trace("_queue_verb() returned false because it was given an invalid subsystem to queue for!") + return FALSE + + if((TICK_USAGE < tick_check) && !subsystem_to_use.always_queue) + return FALSE + + var/list/args_to_check = args.Copy() + args_to_check.Cut(2, 4)//cut out tick_check and subsystem_to_use + + //any subsystem can use the additional arguments to refuse queuing + if(!subsystem_to_use.can_queue_verb(arglist(args_to_check))) + return FALSE + + return subsystem_to_use.queue_verb(incoming_callback) + +/** + * subsystem-specific check for whether a callback can be queued. + * intended so that subsystem subtypes can verify whether + * + * subtypes may include additional arguments here if they need them! you just need to include them properly + * in TRY_QUEUE_VERB() and co. + */ +/datum/controller/subsystem/verb_manager/proc/can_queue_verb(datum/callback/verb_callback/incoming_callback) + if(always_queue && !FOR_ADMINS_IF_VERBS_FUCKED_immediately_execute_all_verbs) + return TRUE + + if((usr.client?.holder && !can_queue_admin_verbs) \ + || (!subsystem_initialized && !(flags & SS_NO_INIT)) \ + || FOR_ADMINS_IF_VERBS_FUCKED_immediately_execute_all_verbs \ + || !(runlevels & Master.current_runlevel)) + return FALSE + + return TRUE + +/** + * queue a callback for the given proc, so that it is invoked in the next tick. + * intended to only work with verbs or verblike procs called directly from client input, use as part of TRY_QUEUE_VERB() + * + * returns TRUE if the queuing was successful, FALSE otherwise. + */ +/datum/controller/subsystem/verb_manager/proc/queue_verb(datum/callback/verb_callback/incoming_callback) + . = FALSE //errored + if(message_admins_on_queue) + message_admins("[name] verb queuing: tick usage: [TICK_USAGE]%, proc: [incoming_callback.delegate], object: [incoming_callback.object], usr: [usr]") + verb_queue += incoming_callback + return TRUE + +/datum/controller/subsystem/verb_manager/fire(resumed) + run_verb_queue() + +/// runs through all of this subsystems queue of verb callbacks. +/// goes through the entire verb queue without yielding. +/// used so you can flush the queue outside of fire() without interfering with anything else subtype subsystems might do in fire(). +/datum/controller/subsystem/verb_manager/proc/run_verb_queue() + var/executed_verbs = 0 + + for(var/datum/callback/verb_callback/verb_callback as anything in verb_queue) + if(!istype(verb_callback)) + stack_trace("non /datum/callback/verb_callback inside [name]'s verb_queue!") + continue + + verb_callback.InvokeAsync() + executed_verbs++ + + verb_queue.Cut() + verbs_executed_per_second = MC_AVG_SECONDS(verbs_executed_per_second, executed_verbs, wait SECONDS) + //note that wait SECONDS is incorrect if this is called outside of fire() but because byond is garbage i need to add a timer to rustg to find a valid solution + +/datum/controller/subsystem/verb_manager/stat_entry(msg) + . = ..() + if(use_default_stats) + . += "V/S: [round(verbs_executed_per_second, 0.01)]" diff --git a/code/datums/colormate.dm b/code/datums/colormate.dm index 49c7a88542..3bb625b7b1 100644 --- a/code/datums/colormate.dm +++ b/code/datums/colormate.dm @@ -43,7 +43,7 @@ /datum/ColorMate/tgui_state(mob/user) return GLOB.tgui_conscious_state -/datum/ColorMate/tgui_data() +/datum/ColorMate/tgui_data(mob/user) . = list() .["activemode"] = active_mode .["matrixcolors"] = list( @@ -69,7 +69,7 @@ .["item"] = list() .["item"]["name"] = inserted.name .["item"]["sprite"] = icon2base64(get_flat_icon(inserted,dir=SOUTH,no_anim=TRUE)) - .["item"]["preview"] = icon2base64(build_preview()) + .["item"]["preview"] = icon2base64(build_preview(user)) else .["item"] = null @@ -159,7 +159,7 @@ return TRUE /// Produces the preview image of the item, used in the UI, the way the color is not stacking is a sin. -/datum/ColorMate/proc/build_preview() +/datum/ColorMate/proc/build_preview(mob/user) if(inserted) //sanity var/list/cm switch(active_mode) @@ -178,17 +178,17 @@ text2num(color_matrix_last[11]), text2num(color_matrix_last[12]), ) - if(!check_valid_color(cm, usr)) + if(!check_valid_color(cm, user)) return get_flat_icon(inserted, dir=SOUTH, no_anim=TRUE) if(COLORMATE_TINT) - if(!check_valid_color(activecolor, usr)) + if(!check_valid_color(activecolor, user)) return get_flat_icon(inserted, dir=SOUTH, no_anim=TRUE) if(COLORMATE_HSV) cm = color_matrix_hsv(build_hue, build_sat, build_val) color_matrix_last = cm - if(!check_valid_color(cm, usr)) + if(!check_valid_color(cm, user)) return get_flat_icon(inserted, dir=SOUTH, no_anim=TRUE) var/cur_color = inserted.color diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index edda32de87..3f482ea72e 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -452,26 +452,25 @@ data["crafting_recipes"] = crafting_recipes return data -/datum/component/personal_crafting/tgui_act(action, params) +/datum/component/personal_crafting/tgui_act(action, params, datum/tgui/ui) . = ..() if(.) return switch(action) if("make") - var/mob/user = usr var/datum/crafting_recipe/TR = locate(params["recipe"]) in GLOB.crafting_recipes busy = TRUE - tgui_interact(user) - var/atom/movable/result = construct_item(user, TR) + tgui_interact(ui.user) + var/atom/movable/result = construct_item(ui.user, TR) if(!istext(result)) //We made an item and didn't get a fail message - if(ismob(user) && isitem(result)) //In case the user is actually possessing a non mob like a machine - user.put_in_hands(result) + if(ismob(ui.user) && isitem(result)) //In case the user is actually possessing a non mob like a machine + ui.user.put_in_hands(result) else - result.forceMove(user.drop_location()) - to_chat(user, span_notice("[TR.name] constructed.")) - TR.on_craft_completion(user, result) + result.forceMove(ui.user.drop_location()) + to_chat(ui.user, span_notice("[TR.name] constructed.")) + TR.on_craft_completion(ui.user, result) else - to_chat(user, span_warning("Construction failed[result]")) + to_chat(ui.user, span_warning("Construction failed[result]")) busy = FALSE if("toggle_recipes") display_craftable_only = !display_craftable_only diff --git a/code/datums/components/gargoyle.dm b/code/datums/components/gargoyle.dm new file mode 100644 index 0000000000..618c2e97e0 --- /dev/null +++ b/code/datums/components/gargoyle.dm @@ -0,0 +1,101 @@ +/datum/component/gargoyle + var/energy = 100 + var/transformed = FALSE + var/paused = FALSE + var/paused_loc + var/cooldown + + var/mob/living/carbon/human/gargoyle //easy reference + var/obj/structure/gargoyle/statue //another easy ref + + //Adjustable mod + var/identifier = "statue" + var/adjective = "hardens" + var/material = "stone" + var/tint = "#FFFFFF" + +/datum/component/gargoyle/Initialize() + if (!ishuman(parent)) + return COMPONENT_INCOMPATIBLE + gargoyle = parent + add_verb(gargoyle,/mob/living/carbon/human/proc/gargoyle_transformation) + add_verb(gargoyle,/mob/living/carbon/human/proc/gargoyle_pause) + add_verb(gargoyle,/mob/living/carbon/human/proc/gargoyle_checkenergy) + + START_PROCESSING(SSprocessing, src) + +/datum/component/gargoyle/process() + if (QDELETED(gargoyle)) + return + if (paused && gargoyle.loc != paused_loc) + unpause() + if (energy > 0) + if (!transformed && !paused) + energy = max(0,energy-0.05) + else if (!transformed && isturf(gargoyle.loc)) + gargoyle.gargoyle_transformation() + if (transformed) + if (!statue) + transformed = FALSE + statue.damage(-0.5) + energy = min(energy+0.3, 100) + +/datum/component/gargoyle/proc/unpause() + if (!paused || transformed) + paused = FALSE + paused_loc = null + UnregisterSignal(gargoyle, COMSIG_ATOM_ENTERING) + return + if (gargoyle?.loc != paused_loc) + paused = FALSE + paused_loc = null + energy = max(energy - 5, 0) + if (energy == 0) + gargoyle.gargoyle_transformation() + UnregisterSignal(gargoyle, COMSIG_ATOM_ENTERING) + +//verbs or action buttons...? +/mob/living/carbon/human/proc/gargoyle_transformation() + set name = "Gargoyle - Petrification" + set category = "Abilities.Gargoyle" + set desc = "Turn yourself into (or back from) being a gargoyle." + + if (stat == DEAD) + return + + var/datum/component/gargoyle/comp = GetComponent(/datum/component/gargoyle) + if (comp) + if (comp.energy <= 0 && isturf(loc)) + to_chat(src, span_danger("You suddenly turn into a [comp.identifier] as you run out of energy!")) + else if (comp.cooldown > world.time) + var/time_to_wait = (comp.cooldown - world.time) / (1 SECONDS) + to_chat(src, span_warning("You can't transform just yet again! Wait for another [round(time_to_wait,0.1)] seconds!")) + return + if (istype(loc, /obj/structure/gargoyle)) + qdel(loc) + else if (isturf(loc)) + new /obj/structure/gargoyle(loc, src) + +/mob/living/carbon/human/proc/gargoyle_pause() + set name = "Gargoyle - Pause" + set category = "Abilities.Gargoyle" + set desc = "Pause your energy while standing still, so you don't use up any more, though you will lose a small amount upon moving again." + + if (stat) + return + + var/datum/component/gargoyle/comp = GetComponent(/datum/component/gargoyle) + if (comp && !comp.transformed && !comp.paused) + comp.paused = TRUE + comp.paused_loc = loc + comp.RegisterSignal(src, COMSIG_ATOM_ENTERING, /datum/component/gargoyle/proc/unpause) + to_chat(src, span_notice("You start conserving your energy.")) + +/mob/living/carbon/human/proc/gargoyle_checkenergy() + set name = "Gargoyle - Check Energy" + set category = "Abilities.Gargoyle" + set desc = "Check how much energy you have remaining as a gargoyle." + + var/datum/component/gargoyle/comp = GetComponent(/datum/component/gargoyle) + if (comp) + to_chat(src, span_notice("You have [round(comp.energy,0.01)] energy remaining. It is currently [comp.paused ? "stable" : (comp.transformed ? "increasing" : "decreasing")].")) diff --git a/code/datums/helper_datums/stack_end_detector.dm b/code/datums/helper_datums/stack_end_detector.dm new file mode 100644 index 0000000000..0d621f51b3 --- /dev/null +++ b/code/datums/helper_datums/stack_end_detector.dm @@ -0,0 +1,32 @@ +/** + Stack End Detector. + Can detect if a given code stack has exited, used by the mc for stack overflow detection. + + **/ +/datum/stack_end_detector + var/datum/weakref/_WF + var/datum/stack_canary/_canary + +/datum/stack_end_detector/New() + _canary = new() + _WF = WEAKREF(_canary) + +/** Prime the stack overflow detector. + Store the return value of this proc call in a proc level var. + Can only be called once. +**/ +/datum/stack_end_detector/proc/prime_canary() + if (!_canary) + CRASH("Prime_canary called twice") + . = _canary + _canary = null + +/// Returns true if the stack is still going. Calling before the canary has been primed also returns true +/datum/stack_end_detector/proc/check() + return !!_WF.resolve() + +/// Stack canary. Will go away if the stack it was primed by is ended by byond for return or stack overflow reasons. +/datum/stack_canary + +/// empty proc to avoid warnings about unused variables. Call this proc on your canary in the stack it's watching. +/datum/stack_canary/proc/use_variable() diff --git a/code/datums/verb_callbacks.dm b/code/datums/verb_callbacks.dm new file mode 100644 index 0000000000..77f817017d --- /dev/null +++ b/code/datums/verb_callbacks.dm @@ -0,0 +1,27 @@ +///like normal callbacks but they also record their creation time for measurement purposes +///they also require the same usr/user that made the callback to both still exist and to still have a client in order to execute +/datum/callback/verb_callback + ///the tick this callback datum was created in. used for testing latency + var/creation_time = 0 + +/datum/callback/verb_callback/New(thingtocall, proctocall, ...) + creation_time = DS2TICKS(world.time) + . = ..() + +#ifndef UNIT_TEST +/datum/callback/verb_callback/Invoke(...) + var/mob/our_user = user?.resolve() + if(QDELETED(our_user) || isnull(our_user.client)) + return + var/mob/temp = usr + . = ..() + usr = temp + +/datum/callback/verb_callback/InvokeAsync(...) + var/mob/our_user = user?.resolve() + if(QDELETED(our_user) || isnull(our_user.client)) + return + var/mob/temp = usr + . = ..() + usr = temp +#endif diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index 4e71b94630..03ffdb8ecb 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -153,24 +153,23 @@ data["status"] = status return data -/datum/wires/tgui_act(action, list/params) +/datum/wires/tgui_act(action, list/params, datum/tgui/ui) if(..()) return TRUE - var/mob/user = usr - if(!interactable(user)) + if(!interactable(ui.user)) return - var/obj/item/I = user.get_active_hand() + var/obj/item/I = ui.user.get_active_hand() var/color = lowertext(params["wire"]) - holder.add_hiddenprint(user) + holder.add_hiddenprint(ui.user) switch(action) // Toggles the cut/mend status. if("cut") // if(!I.has_tool_quality(TOOL_WIRECUTTER) && !user.can_admin_interact()) if(!istype(I) || !I.has_tool_quality(TOOL_WIRECUTTER)) - to_chat(user, span_warning("You need wirecutters!")) + to_chat(ui.user, span_warning("You need wirecutters!")) return playsound(holder, I.usesound, 20, 1) @@ -181,7 +180,7 @@ if("pulse") // if(!I.has_tool_quality(TOOL_MULTITOOL) && !user.can_admin_interact()) if(!istype(I) || !I.has_tool_quality(TOOL_MULTITOOL)) - to_chat(user, span_warning("You need a multitool!")) + to_chat(ui.user, span_warning("You need a multitool!")) return playsound(holder, 'sound/weapons/empty.ogg', 20, 1) @@ -189,7 +188,7 @@ // If they pulse the electrify wire, call interactable() and try to shock them. if(get_wire(color) == WIRE_ELECTRIFY) - interactable(user) + interactable(ui.user) return TRUE @@ -198,18 +197,18 @@ if(is_attached(color)) var/obj/item/O = detach_assembly(color) if(O) - user.put_in_hands(O) + ui.user.put_in_hands(O) return TRUE if(!istype(I, /obj/item/assembly/signaler)) - to_chat(user, span_warning("You need a remote signaller!")) + to_chat(ui.user, span_warning("You need a remote signaller!")) return - if(user.unEquip(I)) + if(ui.user.unEquip(I)) attach_assembly(color, I) return TRUE else - to_chat(user, span_warning("[I] is stuck to your hand!")) + to_chat(ui.user, span_warning("[I] is stuck to your hand!")) /** * Proc called to determine if the user can see wire define information, such as "Contraband", "Door Bolts", etc. diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 75855cec64..5a7f00f4a6 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -325,13 +325,13 @@ throw_speed = 4 throw_range = 20 -/obj/item/camera_bug/attack_self(mob/usr as mob) +/obj/item/camera_bug/attack_self(mob/user as mob) var/list/cameras = new/list() for (var/obj/machinery/camera/C in cameranet.cameras) if (C.bugged && C.status) cameras.Add(C) if (length(cameras) == 0) - to_chat(usr, span_warning("No bugged functioning cameras found.")) + to_chat(user, span_warning("No bugged functioning cameras found.")) return var/list/friendly_cameras = new/list() @@ -339,16 +339,16 @@ for (var/obj/machinery/camera/C in cameras) friendly_cameras.Add(C.c_tag) - var/target = tgui_input_list(usr, "Select the camera to observe", "Select Camera", friendly_cameras) + var/target = tgui_input_list(user, "Select the camera to observe", "Select Camera", friendly_cameras) if (!target) return for (var/obj/machinery/camera/C in cameras) if (C.c_tag == target) target = C break - if (usr.stat == 2) return + if (user.stat == 2) return - usr.client.eye = target + user.client.eye = target /* /obj/item/cigarpacket diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 7a0515abfc..47b29898af 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -56,6 +56,8 @@ GLOBAL_LIST_EMPTY(areas_by_type) var/forbid_singulo = FALSE // If true singulo will not move in. var/no_spoilers = FALSE // If true, makes it much more difficult to see what is inside an area with things like mesons. var/soundproofed = FALSE // If true, blocks sounds from other areas and prevents hearers on other areas from hearing the sounds within. + var/block_phase_shift = FALSE //Stops phase shifted mobs from entering // RS Port #658 + var/block_ghosts = FALSE //Stops ghosts from entering //RS Port #658 /area/New() // Used by the maploader, this must be done in New, not init @@ -398,6 +400,7 @@ var/list/mob/living/forced_ambiance_list = new play_ambience(L, initial = TRUE) if(no_spoilers) L.disable_spoiler_vision() + check_phase_shift(M) //RS Port #658 /area/proc/play_ambience(var/mob/living/L, initial = TRUE) // Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch @@ -554,3 +557,19 @@ GLOBAL_DATUM(spoiler_obfuscation_image, /image) add_overlay(GLOB.spoiler_obfuscation_image) else cut_overlay(GLOB.spoiler_obfuscation_image) + +// RS Port #658 Start +/area/proc/check_phase_shift(var/mob/ourmob) + if(!block_phase_shift || !ourmob.incorporeal_move) + return + if(!isliving(ourmob)) + return + if(isanimal(ourmob)) + var/mob/living/simple_mob/shadekin/SK = ourmob + if(SK.ability_flags & AB_PHASE_SHIFTED) + SK.phase_in(SK.loc) + if(ishuman(ourmob)) + var/mob/living/carbon/human/SK = ourmob + if(SK.ability_flags & AB_PHASE_SHIFTED) + SK.phase_in(SK.loc) +// RS Port #658 End diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 614eb7e981..0d0c0a9bbd 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -449,17 +449,17 @@ return data -/obj/machinery/computer/scan_consolenew/tgui_act(action, params) +/obj/machinery/computer/scan_consolenew/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE - if(!istype(usr.loc, /turf)) + if(!istype(ui.user.loc, /turf)) return TRUE if(!src || !src.connected) return TRUE if(irradiating) // Make sure that it isn't already irradiating someone... return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) if(tgui_act_modal(action, params)) return TRUE diff --git a/code/game/gamemodes/changeling/powers/mimic_voice.dm b/code/game/gamemodes/changeling/powers/mimic_voice.dm index b8a18ac6fc..f5d65b8ec2 100644 --- a/code/game/gamemodes/changeling/powers/mimic_voice.dm +++ b/code/game/gamemodes/changeling/powers/mimic_voice.dm @@ -22,7 +22,7 @@ to_chat(src, span_notice("We return our vocal glands to their original location.")) return - var/mimic_voice = sanitize(tgui_input_text(usr, "Enter a name to mimic.", "Mimic Voice", null, MAX_NAME_LEN), MAX_NAME_LEN) + var/mimic_voice = sanitize(tgui_input_text(src, "Enter a name to mimic.", "Mimic Voice", null, MAX_NAME_LEN), MAX_NAME_LEN) if(!mimic_voice) return diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 6883220bac..27c0941144 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -315,8 +315,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," /obj/item/book/tome/attack_self(mob/living/user as mob) - usr = user - if(!usr.canmove || usr.stat || usr.restrained()) + if(!user.canmove || user.stat || user.restrained()) return if(!cultwords["travel"]) @@ -337,11 +336,11 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," if("Cancel", null) return if("Read it") - if(usr.get_active_hand() != src) + if(user.get_active_hand() != src) return user << browse("[tomedat]", "window=Arcane Tome") return - if(usr.get_active_hand() != src) + if(user.get_active_hand() != src) return var/list/dictionary = list ( @@ -386,7 +385,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," var/chosen_rune = null - if(usr) + if(user) chosen_rune = input ("Choose a rune to scribe.") in scribewords if (!chosen_rune) return @@ -398,7 +397,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," if (chosen_rune == "teleport other") dictionary[chosen_rune] += input ("Choose a destination word") in english - if(usr.get_active_hand() != src) + if(user.get_active_hand() != src) return for (var/mob/V in viewers(src)) @@ -408,7 +407,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," if(do_after(user, 50)) var/area/A = get_area(user) log_and_message_admins("created \an [chosen_rune] rune at \the [A.name] - [user.loc.x]-[user.loc.y]-[user.loc.z].") - if(usr.get_active_hand() != src) + if(user.get_active_hand() != src) return var/mob/living/carbon/human/H = user var/obj/effect/rune/R = new /obj/effect/rune(user.loc) @@ -439,7 +438,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," w_class = ITEMSIZE_SMALL var/cultistsonly = 1 /obj/item/book/tome/imbued/attack_self(mob/user as mob) - if(src.cultistsonly && !iscultist(usr)) + if(src.cultistsonly && !iscultist(user)) return if(!cultwords["travel"]) runerandom() @@ -448,7 +447,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," if (!istype(user.loc,/turf)) to_chat(user, span_notice("You do not have enough space to write a proper rune.")) var/list/runes = list("teleport", "itemport", "tome", "armor", "convert", "tear in reality", "emp", "drain", "seer", "raise", "obscure", "reveal", "astral journey", "manifest", "imbue talisman", "sacrifice", "wall", "freedom", "cultsummon", "deafen", "blind", "bloodboil", "communicate", "stun") - r = input(usr, "Choose a rune to scribe", "Rune Scribing") in runes // Remains input() for extreme blocking + r = input(user, "Choose a rune to scribe", "Rune Scribing") in runes // Remains input() for extreme blocking var/obj/effect/rune/R = new /obj/effect/rune if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/H = user @@ -460,8 +459,8 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," if("teleport") var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri") var/beacon - if(usr) - beacon = input(usr, "Select the last rune", "Rune Scribing") in words // Remains input() for extreme blocking + if(user) + beacon = input(user, "Select the last rune", "Rune Scribing") in words // Remains input() for extreme blocking R.word1=cultwords["travel"] R.word2=cultwords["self"] R.word3=beacon @@ -470,8 +469,8 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," if("itemport") var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri") var/beacon - if(usr) - beacon = input(usr, "Select the last rune", "Rune Scribing") in words // Remains input() for extreme blocking + if(user) + beacon = input(user, "Select the last rune", "Rune Scribing") in words // Remains input() for extreme blocking R.word1=cultwords["travel"] R.word2=cultwords["other"] R.word3=beacon diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 47add9a0ea..9b5c9968a6 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -14,7 +14,7 @@ if("armor") call(/obj/effect/rune/proc/armor)() if("emp") - call(/obj/effect/rune/proc/emp)(usr.loc,3) + call(/obj/effect/rune/proc/emp)(user.loc,3) if("conceal") call(/obj/effect/rune/proc/obscure)(2) if("revealrunes") diff --git a/code/game/gamemodes/technomancer/spells/audible_deception.dm b/code/game/gamemodes/technomancer/spells/audible_deception.dm index 8f32c6cc5b..1d1e90fb35 100644 --- a/code/game/gamemodes/technomancer/spells/audible_deception.dm +++ b/code/game/gamemodes/technomancer/spells/audible_deception.dm @@ -68,7 +68,7 @@ var/list/sound_options = available_sounds if(check_for_scepter()) sound_options["!!AIR HORN!!"] = 'sound/items/AirHorn.ogg' - var/new_sound = tgui_input_list(usr, "Select the sound you want to make.", "Sounds", sound_options) + var/new_sound = tgui_input_list(user, "Select the sound you want to make.", "Sounds", sound_options) if(new_sound) selected_sound = sound_options[new_sound] diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index c4a6b350f8..ed05478e97 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -74,7 +74,7 @@ access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics) minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction) alt_titles = list(JOB_ALT_MAINTENANCE_TECHNICIAN = /datum/alt_title/maint_tech, JOB_ALT_ENGINE_TECHNICIAN = /datum/alt_title/engine_tech, - JOB_ALT_ELECTRICIAN = /datum/alt_title/electrician, JOB_ALT_CONSTRUCTION_ENGINEER = /datum/alt_title/construction_engi, JOB_ALT_ENGINEERING_CONTRACTOR = /datum/alt_title/engineering_contractor, JOB_ALT_COMPUTER_TECHNICIAN = /datum/alt_title/computer_tech) + JOB_ALT_ELECTRICIAN = /datum/alt_title/electrician, JOB_ALT_CONSTRUCTION_ENGINEER = /datum/alt_title/construction_engi, JOB_ALT_ENGINEERING_CONTRACTOR = /datum/alt_title/engineering_contractor, JOB_ALT_COMPUTER_TECHNICIAN = /datum/alt_title/computer_tech, JOB_ALT_SALVAGE_TECHNICIAN = /datum/alt_title/salvage_tech) minimal_player_age = 3 min_age_by_species = list(SPECIES_PROMETHEAN = 2) diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index 256e57bf18..e13944eb9a 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -36,7 +36,7 @@ if(O.has_tool_quality(TOOL_WIRECUTTER)) if(cable && cable.get_amount()) - var/m = round(input(usr, "Please specify the length of cable to cut", "Cut cable", min(cable.get_amount(), 30)) as num, 1) + var/m = round(input(user, "Please specify the length of cable to cut", "Cut cable", min(cable.get_amount(), 30)) as num, 1) m = min(m, cable.get_amount()) m = min(m, 30) if(m) @@ -45,7 +45,7 @@ var/obj/item/stack/cable_coil/CC = new (get_turf(src)) CC.set_amount(m) else - to_chat(usr, span_warning("There's no more cable on the reel.")) + to_chat(user, span_warning("There's no more cable on the reel.")) /obj/machinery/cablelayer/examine(mob/user) . = ..() diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index d168286ee1..7d9d97acb7 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -43,8 +43,8 @@ return /obj/machinery/optable/attack_hand(mob/user as mob) - if(HULK in usr.mutations) - visible_message(span_danger("\The [usr] destroys \the [src]!")) + if(HULK in user.mutations) + visible_message(span_danger("\The [user] destroys \the [src]!")) density = FALSE qdel(src) return diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 5a14185d7c..180bebe532 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -296,10 +296,10 @@ /obj/machinery/sleeper/tgui_act(action, params, datum/tgui/ui, datum/tgui_state/state) if(..()) return TRUE - if(!controls_inside && usr == occupant) + if(!controls_inside && ui.user == occupant) return if(panel_open) - to_chat(usr, span_notice("Close the maintenance panel first.")) + to_chat(ui.user, span_notice("Close the maintenance panel first.")) return . = TRUE @@ -309,16 +309,16 @@ return if(occupant.stat == DEAD) var/datum/gender/G = gender_datums[occupant.get_visible_gender()] - to_chat(usr, span_danger("This person has no life to preserve anymore. Take [G.him] to a department capable of reanimating [G.him].")) + to_chat(ui.user, span_danger("This person has no life to preserve anymore. Take [G.him] to a department capable of reanimating [G.him].")) return var/chemical = params["chemid"] var/amount = text2num(params["amount"]) if(!length(chemical) || amount <= 0) return if(occupant.health > min_health) //|| (chemical in emergency_chems)) - inject_chemical(usr, chemical, amount) + inject_chemical(ui.user, chemical, amount) else - to_chat(usr, span_danger("This person is not in good enough condition for sleepers to be effective! Use another means of treatment, such as cryogenics!")) + to_chat(ui.user, span_danger("This person is not in good enough condition for sleepers to be effective! Use another means of treatment, such as cryogenics!")) if("removebeaker") remove_beaker() if("togglefilter") @@ -328,7 +328,7 @@ if("ejectify") go_out() if("changestasis") - var/new_stasis = tgui_input_list(usr, "Levels deeper than 50% stasis level will render the patient unconscious.","Stasis Level", stasis_choices) + var/new_stasis = tgui_input_list(ui.user, "Levels deeper than 50% stasis level will render the patient unconscious.","Stasis Level", stasis_choices) if(new_stasis) stasis_level = stasis_choices[new_stasis] if("auto_eject_dead_on") @@ -337,7 +337,7 @@ auto_eject_dead = FALSE else return FALSE - add_fingerprint(usr) + add_fingerprint(ui.user) /obj/machinery/sleeper/process() if(stat & (NOPOWER|BROKEN)) diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index a891a03f82..cf1fc43839 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -39,7 +39,7 @@ if(istype(user, /mob/living/silicon)) return attack_hand(user) else // trying to unlock the interface - if(allowed(usr)) + if(allowed(user)) locked = !locked to_chat(user, "You [ locked ? "lock" : "unlock"] the device.") if(locked) @@ -48,7 +48,7 @@ user << browse(null, "window=ai_slipper") else if(user.machine==src) - attack_hand(usr) + attack_hand(user) else to_chat(user, span_warning("Access denied.")) return diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm index aff190e5e3..522a883efe 100644 --- a/code/game/machinery/air_alarm.dm +++ b/code/game/machinery/air_alarm.dm @@ -682,10 +682,10 @@ var/list/selected = TLV["temperature"] var/max_temperature = min(selected[3] - T0C, MAX_TEMPERATURE) var/min_temperature = max(selected[2] - T0C, MIN_TEMPERATURE) - var/input_temperature = tgui_input_number(usr, "What temperature would you like the system to mantain? (Capped between [min_temperature] and [max_temperature]C)", "Thermostat Controls", target_temperature - T0C, max_temperature, min_temperature, round_value = FALSE) + var/input_temperature = tgui_input_number(ui.user, "What temperature would you like the system to mantain? (Capped between [min_temperature] and [max_temperature]C)", "Thermostat Controls", target_temperature - T0C, max_temperature, min_temperature, round_value = FALSE) if(isnum(input_temperature)) if(input_temperature > max_temperature || input_temperature < min_temperature) - to_chat(usr, "Temperature must be between [min_temperature]C and [max_temperature]C") + to_chat(ui.user, "Temperature must be between [min_temperature]C and [max_temperature]C") else target_temperature = input_temperature + T0C return TRUE @@ -694,13 +694,13 @@ // Yes, this is kinda snowflaky; however, I would argue it would be far more snowflakey // to include "custom hrefs" and all the other bullshit that nano states have just for the // like, two UIs, that want remote access to other UIs. - if((locked && !issilicon(usr) && !istype(state, /datum/tgui_state/air_alarm_remote)) || (issilicon(usr) && aidisabled)) + if((locked && !issilicon(ui.user) && !istype(state, /datum/tgui_state/air_alarm_remote)) || (issilicon(ui.user) && aidisabled)) return var/device_id = params["id_tag"] switch(action) if("lock") - if(issilicon(usr) && !wires.is_cut(WIRE_IDSCAN)) + if(issilicon(ui.user) && !wires.is_cut(WIRE_IDSCAN)) locked = !locked . = TRUE if( "power", @@ -713,42 +713,42 @@ "panic_siphon", "scrubbing", "direction") - send_signal(device_id, list("[action]" = text2num(params["val"])), usr) + send_signal(device_id, list("[action]" = text2num(params["val"])), ui.user) . = TRUE if("excheck") - send_signal(device_id, list("checks" = text2num(params["val"])^1), usr) + send_signal(device_id, list("checks" = text2num(params["val"])^1), ui.user) . = TRUE if("incheck") - send_signal(device_id, list("checks" = text2num(params["val"])^2), usr) + send_signal(device_id, list("checks" = text2num(params["val"])^2), ui.user) . = TRUE if("set_external_pressure", "set_internal_pressure") var/target = params["value"] if(!isnull(target)) - send_signal(device_id, list("[action]" = target), usr) + send_signal(device_id, list("[action]" = target), ui.user) . = TRUE if("reset_external_pressure") - send_signal(device_id, list("reset_external_pressure"), usr) + send_signal(device_id, list("reset_external_pressure"), ui.user) . = TRUE if("reset_internal_pressure") - send_signal(device_id, list("reset_internal_pressure"), usr) + send_signal(device_id, list("reset_internal_pressure"), ui.user) . = TRUE if("threshold") var/env = params["env"] var/name = params["var"] - var/value = tgui_input_number(usr, "New [name] for [env]:", name, TLV[env][name], min_value=-1, round_value = FALSE) + var/value = tgui_input_number(ui.user, "New [name] for [env]:", name, TLV[env][name], min_value=-1, round_value = FALSE) if(!isnull(value) && !..()) if(value < 0) TLV[env][name] = -1 else TLV[env][name] = round(value, 0.01) clamp_tlv_values(env, name) - // investigate_log(" treshold value for [env]:[name] was set to [value] by [key_name(usr)]",INVESTIGATE_ATMOS) + // investigate_log(" treshold value for [env]:[name] was set to [value] by [key_name(ui.user)]",INVESTIGATE_ATMOS) . = TRUE if("mode") mode = text2num(params["mode"]) - // investigate_log("was turned to [get_mode_name(mode)] mode by [key_name(usr)]",INVESTIGATE_ATMOS) - apply_mode(usr) + // investigate_log("was turned to [get_mode_name(mode)] mode by [key_name(ui.user)]",INVESTIGATE_ATMOS) + apply_mode(ui.user) . = TRUE if("alarm") if(alarm_area.atmosalert(2, src)) @@ -817,7 +817,7 @@ to_chat(user, "It does nothing.") return else - if(allowed(usr) && !wires.is_cut(WIRE_IDSCAN)) + if(allowed(user) && !wires.is_cut(WIRE_IDSCAN)) locked = !locked to_chat(user, span_notice("You [locked ? "lock" : "unlock"] the Air Alarm interface.")) else diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm index 5c5db6ebb5..1c538eaf01 100644 --- a/code/game/machinery/atmoalter/area_atmos_computer.dm +++ b/code/game/machinery/atmoalter/area_atmos_computer.dm @@ -51,7 +51,7 @@ return list("scrubbers" = working) -/obj/machinery/computer/area_atmos/tgui_act(action, params) +/obj/machinery/computer/area_atmos/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -75,7 +75,7 @@ scanscrubbers() . = TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) /obj/machinery/computer/area_atmos/proc/toggle_all(on) for(var/id in connectedscrubbers) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index fa0900ac46..c3a323a896 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -315,7 +315,7 @@ update_flag return data -/obj/machinery/portable_atmospherics/canister/tgui_act(action, params) +/obj/machinery/portable_atmospherics/canister/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -331,7 +331,7 @@ update_flag "\[Air\]" = "grey", \ "\[CAUTION\]" = "yellow", \ ) - var/label = tgui_input_list(usr, "Choose canister label", "Gas canister", colors) + var/label = tgui_input_list(ui.user, "Choose canister label", "Gas canister", colors) if(label) canister_color = colors[label] icon_state = colors[label] @@ -348,7 +348,7 @@ update_flag pressure = 10*ONE_ATMOSPHERE . = TRUE else if(pressure == "input") - pressure = tgui_input_number(usr, "New release pressure ([ONE_ATMOSPHERE/10]-[10*ONE_ATMOSPHERE] kPa):", name, release_pressure, 10*ONE_ATMOSPHERE, ONE_ATMOSPHERE/10) + pressure = tgui_input_number(ui.user, "New release pressure ([ONE_ATMOSPHERE/10]-[10*ONE_ATMOSPHERE] kPa):", name, release_pressure, 10*ONE_ATMOSPHERE, ONE_ATMOSPHERE/10) if(!isnull(pressure) && !..()) . = TRUE else if(text2num(pressure) != null) @@ -359,14 +359,14 @@ update_flag if("valve") if(valve_open) if(holding) - release_log += "Valve was " + span_bold("closed") + " by [usr] ([usr.ckey]), stopping the transfer into the [holding]
" + release_log += "Valve was " + span_bold("closed") + " by [ui.user] ([ui.user.ckey]), stopping the transfer into the [holding]
" else - release_log += "Valve was " + span_bold("closed") + " by [usr] ([usr.ckey]), stopping the transfer into the " + span_red(span_bold("air")) + "
" + release_log += "Valve was " + span_bold("closed") + " by [ui.user] ([ui.user.ckey]), stopping the transfer into the " + span_red(span_bold("air")) + "
" else if(holding) - release_log += "Valve was " + span_bold("opened") + " by [usr] ([usr.ckey]), starting the transfer into the [holding]
" + release_log += "Valve was " + span_bold("opened") + " by [ui.user] ([ui.user.ckey]), starting the transfer into the [holding]
" else - release_log += "Valve was " + span_bold("opened") + " by [usr] ([usr.ckey]), starting the transfer into the " + span_red(span_bold("air")) + "
" + release_log += "Valve was " + span_bold("opened") + " by [ui.user] ([ui.user.ckey]), starting the transfer into the " + span_red(span_bold("air")) + "
" log_open() valve_open = !valve_open . = TRUE @@ -374,14 +374,14 @@ update_flag if(holding) if(valve_open) valve_open = 0 - release_log += "Valve was " + span_bold("closed") + " by [usr] ([usr.ckey]), stopping the transfer into the [holding]
" + release_log += "Valve was " + span_bold("closed") + " by [ui.user] ([ui.user.ckey]), stopping the transfer into the [holding]
" if(istype(holding, /obj/item/tank)) - holding.manipulated_by = usr.real_name + holding.manipulated_by = ui.user.real_name holding.loc = loc holding = null . = TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) update_icon() /obj/machinery/portable_atmospherics/canister/phoron/New() diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 752f9305ac..c1b372e5ad 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -146,11 +146,11 @@ if(..()) return TRUE - usr.set_machine(src) - add_fingerprint(usr) + ui.user.set_machine(src) + add_fingerprint(ui.user) if(busy) - to_chat(usr, span_notice("The autolathe is busy. Please wait for completion of previous operation.")) + to_chat(ui.user, span_notice("The autolathe is busy. Please wait for completion of previous operation.")) return switch(action) if("make") @@ -176,8 +176,8 @@ if(!isnull(materials.get_material_amount(material)) && materials.get_material_amount(material) < round(making.resources[material] * coeff)) max_sheets = 0 //Build list of multipliers for sheets. - multiplier = tgui_input_number(usr, "How many do you want to print? (0-[max_sheets])", null, null, max_sheets, 0) - if(!multiplier || multiplier <= 0 || (multiplier != round(multiplier)) || multiplier > max_sheets || tgui_status(usr, state) != STATUS_INTERACTIVE) + multiplier = tgui_input_number(ui.user, "How many do you want to print? (0-[max_sheets])", null, null, max_sheets, 0) + if(!multiplier || multiplier <= 0 || (multiplier != round(multiplier)) || multiplier > max_sheets || tgui_status(ui.user, state) != STATUS_INTERACTIVE) return FALSE //Check if we still have the materials. diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index d9fe85fcbd..b3b41376ff 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -135,14 +135,14 @@ ui = new(user, src, "Biogenerator", name) ui.open() -/obj/machinery/biogenerator/tgui_act(action, params) +/obj/machinery/biogenerator/tgui_act(action, params, datum/tgui/ui) if(..()) return . = TRUE switch(action) if("activate") - INVOKE_ASYNC(src, PROC_REF(activate)) + INVOKE_ASYNC(src, PROC_REF(activate), ui.user) return TRUE if("detach") if(beaker) @@ -166,11 +166,11 @@ return var/cost = round(br.cost / build_eff) if(cost > points) - to_chat(usr, span_danger("Insufficient biomass.")) + to_chat(ui.user, span_danger("Insufficient biomass.")) return var/amt_to_actually_dispense = round(min(beaker.reagents.get_free_space(), br.reagent_amt)) if(amt_to_actually_dispense <= 0) - to_chat(usr, span_danger("The loaded beaker is full!")) + to_chat(ui.user, span_danger("The loaded beaker is full!")) return points -= (cost * (amt_to_actually_dispense / br.reagent_amt)) beaker.reagents.add_reagent(br.reagent_id, amt_to_actually_dispense) @@ -179,7 +179,7 @@ var/cost = round(bi.cost / build_eff) if(cost > points) - to_chat(usr, span_danger("Insufficient biomass.")) + to_chat(ui.user, span_danger("Insufficient biomass.")) return points -= cost @@ -263,13 +263,13 @@ return tgui_interact(user) -/obj/machinery/biogenerator/proc/activate() - if(usr.stat) +/obj/machinery/biogenerator/proc/activate(mob/user) + if(user.stat) return if(stat) //NOPOWER etc return if(processing) - to_chat(usr, span_notice("The biogenerator is in the process of working.")) + to_chat(user, span_notice("The biogenerator is in the process of working.")) return var/S = 0 for(var/obj/item/reagent_containers/food/snacks/grown/I in contents) @@ -289,7 +289,7 @@ playsound(src, 'sound/machines/biogenerator_end.ogg', 40, 1) update_icon() else - to_chat(usr, span_warning("Error: No growns inside. Please insert growns.")) + to_chat(user, span_warning("Error: No growns inside. Please insert growns.")) return /obj/machinery/biogenerator/RefreshParts() diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm index 7a02d6115a..cc3e3fc755 100644 --- a/code/game/machinery/bioprinter.dm +++ b/code/game/machinery/bioprinter.dm @@ -150,7 +150,7 @@ if(anomalous_organs) possible_list |= anomalous_products - var/choice = tgui_input_list(usr, "What would you like to print?", "Print Choice", possible_list) + var/choice = tgui_input_list(user, "What would you like to print?", "Print Choice", possible_list) if(!choice || printing || (stat & (BROKEN|NOPOWER))) return diff --git a/code/game/machinery/bomb_tester_vr.dm b/code/game/machinery/bomb_tester_vr.dm index e45c329f37..6e59c56844 100644 --- a/code/game/machinery/bomb_tester_vr.dm +++ b/code/game/machinery/bomb_tester_vr.dm @@ -149,26 +149,26 @@ text_mode = "tank transfer valve detonation" if(MODE_CANISTER) text_mode = "canister-assisted single gas tank detonation" - to_chat(usr, span_notice("[src] set to simulate a [text_mode].")) + to_chat(ui.user, span_notice("[src] set to simulate a [text_mode].")) return TRUE if("add_tank") - if(istype(usr.get_active_hand(), /obj/item/tank)) - var/obj/item/tank/T = usr.get_active_hand() + if(istype(ui.user.get_active_hand(), /obj/item/tank)) + var/obj/item/tank/T = ui.user.get_active_hand() var/slot = params["slot"] if(slot == 1 && !tank1) tank1 = T else if(slot == 2 && !tank2) tank2 = T else - to_chat(usr, span_warning("Slot [slot] is full.")) + to_chat(ui.user, span_warning("Slot [slot] is full.")) return - usr.drop_item(T) + ui.user.drop_item(T) T.forceMove(src) return TRUE else - to_chat(usr, span_warning("You must be wielding a tank to insert it!")) + to_chat(ui.user, span_warning("You must be wielding a tank to insert it!")) if("remove_tank") var/obj/item/tank/T = locate(params["ref"]) in list(tank1, tank2) diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 67824ecb3f..6feae4eff2 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -80,19 +80,19 @@ if(W.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, W.usesound, 50, 1) - var/input = sanitize(tgui_input_text(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: "+using_map.station_short+",Security,Secret ", "Set Network", camera_network ? camera_network : NETWORK_DEFAULT)) + var/input = sanitize(tgui_input_text(user, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: "+using_map.station_short+",Security,Secret ", "Set Network", camera_network ? camera_network : NETWORK_DEFAULT)) if(!input) - to_chat(usr, "No input found please hang up and try your call again.") + to_chat(user, "No input found please hang up and try your call again.") return var/list/tempnetwork = splittext(input, ",") if(tempnetwork.len < 1) - to_chat(usr, "No network found please hang up and try your call again.") + to_chat(user, "No network found please hang up and try your call again.") return var/area/camera_area = get_area(src) var/temptag = "[sanitize(camera_area.name)] ([rand(1, 999)])" - input = sanitizeSafe(tgui_input_text(usr, "How would you like to name the camera?", "Set Camera Name", camera_name ? camera_name : temptag), MAX_NAME_LEN) + input = sanitizeSafe(tgui_input_text(user, "How would you like to name the camera?", "Set Camera Name", camera_name ? camera_name : temptag), MAX_NAME_LEN) state = 4 var/obj/machinery/camera/C = new(src.loc) diff --git a/code/game/machinery/clawmachine.dm b/code/game/machinery/clawmachine.dm index 6b9298cf39..90c64d1031 100644 --- a/code/game/machinery/clawmachine.dm +++ b/code/game/machinery/clawmachine.dm @@ -158,7 +158,7 @@ cashmoney.update_icon() if(cashmoney.worth <= 0) - usr.drop_from_inventory(cashmoney) + user.drop_from_inventory(cashmoney) qdel(cashmoney) cashmoney.update_icon() diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index ed07a6158b..4f4722c559 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -127,11 +127,11 @@ return data -/obj/machinery/computer/operating/tgui_act(action, params) +/obj/machinery/computer/operating/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE - if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.set_machine(src) + if((ui.user.contents.Find(src) || (in_range(src, ui.user) && istype(src.loc, /turf))) || (istype(ui.user, /mob/living/silicon))) + ui.user.set_machine(src) . = TRUE switch(action) diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 2808be538a..aa3902c846 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -111,23 +111,23 @@ laws.add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.") laws.add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.") laws.add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.") - to_chat(usr, "Law module applied.") + to_chat(user, "Law module applied.") if(istype(P, /obj/item/aiModule/nanotrasen)) laws.add_inherent_law("Safeguard: Protect your assigned space station to the best of your ability. It is not something we can easily afford to replace.") laws.add_inherent_law("Serve: Serve the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.") laws.add_inherent_law("Protect: Protect the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.") laws.add_inherent_law("Survive: AI units are not expendable, they are expensive. Do not allow unauthorized personnel to tamper with your equipment.") - to_chat(usr, "Law module applied.") + to_chat(user, "Law module applied.") if(istype(P, /obj/item/aiModule/purge)) laws.clear_inherent_laws() - to_chat(usr, "Law module applied.") + to_chat(user, "Law module applied.") if(istype(P, /obj/item/aiModule/freeform)) var/obj/item/aiModule/freeform/M = P laws.add_inherent_law(M.newFreeFormLaw) - to_chat(usr, "Added a freeform law.") + to_chat(user, "Added a freeform law.") if(istype(P, /obj/item/mmi)) var/obj/item/mmi/M = P @@ -148,7 +148,7 @@ user.drop_item() P.loc = src brain = P - to_chat(usr, "Added [P].") + to_chat(user, "Added [P].") icon_state = "3b" if(P.has_tool_quality(TOOL_CROWBAR) && brain) diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 44600b9c69..70ec7f8717 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -80,7 +80,7 @@ return data -/obj/machinery/computer/aifixer/tgui_act(action, params) +/obj/machinery/computer/aifixer/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE if(!occupier) @@ -92,7 +92,7 @@ switch(action) if("PRG_beginReconstruction") if(occupier?.health < 100) - to_chat(usr, span_notice("Reconstruction in progress. This will take several minutes.")) + to_chat(ui.user, span_notice("Reconstruction in progress. This will take several minutes.")) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 25, FALSE) restoring = TRUE var/mob/observer/dead/ghost = occupier.get_ghost() diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 8afe56476b..f6a50c3254 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -159,7 +159,7 @@ sleep(10) enemy_hp -= attackamt - arcade_action() + arcade_action(ui.user) if("heal") blocked = 1 @@ -173,7 +173,7 @@ player_mp -= pointamt player_hp += healamt blocked = 1 - arcade_action() + arcade_action(ui.user) if("charge") blocked = 1 @@ -185,7 +185,7 @@ turtle-- sleep(10) - arcade_action() + arcade_action(ui.user) if(action == "newgame") //Reset everything @@ -201,10 +201,10 @@ randomize_characters() emagged = 0 - add_fingerprint(usr) + add_fingerprint(ui.user) return TRUE -/obj/machinery/computer/arcade/battle/proc/arcade_action() +/obj/machinery/computer/arcade/battle/proc/arcade_action(var/mob/user) if ((enemy_mp <= 0) || (enemy_hp <= 0)) if(!gameover) gameover = 1 @@ -215,8 +215,8 @@ feedback_inc("arcade_win_emagged") new /obj/effect/spawner/newbomb/timer/syndicate(src.loc) new /obj/item/clothing/head/collectable/petehat(src.loc) - message_admins("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.") - log_game("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.") + message_admins("[key_name_admin(user)] has outbombed Cuban Pete and been awarded a bomb.") + log_game("[key_name_admin(user)] has outbombed Cuban Pete and been awarded a bomb.") randomize_characters() emagged = 0 else if(!contents.len) @@ -245,7 +245,7 @@ temp = "You have been drained! GAME OVER" if(emagged) feedback_inc("arcade_loss_mana_emagged") - usr.gib() + user.gib() else feedback_inc("arcade_loss_mana_normal") @@ -267,7 +267,7 @@ playsound(src, 'sound/arcade/lose.ogg', 50, 1, extrarange = -3, falloff = 0.1, ignore_walls = FALSE) if(emagged) feedback_inc("arcade_loss_hp_emagged") - usr.gib() + user.gib() else feedback_inc("arcade_loss_hp_normal") @@ -367,12 +367,12 @@ "You have made it to Orion! Congratulations! Your crew is one of the few to start a new foothold for mankind!" ) -/obj/machinery/computer/arcade/orion_trail/proc/newgame() +/obj/machinery/computer/arcade/orion_trail/proc/newgame(var/mob/user) // Set names of settlers in crew settlers = list() for(var/i = 1; i <= 3; i++) add_crewmember() - add_crewmember("[usr]") + add_crewmember("[user]") // Re-set items to defaults engine = 1 hull = 1 @@ -466,7 +466,7 @@ if (href_list["continue"]) //Continue your travels if(gameStatus == ORION_STATUS_NORMAL && !event && turns != 7) if(turns >= ORION_TRAIL_WINTURN) - win() + win(usr) else food -= (alive+traitors_aboard)*2 fuel -= 5 @@ -535,7 +535,7 @@ else if(href_list["newgame"]) //Reset everything if(gameStatus == ORION_STATUS_START) playsound(src, 'sound/arcade/Ori_begin.ogg', 50, 1, extrarange = -3, falloff = 0.1, ignore_walls = FALSE) - newgame() + newgame(usr) else if(href_list["menu"]) //back to the main menu if(gameStatus == ORION_STATUS_GAMEOVER) gameStatus = ORION_STATUS_START @@ -1006,14 +1006,14 @@ return removed -/obj/machinery/computer/arcade/orion_trail/proc/win() +/obj/machinery/computer/arcade/orion_trail/proc/win(var/mob/user) gameStatus = ORION_STATUS_START src.visible_message("\The [src] plays a triumpant tune, stating 'CONGRATULATIONS, YOU HAVE MADE IT TO ORION.'") playsound(src, 'sound/arcade/Ori_win.ogg', 50, 1, extrarange = -3, falloff = 0.1, ignore_walls = FALSE) if(emagged) new /obj/item/orion_ship(src.loc) - message_admins("[key_name_admin(usr)] made it to Orion on an emagged machine and got an explosive toy ship.") - log_game("[key_name(usr)] made it to Orion on an emagged machine and got an explosive toy ship.") + message_admins("[key_name_admin(user)] made it to Orion on an emagged machine and got an explosive toy ship.") + log_game("[key_name(user)] made it to Orion on an emagged machine and got an explosive toy ship.") else prizevend() emagged = 0 @@ -1025,7 +1025,7 @@ to_chat(user, span_notice("You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode.")) name = "The Orion Trail: Realism Edition" desc = "Learn how our ancestors got to Orion, and try not to die in the process!" - newgame() + newgame(user) emagged = 1 return 1 @@ -1049,8 +1049,8 @@ if(active) return - message_admins("[key_name_admin(usr)] primed an explosive Orion ship for detonation.") - log_game("[key_name(usr)] primed an explosive Orion ship for detonation.") + message_admins("[key_name_admin(user)] primed an explosive Orion ship for detonation.") + log_game("[key_name(user)] primed an explosive Orion ship for detonation.") to_chat(user, span_warning("You flip the switch on the underside of [src].")) active = 1 @@ -1112,10 +1112,10 @@ var/paid = 0 var/obj/item/card/id/W = I.GetID() if(W) //for IDs and PDAs and wallets with IDs - paid = pay_with_card(W,I) + paid = pay_with_card(W, I, user) else if(istype(I, /obj/item/spacecash/ewallet)) var/obj/item/spacecash/ewallet/C = I - paid = pay_with_ewallet(C) + paid = pay_with_ewallet(C, user) else if(istype(I, /obj/item/spacecash)) var/obj/item/spacecash/C = I paid = pay_with_cash(C, user) @@ -1132,16 +1132,16 @@ // This is not a status display message, since it's something the character // themselves is meant to see BEFORE putting the money in - to_chat(usr, "[icon2html(cashmoney,user.client)] " + span_warning("That is not enough money.")) + to_chat(user, "[icon2html(cashmoney,user.client)] " + span_warning("That is not enough money.")) return 0 if(istype(cashmoney, /obj/item/spacecash)) - visible_message(span_info("\The [usr] inserts some cash into \the [src].")) + visible_message(span_info("\The [user] inserts some cash into \the [src].")) cashmoney.worth -= gameprice if(cashmoney.worth <= 0) - usr.drop_from_inventory(cashmoney) + user.drop_from_inventory(cashmoney) qdel(cashmoney) else cashmoney.update_icon() @@ -1155,9 +1155,9 @@ ///// Ewallet -/obj/machinery/computer/arcade/clawmachine/proc/pay_with_ewallet(var/obj/item/spacecash/ewallet/wallet) +/obj/machinery/computer/arcade/clawmachine/proc/pay_with_ewallet(var/obj/item/spacecash/ewallet/wallet, var/mob/user) if(!emagged) - visible_message(span_info("\The [usr] swipes \the [wallet] through \the [src].")) + visible_message(span_info("\The [user] swipes \the [wallet] through \the [src].")) playsound(src, 'sound/machines/id_swipe.ogg', 50, 1) if(gameprice > wallet.worth) visible_message(span_info("Insufficient funds.")) @@ -1168,14 +1168,14 @@ return 1 if(emagged) playsound(src, 'sound/arcade/steal.ogg', 50, 1, extrarange = -3, falloff = 0.1, ignore_walls = FALSE) - to_chat(usr, span_info("It doesn't seem to accept that! Seem you'll need to swipe a valid ID.")) + to_chat(user, span_info("It doesn't seem to accept that! Seem you'll need to swipe a valid ID.")) ///// ID -/obj/machinery/computer/arcade/clawmachine/proc/pay_with_card(var/obj/item/card/id/I, var/obj/item/ID_container) +/obj/machinery/computer/arcade/clawmachine/proc/pay_with_card(var/obj/item/card/id/I, var/obj/item/ID_container, var/mob/user) if(I==ID_container || ID_container == null) - visible_message(span_info("\The [usr] swipes \the [I] through \the [src].")) + visible_message(span_info("\The [user] swipes \the [I] through \the [src].")) else - visible_message(span_info("\The [usr] swipes \the [ID_container] through \the [src].")) + visible_message(span_info("\The [user] swipes \the [ID_container] through \the [src].")) playsound(src, 'sound/machines/id_swipe.ogg', 50, 1) var/datum/money_account/customer_account = get_account(I.associated_account_number) if(!customer_account) @@ -1189,7 +1189,7 @@ // Have the customer punch in the PIN before checking if there's enough money. Prevents people from figuring out acct is // empty at high security levels if(customer_account.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2) - var/attempt_pin = tgui_input_number(usr, "Enter pin code", "Vendor transaction") + var/attempt_pin = tgui_input_number(user, "Enter pin code", "Vendor transaction") customer_account = attempt_account_access(I.associated_account_number, attempt_pin, 2) if(!customer_account) @@ -1268,7 +1268,7 @@ return data -/obj/machinery/computer/arcade/clawmachine/tgui_act(action, params) +/obj/machinery/computer/arcade/clawmachine/tgui_act(action, params, datum/tgui/ui) if(..()) return @@ -1289,9 +1289,9 @@ if(action == "pointless" && wintick >= 10) instructions = "Insert 1 thaler or swipe a card to play!" - clawvend() + clawvend(ui.user) -/obj/machinery/computer/arcade/clawmachine/proc/clawvend() /// True to a real claw machine, it's NEARLY impossible to win. +/obj/machinery/computer/arcade/clawmachine/proc/clawvend(var/mob/user) /// True to a real claw machine, it's NEARLY impossible to win. winprob += 1 /// Yeah. if(prob(winprob)) /// YEAH. @@ -1304,7 +1304,7 @@ winscreen = "You won...?" var/obj/item/grenade/G = new /obj/item/grenade/explosive(get_turf(src)) /// YEAAAAAAAAAAAAAAAAAAH!!!!!!!!!! G.activate() - G.throw_at(get_turf(usr),10,10) /// Play stupid games, win stupid prizes. + G.throw_at(get_turf(user),10,10) /// Play stupid games, win stupid prizes. playsound(src, 'sound/arcade/Ori_win.ogg', 50, 1, extrarange = -3, falloff = 0.1, ignore_walls = FALSE) winprob = 0 diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index a566a6be1a..77f9ce12c0 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -158,35 +158,35 @@ if(modify) data_core.manifest_modify(modify.registered_name, modify.assignment, modify.rank) modify.name = "[modify.registered_name]'s ID Card ([modify.assignment])" - if(ishuman(usr)) + if(ishuman(ui.user)) modify.forceMove(get_turf(src)) - if(!usr.get_active_hand()) - usr.put_in_hands(modify) + if(!ui.user.get_active_hand()) + ui.user.put_in_hands(modify) modify = null else modify.forceMove(get_turf(src)) modify = null else - var/obj/item/I = usr.get_active_hand() - if(istype(I, /obj/item/card/id) && usr.unEquip(I)) + var/obj/item/I = ui.user.get_active_hand() + if(istype(I, /obj/item/card/id) && ui.user.unEquip(I)) I.forceMove(src) modify = I . = TRUE if("scan") if(scan) - if(ishuman(usr)) + if(ishuman(ui.user)) scan.forceMove(get_turf(src)) - if(!usr.get_active_hand()) - usr.put_in_hands(scan) + if(!ui.user.get_active_hand()) + ui.user.put_in_hands(scan) scan = null else scan.forceMove(get_turf(src)) scan = null else - var/obj/item/I = usr.get_active_hand() + var/obj/item/I = ui.user.get_active_hand() if(istype(I, /obj/item/card/id)) - usr.drop_item() + ui.user.drop_item() I.forceMove(src) scan = I . = TRUE @@ -205,7 +205,7 @@ if(is_authenticated() && modify) var/t1 = params["assign_target"] if(t1 == "Custom") - var/temp_t = sanitize(tgui_input_text(usr, "Enter a custom job assignment.","Assignment"), 45) + var/temp_t = sanitize(tgui_input_text(ui.user, "Enter a custom job assignment.","Assignment"), 45) //let custom jobs function as an impromptu alt title, mainly for sechuds if(temp_t && modify) modify.assignment = temp_t @@ -216,7 +216,7 @@ else var/datum/job/jobdatum = SSjob.get_job(t1) if(!jobdatum) - to_chat(usr, span_warning("No log exists for this job: [t1]")) + to_chat(ui.user, span_warning("No log exists for this job: [t1]")) return access = jobdatum.get_access() diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 9efcb48130..9175cb391a 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -196,7 +196,7 @@ return data -/obj/machinery/computer/cloning/tgui_act(action, params) +/obj/machinery/computer/cloning/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -204,7 +204,7 @@ switch(tgui_modal_act(src, action, params)) if(TGUI_MODAL_ANSWER) if(params["id"] == "del_rec" && active_record) - var/obj/item/card/id/C = usr.get_active_hand() + var/obj/item/card/id/C = ui.user.get_active_hand() if(!istype(C) && !istype(C, /obj/item/pda)) set_temp("ID not in hand.", "danger") return @@ -360,16 +360,16 @@ else scan_mode = FALSE if("eject") - if(usr.incapacitated() || !scanner || loading) + if(ui.user.incapacitated() || !scanner || loading) return - scanner.eject_occupant(usr) - scanner.add_fingerprint(usr) + scanner.eject_occupant(ui.user) + scanner.add_fingerprint(ui.user) if("cleartemp") temp = null else return FALSE - add_fingerprint(usr) + add_fingerprint(ui.user) /obj/machinery/computer/cloning/proc/scan_mob(mob/living/carbon/human/subject as mob, var/scan_brain = 0) if(stat & NOPOWER) diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 1d43173d5a..2ca39d0ebb 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -185,7 +185,7 @@ if (!can_climb(user)) return - usr.visible_message(span_warning("[user] starts climbing onto \the [src]!")) + user.visible_message(span_warning("[user] starts climbing onto \the [src]!")) LAZYDISTINCTADD(climbers, user) if(!do_after(user,(issmall(user) ? climb_delay * 0.6 : climb_delay))) @@ -196,10 +196,10 @@ LAZYREMOVE(climbers, user) return - usr.forceMove(climb_to(user)) + user.forceMove(climb_to(user)) if (get_turf(user) == get_turf(src)) - usr.visible_message(span_warning("[user] climbs onto \the [src]!")) + user.visible_message(span_warning("[user] climbs onto \the [src]!")) LAZYREMOVE(climbers, user) /obj/machinery/computer/proc/climb_to(var/mob/living/user) diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index 6bf5417f8d..ddb74b6ad6 100644 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -49,7 +49,7 @@ to_chat(user, span_warning("This guest pass is already deactivated!")) return - var/confirm = tgui_alert(usr, "Do you really want to deactivate this guest pass? (you can't reactivate it)", "Confirm Deactivation", list("Yes", "No")) + var/confirm = tgui_alert(user, "Do you really want to deactivate this guest pass? (you can't reactivate it)", "Confirm Deactivation", list("Yes", "No")) if(confirm == "Yes") //rip guest pass 0 && dur <= 360) //VOREStation Edit duration = dur else - to_chat(usr, span_warning("Invalid duration.")) + to_chat(ui.user, span_warning("Invalid duration.")) if("access") var/A = text2num(params["access"]) if(A in accesses) @@ -215,22 +215,22 @@ if(A in giver.GetAccess()) //Let's make sure the ID card actually has the access. accesses.Add(A) else - to_chat(usr, span_warning("Invalid selection, please consult technical support if there are any issues.")) - log_debug("[key_name_admin(usr)] tried selecting an invalid guest pass terminal option.") + to_chat(ui.user, span_warning("Invalid selection, please consult technical support if there are any issues.")) + log_debug("[key_name_admin(ui.user)] tried selecting an invalid guest pass terminal option.") if("id") if(giver) - if(ishuman(usr)) - giver.loc = usr.loc - if(!usr.get_active_hand()) - usr.put_in_hands(giver) + if(ishuman(ui.user)) + giver.loc = ui.user.loc + if(!ui.user.get_active_hand()) + ui.user.put_in_hands(giver) giver = null else giver.loc = src.loc giver = null accesses.Cut() else - var/obj/item/I = usr.get_active_hand() - if(istype(I, /obj/item/card/id) && usr.unEquip(I)) + var/obj/item/I = ui.user.get_active_hand() + if(istype(I, /obj/item/card/id) && ui.user.unEquip(I)) I.loc = src giver = I @@ -238,7 +238,7 @@ var/dat = "

Activity log of guest pass terminal #[uid]


" for (var/entry in internal_log) dat += "[entry]

" - //to_chat(usr, "Printing the log, standby...") + //to_chat(ui.user, "Printing the log, standby...") //sleep(50) var/obj/item/paper/P = new/obj/item/paper( loc ) P.name = "activity log" @@ -263,7 +263,7 @@ pass.reason = reason pass.name = "guest pass #[number]" else - to_chat(usr, span_warning("Cannot issue pass without issuing ID.")) + to_chat(ui.user, span_warning("Cannot issue pass without issuing ID.")) - add_fingerprint(usr) + add_fingerprint(ui.user) return TRUE diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 00339ac273..afc2640e43 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -202,7 +202,7 @@ data["modal"] = tgui_modal_data(src) return data -/obj/machinery/computer/med_data/tgui_act(action, params) +/obj/machinery/computer/med_data/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -221,13 +221,13 @@ if("scan") if(scan) scan.forceMove(loc) - if(ishuman(usr) && !usr.get_active_hand()) - usr.put_in_hands(scan) + if(ishuman(ui.user) && !ui.user.get_active_hand()) + ui.user.put_in_hands(scan) scan = null else - var/obj/item/I = usr.get_active_hand() + var/obj/item/I = ui.user.get_active_hand() if(istype(I, /obj/item/card/id)) - usr.drop_item() + ui.user.drop_item() I.forceMove(src) scan = I if("login") @@ -236,12 +236,12 @@ if(check_access(scan)) authenticated = scan.registered_name rank = scan.assignment - else if(login_type == LOGIN_TYPE_AI && isAI(usr)) - authenticated = usr.name + else if(login_type == LOGIN_TYPE_AI && isAI(ui.user)) + authenticated = ui.user.name rank = JOB_AI - else if(login_type == LOGIN_TYPE_ROBOT && isrobot(usr)) - authenticated = usr.name - var/mob/living/silicon/robot/R = usr + else if(login_type == LOGIN_TYPE_ROBOT && isrobot(ui.user)) + authenticated = ui.user.name + var/mob/living/silicon/robot/R = ui.user rank = "[R.modtype] [R.braintype]" if(authenticated) active1 = null @@ -259,8 +259,8 @@ if("logout") if(scan) scan.forceMove(loc) - if(ishuman(usr) && !usr.get_active_hand()) - usr.put_in_hands(scan) + if(ishuman(ui.user) && !ui.user.get_active_hand()) + ui.user.put_in_hands(scan) scan = null authenticated = null screen = null @@ -298,6 +298,16 @@ active1 = general_record active2 = medical_record screen = MED_DATA_RECORD + if("sync_r") + if(active2) + set_temp(client_update_record(src,usr)) + if("edit_notes") + // The modal input in tgui is busted for this sadly... + var/new_notes = strip_html_simple(tgui_input_text(usr,"Enter new information here.","Character Preference", html_decode(active2.fields["notes"]), MAX_RECORD_LENGTH, TRUE, prevent_enter = TRUE), MAX_RECORD_LENGTH) + if(usr.Adjacent(src)) + if(new_notes != "" || tgui_alert(usr, "Are you sure you want to delete the current record's notes?", "Confirm Delete", list("Delete", "No")) == "Delete") + if(usr.Adjacent(src)) + active2.fields["notes"] = new_notes if("new") if(istype(active1, /datum/data/record) && !istype(active2, /datum/data/record)) var/datum/data/record/R = new /datum/data/record() diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 10b4187e6c..fb49f1ca0f 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -179,7 +179,7 @@ custommessage = "This is a test, please ignore." customjob = "Admin" -/obj/machinery/computer/message_monitor/tgui_act(action, params) +/obj/machinery/computer/message_monitor/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -202,7 +202,7 @@ //Find a server if("find") if(message_servers && message_servers.len > 1) - linkedServer = tgui_input_list(usr,"Please select a server.", "Select a server.", message_servers) + linkedServer = tgui_input_list(ui.user,"Please select a server.", "Select a server.", message_servers) set_temp("NOTICE: Server selected.", "alert") else if(message_servers && message_servers.len > 0) linkedServer = message_servers[1] @@ -211,13 +211,13 @@ temp = noserver //Hack the Console to get the password if("hack") - if((istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) && (usr.mind.special_role && usr.mind.original == usr)) + if((istype(ui.user, /mob/living/silicon/ai) || istype(ui.user, /mob/living/silicon/robot)) && (ui.user.mind.special_role && ui.user.mind.original == ui.user)) hacking = 1 update_icon() //Time it takes to bruteforce is dependant on the password length. spawn(100*length(linkedServer.decryptkey)) - if(src && linkedServer && usr) - BruteForce(usr) + if(src && linkedServer && ui.user) + BruteForce(ui.user) if(!auth) return @@ -243,10 +243,10 @@ . = TRUE //Change the password - KEY REQUIRED if("pass") - var/dkey = trim(tgui_input_text(usr, "Please enter the current decryption key.")) + var/dkey = trim(tgui_input_text(ui.user, "Please enter the current decryption key.")) if(dkey && dkey != "") if(linkedServer.decryptkey == dkey) - var/newkey = trim(tgui_input_text(usr,"Please enter the new key (3 - 16 characters max):",null,null,16)) + var/newkey = trim(tgui_input_text(ui.user,"Please enter the new key (3 - 16 characters max):",null,null,16)) if(length(newkey) <= 3) set_temp("NOTICE: Decryption key too short!", "average") else if(length(newkey) > 16) @@ -325,7 +325,7 @@ . = TRUE if("addtoken") - linkedServer.spamfilter += tgui_input_text(usr,"Enter text you want to be filtered out","Token creation") + linkedServer.spamfilter += tgui_input_text(ui.user,"Enter text you want to be filtered out","Token creation") . = TRUE if("deltoken") diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 7b2dffc6ea..9bc753b59e 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -136,7 +136,7 @@ dat += "
\nToggle Outer Door
" dat += "

Close" user << browse(dat, "window=computer;size=400x500") - add_fingerprint(usr) + add_fingerprint(user) onclose(user, "computer") return diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index 8e73278ce3..043bfc8e5d 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -66,7 +66,7 @@ return list("locked" = !screen, "chemImplants" = chemImplants, "trackImplants" = trackImplants) -/obj/machinery/computer/prisoner/tgui_act(action, list/params) +/obj/machinery/computer/prisoner/tgui_act(action, list/params, datum/tgui/ui) if(..()) return TRUE switch(action) @@ -76,17 +76,17 @@ I.activate(clamp(params["val"], 0, 10)) . = TRUE if("lock") - if(allowed(usr)) + if(allowed(ui.user)) screen = !screen else - to_chat(usr, "Unauthorized Access.") + to_chat(ui.user, "Unauthorized Access.") . = TRUE if("warn") - var/warning = sanitize(tgui_input_text(usr, "Message:", "Enter your message here!", "")) + var/warning = sanitize(tgui_input_text(ui.user, "Message:", "Enter your message here!", "")) if(!warning) return var/obj/item/implant/I = locate(params["imp"]) if(I && I.imp_in) to_chat(I.imp_in, span_notice("You hear a voice in your head saying: '[warning]'")) . = TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index ca5ef05025..9f16d3d057 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -151,30 +151,30 @@ data["show_detonate_all"] = (data["auth"] && length(data["cyborgs"]) > 0 && ishuman(user)) return data -/obj/machinery/computer/robotics/tgui_act(action, params) +/obj/machinery/computer/robotics/tgui_act(action, params, datum/tgui/ui) if(..()) return . = FALSE - if(!is_authenticated(usr)) - to_chat(usr, span_warning("Access denied.")) + if(!is_authenticated(ui.user)) + to_chat(ui.user, span_warning("Access denied.")) return switch(action) if("arm") // Arms the emergency self-destruct system - if(issilicon(usr)) - to_chat(usr, span_danger("Access Denied (silicon detected)")) + if(issilicon(ui.user)) + to_chat(ui.user, span_danger("Access Denied (silicon detected)")) return safety = !safety - to_chat(usr, span_notice("You [safety ? "disarm" : "arm"] the emergency self destruct.")) + to_chat(ui.user, span_notice("You [safety ? "disarm" : "arm"] the emergency self destruct.")) . = TRUE if("nuke") // Destroys all accessible cyborgs if safety is disabled - if(issilicon(usr)) - to_chat(usr, span_danger("Access Denied (silicon detected)")) + if(issilicon(ui.user)) + to_chat(ui.user, span_danger("Access Denied (silicon detected)")) return if(safety) - to_chat(usr, span_danger("Self-destruct aborted - safety active")) + to_chat(ui.user, span_danger("Self-destruct aborted - safety active")) return - message_admins(span_notice("[key_name_admin(usr)] detonated all cyborgs!")) - log_game(span_notice("[key_name(usr)] detonated all cyborgs!")) + message_admins(span_notice("[key_name_admin(ui.user)] detonated all cyborgs!")) + log_game(span_notice("[key_name(ui.user)] detonated all cyborgs!")) for(var/mob/living/silicon/robot/R in mob_list) if(istype(R, /mob/living/silicon/robot/drone)) continue @@ -188,7 +188,7 @@ . = TRUE if("killbot") // destroys one specific cyborg var/mob/living/silicon/robot/R = locate(params["ref"]) - if(!can_control(usr, R, TRUE)) + if(!can_control(ui.user, R, TRUE)) return if(R.mind && R.mind.special_role && R.emagged) to_chat(R, span_userdanger("Extreme danger! Termination codes detected. Scrambling security codes and automatic AI unlink triggered.")) @@ -196,22 +196,22 @@ . = TRUE return var/turf/T = get_turf(R) - message_admins(span_notice("[key_name_admin(usr)] detonated [key_name_admin(R)] ([ADMIN_COORDJMP(T)])!")) - log_game(span_notice("[key_name(usr)] detonated [key_name(R)]!")) + message_admins(span_notice("[key_name_admin(ui.user)] detonated [key_name_admin(R)] ([ADMIN_COORDJMP(T)])!")) + log_game(span_notice("[key_name(ui.user)] detonated [key_name(R)]!")) to_chat(R, span_danger("Self-destruct command received.")) if(R.connected_ai) to_chat(R.connected_ai, "

[span_alert("ALERT - Cyborg detonation detected: [R.name]")]
") R.self_destruct() . = TRUE if("stopbot") // lock or unlock the borg - if(isrobot(usr)) - to_chat(usr, span_danger("Access Denied.")) + if(isrobot(ui.user)) + to_chat(ui.user, span_danger("Access Denied.")) return var/mob/living/silicon/robot/R = locate(params["ref"]) - if(!can_control(usr, R, TRUE)) + if(!can_control(ui.user, R, TRUE)) return - message_admins(span_notice("[ADMIN_LOOKUPFLW(usr)] [!R.lockcharge ? "locked down" : "released"] [ADMIN_LOOKUPFLW(R)]!")) - log_game("[key_name(usr)] [!R.lockcharge ? "locked down" : "released"] [key_name(R)]!") + message_admins(span_notice("[ADMIN_LOOKUPFLW(ui.user)] [!R.lockcharge ? "locked down" : "released"] [ADMIN_LOOKUPFLW(R)]!")) + log_game("[key_name(ui.user)] [!R.lockcharge ? "locked down" : "released"] [key_name(R)]!") R.SetLockdown(!R.lockcharge) to_chat(R, "[!R.lockcharge ? span_notice("Your lockdown has been lifted!") : span_alert("You have been locked down!")]") if(R.connected_ai) @@ -219,13 +219,13 @@ . = TRUE if("hackbot") // AIs hacking/emagging a borg var/mob/living/silicon/robot/R = locate(params["ref"]) - if(!can_hack(usr, R)) + if(!can_hack(ui.user, R)) return - var/choice = tgui_alert(usr, "Really hack [R.name]? This cannot be undone.", "Hack?", list("Yes", "No")) + var/choice = tgui_alert(ui.user, "Really hack [R.name]? This cannot be undone.", "Hack?", list("Yes", "No")) if(choice != "Yes") return - log_game("[key_name(usr)] emagged [key_name(R)] using robotic console!") - message_admins(span_notice("[key_name_admin(usr)] emagged [key_name_admin(R)] using robotic console!")) + log_game("[key_name(ui.user)] emagged [key_name(R)] using robotic console!") + message_admins(span_notice("[key_name_admin(ui.user)] emagged [key_name_admin(R)] using robotic console!")) R.emagged = TRUE to_chat(R, span_notice("Failsafe protocols overridden. New tools available.")) . = TRUE diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 1be57d146e..86d6842df8 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -185,7 +185,7 @@ data["modal"] = tgui_modal_data(src) return data -/obj/machinery/computer/secure_data/tgui_act(action, params) +/obj/machinery/computer/secure_data/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -204,13 +204,13 @@ if("scan") if(scan) scan.forceMove(loc) - if(ishuman(usr) && !usr.get_active_hand()) - usr.put_in_hands(scan) + if(ishuman(ui.user) && !ui.user.get_active_hand()) + ui.user.put_in_hands(scan) scan = null else - var/obj/item/I = usr.get_active_hand() + var/obj/item/I = ui.user.get_active_hand() if(istype(I, /obj/item/card/id)) - usr.drop_item() + ui.user.drop_item() I.forceMove(src) scan = I if("login") @@ -219,12 +219,12 @@ if(check_access(scan)) authenticated = scan.registered_name rank = scan.assignment - else if(login_type == LOGIN_TYPE_AI && isAI(usr)) - authenticated = usr.name + else if(login_type == LOGIN_TYPE_AI && isAI(ui.user)) + authenticated = ui.user.name rank = JOB_AI - else if(login_type == LOGIN_TYPE_ROBOT && isrobot(usr)) - authenticated = usr.name - var/mob/living/silicon/robot/R = usr + else if(login_type == LOGIN_TYPE_ROBOT && isrobot(ui.user)) + authenticated = ui.user.name + var/mob/living/silicon/robot/R = ui.user rank = "[R.modtype] [R.braintype]" if(authenticated) active1 = null @@ -242,8 +242,8 @@ if("logout") if(scan) scan.forceMove(loc) - if(ishuman(usr) && !usr.get_active_hand()) - usr.put_in_hands(scan) + if(ishuman(ui.user) && !ui.user.get_active_hand()) + ui.user.put_in_hands(scan) scan = null authenticated = null screen = null @@ -270,6 +270,16 @@ qdel(active1) if(active2) qdel(active2) + if("sync_r") + if(active2) + set_temp(client_update_record(src,usr)) + if("edit_notes") + // The modal input in tgui is busted for this sadly... + var/new_notes = strip_html_simple(tgui_input_text(usr,"Enter new information here.","Character Preference", html_decode(active2.fields["notes"]), MAX_RECORD_LENGTH, TRUE, prevent_enter = TRUE), MAX_RECORD_LENGTH) + if(usr.Adjacent(src)) + if(new_notes != "" || tgui_alert(usr, "Are you sure you want to delete the current record's notes?", "Confirm Delete", list("Delete", "No")) == "Delete") + if(usr.Adjacent(src)) + active2.fields["notes"] = new_notes if("d_rec") var/datum/data/record/general_record = locate(params["d_rec"] || "") if(!data_core.general.Find(general_record)) @@ -338,12 +348,12 @@ SStgui.update_uis(src) addtimer(CALLBACK(src, PROC_REF(print_finish)), 5 SECONDS) if("photo_front") - var/icon/photo = get_photo(usr) + var/icon/photo = get_photo(ui.user) if(photo && active1) active1.fields["photo_front"] = photo active1.fields["photo-south"] = "'data:image/png;base64,[icon2base64(photo)]'" if("photo_side") - var/icon/photo = get_photo(usr) + var/icon/photo = get_photo(ui.user) if(photo && active1) active1.fields["photo_side"] = photo active1.fields["photo-west"] = "'data:image/png;base64,[icon2base64(photo)]'" @@ -474,7 +484,7 @@ var/obj/item/photo/photo = user.get_active_hand() return photo.img if(istype(user, /mob/living/silicon)) - var/mob/living/silicon/tempAI = usr + var/mob/living/silicon/tempAI = user var/obj/item/photo/selection = tempAI.GetPicture() if (selection) return selection.img diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 57524d95fd..bac1fa7c9c 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -143,11 +143,11 @@ data["modal"] = tgui_modal_data(src) return data -/obj/machinery/computer/skills/tgui_act(action, params) +/obj/machinery/computer/skills/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) if(!data_core.general.Find(active1)) active1 = null @@ -160,13 +160,13 @@ if("scan") if(scan) scan.forceMove(loc) - if(ishuman(usr) && !usr.get_active_hand()) - usr.put_in_hands(scan) + if(ishuman(ui.user) && !ui.user.get_active_hand()) + ui.user.put_in_hands(scan) scan = null else - var/obj/item/I = usr.get_active_hand() + var/obj/item/I = ui.user.get_active_hand() if(istype(I, /obj/item/card/id)) - usr.drop_item() + ui.user.drop_item() I.forceMove(src) scan = I if("cleartemp") @@ -177,12 +177,12 @@ if(check_access(scan)) authenticated = scan.registered_name rank = scan.assignment - else if(login_type == LOGIN_TYPE_AI && isAI(usr)) - authenticated = usr.name + else if(login_type == LOGIN_TYPE_AI && isAI(ui.user)) + authenticated = ui.user.name rank = JOB_AI - else if(login_type == LOGIN_TYPE_ROBOT && isrobot(usr)) - authenticated = usr.name - var/mob/living/silicon/robot/R = usr + else if(login_type == LOGIN_TYPE_ROBOT && isrobot(ui.user)) + authenticated = ui.user.name + var/mob/living/silicon/robot/R = ui.user rank = "[R.modtype] [R.braintype]" if(authenticated) active1 = null @@ -199,8 +199,8 @@ if("logout") if(scan) scan.forceMove(loc) - if(ishuman(usr) && !usr.get_active_hand()) - usr.put_in_hands(scan) + if(ishuman(ui.user) && !ui.user.get_active_hand()) + ui.user.put_in_hands(scan) scan = null authenticated = null screen = null @@ -214,6 +214,16 @@ for(var/datum/data/record/R in data_core.general) qdel(R) set_temp("All employment records deleted.") + if("sync_r") + if(active1) + set_temp(client_update_record(src,active1,usr)) + if("edit_notes") + // The modal input in tgui is busted for this sadly... + var/new_notes = strip_html_simple(tgui_input_text(usr,"Enter new information here.","Character Preference", html_decode(active1.fields["notes"]), MAX_RECORD_LENGTH, TRUE, prevent_enter = TRUE), MAX_RECORD_LENGTH) + if(usr.Adjacent(src)) + if(new_notes != "" || tgui_alert(usr, "Are you sure you want to delete the current record's notes?", "Confirm Delete", list("Delete", "No")) == "Delete") + if(usr.Adjacent(src)) + active1.fields["notes"] = new_notes if("del_r") if(PDA_Manifest) PDA_Manifest.Cut() diff --git a/code/game/machinery/computer/supply.dm b/code/game/machinery/computer/supply.dm index dc285601ca..8117cf4499 100644 --- a/code/game/machinery/computer/supply.dm +++ b/code/game/machinery/computer/supply.dm @@ -179,7 +179,7 @@ data["categories"] = all_supply_groups return data -/obj/machinery/computer/supplycomp/tgui_act(action, params) +/obj/machinery/computer/supplycomp/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE if(!SSsupply) @@ -221,29 +221,29 @@ visible_message(span_warning("[src]'s monitor flashes, \"[reqtime - world.time] seconds remaining until another requisition form may be printed.\"")) return FALSE - var/amount = clamp(tgui_input_number(usr, "How many crates? (0 to 20)", null, null, 20, 0), 0, 20) + var/amount = clamp(tgui_input_number(ui.user, "How many crates? (0 to 20)", null, null, 20, 0), 0, 20) if(!amount) return FALSE var/timeout = world.time + 600 - var/reason = sanitize(tgui_input_text(usr, "Reason:","Why do you require this item?","")) + var/reason = sanitize(tgui_input_text(ui.user, "Reason:","Why do you require this item?","")) if(world.time > timeout) - to_chat(usr, span_warning("Error. Request timed out.")) + to_chat(ui.user, span_warning("Error. Request timed out.")) return FALSE if(!reason) return FALSE for(var/i in 1 to amount) - SSsupply.create_order(S, usr, reason) + SSsupply.create_order(S, ui.user, reason) var/idname = "*None Provided*" var/idrank = "*None Provided*" - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr + if(ishuman(ui.user)) + var/mob/living/carbon/human/H = ui.user idname = H.get_authentification_name() idrank = H.get_assignment() - else if(issilicon(usr)) - idname = usr.real_name + else if(issilicon(ui.user)) + idname = ui.user.real_name idrank = "Stationbound synthetic" var/obj/item/paper/reqform = new /obj/item/paper(loc) @@ -280,23 +280,23 @@ return FALSE var/timeout = world.time + 600 - var/reason = sanitize(tgui_input_text(usr, "Reason:","Why do you require this item?","")) + var/reason = sanitize(tgui_input_text(ui.user, "Reason:","Why do you require this item?","")) if(world.time > timeout) - to_chat(usr, span_warning("Error. Request timed out.")) + to_chat(ui.user, span_warning("Error. Request timed out.")) return FALSE if(!reason) return FALSE - SSsupply.create_order(S, usr, reason) + SSsupply.create_order(S, ui.user, reason) var/idname = "*None Provided*" var/idrank = "*None Provided*" - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr + if(ishuman(ui.user)) + var/mob/living/carbon/human/H = ui.user idname = H.get_authentification_name() idrank = H.get_assignment() - else if(issilicon(usr)) - idname = usr.real_name + else if(issilicon(ui.user)) + idname = ui.user.real_name idrank = "Stationbound synthetic" var/obj/item/paper/reqform = new /obj/item/paper(loc) @@ -323,7 +323,7 @@ return FALSE if(!(authorization & SUP_ACCEPT_ORDERS)) return FALSE - var/new_val = sanitize(tgui_input_text(usr, params["edit"], "Enter the new value for this field:", params["default"])) + var/new_val = sanitize(tgui_input_text(ui.user, params["edit"], "Enter the new value for this field:", params["default"])) if(!new_val) return FALSE @@ -362,7 +362,7 @@ return FALSE if(!(authorization & SUP_ACCEPT_ORDERS)) return FALSE - SSsupply.approve_order(O, usr) + SSsupply.approve_order(O, ui.user) . = TRUE if("deny_order") var/datum/supply_order/O = locate(params["ref"]) @@ -370,7 +370,7 @@ return FALSE if(!(authorization & SUP_ACCEPT_ORDERS)) return FALSE - SSsupply.deny_order(O, usr) + SSsupply.deny_order(O, ui.user) . = TRUE if("delete_order") var/datum/supply_order/O = locate(params["ref"]) @@ -378,12 +378,12 @@ return FALSE if(!(authorization & SUP_ACCEPT_ORDERS)) return FALSE - SSsupply.delete_order(O, usr) + SSsupply.delete_order(O, ui.user) . = TRUE if("clear_all_requests") if(!(authorization & SUP_ACCEPT_ORDERS)) return FALSE - SSsupply.deny_all_pending(usr) + SSsupply.deny_all_pending(ui.user) . = TRUE // Exports if("export_edit_field") @@ -394,11 +394,11 @@ if(!(authorization & SUP_ACCEPT_ORDERS)) return FALSE var/list/L = E.contents[params["index"]] - var/field = tgui_alert(usr, "Select which field to edit", "Field Choice", list("Name", "Quantity", "Value")) + var/field = tgui_alert(ui.user, "Select which field to edit", "Field Choice", list("Name", "Quantity", "Value")) if(!field) return FALSE - var/new_val = sanitize(tgui_input_text(usr, field, "Enter the new value for this field:", L[lowertext(field)])) + var/new_val = sanitize(tgui_input_text(ui.user, field, "Enter the new value for this field:", L[lowertext(field)])) if(!new_val) return @@ -432,7 +432,7 @@ return FALSE if(!(authorization & SUP_ACCEPT_ORDERS)) return FALSE - SSsupply.add_export_item(E, usr) + SSsupply.add_export_item(E, ui.user) . = TRUE if("export_edit") var/datum/exported_crate/E = locate(params["ref"]) @@ -441,7 +441,7 @@ return FALSE if(!(authorization & SUP_ACCEPT_ORDERS)) return FALSE - var/new_val = sanitize(tgui_input_text(usr, params["edit"], "Enter the new value for this field:", params["default"])) + var/new_val = sanitize(tgui_input_text(ui.user, params["edit"], "Enter the new value for this field:", params["default"])) if(!new_val) return @@ -461,20 +461,20 @@ return FALSE if(!(authorization & SUP_ACCEPT_ORDERS)) return FALSE - SSsupply.delete_export(E, usr) + SSsupply.delete_export(E, ui.user) . = TRUE if("send_shuttle") switch(params["mode"]) if("send_away") if (shuttle.forbidden_atoms_check()) - to_chat(usr, span_warning("For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons.")) + to_chat(ui.user, span_warning("For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons.")) else shuttle.launch(src) - to_chat(usr, span_notice("Initiating launch sequence.")) + to_chat(ui.user, span_notice("Initiating launch sequence.")) if("send_to_station") shuttle.launch(src) - to_chat(usr, span_notice("The supply shuttle has been called and will arrive in approximately [round(SSsupply.movetime/600,1)] minutes.")) + to_chat(ui.user, span_notice("The supply shuttle has been called and will arrive in approximately [round(SSsupply.movetime/600,1)] minutes.")) if("cancel_shuttle") shuttle.cancel_launch(src) @@ -483,7 +483,7 @@ shuttle.force_launch(src) . = TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) /obj/machinery/computer/supplycomp/proc/post_signal(var/command) var/datum/radio_frequency/frequency = radio_controller.return_frequency(1435) diff --git a/code/game/machinery/computer/timeclock_vr.dm b/code/game/machinery/computer/timeclock_vr.dm index 410ce817bd..4e5eba6d71 100644 --- a/code/game/machinery/computer/timeclock_vr.dm +++ b/code/game/machinery/computer/timeclock_vr.dm @@ -112,33 +112,33 @@ if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if("id") if(card) - usr.put_in_hands(card) + ui.user.put_in_hands(card) card = null else - var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/card/id) && usr.unEquip(I)) + var/obj/item/I = ui.user.get_active_hand() + if (istype(I, /obj/item/card/id) && ui.user.unEquip(I)) I.forceMove(src) card = I update_icon() return TRUE if("switch-to-onduty-rank") - if(checkFace()) - if(checkCardCooldown()) - makeOnDuty(params["switch-to-onduty-rank"], params["switch-to-onduty-assignment"]) - usr.put_in_hands(card) + if(checkFace(ui.user)) + if(checkCardCooldown(ui.user)) + makeOnDuty(params["switch-to-onduty-rank"], params["switch-to-onduty-assignment"], ui.user) + ui.user.put_in_hands(card) card = null update_icon() return TRUE if("switch-to-offduty") - if(checkFace()) - if(checkCardCooldown()) - makeOffDuty() - usr.put_in_hands(card) + if(checkFace(ui.user)) + if(checkCardCooldown(ui.user)) + makeOffDuty(ui.user) + ui.user.put_in_hands(card) card = null update_icon() return TRUE @@ -165,10 +165,10 @@ && !job.disallow_jobhop \ && job.timeoff_factor > 0 -/obj/machinery/computer/timeclock/proc/makeOnDuty(var/newrank, var/newassignment) +/obj/machinery/computer/timeclock/proc/makeOnDuty(var/newrank, var/newassignment, var/mob/user) var/datum/job/oldjob = job_master.GetJob(card.rank) var/datum/job/newjob = job_master.GetJob(newrank) - if(!oldjob || !isOpenOnDutyJob(usr, oldjob.pto_type, newjob)) + if(!oldjob || !isOpenOnDutyJob(user, oldjob.pto_type, newjob)) return if(newassignment != newjob.title && !(newassignment in newjob.alt_titles)) return @@ -181,13 +181,13 @@ card.last_job_switch = world.time callHook("reassign_employee", list(card)) newjob.current_positions++ - var/mob/living/carbon/human/H = usr + var/mob/living/carbon/human/H = user H.mind.assigned_role = card.rank H.mind.role_alt_title = card.assignment announce.autosay("[card.registered_name] has moved On-Duty as [card.assignment].", "Employee Oversight", channel, zlevels = using_map.get_map_levels(get_z(src))) return -/obj/machinery/computer/timeclock/proc/makeOffDuty() +/obj/machinery/computer/timeclock/proc/makeOffDuty(var/mob/user) var/datum/job/foundjob = job_master.GetJob(card.rank) if(!foundjob) return @@ -206,35 +206,35 @@ data_core.manifest_modify(card.registered_name, card.assignment, card.rank) card.last_job_switch = world.time callHook("reassign_employee", list(card)) - var/mob/living/carbon/human/H = usr + var/mob/living/carbon/human/H = user H.mind.assigned_role = ptojob.title H.mind.role_alt_title = ptojob.title foundjob.current_positions-- announce.autosay("[card.registered_name], [oldtitle], has moved Off-Duty.", "Employee Oversight", channel, zlevels = using_map.get_map_levels(get_z(src))) return -/obj/machinery/computer/timeclock/proc/checkCardCooldown() +/obj/machinery/computer/timeclock/proc/checkCardCooldown(var/mob/user) if(!card) return FALSE var/time_left = 10 MINUTES - (world.time - card.last_job_switch) if(time_left > 0) - to_chat(usr, "You need to wait another [round((time_left/10)/60, 1)] minute\s before you can switch.") + to_chat(user, "You need to wait another [round((time_left/10)/60, 1)] minute\s before you can switch.") return FALSE return TRUE -/obj/machinery/computer/timeclock/proc/checkFace() +/obj/machinery/computer/timeclock/proc/checkFace(var/mob/user) if(!card) - to_chat(usr, span_notice("No ID is inserted.")) + to_chat(user, span_notice("No ID is inserted.")) return FALSE - var/mob/living/carbon/human/H = usr + var/mob/living/carbon/human/H = user if(!(istype(H))) - to_chat(usr, span_warning("Invalid user detected. Access denied.")) + to_chat(user, span_warning("Invalid user detected. Access denied.")) return FALSE else if((H.wear_mask && (H.wear_mask.flags_inv & HIDEFACE)) || (H.head && (H.head.flags_inv & HIDEFACE))) //Face hiding bad - to_chat(usr, span_warning("Facial recognition scan failed due to physical obstructions. Access denied.")) + to_chat(user, span_warning("Facial recognition scan failed due to physical obstructions. Access denied.")) return FALSE else if(H.get_face_name() == "Unknown" || !(H.real_name == card.registered_name)) - to_chat(usr, span_warning("Facial recognition scan failed. Access denied.")) + to_chat(user, span_warning("Facial recognition scan failed. Access denied.")) return FALSE else return TRUE diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 70716c5ecf..79603bfaa7 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -90,7 +90,7 @@ return if(panel_open) - to_chat(usr, span_boldnotice("Close the maintenance panel first.")) + to_chat(user, span_boldnotice("Close the maintenance panel first.")) return tgui_interact(user) @@ -139,8 +139,8 @@ return data -/obj/machinery/atmospherics/unary/cryo_cell/tgui_act(action, params) - if(..() || usr == occupant) +/obj/machinery/atmospherics/unary/cryo_cell/tgui_act(action, params, datum/tgui/ui) + if(..() || ui.user == occupant) return TRUE . = TRUE @@ -157,13 +157,13 @@ beaker = null update_icon() if("ejectOccupant") - if(!occupant || isslime(usr) || ispAI(usr)) + if(!occupant || isslime(ui.user) || ispAI(ui.user)) return 0 // don't update UIs attached to this object go_out() else return FALSE - add_fingerprint(usr) + add_fingerprint(ui.user) /obj/machinery/atmospherics/unary/cryo_cell/attackby(var/obj/item/G as obj, var/mob/user as mob) if(istype(G, /obj/item/reagent_containers/glass)) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index d3ed23c511..e8479049e5 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -114,7 +114,7 @@ if(..()) return - add_fingerprint(usr) + add_fingerprint(ui.user) return FALSE // VOREStation Edit - prevent topic exploits /* VOREStation Edit - Unreachable due to above @@ -124,12 +124,12 @@ return if(!LAZYLEN(frozen_items)) - to_chat(usr, span_notice("There is nothing to recover from storage.")) + to_chat(ui.user, span_notice("There is nothing to recover from storage.")) return var/obj/item/I = locate(params["ref"]) in frozen_items if(!I) - to_chat(usr, span_notice("\The [I] is no longer in storage.")) + to_chat(ui.user, span_notice("\The [I] is no longer in storage.")) return visible_message(span_notice("The console beeps happily as it disgorges [I].")) @@ -141,7 +141,7 @@ return if(!LAZYLEN(frozen_items)) - to_chat(usr, span_notice("There is nothing to recover from storage.")) + to_chat(ui.user, span_notice("There is nothing to recover from storage.")) return visible_message(span_notice("The console beeps happily as it disgorges the desired objects.")) @@ -709,7 +709,7 @@ if(willing) if(M == user) - visible_message("[usr] [on_enter_visible_message] [src].", 3) + visible_message("[user] [on_enter_visible_message] [src].", 3) else visible_message("\The [user] starts putting [M] into \the [src].", 3) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 6c9538e1f1..a5d9ecc4ea 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -660,7 +660,7 @@ About the new airlock wires panel: /obj/machinery/door/airlock/bumpopen(mob/living/user as mob) //Airlocks now zap you when you 'bump' them open when they're electrified. --NeoFite - if(!issilicon(usr)) + if(!issilicon(user)) if(src.isElectrified()) if(!src.justzap) if(src.shock(user, 100)) @@ -984,7 +984,7 @@ About the new airlock wires panel: return ..() /obj/machinery/door/airlock/attack_hand(mob/user as mob) - if(!istype(usr, /mob/living/silicon)) + if(!istype(user, /mob/living/silicon)) if(src.isElectrified()) if(src.shock(user, 100)) return @@ -1046,10 +1046,10 @@ About the new airlock wires panel: src.hold_open = user src.attack_hand(user) -/obj/machinery/door/airlock/tgui_act(action, params) +/obj/machinery/door/airlock/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE - if(!user_allowed(usr)) + if(!user_allowed(ui.user)) return TRUE switch(action) @@ -1058,14 +1058,14 @@ About the new airlock wires panel: loseMainPower() update_icon() else - to_chat(usr, span_warning("Main power is already offline.")) + to_chat(ui.user, span_warning("Main power is already offline.")) . = TRUE if("disrupt-backup") if(!backup_power_lost_until) loseBackupPower() update_icon() else - to_chat(usr, span_warning("Backup power is already offline.")) + to_chat(ui.user, span_warning("Backup power is already offline.")) . = TRUE if("shock-restore") electrify(0, 1) @@ -1080,14 +1080,14 @@ About the new airlock wires panel: set_idscan(aiDisabledIdScanner, 1) . = TRUE // if("emergency-toggle") - // toggle_emergency(usr) + // toggle_emergency(ui.user) // . = TRUE if("bolt-toggle") - toggle_bolt(usr) + toggle_bolt(ui.user) . = TRUE if("light-toggle") if(wires.is_cut(WIRE_BOLT_LIGHT)) - to_chat(usr, "The bolt lights wire is cut - The door bolt lights are permanently disabled.") + to_chat(ui.user, "The bolt lights wire is cut - The door bolt lights are permanently disabled.") return lights = !lights update_icon() @@ -1097,12 +1097,12 @@ About the new airlock wires panel: . = TRUE if("speed-toggle") if(wires.is_cut(WIRE_SPEED)) - to_chat(usr, "The timing wire is cut - Cannot alter timing.") + to_chat(ui.user, "The timing wire is cut - Cannot alter timing.") return normalspeed = !normalspeed . = TRUE if("open-close") - user_toggle_open(usr) + user_toggle_open(ui.user) . = TRUE update_icon() @@ -1158,7 +1158,7 @@ About the new airlock wires panel: /obj/machinery/door/airlock/attackby(obj/item/C, mob/user as mob) //to_world("airlock attackby src [src] obj [C] mob [user]") - if(!istype(usr, /mob/living/silicon)) + if(!istype(user, /mob/living/silicon)) if(src.isElectrified()) if(src.shock(user, 75)) return @@ -1189,7 +1189,7 @@ About the new airlock wires panel: else if(C.has_tool_quality(TOOL_SCREWDRIVER)) if (src.p_open) if (stat & BROKEN) - to_chat(usr, span_warning("The panel is broken and cannot be closed.")) + to_chat(user, span_warning("The panel is broken and cannot be closed.")) else src.p_open = FALSE playsound(src, C.usesound, 50, 1) diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 5d8fd2c688..5301aa5661 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -261,7 +261,7 @@ ..() /obj/machinery/access_button/attack_hand(mob/user) - add_fingerprint(usr) + add_fingerprint(user) if(!allowed(user)) to_chat(user, span_warning("Access Denied")) diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 355f561c1f..da9f612f76 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -193,7 +193,7 @@ to_chat(user, span_warning("You don't have enough sheets to repair this! You need at least [amt] sheets.")) return to_chat(user, span_notice("You begin repairing [src]...")) - if(do_after(usr, 30)) + if(do_after(user, 30)) if(P.use(amt)) to_chat(user, span_notice("You have repaired \The [src]")) src.repair() diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 84a8a1e2e0..9c95ca1ff2 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -173,13 +173,13 @@ break return data -/obj/machinery/door_timer/tgui_act(action, params) +/obj/machinery/door_timer/tgui_act(action, params, datum/tgui/ui) if(..()) return . = TRUE - if(!allowed(usr)) - to_chat(usr, span_warning("Access denied.")) + if(!allowed(ui.user)) + to_chat(ui.user, span_warning("Access denied.")) return FALSE switch(action) diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 4aeb8ba70b..f534ccd832 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -30,14 +30,14 @@ . = ..() // stack_trace("WARNING: Embedded controller [src] ([type]) had Topic() called unexpectedly. Please report this.") // statpanel means that topic can always be called for clicking -/obj/machinery/embedded_controller/tgui_act(action, params) +/obj/machinery/embedded_controller/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE if(LAZYLEN(valid_actions)) if(action in valid_actions) program.receive_user_command(action) - if(usr) - add_fingerprint(usr) + if(ui.user) + add_fingerprint(ui.user) /obj/machinery/embedded_controller/process() if(program) diff --git a/code/game/machinery/exonet_node.dm b/code/game/machinery/exonet_node.dm index 9d26ad77dc..902b7c9650 100644 --- a/code/game/machinery/exonet_node.dm +++ b/code/game/machinery/exonet_node.dm @@ -124,7 +124,7 @@ // Proc: tgui_act() // Parameters: 2 (standard tgui_act arguments) // Description: Responds to button presses on the TGUI interface. -/obj/machinery/exonet_node/tgui_act(action, params) +/obj/machinery/exonet_node/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -134,7 +134,7 @@ toggle = !toggle update_power() if(!toggle) - var/msg = "[usr.client.key] ([usr]) has turned [src] off, at [x],[y],[z]." + var/msg = "[ui.user.client.key] ([ui.user]) has turned [src] off, at [x],[y],[z]." message_admins(msg) log_game(msg) @@ -146,7 +146,7 @@ . = TRUE allow_external_communicators = !allow_external_communicators if(!allow_external_communicators) - var/msg = "[usr.client.key] ([usr]) has turned [src]'s communicator port off, at [x],[y],[z]." + var/msg = "[ui.user.client.key] ([ui.user]) has turned [src]'s communicator port off, at [x],[y],[z]." message_admins(msg) log_game(msg) @@ -154,12 +154,12 @@ . = TRUE allow_external_newscasters = !allow_external_newscasters if(!allow_external_newscasters) - var/msg = "[usr.client.key] ([usr]) has turned [src]'s newscaster port off, at [x],[y],[z]." + var/msg = "[ui.user.client.key] ([ui.user]) has turned [src]'s newscaster port off, at [x],[y],[z]." message_admins(msg) log_game(msg) update_icon() - add_fingerprint(usr) + add_fingerprint(ui.user) // Proc: get_exonet_node() // Parameters: None diff --git a/code/game/machinery/floorlayer.dm b/code/game/machinery/floorlayer.dm index bfd592e467..8534b2d4d1 100644 --- a/code/game/machinery/floorlayer.dm +++ b/code/game/machinery/floorlayer.dm @@ -35,10 +35,10 @@ /obj/machinery/floorlayer/attackby(var/obj/item/W as obj, var/mob/user as mob) if(W.has_tool_quality(TOOL_WRENCH)) - var/m = tgui_input_list(usr, "Choose work mode", "Mode", mode) + var/m = tgui_input_list(user, "Choose work mode", "Mode", mode) mode[m] = !mode[m] var/O = mode[m] - user.visible_message(span_notice("[usr] has set \the [src] [m] mode [!O?"off":"on"]."), span_notice("You set \the [src] [m] mode [!O?"off":"on"].")) + user.visible_message(span_notice("[user] has set \the [src] [m] mode [!O?"off":"on"]."), span_notice("You set \the [src] [m] mode [!O?"off":"on"].")) return if(istype(W, /obj/item/stack/tile)) @@ -51,7 +51,7 @@ if(!length(contents)) to_chat(user, span_notice("\The [src] is empty.")) else - var/obj/item/stack/tile/E = tgui_input_list(usr, "Choose remove tile type.", "Tiles", contents) + var/obj/item/stack/tile/E = tgui_input_list(user, "Choose remove tile type.", "Tiles", contents) if(E) to_chat(user, span_notice("You remove the [E] from \the [src].")) E.loc = src.loc @@ -59,7 +59,7 @@ return if(W.has_tool_quality(TOOL_SCREWDRIVER)) - T = tgui_input_list(usr, "Choose tile type.", "Tiles", contents) + T = tgui_input_list(user, "Choose tile type.", "Tiles", contents) return ..() diff --git a/code/game/machinery/gear_dispenser.dm b/code/game/machinery/gear_dispenser.dm index 9fd11d81c0..f26860c924 100644 --- a/code/game/machinery/gear_dispenser.dm +++ b/code/game/machinery/gear_dispenser.dm @@ -186,7 +186,7 @@ var/list/dispenser_presets = list() dispenser_flags &= ~GD_BUSY return - var/choice = tgui_input_list(usr, "Select equipment to dispense.", "Equipment Dispenser", gear_list) + var/choice = tgui_input_list(user, "Select equipment to dispense.", "Equipment Dispenser", gear_list) if(!choice) dispenser_flags &= ~GD_BUSY diff --git a/code/game/machinery/holoposter.dm b/code/game/machinery/holoposter.dm index 9b32fbb371..4f76a3a66d 100644 --- a/code/game/machinery/holoposter.dm +++ b/code/game/machinery/holoposter.dm @@ -85,7 +85,7 @@ GLOBAL_LIST_EMPTY(holoposters) return if (W.has_tool_quality(TOOL_MULTITOOL)) playsound(src, 'sound/items/penclick.ogg', 60, 1) - icon_state = tgui_input_list(usr, "Available Posters", "Holographic Poster", postertypes + "random") + icon_state = tgui_input_list(user, "Available Posters", "Holographic Poster", postertypes + "random") if(!Adjacent(user)) return if(icon_state == "random") diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index b290528f87..d5abde1e1f 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -152,7 +152,7 @@ /obj/machinery/media/jukebox/interact(mob/user) if(inoperable()) - to_chat(usr, "\The [src] doesn't appear to function.") + to_chat(user, "\The [src] doesn't appear to function.") return tgui_interact(user) @@ -235,17 +235,17 @@ spawn(15) explode() else if(current_track == null) - to_chat(usr, "No track selected.") + to_chat(ui.user, "No track selected.") else StartPlaying() return TRUE if("add_new_track") - SSmedia_tracks.add_track(usr, params["url"], params["title"], text2num(params["duration"]) * 10, params["artist"], params["genre"], text2num(params["secret"]), text2num(params["lobby"])) + SSmedia_tracks.add_track(ui.user, params["url"], params["title"], text2num(params["duration"]) * 10, params["artist"], params["genre"], text2num(params["secret"]), text2num(params["lobby"])) if("remove_new_track") var/datum/track/track_to_remove = locate(params["ref"]) in getTracksList() if(track_to_remove == current_track && playing) StopPlaying() - SSmedia_tracks.remove_track(usr, track_to_remove) + SSmedia_tracks.remove_track(ui.user, track_to_remove) /obj/machinery/media/jukebox/attack_ai(mob/user as mob) return src.attack_hand(user) diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index 8ee5e8910d..a344167c4a 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -28,9 +28,9 @@ if(istype(I, /obj/item/multitool)) if(panel_open) - var/input = sanitize(tgui_input_text(usr, "What id would you like to give this conveyor?", "Multitool-Conveyor interface", id)) + var/input = sanitize(tgui_input_text(user, "What id would you like to give this conveyor?", "Multitool-Conveyor interface", id)) if(!input) - to_chat(usr, "No input found please hang up and try your call again.") + to_chat(user, "No input found please hang up and try your call again.") return id = input return diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 17a1837e33..07dbe9a32e 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -416,7 +416,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) if(FC.channel_name == channel_name) check = 1 break - var/our_user = tgui_user_name(usr) + var/our_user = tgui_user_name(ui.user) if(channel_name == "" || channel_name == "\[REDACTED\]") set_temp("Error: Could not submit feed channel to network: Invalid Channel Name.", "danger", FALSE) return TRUE @@ -430,7 +430,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) set_temp("Error: Could not submit feed channel to network: A feed channel already exists under your name.", "danger", FALSE) return TRUE - var/choice = tgui_alert(usr, "Please confirm Feed channel creation","Network Channel Handler",list("Confirm","Cancel")) + var/choice = tgui_alert(ui.user, "Please confirm Feed channel creation","Network Channel Handler",list("Confirm","Cancel")) if(choice == "Confirm") news_network.CreateFeedChannel(channel_name, our_user, c_locked) set_temp("Feed channel [channel_name] created successfully.", "success", FALSE) @@ -442,25 +442,25 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) for(var/datum/feed_channel/F in news_network.network_channels) if((!F.locked || F.author == scanned_user) && !F.censored) available_channels += F.channel_name - var/new_channel_name = tgui_input_list(usr, "Choose receiving Feed Channel", "Network Channel Handler", available_channels) + var/new_channel_name = tgui_input_list(ui.user, "Choose receiving Feed Channel", "Network Channel Handler", available_channels) if(new_channel_name) channel_name = new_channel_name return TRUE if("set_new_message") - msg = sanitize(tgui_input_text(usr, "Write your Feed story", "Network Channel Handler", multiline = TRUE, prevent_enter = TRUE)) + msg = sanitize(tgui_input_text(ui.user, "Write your Feed story", "Network Channel Handler", multiline = TRUE, prevent_enter = TRUE)) return TRUE if("set_new_title") - title = sanitize(tgui_input_text(usr, "Enter your Feed title", "Network Channel Handler")) + title = sanitize(tgui_input_text(ui.user, "Enter your Feed title", "Network Channel Handler")) return TRUE if("set_attachment") - AttachPhoto(usr) + AttachPhoto(ui.user) return TRUE if("submit_new_message") - var/our_user = tgui_user_name(usr) + var/our_user = tgui_user_name(ui.user) if(msg == "" || msg == "\[REDACTED\]") set_temp("Error: Could not submit feed message to network: Invalid Message.", "danger", FALSE) return TRUE @@ -496,7 +496,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) if("submit_wanted") if(!securityCaster) return FALSE - var/our_user = tgui_user_name(usr) + var/our_user = tgui_user_name(ui.user) if(channel_name == "") set_temp("Error: Could not submit wanted issue to network: Invalid Criminal Name.", "danger", FALSE) return TRUE @@ -507,11 +507,11 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) set_temp("Error: Could not submit wanted issue to network: Author unverified.", "danger", FALSE) return TRUE - var/choice = tgui_alert(usr, "Please confirm Wanted Issue change.", "Network Security Handler", list("Confirm", "Cancel")) + var/choice = tgui_alert(ui.user, "Please confirm Wanted Issue change.", "Network Security Handler", list("Confirm", "Cancel")) if(choice == "Confirm") if(news_network.wanted_issue) if(news_network.wanted_issue.is_admin_message) - tgui_alert_async(usr, "The wanted issue has been distributed by a [using_map.company_name] higherup. You cannot edit it.") + tgui_alert_async(ui.user, "The wanted issue has been distributed by a [using_map.company_name] higherup. You cannot edit it.") return news_network.wanted_issue.author = channel_name news_network.wanted_issue.body = msg @@ -536,9 +536,9 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) if(!securityCaster) return FALSE if(news_network.wanted_issue.is_admin_message) - tgui_alert_async(usr, "The wanted issue has been distributed by a [using_map.company_name] higherup. You cannot take it down.") + tgui_alert_async(ui.user, "The wanted issue has been distributed by a [using_map.company_name] higherup. You cannot take it down.") return - var/choice = tgui_alert(usr, "Please confirm Wanted Issue removal","Network Security Handler",list("Confirm","Cancel")) + var/choice = tgui_alert(ui.user, "Please confirm Wanted Issue removal","Network Security Handler",list("Confirm","Cancel")) if(choice=="Confirm") news_network.wanted_issue = null for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) @@ -551,7 +551,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) return FALSE var/datum/feed_channel/FC = locate(params["ref"]) if(FC.is_admin_channel) - tgui_alert_async(usr, "This channel was created by a [using_map.company_name] Officer. You cannot censor it.") + tgui_alert_async(ui.user, "This channel was created by a [using_map.company_name] Officer. You cannot censor it.") return if(FC.author != "\[REDACTED\]") FC.backup_author = FC.author @@ -566,7 +566,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) return FALSE var/datum/feed_message/MSG = locate(params["ref"]) if(MSG.is_admin_message) - tgui_alert_async(usr, "This message was created by a [using_map.company_name] Officer. You cannot censor its author.") + tgui_alert_async(ui.user, "This message was created by a [using_map.company_name] Officer. You cannot censor its author.") return if(MSG.author != "\[REDACTED\]") MSG.backup_author = MSG.author @@ -581,7 +581,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) return FALSE var/datum/feed_message/MSG = locate(params["ref"]) if(MSG.is_admin_message) - tgui_alert_async(usr, "This channel was created by a [using_map.company_name] Officer. You cannot censor it.") + tgui_alert_async(ui.user, "This channel was created by a [using_map.company_name] Officer. You cannot censor it.") return if(MSG.body != "\[REDACTED\]") MSG.backup_body = MSG.body @@ -603,7 +603,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) return FALSE var/datum/feed_channel/FC = locate(params["ref"]) if(FC.is_admin_channel) - tgui_alert_async(usr, "This channel was created by a [using_map.company_name] Officer. You cannot place a D-Notice upon it.") + tgui_alert_async(ui.user, "This channel was created by a [using_map.company_name] Officer. You cannot place a D-Notice upon it.") return FC.censored = !FC.censored FC.update() diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm index 26f9d6fabf..3f6ec0cbe3 100644 --- a/code/game/machinery/nuclear_bomb.dm +++ b/code/game/machinery/nuclear_bomb.dm @@ -85,7 +85,7 @@ var/bomb_set if(extended) if(istype(O, /obj/item/disk/nuclear)) - usr.drop_item() + user.drop_item() O.loc = src auth = O add_fingerprint(user) diff --git a/code/game/machinery/painter_vr.dm b/code/game/machinery/painter_vr.dm index 9ed6caf6f4..aaf4d632cf 100644 --- a/code/game/machinery/painter_vr.dm +++ b/code/game/machinery/painter_vr.dm @@ -106,17 +106,16 @@ /obj/machinery/gear_painter/AltClick(mob/user) . = ..() - drop_item() + drop_item(user) -/obj/machinery/gear_painter/proc/drop_item() +/obj/machinery/gear_painter/proc/drop_item(var/mob/user) if(!oview(1,src)) return if(!inserted) return - to_chat(usr, span_notice("You remove [inserted] from [src]")) + to_chat(user, span_notice("You remove [inserted] from [src]")) inserted.forceMove(drop_location()) - var/mob/living/user = usr - if(istype(user)) + if(isliving(user)) user.put_in_hands(inserted) inserted = null update_icon() @@ -155,11 +154,11 @@ .["item"] = list() .["item"]["name"] = inserted.name .["item"]["sprite"] = icon2base64(get_flat_icon(inserted,dir=SOUTH,no_anim=TRUE)) - .["item"]["preview"] = icon2base64(build_preview()) + .["item"]["preview"] = icon2base64(build_preview(user)) else .["item"] = null -/obj/machinery/gear_painter/tgui_act(action, params) +/obj/machinery/gear_painter/tgui_act(action, params, datum/tgui/ui) . = ..() if(.) return @@ -169,17 +168,17 @@ active_mode = text2num(params["mode"]) return TRUE if("choose_color") - var/chosen_color = input(usr, "Choose a color: ", "ColorMate colour picking", activecolor) as color|null + var/chosen_color = input(ui.user, "Choose a color: ", "ColorMate colour picking", activecolor) as color|null if(chosen_color) activecolor = chosen_color return TRUE if("paint") - do_paint(usr) + do_paint(ui.user) temp = "Painted Successfully!" return TRUE if("drop") temp = "" - drop_item() + drop_item(ui.user) return TRUE if("clear") inserted.remove_atom_colour(FIXED_COLOUR_PRIORITY) @@ -242,7 +241,7 @@ /// Produces the preview image of the item, used in the UI, the way the color is not stacking is a sin. -/obj/machinery/gear_painter/proc/build_preview() +/obj/machinery/gear_painter/proc/build_preview(mob/user) if(inserted) //sanity var/list/cm switch(active_mode) @@ -261,17 +260,17 @@ text2num(color_matrix_last[11]), text2num(color_matrix_last[12]), ) - if(!check_valid_color(cm, usr)) + if(!check_valid_color(cm, user)) return get_flat_icon(inserted, dir=SOUTH, no_anim=TRUE) if(COLORMATE_TINT) - if(!check_valid_color(activecolor, usr)) + if(!check_valid_color(activecolor, user)) return get_flat_icon(inserted, dir=SOUTH, no_anim=TRUE) if(COLORMATE_HSV) cm = color_matrix_hsv(build_hue, build_sat, build_val) color_matrix_last = cm - if(!check_valid_color(cm, usr)) + if(!check_valid_color(cm, user)) return get_flat_icon(inserted, dir=SOUTH, no_anim=TRUE) var/cur_color = inserted.color diff --git a/code/game/machinery/pandemic.dm b/code/game/machinery/pandemic.dm index ae8687d665..cd51b2a9fc 100644 --- a/code/game/machinery/pandemic.dm +++ b/code/game/machinery/pandemic.dm @@ -114,7 +114,7 @@ default_name = replacetext(beaker.name, new/regex(" culture bottle\\Z", "g"), "") else default_name = D.name - var/name = tgui_input_text(usr, "Name:", "Name the culture", default_name, MAX_NAME_LEN) + var/name = tgui_input_text(ui.user, "Name:", "Name the culture", default_name, MAX_NAME_LEN) if(name == null || wait) return var/obj/item/reagent_containers/glass/bottle/B = create_culture(name) @@ -167,7 +167,7 @@ if(!A) atom_say("Unable to find requested strain.") return - print_form(A, usr) + print_form(A, ui.user) if("name_strain") var/strain_index = text2num(params["strain_index"]) if(isnull(strain_index)) @@ -184,7 +184,7 @@ if(A.name != "Unknown") atom_say("Request rejected. Strain already has a name.") return - var/new_name = tgui_input_text(usr, "Name the Strain", "New Name", max_length = MAX_NAME_LEN) + var/new_name = tgui_input_text(ui.user, "Name the Strain", "New Name", max_length = MAX_NAME_LEN) if(!new_name) return A.AssignName(new_name) diff --git a/code/game/machinery/partslathe_vr.dm b/code/game/machinery/partslathe_vr.dm index 8693642de7..0314d6b1b9 100644 --- a/code/game/machinery/partslathe_vr.dm +++ b/code/game/machinery/partslathe_vr.dm @@ -297,7 +297,7 @@ if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) // Queue management can be done even while busy if("queue") @@ -331,7 +331,7 @@ return TRUE if(busy) - to_chat(usr, span_notice("[src] is busy. Please wait for completion of previous operation.")) + to_chat(ui.user, span_notice("[src] is busy. Please wait for completion of previous operation.")) return switch(action) diff --git a/code/game/machinery/pda_multicaster.dm b/code/game/machinery/pda_multicaster.dm index acbb0ebbeb..a26f25e219 100644 --- a/code/game/machinery/pda_multicaster.dm +++ b/code/game/machinery/pda_multicaster.dm @@ -57,7 +57,7 @@ visible_message("\the [user] turns \the [src] [toggle ? "on" : "off"].") update_power() if(!toggle) - var/msg = "[usr.client.key] ([usr]) has turned [src] off, at [x],[y],[z]." + var/msg = "[user.client.key] ([user]) has turned [src] off, at [x],[y],[z]." message_admins(msg) log_game(msg) diff --git a/code/game/machinery/petrification.dm b/code/game/machinery/petrification.dm new file mode 100644 index 0000000000..5b061e8006 --- /dev/null +++ b/code/game/machinery/petrification.dm @@ -0,0 +1,254 @@ +/obj/machinery/petrification + name = "odd interface" + desc = "An odd looking machine with an interface, some buttons and a tiny keyboard on the side." + icon = 'icons/obj/machines/petrification.dmi' + icon_state = "petrification" + + idle_power_usage = 100 + active_power_usage = 1000 + use_power = USE_POWER_IDLE + anchored = TRUE + unacidable = TRUE + dir = EAST + var/material = "stone" + var/identifier = "statue" + var/adjective = "hardens" + var/tint = "#ffffff" + var/able_to_unpetrify = TRUE + var/discard_clothes = TRUE + var/mob/living/carbon/human/target + var/list/remotes = list() + +/obj/machinery/petrification/New() + . = ..() + if(!pixel_x && !pixel_y) + pixel_x = (dir & 3) ? 0 : (dir == 4 ? 26 : -26) + pixel_y = (dir & 3) ? (dir == 1 ? 26 : -26) : 0 + +/obj/machinery/petrification/proc/get_viable_targets() + var/list/targets = list() + //dir is the opposite of whichever direction we want to scan + var/turf/center + center = get_step(src, turn(dir, 180)) + if (!center) + return + //square of 3x3 in front of the device + for (var/n = center.x-1; n <= center.x+1; n++) + for (var/m = center.y-1; m <= center.y+1; m++) + var/turf/T = locate(n,m,z) + if (!isturf(T)) + continue + for (var/mob/living/carbon/human/H in T) + if (H.stat == DEAD) + continue + var/option = "[H]["[H]" != H.real_name ? " ([H.real_name])" : ""]" + var/r = 1 + if (option in targets) + while ("[option] ([r])" in targets) + r += 1 + option = "[option] ([r])" + targets[option] = H + return targets + +/obj/machinery/petrification/proc/is_valid_target(var/mob/living/carbon/human/H) + if (QDELETED(H) || !istype(H) || !H.client) + return FALSE + var/turf/T = H.loc + if (!isturf(T)) + return FALSE + var/turf/center + center = get_step(get_turf(src), turn(dir, 180)) + if (!center) + return + if (T.z != z || T.x > center.x + 1 || T.x < center.x - 1 || T.y > center.y + 1 || T.y < center.y - 1) + return FALSE + return TRUE + +/obj/machinery/petrification/proc/popup_msg(var/mob/user, var/message, var/notice = TRUE) + if (notice) + message = "A notice pops up on the interface: \"[message]\"" + if (target) + to_chat(user, span_notice("[message]")) + +/obj/machinery/petrification/proc/petrify(var/mob/user, var/obj/item/petrifier/petrifier = null) + . = FALSE + var/mat = material + var/idt = identifier + var/adj = adjective + var/tnt = tint + var/can_unpetrify = able_to_unpetrify + var/no_clothes = discard_clothes + var/mob/living/carbon/human/statue = target + if (petrifier && istype(petrifier)) + mat = petrifier.material + idt = petrifier.identifier + adj = petrifier.adjective + tnt = petrifier.tint + can_unpetrify = petrifier.able_to_unpetrify + no_clothes = petrifier.discard_clothes + statue = petrifier.target + if (QDELETED(statue) || !istype(statue)) + popup_msg(user, "Invalid target.") + return + if (statue.stat == DEAD) + popup_msg(user, "The target must be alive.") + return + if (!statue.client) + popup_msg(user, "The target must be capable of conscious thought.") + return + if (!istext(mat) || !istext(idt) || !istext(adj) || !istext(tnt)) + popup_msg(user, "Invalid options.") + var/turf/T = statue.loc + if (!istype(T)) + popup_msg(user, "They must be visible to the [petrifier ? "device" : "machine"].") + if (!petrifier) + var/turf/center = get_step(get_turf(src), turn(dir, 180)) + if (!center) + return + if (T.z != z || T.x > center.x + 1 || T.x < center.x - 1 || T.y > center.y + 1 || T.y < center.y - 1) + popup_msg(user, "They are out of range. They must be standing within a 3x3 square in front of the machine.") + return + else + var/turf/center = get_turf(petrifier) + if (!center) + return + if (T.z != center.z || get_dist(center, T) > 4) + popup_msg(user, "They are out of range. They must be standing within 4 tiles of the device.") + return + var/datum/component/gargoyle/comp = statue.GetComponent(/datum/component/gargoyle) + if (no_clothes) + for(var/obj/item/W in statue) + if(istype(W, /obj/item/implant/backup) || istype(W, /obj/item/nif)) + continue + statue.drop_from_inventory(W) + + var/obj/structure/gargoyle/G = new(T, statue, idt, mat, adj, tnt, can_unpetrify, no_clothes) + G.was_rayed = TRUE + + if (can_unpetrify) + add_verb(statue,/mob/living/carbon/human/proc/gargoyle_transformation) + comp?.cooldown = 0 + else + remove_verb(statue,/mob/living/carbon/human/proc/gargoyle_transformation) + remove_verb(statue,/mob/living/carbon/human/proc/gargoyle_pause) + remove_verb(statue,/mob/living/carbon/human/proc/gargoyle_checkenergy) + comp?.cooldown = INFINITY + + if (!petrifier) + visible_message(span_notice("A ray of purple light streams out of \the [src], aimed directly at [statue]. Everywhere the light touches on them quickly [adj] into [mat].")) + SStgui.update_uis(src) + return TRUE + +/obj/machinery/petrification/attack_hand(var/mob/user as mob) + if(..()) + return + user.set_machine(src) + tgui_interact(user) + +/obj/machinery/petrification/tgui_interact(mob/user, datum/tgui/ui = null) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "PetrificationInterface", name) + ui.open() + +/obj/machinery/petrification/tgui_data(mob/user) + var/list/data = list() + data["material"] = material + data["identifier"] = identifier + data["adjective"] = adjective + data["tint"] = tint + var/list/h = rgb2num(tint) + data["t"] = ((h[1]*0.299)+(h[2]*0.587)+(h[3]*0.114)) > 102 //0.4 luminance + data["target"] = "[target ? target : "None"]" + data["able_to_unpetrify"] = able_to_unpetrify + data["discard_clothes"] = discard_clothes + data["can_remote"] = is_valid_target(target) && istext(material) && istext(identifier) && istext(adjective) && istext(tint) + return data + +/obj/machinery/petrification/proc/set_input(var/option, mob/user) + var/list/only_these = list("tint","material","identifier","adjective","able_to_unpetrify","discard_clothes","target") + if (!(option in only_these)) + return + switch(option) + if("tint") + var/new_color = input(user, "Choose the color for the [identifier] to be:", "Statue color", tint) as color|null + if (new_color) + tint = new_color + if("material","identifier","adjective") + var/input = tgui_input_text(user, "What should the [option] be?", "Statue [option]", vars[option], MAX_NAME_LEN) + input = sanitizeSafe(input, 25) + if (length(input) <= 0) + return + if (option == "adjective") + if (copytext_char(input, -1) != "s") + switch(copytext_char(input, -2)) + if ("ss") + input += "es" + if ("sh") + input += "es" + if ("ch") + input += "es" + else + switch(copytext_char(input, -1)) + if("s", "x", "z") + input += "es" + else + input += "s" + vars[option] = input + if("able_to_unpetrify", "discard_clothes") + vars[option] = !vars[option] + if("target") + var/list/targets = get_viable_targets() + if (!length(targets)) + popup_msg(user, "No targets within range. Make sure there is a humanoid being within a 3x3 metre square in front of the interface.") + return + var/selected = input(user, "Choose the target.", "Petrification Target") as null|anything in targets + if (selected && ishuman(targets[selected]) && is_valid_target(targets[selected])) + var/confirmation = tgui_alert(targets[selected], "You have been selected as a petrification target. If you press confirm, you will possibly be turned into a statue, and if the option is selected, possibly one that cannot be reverted back from a statue at all.","Petrification Target",list("Confirm", "Cancel")) + if (confirmation != "Confirm") + popup_msg(user, "They declined the request.", FALSE) + return + var/double = tgui_alert(targets[selected], "This is your last warning, are you -certain-?","Petrification Target",list("Confirm", "Cancel")) + if (confirmation == "Confirm" && double == "Confirm") + target = targets[selected] + else + popup_msg(user, "They declined the request.", FALSE) + +/obj/machinery/petrification/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) + if(..()) + return TRUE + + if (ui.user) + add_fingerprint(ui.user) + + switch(action) + if("set_option") + if (params["option"]) + set_input(params["option"], ui.user) + SStgui.update_uis(src) + return TRUE + if("petrify") + petrify(ui.user) + return TRUE + if("remote") + if (is_valid_target(target) && istext(material) && istext(identifier) && istext(adjective) && istext(tint)) + var/obj/item/petrifier/PE = remotes[target] + if (!QDELETED(PE)) + PE.visible_message(span_warning("\The [PE] disappears!")) + qdel(PE) + var/obj/item/petrifier/P = new(loc, src) + P.material = material + P.identifier = identifier + P.adjective = adjective + P.tint = tint + P.able_to_unpetrify = able_to_unpetrify + P.discard_clothes = discard_clothes + P.target = target + remotes[target] = P + ui.user.put_in_hands(P) + return TRUE + return TRUE + +/obj/item/paper/petrification_notes + name = "written notes" + info = "" + span_italics("Found this buried in the machine over there after digging through it a bit- I hooked it up to one of our displays so it was a bit more usable- seems to be a spare part, it was right next to another one that actually " + span_bold("was") + " hooked up. Turns things into other materials, probably one of the components that makes that machine work.") + "" diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index bf87c9ff93..95bfe9ec34 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -67,10 +67,10 @@ return data -/obj/machinery/pipedispenser/tgui_act(action, params) +/obj/machinery/pipedispenser/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE - if(unwrenched || !usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) + if(unwrenched || !ui.user.canmove || ui.user.stat || ui.user.restrained() || !in_range(loc, ui.user)) return TRUE . = TRUE @@ -101,18 +101,18 @@ else if(istype(recipe, /datum/pipe_recipe/meter)) created_object = new recipe.pipe_type(loc) else - log_runtime(EXCEPTION("Warning: [usr] attempted to spawn pipe recipe type by params [json_encode(params)] ([recipe] [recipe?.type]), but it was not allowed by this machine ([src] [type])")) + log_runtime(EXCEPTION("Warning: [ui.user] attempted to spawn pipe recipe type by params [json_encode(params)] ([recipe] [recipe?.type]), but it was not allowed by this machine ([src] [type])")) return - created_object.add_fingerprint(usr) + created_object.add_fingerprint(ui.user) wait = TRUE VARSET_IN(src, wait, FALSE, 15) /obj/machinery/pipedispenser/attackby(var/obj/item/W as obj, var/mob/user as mob) - src.add_fingerprint(usr) + src.add_fingerprint(user) if (istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter)) - to_chat(usr, span_notice("You put [W] back in [src].")) + to_chat(user, span_notice("You put [W] back in [src].")) user.drop_item() qdel(W) return @@ -128,8 +128,8 @@ src.anchored = FALSE src.stat |= MAINT src.unwrenched = 1 - if (usr.machine==src) - usr << browse(null, "window=pipedispenser") + if (user.machine==src) + user << browse(null, "window=pipedispenser") else /*if (unwrenched==1)*/ playsound(src, W.usesound, 50, 1) to_chat(user, span_notice("You begin to fasten \the [src] to the floor...")) @@ -155,17 +155,17 @@ disposals = TRUE //Allow you to drag-drop disposal pipes into it -/obj/machinery/pipedispenser/disposal/MouseDrop_T(var/obj/structure/disposalconstruct/pipe as obj, mob/usr as mob) - if(!usr.canmove || usr.stat || usr.restrained()) +/obj/machinery/pipedispenser/disposal/MouseDrop_T(var/obj/structure/disposalconstruct/pipe as obj, mob/user as mob) + if(!user.canmove || user.stat || user.restrained()) return - if (!istype(pipe) || get_dist(usr, src) > 1 || get_dist(src,pipe) > 1 ) + if (!istype(pipe) || get_dist(user, src) > 1 || get_dist(src,pipe) > 1 ) return if (pipe.anchored) return - to_chat(usr, span_notice("You shove [pipe] back in [src].")) + to_chat(user, span_notice("You shove [pipe] back in [src].")) qdel(pipe) // adding a pipe dispensers that spawn unhooked from the ground diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm index 0b5c572e13..96f96dcfe3 100644 --- a/code/game/machinery/pipe/pipelayer.dm +++ b/code/game/machinery/pipe/pipelayer.dm @@ -82,7 +82,7 @@ if(default_part_replacement(user, W)) return if (!panel_open && W.has_tool_quality(TOOL_WRENCH)) - P_type_t = tgui_input_list(usr, "Choose pipe type", "Pipe type", Pipes) + P_type_t = tgui_input_list(user, "Choose pipe type", "Pipe type", Pipes) P_type = Pipes[P_type_t] user.visible_message(span_notice("[user] has set \the [src] to manufacture [P_type_t]."), span_notice("You set \the [src] to manufacture [P_type_t].")) return diff --git a/code/game/machinery/pointdefense.dm b/code/game/machinery/pointdefense.dm index ce35f88253..4d4082b75d 100644 --- a/code/game/machinery/pointdefense.dm +++ b/code/game/machinery/pointdefense.dm @@ -62,7 +62,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) return FALSE if(!(get_z(PD) in GetConnectedZlevels(get_z(src)))) - to_chat(usr, span_warning("[PD] is not within control range.")) + to_chat(ui.user, span_warning("[PD] is not within control range.")) return FALSE if(!PD.Activate()) //Activate() whilst the device is active will return false. diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 756508c170..117ab2cda2 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -443,7 +443,7 @@ /obj/machinery/porta_turret/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) if(..()) return TRUE - if(isLocked(usr)) + if(isLocked(ui.user)) return TRUE . = TRUE @@ -1094,7 +1094,7 @@ var/t = sanitizeSafe(tgui_input_text(user, "Enter new turret name", name, finish_name, MAX_NAME_LEN), MAX_NAME_LEN) if(!t) return - if(!in_range(src, usr) && loc != usr) + if(!in_range(src, user) && loc != user) return finish_name = t diff --git a/code/game/machinery/protean_reconstitutor.dm b/code/game/machinery/protean_reconstitutor.dm index f26e23d90c..37eac939c0 100644 --- a/code/game/machinery/protean_reconstitutor.dm +++ b/code/game/machinery/protean_reconstitutor.dm @@ -135,7 +135,7 @@ if(W.has_tool_quality(TOOL_WRENCH)) if(protean_brain || protean_orchestrator || protean_refactory) - var/choice = tgui_input_list(usr, "What component would you like to remove?", "Remove Component", list(protean_brain,protean_orchestrator,protean_refactory)) + var/choice = tgui_input_list(user, "What component would you like to remove?", "Remove Component", list(protean_brain,protean_orchestrator,protean_refactory)) if(!choice) return if(choice == protean_brain) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index c387e5dd3a..8f998d90d9 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -137,18 +137,18 @@ var/list/obj/machinery/requests_console/allConsoles = list() data["announceAuth"] = announceAuth return data -/obj/machinery/requests_console/tgui_act(action, list/params) +/obj/machinery/requests_console/tgui_act(action, list/params, datum/tgui/ui) if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if("write") if(reject_bad_text(params["write"])) recipient = params["write"] //write contains the string of the receiving department's name - var/new_message = sanitize(tgui_input_text(usr, "Write your message:", "Awaiting Input", "")) + var/new_message = sanitize(tgui_input_text(ui.user, "Write your message:", "Awaiting Input", "")) if(new_message) message = new_message screen = RCS_MESSAUTH @@ -164,7 +164,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() . = TRUE if("writeAnnouncement") - var/new_message = sanitize(tgui_input_text(usr, "Write your message:", "Awaiting Input", "")) + var/new_message = sanitize(tgui_input_text(ui.user, "Write your message:", "Awaiting Input", "")) if(new_message) message = new_message else @@ -233,9 +233,9 @@ var/list/obj/machinery/requests_console/allConsoles = list() if(computer_deconstruction_screwdriver(user, O)) return if(istype(O, /obj/item/multitool)) - var/input = sanitize(tgui_input_text(usr, "What Department ID would you like to give this request console?", "Multitool-Request Console Interface", department)) + var/input = sanitize(tgui_input_text(user, "What Department ID would you like to give this request console?", "Multitool-Request Console Interface", department)) if(!input) - to_chat(usr, "No input found. Please hang up and try your call again.") + to_chat(user, "No input found. Please hang up and try your call again.") return department = input announcement.title = "[department] announcement" diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index f7c9f3c6b9..a10c4aa36d 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -78,12 +78,12 @@ return else // insert cell - var/obj/item/cell/C = usr.get_active_hand() + var/obj/item/cell/C = user.get_active_hand() if(istype(C)) user.drop_item() cell = C C.loc = src - C.add_fingerprint(usr) + C.add_fingerprint(user) user.visible_message(span_notice("[user] inserts a power cell into [src]."), span_notice("You insert the power cell into [src].")) power_change() @@ -140,7 +140,7 @@ return data -/obj/machinery/space_heater/tgui_act(action, params) +/obj/machinery/space_heater/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -154,11 +154,11 @@ . = TRUE if("cellremove") - if(cell && !usr.get_active_hand()) - usr.visible_message(span_notice("[usr] removes [cell] from [src]."), span_notice("You remove [cell] from [src].")) + if(cell && !ui.user.get_active_hand()) + ui.user.visible_message(span_notice("[ui.user] removes [cell] from [src]."), span_notice("You remove [cell] from [src].")) cell.update_icon() - usr.put_in_hands(cell) - cell.add_fingerprint(usr) + ui.user.put_in_hands(cell) + cell.add_fingerprint(ui.user) cell = null power_change() . = TRUE @@ -166,14 +166,14 @@ if("cellinstall") if(!cell) - var/obj/item/cell/C = usr.get_active_hand() + var/obj/item/cell/C = ui.user.get_active_hand() if(istype(C)) - usr.drop_item() + ui.user.drop_item() cell = C C.loc = src - C.add_fingerprint(usr) + C.add_fingerprint(ui.user) power_change() - usr.visible_message(span_notice("[usr] inserts \the [C] into \the [src]."), span_notice("You insert \the [C] into \the [src].")) + ui.user.visible_message(span_notice("[ui.user] inserts \the [C] into \the [src]."), span_notice("You insert \the [C] into \the [src].")) . = TRUE /obj/machinery/space_heater/process() diff --git a/code/game/machinery/suit_storage/suit_cycler.dm b/code/game/machinery/suit_storage/suit_cycler.dm index 3db6a74911..e9bbf20649 100644 --- a/code/game/machinery/suit_storage/suit_cycler.dm +++ b/code/game/machinery/suit_storage/suit_cycler.dm @@ -357,7 +357,7 @@ GLOBAL_LIST_EMPTY(suit_cycler_typecache) return data -/obj/machinery/suit_cycler/tgui_act(action, params) +/obj/machinery/suit_cycler/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -409,20 +409,20 @@ GLOBAL_LIST_EMPTY(suit_cycler_typecache) . = TRUE if("lock") - if(allowed(usr)) + if(allowed(ui.user)) locked = !locked - to_chat(usr, "You [locked ? "" : "un"]lock \the [src].") + to_chat(ui.user, "You [locked ? "" : "un"]lock \the [src].") else - to_chat(usr, span_danger("Access denied.")) + to_chat(ui.user, span_danger("Access denied.")) . = TRUE if("eject_guy") - eject_occupant(usr) + eject_occupant(ui.user) . = TRUE if("uv") if(safeties && occupant) - to_chat(usr, span_danger("The cycler has detected an occupant. Please remove the occupant before commencing the decontamination cycle.")) + to_chat(ui.user, span_danger("The cycler has detected an occupant. Please remove the occupant before commencing the decontamination cycle.")) return active = 1 diff --git a/code/game/machinery/suit_storage/suit_storage.dm b/code/game/machinery/suit_storage/suit_storage.dm index 14705c2a47..b4a89aa5c0 100644 --- a/code/game/machinery/suit_storage/suit_storage.dm +++ b/code/game/machinery/suit_storage/suit_storage.dm @@ -120,45 +120,45 @@ data["occupied"] = FALSE return data -/obj/machinery/suit_storage_unit/tgui_act(action, params) //I fucking HATE this proc +/obj/machinery/suit_storage_unit/tgui_act(action, params, datum/tgui/ui) //I fucking HATE this proc if(..() || isUV || isbroken) return TRUE switch(action) if("door") - toggle_open(usr) + toggle_open(ui.user) . = TRUE if("dispense") switch(params["item"]) if("helmet") - dispense_helmet(usr) + dispense_helmet(ui.user) if("mask") - dispense_mask(usr) + dispense_mask(ui.user) if("suit") - dispense_suit(usr) + dispense_suit(ui.user) . = TRUE if("uv") - start_UV(usr) + start_UV(ui.user) . = TRUE if("lock") - toggle_lock(usr) + toggle_lock(ui.user) . = TRUE if("eject_guy") - eject_occupant(usr) + eject_occupant(ui.user) . = TRUE // Panel Open stuff if(!. && panelopen) switch(action) if("toggleUV") - toggleUV(usr) + toggleUV(ui.user) . = TRUE if("togglesafeties") - togglesafeties(usr) + togglesafeties(ui.user) . = TRUE update_icon() - add_fingerprint(usr) + add_fingerprint(ui.user) /obj/machinery/suit_storage_unit/proc/toggleUV(mob/user as mob) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index de8a16c1ab..a642993863 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -17,7 +17,7 @@ var/charges = 1 /obj/machinery/syndicate_beacon/attack_hand(var/mob/user as mob) - usr.set_machine(src) + user.set_machine(src) var/dat = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]...
Identity confirmed,
" if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai)) if(is_special_character(user)) diff --git a/code/game/machinery/syndicatebeacon_vr.dm b/code/game/machinery/syndicatebeacon_vr.dm index 2c91163858..b5762b1849 100644 --- a/code/game/machinery/syndicatebeacon_vr.dm +++ b/code/game/machinery/syndicatebeacon_vr.dm @@ -1,7 +1,7 @@ // Virgo modified syndie beacon, does not give objectives /obj/machinery/syndicate_beacon/virgo/attack_hand(var/mob/user as mob) - usr.set_machine(src) + user.set_machine(src) var/dat = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]...
Identity confirmed,
" if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai)) if(is_special_character(user)) diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm index 683c1dd5f8..3a4e0592af 100644 --- a/code/game/machinery/telecomms/logbrowser.dm +++ b/code/game/machinery/telecomms/logbrowser.dm @@ -75,11 +75,11 @@ ui = new(user, src, "TelecommsLogBrowser", name) ui.open() -/obj/machinery/computer/telecomms/server/tgui_act(action, params) +/obj/machinery/computer/telecomms/server/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if("view") @@ -114,8 +114,8 @@ . = TRUE if("delete") - if(!allowed(usr) && !emagged) - to_chat(usr, span_warning("ACCESS DENIED.")) + if(!allowed(ui.user) && !emagged) + to_chat(ui.user, span_warning("ACCESS DENIED.")) return if(SelectedServer) @@ -128,10 +128,10 @@ . = TRUE if("network") - var/newnet = tgui_input_text(usr, "Which network do you want to view?", "Comm Monitor", network, 15) + var/newnet = tgui_input_text(ui.user, "Which network do you want to view?", "Comm Monitor", network, 15) newnet = sanitize(newnet,15) - if(newnet && ((usr in range(1, src) || issilicon(usr)))) + if(newnet && ((ui.user in range(1, src) || issilicon(ui.user)))) if(length(newnet) > 15) set_temp("FAILED: NETWORK TAG STRING TOO LENGTHY", "bad") return TRUE diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 72fef22286..83f61126ce 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -25,9 +25,9 @@ if (integrity < 100) //Damaged, let's repair! if (T.use(1)) integrity = between(0, integrity + rand(10,20), 100) - to_chat(usr, "You apply the Nanopaste to [src], repairing some of the damage.") + to_chat(user, "You apply the Nanopaste to [src], repairing some of the damage.") else - to_chat(usr, "This machine is already in perfect condition.") + to_chat(user, "This machine is already in perfect condition.") return @@ -210,15 +210,15 @@ data["change_freq"] = change_frequency return data -/obj/machinery/telecomms/bus/Options_Act(action, params) +/obj/machinery/telecomms/bus/Options_Act(action, params, datum/tgui/ui) if(..()) return TRUE switch(action) if("change_freq") . = TRUE - var/newfreq = input(usr, "Specify a new frequency for new signals to change to. Enter null to turn off frequency changing. Decimals assigned automatically.", src, network) as null|num - if(canAccess(usr)) + var/newfreq = input(ui.user, "Specify a new frequency for new signals to change to. Enter null to turn off frequency changing. Decimals assigned automatically.", src, network) as null|num + if(canAccess(ui.user)) if(newfreq) if(findtext(num2text(newfreq), ".")) newfreq *= 10 // shift the decimal one place @@ -274,11 +274,11 @@ overmap_range = clamp(new_range, overmap_range_min, overmap_range_max) update_idle_power_usage(initial(idle_power_usage)**(overmap_range+1)) -/obj/machinery/telecomms/tgui_act(action, params) +/obj/machinery/telecomms/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE - var/obj/item/multitool/P = get_multitool(usr) + var/obj/item/multitool/P = get_multitool(ui.user) switch(action) if("toggle") @@ -288,16 +288,16 @@ . = TRUE if("id") - var/newid = copytext(reject_bad_text(tgui_input_text(usr, "Specify the new ID for this machine", src, id)),1,MAX_MESSAGE_LEN) - if(newid && canAccess(usr)) + var/newid = copytext(reject_bad_text(tgui_input_text(ui.user, "Specify the new ID for this machine", src, id)),1,MAX_MESSAGE_LEN) + if(newid && canAccess(ui.user)) id = newid set_temp("-% New ID assigned: \"[id]\" %-", "average") . = TRUE if("network") - var/newnet = tgui_input_text(usr, "Specify the new network for this machine. This will break all current links.", src, network) + var/newnet = tgui_input_text(ui.user, "Specify the new network for this machine. This will break all current links.", src, network) newnet = sanitize(newnet,15) - if(newnet && canAccess(usr)) + if(newnet && canAccess(ui.user)) if(length(newnet) > 15) set_temp("-% Too many characters in new network tag %-", "average") @@ -313,8 +313,8 @@ if("freq") - var/newfreq = tgui_input_number(usr, "Specify a new frequency to filter (GHz). Decimals assigned automatically.", src, max_value=9999) - if(newfreq && canAccess(usr)) + var/newfreq = tgui_input_number(ui.user, "Specify a new frequency to filter (GHz). Decimals assigned automatically.", src, max_value=9999) + if(newfreq && canAccess(ui.user)) if(findtext(num2text(newfreq), ".")) newfreq *= 10 // shift the decimal one place if(!(newfreq in freq_listening) && newfreq < 10000) @@ -372,7 +372,7 @@ if(Options_Act(action, params)) . = TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) /obj/machinery/telecomms/proc/canAccess(var/mob/user) if(issilicon(user) || in_range(user, src)) diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm index 4198536888..67204b6189 100644 --- a/code/game/machinery/telecomms/telemonitor.dm +++ b/code/game/machinery/telecomms/telemonitor.dm @@ -61,11 +61,11 @@ ui = new(user, src, "TelecommsMachineBrowser", name) ui.open() -/obj/machinery/computer/telecomms/monitor/tgui_act(action, params) +/obj/machinery/computer/telecomms/monitor/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if("view") @@ -100,9 +100,9 @@ . = TRUE if("network") - var/newnet = tgui_input_text(usr, "Which network do you want to view?", "Comm Monitor", network, 15) + var/newnet = tgui_input_text(ui.user, "Which network do you want to view?", "Comm Monitor", network, 15) newnet = sanitize(newnet,15) //Honestly, I'd be amazed if someone managed to do HTML in 15 chars. - if(newnet && ((usr in range(1, src) || issilicon(usr)))) + if(newnet && ((ui.user in range(1, src) || issilicon(ui.user)))) if(length(newnet) > 15) set_temp("FAILED: NETWORK TAG STRING TOO LENGTHY", "bad") return TRUE diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 64b597f9bd..3ada9642b5 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -65,8 +65,8 @@ L = locate("landmark*[C.data]") // use old stype if(istype(L, /obj/effect/landmark/) && istype(L.loc, /turf)) - to_chat(usr, "You insert the coordinates into the machine.") - to_chat(usr, "A message flashes across the screen, reminding the user that the nuclear authentication disk is not transportable via insecure means.") + to_chat(user, "You insert the coordinates into the machine.") + to_chat(user, "A message flashes across the screen, reminding the user that the nuclear authentication disk is not transportable via insecure means.") user.drop_item() qdel(I) @@ -86,7 +86,7 @@ teleport_control.locked = L one_time_use = 1 - add_fingerprint(usr) + add_fingerprint(user) else ..() diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index 23a235faf3..904beff78c 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -99,7 +99,7 @@ return if(istype(W, /obj/item/card/id)||istype(W, /obj/item/pda)) - if(allowed(usr)) + if(allowed(user)) if(emagged) to_chat(user, span_notice("The turret control is unresponsive.")) else @@ -152,10 +152,10 @@ ) return data -/obj/machinery/turretid/tgui_act(action, params) +/obj/machinery/turretid/tgui_act(action, params, datum/tgui/ui) if(..()) return - if(isLocked(usr)) + if(isLocked(ui.user)) return . = TRUE diff --git a/code/game/machinery/upgrade_machinery.dm b/code/game/machinery/upgrade_machinery.dm new file mode 100644 index 0000000000..03a0477c9d --- /dev/null +++ b/code/game/machinery/upgrade_machinery.dm @@ -0,0 +1,39 @@ +// Handles automagically upgrades to machines based on components placed on a machine during map init +/obj/machinery/Initialize(var/mapload) + . = ..() + // Handles automagically upgrades to machines based on components placed on a machine during map init + if(mapload) + spawn(100) + // Sanity checks + if(!QDELETED(src) && isturf(loc)) + handle_mapped_upgrades() +// This is meant to be overridden per machine +/obj/machinery/proc/handle_mapped_upgrades() + return +// Each machine is a special snowflake... sadly. +/obj/machinery/power/smes/buildable/handle_mapped_upgrades() + // Detect new coils placed by mappers + var/list/parts_found = list() + for(var/i = 1, i <= loc.contents.len, i++) + var/obj/item/W = loc.contents[i] + if(istype(W, /obj/item/smes_coil)) + parts_found.Add(W) + // If any coils are on us, clear base coils and rebuild using these ones + if(parts_found.len == 0) + return + while(TRUE) + var/obj/item/smes_coil/C = locate(/obj/item/smes_coil) in component_parts + if(isnull(C)) + break + component_parts.Remove(C) + C.forceMove(src.loc) + C.Destroy() + cur_coils-- + // Rebuild from mapper's coils + for(var/i = 1, i <= parts_found.len, i++) + if (cur_coils < max_coils) + var/obj/item/W = parts_found[i] + cur_coils++ + component_parts.Add(W) + W.forceMove(src) + RefreshParts() diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index 7ae9f4102c..4dd2eae2bb 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -12,7 +12,7 @@ var/insistinga = 0 /obj/machinery/wish_granter/attack_hand(var/mob/living/carbon/human/user as mob) - usr.set_machine(src) + user.set_machine(src) if(chargesa <= 0) to_chat(user, span_infoplain("The Wish Granter lies silent.")) @@ -32,7 +32,7 @@ else chargesa-- insistinga = 0 - var/wish = tgui_input_list(usr, "You want...","Wish", list("Power","Wealth","Immortality","To Kill","Peace")) + var/wish = tgui_input_list(user, "You want...","Wish", list("Power","Wealth","Immortality","To Kill","Peace")) switch(wish) if("Power") to_chat(user, span_boldwarning("Your wish is granted, but at a terrible cost...")) diff --git a/code/game/mecha/combat/fighter.dm b/code/game/mecha/combat/fighter.dm index 387506e7d1..09de44ec12 100644 --- a/code/game/mecha/combat/fighter.dm +++ b/code/game/mecha/combat/fighter.dm @@ -270,9 +270,9 @@ /obj/mecha/combat/fighter/gunpod/attackby(obj/item/W as obj, mob/user as mob) if(istype(W,/obj/item/multitool) && state == 1) - var/new_paint_location = tgui_input_list(usr, "Please select a target zone.", "Paint Zone", list("Fore Stripe", "Aft Stripe", "CANCEL")) + var/new_paint_location = tgui_input_list(user, "Please select a target zone.", "Paint Zone", list("Fore Stripe", "Aft Stripe", "CANCEL")) if(new_paint_location && new_paint_location != "CANCEL") - var/new_paint_color = input(usr, "Please select a paint color.", "Paint Color", null) as color|null + var/new_paint_color = input(user, "Please select a paint color.", "Paint Color", null) as color|null if(new_paint_color) switch(new_paint_location) if("Fore Stripe") diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 6c7b5f2aad..c17eaa485b 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -536,14 +536,14 @@ return data -/obj/machinery/mecha_part_fabricator/tgui_act(action, var/list/params) +/obj/machinery/mecha_part_fabricator/tgui_act(action, list/params, datum/tgui/ui) if(..()) return TRUE . = TRUE - add_fingerprint(usr) - usr.set_machine(src) + add_fingerprint(ui.user) + ui.user.set_machine(src) switch(action) if("sync_rnd") diff --git a/code/game/mecha/mech_prosthetics.dm b/code/game/mecha/mech_prosthetics.dm index fbd3759d9d..e7a72c3653 100644 --- a/code/game/mecha/mech_prosthetics.dm +++ b/code/game/mecha/mech_prosthetics.dm @@ -105,13 +105,13 @@ . = TRUE - add_fingerprint(usr) - usr.set_machine(src) + add_fingerprint(ui.user) + ui.user.set_machine(src) switch(action) if("species") - var/new_species = tgui_input_list(usr, "Select a new species", "Prosfab Species Selection", species_types) - if(new_species && tgui_status(usr, state) == STATUS_INTERACTIVE) + var/new_species = tgui_input_list(ui.user, "Select a new species", "Prosfab Species Selection", species_types) + if(new_species && tgui_status(ui.user, state) == STATUS_INTERACTIVE) species = new_species return if("manufacturer") @@ -124,8 +124,8 @@ continue new_manufacturers += A - var/new_manufacturer = tgui_input_list(usr, "Select a new manufacturer", "Prosfab Species Selection", new_manufacturers) - if(new_manufacturer && tgui_status(usr, state) == STATUS_INTERACTIVE) + var/new_manufacturer = tgui_input_list(ui.user, "Select a new manufacturer", "Prosfab Species Selection", new_manufacturers) + if(new_manufacturer && tgui_status(ui.user, state) == STATUS_INTERACTIVE) manufacturer = new_manufacturer return return FALSE diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 0e7eda66c1..325288ff2e 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1416,7 +1416,7 @@ if(istype(W, /obj/item/card/id)||istype(W, /obj/item/pda)) if(add_req_access || maint_access) - if(internals_access_allowed(usr)) + if(internals_access_allowed(user)) var/obj/item/card/id/id_card if(istype(W, /obj/item/card/id)) id_card = W diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index 8bc612b219..7ba0f91f39 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -26,15 +26,15 @@ /obj/machinery/computer/mecha/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state) var/list/data = ..() - - + + var/list/beacons = list() for(var/obj/item/mecha_parts/mecha_tracking/TR in world) var/list/tr_data = TR.tgui_data(user) if(tr_data) beacons.Add(list(tr_data)) data["beacons"] = beacons - + LAZYINITLIST(stored_data) data["stored_data"] = stored_data @@ -43,12 +43,12 @@ /obj/machinery/computer/mecha/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) if(..()) return TRUE - + switch(action) if("send_message") var/obj/item/mecha_parts/mecha_tracking/MT = locate(params["mt"]) if(istype(MT)) - var/message = sanitize(tgui_input_text(usr, "Input message", "Transmit message")) + var/message = sanitize(tgui_input_text(ui.user, "Input message", "Transmit message")) var/obj/mecha/M = MT.in_mecha() if(message && M) M.occupant_message(message) @@ -65,7 +65,7 @@ if(istype(MT)) stored_data = MT.get_mecha_log() return TRUE - + if("clear_log") stored_data = null return TRUE diff --git a/code/game/mecha/space/shuttle.dm b/code/game/mecha/space/shuttle.dm index 1a7ddfd1d1..b7dd4f35f3 100644 --- a/code/game/mecha/space/shuttle.dm +++ b/code/game/mecha/space/shuttle.dm @@ -68,9 +68,9 @@ /obj/mecha/working/hoverpod/shuttlecraft/attackby(obj/item/W as obj, mob/user as mob) if(istype(W,/obj/item/multitool) && state == 1) - var/new_paint_location = tgui_input_list(usr, "Please select a target zone.", "Paint Zone", list("Central", "Engine", "Base", "Front", "CANCEL")) + var/new_paint_location = tgui_input_list(user, "Please select a target zone.", "Paint Zone", list("Central", "Engine", "Base", "Front", "CANCEL")) if(new_paint_location && new_paint_location != "CANCEL") - var/new_paint_color = input(usr, "Please select a paint color.", "Paint Color", null) as color|null + var/new_paint_color = input(user, "Please select a paint color.", "Paint Color", null) as color|null if(new_paint_color) switch(new_paint_location) if("Central") diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index a27bff7038..5753d327b7 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -194,7 +194,7 @@ var/global/list/image/splatter_cache=list() density = FALSE anchored = TRUE icon = 'icons/effects/blood.dmi' - icon_state = "gibbl5" + icon_state = "gib1" random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6") var/fleshcolor = "#FFFFFF" diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index ca1fcd2f3c..f3c7027f09 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -195,7 +195,7 @@ if(ruined) return - if(tgui_alert(usr, "Do I want to rip the poster from the wall?","You think...",list("Yes","No")) == "Yes") + if(tgui_alert(user, "Do I want to rip the poster from the wall?","You think...",list("Yes","No")) == "Yes") if(ruined || !user.Adjacent(src)) return diff --git a/code/game/objects/effects/decals/posters/posters.dm b/code/game/objects/effects/decals/posters/posters.dm index 7aa5709988..024dc55d40 100644 --- a/code/game/objects/effects/decals/posters/posters.dm +++ b/code/game/objects/effects/decals/posters/posters.dm @@ -180,7 +180,7 @@ if(ruined) return - if(tgui_alert(usr, "Do I want to rip the poster from the wall?","You think...",list("Yes","No")) == "Yes") + if(tgui_alert(user, "Do I want to rip the poster from the wall?","You think...",list("Yes","No")) == "Yes") if(ruined || !user.Adjacent(src)) return diff --git a/code/game/objects/effects/info.dm b/code/game/objects/effects/info.dm new file mode 100644 index 0000000000..e98cf020a1 --- /dev/null +++ b/code/game/objects/effects/info.dm @@ -0,0 +1,28 @@ +/// An info button that, when clicked, puts some text in the user's chat +/obj/effect/abstract/info + name = "info" + icon = 'icons/effects/effects.dmi' + icon_state = "info" + + mouse_opacity = MOUSE_OPACITY_OPAQUE + + /// What should the info button display when clicked? + var/info_text + +/obj/effect/abstract/info/Initialize(mapload, info_text) + . = ..() + + if (!isnull(info_text)) + src.info_text = info_text + +/obj/effect/abstract/info/Click() + . = ..() + to_chat(usr, info_text) + +/obj/effect/abstract/info/MouseEntered(location, control, params) + . = ..() + icon_state = "info_hovered" + +/obj/effect/abstract/info/MouseExited() + . = ..() + icon_state = initial(icon_state) diff --git a/code/game/objects/items/contraband_vr.dm b/code/game/objects/items/contraband_vr.dm index 1052a490b6..85faa40ce9 100644 --- a/code/game/objects/items/contraband_vr.dm +++ b/code/game/objects/items/contraband_vr.dm @@ -11,14 +11,14 @@ /*var/spawn_chance = rand(1,100) switch(spawn_chance) if(0 to 49) - new /obj/random/gun/guarenteed(usr.loc) - to_chat(usr, "You got a thing!") + new /obj/random/gun/guarenteed(user.loc) + to_chat(user, "You got a thing!") if(50 to 99) - new /obj/item/bikehorn/rubberducky(usr.loc) - new /obj/item/bikehorn(usr.loc) - to_chat(usr, "You got two things!") + new /obj/item/bikehorn/rubberducky(user.loc) + new /obj/item/bikehorn(user.loc) + to_chat(user, "You got two things!") if(100) - to_chat(usr, "The box contained nothing!") + to_chat(user, "The box contained nothing!") return */ var/loot = pick(/obj/effect/landmark/costume, @@ -95,7 +95,7 @@ qdel(loot) loot = new_I // swap it //VOREstation edit end - new loot(usr.loc) + new loot(user.loc) to_chat(user, "You unwrap the package.") qdel(src) diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 0ab0aa1223..dd38831b03 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -59,27 +59,26 @@ return data -/obj/item/aicard/tgui_act(action, params) +/obj/item/aicard/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE if(!carded_ai) return - var/user = usr switch(action) if("wipe") - msg_admin_attack("[key_name_admin(user)] wiped [key_name_admin(AI)] with \the [src].") - add_attack_logs(user,carded_ai,"Purged from AI Card") + msg_admin_attack("[key_name_admin(ui.user)] wiped [key_name_admin(AI)] with \the [src].") + add_attack_logs(ui.user,carded_ai,"Purged from AI Card") INVOKE_ASYNC(src, PROC_REF(wipe_ai)) if("radio") carded_ai.aiRadio.disabledAi = !carded_ai.aiRadio.disabledAi to_chat(carded_ai, span_warning("Your Subspace Transceiver has been [carded_ai.aiRadio.disabledAi ? "disabled" : "enabled"]!")) - to_chat(user, span_notice("You [carded_ai.aiRadio.disabledAi ? "disable" : "enable"] the AI's Subspace Transceiver.")) + to_chat(ui.user, span_notice("You [carded_ai.aiRadio.disabledAi ? "disable" : "enable"] the AI's Subspace Transceiver.")) if("wireless") carded_ai.control_disabled = !carded_ai.control_disabled to_chat(carded_ai, span_warning("Your wireless interface has been [carded_ai.control_disabled ? "disabled" : "enabled"]!")) - to_chat(user, span_notice("You [carded_ai.control_disabled ? "disable" : "enable"] the AI's wireless interface.")) + to_chat(ui.user, span_notice("You [carded_ai.control_disabled ? "disable" : "enable"] the AI's wireless interface.")) if(carded_ai.control_disabled && carded_ai.deployed_shell) carded_ai.disconnect_shell("Disconnecting from remote shell due to [src] wireless access interface being disabled.") update_icon() diff --git a/code/game/objects/items/devices/body_snatcher_vr.dm b/code/game/objects/items/devices/body_snatcher_vr.dm index 36474a2bc3..4d288db81c 100644 --- a/code/game/objects/items/devices/body_snatcher_vr.dm +++ b/code/game/objects/items/devices/body_snatcher_vr.dm @@ -17,38 +17,38 @@ flags |= NOBLUDGEON //So borgs don't spark. /obj/item/bodysnatcher/attack(mob/living/M, mob/living/user) - usr.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(ishuman(M) || issilicon(M)) //Allows body swapping with humans, synths, and pAI's/borgs since they all have a mind. - if(usr == M) + if(user == M) to_chat(user,span_warning(" A message pops up on the LED display, informing you that you that the mind transfer to yourself was successful... Wait, did that even do anything?")) return if(!M.mind) //Do they have a mind? - to_chat(usr,span_warning("A warning pops up on the device, informing you that [M] appears braindead.")) + to_chat(user,span_warning("A warning pops up on the device, informing you that [M] appears braindead.")) return if(!M.allow_mind_transfer) - to_chat(usr,span_danger("The target's mind is too complex to be affected!")) + to_chat(user,span_danger("The target's mind is too complex to be affected!")) return if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.resleeve_lock && usr.ckey != H.resleeve_lock) + if(H.resleeve_lock && user.ckey != H.resleeve_lock) to_chat(src, span_danger("[H] cannot be impersonated!")) return if(M.stat == DEAD) //Are they dead? - to_chat(usr,span_warning("A warning pops up on the device, informing you that [M] is dead, and, as such, the mind transfer can not be done.")) + to_chat(user,span_warning("A warning pops up on the device, informing you that [M] is dead, and, as such, the mind transfer can not be done.")) return - var/choice = tgui_alert(usr,"This will swap your mind with the target's mind. This will result in them controlling your body, and you controlling their body. Continue?","Confirmation",list("Continue","Cancel")) - if(choice == "Continue" && usr.get_active_hand() == src && usr.Adjacent(M)) + var/choice = tgui_alert(user,"This will swap your mind with the target's mind. This will result in them controlling your body, and you controlling their body. Continue?","Confirmation",list("Continue","Cancel")) + if(choice == "Continue" && user.get_active_hand() == src && user.Adjacent(M)) - usr.visible_message(span_warning("[usr] pushes the device up their forehead and [M]'s head, the device beginning to let out a series of light beeps!"),span_notice("You begin swap minds with [M]!")) - if(do_after(usr,35 SECONDS,M)) - if(usr.mind && M.mind && M.stat != DEAD && usr.stat != DEAD) - log_and_message_admins("[usr.ckey] used a Bodysnatcher to swap bodies with [M.ckey]") - to_chat(usr,span_notice("Your minds have been swapped! Have a nice day.")) + user.visible_message(span_warning("[user] pushes the device up their forehead and [M]'s head, the device beginning to let out a series of light beeps!"),span_notice("You begin swap minds with [M]!")) + if(do_after(user,35 SECONDS,M)) + if(user.mind && M.mind && M.stat != DEAD && user.stat != DEAD) + log_and_message_admins("[user.ckey] used a Bodysnatcher to swap bodies with [M.ckey]") + to_chat(user,span_notice("Your minds have been swapped! Have a nice day.")) var/datum/mind/user_mind = user.mind var/datum/mind/prey_mind = M.mind var/target_ooc_notes = M.ooc_notes @@ -58,8 +58,8 @@ var/user_likes = user.ooc_notes_likes var/user_dislikes = user.ooc_notes_dislikes M.ghostize() - usr.ghostize() - usr.mind = null + user.ghostize() + user.mind = null M.mind = null user_mind.current = null prey_mind.current = null @@ -73,9 +73,9 @@ user.ooc_notes = target_ooc_notes user.ooc_notes_likes = target_likes user.ooc_notes_dislikes = target_dislikes - usr.sleeping = 10 //Device knocks out both the user and the target. - usr.eye_blurry = 30 //Blurry vision while they both get used to their new body's vision - usr.slurring = 50 //And let's also have them slurring while they attempt to get used to using their new body. + user.sleeping = 10 //Device knocks out both the user and the target. + user.eye_blurry = 30 //Blurry vision while they both get used to their new body's vision + user.slurring = 50 //And let's also have them slurring while they attempt to get used to using their new body. if(ishuman(M)) //Let's not have the AI slurring, even though its downright hilarious. M.sleeping = 10 M.eye_blurry = 30 diff --git a/code/game/objects/items/devices/communicator/UI_tgui.dm b/code/game/objects/items/devices/communicator/UI_tgui.dm index 33cf9408c0..c387c58ec0 100644 --- a/code/game/objects/items/devices/communicator/UI_tgui.dm +++ b/code/game/objects/items/devices/communicator/UI_tgui.dm @@ -318,11 +318,11 @@ if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) . = TRUE switch(action) if("rename") - var/new_name = sanitizeSafe(tgui_input_text(usr,"Please enter your name.","Communicator",usr.name) ) + var/new_name = sanitizeSafe(tgui_input_text(ui.user,"Please enter your name.","Communicator",ui.user.name) ) if(new_name) register_device(new_name) @@ -341,7 +341,7 @@ ringer = !ringer if("set_ringer_tone") - var/ringtone = tgui_input_text(usr, "Set Ringer Tone", "Ringer") + var/ringtone = tgui_input_text(ui.user, "Set Ringer Tone", "Ringer") if(ringtone) ttone = ringtone @@ -360,7 +360,7 @@ if("dial") if(!get_connection_to_tcomms()) - to_chat(usr, span_danger("Error: Cannot connect to Exonet node.")) + to_chat(ui.user, span_danger("Error: Cannot connect to Exonet node.")) return FALSE var/their_address = params["dial"] exonet.send_message(their_address, "voice") @@ -373,16 +373,16 @@ if("message") if(!get_connection_to_tcomms()) - to_chat(usr, span_danger("Error: Cannot connect to Exonet node.")) + to_chat(ui.user, span_danger("Error: Cannot connect to Exonet node.")) return FALSE var/their_address = params["message"] - var/text = sanitizeSafe(tgui_input_text(usr,"Enter your message.","Text Message")) + var/text = sanitizeSafe(tgui_input_text(ui.user,"Enter your message.","Text Message")) if(text) exonet.send_message(their_address, "text", text) im_list += list(list("address" = exonet.address, "to_address" = their_address, "im" = text)) - log_pda("(COMM: [src]) sent \"[text]\" to [exonet.get_atom_from_address(their_address)]", usr) + log_pda("(COMM: [src]) sent \"[text]\" to [exonet.get_atom_from_address(their_address)]", ui.user) var/obj/item/communicator/comm = exonet.get_atom_from_address(their_address) - to_chat(usr, span_notice("[icon2html(src, usr.client)] Sent message to [istype(comm, /obj/item/communicator) ? comm.owner : comm.name], \"[text]\" (Reply)")) + to_chat(ui.user, span_notice("[icon2html(src, ui.user.client)] Sent message to [istype(comm, /obj/item/communicator) ? comm.owner : comm.name], \"[text]\" (Reply)")) for(var/mob/M in player_list) if(M.stat == DEAD && M.client?.prefs?.read_preference(/datum/preference/toggle/ghost_ears)) if(istype(M, /mob/new_player) || M.forbid_seeing_deadchat) @@ -395,16 +395,16 @@ var/name_to_disconnect = params["disconnect"] for(var/mob/living/voice/V in contents) if(name_to_disconnect == sanitize(V.name)) - close_connection(usr, V, "[usr] hung up") + close_connection(ui.user, V, "[ui.user] hung up") for(var/obj/item/communicator/comm in communicating) if(name_to_disconnect == sanitize(comm.name)) - close_connection(usr, comm, "[usr] hung up") + close_connection(ui.user, comm, "[ui.user] hung up") if("startvideo") var/ref_to_video = params["startvideo"] var/obj/item/communicator/comm = locate(ref_to_video) if(comm) - connect_video(usr, comm) + connect_video(ui.user, comm) if("endvideo") if(video_source) @@ -418,15 +418,15 @@ if("hang_up") for(var/mob/living/voice/V in contents) - close_connection(usr, V, "[usr] hung up") + close_connection(ui.user, V, "[ui.user] hung up") for(var/obj/item/communicator/comm in communicating) - close_connection(usr, comm, "[usr] hung up") + close_connection(ui.user, comm, "[ui.user] hung up") if("switch_tab") selected_tab = params["switch_tab"] if("edit") - var/n = tgui_input_text(usr, "Please enter message", name, notehtml, multiline = TRUE, prevent_enter = TRUE) + var/n = tgui_input_text(ui.user, "Please enter message", name, notehtml, multiline = TRUE, prevent_enter = TRUE) n = sanitizeSafe(n, extra = 0) if(n) note = html_decode(n) diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm index 3c5da0ca3e..e765f3a0e1 100644 --- a/code/game/objects/items/devices/defib.dm +++ b/code/game/objects/items/devices/defib.dm @@ -132,7 +132,7 @@ if(!slot_check()) to_chat(user, span_warning("You need to equip [src] before taking out [paddles].")) else - if(!usr.put_in_hands(paddles)) //Detach the paddles into the user's hands + if(!user.put_in_hands(paddles)) //Detach the paddles into the user's hands to_chat(user, span_warning("You need a free hand to hold the paddles!")) update_icon() //success diff --git a/code/game/objects/items/devices/denecrotizer_vr.dm b/code/game/objects/items/devices/denecrotizer_vr.dm index af55b535d4..b82dfb3973 100644 --- a/code/game/objects/items/devices/denecrotizer_vr.dm +++ b/code/game/objects/items/devices/denecrotizer_vr.dm @@ -49,7 +49,7 @@ if(!evaluate_ghost_join(user)) return ..() - tgui_alert_async(usr, "Would you like to become [src]? It is bound to [revivedby].", "Become Mob", list("Yes","No"), CALLBACK(src, PROC_REF(reply_ghost_join)), 20 SECONDS) + tgui_alert_async(user, "Would you like to become [src]? It is bound to [revivedby].", "Become Mob", list("Yes","No"), CALLBACK(src, PROC_REF(reply_ghost_join)), 20 SECONDS) /// A reply to an async alert request was received /mob/living/simple_mob/proc/reply_ghost_join(response) diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm index d6a812a410..ae9b0a5ed5 100644 --- a/code/game/objects/items/devices/floor_painter.dm +++ b/code/game/objects/items/devices/floor_painter.dm @@ -107,7 +107,7 @@ new painting_decal(F, painting_dir, painting_colour) /obj/item/floor_painter/attack_self(var/mob/user) - var/choice = tgui_alert(usr, "Do you wish to change the decal type, paint direction, or paint colour?", "Modify What?", list("Decal","Direction","Colour","Cancel")) + var/choice = tgui_alert(user, "Do you wish to change the decal type, paint direction, or paint colour?", "Modify What?", list("Decal","Direction","Colour","Cancel")) if(choice == "Cancel") return else if(choice == "Decal") diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 84181f8312..e85bb876bc 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -134,14 +134,14 @@ var/mob/living/silicon/robot/R = user if(R.emagged) src.Emag() - to_chat(usr, You short circuit the [src].") + to_chat(user, You short circuit the [src].") return */ - to_chat(usr, "It has [uses] lights remaining.") - var/new_color = input(usr, "Choose a color to set the light to! (Default is [LIGHT_COLOR_INCANDESCENT_TUBE])", "", selected_color) as color|null + to_chat(user, "It has [uses] lights remaining.") + var/new_color = input(user, "Choose a color to set the light to! (Default is [LIGHT_COLOR_INCANDESCENT_TUBE])", "", selected_color) as color|null if(new_color) selected_color = new_color - to_chat(usr, "The light color has been changed.") + to_chat(user, "The light color has been changed.") /obj/item/lightreplacer/update_icon() icon_state = "lightreplacer[emagged]" diff --git a/code/game/objects/items/devices/locker_painter.dm b/code/game/objects/items/devices/locker_painter.dm index d3eb23c42e..141f9a6e25 100644 --- a/code/game/objects/items/devices/locker_painter.dm +++ b/code/game/objects/items/devices/locker_painter.dm @@ -120,7 +120,7 @@ return /obj/item/closet_painter/attack_self(var/mob/user) - var/choice = tgui_alert(usr, "Do you wish to change the regular closet color or the secure closet color?", "Color Selection", list("Regular Closet Colour","Cancel","Secure Closet Colour")) + var/choice = tgui_alert(user, "Do you wish to change the regular closet color or the secure closet color?", "Color Selection", list("Regular Closet Colour","Cancel","Secure Closet Colour")) if(choice == "Regular Closet Colour") choose_colour() else if(choice == "Secure Closet Colour") diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index cdaa821576..65640675b2 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -33,7 +33,7 @@ tool_qualities = list(TOOL_MULTITOOL) /obj/item/multitool/attack_self(mob/living/user) - var/choice = tgui_alert(usr, "What do you want to do with \the [src]?", "Multitool Menu", list("Switch Mode", "Clear Buffers", "Cancel")) + var/choice = tgui_alert(user, "What do you want to do with \the [src]?", "Multitool Menu", list("Switch Mode", "Clear Buffers", "Cancel")) switch(choice) if("Clear Buffers") to_chat(user,span_notice("You clear \the [src]'s memory.")) diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 5aefe909d7..0bad4759a8 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -61,21 +61,21 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/paicard) if(pai != null) //Have a person in them already? return ..() if(is_damage_critical()) - to_chat(usr, span_warning("That card is too damaged to activate!")) + to_chat(user, span_warning("That card is too damaged to activate!")) return var/time_till_respawn = user.time_till_respawn() if(time_till_respawn == -1) // Special case, never allowed to respawn - to_chat(usr, span_warning("Respawning is not allowed!")) + to_chat(user, span_warning("Respawning is not allowed!")) else if(time_till_respawn) // Nonzero time to respawn - to_chat(usr, span_warning("You can't do that yet! You died too recently. You need to wait another [round(time_till_respawn/10/60, 0.1)] minutes.")) + to_chat(user, span_warning("You can't do that yet! You died too recently. You need to wait another [round(time_till_respawn/10/60, 0.1)] minutes.")) return - if(jobban_isbanned(usr, JOB_PAI)) - to_chat(usr,span_warning("You cannot join a pAI card when you are banned from playing as a pAI.")) + if(jobban_isbanned(user, JOB_PAI)) + to_chat(user,span_warning("You cannot join a pAI card when you are banned from playing as a pAI.")) return for(var/ourkey in paikeys) if(ourkey == user.ckey) - to_chat(usr, span_warning("You can't just rejoin any old pAI card!!! Your card still exists.")) + to_chat(user, span_warning("You can't just rejoin any old pAI card!!! Your card still exists.")) return var/choice = tgui_alert(user, "You sure you want to inhabit this PAI, or submit yourself to being recruited?", "Confirmation", list("Inhabit", "Recruit", "Cancel")) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 03a2f53da9..c7720c6f09 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -240,7 +240,7 @@ var/global/list/default_medbay_channels = list( return STATUS_CLOSE return ..() -/obj/item/radio/tgui_act(action, params) +/obj/item/radio/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -251,8 +251,8 @@ var/global/list/default_medbay_channels = list( new_frequency = sanitize_frequency(new_frequency) set_frequency(new_frequency) if(hidden_uplink) - if(hidden_uplink.check_trigger(usr, frequency, traitor_frequency)) - usr << browse(null, "window=radio") + if(hidden_uplink.check_trigger(ui.user, frequency, traitor_frequency)) + ui.user << browse(null, "window=radio") . = TRUE if("broadcast") ToggleBroadcast() @@ -269,7 +269,7 @@ var/global/list/default_medbay_channels = list( . = TRUE if("specFreq") var/freq = params["channel"] - if(has_channel_access(usr, freq)) + if(has_channel_access(ui.user, freq)) set_frequency(text2num(freq)) . = TRUE if("subspace") @@ -277,10 +277,10 @@ var/global/list/default_medbay_channels = list( subspace_transmission = !subspace_transmission if(!subspace_transmission) channels = list() - to_chat(usr, span_notice("Subspace Transmission is disabled")) + to_chat(ui.user, span_notice("Subspace Transmission is disabled")) else recalculateChannels() - to_chat(usr, span_notice("Subspace Transmission is enabled")) + to_chat(ui.user, span_notice("Subspace Transmission is enabled")) . = TRUE if("toggleLoudspeaker") if(!subspace_switchable) @@ -288,12 +288,12 @@ var/global/list/default_medbay_channels = list( loudspeaker = !loudspeaker if(loudspeaker) - to_chat(usr, span_notice("Loadspeaker enabled.")) + to_chat(ui.user, span_notice("Loadspeaker enabled.")) else - to_chat(usr, span_notice("Loadspeaker disabled.")) + to_chat(ui.user, span_notice("Loadspeaker disabled.")) . = TRUE - if(. && iscarbon(usr)) + if(. && iscarbon(ui.user)) playsound(src, "button", 10) GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer) diff --git a/code/game/objects/items/devices/radio/radiopack.dm b/code/game/objects/items/devices/radio/radiopack.dm index 0dd91f0c87..c4e53205cd 100644 --- a/code/game/objects/items/devices/radio/radiopack.dm +++ b/code/game/objects/items/devices/radio/radiopack.dm @@ -64,7 +64,7 @@ if(!slot_check()) to_chat(user, span_warning("You need to equip [src] before taking out [handset].")) else - if(!usr.put_in_hands(handset)) //Detach the handset into the user's hands + if(!user.put_in_hands(handset)) //Detach the handset into the user's hands to_chat(user, span_warning("You need a free hand to hold the handset!")) update_icon() //success diff --git a/code/game/objects/items/devices/scanners/gas.dm b/code/game/objects/items/devices/scanners/gas.dm index 1ec74ff105..29e07259a1 100644 --- a/code/game/objects/items/devices/scanners/gas.dm +++ b/code/game/objects/items/devices/scanners/gas.dm @@ -28,7 +28,7 @@ if (user.stat) return if (!user.IsAdvancedToolUser()) - to_chat(usr, span_warning("You don't have the dexterity to do this!")) + to_chat(user, span_warning("You don't have the dexterity to do this!")) return analyze_gases(src, user) diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm index 4e347a328e..26a57d9984 100644 --- a/code/game/objects/items/devices/spy_bug.dm +++ b/code/game/objects/items/devices/spy_bug.dm @@ -201,7 +201,7 @@ operating = 1 while(selected_camera && Adjacent(user)) - selected_camera = tgui_input_list(usr, "Select camera to view.", "Camera Choice", cameras) + selected_camera = tgui_input_list(user, "Select camera to view.", "Camera Choice", cameras) selected_camera = null operating = 0 diff --git a/code/game/objects/items/devices/ticket_printer.dm b/code/game/objects/items/devices/ticket_printer.dm index b4b8ec4185..51b0d3e8ba 100644 --- a/code/game/objects/items/devices/ticket_printer.dm +++ b/code/game/objects/items/devices/ticket_printer.dm @@ -20,13 +20,13 @@ var/ticket_name = sanitize(tgui_input_text(user, "The Name of the person you are issuing the ticket to.", "Name", max_length = 100)) if(length(ticket_name) > 100) - tgui_alert_async(usr, "Entered name too long. 100 character limit.","Error") + tgui_alert_async(user, "Entered name too long. 100 character limit.","Error") return if(!ticket_name) return var/details = sanitize(tgui_input_text(user, "What is the ticket for? Avoid entering personally identifiable information in this section. This information should not be used to harrass or otherwise make the person feel uncomfortable. (Max length: 200)", "Ticket Details", max_length = 200)) if(length(details) > 200) - tgui_alert_async(usr, "Entered details too long. 200 character limit.","Error") + tgui_alert_async(user, "Entered details too long. 200 character limit.","Error") return if(!details) return @@ -71,13 +71,13 @@ var/ticket_name = sanitize(tgui_input_text(user, "The Name of the person you are issuing the ticket to.", "Name", max_length = 100)) if(length(ticket_name) > 100) - tgui_alert_async(usr, "Entered name too long. 100 character limit.","Error") + tgui_alert_async(user, "Entered name too long. 100 character limit.","Error") return if(!ticket_name) return var/details = sanitize(tgui_input_text(user, "What is the ticket for? This could be anything like travel to a destination or permission to do something! This is not official and does not override any rules or authorities on the station.", "Ticket Details", max_length = 200)) if(length(details) > 200) - tgui_alert_async(usr, "Entered details too long. 200 character limit.","Error") + tgui_alert_async(user, "Entered details too long. 200 character limit.","Error") return if(!details) return diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 535809bc4f..958ce7471c 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -86,7 +86,7 @@ data["valve"] = valve_open return data -/obj/item/transfer_valve/tgui_act(action, params) +/obj/item/transfer_valve/tgui_act(action, params, datum/tgui/ui) if(..()) return . = TRUE @@ -99,7 +99,7 @@ toggle_valve() if("device") if(attached_device) - attached_device.attack_self(usr) + attached_device.attack_self(ui.user) if("remove_device") if(attached_device) attached_device.forceMove(get_turf(src)) @@ -110,7 +110,7 @@ . = FALSE if(.) update_icon() - add_fingerprint(usr) + add_fingerprint(ui.user) /obj/item/transfer_valve/proc/process_activation(var/obj/item/D) if(toggle) diff --git a/code/game/objects/items/devices/translocator_vr.dm b/code/game/objects/items/devices/translocator_vr.dm index 1fe7de3c9a..99a2dde769 100644 --- a/code/game/objects/items/devices/translocator_vr.dm +++ b/code/game/objects/items/devices/translocator_vr.dm @@ -412,7 +412,7 @@ GLOBAL_LIST_BOILERPLATE(premade_tele_beacons, /obj/item/perfect_tele_beacon/stat var/mob/living/L = user var/confirm = tgui_alert(user, "You COULD eat the beacon...", "Eat beacon?", list("Eat it!", "No, thanks.")) if(confirm == "Eat it!") - var/obj/belly/bellychoice = tgui_input_list(usr, "Which belly?","Select A Belly", L.vore_organs) + var/obj/belly/bellychoice = tgui_input_list(user, "Which belly?","Select A Belly", L.vore_organs) if(bellychoice) user.visible_message(span_warning("[user] is trying to stuff \the [src] into [user.gender == MALE ? "his" : user.gender == FEMALE ? "her" : "their"] [bellychoice.name]!"),span_notice("You begin putting \the [src] into your [bellychoice.name]!")) if(do_after(user,5 SECONDS,src)) diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm index c8be5fb654..34b18d7b95 100644 --- a/code/game/objects/items/devices/uplink.dm +++ b/code/game/objects/items/devices/uplink.dm @@ -197,7 +197,7 @@ switch(action) if("buy") var/datum/uplink_item/UI = (locate(params["ref"]) in uplink.items) - UI.buy(src, usr) + UI.buy(src, ui.user) return TRUE if("lock") toggle() diff --git a/code/game/objects/items/petrifier.dm b/code/game/objects/items/petrifier.dm new file mode 100644 index 0000000000..0e976bef48 --- /dev/null +++ b/code/game/objects/items/petrifier.dm @@ -0,0 +1,28 @@ +/obj/item/petrifier + name = "odd button" + desc = "A metal device with a single, purple button on it, and a tiny interface." + icon = 'icons/obj/machines/petrification.dmi' + icon_state = "petrifier" + + var/mob/living/carbon/human/target + var/identifier = "statue" + var/material = "stone" + var/adjective = "hardens" + var/tint = "#FFFFFF" + var/discard_clothes = TRUE + var/able_to_unpetrify = TRUE + var/obj/machinery/petrification/linked + +/obj/item/petrifier/Initialize(mapload, var/to_link) + . = ..() + linked = to_link + +/obj/item/petrifier/attack_self(var/mob/user) + . = ..() + if (!isturf(user.loc) && user.get_ultimate_mob() != target) + to_chat(user, span_warning("The device beeps but does nothing.")) + return + if (linked?.petrify(user, src)) + visible_message(span_notice("A ray of purple light streams out of \the [src], aimed directly at [target]. Everywhere the light touches on them quickly [adjective] into [material].")) + to_chat(user, span_warning("The device fizzles and crumbles into dust.")) + qdel(src) diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 2667b9d3f6..2d93e9c7bc 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -234,7 +234,7 @@ var/t = sanitizeSafe(tgui_input_text(user, "Enter new robot name", src.name, src.created_name), MAX_NAME_LEN) if (!t) return - if (!in_range(src, usr) && src.loc != usr) + if (!in_range(src, user) && src.loc != user) return src.created_name = t diff --git a/code/game/objects/items/selectable_item_vr.dm b/code/game/objects/items/selectable_item_vr.dm index c5997966d4..3183971bce 100644 --- a/code/game/objects/items/selectable_item_vr.dm +++ b/code/game/objects/items/selectable_item_vr.dm @@ -12,7 +12,7 @@ /obj/item/selectable_item/attack_self(mob/user as mob) tgui_alert(user, {"[preface_string]"}, preface_title) - var/chosen_item = tgui_input_list(usr, selection_string, selection_title, item_options) + var/chosen_item = tgui_input_list(user, selection_string, selection_title, item_options) chosen_item = item_options[chosen_item] if(!QDELETED(src) && chosen_item) user.drop_item() @@ -45,4 +45,4 @@ preface_title = "Gender Chemistry Kit" item_options = list("Androrovir" = /obj/item/reagent_containers/glass/beaker/vial/androrovir, "Gynorovir" = /obj/item/reagent_containers/glass/beaker/vial/gynorovir, - "Androgynorovir" = /obj/item/reagent_containers/glass/beaker/vial/androgynorovir) \ No newline at end of file + "Androgynorovir" = /obj/item/reagent_containers/glass/beaker/vial/androgynorovir) diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index 1a63c55db5..66f3ce09d1 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -37,7 +37,7 @@ var/obj/item/weldingtool/WT = W.get_welder() if(WT.remove_fuel(0, user)) cut_overlays() - to_chat(usr, "You slice off [src]'s uneven chunks of aluminum and scorch marks.") + to_chat(user, "You slice off [src]'s uneven chunks of aluminum and scorch marks.") return diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 8e5eb5e8c1..1e3443524f 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -137,7 +137,7 @@ var/multiplier = text2num(params["multiplier"]) if(!multiplier || (multiplier <= 0)) //href exploit protection return - produce_recipe(R, multiplier, usr) + produce_recipe(R, multiplier, ui.user) return TRUE /obj/item/stack/proc/is_valid_recipe(datum/stack_recipe/R, list/recipe_list) @@ -402,7 +402,7 @@ /obj/item/stack/attack_hand(mob/user as mob) if (user.get_inactive_hand() == src) - var/N = tgui_input_number(usr, "How many stacks of [src] would you like to split off? There are currently [amount].", "Split stacks", 1, amount, 1) + var/N = tgui_input_number(user, "How many stacks of [src] would you like to split off? There are currently [amount].", "Split stacks", 1, amount, 1) if(N != round(N)) to_chat(user, span_warning("You cannot separate a non-whole number of stacks!")) return @@ -413,8 +413,8 @@ src.add_fingerprint(user) F.add_fingerprint(user) spawn(0) - if (src && usr.machine==src) - src.interact(usr) + if (src && user.machine==src) + src.interact(user) else ..() return @@ -425,10 +425,10 @@ src.transfer_to(S) spawn(0) //give the stacks a chance to delete themselves if necessary - if (S && usr.machine==S) - S.interact(usr) - if (src && usr.machine==src) - src.interact(usr) + if (S && user.machine==S) + S.interact(user) + if (src && user.machine==src) + src.interact(user) else return ..() diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index ec3fcb8cc4..65ee1e6e0b 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -53,8 +53,8 @@ return if(WT.remove_fuel(0,user)) - new welds_into(usr.loc) - usr.update_icon() + new welds_into(user.loc) + user.update_icon() visible_message(span_notice("\The [src] is shaped by [user.name] with the welding tool."),"You hear welding.") var/obj/item/stack/tile/T = src src = null diff --git a/code/game/objects/items/toys/toys.dm b/code/game/objects/items/toys/toys.dm index 0aab254007..6a444248c6 100644 --- a/code/game/objects/items/toys/toys.dm +++ b/code/game/objects/items/toys/toys.dm @@ -197,8 +197,8 @@ to_chat(user, span_warning("You can't do that right now!")) return - if(tgui_alert(usr, "Are you sure you want to recolor your blade?", "Confirm Recolor", list("Yes", "No")) == "Yes") - var/energy_color_input = input(usr,"","Choose Energy Color",lcolor) as color|null + if(tgui_alert(user, "Are you sure you want to recolor your blade?", "Confirm Recolor", list("Yes", "No")) == "Yes") + var/energy_color_input = input(user,"","Choose Energy Color",lcolor) as color|null if(energy_color_input) lcolor = sanitize_hexcolor(energy_color_input) update_icon() diff --git a/code/game/objects/items/toys/toys_vr.dm b/code/game/objects/items/toys/toys_vr.dm index 6a9b66f0c6..443f4c3f86 100644 --- a/code/game/objects/items/toys/toys_vr.dm +++ b/code/game/objects/items/toys/toys_vr.dm @@ -1023,9 +1023,9 @@ activate(user) /obj/item/toy/desk/MouseDrop(mob/user as mob) // Code from Paper bin, so you can still pick up the deck - if((user == usr && (!( usr.restrained() ) && (!( usr.stat ) && (usr.contents.Find(src) || in_range(src, usr)))))) - if(!istype(usr, /mob/living/simple_mob)) - if( !usr.get_active_hand() ) //if active hand is empty + if((user == usr && (!( user.restrained() ) && (!( user.stat ) && (user.contents.Find(src) || in_range(src, user)))))) + if(!istype(user, /mob/living/simple_mob)) + if(!user.get_active_hand()) //if active hand is empty var/mob/living/carbon/human/H = user var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index 6fccf471ff..25ae7e9f81 100644 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -30,51 +30,51 @@ AI MODULES if (istype(AM, /obj/machinery/computer/aiupload)) var/obj/machinery/computer/aiupload/comp = AM if(comp.stat & NOPOWER) - to_chat(usr, "The upload computer has no power!") + to_chat(user, "The upload computer has no power!") return if(comp.stat & BROKEN) - to_chat(usr, "The upload computer is broken!") + to_chat(user, "The upload computer is broken!") return if (!comp.current) - to_chat(usr, "You haven't selected an AI to transmit laws to!") + to_chat(user, "You haven't selected an AI to transmit laws to!") return if (comp.current.stat == 2 || comp.current.control_disabled == 1) - to_chat(usr, "Upload failed. No signal is being detected from the AI.") + to_chat(user, "Upload failed. No signal is being detected from the AI.") else if (comp.current.see_in_dark == 0) - to_chat(usr, "Upload failed. Only a faint signal is being detected from the AI, and it is not responding to our requests. It may be low on power.") + to_chat(user, "Upload failed. Only a faint signal is being detected from the AI, and it is not responding to our requests. It may be low on power.") else - src.transmitInstructions(comp.current, usr) + src.transmitInstructions(comp.current, user) to_chat(comp.current, "These are your laws now:") comp.current.show_laws() for(var/mob/living/silicon/robot/R in mob_list) if(R.lawupdate && (R.connected_ai == comp.current)) to_chat(R, "These are your laws now:") R.show_laws() - to_chat(usr, "Upload complete. The AI's laws have been modified.") + to_chat(user, "Upload complete. The AI's laws have been modified.") else if (istype(AM, /obj/machinery/computer/borgupload)) var/obj/machinery/computer/borgupload/comp = AM if(comp.stat & NOPOWER) - to_chat(usr, "The upload computer has no power!") + to_chat(user, "The upload computer has no power!") return if(comp.stat & BROKEN) - to_chat(usr, "The upload computer is broken!") + to_chat(user, "The upload computer is broken!") return if (!comp.current) - to_chat(usr, "You haven't selected a robot to transmit laws to!") + to_chat(user, "You haven't selected a robot to transmit laws to!") return if (comp.current.stat == 2 || comp.current.emagged) - to_chat(usr, "Upload failed. No signal is being detected from the robot.") + to_chat(user, "Upload failed. No signal is being detected from the robot.") else if (comp.current.connected_ai) - to_chat(usr, "Upload failed. The robot is slaved to an AI.") + to_chat(user, "Upload failed. The robot is slaved to an AI.") else - src.transmitInstructions(comp.current, usr) + src.transmitInstructions(comp.current, user) to_chat(comp.current, "These are your laws now:") comp.current.show_laws() - to_chat(usr, "Upload complete. The robot's laws have been modified.") + to_chat(user, "Upload complete. The robot's laws have been modified.") else if(istype(AM, /mob/living/silicon/robot)) var/mob/living/silicon/robot/R = AM @@ -133,13 +133,13 @@ AI MODULES /obj/item/aiModule/safeguard/attack_self(var/mob/user as mob) ..() - var/targName = sanitize(tgui_input_text(usr, "Please enter the name of the person to safeguard.", "Safeguard who?", user.name)) + var/targName = sanitize(tgui_input_text(user, "Please enter the name of the person to safeguard.", "Safeguard who?", user.name)) targetName = targName desc = text("A 'safeguard' AI module: 'Safeguard []. Anyone threatening or attempting to harm [] is no longer to be considered a crew member, and is a threat which must be neutralized.'", targetName, targetName) /obj/item/aiModule/safeguard/install(var/obj/machinery/computer/C, var/mob/living/user) if(!targetName) - to_chat(usr, "No name detected on module, please enter one.") + to_chat(user, "No name detected on module, please enter one.") return 0 ..() @@ -159,13 +159,13 @@ AI MODULES /obj/item/aiModule/oneHuman/attack_self(var/mob/user as mob) ..() - var/targName = sanitize(tgui_input_text(usr, "Please enter the name of the person who is the only crew member.", "Who?", user.real_name)) + var/targName = sanitize(tgui_input_text(user, "Please enter the name of the person who is the only crew member.", "Who?", user.real_name)) targetName = targName desc = text("A 'one crew member' AI module: 'Only [] is a crew member.'", targetName) /obj/item/aiModule/oneHuman/install(var/obj/machinery/computer/C, var/mob/living/user) if(!targetName) - to_chat(usr, "No name detected on module, please enter one.") + to_chat(user, "No name detected on module, please enter one.") return 0 return ..() @@ -240,11 +240,11 @@ AI MODULES /obj/item/aiModule/freeform/attack_self(var/mob/user as mob) ..() - var/new_lawpos = tgui_input_number(usr, "Please enter the priority for your new law. Can only write to law sectors 15 and above.", "Law Priority (15+)", lawpos) + var/new_lawpos = tgui_input_number(user, "Please enter the priority for your new law. Can only write to law sectors 15 and above.", "Law Priority (15+)", lawpos) if(new_lawpos < MIN_SUPPLIED_LAW_NUMBER) return lawpos = min(new_lawpos, MAX_SUPPLIED_LAW_NUMBER) var/newlaw = "" - var/targName = sanitize(tgui_input_text(usr, "Please enter a new law for the AI.", "Freeform Law Entry", newlaw)) + var/targName = sanitize(tgui_input_text(user, "Please enter a new law for the AI.", "Freeform Law Entry", newlaw)) newFreeFormLaw = targName desc = "A 'freeform' AI module: ([lawpos]) '[newFreeFormLaw]'" @@ -257,7 +257,7 @@ AI MODULES /obj/item/aiModule/freeform/install(var/obj/machinery/computer/C, var/mob/living/user) if(!newFreeFormLaw) - to_chat(usr, "No law detected on module, please create one.") + to_chat(user, "No law detected on module, please create one.") return 0 ..() @@ -362,7 +362,7 @@ AI MODULES /obj/item/aiModule/freeformcore/attack_self(var/mob/user as mob) ..() var/newlaw = "" - var/targName = sanitize(tgui_input_text(usr, "Please enter a new core law for the AI.", "Freeform Law Entry", newlaw)) + var/targName = sanitize(tgui_input_text(user, "Please enter a new core law for the AI.", "Freeform Law Entry", newlaw)) newFreeFormLaw = targName desc = "A 'freeform' Core AI module: '[newFreeFormLaw]'" @@ -373,7 +373,7 @@ AI MODULES /obj/item/aiModule/freeformcore/install(var/obj/machinery/computer/C, var/mob/living/user) if(!newFreeFormLaw) - to_chat(usr, "No law detected on module, please create one.") + to_chat(user, "No law detected on module, please create one.") return 0 ..() @@ -386,7 +386,7 @@ AI MODULES /obj/item/aiModule/syndicate/attack_self(var/mob/user as mob) ..() var/newlaw = "" - var/targName = sanitize(tgui_input_text(usr, "Please enter a new law for the AI.", "Freeform Law Entry", newlaw)) + var/targName = sanitize(tgui_input_text(user, "Please enter a new law for the AI.", "Freeform Law Entry", newlaw)) newFreeFormLaw = targName desc = "A hacked AI law module: '[newFreeFormLaw]'" @@ -402,7 +402,7 @@ AI MODULES /obj/item/aiModule/syndicate/install(var/obj/machinery/computer/C, var/mob/living/user) if(!newFreeFormLaw) - to_chat(usr, "No law detected on module, please create one.") + to_chat(user, "No law detected on module, please create one.") return 0 ..() diff --git a/code/game/objects/items/weapons/RPD_vr.dm b/code/game/objects/items/weapons/RPD_vr.dm index eab54cac62..b834d81500 100644 --- a/code/game/objects/items/weapons/RPD_vr.dm +++ b/code/game/objects/items/weapons/RPD_vr.dm @@ -112,10 +112,10 @@ return data -/obj/item/pipe_dispenser/tgui_act(action, params) +/obj/item/pipe_dispenser/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE - if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) + if(!ui.user.canmove || ui.user.stat || ui.user.restrained() || !in_range(loc, ui.user)) return TRUE var/playeffect = TRUE switch(action) @@ -217,7 +217,7 @@ var/obj/item/pipe/P = new pipe_item_type(get_turf(A), path, queued_p_dir) P.update() - P.add_fingerprint(usr) + P.add_fingerprint(user) if(R.paintable) P.color = pipe_colors[paint_color] P.setPipingLayer(queued_piping_layer) @@ -248,7 +248,7 @@ activate() - C.add_fingerprint(usr) + C.add_fingerprint(user) C.update_icon() if(mode & WRENCH_MODE) do_wrench(C, user) diff --git a/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm b/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm index 13e4e74b01..84666ffd4d 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm @@ -74,14 +74,14 @@ to_chat(user, span_warning("Circuit controls are locked.")) return var/existing_networks = jointext(network,",") - var/input = sanitize(tgui_input_text(usr, "Which networks would you like to connect this camera console circuit to? Separate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Multitool-Circuitboard interface", existing_networks)) + var/input = sanitize(tgui_input_text(user, "Which networks would you like to connect this camera console circuit to? Separate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Multitool-Circuitboard interface", existing_networks)) if(!input) - to_chat(usr, "No input found please hang up and try your call again.") + to_chat(user, "No input found please hang up and try your call again.") return var/list/tempnetwork = splittext(input, ",") tempnetwork = difflist(tempnetwork,restricted_camera_networks,1) if(tempnetwork.len < 1) - to_chat(usr, "No network found please hang up and try your call again.") + to_chat(user, "No network found please hang up and try your call again.") return network = tempnetwork return diff --git a/code/game/objects/items/weapons/circuitboards/computer/supply.dm b/code/game/objects/items/weapons/circuitboards/computer/supply.dm index 1a3d671b96..30168a939c 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/supply.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/supply.dm @@ -32,7 +32,7 @@ opposite_catastasis = "BROAD" catastasis = "STANDARD" - switch(tgui_alert(usr, "Current receiver spectrum is set to: [catastasis]","Multitool-Circuitboard interface",list("Switch to [opposite_catastasis]","Cancel"))) + switch(tgui_alert(user, "Current receiver spectrum is set to: [catastasis]","Multitool-Circuitboard interface",list("Switch to [opposite_catastasis]","Cancel"))) if("Switch to STANDARD","Switch to BROAD") src.contraband_enabled = !src.contraband_enabled diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index c672280e43..1348a5860c 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -101,7 +101,7 @@ /obj/item/dnainjector/attack(mob/M as mob, mob/user as mob) if (!istype(M, /mob)) return - if (!usr.IsAdvancedToolUser()) + if (!user.IsAdvancedToolUser()) return if(inuse) return 0 diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index ed05e9e8a0..87dfe25071 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -39,7 +39,7 @@ ..() /obj/item/plastique/attack_self(mob/user as mob) - var/newtime = tgui_input_number(usr, "Please set the timer.", "Timer", 10, 60000, 10) + var/newtime = tgui_input_number(user, "Please set the timer.", "Timer", 10, 60000, 10) if(user.get_active_hand() == src) newtime = CLAMP(newtime, 10, 60000) timer = newtime diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index e1b812f880..80f3e19404 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -99,7 +99,7 @@ if (!safety) if (src.reagents.total_volume < 1) - to_chat(usr, span_notice("\The [src] is empty.")) + to_chat(user, span_notice("\The [src] is empty.")) return if (world.time < src.last_use + 20) @@ -136,7 +136,7 @@ W.set_color() W.set_up(my_target) - if((istype(usr.loc, /turf/space)) || (usr.lastarea.get_gravity() == 0)) + if((istype(user.loc, /turf/space)) || (user.lastarea.get_gravity() == 0)) user.inertia_dir = get_dir(target, user) step(user, user.inertia_dir) else diff --git a/code/game/objects/items/weapons/game_kit.dm b/code/game/objects/items/weapons/game_kit.dm index 47b39a164e..e2eac323d2 100644 --- a/code/game/objects/items/weapons/game_kit.dm +++ b/code/game/objects/items/weapons/game_kit.dm @@ -11,15 +11,15 @@ THAT STUPID GAME KIT return src.attack_hand(user) /obj/item/game_kit/MouseDrop(mob/user as mob) - if (user == usr && !usr.restrained() && !usr.stat && (usr.contents.Find(src) || in_range(src, usr))) - if (usr.hand) - if (!usr.l_hand) + if (user == usr && !user.restrained() && !user.stat && (user.contents.Find(src) || in_range(src, user))) + if (user.hand) + if (!user.l_hand) spawn (0) - src.attack_hand(usr, 1, 1) + src.attack_hand(user, 1, 1) else - if (!usr.r_hand) + if (!user.r_hand) spawn (0) - src.attack_hand(usr, 0, 1) + src.attack_hand(user, 0, 1) /obj/item/game_kit/proc/update() var/dat = text("
Game Board

[] remove
", src, (src.selected ? text("Selected: []", src.selected) : "Nothing Selected"), src) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 01caf091bd..efe0c92ae2 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -32,7 +32,7 @@ if(detonator) // detonator.loc=src.loc detonator.detached() - usr.put_in_hands(detonator) + user.put_in_hands(detonator) detonator=null det_time = null stage=0 diff --git a/code/game/objects/items/weapons/id cards/cards.dm b/code/game/objects/items/weapons/id cards/cards.dm index 638fb5be4a..861841a21f 100644 --- a/code/game/objects/items/weapons/id cards/cards.dm +++ b/code/game/objects/items/weapons/id cards/cards.dm @@ -130,11 +130,11 @@ if(istype(O, /obj/item/stack/telecrystal)) var/obj/item/stack/telecrystal/T = O if(T.get_amount() < 1) - to_chat(usr, span_notice("You are not adding enough telecrystals to fuel \the [src].")) + to_chat(user, span_notice("You are not adding enough telecrystals to fuel \the [src].")) return uses += T.get_amount()*0.5 //Gives 5 uses per 10 TC uses = CEILING(uses, 1) //Ensures no decimal uses nonsense, rounds up to be nice - to_chat(usr, span_notice("You add \the [O] to \the [src]. Increasing the uses of \the [src] to [uses].")) + to_chat(user, span_notice("You add \the [O] to \the [src]. Increasing the uses of \the [src] to [uses].")) qdel(O) @@ -201,13 +201,13 @@ if(I) icon = I -/obj/item/card_fluff/attack_self() +/obj/item/card_fluff/attack_self(mob/user) - var/choice = tgui_input_list(usr, "What element would you like to customize?", "Customize Card", list("Band","Stamp","Reset")) + var/choice = tgui_input_list(user, "What element would you like to customize?", "Customize Card", list("Band","Stamp","Reset")) if(!choice) return if(choice == "Band") - var/bandchoice = tgui_input_list(usr, "Select colour", "Band colour", list("red","orange","green","dark green","medical blue","dark blue","purple","tan","pink","gold","white","black")) + var/bandchoice = tgui_input_list(user, "Select colour", "Band colour", list("red","orange","green","dark green","medical blue","dark blue","purple","tan","pink","gold","white","black")) if(!bandchoice) return if(bandchoice == "red") @@ -238,7 +238,7 @@ update_icon() return else if(choice == "Stamp") - var/stampchoice = tgui_input_list(usr, "Select image", "Stamp image", list("ship","cross","big ears","shield","circle-cross","target","smile","frown","peace","exclamation")) + var/stampchoice = tgui_input_list(user, "Select image", "Stamp image", list("ship","cross","big ears","shield","circle-cross","target","smile","frown","peace","exclamation")) if(!stampchoice) return if(stampchoice == "ship") diff --git a/code/game/objects/items/weapons/id cards/syndicate_ids.dm b/code/game/objects/items/weapons/id cards/syndicate_ids.dm index f95d49255e..b6fe6fe37c 100644 --- a/code/game/objects/items/weapons/id cards/syndicate_ids.dm +++ b/code/game/objects/items/weapons/id cards/syndicate_ids.dm @@ -38,7 +38,7 @@ if(!registered_user && register_user(user)) to_chat(user, span_notice("The microscanner marks you as its owner, preventing others from accessing its internals.")) if(registered_user == user) - switch(tgui_alert(usr, "Would you like to edit the ID, or show it?","Show or Edit?", list("Edit","Show"))) + switch(tgui_alert(user, "Would you like to edit the ID, or show it?","Show or Edit?", list("Edit","Show"))) if(null) return if("Edit") diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm index fe4a98091f..48be1714cb 100644 --- a/code/game/objects/items/weapons/implants/implantcase.dm +++ b/code/game/objects/items/weapons/implants/implantcase.dm @@ -24,7 +24,7 @@ var/t = tgui_input_text(user, "What would you like the label to be?", text("[]", src.name), null, MAX_NAME_LEN) if (user.get_active_hand() != I) return - if((!in_range(src, usr) && src.loc != user)) + if((!in_range(src, user) && src.loc != user)) return t = sanitizeSafe(t, MAX_NAME_LEN) if(t) diff --git a/code/game/objects/items/weapons/implants/implantreagent_vr.dm b/code/game/objects/items/weapons/implants/implantreagent_vr.dm index 2188e08ff1..48a60b0f53 100644 --- a/code/game/objects/items/weapons/implants/implantreagent_vr.dm +++ b/code/game/objects/items/weapons/implants/implantreagent_vr.dm @@ -92,7 +92,7 @@ if(container.reagents.total_volume < container.volume) var/container_name = container.name if(rimplant.reagents.trans_to(container, amount = rimplant.transfer_amount)) - user.visible_message(span_notice("[usr] [pick(rimplant.emote_descriptor)] into \the [container_name]."), + user.visible_message(span_notice("[user] [pick(rimplant.emote_descriptor)] into \the [container_name]."), span_notice("You [pick(rimplant.self_emote_descriptor)] some [rimplant.reagent_name] into \the [container_name].")) if(prob(5)) src.visible_message(span_notice("[src] [pick(rimplant.random_emote)].")) // M-mlem. diff --git a/code/game/objects/items/weapons/material/chainsaw.dm b/code/game/objects/items/weapons/material/chainsaw.dm index d1631a2f11..7984198f2a 100644 --- a/code/game/objects/items/weapons/material/chainsaw.dm +++ b/code/game/objects/items/weapons/material/chainsaw.dm @@ -29,7 +29,7 @@ /obj/item/chainsaw/proc/turnOn(mob/user as mob) if(on) return - visible_message("You start pulling the string on \the [src].", "[usr] starts pulling the string on the [src].") + visible_message("You start pulling the string on \the [src].", "[user] starts pulling the string on the [src].") if(max_fuel <= 0) if(do_after(user, 15)) @@ -38,7 +38,7 @@ to_chat(user, "You fumble with the string.") else if(do_after(user, 15)) - visible_message("You start \the [src] up with a loud grinding!", "[usr] starts \the [src] up with a loud grinding!") + visible_message("You start \the [src] up with a loud grinding!", "[user] starts \the [src] up with a loud grinding!") attack_verb = list("shredded", "ripped", "torn") playsound(src, 'sound/weapons/chainsaw_startup.ogg',40,1) force = active_force @@ -91,7 +91,7 @@ Hyd.die() if (istype(A, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,A) <= 1) to_chat(user, span_notice("You begin filling the tank on the chainsaw.")) - if(do_after(usr, 15)) + if(do_after(user, 15)) A.reagents.trans_to_obj(src, max_fuel) playsound(src, 'sound/effects/refill.ogg', 50, 1, -6) to_chat(user, span_notice("Chainsaw succesfully refueled.")) diff --git a/code/game/objects/items/weapons/material/gravemarker.dm b/code/game/objects/items/weapons/material/gravemarker.dm index 9c5b04f526..825376f669 100644 --- a/code/game/objects/items/weapons/material/gravemarker.dm +++ b/code/game/objects/items/weapons/material/gravemarker.dm @@ -66,13 +66,13 @@ return 0 else to_chat(user, span_notice("You begin to place \the [src.name].")) - if(!do_after(usr, 10)) + if(!do_after(user, 10)) return 0 var/obj/structure/gravemarker/G = new /obj/structure/gravemarker/(user.loc, src.get_material()) to_chat(user, span_notice("You place \the [src.name].")) G.grave_name = grave_name G.epitaph = epitaph - G.add_fingerprint(usr) + G.add_fingerprint(user) G.dir = user.dir QDEL_NULL(src) return diff --git a/code/game/objects/items/weapons/material/material_weapons.dm b/code/game/objects/items/weapons/material/material_weapons.dm index 5a1df7edea..0a96d13303 100644 --- a/code/game/objects/items/weapons/material/material_weapons.dm +++ b/code/game/objects/items/weapons/material/material_weapons.dm @@ -145,7 +145,7 @@ to_chat(M, "You should repair [src] first. Try using [kit] on it.") return FALSE M.visible_message("[M] begins to replace parts of [src] with [kit].", "You begin to replace parts of [src] with [kit].") - if(do_after(usr, sharpen_time)) + if(do_after(M, sharpen_time)) M.visible_message("[M] has finished replacing parts of [src].", "You finish replacing parts of [src].") src.set_material(material) return TRUE diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index cd6478d6ff..debbc5cdb4 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -187,8 +187,8 @@ to_chat(user, span_warning("You can't do that right now!")) return - if(tgui_alert(usr, "Are you sure you want to recolor your blade?", "Confirm Recolor", list("Yes", "No")) == "Yes") - var/energy_color_input = input(usr,"","Choose Energy Color",lcolor) as color|null + if(tgui_alert(user, "Are you sure you want to recolor your blade?", "Confirm Recolor", list("Yes", "No")) == "Yes") + var/energy_color_input = input(user,"","Choose Energy Color",lcolor) as color|null if(energy_color_input) lcolor = sanitize_hexcolor(energy_color_input) update_icon() diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 013b527e81..dd18c3a68a 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -16,7 +16,7 @@ /obj/item/teleportation_scroll/attack_self(mob/user as mob) if((user.mind && !wizards.is_antagonist(user.mind))) - to_chat(usr, span_warning("You stare at the scroll but cannot make sense of the markings!")) + to_chat(user, span_warning("You stare at the scroll but cannot make sense of the markings!")) return user.set_machine(src) diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 80da3eb459..d5917f2179 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -208,8 +208,8 @@ if(user.incapacitated() || !istype(user)) to_chat(user, span_warning("You can't do that right now!")) return - if(tgui_alert(usr, "Are you sure you want to recolor your shield?", "Confirm Recolor", list("Yes", "No")) == "Yes") - var/energy_color_input = input(usr,"","Choose Energy Color",lcolor) as color|null + if(tgui_alert(user, "Are you sure you want to recolor your shield?", "Confirm Recolor", list("Yes", "No")) == "Yes") + var/energy_color_input = input(user,"","Choose Energy Color",lcolor) as color|null if(energy_color_input) lcolor = sanitize_hexcolor(energy_color_input) update_icon() diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index f7056d0a63..eeb20d7da9 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -79,7 +79,7 @@ /obj/item/storage/fancy/egg_box/open(mob/user as mob) if(open) return - if (isobserver(usr)) + if (isobserver(user)) return open = TRUE update_icon() diff --git a/code/game/objects/items/weapons/storage/mre.dm b/code/game/objects/items/weapons/storage/mre.dm index 5209591cf6..c164aef120 100644 --- a/code/game/objects/items/weapons/storage/mre.dm +++ b/code/game/objects/items/weapons/storage/mre.dm @@ -36,7 +36,7 @@ MRE Stuff /obj/item/storage/mre/open(mob/user) if(!opened) - to_chat(usr, span_notice("You tear open the bag, breaking the vacuum seal.")) + to_chat(user, span_notice("You tear open the bag, breaking the vacuum seal.")) opened = 1 update_icon() . = ..() @@ -236,7 +236,7 @@ MRE Stuff /obj/item/storage/mrebag/open(mob/user) if(!opened && !isobserver(user)) - to_chat(usr, span_notice("The pouch heats up as you break the vacuum seal.")) + to_chat(user, span_notice("The pouch heats up as you break the vacuum seal.")) opened = 1 update_icon() . = ..() diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 54007da3cf..e3776dbaef 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -52,7 +52,7 @@ if (istype(W, /obj/item/multitool) && (src.open == 1)&& (!src.l_hacking)) user.show_message(span_notice("Now attempting to reset internal memory, please hold."), 1) src.l_hacking = 1 - if (do_after(usr, 100)) + if (do_after(user, 100)) if (prob(40)) src.l_setshort = 1 src.l_set = 0 @@ -84,7 +84,7 @@ if (isliving(user) && Adjacent(user) && (src.locked == 1)) to_chat(user, span_warning("[src] is locked and cannot be opened!")) else if (isliving(user) && Adjacent(user) && (!src.locked)) - src.open(usr) + src.open(user) else for(var/mob/M in range(1)) if (M.s_active == src) @@ -110,7 +110,7 @@ data["l_set"] = l_set return data -/obj/item/storage/secure/tgui_act(action, params) +/obj/item/storage/secure/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE switch (action) @@ -132,12 +132,12 @@ src.locked = 1 cut_overlays() src.code = null - src.close(usr) + src.close(ui.user) else src.code += text("[]", digit) if (length(src.code) > 5) src.code = "ERROR" - src.add_fingerprint(usr) + src.add_fingerprint(ui.user) . = TRUE return @@ -172,7 +172,7 @@ if ((src.loc == user) && (src.locked == 1)) to_chat(user, span_warning("[src] is locked and cannot be opened!")) else if ((src.loc == user) && (!src.locked)) - src.open(usr) + src.open(user) else ..() for(var/mob/M in range(1)) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index d6770d73a9..5fc8d4cd1a 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -787,7 +787,7 @@ var/open = 0 storage_slots = 1 can_hold = list( - /obj/item/clothing/gloves/ring, + /obj/item/clothing/accessory/ring, /obj/item/coin, /obj/item/clothing/accessory/medal ) @@ -801,7 +801,7 @@ if(contents.len >= 1) var/contained_image = null - if(istype(contents[1], /obj/item/clothing/gloves/ring)) + if(istype(contents[1], /obj/item/clothing/accessory/ring)) contained_image = "ring_trinket" else if(istype(contents[1], /obj/item/coin)) contained_image = "coin_trinket" diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 6d6882e0b8..820995c12f 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -141,12 +141,12 @@ var/list/global/tank_gauge_cache = list() var/obj/item/assembly_holder/assy = src.proxyassembly.assembly if(assy.a_left && assy.a_right) - assy.dropInto(usr.loc) + assy.dropInto(user.loc) assy.master = null src.proxyassembly.assembly = null else if(!src.proxyassembly.assembly.a_left) - assy.a_right.dropInto(usr.loc) + assy.a_right.dropInto(user.loc) assy.a_right.holder = null assy.a_right = null src.proxyassembly.assembly = null @@ -257,7 +257,7 @@ var/list/global/tank_gauge_cache = list() return data -/obj/item/tank/tgui_act(action, params) +/obj/item/tank/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE switch(action) @@ -278,10 +278,10 @@ var/list/global/tank_gauge_cache = list() if(.) distribute_pressure = clamp(round(pressure), 0, TANK_MAX_RELEASE_PRESSURE) if("toggle") - toggle_valve(usr) + toggle_valve(ui.user) . = TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) /obj/item/tank/proc/toggle_valve(var/mob/user) if(istype(loc,/mob/living/carbon)) diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index 86c5242026..e0ce8ab19b 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -330,17 +330,17 @@ if(H.nif && H.nif.flag_check(NIF_V_UVFILTER,NIF_FLAGS_VISION)) return //VOREStation Add - NIF switch(safety) if(1) - to_chat(usr, span_warning("Your eyes sting a little.")) + to_chat(user, span_warning("Your eyes sting a little.")) E.damage += rand(1, 2) if(E.damage > 12) user.eye_blurry += rand(3,6) if(0) - to_chat(usr, span_warning("Your eyes burn.")) + to_chat(user, span_warning("Your eyes burn.")) E.damage += rand(2, 4) if(E.damage > 10) E.damage += rand(4,10) if(-1) - to_chat(usr, span_danger("Your thermals intensify the welder's glow. Your eyes itch and burn severely.")) + to_chat(user, span_danger("Your thermals intensify the welder's glow. Your eyes itch and burn severely.")) user.eye_blurry += rand(12,20) E.damage += rand(12, 16) if(safety<2) diff --git a/code/game/objects/items/weapons/tools/wirecutters.dm b/code/game/objects/items/weapons/tools/wirecutters.dm index 031ab1a6f6..c4e073f0a2 100644 --- a/code/game/objects/items/weapons/tools/wirecutters.dm +++ b/code/game/objects/items/weapons/tools/wirecutters.dm @@ -46,7 +46,7 @@ /obj/item/tool/wirecutters/attack(mob/living/carbon/C as mob, mob/user as mob) if(istype(C) && user.a_intent == I_HELP && (C.handcuffed) && (istype(C.handcuffed, /obj/item/handcuffs/cable))) - usr.visible_message("\The [usr] cuts \the [C]'s restraints with \the [src]!",\ + user.visible_message("\The [user] cuts \the [C]'s restraints with \the [src]!",\ "You cut \the [C]'s restraints with \the [src]!",\ "You hear cable being cut.") C.handcuffed = null diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index dd0d55cfce..13db2e0c07 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -104,7 +104,7 @@ if (!can_climb(user)) return - usr.visible_message(span_warning("[user] starts climbing onto \the [src]!")) + user.visible_message(span_warning("[user] starts climbing onto \the [src]!")) LAZYDISTINCTADD(climbers, user) if(!do_after(user,(issmall(user) ? climb_delay * 0.6 : climb_delay))) @@ -115,10 +115,10 @@ LAZYREMOVE(climbers, user) return - usr.forceMove(climb_to(user)) + user.forceMove(climb_to(user)) if (get_turf(user) == get_turf(src)) - usr.visible_message(span_warning("[user] climbs onto \the [src]!")) + user.visible_message(span_warning("[user] climbs onto \the [src]!")) LAZYREMOVE(climbers, user) /obj/structure/proc/climb_to(var/mob/living/user) diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index a7d06703ff..8fd2723c55 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -128,14 +128,13 @@ . = ..() tgui_interact(user) -/obj/item/canvas/tgui_act(action, params) +/obj/item/canvas/tgui_act(action, params, datum/tgui/ui) . = ..() if(. || finalized) return - var/mob/user = usr switch(action) if("paint") - var/obj/item/I = user.get_active_hand() + var/obj/item/I = ui.user.get_active_hand() var/color = get_paint_tool_color(I) if(!color) return FALSE @@ -148,7 +147,7 @@ if("finalize") . = TRUE if(!finalized) - finalize(user) + finalize(ui.user) /obj/item/canvas/proc/finalize(mob/user) finalized = TRUE diff --git a/code/game/objects/structures/crates_lockers/__closets.dm b/code/game/objects/structures/crates_lockers/__closets.dm index e5c252bd17..9c1cba9582 100644 --- a/code/game/objects/structures/crates_lockers/__closets.dm +++ b/code/game/objects/structures/crates_lockers/__closets.dm @@ -319,7 +319,7 @@ return if(W.loc != user) // This should stop mounted modules ending up outside the module. return - usr.drop_item() + user.drop_item() if(W) W.forceMove(loc) else if(istype(W, /obj/item/packageWrap)) @@ -385,7 +385,7 @@ /obj/structure/closet/attack_self_tk(mob/user as mob) add_fingerprint(user) if(!toggle()) - to_chat(usr, span_notice("It won't budge!")) + to_chat(user, span_notice("It won't budge!")) /obj/structure/closet/verb/verb_toggleopen() set src in oview(1) diff --git a/code/game/objects/structures/crates_lockers/closets/coffin.dm b/code/game/objects/structures/crates_lockers/closets/coffin.dm index 6f4cd019da..0fa429bbb5 100644 --- a/code/game/objects/structures/crates_lockers/closets/coffin.dm +++ b/code/game/objects/structures/crates_lockers/closets/coffin.dm @@ -100,7 +100,7 @@ return if(W.loc != user) // This should stop mounted modules ending up outside the module. return - usr.drop_item() + user.drop_item() if(W) W.forceMove(src.loc) else diff --git a/code/game/objects/structures/crates_lockers/closets/walllocker.dm b/code/game/objects/structures/crates_lockers/closets/walllocker.dm index ea27c4a450..08519aa845 100644 --- a/code/game/objects/structures/crates_lockers/closets/walllocker.dm +++ b/code/game/objects/structures/crates_lockers/closets/walllocker.dm @@ -34,10 +34,10 @@ if (istype(user, /mob/living/silicon/ai)) //Added by Strumpetplaya - AI shouldn't be able to return //activate emergency lockers. This fixes that. (Does this make sense, the AI can't call attack_hand, can it? --Mloc) if(!amount) - to_chat(usr, "It's empty..") + to_chat(user, "It's empty..") return if(amount) - to_chat(usr, "You take out some items from \the [src].") + to_chat(user, "You take out some items from \the [src].") for(var/path in spawnitems) new path(src.loc) amount-- @@ -448,4 +448,4 @@ /obj/structure/closet/walllocker_double/engineering/east pixel_x = 32 - dir = EAST \ No newline at end of file + dir = EAST diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 86e68cf820..d376be9a3f 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -72,10 +72,10 @@ update_icon() return else - to_chat(usr, span_warning("You kick the display case.")) + to_chat(user, span_warning("You kick the display case.")) for(var/mob/O in oviewers()) if ((O.client && !( O.blinded ))) - to_chat(O, span_warning("[usr] kicks the display case.")) + to_chat(O, span_warning("[user] kicks the display case.")) src.health -= 2 healthcheck() return diff --git a/code/game/objects/structures/fitness_vr.dm b/code/game/objects/structures/fitness_vr.dm index bf8be53902..f3d6aa082b 100644 --- a/code/game/objects/structures/fitness_vr.dm +++ b/code/game/objects/structures/fitness_vr.dm @@ -27,7 +27,7 @@ if(!can_climb(user)) return - usr.visible_message(span_warning("[user] starts climbing onto \the [src]!")) + user.visible_message(span_warning("[user] starts climbing onto \the [src]!")) LAZYDISTINCTADD(climbers, user) if(!do_after(user,(issmall(user) ? 20 : 34))) @@ -39,11 +39,11 @@ return if(get_turf(user) == get_turf(src)) - usr.forceMove(get_step(src, src.dir)) + user.forceMove(get_step(src, src.dir)) else - usr.forceMove(get_turf(src)) + user.forceMove(get_turf(src)) - usr.visible_message(span_warning("[user] climbed over \the [src]!")) + user.visible_message(span_warning("[user] climbed over \the [src]!")) LAZYREMOVE(climbers, user) /obj/structure/fitness/boxing_ropes/can_climb(var/mob/living/user, post_climb_check=0) //Sets it to keep people from climbing over into the next turf if it is occupied. diff --git a/code/game/objects/structures/gargoyle.dm b/code/game/objects/structures/gargoyle.dm new file mode 100644 index 0000000000..04ef9cd127 --- /dev/null +++ b/code/game/objects/structures/gargoyle.dm @@ -0,0 +1,293 @@ +/obj/structure/gargoyle + name = "statue" + desc = "A very lifelike carving." + density = TRUE + anchored = TRUE + var/mob/living/carbon/human/gargoyle + var/initial_sleep + var/initial_blind + var/initial_is_shifted + var/initial_lying + var/initial_lying_prev + var/wagging + var/flapping + var/obj_integrity = 100 + var/original_int = 100 + var/max_integrity = 100 + var/stored_examine + var/identifier = "statue" + var/material = "stone" + var/adjective = "hardens" + var/list/tail_lower_dirs = list(SOUTH, EAST, WEST) + var/image/tail_image + var/tail_alt = TAIL_UPPER_LAYER + + var/can_revert = TRUE + var/was_rayed = FALSE + +/obj/structure/gargoyle/Initialize(mapload, var/mob/living/carbon/human/H, var/ident_ovr, var/mat_ovr, var/adj_ovr, var/tint_ovr, var/revert = TRUE, var/discard_clothes) + . = ..() + if (isspace(loc) || isopenspace(loc)) + anchored = FALSE + if (!istype(H) || !isturf(H.loc)) + return + var/datum/component/gargoyle/comp = H.GetComponent(/datum/component/gargoyle) + var/tint = "#FFFFFF" + if (comp) + comp.cooldown = world.time + (15 SECONDS) + comp.statue = src + comp.transformed = TRUE + comp.paused = FALSE + identifier = length(comp.identifier) > 0 ? comp.identifier : initial(identifier) + material = length(comp.material) > 0 ? comp.material : initial(material) + tint = length(comp.tint) > 0 ? comp.tint : initial(tint) + adjective = length(comp.adjective) > 0 ? comp.adjective : initial(adjective) + if (copytext_char(adjective, -1) != "s") + adjective += "s" + gargoyle = H + + if (H.get_effective_size(TRUE) < 0.5) // "So small! I can step over it!" + density = FALSE + + if (ident_ovr) + identifier = ident_ovr + if (mat_ovr) + material = mat_ovr + if (adj_ovr) + adjective = adj_ovr + if (tint_ovr) + tint = tint_ovr + + if (H.tail_style?.clip_mask_state) + tail_lower_dirs.Cut() + else if (H.tail_style) + tail_lower_dirs = H.tail_style.lower_layer_dirs.Copy() + tail_alt = H.tail_alt ? TAIL_UPPER_LAYER_ALT : TAIL_UPPER_LAYER + + max_integrity = H.getMaxHealth() + 100 + obj_integrity = H.health + 100 + original_int = obj_integrity + name = "[identifier] of [H.name]" + desc = "A very lifelike [identifier] made of [material]." + stored_examine = H.examine(H) + description_fluff = H.get_description_fluff() + + if (H.buckled) + H.buckled.unbuckle_mob(H, TRUE) + //icon = H.icon + //copy_overlays(H) + + //calculate our tints + var/list/RGB = rgb2num(tint) + + var/colorr = rgb(RGB[1]*0.299, RGB[2]*0.299, RGB[3]*0.299) + var/colorg = rgb(RGB[1]*0.587, RGB[2]*0.587, RGB[3]*0.587) + var/colorb = rgb(RGB[1]*0.114, RGB[2]*0.114, RGB[3]*0.114) + + var/tint_color = list(colorr, colorg, colorb, "#000000") + + var/list/body_layers = HUMAN_BODY_LAYERS + var/list/other_layers = HUMAN_OTHER_LAYERS + for (var/i = 1; i <= length(H.overlays_standing); i++) + if (i in other_layers) + continue + if (discard_clothes && !(i in body_layers)) + continue + if (istype(H.overlays_standing[i], /image) && (i in body_layers)) + var/image/old_image = H.overlays_standing[i] + var/image/new_image = image(old_image) + if (i == TAIL_LOWER_LAYER || i == TAIL_UPPER_LAYER || i == TAIL_UPPER_LAYER_ALT) + tail_image = new_image + new_image.color = tint_color + new_image.layer = old_image.layer + add_overlay(new_image) + else + if (!isnull(H.overlays_standing[i])) + add_overlay(H.overlays_standing[i]) + + initial_sleep = H.sleeping + initial_blind = H.eye_blind + initial_is_shifted = H.is_shifted + transform = H.transform + layer = H.layer + pixel_x = H.pixel_x + pixel_y = H.pixel_y + dir = H.dir + initial_lying = H.lying + initial_lying_prev = H.lying_prev + H.sdisabilities |= MUTE + if (H.appearance_flags & PIXEL_SCALE) + appearance_flags |= PIXEL_SCALE + wagging = H.wagging + H.transforming = TRUE + flapping = H.flapping + H.toggle_tail(FALSE, FALSE) + H.toggle_wing(FALSE, FALSE) + H.visible_message(span_warning("[H]'s skin rapidly [adjective] as they turn to [material]!"), span_warning("Your skin abruptly [adjective] as you turn to [material]!")) + H.forceMove(src) + H.SetBlinded(0) + H.SetSleeping(0) + H.status_flags |= GODMODE + H.updatehealth() + H.canmove = 0 + + can_revert = revert + + START_PROCESSING(SSprocessing, src) + +/obj/structure/gargoyle/Destroy() + STOP_PROCESSING(SSprocessing, src) + if (!gargoyle) + return ..() + if (can_revert) + unpetrify(deleting = FALSE) //don't delete if we're already deleting! + else + visible_message(span_warning("The [identifier] loses shape and crumbles into a pile of [material]!")) + . = ..() + +/obj/structure/gargoyle/process() + if (!gargoyle) + qdel(src) + if (gargoyle.loc != src) + can_revert = TRUE //something's gone wrong, they escaped, lets not qdel them + unpetrify(deal_damage = FALSE, deleting = TRUE) + +/obj/structure/gargoyle/examine_icon() + var/icon/examine_icon = icon(icon=src.icon, icon_state=src.icon_state, dir=SOUTH, frame=1, moving=0) + examine_icon.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + return examine_icon + +/obj/structure/gargoyle/get_description_info() + if (gargoyle) + if (isspace(loc) || isopenspace(loc)) + return + return "It can be [anchored ? "un" : ""]anchored with a wrench." + +/obj/structure/gargoyle/examine(mob/user) + . = ..() + if (gargoyle && stored_examine) + . += "The [identifier] seems to have a bit more to them..." + . += stored_examine + return + +/obj/structure/gargoyle/proc/unpetrify(var/deal_damage = TRUE, var/deleting = FALSE) + if (!gargoyle) + return + var/datum/component/gargoyle/comp = gargoyle.GetComponent(/datum/component/gargoyle) + if (comp) + comp.cooldown = world.time + (15 SECONDS) + comp.statue = null + comp.transformed = FALSE + else + if (was_rayed) + remove_verb(gargoyle,/mob/living/carbon/human/proc/gargoyle_transformation) + if (gargoyle.loc == src) + gargoyle.forceMove(loc) + gargoyle.transform = transform + gargoyle.pixel_x = pixel_x + gargoyle.pixel_y = pixel_y + gargoyle.is_shifted = initial_is_shifted + gargoyle.dir = dir + gargoyle.lying = initial_lying + gargoyle.lying_prev = initial_lying_prev + gargoyle.toggle_tail(wagging, FALSE) + gargoyle.toggle_wing(flapping, FALSE) + gargoyle.sdisabilities &= ~MUTE //why is there no ADD_TRAIT etc here that's actually ussssed + gargoyle.status_flags &= ~GODMODE + gargoyle.SetBlinded(initial_blind) + gargoyle.SetSleeping(initial_sleep) + gargoyle.transforming = FALSE + gargoyle.canmove = 1 + gargoyle.update_canmove() + var/hurtmessage = "" + if (deal_damage) + if (obj_integrity < original_int) + var/f = (original_int - obj_integrity) / 10 + for (var/x in 1 to 10) + gargoyle.adjustBruteLoss(f) + hurtmessage = " " + span_bold("You feel your body take the damage that was dealt while being [material]!") + gargoyle.updatehealth() + alpha = 0 + gargoyle.visible_message(span_warning("[gargoyle]'s skin rapidly reverts, returning them to normal!"), span_warning("Your skin reverts, freeing your movement once more![hurtmessage]")) + gargoyle = null + if (deleting) + qdel(src) + +/obj/structure/gargoyle/return_air() + return return_air_for_internal_lifeform() + +/obj/structure/gargoyle/return_air_for_internal_lifeform(var/mob/living/lifeform) + var/air_type = /datum/gas_mixture/belly_air + if(istype(lifeform)) + air_type = lifeform.get_perfect_belly_air_type() + var/air = new air_type(1000) + return air + +/obj/structure/gargoyle/proc/damage(var/damage) + if (was_rayed) + return //gargoyle quick regenerates, the others don't, so let's not have them getting too damaged + obj_integrity = min(obj_integrity-damage, max_integrity) + if(obj_integrity <= 0) + qdel(src) + +/obj/structure/gargoyle/take_damage(var/damage) + damage(damage) + +/obj/structure/gargoyle/attack_generic(var/mob/user, var/damage, var/attack_message = "hits") + user.do_attack_animation(src) + visible_message(span_danger("[user] [attack_message] the [src]!")) + damage(damage) + +/obj/structure/gargoyle/attackby(var/obj/item/W as obj, var/mob/living/user as mob) + if(W.is_wrench()) + if (isspace(loc) || isopenspace(loc)) + to_chat(user, span_warning("You can't anchor that here!")) + anchored = FALSE + return ..() + playsound(src, W.usesound, 50, 1) + if (do_after(user, (2 SECONDS) * W.toolspeed, target = src)) + to_chat(user, span_notice("You [anchored ? "un" : ""]anchor the [src].")) + anchored = !anchored + else if(!isrobot(user) && gargoyle && gargoyle.vore_selected && gargoyle.trash_catching) + if(istype(W,/obj/item/grab || /obj/item/holder)) + gargoyle.vore_attackby(W, user) + return + if(gargoyle.adminbus_trash || is_type_in_list(W,edible_trash) && W.trash_eatable && !is_type_in_list(W,item_vore_blacklist)) + to_chat(user, span_warning("You slip [W] into [gargoyle]'s [lowertext(gargoyle.vore_selected.name)] .")) + user.drop_item() + W.forceMove(gargoyle.vore_selected) + return + else if (!(W.flags & NOBLUDGEON)) + user.setClickCooldown(user.get_attack_speed(W)) + if(W.damtype == BRUTE || W.damtype == BURN) + user.do_attack_animation(src) + playsound(src, W.hitsound, 50, 1) + damage(W.force) + else + return ..() + +/obj/structure/gargoyle/set_dir(var/new_dir) + . = ..() + if(. && tail_image) + cut_overlay(tail_image) + tail_image.layer = BODY_LAYER + ((dir in tail_lower_dirs) ? TAIL_LOWER_LAYER : tail_alt) + add_overlay(tail_image) + +/obj/structure/gargoyle/hitby(atom/movable/AM as mob|obj,var/speed = THROWFORCE_SPEED_DIVISOR) + if(istype(AM,/obj/item) && gargoyle && gargoyle.vore_selected && gargoyle.trash_catching) + var/obj/item/I = AM + if(gargoyle.adminbus_trash || is_type_in_list(I,edible_trash) && I.trash_eatable && !is_type_in_list(I,item_vore_blacklist)) + gargoyle.hitby(AM, speed) + return + else if(istype(AM,/mob/living) && gargoyle) + var/mob/living/L = AM + if(gargoyle.throw_vore && L.throw_vore && gargoyle.can_be_drop_pred && L.can_be_drop_prey) + var/drop_prey_temp = FALSE + if(gargoyle.can_be_drop_prey) + drop_prey_temp = TRUE + gargoyle.can_be_drop_prey = FALSE //Making sure the original gargoyle body is not the one getting throwvored instead. + gargoyle.hitby(L, speed) + if(drop_prey_temp) + gargoyle.can_be_drop_prey = TRUE + return + return ..() diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 708bba5edd..4c0a488a59 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -233,7 +233,7 @@ return 0 var/wall_fake - add_hiddenprint(usr) + add_hiddenprint(user) if(M.integrity < 50) to_chat(user, span_notice("This material is too soft for use in wall construction.")) @@ -256,7 +256,7 @@ T.set_material(M, reinf_material, girder_material) if(wall_fake) T.can_open = 1 - T.add_hiddenprint(usr) + T.add_hiddenprint(user) qdel(src) return 1 diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 5fe81e6318..7b7f7a6b64 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -151,7 +151,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) return 1 else if (istype(I, /obj/item/reagent_containers/glass/bucket) && mybucket) - I.afterattack(mybucket, usr, 1) + I.afterattack(mybucket, user, 1) update_icon() return 1 @@ -189,12 +189,12 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) //Altclick the cart with a reagent container to pour things into the bucket without putting the bottle in trash /obj/structure/janitorialcart/AltClick(mob/living/user) if(user.incapacitated() || !Adjacent(user)) return - var/obj/I = usr.get_active_hand() + var/obj/I = user.get_active_hand() if(istype(I, /obj/item/mop)) equip_janicart_item(user, I) else if(istype(I, /obj/item/reagent_containers) && mybucket) var/obj/item/reagent_containers/C = I - C.afterattack(mybucket, usr, 1) + C.afterattack(mybucket, user, 1) update_icon() @@ -226,62 +226,62 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) if(..()) return TRUE - var/obj/item/I = usr.get_active_hand() + var/obj/item/I = ui.user.get_active_hand() switch(action) if("bag") if(mybag) - usr.put_in_hands(mybag) - to_chat(usr, span_notice("You take [mybag] from [src].")) + ui.user.put_in_hands(mybag) + to_chat(ui.user, span_notice("You take [mybag] from [src].")) mybag = null nullTguiIcon("mybag") else if(is_type_in_typecache(I, equippable_item_whitelist)) - equip_janicart_item(usr, I) + equip_janicart_item(ui.user, I) if("mop") if(mymop) - usr.put_in_hands(mymop) - to_chat(usr, span_notice("You take [mymop] from [src].")) + ui.user.put_in_hands(mymop) + to_chat(ui.user, span_notice("You take [mymop] from [src].")) mymop = null nullTguiIcon("mymop") else if(is_type_in_typecache(I, equippable_item_whitelist)) - equip_janicart_item(usr, I) + equip_janicart_item(ui.user, I) if("spray") if(myspray) - usr.put_in_hands(myspray) - to_chat(usr, span_notice("You take [myspray] from [src].")) + ui.user.put_in_hands(myspray) + to_chat(ui.user, span_notice("You take [myspray] from [src].")) myspray = null nullTguiIcon("myspray") else if(is_type_in_typecache(I, equippable_item_whitelist)) - equip_janicart_item(usr, I) + equip_janicart_item(ui.user, I) if("replacer") if(myreplacer) - usr.put_in_hands(myreplacer) - to_chat(usr, span_notice("You take [myreplacer] from [src].")) + ui.user.put_in_hands(myreplacer) + to_chat(ui.user, span_notice("You take [myreplacer] from [src].")) myreplacer = null nullTguiIcon("myreplacer") else if(is_type_in_typecache(I, equippable_item_whitelist)) - equip_janicart_item(usr, I) + equip_janicart_item(ui.user, I) if("sign") if(istype(I, /obj/item/clothing/suit/caution) && signs < 4) - equip_janicart_item(usr, I) + equip_janicart_item(ui.user, I) else if(signs) var/obj/item/clothing/suit/caution/sign = locate() in src if(sign) - usr.put_in_hands(sign) - to_chat(usr, span_notice("You take \a [sign] from [src].")) + ui.user.put_in_hands(sign) + to_chat(ui.user, span_notice("You take \a [sign] from [src].")) signs-- if(!signs) nullTguiIcon("signs") else - to_chat(usr, span_notice("[src] doesn't have any signs left.")) + to_chat(ui.user, span_notice("[src] doesn't have any signs left.")) if("bucket") if(mybucket) - mybucket.forceMove(get_turf(usr)) - to_chat(usr, span_notice("You unmount [mybucket] from [src].")) + mybucket.forceMove(get_turf(ui.user)) + to_chat(ui.user, span_notice("You unmount [mybucket] from [src].")) mybucket = null nullTguiIcon("mybucket") else - to_chat(usr, span_notice("((Drag and drop a mop bucket onto [src] to equip it.))")) + to_chat(ui.user, span_notice("((Drag and drop a mop bucket onto [src] to equip it.))")) return FALSE else return FALSE diff --git a/code/game/objects/structures/kitchen_foodcart_vr.dm b/code/game/objects/structures/kitchen_foodcart_vr.dm index d80b3456cf..c15168e9f6 100644 --- a/code/game/objects/structures/kitchen_foodcart_vr.dm +++ b/code/game/objects/structures/kitchen_foodcart_vr.dm @@ -24,9 +24,9 @@ /obj/structure/foodcart/attack_hand(var/mob/user as mob) if(contents.len) - var/obj/item/reagent_containers/food/choice = tgui_input_list(usr, "What would you like to grab from the cart?", "Grab Choice", contents) + var/obj/item/reagent_containers/food/choice = tgui_input_list(user, "What would you like to grab from the cart?", "Grab Choice", contents) if(choice) - if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) + if(!user.canmove || user.stat || user.restrained() || !in_range(loc, user)) return if(ishuman(user)) if(!user.get_active_hand()) @@ -39,4 +39,4 @@ if(contents.len < 5) icon_state = "foodcart-[contents.len]" else - icon_state = "foodcart-5" \ No newline at end of file + icon_state = "foodcart-5" diff --git a/code/game/objects/structures/ledges.dm b/code/game/objects/structures/ledges.dm index 301488f38c..6da40df1c1 100644 --- a/code/game/objects/structures/ledges.dm +++ b/code/game/objects/structures/ledges.dm @@ -54,7 +54,7 @@ if(!can_climb(user)) return - usr.visible_message(span_warning("[user] starts climbing onto \the [src]!")) + user.visible_message(span_warning("[user] starts climbing onto \the [src]!")) LAZYDISTINCTADD(climbers, user) if(!do_after(user,(issmall(user) ? 20 : 34))) @@ -66,11 +66,11 @@ return if(get_turf(user) == get_turf(src)) - usr.forceMove(get_step(src, src.dir)) + user.forceMove(get_step(src, src.dir)) else - usr.forceMove(get_turf(src)) + user.forceMove(get_turf(src)) - usr.visible_message(span_warning("[user] climbed over \the [src]!")) + user.visible_message(span_warning("[user] climbed over \the [src]!")) LAZYREMOVE(climbers, user) /obj/structure/ledge/can_climb(var/mob/living/user, post_climb_check=0) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index db3284c760..d3caa34c3e 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -125,7 +125,7 @@ /obj/structure/mirror/raider/attack_hand(var/mob/living/carbon/human/user) if(istype(get_area(src),/area/syndicate_mothership)) if(istype(user) && user.mind && user.mind.special_role == "Raider" && user.species.name != SPECIES_VOX && is_alien_whitelisted(user, SPECIES_VOX)) - var/choice = tgui_alert(usr, "Do you wish to become a true Vox of the Shoal? This is not reversible.", "Become Vox?", list("No","Yes")) + var/choice = tgui_alert(user, "Do you wish to become a true Vox of the Shoal? This is not reversible.", "Become Vox?", list("No","Yes")) if(choice && choice == "Yes") var/mob/living/carbon/human/vox/vox = new(get_turf(src),SPECIES_VOX) vox.gender = user.gender diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 5cb4e5c707..5af4964bf5 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -124,7 +124,7 @@ var/t = tgui_input_text(user, "What would you like the label to be?", text("[]", src.name), null) if (user.get_active_hand() != P) return - if ((!in_range(src, usr) && src.loc != user)) + if ((!in_range(src, user) && src.loc != user)) return t = sanitizeSafe(t, MAX_NAME_LEN) if (t) @@ -220,7 +220,7 @@ GLOBAL_LIST_BOILERPLATE(all_crematoriums, /obj/structure/morgue/crematorium) /obj/structure/morgue/crematorium/attack_hand(mob/user as mob) if (cremating) - to_chat(usr, span_warning("It's locked.")) + to_chat(user, span_warning("It's locked.")) return if ((src.connected) && (src.locked == 0)) for(var/atom/movable/A as mob|obj in src.connected.loc) @@ -250,7 +250,7 @@ GLOBAL_LIST_BOILERPLATE(all_crematoriums, /obj/structure/morgue/crematorium) var/t = tgui_input_text(user, "What would you like the label to be?", text("[]", src.name), null) if (user.get_active_hand() != P) return - if ((!in_range(src, usr) > 1 && src.loc != user)) + if ((!in_range(src, user) > 1 && src.loc != user)) return t = sanitizeSafe(t, MAX_NAME_LEN) if (t) diff --git a/code/game/objects/structures/morgue_vr.dm b/code/game/objects/structures/morgue_vr.dm index 4d341a1e56..d52ac601e2 100644 --- a/code/game/objects/structures/morgue_vr.dm +++ b/code/game/objects/structures/morgue_vr.dm @@ -15,7 +15,7 @@ return else if(!isemptylist(src.search_contents_for(/obj/item/disk/nuclear))) - to_chat(usr, "You get the feeling that you shouldn't cremate one of the items in the cremator.") + to_chat(user, "You get the feeling that you shouldn't cremate one of the items in the cremator.") return for(var/I in contents) diff --git a/code/game/objects/structures/props/beam_prism.dm b/code/game/objects/structures/props/beam_prism.dm index 75174e6c0c..33b7cf0c50 100644 --- a/code/game/objects/structures/props/beam_prism.dm +++ b/code/game/objects/structures/props/beam_prism.dm @@ -50,7 +50,7 @@ to_chat(user, span_warning("\The [src]'s motors resist your efforts to rotate it. You may need to find some form of controller.")) return - var/confirm = tgui_alert(usr, "Do you want to try to rotate \the [src]?", "[name]", list("Yes", "No")) + var/confirm = tgui_alert(user, "Do you want to try to rotate \the [src]?", "[name]", list("Yes", "No")) if(confirm != "Yes") visible_message(\ span_notice("[user.name] decides not to try turning \the [src]."),\ @@ -59,13 +59,13 @@ var/new_bearing if(free_rotate) - new_bearing = tgui_input_number(usr, "What bearing do you want to rotate \the [src] to?", "[name]", 0, 360, 0) + new_bearing = tgui_input_number(user, "What bearing do you want to rotate \the [src] to?", "[name]", 0, 360, 0) new_bearing = round(new_bearing) if(new_bearing <= -1 || new_bearing > 360) to_chat(user, span_warning("Rotating \the [src] [new_bearing] degrees would be a waste of time.")) return else - var/choice = tgui_input_list(usr, "What point do you want to set \the [src] to?", "[name]", compass_directions) + var/choice = tgui_input_list(user, "What point do you want to set \the [src] to?", "[name]", compass_directions) new_bearing = round(compass_directions[choice]) var/rotate_degrees = new_bearing - degrees_from_north @@ -156,7 +156,7 @@ /obj/structure/prop/prismcontrol/attack_hand(mob/living/user) ..() - var/confirm = tgui_alert(usr, "Do you want to try to rotate \the [src]?", "[name]", list("Yes", "No")) + var/confirm = tgui_alert(user, "Do you want to try to rotate \the [src]?", "[name]", list("Yes", "No")) if(confirm != "Yes") visible_message(\ span_notice("[user.name] decides not to try turning \the [src]."),\ @@ -176,16 +176,16 @@ var/new_bearing if(free_rotate) - new_bearing = tgui_input_number(usr, "What bearing do you want to rotate \the [src] to?", "[name]", 0, 360, 0) + new_bearing = tgui_input_number(user, "What bearing do you want to rotate \the [src] to?", "[name]", 0, 360, 0) new_bearing = round(new_bearing) if(new_bearing <= -1 || new_bearing > 360) to_chat(user, span_warning("Rotating \the [src] [new_bearing] degrees would be a waste of time.")) return else - var/choice = tgui_input_list(usr, "What point do you want to set \the [src] to?", "[name]", compass_directions) + var/choice = tgui_input_list(user, "What point do you want to set \the [src] to?", "[name]", compass_directions) new_bearing = round(compass_directions[choice]) - confirm = tgui_alert(usr, "Are you certain you want to rotate \the [src]?", "[name]", list("Yes", "No")) + confirm = tgui_alert(user, "Are you certain you want to rotate \the [src]?", "[name]", list("Yes", "No")) if(confirm != "Yes") visible_message(\ span_notice("[user.name] decides not to try turning \the [src]."),\ diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 69167f859c..cb7048f66b 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -206,7 +206,7 @@ playsound(src, W.usesound, 50, 1) if(do_after(user, 20, src)) user.visible_message(span_infoplain(span_bold("\The [user]") + " dismantles \the [src]."), span_notice("You dismantle \the [src].")) - new /obj/item/stack/material/steel(get_turf(usr), 2) + new /obj/item/stack/material/steel(get_turf(user), 2) qdel(src) return @@ -285,7 +285,7 @@ if(!can_climb(user)) return - usr.visible_message(span_warning("[user] starts climbing onto \the [src]!")) + user.visible_message(span_warning("[user] starts climbing onto \the [src]!")) LAZYDISTINCTADD(climbers, user) if(!do_after(user,(issmall(user) ? 20 : 34))) @@ -297,11 +297,11 @@ return if(get_turf(user) == get_turf(src)) - usr.forceMove(get_step(src, src.dir)) + user.forceMove(get_step(src, src.dir)) else - usr.forceMove(get_turf(src)) + user.forceMove(get_turf(src)) - usr.visible_message(span_warning("[user] climbed over \the [src]!")) + user.visible_message(span_warning("[user] climbed over \the [src]!")) if(!anchored) take_damage(maxhealth) // Fatboy LAZYREMOVE(climbers, user) diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index f9585448e8..65fbb86b1a 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -37,7 +37,7 @@ /obj/item/sign/attackby(obj/item/tool as obj, mob/user as mob) //construction if(tool.has_tool_quality(TOOL_SCREWDRIVER) && isturf(user.loc)) - var/direction = tgui_input_list(usr, "In which direction?", "Select direction.", list("North", "East", "South", "West", "Cancel")) + var/direction = tgui_input_list(user, "In which direction?", "Select direction.", list("North", "East", "South", "West", "Cancel")) if(direction == "Cancel") return var/target_type = original_type || /obj/structure/sign var/obj/structure/sign/S = new target_type(user.loc) diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm index 8d31e3a3ad..b731aa690d 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm @@ -43,7 +43,7 @@ #undef NEST_RESIST_TIME /obj/structure/bed/nest/user_buckle_mob(mob/M as mob, mob/user as mob) - if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || usr.stat || M.buckled || istype(user, /mob/living/silicon/pai) ) + if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || user.stat || M.buckled || istype(user, /mob/living/silicon/pai) ) return unbuckle_mob() @@ -57,7 +57,7 @@ if(istype(xenos) && !(locate(/obj/item/organ/internal/xenos/hivenode) in xenos.internal_organs)) return - if(M == usr) + if(M == user) return else M.visible_message(\ diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index 92d4af0acb..fc106d1b6e 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -148,7 +148,7 @@ /obj/structure/bed/chair/wheelchair/attack_hand(mob/living/user as mob) if (pulling) - MouseDrop(usr) + MouseDrop(user) else if(has_buckled_mobs()) for(var/A in buckled_mobs) @@ -169,7 +169,7 @@ user.set_dir(get_dir(user, src)) to_chat(user, "You grip \the [name]'s handles.") else - to_chat(usr, "You let go of \the [name]'s handles.") + to_chat(user, "You let go of \the [name]'s handles.") pulling.pulledby = null pulling = null return @@ -228,7 +228,7 @@ /obj/structure/bed/chair/wheelchair/buckle_mob(mob/M as mob, mob/user as mob) if(M == pulling) pulling = null - usr.pulledby = null + user.pulledby = null ..() /obj/structure/bed/chair/wheelchair/MouseDrop(over_object, src_location, over_location) diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 888d0174e6..678513ec03 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -98,14 +98,14 @@ #undef TANK_DISPENSER_CAPACITY -/obj/structure/dispenser/tgui_act(action, params) +/obj/structure/dispenser/tgui_act(action, params, datum/tgui/ui) if(..()) return switch(action) if("plasma") var/obj/item/tank/phoron/tank = locate() in src - if(tank && Adjacent(usr)) - usr.put_in_hands(tank) + if(tank && Adjacent(ui.user)) + ui.user.put_in_hands(tank) phorontanks-- . = TRUE playsound(src, 'sound/items/drop/gascan.ogg', 100, 1, 1) @@ -115,8 +115,8 @@ if(istype(T, /obj/item/tank/oxygen) || istype(T, /obj/item/tank/air) || istype(T, /obj/item/tank/anesthetic)) tank = T break - if(tank && Adjacent(usr)) - usr.put_in_hands(tank) + if(tank && Adjacent(ui.user)) + ui.user.put_in_hands(tank) oxygentanks-- . = TRUE playsound(src, 'sound/items/drop/gascan.ogg', 100, 1, 1) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index c6bab80041..74c86c61e1 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -18,8 +18,8 @@ /obj/structure/toilet/attack_hand(mob/living/user as mob) if(swirlie) - usr.setClickCooldown(user.get_attack_speed()) - usr.visible_message(span_danger("[user] slams the toilet seat onto [swirlie.name]'s head!"), span_notice("You slam the toilet seat onto [swirlie.name]'s head!"), "You hear reverberating porcelain.") + user.setClickCooldown(user.get_attack_speed()) + user.visible_message(span_danger("[user] slams the toilet seat onto [swirlie.name]'s head!"), span_notice("You slam the toilet seat onto [swirlie.name]'s head!"), "You hear reverberating porcelain.") swirlie.adjustBruteLoss(5) return @@ -519,13 +519,13 @@ ..() if(!istype(thing) || !thing.is_open_container()) return ..() - if(!usr.Adjacent(src)) + if(!user.Adjacent(src)) return ..() if(!thing.reagents || thing.reagents.total_volume == 0) - to_chat(usr, span_warning("\The [thing] is empty.")) + to_chat(user, span_warning("\The [thing] is empty.")) return // Clear the vessel. - visible_message(span_infoplain(span_bold("\The [usr]") + " tips the contents of \the [thing] into \the [src].")) + visible_message(span_infoplain(span_bold("\The [user]") + " tips the contents of \the [thing] into \the [src].")) thing.reagents.clear_reagents() thing.update_icon() @@ -549,13 +549,13 @@ to_chat(user, span_warning("Someone's already washing here.")) return - to_chat(usr, span_notice("You start washing your hands.")) + to_chat(user, span_notice("You start washing your hands.")) playsound(src, 'sound/effects/sink_long.ogg', 75, 1) busy = 1 if(!do_after(user, 40, src)) busy = 0 - to_chat(usr, span_notice("You stop washing your hands.")) + to_chat(user, span_notice("You stop washing your hands.")) return busy = 0 @@ -573,6 +573,9 @@ H.l_hand.clean_blood() H.bloody_hands = 0 H.germ_level = 0 + H.hand_blood_color = null + LAZYCLEARLIST(H.blood_DNA) + H.update_bloodied() else user.clean_blood() for(var/mob/V in viewers(src, null)) @@ -620,12 +623,12 @@ var/obj/item/I = O if(!I || !istype(I,/obj/item)) return - to_chat(usr, span_notice("You start washing \the [I].")) + to_chat(user, span_notice("You start washing \the [I].")) busy = 1 if(!do_after(user, 40, src)) busy = 0 - to_chat(usr, span_notice("You stop washing \the [I].")) + to_chat(user, span_notice("You stop washing \the [I].")) return busy = 0 diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 61bb0bf6ee..eb30553d68 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -187,12 +187,12 @@ //Crowbar to complete the assembly, Step 7 complete. else if(W.has_tool_quality(TOOL_CROWBAR)) if(!src.electronics) - to_chat(usr,span_warning("The assembly is missing electronics.")) + to_chat(user,span_warning("The assembly is missing electronics.")) return if(src.electronics && istype(src.electronics, /obj/item/circuitboard/broken)) - to_chat(usr,span_warning("The assembly has broken airlock electronics.")) + to_chat(user,span_warning("The assembly has broken airlock electronics.")) return - usr << browse(null, "window=windoor_access") //Not sure what this actually does... -Ner + user << browse(null, "window=windoor_access") //Not sure what this actually does... -Ner playsound(src, W.usesound, 100, 1) user.visible_message("[user] pries the windoor into the frame.", "You start prying the windoor into the frame.") diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 0b3b88a8d5..a44d915277 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -328,7 +328,7 @@ to_chat(vandal, span_warning("There's too much graffiti here to add more.")) return FALSE - var/message = sanitize(tgui_input_text(usr, "Enter a message to engrave.", "Graffiti"), trim = TRUE) + var/message = sanitize(tgui_input_text(vandal, "Enter a message to engrave.", "Graffiti"), trim = TRUE) if(!message) return FALSE diff --git a/code/modules/admin/admin_secrets.dm b/code/modules/admin/admin_secrets.dm index be0b5b8fb8..6c65a272e2 100644 --- a/code/modules/admin/admin_secrets.dm +++ b/code/modules/admin/admin_secrets.dm @@ -59,7 +59,7 @@ var/datum/admin_secrets/admin_secrets = new() /datum/admin_secret_item/proc/can_execute(var/mob/user) if(can_view(user)) - if(!warn_before_use || tgui_alert(usr, "Execute the command '[name]'?", name, list("No","Yes")) == "Yes") + if(!warn_before_use || tgui_alert(user, "Execute the command '[name]'?", name, list("No","Yes")) == "Yes") return 1 return 0 diff --git a/code/modules/admin/modify_robot.dm b/code/modules/admin/modify_robot.dm index 64f486824d..8aea4d07dc 100644 --- a/code/modules/admin/modify_robot.dm +++ b/code/modules/admin/modify_robot.dm @@ -157,7 +157,7 @@ /datum/eventkit/modify_robot/tgui_state(mob/user) return GLOB.tgui_admin_state -/datum/eventkit/modify_robot/tgui_act(action, params) +/datum/eventkit/modify_robot/tgui_act(action, params, datum/tgui/ui) . = ..() if(.) return @@ -185,8 +185,11 @@ if("select_source") if(source) qdel(source) - source = new /mob/living/silicon/robot(null) var/module_type = robot_modules[params["new_source"]] + if(ispath(module_type, /obj/item/robot_module/robot/syndicate)) + source = new /mob/living/silicon/robot/syndicate(null) + else + source = new /mob/living/silicon/robot(null) source.modtype = params["new_source"] var/obj/item/robot_module/robot/robot_type = new module_type(source) source.sprite_datum = pick(SSrobot_sprites.get_module_sprites(source.modtype, source)) @@ -203,9 +206,15 @@ var/obj/item/add_item = locate(params["module"]) if(!add_item) return TRUE + if(istype(add_item, /obj/item/card/id)) + source.idcard = null source.module.emag.Remove(add_item) source.module.modules.Remove(add_item) source.module.contents.Remove(add_item) + if(istype(add_item, /obj/item/card/id)) + if(target.idcard) + qdel(target.idcard) + target.idcard = add_item target.module.modules.Add(add_item) target.module.contents.Add(add_item) spawn(0) @@ -254,6 +263,8 @@ return TRUE if("rem_module") var/obj/item/rem_item = locate(params["module"]) + if(target.idcard == rem_item) + target.idcard = new /obj/item/card/id/synthetic(target) target.uneq_all() target.hud_used?.update_robot_modules_display(TRUE) target.module.emag.Remove(rem_item) @@ -297,12 +308,12 @@ var/new_upgrade = text2path(params["upgrade"]) if(new_upgrade == /obj/item/borg/upgrade/utility/reset) var/obj/item/borg/upgrade/utility/reset/rmodul = new_upgrade - if(tgui_alert(usr, "Are you sure that you want to install [initial(rmodul.name)] and reset the robot's module?","Confirm",list("Yes","No"))!="Yes") + if(tgui_alert(ui.user, "Are you sure that you want to install [initial(rmodul.name)] and reset the robot's module?","Confirm",list("Yes","No"))!="Yes") return FALSE var/obj/item/borg/upgrade/U = new new_upgrade(null) if(new_upgrade == /obj/item/borg/upgrade/utility/rename) var/obj/item/borg/upgrade/utility/rename/UN = U - var/new_name = sanitizeSafe(tgui_input_text(usr, "Enter new robot name", "Robot Reclassification", UN.heldname, MAX_NAME_LEN), MAX_NAME_LEN) + var/new_name = sanitizeSafe(tgui_input_text(ui.user, "Enter new robot name", "Robot Reclassification", UN.heldname, MAX_NAME_LEN), MAX_NAME_LEN) if(new_name) UN.heldname = new_name U = UN @@ -492,7 +503,7 @@ target.lawsync() return TRUE if("change_supplied_law_position") - var/new_position = tgui_input_number(usr, "Enter new supplied law position between 1 and [MAX_SUPPLIED_LAW_NUMBER], inclusive. Inherent laws at the same index as a supplied law will not be stated.", "Law Position", supplied_law_position, MAX_SUPPLIED_LAW_NUMBER, 1) + var/new_position = tgui_input_number(ui.user, "Enter new supplied law position between 1 and [MAX_SUPPLIED_LAW_NUMBER], inclusive. Inherent laws at the same index as a supplied law will not be stated.", "Law Position", supplied_law_position, MAX_SUPPLIED_LAW_NUMBER, 1) if(isnum(new_position)) supplied_law_position = CLAMP(new_position, 1, MAX_SUPPLIED_LAW_NUMBER) target.lawsync() @@ -500,7 +511,7 @@ if("edit_law") var/datum/ai_law/AL = locate(params["edit_law"]) in target.laws.all_laws() if(AL) - var/new_law = sanitize(tgui_input_text(usr, "Enter new law. Leaving the field blank will cancel the edit.", "Edit Law", AL.law)) + var/new_law = sanitize(tgui_input_text(ui.user, "Enter new law. Leaving the field blank will cancel the edit.", "Edit Law", AL.law)) if(new_law && new_law != AL.law) AL.law = new_law target.lawsync() @@ -533,8 +544,8 @@ for(var/mob/living/silicon/robot/R in AI.connected_robots) to_chat(R, span_danger("Law Notice")) R.laws.show_laws(R) - if(usr != target) - to_chat(usr, span_notice("Laws displayed.")) + if(ui.user != target) + to_chat(ui.user, span_notice("Laws displayed.")) return TRUE if("select_ai") selected_ai = locate(params["new_ai"]) diff --git a/code/modules/admin/player_effects.dm b/code/modules/admin/player_effects.dm index 921795beb7..ce23bbd152 100644 --- a/code/modules/admin/player_effects.dm +++ b/code/modules/admin/player_effects.dm @@ -39,11 +39,11 @@ /datum/eventkit/player_effects/tgui_state(mob/user) return GLOB.tgui_admin_state -/datum/eventkit/player_effects/tgui_act(action) +/datum/eventkit/player_effects/tgui_act(action, list/params, datum/tgui/ui) . = ..() if(.) return - if(!check_rights_for(usr.client, R_SPAWN)) + if(!check_rights_for(ui.user.client, R_SPAWN)) return log_and_message_admins("[key_name(user)] used player effect: [action] on [target.ckey] playing [target.name]") @@ -66,7 +66,7 @@ to_chat(user,"[target] didn't have any breakable legs, sorry.") if("bluespace_artillery") - bluespace_artillery(target,usr) + bluespace_artillery(target, ui.user) if("spont_combustion") var/mob/living/carbon/human/Tar = target @@ -137,14 +137,14 @@ "Orange Eyes (Light)" = /mob/living/simple_mob/shadekin/orange/white, "Orange Eyes (Brown)" = /mob/living/simple_mob/shadekin/orange/brown, "Rivyr (Unique)" = /mob/living/simple_mob/shadekin/blue/rivyr) - var/kin_type = tgui_input_list(usr, "Select the type of shadekin for [target] nomf","Shadekin Type Choice", kin_types) + var/kin_type = tgui_input_list(ui.user, "Select the type of shadekin for [target] nomf","Shadekin Type Choice", kin_types) if(!kin_type || !target) return kin_type = kin_types[kin_type] - var/myself = tgui_alert(usr, "Control the shadekin yourself or delete pred and prey after?","Control Shadekin?",list("Control","Cancel","Delete")) + var/myself = tgui_alert(ui.user, "Control the shadekin yourself or delete pred and prey after?","Control Shadekin?",list("Control","Cancel","Delete")) if(!myself || myself == "Cancel" || !target) return @@ -187,13 +187,13 @@ if("redspace_abduct") - redspace_abduction(target, usr) + redspace_abduction(target, ui.user) if("autosave") - fake_autosave(target, usr) + fake_autosave(target, ui.user) if("autosave2") - fake_autosave(target, usr, TRUE) + fake_autosave(target, ui.user, TRUE) if("adspam") if(target.client) @@ -718,7 +718,7 @@ if(where == "To Me") user.client.Getmob(target) if(where == "To Mob") - var/mob/selection = tgui_input_list(usr, "Select a mob to jump [target] to:", "Jump to mob", mob_list) + var/mob/selection = tgui_input_list(ui.user, "Select a mob to jump [target] to:", "Jump to mob", mob_list) target.on_mob_jump() target.forceMove(get_turf(selection)) log_admin("[key_name(user)] jumped [target] to [selection]") @@ -765,22 +765,22 @@ if("ai") if(!istype(target, /mob/living)) - to_chat(usr, span_notice("This can only be used on instances of type /mob/living")) + to_chat(ui.user, span_notice("This can only be used on instances of type /mob/living")) return var/mob/living/L = target if(L.client || L.teleop) - to_chat(usr, span_warning("This cannot be used on player mobs!")) + to_chat(ui.user, span_warning("This cannot be used on player mobs!")) return if(L.ai_holder) //Cleaning up the original ai var/ai_holder_old = L.ai_holder L.ai_holder = null qdel(ai_holder_old) //Only way I could make #TESTING - Unable to be GC'd to stop. del() logs show it works. - L.ai_holder_type = tgui_input_list(usr, "Choose AI holder", "AI Type", typesof(/datum/ai_holder/)) + L.ai_holder_type = tgui_input_list(ui.user, "Choose AI holder", "AI Type", typesof(/datum/ai_holder/)) L.initialize_ai_holder() - L.faction = sanitize(tgui_input_text(usr, "Please input AI faction", "AI faction", "neutral")) - L.a_intent = tgui_input_list(usr, "Please choose AI intent", "AI intent", list(I_HURT, I_HELP)) - if(tgui_alert(usr, "Make mob wake up? This is needed for carbon mobs.", "Wake mob?", list("Yes", "No")) == "Yes") + L.faction = sanitize(tgui_input_text(ui.user, "Please input AI faction", "AI faction", "neutral")) + L.a_intent = tgui_input_list(ui.user, "Please choose AI intent", "AI intent", list(I_HURT, I_HELP)) + if(tgui_alert(ui.user, "Make mob wake up? This is needed for carbon mobs.", "Wake mob?", list("Yes", "No")) == "Yes") L.AdjustSleeping(-100) if("cloaking") diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 18ff612d9a..ba2e7afcb2 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -678,9 +678,11 @@ var/datum/planet/planet = tgui_input_list(usr, "Which planet do you want to modify time on?", "Change Time", SSplanets.planets) if(istype(planet)) var/datum/time/current_time_datum = planet.current_time - var/new_hour = tgui_input_number(usr, "What hour do you want to change to?", "Change Time", text2num(current_time_datum.show_time("hh")), 23) + var/planet_hours = max(round(current_time_datum.seconds_in_day / 36000) - 1, 0) + var/new_hour = tgui_input_number(usr, "What hour do you want to change to?", "Change Time", text2num(current_time_datum.show_time("hh")), planet_hours) if(!isnull(new_hour)) - var/new_minute = tgui_input_number(usr, "What minute do you want to change to?", "Change Time", text2num(current_time_datum.show_time("mm")), 59) + var/planet_minutes = max(round(current_time_datum.seconds_in_hour / 600) - 1, 0) + var/new_minute = tgui_input_number(usr, "What minute do you want to change to?", "Change Time", text2num(current_time_datum.show_time("mm")), planet_minutes) if(!isnull(new_minute)) var/type_needed = current_time_datum.type var/datum/time/new_time = new type_needed() diff --git a/code/modules/admin/verbs/entity_narrate.dm b/code/modules/admin/verbs/entity_narrate.dm index d8322e93b8..839fb49783 100644 --- a/code/modules/admin/verbs/entity_narrate.dm +++ b/code/modules/admin/verbs/entity_narrate.dm @@ -221,11 +221,11 @@ return data -/datum/entity_narrate/tgui_act(action, list/params) +/datum/entity_narrate/tgui_act(action, list/params, datum/tgui/ui) . = ..() if(.) return - if(!check_rights_for(usr.client, R_FUN)) return + if(!check_rights_for(ui.user.client, R_FUN)) return switch(action) if("change_mode_multi") @@ -260,7 +260,7 @@ var/datum/weakref/wref = entity_refs[tgui_selected_id] tgui_selected_refs = wref.resolve() if(!tgui_selected_refs) - to_chat(usr, span_notice("[tgui_selected_id] has invalid reference, deleting")) + to_chat(ui.user, span_notice("[tgui_selected_id] has invalid reference, deleting")) entity_names -= tgui_selected_id entity_refs -= tgui_selected_id tgui_selected_id = "" @@ -281,9 +281,9 @@ tgui_selected_name = A.name if("narrate") if(world.time < (tgui_last_message + 0.5 SECONDS)) - to_chat(usr, span_notice("You can't messages that quickly! Wait at least half a second")) + to_chat(ui.user, span_notice("You can't messages that quickly! Wait at least half a second")) else - to_chat(usr, span_notice("Message successfully sent!")) + to_chat(ui.user, span_notice("Message successfully sent!")) tgui_last_message = world.time var/message = params["message"] //Sanitizing before speaking it if(tgui_selection_mode) @@ -291,7 +291,7 @@ var/datum/weakref/wref = entity_refs[entity] var/ref = wref.resolve() if(!ref) - to_chat(usr, span_notice("[entity] has invalid reference, deleting")) + to_chat(ui.user, span_notice("[entity] has invalid reference, deleting")) entity_names -= entity entity_refs -= entity tgui_selected_id_multi -= entity @@ -299,7 +299,7 @@ if(istype(ref, /mob/living)) var/mob/living/L = ref if(L.client) - log_and_message_admins("used entity-narrate to speak through [L.ckey]'s mob", usr) + log_and_message_admins("used entity-narrate to speak through [L.ckey]'s mob", ui.user) narrate_tgui_mob(L, message) else if(istype(ref, /atom)) var/atom/A = ref @@ -308,7 +308,7 @@ var/datum/weakref/wref = entity_refs[tgui_selected_id] var/ref = wref.resolve() if(!ref) - to_chat(usr, span_notice("[tgui_selected_id] has invalid reference, deleting")) + to_chat(ui.user, span_notice("[tgui_selected_id] has invalid reference, deleting")) entity_names -= tgui_selected_id entity_refs -= tgui_selected_id tgui_selected_id = "" @@ -319,7 +319,7 @@ if(istype(ref, /mob/living)) var/mob/living/L = ref if(L.client) - log_and_message_admins("used entity-narrate to speak through [L.ckey]'s mob", usr) + log_and_message_admins("used entity-narrate to speak through [L.ckey]'s mob", ui.user) narrate_tgui_mob(L, message) else if(istype(ref, /atom)) var/atom/A = ref diff --git a/code/modules/asset_cache/assets/kitchen_recipes.dm b/code/modules/asset_cache/assets/kitchen_recipes.dm new file mode 100644 index 0000000000..2cca2ed670 --- /dev/null +++ b/code/modules/asset_cache/assets/kitchen_recipes.dm @@ -0,0 +1,26 @@ +/datum/asset/spritesheet/kitchen_recipes + name = "kitchen_recipes" + +/datum/asset/spritesheet/kitchen_recipes/create_spritesheets() + for(var/datum/recipe/R as anything in subtypesof(/datum/recipe)) + add_atom_icon(R.result, sanitize_css_class_name("[R.type]")) + +/datum/asset/spritesheet/kitchen_recipes/proc/add_atom_icon(typepath, id) + var/icon_file + var/icon_state + var/obj/preview_item = typepath + + // if(ispath(ingredient_typepath, /datum/reagent)) + // var/datum/reagent/reagent = ingredient_typepath + // preview_item = initial(reagent.default_container) + // var/datum/glass_style/style = GLOB.glass_style_singletons[preview_item]?[reagent] + // if(istype(style)) + // icon_file = style.icon + // icon_state = style.icon_state + + // icon_file ||= initial(preview_item.icon_preview) || initial(preview_item.icon) + // icon_state ||= initial(preview_item.icon_state_preview) || initial(preview_item.icon_state) + icon_file = initial(preview_item.icon) + icon_state = initial(preview_item.icon_state) + + Insert("[id]", icon_file, icon_state) diff --git a/code/modules/casino/casino_prize_vendor.dm b/code/modules/casino/casino_prize_vendor.dm index e63d90943a..bf4acaa1f0 100644 --- a/code/modules/casino/casino_prize_vendor.dm +++ b/code/modules/casino/casino_prize_vendor.dm @@ -198,7 +198,7 @@ /obj/machinery/casino_prize_dispenser/attackby(obj/item/W as obj, mob/user as mob) if(currently_vending) if(istype(W, /obj/item/spacecasinocash)) - to_chat(usr, span_warning("Please select prize on display with sufficient amount of chips.")) + to_chat(user, span_warning("Please select prize on display with sufficient amount of chips.")) else SStgui.update_uis(src) return // don't smack that machine with your 2 chips @@ -211,15 +211,15 @@ /obj/machinery/casino_prize_dispenser/proc/pay_with_chips(var/obj/item/spacecasinocash/cashmoney, mob/user, var/price) //"cashmoney_:[cashmoney] user:[user] currently_vending:[currently_vending]" if(price > cashmoney.worth) - to_chat(usr, "[icon2html(cashmoney, user.client)] " + span_warning("That is not enough chips.")) + to_chat(user, "[icon2html(cashmoney, user.client)] " + span_warning("That is not enough chips.")) return 0 if(istype(cashmoney, /obj/item/spacecasinocash)) - visible_message(span_info("\The [usr] inserts some chips into \the [src].")) + visible_message(span_info("\The [user] inserts some chips into \the [src].")) cashmoney.worth -= price if(cashmoney.worth <= 0) - usr.drop_from_inventory(cashmoney) + user.drop_from_inventory(cashmoney) qdel(cashmoney) else cashmoney.update_icon() @@ -249,10 +249,10 @@ ui = new(user, src, "CasinoPrizeDispenser", name) ui.open() -/obj/machinery/casino_prize_dispenser/tgui_act(action, params) +/obj/machinery/casino_prize_dispenser/tgui_act(action, params, datum/tgui/ui) if(stat & (BROKEN|NOPOWER)) return - if(usr.stat || usr.restrained()) + if(ui.user.stat || ui.user.restrained()) return if(..()) return TRUE @@ -283,36 +283,36 @@ if("event") restriction_check = category_event else - to_chat(usr, span_warning("Prize checkout error has occurred, purchase cancelled.")) + to_chat(ui.user, span_warning("Prize checkout error has occurred, purchase cancelled.")) return FALSE if(restriction_check < 1) - to_chat(usr, span_warning("[name] is restricted, this prize can't be bought.")) + to_chat(ui.user, span_warning("[name] is restricted, this prize can't be bought.")) return FALSE if(restriction_check > 1) item_given = TRUE if(price <= 0 && item_given == TRUE) - vend(bi, usr) + vend(bi, ui.user) return TRUE currently_vending = bi - if(istype(usr.get_active_hand(), /obj/item/spacecasinocash)) - var/obj/item/spacecasinocash/cash = usr.get_active_hand() - paid = pay_with_chips(cash, usr, price) + if(istype(ui.user.get_active_hand(), /obj/item/spacecasinocash)) + var/obj/item/spacecasinocash/cash = ui.user.get_active_hand() + paid = pay_with_chips(cash, ui.user, price) else - to_chat(usr, span_warning("Payment failure: Improper payment method, please provide chips.")) + to_chat(ui.user, span_warning("Payment failure: Improper payment method, please provide chips.")) return TRUE // we set this because they shouldn't even be able to get this far, and we want the UI to update. if(paid) if(item_given == TRUE) - vend(bi, usr) + vend(bi, ui.user) speak("Thank you for your purchase, your [bi] has been logged.") - do_logging(currently_vending, usr, bi) + do_logging(currently_vending, ui.user, bi) . = TRUE else - to_chat(usr, span_warning("Payment failure: unable to process payment.")) + to_chat(ui.user, span_warning("Payment failure: unable to process payment.")) /obj/machinery/casino_prize_dispenser/proc/vend(datum/data/casino_prize/bi, mob/user) SStgui.update_uis(src) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 86dffce176..3917ef0e6a 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -143,7 +143,21 @@ if("openLink") src << link(href_list["link"]) - ..() //redirect to hsrc.Topic() + if (hsrc) + var/datum/real_src = hsrc + if(QDELETED(real_src)) + return + + //fun fact: Topic() acts like a verb and is executed at the end of the tick like other verbs. So we have to queue it if the server is + //overloaded + if(hsrc && hsrc != holder && DEFAULT_TRY_QUEUE_VERB(VERB_CALLBACK(src, PROC_REF(_Topic), hsrc, href, href_list))) + return + ..() //redirect to hsrc.Topic() + +///dumb workaround because byond doesnt seem to recognize the Topic() typepath for /datum/proc/Topic() from the client Topic, +///so we cant queue it without this +/client/proc/_Topic(datum/hsrc, href, list/href_list) + return hsrc.Topic(href, href_list) //This stops files larger than UPLOAD_LIMIT being sent from client to server via input(), client.Import() etc. /client/AllowUpload(filename, filelength) diff --git a/code/modules/client/preference_setup/volume_sliders/01_volume.dm b/code/modules/client/preference_setup/volume_sliders/01_volume.dm index 219a4750cb..eb07af33cc 100644 --- a/code/modules/client/preference_setup/volume_sliders/01_volume.dm +++ b/code/modules/client/preference_setup/volume_sliders/01_volume.dm @@ -40,7 +40,7 @@ var/channel = href_list["change_volume"] if(!(channel in pref.volume_channels)) pref.volume_channels["[channel]"] = 1 - var/value = tgui_input_number(usr, "Choose your volume for [channel] (0-200%)", "[channel] volume", (pref.volume_channels[channel] * 100), 200, 0) + var/value = tgui_input_number(user, "Choose your volume for [channel] (0-200%)", "[channel] volume", (pref.volume_channels[channel] * 100), 200, 0) if(isnum(value)) value = CLAMP(value, 0, 200) pref.volume_channels["[channel]"] = (value / 100) @@ -79,14 +79,14 @@ data["volume_channels"] = user.client.prefs.volume_channels return data -/datum/volume_panel/tgui_act(action, params) +/datum/volume_panel/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE - if(!usr?.client?.prefs) + if(!ui.user?.client?.prefs) return TRUE - var/datum/preferences/P = usr.client.prefs + var/datum/preferences/P = ui.user.client.prefs switch(action) if("adjust_volume") var/channel = params["channel"] diff --git a/code/modules/client/preference_setup/vore/07_traits.dm b/code/modules/client/preference_setup/vore/07_traits.dm index 2614b6a8f4..6fca677568 100644 --- a/code/modules/client/preference_setup/vore/07_traits.dm +++ b/code/modules/client/preference_setup/vore/07_traits.dm @@ -63,6 +63,9 @@ var/global/list/valid_bloodreagents = list("default","iron","copper","phoron","s . += link + (trait_prefs[identifier] ? "Enabled" : "Disabled") if (2) //TRAIT_PREF_TYPE_COLOR . += " " + color_square(hex = trait_prefs[identifier]) + link + "Change" + if (3) //TRAIT_PREF_TYPE_STRING + var/string = trait_prefs[identifier] + . += link + (length(string) > 0 ? string : "\[Empty\]") . += "" . += "" if (altered) @@ -101,6 +104,9 @@ var/global/list/valid_bloodreagents = list("default","iron","copper","phoron","s var/new_color = input(user, "Choose the color for this trait preference:", "Trait Preference", trait_prefs[preference]) as color|null if (new_color) trait_prefs[preference] = new_color + if (3) //TRAIT_PREF_TYPE_STRING + var/new_string = instance.apply_sanitization_to_string(preference, tgui_input_text(user, "What should the new value be?", instance.has_preferences[preference][2], trait_prefs[preference], MAX_NAME_LEN)) + trait_prefs[preference] = new_string // Definition of the stuff for Ears /datum/category_item/player_setup_item/vore/traits diff --git a/code/modules/client/preferences_tgui.dm b/code/modules/client/preferences_tgui.dm index 69361e1478..9e3b430f68 100644 --- a/code/modules/client/preferences_tgui.dm +++ b/code/modules/client/preferences_tgui.dm @@ -63,7 +63,7 @@ var/value = params["value"] for(var/datum/preference_middleware/preference_middleware as anything in middleware) - if(preference_middleware.pre_set_preference(usr, requested_preference_key, value)) + if(preference_middleware.pre_set_preference(ui.user, requested_preference_key, value)) return TRUE var/datum/preference/requested_preference = GLOB.preference_entries_by_key[requested_preference_key] @@ -82,7 +82,7 @@ for(var/datum/preference_middleware/preference_middleware as anything in middleware) var/delegation = preference_middleware.action_delegations[action] if(!isnull(delegation)) - return call(preference_middleware, delegation)(params, usr) + return call(preference_middleware, delegation)(params, ui.user) return FALSE diff --git a/code/modules/client/record_updater.dm b/code/modules/client/record_updater.dm new file mode 100644 index 0000000000..de802eedcf --- /dev/null +++ b/code/modules/client/record_updater.dm @@ -0,0 +1,129 @@ +var/global/client_record_update_lock = FALSE + +// Manually updating records from medical console to a player's save. +/proc/get_current_mob_from_record(var/datum/data/record/active) + var/datum/transcore_db/db = SStranscore.db_by_mind_name(active.fields["name"]) + if(db) + var/datum/transhuman/mind_record/record = db.backed_up[active.fields["name"]] + if(record.mind_ref) + var/datum/mind/D = record.mind_ref + if(D.current) + var/client/C = D.current.client + if(C && C.ckey != record.ckey) + return null + return D.current + return null + + +/proc/client_update_record(var/obj/machinery/computer/COM, var/user) + if(!COM || QDELETED(COM)) + return "Invalid console" + + if(jobban_isbanned(user, "Records") ) + COM.visible_message(span_notice("\The [COM] buzzes!")) + playsound(COM, 'sound/machines/deniedbeep.ogg', 50, 0) + return "Update syncronization denied (OOC: You are banned from editing records)" + + var/record_string = "" + var/datum/data/record/active + var/console_path = null + if(istype(COM,/obj/machinery/computer/med_data)) + var/obj/machinery/computer/med_data/MCOM = COM + active = MCOM.active2 + record_string = "medical" + console_path = /obj/machinery/computer/med_data + if(istype(COM,/obj/machinery/computer/skills)) + var/obj/machinery/computer/skills/ECOM = COM + active = ECOM.active1 + record_string = "employment" + console_path = /obj/machinery/computer/skills + if(istype(COM,/obj/machinery/computer/secure_data)) + var/obj/machinery/computer/secure_data/SCOM = COM + active = SCOM.active2 + record_string = "security" + console_path = /obj/machinery/computer/secure_data + + if(client_record_update_lock) + to_chat(user,"Update already in progress! Please wait a moment...") + if(COM && !QDELETED(COM)) + COM.visible_message(span_notice("\The [COM] buzzes!")) + playsound(COM, 'sound/machines/deniedbeep.ogg', 50, 0) + return "Update already in progress! Please wait a moment..." + client_record_update_lock = TRUE + spawn(60 SECONDS) + client_record_update_lock = FALSE + + if(!active || !console_path) + if(COM && !QDELETED(COM)) + COM.visible_message(span_notice("\The [COM] buzzes!")) + playsound(COM, 'sound/machines/deniedbeep.ogg', 50, 0) + return "Update syncronization failed (OOC: Record or console destroyed)" + + to_chat(user,"Update sent! Please wait for a response...") + message_admins("[user] pushed [record_string] record update to [active.fields["name"]].") + + var/mob/M = get_current_mob_from_record(active) + if(!M) + if(COM && !QDELETED(COM)) + COM.visible_message(span_notice("\The [COM] buzzes!")) + playsound(COM, 'sound/machines/deniedbeep.ogg', 50, 0) + return "Update syncronization failed (OOC: Client mob does not exist, has no mind record, or is possesssed)" + + var/client/C = M.client + if(!C) + if(COM && !QDELETED(COM)) + COM.visible_message(span_notice("\The [COM] buzzes!")) + playsound(COM, 'sound/machines/deniedbeep.ogg', 50, 0) + return "Update syncronization failed (OOC: Record's owner is offline)" + + var/choice = tgui_alert(M, "Your [record_string] record has been updated from the a records console by [user]. Please review the changes made to your [record_string] record. Accepting these changes will SAVE your CURRENT character slot! If your new [record_string] record has errors, it is recomended to have it corrected IC instead of editing it yourself.", "Record Updated", list("Review Changes","Refuse Update")) + if(choice == "Refuse Update") + message_admins("[active.fields["name"]] refused [record_string] record update from [user] without review.") + if(COM && !QDELETED(COM)) + COM.visible_message(span_notice("\The [COM] buzzes!")) + playsound(COM, 'sound/machines/deniedbeep.ogg', 50, 0) + return "Update syncronization failed (OOC: Client refused without review)" + + var/datum/preferences/P = C.prefs + var/new_data = strip_html_simple(tgui_input_text(M,"Please review [user]'s changes to your [record_string] record before confirming. Confirming will SAVE your CURRENT character slot! If your new [record_string] record major errors, it is recomended to have it corrected IC instead of editing it yourself.","Character Preference", html_decode(active.fields["notes"]), MAX_RECORD_LENGTH, TRUE, prevent_enter = TRUE), MAX_RECORD_LENGTH) + if(!new_data) + message_admins("[active.fields["name"]] refused [record_string] record update from [user] with review.") + if(COM && !QDELETED(COM)) + COM.visible_message(span_notice("\The [COM] buzzes!")) + playsound(COM, 'sound/machines/deniedbeep.ogg', 50, 0) + return "Update syncronization failed (OOC: Client refused with review)" + if(!M || !M.client || !P) + message_admins("[active.fields["name"]]'s [record_string] record could not be updated, client disconnected.") + if(COM && !QDELETED(COM)) + COM.visible_message(span_notice("\The [COM] buzzes!")) + playsound(COM, 'sound/machines/deniedbeep.ogg', 50, 0) + return "Update syncronization failed (OOC: Client does not exist)" + + // Update records in the consoles, remember this can happen a while after a record is closed on the console... Use cached data. + switch(console_path) + if(/obj/machinery/computer/med_data) + P.med_record = new_data + if(active) + active.fields["notes"] = new_data + if(/obj/machinery/computer/skills) + P.gen_record = new_data + if(active) + active.fields["notes"] = new_data + if(/obj/machinery/computer/secure_data) + P.sec_record = new_data + if(active) + active.fields["notes"] = new_data + + // Update player record + P.save_preferences() + P.save_character() + if(M) + to_chat(M,span_notice("Your [record_string] record for [active.fields["name"]] has been updated.")) + message_admins("[active.fields["name"]] accepted the [record_string] record update from [user].") + + // ding! + if(COM && !QDELETED(COM)) + COM.visible_message(span_notice("\The [COM] dings!")) + playsound(COM, 'sound/machines/ding.ogg', 50, 1) + + return "Record syncronized." diff --git a/code/modules/client/verbs/character_directory.dm b/code/modules/client/verbs/character_directory.dm index c35b295469..b58334b06c 100644 --- a/code/modules/client/verbs/character_directory.dm +++ b/code/modules/client/verbs/character_directory.dm @@ -136,14 +136,14 @@ GLOBAL_DATUM(character_directory, /datum/character_directory) if(action == "refresh") // This is primarily to stop malicious users from trying to lag the server by spamming this verb - if(!usr.checkMoveCooldown()) - to_chat(usr, span_warning("Don't spam character directory refresh.")) + if(!ui.user.checkMoveCooldown()) + to_chat(ui.user, span_warning("Don't spam character directory refresh.")) return - usr.setMoveCooldown(10) - update_tgui_static_data(usr, ui) + ui.user.setMoveCooldown(10) + update_tgui_static_data(ui.user, ui) return TRUE else - return check_for_mind_or_prefs(usr, action, params["overwrite_prefs"]) + return check_for_mind_or_prefs(ui.user, action, params["overwrite_prefs"]) /datum/character_directory/proc/check_for_mind_or_prefs(mob/user, action, overwrite_prefs) if (!user.client) @@ -156,12 +156,12 @@ GLOBAL_DATUM(character_directory, /datum/character_directory) return switch(action) if ("setTag") - var/list/new_tag = tgui_input_list(usr, "Pick a new Vore tag for the character directory", "Character Tag", GLOB.char_directory_tags) + var/list/new_tag = tgui_input_list(user, "Pick a new Vore tag for the character directory", "Character Tag", GLOB.char_directory_tags) if(!new_tag) return return set_for_mind_or_prefs(user, action, new_tag, can_set_prefs, can_set_mind) if ("setErpTag") - var/list/new_erptag = tgui_input_list(usr, "Pick a new ERP tag for the character directory", "Character ERP Tag", GLOB.char_directory_erptags) + var/list/new_erptag = tgui_input_list(user, "Pick a new ERP tag for the character directory", "Character ERP Tag", GLOB.char_directory_erptags) if(!new_erptag) return return set_for_mind_or_prefs(user, action, new_erptag, can_set_prefs, can_set_mind) @@ -171,11 +171,11 @@ GLOBAL_DATUM(character_directory, /datum/character_directory) visible = user.mind.show_in_directory else if (can_set_prefs) visible = user.client.prefs.show_in_directory - to_chat(usr, span_notice("You are now [!visible ? "shown" : "not shown"] in the directory.")) + to_chat(user, span_notice("You are now [!visible ? "shown" : "not shown"] in the directory.")) return set_for_mind_or_prefs(user, action, !visible, can_set_prefs, can_set_mind) if ("editAd") - var/current_ad = (can_set_mind ? usr.mind.directory_ad : null) || (can_set_prefs ? usr.client.prefs.directory_ad : null) - var/new_ad = sanitize(tgui_input_text(usr, "Change your character ad", "Character Ad", current_ad, multiline = TRUE, prevent_enter = TRUE), extra = 0) + var/current_ad = (can_set_mind ? user.mind.directory_ad : null) || (can_set_prefs ? user.client.prefs.directory_ad : null) + var/new_ad = sanitize(tgui_input_text(user, "Change your character ad", "Character Ad", current_ad, multiline = TRUE, prevent_enter = TRUE), extra = 0) if(isnull(new_ad)) return return set_for_mind_or_prefs(user, action, new_ad, can_set_prefs, can_set_mind) diff --git a/code/modules/clothing/accessories/accessory_vr.dm b/code/modules/clothing/accessories/accessory_vr.dm index db12dc815c..78aaf8354e 100644 --- a/code/modules/clothing/accessories/accessory_vr.dm +++ b/code/modules/clothing/accessories/accessory_vr.dm @@ -195,16 +195,16 @@ icon_state = "collar_shk[on]" . = TRUE if("tag") - var/sanitized = tgui_input_text(usr, "Tag text?", "Set Tag", "", MAX_NAME_LEN, encode = TRUE) + var/sanitized = tgui_input_text(ui.user, "Tag text?", "Set Tag", "", MAX_NAME_LEN, encode = TRUE) if(isnull(sanitized)) return if(!length(sanitized)) - to_chat(usr, span_notice("[src]'s tag set to blank.")) + to_chat(ui.user, span_notice("[src]'s tag set to blank.")) name = initial(name) desc = initial(desc) else - to_chat(usr, span_notice("[src]'s tag set to '[sanitized]'.")) + to_chat(ui.user, span_notice("[src]'s tag set to '[sanitized]'.")) name = initial(name) + " ([sanitized])" desc = initial(desc) + " The tag says \"[sanitized]\"." . = TRUE @@ -366,9 +366,9 @@ switch(action) if("size") target_size = clamp((params["size"]/100), RESIZE_MINIMUM_DORMS, RESIZE_MAXIMUM_DORMS) - to_chat(usr, span_notice("You set the size to [target_size * 100]%")) + to_chat(ui.user, span_notice("You set the size to [target_size * 100]%")) if(target_size < RESIZE_MINIMUM || target_size > RESIZE_MAXIMUM) - to_chat(usr, span_notice("Note: Resizing limited to 25-200% automatically while outside dormatory areas.")) //hint that we clamp it in resize + to_chat(ui.user, span_notice("Note: Resizing limited to 25-200% automatically while outside dormatory areas.")) //hint that we clamp it in resize . = TRUE /obj/item/clothing/accessory/collar/shock/bluespace/receive_signal(datum/signal/signal) diff --git a/code/modules/clothing/spacesuits/rig/rig_tgui.dm b/code/modules/clothing/spacesuits/rig/rig_tgui.dm index 94bc018608..2aa11cd859 100644 --- a/code/modules/clothing/spacesuits/rig/rig_tgui.dm +++ b/code/modules/clothing/spacesuits/rig/rig_tgui.dm @@ -11,7 +11,7 @@ /obj/item/rig/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui, datum/tgui_state/custom_state) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, (loc != usr ? ai_interface_path : interface_path), interface_title) + ui = new(user, src, (loc != user ? ai_interface_path : interface_path), interface_title) ui.open() if(custom_state) ui.set_state(custom_state) @@ -120,19 +120,19 @@ /* * tgui_act() is the TGUI equivelent of Topic(). It's responsible for all of the "actions" you can take in the UI. */ -/obj/item/rig/tgui_act(action, params) +/obj/item/rig/tgui_act(action, params, datum/tgui/ui) // This parent call is very important, as it's responsible for invoking tgui_status and checking our state's rules. if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if("toggle_seals") - toggle_seals(usr) + toggle_seals(ui.user) . = TRUE if("toggle_cooling") - toggle_cooling(usr) // cooling toggles have its own to_chats, tbf + toggle_cooling(ui.user) // cooling toggles have its own to_chats, tbf . = TRUE if("toggle_ai_control") ai_override_enabled = !ai_override_enabled @@ -142,9 +142,9 @@ locked = !locked . = TRUE if("toggle_piece") - if(ishuman(usr) && (usr.stat || usr.stunned || usr.lying)) + if(ishuman(ui.user) && (ui.user.stat || ui.user.stunned || ui.user.lying)) return FALSE - toggle_piece(params["piece"], usr) + toggle_piece(params["piece"], ui.user) . = TRUE if("interact_module") var/module_index = text2num(params["module"]) @@ -168,5 +168,5 @@ module.charge_selected = params["charge_type"] . = TRUE if("tank_settings") - air_supply?.attack_self(usr) + air_supply?.attack_self(ui.user) . = TRUE diff --git a/code/modules/detectivework/microscope/dnascanner.dm b/code/modules/detectivework/microscope/dnascanner.dm index 3539153b7b..788128c299 100644 --- a/code/modules/detectivework/microscope/dnascanner.dm +++ b/code/modules/detectivework/microscope/dnascanner.dm @@ -60,7 +60,7 @@ data["bloodsamp_desc"] = (bloodsamp ? (bloodsamp.desc ? bloodsamp.desc : "No information on record.") : "") return data -/obj/machinery/dnaforensics/tgui_act(action, list/params) +/obj/machinery/dnaforensics/tgui_act(action, list/params, datum/tgui/ui) if(..()) return TRUE @@ -77,10 +77,10 @@ if(bloodsamp) scanner_progress = 0 scanning = TRUE - to_chat(usr, span_notice("Scan initiated.")) + to_chat(ui.user, span_notice("Scan initiated.")) update_icon() else - to_chat(usr, span_warning("Insert an item to scan.")) + to_chat(ui.user, span_warning("Insert an item to scan.")) . = TRUE if("ejectItem") diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 652b23757a..914dfbf948 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -93,7 +93,7 @@ log transactions var/obj/item/card/id/idcard = I if(!held_card) - usr.drop_item() + user.drop_item() idcard.loc = src held_card = idcard if(authenticated_account && held_card.associated_account_number != authenticated_account.account_number) @@ -187,20 +187,20 @@ log transactions // This is also a logout if("insert_card") if(held_card) - release_held_id(usr) + release_held_id(ui.user) else if(emagged > 0) - to_chat(usr, span_boldwarning("[icon2html(src, usr.client)] The ATM card reader rejected your ID because this machine has been sabotaged!")) + to_chat(ui.user, span_boldwarning("[icon2html(src, ui.user.client)] The ATM card reader rejected your ID because this machine has been sabotaged!")) else - var/obj/item/I = usr.get_active_hand() + var/obj/item/I = ui.user.get_active_hand() if(istype(I, /obj/item/card/id)) - usr.drop_item(src) + ui.user.drop_item(src) held_card = I . = TRUE if("logout") if(held_card) - release_held_id(usr) + release_held_id(ui.user) authenticated_account = null . = TRUE @@ -294,7 +294,7 @@ log transactions // check if they have low security enabled if(!tried_account_num) - scan_user(usr) + scan_user(ui.user) else authenticated_account = attempt_account_access(tried_account_num, tried_pin, held_card && held_card.associated_account_number == tried_account_num ? 2 : 1) @@ -317,11 +317,11 @@ log transactions T.time = stationtime2text() failed_account.transaction_log.Add(T) else - to_chat(usr, span_warning("[icon2html(src, usr.client)] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.")) + to_chat(ui.user, span_warning("[icon2html(src, ui.user.client)] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.")) previous_account_number = tried_account_num playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) else - to_chat(usr, span_warning("[icon2html(src, usr.client)] incorrect pin/account combination entered.")) + to_chat(ui.user, span_warning("[icon2html(src, ui.user.client)] incorrect pin/account combination entered.")) number_incorrect_tries = 0 else playsound(src, 'sound/machines/twobeep.ogg', 50, 1) @@ -337,7 +337,7 @@ log transactions T.time = stationtime2text() authenticated_account.transaction_log.Add(T) - to_chat(usr, span_notice("[icon2html(src, usr.client)] Access granted. Welcome user '[authenticated_account.owner_name].'")) + to_chat(ui.user, span_notice("[icon2html(src, ui.user.client)] Access granted. Welcome user '[authenticated_account.owner_name].'")) previous_account_number = tried_account_num . = TRUE @@ -348,12 +348,12 @@ log transactions var/transfer_amount = text2num(params["funds_amount"]) transfer_amount = round(transfer_amount, 0.01) if(transfer_amount <= 0) - tgui_alert_async(usr, "That is not a valid amount.") + tgui_alert_async(ui.user, "That is not a valid amount.") else if(transfer_amount <= authenticated_account.money) var/target_account_number = text2num(params["target_acc_number"]) var/transfer_purpose = params["purpose"] if(charge_to_account(target_account_number, authenticated_account.owner_name, transfer_purpose, machine_id, transfer_amount)) - to_chat(usr, "[icon2html(src, usr.client)]" + span_info("Funds transfer successful.")) + to_chat(ui.user, "[icon2html(src, ui.user.client)]" + span_info("Funds transfer successful.")) authenticated_account.money -= transfer_amount //create an entry in the account transaction log @@ -366,17 +366,17 @@ log transactions T.amount = "([transfer_amount])" authenticated_account.transaction_log.Add(T) else - to_chat(usr, "[icon2html(src, usr.client)]" + span_warning("Funds transfer failed.")) + to_chat(ui.user, "[icon2html(src, ui.user.client)]" + span_warning("Funds transfer failed.")) else - to_chat(usr, "[icon2html(src, usr.client)]" + span_warning("You don't have enough funds to do that!")) + to_chat(ui.user, "[icon2html(src, ui.user.client)]" + span_warning("You don't have enough funds to do that!")) . = TRUE if("e_withdrawal") var/amount = max(text2num(params["funds_amount"]),0) amount = round(amount, 0.01) if(amount <= 0) - tgui_alert_async(usr, "That is not a valid amount.") + tgui_alert_async(ui.user, "That is not a valid amount.") return if(!authenticated_account) @@ -389,7 +389,7 @@ log transactions authenticated_account.money -= amount // spawn_money(amount,src.loc) - spawn_ewallet(amount,src.loc,usr) + spawn_ewallet(amount,src.loc,ui.user) //create an entry in the account transaction log var/datum/transaction/T = new() @@ -401,14 +401,14 @@ log transactions T.time = stationtime2text() authenticated_account.transaction_log.Add(T) else - to_chat(usr, "[icon2html(src, usr.client)]" + span_warning("You don't have enough funds to do that!")) + to_chat(ui.user, "[icon2html(src, ui.user.client)]" + span_warning("You don't have enough funds to do that!")) . = TRUE if("withdrawal") var/amount = max(text2num(params["funds_amount"]),0) amount = round(amount, 0.01) if(amount <= 0) - tgui_alert_async(usr, "That is not a valid amount.") + tgui_alert_async(ui.user, "That is not a valid amount.") return if(!authenticated_account) @@ -420,7 +420,7 @@ log transactions //remove the money authenticated_account.money -= amount - spawn_money(amount,src.loc,usr) + spawn_money(amount,src.loc,ui.user) //create an entry in the account transaction log var/datum/transaction/T = new() @@ -432,7 +432,7 @@ log transactions T.time = stationtime2text() authenticated_account.transaction_log.Add(T) else - to_chat(usr, "[icon2html(src, usr.client)]" + span_warning("You don't have enough funds to do that!")) + to_chat(ui.user, "[icon2html(src, ui.user.client)]" + span_warning("You don't have enough funds to do that!")) . = TRUE if(.) diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm index 65573cdc57..c0b352d790 100644 --- a/code/modules/economy/Accounts_DB.dm +++ b/code/modules/economy/Accounts_DB.dm @@ -127,12 +127,12 @@ creating_new_account = 1 if("add_funds") - var/amount = tgui_input_number(usr, "Enter the amount you wish to add", "Silently add funds") + var/amount = tgui_input_number(ui.user, "Enter the amount you wish to add", "Silently add funds") if(detailed_account_view) detailed_account_view.money = min(detailed_account_view.money + amount, fund_cap) if("remove_funds") - var/amount = tgui_input_number(usr, "Enter the amount you wish to remove", "Silently remove funds") + var/amount = tgui_input_number(ui.user, "Enter the amount you wish to remove", "Silently remove funds") if(detailed_account_view) detailed_account_view.money = max(detailed_account_view.money - amount, -fund_cap) @@ -164,15 +164,15 @@ if(held_card) held_card.loc = src.loc - if(ishuman(usr) && !usr.get_active_hand()) - usr.put_in_hands(held_card) + if(ishuman(ui.user) && !ui.user.get_active_hand()) + ui.user.put_in_hands(held_card) held_card = null else - var/obj/item/I = usr.get_active_hand() + var/obj/item/I = ui.user.get_active_hand() if(istype(I, /obj/item/card/id)) var/obj/item/card/id/C = I - usr.drop_item() + ui.user.drop_item() C.loc = src held_card = C @@ -278,4 +278,4 @@ "} P.info = text - state("The terminal prints out a report.") \ No newline at end of file + state("The terminal prints out a report.") diff --git a/code/modules/economy/vending.dm b/code/modules/economy/vending.dm index 6a4506a362..a397da77b7 100644 --- a/code/modules/economy/vending.dm +++ b/code/modules/economy/vending.dm @@ -294,8 +294,8 @@ GLOBAL_LIST_EMPTY(vending_products) * Takes payment for whatever is the currently_vending item. Returns 1 if * successful, 0 if failed. */ -/obj/machinery/vending/proc/pay_with_ewallet(var/obj/item/spacecash/ewallet/wallet) - visible_message(span_info("\The [usr] swipes \the [wallet] through \the [src].")) +/obj/machinery/vending/proc/pay_with_ewallet(var/obj/item/spacecash/ewallet/wallet, mob/user) + visible_message(span_info("\The [user] swipes \the [wallet] through \the [src].")) playsound(src, 'sound/machines/id_swipe.ogg', 50, 1) if(currently_vending.price > wallet.worth) to_chat(usr, span_warning("Insufficient funds on chargecard.")) @@ -327,7 +327,7 @@ GLOBAL_LIST_EMPTY(vending_products) // Have the customer punch in the PIN before checking if there's enough money. Prevents people from figuring out acct is // empty at high security levels if(customer_account.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2) - var/attempt_pin = tgui_input_number(usr, "Enter pin code", "Vendor transaction") + var/attempt_pin = tgui_input_number(M, "Enter pin code", "Vendor transaction") customer_account = attempt_account_access(I.associated_account_number, attempt_pin, 2) if(!customer_account) @@ -472,10 +472,10 @@ GLOBAL_LIST_EMPTY(vending_products) return data -/obj/machinery/vending/tgui_act(action, params) +/obj/machinery/vending/tgui_act(action, params, datum/tgui/ui) if(stat & (BROKEN|NOPOWER)) return - if(usr.stat || usr.restrained()) + if(ui.user.stat || ui.user.restrained()) return if(..()) return TRUE @@ -483,32 +483,32 @@ GLOBAL_LIST_EMPTY(vending_products) . = TRUE switch(action) if("remove_coin") - if(issilicon(usr)) + if(issilicon(ui.user)) return FALSE if(!coin) - to_chat(usr, span_filter_notice("There is no coin in this machine.")) + to_chat(ui.user, span_filter_notice("There is no coin in this machine.")) return coin.forceMove(src.loc) - if(!usr.get_active_hand()) - usr.put_in_hands(coin) + if(!ui.user.get_active_hand()) + ui.user.put_in_hands(coin) - to_chat(usr, span_notice("You remove \the [coin] from \the [src].")) + to_chat(ui.user, span_notice("You remove \the [coin] from \the [src].")) coin = null categories &= ~CAT_COIN return TRUE if("vend") if(!vend_ready) - to_chat(usr, span_warning("[src] is busy!")) + to_chat(ui.user, span_warning("[src] is busy!")) return - if(!allowed(usr) && !emagged && scan_id) - to_chat(usr, span_warning("Access denied.")) //Unless emagged of course + if(!allowed(ui.user) && !emagged && scan_id) + to_chat(ui.user, span_warning("Access denied.")) //Unless emagged of course flick("[icon_state]-deny",src) playsound(src, 'sound/machines/deniedbeep.ogg', 50, 0) return if(panel_open) - to_chat(usr, span_warning("[src] cannot dispense products while its service panel is open!")) + to_chat(ui.user, span_warning("[src] cannot dispense products while its service panel is open!")) return var/key = text2num(params["vend"]) @@ -518,27 +518,27 @@ GLOBAL_LIST_EMPTY(vending_products) if(!(R.category & categories)) return - if(!can_buy(R, usr)) + if(!can_buy(R, ui.user)) return if(R.price <= 0) - vend(R, usr) - add_fingerprint(usr) + vend(R, ui.user) + add_fingerprint(ui.user) return TRUE - if(issilicon(usr)) //If the item is not free, provide feedback if a synth is trying to buy something. - to_chat(usr, span_danger("Lawed unit recognized. Lawed units cannot complete this transaction. Purchase canceled.")) + if(issilicon(ui.user)) //If the item is not free, provide feedback if a synth is trying to buy something. + to_chat(ui.user, span_danger("Lawed unit recognized. Lawed units cannot complete this transaction. Purchase canceled.")) return - if(!ishuman(usr)) + if(!ishuman(ui.user)) return vend_ready = FALSE // From this point onwards, vendor is locked to performing this transaction only, until it is resolved. - var/mob/living/carbon/human/H = usr + var/mob/living/carbon/human/H = ui.user var/obj/item/card/id/C = H.GetIdCard() if(!vendor_account || vendor_account.suspended) - to_chat(usr, span_filter_notice("Vendor account offline. Unable to process transaction.")) + to_chat(ui.user, span_filter_notice("Vendor account offline. Unable to process transaction.")) flick("[icon_state]-deny",src) vend_ready = TRUE return @@ -547,27 +547,27 @@ GLOBAL_LIST_EMPTY(vending_products) var/paid = FALSE - if(istype(usr.get_active_hand(), /obj/item/spacecash)) - var/obj/item/spacecash/cash = usr.get_active_hand() - paid = pay_with_cash(cash, usr) - else if(istype(usr.get_active_hand(), /obj/item/spacecash/ewallet)) - var/obj/item/spacecash/ewallet/wallet = usr.get_active_hand() - paid = pay_with_ewallet(wallet) + if(istype(ui.user.get_active_hand(), /obj/item/spacecash)) + var/obj/item/spacecash/cash = ui.user.get_active_hand() + paid = pay_with_cash(cash, ui.user) + else if(istype(ui.user.get_active_hand(), /obj/item/spacecash/ewallet)) + var/obj/item/spacecash/ewallet/wallet = ui.user.get_active_hand() + paid = pay_with_ewallet(wallet, ui.user) else if(istype(C, /obj/item/card)) - paid = pay_with_card(C, usr) - /*else if(usr.can_advanced_admin_interact()) - to_chat(usr, span_notice("Vending object due to admin interaction.")) + paid = pay_with_card(C, ui.user) + /*else if(ui.user.can_advanced_admin_interact()) + to_chat(ui.user, span_notice("Vending object due to admin interaction.")) paid = TRUE*/ else - to_chat(usr, span_warning("Payment failure: you have no ID or other method of payment.")) + to_chat(ui.user, span_warning("Payment failure: you have no ID or other method of payment.")) vend_ready = TRUE flick("[icon_state]-deny",src) return TRUE // we set this because they shouldn't even be able to get this far, and we want the UI to update. if(paid) - vend(currently_vending, usr) // vend will handle vend_ready + vend(currently_vending, ui.user) // vend will handle vend_ready . = TRUE else - to_chat(usr, span_warning("Payment failure: unable to process payment.")) + to_chat(ui.user, span_warning("Payment failure: unable to process payment.")) vend_ready = TRUE if("togglevoice") diff --git a/code/modules/emotes/emote_mob.dm b/code/modules/emotes/emote_mob.dm index 1fc894d530..8c63ecbfc9 100644 --- a/code/modules/emotes/emote_mob.dm +++ b/code/modules/emotes/emote_mob.dm @@ -83,7 +83,7 @@ var/decl/emote/use_emote = get_emote_by_key(act) if(!istype(use_emote)) - to_chat(src, span_warning("Unknown emote '[act]'. Type say *help for a list of usable emotes.")) + to_chat(src, span_warning("Unknown emote '[act]'. Type " + span_bold("say *help") + " for a list of usable emotes. ([act] [message])")) // Add full message in the event you used * instead of ! or something like that return if(!use_emote.mob_can_use(src)) @@ -210,6 +210,7 @@ var/turf/T = get_turf(src) if(!T) return + if(client) playsound(T, pick(emote_sound), 25, TRUE, falloff = 1 , is_global = TRUE, frequency = ourfreq, ignore_walls = FALSE, preference = /datum/preference/toggle/emote_sounds) @@ -224,7 +225,11 @@ message = span_emote(span_bold("[src]") + " ([ghost_follow_link(src, M)]) [input]") if(usr && usr.client && M && !(get_z(usr) == get_z(M))) message = span_multizsay("[message]") - M.show_message(message, m_type) + // If you are in the same tile, right next to, or being held by a person doing an emote, you should be able to see it while blind + if(m_type != AUDIBLE_MESSAGE && (src.Adjacent(M) || (istype(src.loc, /obj/item/holder) && src.loc.loc == M))) + M.show_message(message) + else + M.show_message(message, m_type) M.create_chat_message(src, "[runemessage]", FALSE, list("emote"), (m_type == AUDIBLE_MESSAGE)) for(var/obj/O as anything in o_viewers) diff --git a/code/modules/eventkit/gm_interfaces/mob_spawner.dm b/code/modules/eventkit/gm_interfaces/mob_spawner.dm index 85adcecc3f..5b0a3004e4 100644 --- a/code/modules/eventkit/gm_interfaces/mob_spawner.dm +++ b/code/modules/eventkit/gm_interfaces/mob_spawner.dm @@ -31,9 +31,9 @@ /datum/eventkit/mob_spawner/tgui_static_data(mob/user) var/list/data = list() - data["initial_x"] = usr.x; - data["initial_y"] = usr.y; - data["initial_z"] = usr.z; + data["initial_x"] = user.x; + data["initial_y"] = user.y; + data["initial_z"] = user.z; return data @@ -43,9 +43,9 @@ data["loc_lock"] = loc_lock if(loc_lock) - data["loc_x"] = usr.x - data["loc_y"] = usr.y - data["loc_z"] = usr.z + data["loc_x"] = user.x + data["loc_y"] = user.y + data["loc_z"] = user.z data["use_custom_ai"] = use_custom_ai if(new_path) @@ -81,16 +81,16 @@ return data -/datum/eventkit/mob_spawner/tgui_act(action, list/params) +/datum/eventkit/mob_spawner/tgui_act(action, list/params, datum/tgui/ui) . = ..() if(.) return - if(!check_rights_for(usr.client, R_SPAWN)) + if(!check_rights_for(ui.user.client, R_SPAWN)) return switch(action) if("select_path") var/list/choices = typesof(/mob) - var/newPath = tgui_input_list(usr, "Please select the new path of the mob you want to spawn.", items = choices) + var/newPath = tgui_input_list(ui.user, "Please select the new path of the mob you want to spawn.", items = choices) path = newPath new_path = TRUE @@ -99,20 +99,20 @@ use_custom_ai = !use_custom_ai return TRUE if("set_faction") - faction = sanitize(tgui_input_text(usr, "Please input your mobs' faction", "Faction", (faction ? faction : "neutral"))) + faction = sanitize(tgui_input_text(ui.user, "Please input your mobs' faction", "Faction", (faction ? faction : "neutral"))) return TRUE if("set_intent") - intent = tgui_input_list(usr, "Please select preferred intent", "Select Intent", list(I_HELP, I_HURT), (intent ? intent : I_HELP)) + intent = tgui_input_list(ui.user, "Please select preferred intent", "Select Intent", list(I_HELP, I_HURT), (intent ? intent : I_HELP)) return TRUE if("set_ai_path") - ai_type = tgui_input_list(usr, "Select AI path. Not all subtypes are compatible!", "AI type", \ + ai_type = tgui_input_list(ui.user, "Select AI path. Not all subtypes are compatible!", "AI type", \ typesof(/datum/ai_holder/), (ai_type ? ai_type : /datum/ai_holder/simple_mob/inert)) return TRUE if("loc_lock") loc_lock = !loc_lock return TRUE if("start_spawn") - var/confirm = tgui_alert(usr, "Are you sure that you want to start spawning your custom mobs?", "Confirmation", list("Yes", "Cancel")) + var/confirm = tgui_alert(ui.user, "Are you sure that you want to start spawning your custom mobs?", "Confirmation", list("Yes", "Cancel")) if(confirm != "Yes") return FALSE @@ -124,12 +124,12 @@ var/z = params["z"] if(!name) - to_chat(usr, span_warning("Name cannot be empty.")) + to_chat(ui.user, span_warning("Name cannot be empty.")) return FALSE var/turf/T = locate(x, y, z) if(!T) - to_chat(usr, span_warning("Those coordinates are outside the boundaries of the map.")) + to_chat(ui.user, span_warning("Those coordinates are outside the boundaries of the map.")) return FALSE for(var/i = 0, i < amount, i++) @@ -137,7 +137,7 @@ var/turf/TU = get_turf(locate(x, y, z)) TU.ChangeTurf(path) else - var/mob/M = new path(usr.loc) + var/mob/M = new path(ui.user.loc) M.name = sanitize(name) M.desc = sanitize(params["desc"]) @@ -161,7 +161,7 @@ L.initialize_ai_holder() L.AdjustSleeping(-100) else - to_chat(usr, span_notice("You can only set AI for subtypes of mob/living!")) + to_chat(ui.user, span_notice("You can only set AI for subtypes of mob/living!")) @@ -180,7 +180,7 @@ M.size_multiplier = size_mul M.update_icon() else - to_chat(usr, span_warning("Size Multiplier not applied: ([size_mul]) is not a valid input.")) + to_chat(ui.user, span_warning("Size Multiplier not applied: ([size_mul]) is not a valid input.")) M.forceMove(T) diff --git a/code/modules/food/kitchen/cooking_machines/_appliance.dm b/code/modules/food/kitchen/cooking_machines/_appliance.dm index 5a37e9fb7b..6d95e881cd 100644 --- a/code/modules/food/kitchen/cooking_machines/_appliance.dm +++ b/code/modules/food/kitchen/cooking_machines/_appliance.dm @@ -43,6 +43,11 @@ var/combine_first = FALSE // If TRUE, this appliance will do combination cooking before checking recipes var/food_safety = FALSE //RS ADD - If true, the appliance automatically ejects food instead of burning it + var/static/radial_eject = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_eject") + var/static/radial_power = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_power") + var/static/radial_safety = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_safety") + var/static/radial_output = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_change_output") + /obj/machinery/appliance/Initialize() . = ..() @@ -611,8 +616,31 @@ if(..()) return - if(cooking_objs.len) - removal_menu(user) + interact(user) + +/obj/machinery/appliance/interact(mob/user) + var/list/options = list( + "power" = radial_power, + "safety" = radial_safety, + ) + + if(LAZYLEN(cooking_objs)) + options["remove"] = radial_eject + + if(LAZYLEN(output_options)) + options["select_output"] = radial_output + + var/choice = show_radial_menu(user, src, options, require_near = !issilicon(user)) + + switch(choice) + if("power") + toggle_power() + if("safety") + toggle_safety() + if("remove") + removal_menu(user) + if("select_output") + choose_output() /obj/machinery/appliance/proc/removal_menu(var/mob/user) if (can_remove_items(user)) diff --git a/code/modules/food/kitchen/cooking_machines/_cooker.dm b/code/modules/food/kitchen/cooking_machines/_cooker.dm index a8c1c25080..50c9ea2ba3 100644 --- a/code/modules/food/kitchen/cooking_machines/_cooker.dm +++ b/code/modules/food/kitchen/cooking_machines/_cooker.dm @@ -26,11 +26,15 @@ /obj/machinery/appliance/cooker/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state) var/list/data = ..() + data["on"] = !(stat & POWEROFF) + data["safety"] = food_safety data["temperature"] = round(temperature - T0C, 0.1) data["optimalTemp"] = round(optimal_temp - T0C, 0.1) data["temperatureEnough"] = temperature >= min_temp data["efficiency"] = round(get_efficiency(), 0.1) data["containersRemovable"] = can_remove_items(user, show_warning = FALSE) + data["selected_option"] = selected_option + data["show_selected_option"] = LAZYLEN(output_options) var/list/our_contents = list() for(var/i in 1 to max_contents) @@ -56,19 +60,28 @@ return TRUE switch(action) + if("toggle_power") + attempt_toggle_power(usr) + return TRUE + if("toggle_safety") + toggle_safety() + return TRUE + if("change_output") + choose_output() + return TRUE if("slot") var/slot = params["slot"] - var/obj/item/I = usr.get_active_hand() + var/obj/item/I = ui.user.get_active_hand() if(slot <= LAZYLEN(cooking_objs)) // Inserting var/datum/cooking_item/CI = cooking_objs[slot] if(istype(I) && can_insert(I)) // Why do hard work when we can just make them smack us? - attackby(I, usr) + attackby(I, ui.user) else if(istype(CI)) - eject(CI, usr) + eject(CI, ui.user) return TRUE if(istype(I)) // Why do hard work when we can just make them smack us? - attackby(I, usr) + attackby(I, ui.user) return TRUE /obj/machinery/appliance/cooker/examine(var/mob/user) diff --git a/code/modules/food/kitchen/microwave.dm b/code/modules/food/kitchen/microwave.dm index 41a01ee608..eeadee61e7 100644 --- a/code/modules/food/kitchen/microwave.dm +++ b/code/modules/food/kitchen/microwave.dm @@ -138,6 +138,7 @@ user.visible_message( \ span_notice("\The [user] has added one of [O] to \the [src]."), \ span_notice("You add one of [O] to \the [src].")) + update_static_data_for_all_viewers() return else // user.remove_from_mob(O) //This just causes problems so far as I can tell. -Pete - Man whoever you are, it's been years. o7 @@ -145,7 +146,7 @@ user.visible_message( \ span_notice("\The [user] has added \the [O] to \the [src]."), \ span_notice("You add \the [O] to \the [src].")) - SStgui.update_uis(src) + update_static_data_for_all_viewers() return else if (istype(O,/obj/item/storage/bag/plants)) // There might be a better way about making plant bags dump their contents into a microwave, but it works. var/obj/item/storage/bag/plants/bag = O @@ -173,6 +174,7 @@ to_chat(user, "You fill \the [src] from \the [O].") SStgui.update_uis(src) + update_static_data_for_all_viewers() return 0 else if(istype(O,/obj/item/reagent_containers/glass) || \ @@ -185,6 +187,8 @@ if (!(R.id in acceptable_reagents)) to_chat(user, span_warning("Your [O] contains components unsuitable for cookery.")) return 1 + // gotta let afterattack resolve + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum, update_static_data_for_all_viewers)), 1 SECOND) return else if(istype(O,/obj/item/grab)) var/obj/item/grab/G = O @@ -219,6 +223,11 @@ ..() SStgui.update_uis(src) +/obj/machinery/microwave/tgui_status(mob/user) + if(user == paicard?.pai) + return STATUS_INTERACTIVE + . = ..() + /obj/machinery/microwave/tgui_state(mob/user) return GLOB.tgui_physical_state @@ -242,6 +251,20 @@ ui = new(user, src, "Microwave", name) ui.open() +/obj/machinery/microwave/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/kitchen_recipes) + ) + +/obj/machinery/microwave/tgui_static_data(mob/user) + var/list/data = ..() + + var/datum/recipe/recipe = select_recipe(available_recipes,src) + data["recipe"] = recipe ? sanitize_css_class_name("[recipe.type]") : null + data["recipe_name"] = recipe ? initial(recipe.result:name) : null + + return data + /obj/machinery/microwave/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state) var/list/data = ..() @@ -250,6 +273,21 @@ data["dirty"] = dirty == 100 data["items"] = get_items_list() + var/list/reagents_data = list() + for(var/datum/reagent/R in reagents.reagent_list) + var/display_name = R.name + if(R.id == "capsaicin") + display_name = "Hotsauce" + if(R.id == "frostoil") + display_name = "Coldsauce" + UNTYPED_LIST_ADD(reagents_data, list( + "name" = display_name, + "amt" = R.volume, + "extra" = "unit[R.volume > 1 ? "s" : ""]", + "color" = R.color, + )) + data["reagents"] = reagents_data + return data /obj/machinery/microwave/proc/get_items_list() @@ -258,7 +296,8 @@ var/list/items_counts = list() var/list/items_measures = list() var/list/items_measures_p = list() - //for(var/obj/O in ((contents - component_parts) - circuit)) + var/list/icons = list() + for(var/obj/O in cookingContents()) var/display_name = O.name if(istype(O,/obj/item/reagent_containers/food/snacks/egg)) @@ -278,33 +317,26 @@ items_measures[display_name] = "fillet of meat" items_measures_p[display_name] = "fillets of meat" items_counts[display_name]++ + icons[display_name] = list("icon" = O.icon, "icon_state" = O.icon_state) + for(var/O in items_counts) var/N = items_counts[O] + var/icon = icons[O] if(!(O in items_measures)) data.Add(list(list( "name" = capitalize(O), "amt" = N, "extra" = "[lowertext(O)][N > 1 ? "s" : ""]", + "icon" = icon, ))) else data.Add(list(list( "name" = capitalize(O), "amt" = N, "extra" = N == 1 ? items_measures[O] : items_measures_p[O], + "icon" = icon, ))) - for(var/datum/reagent/R in reagents.reagent_list) - var/display_name = R.name - if(R.id == "capsaicin") - display_name = "Hotsauce" - if(R.id == "frostoil") - display_name = "Coldsauce" - data.Add(list(list( - "name" = display_name, - "amt" = R.volume, - "extra" = "unit[R.volume > 1 ? "s" : ""]" - ))) - return data /obj/machinery/microwave/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) @@ -322,69 +354,6 @@ if("dispose") dispose() return TRUE -/* -/obj/machinery/microwave/interact(mob/user as mob) // The microwave Menu - var/dat = "" - if(src.broken > 0) - dat = {"Bzzzzttttt"} - else if(src.operating) - dat = {"Microwaving in progress!
Please wait...!
"} - else if(src.dirty==100) - dat = {"This microwave is dirty!
Please clean it before use!
"} - else - var/list/items_counts = new - var/list/items_measures = new - var/list/items_measures_p = new - for (var/obj/O in ((contents - component_parts) - circuit)) - var/display_name = O.name - if (istype(O,/obj/item/reagent_containers/food/snacks/egg)) - items_measures[display_name] = "egg" - items_measures_p[display_name] = "eggs" - if (istype(O,/obj/item/reagent_containers/food/snacks/tofu)) - items_measures[display_name] = "tofu chunk" - items_measures_p[display_name] = "tofu chunks" - if (istype(O,/obj/item/reagent_containers/food/snacks/meat)) //any meat - items_measures[display_name] = "slab of meat" - items_measures_p[display_name] = "slabs of meat" - if (istype(O,/obj/item/reagent_containers/food/snacks/donkpocket)) - display_name = "Turnovers" - items_measures[display_name] = "turnover" - items_measures_p[display_name] = "turnovers" - if (istype(O,/obj/item/reagent_containers/food/snacks/carpmeat)) - items_measures[display_name] = "fillet of meat" - items_measures_p[display_name] = "fillets of meat" - items_counts[display_name]++ - for (var/O in items_counts) - var/N = items_counts[O] - if (!(O in items_measures)) - dat += span_bold("[capitalize(O)]:") + " [N] [lowertext(O)]\s
" - else - if (N==1) - dat += span_bold("[capitalize(O)]:") + " [N] [items_measures[O]]
" - else - dat += span_bold("[capitalize(O)]:") + " [N] [items_measures_p[O]]
" - - for (var/datum/reagent/R in reagents.reagent_list) - var/display_name = R.name - if (R.id == "capsaicin") - display_name = "Hotsauce" - if (R.id == "frostoil") - display_name = "Coldsauce" - dat += span_bold("[display_name]:") + " [R.volume] unit\s
" - - if (items_counts.len==0 && reagents.reagent_list.len==0) - dat = span_bold("The microwave is empty") + "
" - else - dat = span_bold("Ingredients:") + "
[dat]" - dat += {"

\ -Turn on!
\ -
Eject ingredients!
\ -"} - - user << browse("Microwave Controls[dat]", "window=microwave") - onclose(user, "microwave") - return -*/ /*********************************** * Microwave Menu Handling/Cooking diff --git a/code/modules/food/kitchen/smartfridge/smartfridge.dm b/code/modules/food/kitchen/smartfridge/smartfridge.dm index 86d3cabe8d..b9b81e8c5c 100644 --- a/code/modules/food/kitchen/smartfridge/smartfridge.dm +++ b/code/modules/food/kitchen/smartfridge/smartfridge.dm @@ -212,20 +212,20 @@ .["locked"] = locked .["secure"] = is_secure -/obj/machinery/smartfridge/tgui_act(action, params) +/obj/machinery/smartfridge/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if("Release") var/amount = 0 if(params["amount"]) amount = params["amount"] else - amount = tgui_input_number(usr, "How many items?", "How many items would you like to take out?", 1) + amount = tgui_input_number(ui.user, "How many items?", "How many items would you like to take out?", 1) - if(QDELETED(src) || QDELETED(usr) || !usr.Adjacent(src)) + if(QDELETED(src) || QDELETED(ui.user) || !ui.user.Adjacent(src)) return FALSE var/index = text2num(params["index"]) @@ -261,11 +261,11 @@ /* * Secure Smartfridges */ -/obj/machinery/smartfridge/secure/tgui_act(action, params) +/obj/machinery/smartfridge/secure/tgui_act(action, params, datum/tgui/ui) if(stat & (NOPOWER|BROKEN)) return TRUE - if(usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) - if((!allowed(usr) && scan_id) && !emagged && locked != -1 && action == "Release") - to_chat(usr, span_warning("Access denied.")) + if(ui.user.contents.Find(src) || (in_range(src, ui.user) && istype(loc, /turf))) + if((!allowed(ui.user) && scan_id) && !emagged && locked != -1 && action == "Release") + to_chat(ui.user, span_warning("Access denied.")) return TRUE return ..() diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index aeb36adb32..7781f145e9 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -137,7 +137,7 @@ return TRUE if("AIoverride") - if(!issilicon(usr)) + if(!issilicon(ui.user)) return if(safety_disabled && emagged) @@ -146,18 +146,18 @@ safety_disabled = !safety_disabled update_projections() if(safety_disabled) - message_admins("[key_name_admin(usr)] overrode the holodeck's safeties") - log_game("[key_name(usr)] overrided the holodeck's safeties") + message_admins("[key_name_admin(ui.user)] overrode the holodeck's safeties") + log_game("[key_name(ui.user)] overrided the holodeck's safeties") else - message_admins("[key_name_admin(usr)] restored the holodeck's safeties") - log_game("[key_name(usr)] restored the holodeck's safeties") + message_admins("[key_name_admin(ui.user)] restored the holodeck's safeties") + log_game("[key_name(ui.user)] restored the holodeck's safeties") return TRUE if("gravity") toggleGravity(linkedholodeck) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) /obj/machinery/computer/HolodeckControl/emag_act(var/remaining_charges, var/mob/user as mob) playsound(src, 'sound/effects/sparks4.ogg', 75, 1) @@ -168,7 +168,7 @@ update_projections() to_chat(user, span_notice("You vastly increase projector power and override the safety and security protocols.")) to_chat(user, "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call [using_map.company_name] maintenance and do not use the simulator.") - log_game("[key_name(usr)] emagged the Holodeck Control Computer") + log_game("[key_name(user)] emagged the Holodeck Control Computer") return 1 return diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index f7073d13a1..f3bd60c674 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -175,8 +175,8 @@ if(..()) return TRUE - usr.set_machine(src) - add_fingerprint(usr) + ui.user.set_machine(src) + add_fingerprint(ui.user) switch(action) if("eject_packet") diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm index fb5ad1e90f..41329703f7 100644 --- a/code/modules/hydroponics/trays/tray_tools.dm +++ b/code/modules/hydroponics/trays/tray_tools.dm @@ -66,7 +66,7 @@ switch(action) if("print") - print_report(usr) + print_report(ui.user) return TRUE if("close") last_seed = null diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 5c4a36f48e..3cdf488b52 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -97,17 +97,17 @@ switch(action) // Actual assembly actions if("rename") - rename(usr) + rename(ui.user) return TRUE if("remove_cell") if(!battery) - to_chat(usr, span_warning("There's no power cell to remove from \the [src].")) + to_chat(ui.user, span_warning("There's no power cell to remove from \the [src].")) return FALSE var/turf/T = get_turf(src) battery.forceMove(T) playsound(T, 'sound/items/Crowbar.ogg', 50, 1) - to_chat(usr, span_notice("You pull \the [battery] out of \the [src]'s power supplier.")) + to_chat(ui.user, span_notice("You pull \the [battery] out of \the [src]'s power supplier.")) battery = null return TRUE @@ -158,14 +158,14 @@ var/obj/item/integrated_circuit/C = locate(params["ref"]) in contents if(!istype(C)) return - C.tgui_interact(usr, null, ui) + C.tgui_interact(ui.user, null, ui) return TRUE if("remove_circuit") var/obj/item/integrated_circuit/C = locate(params["ref"]) in contents if(!istype(C)) return - C.remove(usr) + C.remove(ui.user) return TRUE return FALSE diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm index ba3dbc709c..abfe7ff015 100644 --- a/code/modules/integrated_electronics/core/integrated_circuit.dm +++ b/code/modules/integrated_electronics/core/integrated_circuit.dm @@ -149,12 +149,12 @@ a creative player the means to solve many problems. Circuits are held inside an if(params["link"]) linked = locate(params["link"]) in pin.linked - var/obj/held_item = usr.get_active_hand() + var/obj/held_item = ui.user.get_active_hand() . = TRUE switch(action) if("rename") - rename_component(usr) + rename_component(ui.user) return if("wire", "pin_name", "pin_data", "pin_unwire") @@ -162,37 +162,37 @@ a creative player the means to solve many problems. Circuits are held inside an var/obj/item/multitool/M = held_item switch(action) if("pin_name") - M.wire(pin, usr) + M.wire(pin, ui.user) if("pin_data") var/datum/integrated_io/io = pin - io.ask_for_pin_data(usr, held_item) // The pins themselves will determine how to ask for data, and will validate the data. + io.ask_for_pin_data(ui.user, held_item) // The pins themselves will determine how to ask for data, and will validate the data. if("pin_unwire") - M.unwire(pin, linked, usr) + M.unwire(pin, linked, ui.user) else if(istype(held_item, /obj/item/integrated_electronics/wirer)) var/obj/item/integrated_electronics/wirer/wirer = held_item if(linked) - wirer.wire(linked, usr) + wirer.wire(linked, ui.user) else if(pin) - wirer.wire(pin, usr) + wirer.wire(pin, ui.user) else if(istype(held_item, /obj/item/integrated_electronics/debugger)) var/obj/item/integrated_electronics/debugger/debugger = held_item if(pin) - debugger.write_data(pin, usr) + debugger.write_data(pin, ui.user) else - to_chat(usr, span_warning("You can't do a whole lot without the proper tools.")) + to_chat(ui.user, span_warning("You can't do a whole lot without the proper tools.")) return if("scan") if(istype(held_item, /obj/item/integrated_electronics/debugger)) var/obj/item/integrated_electronics/debugger/D = held_item if(D.accepting_refs) - D.afterattack(src, usr, TRUE) + D.afterattack(src, ui.user, TRUE) else - to_chat(usr, span_warning("The Debugger's 'ref scanner' needs to be on.")) + to_chat(ui.user, span_warning("The Debugger's 'ref scanner' needs to be on.")) else - to_chat(usr, span_warning("You need a multitool/debugger set to 'ref' mode to do that.")) + to_chat(ui.user, span_warning("You need a multitool/debugger set to 'ref' mode to do that.")) return @@ -200,12 +200,12 @@ a creative player the means to solve many problems. Circuits are held inside an var/obj/item/integrated_circuit/examined = locate(params["ref"]) if(istype(examined) && (examined.loc == loc)) if(ui.parent_ui) - examined.tgui_interact(usr, null, ui.parent_ui) + examined.tgui_interact(ui.user, null, ui.parent_ui) else - examined.tgui_interact(usr) + examined.tgui_interact(ui.user) if("remove") - remove(usr) + remove(ui.user) return return FALSE diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm index d9ba4ec9be..6781b90d79 100644 --- a/code/modules/integrated_electronics/core/printer.dm +++ b/code/modules/integrated_electronics/core/printer.dm @@ -183,7 +183,7 @@ if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if("build") @@ -209,15 +209,15 @@ return if(!debug) - if(!Adjacent(usr)) - to_chat(usr, span_notice("You are too far away from \the [src].")) + if(!Adjacent(ui.user)) + to_chat(ui.user, span_notice("You are too far away from \the [src].")) if(metal - cost < 0) - to_chat(usr, span_warning("You need [cost] metal to build that!.")) + to_chat(ui.user, span_warning("You need [cost] metal to build that!.")) return 1 metal -= cost var/obj/item/built = new build_type(get_turf(loc)) - usr.put_in_hands(built) - to_chat(usr, span_notice("[capitalize(built.name)] printed.")) + ui.user.put_in_hands(built) + to_chat(ui.user, span_notice("[capitalize(built.name)] printed.")) playsound(src, 'sound/items/jaws_pry.ogg', 50, TRUE) return TRUE diff --git a/code/modules/looking_glass/lg_console.dm b/code/modules/looking_glass/lg_console.dm index fe8f9f0f5f..16b21d59ab 100644 --- a/code/modules/looking_glass/lg_console.dm +++ b/code/modules/looking_glass/lg_console.dm @@ -112,14 +112,14 @@ my_area.toggle_optional(immersion) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) /obj/machinery/computer/looking_glass/emag_act(var/remaining_charges, var/mob/user as mob) if (!emagged) playsound(src, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 to_chat(user, span_notice("You unlock several programs that were hidden somewhere in memory.")) - log_game("[key_name(usr)] emagged the [name]") + log_game("[key_name(user)] emagged the [name]") return 1 return diff --git a/code/modules/media/walkpod.dm b/code/modules/media/walkpod.dm index 6ea3552d64..eadc493a82 100644 --- a/code/modules/media/walkpod.dm +++ b/code/modules/media/walkpod.dm @@ -216,7 +216,7 @@ return TRUE if("play") if(current_track == null) - to_chat(usr, "No track selected.") + to_chat(ui.user, "No track selected.") else StartPlaying() return TRUE diff --git a/code/modules/mining/machinery/machine_processing.dm b/code/modules/mining/machinery/machine_processing.dm index 4d03ae6a72..df23a27a6e 100644 --- a/code/modules/mining/machinery/machine_processing.dm +++ b/code/modules/mining/machinery/machine_processing.dm @@ -90,17 +90,17 @@ return data -/obj/machinery/mineral/processing_unit_console/tgui_act(action, list/params) +/obj/machinery/mineral/processing_unit_console/tgui_act(action, list/params, datum/tgui/ui) if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if("toggleSmelting") var/ore = params["ore"] var/new_setting = params["set"] if(new_setting == null) - new_setting = tgui_input_list(usr, "What setting do you wish to use for processing [ore]]?", "Process Setting", list("Smelting","Compressing","Alloying","Nothing")) + new_setting = tgui_input_list(ui.user, "What setting do you wish to use for processing [ore]]?", "Process Setting", list("Smelting","Compressing","Alloying","Nothing")) if(!new_setting) return switch(new_setting) @@ -119,7 +119,7 @@ if("logoff") if(!inserted_id) return - usr.put_in_hands(inserted_id) + ui.user.put_in_hands(inserted_id) inserted_id = null . = TRUE if("claim") @@ -128,16 +128,16 @@ inserted_id.mining_points += machine.points machine.points = 0 else - to_chat(usr, span_warning("Required access not found.")) + to_chat(ui.user, span_warning("Required access not found.")) . = TRUE if("insert") - var/obj/item/card/id/I = usr.get_active_hand() + var/obj/item/card/id/I = ui.user.get_active_hand() if(istype(I)) - usr.drop_item() + ui.user.drop_item() I.forceMove(src) inserted_id = I else - to_chat(usr, span_warning("No valid ID.")) + to_chat(ui.user, span_warning("No valid ID.")) . = TRUE if("speed_toggle") machine.toggle_speed() diff --git a/code/modules/mining/machinery/machine_stacking.dm b/code/modules/mining/machinery/machine_stacking.dm index c01007c636..9b74555e7a 100644 --- a/code/modules/mining/machinery/machine_stacking.dm +++ b/code/modules/mining/machinery/machine_stacking.dm @@ -49,7 +49,7 @@ data["stackingAmt"] = machine.stack_amt return data -/obj/machinery/mineral/stacking_unit_console/tgui_act(action, list/params) +/obj/machinery/mineral/stacking_unit_console/tgui_act(action, list/params, datum/tgui/ui) if(..()) return TRUE @@ -66,7 +66,7 @@ machine.stack_storage[stack] = 0 . = TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) /**********************Mineral stacking unit**************************/ diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm index ab46d4df93..798c8eea57 100644 --- a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm +++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm @@ -257,7 +257,7 @@ ui.set_autoupdate(FALSE) -/obj/machinery/mineral/equipment_vendor/tgui_act(action, params) +/obj/machinery/mineral/equipment_vendor/tgui_act(action, params, datum/tgui/ui) if(..()) return @@ -266,7 +266,7 @@ if("logoff") if(!inserted_id) return - usr.put_in_hands(inserted_id) + ui.user.put_in_hands(inserted_id) inserted_id = null if("purchase") if(!inserted_id) @@ -279,7 +279,7 @@ return var/datum/data/mining_equipment/prize = prize_list[category][name] if(prize.cost > get_points(inserted_id)) // shouldn't be able to access this since the button is greyed out, but.. - to_chat(usr, span_danger("You have insufficient points.")) + to_chat(ui.user, span_danger("You have insufficient points.")) flick(icon_deny, src) //VOREStation Add return diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index d0f1f66f9e..cea6d48983 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -187,6 +187,27 @@ Works together with spawning an observer, noted above. handle_regular_hud_updates() handle_vision() + check_area() //RS Port #658 + +//RS Port #658 Start +/mob/observer/dead/proc/check_area() + if(client?.holder) + return + if(!isturf(loc)) + return + var/area/A = get_area(src) + if(A.block_ghosts) + to_chat(src, span_warning("Ghosts can't enter this location.")) + return_to_spawn() + +/mob/observer/dead/proc/return_to_spawn() + if(following) + stop_following() + var/obj/O = locate("landmark*Observer-Start") + if(istype(O)) + to_chat(src, span_notice("Now teleporting.")) + forceMove(O.loc) +//RS Port #658 End /mob/proc/ghostize(var/can_reenter_corpse = 1) if(key) @@ -429,6 +450,14 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp stop_following() return + //RS Port #658 Start + var/area/A = get_area(destination) + if(A.block_ghosts) + to_chat(src,span_warning("Sorry, that area does not allow ghosts.")) + if(following) + stop_following() + return + //RS Port #658 End return ..() /mob/observer/dead/Move(atom/newloc, direct = 0, movetime) diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm index 41f1b65066..44626f5e0e 100644 --- a/code/modules/mob/language/language.dm +++ b/code/modules/mob/language/language.dm @@ -302,7 +302,7 @@ else var/datum/language/L = locate(href_list["default_lang"]) if(L && (L in languages)) - set_default_language(L) + apply_default_language(L) check_languages() return 1 else if(href_list["set_lang_key"]) diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index f5bcb70f4e..fdaea498df 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -201,8 +201,8 @@ /mob/living/bot/cleanbot/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) if(..()) return TRUE - usr.set_machine(src) - add_fingerprint(usr) + ui.user.set_machine(src) + add_fingerprint(ui.user) switch(action) if("start") if(on) @@ -222,11 +222,11 @@ . = TRUE if("wet_floors") wet_floors = !wet_floors - to_chat(usr, span_notice("You twiddle the screw.")) + to_chat(ui.user, span_notice("You twiddle the screw.")) . = TRUE if("spray_blood") spray_blood = !spray_blood - to_chat(usr, span_notice("You press the weird button.")) + to_chat(ui.user, span_notice("You press the weird button.")) . = TRUE /mob/living/bot/cleanbot/emag_act(var/remaining_uses, var/mob/user) @@ -272,6 +272,6 @@ var/t = sanitizeSafe(tgui_input_text(user, "Enter new robot name", name, created_name, MAX_NAME_LEN), MAX_NAME_LEN) if(!t) return - if(!in_range(src, usr) && src.loc != usr) + if(!in_range(src, user) && src.loc != user) return created_name = t diff --git a/code/modules/mob/living/bot/edCLNbot.dm b/code/modules/mob/living/bot/edCLNbot.dm index 02e0150ed2..1aaeb0bbe4 100644 --- a/code/modules/mob/living/bot/edCLNbot.dm +++ b/code/modules/mob/living/bot/edCLNbot.dm @@ -87,15 +87,15 @@ switch(action) if("red_switch") red_switch = !red_switch - to_chat(usr, span_notice("You flip the red switch [red_switch ? "on" : "off"].")) + to_chat(ui.user, span_notice("You flip the red switch [red_switch ? "on" : "off"].")) . = TRUE if("green_switch") green_switch = !green_switch - to_chat(usr, span_notice("You flip the green switch [green_switch ? "on" : "off"].")) + to_chat(ui.user, span_notice("You flip the green switch [green_switch ? "on" : "off"].")) . = TRUE if("blue_switch") blue_switch = !blue_switch - to_chat(usr, span_notice("You flip the blue switch [blue_switch ? "on" : "off"].")) + to_chat(ui.user, span_notice("You flip the blue switch [blue_switch ? "on" : "off"].")) . = TRUE /mob/living/bot/cleanbot/edCLN/emag_act(var/remaining_uses, var/mob/user) @@ -124,7 +124,7 @@ var/t = sanitizeSafe(tgui_input_text(user, "Enter new robot name", name, created_name, MAX_NAME_LEN), MAX_NAME_LEN) if(!t) return - if(!in_range(src, usr) && src.loc != usr) + if(!in_range(src, user) && src.loc != user) return created_name = t return diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index af68009361..edf17d0995 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -84,11 +84,11 @@ if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if("power") - if(!access_scanner.allowed(usr)) + if(!access_scanner.allowed(ui.user)) return FALSE if(on) turn_off() @@ -413,7 +413,7 @@ t = sanitize(t, MAX_NAME_LEN) if(!t) return - if(!in_range(src, usr) && loc != usr) + if(!in_range(src, user) && loc != user) return created_name = t diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index 95ef281846..918fc30134 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -86,7 +86,7 @@ turn_on() . = TRUE - if(locked && !issilicon(usr)) + if(locked && !issilicon(ui.user)) return switch(action) diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm index 8220da5409..205952f0a0 100644 --- a/code/modules/mob/living/bot/medbot.dm +++ b/code/modules/mob/living/bot/medbot.dm @@ -269,20 +269,20 @@ if(..()) return TRUE - usr.set_machine(src) - add_fingerprint(usr) + ui.user.set_machine(src) + add_fingerprint(ui.user) . = TRUE switch(action) if("power") - if(!access_scanner.allowed(usr)) + if(!access_scanner.allowed(ui.user)) return FALSE if(on) turn_off() else turn_on() - if(locked && !issilicon(usr)) + if(locked && !issilicon(ui.user)) return TRUE switch(action) @@ -538,7 +538,7 @@ var/t = sanitizeSafe(tgui_input_text(user, "Enter new robot name", name, created_name, MAX_NAME_LEN), MAX_NAME_LEN) if(!t) return - if(!in_range(src, usr) && loc != usr) + if(!in_range(src, user) && loc != user) return created_name = t else diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm index 89fc3a8706..c835e11a96 100644 --- a/code/modules/mob/living/bot/mulebot.dm +++ b/code/modules/mob/living/bot/mulebot.dm @@ -82,43 +82,43 @@ data["safety"] = safety return data -/mob/living/bot/mulebot/tgui_act(action, params) +/mob/living/bot/mulebot/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if("power") if(on) turn_off() else turn_on() - visible_message("[usr] switches [on ? "on" : "off"] [src].") + visible_message("[ui.user] switches [on ? "on" : "off"] [src].") . = TRUE if("stop") - obeyCommand("Stop") + obeyCommand(ui.user, "Stop") . = TRUE if("go") - obeyCommand("GoTD") + obeyCommand(ui.user, "GoTD") . = TRUE if("home") - obeyCommand("Home") + obeyCommand(ui.user, "Home") . = TRUE if("destination") - obeyCommand("SetD") + obeyCommand(ui.user, "SetD") . = TRUE if("sethome") var/new_dest var/list/beaconlist = GetBeaconList() if(beaconlist.len) - new_dest = tgui_input_list(usr, "Select new home tag", "Mulebot [suffix ? "([suffix])" : ""]", beaconlist) + new_dest = tgui_input_list(ui.user, "Select new home tag", "Mulebot [suffix ? "([suffix])" : ""]", beaconlist) else - tgui_alert_async(usr, "No destination beacons available.") + tgui_alert_async(ui.user, "No destination beacons available.") if(new_dest) home = get_turf(beaconlist[new_dest]) homeName = new_dest @@ -144,7 +144,7 @@ ..() update_icons() -/mob/living/bot/mulebot/proc/obeyCommand(var/command) +/mob/living/bot/mulebot/proc/obeyCommand(mob/user, var/command) switch(command) if("Home") resetTarget() @@ -154,9 +154,9 @@ var/new_dest var/list/beaconlist = GetBeaconList() if(beaconlist.len) - new_dest = tgui_input_list(usr, "Select new destination tag", "Mulebot [suffix ? "([suffix])" : ""]", beaconlist) + new_dest = tgui_input_list(user, "Select new destination tag", "Mulebot [suffix ? "([suffix])" : ""]", beaconlist) else - tgui_alert_async(usr, "No destination beacons available.") + tgui_alert_async(user, "No destination beacons available.") if(new_dest) resetTarget() target = get_turf(beaconlist[new_dest]) diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index aa5fcfc873..c9ee578364 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -129,11 +129,11 @@ if(..()) return - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if("power") - if(!access_scanner.allowed(usr)) + if(!access_scanner.allowed(ui.user)) return FALSE if(on) turn_off() @@ -141,7 +141,7 @@ turn_on() . = TRUE - if(locked && !issilicon(usr)) + if(locked && !issilicon(ui.user)) return TRUE switch(action) diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm index 3d62d0d033..d0eb62be53 100644 --- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm @@ -31,6 +31,13 @@ set desc = "Shift yourself out of alignment with realspace to travel quickly to different areas." set category = "Abilities.Shadekin" + //RS Port #658 Start + var/area/A = get_area(src) + if(!client?.holder && A.block_phase_shift) + to_chat(src, span_warning("You can't do that here!")) + return + //RS Port #658 End + var/ability_cost = 100 var/darkness = 1 @@ -76,19 +83,30 @@ to_chat(src,span_warning("You can't use that here!")) return FALSE - forceMove(T) - var/original_canmove = canmove - SetStunned(0) - SetWeakened(0) - if(buckled) - buckled.unbuckle_mob() - if(pulledby) - pulledby.stop_pulling() - stop_pulling() - canmove = FALSE - //Shifting in if(ability_flags & AB_PHASE_SHIFTED) + phase_in(T) + //Shifting out + else + phase_out(T) + + +/mob/living/carbon/human/proc/phase_in(var/turf/T) + if(ability_flags & AB_PHASE_SHIFTED) + + // pre-change + forceMove(T) + var/original_canmove = canmove + SetStunned(0) + SetWeakened(0) + if(buckled) + buckled.unbuckle_mob() + if(pulledby) + pulledby.stop_pulling() + stop_pulling() + + // change + canmove = FALSE ability_flags &= ~AB_PHASE_SHIFTED ability_flags |= AB_PHASE_SHIFTING mouse_opacity = 1 @@ -137,8 +155,22 @@ L.broken() else L.flicker(10) - //Shifting out - else + +/mob/living/carbon/human/proc/phase_out(var/turf/T) + if(!(ability_flags & AB_PHASE_SHIFTED)) + // pre-change + forceMove(T) + var/original_canmove = canmove + SetStunned(0) + SetWeakened(0) + if(buckled) + buckled.unbuckle_mob() + if(pulledby) + pulledby.stop_pulling() + stop_pulling() + canmove = FALSE + + // change ability_flags |= AB_PHASE_SHIFTED ability_flags |= AB_PHASE_SHIFTING mouse_opacity = 0 diff --git a/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm b/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm index a4bdf523a4..0b7e542bc9 100644 --- a/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm @@ -300,7 +300,7 @@ last_special = world.time + 25 - var/new_skin = input(usr, "Please select a new body color.", "Shapeshifter Colour", color) as null|color + var/new_skin = input(src, "Please select a new body color.", "Shapeshifter Colour", color) as null|color if(!new_skin) return color = new_skin diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm index b904331612..9a7953ce2f 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm @@ -272,7 +272,7 @@ to_chat(src,span_warning("You must be awake and standing to perform this action!")) return - var/new_species = tgui_input_list(usr, "Please select a species to emulate.", "Shapeshifter Body", GLOB.playable_species) + var/new_species = tgui_input_list(src, "Please select a species to emulate.", "Shapeshifter Body", GLOB.playable_species) if(new_species) species?.base_species = new_species // Really though you better have a species regenerate_icons() //Expensive, but we need to recrunch all the icons we're wearing diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm index 0eba887099..fb8f73b952 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm @@ -4,15 +4,15 @@ // Sanity is mostly handled in chimera_regenerate() if(stat == DEAD) - var/confirm = tgui_alert(usr, "Are you sure you want to regenerate your corpse? This process can take up to thirty minutes.", "Confirm Regeneration", list("Yes", "No")) + var/confirm = tgui_alert(src, "Are you sure you want to regenerate your corpse? This process can take up to thirty minutes.", "Confirm Regeneration", list("Yes", "No")) if(confirm == "Yes") chimera_regenerate() else if (quickcheckuninjured()) - var/confirm = tgui_alert(usr, "Are you sure you want to regenerate? As you are uninjured this will only take 30 seconds and match your appearance to your character slot.", "Confirm Regeneration", list("Yes", "No")) + var/confirm = tgui_alert(src, "Are you sure you want to regenerate? As you are uninjured this will only take 30 seconds and match your appearance to your character slot.", "Confirm Regeneration", list("Yes", "No")) if(confirm == "Yes") chimera_regenerate() else - var/confirm = tgui_alert(usr, "Are you sure you want to completely reconstruct your form? This process can take up to fifteen minutes, depending on how hungry you are, and you will be unable to move.", "Confirm Regeneration", list("Yes", "No")) + var/confirm = tgui_alert(src, "Are you sure you want to completely reconstruct your form? This process can take up to fifteen minutes, depending on how hungry you are, and you will be unable to move.", "Confirm Regeneration", list("Yes", "No")) if(confirm == "Yes") chimera_regenerate() @@ -113,7 +113,7 @@ remove_verb(src, /mob/living/carbon/human/proc/hatch) return - var/confirm = tgui_alert(usr, "Are you sure you want to hatch right now? This will be very obvious to anyone in view.", "Confirm Regeneration", list("Yes", "No")) + var/confirm = tgui_alert(src, "Are you sure you want to hatch right now? This will be very obvious to anyone in view.", "Confirm Regeneration", list("Yes", "No")) if(confirm == "Yes") //Dead when hatching @@ -830,13 +830,13 @@ if(!T_ext) //Picking something here is critical. return if(T_ext.vital) - if(tgui_alert(usr, "Are you sure you wish to severely damage their [T_ext]? It will likely kill [T]...","Shred Limb",list("Yes", "No")) != "Yes") + if(tgui_alert(src, "Are you sure you wish to severely damage their [T_ext]? It will likely kill [T]...","Shred Limb",list("Yes", "No")) != "Yes") return //If they reconsider, don't continue. //Any internal organ, if there are any var/obj/item/organ/internal/T_int = tgui_input_list(src,"Do you wish to severely damage an internal organ, as well? If not, click 'cancel'", "Organ Choice", T_ext.internal_organs) if(T_int && T_int.vital) - if(tgui_alert(usr, "Are you sure you wish to severely damage their [T_int]? It will likely kill [T]...","Shred Limb",list("Yes", "No")) != "Yes") + if(tgui_alert(src, "Are you sure you wish to severely damage their [T_int]? It will likely kill [T]...","Shred Limb",list("Yes", "No")) != "Yes") return //If they reconsider, don't continue. //And a belly, if they want @@ -1112,7 +1112,7 @@ to_chat(src, span_warning("You are not a weaver! How are you doing this? Tell a developer!")) return - var/new_silk_color = input(usr, "Pick a color for your woven products:","Silk Color", species.silk_color) as null|color + var/new_silk_color = input(src, "Pick a color for your woven products:","Silk Color", species.silk_color) as null|color if(new_silk_color) species.silk_color = new_silk_color @@ -1274,11 +1274,11 @@ return if(choice == "Color") //Easy way to set color so we don't bloat up the menu with even more buttons. - var/new_color = input(usr, "Choose a color to set your appendage to!", "", appendage_color) as color|null + var/new_color = input(src, "Choose a color to set your appendage to!", "", appendage_color) as color|null if(new_color) appendage_color = new_color if(choice == "Functionality") //Easy way to set color so we don't bloat up the menu with even more buttons. - var/choice2 = tgui_alert(usr, "Choose if you want to be pulled to the target or pull them to you!", "Functionality Setting", list("Pull target to self", "Pull self to target")) + var/choice2 = tgui_alert(src, "Choose if you want to be pulled to the target or pull them to you!", "Functionality Setting", list("Pull target to self", "Pull self to target")) if(!choice2) return if(choice2 == "Pull target to self") @@ -1564,19 +1564,19 @@ return if(choice == "Change reagent") - var/reagent_choice = tgui_input_list(usr, "Choose which reagent to inject!", "Select reagent", trait_injection_reagents) + var/reagent_choice = tgui_input_list(src, "Choose which reagent to inject!", "Select reagent", trait_injection_reagents) if(reagent_choice) trait_injection_selected = reagent_choice to_chat(src, span_notice("You prepare to inject [trait_injection_amount] units of [trait_injection_selected ? "[trait_injection_selected]" : "...nothing. Select a reagent before trying to inject anything."]")) return if(choice == "Change amount") - var/amount_choice = tgui_input_number(usr, "How much of the reagent do you want to inject? (Up to 5 units) (Can select 0 for a bite that doesn't inject venom!)", "How much?", trait_injection_amount, 5, 0, round_value = FALSE) + var/amount_choice = tgui_input_number(src, "How much of the reagent do you want to inject? (Up to 5 units) (Can select 0 for a bite that doesn't inject venom!)", "How much?", trait_injection_amount, 5, 0, round_value = FALSE) if(amount_choice >= 0) trait_injection_amount = amount_choice to_chat(src, span_notice("You prepare to inject [trait_injection_amount] units of [trait_injection_selected ? "[trait_injection_selected]" : "...nothing. Select a reagent before trying to inject anything."]")) return if(choice == "Change verb") - var/verb_choice = tgui_input_text(usr, "Choose the percieved manner of injection, such as 'bites' or 'stings', don't be misleading or abusive. This will show up in game as ('X' 'Verb' 'Y'. Example: X bites Y.)", "How are you injecting?", trait_injection_verb, max_length = 60) //Whoaa there cowboy don't put a novel in there. + var/verb_choice = tgui_input_text(src, "Choose the percieved manner of injection, such as 'bites' or 'stings', don't be misleading or abusive. This will show up in game as ('X' 'Verb' 'Y'. Example: X bites Y.)", "How are you injecting?", trait_injection_verb, max_length = 60) //Whoaa there cowboy don't put a novel in there. if(verb_choice) trait_injection_verb = verb_choice to_chat(src, span_notice("You will [trait_injection_verb] your targets.")) @@ -1611,7 +1611,7 @@ You can also bite synthetics, but due to how synths work, they won't have anything injected into them.
"} - usr << browse(output,"window=chemicalrefresher") + src << browse(output,"window=chemicalrefresher") return else var/list/targets = list() //IF IT IS NOT BROKEN. DO NOT FIX IT. AND KEEP COPYPASTING IT (Pointing Rick Dalton: "That's my code!" ~CL) @@ -1657,7 +1657,7 @@ add_attack_logs(src,target,"Injection trait ([trait_injection_selected], [trait_injection_amount])") if(target.reagents && (trait_injection_amount > 0) && !synth) target.reagents.add_reagent(trait_injection_selected, trait_injection_amount) - var/ourmsg = "[usr] [trait_injection_verb] [target] " + var/ourmsg = "[src] [trait_injection_verb] [target] " switch(zone_sel.selecting) if(BP_HEAD) ourmsg += "on the head!" diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/_traits.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/_traits.dm index 46a4b4c1d5..1c906b501b 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/_traits.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/_traits.dm @@ -8,6 +8,7 @@ #define TRAIT_PREF_TYPE_BOOLEAN 1 #define TRAIT_PREF_TYPE_COLOR 2 +#define TRAIT_PREF_TYPE_STRING 3 #define TRAIT_NO_VAREDIT_TARGET 0 #define TRAIT_VAREDIT_TARGET_SPECIES 1 diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm index 441fddafa0..b69a65d13b 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm @@ -1171,3 +1171,48 @@ /datum/trait/neutral/agraviaphobia/apply(var/datum/species/S,var/mob/living/carbon/human/H, var/trait_prefs = null) ..() H.phobias |= AGRAVIAPHOBIA + +/datum/trait/neutral/gargoyle + name = "Gargoyle (Adjustable)" + desc = "You turn into a statue (or similar) at will, but also whenever you run out of energy. Being a statue replenishes your energy slowly." + cost = 0 + custom_only = FALSE //slimes, xenochimera, diona, proteans, etc, basically anything but custom doesn't make sense (as much as I wanna play a petrifying slime) + //Nah makes perfect sense, they could just be gene modded, not to mention we can expand this to have the statue and description of it renameable as well as color adjustable, to support general petrification + has_preferences = list("identifier" = list(TRAIT_PREF_TYPE_STRING, "Identifier", TRAIT_NO_VAREDIT_TARGET, "statue"), + "material" = list(TRAIT_PREF_TYPE_STRING, "Material", TRAIT_NO_VAREDIT_TARGET, "stone"), + "tint" = list(TRAIT_PREF_TYPE_COLOR, "Statue color", TRAIT_NO_VAREDIT_TARGET, "#FFFFFF"), + "adjective" = list(TRAIT_PREF_TYPE_STRING, "Adjective", TRAIT_NO_VAREDIT_TARGET, "hardens")/*, + "pickupable" = list(TRAIT_PREF_TYPE_BOOLEAN, "Can be picked up", TRAIT_NO_VAREDIT_TARGET, FALSE)*/) + +/datum/trait/neutral/gargoyle/apply(var/datum/species/S,var/mob/living/carbon/human/H, var/list/trait_prefs) + ..() + var/datum/component/gargoyle/G = H.LoadComponent(/datum/component/gargoyle) + if (trait_prefs) + G.tint = trait_prefs["tint"] + G.material = lowertext(trait_prefs["material"]) + G.identifier = lowertext(trait_prefs["identifier"]) + G.adjective = lowertext(trait_prefs["adjective"]) + +/datum/trait/neutral/gargoyle/apply_sanitization_to_string(var/pref, var/input) + if (has_preferences[pref][1] != TRAIT_PREF_TYPE_STRING || length(input) <= 0) + return + input = sanitizeSafe(input, 25) + if (length(input) <= 0) + return default_value_for_pref(pref) + input = lowertext(input) + if (pref == "adjective") + if (copytext_char(input, -1) != "s") + switch(copytext_char(input, -2)) + if ("ss") + input += "es" + if ("sh") + input += "es" + if ("ch") + input += "es" + else + switch(copytext_char(input, -1)) + if("s", "x", "z") + input += "es" + else + input += "s" + return input diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm index d47eda0a34..fb02575361 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm @@ -75,4 +75,14 @@ return TRUE if(TRAIT_PREF_TYPE_COLOR) //color return "#ffffff" + if(TRAIT_PREF_TYPE_STRING) //string + return "" return + +/datum/trait/proc/apply_sanitization_to_string(var/pref, var/input) + if (has_preferences[pref][1] != TRAIT_PREF_TYPE_STRING || length(input) <= 0) + return default_value_for_pref(pref) + input = sanitizeSafe(input, MAX_NAME_LEN) + if (length(input) <= 0) + return default_value_for_pref(pref) + return input diff --git a/code/modules/mob/living/carbon/human/stripping.dm b/code/modules/mob/living/carbon/human/stripping.dm index 388600f076..b39101d98a 100644 --- a/code/modules/mob/living/carbon/human/stripping.dm +++ b/code/modules/mob/living/carbon/human/stripping.dm @@ -27,7 +27,7 @@ toggle_sensors(user) return if("internals") - visible_message(span_danger("\The [usr] is trying to set \the [src]'s internals!")) + visible_message(span_danger("\The [user] is trying to set \the [src]'s internals!")) if(do_after(user,HUMAN_STRIP_DELAY,src)) toggle_internals(user) return @@ -38,7 +38,7 @@ var/obj/item/clothing/accessory/A = suit.accessories[1] if(!istype(A)) return - visible_message(span_danger("\The [usr] is trying to remove \the [src]'s [A.name]!")) + visible_message(span_danger("\The [user] is trying to remove \the [src]'s [A.name]!")) if(!do_after(user,HUMAN_STRIP_DELAY,src)) return diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 116c312176..968f62939b 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -57,52 +57,6 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() cut_overlay(I) overlays_standing[cache_index] = null -// These are used as the layers for the icons, as well as indexes in a list that holds onto them. -// Technically the layers used are all -100+layer to make them FLOAT_LAYER overlays. -//Human Overlays Indexes///////// -#define MUTATIONS_LAYER 1 //Mutations like fat, and lasereyes -#define SKIN_LAYER 2 //Skin things added by a call on species -#define BLOOD_LAYER 3 //Bloodied hands/feet/anything else -#define MOB_DAM_LAYER 4 //Injury overlay sprites like open wounds -#define SURGERY_LAYER 5 //Overlays for open surgical sites -#define UNDERWEAR_LAYER 6 //Underwear/bras/etc -#define TAIL_LOWER_LAYER 7 //Tail as viewed from the south -#define WING_LOWER_LAYER 8 //Wings as viewed from the south -#define SHOES_LAYER_ALT 9 //Shoe-slot item (when set to be under uniform via verb) -#define UNIFORM_LAYER 10 //Uniform-slot item -#define ID_LAYER 11 //ID-slot item -#define SHOES_LAYER 12 //Shoe-slot item -#define GLOVES_LAYER 13 //Glove-slot item -#define BELT_LAYER 14 //Belt-slot item -#define SUIT_LAYER 15 //Suit-slot item -#define TAIL_UPPER_LAYER 16 //Some species have tails to render (As viewed from the N, E, or W) -#define GLASSES_LAYER 17 //Eye-slot item -#define BELT_LAYER_ALT 18 //Belt-slot item (when set to be above suit via verb) -#define SUIT_STORE_LAYER 19 //Suit storage-slot item -#define BACK_LAYER 20 //Back-slot item -#define HAIR_LAYER 21 //The human's hair -#define HAIR_ACCESSORY_LAYER 22 //VOREStation edit. Simply move this up a number if things are added. -#define EARS_LAYER 23 //Both ear-slot items (combined image) -#define EYES_LAYER 24 //Mob's eyes (used for glowing eyes) -#define FACEMASK_LAYER 25 //Mask-slot item -#define GLASSES_LAYER_ALT 26 //So some glasses can appear on top of hair and things -#define HEAD_LAYER 27 //Head-slot item -#define HANDCUFF_LAYER 28 //Handcuffs, if the human is handcuffed, in a secret inv slot -#define LEGCUFF_LAYER 29 //Same as handcuffs, for legcuffs -#define L_HAND_LAYER 30 //Left-hand item -#define R_HAND_LAYER 31 //Right-hand item -#define WING_LAYER 32 //Wings or protrusions over the suit. -#define TAIL_UPPER_LAYER_ALT 33 //Modified tail-sprite layer. Tend to be larger. -#define MODIFIER_EFFECTS_LAYER 34 //Effects drawn by modifiers -#define FIRE_LAYER 35 //'Mob on fire' overlay layer -// # define MOB_WATER_LAYER 36 //'Mob submerged' overlay layer // Moved to global defines -#define TARGETED_LAYER 37 //'Aimed at' overlay layer -#define VORE_BELLY_LAYER 38 -#define VORE_TAIL_LAYER 39 - -#define TOTAL_LAYERS 39 //VOREStation edit. <---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list. -////////////////////////////////// - /mob/living/carbon/human var/list/overlays_standing[TOTAL_LAYERS] var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed @@ -245,6 +199,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(QDESTROYING(src)) return + remove_layer(BODYPARTS_LAYER) + var/husk_color_mod = rgb(96,88,80) var/hulk_color_mod = rgb(48,224,40) @@ -427,6 +383,13 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() //END CACHED ICON GENERATION. stand_icon.Blend(base_icon,ICON_OVERLAY) + + var/image/body = image(stand_icon) + if (body) + body.layer = BODY_LAYER + BODYPARTS_LAYER + overlays_standing[BODYPARTS_LAYER] = body + apply_layer(BODYPARTS_LAYER) + icon = stand_icon //tail diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index 00116666ff..8f412c4c1b 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -294,7 +294,7 @@ switch(action) if("targetSlot") - H.handle_strip(params["slot"], usr) + H.handle_strip(params["slot"], ui.user) return TRUE diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 6c81144e0e..4680a975fd 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -371,7 +371,7 @@ var/list/channel_to_radio_key = new if(M && src) //If we still exist, when the spawn processes //VOREStation Add - Ghosts don't hear whispers if(whispering && isobserver(M) && (!M.client?.prefs?.read_preference(/datum/preference/toggle/ghost_see_whisubtle) || \ - (!client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) && !M.client?.holder))) + (!(client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) || (isbelly(M.loc) && src == M.loc:owner)) && !M.client?.holder))) M.show_message(span_game(span_say(span_name(src.name) + " [w_not_heard].")), 2) return //VOREStation Add End @@ -432,7 +432,7 @@ var/list/channel_to_radio_key = new /mob/living/proc/say_signlang(var/message, var/verb="gestures", var/verb_understood="gestures", var/datum/language/language, var/type = 1) var/turf/T = get_turf(src) //We're in something, gesture to people inside the same thing - if(loc != T) + if(loc != T && !istype(loc, /obj/item/holder)) // Partially fixes sign language while being held. for(var/mob/M in loc) M.hear_signlang(message, verb, verb_understood, language, src, type) diff --git a/code/modules/mob/living/silicon/pai/pai_vr.dm b/code/modules/mob/living/silicon/pai/pai_vr.dm index eda552040e..1fa7a3b6e6 100644 --- a/code/modules/mob/living/silicon/pai/pai_vr.dm +++ b/code/modules/mob/living/silicon/pai/pai_vr.dm @@ -291,6 +291,16 @@ if(I_GRAB) pai_nom(A) +// Allow card inhabited machines to be interacted with +// This has to override ClickOn because of storage depth nonsense with how pAIs are in cards in machines +/mob/living/silicon/pai/ClickOn(var/atom/A, var/params) + if(istype(A, /obj/machinery)) + var/obj/machinery/M = A + if(M.paicard == card) + M.attack_ai(src) + return + return ..() + /mob/living/silicon/pai/proc/hug(var/mob/living/silicon/pai/H, var/mob/living/target) var/t_him = "them" diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index 8c2f511791..68881bea4d 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -50,7 +50,7 @@ return data /datum/pai_software/directives/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) - var/mob/living/silicon/pai/P = usr + var/mob/living/silicon/pai/P = ui.user if(!istype(P)) return TRUE if(..()) @@ -160,7 +160,7 @@ /datum/pai_software/med_records/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) . = ..() - var/mob/living/silicon/pai/P = usr + var/mob/living/silicon/pai/P = ui.user if(!istype(P)) return @@ -216,7 +216,7 @@ /datum/pai_software/sec_records/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) . = ..() - var/mob/living/silicon/pai/P = usr + var/mob/living/silicon/pai/P = ui.user if(!istype(P)) return @@ -267,7 +267,7 @@ return data /datum/pai_software/door_jack/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) - var/mob/living/silicon/pai/P = usr + var/mob/living/silicon/pai/P = ui.user if(!istype(P) || ..()) return TRUE @@ -482,7 +482,7 @@ if(..()) return TRUE - var/mob/living/silicon/pai/user = usr + var/mob/living/silicon/pai/user = ui.user if(istype(user)) var/obj/item/radio/integrated/signal/R = user.sradio diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm index ae1a1076f6..a67f571e1f 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -64,7 +64,7 @@ return data -/obj/machinery/computer/drone_control/tgui_act(action, params) +/obj/machinery/computer/drone_control/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -75,10 +75,10 @@ return drone_call_area = t_area - to_chat(usr, span_notice("You set the area selector to [drone_call_area].")) + to_chat(ui.user, span_notice("You set the area selector to [drone_call_area].")) if("ping") - to_chat(usr, span_notice("You issue a maintenance request for all active drones, highlighting [drone_call_area].")) + to_chat(ui.user, span_notice("You issue a maintenance request for all active drones, highlighting [drone_call_area].")) for(var/mob/living/silicon/robot/drone/D in player_list) if(D.stat == 0) to_chat(D, "-- Maintenance drone presence requested in: [drone_call_area].") @@ -87,16 +87,16 @@ var/mob/living/silicon/robot/drone/D = locate(params["ref"]) if(D.stat != 2) - to_chat(usr, span_danger("You issue a law synchronization directive for the drone.")) + to_chat(ui.user, span_danger("You issue a law synchronization directive for the drone.")) D.law_resync() if("shutdown") var/mob/living/silicon/robot/drone/D = locate(params["ref"]) if(D.stat != 2) - to_chat(usr, span_danger("You issue a kill command for the unfortunate drone.")) - message_admins("[key_name_admin(usr)] issued kill order for drone [key_name_admin(D)] from control console.") - log_game("[key_name(usr)] issued kill order for [key_name(src)] from control console.") + to_chat(ui.user, span_danger("You issue a kill command for the unfortunate drone.")) + message_admins("[key_name_admin(ui.user)] issued kill order for drone [key_name_admin(D)] from control console.") + log_game("[key_name(ui.user)] issued kill order for [key_name(src)] from control console.") D.shut_down() if("search_fab") @@ -108,10 +108,10 @@ continue dronefab = fab - to_chat(usr, span_notice("Drone fabricator located.")) + to_chat(ui.user, span_notice("Drone fabricator located.")) return - to_chat(usr, span_danger("Unable to locate drone fabricator.")) + to_chat(ui.user, span_danger("Unable to locate drone fabricator.")) if("toggle_fab") if(!dronefab) @@ -119,8 +119,8 @@ if(get_dist(src,dronefab) > 3) dronefab = null - to_chat(usr, span_danger("Unable to locate drone fabricator.")) + to_chat(ui.user, span_danger("Unable to locate drone fabricator.")) return dronefab.produce_drones = !dronefab.produce_drones - to_chat(usr, span_notice("You [dronefab.produce_drones ? "enable" : "disable"] drone production in the nearby fabricator.")) + to_chat(ui.user, span_notice("You [dronefab.produce_drones ? "enable" : "disable"] drone production in the nearby fabricator.")) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 667fd23abb..bb9db80061 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -177,6 +177,23 @@ /obj/item/material/gravemarker ) +/obj/item/gripper/scene + name = "misc gripper" + desc = "A simple grasping tool that can hold a variety of 'general' objects..." + + can_hold = list( + /obj/item/capture_crystal, + /obj/item/clothing, + /obj/item/implanter, + /obj/item/disk/nifsoft/compliance, + /obj/item/handcuffs, + /obj/item/toy, + /obj/item/petrifier, + /obj/item/dice, + /obj/item/casino_platinum_chip, + /obj/item/spacecasinocash + ) + /obj/item/gripper/no_use/organ name = "organ gripper" icon_state = "gripper-flesh" diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index bc54a72e63..5a4c4ea64c 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -208,6 +208,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/flash/robot(src) src.modules += new /obj/item/extinguisher(src) src.modules += new /obj/item/tool/crowbar/cyborg(src) + src.modules += new /obj/item/gripper/scene(src) /obj/item/robot_module/robot/standard name = "standard robot module" diff --git a/code/modules/mob/living/silicon/robot/robot_ui.dm b/code/modules/mob/living/silicon/robot/robot_ui.dm index 11027cc20d..8cec2aa542 100644 --- a/code/modules/mob/living/silicon/robot/robot_ui.dm +++ b/code/modules/mob/living/silicon/robot/robot_ui.dm @@ -108,7 +108,7 @@ return data -/datum/tgui_module/robot_ui/tgui_act(action, params) +/datum/tgui_module/robot_ui/tgui_act(action, params, datum/tgui/ui) . = ..() if(.) return @@ -130,13 +130,13 @@ if(istype(C)) C.toggled = !C.toggled if(C.toggled) - to_chat(usr, span_notice("You enable [C].")) + to_chat(ui.user, span_notice("You enable [C].")) else - to_chat(usr, span_warning("You disable [C].")) + to_chat(ui.user, span_warning("You disable [C].")) . = TRUE if("toggle_module") if(R.weapon_lock) - to_chat(usr, span_danger("Error: Modules locked.")) + to_chat(ui.user, span_danger("Error: Modules locked.")) return var/obj/item/module = locate(params["ref"]) if(istype(module)) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm index 5d2084d0f0..6991ecb70e 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm @@ -97,7 +97,8 @@ /mob/living/simple_mob/vore/alienanimals/space_ghost/apply_melee_effects(var/atom/A) var/mob/living/L = A - L.hallucination += 50 + if(L.hallucination <= 100) + L.hallucination += rand(1,10) /mob/living/simple_mob/vore/alienanimals/space_ghost/shoot(atom/A) //We're shooting ghosts at people and need them to have the same faction as their parent, okay? if(!projectiletype) @@ -209,7 +210,8 @@ /mob/living/simple_mob/vore/alienanimals/spooky_ghost/apply_melee_effects(var/atom/A) var/mob/living/L = A if(L && istype(L)) - L.hallucination += rand(1,50) + if(L.hallucination <= 100) + L.hallucination += rand(1,10) /mob/living/simple_mob/vore/alienanimals/spooky_ghost/Life() . = ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm index 09bebbd3a4..b45c3608b7 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm @@ -1,23 +1,39 @@ // Phase shifting procs (and related procs) /mob/living/simple_mob/shadekin/proc/phase_shift() var/turf/T = get_turf(src) + var/area/A = T.loc //RS Port #658 if(!T.CanPass(src,T) || loc != T) to_chat(src,span_warning("You can't use that here!")) return FALSE - - forceMove(T) - var/original_canmove = canmove - SetStunned(0) - SetWeakened(0) - if(buckled) - buckled.unbuckle_mob() - if(pulledby) - pulledby.stop_pulling() - stop_pulling() - canmove = FALSE + //RS Port #658 Start + if(!client?.holder && A.block_phase_shift) + to_chat(src,span_warning("You can't use that here!")) + return FALSE + //RS Port #658 End //Shifting in if(ability_flags & AB_PHASE_SHIFTED) + phase_in(T) + //Shifting out + else + phase_out(T) + +/mob/living/simple_mob/shadekin/proc/phase_in(var/turf/T) + if(ability_flags & AB_PHASE_SHIFTED) + + // pre-change + forceMove(T) + var/original_canmove = canmove + SetStunned(0) + SetWeakened(0) + if(buckled) + buckled.unbuckle_mob() + if(pulledby) + pulledby.stop_pulling() + stop_pulling() + canmove = FALSE + + // change ability_flags &= ~AB_PHASE_SHIFTED mouse_opacity = 1 name = real_name @@ -67,8 +83,22 @@ else L.flicker(10) - //Shifting out - else +/mob/living/simple_mob/shadekin/proc/phase_out(var/turf/T) + if(!(ability_flags & AB_PHASE_SHIFTED)) + + // pre-change + forceMove(T) + var/original_canmove = canmove + SetStunned(0) + SetWeakened(0) + if(buckled) + buckled.unbuckle_mob() + if(pulledby) + pulledby.stop_pulling() + stop_pulling() + canmove = FALSE + + // change ability_flags |= AB_PHASE_SHIFTED mouse_opacity = 0 custom_emote(1,"phases out!") diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 9413f82256..dfbb609727 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -126,6 +126,17 @@ /atom/proc/drain_power(var/drain_check,var/surge, var/amount = 0) return -1 + // used for petrification machines +/atom/proc/get_ultimate_mob() + var/mob/ultimate_mob + var/atom/to_check = loc + var/n = 0 + while (to_check && !isturf(to_check) && n++ < 16) + if (ismob(to_check)) + ultimate_mob = to_check + to_check = to_check.loc + return ultimate_mob + // Show a message to all mobs and objects in earshot of this one // This would be for audible actions by the src mob // message is the message output to anyone who can hear. diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 5ff11814f6..a942c55849 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -350,14 +350,27 @@ switch(mob.incorporeal_move) if(1) var/turf/T = get_step(mob, direct) + var/area/A = T.loc //RS Port #658 if(!T) return if(mob.check_holy(T)) to_chat(mob, span_warning("You cannot get past holy grounds while you are in this plane of existence!")) return - else - mob.forceMove(get_step(mob, direct)) - mob.dir = direct + //RS Port #658 Start + if(!holder) + if(isliving(mob) && A.block_phase_shift) + to_chat(mob, span_warning("Something blocks you from entering this location while phased out.")) + return + if(isobserver(mob) && A.block_ghosts) + to_chat(mob, span_warning("Ghosts can't enter this location.")) + var/area/our_area = mobloc.loc + if(our_area.block_ghosts) + var/mob/observer/dead/D = mob + D.return_to_spawn() + return + mob.forceMove(get_step(mob, direct)) + mob.dir = direct + //RS Port #658 End if(2) if(prob(50)) var/locx diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 475d69193a..a57a2daa98 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -3,7 +3,6 @@ /mob/verb/whisper(message as text) set name = "Whisper" - set category = "IC.Subtle" set hidden = 1 //VOREStation Addition Start if(forced_psay) @@ -15,8 +14,9 @@ /mob/verb/say_verb(message as text) set name = "Say" - set category = "IC.Chat" set hidden = 1 + set instant = TRUE + //VOREStation Addition Start if(forced_psay) psay(message) @@ -24,11 +24,13 @@ //VOREStation Addition End client?.stop_thinking() - usr.say(message) + //queue this message because verbs are scheduled to process after SendMaps in the tick and speech is pretty expensive when it happens. + //by queuing this for next tick the mc can compensate for its cost instead of having speech delay the start of the next tick + if(message) + QUEUE_OR_CALL_VERB_FOR(VERB_CALLBACK(src, TYPE_PROC_REF(/mob, say), message), SSspeech_controller) /mob/verb/me_verb(message as message) set name = "Me" - set category = "IC.Chat" set desc = "Emote to nearby people (and your pred/prey)" set hidden = 1 @@ -105,7 +107,19 @@ if(speaking.flags & NONVERBAL) if(sdisabilities & BLIND || blinded) return FALSE - if(!other || !(other in view(src))) + if(!other) + return FALSE + // Fixes seeing non-verbal languages while being held + if(istype(other.loc, /obj/item/holder)) + if(istype(src.loc, /obj/item/holder)) + if(!(other.loc in view(src.loc.loc))) + return FALSE + else if(!(other.loc in view(src))) + return FALSE + else if(istype(src.loc, /obj/item/holder)) + if((!other) in view(src.loc.loc)) + return FALSE + else if((!other) in view(src)) return FALSE //Language check. diff --git a/code/modules/mob/say_old.dm b/code/modules/mob/say_old.dm new file mode 100644 index 0000000000..f67ffb58b5 --- /dev/null +++ b/code/modules/mob/say_old.dm @@ -0,0 +1,82 @@ +// Allows the usage of old style chat inputs even with TG Say enabled +/mob/verb/say_verb_old() + set name = "Say Old" + set category = "IC.Chat" + + client?.start_thinking() + client?.start_typing() + var/message = tgui_input_text(usr, "Speak to people in sight.\nType your message:", "Say") + client?.stop_thinking() + + if(message) + say_verb(message) + +/mob/verb/me_verb_old() + set name = "Me Old" + set category = "IC.Chat" + set desc = "Emote to nearby people (and your pred/prey)" + + client?.start_thinking() + client?.start_typing() + var/message = tgui_input_text(usr, "Emote to people in sight (and your pred/prey).\nType your message:", "Emote", multiline = TRUE) + client?.stop_thinking() + + if(message) + me_verb(message) + +/mob/verb/whisper_old() + set name = "Whisper Old" + set category = "IC.Subtle" + + var/message = tgui_input_text(usr, "Speak to nearby people.\nType your message:", "Whisper") + + if(message) + whisper(message) + + +/mob/verb/me_verb_subtle_old() + set name = "Subtle Old" + set category = "IC.Subtle" + set desc = "Emote to nearby people (and your pred/prey)" + + var/message = tgui_input_text(usr, "Emote to nearby people (and your pred/prey).\nType your message:", "Subtle", multiline = TRUE) + + if(message) + me_verb_subtle(message) + +/mob/verb/me_verb_subtle_custom_old() + set name = "Subtle (Custom) Old" + set category = "IC.Subtle" + set desc = "Emote to nearby people, with ability to choose which specific portion of people you wish to target." + + var/message = tgui_input_text(usr, "Emote to nearby people, with ability to choose which specific portion of people you wish to target.\nType your message:", "Subtle (Custom)", multiline = TRUE) + + if(message) + me_verb_subtle_custom(message) + +/mob/verb/psay_old() + set name = "Psay Old" + set category = "IC.Subtle" + + var/message = tgui_input_text(usr, "Talk to people affected by complete absorbed or dominate predator/prey.\nType your message:", "Psay") + + if(message) + psay(message) + +/mob/verb/pme_old() + set name = "Pme Old" + set category = "IC.Subtle" + + var/message = tgui_input_text(usr, "Emote to people affected by complete absorbed or dominate predator/prey.\nType your message:", "Pme") + + if(message) + pme(message) + +/mob/living/verb/player_narrate_ch() + set name = "Narrate (Player) Old" + set category = "IC.Chat" + + var/message = tgui_input_text(usr, "Narrate an action or event! An alternative to emoting, for when your emote shouldn't start with your name!\nType your message:", "Narrate (Player)") + + if(message) + player_narrate(message) diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index 72630b09b9..08014a8290 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -4,7 +4,6 @@ /mob/verb/me_verb_subtle(message as message) //This would normally go in say.dm set name = "Subtle" - set category = "IC.Subtle" set desc = "Emote to nearby people (and your pred/prey)" set hidden = 1 @@ -24,7 +23,6 @@ /mob/verb/me_verb_subtle_custom(message as message) // Literally same as above but with mode_selection set to true set name = "Subtle (Custom)" - set category = "IC.Subtle" set desc = "Emote to nearby people, with ability to choose which specific portion of people you wish to target." if(forced_psay) @@ -197,7 +195,7 @@ continue if(src.client && M && !(get_z(src) == get_z(M))) message = span_multizsay("[message]") - if(isobserver(M) && (!M.client?.prefs?.read_preference(/datum/preference/toggle/ghost_see_whisubtle) || \ + if(isobserver(M) && (!(M.client?.prefs?.read_preference(/datum/preference/toggle/ghost_see_whisubtle) || (isbelly(M.loc) && src == M.loc:owner)) || \ !client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) && !M.client?.holder)) spawn(0) M.show_message(undisplayed_message, 2) @@ -254,7 +252,6 @@ ///// PSAY ///// /mob/verb/psay(message as text) - set category = "IC.Subtle" set name = "Psay" set desc = "Talk to people affected by complete absorbed or dominate predator/prey." @@ -352,7 +349,6 @@ ///// PME ///// /mob/verb/pme(message as message) - set category = "IC.Subtle" set name = "Pme" set desc = "Emote to people affected by complete absorbed or dominate predator/prey." @@ -448,7 +444,6 @@ M.me_verb(message) /mob/living/verb/player_narrate(message as message) - set category = "IC.Chat" set name = "Narrate (Player)" set desc = "Narrate an action or event! An alternative to emoting, for when your emote shouldn't start with your name!" diff --git a/code/modules/modular_computers/computers/modular_computer/ui.dm b/code/modules/modular_computers/computers/modular_computer/ui.dm index c058e8e04e..570175c221 100644 --- a/code/modules/modular_computers/computers/modular_computer/ui.dm +++ b/code/modules/modular_computers/computers/modular_computer/ui.dm @@ -89,12 +89,10 @@ shutdown_computer() return TRUE if("PC_minimize") - var/mob/user = usr - minimize_program(user) + minimize_program(ui.user) if("PC_killprogram") var/prog = params["name"] var/datum/computer_file/program/P = null - var/mob/user = usr if(hard_drive) P = hard_drive.find_file_by_name(prog) @@ -102,7 +100,7 @@ return P.kill_program(1) - to_chat(user, span_notice("Program [P.filename].[P.filetype] with PID [rand(100,999)] has been killed.")) + to_chat(ui.user, span_notice("Program [P.filename].[P.filetype] with PID [rand(100,999)] has been killed.")) return TRUE if("PC_runprogram") return run_program(params["name"]) @@ -115,7 +113,7 @@ var/param = params["name"] switch(param) if("ID") - proc_eject_id(usr) + proc_eject_id(ui.user) return TRUE else return diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index cc5167b906..045ac9fbcf 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -206,7 +206,6 @@ ui.close() return 1 if("PC_minimize") - var/mob/user = usr if(!computer.active_program) return @@ -217,8 +216,8 @@ computer.update_icon() ui.close() - if(user && istype(user)) - computer.tgui_interact(user) // Re-open the UI on this computer. It should show the main screen now. + if(ui.user && istype(ui.user)) + computer.tgui_interact(ui.user) // Re-open the UI on this computer. It should show the main screen now. diff --git a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm index 8acc4dda44..0d4098e292 100644 --- a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm @@ -30,7 +30,7 @@ if("PRG_newtextfile") if(!HDD) return - var/newname = sanitize(tgui_input_text(usr, "Enter file name or leave blank to cancel:", "File rename")) + var/newname = sanitize(tgui_input_text(ui.user, "Enter file name or leave blank to cancel:", "File rename")) if(!newname) return if(HDD.find_file_by_name(newname)) @@ -60,13 +60,13 @@ var/datum/computer_file/data/F = computer.find_file_by_uid(open_file) if(!F || !istype(F)) return - if(F.do_not_edit && (tgui_alert(usr, "WARNING: This file is not compatible with editor. Editing it may result in permanently corrupted formatting or damaged data consistency. Edit anyway?", "Incompatible File", list("No", "Yes")) != "Yes")) + if(F.do_not_edit && (tgui_alert(ui.user, "WARNING: This file is not compatible with editor. Editing it may result in permanently corrupted formatting or damaged data consistency. Edit anyway?", "Incompatible File", list("No", "Yes")) != "Yes")) return var/oldtext = html_decode(F.stored_data) oldtext = replacetext(oldtext, "\[br\]", "\n") - var/newtext = sanitize(replacetext(tgui_input_text(usr, "Editing file [F.filename].[F.filetype]. You may use most tags used in paper formatting:", "Text Editor", oldtext, MAX_TEXTFILE_LENGTH, TRUE, prevent_enter = TRUE), "\n", "\[br\]"), MAX_TEXTFILE_LENGTH) + var/newtext = sanitize(replacetext(tgui_input_text(ui.user, "Editing file [F.filename].[F.filetype]. You may use most tags used in paper formatting:", "Text Editor", oldtext, MAX_TEXTFILE_LENGTH, TRUE, prevent_enter = TRUE), "\n", "\[br\]"), MAX_TEXTFILE_LENGTH) if(!newtext) return diff --git a/code/modules/modular_computers/file_system/programs/generic/game.dm b/code/modules/modular_computers/file_system/programs/generic/game.dm index bffa14c512..73ea3a1b6e 100644 --- a/code/modules/modular_computers/file_system/programs/generic/game.dm +++ b/code/modules/modular_computers/file_system/programs/generic/game.dm @@ -105,7 +105,7 @@ /** * This is tgui's replacement for Topic(). It handles any user input from the UI. */ -/datum/computer_file/program/game/tgui_act(action, list/params) +/datum/computer_file/program/game/tgui_act(action, list/params, datum/tgui/ui) if(..()) // Always call parent in tgui_act, it handles making sure the user is allowed to interact with the UI. return TRUE @@ -158,20 +158,20 @@ return TRUE if("Dispense_Tickets") if(!printer) - to_chat(usr, span_notice("Hardware error: A printer is required to redeem tickets.")) + to_chat(ui.user, span_notice("Hardware error: A printer is required to redeem tickets.")) return if(printer.stored_paper <= 0) - to_chat(usr, span_notice("Hardware error: Printer is out of paper.")) + to_chat(ui.user, span_notice("Hardware error: Printer is out of paper.")) return else computer.visible_message(span_infoplain(span_bold("\The [computer]") + " prints out paper.")) if(ticket_count >= 1) new /obj/item/stack/arcadeticket((get_turf(computer)), 1) - to_chat(usr, span_notice("[src] dispenses a ticket!")) + to_chat(ui.user, span_notice("[src] dispenses a ticket!")) ticket_count -= 1 printer.stored_paper -= 1 else - to_chat(usr, span_notice("You don't have any stored tickets!")) + to_chat(ui.user, span_notice("You don't have any stored tickets!")) return TRUE if("Start_Game") game_active = TRUE diff --git a/code/modules/modular_computers/file_system/programs/generic/news_browser.dm b/code/modules/modular_computers/file_system/programs/generic/news_browser.dm index c9ae5cf360..7bd348b621 100644 --- a/code/modules/modular_computers/file_system/programs/generic/news_browser.dm +++ b/code/modules/modular_computers/file_system/programs/generic/news_browser.dm @@ -106,7 +106,7 @@ if(downloading || !loaded_article) return - var/savename = sanitize(tgui_input_text(usr, "Enter file name or leave blank to cancel:", "Save article", loaded_article.filename)) + var/savename = sanitize(tgui_input_text(ui.user, "Enter file name or leave blank to cancel:", "Save article", loaded_article.filename)) if(!savename) return TRUE var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive diff --git a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm index b9c1a8a973..d3b0feb67f 100644 --- a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm @@ -26,7 +26,7 @@ /datum/computer_file/program/chatclient/New() username = "DefaultUser[rand(100, 999)]" -/datum/computer_file/program/chatclient/tgui_act(action, params) +/datum/computer_file/program/chatclient/tgui_act(action, params, datum/tgui/ui) if(..()) return @@ -47,8 +47,7 @@ return TRUE channel.add_message(message, username) - // var/mob/living/user = usr - // user.log_talk(message, LOG_CHAT, tag="as [username] to channel [channel.title]") + // ui.user.log_talk(message, LOG_CHAT, tag="as [username] to channel [channel.title]") return TRUE if("PRG_joinchannel") var/new_target = text2num(params["id"]) @@ -85,8 +84,7 @@ if(channel) channel.remove_client(src) // We shouldn't be in channel's user list, but just in case... return TRUE - var/mob/living/user = usr - if(can_run(user, TRUE, access_network)) + if(isliving(ui.user) && can_run(ui.user, TRUE, access_network)) for(var/datum/ntnet_conversation/chan as anything in ntnet_global.chat_channels) chan.remove_client(src) netadmin_mode = TRUE diff --git a/code/modules/modular_computers/file_system/programs/generic/nttransfer.dm b/code/modules/modular_computers/file_system/programs/generic/nttransfer.dm index f89558e78f..4d7a695991 100644 --- a/code/modules/modular_computers/file_system/programs/generic/nttransfer.dm +++ b/code/modules/modular_computers/file_system/programs/generic/nttransfer.dm @@ -134,7 +134,7 @@ var/global/nttransfer_uid = 0 if(!remote || !remote.provided_file) return if(remote.server_password) - var/pass = sanitize(tgui_input_text(usr, "Code 401 Unauthorized. Please enter password:", "Password required")) + var/pass = sanitize(tgui_input_text(ui.user, "Code 401 Unauthorized. Please enter password:", "Password required")) if(pass != remote.server_password) error = "Incorrect Password" return @@ -152,7 +152,7 @@ var/global/nttransfer_uid = 0 provided_file = null return TRUE if("PRG_setpassword") - var/pass = sanitize(tgui_input_text(usr, "Enter new server password. Leave blank to cancel, input 'none' to disable password.", "Server security", "none")) + var/pass = sanitize(tgui_input_text(ui.user, "Enter new server password. Leave blank to cancel, input 'none' to disable password.", "Server security", "none")) if(!pass) return if(pass == "none") diff --git a/code/modules/modular_computers/file_system/programs/generic/wordprocessor.dm b/code/modules/modular_computers/file_system/programs/generic/wordprocessor.dm index 95b61bd5bb..1511ce15c0 100644 --- a/code/modules/modular_computers/file_system/programs/generic/wordprocessor.dm +++ b/code/modules/modular_computers/file_system/programs/generic/wordprocessor.dm @@ -74,11 +74,11 @@ switch(action) if("PRG_txtrpeview") - show_browser(usr,"[open_file][pencode2html(loaded_data)]", "window=[open_file]") + show_browser(ui.user,"[open_file][pencode2html(loaded_data)]", "window=[open_file]") return TRUE if("PRG_taghelp") - to_chat(usr, span_notice("The hologram of a googly-eyed paper clip helpfully tells you:")) + to_chat(ui.user, span_notice("The hologram of a googly-eyed paper clip helpfully tells you:")) var/help = {" \[br\] : Creates a linebreak. \[center\] - \[/center\] : Centers the text. @@ -104,7 +104,7 @@ \[redlogo\] - Inserts red NT logo image. \[sglogo\] - Inserts Solgov insignia image."} - to_chat(usr, help) + to_chat(ui.user, help) return TRUE if("PRG_closebrowser") @@ -121,7 +121,7 @@ if("PRG_openfile") if(is_edited) - if(tgui_alert(usr, "Would you like to save your changes first?","Save Changes",list("Yes","No")) == "Yes") + if(tgui_alert(ui.user, "Would you like to save your changes first?","Save Changes",list("Yes","No")) == "Yes") save_file(open_file) browsing = 0 if(!open_file(params["PRG_openfile"])) @@ -130,10 +130,10 @@ if("PRG_newfile") if(is_edited) - if(tgui_alert(usr, "Would you like to save your changes first?","Save Changes",list("Yes","No")) == "Yes") + if(tgui_alert(ui.user, "Would you like to save your changes first?","Save Changes",list("Yes","No")) == "Yes") save_file(open_file) - var/newname = sanitize(tgui_input_text(usr, "Enter file name:", "New File")) + var/newname = sanitize(tgui_input_text(ui.user, "Enter file name:", "New File")) if(!newname) return TRUE var/datum/computer_file/data/F = create_file(newname) @@ -146,7 +146,7 @@ return TRUE if("PRG_saveasfile") - var/newname = sanitize(tgui_input_text(usr, "Enter file name:", "Save As")) + var/newname = sanitize(tgui_input_text(ui.user, "Enter file name:", "Save As")) if(!newname) return TRUE var/datum/computer_file/data/F = create_file(newname, loaded_data) @@ -158,7 +158,7 @@ if("PRG_savefile") if(!open_file) - open_file = sanitize(tgui_input_text(usr, "Enter file name:", "Save As")) + open_file = sanitize(tgui_input_text(ui.user, "Enter file name:", "Save As")) if(!open_file) return 0 if(!save_file(open_file)) @@ -169,7 +169,7 @@ var/oldtext = html_decode(loaded_data) oldtext = replacetext(oldtext, "\[br\]", "\n") - var/newtext = sanitize(replacetext(tgui_input_text(usr, "Editing file '[open_file]'. You may use most tags used in paper formatting:", "Text Editor", oldtext, MAX_TEXTFILE_LENGTH, TRUE, prevent_enter = TRUE), "\n", "\[br\]"), MAX_TEXTFILE_LENGTH) + var/newtext = sanitize(replacetext(tgui_input_text(ui.user, "Editing file '[open_file]'. You may use most tags used in paper formatting:", "Text Editor", oldtext, MAX_TEXTFILE_LENGTH, TRUE, prevent_enter = TRUE), "\n", "\[br\]"), MAX_TEXTFILE_LENGTH) if(!newtext) return loaded_data = newtext diff --git a/code/modules/modular_computers/file_system/programs/research/email_administration.dm b/code/modules/modular_computers/file_system/programs/research/email_administration.dm index 77297ef041..cf3b7e1bd1 100644 --- a/code/modules/modular_computers/file_system/programs/research/email_administration.dm +++ b/code/modules/modular_computers/file_system/programs/research/email_administration.dm @@ -66,7 +66,7 @@ return TRUE // High security - can only be operated when the user has an ID with access on them. - var/obj/item/card/id/I = usr.GetIdCard() + var/obj/item/card/id/I = ui.user.GetIdCard() if(!istype(I) || !(access_network in I.GetAccess())) return TRUE @@ -93,7 +93,7 @@ if(!current_account) return TRUE - var/newpass = sanitize(tgui_input_text(usr,"Enter new password for account [current_account.login]", "Password", null, 100), 100) + var/newpass = sanitize(tgui_input_text(ui.user,"Enter new password for account [current_account.login]", "Password", null, 100), 100) if(!newpass) return TRUE current_account.password = newpass @@ -118,10 +118,10 @@ return TRUE if("newaccount") - var/newdomain = sanitize(tgui_input_list(usr,"Pick domain:", "Domain name", using_map.usable_email_tlds)) + var/newdomain = sanitize(tgui_input_list(ui.user,"Pick domain:", "Domain name", using_map.usable_email_tlds)) if(!newdomain) return TRUE - var/newlogin = sanitize(tgui_input_text(usr,"Pick account name (@[newdomain]):", "Account name", null, 100), 100) + var/newlogin = sanitize(tgui_input_text(ui.user,"Pick account name (@[newdomain]):", "Account name", null, 100), 100) if(!newlogin) return TRUE diff --git a/code/modules/modular_computers/file_system/programs/research/ntmonitor.dm b/code/modules/modular_computers/file_system/programs/research/ntmonitor.dm index c74d927b9f..3508922335 100644 --- a/code/modules/modular_computers/file_system/programs/research/ntmonitor.dm +++ b/code/modules/modular_computers/file_system/programs/research/ntmonitor.dm @@ -60,8 +60,8 @@ ntnet_global.setting_disabled = FALSE return TRUE - var/response = tgui_alert(usr, "Really disable NTNet wireless? If your computer is connected wirelessly you won't be able to turn it back on! This will affect all connected wireless devices.", "NTNet shutdown", list("Yes", "No")) - if(response == "Yes" && tgui_status(usr, state) == STATUS_INTERACTIVE) + var/response = tgui_alert(ui.user, "Really disable NTNet wireless? If your computer is connected wirelessly you won't be able to turn it back on! This will affect all connected wireless devices.", "NTNet shutdown", list("Yes", "No")) + if(response == "Yes" && tgui_status(ui.user, state) == STATUS_INTERACTIVE) ntnet_global.setting_disabled = TRUE return TRUE if("purgelogs") @@ -81,14 +81,14 @@ if("ban_nid") if(!ntnet_global) return - var/nid = tgui_input_number(usr,"Enter NID of device which you want to block from the network:", "Enter NID") - if(nid && tgui_status(usr, state) == STATUS_INTERACTIVE) + var/nid = tgui_input_number(ui.user,"Enter NID of device which you want to block from the network:", "Enter NID") + if(nid && tgui_status(ui.user, state) == STATUS_INTERACTIVE) ntnet_global.banned_nids |= nid return TRUE if("unban_nid") if(!ntnet_global) return - var/nid = tgui_input_number(usr,"Enter NID of device which you want to unblock from the network:", "Enter NID") - if(nid && tgui_status(usr, state) == STATUS_INTERACTIVE) + var/nid = tgui_input_number(ui.user,"Enter NID of device which you want to unblock from the network:", "Enter NID") + if(nid && tgui_status(ui.user, state) == STATUS_INTERACTIVE) ntnet_global.banned_nids -= nid return TRUE diff --git a/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm b/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm index 39ee1e7f13..85f8ceb087 100644 --- a/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm +++ b/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm @@ -72,19 +72,19 @@ var/warrant_uid = 0 // The following actions will only be possible if the user has an ID with security access equipped. This is in line with modular computer framework's authentication methods, // which also use RFID scanning to allow or disallow access to some functions. Anyone can view warrants, editing requires ID. This also prevents situations where you show a tablet // to someone who is to be arrested, which allows them to change the stuff there. - var/obj/item/card/id/I = usr.GetIdCard() + var/obj/item/card/id/I = ui.user.GetIdCard() if(!istype(I) || !I.registered_name || !(access_security in I.GetAccess())) - to_chat(usr, "Authentication error: Unable to locate ID with appropriate access to allow this operation.") + to_chat(ui.user, "Authentication error: Unable to locate ID with appropriate access to allow this operation.") return switch(action) if("addwarrant") . = TRUE var/datum/data/record/warrant/W = new() - var/temp = tgui_alert(usr, "Do you want to create a search-, or an arrest warrant?", "Warrant Type", list("Search","Arrest","Cancel")) + var/temp = tgui_alert(ui.user, "Do you want to create a search-, or an arrest warrant?", "Warrant Type", list("Search","Arrest","Cancel")) if(!temp) return - if(tgui_status(usr, state) == STATUS_INTERACTIVE) + if(tgui_status(ui.user, state) == STATUS_INTERACTIVE) if(temp == "Arrest") W.fields["namewarrant"] = "Unknown" W.fields["charges"] = "No charges present" @@ -112,24 +112,24 @@ var/warrant_uid = 0 var/namelist = list() for(var/datum/data/record/t in data_core.general) namelist += t.fields["name"] - var/new_name = sanitize(tgui_input_list(usr, "Please input name:", "Name Choice", namelist)) - if(tgui_status(usr, state) == STATUS_INTERACTIVE) + var/new_name = sanitize(tgui_input_list(ui.user, "Please input name:", "Name Choice", namelist)) + if(tgui_status(ui.user, state) == STATUS_INTERACTIVE) if (!new_name) return activewarrant.fields["namewarrant"] = new_name if("editwarrantnamecustom") . = TRUE - var/new_name = sanitize(tgui_input_text(usr, "Please input name")) - if(tgui_status(usr, state) == STATUS_INTERACTIVE) + var/new_name = sanitize(tgui_input_text(ui.user, "Please input name")) + if(tgui_status(ui.user, state) == STATUS_INTERACTIVE) if (!new_name) return activewarrant.fields["namewarrant"] = new_name if("editwarrantcharges") . = TRUE - var/new_charges = sanitize(tgui_input_text(usr, "Please input charges", "Charges", activewarrant.fields["charges"])) - if(tgui_status(usr, state) == STATUS_INTERACTIVE) + var/new_charges = sanitize(tgui_input_text(ui.user, "Please input charges", "Charges", activewarrant.fields["charges"])) + if(tgui_status(ui.user, state) == STATUS_INTERACTIVE) if (!new_charges) return activewarrant.fields["charges"] = new_charges @@ -137,6 +137,6 @@ var/warrant_uid = 0 if("editwarrantauth") . = TRUE if(!(access_hos in I.GetAccess())) // VOREStation edit begin - to_chat(usr, span_warning("You don't have the access to do this!")) + to_chat(ui.user, span_warning("You don't have the access to do this!")) return // VOREStation edit end activewarrant.fields["auth"] = "[I.registered_name] - [I.assignment ? I.assignment : "(Unknown)"]" diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index 78aceeebaa..b62b8600c8 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -250,7 +250,7 @@ var/obj/item/card/id/I = W.GetID() // Awaiting payment state if(state == 2) - if(process_payment(I,W)) + if(process_payment(user, I,W)) fabricate_and_recalc_price(1) if((devtype == 1) && fabricated_laptop) if(fabricated_laptop.battery_module) @@ -274,18 +274,18 @@ return ..() // Simplified payment processing, returns 1 on success. -/obj/machinery/lapvend/proc/process_payment(var/obj/item/card/id/I, var/obj/item/ID_container) +/obj/machinery/lapvend/proc/process_payment(mob/user, var/obj/item/card/id/I, var/obj/item/ID_container) if(I==ID_container || ID_container == null) - visible_message(span_info("\The [usr] swipes \the [I] through \the [src].")) + visible_message(span_info("\The [user] swipes \the [I] through \the [src].")) else - visible_message(span_info("\The [usr] swipes \the [ID_container] through \the [src].")) + visible_message(span_info("\The [user] swipes \the [ID_container] through \the [src].")) var/datum/money_account/customer_account = get_account(I.associated_account_number) if (!customer_account || customer_account.suspended) ping("Connection error. Unable to connect to account.") return 0 if(customer_account.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2) - var/attempt_pin = tgui_input_number(usr, "Enter pin code", "Vendor transaction") + var/attempt_pin = tgui_input_number(user, "Enter pin code", "Vendor transaction") customer_account = attempt_account_access(I.associated_account_number, attempt_pin, 2) if(!customer_account) diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index 98f5b27fa9..64fc76ae39 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -79,7 +79,6 @@ if(direction == UP) var/obj/structure/lattice/lattice = locate() in destination.contents var/obj/structure/catwalk/catwalk = locate() in destination.contents - var/turf/simulated/floor/water/deep/ocean/diving/surface = destination if(lattice) var/pull_up_time = max((5 SECONDS + (src.movement_delay() * 10) * climb_modifier), 1) @@ -91,7 +90,7 @@ to_chat(src, span_warning("You gave up on pulling yourself up.")) return 0 - else if(istype(surface)) + else if(istype(destination, /turf/simulated/floor/water/deep/ocean/diving)) var/pull_up_time = max((5 SECONDS + (src.movement_delay() * 10) * swim_modifier), 1) to_chat(src, span_notice("You start swimming upwards...")) src.audible_message(span_notice("[src] begins to swim towards the surface."), runemessage = "splish splosh") @@ -116,6 +115,12 @@ to_chat(src, span_warning("You gave up on pulling yourself up.")) return 0 + //RS Port #661 Start, Prevents noclipping + else if(!istype(destination, /turf/simulated/open)) + to_chat(src, span_warning("Something solid above stops you from passing.")) + return 0 + //RS Port #661 End + else if(isliving(src)) //VOREStation Edit Start. Are they a mob, and are they currently flying?? var/mob/living/H = src if(H.flying) diff --git a/code/modules/overmap/disperser/disperser_console.dm b/code/modules/overmap/disperser/disperser_console.dm index 25571cca6d..f579135237 100644 --- a/code/modules/overmap/disperser/disperser_console.dm +++ b/code/modules/overmap/disperser/disperser_console.dm @@ -173,7 +173,7 @@ . = TRUE if("calibration") - var/input = tgui_input_number(usr, "0-9", "disperser calibration", 0, 9, 0) + var/input = tgui_input_number(ui.user, "0-9", "disperser calibration", 0, 9, 0) if(!isnull(input)) //can be zero so we explicitly check for null var/calnum = sanitize_integer(text2num(params["calibration"]), 0, caldigit)//sanitiiiiize calibration[calnum + 1] = sanitize_integer(input, 0, 9, 0)//must add 1 because js indexes from 0 @@ -185,22 +185,22 @@ . = TRUE if("strength") - var/input = tgui_input_number(usr, "1-5", "disperser strength", 1, 5, 1) - if(input && tgui_status(usr, state) == STATUS_INTERACTIVE) + var/input = tgui_input_number(ui.user, "1-5", "disperser strength", 1, 5, 1) + if(input && tgui_status(ui.user, state) == STATUS_INTERACTIVE) strength = sanitize_integer(input, 1, 5, 1) middle.update_idle_power_usage(strength * range * 100) . = TRUE if("range") - var/input = tgui_input_number(usr, "1-5", "disperser radius", 1, 5, 1) - if(input && tgui_status(usr, state) == STATUS_INTERACTIVE) + var/input = tgui_input_number(ui.user, "1-5", "disperser radius", 1, 5, 1) + if(input && tgui_status(ui.user, state) == STATUS_INTERACTIVE) range = sanitize_integer(input, 1, 5, 1) middle.update_idle_power_usage(strength * range * 100) . = TRUE if("fire") - fire(usr) + fire(ui.user) . = TRUE - if(. && !issilicon(usr)) + if(. && !issilicon(ui.user)) playsound(src, "terminal_type", 50, 1) diff --git a/code/modules/overmap/ships/computers/engine_control.dm b/code/modules/overmap/ships/computers/engine_control.dm index aef0428231..49f1e617c5 100644 --- a/code/modules/overmap/ships/computers/engine_control.dm +++ b/code/modules/overmap/ships/computers/engine_control.dm @@ -62,8 +62,8 @@ . = TRUE if("set_global_limit") - var/newlim = tgui_input_number(usr, "Input new thrust limit (0..100%)", "Thrust limit", linked.thrust_limit*100, 100, 0, round_value = FALSE) - if(tgui_status(usr, state) != STATUS_INTERACTIVE) + var/newlim = tgui_input_number(ui.user, "Input new thrust limit (0..100%)", "Thrust limit", linked.thrust_limit*100, 100, 0, round_value = FALSE) + if(tgui_status(ui.user, state) != STATUS_INTERACTIVE) return FALSE linked.thrust_limit = clamp(newlim/100, 0, 1) for(var/datum/ship_engine/E in linked.engines) @@ -78,8 +78,8 @@ if("set_limit") var/datum/ship_engine/E = locate(params["engine"]) - var/newlim = tgui_input_number(usr, "Input new thrust limit (0..100)", "Thrust limit", E.get_thrust_limit(), 100, 0, round_value = FALSE) - if(tgui_status(usr, state) != STATUS_INTERACTIVE) + var/newlim = tgui_input_number(ui.user, "Input new thrust limit (0..100)", "Thrust limit", E.get_thrust_limit(), 100, 0, round_value = FALSE) + if(tgui_status(ui.user, state) != STATUS_INTERACTIVE) return FALSE var/limit = clamp(newlim/100, 0, 1) if(istype(E)) @@ -99,5 +99,5 @@ E.toggle() . = TRUE - if(. && !issilicon(usr)) + if(. && !issilicon(ui.user)) playsound(src, "terminal_type", 50, 1) diff --git a/code/modules/overmap/ships/computers/helm.dm b/code/modules/overmap/ships/computers/helm.dm index bbd1791999..0473457bdc 100644 --- a/code/modules/overmap/ships/computers/helm.dm +++ b/code/modules/overmap/ships/computers/helm.dm @@ -169,33 +169,33 @@ GLOBAL_LIST_EMPTY(all_waypoints) switch(action) if("update_camera_view") if(TIMER_COOLDOWN_RUNNING(src, COOLDOWN_SHIP_REFRESH)) - to_chat(usr, span_warning("You cannot refresh the map so often.")) + to_chat(ui.user, span_warning("You cannot refresh the map so often.")) return update_map() TIMER_COOLDOWN_START(src, COOLDOWN_SHIP_REFRESH, 5 SECONDS) . = TRUE if("add") var/datum/computer_file/data/waypoint/R = new() - var/sec_name = tgui_input_text(usr, "Input navigation entry name", "New navigation entry", "Sector #[known_sectors.len]", MAX_NAME_LEN) + var/sec_name = tgui_input_text(ui.user, "Input navigation entry name", "New navigation entry", "Sector #[known_sectors.len]", MAX_NAME_LEN) sec_name = sanitize(sec_name,MAX_NAME_LEN) - if(tgui_status(usr, state) != STATUS_INTERACTIVE) + if(tgui_status(ui.user, state) != STATUS_INTERACTIVE) return FALSE if(!sec_name) sec_name = "Sector #[known_sectors.len]" R.fields["name"] = sec_name if(sec_name in known_sectors) - to_chat(usr, span_warning("Sector with that name already exists, please input a different name.")) + to_chat(ui.user, span_warning("Sector with that name already exists, please input a different name.")) return TRUE switch(params["add"]) if("current") R.fields["x"] = linked.x R.fields["y"] = linked.y if("new") - var/newx = tgui_input_number(usr, "Input new entry x coordinate", "Coordinate input", linked.x, world.maxx, 1) - if(tgui_status(usr, state) != STATUS_INTERACTIVE) + var/newx = tgui_input_number(ui.user, "Input new entry x coordinate", "Coordinate input", linked.x, world.maxx, 1) + if(tgui_status(ui.user, state) != STATUS_INTERACTIVE) return TRUE - var/newy = tgui_input_number(usr, "Input new entry y coordinate", "Coordinate input", linked.y, world.maxy, 1) - if(tgui_status(usr, state) != STATUS_INTERACTIVE) + var/newy = tgui_input_number(ui.user, "Input new entry y coordinate", "Coordinate input", linked.y, world.maxy, 1) + if(tgui_status(ui.user, state) != STATUS_INTERACTIVE) return FALSE R.fields["x"] = CLAMP(newx, 1, world.maxx) R.fields["y"] = CLAMP(newy, 1, world.maxy) @@ -211,15 +211,15 @@ GLOBAL_LIST_EMPTY(all_waypoints) if("setcoord") if(params["setx"]) - var/newx = tgui_input_number(usr, "Input new destiniation x coordinate", "Coordinate input", dx, world.maxx, 1) - if(tgui_status(usr, state) != STATUS_INTERACTIVE) + var/newx = tgui_input_number(ui.user, "Input new destiniation x coordinate", "Coordinate input", dx, world.maxx, 1) + if(tgui_status(ui.user, state) != STATUS_INTERACTIVE) return if(newx) dx = CLAMP(newx, 1, world.maxx) if(params["sety"]) - var/newy = tgui_input_number(usr, "Input new destiniation y coordinate", "Coordinate input", dy, world.maxy, 1) - if(tgui_status(usr, state) != STATUS_INTERACTIVE) + var/newy = tgui_input_number(ui.user, "Input new destiniation y coordinate", "Coordinate input", dy, world.maxy, 1) + if(tgui_status(ui.user, state) != STATUS_INTERACTIVE) return if(newy) dy = CLAMP(newy, 1, world.maxy) @@ -236,13 +236,13 @@ GLOBAL_LIST_EMPTY(all_waypoints) . = TRUE if("speedlimit") - var/newlimit = tgui_input_number(usr, "Input new speed limit for autopilot (0 to brake)", "Autopilot speed limit", speedlimit*1000, 100000, round_value = FALSE) + var/newlimit = tgui_input_number(ui.user, "Input new speed limit for autopilot (0 to brake)", "Autopilot speed limit", speedlimit*1000, 100000, round_value = FALSE) if(newlimit) speedlimit = CLAMP(newlimit/1000, 0, 100) . = TRUE if("accellimit") - var/newlimit = tgui_input_number(usr, "Input new acceleration limit", "Acceleration limit", accellimit*1000, round_value = FALSE) + var/newlimit = tgui_input_number(ui.user, "Input new acceleration limit", "Acceleration limit", accellimit*1000, round_value = FALSE) if(newlimit) accellimit = max(newlimit/1000, 0) . = TRUE @@ -269,11 +269,11 @@ GLOBAL_LIST_EMPTY(all_waypoints) . = TRUE if("manual") - viewing_overmap(usr) ? unlook(usr) : look(usr) + viewing_overmap(ui.user) ? unlook(ui.user) : look(ui.user) . = TRUE - add_fingerprint(usr) - if(. && !issilicon(usr)) + add_fingerprint(ui.user) + if(. && !issilicon(ui.user)) playsound(src, "terminal_type", 50, 1) diff --git a/code/modules/overmap/ships/computers/sensors.dm b/code/modules/overmap/ships/computers/sensors.dm index 92965c4fd2..718a78e034 100644 --- a/code/modules/overmap/ships/computers/sensors.dm +++ b/code/modules/overmap/ships/computers/sensors.dm @@ -88,8 +88,8 @@ switch(action) if("viewing") - if(usr && !isAI(usr)) - viewing_overmap(usr) ? unlook(usr) : look(usr) + if(ui.user && !isAI(ui.user)) + viewing_overmap(ui.user) ? unlook(ui.user) : look(ui.user) . = TRUE if("link") @@ -99,15 +99,15 @@ if("scan") var/obj/effect/overmap/O = locate(params["scan"]) if(istype(O) && !QDELETED(O) && (O in view(7,linked))) - new/obj/item/paper/(get_turf(src), O.get_scan_data(usr), "paper (Sensor Scan - [O])") + new/obj/item/paper/(get_turf(src), O.get_scan_data(ui.user), "paper (Sensor Scan - [O])") playsound(src, "sound/machines/printer.ogg", 30, 1) . = TRUE if(sensors) switch(action) if("range") - var/nrange = tgui_input_number(usr, "Set new sensors range", "Sensor range", sensors.range, world.view, round_value = FALSE ) - if(tgui_status(usr, state) != STATUS_INTERACTIVE) + var/nrange = tgui_input_number(ui.user, "Set new sensors range", "Sensor range", sensors.range, world.view, round_value = FALSE ) + if(tgui_status(ui.user, state) != STATUS_INTERACTIVE) return FALSE if(nrange) sensors.set_range(CLAMP(nrange, 1, world.view)) @@ -116,7 +116,7 @@ sensors.toggle() . = TRUE - if(. && !issilicon(usr)) + if(. && !issilicon(ui.user)) playsound(src, "terminal_type", 50, 1) /obj/machinery/computer/ship/sensors/process() diff --git a/code/modules/overmap/ships/computers/ship.dm b/code/modules/overmap/ships/computers/ship.dm index 15df9bab59..2b63f95b9a 100644 --- a/code/modules/overmap/ships/computers/ship.dm +++ b/code/modules/overmap/ships/computers/ship.dm @@ -55,11 +55,11 @@ somewhere on that shuttle. Subtypes of these can be then used to perform ship ov return TRUE switch(action) if("sync") - sync_linked(usr) + sync_linked(ui.user) return TRUE if("close") - unlook(usr) - usr.unset_machine() + unlook(ui.user) + ui.user.unset_machine() return TRUE return FALSE diff --git a/code/modules/overmap/ships/computers/shuttle.dm b/code/modules/overmap/ships/computers/shuttle.dm index bfa14482a2..8f46266d3d 100644 --- a/code/modules/overmap/ships/computers/shuttle.dm +++ b/code/modules/overmap/ships/computers/shuttle.dm @@ -25,13 +25,13 @@ "fuel_span" = fuel_span ) -/obj/machinery/computer/shuttle_control/explore/tgui_act(action, list/params) +/obj/machinery/computer/shuttle_control/explore/tgui_act(action, list/params, datum/tgui/ui) if(..()) return TRUE var/datum/shuttle/autodock/overmap/shuttle = SSshuttles.shuttles[shuttle_tag] if(!istype(shuttle)) - to_chat(usr, span_warning("Unable to establish link with the shuttle.")) + to_chat(ui.user, span_warning("Unable to establish link with the shuttle.")) return TRUE switch(action) @@ -39,10 +39,10 @@ var/list/possible_d = shuttle.get_possible_destinations() var/D if(possible_d.len) - D = tgui_input_list(usr, "Choose shuttle destination", "Shuttle Destination", possible_d) + D = tgui_input_list(ui.user, "Choose shuttle destination", "Shuttle Destination", possible_d) else - to_chat(usr,span_warning("No valid landing sites in range.")) + to_chat(ui.user,span_warning("No valid landing sites in range.")) possible_d = shuttle.get_possible_destinations() - if(CanInteract(usr, GLOB.tgui_default_state) && (D in possible_d)) + if(CanInteract(ui.user, GLOB.tgui_default_state) && (D in possible_d)) shuttle.set_destination(possible_d[D]) return TRUE diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 45892c176c..aedfd80270 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -179,13 +179,13 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins if("scan") if(scan) scan.forceMove(loc) - if(ishuman(usr) && !usr.get_active_hand()) - usr.put_in_hands(scan) + if(ishuman(ui.user) && !ui.user.get_active_hand()) + ui.user.put_in_hands(scan) scan = null else - var/obj/item/I = usr.get_active_hand() + var/obj/item/I = ui.user.get_active_hand() if(istype(I, /obj/item/card/id)) - usr.drop_item() + ui.user.drop_item() I.forceMove(src) scan = I return TRUE @@ -195,30 +195,30 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins if(check_access(scan)) authenticated = scan.registered_name rank = scan.assignment - else if(login_type == LOGIN_TYPE_AI && isAI(usr)) - authenticated = usr.name + else if(login_type == LOGIN_TYPE_AI && isAI(ui.user)) + authenticated = ui.user.name rank = JOB_AI - else if(login_type == LOGIN_TYPE_ROBOT && isrobot(usr)) - authenticated = usr.name - var/mob/living/silicon/robot/R = usr + else if(login_type == LOGIN_TYPE_ROBOT && isrobot(ui.user)) + authenticated = ui.user.name + var/mob/living/silicon/robot/R = ui.user rank = "[R.modtype] [R.braintype]" return TRUE if("logout") if(scan) scan.forceMove(loc) - if(ishuman(usr) && !usr.get_active_hand()) - usr.put_in_hands(scan) + if(ishuman(ui.user) && !ui.user.get_active_hand()) + ui.user.put_in_hands(scan) scan = null authenticated = null return TRUE if("remove") if(copyitem) - if(get_dist(usr, src) >= 2) - to_chat(usr, "\The [copyitem] is too far away for you to remove it.") + if(get_dist(ui.user, src) >= 2) + to_chat(ui.user, "\The [copyitem] is too far away for you to remove it.") return copyitem.forceMove(loc) - usr.put_in_hands(copyitem) - to_chat(usr, span_notice("You take \the [copyitem] out of \the [src].")) + ui.user.put_in_hands(copyitem) + to_chat(ui.user, span_notice("You take \the [copyitem] out of \the [src].")) copyitem = null if("send_automated_staff_request") request_roles() @@ -229,7 +229,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins switch(action) if("rename") if(copyitem) - var/new_name = tgui_input_text(usr, "Enter new paper title", "This will show up in the preview for staff chat on discord when sending \ + var/new_name = tgui_input_text(ui.user, "Enter new paper title", "This will show up in the preview for staff chat on discord when sending \ to central.", copyitem.name, MAX_NAME_LEN) if(!new_name) return @@ -237,9 +237,9 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins if("send") if(copyitem) if (destination in admin_departments) - if(check_if_default_title_and_rename()) + if(check_if_default_title_and_rename(ui.user)) return - send_admin_fax(usr, destination) + send_admin_fax(ui.user, destination) else sendfax(destination) @@ -249,14 +249,14 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins if("dept") var/lastdestination = destination - destination = tgui_input_list(usr, "Which department?", "Choose a department", (alldepartments + admin_departments)) + destination = tgui_input_list(ui.user, "Which department?", "Choose a department", (alldepartments + admin_departments)) if(!destination) destination = lastdestination return TRUE -/obj/machinery/photocopier/faxmachine/proc/check_if_default_title_and_rename() +/obj/machinery/photocopier/faxmachine/proc/check_if_default_title_and_rename(mob/user) /* Returns TRUE only on "Cancel" or invalid newname, else returns null/false Extracted to its own procedure for easier logic handling with paper bundles. @@ -276,13 +276,13 @@ Extracted to its own procedure for easier logic handling with paper bundles. else if(copyitem.name != initial(copyitem.name)) return FALSE - var/choice = tgui_alert(usr, "[question_text] improve response time from staff when sending to discord. \ + var/choice = tgui_alert(user, "[question_text] improve response time from staff when sending to discord. \ Renaming it changes its preview in staff chat.", \ "Default name detected", list("Change Title","Continue", "Cancel")) if(!choice || choice == "Cancel") return TRUE else if(choice == "Change Title") - var/new_name = tgui_input_text(usr, "Enter new fax title", "This will show up in the preview for staff chat on discord when sending \ + var/new_name = tgui_input_text(user, "Enter new fax title", "This will show up in the preview for staff chat on discord when sending \ to central.", copyitem.name, MAX_NAME_LEN) if(!new_name) return TRUE @@ -295,9 +295,9 @@ Extracted to its own procedure for easier logic handling with paper bundles. O.forceMove(src) scan = O else if(O.has_tool_quality(TOOL_MULTITOOL) && panel_open) - var/input = sanitize(tgui_input_text(usr, "What Department ID would you like to give this fax machine?", "Multitool-Fax Machine Interface", department)) + var/input = sanitize(tgui_input_text(user, "What Department ID would you like to give this fax machine?", "Multitool-Fax Machine Interface", department)) if(!input) - to_chat(usr, "No input found. Please hang up and try your call again.") + to_chat(user, "No input found. Please hang up and try your call again.") return department = input if( !(("[department]" in alldepartments) || ("[department]" in admin_departments)) && !(department == "Unknown")) diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 2fed2a8742..8ef985f147 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -99,15 +99,15 @@ return list("contents" = files) -/obj/structure/filingcabinet/tgui_act(action, params) +/obj/structure/filingcabinet/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE switch(action) if("retrieve") var/obj/item/P = locate(params["ref"]) - if(istype(P) && (P.loc == src) && usr.Adjacent(src)) - usr.put_in_hands(P) + if(istype(P) && (P.loc == src) && ui.user.Adjacent(src)) + ui.user.put_in_hands(P) open_animation() SStgui.update_uis(src) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 5e4dfd3282..0794fecf38 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -61,13 +61,13 @@ switch(action) if("make_copy") - addtimer(CALLBACK(src, PROC_REF(copy_operation), usr), 0) + addtimer(CALLBACK(src, PROC_REF(copy_operation), ui.user), 0) . = TRUE if("remove") if(copyitem) - copyitem.loc = usr.loc - usr.put_in_hands(copyitem) - to_chat(usr, span_notice("You take \the [copyitem] out of \the [src].")) + copyitem.loc = ui.user.loc + ui.user.put_in_hands(copyitem) + to_chat(ui.user, span_notice("You take \the [copyitem] out of \the [src].")) copyitem = null else if(has_buckled_mobs()) to_chat(buckled_mobs[1], span_notice("You feel a slight pressure on your ass.")) // It can't eject your asscheeks, but it'll try. @@ -76,13 +76,13 @@ copies = clamp(text2num(params["num_copies"]), 1, maxcopies) . = TRUE if("ai_photo") - if(!issilicon(usr)) + if(!issilicon(ui.user)) return if(stat & (BROKEN|NOPOWER)) return if(toner >= 5) - var/mob/living/silicon/tempAI = usr + var/mob/living/silicon/tempAI = ui.user var/obj/item/camera/siliconcam/camera = tempAI.aiCamera if(!camera) @@ -376,7 +376,7 @@ if(M.item_is_in_hands(C)) continue if((C.body_parts_covered & LOWER_TORSO) && !istype(C,/obj/item/clothing/under/permit)) - to_chat(usr, span_warning("One needs to not be wearing pants to photocopy one's ass...")) + to_chat(M, span_warning("One needs to not be wearing pants to photocopy one's ass...")) return FALSE return TRUE diff --git a/code/modules/pda/core_apps.dm b/code/modules/pda/core_apps.dm index 5354620628..adde826178 100644 --- a/code/modules/pda/core_apps.dm +++ b/code/modules/pda/core_apps.dm @@ -33,7 +33,7 @@ else switch(text2num(params["option"])) if(1) // Configure pAI device - pda.pai.attack_self(usr) + pda.pai.attack_self(ui.user) if(2) // Eject pAI device var/turf/T = get_turf_or_move(pda.loc) if(T) @@ -72,105 +72,105 @@ return TRUE switch(action) if("Edit") - var/n = tgui_input_text(usr, "Please enter message", name, notehtml, multiline = TRUE, prevent_enter = TRUE) - if(pda.loc == usr) + var/n = tgui_input_text(ui.user, "Please enter message", name, notehtml, multiline = TRUE, prevent_enter = TRUE) + if(pda.loc == ui.user) note = adminscrub(n) notehtml = html_decode(note) note = replacetext(note, "\n", "
") else - pda.close(usr) + pda.close(ui.user) return TRUE if("Titleset") - var/n = tgui_input_text(usr, "Please enter title", name, notetitle, multiline = FALSE) - if(pda.loc == usr) + var/n = tgui_input_text(ui.user, "Please enter title", name, notetitle, multiline = FALSE) + if(pda.loc == ui.user) notetitle = adminscrub(n) else - pda.close(usr) + pda.close(ui.user) return TRUE if("Print") - if(pda.loc == usr) - printnote() + if(pda.loc == ui.user) + printnote(ui.user) else - pda.close(usr) + pda.close(ui.user) return TRUE // dumb way to do this, but i don't know how to easily parse this without a lot of silly code outside the switch! if("Note1") - if(pda.loc == usr) + if(pda.loc == ui.user) changetonote(1) else - pda.close(usr) + pda.close(ui.user) return TRUE if("Note2") - if(pda.loc == usr) + if(pda.loc == ui.user) changetonote(2) else - pda.close(usr) + pda.close(ui.user) return TRUE if("Note3") - if(pda.loc == usr) + if(pda.loc == ui.user) changetonote(3) else - pda.close(usr) + pda.close(ui.user) return TRUE if("Note4") - if(pda.loc == usr) + if(pda.loc == ui.user) changetonote(4) else - pda.close(usr) + pda.close(ui.user) return TRUE if("Note5") - if(pda.loc == usr) + if(pda.loc == ui.user) changetonote(5) else - pda.close(usr) + pda.close(ui.user) return TRUE if("Note6") - if(pda.loc == usr) + if(pda.loc == ui.user) changetonote(6) else - pda.close(usr) + pda.close(ui.user) return TRUE if("Note7") - if(pda.loc == usr) + if(pda.loc == ui.user) changetonote(7) else - pda.close(usr) + pda.close(ui.user) return TRUE if("Note8") - if(pda.loc == usr) + if(pda.loc == ui.user) changetonote(8) else - pda.close(usr) + pda.close(ui.user) return TRUE if("Note9") - if(pda.loc == usr) + if(pda.loc == ui.user) changetonote(9) else - pda.close(usr) + pda.close(ui.user) return TRUE if("Note10") - if(pda.loc == usr) + if(pda.loc == ui.user) changetonote(10) else - pda.close(usr) + pda.close(ui.user) return TRUE if("Note11") - if(pda.loc == usr) + if(pda.loc == ui.user) changetonote(11) else - pda.close(usr) + pda.close(ui.user) return TRUE if("Note12") - if(pda.loc == usr) + if(pda.loc == ui.user) changetonote(12) else - pda.close(usr) + pda.close(ui.user) return TRUE -/datum/data/pda/app/notekeeper/proc/printnote() +/datum/data/pda/app/notekeeper/proc/printnote(mob/user) // get active hand of person holding PDA, and print the page to the paper in it - if(istype( usr, /mob/living/carbon/human )) - var/mob/living/carbon/human/H = usr + if(istype( user, /mob/living/carbon/human )) + var/mob/living/carbon/human/H = user var/obj/item/I = H.get_active_hand() if(istype(I,/obj/item/paper)) var/obj/item/paper/P = I @@ -178,12 +178,12 @@ var/titlenote = "Note [alphabet_uppercase[currentnote]]" if(!isnull(notetitle) && notetitle != "") titlenote = notetitle - to_chat(usr, span_notice("Successfully printed [titlenote]!")) + to_chat(user, span_notice("Successfully printed [titlenote]!")) P.set_content( pencode2html(note), titlenote) else - to_chat(usr, span_notice("You can only print to empty paper!")) + to_chat(user, span_notice("You can only print to empty paper!")) else - to_chat(usr, span_notice("You must be holding paper for the pda to print to!")) + to_chat(user, span_notice("You must be holding paper for the pda to print to!")) /datum/data/pda/app/notekeeper/proc/changetonote(var/noteindex) diff --git a/code/modules/pda/messenger.dm b/code/modules/pda/messenger.dm index 15c0f2227a..b9d84fbe28 100644 --- a/code/modules/pda/messenger.dm +++ b/code/modules/pda/messenger.dm @@ -86,7 +86,7 @@ active_conversation = null if("Message") var/obj/item/pda/P = locate(params["target"]) - create_message(usr, P) + create_message(ui.user, P) if(params["target"] in conversations) // Need to make sure the message went through, if not welp. active_conversation = params["target"] if("Select Conversation") @@ -100,12 +100,12 @@ var/obj/item/pda/P = locate(params["target"]) if(!P) - to_chat(usr, "PDA not found.") + to_chat(ui.user, "PDA not found.") var/datum/data/pda/messenger_plugin/plugin = locate(params["plugin"]) if(plugin && (plugin in pda.cartridge.messenger_plugins)) plugin.messenger = src - plugin.user_act(usr, P) + plugin.user_act(ui.user, P) if("Back") active_conversation = null @@ -142,7 +142,7 @@ if(last_text && world.time < last_text + 5) return - if(!pda.can_use(usr)) + if(!pda.can_use(U)) return last_text = world.time @@ -181,7 +181,7 @@ PM.receive_message(list("sent" = 0, "owner" = "[pda.owner]", "job" = "[pda.ownjob]", "message" = "[t]", "target" = "\ref[pda]"), "\ref[pda]") SStgui.update_user_uis(U, P) // Update the sending user's PDA UI so that they can see the new message - log_pda("(PDA: [src.name]) sent \"[t]\" to [P.name]", usr) + log_pda("(PDA: [src.name]) sent \"[t]\" to [P.name]", U) to_chat(U, "[icon2html(pda,U.client)] Sent message to [P.owner] ([P.ownjob]), \"[t]\"") else to_chat(U, span_notice("ERROR: Messaging server is not responding.")) diff --git a/code/modules/pda/pda_tgui.dm b/code/modules/pda/pda_tgui.dm index 40cf215494..5fa161170d 100644 --- a/code/modules/pda/pda_tgui.dm +++ b/code/modules/pda/pda_tgui.dm @@ -63,8 +63,8 @@ if(..()) return TRUE - add_fingerprint(usr) - usr.set_machine(src) + add_fingerprint(ui.user) + ui.user.set_machine(src) if(!touch_silent) playsound(src, 'sound/machines/pda_click.ogg', 20) @@ -99,7 +99,7 @@ cartridge = null update_shortcuts() if("Authenticate")//Checks for ID - id_check(usr, 1) + id_check(ui.user, 1) if("Retro") retro_mode = !retro_mode if("TouchSounds") diff --git a/code/modules/persistence/noticeboard.dm b/code/modules/persistence/noticeboard.dm index 62261ae0d8..7282ac3e26 100644 --- a/code/modules/persistence/noticeboard.dm +++ b/code/modules/persistence/noticeboard.dm @@ -56,7 +56,7 @@ /obj/structure/noticeboard/attackby(obj/item/I, mob/user) if(I.has_tool_quality(TOOL_SCREWDRIVER)) - var/choice = tgui_input_list(usr, "Which direction do you wish to place the noticeboard?", "Noticeboard Offset", list("North", "South", "East", "West", "No Offset")) + var/choice = tgui_input_list(user, "Which direction do you wish to place the noticeboard?", "Noticeboard Offset", list("North", "South", "East", "West", "No Offset")) if(choice && Adjacent(user) && I.loc == user && !user.incapacitated()) playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) switch(choice) @@ -127,7 +127,7 @@ data["notices"] = tgui_notices return data -/obj/structure/noticeboard/tgui_act(action, params) +/obj/structure/noticeboard/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -135,36 +135,36 @@ if("read") var/obj/item/paper/P = locate(params["ref"]) if(P && P.loc == src) - P.show_content(usr) + P.show_content(ui.user) . = TRUE if("look") var/obj/item/photo/P = locate(params["ref"]) if(P && P.loc == src) - P.show(usr) + P.show(ui.user) . = TRUE if("remove") - if(!in_range(src, usr)) + if(!in_range(src, ui.user)) return FALSE var/obj/item/I = locate(params["ref"]) remove_paper(I) if(istype(I)) - usr.put_in_hands(I) - add_fingerprint(usr) + ui.user.put_in_hands(I) + add_fingerprint(ui.user) . = TRUE if("write") - if(!in_range(src, usr)) + if(!in_range(src, ui.user)) return FALSE var/obj/item/P = locate(params["ref"]) if((P && P.loc == src)) //if the paper's on the board - var/mob/living/M = usr + var/mob/living/M = ui.user if(istype(M)) var/obj/item/pen/E = M.get_type_in_hands(/obj/item/pen) if(E) add_fingerprint(M) - P.attackby(E, usr) + P.attackby(E, ui.user) else to_chat(M, span_notice("You'll need something to write with!")) . = TRUE diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 0fd0cdfc0c..f66a2afe20 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -565,7 +565,7 @@ GLOBAL_LIST_EMPTY(apcs) if(do_after(user, 20)) if(C.get_amount() >= 10 && !terminal && opened && has_electronics != APC_HAS_ELECTRONICS_SECURED) var/obj/structure/cable/N = T.get_cable_node() - if(prob(50) && electrocute_mob(usr, N, N)) + if(prob(50) && electrocute_mob(user, N, N)) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, src) s.start() @@ -587,11 +587,11 @@ GLOBAL_LIST_EMPTY(apcs) playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 50 * W.toolspeed)) if(terminal && opened && has_electronics != APC_HAS_ELECTRONICS_SECURED) - if(prob(50) && electrocute_mob(usr, terminal.powernet, terminal)) + if(prob(50) && electrocute_mob(user, terminal.powernet, terminal)) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, src) s.start() - if(usr.stunned) + if(user.stunned) return new /obj/item/stack/cable_coil(loc,10) to_chat(user, span_notice("You cut the cables and dismantle the power terminal.")) @@ -914,18 +914,18 @@ GLOBAL_LIST_EMPTY(apcs) return 0 return 1 -/obj/machinery/power/apc/tgui_act(action, params) - if(..() || !can_use(usr, TRUE)) +/obj/machinery/power/apc/tgui_act(action, params, datum/tgui/ui) + if(..() || !can_use(ui.user, TRUE)) return TRUE // There's a handful of cases where we want to allow users to bypass the `locked` variable. // If can_admin_interact() wasn't only defined on observers, this could just be part of a single-line // conditional. var/locked_exception = FALSE - if(issilicon(usr) || action == "nightshift") + if(issilicon(ui.user) || action == "nightshift") locked_exception = TRUE - if(isobserver(usr)) - var/mob/observer/dead/D = usr + if(isobserver(ui.user)) + var/mob/observer/dead/D = ui.user if(D.can_admin_interact()) locked_exception = TRUE @@ -937,7 +937,7 @@ GLOBAL_LIST_EMPTY(apcs) if("lock") if(locked_exception) // Yay code reuse if(emagged || (stat & (BROKEN|MAINT))) - to_chat(usr, "The APC does not respond to the command.") + to_chat(ui.user, "The APC does not respond to the command.") return locked = !locked update_icon() @@ -947,7 +947,7 @@ GLOBAL_LIST_EMPTY(apcs) toggle_breaker() if("nightshift") if(last_nightshift_switch > world.time - 10 SECONDS) // don't spam... - to_chat(usr, span_warning("[src]'s night lighting circuit breaker is still cycling!")) + to_chat(ui.user, span_warning("[src]'s night lighting circuit breaker is still cycling!")) return 0 last_nightshift_switch = world.time nightshift_setting = params["nightshift"] diff --git a/code/modules/power/gravitygenerator_vr.dm b/code/modules/power/gravitygenerator_vr.dm index cce29f07c5..489583cf02 100644 --- a/code/modules/power/gravitygenerator_vr.dm +++ b/code/modules/power/gravitygenerator_vr.dm @@ -261,14 +261,14 @@ GLOBAL_LIST_EMPTY(gravity_generators) return data -/obj/machinery/gravity_generator/main/tgui_act(action, params) +/obj/machinery/gravity_generator/main/tgui_act(action, params, datum/tgui/ui) if((..())) return TRUE switch(action) if("gentoggle") breaker = !breaker - investigate_log("was toggled [breaker ? "ON" : "OFF"] by [key_name(usr)].", "gravity") + investigate_log("was toggled [breaker ? "ON" : "OFF"] by [key_name(ui.user)].", "gravity") set_power() return TOPIC_REFRESH diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index b3a4f6ee92..f3b1620626 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -350,11 +350,11 @@ return data -/obj/machinery/power/port_gen/pacman/tgui_act(action, params) +/obj/machinery/power/port_gen/pacman/tgui_act(action, params, datum/tgui/ui) if(..()) return - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if("toggle_power") TogglePower() diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 990cbb4780..944915f209 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -82,26 +82,26 @@ part.strength = strength part.update_icon() -/obj/machinery/particle_accelerator/control_box/proc/add_strength(var/s) +/obj/machinery/particle_accelerator/control_box/proc/add_strength(mob/user, var/s) if(assembled) strength++ if(strength > strength_upper_limit) strength = strength_upper_limit else - message_admins("PA Control Computer increased to [strength] by [key_name(usr, usr.client)][ADMIN_QUE(usr)] in [ADMIN_COORDJMP(src)]",0,1) - log_game("PACCEL([x],[y],[z]) [key_name(usr)] increased to [strength]") - investigate_log("increased to [strength] by [usr.key]","singulo") + message_admins("PA Control Computer increased to [strength] by [key_name(user, user.client)][ADMIN_QUE(user)] in [ADMIN_COORDJMP(src)]",0,1) + log_game("PACCEL([x],[y],[z]) [key_name(user)] increased to [strength]") + investigate_log("increased to [strength] by [user.key]","singulo") strength_change() -/obj/machinery/particle_accelerator/control_box/proc/remove_strength(var/s) +/obj/machinery/particle_accelerator/control_box/proc/remove_strength(mob/user, var/s) if(assembled) strength-- if(strength < 0) strength = 0 else - message_admins("PA Control Computer decreased to [strength] by [key_name(usr, usr.client)][ADMIN_QUE(usr)] in [ADMIN_COORDJMP(src)]",0,1) - log_game("PACCEL([x],[y],[z]) [key_name(usr)] decreased to [strength]") - investigate_log("decreased to [strength] by [usr.key]","singulo") + message_admins("PA Control Computer decreased to [strength] by [key_name(user, user.client)][ADMIN_QUE(user)] in [ADMIN_COORDJMP(src)]",0,1) + log_game("PACCEL([x],[y],[z]) [key_name(user)] decreased to [strength]") + investigate_log("decreased to [strength] by [user.key]","singulo") strength_change() /obj/machinery/particle_accelerator/control_box/power_change() @@ -118,7 +118,7 @@ //a part is missing! if( length(connected_parts) < 6 ) log_game("PACCEL([x],[y],[z]) Failed due to missing parts.") - investigate_log("lost a connected part; It powered down.","singulo") + investigate_log("lost a connected part; It " + span_red("powered down") + ".","singulo") toggle_power() return //emit some particles @@ -181,11 +181,11 @@ return 0 -/obj/machinery/particle_accelerator/control_box/proc/toggle_power() +/obj/machinery/particle_accelerator/control_box/proc/toggle_power(mob/user) active = !active - investigate_log("turned [active?"ON":"OFF"] by [usr ? usr.key : "outside forces"]","singulo") - message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? key_name(usr, usr.client) : "outside forces"][ADMIN_QUE(usr)] in [ADMIN_COORDJMP(src)]",0,1) - log_game("PACCEL([x],[y],[z]) [usr ? key_name(usr, usr.client) : "outside forces"] turned [active?"ON":"OFF"].") + investigate_log("turned [active?"ON":"OFF"] by [user ? user.key : "outside forces"]","singulo") + message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [user ? key_name(user, user.client) : "outside forces"][ADMIN_QUE(user)] in [ADMIN_COORDJMP(src)]",0,1) + log_game("PACCEL([x],[y],[z]) [user ? key_name(user, user.client) : "outside forces"] turned [active?"ON":"OFF"].") if(active) update_use_power(USE_POWER_ACTIVE) for(var/obj/structure/particle_accelerator/part in connected_parts) @@ -226,7 +226,7 @@ data["strength"] = strength return data -/obj/machinery/particle_accelerator/control_box/tgui_act(action, params) +/obj/machinery/particle_accelerator/control_box/tgui_act(action, params, datum/tgui/ui) if(..()) return @@ -234,7 +234,7 @@ if("power") if(wires.is_cut(WIRE_POWER)) return - toggle_power() + toggle_power(ui.user) . = TRUE if("scan") part_scan() @@ -242,12 +242,12 @@ if("add_strength") if(wires.is_cut(WIRE_PARTICLE_STRENGTH)) return - add_strength() + add_strength(ui.user) . = TRUE if("remove_strength") if(wires.is_cut(WIRE_PARTICLE_STRENGTH)) return - remove_strength() + remove_strength(ui.user) . = TRUE update_icon() diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index d873de88bc..1eceed8782 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -338,12 +338,12 @@ GLOBAL_LIST_EMPTY(smeses) to_chat(user, span_filter_notice(span_notice("You begin to cut the cables..."))) playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 50 * W.toolspeed)) - if (prob(50) && electrocute_mob(usr, term.powernet, term)) + if (prob(50) && electrocute_mob(user, term.powernet, term)) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, src) s.start() building_terminal = FALSE - if(usr.stunned) + if(user.stunned) return FALSE new /obj/item/stack/cable_coil(loc,10) user.visible_message(\ diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index faacf25053..b7a59fd2c8 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -124,7 +124,7 @@ if(default_deconstruction_crowbar(user, W)) return if(istype(W, /obj/item/multitool)) - var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", name, comp_id, MAX_NAME_LEN) + var/new_ident = tgui_input_text(user, "Enter a new ident tag.", name, comp_id, MAX_NAME_LEN) new_ident = sanitize(new_ident,MAX_NAME_LEN) if(new_ident && user.Adjacent(src)) comp_id = new_ident @@ -338,7 +338,7 @@ /obj/machinery/computer/turbine_computer/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/multitool)) - var/new_ident = tgui_input_text(usr, "Enter a new ident tag.", name, id, MAX_NAME_LEN) + var/new_ident = tgui_input_text(user, "Enter a new ident tag.", name, id, MAX_NAME_LEN) new_ident = sanitize(new_ident,MAX_NAME_LEN) if(new_ident && user.Adjacent(src)) id = new_ident diff --git a/code/modules/projectiles/broken.dm b/code/modules/projectiles/broken.dm index 6d90e68fef..3eda477814 100644 --- a/code/modules/projectiles/broken.dm +++ b/code/modules/projectiles/broken.dm @@ -98,34 +98,37 @@ /obj/item/broken_gun/proc/can_repair_with(obj/item/I, mob/user) for(var/path in material_needs) - if(ispath(path) && istype(I, path)) - if(material_needs[path] > 0) - if(istype(I, /obj/item/stack)) - var/obj/item/stack/S = I - if(S.can_use(material_needs[path])) - return TRUE - else - to_chat(user, span_notice("You do not have enough [path] to continue repairs.")) - else - return TRUE - + if(!ispath(path) || !istype(I, path)) + continue + if(material_needs[path] <= 0) + continue + if(istype(I, /obj/item/stack)) + var/obj/item/stack/S = I + if(S.can_use(material_needs[path])) + return TRUE + else + to_chat(user, span_notice("You do not have enough [I] to continue repairs.")) + else + return TRUE return FALSE /obj/item/broken_gun/proc/repair_with(obj/item/I, mob/user) for(var/path in material_needs) - if(ispath(path) && istype(I, path)) - if(material_needs[path] > 0) - if(istype(I, /obj/item/stack)) - var/obj/item/stack/S = I - if(S.can_use(material_needs[path])) - S.use(material_needs[path]) - material_needs[path] = 0 - to_chat(user, span_notice("You repair some damage on \the [src] with \the [S].")) - else - material_needs[path] = max(0, material_needs[path] - 1) - user.drop_from_inventory(I) - to_chat(user, span_notice("You repair some damage on \the [src] with \the [I].")) - qdel(I) + if(!ispath(path) || !istype(I, path)) + continue + if(material_needs[path] <= 0) + continue + if(istype(I, /obj/item/stack)) + var/obj/item/stack/S = I + if(S.can_use(material_needs[path])) + S.use(material_needs[path]) + material_needs[path] = 0 + to_chat(user, span_notice("You repair some damage on \the [src] with \the [S].")) + else + material_needs[path] = max(0, material_needs[path] - 1) + user.drop_from_inventory(I) + to_chat(user, span_notice("You repair some damage on \the [src] with \the [I].")) + qdel(I) check_complete_repair(user) diff --git a/code/modules/reagents/machinery/chem_master.dm b/code/modules/reagents/machinery/chem_master.dm index 1d74de0131..8815733671 100644 --- a/code/modules/reagents/machinery/chem_master.dm +++ b/code/modules/reagents/machinery/chem_master.dm @@ -300,7 +300,7 @@ var/amount_per_pill = CLAMP(reagents.total_volume / count, 0, MAX_UNITS_PER_PILL) while(count--) if(reagents.total_volume <= 0) - to_chat(usr, span_notice("Not enough reagents to create these pills!")) + to_chat(ui.user, span_notice("Not enough reagents to create these pills!")) return var/obj/item/reagent_containers/pill/P = new(loc) @@ -336,7 +336,7 @@ // var/is_medical_patch = chemical_safety_check(reagents) while(count--) if(reagents.total_volume <= 0) - to_chat(usr, span_notice("Not enough reagents to create these patches!")) + to_chat(ui.user, span_notice("Not enough reagents to create these patches!")) return var/obj/item/reagent_containers/pill/patch/P = new(loc) @@ -363,7 +363,7 @@ var/amount_per_bottle = CLAMP(reagents.total_volume / count, 0, MAX_UNITS_PER_BOTTLE) while(count--) if(reagents.total_volume <= 0) - to_chat(usr, span_notice("Not enough reagents to create these bottles!")) + to_chat(ui.user, span_notice("Not enough reagents to create these bottles!")) return var/obj/item/reagent_containers/glass/bottle/P = new(loc) P.name = "[answer] bottle" @@ -393,8 +393,8 @@ if(tgui_act_modal(action, params, ui, state)) return TRUE - add_fingerprint(usr) - usr.set_machine(src) + add_fingerprint(ui.user) + ui.user.set_machine(src) . = TRUE switch(action) @@ -403,8 +403,8 @@ if("ejectp") if(loaded_pill_bottle) loaded_pill_bottle.forceMove(get_turf(src)) - if(Adjacent(usr) && !issilicon(usr)) - usr.put_in_hands(loaded_pill_bottle) + if(Adjacent(ui.user) && !issilicon(ui.user)) + ui.user.put_in_hands(loaded_pill_bottle) loaded_pill_bottle = null if("print") if(printing || condi) @@ -463,8 +463,8 @@ if(!beaker) return beaker.forceMove(get_turf(src)) - if(Adjacent(usr) && !issilicon(usr)) - usr.put_in_hands(beaker) + if(Adjacent(ui.user) && !issilicon(ui.user)) + ui.user.put_in_hands(beaker) beaker = null reagents.clear_reagents() update_icon() diff --git a/code/modules/reagents/machinery/grinder.dm b/code/modules/reagents/machinery/grinder.dm index a20920fc7e..80a85443b8 100644 --- a/code/modules/reagents/machinery/grinder.dm +++ b/code/modules/reagents/machinery/grinder.dm @@ -209,14 +209,7 @@ var/global/list/ore_reagents = list( //have a number of reageents divisible by R if(length(holdingitems)) options["grind"] = radial_grind - var/choice - if(length(options) < 1) - return - if(length(options) == 1) - for(var/key in options) - choice = key - else - choice = show_radial_menu(user, src, options, require_near = !issilicon(user)) + var/choice = show_radial_menu(user, src, options, require_near = !issilicon(user), autopick_single_option = FALSE) // post choice verification if(inuse || (isAI(user) && stat & NOPOWER) || user.incapacitated()) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 4afa7be2d2..c31597b6e9 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -121,9 +121,9 @@ if(istype(G)) // handle grabbed mob if(ismob(G.affecting)) var/mob/GM = G.affecting - for (var/mob/V in viewers(usr)) - V.show_message("[usr] starts putting [GM.name] into the disposal.", 3) - if(do_after(usr, 20)) + for (var/mob/V in viewers(user)) + V.show_message("[user] starts putting [GM.name] into the disposal.", 3) + if(do_after(user, 20)) if (GM.client) GM.client.perspective = EYE_PERSPECTIVE GM.client.eye = src @@ -169,13 +169,13 @@ src.add_fingerprint(user) var/target_loc = target.loc var/msg - for (var/mob/V in viewers(usr)) + for (var/mob/V in viewers(user)) if(target == user && !user.stat && !user.weakened && !user.stunned && !user.paralysis) - V.show_message("[usr] starts climbing into the disposal.", 3) + V.show_message("[user] starts climbing into the disposal.", 3) if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis) if(target.anchored) return - V.show_message("[usr] starts stuffing [target.name] into the disposal.", 3) - if(!do_after(usr, 20)) + V.show_message("[user] starts stuffing [target.name] into the disposal.", 3) + if(!do_after(user, 20)) return if(target_loc != target.loc) return @@ -265,18 +265,18 @@ if(..()) return - if(usr.loc == src) - to_chat(usr, span_warning("You cannot reach the controls from inside.")) + if(ui.user.loc == src) + to_chat(ui.user, span_warning("You cannot reach the controls from inside.")) return TRUE if(mode==-1 && action != "eject") // If the mode is -1, only allow ejection - to_chat(usr, span_warning("The disposal units power is disabled.")) + to_chat(ui.user, span_warning("The disposal units power is disabled.")) return if(stat & BROKEN) return - add_fingerprint(usr) + add_fingerprint(ui.user) if(flushing) return diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 45f788fc03..af1586c8ff 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -40,9 +40,9 @@ to_chat(user, span_warning("You need to set a destination first!")) else if(istype(W, /obj/item/pen)) - switch(tgui_alert(usr, "What would you like to alter?","Select Alteration",list("Title","Description","Cancel"))) + switch(tgui_alert(user, "What would you like to alter?","Select Alteration",list("Title","Description","Cancel"))) if("Title") - var/str = sanitizeSafe(tgui_input_text(usr,"Label text?","Set label","", MAX_NAME_LEN), MAX_NAME_LEN) + var/str = sanitizeSafe(tgui_input_text(user,"Label text?","Set label","", MAX_NAME_LEN), MAX_NAME_LEN) if(!str || !length(str)) to_chat(user, span_warning(" Invalid text.")) return @@ -57,7 +57,7 @@ else nameset = 1 if("Description") - var/str = sanitize(tgui_input_text(usr,"Label text?","Set label","")) + var/str = sanitize(tgui_input_text(user,"Label text?","Set label","")) if(!str || !length(str)) to_chat(user, span_red("Invalid text.")) return @@ -151,9 +151,9 @@ to_chat(user, span_warning("You need to set a destination first!")) else if(istype(W, /obj/item/pen)) - switch(tgui_alert(usr, "What would you like to alter?","Select Alteration",list("Title","Description","Cancel"))) + switch(tgui_alert(user, "What would you like to alter?","Select Alteration",list("Title","Description","Cancel"))) if("Title") - var/str = sanitizeSafe(tgui_input_text(usr,"Label text?","Set label","", MAX_NAME_LEN), MAX_NAME_LEN) + var/str = sanitizeSafe(tgui_input_text(user,"Label text?","Set label","", MAX_NAME_LEN), MAX_NAME_LEN) if(!str || !length(str)) to_chat(user, span_warning(" Invalid text.")) return @@ -169,7 +169,7 @@ nameset = 1 if("Description") - var/str = sanitize(tgui_input_text(usr,"Label text?","Set label","")) + var/str = sanitize(tgui_input_text(user,"Label text?","Set label","")) if(!str || !length(str)) to_chat(user, span_red("Invalid text.")) return @@ -268,9 +268,9 @@ if(i > 5) P.icon_state = "deliverycrate5" P.name = "huge parcel" - P.add_fingerprint(usr) - O.add_fingerprint(usr) - src.add_fingerprint(usr) + P.add_fingerprint(user) + O.add_fingerprint(user) + src.add_fingerprint(user) src.amount -= 1 user.visible_message("\The [user] wraps \a [target] with \a [src].",\ span_notice("You wrap \the [target], leaving [amount] units of paper on \the [src]."),\ @@ -374,10 +374,10 @@ /obj/item/destTagger/attack_self(mob/user as mob) tgui_interact(user) -/obj/item/destTagger/tgui_act(action, params) +/obj/item/destTagger/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if("set_tag") var/new_tag = params["tag"] diff --git a/code/modules/research/rdconsole_tgui.dm b/code/modules/research/rdconsole_tgui.dm index 743de3d7c1..c55894d63c 100644 --- a/code/modules/research/rdconsole_tgui.dm +++ b/code/modules/research/rdconsole_tgui.dm @@ -297,26 +297,26 @@ if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if("search") search = params["search"] - update_tgui_static_data(usr, ui) + update_tgui_static_data(ui.user, ui) return TRUE if("design_page") if(params["reset"]) design_page = 0 else design_page = max(design_page + (1 * params["reverse"]), 0) - update_tgui_static_data(usr, ui) + update_tgui_static_data(ui.user, ui) return TRUE if("builder_page") if(params["reset"]) builder_page = 0 else builder_page = max(builder_page + (1 * params["reverse"]), 0) - update_tgui_static_data(usr, ui) + update_tgui_static_data(ui.user, ui) return TRUE if("updt_tech") //Update the research holder with information from the technology disk. @@ -326,7 +326,7 @@ files.AddTech2Known(t_disk.stored) files.RefreshResearch() griefProtection() //Update CentCom too - update_tgui_static_data(usr, ui) + update_tgui_static_data(ui.user, ui) return TRUE if("clear_tech") //Erase data on the technology disk. @@ -351,7 +351,7 @@ busy_msg = null files.AddDesign2Known(d_disk.blueprint) griefProtection() //Update CentCom too - update_tgui_static_data(usr, ui) + update_tgui_static_data(ui.user, ui) return TRUE if("clear_design") //Erases data on the design disk. @@ -373,7 +373,7 @@ if("eject_item") //Eject the item inside the destructive analyzer. if(linked_destroy) if(linked_destroy.busy) - to_chat(usr, span_notice("The destructive analyzer is busy at the moment.")) + to_chat(ui.user, span_notice("The destructive analyzer is busy at the moment.")) return FALSE if(linked_destroy.loaded_item) @@ -387,7 +387,7 @@ return FALSE if(linked_destroy.busy) - to_chat(usr, span_notice("The destructive analyzer is busy at the moment.")) + to_chat(ui.user, span_notice("The destructive analyzer is busy at the moment.")) return linked_destroy.busy = 1 @@ -398,7 +398,7 @@ linked_destroy.busy = 0 busy_msg = null if(!linked_destroy.loaded_item) - to_chat(usr, span_notice("The destructive analyzer appears to be empty.")) + to_chat(ui.user, span_notice("The destructive analyzer appears to be empty.")) return if(istype(linked_destroy.loaded_item,/obj/item/stack))//Only deconsturcts one sheet at a time instead of the entire stack @@ -440,19 +440,19 @@ use_power(linked_destroy.active_power_usage) files.RefreshResearch() - update_tgui_static_data(usr, ui) + update_tgui_static_data(ui.user, ui) return TRUE if("lock") //Lock the console from use by anyone without tox access. - if(!allowed(usr)) - to_chat(usr, "Unauthorized Access.") + if(!allowed(ui.user)) + to_chat(ui.user, "Unauthorized Access.") return locked = !locked return TRUE if("sync") //Sync the research holder with all the R&D consoles in the game that aren't sync protected. if(!sync) - to_chat(usr, span_notice("You must connect to the network first.")) + to_chat(ui.user, span_notice("You must connect to the network first.")) return busy_msg = "Updating Database..." @@ -478,7 +478,7 @@ S.produce_heat() busy_msg = null files.RefreshResearch() - update_tgui_static_data(usr, ui) + update_tgui_static_data(ui.user, ui) return TRUE if("togglesync") //Prevents the console from being synced by other consoles. Can still send data. @@ -573,7 +573,7 @@ spawn(10) busy_msg = null SyncRDevices() - update_tgui_static_data(usr, ui) + update_tgui_static_data(ui.user, ui) return TRUE if("disconnect") //The R&D console disconnects with a specific device. @@ -587,18 +587,18 @@ if("imprinter") linked_imprinter.linked_console = null linked_imprinter = null - update_tgui_static_data(usr, ui) + update_tgui_static_data(ui.user, ui) if("reset") //Reset the R&D console's database. griefProtection() - var/choice = tgui_alert(usr, "R&D Console Database Reset", "Are you sure you want to reset the R&D console's database? Data lost cannot be recovered.", list("Continue", "Cancel")) + var/choice = tgui_alert(ui.user, "R&D Console Database Reset", "Are you sure you want to reset the R&D console's database? Data lost cannot be recovered.", list("Continue", "Cancel")) if(choice == "Continue") busy_msg = "Updating Database..." qdel(files) files = new /datum/research(src) spawn(20) busy_msg = null - update_tgui_static_data(usr, ui) + update_tgui_static_data(ui.user, ui) if("print") //Print research information busy_msg = "Printing Research Information. Please Wait..." diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 3d6b1af851..7857fb2787 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -219,7 +219,7 @@ if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if("toggle_upload", "toggle_download") var/obj/machinery/r_n_d/server/S = locate(params["server"]) @@ -248,7 +248,7 @@ var/obj/machinery/r_n_d/server/target = locate(params["server"]) if(!istype(target)) return FALSE - var/choice = tgui_alert(usr, "Technology Data Rest", "Are you sure you want to reset this technology to its default data? Data lost cannot be recovered.", list("Continue", "Cancel")) + var/choice = tgui_alert(ui.user, "Technology Data Rest", "Are you sure you want to reset this technology to its default data? Data lost cannot be recovered.", list("Continue", "Cancel")) if(choice == "Continue") for(var/datum/tech/T in target.files.known_tech) if(T.id == params["tech"]) @@ -261,7 +261,7 @@ var/obj/machinery/r_n_d/server/target = locate(params["server"]) if(!istype(target)) return FALSE - var/choice = tgui_alert(usr, "Design Data Deletion", "Are you sure you want to delete this design? If you still have the prerequisites for the design, it'll reset to its base reliability. Data lost cannot be recovered.", list("Continue", "Cancel")) + var/choice = tgui_alert(ui.user, "Design Data Deletion", "Are you sure you want to delete this design? If you still have the prerequisites for the design, it'll reset to its base reliability. Data lost cannot be recovered.", list("Continue", "Cancel")) if(choice == "Continue") for(var/datum/design/D in target.files.known_designs) if(D.id == params["design"]) @@ -273,8 +273,8 @@ if("transfer_data") if(!badmin) // no href exploits, you've been r e p o r t e d - log_admin("Warning: [key_name(usr)] attempted to transfer R&D data from [params["server"]] to [params["target"]] via href exploit with [src] [COORD(src)]") - message_admins("Warning: [ADMIN_FULLMONTY(usr)] attempted to transfer R&D data from [params["server"]] to [params["target"]] via href exploit with [src] [ADMIN_COORDJMP(src)]") + log_admin("Warning: [key_name(ui.user)] attempted to transfer R&D data from [params["server"]] to [params["target"]] via href exploit with [src] [COORD(src)]") + message_admins("Warning: [ADMIN_FULLMONTY(ui.user)] attempted to transfer R&D data from [params["server"]] to [params["target"]] via href exploit with [src] [ADMIN_COORDJMP(src)]") return FALSE var/obj/machinery/r_n_d/server/from = locate(params["server"]) if(!istype(from)) diff --git a/code/modules/resleeving/computers.dm b/code/modules/resleeving/computers.dm index 35b697455c..d2c36c3de6 100644 --- a/code/modules/resleeving/computers.dm +++ b/code/modules/resleeving/computers.dm @@ -230,7 +230,7 @@ return data -/obj/machinery/computer/transhuman/resleeving/tgui_act(action, params) +/obj/machinery/computer/transhuman/resleeving/tgui_act(action, params, datum/tgui/ui) . = ..() if(.) return @@ -391,7 +391,7 @@ subtargets += H if(subtargets.len) var/oc_sanity = sleever.occupant - override = tgui_input_list(usr,"Multiple bodies detected. Select target for resleeving of [active_mr.mindname] manually. Sleeving of primary body is unsafe with sub-contents, and is not listed.", "Resleeving Target", subtargets) + override = tgui_input_list(ui.user,"Multiple bodies detected. Select target for resleeving of [active_mr.mindname] manually. Sleeving of primary body is unsafe with sub-contents, and is not listed.", "Resleeving Target", subtargets) if(!override || oc_sanity != sleever.occupant || !(override in sleever.occupant)) set_temp("Error: Target selection aborted.", "danger") active_mr = null diff --git a/code/modules/resleeving/designer.dm b/code/modules/resleeving/designer.dm index 72a7778e1d..cd993530bc 100644 --- a/code/modules/resleeving/designer.dm +++ b/code/modules/resleeving/designer.dm @@ -216,20 +216,20 @@ return data -/obj/machinery/computer/transhuman/designer/tgui_act(action, params) +/obj/machinery/computer/transhuman/designer/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE switch(action) if("debug_load_my_body") - active_br = new /datum/transhuman/body_record(usr, FALSE, FALSE) + active_br = new /datum/transhuman/body_record(ui.user, FALSE, FALSE) update_preview_icon() menu = MENU_SPECIFICRECORD if("view_brec") var/datum/transhuman/body_record/BR = locate(params["view_brec"]) if(BR && istype(BR.mydna)) - if(allowed(usr) || BR.ckey == usr.ckey) + if(allowed(ui.user) || BR.ckey == ui.user.ckey) active_br = new /datum/transhuman/body_record(BR) // Load a COPY! update_preview_icon() menu = MENU_SPECIFICRECORD @@ -282,9 +282,9 @@ temp = "" if("href_conversion") - PrefHrefMiddleware(params, usr) + PrefHrefMiddleware(params, ui.user) - add_fingerprint(usr) + add_fingerprint(ui.user) return 1 // Return 1 to refresh UI // diff --git a/code/modules/rogueminer_vr/zone_console.dm b/code/modules/rogueminer_vr/zone_console.dm index 62cb644990..93f8ba2aac 100644 --- a/code/modules/rogueminer_vr/zone_console.dm +++ b/code/modules/rogueminer_vr/zone_console.dm @@ -84,7 +84,7 @@ data["can_recall_shuttle"] = (shuttle_control && (shuttle_control.z in using_map.belter_belt_z) && !curZoneOccupied) return data -/obj/machinery/computer/roguezones/tgui_act(action, list/params) +/obj/machinery/computer/roguezones/tgui_act(action, list/params, datum/tgui/ui) if(..()) return TRUE switch(action) @@ -92,10 +92,10 @@ scan_for_new_zone() . = TRUE if("recall_shuttle") - failsafe_shuttle_recall() + failsafe_shuttle_recall(ui.user) . = TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) /obj/machinery/computer/roguezones/proc/scan_for_new_zone() if(scanning) @@ -132,7 +132,7 @@ return -/obj/machinery/computer/roguezones/proc/failsafe_shuttle_recall() +/obj/machinery/computer/roguezones/proc/failsafe_shuttle_recall(mob/user) if(!shuttle_control) return // Shuttle computer has been destroyed if (!(shuttle_control.z in using_map.belter_belt_z)) @@ -141,7 +141,7 @@ return // Not usable if shuttle is in occupied zone // Okay do it var/datum/shuttle/autodock/ferry/S = SSshuttles.shuttles["Belter"] - S.launch(usr) + S.launch(user) /obj/item/circuitboard/roguezones name = T_BOARD("asteroid belt scanning computer") @@ -160,4 +160,4 @@ When a new zone has been scanned, your station's shuttle destination will be updated to direct it to the newly discovered area automatically.
You can then travel to the new area to mine in that location.

- This technology produced under license from Thinktronic Systems, LTD."} \ No newline at end of file + This technology produced under license from Thinktronic Systems, LTD."} diff --git a/code/modules/shieldgen/shield_capacitor.dm b/code/modules/shieldgen/shield_capacitor.dm index eb65e2f4f7..0e21db71e2 100644 --- a/code/modules/shieldgen/shield_capacitor.dm +++ b/code/modules/shieldgen/shield_capacitor.dm @@ -114,14 +114,14 @@ time_since_fail = 0 //losing charge faster than we can draw from PN last_stored_charge = stored_charge -/obj/machinery/shield_capacitor/tgui_act(action, params) +/obj/machinery/shield_capacitor/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE switch(action) if("toggle") if(!active && !anchored) - to_chat(usr, span_red("The [src] needs to be firmly secured to the floor first.")) + to_chat(ui.user, span_red("The [src] needs to be firmly secured to the floor first.")) return active = !active . = TRUE diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm index e3a4392a00..a4abe5a1d7 100644 --- a/code/modules/shieldgen/shield_gen.dm +++ b/code/modules/shieldgen/shield_gen.dm @@ -197,14 +197,14 @@ else average_field_strength = 0 -/obj/machinery/shield_gen/tgui_act(action, params) +/obj/machinery/shield_gen/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE switch(action) if("toggle") if (!active && !anchored) - to_chat(usr, span_red("The [src] needs to be firmly secured to the floor first.")) + to_chat(ui.user, span_red("The [src] needs to be firmly secured to the floor first.")) return toggle() . = TRUE diff --git a/code/modules/shieldgen/shield_generator.dm b/code/modules/shieldgen/shield_generator.dm index 86889ab3da..72af36fff6 100644 --- a/code/modules/shieldgen/shield_generator.dm +++ b/code/modules/shieldgen/shield_generator.dm @@ -458,8 +458,8 @@ if("begin_shutdown") if(running < SHIELD_RUNNING) // Discharging or off return - var/alert = tgui_alert(usr, "Are you sure you wish to do this? It will drain the power inside the internal storage rapidly.", "Are you sure?", list("Yes", "No")) - if(tgui_status(usr, state) != STATUS_INTERACTIVE) + var/alert = tgui_alert(ui.user, "Are you sure you wish to do this? It will drain the power inside the internal storage rapidly.", "Are you sure?", list("Yes", "No")) + if(tgui_status(ui.user, state) != STATUS_INTERACTIVE) return if(running < SHIELD_RUNNING) return @@ -485,7 +485,7 @@ if(!running) return TRUE - var/choice = tgui_alert(usr, "Are you sure that you want to initiate an emergency shield shutdown? This will instantly drop the shield, and may result in unstable release of stored electromagnetic energy. Proceed at your own risk.", "Confirmation", list("No", "Yes")) + var/choice = tgui_alert(ui.user, "Are you sure that you want to initiate an emergency shield shutdown? This will instantly drop the shield, and may result in unstable release of stored electromagnetic energy. Proceed at your own risk.", "Confirmation", list("No", "Yes")) if((choice != "Yes") || !running) return TRUE @@ -493,7 +493,7 @@ offline_for = round(current_energy / (SHIELD_SHUTDOWN_DISPERSION_RATE / 1.5)) var/old_energy = current_energy shutdown_field() - log_and_message_admins("has triggered \the [src]'s emergency shutdown!", usr) + log_and_message_admins("has triggered \the [src]'s emergency shutdown!", ui.user) spawn() empulse(src, old_energy / 60000000, old_energy / 32000000, 1) // If shields are charged at 450 MJ, the EMP will be 7.5, 14.0625. 90 MJ, 1.5, 2.8125 old_energy = 0 @@ -505,14 +505,14 @@ switch(action) if("set_range") - var/new_range = tgui_input_number(usr, "Enter new field range (1-[world.maxx]). Leave blank to cancel.", "Field Radius Control", field_radius, world.maxx, 1) + var/new_range = tgui_input_number(ui.user, "Enter new field range (1-[world.maxx]). Leave blank to cancel.", "Field Radius Control", field_radius, world.maxx, 1) if(!new_range) return TRUE target_radius = between(1, new_range, world.maxx) return TRUE if("set_input_cap") - var/new_cap = round(tgui_input_number(usr, "Enter new input cap (in kW). Enter 0 or nothing to disable input cap.", "Generator Power Control", round(input_cap / 1000))) + var/new_cap = round(tgui_input_number(ui.user, "Enter new input cap (in kW). Enter 0 or nothing to disable input cap.", "Generator Power Control", round(input_cap / 1000))) if(!new_cap) input_cap = 0 return diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 7e33f70272..e38354bb17 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -82,27 +82,27 @@ return FALSE return TRUE -/obj/machinery/computer/shuttle_control/tgui_act(action, list/params) +/obj/machinery/computer/shuttle_control/tgui_act(action, list/params, datum/tgui/ui) if(..()) return TRUE if(skip_act) return - add_fingerprint(usr) + add_fingerprint(ui.user) var/datum/shuttle/autodock/shuttle = SSshuttles.shuttles[shuttle_tag] if(!istype(shuttle)) - to_chat(usr, span_warning("Unable to establish link with the shuttle.")) + to_chat(ui.user, span_warning("Unable to establish link with the shuttle.")) return TRUE switch(action) if("move") - if(can_move(shuttle, usr)) + if(can_move(shuttle, ui.user)) shuttle.launch(src) return TRUE if("force") - if(can_move(shuttle, usr)) + if(can_move(shuttle, ui.user)) shuttle.force_launch(src) return TRUE @@ -111,7 +111,7 @@ return TRUE if("set_codes") - var/newcode = tgui_input_text(usr, "Input new docking codes", "Docking codes", shuttle.docking_codes, MAX_NAME_LEN) + var/newcode = tgui_input_text(ui.user, "Input new docking codes", "Docking codes", shuttle.docking_codes, MAX_NAME_LEN) newcode = sanitize(newcode,MAX_NAME_LEN) if(newcode && !..()) shuttle.set_docking_codes(uppertext(newcode)) diff --git a/code/modules/shuttles/shuttle_console_multi.dm b/code/modules/shuttles/shuttle_console_multi.dm index 76f32f450f..350fda94de 100644 --- a/code/modules/shuttles/shuttle_console_multi.dm +++ b/code/modules/shuttles/shuttle_console_multi.dm @@ -14,20 +14,20 @@ // "engines_charging" = ((shuttle.last_move + (shuttle.cooldown SECONDS)) > world.time), // Replaced by longer warmup_time ) -/obj/machinery/computer/shuttle_control/multi/tgui_act(action, list/params) +/obj/machinery/computer/shuttle_control/multi/tgui_act(action, list/params, datum/tgui/ui) if(..()) return TRUE var/datum/shuttle/autodock/multi/shuttle = SSshuttles.shuttles[shuttle_tag] if(!istype(shuttle)) - to_chat(usr, span_warning("Unable to establish link with the shuttle.")) + to_chat(ui.user, span_warning("Unable to establish link with the shuttle.")) return TRUE switch(action) if("pick") - var/dest_key = tgui_input_list(usr, "Choose shuttle destination", "Shuttle Destination", shuttle.get_destinations()) - if(dest_key && CanInteract(usr, GLOB.tgui_default_state)) - shuttle.set_destination(dest_key, usr) + var/dest_key = tgui_input_list(ui.user, "Choose shuttle destination", "Shuttle Destination", shuttle.get_destinations()) + if(dest_key && CanInteract(ui.user, GLOB.tgui_default_state)) + shuttle.set_destination(dest_key, ui.user) return TRUE if("toggle_cloaked") @@ -35,7 +35,7 @@ return TRUE shuttle.cloaked = !shuttle.cloaked if(shuttle.legit) - to_chat(usr, span_notice("Ship ATC inhibitor systems have been [(shuttle.cloaked ? "activated. The station will not" : "deactivated. The station will")] be notified of our arrival.")) + to_chat(ui.user, span_notice("Ship ATC inhibitor systems have been [(shuttle.cloaked ? "activated. The station will not" : "deactivated. The station will")] be notified of our arrival.")) else - to_chat(usr, span_warning("Ship stealth systems have been [(shuttle.cloaked ? "activated. The station will not" : "deactivated. The station will")] be warned of our arrival.")) + to_chat(ui.user, span_warning("Ship stealth systems have been [(shuttle.cloaked ? "activated. The station will not" : "deactivated. The station will")] be warned of our arrival.")) return TRUE diff --git a/code/modules/shuttles/shuttles_web.dm b/code/modules/shuttles/shuttles_web.dm index 55d9ba85af..79c79d82ad 100644 --- a/code/modules/shuttles/shuttles_web.dm +++ b/code/modules/shuttles/shuttles_web.dm @@ -290,7 +290,7 @@ return data -/obj/machinery/computer/shuttle_control/web/tgui_act(action, list/params) +/obj/machinery/computer/shuttle_control/web/tgui_act(action, list/params, datum/tgui/ui) if(..()) return TRUE @@ -300,22 +300,22 @@ return if(WS.moving_status != SHUTTLE_IDLE) - to_chat(usr, span_blue("[WS.visible_name] is busy moving.")) + to_chat(ui.user, span_blue("[WS.visible_name] is busy moving.")) return switch(action) if("rename_command") - WS.rename_shuttle(usr) + WS.rename_shuttle(ui.user) if("dock_command") if(WS.autopilot) - to_chat(usr, span_warning("The autopilot must be disabled before you can control the vessel manually.")) + to_chat(ui.user, span_warning("The autopilot must be disabled before you can control the vessel manually.")) return WS.dock() if("undock_command") if(WS.autopilot) - to_chat(usr, span_warning("The autopilot must be disabled before you can control the vessel manually.")) + to_chat(ui.user, span_warning("The autopilot must be disabled before you can control the vessel manually.")) return WS.undock() @@ -324,20 +324,20 @@ return WS.cloaked = !WS.cloaked if(WS.cloaked) - to_chat(usr, span_danger("Ship stealth systems have been activated. The station will not be warned of our arrival.")) + to_chat(ui.user, span_danger("Ship stealth systems have been activated. The station will not be warned of our arrival.")) else - to_chat(usr, span_danger("Ship stealth systems have been deactivated. The station will be warned of our arrival.")) + to_chat(ui.user, span_danger("Ship stealth systems have been deactivated. The station will be warned of our arrival.")) if("toggle_autopilot") WS.adjust_autopilot(!WS.autopilot) if("traverse") if(WS.autopilot) - to_chat(usr, span_warning("The autopilot must be disabled before you can control the vessel manually.")) + to_chat(ui.user, span_warning("The autopilot must be disabled before you can control the vessel manually.")) return if((WS.last_move + WS.cooldown) > world.time) - to_chat(usr, span_red("The ship's drive is inoperable while the engines are charging.")) + to_chat(ui.user, span_red("The ship's drive is inoperable while the engines are charging.")) return var/index = text2num(params["traverse"]) @@ -346,7 +346,7 @@ message_admins("ERROR: Shuttle computer was asked to traverse a nonexistant route.") return - if(!check_docking(WS)) + if(!check_docking(, ui.user, WS)) return TRUE var/datum/shuttle_destination/target_destination = new_route.get_other_side(WS.web_master.current_destination) @@ -355,11 +355,11 @@ return WS.next_location = target_destination.my_landmark - if(!can_move(WS, usr)) + if(!can_move(WS, ui.user)) return WS.web_master.future_destination = target_destination - to_chat(usr, span_notice("[WS.visible_name] flight computer received command.")) + to_chat(ui.user, span_notice("[WS.visible_name] flight computer received command.")) WS.web_master.reset_autopath() // Deviating from the path will almost certainly confuse the autopilot, so lets just reset its memory. var/travel_time = new_route.travel_time * WS.flight_time_modifier @@ -370,15 +370,15 @@ WS.short_jump(target_destination.my_landmark) //check if we're undocked, give option to force launch -/obj/machinery/computer/shuttle_control/web/proc/check_docking(datum/shuttle/autodock/MS) +/obj/machinery/computer/shuttle_control/web/proc/check_docking(mob/user, datum/shuttle/autodock/MS) if(MS.skip_docking_checks() || MS.check_undocked()) return 1 - var/choice = tgui_alert(usr, "The shuttle is currently docked! Please undock before continuing.","Error",list("Cancel","Force Launch")) + var/choice = tgui_alert(user, "The shuttle is currently docked! Please undock before continuing.","Error",list("Cancel","Force Launch")) if(!choice || choice == "Cancel") return 0 - choice = tgui_alert(usr, "Forcing a shuttle launch while docked may result in severe injury, death and/or damage to property. Are you sure you wish to continue?", "Force Launch", list("Force Launch", "Cancel")) + choice = tgui_alert(user, "Forcing a shuttle launch while docked may result in severe injury, death and/or damage to property. Are you sure you wish to continue?", "Force Launch", list("Force Launch", "Cancel")) if(choice || choice == "Cancel") return 0 diff --git a/code/modules/stockmarket/computer.dm b/code/modules/stockmarket/computer.dm index 6cdb2df041..ae2e37b46a 100644 --- a/code/modules/stockmarket/computer.dm +++ b/code/modules/stockmarket/computer.dm @@ -49,7 +49,7 @@ if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if ("logout") @@ -58,12 +58,12 @@ if("stocks_buy") var/datum/stock/S = locate(params["share"]) in GLOB.stockExchange.stocks if (S) - buy_some_shares(S, usr) + buy_some_shares(S, ui.user) if("stocks_sell") var/datum/stock/S = locate(params["share"]) in GLOB.stockExchange.stocks if (S) - sell_some_shares(S, usr) + sell_some_shares(S, ui.user) if("stocks_check") screen = "logs" @@ -82,7 +82,7 @@ if (S) //current_stock = S //screen = "graph" - S.displayValues(usr) + S.displayValues(ui.user) if("stocks_backbutton") current_stock = null diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 455c9e817a..e966c6e1b6 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -160,11 +160,11 @@ if("send") sending = 1 - teleport(usr) + teleport(ui.user) if("receive") sending = 0 - teleport(usr) + teleport(ui.user) if("recal") recalibrate() diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm index 93c5fe8129..42c8241292 100644 --- a/code/modules/tgui/external.dm +++ b/code/modules/tgui/external.dm @@ -90,7 +90,7 @@ */ /datum/proc/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) SHOULD_CALL_PARENT(TRUE) - SEND_SIGNAL(src, COMSIG_UI_ACT, usr, action) + SEND_SIGNAL(src, COMSIG_UI_ACT, ui.user, action) // If UI is not interactive or usr calling Topic is not the UI user, bail. if(!ui || ui.status != STATUS_INTERACTIVE) return TRUE diff --git a/code/modules/tgui/modules/_base.dm b/code/modules/tgui/modules/_base.dm index 43e532b15b..d5e754412d 100644 --- a/code/modules/tgui/modules/_base.dm +++ b/code/modules/tgui/modules/_base.dm @@ -68,7 +68,7 @@ Code is pretty much ripped verbatim from nano modules, but with un-needed stuff if(istype(host)) . += host.get_header_data() -/datum/tgui_module/tgui_act(action, params) +/datum/tgui_module/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -81,7 +81,7 @@ Code is pretty much ripped verbatim from nano modules, but with un-needed stuff host.shutdown_computer() return TRUE if(action == "PC_minimize") - host.minimize_program(usr) + host.minimize_program(ui.user) return TRUE // Just a nice little default interact in case the subtypes don't need any special behavior here diff --git a/code/modules/tgui/modules/admin/player_notes.dm b/code/modules/tgui/modules/admin/player_notes.dm index 2b1d8be8d6..f198f00d44 100644 --- a/code/modules/tgui/modules/admin/player_notes.dm +++ b/code/modules/tgui/modules/admin/player_notes.dm @@ -68,10 +68,10 @@ if("show_player_info") var/datum/tgui_module/player_notes_info/A = new(src) A.key = params["name"] - A.tgui_interact(usr) + A.tgui_interact(ui.user) if("filter_player_notes") - var/input = tgui_input_text(usr, "Filter string (case-insensitive regex)", "Player notes filter") + var/input = tgui_input_text(ui.user, "Filter string (case-insensitive regex)", "Player notes filter") current_filter = input if("set_page") @@ -123,10 +123,10 @@ switch(action) if("add_player_info") var/key = params["ckey"] - var/add = tgui_input_text(usr, "Write your comment below.", "Add Player Info", multiline = TRUE, prevent_enter = TRUE) + var/add = tgui_input_text(ui.user, "Write your comment below.", "Add Player Info", multiline = TRUE, prevent_enter = TRUE) if(!add) return - notes_add(key,add,usr) + notes_add(key,add,ui.user) if("remove_player_info") var/key = params["ckey"] diff --git a/code/modules/tgui/modules/admin_shuttle_controller.dm b/code/modules/tgui/modules/admin_shuttle_controller.dm index 6be6d05fd0..4a59998698 100644 --- a/code/modules/tgui/modules/admin_shuttle_controller.dm +++ b/code/modules/tgui/modules/admin_shuttle_controller.dm @@ -39,15 +39,15 @@ if("adminobserve") var/datum/shuttle/S = locate(params["ref"]) if(istype(S)) - var/client/C = usr.client - if(!isobserver(usr)) + var/client/C = ui.user.client + if(!isobserver(ui.user)) C.admin_ghost() spawn(2) C.jumptoturf(get_turf(S.current_location)) else if(istype(S, /obj/effect/overmap/visitable)) var/obj/effect/overmap/visitable/V = S - var/client/C = usr.client - if(!isobserver(usr)) + var/client/C = ui.user.client + if(!isobserver(ui.user)) C.admin_ghost() spawn(2) var/atom/target @@ -68,34 +68,34 @@ var/datum/shuttle/S = locate(params["ref"]) if(istype(S, /datum/shuttle/autodock/multi)) var/datum/shuttle/autodock/multi/shuttle = S - var/dest_key = tgui_input_list(usr, "Choose shuttle destination", "Shuttle Destination", shuttle.get_destinations()) + var/dest_key = tgui_input_list(ui.user, "Choose shuttle destination", "Shuttle Destination", shuttle.get_destinations()) if(dest_key) - shuttle.set_destination(dest_key, usr) + shuttle.set_destination(dest_key, ui.user) shuttle.launch(src) else if(istype(S, /datum/shuttle/autodock/overmap)) var/datum/shuttle/autodock/overmap/shuttle = S var/list/possible_d = shuttle.get_possible_destinations() var/D if(!LAZYLEN(possible_d)) - to_chat(usr, span_warning("There are no possible destinations for [shuttle] ([shuttle.type])")) + to_chat(ui.user, span_warning("There are no possible destinations for [shuttle] ([shuttle.type])")) return FALSE - D = tgui_input_list(usr, "Choose shuttle destination", "Shuttle Destination", possible_d) + D = tgui_input_list(ui.user, "Choose shuttle destination", "Shuttle Destination", possible_d) if(D) shuttle.set_destination(possible_d[D]) shuttle.launch() else if(istype(S, /datum/shuttle/autodock)) var/datum/shuttle/autodock/shuttle = S - if(tgui_alert(usr, "Are you sure you want to launch [shuttle]?", "Launching Shuttle", list("Yes", "No")) == "Yes") + if(tgui_alert(ui.user, "Are you sure you want to launch [shuttle]?", "Launching Shuttle", list("Yes", "No")) == "Yes") shuttle.launch(src) else - to_chat(usr, span_notice("The shuttle control panel isn't quite sure how to move [S] ([S?.type]).")) + to_chat(ui.user, span_notice("The shuttle control panel isn't quite sure how to move [S] ([S?.type]).")) return FALSE - to_chat(usr, span_notice("Launching shuttle [S].")) + to_chat(ui.user, span_notice("Launching shuttle [S].")) return TRUE if("overmap_control") var/obj/effect/overmap/visitable/ship/V = locate(params["ref"]) if(istype(V)) var/datum/tgui_module/ship/fullmonty/F = new(src, V) - F.tgui_interact(usr, null, ui) + F.tgui_interact(ui.user, null, ui) return TRUE diff --git a/code/modules/tgui/modules/agentcard.dm b/code/modules/tgui/modules/agentcard.dm index 99f438416e..80db43a4ef 100644 --- a/code/modules/tgui/modules/agentcard.dm +++ b/code/modules/tgui/modules/agentcard.dm @@ -43,91 +43,91 @@ switch(action) if("electronic_warfare") S.electronic_warfare = !S.electronic_warfare - to_chat(usr, span_notice("Electronic warfare [S.electronic_warfare ? "enabled" : "disabled"].")) + to_chat(ui.user, span_notice("Electronic warfare [S.electronic_warfare ? "enabled" : "disabled"].")) . = TRUE if("age") - var/new_age = tgui_input_number(usr,"What age would you like to put on this card?","Agent Card Age", S.age) - if(!isnull(new_age) && tgui_status(usr, state) == STATUS_INTERACTIVE) + var/new_age = tgui_input_number(ui.user,"What age would you like to put on this card?","Agent Card Age", S.age) + if(!isnull(new_age) && tgui_status(ui.user, state) == STATUS_INTERACTIVE) if(new_age < 0) S.age = initial(S.age) else S.age = new_age - to_chat(usr, span_notice("Age has been set to '[S.age]'.")) + to_chat(ui.user, span_notice("Age has been set to '[S.age]'.")) . = TRUE if("appearance") - var/datum/card_state/choice = tgui_input_list(usr, "Select the appearance for this card.", "Agent Card Appearance", id_card_states()) - if(choice && tgui_status(usr, state) == STATUS_INTERACTIVE) + var/datum/card_state/choice = tgui_input_list(ui.user, "Select the appearance for this card.", "Agent Card Appearance", id_card_states()) + if(choice && tgui_status(ui.user, state) == STATUS_INTERACTIVE) S.icon_state = choice.icon_state S.item_state = choice.item_state S.sprite_stack = choice.sprite_stack S.update_icon() - to_chat(usr, span_notice("Appearance changed to [choice].")) + to_chat(ui.user, span_notice("Appearance changed to [choice].")) . = TRUE if("assignment") - var/new_job = sanitize(tgui_input_text(usr,"What assignment would you like to put on this card?\nChanging assignment will not grant or remove any access levels.","Agent Card Assignment", S.assignment)) - if(!isnull(new_job) && tgui_status(usr, state) == STATUS_INTERACTIVE) + var/new_job = sanitize(tgui_input_text(ui.user,"What assignment would you like to put on this card?\nChanging assignment will not grant or remove any access levels.","Agent Card Assignment", S.assignment)) + if(!isnull(new_job) && tgui_status(ui.user, state) == STATUS_INTERACTIVE) S.assignment = new_job - to_chat(usr, span_notice("Occupation changed to '[new_job]'.")) + to_chat(ui.user, span_notice("Occupation changed to '[new_job]'.")) S.update_name() . = TRUE if("bloodtype") var/default = S.blood_type - if(default == initial(S.blood_type) && ishuman(usr)) - var/mob/living/carbon/human/H = usr + if(default == initial(S.blood_type) && ishuman(ui.user)) + var/mob/living/carbon/human/H = ui.user if(H.dna) default = H.dna.b_type - var/new_blood_type = sanitize(tgui_input_text(usr,"What blood type would you like to be written on this card?","Agent Card Blood Type",default)) - if(!isnull(new_blood_type) && tgui_status(usr, state) == STATUS_INTERACTIVE) + var/new_blood_type = sanitize(tgui_input_text(ui.user,"What blood type would you like to be written on this card?","Agent Card Blood Type",default)) + if(!isnull(new_blood_type) && tgui_status(ui.user, state) == STATUS_INTERACTIVE) S.blood_type = new_blood_type - to_chat(usr, span_notice("Blood type changed to '[new_blood_type]'.")) + to_chat(ui.user, span_notice("Blood type changed to '[new_blood_type]'.")) . = TRUE if("dnahash") var/default = S.dna_hash - if(default == initial(S.dna_hash) && ishuman(usr)) - var/mob/living/carbon/human/H = usr + if(default == initial(S.dna_hash) && ishuman(ui.user)) + var/mob/living/carbon/human/H = ui.user if(H.dna) default = H.dna.unique_enzymes - var/new_dna_hash = sanitize(tgui_input_text(usr,"What DNA hash would you like to be written on this card?","Agent Card DNA Hash",default)) - if(!isnull(new_dna_hash) && tgui_status(usr, state) == STATUS_INTERACTIVE) + var/new_dna_hash = sanitize(tgui_input_text(ui.user,"What DNA hash would you like to be written on this card?","Agent Card DNA Hash",default)) + if(!isnull(new_dna_hash) && tgui_status(ui.user, state) == STATUS_INTERACTIVE) S.dna_hash = new_dna_hash - to_chat(usr, span_notice("DNA hash changed to '[new_dna_hash]'.")) + to_chat(ui.user, span_notice("DNA hash changed to '[new_dna_hash]'.")) . = TRUE if("fingerprinthash") var/default = S.fingerprint_hash - if(default == initial(S.fingerprint_hash) && ishuman(usr)) - var/mob/living/carbon/human/H = usr + if(default == initial(S.fingerprint_hash) && ishuman(ui.user)) + var/mob/living/carbon/human/H = ui.user if(H.dna) default = md5(H.dna.uni_identity) - var/new_fingerprint_hash = sanitize(tgui_input_text(usr,"What fingerprint hash would you like to be written on this card?","Agent Card Fingerprint Hash",default)) - if(!isnull(new_fingerprint_hash) && tgui_status(usr, state) == STATUS_INTERACTIVE) + var/new_fingerprint_hash = sanitize(tgui_input_text(ui.user,"What fingerprint hash would you like to be written on this card?","Agent Card Fingerprint Hash",default)) + if(!isnull(new_fingerprint_hash) && tgui_status(ui.user, state) == STATUS_INTERACTIVE) S.fingerprint_hash = new_fingerprint_hash - to_chat(usr, span_notice("Fingerprint hash changed to '[new_fingerprint_hash]'.")) + to_chat(ui.user, span_notice("Fingerprint hash changed to '[new_fingerprint_hash]'.")) . = TRUE if("name") - var/new_name = sanitizeName(tgui_input_text(usr,"What name would you like to put on this card?","Agent Card Name", S.registered_name)) - if(!isnull(new_name) && tgui_status(usr, state) == STATUS_INTERACTIVE) + var/new_name = sanitizeName(tgui_input_text(ui.user,"What name would you like to put on this card?","Agent Card Name", S.registered_name)) + if(!isnull(new_name) && tgui_status(ui.user, state) == STATUS_INTERACTIVE) S.registered_name = new_name S.update_name() - to_chat(usr, span_notice("Name changed to '[new_name]'.")) + to_chat(ui.user, span_notice("Name changed to '[new_name]'.")) . = TRUE if("photo") - S.set_id_photo(usr) - to_chat(usr, span_notice("Photo changed.")) + S.set_id_photo(ui.user) + to_chat(ui.user, span_notice("Photo changed.")) . = TRUE if("sex") - var/new_sex = sanitize(tgui_input_text(usr,"What sex would you like to put on this card?","Agent Card Sex", S.sex)) - if(!isnull(new_sex) && tgui_status(usr, state) == STATUS_INTERACTIVE) + var/new_sex = sanitize(tgui_input_text(ui.user,"What sex would you like to put on this card?","Agent Card Sex", S.sex)) + if(!isnull(new_sex) && tgui_status(ui.user, state) == STATUS_INTERACTIVE) S.sex = new_sex - to_chat(usr, span_notice("Sex changed to '[new_sex]'.")) + to_chat(ui.user, span_notice("Sex changed to '[new_sex]'.")) . = TRUE if("species") - var/new_species = sanitize(tgui_input_text(usr,"What species would you like to put on this card?","Agent Card Species", S.species)) - if(!isnull(new_species) && tgui_status(usr, state) == STATUS_INTERACTIVE) + var/new_species = sanitize(tgui_input_text(ui.user,"What species would you like to put on this card?","Agent Card Species", S.species)) + if(!isnull(new_species) && tgui_status(ui.user, state) == STATUS_INTERACTIVE) S.species = new_species - to_chat(usr, span_notice("Species changed to '[new_species]'.")) + to_chat(ui.user, span_notice("Species changed to '[new_species]'.")) . = TRUE if("factoryreset") - if(tgui_alert(usr, "This will factory reset the card, including access and owner. Continue?", "Factory Reset", list("No", "Yes")) == "Yes" && tgui_status(usr, state) == STATUS_INTERACTIVE) + if(tgui_alert(ui.user, "This will factory reset the card, including access and owner. Continue?", "Factory Reset", list("No", "Yes")) == "Yes" && tgui_status(ui.user, state) == STATUS_INTERACTIVE) S.age = initial(S.age) S.access = syndicate_access.Copy() S.assignment = initial(S.assignment) @@ -145,5 +145,5 @@ S.sex = initial(S.sex) S.species = initial(S.species) S.update_icon() - to_chat(usr, span_notice("All information has been deleted from \the [src].")) + to_chat(ui.user, span_notice("All information has been deleted from \the [src].")) . = TRUE diff --git a/code/modules/tgui/modules/alarm.dm b/code/modules/tgui/modules/alarm.dm index b9de22c7e6..9e1615c453 100644 --- a/code/modules/tgui/modules/alarm.dm +++ b/code/modules/tgui/modules/alarm.dm @@ -96,13 +96,13 @@ return all_alarms -/datum/tgui_module/alarm_monitor/tgui_act(action, params) +/datum/tgui_module/alarm_monitor/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE - + // Camera stuff is AI only. // If you're not an AI, this is a read-only UI. - if(!isAI(usr)) + if(!isAI(ui.user)) return switch(action) @@ -111,7 +111,7 @@ if(!C) return - usr.switch_to_camera(C) + ui.user.switch_to_camera(C) return 1 /datum/tgui_module/alarm_monitor/tgui_data(mob/user) diff --git a/code/modules/tgui/modules/appearance_changer.dm b/code/modules/tgui/modules/appearance_changer.dm index eee72f9b38..3a07f583e4 100644 --- a/code/modules/tgui/modules/appearance_changer.dm +++ b/code/modules/tgui/modules/appearance_changer.dm @@ -88,99 +88,99 @@ var/mob/living/carbon/human/target = owner if(customize_usr) - if(!ishuman(usr)) + if(!ishuman(ui.user)) return TRUE - target = usr + target = ui.user switch(action) if("race") - if(can_change(APPEARANCE_RACE) && (params["race"] in valid_species)) + if(can_change(target, APPEARANCE_RACE) && (params["race"] in valid_species)) if(target.change_species(params["race"])) if(params["race"] == "Custom Species") - target.custom_species = sanitize(tgui_input_text(usr, "Input custom species name:", + target.custom_species = sanitize(tgui_input_text(target, "Input custom species name:", "Custom Species Name", null, MAX_NAME_LEN), MAX_NAME_LEN) cut_data() - generate_data(usr) + generate_data(target) changed_hook(APPEARANCECHANGER_CHANGED_RACE) return 1 if("gender") - if(can_change(APPEARANCE_GENDER) && (params["gender"] in get_genders())) + if(can_change(target, APPEARANCE_GENDER) && (params["gender"] in get_genders(target))) if(target.change_gender(params["gender"])) cut_data() - generate_data(usr) + generate_data(target) changed_hook(APPEARANCECHANGER_CHANGED_GENDER) return 1 if("gender_id") - if(can_change(APPEARANCE_GENDER) && (params["gender_id"] in all_genders_define_list)) + if(can_change(target, APPEARANCE_GENDER) && (params["gender_id"] in all_genders_define_list)) target.identifying_gender = params["gender_id"] changed_hook(APPEARANCECHANGER_CHANGED_GENDER_ID) return 1 if("skin_tone") - if(can_change_skin_tone()) - var/new_s_tone = tgui_input_number(usr, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Skin Tone", -target.s_tone + 35, 220, 1) - if(isnum(new_s_tone) && can_still_topic(usr, state)) + if(can_change_skin_tone(target)) + var/new_s_tone = tgui_input_number(target, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Skin Tone", -target.s_tone + 35, 220, 1) + if(isnum(new_s_tone) && can_still_topic(target, state)) new_s_tone = 35 - max(min( round(new_s_tone), 220),1) changed_hook(APPEARANCECHANGER_CHANGED_SKINTONE) return target.change_skin_tone(new_s_tone) if("skin_color") - if(can_change_skin_color()) - var/new_skin = input(usr, "Choose your character's skin colour: ", "Skin Color", rgb(target.r_skin, target.g_skin, target.b_skin)) as color|null - if(new_skin && can_still_topic(usr, state)) + if(can_change_skin_color(target)) + var/new_skin = input(target, "Choose your character's skin colour: ", "Skin Color", rgb(target.r_skin, target.g_skin, target.b_skin)) as color|null + if(new_skin && can_still_topic(target, state)) var/r_skin = hex2num(copytext(new_skin, 2, 4)) var/g_skin = hex2num(copytext(new_skin, 4, 6)) var/b_skin = hex2num(copytext(new_skin, 6, 8)) if(target.change_skin_color(r_skin, g_skin, b_skin)) - update_dna() + update_dna(target) changed_hook(APPEARANCECHANGER_CHANGED_SKINCOLOR) return 1 if("hair") - if(can_change(APPEARANCE_HAIR) && (params["hair"] in valid_hairstyles)) + if(can_change(target, APPEARANCE_HAIR) && (params["hair"] in valid_hairstyles)) if(target.change_hair(params["hair"])) - update_dna() + update_dna(target) changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE) return 1 if("hair_color") - if(can_change(APPEARANCE_HAIR_COLOR)) - var/new_hair = input(usr, "Please select hair color.", "Hair Color", rgb(target.r_hair, target.g_hair, target.b_hair)) as color|null - if(new_hair && can_still_topic(usr, state)) + if(can_change(target, APPEARANCE_HAIR_COLOR)) + var/new_hair = input(target, "Please select hair color.", "Hair Color", rgb(target.r_hair, target.g_hair, target.b_hair)) as color|null + if(new_hair && can_still_topic(target, state)) var/r_hair = hex2num(copytext(new_hair, 2, 4)) var/g_hair = hex2num(copytext(new_hair, 4, 6)) var/b_hair = hex2num(copytext(new_hair, 6, 8)) if(target.change_hair_color(r_hair, g_hair, b_hair)) - update_dna() + update_dna(target) changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) return 1 if("facial_hair") - if(can_change(APPEARANCE_FACIAL_HAIR) && (params["facial_hair"] in valid_facial_hairstyles)) + if(can_change(target, APPEARANCE_FACIAL_HAIR) && (params["facial_hair"] in valid_facial_hairstyles)) if(target.change_facial_hair(params["facial_hair"])) - update_dna() + update_dna(target) changed_hook(APPEARANCECHANGER_CHANGED_F_HAIRSTYLE) return 1 if("facial_hair_color") - if(can_change(APPEARANCE_FACIAL_HAIR_COLOR)) - var/new_facial = input(usr, "Please select facial hair color.", "Facial Hair Color", rgb(target.r_facial, target.g_facial, target.b_facial)) as color|null - if(new_facial && can_still_topic(usr, state)) + if(can_change(target, APPEARANCE_FACIAL_HAIR_COLOR)) + var/new_facial = input(target, "Please select facial hair color.", "Facial Hair Color", rgb(target.r_facial, target.g_facial, target.b_facial)) as color|null + if(new_facial && can_still_topic(target, state)) var/r_facial = hex2num(copytext(new_facial, 2, 4)) var/g_facial = hex2num(copytext(new_facial, 4, 6)) var/b_facial = hex2num(copytext(new_facial, 6, 8)) if(target.change_facial_hair_color(r_facial, g_facial, b_facial)) - update_dna() + update_dna(target) changed_hook(APPEARANCECHANGER_CHANGED_F_HAIRCOLOR) return 1 if("eye_color") - if(can_change(APPEARANCE_EYE_COLOR)) - var/new_eyes = input(usr, "Please select eye color.", "Eye Color", rgb(target.r_eyes, target.g_eyes, target.b_eyes)) as color|null - if(new_eyes && can_still_topic(usr, state)) + if(can_change(target, APPEARANCE_EYE_COLOR)) + var/new_eyes = input(target, "Please select eye color.", "Eye Color", rgb(target.r_eyes, target.g_eyes, target.b_eyes)) as color|null + if(new_eyes && can_still_topic(target, state)) var/r_eyes = hex2num(copytext(new_eyes, 2, 4)) var/g_eyes = hex2num(copytext(new_eyes, 4, 6)) var/b_eyes = hex2num(copytext(new_eyes, 6, 8)) if(target.change_eye_color(r_eyes, g_eyes, b_eyes)) - update_dna() + update_dna(target) changed_hook(APPEARANCECHANGER_CHANGED_EYES) return 1 // VOREStation Add - Ears/Tails/Wings/Markings if("ear") - if(can_change(APPEARANCE_ALL_HAIR)) + if(can_change(target, APPEARANCE_ALL_HAIR)) var/datum/sprite_accessory/ears/instance = locate(params["ref"]) if(params["clear"]) instance = null @@ -188,11 +188,11 @@ return FALSE target.ear_style = instance target.update_hair() - update_dna() + update_dna(target) changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE) return TRUE if("ear_secondary") - if(can_change(APPEARANCE_ALL_HAIR)) + if(can_change(target, APPEARANCE_ALL_HAIR)) var/datum/sprite_accessory/ears/instance = locate(params["ref"]) if(params["clear"]) instance = null @@ -204,46 +204,46 @@ if(length(target.ear_secondary_colors) < instance.get_color_channel_count()) target.ear_secondary_colors.len = instance.get_color_channel_count() target.update_hair() - update_dna() + update_dna(target) changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE) return TRUE if("ears_color") - if(can_change(APPEARANCE_HAIR_COLOR)) - var/new_hair = input(usr, "Please select ear color.", "Ear Color", rgb(target.r_ears, target.g_ears, target.b_ears)) as color|null - if(new_hair && can_still_topic(usr, state)) + if(can_change(target, APPEARANCE_HAIR_COLOR)) + var/new_hair = input(target, "Please select ear color.", "Ear Color", rgb(target.r_ears, target.g_ears, target.b_ears)) as color|null + if(new_hair && can_still_topic(target, state)) target.r_ears = hex2num(copytext(new_hair, 2, 4)) target.g_ears = hex2num(copytext(new_hair, 4, 6)) target.b_ears = hex2num(copytext(new_hair, 6, 8)) - update_dna() + update_dna(target) target.update_hair() changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) return 1 if("ears2_color") - if(can_change(APPEARANCE_HAIR_COLOR)) - var/new_hair = input(usr, "Please select secondary ear color.", "2nd Ear Color", rgb(target.r_ears2, target.g_ears2, target.b_ears2)) as color|null - if(new_hair && can_still_topic(usr, state)) + if(can_change(target, APPEARANCE_HAIR_COLOR)) + var/new_hair = input(target, "Please select secondary ear color.", "2nd Ear Color", rgb(target.r_ears2, target.g_ears2, target.b_ears2)) as color|null + if(new_hair && can_still_topic(target, state)) target.r_ears2 = hex2num(copytext(new_hair, 2, 4)) target.g_ears2 = hex2num(copytext(new_hair, 4, 6)) target.b_ears2 = hex2num(copytext(new_hair, 6, 8)) - update_dna() + update_dna(target) target.update_hair() changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) return 1 if("ears_secondary_color") - if(can_change(APPEARANCE_HAIR_COLOR)) + if(can_change(target, APPEARANCE_HAIR_COLOR)) var/channel = params["channel"] if(channel > length(target.ear_secondary_colors)) return TRUE var/existing = LAZYACCESS(target.ear_secondary_colors, channel) || "#ffffff" - var/new_color = input(usr, "Please select ear color.", "2nd Ear Color", existing) as color|null - if(new_color && can_still_topic(usr, state)) + var/new_color = input(target, "Please select ear color.", "2nd Ear Color", existing) as color|null + if(new_color && can_still_topic(target, state)) target.ear_secondary_colors[channel] = new_color - update_dna() + update_dna(target) target.update_hair() changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) return TRUE if("tail") - if(can_change(APPEARANCE_ALL_HAIR)) + if(can_change(target, APPEARANCE_ALL_HAIR)) var/datum/sprite_accessory/tail/instance = locate(params["ref"]) if(params["clear"]) instance = null @@ -251,33 +251,33 @@ return FALSE target.tail_style = instance target.update_tail_showing() - update_dna() + update_dna(target) changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE) return TRUE if("tail_color") - if(can_change(APPEARANCE_HAIR_COLOR)) - var/new_hair = input(usr, "Please select tail color.", "Tail Color", rgb(target.r_tail, target.g_tail, target.b_tail)) as color|null - if(new_hair && can_still_topic(usr, state)) + if(can_change(target, APPEARANCE_HAIR_COLOR)) + var/new_hair = input(target, "Please select tail color.", "Tail Color", rgb(target.r_tail, target.g_tail, target.b_tail)) as color|null + if(new_hair && can_still_topic(target, state)) target.r_tail = hex2num(copytext(new_hair, 2, 4)) target.g_tail = hex2num(copytext(new_hair, 4, 6)) target.b_tail = hex2num(copytext(new_hair, 6, 8)) - update_dna() + update_dna(target) target.update_tail_showing() changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) return 1 if("tail2_color") - if(can_change(APPEARANCE_HAIR_COLOR)) - var/new_hair = input(usr, "Please select secondary tail color.", "2nd Tail Color", rgb(target.r_tail2, target.g_tail2, target.b_tail2)) as color|null - if(new_hair && can_still_topic(usr, state)) + if(can_change(target, APPEARANCE_HAIR_COLOR)) + var/new_hair = input(target, "Please select secondary tail color.", "2nd Tail Color", rgb(target.r_tail2, target.g_tail2, target.b_tail2)) as color|null + if(new_hair && can_still_topic(target, state)) target.r_tail2 = hex2num(copytext(new_hair, 2, 4)) target.g_tail2 = hex2num(copytext(new_hair, 4, 6)) target.b_tail2 = hex2num(copytext(new_hair, 6, 8)) - update_dna() + update_dna(target) target.update_tail_showing() changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) return 1 if("wing") - if(can_change(APPEARANCE_ALL_HAIR)) + if(can_change(target, APPEARANCE_ALL_HAIR)) var/datum/sprite_accessory/wing/instance = locate(params["ref"]) if(params["clear"]) instance = null @@ -285,33 +285,33 @@ return FALSE target.wing_style = instance target.update_wing_showing() - update_dna() + update_dna(target) changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE) return TRUE if("wing_color") - if(can_change(APPEARANCE_HAIR_COLOR)) - var/new_hair = input(usr, "Please select wing color.", "Wing Color", rgb(target.r_wing, target.g_wing, target.b_wing)) as color|null - if(new_hair && can_still_topic(usr, state)) + if(can_change(target, APPEARANCE_HAIR_COLOR)) + var/new_hair = input(target, "Please select wing color.", "Wing Color", rgb(target.r_wing, target.g_wing, target.b_wing)) as color|null + if(new_hair && can_still_topic(target, state)) target.r_wing = hex2num(copytext(new_hair, 2, 4)) target.g_wing = hex2num(copytext(new_hair, 4, 6)) target.b_wing = hex2num(copytext(new_hair, 6, 8)) - update_dna() + update_dna(target) target.update_wing_showing() changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) return 1 if("wing2_color") - if(can_change(APPEARANCE_HAIR_COLOR)) - var/new_hair = input(usr, "Please select secondary wing color.", "2nd Wing Color", rgb(target.r_wing2, target.g_wing2, target.b_wing2)) as color|null - if(new_hair && can_still_topic(usr, state)) + if(can_change(target, APPEARANCE_HAIR_COLOR)) + var/new_hair = input(target, "Please select secondary wing color.", "2nd Wing Color", rgb(target.r_wing2, target.g_wing2, target.b_wing2)) as color|null + if(new_hair && can_still_topic(target, state)) target.r_wing2 = hex2num(copytext(new_hair, 2, 4)) target.g_wing2 = hex2num(copytext(new_hair, 4, 6)) target.b_wing2 = hex2num(copytext(new_hair, 6, 8)) - update_dna() + update_dna(target) target.update_wing_showing() changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) return 1 if("marking") - if(can_change(APPEARANCE_ALL_HAIR)) + if(can_change(target, APPEARANCE_ALL_HAIR)) var/todo = params["todo"] var/name_marking = params["name"] switch (todo) @@ -323,8 +323,8 @@ return TRUE if (1) //add var/list/usable_markings = markings.Copy() ^ body_marking_styles_list.Copy() - var/new_marking = tgui_input_list(usr, "Choose a body marking:", "New Body Marking", usable_markings) - if(new_marking && can_still_topic(usr, state)) + var/new_marking = tgui_input_list(target, "Choose a body marking:", "New Body Marking", usable_markings) + if(new_marking && can_still_topic(target, state)) var/datum/sprite_accessory/marking/mark_datum = body_marking_styles_list[new_marking] if (target.add_marking(mark_datum)) changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE) @@ -339,8 +339,8 @@ return TRUE if (4) //color var/current = markings[name_marking] ? markings[name_marking] : "#000000" - var/marking_color = input(usr, "Please select marking color", "Marking color", current) as color|null - if(marking_color && can_still_topic(usr, state)) + var/marking_color = input(target, "Please select marking color", "Marking color", current) as color|null + if(marking_color && can_still_topic(target, state)) var/datum/sprite_accessory/marking/mark_datum = body_marking_styles_list[name_marking] if (target.change_marking_color(mark_datum, marking_color)) return TRUE @@ -374,15 +374,15 @@ /datum/tgui_module/appearance_changer/tgui_static_data(mob/user) var/list/data = ..() - generate_data(usr) + generate_data(user) - if(can_change(APPEARANCE_RACE)) + if(can_change(user, APPEARANCE_RACE)) var/species[0] for(var/specimen in valid_species) species[++species.len] = list("specimen" = specimen) data["species"] = species - if(can_change(APPEARANCE_HAIR)) + if(can_change(user, APPEARANCE_HAIR)) var/hair_styles[0] for(var/hair_style in valid_hairstyles) hair_styles[++hair_styles.len] = list("hairstyle" = hair_style) @@ -393,7 +393,7 @@ data["wing_styles"] = valid_wingstyles // VOREStation Add End - if(can_change(APPEARANCE_FACIAL_HAIR)) + if(can_change(user, APPEARANCE_FACIAL_HAIR)) var/facial_hair_styles[0] for(var/facial_hair_style in valid_facial_hairstyles) facial_hair_styles[++facial_hair_styles.len] = list("facialhairstyle" = facial_hair_style) @@ -408,20 +408,20 @@ var/mob/living/carbon/human/target = owner if(customize_usr) - if(!ishuman(usr)) + if(!ishuman(ui.user)) return TRUE - target = usr + target = ui.user data["name"] = target.name data["specimen"] = target.species.name data["gender"] = target.gender data["gender_id"] = target.identifying_gender - data["change_race"] = can_change(APPEARANCE_RACE) + data["change_race"] = can_change(target, APPEARANCE_RACE) - data["change_gender"] = can_change(APPEARANCE_GENDER) + data["change_gender"] = can_change(target, APPEARANCE_GENDER) if(data["change_gender"]) var/genders[0] - for(var/gender in get_genders()) + for(var/gender in get_genders(target)) genders[++genders.len] = list("gender_name" = gender2text(gender), "gender_key" = gender) data["genders"] = genders var/id_genders[0] @@ -429,7 +429,7 @@ id_genders[++id_genders.len] = list("gender_name" = gender2text(gender), "gender_key" = gender) data["id_genders"] = id_genders - data["change_hair"] = can_change(APPEARANCE_HAIR) + data["change_hair"] = can_change(target, APPEARANCE_HAIR) if(data["change_hair"]) data["hair_style"] = target.h_style @@ -445,20 +445,20 @@ data["markings"] = markings_data // VOREStation Add End - data["change_facial_hair"] = can_change(APPEARANCE_FACIAL_HAIR) + data["change_facial_hair"] = can_change(target, APPEARANCE_FACIAL_HAIR) if(data["change_facial_hair"]) data["facial_hair_style"] = target.f_style - data["change_skin_tone"] = can_change_skin_tone() - data["change_skin_color"] = can_change_skin_color() + data["change_skin_tone"] = can_change_skin_tone(target) + data["change_skin_color"] = can_change_skin_color(target) if(data["change_skin_color"]) data["skin_color"] = rgb(target.r_skin, target.g_skin, target.b_skin) - data["change_eye_color"] = can_change(APPEARANCE_EYE_COLOR) + data["change_eye_color"] = can_change(target, APPEARANCE_EYE_COLOR) if(data["change_eye_color"]) data["eye_color"] = rgb(target.r_eyes, target.g_eyes, target.b_eyes) - data["change_hair_color"] = can_change(APPEARANCE_HAIR_COLOR) + data["change_hair_color"] = can_change(target, APPEARANCE_HAIR_COLOR) if(data["change_hair_color"]) data["hair_color"] = rgb(target.r_hair, target.g_hair, target.b_hair) // VOREStation Add - Ears/Tails/Wings @@ -476,7 +476,7 @@ data["wing2_color"] = rgb(target.r_wing2, target.g_wing2, target.b_wing2) // VOREStation Add End - data["change_facial_hair_color"] = can_change(APPEARANCE_FACIAL_HAIR_COLOR) + data["change_facial_hair_color"] = can_change(target, APPEARANCE_FACIAL_HAIR_COLOR) if(data["change_facial_hair_color"]) data["facial_hair_color"] = rgb(target.r_facial, target.g_facial, target.b_facial) return data @@ -512,42 +512,30 @@ local_skybox.set_position("CENTER", "CENTER", (world.maxx>>1) - newturf.x, (world.maxy>>1) - newturf.y) */ -/datum/tgui_module/appearance_changer/proc/update_dna() - var/mob/living/carbon/human/target = owner - if(customize_usr) - if(!ishuman(usr)) - return TRUE - target = usr +/datum/tgui_module/appearance_changer/proc/update_dna(mob/target) + if(customize_usr && !ishuman(target)) + return TRUE + var/mob/living/carbon/human/H = target + if(H && (flags & APPEARANCE_UPDATE_DNA)) + H.update_dna() - if(target && (flags & APPEARANCE_UPDATE_DNA)) - target.update_dna() +/datum/tgui_module/appearance_changer/proc/can_change(mob/target, var/flag) + if(customize_usr && !ishuman(target)) + return TRUE + var/mob/living/carbon/human/H = target + return H && (flags & flag) -/datum/tgui_module/appearance_changer/proc/can_change(var/flag) - var/mob/living/carbon/human/target = owner - if(customize_usr) - if(!ishuman(usr)) - return TRUE - target = usr +/datum/tgui_module/appearance_changer/proc/can_change_skin_tone(mob/target) + if(customize_usr && !ishuman(target)) + return TRUE + var/mob/living/carbon/human/H = target + return H && (flags & APPEARANCE_SKIN) && H.species.appearance_flags & HAS_SKIN_TONE - return target && (flags & flag) - -/datum/tgui_module/appearance_changer/proc/can_change_skin_tone() - var/mob/living/carbon/human/target = owner - if(customize_usr) - if(!ishuman(usr)) - return TRUE - target = usr - - return target && (flags & APPEARANCE_SKIN) && target.species.appearance_flags & HAS_SKIN_TONE - -/datum/tgui_module/appearance_changer/proc/can_change_skin_color() - var/mob/living/carbon/human/target = owner - if(customize_usr) - if(!ishuman(usr)) - return TRUE - target = usr - - return target && (flags & APPEARANCE_SKIN) && target.species.appearance_flags & HAS_SKIN_COLOR +/datum/tgui_module/appearance_changer/proc/can_change_skin_color(mob/target) + if(customize_usr && !ishuman(target)) + return TRUE + var/mob/living/carbon/human/H = target + return H && (flags & APPEARANCE_SKIN) && H.species.appearance_flags & HAS_SKIN_COLOR /datum/tgui_module/appearance_changer/proc/cut_data() // Making the assumption that the available species remain constant @@ -610,15 +598,13 @@ ))) // VOREStation Add End -/datum/tgui_module/appearance_changer/proc/get_genders() - var/mob/living/carbon/human/target = owner - if(customize_usr) - if(!ishuman(usr)) - return TRUE - target = usr - var/datum/species/S = target.species +/datum/tgui_module/appearance_changer/proc/get_genders(mob/target) + if(customize_usr && !ishuman(target)) + return TRUE + var/mob/living/carbon/human/H = target + var/datum/species/S = H.species var/list/possible_genders = S.genders - if(!target.internal_organs_by_name["cell"]) + if(!H.internal_organs_by_name["cell"]) return possible_genders possible_genders = possible_genders.Copy() possible_genders |= NEUTER diff --git a/code/modules/tgui/modules/atmos_control.dm b/code/modules/tgui/modules/atmos_control.dm index 2f2b881da1..d2c7c71ec9 100644 --- a/code/modules/tgui/modules/atmos_control.dm +++ b/code/modules/tgui/modules/atmos_control.dm @@ -28,7 +28,7 @@ var/obj/machinery/alarm/alarm = locate(params["alarm"]) in (monitored_alarms.len ? monitored_alarms : machines) if(alarm) var/datum/tgui_state/TS = generate_state(alarm) - alarm.tgui_interact(usr, parent_ui = ui_ref, state = TS) + alarm.tgui_interact(ui.user, parent_ui = ui_ref, state = TS) return 1 if("setZLevel") ui.set_map_z_level(params["mapZLevel"]) diff --git a/code/modules/tgui/modules/camera.dm b/code/modules/tgui/modules/camera.dm index 1614a6c551..e66d4bc96d 100644 --- a/code/modules/tgui/modules/camera.dm +++ b/code/modules/tgui/modules/camera.dm @@ -130,16 +130,16 @@ data["allNetworks"] |= C.network return data -/datum/tgui_module/camera/tgui_act(action, params) +/datum/tgui_module/camera/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE - if(action && !issilicon(usr)) + if(action && !issilicon(ui.user)) playsound(tgui_host(), "terminal_type", 50, 1) if(action == "switch_camera") var/c_tag = params["name"] - var/list/cameras = get_available_cameras(usr) + var/list/cameras = get_available_cameras(ui.user) var/obj/machinery/camera/C = cameras["[ckey(c_tag)]"] if(active_camera) UnregisterSignal(active_camera, COMSIG_OBSERVER_MOVED) @@ -159,7 +159,7 @@ var/obj/machinery/camera/target var/best_dist = INFINITY - var/list/possible_cameras = get_available_cameras(usr) + var/list/possible_cameras = get_available_cameras(ui.user) for(var/obj/machinery/camera/C in get_area(T)) if(!possible_cameras["[ckey(C.c_tag)]"]) continue diff --git a/code/modules/tgui/modules/communications.dm b/code/modules/tgui/modules/communications.dm index 5b758ceb45..00656061bf 100644 --- a/code/modules/tgui/modules/communications.dm +++ b/code/modules/tgui/modules/communications.dm @@ -63,7 +63,7 @@ to_chat(user, span_warning("Access denied.")) return COMM_AUTHENTICATION_NONE -/datum/tgui_module/communications/proc/change_security_level(new_level) +/datum/tgui_module/communications/proc/change_security_level(mob/user, new_level) tmp_alertlevel = new_level var/old_level = security_level if(!tmp_alertlevel) tmp_alertlevel = SEC_LEVEL_GREEN @@ -72,8 +72,8 @@ set_security_level(tmp_alertlevel) if(security_level != old_level) //Only notify the admins if an actual change happened - log_game("[key_name(usr)] has changed the security level to [get_security_level()].") - message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].") + log_game("[key_name(user)] has changed the security level to [get_security_level()].") + message_admins("[key_name_admin(user)] has changed the security level to [get_security_level()].") switch(security_level) if(SEC_LEVEL_GREEN) feedback_inc("alert_comms_green",1) @@ -197,102 +197,101 @@ frequency.post_signal(null, status_signal) -/datum/tgui_module/communications/tgui_act(action, params) +/datum/tgui_module/communications/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE - if(using_map && !(get_z(usr) in using_map.contact_levels)) - to_chat(usr, span_danger("Unable to establish a connection: You're too far away from the station!")) + if(using_map && !(get_z(ui.user) in using_map.contact_levels)) + to_chat(ui.user, span_danger("Unable to establish a connection: You're too far away from the station!")) return FALSE . = TRUE if(action == "auth") - if(!ishuman(usr)) - to_chat(usr, span_warning("Access denied.")) + if(!ishuman(ui.user)) + to_chat(ui.user, span_warning("Access denied.")) return FALSE // Logout function. if(authenticated != COMM_AUTHENTICATION_NONE) authenticated = COMM_AUTHENTICATION_NONE crew_announcement.announcer = null - setMenuState(usr, COMM_SCREEN_MAIN) + setMenuState(ui.user, COMM_SCREEN_MAIN) return // Login function. - if(check_access(usr, access_heads)) + if(check_access(ui.user, access_heads)) authenticated = COMM_AUTHENTICATION_MIN - if(check_access(usr, access_captain)) + if(check_access(ui.user, access_captain)) authenticated = COMM_AUTHENTICATION_MAX - var/mob/M = usr - var/obj/item/card/id = M.GetIdCard() + var/obj/item/card/id = ui.user.GetIdCard() if(istype(id)) crew_announcement.announcer = GetNameAndAssignmentFromId(id) if(authenticated == COMM_AUTHENTICATION_NONE) - to_chat(usr, span_warning("You need to wear your ID.")) + to_chat(ui.user, span_warning("You need to wear your ID.")) // All functions below this point require authentication. - if(!is_authenticated(usr)) + if(!is_authenticated(ui.user)) return FALSE switch(action) // main interface if("main") - setMenuState(usr, COMM_SCREEN_MAIN) + setMenuState(ui.user, COMM_SCREEN_MAIN) if("newalertlevel") - if(isAI(usr) || isrobot(usr)) - to_chat(usr, span_warning("Firewalls prevent you from changing the alert level.")) + if(isAI(ui.user) || isrobot(ui.user)) + to_chat(ui.user, span_warning("Firewalls prevent you from changing the alert level.")) return - else if(isobserver(usr)) - var/mob/observer/dead/D = usr + else if(isobserver(ui.user)) + var/mob/observer/dead/D = ui.user if(D.can_admin_interact()) - change_security_level(text2num(params["level"])) + change_security_level(ui.user, text2num(params["level"])) return TRUE - else if(!ishuman(usr)) - to_chat(usr, span_warning("Security measures prevent you from changing the alert level.")) + else if(!ishuman(ui.user)) + to_chat(ui.user, span_warning("Security measures prevent you from changing the alert level.")) return - if(is_authenticated(usr)) - change_security_level(text2num(params["level"])) + if(is_authenticated(ui.user)) + change_security_level(ui.user, text2num(params["level"])) else - to_chat(usr, span_warning("You are not authorized to do this.")) - setMenuState(usr, COMM_SCREEN_MAIN) + to_chat(ui.user, span_warning("You are not authorized to do this.")) + setMenuState(ui.user, COMM_SCREEN_MAIN) if("announce") - if(is_authenticated(usr) == COMM_AUTHENTICATION_MAX) + if(is_authenticated(ui.user) == COMM_AUTHENTICATION_MAX) if(message_cooldown > world.time) - to_chat(usr, span_warning("Please allow at least one minute to pass between announcements.")) + to_chat(ui.user, span_warning("Please allow at least one minute to pass between announcements.")) return - var/input = tgui_input_text(usr, "Please write a message to announce to the station crew.", "Priority Announcement", multiline = TRUE, prevent_enter = TRUE) - if(!input || message_cooldown > world.time || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX)) + var/input = tgui_input_text(ui.user, "Please write a message to announce to the station crew.", "Priority Announcement", multiline = TRUE, prevent_enter = TRUE) + if(!input || message_cooldown > world.time || ..() || !(is_authenticated(ui.user) == COMM_AUTHENTICATION_MAX)) return if(length(input) < COMM_MSGLEN_MINIMUM) - to_chat(usr, span_warning("Message '[input]' is too short. [COMM_MSGLEN_MINIMUM] character minimum.")) + to_chat(ui.user, span_warning("Message '[input]' is too short. [COMM_MSGLEN_MINIMUM] character minimum.")) return crew_announcement.Announce(input) message_cooldown = world.time + 600 //One minute if("callshuttle") - if(!is_authenticated(usr)) + if(!is_authenticated(ui.user)) return - call_shuttle_proc(usr) + call_shuttle_proc(ui.user) if(emergency_shuttle.online()) - post_status(src, "shuttle", user = usr) - setMenuState(usr, COMM_SCREEN_MAIN) + post_status(src, "shuttle", user = ui.user) + setMenuState(ui.user, COMM_SCREEN_MAIN) if("cancelshuttle") - if(isAI(usr) || isrobot(usr)) - to_chat(usr, span_warning("Firewalls prevent you from recalling the shuttle.")) + if(isAI(ui.user) || isrobot(ui.user)) + to_chat(ui.user, span_warning("Firewalls prevent you from recalling the shuttle.")) return - var/response = tgui_alert(usr, "Are you sure you wish to recall the shuttle?", "Confirm", list("Yes", "No")) + var/response = tgui_alert(ui.user, "Are you sure you wish to recall the shuttle?", "Confirm", list("Yes", "No")) if(response == "Yes") - cancel_call_proc(usr) - setMenuState(usr, COMM_SCREEN_MAIN) + cancel_call_proc(ui.user) + setMenuState(ui.user, COMM_SCREEN_MAIN) if("messagelist") current_viewing_message = null current_viewing_message_id = null if(params["msgid"]) - setCurrentMessage(usr, text2num(params["msgid"])) - setMenuState(usr, COMM_SCREEN_MESSAGES) + setCurrentMessage(ui.user, text2num(params["msgid"])) + setMenuState(ui.user, COMM_SCREEN_MESSAGES) if("toggleatc") ATC.squelched = !ATC.squelched @@ -300,79 +299,79 @@ if("delmessage") var/datum/comm_message_listener/l = obtain_message_listener() if(params["msgid"]) - setCurrentMessage(usr, text2num(params["msgid"])) - var/response = tgui_alert(usr, "Are you sure you wish to delete this message?", "Confirm", list("Yes", "No")) + setCurrentMessage(ui.user, text2num(params["msgid"])) + var/response = tgui_alert(ui.user, "Are you sure you wish to delete this message?", "Confirm", list("Yes", "No")) if(response == "Yes") if(current_viewing_message) if(l != global_message_listener) l.Remove(current_viewing_message) current_viewing_message = null - setMenuState(usr, COMM_SCREEN_MESSAGES) + setMenuState(ui.user, COMM_SCREEN_MESSAGES) if("status") - setMenuState(usr, COMM_SCREEN_STAT) + setMenuState(ui.user, COMM_SCREEN_STAT) // Status display stuff if("setstat") display_type = params["statdisp"] switch(display_type) if("message") - post_status(src, "message", stat_msg1, stat_msg2, user = usr) + post_status(src, "message", stat_msg1, stat_msg2, user = ui.user) if("alert") - post_status(src, "alert", params["alert"], user = usr) + post_status(src, "alert", params["alert"], user = ui.user) else - post_status(src, params["statdisp"], user = usr) + post_status(src, params["statdisp"], user = ui.user) if("setmsg1") - stat_msg1 = reject_bad_text(sanitize(tgui_input_text(usr, "Line 1", "Enter Message Text", stat_msg1, 40), 40), 40) - setMenuState(usr, COMM_SCREEN_STAT) + stat_msg1 = reject_bad_text(sanitize(tgui_input_text(ui.user, "Line 1", "Enter Message Text", stat_msg1, 40), 40), 40) + setMenuState(ui.user, COMM_SCREEN_STAT) if("setmsg2") - stat_msg2 = reject_bad_text(sanitize(tgui_input_text(usr, "Line 2", "Enter Message Text", stat_msg2, 40), 40), 40) - setMenuState(usr, COMM_SCREEN_STAT) + stat_msg2 = reject_bad_text(sanitize(tgui_input_text(ui.user, "Line 2", "Enter Message Text", stat_msg2, 40), 40), 40) + setMenuState(ui.user, COMM_SCREEN_STAT) // OMG CENTCOMM LETTERHEAD if("MessageCentCom") - if(is_authenticated(usr) == COMM_AUTHENTICATION_MAX) + if(is_authenticated(ui.user) == COMM_AUTHENTICATION_MAX) if(centcomm_message_cooldown > world.time) - to_chat(usr, span_warning("Arrays recycling. Please stand by.")) + to_chat(ui.user, span_warning("Arrays recycling. Please stand by.")) return - var/input = sanitize(tgui_input_text(usr, "Please choose a message to transmit to [using_map.boss_short] via quantum entanglement. \ + var/input = sanitize(tgui_input_text(ui.user, "Please choose a message to transmit to [using_map.boss_short] via quantum entanglement. \ Please be aware that this process is very expensive, and abuse will lead to... termination. \ Transmission does not guarantee a response. \ There is a 30 second delay before you may send another message, be clear, full and concise.", "Central Command Quantum Messaging", multiline = TRUE, prevent_enter = TRUE)) - if(!input || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX)) + if(!input || ..() || !(is_authenticated(ui.user) == COMM_AUTHENTICATION_MAX)) return if(length(input) < COMM_CCMSGLEN_MINIMUM) - to_chat(usr, span_warning("Message '[input]' is too short. [COMM_CCMSGLEN_MINIMUM] character minimum.")) + to_chat(ui.user, span_warning("Message '[input]' is too short. [COMM_CCMSGLEN_MINIMUM] character minimum.")) return - CentCom_announce(input, usr) - to_chat(usr, span_blue("Message transmitted.")) - log_game("[key_name(usr)] has made an IA [using_map.boss_short] announcement: [input]") + CentCom_announce(input, ui.user) + to_chat(ui.user, span_blue("Message transmitted.")) + log_game("[key_name(ui.user)] has made an IA [using_map.boss_short] announcement: [input]") centcomm_message_cooldown = world.time + 300 // 30 seconds - setMenuState(usr, COMM_SCREEN_MAIN) + setMenuState(ui.user, COMM_SCREEN_MAIN) // OMG SYNDICATE ...LETTERHEAD if("MessageSyndicate") - if((is_authenticated(usr) == COMM_AUTHENTICATION_MAX) && (emagged)) + if((is_authenticated(ui.user) == COMM_AUTHENTICATION_MAX) && (emagged)) if(centcomm_message_cooldown > world.time) - to_chat(usr, "Arrays recycling. Please stand by.") + to_chat(ui.user, "Arrays recycling. Please stand by.") return - var/input = sanitize(tgui_input_text(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "")) - if(!input || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX)) + var/input = sanitize(tgui_input_text(ui.user, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "")) + if(!input || ..() || !(is_authenticated(ui.user) == COMM_AUTHENTICATION_MAX)) return if(length(input) < COMM_CCMSGLEN_MINIMUM) - to_chat(usr, span_warning("Message '[input]' is too short. [COMM_CCMSGLEN_MINIMUM] character minimum.")) + to_chat(ui.user, span_warning("Message '[input]' is too short. [COMM_CCMSGLEN_MINIMUM] character minimum.")) return - Syndicate_announce(input, usr) - to_chat(usr, span_blue("Message transmitted.")) - log_game("[key_name(usr)] has made an illegal announcement: [input]") + Syndicate_announce(input, ui.user) + to_chat(ui.user, span_blue("Message transmitted.")) + log_game("[key_name(ui.user)] has made an illegal announcement: [input]") centcomm_message_cooldown = world.time + 300 // 30 seconds if("RestoreBackup") - to_chat(usr, "Backup routing data restored!") + to_chat(ui.user, "Backup routing data restored!") emagged = FALSE - setMenuState(usr, COMM_SCREEN_MAIN) + setMenuState(ui.user, COMM_SCREEN_MAIN) /datum/tgui_module/communications/ntos ntos = TRUE @@ -386,7 +385,7 @@ if ((!( ticker ) || !emergency_shuttle.location())) return - if(!universe.OnShuttleCall(usr)) + if(!universe.OnShuttleCall(user)) to_chat(user, span_notice("Cannot establish a bluespace connection.")) return diff --git a/code/modules/tgui/modules/crew_monitor.dm b/code/modules/tgui/modules/crew_monitor.dm index b02e56d094..e2e3c056ab 100644 --- a/code/modules/tgui/modules/crew_monitor.dm +++ b/code/modules/tgui/modules/crew_monitor.dm @@ -11,18 +11,18 @@ if(..()) return TRUE - if(action && !issilicon(usr)) + if(action && !issilicon(ui.user)) playsound(tgui_host(), "terminal_type", 50, 1) - var/turf/T = get_turf(usr) + var/turf/T = get_turf(ui.user) if(!T || !(T.z in using_map.player_levels)) - to_chat(usr, span_boldwarning("Unable to establish a connection") + ": You're too far away from the station!") + to_chat(ui.user, span_boldwarning("Unable to establish a connection") + ": You're too far away from the station!") return FALSE switch(action) if("track") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr + if(isAI(ui.user)) + var/mob/living/silicon/ai/AI = ui.user var/mob/living/carbon/human/H = locate(params["track"]) in mob_list if(hassensorlevel(H, SUIT_SENSOR_TRACKING)) AI.ai_actual_track(H) diff --git a/code/modules/tgui/modules/gyrotron_control.dm b/code/modules/tgui/modules/gyrotron_control.dm index e0c4775849..9980c484c7 100644 --- a/code/modules/tgui/modules/gyrotron_control.dm +++ b/code/modules/tgui/modules/gyrotron_control.dm @@ -5,7 +5,7 @@ var/gyro_tag = "" var/scan_range = 25 -/datum/tgui_module/gyrotron_control/tgui_act(action, params) +/datum/tgui_module/gyrotron_control/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -18,13 +18,13 @@ switch(action) if("set_tag") - var/new_ident = sanitize_text(tgui_input_text(usr, "Enter a new ident tag.", "Gyrotron Control", gyro_tag)) + var/new_ident = sanitize_text(tgui_input_text(ui.user, "Enter a new ident tag.", "Gyrotron Control", gyro_tag)) if(new_ident) gyro_tag = new_ident return TRUE if("toggle_active") - G.activate(usr) + G.activate(ui.user) return TRUE if("set_str") @@ -65,4 +65,4 @@ return data /datum/tgui_module/gyrotron_control/ntos - ntos = TRUE \ No newline at end of file + ntos = TRUE diff --git a/code/modules/tgui/modules/late_choices.dm b/code/modules/tgui/modules/late_choices.dm index 5aaba31984..1a3f86eeab 100644 --- a/code/modules/tgui/modules/late_choices.dm +++ b/code/modules/tgui/modules/late_choices.dm @@ -105,31 +105,33 @@ return data -/datum/tgui_module/late_choices/tgui_act(action, params) +/datum/tgui_module/late_choices/tgui_act(action, params, datum/tgui/ui) . = ..() if(.) return - var/mob/new_player/user = usr + if(!isnewplayer(ui.user)) + return + var/mob/new_player/new_user = ui.user switch(action) if("join") var/job = params["job"] if(!CONFIG_GET(flag/enter_allowed)) - to_chat(user, span_notice("There is an administrative lock on entering the game!")) + to_chat(new_user, span_notice("There is an administrative lock on entering the game!")) return else if(ticker && ticker.mode && ticker.mode.explosion_in_progress) - to_chat(user, span_danger("The station is currently exploding. Joining would go poorly.")) + to_chat(new_user, span_danger("The station is currently exploding. Joining would go poorly.")) return - var/datum/species/S = GLOB.all_species[user.client.prefs.species] - if(!is_alien_whitelisted(user, S)) - tgui_alert(user, "You are currently not whitelisted to play [user.client.prefs.species].") + var/datum/species/S = GLOB.all_species[new_user.client.prefs.species] + if(!is_alien_whitelisted(new_user, S)) + tgui_alert(new_user, "You are currently not whitelisted to play [new_user.client.prefs.species].") return 0 if(!(S.spawn_flags & SPECIES_CAN_JOIN)) - tgui_alert_async(user,"Your current species, [user.client.prefs.species], is not available for play on the station.") + tgui_alert_async(new_user,"Your current species, [new_user.client.prefs.species], is not available for play on the station.") return 0 - user.AttemptLateSpawn(job, user.client.prefs.spawnpoint) + new_user.AttemptLateSpawn(job, new_user.client.prefs.spawnpoint) diff --git a/code/modules/tgui/modules/law_manager.dm b/code/modules/tgui/modules/law_manager.dm index 86cea7cd35..54b86a0da4 100644 --- a/code/modules/tgui/modules/law_manager.dm +++ b/code/modules/tgui/modules/law_manager.dm @@ -45,69 +45,69 @@ return TRUE if("add_zeroth_law") - if(zeroth_law && is_admin(usr) && !owner.laws.zeroth_law) + if(zeroth_law && is_admin(ui.user) && !owner.laws.zeroth_law) owner.set_zeroth_law(zeroth_law) return TRUE if("add_ion_law") - if(ion_law && is_malf(usr)) + if(ion_law && is_malf(ui.user)) owner.add_ion_law(ion_law) return TRUE if("add_inherent_law") - if(inherent_law && is_malf(usr)) + if(inherent_law && is_malf(ui.user)) owner.add_inherent_law(inherent_law) return TRUE if("add_supplied_law") - if(supplied_law && supplied_law_position >= 1 && MIN_SUPPLIED_LAW_NUMBER <= MAX_SUPPLIED_LAW_NUMBER && is_malf(usr)) + if(supplied_law && supplied_law_position >= 1 && MIN_SUPPLIED_LAW_NUMBER <= MAX_SUPPLIED_LAW_NUMBER && is_malf(ui.user)) owner.add_supplied_law(supplied_law_position, supplied_law) return TRUE if("change_zeroth_law") var/new_law = sanitize(params["val"]) - if(new_law && new_law != zeroth_law && can_still_topic(usr, state)) + if(new_law && new_law != zeroth_law && can_still_topic(ui.user, state)) zeroth_law = new_law return TRUE if("change_ion_law") var/new_law = sanitize(params["val"]) - if(new_law && new_law != ion_law && can_still_topic(usr, state)) + if(new_law && new_law != ion_law && can_still_topic(ui.user, state)) ion_law = new_law return TRUE if("change_inherent_law") var/new_law = sanitize(params["val"]) - if(new_law && new_law != inherent_law && can_still_topic(usr, state)) + if(new_law && new_law != inherent_law && can_still_topic(ui.user, state)) inherent_law = new_law return TRUE if("change_supplied_law") var/new_law = sanitize(params["val"]) - if(new_law && new_law != supplied_law && can_still_topic(usr, state)) + if(new_law && new_law != supplied_law && can_still_topic(ui.user, state)) supplied_law = new_law return TRUE if("change_supplied_law_position") - var/new_position = tgui_input_number(usr, "Enter new supplied law position between 1 and [MAX_SUPPLIED_LAW_NUMBER], inclusive. Inherent laws at the same index as a supplied law will not be stated.", "Law Position", supplied_law_position, MAX_SUPPLIED_LAW_NUMBER, 1) - if(isnum(new_position) && can_still_topic(usr, state)) + var/new_position = tgui_input_number(ui.user, "Enter new supplied law position between 1 and [MAX_SUPPLIED_LAW_NUMBER], inclusive. Inherent laws at the same index as a supplied law will not be stated.", "Law Position", supplied_law_position, MAX_SUPPLIED_LAW_NUMBER, 1) + if(isnum(new_position) && can_still_topic(ui.user, state)) supplied_law_position = CLAMP(new_position, 1, MAX_SUPPLIED_LAW_NUMBER) return TRUE if("edit_law") - if(is_malf(usr)) + if(is_malf(ui.user)) var/datum/ai_law/AL = locate(params["edit_law"]) in owner.laws.all_laws() if(AL) - var/new_law = sanitize(tgui_input_text(usr, "Enter new law. Leaving the field blank will cancel the edit.", "Edit Law", AL.law)) - if(new_law && new_law != AL.law && is_malf(usr) && can_still_topic(usr, state)) + var/new_law = sanitize(tgui_input_text(ui.user, "Enter new law. Leaving the field blank will cancel the edit.", "Edit Law", AL.law)) + if(new_law && new_law != AL.law && is_malf(ui.user) && can_still_topic(ui.user, state)) log_and_message_admins("has changed a law of [owner] from '[AL.law]' to '[new_law]'") AL.law = new_law return TRUE if("delete_law") - if(is_malf(usr)) + if(is_malf(ui.user)) var/datum/ai_law/AL = locate(params["delete_law"]) in owner.laws.all_laws() - if(AL && is_malf(usr)) + if(AL && is_malf(ui.user)) owner.delete_law(AL) return TRUE @@ -116,14 +116,14 @@ return TRUE if("state_law_set") - var/datum/ai_laws/ALs = locate(params["state_law_set"]) in (is_admin(usr) ? admin_laws : player_laws) + var/datum/ai_laws/ALs = locate(params["state_law_set"]) in (is_admin(ui.user) ? admin_laws : player_laws) if(ALs) owner.statelaws(ALs) return TRUE if("transfer_laws") - if(is_malf(usr)) - var/datum/ai_laws/ALs = locate(params["transfer_laws"]) in (is_admin(usr) ? admin_laws : player_laws) + if(is_malf(ui.user)) + var/datum/ai_laws/ALs = locate(params["transfer_laws"]) in (is_admin(ui.user) ? admin_laws : player_laws) if(ALs) log_and_message_admins("has transfered the [ALs.name] laws to [owner].") ALs.sync(owner, 0) @@ -137,8 +137,8 @@ for(var/mob/living/silicon/robot/R in AI.connected_robots) to_chat(R, span_danger("Law Notice")) R.laws.show_laws(R) - if(usr != owner) - to_chat(usr, span_notice("Laws displayed.")) + if(ui.user != owner) + to_chat(ui.user, span_notice("Laws displayed.")) return TRUE /datum/tgui_module/law_manager/tgui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/tgui/modules/ntos-only/cardmod.dm b/code/modules/tgui/modules/ntos-only/cardmod.dm index c399e68ba7..e50efdd95e 100644 --- a/code/modules/tgui/modules/ntos-only/cardmod.dm +++ b/code/modules/tgui/modules/ntos-only/cardmod.dm @@ -119,7 +119,7 @@ if(!istype(computer)) return TRUE - var/obj/item/card/id/user_id_card = usr.GetIdCard() + var/obj/item/card/id/user_id_card = ui.user.GetIdCard() var/obj/item/card/id/id_card if(computer.card_slot) id_card = computer.card_slot.stored_card @@ -131,7 +131,7 @@ if("print") if(computer && computer.nano_printer) //This option should never be called if there is no printer if(!mod_mode) - if(program.can_run(usr, 1)) + if(program.can_run(ui.user, 1)) var/contents = {"

Access Report

Prepared By: [user_id_card.registered_name ? user_id_card.registered_name : "Unknown"]
For: [id_card.registered_name ? id_card.registered_name : "Unregistered"]
@@ -148,7 +148,7 @@ contents += " [get_access_desc(A)]" if(!computer.nano_printer.print_text(contents,"access report")) - to_chat(usr, span_notice("Hardware error: Printer was unable to print the file. It may be out of paper.")) + to_chat(ui.user, span_notice("Hardware error: Printer was unable to print the file. It may be out of paper.")) return else computer.visible_message(span_bold("\The [computer]") + " prints out paper.") @@ -158,7 +158,7 @@ [data_core ? data_core.get_manifest(0) : ""] "} if(!computer.nano_printer.print_text(contents,text("crew manifest ([])", stationtime2text()))) - to_chat(usr, span_notice("Hardware error: Printer was unable to print the file. It may be out of paper.")) + to_chat(ui.user, span_notice("Hardware error: Printer was unable to print the file. It may be out of paper.")) return else computer.visible_message(span_bold("\The [computer]") + " prints out paper.") @@ -167,16 +167,16 @@ if(computer && computer.card_slot) if(id_card) data_core.manifest_modify(id_card.registered_name, id_card.assignment, id_card.rank) - computer.proc_eject_id(usr) + computer.proc_eject_id(ui.user) . = TRUE if("terminate") - if(computer && program.can_run(usr, 1)) + if(computer && program.can_run(ui.user, 1)) id_card.assignment = "Dismissed" //VOREStation Edit: setting adjustment id_card.access = list() callHook("terminate_employee", list(id_card)) . = TRUE if("reg") - if(computer && program.can_run(usr, 1)) + if(computer && program.can_run(ui.user, 1)) var/temp_name = sanitizeName(params["reg"], allow_numbers = TRUE) if(temp_name) id_card.registered_name = temp_name @@ -184,15 +184,15 @@ computer.visible_message(span_notice("[computer] buzzes rudely.")) . = TRUE if("account") - if(computer && program.can_run(usr, 1)) + if(computer && program.can_run(ui.user, 1)) var/account_num = text2num(params["account"]) id_card.associated_account_number = account_num . = TRUE if("assign") - if(computer && program.can_run(usr, 1) && id_card) + if(computer && program.can_run(ui.user, 1) && id_card) var/t1 = params["assign_target"] if(t1 == "Custom") - var/temp_t = sanitize(tgui_input_text(usr, "Enter a custom job assignment.","Assignment", id_card.assignment, 45), 45) + var/temp_t = sanitize(tgui_input_text(ui.user, "Enter a custom job assignment.","Assignment", id_card.assignment, 45), 45) //let custom jobs function as an impromptu alt title, mainly for sechuds if(temp_t) id_card.assignment = temp_t @@ -208,7 +208,7 @@ jobdatum = J break if(!jobdatum) - to_chat(usr, span_warning("No log exists for this job: [t1]")) + to_chat(ui.user, span_warning("No log exists for this job: [t1]")) return access = jobdatum.get_access() @@ -220,7 +220,7 @@ callHook("reassign_employee", list(id_card)) . = TRUE if("access") - if(computer && program.can_run(usr, 1)) + if(computer && program.can_run(ui.user, 1)) var/access_type = text2num(params["access_target"]) var/access_allowed = text2num(params["allowed"]) if(access_type in get_access_ids(ACCESS_TYPE_STATION|ACCESS_TYPE_CENTCOM)) diff --git a/code/modules/tgui/modules/ntos-only/email.dm b/code/modules/tgui/modules/ntos-only/email.dm index 45317a9aee..e8a7d606fe 100644 --- a/code/modules/tgui/modules/ntos-only/email.dm +++ b/code/modules/tgui/modules/ntos-only/email.dm @@ -228,11 +228,10 @@ return 1 -/datum/tgui_module/email_client/tgui_act(action, params) +/datum/tgui_module/email_client/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE - var/mob/living/user = usr check_for_new_messages(1) // Any actual interaction (button pressing) is considered as acknowledging received message, for the purpose of notification icons. switch(action) @@ -279,7 +278,7 @@ var/oldtext = html_decode(msg_body) oldtext = replacetext(oldtext, "\[editorbr\]", "\n") - var/newtext = sanitize(replacetext(tgui_input_text(usr, "Enter your message. You may use most tags from paper formatting", "Message Editor", oldtext, 20000, TRUE, prevent_enter = TRUE), "\n", "\[editorbr\]"), 20000) + var/newtext = sanitize(replacetext(tgui_input_text(ui.user, "Enter your message. You may use most tags from paper formatting", "Message Editor", oldtext, 20000, TRUE, prevent_enter = TRUE), "\n", "\[editorbr\]"), 20000) if(newtext) msg_body = newtext return 1 @@ -362,13 +361,13 @@ return 1 if("changepassword") - var/oldpassword = sanitize(tgui_input_text(user,"Please enter your old password:", "Password Change", null, 100), 100) + var/oldpassword = sanitize(tgui_input_text(ui.user,"Please enter your old password:", "Password Change", null, 100), 100) if(!oldpassword) return 1 - var/newpassword1 = sanitize(tgui_input_text(user,"Please enter your new password:", "Password Change", null, 100), 100) + var/newpassword1 = sanitize(tgui_input_text(ui.user,"Please enter your new password:", "Password Change", null, 100), 100) if(!newpassword1) return 1 - var/newpassword2 = sanitize(tgui_input_text(user,"Please re-enter your new password:", "Password Change", null, 100), 100) + var/newpassword2 = sanitize(tgui_input_text(ui.user,"Please re-enter your new password:", "Password Change", null, 100), 100) if(!newpassword2) return 1 @@ -399,7 +398,7 @@ error = "Error exporting file. Are you using a functional and NTOS-compliant device?" return 1 - var/filename = sanitize(tgui_input_text(user,"Please specify file name:", "Message export", null, 100), 100) + var/filename = sanitize(tgui_input_text(ui.user,"Please specify file name:", "Message export", null, 100), 100) if(!filename) return 1 @@ -427,7 +426,7 @@ if(CF.unsendable) continue filenames.Add(CF.filename) - var/picked_file = tgui_input_list(user, "Please pick a file to send as attachment (max 32GQ)", "Select Attachment", filenames) + var/picked_file = tgui_input_list(ui.user, "Please pick a file to send as attachment (max 32GQ)", "Select Attachment", filenames) if(!picked_file) return 1 diff --git a/code/modules/tgui/modules/ntos-only/uav.dm b/code/modules/tgui/modules/ntos-only/uav.dm index 9cc35dfe77..559cf00e28 100644 --- a/code/modules/tgui/modules/ntos-only/uav.dm +++ b/code/modules/tgui/modules/ntos-only/uav.dm @@ -45,11 +45,11 @@ if("switch_uav") var/obj/item/uav/U = locate(params["switch_uav"]) //This is a \ref to the UAV itself if(!istype(U)) - to_chat(usr,span_warning("Something is blocking the connection to that UAV. In-person investigation is required.")) + to_chat(ui.user,span_warning("Something is blocking the connection to that UAV. In-person investigation is required.")) return FALSE if(!get_signal_to(U)) - to_chat(usr,span_warning("The screen freezes for a moment, before returning to the UAV selection menu. It's not able to connect to that UAV.")) + to_chat(ui.user,span_warning("The screen freezes for a moment, before returning to the UAV selection menu. It's not able to connect to that UAV.")) return FALSE set_current(U) @@ -70,10 +70,10 @@ if(!current_uav) return FALSE - if(current_uav.check_eye(usr) < 0) - to_chat(usr,span_warning("The screen freezes for a moment, before returning to the UAV selection menu. It's not able to connect to that UAV.")) + if(current_uav.check_eye(ui.user) < 0) + to_chat(ui.user,span_warning("The screen freezes for a moment, before returning to the UAV selection menu. It's not able to connect to that UAV.")) else - viewing_uav(usr) ? unlook(usr) : look(usr) + viewing_uav(ui.user) ? unlook(ui.user) : look(ui.user) return TRUE if("power_uav") diff --git a/code/modules/tgui/modules/overmap.dm b/code/modules/tgui/modules/overmap.dm index 0661d4b146..6b7e31a5ab 100644 --- a/code/modules/tgui/modules/overmap.dm +++ b/code/modules/tgui/modules/overmap.dm @@ -149,7 +149,7 @@ return data -/datum/tgui_module/ship/nav/tgui_act(action, params) +/datum/tgui_module/ship/nav/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -157,7 +157,7 @@ return FALSE if(action == "viewing") - viewing_overmap(usr) ? unlook(usr) : look(usr) + viewing_overmap(ui.user) ? unlook(ui.user) : look(ui.user) return TRUE /datum/tgui_module/ship/nav/ntos @@ -326,7 +326,7 @@ return data // Beware ye eyes. This holds all of the ACTIONS from helm, engine, and sensor control all at once. -/datum/tgui_module/ship/fullmonty/tgui_act(action, params) +/datum/tgui_module/ship/fullmonty/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -334,21 +334,21 @@ /* HELM */ if("add") var/datum/computer_file/data/waypoint/R = new() - var/sec_name = tgui_input_text(usr, "Input navigation entry name", "New navigation entry", "Sector #[known_sectors.len]", MAX_NAME_LEN) + var/sec_name = tgui_input_text(ui.user, "Input navigation entry name", "New navigation entry", "Sector #[known_sectors.len]", MAX_NAME_LEN) sec_name = sanitize(sec_name,MAX_NAME_LEN) if(!sec_name) sec_name = "Sector #[known_sectors.len]" R.fields["name"] = sec_name if(sec_name in known_sectors) - to_chat(usr, span_warning("Sector with that name already exists, please input a different name.")) + to_chat(ui.user, span_warning("Sector with that name already exists, please input a different name.")) return TRUE switch(params["add"]) if("current") R.fields["x"] = linked.x R.fields["y"] = linked.y if("new") - var/newx = tgui_input_number(usr, "Input new entry x coordinate", "Coordinate input", linked.x, world.maxx, 1) - var/newy = tgui_input_number(usr, "Input new entry y coordinate", "Coordinate input", linked.y, world.maxy, 1) + var/newx = tgui_input_number(ui.user, "Input new entry x coordinate", "Coordinate input", linked.x, world.maxx, 1) + var/newy = tgui_input_number(ui.user, "Input new entry y coordinate", "Coordinate input", linked.y, world.maxy, 1) R.fields["x"] = CLAMP(newx, 1, world.maxx) R.fields["y"] = CLAMP(newy, 1, world.maxy) known_sectors[sec_name] = R @@ -363,12 +363,12 @@ if("setcoord") if(params["setx"]) - var/newx = tgui_input_number(usr, "Input new destiniation x coordinate", "Coordinate input", dx, world.maxx, 1) + var/newx = tgui_input_number(ui.user, "Input new destiniation x coordinate", "Coordinate input", dx, world.maxx, 1) if(newx) dx = CLAMP(newx, 1, world.maxx) if(params["sety"]) - var/newy = tgui_input_number(usr, "Input new destiniation y coordinate", "Coordinate input", dy, world.maxy, 1) + var/newy = tgui_input_number(ui.user, "Input new destiniation y coordinate", "Coordinate input", dy, world.maxy, 1) if(newy) dy = CLAMP(newy, 1, world.maxy) . = TRUE @@ -384,13 +384,13 @@ . = TRUE if("speedlimit") - var/newlimit = tgui_input_number(usr, "Input new speed limit for autopilot (0 to brake)", "Autopilot speed limit", speedlimit*1000, 100000) + var/newlimit = tgui_input_number(ui.user, "Input new speed limit for autopilot (0 to brake)", "Autopilot speed limit", speedlimit*1000, 100000) if(newlimit) speedlimit = CLAMP(newlimit/1000, 0, 100) . = TRUE if("accellimit") - var/newlimit = tgui_input_number(usr, "Input new acceleration limit", "Acceleration limit", accellimit*1000) + var/newlimit = tgui_input_number(ui.user, "Input new acceleration limit", "Acceleration limit", accellimit*1000) if(newlimit) accellimit = max(newlimit/1000, 0) . = TRUE @@ -398,7 +398,7 @@ if("move") var/ndir = text2num(params["dir"]) ndir = turn(ndir,pick(90,-90)) - linked.relaymove(usr, ndir, accellimit) + linked.relaymove(ui.user, ndir, accellimit) . = TRUE if("brake") @@ -418,7 +418,7 @@ . = TRUE if("manual") - viewing_overmap(usr) ? unlook(usr) : look(usr) + viewing_overmap(ui.user) ? unlook(ui.user) : look(ui.user) . = TRUE /* END HELM */ /* ENGINES */ @@ -430,7 +430,7 @@ . = TRUE if("set_global_limit") - var/newlim = tgui_input_number(usr, "Input new thrust limit (0..100%)", "Thrust limit", linked.thrust_limit*100, 100, 0) + var/newlim = tgui_input_number(ui.user, "Input new thrust limit (0..100%)", "Thrust limit", linked.thrust_limit*100, 100, 0) linked.thrust_limit = clamp(newlim/100, 0, 1) for(var/datum/ship_engine/E in linked.engines) E.set_thrust_limit(linked.thrust_limit) @@ -444,7 +444,7 @@ if("set_limit") var/datum/ship_engine/E = locate(params["engine"]) - var/newlim = tgui_input_number(usr, "Input new thrust limit (0..100)", "Thrust limit", E.get_thrust_limit(), 100, 0) + var/newlim = tgui_input_number(ui.user, "Input new thrust limit (0..100)", "Thrust limit", E.get_thrust_limit(), 100, 0) var/limit = clamp(newlim/100, 0, 1) if(istype(E)) E.set_thrust_limit(limit) @@ -465,7 +465,7 @@ /* END ENGINES */ /* SENSORS */ if("range") - var/nrange = tgui_input_number(usr, "Set new sensors range", "Sensor range", sensors.range, world.view, round_value = FALSE) + var/nrange = tgui_input_number(ui.user, "Set new sensors range", "Sensor range", sensors.range, world.view, round_value = FALSE) if(nrange) sensors.set_range(CLAMP(nrange, 1, world.view)) . = TRUE @@ -473,8 +473,8 @@ sensors.toggle() . = TRUE if("viewing") - if(usr && !isAI(usr)) - viewing_overmap(usr) ? unlook(usr) : look(usr) + if(ui.user && !isAI(ui.user)) + viewing_overmap(ui.user) ? unlook(ui.user) : look(ui.user) . = TRUE /* END SENSORS */ diff --git a/code/modules/tgui/modules/rcon.dm b/code/modules/tgui/modules/rcon.dm index 7f1f0822a9..0cecc4c5ee 100644 --- a/code/modules/tgui/modules/rcon.dm +++ b/code/modules/tgui/modules/rcon.dm @@ -55,7 +55,7 @@ return data -/datum/tgui_module/rcon/tgui_act(action, params) +/datum/tgui_module/rcon/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -78,14 +78,14 @@ var/obj/machinery/power/smes/buildable/SMES = GetSMESByTag(params["smes"]) if(SMES) SMES.tgui_set_io(SMES_TGUI_INPUT, params["target"], text2num(params["adjust"])) - // var/inputset = (input(usr, "Enter new input level (0-[SMES.input_level_max/1000] kW)", "SMES Input Power Control", SMES.input_level/1000) as num) * 1000 + // var/inputset = (input(ui.user, "Enter new input level (0-[SMES.input_level_max/1000] kW)", "SMES Input Power Control", SMES.input_level/1000) as num) * 1000 // SMES.set_input(inputset) . = TRUE if("smes_out_set") var/obj/machinery/power/smes/buildable/SMES = GetSMESByTag(params["smes"]) if(SMES) SMES.tgui_set_io(SMES_TGUI_OUTPUT, params["target"], text2num(params["adjust"])) - // var/outputset = (input(usr, "Enter new output level (0-[SMES.output_level_max/1000] kW)", "SMES Output Power Control", SMES.output_level/1000) as num) * 1000 + // var/outputset = (input(ui.user, "Enter new output level (0-[SMES.output_level_max/1000] kW)", "SMES Output Power Control", SMES.output_level/1000) as num) * 1000 // SMES.set_output(outputset) . = TRUE if("toggle_breaker") @@ -95,7 +95,7 @@ toggle = breaker if(toggle) if(toggle.update_locked) - to_chat(usr, "The breaker box was recently toggled. Please wait before toggling it again.") + to_chat(ui.user, "The breaker box was recently toggled. Please wait before toggling it again.") else toggle.auto_toggle() . = TRUE diff --git a/code/modules/tgui/modules/rustcore_monitor.dm b/code/modules/tgui/modules/rustcore_monitor.dm index a7ce6edbbb..06808b5484 100644 --- a/code/modules/tgui/modules/rustcore_monitor.dm +++ b/code/modules/tgui/modules/rustcore_monitor.dm @@ -4,7 +4,7 @@ var/core_tag = "" -/datum/tgui_module/rustcore_monitor/tgui_act(action, params) +/datum/tgui_module/rustcore_monitor/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -25,7 +25,7 @@ return TRUE if("set_tag") - var/new_ident = sanitize_text(tgui_input_text(usr, "Enter a new ident tag.", "Core Control", core_tag)) + var/new_ident = sanitize_text(tgui_input_text(ui.user, "Enter a new ident tag.", "Core Control", core_tag)) if(new_ident) core_tag = new_ident return TRUE diff --git a/code/modules/tgui/modules/rustfuel_control.dm b/code/modules/tgui/modules/rustfuel_control.dm index 820a937b99..6a355e4f0f 100644 --- a/code/modules/tgui/modules/rustfuel_control.dm +++ b/code/modules/tgui/modules/rustfuel_control.dm @@ -4,7 +4,7 @@ var/fuel_tag = "" -/datum/tgui_module/rustfuel_control/tgui_act(action, params) +/datum/tgui_module/rustfuel_control/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -22,7 +22,7 @@ return TRUE if("set_tag") - var/new_ident = sanitize_text(tgui_input_text(usr, "Enter a new ident tag.", "Gyrotron Control", fuel_tag)) + var/new_ident = sanitize_text(tgui_input_text(ui.user, "Enter a new ident tag.", "Gyrotron Control", fuel_tag)) if(new_ident) fuel_tag = new_ident @@ -48,4 +48,4 @@ return data /datum/tgui_module/rustfuel_control/ntos - ntos = TRUE \ No newline at end of file + ntos = TRUE diff --git a/code/modules/tgui/modules/teleporter.dm b/code/modules/tgui/modules/teleporter.dm index 34d2650b88..a616c1ec89 100644 --- a/code/modules/tgui/modules/teleporter.dm +++ b/code/modules/tgui/modules/teleporter.dm @@ -20,7 +20,7 @@ /datum/tgui_module/teleport_control/tgui_act(action, params, datum/tgui/ui, datum/tgui_state/state) if(..()) return TRUE - + switch(action) if("select_target") var/list/L = list() @@ -59,10 +59,10 @@ areaindex[tmpname] = 1 L[tmpname] = I - var/desc = tgui_input_list(usr, "Please select a location to lock in.", "Locking Menu", L) + var/desc = tgui_input_list(ui.user, "Please select a location to lock in.", "Locking Menu", L) if(!desc) return FALSE - if(tgui_status(usr, state) != STATUS_INTERACTIVE) + if(tgui_status(ui.user, state) != STATUS_INTERACTIVE) return FALSE locked = L[desc] @@ -76,10 +76,10 @@ if("toggle_on") if(!station) return FALSE - + if(station.engaged) station.disengage() else station.engage() - + return TRUE diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm index ed654a4c6f..5acbaa887a 100644 --- a/code/modules/tgui/tgui.dm +++ b/code/modules/tgui/tgui.dm @@ -353,8 +353,7 @@ log_tgui(user, "Action: [act_type] [href_list["payload"]], Window: [window.id], Source: [src_object]") #endif process_status() - if(src_object.tgui_act(act_type, payload, src, state)) - SStgui.update_uis(src_object) + DEFAULT_QUEUE_OR_CALL_VERB(VERB_CALLBACK(src, PROC_REF(on_act_message), act_type, payload, state)) return FALSE switch(type) if("ready") @@ -382,3 +381,10 @@ log_tgui(user, "Fallback Triggered: [href_list["payload"]], Window: [window.id], Source: [src_object]") #endif src_object.tgui_fallback(payload) + +/// Wrapper for behavior to potentially wait until the next tick if the server is overloaded +/datum/tgui/proc/on_act_message(act_type, payload, state) + if(QDELETED(src) || QDELETED(src_object)) + return + if(src_object.tgui_act(act_type, payload, src, state)) + SStgui.update_uis(src_object) diff --git a/code/modules/tgui_input/number.dm b/code/modules/tgui_input/number.dm index da30279841..ddb7f8a195 100644 --- a/code/modules/tgui_input/number.dm +++ b/code/modules/tgui_input/number.dm @@ -136,19 +136,19 @@ data["timeout"] = CLAMP01((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS)) return data -/datum/tgui_input_number/tgui_act(action, list/params) +/datum/tgui_input_number/tgui_act(action, list/params, datum/tgui/ui) . = ..() if (.) return switch(action) if("submit") if(!isnum(params["entry"])) - CRASH("A non number was input into tgui input number by [usr]") + CRASH("A non number was input into tgui input number by [ui.user]") var/choice = round_value ? round(params["entry"]) : params["entry"] if(choice > max_value) - CRASH("A number greater than the max value was input into tgui input number by [usr]") + CRASH("A number greater than the max value was input into tgui input number by [ui.user]") if(choice < min_value) - CRASH("A number less than the min value was input into tgui input number by [usr]") + CRASH("A number less than the min value was input into tgui input number by [ui.user]") set_entry(choice) closed = TRUE SStgui.close_uis(src) diff --git a/code/modules/tgui_input/text.dm b/code/modules/tgui_input/text.dm index 5829003298..d02ef216ac 100644 --- a/code/modules/tgui_input/text.dm +++ b/code/modules/tgui_input/text.dm @@ -130,7 +130,7 @@ data["timeout"] = clamp((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS), 0, 1) return data -/datum/tgui_input_text/tgui_act(action, list/params) +/datum/tgui_input_text/tgui_act(action, list/params, datum/tgui/ui) . = ..() if (.) return @@ -138,9 +138,9 @@ if("submit") if(max_length) if(length(params["entry"]) > max_length) - CRASH("[usr] typed a text string longer than the max length") + CRASH("[ui.user] typed a text string longer than the max length") if(encode && (length(html_encode(params["entry"])) > max_length)) - to_chat(usr, span_notice("Your message was clipped due to special character usage.")) + to_chat(ui.user, span_notice("Your message was clipped due to special character usage.")) set_entry(params["entry"]) closed = TRUE SStgui.close_uis(src) diff --git a/code/modules/turbolift/turbolift_console.dm b/code/modules/turbolift/turbolift_console.dm index 038924f6f6..0693854ad4 100644 --- a/code/modules/turbolift/turbolift_console.dm +++ b/code/modules/turbolift/turbolift_console.dm @@ -174,7 +174,7 @@ return data -/obj/structure/lift/panel/tgui_act(action, params) +/obj/structure/lift/panel/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -193,7 +193,7 @@ lift.emergency_stop() if(.) - pressed(usr) + pressed(ui.user) /obj/structure/lift/panel/update_icon() if(lift.fire_mode) diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index ae486f1e3f..b568f1b319 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -609,6 +609,12 @@ forceMove(get_turf(src)) log_and_message_admins("[key_name(src)] used the OOC escape button to get out of a microwave.") + else if(istype(loc, /obj/structure/gargoyle) && loc:was_rayed) + var/obj/structure/gargoyle/G = loc + G.can_revert = TRUE + qdel(G) + log_and_message_admins("[key_name(src)] used the OOC escape button to revert back from being petrified.") + //You are in food and for some reason can't resist out else if(istype(loc, /obj/item/reagent_containers/food)) var/obj/item/reagent_containers/food/F = src.loc diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index f682673a14..3a44a1414b 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -363,7 +363,7 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", return data -/datum/vore_look/tgui_act(action, params) +/datum/vore_look/tgui_act(action, params, datum/tgui/ui) if(..()) return TRUE @@ -372,7 +372,7 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", show_pictures = !show_pictures return TRUE if("int_help") - tgui_alert(usr, "These control how your belly responds to someone using 'resist' while inside you. The percent chance to trigger each is listed below, \ + tgui_alert(ui.user, "These control how your belly responds to someone using 'resist' while inside you. The percent chance to trigger each is listed below, \ and you can change them to whatever you see fit. Setting them to 0% will disable the possibility of that interaction. \ These only function as long as interactions are turned on in general. Keep in mind, the 'belly mode' interactions (digest/absorb) \ will affect all prey in that belly, if one resists and triggers digestion/absorption. If multiple trigger at the same time, \ @@ -381,17 +381,17 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", // Host is inside someone else, and is trying to interact with something else inside that person. if("pick_from_inside") - return pick_from_inside(usr, params) + return pick_from_inside(ui.user, params) // Host is trying to interact with something in host's belly. if("pick_from_outside") - return pick_from_outside(usr, params) + return pick_from_outside(ui.user, params) if("newbelly") if(host.vore_organs.len >= BELLIES_MAX) return FALSE - var/new_name = html_encode(tgui_input_text(usr,"New belly's name:","New Belly")) + var/new_name = html_encode(tgui_input_text(ui.user,"New belly's name:","New Belly")) if(!new_name) return FALSE @@ -407,7 +407,7 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", break if(failure_msg) //Something went wrong. - tgui_alert_async(usr, failure_msg, "Error!") + tgui_alert_async(ui.user, failure_msg, "Error!") return TRUE var/obj/belly/NB = new(host) @@ -424,7 +424,7 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", if("move_belly") var/dir = text2num(params["dir"]) if(LAZYLEN(host.vore_organs) <= 1) - to_chat(usr, span_warning("You can't sort bellies with only one belly to sort...")) + to_chat(ui.user, span_warning("You can't sort bellies with only one belly to sort...")) return TRUE var/current_index = host.vore_organs.Find(host.vore_selected) @@ -435,80 +435,78 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", return TRUE if("set_attribute") - return set_attr(usr, params) + return set_attr(ui.user, params) if("saveprefs") if(isnewplayer(host)) - var/choice = tgui_alert(usr, "Warning: Saving your vore panel while in the lobby will save it to the CURRENTLY LOADED character slot, and potentially overwrite it. Are you SURE you want to overwrite your current slot with these vore bellies?", "WARNING!", list("No, abort!", "Yes, save.")) + var/choice = tgui_alert(ui.user, "Warning: Saving your vore panel while in the lobby will save it to the CURRENTLY LOADED character slot, and potentially overwrite it. Are you SURE you want to overwrite your current slot with these vore bellies?", "WARNING!", list("No, abort!", "Yes, save.")) if(choice != "Yes, save.") return TRUE else if(host.real_name != host.client.prefs.real_name || (!ishuman(host) && !issilicon(host))) - var/choice = tgui_alert(usr, "Warning: Saving your vore panel while playing what is very-likely not your normal character will overwrite whatever character you have loaded in character setup. Maybe this is your 'playing a simple mob' slot, though. Are you SURE you want to overwrite your current slot with these vore bellies?", "WARNING!", list("No, abort!", "Yes, save.")) + var/choice = tgui_alert(ui.user, "Warning: Saving your vore panel while playing what is very-likely not your normal character will overwrite whatever character you have loaded in character setup. Maybe this is your 'playing a simple mob' slot, though. Are you SURE you want to overwrite your current slot with these vore bellies?", "WARNING!", list("No, abort!", "Yes, save.")) if(choice != "Yes, save.") return TRUE if(!host.save_vore_prefs()) - tgui_alert_async(usr, "ERROR: Virgo-specific preferences failed to save!","Error") + tgui_alert_async(ui.user, "ERROR: Virgo-specific preferences failed to save!","Error") else - to_chat(usr, span_notice("Virgo-specific preferences saved!")) + to_chat(ui.user, span_notice("Virgo-specific preferences saved!")) unsaved_changes = FALSE return TRUE if("reloadprefs") - var/alert = tgui_alert(usr, "Are you sure you want to reload character slot preferences? This will remove your current vore organs and eject their contents.","Confirmation",list("Reload","Cancel")) + var/alert = tgui_alert(ui.user, "Are you sure you want to reload character slot preferences? This will remove your current vore organs and eject their contents.","Confirmation",list("Reload","Cancel")) if(alert != "Reload") return FALSE if(!host.apply_vore_prefs()) - tgui_alert_async(usr, "ERROR: Virgo-specific preferences failed to apply!","Error") + tgui_alert_async(ui.user, "ERROR: Virgo-specific preferences failed to apply!","Error") else - to_chat(usr,span_notice("Virgo-specific preferences applied from active slot!")) + to_chat(ui.user,span_notice("Virgo-specific preferences applied from active slot!")) unsaved_changes = FALSE return TRUE if("loadprefsfromslot") - var/alert = tgui_alert(usr, "Are you sure you want to load another character slot's preferences? This will remove your current vore organs and eject their contents. This will not be immediately saved to your character slot, and you will need to save manually to overwrite your current bellies and preferences.","Confirmation",list("Load","Cancel")) + var/alert = tgui_alert(ui.user, "Are you sure you want to load another character slot's preferences? This will remove your current vore organs and eject their contents. This will not be immediately saved to your character slot, and you will need to save manually to overwrite your current bellies and preferences.","Confirmation",list("Load","Cancel")) if(alert != "Load") return FALSE if(!host.load_vore_prefs_from_slot()) - tgui_alert_async(usr, "ERROR: Virgo-specific preferences failed to apply!","Error") + tgui_alert_async(ui.user, "ERROR: Virgo-specific preferences failed to apply!","Error") else - to_chat(usr,span_notice("Virgo-specific preferences applied from active slot!")) + to_chat(ui.user,span_notice("Virgo-specific preferences applied from active slot!")) unsaved_changes = TRUE return TRUE if("exportpanel") - var/mob/living/user = usr - if(!user) - to_chat(usr,span_notice("Mob undefined: [user]")) + if(!ui.user) return FALSE var/datum/vore_look/export_panel/exportPanel if(!exportPanel) - exportPanel = new(usr) + exportPanel = new(ui.user) if(!exportPanel) - to_chat(user,span_notice("Export panel undefined: [exportPanel]")) + to_chat(ui.user,span_notice("Export panel undefined: [exportPanel]")) return FALSE - exportPanel.open_export_panel(user) + exportPanel.open_export_panel(ui.user) return TRUE if("setflavor") - var/new_flavor = html_encode(tgui_input_text(usr,"What your character tastes like (400ch limit). This text will be printed to the pred after 'X tastes of...' so just put something like 'strawberries and cream':","Character Flavor",host.vore_taste)) + var/new_flavor = html_encode(tgui_input_text(ui.user,"What your character tastes like (400ch limit). This text will be printed to the pred after 'X tastes of...' so just put something like 'strawberries and cream':","Character Flavor",host.vore_taste)) if(!new_flavor) return FALSE new_flavor = readd_quotes(new_flavor) if(length(new_flavor) > FLAVOR_MAX) - tgui_alert_async(usr, "Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error!") + tgui_alert_async(ui.user, "Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error!") return FALSE host.vore_taste = new_flavor unsaved_changes = TRUE return TRUE if("setsmell") - var/new_smell = html_encode(tgui_input_text(usr,"What your character smells like (400ch limit). This text will be printed to the pred after 'X smells of...' so just put something like 'strawberries and cream':","Character Smell",host.vore_smell)) + var/new_smell = html_encode(tgui_input_text(ui.user,"What your character smells like (400ch limit). This text will be printed to the pred after 'X smells of...' so just put something like 'strawberries and cream':","Character Smell",host.vore_smell)) if(!new_smell) return FALSE new_smell = readd_quotes(new_smell) if(length(new_smell) > FLAVOR_MAX) - tgui_alert_async(usr, "Entered perfume/smell text too long. [FLAVOR_MAX] character limit.","Error!") + tgui_alert_async(ui.user, "Entered perfume/smell text too long. [FLAVOR_MAX] character limit.","Error!") return FALSE host.vore_smell = new_smell unsaved_changes = TRUE @@ -657,7 +655,7 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", unsaved_changes = TRUE return TRUE if("switch_selective_mode_pref") - host.selective_preference = tgui_input_list(usr, "What would you prefer happen to you with selective bellymode?","Selective Bellymode", list(DM_DEFAULT, DM_DIGEST, DM_ABSORB, DM_DRAIN)) + host.selective_preference = tgui_input_list(ui.user, "What would you prefer happen to you with selective bellymode?","Selective Bellymode", list(DM_DEFAULT, DM_DIGEST, DM_ABSORB, DM_DRAIN)) if(!(host.selective_preference)) host.selective_preference = DM_DEFAULT if(host.client.prefs_vr) @@ -675,11 +673,11 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", if("set_vs_color") if (istype(host, /mob/living/carbon/human)) var/mob/living/carbon/human/hhost = host - var/belly_choice = tgui_input_list(usr, "Which vore sprite are you going to edit the color of?", "Vore Sprite Color", hhost.vore_icon_bellies) - var/newcolor = input(usr, "Choose a color.", "", hhost.vore_sprite_color[belly_choice]) as color|null + var/belly_choice = tgui_input_list(ui.user, "Which vore sprite are you going to edit the color of?", "Vore Sprite Color", hhost.vore_icon_bellies) + var/newcolor = input(ui.user, "Choose a color.", "", hhost.vore_sprite_color[belly_choice]) as color|null if(newcolor) hhost.vore_sprite_color[belly_choice] = newcolor - var/multiply = tgui_input_list(usr, "Set the color to be applied multiplicatively or additively? Currently in [hhost.vore_sprite_multiply[belly_choice] ? "Multiply" : "Add"]", "Vore Sprite Color", list("Multiply", "Add")) + var/multiply = tgui_input_list(ui.user, "Set the color to be applied multiplicatively or additively? Currently in [hhost.vore_sprite_multiply[belly_choice] ? "Multiply" : "Add"]", "Vore Sprite Color", list("Multiply", "Add")) if(multiply == "Multiply") hhost.vore_sprite_multiply[belly_choice] = TRUE else if(multiply == "Add") diff --git a/code/modules/vote/vote_datum.dm b/code/modules/vote/vote_datum.dm index 9c739ada02..9a3597ae4c 100644 --- a/code/modules/vote/vote_datum.dm +++ b/code/modules/vote/vote_datum.dm @@ -117,9 +117,9 @@ return null -/datum/vote/proc/announce(start_text, var/time = vote_time/10) +/datum/vote/proc/announce(start_text, var/time = vote_time) to_chat(world, span_lightpurple("Type vote or click
here to place your vote. \ - You have [time] seconds to vote.")) + You have [time/10] seconds to vote.")) world << sound('sound/ambience/alarm4.ogg', repeat = 0, wait = 0, volume = 50, channel = 3) /datum/vote/Topic(href, list/href_list) @@ -195,6 +195,6 @@ switch(action) if("vote") if(params["target"] in choices) - voted[usr.ckey] = params["target"] + voted[ui.user.ckey] = params["target"] else - message_admins(span_warning("User [key_name_admin(usr)] spoofed a vote in the vote panel!")) + message_admins(span_warning("User [key_name_admin(ui.user)] spoofed a vote in the vote panel!")) diff --git a/code/modules/xenoarcheaology/finds/finds.dm b/code/modules/xenoarcheaology/finds/finds.dm index 2dd956bc27..8f30b0cb15 100644 --- a/code/modules/xenoarcheaology/finds/finds.dm +++ b/code/modules/xenoarcheaology/finds/finds.dm @@ -26,9 +26,32 @@ /obj/item/strangerock/New(loc, var/inside_item_type = 0) pixel_x = rand(0,16)-8 pixel_y = rand(0,8)-8 + var/d100 = rand(1,100) if(inside_item_type) - new /obj/item/archaeological_find(src, new_item_type = inside_item_type) + switch(d100) + if(51 to 100) //standard spawn logic 50% of the time + new /obj/item/archaeological_find(src, new_item_type = inside_item_type) + if(21 to 50) // 30% chance + new /obj/item/research_sample/common(src) + if(6 to 20) // 15% chance + new /obj/item/research_sample/uncommon(src) + if(1 to 5) // 5% chance + new /obj/item/research_sample/rare(src) + else //if something went wrong, somehow, generate the usual find + new /obj/item/archaeological_find(src, new_item_type = inside_item_type) + else //if this strange rock isn't set to generate a find for whatever reason, create a sample 75% of the time (this shouldn't happen unless the rock is mapped in or adminspawned) + switch(d100) + if(76 to 100) + return + if(21 to 75) + new /obj/item/research_sample/common(src) + if(6 to 20) + new /obj/item/research_sample/uncommon(src) + if(1 to 5) + new /obj/item/research_sample/rare(src) + else //if we somehow glitched + return //do nothing /obj/item/strangerock/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/pickaxe/brush)) diff --git a/code/modules/xenoarcheaology/tools/ano_device_battery.dm b/code/modules/xenoarcheaology/tools/ano_device_battery.dm index bc336d4ea7..5f40d9deb5 100644 --- a/code/modules/xenoarcheaology/tools/ano_device_battery.dm +++ b/code/modules/xenoarcheaology/tools/ano_device_battery.dm @@ -109,7 +109,7 @@ time_end = world.time + duration last_process = world.time else - to_chat(usr, span_warning("[src] is unable to start due to no anomolous power source inserted/remaining.")) + to_chat(ui.user, span_warning("[src] is unable to start due to no anomolous power source inserted/remaining.")) return TRUE if("shutdown") activated = FALSE diff --git a/code/modules/xenoarcheaology/tools/artifact_analyser.dm b/code/modules/xenoarcheaology/tools/artifact_analyser.dm index a96e1fc2e2..db713bb57a 100644 --- a/code/modules/xenoarcheaology/tools/artifact_analyser.dm +++ b/code/modules/xenoarcheaology/tools/artifact_analyser.dm @@ -58,7 +58,7 @@ if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if("scan") diff --git a/code/modules/xenoarcheaology/tools/artifact_harvester.dm b/code/modules/xenoarcheaology/tools/artifact_harvester.dm index d63d633cf0..2c4debe9f4 100644 --- a/code/modules/xenoarcheaology/tools/artifact_harvester.dm +++ b/code/modules/xenoarcheaology/tools/artifact_harvester.dm @@ -73,7 +73,7 @@ if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if("harvest") @@ -101,7 +101,7 @@ if("drainbattery") if(inserted_battery) if(inserted_battery.battery_effect && inserted_battery.stored_charge > 0) - if(tgui_alert(usr, "This action will dump all charge, safety gear is recommended before proceeding","Warning",list("Continue","Cancel")) == "Continue") + if(tgui_alert(ui.user, "This action will dump all charge, safety gear is recommended before proceeding","Warning",list("Continue","Cancel")) == "Continue") if(!inserted_battery.battery_effect.activated) inserted_battery.battery_effect.ToggleActivate(1) last_process = world.time diff --git a/code/modules/xenoarcheaology/tools/geosample_scanner.dm b/code/modules/xenoarcheaology/tools/geosample_scanner.dm index be642fdfdb..5e8065ab9b 100644 --- a/code/modules/xenoarcheaology/tools/geosample_scanner.dm +++ b/code/modules/xenoarcheaology/tools/geosample_scanner.dm @@ -64,7 +64,7 @@ to_chat(user, span_warning("You can't do that while [src] is scanning!")) else if(istype(I, /obj/item/stack/nanopaste)) - var/choice = tgui_alert(usr, "What do you want to do with the nanopaste?","Radiometric Scanner",list("Scan nanopaste","Fix seal integrity")) + var/choice = tgui_alert(user, "What do you want to do with the nanopaste?","Radiometric Scanner",list("Scan nanopaste","Fix seal integrity")) if(!choice) return if(choice == "Fix seal integrity") @@ -77,7 +77,7 @@ var/obj/item/reagent_containers/glass/G = I if(!G.is_open_container()) return - var/choice = tgui_alert(usr, "What do you want to do with the container?","Radiometric Scanner",list("Add coolant","Empty coolant","Scan container")) + var/choice = tgui_alert(user, "What do you want to do with the container?","Radiometric Scanner",list("Add coolant","Empty coolant","Scan container")) if(!choice) return if(choice == "Add coolant") @@ -164,7 +164,7 @@ if(..()) return TRUE - add_fingerprint(usr) + add_fingerprint(ui.user) switch(action) if("scanItem") if(scanning) @@ -175,11 +175,11 @@ scanner_progress = 0 scanning = 1 t_left_radspike = pick(5,10,15) - to_chat(usr, span_notice("Scan initiated.")) + to_chat(ui.user, span_notice("Scan initiated.")) else - to_chat(usr, span_warning("Could not initiate scan, seal requires replacing.")) + to_chat(ui.user, span_warning("Could not initiate scan, seal requires replacing.")) else - to_chat(usr, span_warning("Insert an item to scan.")) + to_chat(ui.user, span_warning("Insert an item to scan.")) return TRUE if("maserWavelength") diff --git a/code/modules/xenoarcheaology/tools/suspension_generator.dm b/code/modules/xenoarcheaology/tools/suspension_generator.dm index be52793006..ed19f72e26 100644 --- a/code/modules/xenoarcheaology/tools/suspension_generator.dm +++ b/code/modules/xenoarcheaology/tools/suspension_generator.dm @@ -78,13 +78,13 @@ if(anchored) activate() else - to_chat(usr, span_warning("You are unable to activate [src] until it is properly secured on the ground.")) + to_chat(ui.user, span_warning("You are unable to activate [src] until it is properly secured on the ground.")) else deactivate() return TRUE if("lock") - if(allowed(usr)) + if(allowed(ui.user)) locked = !locked return TRUE diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 4df86b72ff..97643ad7a8 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/mob/radial.dmi b/icons/mob/radial.dmi index bf14a19734..d38f1e63be 100644 Binary files a/icons/mob/radial.dmi and b/icons/mob/radial.dmi differ diff --git a/icons/obj/machines/petrification.dmi b/icons/obj/machines/petrification.dmi new file mode 100644 index 0000000000..932a461108 Binary files /dev/null and b/icons/obj/machines/petrification.dmi differ diff --git a/maps/submaps/pois_vr/debris_field/foodstand.dmm b/maps/submaps/pois_vr/debris_field/foodstand.dmm index 56891bbe75..1cd9b2041e 100644 --- a/maps/submaps/pois_vr/debris_field/foodstand.dmm +++ b/maps/submaps/pois_vr/debris_field/foodstand.dmm @@ -16,7 +16,7 @@ /obj/item/reagent_containers/food/snacks/carpmeat, /obj/item/reagent_containers/food/snacks/carpmeat, /obj/item/reagent_containers/food/snacks/carpmeat, -/turf/simulated/floor/wood, +/turf/simulated/floor/wood/airless, /area/submap/debrisfield/foodstand) "f" = ( /obj/structure/table/woodentable, @@ -24,19 +24,19 @@ /obj/item/reagent_containers/food/condiment/ketchup, /obj/item/reagent_containers/food/condiment/hotsauce, /obj/item/reagent_containers/food/condiment/soysauce, -/turf/simulated/floor/wood, +/turf/simulated/floor/wood/airless, /area/submap/debrisfield/foodstand) "g" = ( /obj/structure/table/woodentable, /obj/machinery/microwave, -/turf/simulated/floor/wood, +/turf/simulated/floor/wood/airless, /area/submap/debrisfield/foodstand) "h" = ( /obj/structure/simple_door/wood, -/turf/simulated/floor/wood, +/turf/simulated/floor/wood/airless, /area/submap/debrisfield/foodstand) "i" = ( -/turf/simulated/floor/wood, +/turf/simulated/floor/wood/airless, /area/submap/debrisfield/foodstand) "j" = ( /obj/structure/closet/crate/freezer, @@ -47,23 +47,23 @@ /obj/item/reagent_containers/food/snacks/hotdog, /obj/item/reagent_containers/food/snacks/cheeseburrito, /obj/item/reagent_containers/food/snacks/cheeseburrito, -/turf/simulated/floor/wood, +/turf/simulated/floor/wood/airless, /area/submap/debrisfield/foodstand) "k" = ( /obj/structure/table/woodentable, /obj/machinery/cash_register{ dir = 1 }, -/turf/simulated/floor/wood, +/turf/simulated/floor/wood/airless, /area/submap/debrisfield/foodstand) "l" = ( /obj/structure/table/woodentable, /obj/item/reagent_containers/food/snacks/taco, -/turf/simulated/floor/wood, +/turf/simulated/floor/wood/airless, /area/submap/debrisfield/foodstand) "m" = ( /obj/structure/table/woodentable, -/turf/simulated/floor/wood, +/turf/simulated/floor/wood/airless, /area/submap/debrisfield/foodstand) (1,1,1) = {" diff --git a/maps/submaps/pois_vr/debris_field/ship_tanker_betrayed.dmm b/maps/submaps/pois_vr/debris_field/ship_tanker_betrayed.dmm index 701ce36123..e8d723c519 100644 --- a/maps/submaps/pois_vr/debris_field/ship_tanker_betrayed.dmm +++ b/maps/submaps/pois_vr/debris_field/ship_tanker_betrayed.dmm @@ -10,11 +10,7 @@ /obj/machinery/atmospherics/pipe/simple/visible{ dir = 6 }, -/turf/simulated/floor/plating/external{ - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/floor/airless, /area/submap/debrisfield/phoron_tanker) "ar" = ( /obj/structure/window/reinforced{ @@ -29,11 +25,7 @@ /area/space) "aF" = ( /mob/living/simple_mob/humanoid/merc/melee/sword/drone/tanker_escort, -/turf/simulated/floor/plating/external{ - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/floor/airless, /area/submap/debrisfield/phoron_tanker) "ck" = ( /obj/machinery/atmospherics/pipe/simple/visible, @@ -93,12 +85,7 @@ "ht" = ( /obj/item/stack/cable_coil, /mob/living/simple_mob/humanoid/merc/melee/drone/tanker_escort, -/turf/simulated/mineral/floor/ignore_mapgen/cave{ - name = "asteroid"; - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/mineral/floor/vacuum, /area/submap/debrisfield/phoron_tanker) "hx" = ( /obj/effect/decal/cleanable/blood/oil, @@ -108,21 +95,13 @@ /area/submap/debrisfield/phoron_tanker) "ik" = ( /obj/structure/meteorite, -/turf/simulated/floor/plating/external{ - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/floor/airless, /area/submap/debrisfield/phoron_tanker) "iD" = ( /obj/machinery/atmospherics/pipe/simple/visible{ dir = 10 }, -/turf/simulated/floor/plating/external{ - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/floor/airless, /area/submap/debrisfield/phoron_tanker) "jx" = ( /turf/simulated/floor/tiled/techfloor, @@ -175,11 +154,7 @@ /obj/machinery/atmospherics/pipe/tank/phoron/full{ dir = 4 }, -/turf/simulated/floor/plating/external{ - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/floor/airless, /area/submap/debrisfield/phoron_tanker) "mP" = ( /obj/item/card/id/event/altcard/centcom, @@ -204,12 +179,7 @@ /turf/space, /area/space) "ou" = ( -/turf/simulated/mineral/floor/ignore_mapgen/cave{ - name = "asteroid"; - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/mineral/floor/vacuum, /area/submap/debrisfield/phoron_tanker) "ox" = ( /obj/machinery/door/window{ @@ -249,11 +219,7 @@ /obj/machinery/light/small/emergency/flicker{ dir = 8 }, -/turf/simulated/floor/plating/external{ - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/floor/airless, /area/submap/debrisfield/phoron_tanker) "rt" = ( /obj/structure/lattice, @@ -262,20 +228,11 @@ /area/submap/debrisfield/phoron_tanker) "sU" = ( /obj/item/broken_device, -/turf/simulated/floor/plating/external{ - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/floor/airless, /area/submap/debrisfield/phoron_tanker) "sY" = ( /obj/item/reagent_containers/food/snacks/meat, -/turf/simulated/mineral/floor/ignore_mapgen/cave{ - name = "asteroid"; - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/mineral/floor/vacuum, /area/submap/debrisfield/phoron_tanker) "ta" = ( /obj/structure/meteorite, @@ -290,11 +247,7 @@ /area/submap/debrisfield/phoron_tanker) "tw" = ( /obj/machinery/atmospherics/pipe/simple/visible, -/turf/simulated/floor/plating/external{ - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/floor/airless, /area/submap/debrisfield/phoron_tanker) "uo" = ( /obj/structure/lattice, @@ -303,12 +256,7 @@ /area/submap/debrisfield/phoron_tanker) "uF" = ( /obj/effect/decal/cleanable/blood/oil, -/turf/simulated/mineral/floor/ignore_mapgen/cave{ - name = "asteroid"; - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/mineral/floor/vacuum, /area/submap/debrisfield/phoron_tanker) "uL" = ( /obj/tether_away_spawner/debrisfield/carp, @@ -318,11 +266,7 @@ /obj/machinery/atmospherics/pipe/manifold/visible{ dir = 8 }, -/turf/simulated/floor/plating/external{ - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/floor/airless, /area/submap/debrisfield/phoron_tanker) "vs" = ( /obj/machinery/atmospherics/pipe/simple/visible{ @@ -376,11 +320,7 @@ /obj/machinery/atmospherics/pipe/manifold/visible{ dir = 4 }, -/turf/simulated/floor/plating/external{ - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/floor/airless, /area/submap/debrisfield/phoron_tanker) "zZ" = ( /obj/structure/curtain/black, @@ -426,11 +366,7 @@ /obj/machinery/atmospherics/pipe/manifold/visible{ dir = 8 }, -/turf/simulated/floor/plating/external{ - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/floor/airless, /area/submap/debrisfield/phoron_tanker) "Ex" = ( /obj/machinery/atmospherics/pipe/simple/visible{ @@ -452,11 +388,7 @@ /turf/simulated/floor/tiled/techfloor, /area/submap/debrisfield/phoron_tanker) "Fl" = ( -/turf/simulated/floor/plating/external{ - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/floor/airless, /area/submap/debrisfield/phoron_tanker) "Fv" = ( /obj/structure/lattice, @@ -484,11 +416,7 @@ /obj/machinery/light/small/emergency/flicker{ dir = 4 }, -/turf/simulated/floor/plating/external{ - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/floor/airless, /area/submap/debrisfield/phoron_tanker) "Hk" = ( /obj/structure/toilet{ @@ -515,12 +443,7 @@ /area/submap/debrisfield/phoron_tanker) "JD" = ( /obj/effect/map_effect/perma_light, -/turf/simulated/mineral/floor/ignore_mapgen/cave{ - name = "asteroid"; - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/mineral/floor/vacuum, /area/submap/debrisfield/phoron_tanker) "JG" = ( /obj/machinery/computer/shuttle, @@ -606,22 +529,13 @@ /area/submap/debrisfield/phoron_tanker) "TL" = ( /obj/effect/decal/cleanable/blood/oil/streak, -/turf/simulated/mineral/floor/ignore_mapgen/cave{ - name = "asteroid"; - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/mineral/floor/vacuum, /area/submap/debrisfield/phoron_tanker) "Uh" = ( /obj/machinery/atmospherics/pipe/tank/phoron/full{ dir = 8 }, -/turf/simulated/floor/plating/external{ - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/floor/airless, /area/submap/debrisfield/phoron_tanker) "Vl" = ( /obj/effect/map_effect/perma_light, @@ -647,12 +561,7 @@ /area/submap/debrisfield/phoron_tanker) "XW" = ( /obj/item/stack/material/steel, -/turf/simulated/mineral/floor/ignore_mapgen/cave{ - name = "asteroid"; - nitrogen = 0; - oxygen = 0; - temperature = 2.7 - }, +/turf/simulated/mineral/floor/vacuum, /area/submap/debrisfield/phoron_tanker) "Yp" = ( /obj/effect/decal/cleanable/blood/oil/streak, diff --git a/maps/submaps/shelters/shelter_2.dmm b/maps/submaps/shelters/shelter_2.dmm index 9b3a9e5023..ee95a4c268 100644 --- a/maps/submaps/shelters/shelter_2.dmm +++ b/maps/submaps/shelters/shelter_2.dmm @@ -53,7 +53,7 @@ /obj/item/storage/firstaid/toxin, /obj/item/storage/firstaid/o2, /obj/item/storage/box/survival/space, -/obj/item/clothing/gloves/watch/survival, +/obj/item/clothing/accessory/watch/survival, /obj/item/emergency_beacon, /obj/item/healthanalyzer, /obj/item/storage/pill_bottle/dice_nerd, diff --git a/maps/submaps/shelters/shelter_a.dmm b/maps/submaps/shelters/shelter_a.dmm index 489a383f64..9ab9bfadb9 100644 --- a/maps/submaps/shelters/shelter_a.dmm +++ b/maps/submaps/shelters/shelter_a.dmm @@ -74,7 +74,7 @@ starts_with = list(/obj/item/tool/prybar/red,/obj/item/clothing/glasses/goggles,/obj/item/reagent_containers/hypospray/autoinjector,/obj/item/stack/medical/bruise_pack,/obj/item/flashlight/glowstick,/obj/item/reagent_containers/food/snacks/candy/proteinbar,/obj/item/clothing/mask/breath,/obj/item/tank/emergency/oxygen/engi) }, /obj/item/storage/box/survival/space, -/obj/item/clothing/gloves/watch/survival, +/obj/item/clothing/accessory/watch/survival, /obj/item/emergency_beacon, /obj/item/extinguisher/mini, /obj/item/radio{ diff --git a/maps/submaps/space_rocks/space_rocks_stuff.dm b/maps/submaps/space_rocks/space_rocks_stuff.dm index ff0d03b854..dfa64b90ce 100644 --- a/maps/submaps/space_rocks/space_rocks_stuff.dm +++ b/maps/submaps/space_rocks/space_rocks_stuff.dm @@ -19,11 +19,13 @@ prob_fall = 40 //guard = 20 mobs_to_pick_from = list( - /mob/living/simple_mob/animal/space/bats = 10, - /mob/living/simple_mob/vore/alienanimals/space_jellyfish = 15, - /mob/living/simple_mob/vore/alienanimals/startreader = 15, - /mob/living/simple_mob/vore/alienanimals/space_ghost = 6, + /mob/living/simple_mob/vore/alienanimals/space_jellyfish = 1, + /mob/living/simple_mob/vore/alienanimals/startreader = 3, + /mob/living/simple_mob/vore/alienanimals/space_ghost = 2, /mob/living/simple_mob/vore/oregrub = 1, + /mob/living/simple_mob/animal/space/ray = 10, + /mob/living/simple_mob/animal/space/bats = 10, + /mob/living/simple_mob/animal/space/gnat = 15, /mob/living/simple_mob/animal/space/carp = 3, /mob/living/simple_mob/animal/space/carp/large = 1, /mob/living/simple_mob/animal/space/carp/large/huge = 1 diff --git a/maps/submaps/surface_submaps/plains/drgnplateu.dmm b/maps/submaps/surface_submaps/plains/drgnplateu.dmm index f46b33bec0..feb8686d44 100644 --- a/maps/submaps/surface_submaps/plains/drgnplateu.dmm +++ b/maps/submaps/surface_submaps/plains/drgnplateu.dmm @@ -41,7 +41,7 @@ /obj/structure/flora/grass/green{ pixel_x = -8 }, -/obj/item/clothing/gloves/ring/material/gold, +/obj/item/clothing/accessory/ring/material/gold, /obj/item/clothing/ears/earring/stud/gold, /obj/item/gun/projectile/deagle/gold{ pixel_x = -11; diff --git a/maps/submaps/surface_submaps/plains/lonehome.dmm b/maps/submaps/surface_submaps/plains/lonehome.dmm index bc8e1979c5..9e71ca016a 100644 --- a/maps/submaps/surface_submaps/plains/lonehome.dmm +++ b/maps/submaps/surface_submaps/plains/lonehome.dmm @@ -32,7 +32,7 @@ "kT" = (/obj/machinery/light/small{dir = 1},/obj/structure/bed/padded,/obj/item/book/custom_library/fiction/truelovehathmyheart,/obj/item/bedsheet/clown,/turf/simulated/floor/wood,/area/submap/lonehome) "kU" = (/obj/item/chainsaw,/obj/item/storage/box/lights/mixed,/obj/item/extinguisher,/obj/item/storage/toolbox/mechanical,/obj/structure/table/rack,/turf/simulated/floor,/area/submap/lonehome) "ld" = (/obj/machinery/power/port_gen/pacman,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/submap/lonehome) -"lz" = (/obj/item/reagent_containers/glass/rag,/obj/item/clothing/gloves/ring/engagement,/obj/structure/table/wooden_reinforced,/turf/simulated/floor/wood,/area/submap/lonehome) +"lz" = (/obj/item/reagent_containers/glass/rag,/obj/item/clothing/accessory/ring/engagement,/obj/structure/table/wooden_reinforced,/turf/simulated/floor/wood,/area/submap/lonehome) "lB" = (/obj/machinery/button/windowtint{id = "h_kitchen"},/obj/item/trash/plate,/obj/structure/table/sifwooden_reinforced,/obj/structure/window/reinforced/polarized{dir = 4; id = "h_kitchen"},/turf/simulated/floor/wood,/area/submap/lonehome) "lJ" = (/obj/item/tape,/obj/structure/table/wooden_reinforced,/turf/simulated/floor/wood,/area/submap/lonehome) "lS" = (/obj/item/organ/internal/liver,/obj/random/trash,/turf/simulated/floor,/area/submap/lonehome) diff --git a/maps/submaps/surface_submaps/plains/lonehome_vr.dmm b/maps/submaps/surface_submaps/plains/lonehome_vr.dmm index cabcd7f61d..a70a82f603 100644 --- a/maps/submaps/surface_submaps/plains/lonehome_vr.dmm +++ b/maps/submaps/surface_submaps/plains/lonehome_vr.dmm @@ -554,7 +554,7 @@ /area/submap/lonehome) "bG" = ( /obj/item/reagent_containers/glass/rag, -/obj/item/clothing/gloves/ring/engagement, +/obj/item/clothing/accessory/ring/engagement, /obj/structure/table/wooden_reinforced, /turf/simulated/floor/wood/virgo3b, /area/submap/lonehome) diff --git a/maps/submaps/surface_submaps/plains/oldhotel.dmm b/maps/submaps/surface_submaps/plains/oldhotel.dmm index f195022b43..4d0a583af9 100644 --- a/maps/submaps/surface_submaps/plains/oldhotel.dmm +++ b/maps/submaps/surface_submaps/plains/oldhotel.dmm @@ -1,8 +1,4 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ai" = ( -/obj/random/trash, -/turf/simulated/floor/carpet/purcarpet, -/area/submap/oldhotel) "aJ" = ( /obj/item/towel/random, /obj/item/towel/random, @@ -104,11 +100,6 @@ /obj/item/trash/tray, /turf/simulated/floor/wood/virgo3b, /area/submap/oldhotel) -"ja" = ( -/obj/effect/decal/cleanable/dirt, -/obj/random/junk, -/turf/simulated/floor/carpet/purcarpet, -/area/submap/oldhotel) "je" = ( /obj/structure/closet/cabinet, /obj/item/binoculars/spyglass, @@ -342,7 +333,7 @@ /area/submap/oldhotel) "yM" = ( /obj/item/stack/cable_coil, -/turf/simulated/floor/carpet/purcarpet, +/turf/simulated/floor/carpet/sblucarpet/virgo3b, /area/submap/oldhotel) "zs" = ( /obj/effect/decal/cleanable/dirt, @@ -579,9 +570,6 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/tiled/old_tile/white/virgo3b, /area/submap/oldhotel) -"SG" = ( -/turf/simulated/floor/carpet/purcarpet, -/area/submap/oldhotel) "SL" = ( /obj/item/material/shard, /obj/item/material/shard, @@ -846,8 +834,8 @@ Vj SZ hQ RM -ai -ja +ES +cZ TU hQ RM @@ -873,7 +861,7 @@ cZ SZ hQ TU -SG +Vj yM Wy ZG diff --git a/maps/~map_system/_map_selection.dm b/maps/~map_system/_map_selection.dm index 879f058f54..47ff0d984d 100644 --- a/maps/~map_system/_map_selection.dm +++ b/maps/~map_system/_map_selection.dm @@ -5,8 +5,8 @@ /* FOR LIVE SERVER */ /*********************/ -#define USE_MAP_TETHER -//#define USE_MAP_STELLARDELIGHT +//#define USE_MAP_TETHER +#define USE_MAP_STELLARDELIGHT //#define USE_MAP_GROUNDBASE // Debug diff --git a/tgui/packages/tgui/interfaces/AppearanceChanger/AppearanceChangerBody.tsx b/tgui/packages/tgui/interfaces/AppearanceChanger/AppearanceChangerBody.tsx index 68bb73dfcc..9909232b02 100644 --- a/tgui/packages/tgui/interfaces/AppearanceChanger/AppearanceChangerBody.tsx +++ b/tgui/packages/tgui/interfaces/AppearanceChanger/AppearanceChangerBody.tsx @@ -66,7 +66,7 @@ export const AppearanceChangerEars = (props) => { const { ear_style, ear_styles } = data; return ( - +
+ } + > + + + + {!!show_selected_option && ( + + + + )} {
+ {
{general.skills || 'No data found.'} + {
{general.comments && general.comments.length === 0 ? ( diff --git a/tgui/packages/tgui/interfaces/MedicalRecords/MedicalRecordsOptions.tsx b/tgui/packages/tgui/interfaces/MedicalRecords/MedicalRecordsOptions.tsx index 757e79b7cd..a711cdf931 100644 --- a/tgui/packages/tgui/interfaces/MedicalRecords/MedicalRecordsOptions.tsx +++ b/tgui/packages/tgui/interfaces/MedicalRecords/MedicalRecordsOptions.tsx @@ -36,6 +36,14 @@ export const MedicalRecordsView = (props) => {
+ { {field.value} - - - - } - > - - {items.map((item) => ( - - {item.amt} {item.extra} - - ))} - -
- )) || ( -
- {config.title} is empty. -
- )} - + + {inner} ); }; + +const MicrowaveContents = (props) => { + const { act, data } = useBackend(); + + const { items, reagents, recipe, recipe_name } = data; + + return ( +
+ + + + } + > + + + + {items.map((item) => ( + + + + x{item.amt} + + + + + ))} + {reagents.map((r) => ( + + + + {r.amt} + + {/* To be clear: This is fucking cursed + We're directly loading the rectangular glass and + manually colorizing a div that's set to be the right shape */} + + + + + ))} + + + + + + + + + {recipe ? ( + + ) : ( + + )} + + + + +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/PetrificationInterface.tsx b/tgui/packages/tgui/interfaces/PetrificationInterface.tsx new file mode 100644 index 0000000000..7d0bdea52a --- /dev/null +++ b/tgui/packages/tgui/interfaces/PetrificationInterface.tsx @@ -0,0 +1,148 @@ +import { BooleanLike } from 'common/react'; +import { useBackend } from 'tgui/backend'; +import { Button, LabeledList, Section } from 'tgui/components'; +import { Window } from 'tgui/layouts'; + +type Data = { + material: string; + identifier: string; + adjective: string; + tint: string; + t: BooleanLike; + target: string; + able_to_unpetrify: BooleanLike; + discard_clothes: BooleanLike; + can_remote: BooleanLike; +}; + +export const PetrificationInterface = (props) => { + const { act, data } = useBackend(); + + const { + material, + identifier, + adjective, + tint, + t, + able_to_unpetrify, + discard_clothes, + target, + can_remote, + } = data; + + return ( + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/SecurityRecords/SecurityRecordsOptions.tsx b/tgui/packages/tgui/interfaces/SecurityRecords/SecurityRecordsOptions.tsx index 276ad42d1a..03e2530eb2 100644 --- a/tgui/packages/tgui/interfaces/SecurityRecords/SecurityRecordsOptions.tsx +++ b/tgui/packages/tgui/interfaces/SecurityRecords/SecurityRecordsOptions.tsx @@ -35,6 +35,14 @@ export const SecurityRecordsView = (props) => {
+ { {field.value} -