diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 8566571928..1c3832001f 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -20,13 +20,12 @@ #define FORCE_STRING_OVERRIDE (1<<2) // used for tooltips #define NEEDS_PERMIT (1<<3) //Used by security bots to determine if this item is safe for public use. #define SLOWS_WHILE_IN_HAND (1<<4) -#define NO_MAT_REDEMPTION (1<<5) // Stops you from putting things like an RCD or other items into an ORM or protolathe for materials. -#define DROPDEL (1<<6) // When dropped, it calls qdel on itself +#define NO_MAT_REDEMPTION (1<<5) // Stops you from putting things like an RCD or other items into an ORM or protolathe for materials. +#define DROPDEL (1<<6) // When dropped, it calls qdel on itself #define NOBLUDGEON (1<<7) // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby() -#define NODROP (1<<8) // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted. -#define ABSTRACT (1<<9) // for all things that are technically items but used for various different stuff -#define IMMUTABLE_SLOW (1<<10) //When players should not be able to change the slowdown of the item (Speed potions, ect) -#define SURGICAL_TOOL (1<<12) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes) +#define ABSTRACT (1<<8) // for all things that are technically items but used for various different stuff +#define IMMUTABLE_SLOW (1<<9) //When players should not be able to change the slowdown of the item (Speed potions, ect) +#define SURGICAL_TOOL (1<<10) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes) // Flags for the clothing_flags var on /obj/item/clothing diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 99eb892fc8..7bcb4881f0 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -120,6 +120,9 @@ //non-mob traits #define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it +// item traits +#define TRAIT_NODROP "nodrop" + #define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" #define TRAIT_AGEUSIA "ageusia" #define TRAIT_HEAVY_SLEEPER "heavy_sleeper" @@ -156,6 +159,12 @@ #define SPECIES_TRAIT "species" #define ORGAN_TRAIT "organ" #define JOB_TRAIT "job" +#define CYBORG_ITEM_TRAIT "cyborg-item" +#define ADMIN_TRAIT "admin" // (B)admins only. +#define CHANGELING_TRAIT "changeling" +#define CULT_TRAIT "cult" +#define CURSED_ITEM_TRAIT "cursed-item" // The item is magically cursed +#define ABSTRACT_ITEM_TRAIT "abstract-item" #define ROUNDSTART_TRAIT "roundstart" //cannot be removed without admin intervention // unique trait sources, still defines @@ -168,3 +177,24 @@ #define STASIS_MUTE "stasis" #define GENETICS_SPELL "genetics_spell" #define EYES_COVERED "eyes_covered" +#define CULT_TRAIT "cult" +#define CLOWN_NUKE_TRAIT "clown-nuke" +#define STICKY_MOUSTACHE_TRAIT "sticky-moustache" +#define CHAINSAW_FRENZY_TRAIT "chainsaw-frenzy" +#define CHRONO_GUN_TRAIT "chrono-gun" +#define REVERSE_BEAR_TRAP_TRAIT "reverse-bear-trap" +#define GLUED_ITEM_TRAIT "glued-item" +#define CURSED_MASK_TRAIT "cursed-mask" +#define HIS_GRACE_TRAIT "his-grace" +#define HAND_REPLACEMENT_TRAIT "magic-hand" +#define HOT_POTATO_TRAIT "hot-potato" +#define SABRE_SUICIDE_TRAIT "sabre-suicide" +#define ABDUCTOR_VEST_TRAIT "abductor-vest" +#define CAPTURE_THE_FLAG_TRAIT "capture-the-flag" +#define EYE_OF_GOD_TRAIT "eye-of-god" +#define SHAMEBRERO_TRAIT "shamebrero" +#define CHRONOSUIT_TRAIT "chronosuit" +#define FLIGHTSUIT_TRAIT "flightsuit" +#define LOCKED_HELMET_TRAIT "locked-helmet" +#define NINJA_SUIT_TRAIT "ninja-suit" +#define ANTI_DROP_IMPLANT_TRAIT "anti-drop-implant" \ No newline at end of file diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index b861af633d..bb9fc98b8e 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -47,7 +47,6 @@ GLOBAL_LIST_INIT(bitfields, list( "NO_MAT_REDEMPTION" = NO_MAT_REDEMPTION, "DROPDEL" = DROPDEL, "NOBLUDGEON" = NOBLUDGEON, - "NODROP" = NODROP, "ABSTRACT" = ABSTRACT, ), "admin_flags" = list( diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 52d0036154..0c701cb943 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -592,7 +592,7 @@ if(!stop_messages) to_chat(M, "[IP] cannot hold [I] as it's a storage item of the same size!") return FALSE //To prevent the stacking of same sized storage items. - if(I.item_flags & NODROP) //SHOULD be handled in unEquip, but better safe than sorry. + if(HAS_TRAIT(I, TRAIT_NODROP)) //SHOULD be handled in unEquip, but better safe than sorry. to_chat(M, "\the [I] is stuck to your hand, you can't put it in \the [host]!") return FALSE var/datum/component/storage/concrete/master = master() diff --git a/code/game/gamemodes/clown_ops/bananium_bomb.dm b/code/game/gamemodes/clown_ops/bananium_bomb.dm index 0d5f0691c4..ece1db88e0 100644 --- a/code/game/gamemodes/clown_ops/bananium_bomb.dm +++ b/code/game/gamemodes/clown_ops/bananium_bomb.dm @@ -42,17 +42,17 @@ var/obj/item/clothing/C if(!H.w_uniform || H.dropItemToGround(H.w_uniform)) C = new /obj/item/clothing/under/rank/clown(H) - C.item_flags |= NODROP //mwahaha + ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT) H.equip_to_slot_or_del(C, SLOT_W_UNIFORM) if(!H.shoes || H.dropItemToGround(H.shoes)) C = new /obj/item/clothing/shoes/clown_shoes(H) - C.item_flags |= NODROP + ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT) H.equip_to_slot_or_del(C, SLOT_SHOES) if(!H.wear_mask || H.dropItemToGround(H.wear_mask)) C = new /obj/item/clothing/mask/gas/clown_hat(H) - C.item_flags |= NODROP + ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT) H.equip_to_slot_or_del(C, SLOT_WEAR_MASK) H.dna.add_mutation(CLOWNMUT) diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index a3440fad39..9d1a3b650c 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -216,11 +216,11 @@ /obj/item/clothing/mask/fakemoustache/sticky/Initialize() . = ..() - item_flags |= NODROP + ADD_TRAIT(src, TRAIT_NODROP, STICKY_MOUSTACHE_TRAIT) addtimer(CALLBACK(src, .proc/unstick), unstick_time) /obj/item/clothing/mask/fakemoustache/sticky/proc/unstick() - item_flags &= ~NODROP + ADD_TRAIT(src, TRAIT_NODROP, STICKY_MOUSTACHE_TRAIT) //DARK H.O.N.K. AND CLOWN MECH WEAPONS diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index 7b7c8a3411..4210435f33 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -69,7 +69,7 @@ if(defib) to_chat(user, "There's already a defibrillator in [src]!") return - if(I.item_flags & NODROP || !user.transferItemToLoc(I, src)) + if(HAS_TRAIT(I, TRAIT_NODROP) || !user.transferItemToLoc(I, src)) to_chat(user, "[I] is stuck to your hand!") return user.visible_message("[user] hooks up [I] to [src]!", \ diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm index 0042da1c92..8be7becfdd 100644 --- a/code/game/machinery/harvester.dm +++ b/code/game/machinery/harvester.dm @@ -65,7 +65,7 @@ if(!isitem(A)) continue var/obj/item/I = A - if(!(I.item_flags & NODROP)) + if(!HAS_TRAIT(I, TRAIT_NODROP)) say("Subject may not have abiotic items on.") playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1) return diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 7e8094c9e7..32d91ee76a 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -131,7 +131,7 @@ var/obj/item/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc) victim.log_message("entered a blood frenzy", LOG_ATTACK) - chainsaw.item_flags |= NODROP + ADD_TRAIT(chainsaw, TRAIT_NODROP, CHAINSAW_FRENZY_TRAIT) victim.drop_all_held_items() victim.put_in_hands(chainsaw, forced = TRUE) chainsaw.attack_self(victim) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index cb979e8188..384a1e4ee4 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -817,6 +817,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) return ..() /obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback) - if (item_flags & NODROP) + if (HAS_TRAIT(src, TRAIT_NODROP)) return return ..() diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index 344e7c5472..5db5aa416e 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -48,7 +48,7 @@ icon_state = "chronogun" item_state = "chronogun" w_class = WEIGHT_CLASS_NORMAL - item_flags = NODROP | DROPDEL + item_flags = DROPDEL ammo_type = list(/obj/item/ammo_casing/energy/chrono_beam) can_charge = 0 fire_delay = 50 @@ -58,6 +58,7 @@ /obj/item/gun/energy/chrono_gun/Initialize() . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHRONO_GUN_TRAIT) if(istype(loc, /obj/item/chrono_eraser)) TED = loc else //admin must have spawned it @@ -150,8 +151,8 @@ gun = loc . = ..() - - + + /obj/effect/chrono_field diff --git a/code/game/objects/items/devices/glue.dm b/code/game/objects/items/devices/glue.dm index fed582d951..2c57ede706 100644 --- a/code/game/objects/items/devices/glue.dm +++ b/code/game/objects/items/devices/glue.dm @@ -19,11 +19,11 @@ return if(istype(target, /obj/item)) var/obj/item/I = target - if(I.item_flags & NODROP) + if(HAS_TRAIT_FROM(I, TRAIT_NODROP, GLUED_ITEM_TRAIT)) to_chat(user, "[I] is already sticky!") return uses -= 1 - I.item_flags |= NODROP + ADD_TRAIT(I, TRAIT_NODROP, GLUED_ITEM_TRAIT) I.desc += " It looks sticky." to_chat(user, "You smear the [I] with glue, making it incredibly sticky!") if(uses == 0) diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index c362d9f7f2..637bb794d3 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -156,7 +156,10 @@ GLOBAL_LIST_EMPTY(GPS_list) icon_state = "gps-b" gpstag = "BORG0" desc = "A mining cyborg internal positioning system. Used as a recovery beacon for damaged cyborg assets, or a collaboration tool for mining teams." - item_flags = NODROP + +/obj/item/gps/cyborg/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT) /obj/item/gps/internal icon_state = null diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 2f8b111b4b..b74b0fa3d4 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -38,7 +38,7 @@ /obj/item/electropack/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/clothing/head/helmet)) - var/obj/item/assembly/shock_kit/A = new /obj/item/assembly/shock_kit( user ) + var/obj/item/assembly/shock_kit/A = new /obj/item/assembly/shock_kit(user) A.icon = 'icons/obj/assemblies.dmi' if(!user.transferItemToLoc(W, A)) @@ -53,8 +53,6 @@ user.put_in_hands(A) A.add_fingerprint(user) - if(item_flags & NODROP) - A.item_flags |= NODROP else return ..() @@ -106,8 +104,7 @@ if(shock_cooldown != 0) return shock_cooldown = 1 - spawn(100) - shock_cooldown = 0 + addtimer(VARSET_CALLBACK(src, shock_cooldown, 0), 100) var/mob/living/L = loc step(L, pick(GLOB.cardinals)) diff --git a/code/game/objects/items/devices/reverse_bear_trap.dm b/code/game/objects/items/devices/reverse_bear_trap.dm index 2f137861aa..20107373d3 100644 --- a/code/game/objects/items/devices/reverse_bear_trap.dm +++ b/code/game/objects/items/devices/reverse_bear_trap.dm @@ -49,7 +49,7 @@ if(iscarbon(user)) var/mob/living/carbon/C = user if(C.get_item_by_slot(SLOT_HEAD) == src) - if((item_flags & NODROP) && !struggling) + if(HAS_TRAIT_FROM(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT) && !struggling) struggling = TRUE var/fear_string switch(time_left) @@ -74,7 +74,7 @@ else user.visible_message("The lock on [user]'s [name] pops open!", \ "You force open the padlock!", "You hear a single, pronounced click!") - item_flags &= ~NODROP + REMOVE_TRAIT(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT) struggling = FALSE else ..() @@ -116,7 +116,7 @@ /obj/item/reverse_bear_trap/proc/reset() ticking = FALSE - item_flags &= ~NODROP + REMOVE_TRAIT(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT) soundloop.stop() soundloop2.stop() STOP_PROCESSING(SSprocessing, src) @@ -125,7 +125,7 @@ ticking = TRUE escape_chance = initial(escape_chance) //we keep these vars until re-arm, for tracking purposes time_left = initial(time_left) - item_flags |= NODROP + ADD_TRAIT(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT) soundloop.start() soundloop2.mid_length = initial(soundloop2.mid_length) soundloop2.start() diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index 62c41f7155..21f6961e5d 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -279,9 +279,7 @@ /obj/item/book/granter/spell/barnyard/recoil(mob/living/carbon/user) if(ishuman(user)) to_chat(user,"HORSIE HAS RISEN") - var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead - magichead.item_flags |= NODROP //curses! - magichead.flags_inv &= ~HIDEFACE //so you can still see their face + var/obj/item/clothing/magichead = new /obj/item/clothing/mask/horsehead/cursed(user.drop_location()) user.dropItemToGround(user.wear_mask, TRUE) user.equip_to_slot_if_possible(magichead, SLOT_WEAR_MASK, TRUE, TRUE) qdel(src) diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm index f9d00b6213..6e977331a6 100644 --- a/code/game/objects/items/his_grace.dm +++ b/code/game/objects/items/his_grace.dm @@ -90,7 +90,7 @@ do_attack_animation(master, null, src) master.emote("scream") master.remove_status_effect(STATUS_EFFECT_HISGRACE) - item_flags &= ~NODROP + REMOVE_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT) master.Knockdown(60) master.adjustBruteLoss(master.maxHealth) playsound(master, 'sound/effects/splat.ogg', 100, 0) @@ -198,20 +198,20 @@ update_stats() /obj/item/his_grace/proc/update_stats() - item_flags &= ~NODROP + REMOVE_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT) var/mob/living/master = get_atom_on_turf(src, /mob/living) 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) - item_flags |= NODROP + ADD_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT) 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) - item_flags |= NODROP + ADD_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT) 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/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 06aef0a22b..0e8a9fef9e 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -280,12 +280,19 @@ righthand_file = 'icons/mob/inhands/items_righthand.dmi' name = "god hand" desc = "This hand of yours glows with an awesome power!" - item_flags = ABSTRACT | NODROP | DROPDEL + item_flags = ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_HUGE hitsound = 'sound/weapons/sear.ogg' damtype = BURN attack_verb = list("punched", "cross countered", "pummeled") + +/obj/item/nullrod/godhand/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) + + + /obj/item/nullrod/staff icon_state = "godstaff-red" item_state = "godstaff-red" @@ -525,13 +532,14 @@ lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' w_class = WEIGHT_CLASS_HUGE - item_flags = NODROP | ABSTRACT + item_flags = ABSTRACT sharpness = IS_SHARP attack_verb = list("sawed", "torn", "cut", "chopped", "diced") hitsound = 'sound/weapons/chainsawhit.ogg' /obj/item/nullrod/chainsaw/Initialize() . = ..() + ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) AddComponent(/datum/component/butchering, 30, 100, 0, hitsound) /obj/item/nullrod/clown @@ -601,12 +609,13 @@ item_state = "arm_blade" lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' - item_flags = ABSTRACT | NODROP + item_flags = ABSTRACT w_class = WEIGHT_CLASS_HUGE sharpness = IS_SHARP /obj/item/nullrod/armblade/Initialize() . = ..() + ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) AddComponent(/datum/component/butchering, 80, 70) /obj/item/nullrod/armblade/tentacle diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm index db7f38ddf3..e7b05d7a01 100644 --- a/code/game/objects/items/hot_potato.dm +++ b/code/game/objects/items/hot_potato.dm @@ -134,7 +134,7 @@ return update_icon() if(sticky) - item_flags |= NODROP + ADD_TRAIT(src, TRAIT_NODROP, HOT_POTATO_TRAIT) name = "primed [name]" activation_time = timer + world.time detonation_timerid = addtimer(CALLBACK(src, .proc/detonate), delay, TIMER_STOPPABLE) @@ -147,7 +147,7 @@ /obj/item/hot_potato/proc/deactivate() update_icon() name = initial(name) - item_flags &= ~NODROP + REMOVE_TRAIT(src, TRAIT_NODROP, HOT_POTATO_TRAIT) deltimer(detonation_timerid) STOP_PROCESSING(SSfastprocess, src) detonation_timerid = null diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 33a48c17bb..f11ea7e0b4 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -92,8 +92,7 @@ /obj/item/melee/sabre/suicide_act(mob/living/user) user.visible_message("[user] is trying to cut off all [user.p_their()] limbs with [src]! it looks like [user.p_theyre()] trying to commit suicide!") var/i = 0 - var/originally_nodropped = item_flags & NODROP - item_flags |= NODROP + ADD_TRAIT(src, TRAIT_NODROP, SABRE_SUICIDE_TRAIT) if(iscarbon(user)) var/mob/living/carbon/Cuser = user var/obj/item/bodypart/holding_bodypart = Cuser.get_holding_bodypart_of_item(src) @@ -118,7 +117,7 @@ for(bodypart in limbs_to_dismember) i++ addtimer(CALLBACK(src, .proc/suicide_dismember, user, bodypart), speedbase * i) - addtimer(CALLBACK(src, .proc/manual_suicide, user, originally_nodropped), (5 SECONDS) * i) + addtimer(CALLBACK(src, .proc/manual_suicide, user), (5 SECONDS) * i) return MANUAL_SUICIDE /obj/item/melee/sabre/proc/suicide_dismember(mob/living/user, obj/item/bodypart/affecting) @@ -131,8 +130,7 @@ if(!QDELETED(user)) user.adjustBruteLoss(200) user.death(FALSE) - if(!originally_nodropped) - item_flags &= ~NODROP + REMOVE_TRAIT(src, TRAIT_NODROP, SABRE_SUICIDE_TRAIT) /obj/item/melee/classic_baton name = "police baton" diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 9239973247..9ac5261e5f 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -249,8 +249,8 @@ // Copied from /obj/item/melee/transforming/energy/sword/attackby /obj/item/toy/sword/attackby(obj/item/W, mob/living/user, params) if(istype(W, /obj/item/toy/sword)) - if((W.item_flags & NODROP) || (item_flags & NODROP)) - to_chat(user, "\the [item_flags & NODROP ? src : W] is stuck to your hand, you can't attach it to \the [item_flags & NODROP ? W : src]!") + if(HAS_TRAIT(W, TRAIT_NODROP) || HAS_TRAIT(src, TRAIT_NODROP)) + to_chat(user, "\the [HAS_TRAIT(src, TRAIT_NODROP) ? src : W] is stuck to your hand, you can't attach it to \the [HAS_TRAIT(src, TRAIT_NODROP) ? W : src]!") return else to_chat(user, "You attach the ends of the two plastic swords, making a single double-bladed toy! You're fake-cool.") diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index ccc703296e..48681c3d6d 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -81,7 +81,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/claymore/highlander //ALL COMMENTS MADE REGARDING THIS SWORD MUST BE MADE IN ALL CAPS desc = "THERE CAN BE ONLY ONE, AND IT WILL BE YOU!!!\nActivate it in your hand to point to the nearest victim." flags_1 = CONDUCT_1 - item_flags = NODROP | DROPDEL + item_flags = DROPDEL slot_flags = null block_chance = 0 //RNG WON'T HELP YOU NOW, PANSY light_range = 3 @@ -91,6 +91,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/claymore/highlander/Initialize() . = ..() + ADD_TRAIT(src, TRAIT_NODROP, HIGHLANDER) START_PROCESSING(SSobj, src) /obj/item/claymore/highlander/Destroy() @@ -225,7 +226,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/katana/cursed slot_flags = null - item_flags = NODROP + +/obj/item/katana/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT) /obj/item/katana/suicide_act(mob/user) user.visible_message("[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku!") @@ -255,7 +259,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 user.put_in_hands(S) to_chat(user, "You fasten the glass shard to the top of the rod with the cable.") - else if(istype(I, /obj/item/assembly/igniter) && !(I.item_flags & NODROP)) + else if(istype(I, /obj/item/assembly/igniter) && !HAS_TRAIT(I, TRAIT_NODROP)) var/obj/item/melee/baton/cattleprod/P = new /obj/item/melee/baton/cattleprod remove_item_from_storage(user) @@ -418,7 +422,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 item_state = "mounted_chainsaw" lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' - item_flags = NODROP | ABSTRACT | DROPDEL + item_flags = ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_HUGE force = 24 throwforce = 0 @@ -428,6 +432,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_verb = list("sawed", "torn", "cut", "chopped", "diced") hitsound = 'sound/weapons/chainsawhit.ogg' +/obj/item/mounted_chainsaw/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) + /obj/item/mounted_chainsaw/Destroy() var/obj/item/bodypart/part new /obj/item/twohanded/required/chainsaw(get_turf(src)) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index cbdb0750e2..d65ef4c846 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -147,47 +147,45 @@ /obj/structure/closet/proc/insert(atom/movable/AM) if(contents.len >= storage_capacity) return -1 + if(insertion_allowed(AM)) + AM.forceMove(src) + return TRUE + else + return FALSE +/obj/structure/closet/proc/insertion_allowed(atom/movable/AM) if(ismob(AM)) if(!isliving(AM)) //let's not put ghosts or camera mobs inside closets... - return + return FALSE var/mob/living/L = AM if(L.anchored || L.buckled || L.incorporeal_move || L.has_buckled_mobs()) - return + return FALSE if(L.mob_size > MOB_SIZE_TINY) // Tiny mobs are treated as items. if(horizontal && L.density) - return + return FALSE if(L.mob_size > max_mob_size) - return + return FALSE var/mobs_stored = 0 for(var/mob/living/M in contents) if(++mobs_stored >= mob_storage_capacity) - return + return FALSE L.stop_pulling() else if(istype(AM, /obj/structure/closet)) - return + return FALSE else if(istype(AM, /obj/effect)) - return + return FALSE else if(isobj(AM)) - if (istype(AM, /obj/item)) - var/obj/item/I = AM - if (I.item_flags & NODROP) - return + if((!allow_dense && AM.density) || AM.anchored || AM.has_buckled_mobs()) + return TRUE + if(isitem(AM) && HAS_TRAIT(AM, TRAIT_NODROP)) + return TRUE else if(!allow_objects && !istype(AM, /obj/effect/dummy/chameleon)) - return - if(!allow_dense && AM.density) - return - if(AM.anchored || AM.has_buckled_mobs()) - return + return FALSE else - return - - AM.forceMove(src) - - return 1 + return FALSE /obj/structure/closet/proc/close(mob/living/user) if(!opened || !can_close(user)) diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm index aa55cd81b1..80ffced5a2 100644 --- a/code/game/objects/structures/manned_turret.dm +++ b/code/game/objects/structures/manned_turret.dm @@ -180,12 +180,13 @@ icon = 'icons/obj/items_and_weapons.dmi' icon_state = "offhand" w_class = WEIGHT_CLASS_HUGE - item_flags = ABSTRACT | NODROP | NOBLUDGEON | DROPDEL + item_flags = ABSTRACT | NOBLUDGEON | DROPDEL resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF var/obj/machinery/manned_turret/turret /obj/item/gun_control/Initialize() . = ..() + ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) turret = loc if(!istype(turret)) return INITIALIZE_HINT_QDEL diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index 66358dc080..7d74387c43 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -422,7 +422,7 @@ H.equip_to_slot_or_del(I, SLOT_W_UNIFORM) qdel(olduniform) if(droptype == "Yes") - I.item_flags |= NODROP + ADD_TRAIT(I, TRAIT_NODROP, ADMIN_TRAIT) else to_chat(H, "You're not kawaii enough for this.") diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index ca491d8cab..1573204d88 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -30,9 +30,12 @@ var/combat_armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 90, "acid" = 90) /obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop() - item_flags ^= NODROP + if(HAS_TRAIT_FROM(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT)) + REMOVE_TRAIT(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) + else + ADD_TRAIT(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) if(ismob(loc)) - to_chat(loc, "Your vest is now [item_flags & NODROP ? "locked" : "unlocked"].") + to_chat(loc, "Your vest is now [HAS_TRAIT_FROM(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) ? "locked" : "unlocked"].") /obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode() switch(mode) diff --git a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm index e2b881d147..a69c8fdeff 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm @@ -17,7 +17,7 @@ var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H if(V) console.AddVest(V) - V.item_flags |= NODROP + ADD_TRAIT(V, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) var/obj/item/storage/backpack/B = locate() in H if(B) diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm index 52bda50b86..46d69ba9bb 100644 --- a/code/modules/antagonists/abductor/machinery/console.dm +++ b/code/modules/antagonists/abductor/machinery/console.dm @@ -75,7 +75,7 @@ dat+="
" dat += "Select Agent Vest Disguise
" - dat += "[vest.item_flags & NODROP ? "Unlock" : "Lock"] Vest
" + dat += "[HAS_TRAIT_FROM(vest, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) ? "Unlock" : "Lock"] Vest
" else dat += "NO AGENT VEST DETECTED" var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index ede3c2fc58..4e0595362c 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -155,7 +155,7 @@ item_state = "arm_blade" lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' - item_flags = NEEDS_PERMIT | ABSTRACT | NODROP | DROPDEL + item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_HUGE force = 25 throwforce = 0 //Just to be on the safe side @@ -169,6 +169,7 @@ /obj/item/melee/arm_blade/Initialize(mapload,silent,synthetic) . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) if(ismob(loc) && !silent) loc.visible_message("A grotesque blade forms around [loc.name]\'s arm!", "Our arm twists and mutates, transforming it into a deadly blade.", "You hear organic matter ripping and tearing!") if(synthetic) @@ -242,7 +243,7 @@ item_state = "tentacle" lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' - item_flags = NEEDS_PERMIT | ABSTRACT | NODROP | DROPDEL | NOBLUDGEON + item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL | NOBLUDGEON flags_1 = NONE w_class = WEIGHT_CLASS_HUGE ammo_type = /obj/item/ammo_casing/magic/tentacle @@ -256,6 +257,7 @@ /obj/item/gun/magic/tentacle/Initialize(mapload, silent) . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) if(ismob(loc)) if(!silent) loc.visible_message("[loc.name]\'s arm starts stretching inhumanly!", "Our arm twists and mutates, transforming it into a tentacle.", "You hear organic matter ripping and tearing!") @@ -427,7 +429,7 @@ /obj/item/shield/changeling name = "shield-like mass" desc = "A mass of tough, boney tissue. You can still see the fingers as a twisted pattern in the shield." - item_flags = ABSTRACT | NODROP | DROPDEL + item_flags = ABSTRACT | DROPDEL icon = 'icons/obj/items_and_weapons.dmi' icon_state = "ling_shield" lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' @@ -438,6 +440,7 @@ /obj/item/shield/changeling/Initialize() . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) if(ismob(loc)) loc.visible_message("The end of [loc.name]\'s hand inflates rapidly, forming a huge shield-like mass!", "We inflate our hand into a strong shield.", "You hear organic matter ripping and tearing!") @@ -479,13 +482,14 @@ name = "flesh mass" icon_state = "lingspacesuit" desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel." - item_flags = NODROP | DROPDEL + item_flags = DROPDEL clothing_flags = STOPSPRESSUREDAMAGE //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff) allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/oxygen) armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) //No armor at all. /obj/item/clothing/suit/space/changeling/Initialize() . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) if(ismob(loc)) loc.visible_message("[loc.name]\'s flesh rapidly inflates, forming a bloated mass around [loc.p_their()] body!", "We inflate our flesh, creating a spaceproof suit!", "You hear organic matter ripping and tearing!") START_PROCESSING(SSobj, src) @@ -499,11 +503,15 @@ name = "flesh mass" icon_state = "lingspacehelmet" desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front." - item_flags = NODROP | DROPDEL + item_flags = DROPDEL clothing_flags = STOPSPRESSUREDAMAGE armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH +/obj/item/clothing/head/helmet/space/changeling/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) + /***************************************\ |*****************ARMOR*****************| \***************************************/ @@ -529,7 +537,7 @@ name = "chitinous mass" desc = "A tough, hard covering of black chitin." icon_state = "lingarmor" - item_flags = NODROP | DROPDEL + item_flags = DROPDEL body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 10, "bio" = 4, "rad" = 0, "fire" = 90, "acid" = 90) flags_inv = HIDEJUMPSUIT @@ -538,6 +546,7 @@ /obj/item/clothing/suit/armor/changeling/Initialize() . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) if(ismob(loc)) loc.visible_message("[loc.name]\'s flesh turns black, quickly transforming into a hard, chitinous mass!", "We harden our flesh, creating a suit of armor!", "You hear organic matter ripping and tearing!") @@ -545,6 +554,10 @@ name = "chitinous mass" desc = "A tough, hard covering of black chitin with transparent chitin in front." icon_state = "lingarmorhelmet" - item_flags = NODROP | DROPDEL + item_flags = DROPDEL armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 10, "bio" = 4, "rad" = 0, "fire" = 90, "acid" = 90) flags_inv = HIDEEARS|HIDEHAIR|HIDEEYES|HIDEFACIALHAIR|HIDEFACE + +/obj/item/clothing/head/helmet/changeling/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) diff --git a/code/modules/antagonists/changeling/powers/transform.dm b/code/modules/antagonists/changeling/powers/transform.dm index 767c7d2621..795ba772d6 100644 --- a/code/modules/antagonists/changeling/powers/transform.dm +++ b/code/modules/antagonists/changeling/powers/transform.dm @@ -11,7 +11,11 @@ /obj/item/clothing/glasses/changeling name = "flesh" - item_flags = NODROP + +/obj/item/clothing/glasses/changeling/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) + //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/glasses/changeling/attack_hand(mob/user) @@ -23,7 +27,11 @@ /obj/item/clothing/under/changeling name = "flesh" - item_flags = NODROP + +/obj/item/clothing/under/changeling/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) + //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/under/changeling/attack_hand(mob/user) @@ -35,9 +43,13 @@ /obj/item/clothing/suit/changeling name = "flesh" - item_flags = NODROP allowed = list(/obj/item/changeling) +/obj/item/clothing/suit/changeling/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) + + //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/suit/changeling/attack_hand(mob/user) if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) @@ -48,7 +60,10 @@ /obj/item/clothing/head/changeling name = "flesh" - item_flags = NODROP + +/obj/item/clothing/head/changeling/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/head/changeling/attack_hand(mob/user) @@ -60,7 +75,11 @@ /obj/item/clothing/shoes/changeling name = "flesh" - item_flags = NODROP + +/obj/item/clothing/shoes/changeling/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) + //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/shoes/changeling/attack_hand(mob/user) @@ -72,7 +91,11 @@ /obj/item/clothing/gloves/changeling name = "flesh" - item_flags = NODROP + +/obj/item/clothing/gloves/changeling/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) + //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/gloves/changeling/attack_hand(mob/user) @@ -84,7 +107,11 @@ /obj/item/clothing/mask/changeling name = "flesh" - item_flags = NODROP + +/obj/item/clothing/mask/changeling/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) + //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/mask/changeling/attack_hand(mob/user) @@ -96,10 +123,14 @@ /obj/item/changeling name = "flesh" - item_flags = NODROP slot_flags = ALL allowed = list(/obj/item/changeling) +/obj/item/changeling/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) + + //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/changeling/attack_hand(mob/user) if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 845c66fb33..a5fd516a42 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -339,7 +339,7 @@ icon = 'icons/obj/items_and_weapons.dmi' icon_state = "disintegrate" item_state = null - item_flags = NEEDS_PERMIT | ABSTRACT | NODROP | DROPDEL + item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_HUGE throwforce = 0 @@ -350,11 +350,13 @@ var/health_cost = 0 //The amount of health taken from the user when invoking the spell var/datum/action/innate/cult/blood_spell/source -/obj/item/melee/blood_magic/New(loc, spell) +/obj/item/melee/blood_magic/Initialize(mapload, spell) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT) source = spell uses = source.charges health_cost = source.health_cost - ..() + /obj/item/melee/blood_magic/Destroy() if(!QDELETED(source)) diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 6bef6fd021..9a17c3270b 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -64,9 +64,14 @@ /obj/item/melee/cultblade/ghost name = "eldritch sword" force = 19 //can't break normal airlocks - item_flags = NEEDS_PERMIT | NODROP | DROPDEL + item_flags = NEEDS_PERMIT | DROPDEL flags_1 = NONE +/obj/item/melee/cultblade/ghost/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT) + + /obj/item/melee/cultblade/pickup(mob/living/user) ..() if(!iscultist(user)) @@ -298,7 +303,12 @@ item_state = "cult_hoodalt" /obj/item/clothing/head/culthood/alt/ghost - item_flags = NODROP | DROPDEL + item_flags = DROPDEL + +/obj/item/clothing/head/culthood/alt/ghost/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT) + /obj/item/clothing/suit/cultrobes/alt name = "cultist robes" @@ -307,7 +317,11 @@ item_state = "cultrobesalt" /obj/item/clothing/suit/cultrobes/alt/ghost - item_flags = NODROP | DROPDEL + item_flags = DROPDEL + +/obj/item/clothing/suit/cultrobes/alt/ghost/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT) /obj/item/clothing/head/magus name = "magus helm" @@ -796,7 +810,7 @@ icon = 'icons/obj/items_and_weapons.dmi' icon_state = "disintegrate" item_state = null - item_flags = ABSTRACT | NODROP | DROPDEL + item_flags = ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_HUGE throwforce = 0 throw_range = 0 @@ -805,6 +819,9 @@ var/firing = FALSE var/angle +/obj/item/blood_beam/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT) /obj/item/blood_beam/afterattack(atom/A, mob/living/user, flag, params) . = ..() diff --git a/code/modules/antagonists/highlander/highlander.dm b/code/modules/antagonists/highlander/highlander.dm index c0246ba978..51e8d9a13b 100644 --- a/code/modules/antagonists/highlander/highlander.dm +++ b/code/modules/antagonists/highlander/highlander.dm @@ -60,7 +60,7 @@ W.access += get_all_centcom_access() W.assignment = "Highlander" W.registered_name = H.real_name - W.item_flags |= NODROP + ADD_TRAIT(W, TRAIT_NODROP, HIGHLANDER) W.update_label(H.real_name) H.equip_to_slot_or_del(W, SLOT_WEAR_ID) diff --git a/code/modules/antagonists/nukeop/equipment/pinpointer.dm b/code/modules/antagonists/nukeop/equipment/pinpointer.dm index d8dc709975..538feba008 100644 --- a/code/modules/antagonists/nukeop/equipment/pinpointer.dm +++ b/code/modules/antagonists/nukeop/equipment/pinpointer.dm @@ -65,9 +65,13 @@ /obj/item/pinpointer/syndicate_cyborg // Cyborg pinpointers just look for a random operative. name = "cyborg syndicate pinpointer" desc = "An integrated tracking device, jury-rigged to search for living Syndicate operatives." - item_flags = NODROP flags_1 = NONE + +/obj/item/pinpointer/syndicate_cyborg/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT) + /obj/item/pinpointer/syndicate_cyborg/scan_for_target() target = null var/list/possible_targets = list() diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 881e25f138..fcfdd7c455 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -497,14 +497,14 @@ W.registered_name = H.real_name W.update_label(W.registered_name, W.assignment) - // The shielded hardsuit is already NODROP + // The shielded hardsuit is already TRAIT_NODROP no_drops += H.get_item_by_slot(SLOT_GLOVES) no_drops += H.get_item_by_slot(SLOT_SHOES) no_drops += H.get_item_by_slot(SLOT_W_UNIFORM) no_drops += H.get_item_by_slot(SLOT_EARS) for(var/i in no_drops) var/obj/item/I = i - I.item_flags |= NODROP + ADD_TRAIT(I, TRAIT_NODROP, CAPTURE_THE_FLAG_TRAIT) /datum/outfit/ctf/instagib r_hand = /obj/item/gun/energy/laser/instakill diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 7e7da2839e..04a8e17b7b 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -60,7 +60,7 @@ to_chat(owner, "You shouldn't be able to toggle a camogear helmetmask if you're not wearing it") if(new_headgear) // Force drop the item in the headslot, even though - // it's NODROP_1 + // it's TRAIT_NODROP D.dropItemToGround(target, TRUE) qdel(old_headgear) // where is `SLOT_HEAD` defined? WHO KNOWS @@ -418,12 +418,12 @@ /obj/item/clothing/head/chameleon/drone // The camohat, I mean, holographic hat projection, is part of the // drone itself. - item_flags = NODROP armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) // which means it offers no protection, it's just air and light /obj/item/clothing/head/chameleon/drone/Initialize() . = ..() + ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) chameleon_action.random_look() var/datum/action/item_action/chameleon/drone/togglehatmask/togglehatmask_action = new(src) togglehatmask_action.UpdateButtonIcon() @@ -472,13 +472,13 @@ /obj/item/clothing/mask/chameleon/drone //Same as the drone chameleon hat, undroppable and no protection - item_flags = NODROP armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) // Can drones use the voice changer part? Let's not find out. vchange = 0 /obj/item/clothing/mask/chameleon/drone/Initialize() . = ..() + ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) chameleon_action.random_look() var/datum/action/item_action/chameleon/drone/togglehatmask/togglehatmask_action = new(src) togglehatmask_action.UpdateButtonIcon() diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 767b700051..85a0b2b253 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -43,6 +43,8 @@ /obj/item/clothing/Initialize() . = ..() + if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE)) + actions_types += /datum/action/item_action/toggle_voice_box if(ispath(pocket_storage_component_path)) LoadComponent(pocket_storage_component_path) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 6e25db1fa6..097b10cae5 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -378,10 +378,13 @@ vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS darkness_view = 8 scan_reagents = TRUE - item_flags = NODROP lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE resistance_flags = LAVA_PROOF | FIRE_PROOF +/obj/item/clothing/glasses/godeye/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, EYE_OF_GOD_TRAIT) + /obj/item/clothing/glasses/godeye/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W, src) && W != src && W.loc == user) if(W.icon_state == "godeye") diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 429401a626..23e1825c3d 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -121,9 +121,12 @@ /obj/item/clothing/head/beret/highlander desc = "That was white fabric. Was." - item_flags = NODROP dog_fashion = null //THIS IS FOR SLAUGHTER, NOT PUPPIES +/obj/item/clothing/head/beret/highlander/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, HIGHLANDER) + //Security /obj/item/clothing/head/HoS diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 277ce2a8ad..73fde5d50f 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -221,9 +221,12 @@ icon_state = "shamebrero" item_state = "shamebrero" desc = "Once it's on, it never comes off." - item_flags = NODROP dog_fashion = null +/obj/item/clothing/head/sombrero/shamebrero/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, SHAMEBRERO_TRAIT) + /obj/item/clothing/head/cone desc = "This cone is trying to warn you of something!" name = "warning cone" diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 1716992e45..5dfa7d6047 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -75,7 +75,7 @@ /obj/item/clothing/mask/pig name = "pig mask" - desc = "A rubber pig mask." + desc = "A rubber pig mask with a builtin voice modulator." icon_state = "pig" item_state = "pig" flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR @@ -92,7 +92,11 @@ desc = "It looks like a mask, but closer inspection reveals it's melded onto this persons face!" //It's only ever going to be attached to your face. flags_inv = HIDEFACIALHAIR clothing_flags = NONE - item_flags = NODROP + +/obj/item/clothing/mask/pig/cursed/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT) + playsound(get_turf(src), 'sound/magic/pighead_curse.ogg', 50, 1) ///frog mask - reeee!! /obj/item/clothing/mask/frog @@ -114,16 +118,19 @@ /obj/item/clothing/mask/frog/cursed clothing_flags = NONE - item_flags = NODROP //reee!! + +/obj/item/clothing/mask/frog/cursed/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT) /obj/item/clothing/mask/frog/cursed/equipped(mob/user, slot) var/mob/living/carbon/C = user - if(C.wear_mask == src) - to_chat(user, "[src] was cursed! Ree!!") + if(C.wear_mask == src && HAS_TRAIT_FROM(src, TRAIT_NODROP, CURSED_ITEM_TRAIT)) + to_chat(user, "[src] was cursed! Ree!!") return ..() /obj/item/clothing/mask/cowmask - name = "Cow mask" + name = "Cow mask with a builtin voice modulator." desc = "A rubber cow mask," icon = 'icons/mob/mask.dmi' icon_state = "cowmask" @@ -137,12 +144,17 @@ if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED)) speech_args[SPEECH_MESSAGE] = pick("Moooooooo!","Moo!","Moooo!") + /obj/item/clothing/mask/cowmask/cursed name = "cow face" desc = "It looks like a cow mask, but closer inspection reveals it's melded onto this persons face!" flags_inv = HIDEFACIALHAIR clothing_flags = NONE - item_flags = NODROP + +/obj/item/clothing/mask/cowmask/cursed/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT) + playsound(get_turf(src), 'sound/magic/cowhead_curse.ogg', 50, 1) /obj/item/clothing/mask/horsehead name = "horse head mask" @@ -157,12 +169,17 @@ if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED)) speech_args[SPEECH_MESSAGE] = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") + /obj/item/clothing/mask/horsehead/cursed name = "horse face" desc = "It initially looks like a mask, but it's melded into the poor person's face." clothing_flags = NONE flags_inv = HIDEFACIALHAIR - item_flags = NODROP + +/obj/item/clothing/mask/horsehead/cursed/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT) + playsound(get_turf(src), 'sound/magic/horsehead_curse.ogg', 50, 1) /obj/item/clothing/mask/rat name = "rat mask" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index d314a4c48e..e6554f6125 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -157,7 +157,11 @@ icon_state = "cultalt" /obj/item/clothing/shoes/cult/alt/ghost - item_flags = NODROP | DROPDEL + item_flags = DROPDEL + +/obj/item/clothing/shoes/cult/alt/ghost/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT) /obj/item/clothing/shoes/cyborg name = "cyborg boots" diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index d0820304fe..5a53e2776a 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -27,7 +27,6 @@ armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 30, "bio" = 90, "rad" = 90, "fire" = 100, "acid" = 1000) resistance_flags = FIRE_PROOF | ACID_PROOF var/list/chronosafe_items = list(/obj/item/chrono_eraser, /obj/item/gun/energy/chrono_gun) - var/list/hands_nodrop = list() var/obj/item/clothing/head/helmet/space/chronos/helmet = null var/obj/effect/chronos_cam/camera = null var/datum/action/innate/chrono_teleport/teleport_now = new @@ -97,8 +96,7 @@ user.anchored = FALSE teleporting = 0 for(var/obj/item/I in user.held_items) - if(I in hands_nodrop) - I.item_flags &= ~NODROP + REMOVE_TRAIT(I, TRAIT_NODROP, CHRONOSUIT_TRAIT) if(camera) camera.remove_target_ui() camera.forceMove(user) @@ -131,11 +129,8 @@ user.ExtinguishMob() - hands_nodrop = list() for(var/obj/item/I in user.held_items) - if(!(I.item_flags & NODROP)) - hands_nodrop += I - I.item_flags |= NODROP + ADD_TRAIT(I, TRAIT_NODROP, CHRONOSUIT_TRAIT) user.animate_movement = NO_STEPS user.changeNext_move(8 + phase_in_ds) user.notransform = 1 @@ -194,9 +189,9 @@ if(user.head && istype(user.head, /obj/item/clothing/head/helmet/space/chronos)) to_chat(user, "\[ ok \] Mounting /dev/helm") helmet = user.head - helmet.item_flags |= NODROP + ADD_TRAIT(helmet, TRAIT_NODROP, CHRONOSUIT_TRAIT) helmet.suit = src - src.item_flags |= NODROP + ADD_TRAIT(src, TRAIT_NODROP, CHRONOSUIT_TRAIT) to_chat(user, "\[ ok \] Starting brainwave scanner") to_chat(user, "\[ ok \] Starting ui display driver") to_chat(user, "\[ ok \] Initializing chronowalk4-view") @@ -215,7 +210,7 @@ activating = 1 var/mob/living/carbon/human/user = src.loc var/hard_landing = teleporting && force - item_flags &= ~NODROP + REMOVE_TRAIT(src, TRAIT_NODROP, CHRONOSUIT_TRAIT) cooldown = world.time + cooldowntime * 1.5 activated = 0 activating = 0 @@ -236,7 +231,7 @@ to_chat(user, "\[ ok \] Unmounting /dev/helmet") to_chat(user, "logout") if(helmet) - helmet.item_flags &= ~NODROP + REMOVE_TRAIT(helmet, TRAIT_NODROP, CHRONOSUIT_TRAIT) helmet.suit = null helmet = null if(camera) diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm index 176bc81665..b105b72234 100644 --- a/code/modules/clothing/spacesuits/flightsuit.dm +++ b/code/modules/clothing/spacesuits/flightsuit.dm @@ -897,7 +897,7 @@ usermessage("You're already wearing something on your back!", "boldwarning") return FALSE user.equip_to_slot_if_possible(pack,SLOT_BACK,0,0,1) - pack.item_flags |= NODROP + ADD_TRAIT(pack, TRAIT_NODROP, FLIGHTSUIT_TRAIT) resync() user.visible_message("A [pack.name] extends from [user]'s [name] and clamps to [user.p_their()] back!") user.update_inv_wear_suit() @@ -911,7 +911,7 @@ return FALSE if(pack.flight && forced) pack.disable_flight(1) - pack.item_flags &= ~NODROP + REMOVE_TRAIT_FROM(pack, TRAIT_NODROP, FLIGHTSUIT_TRAIT) resync() if(user) user.transferItemToLoc(pack, src, TRUE) @@ -935,14 +935,14 @@ usermessage("You're already wearing something on your feet!", "boldwarning") return FALSE user.equip_to_slot_if_possible(shoes,SLOT_SHOES,0,0,1) - shoes.item_flags |= NODROP + ADD_TRAIT(shoes, TRAIT_NODROP, FLIGHTSUIT_TRAIT) user.visible_message("[user]'s [name] extends a pair of [shoes.name] over [user.p_their()] feet!") user.update_inv_wear_suit() playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1) deployedshoes = TRUE /obj/item/clothing/suit/space/hardsuit/flightsuit/proc/retract_flightshoes(forced = FALSE) - shoes.item_flags &= ~NODROP + REMOVE_TRAIT_FROM(shoes, TRAIT_NODROP, FLIGHTSUIT_TRAIT) playsound(src, 'sound/mecha/mechmove03.ogg', 50, 1) if(user) user.transferItemToLoc(shoes, src, TRUE) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 22eac9f5aa..85503c720a 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -766,12 +766,15 @@ icon_state = "ert_medical" item_state = "ert_medical" item_color = "ert_medical" - item_flags = NODROP //Dont want people changing into the other teams gear helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf armor = list("melee" = 0, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 95) slowdown = 0 max_charges = 5 +/obj/item/clothing/suit/space/hardsuit/shielded/ctf/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CAPTURE_THE_FLAG_TRAIT) + /obj/item/clothing/suit/space/hardsuit/shielded/ctf/red name = "red shielded hardsuit" icon_state = "ert_security" diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 6d7c1036be..5d718a8173 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -171,10 +171,13 @@ Contains: item_color = "ert_commander" armor = list("melee" = 65, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80) strip_delay = 130 - item_flags = NODROP brightness_on = 7 resistance_flags = ACID_PROOF +/obj/item/clothing/head/helmet/space/hardsuit/ert/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, LOCKED_HELMET_TRAIT) + /obj/item/clothing/suit/space/hardsuit/ert name = "emergency response team suit" desc = "Standard issue command suit for the ERT." @@ -237,8 +240,6 @@ Contains: item_state = "hardsuit0-ert_commander-alert" item_color = "ert_commander-alert" armor = list("melee" = 70, "bullet" = 55, "laser" = 50, "energy" = 50, "bomb" = 65, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) - strip_delay = 130 - item_flags = NODROP brightness_on = 8 resistance_flags = FIRE_PROOF | ACID_PROOF @@ -248,11 +249,8 @@ Contains: icon_state = "ert_command-alert" item_state = "ert_command-alert" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/alert - allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals) armor = list("melee" = 70, "bullet" = 55, "laser" = 50, "energy" = 50, "bomb" = 65, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) - strip_delay = 130 resistance_flags = FIRE_PROOF | ACID_PROOF - tauric = TRUE //Citadel Add for tauric hardsuits //ERT Security /obj/item/clothing/head/helmet/space/hardsuit/ert/alert/sec @@ -342,9 +340,13 @@ Contains: armor = list("melee" = -20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 75) //As whimpy as a space carp brightness_on = 0 //luminosity when on actions_types = list() - item_flags = NODROP mutantrace_variation = NO_MUTANTRACE_VARIATION +/obj/item/clothing/head/helmet/space/hardsuit/carp/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, LOCKED_HELMET_TRAIT) + + /obj/item/clothing/suit/space/hardsuit/carp name = "carp space suit" desc = "A slimming piece of dubious space carp technology, you suspect it won't stand up to hand-to-hand blows." diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index 173d50ba64..c3276213e1 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -15,7 +15,6 @@ icon_state = "golhood" desc = "A hood for a cloak." body_parts_covered = HEAD - item_flags = NODROP flags_inv = HIDEHAIR|HIDEEARS /obj/item/clothing/neck/cloak/suicide_act(mob/user) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 9d039e0cb6..dc1b2b6dc3 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -237,7 +237,10 @@ desc = "Forced to live on your shameful acting as a fake Mexican, you and your poncho have grown inseparable. Literally." icon_state = "ponchoshame" item_state = "ponchoshame" - item_flags = NODROP + +/obj/item/clothing/suit/poncho/ponchoshame/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, SHAMEBRERO_TRAIT) /obj/item/clothing/suit/whitedress name = "white dress" diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 324c16fec7..c239f48b05 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -22,7 +22,11 @@ resistance_flags = NONE /obj/item/clothing/under/color/black/ghost - item_flags = NODROP | DROPDEL + item_flags = DROPDEL + +/obj/item/clothing/under/color/black/ghost/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT) /obj/item/clothing/under/color/grey name = "grey jumpsuit" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 91fde0dbd0..16848e393a 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -388,7 +388,10 @@ /obj/item/clothing/under/kilt/highlander desc = "You're the only one worthy of this kilt." - item_flags = NODROP + +/obj/item/clothing/under/kilt/highlander/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, HIGHLANDER) /obj/item/clothing/under/sexymime name = "sexy mime outfit" diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm index a6e08fbd8c..41ee4246b1 100644 --- a/code/modules/events/wizard/curseditems.dm +++ b/code/modules/events/wizard/curseditems.dm @@ -50,7 +50,8 @@ var/obj/item/I = new J //dumb but required because of byond throwing a fit anytime new gets too close to a list H.dropItemToGround(H.get_item_by_slot(i), TRUE) H.equip_to_slot_or_del(I, i) - I.item_flags |= NODROP | DROPDEL + ADD_TRAIT(I, TRAIT_NODROP, CURSED_ITEM_TRAIT) + I.item_flags |= DROPDEL I.name = "cursed " + I.name for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index 23172841e4..dd33f696c9 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -94,7 +94,7 @@ God bless America. else if(default_deconstruction_screwdriver(user, "fryer_off", "fryer_off" ,I)) //where's the open maint panel icon?! return else - if(is_type_in_typecache(I, deepfry_blacklisted_items) || (I.item_flags & (ABSTRACT | NODROP | DROPDEL))) + if(is_type_in_typecache(I, deepfry_blacklisted_items) || HAS_TRAIT(I, TRAIT_NODROP) || (I.item_flags & (ABSTRACT | DROPDEL))) return ..() else if(!frying && user.transferItemToLoc(I, src)) to_chat(user, "You put [I] into [src].") diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index d8d4e843dc..e02c3c1334 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -78,7 +78,7 @@ if(!ignore_clothing) for(var/obj/item/I in C.held_items + C.get_equipped_items()) - if(!(I.item_flags & NODROP)) + if(!HAS_TRAIT(I, TRAIT_NODROP)) to_chat(user, "Subject may not have abiotic items on.") return diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index 0d6c337444..e02f38b7e3 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -65,9 +65,12 @@ /obj/item/pickaxe/drill/cyborg name = "cyborg mining drill" desc = "An integrated electric mining drill." - item_flags = NODROP flags_1 = NONE +/obj/item/pickaxe/drill/cyborg/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT) + /obj/item/pickaxe/drill/diamonddrill name = "diamond-tipped mining drill" icon_state = "diamonddrill" diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index eaac1984e3..abcb6d5911 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -143,7 +143,7 @@ //Rod of Asclepius /obj/item/rod_of_asclepius - name = "Rod of Asclepius" + name = "\improper Rod of Asclepius" desc = "A wooden rod about the size of your forearm with a snake carved around it, winding it's way up the sides of the rod. Something about it seems to inspire in you the responsibilty and duty to help others." icon = 'icons/obj/lavaland/artefacts.dmi' icon_state = "asclepius_dormant" @@ -189,7 +189,8 @@ activated() /obj/item/rod_of_asclepius/proc/activated() - item_flags = NODROP | DROPDEL + item_flags = DROPDEL + ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT) desc = "A short wooden rod with a mystical snake inseparably gripping itself and the rod to your forearm. It flows with a healing energy that disperses amongst yourself and those around you. " icon_state = "asclepius_active" activated = TRUE diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index c2518bfc9b..9569d4826c 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -275,7 +275,7 @@ /mob/proc/canUnEquip(obj/item/I, force) if(!I) return TRUE - if((I.item_flags & NODROP) && !force) + if(HAS_TRAIT(I, TRAIT_NODROP) && !force) return FALSE return TRUE @@ -309,13 +309,13 @@ //DO NOT CALL THIS PROC //use one of the above 3 helper procs //you may override it, but do not modify the args -/mob/proc/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE) //Force overrides NODROP_1 for things like wizarditis and admin undress. +/mob/proc/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE) //Force overrides TRAIT_NODROP for things like wizarditis and admin undress. //Use no_move if the item is just gonna be immediately moved afterward //Invdrop is used to prevent stuff in pockets dropping. only set to false if it's going to immediately be replaced - if(!I) //If there's nothing to drop, the drop is automatically succesfull. If(unEquip) should generally be used to check for NODROP_1. + if(!I) //If there's nothing to drop, the drop is automatically succesfull. If(unEquip) should generally be used to check for TRAIT_NODROP. return TRUE - if((I.item_flags & NODROP) && !force) + if(HAS_TRAIT(I, TRAIT_NODROP) && !force) return FALSE var/hand_index = get_held_index_of_item(I) diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index 2a5fdeaa33..cc11c0e8bb 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -138,7 +138,11 @@ name = "blood crawl" desc = "You are unable to hold anything while in this form." icon = 'icons/effects/blood.dmi' - item_flags = NODROP | ABSTRACT + item_flags = ABSTRACT + +/obj/item/bloodcrawl/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) /mob/living/proc/exit_blood_effect(obj/effect/decal/cleanable/B) playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1) diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 79eed6b82b..76ede9276c 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -103,9 +103,13 @@ name = "\improper royal parasite" desc = "Inject this into one of your grown children to promote her to a Praetorian!" icon_state = "alien_medal" - item_flags = ABSTRACT | NODROP | DROPDEL + item_flags = ABSTRACT | DROPDEL icon = 'icons/mob/alien.dmi' +/obj/item/queenpromote/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) + /obj/item/queenpromote/attack(mob/living/M, mob/living/carbon/alien/humanoid/user) if(!isalienadult(M) || isalienroyal(M)) to_chat(user, "You may only use this with your adult, non-royal children!") diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 92a993958a..db7257f0f0 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -175,7 +175,7 @@ if(start_T && end_T) log_combat(src, throwable_mob, "thrown", addition="grab from tile in [AREACOORD(start_T)] towards tile at [AREACOORD(end_T)]") - else if(!(I.item_flags & (NODROP | ABSTRACT))) + else if(!CHECK_BITFIELD(I.item_flags, ABSTRACT) && !HAS_TRAIT(I, TRAIT_NODROP)) thrown_thing = I dropItemToGround(I) @@ -409,7 +409,7 @@ return initial(pixel_y) /mob/living/carbon/proc/accident(obj/item/I) - if(!I || (I.item_flags & (NODROP | ABSTRACT))) + if(!I || (I.item_flags & ABSTRACT) || HAS_TRAIT(I, TRAIT_NODROP)) return //dropItemToGround(I) CIT CHANGE - makes it so the item doesn't drop if the modifier rolls above 100 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index a4fca9dd78..57dd1af749 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -252,7 +252,7 @@ var/delay_denominator = 1 if(pocket_item && !(pocket_item.item_flags & ABSTRACT)) - if(pocket_item.item_flags & NODROP) + if(HAS_TRAIT(pocket_item, TRAIT_NODROP)) to_chat(usr, "You try to empty [src]'s [pocket_side] pocket, it seems to be stuck!") to_chat(usr, "You try to empty [src]'s [pocket_side] pocket.") else if(place_item && place_item.mob_can_equip(src, usr, pocket_id, 1) && !(place_item.item_flags & ABSTRACT)) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index fabffaab60..45317e819d 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -279,7 +279,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(mutanthands) // Drop items in hands - // If you're lucky enough to have a NODROP_1 item, then it stays. + // If you're lucky enough to have a TRAIT_NODROP item, then it stays. for(var/V in C.held_items) var/obj/item/I = V if(istype(I)) @@ -1064,7 +1064,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) if(SLOT_L_STORE) - if(I.item_flags & NODROP) //Pockets aren't visible, so you can't move NODROP_1 items into them. + if(HAS_TRAIT(I, TRAIT_NODROP)) //Pockets aren't visible, so you can't move TRAIT_NODROP items into them. return FALSE if(H.l_store) return FALSE @@ -1080,7 +1080,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if( I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & ITEM_SLOT_POCKET) ) return TRUE if(SLOT_R_STORE) - if(I.item_flags & NODROP) + if(HAS_TRAIT(I, TRAIT_NODROP)) return FALSE if(H.r_store) return FALSE @@ -1097,7 +1097,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) return TRUE return FALSE if(SLOT_S_STORE) - if(I.item_flags & NODROP) + if(HAS_TRAIT(I, TRAIT_NODROP)) return FALSE if(H.s_store) return FALSE diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index b574df7d79..11a25cea6c 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -171,12 +171,13 @@ armour_penetration = 35 lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' - item_flags = ABSTRACT | NODROP | DROPDEL + item_flags = ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_HUGE sharpness = IS_SHARP /obj/item/light_eater/Initialize() . = ..() + ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) AddComponent(/datum/component/butchering, 80, 70) /obj/item/light_eater/afterattack(atom/movable/AM, mob/user, proximity) diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index 85436178fe..25bc243f07 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -115,7 +115,7 @@ /mob/living/carbon/monkey/proc/handle_combat() if(pickupTarget) - if(restrained() || blacklistItems[pickupTarget] || (pickupTarget.item_flags & NODROP)) + if(restrained() || blacklistItems[pickupTarget] || HAS_TRAIT(pickupTarget, TRAIT_NODROP)) pickupTarget = null else pickupTimer++ diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index b844a294be..ea0f7ae388 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -281,7 +281,7 @@ var/datum/disease/D = thing if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) ContactContractDisease(D) - + if(iscarbon(L)) var/mob/living/carbon/C = L if(HAS_TRAIT(src, TRAIT_STRONG_GRABBER)) @@ -699,7 +699,7 @@ // The src mob is trying to strip an item from someone // Override if a certain type of mob should be behave differently when stripping items (can't, for example) /mob/living/stripPanelUnequip(obj/item/what, mob/who, where) - if(what.item_flags & NODROP) + if(HAS_TRAIT(what, TRAIT_NODROP)) to_chat(src, "You can't remove \the [what.name], it appears to be stuck!") return who.visible_message("[src] tries to remove [who]'s [what.name].", \ @@ -724,7 +724,7 @@ // Override if a certain mob should be behave differently when placing items (can't, for example) /mob/living/stripPanelEquip(obj/item/what, mob/who, where) what = src.get_active_held_item() - if(what && (what.item_flags & NODROP)) + if(what && HAS_TRAIT(what, TRAIT_NODROP)) to_chat(src, "You can't put \the [what.name] on [who], it's stuck to your hand!") return if(what) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 38ad3b8e5a..7b95ced63f 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -119,7 +119,7 @@ if(I.loc != src) I.forceMove(src) modules += I - I.item_flags |= NODROP + ADD_TRAIT(I, TRAIT_NODROP, CYBORG_ITEM_TRAIT) I.mouse_opacity = MOUSE_OPACITY_OPAQUE if(nonstandard) added_modules += I diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index e6bf7b3f20..6d3121474c 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -93,7 +93,7 @@ var/obj/item/I = new default_hatmask(src) equip_to_slot_or_del(I, SLOT_HEAD) - access_card.item_flags |= NODROP + ADD_TRAIT(access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) alert_drones(DRONE_NET_CONNECT) diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm index a01b354ca1..276de652bc 100644 --- a/code/modules/ninja/suit/gloves.dm +++ b/code/modules/ninja/suit/gloves.dm @@ -79,5 +79,5 @@ /obj/item/clothing/gloves/space_ninja/examine(mob/user) ..() - if(item_flags & NODROP) + if(HAS_TRAIT_FROM(src, TRAIT_NODROP, NINJA_SUIT_TRAIT)) to_chat(user, "The energy drain mechanism is [candrain?"active":"inactive"].") diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index 6110f2b0c0..b98ef764c0 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -111,15 +111,15 @@ Contents: to_chat(H, "ERROR: 110223 UNABLE TO LOCATE HAND GEAR\nABORTING...") return FALSE affecting = H - item_flags |= NODROP //colons make me go all |= + ADD_TRAIT(src, TRAIT_NODROP, NINJA_SUIT_TRAIT) //colons make me go all |= slowdown = 0 n_hood = H.head - n_hood.item_flags |= NODROP + ADD_TRAIT(n_hood, TRAIT_NODROP, NINJA_SUIT_TRAIT) n_shoes = H.shoes - n_shoes.item_flags |= NODROP + ADD_TRAIT(n_shoes, TRAIT_NODROP, NINJA_SUIT_TRAIT) n_shoes.slowdown-- n_gloves = H.gloves - n_gloves.item_flags |= NODROP + ADD_TRAIT(n_gloves, TRAIT_NODROP, NINJA_SUIT_TRAIT) return TRUE /obj/item/clothing/suit/space/space_ninja/proc/lockIcons(mob/living/carbon/human/H) @@ -131,18 +131,18 @@ Contents: //This proc allows the suit to be taken off. /obj/item/clothing/suit/space/space_ninja/proc/unlock_suit() affecting = null - item_flags &= ~NODROP + REMOVE_TRAIT(src, TRAIT_NODROP, NINJA_SUIT_TRAIT) slowdown = 1 icon_state = "s-ninja" if(n_hood)//Should be attached, might not be attached. - n_hood.item_flags &= ~NODROP + REMOVE_TRAIT(n_hood, TRAIT_NODROP, NINJA_SUIT_TRAIT) if(n_shoes) - n_shoes.item_flags &= ~NODROP + REMOVE_TRAIT(n_shoes, TRAIT_NODROP, NINJA_SUIT_TRAIT) n_shoes.slowdown++ if(n_gloves) n_gloves.icon_state = "s-ninja" n_gloves.item_state = "s-ninja" - n_gloves.item_flags &= ~NODROP + REMOVE_TRAIT(n_gloves, TRAIT_NODROP, NINJA_SUIT_TRAIT) n_gloves.candrain=0 n_gloves.draining=0 diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index b77ea9d13a..f82f0ee8e6 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -89,7 +89,7 @@ if(!cell_connectors) to_chat(user, "This [name] can't support a power cell!") return - if(W.item_flags & NODROP) + if(HAS_TRAIT(W, TRAIT_NODROP)) to_chat(user, "[W] is stuck to your hand!") return user.dropItemToGround(W) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 40f71b81d4..d805713fa6 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -440,10 +440,14 @@ name = "turret controls" icon_state = "offhand" w_class = WEIGHT_CLASS_HUGE - item_flags = ABSTRACT | NODROP | NOBLUDGEON + item_flags = ABSTRACT | NOBLUDGEON resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF var/delay = 0 +/obj/item/turret_control/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) + /obj/item/turret_control/afterattack(atom/targeted_atom, mob/user, proxflag, clickparams) . = ..() var/obj/machinery/power/emitter/E = user.buckled diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index 1138f65105..141e6b1fe1 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -7,7 +7,7 @@ item_state = "bloodgun" lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - item_flags = ABSTRACT | DROPDEL | NODROP + item_flags = ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_HUGE force = 5 max_charges = 1 //Recharging costs blood. @@ -15,6 +15,10 @@ ammo_type = /obj/item/ammo_casing/magic/bloodchill fire_sound = 'sound/effects/attackblob.ogg' +/obj/item/gun/magic/bloodchill/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) + /obj/item/gun/magic/bloodchill/process() charge_tick++ if(charge_tick < recharge_rate || charges >= max_charges) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 85819da52a..ce36be8e42 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -708,7 +708,7 @@ imp.implant(SM, user) SM.access_card = new /obj/item/card/id/syndicate(SM) - SM.access_card.item_flags |= NODROP + ADD_TRAIT(SM.access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) /obj/item/slimepotion/transference name = "consciousness transference potion" diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index fd5f2f59fd..d1435a554c 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -165,7 +165,7 @@ var/datum/job/captain/C = new /datum/job/captain access_card.access = C.get_access() access_card.access |= ACCESS_CENT_BAR - access_card.item_flags |= NODROP + ADD_TRAIT(access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) /mob/living/simple_animal/hostile/alien/maid/barmaid/Destroy() qdel(access_card) diff --git a/code/modules/spells/spell_types/barnyard.dm b/code/modules/spells/spell_types/barnyard.dm index b6a7878470..ccb0280779 100644 --- a/code/modules/spells/spell_types/barnyard.dm +++ b/code/modules/spells/spell_types/barnyard.dm @@ -38,18 +38,14 @@ return var/list/masks = list(/obj/item/clothing/mask/pig/cursed, /obj/item/clothing/mask/cowmask/cursed, /obj/item/clothing/mask/horsehead/cursed) - var/list/mSounds = list('sound/magic/pighead_curse.ogg', 'sound/magic/cowhead_curse.ogg', 'sound/magic/horsehead_curse.ogg') - var/randM = rand(1,3) - - var/choice = masks[randM] - var/obj/item/clothing/mask/magichead = new choice + var/choice = pick(masks) + var/obj/item/clothing/mask/magichead = new choice(get_turf(target)) magichead.flags_inv = null target.visible_message("[target]'s face bursts into flames, and a barnyard animal's head takes its place!", \ "Your face burns up, and shortly after the fire you realise you have the face of a barnyard animal!") if(!target.dropItemToGround(target.wear_mask)) qdel(target.wear_mask) target.equip_to_slot_if_possible(magichead, SLOT_WEAR_MASK, 1, 1) - playsound(get_turf(target), mSounds[randM], 50, 1) target.flash_act() diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm index 06d1fc3dc5..a5f371ffc2 100644 --- a/code/modules/spells/spell_types/godhand.dm +++ b/code/modules/spells/spell_types/godhand.dm @@ -7,7 +7,7 @@ icon = 'icons/obj/items_and_weapons.dmi' icon_state = "syndballoon" item_state = null - item_flags = NEEDS_PERMIT | ABSTRACT | NODROP | DROPDEL + item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_HUGE force = 0 throwforce = 0 @@ -15,6 +15,10 @@ throw_speed = 0 var/charges = 1 +/obj/item/melee/touch_attack/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) + /obj/item/melee/touch_attack/attack(mob/target, mob/living/carbon/user) if(!iscarbon(user)) //Look ma, no hands return diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm index d88ee7fb22..efc80101f6 100644 --- a/code/modules/spells/spell_types/lichdom.dm +++ b/code/modules/spells/spell_types/lichdom.dm @@ -34,7 +34,7 @@ for(var/obj/item/item in hand_items) // I ensouled the nuke disk once. But it's probably a really // mean tactic, so probably should discourage it. - if((item.item_flags & ABSTRACT) || (item.item_flags & NODROP) || SEND_SIGNAL(item, COMSIG_ITEM_IMBUE_SOUL, user)) + if((item.item_flags & ABSTRACT) || HAS_TRAIT(item, TRAIT_NODROP) || SEND_SIGNAL(item, COMSIG_ITEM_IMBUE_SOUL, user)) continue marked_item = item to_chat(M, "You begin to focus your very being into [item]...") diff --git a/code/modules/spells/spell_types/summonitem.dm b/code/modules/spells/spell_types/summonitem.dm index 2bc347b185..6d46c53a9d 100644 --- a/code/modules/spells/spell_types/summonitem.dm +++ b/code/modules/spells/spell_types/summonitem.dm @@ -25,7 +25,7 @@ for(var/obj/item/item in hand_items) if(item.item_flags & ABSTRACT) continue - if(item.item_flags & NODROP) + if(HAS_TRAIT(item, TRAIT_NODROP)) message += "Though it feels redundant, " marked_item = item message += "You mark [item] for recall." diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm index e57f8f686b..72874e0308 100644 --- a/code/modules/surgery/cavity_implant.dm +++ b/code/modules/surgery/cavity_implant.dm @@ -29,7 +29,7 @@ /datum/surgery_step/handle_cavity/success(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery) var/obj/item/bodypart/chest/CH = target.get_bodypart(BODY_ZONE_CHEST) if(tool) - if(IC || tool.w_class > WEIGHT_CLASS_NORMAL || (tool.item_flags & NODROP) || istype(tool, /obj/item/organ)) + if(IC || tool.w_class > WEIGHT_CLASS_NORMAL || HAS_TRAIT(tool, TRAIT_NODROP) || istype(tool, /obj/item/organ)) to_chat(user, "You can't seem to fit [tool] in [target]'s [target_zone]!") return 0 var/obj/item/electronic_assembly/EA = tool diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index f09258f19f..cb004ce599 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -89,7 +89,7 @@ holder = item - holder.item_flags |= NODROP + ADD_TRAIT(holder, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) holder.resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF holder.slot_flags = null holder.materials = null diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 6d1aebc6a3..06d523721d 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -51,8 +51,7 @@ active = !active if(active) for(var/obj/item/I in owner.held_items) - if(!(I.item_flags & NODROP)) - stored_items += I + stored_items += I var/list/L = owner.get_empty_held_indexes() if(LAZYLEN(L) == owner.held_items.len) @@ -62,7 +61,7 @@ else for(var/obj/item/I in stored_items) to_chat(owner, "Your [owner.get_held_index_name(owner.get_held_index_of_item(I))]'s grip tightens.") - I.item_flags |= NODROP + ADD_TRAIT(I, TRAIT_NODROP, ANTI_DROP_IMPLANT_TRAIT) else release_items() @@ -83,10 +82,9 @@ to_chat(owner, "Your [owner.get_held_index_name(owner.get_held_index_of_item(I))] spasms and throws the [I.name]!") stored_items = list() - /obj/item/organ/cyberimp/brain/anti_drop/proc/release_items() for(var/obj/item/I in stored_items) - I.item_flags &= ~NODROP + REMOVE_TRAIT(I, TRAIT_NODROP, ANTI_DROP_IMPLANT_TRAIT) stored_items = list() diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 8b56ccf00d..9a2455f56d 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -4,7 +4,7 @@ humans, butchering all other living things to \ sustain the zombie, smashing open airlock doors and opening \ child-safe caps on bottles." - item_flags = NODROP | ABSTRACT | DROPDEL + item_flags = ABSTRACT | DROPDEL resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF icon = 'icons/effects/blood.dmi' icon_state = "bloodhand_left" @@ -14,7 +14,9 @@ force = 21 // Just enough to break airlocks with melee attacks damtype = "brute" - var/removing_airlock = FALSE +/obj/item/zombie_hand/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) /obj/item/zombie_hand/equipped(mob/user, slot) . = ..() diff --git a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm index ce6aada0fc..6e28a3115f 100644 --- a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm +++ b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm @@ -119,8 +119,8 @@ /obj/item/melee/transforming/energy/sword/cx/attackby(obj/item/W, mob/living/user, params) if(istype(W, /obj/item/melee/transforming/energy/sword/cx)) - if((W.item_flags & NODROP) || (item_flags & NODROP)) - to_chat(user, "\the [item_flags & NODROP ? src : W] is stuck to your hand, you can't attach it to \the [item_flags & NODROP ? W : src]!") + if(HAS_TRAIT(W, TRAIT_NODROP) || HAS_TRAIT(src, TRAIT_NODROP)) + to_chat(user, "\the [HAS_TRAIT(src, TRAIT_NODROP) ? src : W] is stuck to your hand, you can't attach it to \the [HAS_TRAIT(src, TRAIT_NODROP) ? W : src]!") return else to_chat(user, "You combine the two light swords, making a single supermassive blade! You're cool.") @@ -228,8 +228,8 @@ /obj/item/toy/sword/cx/attackby(obj/item/W, mob/living/user, params) if(istype(W, /obj/item/toy/sword/cx)) - if((W.item_flags & NODROP) || (item_flags & NODROP)) - to_chat(user, "\the [item_flags & NODROP ? src : W] is stuck to your hand, you can't attach it to \the [item_flags & NODROP ? W : src]!") + if(HAS_TRAIT(W, TRAIT_NODROP) || HAS_TRAIT(src, TRAIT_NODROP)) + to_chat(user, "\the [HAS_TRAIT(src, TRAIT_NODROP) ? src : W] is stuck to your hand, you can't attach it to \the [HAS_TRAIT(src, TRAIT_NODROP) ? W : src]!") return else to_chat(user, "You combine the two plastic swords, making a single supermassive toy! You're fake-cool.")