diff --git a/code/__HELPERS/custom_holoforms.dm b/code/__HELPERS/custom_holoforms.dm
index 4e6fb8ab49..90094bd42c 100644
--- a/code/__HELPERS/custom_holoforms.dm
+++ b/code/__HELPERS/custom_holoforms.dm
@@ -1,13 +1,13 @@
// Generates a holoform appearance
// Equipment list is slot = path.
-/proc/generate_custom_holoform_from_prefs(datum/preferences/prefs, list/equipment_by_slot, list/inhand_equipment, copy_job_first = FALSE)
+/proc/generate_custom_holoform_from_prefs(datum/preferences/prefs, list/equipment_by_slot, list/inhand_equipment, copy_job_first = FALSE, debug)
ASSERT(prefs)
var/mob/living/carbon/human/dummy/mannequin = generate_or_wait_for_human_dummy(DUMMY_HUMAN_SLOT_HOLOFORM)
prefs.copy_to(mannequin)
if(copy_job_first)
var/datum/job/highest = prefs.get_highest_job()
if(highest && !istype(highest, /datum/job/ai) && !istype(highest, /datum/job/cyborg))
- highest.equip(mannequin, TRUE, preference_source = prefs)
+ highest.equip(mannequin, TRUE, preference_source = prefs.parent)
if(length(equipment_by_slot))
for(var/slot in equipment_by_slot)
@@ -17,26 +17,40 @@
for(var/path in inhand_equipment)
var/obj/item/I = new path
mannequin.equip_to_slot_if_possible(I, SLOT_HANDS, TRUE, TRUE, TRUE, TRUE)
- var/icon/result = getFlatIcon(mannequin)
- unset_busy_human_dummy(DUMMY_HUMAN_SLOT_HOLOFORM)
+
+ COMPILE_OVERLAYS(mannequin)
+ mannequin.setDir(NORTH)
+ var/icon/north = getFlatIcon(mannequin)
+ mannequin.setDir(SOUTH)
+ var/icon/south = getFlatIcon(mannequin)
+ mannequin.setDir(EAST)
+ var/icon/east = getFlatIcon(mannequin)
+ mannequin.setDir(WEST)
+ var/icon/west = getFlatIcon(mannequin)
+
+ var/icon/
+
+ if(!debug)
+ unset_busy_human_dummy(DUMMY_HUMAN_SLOT_HOLOFORM)
return result
/proc/process_holoform_icon_filter(icon/I, filter_type)
switch(filter_type)
if(HOLOFORM_FILTER_AI)
- I = getHologramIcon(I)
+ I = getHologramIcon(I, FALSE)
if(HOLOFORM_FILTER_STATIC)
- I = getStaticIcon(I)
+ I = getStaticIcon(I, FALSE)
if(HOLOFORM_FILTER_PAI)
- I = getPAIHologramIcon(I)
+ I = getPAIHologramIcon(I, FALSE)
return I
//Errors go to user.
-/proc/generate_custom_holoform_from_prefs_safe(datum/preferences/prefs, mob/user)
+/proc/generate_custom_holoform_from_prefs_safe(datum/preferences/prefs, mob/user, debug = FALSE)
if(user)
- if(user.client.prefs.last_custom_holoform < world.time + CUSTOM_HOLOFORM_DELAY)
+ if(user.client.prefs.last_custom_holoform > world.time - CUSTOM_HOLOFORM_DELAY)
+ to_chat(user, "You are attempting to set your custom holoform too fast!")
return
- return generate_custom_holoform_from_prefs(prefs, null, null, TRUE)
+ return generate_custom_holoform_from_prefs(prefs, null, null, TRUE, debug)
//Prompts this client for custom holoform parameters.
/proc/user_interface_custom_holoform(client/C)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 3865ab39db..93878226b0 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -22,6 +22,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/last_id
var/icon/custom_holoform_icon
+ var/list/cached_holoform_icons
var/last_custom_holoform = 0
//Cooldowns for saving/loading. These are four are all separate due to loading code calling these one after another
@@ -2363,3 +2364,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
return
else
custom_names[name_id] = sanitized_name
+
+/datum/preferences/proc/get_filtered_holoform(filter_type)
+ if(!custom_holoform_icon)
+ return
+ LAZYINITLIST(cached_holoform_icons)
+ if(!cached_holoform_icons[filter_type])
+ cached_holoform_icons[filter_type] = process_holoform_icon_filter(custom_holoform_icon, filter_type)
+ return cached_holoform_icons[filter_type]
diff --git a/code/modules/client/verbs/custom_holoform.dm b/code/modules/client/verbs/custom_holoform.dm
index 4049d5ff96..b32ed0f1dd 100644
--- a/code/modules/client/verbs/custom_holoform.dm
+++ b/code/modules/client/verbs/custom_holoform.dm
@@ -3,16 +3,18 @@
set desc = "Clear your current custom holoform"
prefs?.custom_holoform_icon = null
+ prefs?.cached_holoform_icons = null
to_chat(src, "Holoform removed.")
/client/verb/set_custom_holoform()
set name = "Set Custom Holoform"
set desc = "Set your custom holoform using your current preferences slot and a specified set of gear."
- if(prefs.last_custom_holoform < world.time + CUSTOM_HOLOFORM_DELAY)
+ if(prefs.last_custom_holoform > world.time - CUSTOM_HOLOFORM_DELAY)
to_chat(src, "You are attempting to change custom holoforms too fast!")
var/icon/new_holoform = user_interface_custom_holoform(src)
if(new_holoform)
prefs.custom_holoform_icon = new_holoform
+ prefs.cached_holoform_icons = null
prefs.last_custom_holoform = world.time
to_chat(src, "Holoform set.")
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 356907aa64..732a4d5cca 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -691,9 +691,9 @@
switch(input)
if("custom")
if(client?.prefs?.custom_holoform_icon)
- holo_icon = client.prefs.custom_holoform_icon
+ holo_icon = client.prefs.get_filtered_holoform(HOLOFORM_FILTER_AI)
else
- holo_icon = getHologramIcon(icon("female", 'icons/mob/ai.dmi'))
+ holo_icon = getHologramIcon(icon('icons/mob/ai.dmi', "female"))
else if("xeno queen")
holo_icon = getHologramIcon(icon(icon_list[input],"alienq"))
else
diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm
index 88a357e07f..ede6fedaaf 100644
--- a/code/modules/mob/living/silicon/pai/pai_shell.dm
+++ b/code/modules/mob/living/silicon/pai/pai_shell.dm
@@ -82,9 +82,7 @@
if(!choice)
return FALSE
chassis = choice
- icon_state = "[chassis]"
- if(resting)
- icon_state = "[chassis]_rest"
+ update_icon()
to_chat(src, "You switch your holochassis projection composite to [chassis]")
/mob/living/silicon/pai/lay_down()
diff --git a/code/modules/mob/living/silicon/pai/update_icon.dm b/code/modules/mob/living/silicon/pai/update_icon.dm
index 0234850ea7..d18712dfc9 100644
--- a/code/modules/mob/living/silicon/pai/update_icon.dm
+++ b/code/modules/mob/living/silicon/pai/update_icon.dm
@@ -1,7 +1,10 @@
/mob/living/silicon/pai/proc/update_icon()
- if((chassis == "custom") && !custom_holoform_icon)
- chassis = pick(possible_chassis - "custom")
+ if(chassis == "custom")
+ custom_holoform_icon = client?.prefs?.get_filtered_holoform(HOLOFORM_FILTER_PAI)
+ if(!custom_holoform_icon)
+ chassis = pick(possible_chassis - "custom")
if(chassis != "custom")
+ icon = initial(icon)
icon_state = "[chassis]_[resting]"
else
icon = custom_holoform_icon