From d355a60a2d0dd602bdfcc53eccebd70257176a71 Mon Sep 17 00:00:00 2001 From: SteelSlayer <42044220+SteelSlayer@users.noreply.github.com> Date: Wed, 24 Aug 2022 07:51:05 -0500 Subject: [PATCH] Rework / refactor of how the Give verb works. Give now has a re-bindable hotkey for it (#18646) * give verb rework ; adds a hotkey for give * moxian review * Adds new alert sprite shown to item giver * Converts offering item trait to a status effect to facilitate the new alert * Update screen_alert.dmi * Add a `/datum/proc/signal_qdel()` helper To cut down on copy and paste. Fixed alert flash icon not having transparency. * lewcc review * farie review and other fixes For some reason my alert flash sprite no longer had an empty frame at the end so it would reach the end of the animation and be a solid yellow outline instead of invisible. Touched screen_alert.dmi to fix that. * reverts the addition of the give hud icon, restores give verb I realized that making a new hud icon button would require multiple hud icons for each hud theme (the red one, green one, white one, etc.). I'm not prepared to do that much work right now. * Update code/modules/mob/living/carbon/give.dm Co-authored-by: Farie82 Co-authored-by: Farie82 --- code/__DEFINES/status_effects.dm | 2 + code/__HELPERS/qdel.dm | 12 ++ code/_onclick/hud/alert.dm | 32 ++-- code/datums/keybindings/carbon.dm | 9 + code/modules/mob/living/carbon/give.dm | 225 ++++++++++++++++++++----- code/modules/mob/mob.dm | 2 + icons/mob/screen_alert.dmi | Bin 65157 -> 66568 bytes icons/mouse_icons/give_item.dmi | Bin 0 -> 542 bytes 8 files changed, 225 insertions(+), 57 deletions(-) create mode 100644 icons/mouse_icons/give_item.dmi diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index e2ccb39f534..d9f5f22f79c 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -133,3 +133,5 @@ #define STATUS_EFFECT_SYPHONMARK /datum/status_effect/syphon_mark //tracks kills for the KA death syphon module #define STATUS_EFFECT_ADAPTIVELEARNING /datum/status_effect/adaptive_learning //tracks the total bonus damage needed to be done to target +/// Status effect given when someone uses the Give Item command to offer an item to another player. +#define STATUS_EFFECT_OFFERING_ITEM /datum/status_effect/offering_item diff --git a/code/__HELPERS/qdel.dm b/code/__HELPERS/qdel.dm index 020077a4e5c..99ccce4719b 100644 --- a/code/__HELPERS/qdel.dm +++ b/code/__HELPERS/qdel.dm @@ -8,3 +8,15 @@ /proc/______qdel_list_wrapper(list/L) //the underscores are to encourage people not to use this directly. QDEL_LIST(L) + +/** + * # Signal qdel + * + * Proc intended to be used when someone wants the src datum to be qdeled when a certain signal is sent to them. + * + * Example usage: + * RegisterSignal(item, COMSIG_PARENT_QDELETING, /datum/proc/signal_qdel) + */ +/datum/proc/signal_qdel() + SIGNAL_HANDLER + qdel(src) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 0e70c02b05d..1038ed2c18f 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -3,19 +3,21 @@ //PUBLIC - call these wherever you want -/mob/proc/throw_alert(category, type, severity, obj/new_master, override = FALSE, timeout_override, no_anim, icon_override) - -/* - Proc to create or update an alert. Returns the alert if the alert is new or updated, 0 if it was thrown already - category is a text string. Each mob may only have one alert per category; the previous one will be replaced - path is a type path of the actual alert type to throw - severity is an optional number that will be placed at the end of the icon_state for this alert - For example, high pressure's icon_state is "highpressure" and can be serverity 1 or 2 to get "highpressure1" or "highpressure2" - new_master is optional and sets the alert's icon state to "template" in the ui_style icons with the master as an overlay. - Clicks are forwarded to master - Override makes it so the alert is not replaced until cleared by a clear_alert with clear_override, and it's used for hallucinations. +/** + * Proc to create or update an alert. Returns the alert if the alert is new or updated, 0 if it was thrown already. + * Each mob may only have one alert per category. + * + * Arguments: + * * category - a text string corresponding to what type of alert it is + * * type - a type path of the actual alert type to throw + * * severity - is an optional number that will be placed at the end of the icon_state for this alert + For example, high pressure's icon_state is "highpressure" and can be serverity 1 or 2 to get "highpressure1" or "highpressure2" + * * obj/new_master - optional argument. Sets the alert's icon state to "template" in the ui_style icons with the master as an overlay. Clicks are forwarded to master + * * no_anim - whether the alert should play a small sliding animation when created on the player's screen + * * icon_override - makes it so the alert is not replaced until cleared by a clear_alert with clear_override, and it's used for hallucinations. + * * list/alert_args - a list of arguments to pass to the alert when creating it */ - +/mob/proc/throw_alert(category, type, severity, obj/new_master, override = FALSE, timeout_override, no_anim, icon_override, list/alert_args) if(!category) return @@ -37,7 +39,11 @@ else //no need to update return 0 else - alert = new type() + if(alert_args) + alert_args.Insert(1, null) // So it's still created in nullspace. + alert = new type(arglist(alert_args)) + else + alert = new type() alert.override_alerts = override if(override) alert.timeout = null diff --git a/code/datums/keybindings/carbon.dm b/code/datums/keybindings/carbon.dm index b27a59fbc73..69aaa35b136 100644 --- a/code/datums/keybindings/carbon.dm +++ b/code/datums/keybindings/carbon.dm @@ -22,6 +22,15 @@ var/mob/living/carbon/M = C.mob M.throw_mode_off() +/datum/keybinding/carbon/give_item + name = "Give Item (Toggle)" + keys = null + +/datum/keybinding/carbon/give_item/down(client/C) + . = ..() + var/mob/living/carbon/user = C.mob + user.toggle_give() + /datum/keybinding/carbon/intent /// The intent to switch to. var/intent diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index 6795ec8643c..59d06a9fdd5 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -1,52 +1,189 @@ -/mob/living/carbon/verb/give(mob/living/carbon/target in oview(1)) +/** + * Toggles the [/datum/click_intercept/give] on or off for the src mob. + */ +/mob/living/carbon/verb/toggle_give() + set name = "Give Item" set category = "IC" - set name = "Give" - if(!iscarbon(target)) //something is bypassing the give arguments, no clue what, adding a sanity check JIC - to_chat(usr, "Wait a second... \the [target] HAS NO HANDS! AHH!")//cheesy messages ftw + if(has_status_effect(STATUS_EFFECT_OFFERING_ITEM)) + to_chat(src, "You're already offering an item to someone!") return - - if(target.incapacitated() || usr.incapacitated() || target.client == null) + if(istype(client.click_intercept, /datum/click_intercept/give)) + QDEL_NULL(client.click_intercept) return - var/obj/item/I = get_active_hand() - if(!I) - to_chat(usr, " You don't have anything in your hand to give to [target.name]") + to_chat(src, "You don't have anything in your hand to give!") return - if((I.flags & NODROP) || (I.flags & ABSTRACT)) - to_chat(usr, "That's not exactly something you can give.") + if(I.flags & NODROP) + to_chat(src, "[I] is stuck to your hand, you can't give it away!") return - if(target.r_hand == null || target.l_hand == null) - var/ans = alert(target,"[usr] wants to give you \a [I]?",,"Yes","No") - if(!I || !target) - return - switch(ans) - if("Yes") - if(target.incapacitated() || usr.incapacitated()) - return - if(!Adjacent(target)) - to_chat(usr, " You need to stay in reaching distance while giving an object.") - to_chat(target, " [usr.name] moved too far away.") - return - if((I.flags & NODROP) || (I.flags & ABSTRACT)) - to_chat(usr, "[I] stays stuck to your hand when you try to give it!") - to_chat(target, "[I] stays stuck to [usr.name]'s hand when you try to take it!") - return - if(I != get_active_hand()) - to_chat(usr, " You need to keep the item in your active hand.") - to_chat(target, " [usr.name] seem to have given up on giving [I] to you.") - return - if(target.r_hand != null && target.l_hand != null) - to_chat(target, " Your hands are full.") - to_chat(usr, " Their hands are full.") - return - usr.unEquip(I) - target.put_in_hands(I) - I.add_fingerprint(target) - target.visible_message(" [usr.name] handed [I] to [target.name].") - I.on_give(usr, target) - if("No") - target.visible_message(" [usr.name] tried to hand [I] to [target.name] but [target.name] didn't want it.") - else - to_chat(usr, " [target.name]'s hands are full.") + if(I.flags & ABSTRACT) + to_chat(src, "That's not exactly something you can give.") + return + + new /datum/click_intercept/give(client) + +/** + * # Offering Item status effect + * + * Status effect given to mobs after they've offered an item to another player using the Give Item action ([/datum/click_intercept/give]). + */ +/datum/status_effect/offering_item + id = "offering item" + duration = 10 SECONDS + alert_type = /obj/screen/alert/status_effect/offering_item + +/datum/status_effect/offering_item/on_creation(mob/living/new_owner, receiver_UID, item_UID) + . = ..() + var/obj/screen/alert/status_effect/offering_item/offer = linked_alert + offer.item_UID = item_UID + offer.receiver_UID = receiver_UID + + +/obj/screen/alert/status_effect/offering_item + name = "Offering Item" + desc = "You're currently offering an item someone. Make sure to keep the item in your hand so they can accept it! Click to stop offering your item." + icon_state = "offering_item" + /// UID of the mob who's being offered the item. + var/receiver_UID + /// UID of the item being given. + var/item_UID + +/obj/screen/alert/status_effect/offering_item/Click(location, control, params) + var/mob/living/carbon/receiver = locateUID(receiver_UID) + var/mob/living/carbon/giver = attached_effect.owner + var/obj/item/I = locateUID(item_UID) + to_chat(giver, "You decide against giving [I] to [receiver].") + to_chat(receiver, "[giver] seems to have given up on giving you [I].") + receiver.clear_alert("take item [item_UID]") // This cancels *everything* related to the giving/item offering. + + +/** + * # Give click intercept + * + * While a mob has this intercept, left clicking on a carbon mob will attempt to offer their currently held item to that mob. + */ +/datum/click_intercept/give + /// If the intercept user has succesfully offered the item to another player. + var/item_offered = FALSE + +/datum/click_intercept/give/New(client/C) + ..() + holder.mouse_pointer_icon = 'icons/mouse_icons/give_item.dmi' + to_chat(holder, "You can now left click on someone to give them your held item.") + RegisterSignal(holder.mob.get_active_hand(), list(COMSIG_PARENT_QDELETING, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED), /datum/proc/signal_qdel) + RegisterSignal(holder.mob, list(SIGNAL_ADDTRAIT(TRAIT_HANDS_BLOCKED), COMSIG_CARBON_SWAP_HANDS), /datum/proc/signal_qdel) + + +/datum/click_intercept/give/Destroy(force = FALSE, ...) + holder.mouse_pointer_icon = initial(holder.mouse_pointer_icon) + if(!item_offered) + to_chat(holder.mob, "You're no longer trying to give someone your held item.") + return ..() + + +/datum/click_intercept/give/InterceptClickOn(mob/user, params, atom/object) + if(user == object || !iscarbon(object)) + return + var/mob/living/carbon/receiver = object + if(receiver.stat != CONSCIOUS) + to_chat(user, "[receiver] can't accept any items because they're not conscious!") + return + var/obj/item/I = user.get_active_hand() + if(!user.Adjacent(receiver)) + to_chat(user, "You need to be closer to [receiver] to offer them [I].") + return + if(!receiver.client) + to_chat(user, "You offer [I] to [receiver], but they don't seem to respond...") + return + // We use UID() here so that the receiver can have more then one give request at one time. + // Otherwise, throwing a new "take item" alert would override any current one also named "take item". + receiver.throw_alert("take item [I.UID()]", /obj/screen/alert/take_item, alert_args = list(user, receiver, I)) + item_offered = TRUE // TRUE so we don't give them the default chat message in Destroy. + to_chat(user, "You offer [I] to [receiver].") + qdel(src) + + +/** + * # Take Item alert + * + * Alert which appears for a user when another player is attempting to offer them an item. + * The user can click the alert to accept, or simply do nothing to not take the item. + */ +/obj/screen/alert/take_item + name = "Take Item" + desc = "someone wants to hand you an item!" + icon_state = "template" + timeout = 10 SECONDS + /// UID of the mob offering the receiver an item. + var/giver_UID + /// UID of the mob who has this alert. + var/receiver_UID + /// UID of the item being given. + var/item_UID + + +/obj/screen/alert/take_item/Initialize(mapload, mob/living/giver, mob/living/receiver, obj/item/I) + . = ..() + desc = "[giver] wants to hand you \a [I]. Click here to accept it!" + giver_UID = giver.UID() + receiver_UID = receiver.UID() + item_UID = I.UID() + giver.apply_status_effect(STATUS_EFFECT_OFFERING_ITEM, receiver_UID, item_UID) + add_overlay(icon(I.icon, I.icon_state, SOUTH)) + add_overlay("alert_flash") + RegisterSignal(I, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED), .proc/cancel_give) + RegisterSignal(giver, list(SIGNAL_ADDTRAIT(TRAIT_HANDS_BLOCKED), COMSIG_CARBON_SWAP_HANDS), .proc/cancel_give) + // If either of these atoms are deleted, we need to cancel everything. Also saves having to do null checks before interacting with these atoms. + RegisterSignal(I, COMSIG_PARENT_QDELETING, /datum/proc/signal_qdel) + RegisterSignal(giver, COMSIG_PARENT_QDELETING, /datum/proc/signal_qdel) + + +/obj/screen/alert/take_item/Destroy() + var/mob/living/giver = locateUID(giver_UID) + giver.remove_status_effect(STATUS_EFFECT_OFFERING_ITEM) + return ..() + + +/obj/screen/alert/take_item/proc/cancel_give() + SIGNAL_HANDLER + var/mob/living/giver = locateUID(giver_UID) + to_chat(giver, "You need to keep the item in your active hand if you want to hand it to someone!") + to_chat(locateUID(receiver_UID), "[giver] seems to have given up on giving you [locateUID(item_UID)].") + qdel(src) + + +/obj/screen/alert/take_item/Click(location, control, params) + var/mob/living/receiver = locateUID(receiver_UID) + if(receiver.stat != CONSCIOUS) + return + var/obj/item/I = locateUID(item_UID) + if(HAS_TRAIT(receiver, TRAIT_HANDS_BLOCKED) || receiver.r_hand && receiver.l_hand) + to_chat(receiver, "You need to have your hands free to accept [I]!") + return + var/mob/living/giver = locateUID(giver_UID) + if(!giver.Adjacent(receiver)) + to_chat(receiver, "You need to stay in reaching distance of [giver] to take [I]!") + return + if(I.flags & NODROP) + to_chat(giver, "[I] stays stuck to your hand when [receiver] tries to take it!") + to_chat(receiver, "[I] stays stuck to [giver]'s hand when you try to take it!") + return + giver.unEquip(I) + receiver.put_in_hands(I) + I.add_fingerprint(receiver) + I.on_give(giver, receiver) + receiver.visible_message("[giver] handed [I] to [receiver].") + receiver.clear_alert("give item [item_UID]") + + +/obj/screen/alert/take_item/do_timeout(mob/M, category) + var/mob/living/giver = locateUID(giver_UID) + var/mob/living/receiver = locateUID(receiver_UID) + // Make sure we're still nearby. We don't want to show a message if the giver not near us. + if(giver in view(3, receiver)) + var/obj/item/I = locateUID(item_UID) + to_chat(giver, "You tried to hand [I] to [receiver], but they didn't want it.") + to_chat(receiver, "[giver] seems to have given up on giving you [I].") + ..() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index d6ba5a8e59e..5b03e5959ed 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -9,6 +9,8 @@ mobspellremove(src) QDEL_LIST(viruses) QDEL_LIST(actions) + for(var/alert in alerts) + clear_alert(alert) ghostize() QDEL_LIST_ASSOC_VAL(tkgrabbed_objects) for(var/I in tkgrabbed_objects) diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index 5b65a8175f1f53284e83feb91e219b602b6666f5..4ef228dcd801a53dea31e592b591bc23ef5cf3a7 100644 GIT binary patch delta 12218 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 U_A2o&W^aI+lBQziWAotu2UZW#YXATM delta 10797 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 diff --git a/icons/mouse_icons/give_item.dmi b/icons/mouse_icons/give_item.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6b4944261a66e21df779b334e206ebd0407fb15f GIT binary patch literal 542 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNg&9b$UsW9eq(lRJLR=3V0Ez$q|Nq*xYxCyK z>+I|Viik~=J_rRJVxtG-JnvtKPg9QFL=@1BW`ui72& zq%3-G?8bed%6tW@LhWqBIEJg{%~1@Ox4*xdS1r3=_)BxpAx8~=)HTHi0U#j-VY4g@s zd_TGyK3mRPDh+X(&#r~?0T1dN*e=vLH2!XEWVpevQDAQ%)bNXu^&NW~Q-J+~1Ah-V zFuZ0L*&%;{af^Jwoy+_h86eRHz6F09n7%V}-IC|{aB~aO{B`#B3BTmPhAmEJw|H=@ b?g9Jlu+)HG{v3aRQOMxw>gTe~DWM4fjm_@m literal 0 HcmV?d00001