From 505faec7261e4d71a68d677f36d91cc1631fc685 Mon Sep 17 00:00:00 2001 From: Toastical <20125180+Toastical@users.noreply.github.com> Date: Mon, 12 May 2025 23:52:57 +0300 Subject: [PATCH] Makes antidrop implant release its items regardless which slot theyre in (#29242) * removed nodrop check, changed anti_drop implant * anti_drop test * some touches --- code/modules/mob/mob.dm | 4 -- .../surgery/organs/augments_internal.dm | 8 +-- code/tests/game_tests.dm | 1 + code/tests/test_anti_drop.dm | 49 +++++++++++++++++++ 4 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 code/tests/test_anti_drop.dm diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 262682e3cc8..b8bff42ec45 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -261,10 +261,6 @@ if(!istype(W)) return FALSE - if(W.flags & NODROP) - to_chat(src, "[W] is stuck to your hand!") - return FALSE - if(!W.mob_can_equip(src, slot, disable_warning)) if(del_on_fail) qdel(W) diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index a96307d18a7..7af4cdbc63b 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -103,21 +103,21 @@ release_items() ..() if(L_item) - A = pick(oview(range)) + A = pick(oview(range, owner)) L_item.throw_at(A, range, 2) to_chat(owner, "Your left arm spasms and throws [L_item]!") l_hand_obj = null if(R_item) - A = pick(oview(range)) + A = pick(oview(range, owner)) R_item.throw_at(A, range, 2) to_chat(owner, "Your right arm spasms and throws [R_item]!") r_hand_obj = null /obj/item/organ/internal/cyberimp/brain/anti_drop/proc/release_items() active = FALSE - if(!l_hand_ignore && l_hand_obj && (l_hand_obj == owner.l_hand)) + if(!l_hand_ignore && l_hand_obj) l_hand_obj.flags &= ~NODROP - if(!r_hand_ignore && r_hand_obj && (r_hand_obj == owner.r_hand)) + if(!r_hand_ignore && r_hand_obj) r_hand_obj.flags &= ~NODROP /obj/item/organ/internal/cyberimp/brain/anti_drop/remove(mob/living/carbon/M, special = 0) diff --git a/code/tests/game_tests.dm b/code/tests/game_tests.dm index 38fa65a7be4..91aa459a6d4 100644 --- a/code/tests/game_tests.dm +++ b/code/tests/game_tests.dm @@ -23,6 +23,7 @@ #include "jobs\test_job_globals.dm" #include "test_aicard_icons.dm" #include "test_announcements.dm" +#include "test_anti_drop.dm" #include "test_apc_construction.dm" #include "test_components.dm" #include "test_config_sanity.dm" diff --git a/code/tests/test_anti_drop.dm b/code/tests/test_anti_drop.dm new file mode 100644 index 00000000000..5497d99d5fd --- /dev/null +++ b/code/tests/test_anti_drop.dm @@ -0,0 +1,49 @@ +/datum/game_test/anti_drop_implant/Run() + var/datum/test_puppeteer/player = new(src) + var/obj/item/organ/internal/cyberimp/brain/anti_drop/anti_drop = new/obj/item/organ/internal/cyberimp/brain/anti_drop + var/obj/item/autosurgeon/organ/syndicate/autosurg = player.spawn_obj_in_hand(/obj/item/autosurgeon/organ/syndicate) + + autosurg.insert_organ(anti_drop) + TEST_ASSERT(autosurg.storedorgan == anti_drop, "failed to insert antidrop in autosurgeon") + player.use_item_in_hand() + TEST_ASSERT(anti_drop in player.puppet.internal_organs, "failed to insert anti_drop in player") + qdel(autosurg) + + var/obj/item/screwdriver = player.spawn_obj_in_hand(/obj/item/screwdriver) + anti_drop.ui_action_click() + TEST_ASSERT((screwdriver.flags & NODROP), "nodrop failed to apply") + anti_drop.ui_action_click() + TEST_ASSERT(!(screwdriver.flags & NODROP), "nodrop failed to get removed") + + anti_drop.ui_action_click() + anti_drop.emp_act() + TEST_ASSERT(!(screwdriver in get_both_hands(player.puppet)), "player failed to throw items") + TEST_ASSERT(!(screwdriver.flags & NODROP), "emp throw failed to remove NODROP") + player.rejuvenate() + + var/obj/item/belt = player.spawn_obj_in_hand(/obj/item/storage/belt) + anti_drop.ui_action_click() + player.puppet.equip_to_appropriate_slot(belt) + player.puppet.drop_item_to_ground(belt) + TEST_ASSERT(player.puppet.get_item_by_slot(ITEM_SLOT_BELT), "belt removed with NODROP") + anti_drop.ui_action_click() + player.puppet.drop_item_to_ground(belt) + TEST_ASSERT(!player.puppet.get_item_by_slot(ITEM_SLOT_BELT), "failed to remove belt after disabling NODROP") + + var/obj/item/butcher_chainsaw/saw = player.spawn_obj_in_hand(/obj/item/butcher_chainsaw) + player.use_item_in_hand() + anti_drop.ui_action_click() + anti_drop.ui_action_click() + TEST_ASSERT(saw.flags & NODROP, "anti_drop removed unique item NODROP") + + player.use_item_in_hand() + anti_drop.ui_action_click() + player.puppet.put_in_r_hand(saw) + TEST_ASSERT(player.puppet.r_hand = saw, "player failed to put saw in right hand") + var/obj/item/organ/external/right_hand = player.puppet.get_organ(BODY_ZONE_R_ARM) + right_hand.droplimb() + TEST_ASSERT(!(saw.flags & NODROP), "limb dismemberment failed to remove NODROP") + + player.puppet.put_in_hands(saw) + anti_drop.ui_action_click() + TEST_ASSERT(!(saw.flags & NODROP), "picking item up with antidrop active applied NODROP")