Fixes greyscale colors not updating when changing their colors via VV, and fixes some issues with accessories (#77806)

## About The Pull Request

Fixes https://github.com/Skyrat-SS13/Skyrat-tg/issues/23214

This fixes a few bugs and cleans up code a bit:

1) Greyscale colors that were changed via the VV modify greyscale menu
will now update the mob's worn clothing accordingly. It wasn't doing
this before. Accessories in particular needed a bit of extra work to
update in this way because it wasn't coded with this case in mind.

2) Accessories will call `equipped()` and `dropped()` when they get
added/removed. This will fix issues like item flags being incorrectly
set, action bars not being added, etc.

3) Accessories will now be returned by `get_all_gear()`. This will
probably fix a few issues I'm not aware of.

## Why It's Good For The Game

<details><summary>Works</summary>


![dreamseeker_xijzQB0ALa](https://github.com/tgstation/tgstation/assets/13398309/eccb35d5-e1ea-4e2c-9906-f5b8c2187d24)

</details>

<details><summary>get_all_gear()</summary>


![dreamseeker_WsG0Uu2tIe](https://github.com/tgstation/tgstation/assets/13398309/d5c272d4-1990-454c-b48f-4da7b6a5f859)

</details>

<details><summary>get_equipped_items()</summary>


![dreamseeker_qe4hMngAO3](https://github.com/tgstation/tgstation/assets/13398309/06469b93-2a58-49db-be7f-c748576bf481)

</details>


<details><summary>item_flags get set now, hopefully preventing future
issues related to that</summary>


![image](https://github.com/tgstation/tgstation/assets/13398309/29a0e25a-a88f-4547-99f8-888da6b85e4d)

</details>

## Changelog

🆑
fix: greyscale colors will now update on the mob when modifying them via
the VV menu
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
This commit is contained in:
Bloop
2023-08-26 14:47:59 -04:00
committed by GitHub
parent ed00e45a22
commit 1bfee08d54
16 changed files with 61 additions and 27 deletions

View File

@@ -62,12 +62,3 @@
playsound(atom_parent.loc, 'sound/effects/spray.ogg', 5, TRUE, 5)
atom_parent.set_greyscale(menu.split_colors)
// If the item is a piece of clothing and is being worn, make sure it updates on the player
if(!isclothing(atom_parent))
return
if(!ishuman(atom_parent.loc))
return
var/obj/item/clothing/clothing_parent = atom_parent
var/mob/living/carbon/human/wearer = atom_parent.loc
wearer.update_clothing(clothing_parent.slot_flags)

View File

@@ -61,7 +61,7 @@
if(affected_mob.notransform)
return
affected_mob.notransform = 1
for(var/obj/item/W in affected_mob.get_equipped_items(TRUE))
for(var/obj/item/W in affected_mob.get_equipped_items(include_pockets = TRUE))
affected_mob.dropItemToGround(W)
for(var/obj/item/I in affected_mob.held_items)
affected_mob.dropItemToGround(I)

View File

@@ -28,7 +28,7 @@
///We check if the item can be equipped, otherwise we drop it.
/datum/element/skill_reward/proc/drop_if_unworthy(datum/source, mob/living/user)
SIGNAL_HANDLER
if(check_equippable(user) | !(source in user.get_equipped_items(TRUE)))
if(check_equippable(user) | !(source in user.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE)))
return
to_chat(user, span_warning("You feel completely and utterly unworthy to even touch \the [source]."))
user.dropItemToGround(src, TRUE)

View File

@@ -25,7 +25,7 @@
/datum/admins/proc/equipAntagOnDummy(mob/living/carbon/human/dummy/mannequin, datum/antagonist/antag)
for(var/I in mannequin.get_equipped_items(TRUE))
for(var/I in mannequin.get_equipped_items(include_pockets = TRUE))
qdel(I)
if (ispath(antag, /datum/antagonist/ert))
var/datum/antagonist/ert/ert = antag

View File

@@ -213,7 +213,7 @@
delete_pocket = TRUE
SSblackbox.record_feedback("tally", "admin_verb", 1, "Select Equipment") // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc!
for(var/obj/item/item in human_target.get_equipped_items(delete_pocket))
for(var/obj/item/item in human_target.get_equipped_items(include_pockets = delete_pocket))
qdel(item)
var/obj/item/organ/internal/brain/human_brain = human_target.get_organ_slot(BRAIN)

View File

@@ -268,7 +268,7 @@ new /datum/disease_ability/symptom/powerful/youth
var/mob/living/carbon/human/host = our_disease.following_host
if(!host)
return FALSE
for(var/obj/thing as anything in host.get_equipped_items(FALSE))
for(var/obj/thing as anything in host.get_equipped_items(include_accessories = TRUE))
thing.AddComponent(/datum/component/infective, our_disease.disease_template, 300)
//no shoes? infect the floor.
if(!host.shoes)

View File

@@ -63,7 +63,7 @@
suit = /obj/item/clothing/suit/apron
/datum/outfit/obsessed/post_equip(mob/living/carbon/human/H)
for(var/obj/item/carried_item in H.get_equipped_items(TRUE))
for(var/obj/item/carried_item in H.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE))
carried_item.add_mob_blood(H)//Oh yes, there will be blood...
H.regenerate_icons()

View File

@@ -122,7 +122,7 @@
if(LAZYLEN(assembly.assemblies) == igniter_count)
return
if((src in user.get_equipped_items(TRUE)) && !user.canUnEquip(src))
if((src in user.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE)) && !user.canUnEquip(src))
to_chat(user, span_warning("[src] is stuck to you!"))
return

View File

@@ -32,11 +32,11 @@
to_chat(c, span_warning("Pick an outfit first."))
return
for (var/item in dollie.get_equipped_items(TRUE))
for (var/item in dollie.get_equipped_items(include_pockets = TRUE))
qdel(item)
if(dressuptime != "Naked")
dollie.equipOutfit(dressuptime)
if(LAZYACCESS(modifiers, RIGHT_CLICK))
for (var/item in dollie.get_equipped_items(TRUE))
for (var/item in dollie.get_equipped_items(include_pockets = TRUE))
qdel(item)

View File

@@ -254,6 +254,17 @@
LAZYSET(user_vars_remembered, variable, user.vars[variable])
user.vv_edit_var(variable, user_vars_to_edit[variable])
// If the item is a piece of clothing and is being worn, make sure it updates on the player
/obj/item/clothing/update_greyscale()
. = ..()
var/mob/living/carbon/human/wearer = loc
if(!istype(wearer))
return
wearer.update_clothing(slot_flags)
/**
* Inserts a trait (or multiple traits) into the clothing traits list
*
@@ -392,7 +403,7 @@
if(isliving(loc)) //It's not important enough to warrant a message if it's not on someone
var/mob/living/M = loc
if(src in M.get_equipped_items(FALSE))
if(src in M.get_equipped_items())
to_chat(M, span_warning("Your [name] start[p_s()] to fall apart!"))
else
to_chat(M, span_warning("[src] start[p_s()] to fall apart!"))
@@ -515,7 +526,7 @@ BLIND // can't see anything
update_clothes_damaged_state(CLOTHING_SHREDDED)
if(isliving(loc))
var/mob/living/M = loc
if(src in M.get_equipped_items(FALSE)) //make sure they were wearing it and not attacking the item in their hands
if(src in M.get_equipped_items()) //make sure they were wearing it and not attacking the item in their hands
M.visible_message(span_danger("[M]'s [src.name] fall[p_s()] off, [p_theyre()] completely shredded!"), span_warning("<b>Your [src.name] fall[p_s()] off, [p_theyre()] completely shredded!</b>"), vision_distance = COMBAT_MESSAGE_RANGE)
M.dropItemToGround(src)
else

View File

@@ -175,7 +175,7 @@
l_hand = /obj/item/fireaxe
/datum/outfit/psycho/post_equip(mob/living/carbon/human/H)
for(var/obj/item/carried_item in H.get_equipped_items(TRUE))
for(var/obj/item/carried_item in H.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE))
carried_item.add_mob_blood(H)//Oh yes, there will be blood...
for(var/obj/item/I in H.held_items)
I.add_mob_blood(H)

View File

@@ -236,6 +236,15 @@
accessory_overlay.alpha = prime_accessory.alpha
accessory_overlay.color = prime_accessory.color
/// Updates the accessory's worn overlay mutable appearance
/obj/item/clothing/under/proc/update_accessory_overlay()
if(isnull(accessory_overlay))
return
cut_overlay(accessory_overlay)
create_accessory_overlay()
update_appearance() // so we update the suit inventory overlay too
/obj/item/clothing/under/Exited(atom/movable/gone, direction)
. = ..()
// If one of our accessories was moved out, handle it

View File

@@ -54,6 +54,22 @@
return TRUE
// If accessory is being worn, make sure it updates on the player
/obj/item/clothing/accessory/update_greyscale()
. = ..()
var/obj/item/clothing/under/attached_to = loc
if(!istype(attached_to))
return
var/mob/living/carbon/human/wearer = attached_to.loc
if(!istype(wearer))
return
attached_to.update_accessory_overlay()
/**
* Actually attach this accessory to the passed clothing article.
*
@@ -145,10 +161,12 @@
/// Called when the uniform this accessory is pinned to is equipped in a valid slot
/obj/item/clothing/accessory/proc/accessory_equipped(obj/item/clothing/under/clothes, mob/living/user)
equipped(user, user.get_slot_by_item(clothes)) // so we get any actions, item_flags get set, etc
return
/// Called when the uniform this accessory is pinned to is dropped
/obj/item/clothing/accessory/proc/accessory_dropped(obj/item/clothing/under/clothes, mob/living/user)
dropped(user)
return
/// Signal proc for [COMSIG_CLOTHING_UNDER_ADJUSTED] on the uniform we're pinned to

View File

@@ -155,7 +155,7 @@
suit = /obj/item/clothing/suit/apron
/datum/outfit/mafia/obsessed/post_equip(mob/living/carbon/human/H)
for(var/obj/item/carried_item in H.get_equipped_items(TRUE))
for(var/obj/item/carried_item in H.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE))
carried_item.add_mob_blood(H)//Oh yes, there will be blood...
H.regenerate_icons()

View File

@@ -385,9 +385,10 @@
*
* Argument(s):
* * Optional - include_pockets (TRUE/FALSE), whether or not to include the pockets and suit storage in the returned list
* * Optional - include_accessories (TRUE/FALSE), whether or not to include the accessories in the returned list
*/
/mob/living/proc/get_equipped_items(include_pockets = FALSE)
/mob/living/proc/get_equipped_items(include_pockets = FALSE, include_accessories = FALSE)
var/list/items = list()
for(var/obj/item/item_contents in contents)
if(item_contents.item_flags & IN_INVENTORY)
@@ -400,17 +401,21 @@
*
* Argument(s):
* * Optional - include_pockets (TRUE/FALSE), whether or not to include the pockets and suit storage in the returned list
* * Optional - include_accessories (TRUE/FALSE), whether or not to include the accessories in the returned list
*/
/mob/living/carbon/human/get_equipped_items(include_pockets = FALSE)
/mob/living/carbon/human/get_equipped_items(include_pockets = FALSE, include_accessories = FALSE)
var/list/items = ..()
if(!include_pockets)
items -= list(l_store, r_store, s_store)
if(include_accessories && w_uniform)
var/obj/item/clothing/under/worn_under = w_uniform
items += worn_under.attached_accessories
return items
/mob/living/proc/unequip_everything()
var/list/items = list()
items |= get_equipped_items(TRUE)
items |= get_equipped_items(include_pockets = TRUE)
for(var/I in items)
dropItemToGround(I)
drop_all_held_items()
@@ -536,7 +541,7 @@
//GetAllContents that is reasonable and not stupid
/mob/living/carbon/proc/get_all_gear()
var/list/processing_list = get_equipped_items(include_pockets = TRUE) + held_items
var/list/processing_list = get_equipped_items(include_pockets = TRUE, include_accessories = TRUE) + held_items
list_clear_nulls(processing_list) // handles empty hands
var/i = 0
while(i < length(processing_list) )

View File

@@ -288,7 +288,7 @@
SSblackbox.record_feedback("amount", "gorillas_created", 1)
var/Itemlist = get_equipped_items(TRUE)
var/Itemlist = get_equipped_items(include_pockets = TRUE)
Itemlist += held_items
for(var/obj/item/W in Itemlist)
dropItemToGround(W, TRUE)