Fixes being able to insert hand emote items (kisses, slappers, etc) into storage (#65169)

Gives hand emote items (kisses, slappers, etc) `TRAIT_NO_STORAGE_INSERT`
Makes evidence bags respect `TRAIT_NO_STORAGE_INSERT`
This commit is contained in:
John Willard
2022-03-05 19:39:00 -06:00
committed by GitHub
parent c16f48aa2a
commit 3936229f86
9 changed files with 62 additions and 64 deletions
@@ -77,7 +77,7 @@
#define COMSIG_LIVING_POST_FULLY_HEAL "living_post_fully_heal"
/// from start of /mob/living/handle_breathing(): (delta_time, times_fired)
#define COMSIG_LIVING_HANDLE_BREATHING "living_handle_breathing"
///from /obj/item/slapper/attack_atom(): (source=mob/living/slammer, obj/structure/table/slammed_table)
///from /obj/item/hand_item/slapper/attack_atom(): (source=mob/living/slammer, obj/structure/table/slammed_table)
#define COMSIG_LIVING_SLAM_TABLE "living_slam_table"
///(NOT on humans) from mob/living/*/UnarmedAttack(): (atom/target, proximity, modifiers)
#define COMSIG_LIVING_UNARMED_ATTACK "living_unarmed_attack"
@@ -112,7 +112,7 @@
#define COMSIG_MOB_CREAMED "mob_creamed"
///From /obj/item/gun/proc/check_botched()
#define COMSIG_MOB_CLUMSY_SHOOT_FOOT "mob_clumsy_shoot_foot"
///from /obj/item/slapper/attack_atom(): (source=obj/structure/table/slammed_table, mob/living/slammer)
///from /obj/item/hand_item/slapper/attack_atom(): (source=obj/structure/table/slammed_table, mob/living/slammer)
#define COMSIG_TABLE_SLAMMED "table_slammed"
///from base of atom/attack_hand(): (mob/user, modifiers)
#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand"
+37 -41
View File
@@ -1,35 +1,40 @@
// For all of the items that are really just the user's hand used in different ways, mostly (all, really) from emotes
/obj/item/circlegame
name = "circled hand"
desc = "If somebody looks at this while it's below your waist, you get to bop them."
icon_state = "madeyoulook"
/// For all of the items that are really just the user's hand used in different ways, mostly (all, really) from emotes
/obj/item/hand_item
force = 0
throwforce = 0
item_flags = DROPDEL | ABSTRACT | HAND_ITEM
/obj/item/hand_item/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NO_STORAGE_INSERT, TRAIT_GENERIC)
/obj/item/hand_item/circlegame
name = "circled hand"
desc = "If somebody looks at this while it's below your waist, you get to bop them."
icon_state = "madeyoulook"
attack_verb_continuous = list("bops")
attack_verb_simple = list("bop")
/obj/item/circlegame/Initialize(mapload)
/obj/item/hand_item/circlegame/Initialize(mapload)
. = ..()
var/mob/living/owner = loc
if(!istype(owner))
return
RegisterSignal(owner, COMSIG_PARENT_EXAMINE, .proc/ownerExamined)
/obj/item/circlegame/Destroy()
/obj/item/hand_item/circlegame/Destroy()
var/mob/owner = loc
if(istype(owner))
UnregisterSignal(owner, COMSIG_PARENT_EXAMINE)
return ..()
/obj/item/circlegame/dropped(mob/user)
/obj/item/hand_item/circlegame/dropped(mob/user)
UnregisterSignal(user, COMSIG_PARENT_EXAMINE) //loc will have changed by the time this is called, so Destroy() can't catch it
// this is a dropdel item.
return ..()
/// Stage 1: The mistake is made
/obj/item/circlegame/proc/ownerExamined(mob/living/owner, mob/living/sucker)
/obj/item/hand_item/circlegame/proc/ownerExamined(mob/living/owner, mob/living/sucker)
SIGNAL_HANDLER
if(!istype(sucker) || !in_range(owner, sucker))
@@ -37,7 +42,7 @@
addtimer(CALLBACK(src, .proc/waitASecond, owner, sucker), 4)
/// Stage 2: Fear sets in
/obj/item/circlegame/proc/waitASecond(mob/living/owner, mob/living/sucker)
/obj/item/hand_item/circlegame/proc/waitASecond(mob/living/owner, mob/living/sucker)
if(QDELETED(sucker) || QDELETED(src) || QDELETED(owner))
return
@@ -49,7 +54,7 @@
addtimer(CALLBACK(src, .proc/GOTTEM, owner, sucker), 6)
/// Stage 3A: We face our own failures
/obj/item/circlegame/proc/selfGottem(mob/living/owner)
/obj/item/hand_item/circlegame/proc/selfGottem(mob/living/owner)
if(QDELETED(src) || QDELETED(owner))
return
@@ -63,7 +68,7 @@
qdel(src)
/// Stage 3B: We face our reckoning (unless we moved away or they're incapacitated)
/obj/item/circlegame/proc/GOTTEM(mob/living/owner, mob/living/sucker)
/obj/item/hand_item/circlegame/proc/GOTTEM(mob/living/owner, mob/living/sucker)
if(QDELETED(sucker))
return
@@ -103,16 +108,13 @@
qdel(src)
/obj/item/noogie
/obj/item/hand_item/noogie
name = "noogie"
desc = "Get someone in an aggressive grab then use this on them to ruin their day."
icon_state = "latexballon"
inhand_icon_state = "nothing"
force = 0
throwforce = 0
item_flags = DROPDEL | ABSTRACT | HAND_ITEM
/obj/item/noogie/attack(mob/living/carbon/target, mob/living/carbon/human/user)
/obj/item/hand_item/noogie/attack(mob/living/carbon/target, mob/living/carbon/human/user)
if(!istype(target))
to_chat(user, span_warning("You don't think you can give this a noogie!"))
return
@@ -163,7 +165,7 @@
noogie_loop(user, target, 0)
/// The actual meat and bones of the noogie'ing
/obj/item/noogie/proc/noogie_loop(mob/living/carbon/human/user, mob/living/carbon/target, iteration)
/obj/item/hand_item/noogie/proc/noogie_loop(mob/living/carbon/human/user, mob/living/carbon/target, iteration)
if(!(target?.get_bodypart(BODY_ZONE_HEAD)) || user.pulling != target)
return FALSE
@@ -199,21 +201,18 @@
noogie_loop(user, target, iteration)
/obj/item/slapper
/obj/item/hand_item/slapper
name = "slapper"
desc = "This is how real men fight."
icon_state = "latexballon"
inhand_icon_state = "nothing"
force = 0
throwforce = 0
item_flags = DROPDEL | ABSTRACT | HAND_ITEM
attack_verb_continuous = list("slaps")
attack_verb_simple = list("slap")
hitsound = 'sound/effects/snap.ogg'
/// How many smaller table smacks we can do before we're out
var/table_smacks_left = 3
/obj/item/slapper/attack(mob/living/slapped, mob/living/carbon/human/user)
/obj/item/hand_item/slapper/attack(mob/living/slapped, mob/living/carbon/human/user)
if(ishuman(slapped))
var/mob/living/carbon/human/human_slapped = slapped
human_slapped.dna?.species?.stop_wagging_tail(slapped)
@@ -221,7 +220,7 @@
var/slap_volume = 50
var/datum/status_effect/offering/kiss_check = slapped.has_status_effect(/datum/status_effect/offering)
if(kiss_check && istype(kiss_check.offered_item, /obj/item/kisser) && (user in kiss_check.possible_takers))
if(kiss_check && istype(kiss_check.offered_item, /obj/item/hand_item/kisser) && (user in kiss_check.possible_takers))
user.visible_message(
span_danger("[user] scoffs at [slapped]'s advance, winds up, and smacks [slapped.p_them()] hard to the ground!"),
span_notice("The nerve! You wind back your hand and smack [slapped] hard enough to knock [slapped.p_them()] over!"),
@@ -270,7 +269,7 @@
playsound(slapped, 'sound/weapons/slap.ogg', slap_volume, TRUE, -1)
return
/obj/item/slapper/attack_atom(obj/O, mob/living/user, params)
/obj/item/hand_item/slapper/attack_atom(obj/O, mob/living/user, params)
if(!istype(O, /obj/structure/table))
return ..()
@@ -296,7 +295,7 @@
if(table_smacks_left <= 0)
qdel(src)
/obj/item/slapper/on_offered(mob/living/carbon/offerer)
/obj/item/hand_item/slapper/on_offered(mob/living/carbon/offerer)
. = TRUE
if(!(locate(/mob/living/carbon) in orange(1, offerer)))
@@ -309,7 +308,7 @@
offerer.apply_status_effect(/datum/status_effect/offering, src, /atom/movable/screen/alert/give/highfive)
/// Yeah broh! This is where we do the high-fiving (or high-tenning :o)
/obj/item/slapper/on_offer_taken(mob/living/carbon/offerer, mob/living/carbon/taker)
/obj/item/hand_item/slapper/on_offer_taken(mob/living/carbon/offerer, mob/living/carbon/taker)
. = TRUE
var/open_hands_taker
@@ -324,7 +323,7 @@
return
for(var/i in offerer.held_items)
var/obj/item/slapper/slap_check = i
var/obj/item/hand_item/slapper/slap_check = i
if(istype(slap_check))
slappers_giver++
@@ -347,7 +346,7 @@
qdel(src)
/// Gangster secret handshakes.
/obj/item/slapper/secret_handshake
/obj/item/hand_item/slapper/secret_handshake
name = "Secret Handshake"
icon_state = "recruit"
icon = 'icons/obj/gang/actions.dmi'
@@ -360,7 +359,7 @@
/// Adds the user to the family that this package corresponds to, dispenses the free_clothes of that family, and adds them to the handler if it exists.
/obj/item/slapper/secret_handshake/proc/add_to_gang(mob/living/user, original_name)
/obj/item/hand_item/slapper/secret_handshake/proc/add_to_gang(mob/living/user, original_name)
var/datum/antagonist/gang/swappin_sides = new gang_to_use()
swappin_sides.original_name = original_name
swappin_sides.handler = handler
@@ -374,7 +373,7 @@
handler.gangbangers += user.mind
/// Checks if the user is trying to use the package of the family they are in, and if not, adds them to the family, with some differing processing depending on whether the user is already a family member.
/obj/item/slapper/secret_handshake/proc/attempt_join_gang(mob/living/user)
/obj/item/hand_item/slapper/secret_handshake/proc/attempt_join_gang(mob/living/user)
if(!user?.mind)
return
var/datum/antagonist/gang/is_gangster = user.mind.has_antag_datum(/datum/antagonist/gang)
@@ -387,7 +386,7 @@
user.mind.remove_antag_datum(/datum/antagonist/gang)
add_to_gang(user, real_name_backup)
/obj/item/slapper/secret_handshake/on_offer_taken(mob/living/carbon/offerer, mob/living/carbon/taker)
/obj/item/hand_item/slapper/secret_handshake/on_offer_taken(mob/living/carbon/offerer, mob/living/carbon/taker)
. = TRUE
if (!(null in taker.held_items))
to_chat(taker, span_warning("You can't get taught the secret handshake if [offerer] has no free hands!"))
@@ -416,21 +415,18 @@
/obj/item/kisser
/obj/item/hand_item/kisser
name = "kiss"
desc = "I want you all to know, everyone and anyone, to seal it with a kiss."
icon = 'icons/mob/animal.dmi'
icon_state = "heart"
inhand_icon_state = "nothing"
force = 0
throwforce = 0
item_flags = DROPDEL | ABSTRACT | HAND_ITEM
/// The kind of projectile this version of the kiss blower fires
var/kiss_type = /obj/projectile/kiss
/// TRUE if the user was aiming anywhere but the mouth when they offer the kiss, if it's offered
var/cheek_kiss
/obj/item/kisser/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
/obj/item/hand_item/kisser/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
if(HAS_TRAIT(user, TRAIT_GARLIC_BREATH))
kiss_type = /obj/projectile/kiss/french
@@ -446,7 +442,7 @@
blown_kiss.fire()
qdel(src)
/obj/item/kisser/on_offered(mob/living/carbon/offerer)
/obj/item/hand_item/kisser/on_offered(mob/living/carbon/offerer)
if(!(locate(/mob/living/carbon) in orange(1, offerer)))
return TRUE
@@ -456,7 +452,7 @@
offerer.apply_status_effect(/datum/status_effect/offering, src)
return TRUE
/obj/item/kisser/on_offer_taken(mob/living/carbon/offerer, mob/living/carbon/taker)
/obj/item/hand_item/kisser/on_offer_taken(mob/living/carbon/offerer, mob/living/carbon/taker)
var/obj/projectile/blown_kiss = new kiss_type(get_turf(offerer))
offerer.visible_message("<b>[offerer]</b> gives [taker] \a [blown_kiss][cheek_kiss ? " on the cheek" : ""]!!", span_notice("You give [taker] \a [blown_kiss][cheek_kiss ? " on the cheek" : ""]!"), ignored_mobs = taker)
to_chat(taker, span_nicegreen("[offerer] gives you \a [blown_kiss][cheek_kiss ? " on the cheek" : ""]!"))
@@ -474,7 +470,7 @@
qdel(src)
return TRUE // so the core offering code knows to halt
/obj/item/kisser/death
/obj/item/hand_item/kisser/death
name = "kiss of death"
desc = "If looks could kill, they'd be this."
color = COLOR_BLACK
+1 -1
View File
@@ -239,7 +239,7 @@
if(human_owner.stat != CONSCIOUS || human_owner.incapacitated())
return FALSE
var/obj/item/slapper/secret_handshake/secret_handshake_item = new(owner)
var/obj/item/hand_item/slapper/secret_handshake/secret_handshake_item = new(owner)
if(owner.put_in_hands(secret_handshake_item))
to_chat(owner, span_notice("You ready your secret handshake."))
else
+4
View File
@@ -32,6 +32,10 @@
to_chat(user, span_warning("No matter what way you try, you can't get [I] to fit inside [src]."))
return TRUE //begone infinite storage ghosts, begone from me
if(HAS_TRAIT(I, TRAIT_NO_STORAGE_INSERT))
to_chat(user, span_warning("No matter what way you try, you can't get [I] to fit inside [src]."))
return TRUE
if(istype(I, /obj/item/evidencebag))
to_chat(user, span_warning("You find putting an evidence bag in another evidence bag to be slightly absurd."))
return TRUE //now this is podracing
@@ -662,7 +662,7 @@
to_chat(src, span_danger("You fail to grasp your [grasped_part.name]."))
return
var/obj/item/self_grasp/grasp = new
var/obj/item/hand_item/self_grasp/grasp = new
if(starting_hand_index != active_hand_index || !put_in_active_hand(grasp))
to_chat(src, span_danger("You fail to grasp your [grasped_part.name]."))
QDEL_NULL(grasp)
@@ -670,13 +670,11 @@
grasp.grasp_limb(grasped_part)
/// an abstract item representing you holding your own limb to staunch the bleeding, see [/mob/living/carbon/proc/grabbedby] will probably need to find somewhere else to put this.
/obj/item/self_grasp
/obj/item/hand_item/self_grasp
name = "self-grasp"
desc = "Sometimes all you can do is slow the bleeding."
icon_state = "latexballon"
inhand_icon_state = "nothing"
force = 0
throwforce = 0
slowdown = 1
item_flags = DROPDEL | ABSTRACT | NOBLUDGEON | SLOWS_WHILE_IN_HAND | HAND_ITEM
/// The bodypart we're staunching bleeding on, which also has a reference to us in [/obj/item/bodypart/var/grasped_by]
@@ -684,7 +682,7 @@
/// The carbon who owns all of this mess
var/mob/living/carbon/user
/obj/item/self_grasp/Destroy()
/obj/item/hand_item/self_grasp/Destroy()
if(user)
to_chat(user, span_warning("You stop holding onto your[grasped_part ? " [grasped_part.name]" : "self"]."))
UnregisterSignal(user, COMSIG_PARENT_QDELETING)
@@ -696,12 +694,12 @@
return ..()
/// The limb or the whole damn person we were grasping got deleted or dismembered, so we don't care anymore
/obj/item/self_grasp/proc/qdel_void()
/obj/item/hand_item/self_grasp/proc/qdel_void()
SIGNAL_HANDLER
qdel(src)
/// We've already cleared that the bodypart in question is bleeding in [the place we create this][/mob/living/carbon/proc/grabbedby], so set up the connections
/obj/item/self_grasp/proc/grasp_limb(obj/item/bodypart/grasping_part)
/obj/item/hand_item/self_grasp/proc/grasp_limb(obj/item/bodypart/grasping_part)
user = grasping_part.owner
if(!istype(user))
stack_trace("[src] attempted to try_grasp() with [istype(user, /datum) ? user.type : isnull(user) ? "null" : user] user")
+9 -9
View File
@@ -46,18 +46,18 @@
if(!iscarbon(user) || user.usable_hands < 2)
return FALSE
return ..()
/datum/emote/living/carbon/circle
key = "circle"
key_third_person = "circles"
hands_use_check = TRUE
/datum/emote/living/carbon/circle/run_emote(mob/user, params, type_override, intentional)
. = ..()
if(!length(user.get_empty_held_indexes()))
to_chat(user, span_warning("You don't have any free hands to make a circle with."))
return
var/obj/item/circlegame/N = new(user)
var/obj/item/hand_item/circlegame/N = new(user)
if(user.put_in_hands(N))
to_chat(user, span_notice("You make a circle with your hand."))
@@ -67,7 +67,7 @@
message = "moans!"
message_mime = "appears to moan!"
emote_type = EMOTE_AUDIBLE
/datum/emote/living/carbon/noogie
key = "noogie"
key_third_person = "noogies"
@@ -77,7 +77,7 @@
. = ..()
if(!.)
return
var/obj/item/noogie/noogie = new(user)
var/obj/item/hand_item/noogie/noogie = new(user)
if(user.put_in_hands(noogie))
to_chat(user, span_notice("You ready your noogie'ing hand."))
else
@@ -104,7 +104,7 @@
message_param = "signs the number %t."
mob_type_allowed_typecache = list(/mob/living/carbon/alien)
hands_use_check = TRUE
/datum/emote/living/carbon/sign/select_param(mob/user, params)
. = ..()
if(!isnum(text2num(params)))
@@ -116,18 +116,18 @@
message_param = "raises %t fingers."
mob_type_allowed_typecache = list(/mob/living/carbon/human)
hands_use_check = TRUE
/datum/emote/living/carbon/slap
key = "slap"
key_third_person = "slaps"
hands_use_check = TRUE
cooldown = 3 SECONDS // to prevent endless table slamming
/datum/emote/living/carbon/slap/run_emote(mob/user, params, type_override, intentional)
. = ..()
if(!.)
return
var/obj/item/slapper/N = new(user)
var/obj/item/hand_item/slapper/N = new(user)
if(user.put_in_hands(N))
to_chat(user, span_notice("You ready your slapping hand."))
else
+2 -2
View File
@@ -202,10 +202,10 @@
. = ..()
if(!.)
return
var/kiss_type = /obj/item/kisser
var/kiss_type = /obj/item/hand_item/kisser
if(HAS_TRAIT(user, TRAIT_KISS_OF_DEATH))
kiss_type = /obj/item/kisser/death
kiss_type = /obj/item/hand_item/kisser/death
var/obj/item/kiss_blower = new kiss_type(user)
if(user.put_in_hands(kiss_blower))
+2 -2
View File
@@ -107,8 +107,8 @@
var/generic_bleedstacks
/// If we have a gauze wrapping currently applied (not including splints)
var/obj/item/stack/current_gauze
/// If something is currently grasping this bodypart and trying to staunch bleeding (see [/obj/item/self_grasp])
var/obj/item/self_grasp/grasped_by
/// If something is currently grasping this bodypart and trying to staunch bleeding (see [/obj/item/hand_item/self_grasp])
var/obj/item/hand_item/self_grasp/grasped_by
///A list of all the external organs we've got stored to draw horns, wings and stuff with (special because we are actually in the limbs unlike normal organs :/ )
var/list/obj/item/organ/external/external_organs = list()