From 975d3d47ae99d06d832096421104ea9e8b3e4649 Mon Sep 17 00:00:00 2001
From: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
Date: Tue, 7 Oct 2025 18:42:17 +0200
Subject: [PATCH] Fixes certain broken icons in the outfit editor, stripping
menu and multiple others (#93319)
## About The Pull Request
``icon2base64`` does not like animated icons and will display an atlas
in TGUI when one is passed into it
Additionally added some padding between the icon and the slot name in
the outfit editor because it annoyed me
## Changelog
:cl:
fix: Fixed certain broken icons in the outfit editor, stripping menu and
multiple others
/:cl:
---
code/__HELPERS/icons.dm | 4 ++--
code/datums/elements/strippable.dm | 2 +-
code/modules/admin/outfit_editor.dm | 6 ++++--
code/modules/admin/verbs/selectequipment.dm | 4 +++-
code/modules/fishing/fishing_rod.dm | 6 +++---
code/modules/mob/living/basic/lavaland/raptor/raptor_dex.dm | 4 ++--
code/modules/mob/living/basic/minebots/minebot.dm | 2 +-
code/modules/mob/living/basic/pets/pet_designer.dm | 2 +-
tgui/packages/tgui/interfaces/OutfitEditor.jsx | 2 +-
9 files changed, 18 insertions(+), 14 deletions(-)
diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm
index 7f08afd0704..ac67848447a 100644
--- a/code/__HELPERS/icons.dm
+++ b/code/__HELPERS/icons.dm
@@ -753,7 +753,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types)
/// # If you already have a human and need to get its flat icon, call `get_flat_existing_human_icon()` instead.
/// For creating consistent icons for human looking simple animals.
-/proc/get_flat_human_icon(icon_id, datum/job/job, datum/preferences/prefs, dummy_key, showDirs = GLOB.cardinals, outfit_override = null)
+/proc/get_flat_human_icon(icon_id, datum/job/job, datum/preferences/prefs, dummy_key, showDirs = GLOB.cardinals, outfit_override = null, no_anim = FALSE)
var/static/list/humanoid_icon_cache = list()
if(icon_id && humanoid_icon_cache[icon_id])
return humanoid_icon_cache[icon_id]
@@ -771,7 +771,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types)
var/icon/out_icon = icon('icons/effects/effects.dmi', "nothing")
for(var/direction in showDirs)
- var/icon/partial = getFlatIcon(body, defdir = direction)
+ var/icon/partial = getFlatIcon(body, defdir = direction, no_anim = no_anim)
out_icon.Insert(partial, dir = direction)
humanoid_icon_cache[icon_id] = out_icon
diff --git a/code/datums/elements/strippable.dm b/code/datums/elements/strippable.dm
index 55c0fa2d7c7..c6212b4936f 100644
--- a/code/datums/elements/strippable.dm
+++ b/code/datums/elements/strippable.dm
@@ -378,7 +378,7 @@
LAZYINITLIST(result)
- result["icon"] = icon2base64(icon(item.icon, item.icon_state))
+ result["icon"] = icon2base64(icon(item.icon, item.icon_state, frame = 1))
result["name"] = item.name
var/list/alt_actions = item_data.get_alternate_actions(owner, user, item)
result["alternate"] = length(alt_actions) ? alt_actions : null
diff --git a/code/modules/admin/outfit_editor.dm b/code/modules/admin/outfit_editor.dm
index 765fbb9999d..7a8b4f60cca 100644
--- a/code/modules/admin/outfit_editor.dm
+++ b/code/modules/admin/outfit_editor.dm
@@ -55,7 +55,7 @@
"name" = initial(item.name),
"desc" = initial(item.desc),
// at this point initializing the item is probably faster tbh
- "sprite" = icon2base64(icon(initial(item.icon), initial(item.icon_state))),
+ "sprite" = icon2base64(icon(initial(item.icon), initial(item.icon_state), frame = 1)),
)
return data
@@ -78,7 +78,9 @@
var/icon/dummysprite = get_flat_human_icon(null,
dummy_key = dummy_key,
showDirs = list(SOUTH),
- outfit_override = drip)
+ outfit_override = drip,
+ no_anim = TRUE,
+ )
data["dummy64"] = icon2base64(dummysprite)
return data
diff --git a/code/modules/admin/verbs/selectequipment.dm b/code/modules/admin/verbs/selectequipment.dm
index 7586726c48e..5731702e6ca 100644
--- a/code/modules/admin/verbs/selectequipment.dm
+++ b/code/modules/admin/verbs/selectequipment.dm
@@ -107,7 +107,9 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(select_equipment, R_FUN, "Select Equipment", mob/ta
var/icon/dummysprite = get_flat_human_icon(null,
dummy_key = dummy_key,
- outfit_override = selected_outfit)
+ outfit_override = selected_outfit,
+ no_anim = TRUE,
+ )
data["icon64"] = icon2base64(dummysprite)
data["name"] = target_mob
diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm
index ce71a616831..907cf0f5908 100644
--- a/code/modules/fishing/fishing_rod.dm
+++ b/code/modules/fishing/fishing_rod.dm
@@ -543,13 +543,13 @@
var/list/data = list()
data["bait_name"] = format_text(bait?.name)
- data["bait_icon"] = bait != null ? icon2base64(icon(bait.icon, bait.icon_state)) : null
+ data["bait_icon"] = bait != null ? icon2base64(icon(bait.icon, bait.icon_state, frame = 1)) : null
data["line_name"] = format_text(line?.name)
- data["line_icon"] = line != null ? icon2base64(icon(line.icon, line.icon_state)) : null
+ data["line_icon"] = line != null ? icon2base64(icon(line.icon, line.icon_state, frame = 1)) : null
data["hook_name"] = format_text(hook?.name)
- data["hook_icon"] = hook != null ? icon2base64(icon(hook.icon, hook.icon_state)) : null
+ data["hook_icon"] = hook != null ? icon2base64(icon(hook.icon, hook.icon_state, frame = 1)) : null
data["busy"] = fishing_line
diff --git a/code/modules/mob/living/basic/lavaland/raptor/raptor_dex.dm b/code/modules/mob/living/basic/lavaland/raptor/raptor_dex.dm
index cd1439b3c5f..e7224e29d87 100644
--- a/code/modules/mob/living/basic/lavaland/raptor/raptor_dex.dm
+++ b/code/modules/mob/living/basic/lavaland/raptor/raptor_dex.dm
@@ -21,7 +21,7 @@
var/list/data = list()
var/mob/living/basic/raptor/my_raptor = raptor.resolve()
- data["raptor_image"] = icon2base64(getFlatIcon(image(icon = my_raptor.icon, icon_state = my_raptor.icon_state)))
+ data["raptor_image"] = icon2base64(icon(icon = my_raptor.icon, icon_state = my_raptor.icon_state, frame = 1))
data["raptor_attack"] = my_raptor.melee_damage_lower
data["raptor_health"] = my_raptor.maxHealth
data["raptor_speed"] = my_raptor.speed
@@ -33,7 +33,7 @@
var/obj/effect/overlay/happiness_overlay/display = new
display.set_hearts(happiness_percentage)
display.pixel_y = ICON_SIZE_Y * 0.5
- data["raptor_happiness"] = icon2base64(getFlatIcon(display))
+ data["raptor_happiness"] = icon2base64(getFlatIcon(display, no_anim = TRUE))
qdel(display)
var/datum/raptor_inheritance/inherit = my_raptor.inherited_stats
diff --git a/code/modules/mob/living/basic/minebots/minebot.dm b/code/modules/mob/living/basic/minebots/minebot.dm
index 33271e7dec8..4501d83caae 100644
--- a/code/modules/mob/living/basic/minebots/minebot.dm
+++ b/code/modules/mob/living/basic/minebots/minebot.dm
@@ -165,7 +165,7 @@
/mob/living/basic/mining_drone/ui_static_data(mob/user)
var/list/data = list()
- data["bot_icon"] = icon2base64(getFlatIcon(src))
+ data["bot_icon"] = icon2base64(getFlatIcon(src, no_anim = TRUE))
data["possible_colors"] = list()
for(var/color in possible_colors)
data["possible_colors"] += list(list(
diff --git a/code/modules/mob/living/basic/pets/pet_designer.dm b/code/modules/mob/living/basic/pets/pet_designer.dm
index 988fee66038..dd2096ec36b 100644
--- a/code/modules/mob/living/basic/pets/pet_designer.dm
+++ b/code/modules/mob/living/basic/pets/pet_designer.dm
@@ -81,7 +81,7 @@ GLOBAL_LIST_INIT(pet_options, list(
for(var/color in possible_colors)
demo_carrier.set_greyscale(possible_colors[color])
- list_to_return[color] = icon2base64(getFlatIcon(demo_carrier))
+ list_to_return[color] = icon2base64(getFlatIcon(demo_carrier, no_anim = TRUE))
qdel(demo_carrier)
return list_to_return
diff --git a/tgui/packages/tgui/interfaces/OutfitEditor.jsx b/tgui/packages/tgui/interfaces/OutfitEditor.jsx
index 5bacf9e4adc..003c623b69c 100644
--- a/tgui/packages/tgui/interfaces/OutfitEditor.jsx
+++ b/tgui/packages/tgui/interfaces/OutfitEditor.jsx
@@ -131,7 +131,7 @@ const OutfitSlot = (props) => {
// todo: intuitive way to clear items
onClick={(e) => act(e.ctrlKey ? 'ctrlClick' : 'click', { slot })}
>
-
+
{name}