diff --git a/code/__DEFINES/misc_defines.dm b/code/__DEFINES/misc_defines.dm
index 1c29b183f14..9b96625c553 100644
--- a/code/__DEFINES/misc_defines.dm
+++ b/code/__DEFINES/misc_defines.dm
@@ -760,3 +760,5 @@ do { \
#define DIRECT_EXPLOSIVE_TRAP_DEFUSE 1
#define DIRECT_EXPLOSIVE_TRAP_IGNORE 2
+
+#define NODROP_TOGGLE "toggle"
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index b681bff4925..ff3ac8eccad 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -460,22 +460,30 @@
. = ..()
if(!handcuff_overlay)
var/state = (slot_id == ITEM_SLOT_RIGHT_HAND) ? "markus" : "gabrielle"
- handcuff_overlay = image("icon"='icons/mob/screen_gen.dmi', "icon_state"=state)
+ handcuff_overlay = image(icon = 'icons/mob/screen_gen.dmi', icon_state = state)
- if(hud && hud.mymob)
- if(iscarbon(hud.mymob))
- var/mob/living/carbon/C = hud.mymob
- if(C.handcuffed)
- . += handcuff_overlay
+ if(!hud || !hud.mymob)
+ return
- var/obj/item/organ/external/hand = C.get_organ("[slot_id == ITEM_SLOT_LEFT_HAND ? "l" : "r"]_hand")
- if(!isalien(C) && (!hand || !hand.is_usable()))
- . += blocked_overlay
+ if(iscarbon(hud.mymob))
+ var/mob/living/carbon/C = hud.mymob
+ if(C.handcuffed)
+ . += handcuff_overlay
- if(slot_id == ITEM_SLOT_LEFT_HAND && hud.mymob.hand)
+ var/obj/item/organ/external/hand = C.get_organ("[slot_id == ITEM_SLOT_LEFT_HAND ? "l" : "r"]_hand")
+ if(!isalien(C) && (!hand || !hand.is_usable()))
+ . += blocked_overlay
+
+ if(slot_id == ITEM_SLOT_LEFT_HAND)
+ if(hud.mymob.hand)
. += "hand_active"
- else if(slot_id == ITEM_SLOT_RIGHT_HAND && !hud.mymob.hand)
+ if(hud.mymob.l_hand && (hud.mymob.l_hand.flags & NODROP) && !(hud.mymob.l_hand.flags & ABSTRACT))
+ . += "locked_l"
+ else if(slot_id == ITEM_SLOT_RIGHT_HAND)
+ if(!hud.mymob.hand)
. += "hand_active"
+ if(hud.mymob.r_hand && (hud.mymob.r_hand?.flags & NODROP) && !(hud.mymob.r_hand.flags & ABSTRACT))
+ . += "locked"
/atom/movable/screen/inventory/hand/Click()
// At this point in client Click() code we have passed the 1/10 sec check and little else
diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm
index c4a1e86f7e6..402c344775a 100644
--- a/code/datums/outfits/outfit_admin.dm
+++ b/code/datums/outfits/outfit_admin.dm
@@ -1414,7 +1414,7 @@
B.desc = "Sometimes, someone's just gotta die."
var/obj/item/radio/headset/R = H.l_ear
if(istype(R))
- R.flags |= NODROP
+ R.set_nodrop(TRUE, H)
/datum/outfit/admin/honksquad
name = "Honksquad"
diff --git a/code/datums/spells/horsemask.dm b/code/datums/spells/horsemask.dm
index 4e5e5e26ca1..495072f25fd 100644
--- a/code/datums/spells/horsemask.dm
+++ b/code/datums/spells/horsemask.dm
@@ -35,7 +35,8 @@
return FALSE
var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead
- magichead.flags |= NODROP | DROPDEL //curses!
+ magichead.flags |= DROPDEL //curses!
+ magichead.set_nodrop(TRUE)
magichead.flags_inv = null //so you can still see their face
magichead.voicechange = TRUE //NEEEEIIGHH
target.visible_message( "[target]'s face lights up in fire, and after the event a horse's head takes its place!", \
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index 69b2ea4c582..390b06419a7 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -85,7 +85,7 @@ CONTENTS:
combat_armor = getArmor(arglist(combat_armor))
/obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop()
- flags ^= NODROP
+ set_nodrop(NODROP_TOGGLE, loc)
if(ismob(loc))
to_chat(loc, "Your vest is now [flags & NODROP ? "locked" : "unlocked"].")
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm
index e4c4a7bed44..3bd60abf240 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm
@@ -23,7 +23,7 @@
var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H
if(V)
console.vest = V
- V.flags |= NODROP
+ V.set_nodrop(TRUE, H)
var/obj/item/abductor/gizmo/G = locate() in H.get_item_by_slot(ITEM_SLOT_BACK)
if(G)
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 9851f7f41af..d3de73df9bf 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -1109,7 +1109,8 @@
if(ishuman(user))
to_chat(user, "HOR-SIE HAS RISEN")
var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead
- magichead.flags |= NODROP | DROPDEL //curses!
+ magichead.flags |= DROPDEL //curses!
+ magichead.set_nodrop(TRUE, magichead.loc)
magichead.flags_inv = null //so you can still see their face
magichead.voicechange = TRUE //NEEEEIIGHH
if(!user.drop_item_to_ground(user.wear_mask))
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index 01c71c99980..328f2781ab3 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -144,7 +144,8 @@
new /obj/effect/hallucination/delusion(get_turf(victim), victim, 'icons/mob/mob.dmi', "daemon")
var/obj/item/chainsaw/doomslayer/chainsaw = new(victim.loc)
- chainsaw.flags |= NODROP | DROPDEL
+ chainsaw.flags |= DROPDEL
+ chainsaw.set_nodrop(TRUE, victim)
victim.drop_l_hand()
victim.drop_r_hand()
victim.put_in_hands(chainsaw)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 7b420407f2c..3161a02f1ea 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -1068,3 +1068,15 @@ GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons
/// Changes the speech verb when wearing this item if a value is returned
/obj/item/proc/change_speech_verb()
return
+
+/obj/item/proc/set_nodrop(set_value, user)
+ switch(set_value)
+ if(TRUE)
+ flags |= NODROP
+ if(FALSE)
+ flags &= ~NODROP
+ if(NODROP_TOGGLE)
+ flags ^= NODROP
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ C.update_hands_hud()
diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm
index d8ba0c62e12..201800e75b4 100644
--- a/code/game/objects/items/devices/radio/electropack.dm
+++ b/code/game/objects/items/devices/radio/electropack.dm
@@ -63,7 +63,7 @@
user.put_in_hands(A)
A.add_fingerprint(user)
if(src.flags & NODROP)
- A.flags |= NODROP
+ A.set_nodrop(TRUE)
/obj/item/electropack/proc/handle_shock()
diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm
index d96bed6ad47..1b6ec5fce8f 100644
--- a/code/game/objects/items/his_grace.dm
+++ b/code/game/objects/items/his_grace.dm
@@ -144,7 +144,7 @@
do_attack_animation(master, used_item = src)
master.emote("scream")
master.remove_status_effect(STATUS_EFFECT_HISGRACE)
- flags &= ~NODROP
+ set_nodrop(FALSE, master)
master.Weaken(6 SECONDS)
master.adjustBruteLoss(1000)
playsound(master, 'sound/effects/splat.ogg', 100, FALSE)
@@ -251,25 +251,25 @@
update_stats()
/obj/item/his_grace/proc/update_stats()
+ var/mob/living/master = get_atom_on_turf(src, /mob/living)
if(ascended) // Ascended is set to a specific bloodthirst anyways
force = initial(force) + force_bonus
- flags |= NODROP
+ set_nodrop(TRUE, master)
return
- flags &= ~NODROP
- var/mob/living/master = get_atom_on_turf(src, /mob/living)
+ set_nodrop(FALSE, master)
switch(bloodthirst)
if(HIS_GRACE_CONSUME_OWNER to HIS_GRACE_FALL_ASLEEP)
if(HIS_GRACE_CONSUME_OWNER > prev_bloodthirst)
master.visible_message("[src] enters a frenzy!")
if(HIS_GRACE_STARVING to HIS_GRACE_CONSUME_OWNER)
- flags |= NODROP
+ set_nodrop(TRUE, master)
if(HIS_GRACE_STARVING > prev_bloodthirst)
master.visible_message("[src] is starving!", "[src]'s bloodlust overcomes you. [src] must be fed, or you will become His meal.\
[force_bonus < 15 ? " And still, His power grows.":""]")
force_bonus = max(force_bonus, 15)
if(HIS_GRACE_FAMISHED to HIS_GRACE_STARVING)
- flags |= NODROP
+ set_nodrop(TRUE, master)
if(HIS_GRACE_FAMISHED > prev_bloodthirst)
master.visible_message("[src] is very hungry!", "Spines sink into your hand. [src] must feed immediately.\
[force_bonus < 10 ? " His power grows.":""]")
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index ec2cedef256..4d2a3a50c62 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -349,26 +349,26 @@
/obj/item/rcd/suicide_act(mob/living/user)
user.Immobilize(10 SECONDS) // You cannot move.
- flags |= NODROP // You cannot drop. You commit to die.
+ set_nodrop(TRUE, user)
if(mode == MODE_DECON)
user.visible_message("[user] points [src] at [user.p_their()] chest and pulls the trigger. It looks like [user.p_theyre()] trying to commit suicide!")
var/datum/rcd_act/remove_user/act = new()
if(!act.try_act(user, src, user))
- flags &= ~NODROP
+ set_nodrop(FALSE, user)
return SHAME
user.visible_message("[user] deconstructs [user.p_themselves()] with [src]!")
for(var/obj/item/W in user) // Do not delete all their stuff.
user.drop_item_to_ground(W) // Dump everything on the floor instead.
- flags &= ~NODROP // NODROP must be removed so the RCD doesn't get dusted along with them. Having this come after the unequipping puts the RCD on top of the pile of stuff.
+ set_nodrop(FALSE, user)
user.dust() // (held items fall to the floor when dusting).
return OBLITERATION
user.visible_message("[user] puts the barrel of [src] into [user.p_their()] mouth and pulls the trigger. It looks like [user.p_theyre()] trying to commit suicide!")
if(!interact_with_atom(get_turf(src), user, TRUE))
- flags &= ~NODROP
+ set_nodrop(FALSE, user)
return SHAME
user.visible_message("[user] explodes as [src] builds a structure inside [user.p_them()]!")
- flags &= ~NODROP
+ set_nodrop(FALSE, user)
user.gib()
return OBLITERATION
diff --git a/code/game/objects/items/weapons/grenades/syndieminibomb.dm b/code/game/objects/items/weapons/grenades/syndieminibomb.dm
index 642463b50c0..a98842e30ca 100644
--- a/code/game/objects/items/weapons/grenades/syndieminibomb.dm
+++ b/code/game/objects/items/weapons/grenades/syndieminibomb.dm
@@ -23,7 +23,7 @@
/obj/item/grenade/syndieminibomb/fake/attack_self__legacy__attackchain(mob/user)
if(!active)
- flags |= NODROP
+ set_nodrop(TRUE, user)
to_chat(user, "As you activate the bomb, it emits a substance that sticks to your hand! It won't come off!")
to_chat(user, "Uh oh.")
. = ..()
diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm
index a1247748398..f6e550203dc 100644
--- a/code/game/objects/items/weapons/holy_weapons.dm
+++ b/code/game/objects/items/weapons/holy_weapons.dm
@@ -114,7 +114,7 @@
icon_state = "disintegrate"
item_state = "disintegrate"
desc = "This hand of yours glows with an awesome power!"
- flags = ABSTRACT | NODROP| DROPDEL
+ flags = ABSTRACT | NODROP | DROPDEL
w_class = WEIGHT_CLASS_HUGE
hitsound = 'sound/weapons/sear.ogg'
damtype = BURN
diff --git a/code/game/objects/items/weapons/knuckledusters.dm b/code/game/objects/items/weapons/knuckledusters.dm
index 7d2d6d57ed1..c5a0c744662 100644
--- a/code/game/objects/items/weapons/knuckledusters.dm
+++ b/code/game/objects/items/weapons/knuckledusters.dm
@@ -23,18 +23,18 @@
if(!gripped)
gripped = TRUE
to_chat(user, "You tighten your grip on [src], ensuring you won't drop it.")
- flags |= NODROP
+ set_nodrop(TRUE, user)
ADD_TRAIT(src, TRAIT_SKIP_EXAMINE, "knuckledusters")
else
gripped = FALSE
to_chat(user, "You relax your grip on [src].")
- flags &= ~NODROP
+ set_nodrop(FALSE, user)
REMOVE_TRAIT(src, TRAIT_SKIP_EXAMINE, "knuckledusters")
/obj/item/melee/knuckleduster/dropped(mob/user, silent)
. = ..()
gripped = FALSE
- flags &= ~NODROP
+ set_nodrop(FALSE, user)
REMOVE_TRAIT(src, TRAIT_SKIP_EXAMINE, "knuckledusters")
/obj/item/melee/knuckleduster/attack__legacy__attackchain(mob/living/target, mob/living/user)
diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm
index 14367dd26ef..ccded486268 100644
--- a/code/game/objects/items/weapons/powerfist.dm
+++ b/code/game/objects/items/weapons/powerfist.dm
@@ -71,7 +71,7 @@
to_chat(user, "[src] currently has no tank attached to it.")
return
to_chat(user, "As you detach [thetank] from [src], the fist unlocks.")
- flags &= ~NODROP
+ set_nodrop(FALSE, user)
tank.forceMove(get_turf(user))
user.put_in_hands(tank)
tank = null
@@ -84,8 +84,7 @@
to_chat(user, "As you hook [thetank] up to [src], the fist locks into place around your arm.")
tank = thetank
thetank.forceMove(src)
- flags |= NODROP
-
+ set_nodrop(TRUE, user)
/obj/item/melee/powerfist/attack__legacy__attackchain(mob/living/target, mob/living/user)
if(HAS_TRAIT(user, TRAIT_PACIFISM))
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index fbc328822b8..49c04c97b5e 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -430,7 +430,7 @@
if(zip_time)
slowdown = 1
if(antidrop_on_zip)
- flags ^= NODROP
+ set_nodrop(NODROP_TOGGLE, user)
update_icon(UPDATE_ICON_STATE)
return
@@ -439,7 +439,7 @@
for(var/obj/item/storage/container in src)
container.hide_from_all() // Hide everything inside the bag too
if(antidrop_on_zip)
- flags |= NODROP
+ set_nodrop(TRUE, user)
update_icon(UPDATE_ICON_STATE)
/obj/item/storage/backpack/duffel/update_icon_state()
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 0007f12082c..84041150bca 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -571,10 +571,10 @@
return ..()
/obj/item/butcher_chainsaw/proc/wield() //you can't disarm an active chainsaw, you crazy person.
- flags |= NODROP
+ set_nodrop(TRUE, loc)
/obj/item/butcher_chainsaw/proc/unwield()
- flags &= ~NODROP
+ set_nodrop(FALSE, loc)
// SINGULOHAMMER
/obj/item/singularityhammer
@@ -878,7 +878,7 @@
user.visible_message("[user] deploys [W] from [user.p_their()] wrists in a shower of sparks!", "You deploy [W] from your wrists!", "You hear the shower of sparks!")
user.put_in_hands(W)
on_cooldown = TRUE
- flags |= NODROP
+ set_nodrop(TRUE, user)
addtimer(CALLBACK(src, PROC_REF(reboot)), 2 MINUTES)
if(world.time > next_spark_time)
do_sparks(rand(1,6), 1, loc)
@@ -900,7 +900,7 @@
/obj/item/clothing/gloves/color/black/pyro_claws/proc/reboot()
on_cooldown = FALSE
- flags &= ~NODROP
+ set_nodrop(FALSE, loc)
atom_say("Internal plasma canisters recharged. Gloves sufficiently cooled")
/// Max number of atoms a broom can sweep at once
diff --git a/code/modules/antagonists/mind_flayer/powers/flayer_weapon_powers.dm b/code/modules/antagonists/mind_flayer/powers/flayer_weapon_powers.dm
index 30042c25a7b..d209c4d6b9a 100644
--- a/code/modules/antagonists/mind_flayer/powers/flayer_weapon_powers.dm
+++ b/code/modules/antagonists/mind_flayer/powers/flayer_weapon_powers.dm
@@ -36,7 +36,9 @@
if(!weapon_ref)
create_new_weapon()
- weapon_ref.flags |= (ABSTRACT | NODROP) // Just in case the item doesn't start with both of these, or somehow loses them.
+ // Just in case the item doesn't start with both of these, or somehow loses them.
+ weapon_ref.flags |= ABSTRACT
+ weapon_ref.set_nodrop(TRUE, user)
if(HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || (user.get_active_hand() && !user.drop_item()))
flayer.send_swarm_message("We cannot manifest [weapon_ref] into our active hand...")
diff --git a/code/modules/clothing/masks/misc_masks.dm b/code/modules/clothing/masks/misc_masks.dm
index e21e2be4e3d..dfc4024e7ea 100644
--- a/code/modules/clothing/masks/misc_masks.dm
+++ b/code/modules/clothing/masks/misc_masks.dm
@@ -32,7 +32,7 @@
if(security_lock)
security_lock = FALSE
locked = FALSE
- flags &= ~NODROP
+ set_nodrop(FALSE, loc)
desc += " This one appears to be broken."
return TRUE
else
@@ -46,7 +46,7 @@
else if(ACCESS_BRIG in user.get_access())
to_chat(user, "The muzzle unlocks with a click.")
locked = FALSE
- flags &= ~NODROP
+ set_nodrop(FALSE, loc)
return TRUE
to_chat(user, "You must be wearing a security ID card or have one in your inactive hand to remove the muzzle.")
@@ -55,7 +55,7 @@
/obj/item/clothing/mask/muzzle/proc/do_lock(mob/living/carbon/human/user)
if(security_lock)
locked = TRUE
- flags |= NODROP
+ set_nodrop(TRUE, loc)
return TRUE
return FALSE
diff --git a/code/modules/clothing/spacesuits/alien_suits.dm b/code/modules/clothing/spacesuits/alien_suits.dm
index 972b98a5b3a..e8f7eda45e7 100644
--- a/code/modules/clothing/spacesuits/alien_suits.dm
+++ b/code/modules/clothing/spacesuits/alien_suits.dm
@@ -216,7 +216,7 @@
/obj/item/clothing/shoes/magboots/vox/attack_self__legacy__attackchain(mob/user)
if(magpulse)
- flags &= ~NODROP
+ set_nodrop(FALSE, loc)
to_chat(user, "You relax your deathgrip on the flooring.")
else
//make sure these can only be used when equipped.
@@ -226,7 +226,7 @@
if(H.shoes != src)
to_chat(user, "You will have to put on [src] before you can do that.")
return
- flags |= NODROP //kinda hard to take off magclaws when you are gripping them tightly.
+ set_nodrop(TRUE, loc) //kinda hard to take off magclaws when you are gripping them tightly.
to_chat(user, "You dig your claws deeply into the flooring, bracing yourself.")
to_chat(user, "It would be hard to take off [src] without relaxing your grip first.")
return ..()
@@ -238,7 +238,7 @@
user.visible_message("[src] go limp as they are removed from [usr]'s feet.", "[src] go limp as they are removed from your feet.")
magpulse = FALSE
no_slip = FALSE
- flags &= ~NODROP
+ set_nodrop(FALSE, loc)
/obj/item/clothing/shoes/magboots/vox/examine(mob/user)
. = ..()
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index 5cf6a5446c5..4eade0ff155 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -138,9 +138,9 @@
if(user.head && istype(user.head, /obj/item/clothing/head/helmet/space/chronos))
to_chat(user, "\[ ok \] Mounting /dev/helmet")
helmet = user.head
- helmet.flags |= NODROP
+ helmet.set_nodrop(TRUE, loc)
helmet.suit = src
- flags |= NODROP
+ set_nodrop(TRUE, loc)
to_chat(user, "\[ ok \] Starting brainwave scanner")
to_chat(user, "\[ ok \] Starting ui display driver")
to_chat(user, "\[ ok \] Initializing chronowalk4-view")
@@ -169,11 +169,11 @@
to_chat(user, "\[ ok \] Stopping ui display driver")
to_chat(user, "\[ ok \] Stopping brainwave scanner")
to_chat(user, "\[ ok \] Unmounting /dev/helmet")
- helmet.flags &= ~NODROP
+ helmet.set_nodrop(FALSE, loc)
helmet.suit = null
helmet = null
to_chat(user, "logout")
- flags &= ~NODROP
+ set_nodrop(FALSE, loc)
cooldown = world.time + cooldowntime * 1.5
activated = FALSE
activating = FALSE
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 60c558837e2..d0e15704a1f 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -269,7 +269,7 @@
C.name = "Sax"
C.real_name = "Sax"
var/obj/item/clothing/head/det_hat/D = new
- D.flags |= NODROP
+ D.set_nodrop(TRUE, loc)
C.place_on_head(D)
C.visible_message("[C] suddenly winks into existence at [user]'s feet!")
to_chat(user, "[src] crumbles to dust in your hands!")
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 2539e98ed35..aa7d9b32143 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -264,8 +264,8 @@
user.next_move_modifier *= BERSERK_ATTACK_SPEED_MODIFIER
user.add_atom_colour(BERSERK_COLOUR, TEMPORARY_COLOUR_PRIORITY)
ADD_TRAIT(user, TRAIT_CHUNKYFINGERS, BERSERK_TRAIT)
- flags |= NODROP
- suit.flags |= NODROP
+ set_nodrop(TRUE)
+ suit.set_nodrop(TRUE, loc)
berserk_active = TRUE
START_PROCESSING(SSobj, src)
@@ -284,8 +284,8 @@
user.next_move_modifier /= BERSERK_ATTACK_SPEED_MODIFIER
user.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, BERSERK_COLOUR)
REMOVE_TRAIT(user, TRAIT_CHUNKYFINGERS, BERSERK_TRAIT)
- flags &= ~NODROP
- suit.flags &= ~NODROP
+ set_nodrop(FALSE)
+ suit.set_nodrop(FALSE)
STOP_PROCESSING(SSobj, src)
/datum/action/item_action/berserk_mode
@@ -396,7 +396,7 @@
qdel(src) // Oh no! Oh well a new rod will be made from the STATUS_EFFECT_HIPPOCRATIC_OATH
return
- flags |= NODROP // Readd the nodrop
+ set_nodrop(TRUE, loc)
var/mob/living/carbon/human/H = owner
var/limb_regrown = FALSE
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index 886d2cc1c0c..1ceba7a3ee4 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -139,7 +139,7 @@
target.equip_to_slot_if_possible(src, ITEM_SLOT_MASK, FALSE, TRUE)
if(!sterile)
M.KnockDown(impregnation_time + 2 SECONDS)
- flags |= NODROP //You can't take it off until it dies... or figures out you're an IPC.
+ set_nodrop(TRUE, loc) //You can't take it off until it dies... or figures out you're an IPC.
GoIdle() //so it doesn't jump the people that tear it off
var/obj/structure/bed/nest/our_nest = M.buckled
@@ -149,7 +149,7 @@
return TRUE
/obj/item/clothing/mask/facehugger/proc/Impregnate(mob/living/target)
- flags &= ~NODROP
+ set_nodrop(FALSE, loc)
if(!target || target.stat == DEAD || loc != target) //was taken off or something
return
diff --git a/code/modules/mob/living/carbon/human/human_inventory.dm b/code/modules/mob/living/carbon/human/human_inventory.dm
index 1825b2b79de..3151948540b 100644
--- a/code/modules/mob/living/carbon/human/human_inventory.dm
+++ b/code/modules/mob/living/carbon/human/human_inventory.dm
@@ -244,9 +244,11 @@
if(ITEM_SLOT_LEFT_HAND)
l_hand = I
update_inv_l_hand()
+ update_hands_hud()
if(ITEM_SLOT_RIGHT_HAND)
r_hand = I
update_inv_r_hand()
+ update_hands_hud()
if(ITEM_SLOT_BELT)
belt = I
update_inv_belt()
diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm
index 62488b8113e..a4c5d79aeff 100644
--- a/code/modules/mob/living/carbon/superheroes.dm
+++ b/code/modules/mob/living/carbon/superheroes.dm
@@ -20,7 +20,7 @@
/datum/superheroes/proc/fixflags(mob/living/carbon/human/H)
for(var/obj/item/W in H.get_all_slots())
- W.flags |= NODROP
+ W.set_nodrop(TRUE, H)
/datum/superheroes/proc/assign_mutations(mob/living/carbon/human/H)
var/list/default_mutations = list(GLOB.regenerateblock, GLOB.breathlessblock, GLOB.coldblock)
@@ -51,7 +51,7 @@
W.icon_state = "lifetimeid"
W.SetOwnerInfo(H)
W.UpdateName()
- W.flags |= NODROP
+ W.set_nodrop(TRUE, H)
H.equip_to_slot_or_del(W, ITEM_SLOT_ID)
H.regenerate_icons()
@@ -233,7 +233,7 @@
W.access = list(ACCESS_MAINT_TUNNELS)
W.assignment = "Greyshirt"
W.rank = "Greyshirt"
- W.flags |= NODROP
+ W.set_nodrop(TRUE, W.loc)
W.SetOwnerInfo(target)
W.UpdateName()
target.equip_to_slot_or_del(W, ITEM_SLOT_ID)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index eccf45bb928..430020ae3b3 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -138,7 +138,7 @@
/obj/item/robot_module/proc/fix_modules()
for(var/item in modules)
var/obj/item/I = item
- I.flags |= NODROP
+ I.set_nodrop(TRUE)
I.mouse_opacity = MOUSE_OPACITY_OPAQUE
/**
@@ -184,7 +184,7 @@
I.forceMove(src)
modules += I
- I.flags |= NODROP
+ I.set_nodrop(TRUE)
I.mouse_opacity = MOUSE_OPACITY_OPAQUE
if(requires_rebuild)
diff --git a/code/modules/mob/living/simple_animal/hostile/floorcluwne.dm b/code/modules/mob/living/simple_animal/hostile/floorcluwne.dm
index 4a98a04f254..b34931c644d 100644
--- a/code/modules/mob/living/simple_animal/hostile/floorcluwne.dm
+++ b/code/modules/mob/living/simple_animal/hostile/floorcluwne.dm
@@ -49,7 +49,7 @@
remove_from_all_data_huds()
var/obj/item/card/id/access_card = new (src)
access_card.access = get_all_accesses()//THERE IS NO ESCAPE
- access_card.flags |= NODROP
+ access_card.set_nodrop(TRUE)
invalid_area_typecache = typecacheof(invalid_area_typecache)
Manifest()
if(!current_victim)
diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm
index 5a6c859b50e..9c79a976548 100644
--- a/code/modules/mod/mod_activation.dm
+++ b/code/modules/mod/mod_activation.dm
@@ -81,7 +81,7 @@
overslot.forceMove(part)
RegisterSignal(part, COMSIG_ATOM_EXITED, PROC_REF(on_overslot_exit))
if(wearer.equip_to_slot_if_possible(part, part.slot_flags, disable_warning = TRUE))
- part.flags |= NODROP
+ part.set_nodrop(TRUE)
if(mass)
return TRUE
wearer.visible_message("[wearer]'s [part.name] deploy[part.p_s()] with a mechanical hiss.",
@@ -103,7 +103,7 @@
return FALSE
to_chat(user, "You already have retracted there!")
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- part.flags &= ~NODROP
+ part.set_nodrop(FALSE)
wearer.transfer_item_to(part, src, force = TRUE)
if(overslotting_parts[part])
UnregisterSignal(part, COMSIG_ATOM_EXITED)
diff --git a/code/modules/ninja/suit/ninja_suit.dm b/code/modules/ninja/suit/ninja_suit.dm
index b5ee1aedda7..b9cd1dbdff3 100644
--- a/code/modules/ninja/suit/ninja_suit.dm
+++ b/code/modules/ninja/suit/ninja_suit.dm
@@ -55,12 +55,12 @@ Contents:
suitShoes = user.shoes
suitOccupant = user
- flags |= NODROP
- suitHood.flags |= NODROP
- suitMask.flags |= NODROP
- suitGloves.flags |= NODROP
+ set_nodrop(TRUE)
+ suitHood.set_nodrop(TRUE)
+ suitMask.set_nodrop(TRUE)
+ suitGloves.set_nodrop(TRUE)
suitGloves.pickpocket = 1
- suitShoes.flags |= NODROP
+ suitShoes.set_nodrop(TRUE)
suitShoes.slowdown = -2
icon_state = (user.gender == MALE ? "s-ninjan" : "s-ninjanf")
@@ -70,12 +70,12 @@ Contents:
return 1
else
- flags &= ~NODROP
- suitHood.flags &= ~NODROP
- suitMask.flags &= ~NODROP
- suitGloves.flags &= ~NODROP
+ set_nodrop(FALSE)
+ suitHood.set_nodrop(FALSE)
+ suitMask.set_nodrop(FALSE)
+ suitGloves.set_nodrop(FALSE)
suitGloves.pickpocket = 0
- suitShoes.flags &= ~NODROP
+ suitShoes.set_nodrop(FALSE)
suitShoes.slowdown = -1
icon_state = "s-ninja"
suitGloves.icon_state = "s-ninja"
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index 3f285725ee2..64aa4c7691e 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -107,7 +107,7 @@
holder = item
- holder.flags |= NODROP
+ holder.set_nodrop(TRUE, owner)
holder.resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
holder.slot_flags = null
holder.w_class = WEIGHT_CLASS_HUGE
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index 7af4cdbc63b..4b14d50ae79 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -62,14 +62,14 @@
if(owner.l_hand.flags & NODROP)
l_hand_ignore = TRUE
else
- owner.l_hand.flags |= NODROP
+ owner.l_hand.set_nodrop(TRUE, owner)
l_hand_ignore = FALSE
if(r_hand_obj)
if(owner.r_hand.flags & NODROP)
r_hand_ignore = TRUE
else
- owner.r_hand.flags |= NODROP
+ owner.r_hand.set_nodrop(TRUE, owner)
r_hand_ignore = FALSE
if(!l_hand_obj && !r_hand_obj)
@@ -116,9 +116,9 @@
/obj/item/organ/internal/cyberimp/brain/anti_drop/proc/release_items()
active = FALSE
if(!l_hand_ignore && l_hand_obj)
- l_hand_obj.flags &= ~NODROP
+ l_hand_obj.set_nodrop(FALSE, owner)
if(!r_hand_ignore && r_hand_obj)
- r_hand_obj.flags &= ~NODROP
+ r_hand_obj.set_nodrop(FALSE, owner)
/obj/item/organ/internal/cyberimp/brain/anti_drop/remove(mob/living/carbon/M, special = 0)
if(active)
diff --git a/code/modules/surgery/organs/subtypes/standard_organs.dm b/code/modules/surgery/organs/subtypes/standard_organs.dm
index 83073b689fc..91a1ae4424c 100644
--- a/code/modules/surgery/organs/subtypes/standard_organs.dm
+++ b/code/modules/surgery/organs/subtypes/standard_organs.dm
@@ -210,7 +210,7 @@
/obj/item/organ/external/hand/proc/update_hand_missing()
// we need to come back to this once the hand is actually removed/dead
- if(!owner) // Rather not have this trigger on already remove limbs
+ if(!owner) // Rather not have this trigger on already removed limbs
return
addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/living/carbon/human, update_hands_hud), 0))
diff --git a/icons/mob/screen_midnight.dmi b/icons/mob/screen_midnight.dmi
index 1278f026352..b22e6afe042 100644
Binary files a/icons/mob/screen_midnight.dmi and b/icons/mob/screen_midnight.dmi differ