diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm
index d543b8b12a4..1fd274251b4 100644
--- a/code/_onclick/hud/movable_screen_objects.dm
+++ b/code/_onclick/hud/movable_screen_objects.dm
@@ -45,9 +45,9 @@
screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]"
/obj/screen/movable/proc/encode_screen_X(X)
- if(X > usr.client.view+1)
- . = "EAST-[usr.client.view*2 + 1-X]"
- else if(X < usr.client.view+1)
+ if(X > usr?.client?.view+1)
+ . = "EAST-[usr?.client?.view*2 + 1-X]"
+ else if(X < usr?.client?.view+1)
. = "WEST+[X-1]"
else
. = "CENTER"
@@ -58,19 +58,19 @@
var/num = text2num(copytext(X,6)) //Trim EAST-
if(!num)
num = 0
- . = usr.client.view*2 + 1 - num
+ . = usr?.client?.view*2 + 1 - num
else if(findtext(X,"WEST+"))
var/num = text2num(copytext(X,6)) //Trim WEST+
if(!num)
num = 0
. = num+1
else if(findtext(X,"CENTER"))
- . = usr.client.view+1
+ . = usr?.client?.view+1
/obj/screen/movable/proc/encode_screen_Y(Y)
- if(Y > usr.client.view+1)
- . = "NORTH-[usr.client.view*2 + 1-Y]"
- else if(Y < usr.client.view+1)
+ if(Y > usr?.client?.view+1)
+ . = "NORTH-[usr?.client?.view*2 + 1-Y]"
+ else if(Y < usr?.client?.view+1)
. = "SOUTH+[Y-1]"
else
. = "CENTER"
@@ -80,14 +80,14 @@
var/num = text2num(copytext(Y,7)) //Trim NORTH-
if(!num)
num = 0
- . = usr.client.view*2 + 1 - num
+ . = usr?.client?.view*2 + 1 - num
else if(findtext(Y,"SOUTH+"))
var/num = text2num(copytext(Y,7)) //Time SOUTH+
if(!num)
num = 0
. = num+1
else if(findtext(Y,"CENTER"))
- . = usr.client.view+1
+ . = usr?.client?.view+1
//Debug procs
/client/proc/test_movable_UI()
diff --git a/code/modules/mob/abstract/observer/observer.dm b/code/modules/mob/abstract/observer/observer.dm
index 7152c8db856..0711e9fa88c 100644
--- a/code/modules/mob/abstract/observer/observer.dm
+++ b/code/modules/mob/abstract/observer/observer.dm
@@ -612,7 +612,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/abstract/observer/pointed(atom/A as mob|obj|turf in view())
if(!..())
return 0
- usr.visible_message("[src] points to [A]")
+ src.visible_message("[src] points to [A]")
return 1
/mob/abstract/observer/proc/manifest(mob/user)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index c4e2d6461f4..50cd5c93c9e 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1506,7 +1506,7 @@
else if(HAS_TRAIT(src, TRAIT_PSIONICALLY_DEAF))
REMOVE_TRAIT(src, TRAIT_PSIONICALLY_DEAF, INNATE_TRAIT)
- if(species.character_creation_psi_points && species.has_psionics)
+ if(psi && species.character_creation_psi_points && species.has_psionics)
psi.psi_points = max(species.character_creation_psi_points - psi.spent_psi_points, 0) //to prevent species-switching for more points
if(client)
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index a9aeeb8979b..6ca8fafbeed 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -40,7 +40,7 @@ This saves us from having to call add_fingerprint() any time something is put in
/mob/living/carbon/human/proc/has_organ(name)
- var/obj/item/organ/external/O = organs_by_name[name]
+ var/obj/item/organ/external/O = organs_by_name?[name]
return (O && !O.is_stump())
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index f89ab7d18bf..f0acd9baeba 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -326,7 +326,7 @@
to_chat(src, SPAN_WARNING("Custom Sprite Sheet does not contain a valid icon_state for [sprite.synthicon]-[mod_type]"))
else
icontype = module_sprites[1]
- icon_state = module_sprites[icontype][ROBOT_CHASSIS]
+ icon_state = module_sprites?[icontype]?[ROBOT_CHASSIS]
return module_sprites
/mob/living/silicon/robot/proc/pick_module(var/set_module)
@@ -1118,8 +1118,8 @@
if(!icontype)
return
- icon_state = module_sprites[icontype][ROBOT_CHASSIS]
- if(!module_sprites[icontype][ROBOT_ICON])
+ icon_state = module_sprites?[icontype]?[ROBOT_CHASSIS]
+ if(!module_sprites?[icontype]?[ROBOT_ICON])
icon = initial(icon)
icon_selected = TRUE
diff --git a/code/modules/mob/living/silicon/robot/robot_helpers.dm b/code/modules/mob/living/silicon/robot/robot_helpers.dm
index 330f08feeea..c8b4d367432 100644
--- a/code/modules/mob/living/silicon/robot/robot_helpers.dm
+++ b/code/modules/mob/living/silicon/robot/robot_helpers.dm
@@ -29,7 +29,7 @@
setup_panel_cache()
/mob/living/silicon/robot/proc/setup_eye_cache()
- if(!module_sprites[icontype][ROBOT_EYES])
+ if(!module_sprites?[icontype]?[ROBOT_EYES])
return
var/eye_layer = src.layer
if(lights_on && layer == MOB_LAYER) // in case you're hiding. so eyes don't go through tables.
@@ -53,7 +53,7 @@
/mob/living/silicon/robot/proc/setup_panel_cache()
if(!length(module_sprites))
return
- if(!module_sprites[icontype][ROBOT_PANEL])
+ if(!module_sprites?[icontype]?[ROBOT_PANEL])
return
var/panelprefix = custom_sprite ? src.ckey : module_sprites[icontype][ROBOT_PANEL] // Shoutout to Geeves.
cached_panel_overlays = list(
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 60f1a92409f..37d125f409a 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -97,7 +97,8 @@
to_chat(user, "You [anchored ? "attach" : "detach"] the [src] [anchored ? "to" : "from"] the ground")
playsound(src.loc, attacking_item.usesound, 75, 1)
- ui = SStgui.try_update_ui(user, src, ui)
+ if(ui?.user)
+ ui = SStgui.try_update_ui(user, src, ui)
/obj/machinery/chem_master/ui_interact(mob/user, datum/tgui/ui)
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index 7974271607a..788526b9bb9 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -87,7 +87,7 @@
reagents.apply_force(speed)
/obj/item/reagent_containers/proc/shatter(var/obj/item/W, var/mob/user)
- if(reagents.total_volume)
+ if(reagents?.total_volume)
reagents.splash(src.loc, reagents.total_volume) // splashes the mob holding it or the turf it's on
audible_message(SPAN_WARNING("\The [src] shatters with a resounding crash!"), SPAN_WARNING("\The [src] breaks."))
playsound(src, shatter_sound, 70, 1)
diff --git a/html/changelogs/fluffyghost-runtimehunt.yml b/html/changelogs/fluffyghost-runtimehunt.yml
new file mode 100644
index 00000000000..95fcd4eb79f
--- /dev/null
+++ b/html/changelogs/fluffyghost-runtimehunt.yml
@@ -0,0 +1,41 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+# balance
+# admin
+# backend
+# security
+# refactor
+#################################
+
+# Your name.
+author: FluffyGhost
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - bugfix: "Miscellaneous runtimes bugfixes."