From 5b6cf698caf1dc5b41f97640931e0de1dcafe215 Mon Sep 17 00:00:00 2001 From: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Sun, 16 Nov 2025 19:21:05 -0500 Subject: [PATCH] Fix wall mounted sign duplication during placement (#93968) ## About The Pull Request `/obj/item/sign/interact_with_atom` created the structure instance before it early returned for being at a diagonal so it wouldn't qdel the sign item but it would be there. Also refactor an `attackby` to `item_interaction` while im there ## Why It's Good For The Game Fixes #93819 ## Changelog :cl: fix: fixed placing wall signs at diagonals allowing you to duplicate them /:cl: --- code/game/objects/structures/signs/_signs.dm | 40 ++++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm index 905d709b273..77ccec77ad4 100644 --- a/code/game/objects/structures/signs/_signs.dm +++ b/code/game/objects/structures/signs/_signs.dm @@ -175,35 +175,35 @@ context[SCREENTIP_CONTEXT_LMB] = "Change design" return CONTEXTUAL_SCREENTIP_SET -/obj/item/sign/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) - if(is_editable && IS_WRITING_UTENSIL(I)) - if(!length(GLOB.editable_sign_types)) - CRASH("GLOB.editable_sign_types failed to populate") - var/choice = tgui_input_list(user, "Select a sign type", "Sign Customization", GLOB.editable_sign_types) - if(isnull(choice)) - return - if(!Adjacent(user)) //Make sure user is adjacent still. - to_chat(user, span_warning("You need to stand next to the sign to change it!")) - return - user.visible_message(span_notice("You begin changing [src].")) - if(!do_after(user, 4 SECONDS, target = src)) - return - set_sign_type(GLOB.editable_sign_types[choice]) - user.visible_message(span_notice("You finish changing the sign.")) - return - return ..() +/obj/item/sign/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!is_editable || !IS_WRITING_UTENSIL(tool)) + return ..() + if(!length(GLOB.editable_sign_types)) + CRASH("GLOB.editable_sign_types failed to populate") + var/choice = tgui_input_list(user, "Select a sign type", "Sign Customization", GLOB.editable_sign_types) + if(isnull(choice)) + return ITEM_INTERACT_BLOCKING + if(!Adjacent(user)) //Make sure user is adjacent still. + to_chat(user, span_warning("You need to stand next to the sign to change it!")) + return ITEM_INTERACT_BLOCKING + user.visible_message(span_notice("You begin changing [src].")) + if(!do_after(user, 4 SECONDS, target = src)) + return ITEM_INTERACT_BLOCKING + set_sign_type(GLOB.editable_sign_types[choice]) + user.visible_message(span_notice("You finish changing the sign.")) + return ITEM_INTERACT_SUCCESS /obj/item/sign/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!iswallturf(interacting_with) && !istype(interacting_with, /obj/structure/tram)) return NONE var/turf/target_turf = interacting_with var/turf/user_turf = get_turf(user) - var/obj/structure/sign/placed_sign = new sign_path(user_turf) //We place the sign on the turf the user is standing, and pixel shift it to the target wall, as below. - //This is to mimic how signs and other wall objects are usually placed by mappers, and so they're only visible from one side of a wall. var/dir = get_dir(user_turf, target_turf) if(!(dir in GLOB.cardinals)) balloon_alert(user, "stand in line with wall!") - return + return ITEM_INTERACT_BLOCKING + var/obj/structure/sign/placed_sign = new sign_path(user_turf) //We place the sign on the turf the user is standing, and pixel shift it to the target wall, as below. + //This is to mimic how signs and other wall objects are usually placed by mappers, and so they're only visible from one side of a wall. if(dir & NORTH) placed_sign.pixel_y = 32 else if(dir & SOUTH)