[MIRROR] Gripper fixes (#12714)

Co-authored-by: Cameron Lennox <killer65311@gmail.com>
This commit is contained in:
CHOMPStation2StaffMirrorBot
2026-04-26 21:53:22 -04:00
committed by GitHub
co-authored by Cameron Lennox
parent 62d4e50a7f
commit afcea67115
116 changed files with 801 additions and 680 deletions
+2 -1
View File
@@ -33,8 +33,9 @@
return attack_hand(user) //Process as if we're a normal person touching the object.
return ..() //Otherwise, treat this as an AI click like usual.
/atom/movable/MouseDrop_T(mob/living/M, mob/living/user)
/atom/movable/MouseDrop_T(atom/dropping, mob/user, src_location, over_location, src_control, over_control, params)
. = ..()
var/mob/living/M = dropping
if(can_buckle && istype(M))
if(user_buckle_mob(M, user))
return TRUE
+4 -4
View File
@@ -716,11 +716,11 @@ GLOBAL_LIST_INIT(slot_flags_enumeration, list(
if(protection && (protection.body_parts_covered & EYES))
// you can't stab someone in the eyes wearing a mask!
to_chat(user, span_warning("You're going to need to remove the eye covering first."))
return
return ITEM_INTERACT_FAILURE
if(!M.has_eyes())
to_chat(user, span_warning("You cannot locate any eyes on [M]!"))
return
return ITEM_INTERACT_FAILURE
//this should absolutely trigger even if not aim-impaired in some way
var/hit_zone = get_zone_with_miss_chance(U.zone_sel.selecting, M, U.get_accuracy_penalty(U))
@@ -728,7 +728,7 @@ GLOBAL_LIST_INIT(slot_flags_enumeration, list(
U.do_attack_animation(M)
playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message(span_danger("\The [U] attempts to stab \the [M] in the eyes, but misses!"))
return
return ITEM_INTERACT_FAILURE
add_attack_logs(user,M,"Attack eyes with [name]")
@@ -781,7 +781,7 @@ GLOBAL_LIST_INIT(slot_flags_enumeration, list(
else
M.take_organ_damage(7)
M.eye_blurry += rand(3,4)
return
return ITEM_INTERACT_SUCCESS
/obj/item/reveal_blood()
if(was_bloodied && !fluorescent)
+1 -1
View File
@@ -18,7 +18,7 @@
if(broken)
. += span_bold("It looks damaged, the ringer is stuck firmly inside.")
/obj/item/deskbell/attack(mob/target as mob, mob/living/user as mob)
/obj/item/deskbell/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(!broken)
playsound(src, 'sound/effects/deskbell.ogg', 50, 1)
..()
+4 -2
View File
@@ -130,7 +130,7 @@
qdel(src)
return
/obj/item/pen/crayon/attack(mob/living/M as mob, mob/living/user as mob)
/obj/item/pen/crayon/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(M == user)
to_chat(user, "You take a bite of the crayon and swallow it.")
user.nutrition += 1
@@ -144,6 +144,7 @@
if(uses <= 0)
to_chat(user, span_warning("You ate your crayon!"))
qdel(src)
return ITEM_INTERACT_SUCCESS
else
..()
@@ -230,7 +231,7 @@
shadeColour = new_colour
return
/obj/item/pen/crayon/marker/attack(mob/living/M, mob/living/user)
/obj/item/pen/crayon/marker/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(M == user)
to_chat(user, "You take a bite of the marker and swallow it.")
user.nutrition += 1
@@ -244,5 +245,6 @@
if(uses <= 0)
to_chat(user, span_warning("You ate the marker!"))
qdel(src)
return ITEM_INTERACT_SUCCESS
else
..()
+5 -3
View File
@@ -13,12 +13,14 @@
var/mob/living/silicon/ai/carded_ai
/obj/item/aicard/attack(mob/living/silicon/decoy/M as mob, mob/user as mob)
if (!istype (M, /mob/living/silicon/decoy))
/obj/item/aicard/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(!istype(M, /mob/living/silicon/decoy))
return ..()
else
M.death()
var/mob/living/silicon/decoy/decoy = M
decoy.death()
to_chat(user, span_infoplain(span_bold("ERROR ERROR ERROR")))
return ITEM_INTERACT_SUCCESS
/obj/item/aicard/attack_self(mob/user)
. = ..(user)
@@ -12,30 +12,30 @@
drop_sound = 'sound/items/drop/device.ogg'
flags = NOBLUDGEON
/obj/item/bodysnatcher/attack(mob/living/M, mob/living/user)
/obj/item/bodysnatcher/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(ishuman(M) || issilicon(M)) //Allows body swapping with humans, synths, and pAI's/borgs since they all have a mind.
if(user == M)
to_chat(user,span_warning("A message pops up on the LED display, informing you that the mind transfer to yourself was successful... Wait, did that even do anything?"))
return
return ITEM_INTERACT_FAILURE
if(!M.mind) //Do they have a mind?
to_chat(user,span_warning("A warning pops up on the device, informing you that [M] appears braindead."))
return
return ITEM_INTERACT_FAILURE
if(!M.allow_mind_transfer)
to_chat(user,span_danger("The target's mind is too complex to be affected!"))
return
return ITEM_INTERACT_FAILURE
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.resleeve_lock && user.ckey != H.resleeve_lock)
to_chat(src, span_danger("[H] cannot be impersonated!"))
return
return ITEM_INTERACT_FAILURE
if(M.stat == DEAD) //Are they dead?
to_chat(user,span_warning("A warning pops up on the device, informing you that [M] is dead, and, as such, the mind transfer can not be done."))
return
return ITEM_INTERACT_FAILURE
var/choice = tgui_alert(user,"This will swap your mind with the target's mind. This will result in them controlling your body, and you controlling their body. Continue?","Confirmation",list("Continue","Cancel"))
if(choice == "Continue" && user.get_active_hand() == src && user.Adjacent(M))
@@ -99,9 +99,12 @@
M.SetSleeping(10)
M.eye_blurry = 30
M.slurring = 50
return ITEM_INTERACT_SUCCESS
return ITEM_INTERACT_BLOCKING
else
to_chat(user,span_warning(" A warning pops up on the LED display on the side of the device, informing you that the target is not able to have their mind swapped with!"))
return ITEM_INTERACT_FAILURE
/obj/item/bodysnatcher/attack_self(mob/user)
. = ..(user)
+4 -4
View File
@@ -312,21 +312,21 @@
/obj/item/shockpaddles/proc/checked_use(var/charge_amt)
return 0
/obj/item/shockpaddles/attack(mob/living/M, mob/living/user, var/target_zone)
/obj/item/shockpaddles/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
var/mob/living/carbon/human/H = M
if(!istype(H) || user.a_intent == I_HURT)
return ..() //Do a regular attack. Harm intent shocking happens as a hit effect
if(can_use(user, H))
busy = 1
busy = TRUE
update_icon()
do_revive(H, user)
busy = 0
busy = FALSE
update_icon()
return 1
return ITEM_INTERACT_SUCCESS
//Since harm-intent now skips the delay for deliberate placement, you have to be able to hit them in combat in order to shock people.
/obj/item/shockpaddles/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
@@ -218,12 +218,13 @@
/obj/item/denecrotizer/attack(mob/living/simple_mob/target, mob/living/user)
/obj/item/denecrotizer/attack(mob/living/target, mob/living/user, target_zone, attack_modifier)
if(check_target(target, user))
if(advanced)
ghostjoin_rez(target, user)
else
basic_rez(target, user)
return ITEM_INTERACT_SUCCESS
else
return ..()
@@ -93,8 +93,8 @@
// maximum_stealth = scanner.rating + 2
maximum_level = scanner.rating + 5
/obj/item/extrapolator/attack(atom/AM, mob/living/user)
return
/obj/item/extrapolator/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
return ITEM_INTERACT_FAILURE
/obj/item/extrapolator/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
+8 -7
View File
@@ -160,24 +160,25 @@
return TRUE
//attack_as_weapon
/obj/item/flash/attack(mob/living/target, mob/living/user, var/target_zone)
/obj/item/flash/attack(mob/living/target, mob/living/user, target_zone, attack_modifier)
if(!user || !target || target.is_incorporeal())
return //sanity
return ITEM_INTERACT_FAILURE //sanity
add_attack_logs(user,target,"Flashed (attempt) with [src]")
user.setClickCooldown(user.get_attack_speed(src))
user.do_attack_animation(target)
if(!clown_check(user)) return
if(!clown_check(user))
return ITEM_INTERACT_FAILURE
if(broken)
to_chat(user, span_warning("\The [src] is broken."))
return
return ITEM_INTERACT_FAILURE
flash_recharge()
if(!check_capacitor(user))
return
return ITEM_INTERACT_FAILURE
playsound(src, 'sound/weapons/flash.ogg', 100, 1)
@@ -196,10 +197,10 @@
user.visible_message(span_notice("[user] overloads [target]'s sensors with the flash!"))
else
user.visible_message(span_disarm("[user] blinds [target] with the flash!"))
return
return ITEM_INTERACT_SUCCESS
//fail message
user.visible_message(span_notice("[user] fails to blind [target] with the flash!"))
return
return ITEM_INTERACT_FAILURE
/// Sees if we can flash the target and if so, does the effects of it.
/// Returns TRUE if the flash went through, FALSE otherwise.
@@ -121,7 +121,7 @@
user.update_mob_action_buttons()
return CAN_USE
/obj/item/flashlight/attack(mob/living/M as mob, mob/living/user as mob)
/obj/item/flashlight/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
add_fingerprint(user)
if(on && user.zone_sel.selecting == O_EYES)
@@ -133,7 +133,7 @@
for(var/obj/item/clothing/C in list(H.head,H.wear_mask,H.glasses))
if(istype(C) && (C.body_parts_covered & EYES))
to_chat(user, span_warning("You're going to need to remove [C.name] first."))
return
return ITEM_INTERACT_FAILURE
var/obj/item/organ/vision
if(H.species.vision_organ)
@@ -143,14 +143,14 @@
span_notice("You direct [src] at [M]'s face."))
to_chat(user, span_warning("You can't find any [H.species.vision_organ ? H.species.vision_organ : "eyes"] on [H]!"))
user.setClickCooldown(user.get_attack_speed(src))
return
return ITEM_INTERACT_FAILURE
user.visible_message(span_infoplain(span_bold("\The [user]") + " directs [src] to [M]'s eyes."), \
span_notice("You direct [src] to [M]'s eyes."))
if(H != user) //can't look into your own eyes buster
if(M.stat == DEAD || M.blinded) //mob is dead or fully blind
to_chat(user, span_warning("\The [M]'s pupils do not react to the light!"))
return
return ITEM_INTERACT_SUCCESS
if(XRAY in M.mutations)
to_chat(user, span_notice("\The [M] pupils give an eerie glow!"))
if(vision.is_bruised())
@@ -171,6 +171,7 @@
user.setClickCooldown(user.get_attack_speed(src)) //can be used offensively
M.flash_eyes()
return ITEM_INTERACT_SUCCESS
else
return ..()
@@ -57,10 +57,11 @@
..()
//hit other people with it
/obj/item/holowarrant/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
/obj/item/holowarrant/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
user.visible_message(span_notice("You show the warrant to [M]."), \
span_notice("[user] holds up a warrant projector and shows the contents to [M]."))
M.examinate(src)
return ITEM_INTERACT_SUCCESS
/obj/item/holowarrant/update_icon()
if(active)
@@ -45,8 +45,9 @@
/obj/item/laser_pointer/ultimate/Initialize(mapload)
. = ..(mapload, /obj/item/stock_parts/micro_laser/omni)
/obj/item/laser_pointer/attack(mob/living/M, mob/user)
/obj/item/laser_pointer/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
laser_act(M, user)
return ITEM_INTERACT_SUCCESS
/obj/item/laser_pointer/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/stock_parts/micro_laser))
@@ -10,13 +10,13 @@
pickup_sound = 'sound/items/pickup/device.ogg'
drop_sound = 'sound/items/drop/device.ogg'
/obj/item/halogen_counter/attack(mob/living/M as mob, mob/living/user as mob)
/obj/item/halogen_counter/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(!iscarbon(M))
to_chat(user, span_warning("This device can only scan organic beings!"))
return
return ITEM_INTERACT_FAILURE
user.visible_message(span_warning("\The [user] has analyzed [M]'s radiation levels!"), span_notice("Analyzing Results for [M]:"))
if(M.radiation)
to_chat(user, span_notice("Radiation Level: [M.radiation]"))
else
to_chat(user, span_notice("No radiation detected."))
return
return ITEM_INTERACT_SUCCESS
@@ -38,8 +38,9 @@
scan_mob(M, user) //default surgery behaviour is just to scan as usual
return 1
/obj/item/healthanalyzer/attack(mob/living/M, mob/living/user)
/obj/item/healthanalyzer/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
scan_mob(M, user)
return ITEM_INTERACT_SUCCESS
/obj/item/healthanalyzer/proc/scan_mob(mob/living/M, mob/living/user)
var/dat = ""
@@ -77,7 +77,7 @@ GLOBAL_DATUM(sleevemate_mob, /mob/living/carbon/human/dummy/mannequin)
/obj/item/sleevemate/attack(mob/living/M, mob/living/user)
/obj/item/sleevemate/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
// Gather potential subtargets
var/list/choices = list(M)
if(istype(M))
@@ -88,7 +88,7 @@ GLOBAL_DATUM(sleevemate_mob, /mob/living/carbon/human/dummy/mannequin)
if(choices.len > 1)
var/mob/living/new_M = tgui_input_list(user, "Ambiguous target. Please validate target:", "Target Validation", choices, M)
if(!new_M || !M.Adjacent(user))
return
return ITEM_INTERACT_FAILURE
M = new_M
if(isrobot(M))
@@ -96,12 +96,14 @@ GLOBAL_DATUM(sleevemate_mob, /mob/living/carbon/human/dummy/mannequin)
var/obj/item/dogborg/sleeper/S = locate() in R.module.modules
if(S && S.patient)
scan_mob(S.patient, user)
return
return ITEM_INTERACT_SUCCESS
if(ishuman(M))
scan_mob(M, user)
return ITEM_INTERACT_SUCCESS
else
to_chat(user,span_warning("Not a compatible subject to work with!"))
return ITEM_INTERACT_FAILURE
/obj/item/sleevemate/attack_self(mob/living/user)
. = ..(user)
@@ -11,10 +11,10 @@
pickup_sound = 'sound/items/pickup/device.ogg'
drop_sound = 'sound/items/drop/device.ogg'
/obj/item/slime_scanner/attack(mob/living/M as mob, mob/living/user as mob)
/obj/item/slime_scanner/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(!istype(M, /mob/living/simple_mob/slime/xenobio))
to_chat(user, span_infoplain(span_bold("This device can only scan lab-grown slimes!")))
return
return ITEM_INTERACT_FAILURE
var/mob/living/simple_mob/slime/xenobio/S = M
user.show_message("Slime scan results:<br>[S.slime_color] [S.is_adult ? "adult" : "baby"] slime<br>Health: [S.health]<br>Mutation Probability: [S.mutation_chance]")
@@ -42,3 +42,4 @@
user.show_message("Subject is friendly to other slime colors.")
user.show_message("Growth progress: [S.amount_grown]/10")
return ITEM_INTERACT_SUCCESS
+10 -8
View File
@@ -65,24 +65,25 @@
return
//Called when someone is clicked with the leash
/obj/item/leash/attack(mob/living/C, mob/living/user, attackchain_flags, damage_multiplier) //C is the target, user is the one with the leash
/obj/item/leash/attack(mob/living/C, mob/living/user, target_zone, attack_modifier) //C is the target, user is the one with the leash
var/mob/living/leash_pet = leash_pet_ref?.resolve()
var/mob/living/leash_master = leash_master_ref?.resolve()
if(C.alerts && C.alerts["leashed"]) //If the pet is already leashed, do not leash them. For the love of god.
// If they re-click, remove the leash
if (C == leash_pet && user == leash_master)
unleash()
return ITEM_INTERACT_SUCCESS
else
// Dear god not the double leashing
to_chat(user, span_notice("[C] has already been leashed."))
return
return ITEM_INTERACT_FAILURE
if(!C.mind)
return
return ITEM_INTERACT_FAILURE
if (C == user)
if(C == user)
to_chat(user, span_notice("You cannot leash yourself!"))
return
return ITEM_INTERACT_FAILURE
var/leashtime = 35
@@ -90,16 +91,16 @@
var/mob/living/carbon/human/humantarget = C
if (!is_wearing_collar(humantarget))
to_chat(user, span_notice("[humantarget] needs a collar before you can attach a leash to it."))
return
return ITEM_INTERACT_FAILURE
if(humantarget.handcuffed)
leashtime = 5
C.visible_message(span_danger("\The [user] is attempting to put the leash on \the [C]!"), span_danger("\The [user] tries to put a leash on you"))
add_attack_logs(user,C,"Leashed (attempt)")
if(!do_after(user, leashtime, C)) //do_mob adds a progress bar, but then we also check to see if they have a collar
return
return ITEM_INTERACT_FAILURE
if(tgui_alert(C, "Would you like to be leased by [user]? You can OOC escape to escape", "Become Leashed",list("No","Yes")) != "Yes")
return
return ITEM_INTERACT_FAILURE
C.visible_message(span_danger("\The [user] puts a leash on \the [C]!"), span_danger("The leash clicks onto your collar!"))
@@ -114,6 +115,7 @@
RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_master_move))
START_PROCESSING(SSobj, src)
return ITEM_INTERACT_SUCCESS
//Called when the leash is used in hand
//Tugs the pet closer
+55 -47
View File
@@ -15,58 +15,59 @@
var/upgrade_to // The type path this stack can be upgraded to.
/obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob)
if (!istype(M))
/obj/item/stack/medical/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(!iscarbon(M))
balloon_alert(user, "\the [src] cannot be applied to [M]!")
return 1
return ITEM_INTERACT_FAILURE
if (!user.IsAdvancedToolUser())
balloon_alert(user, "you don't have the dexterity to do this!")
return 1
return ITEM_INTERACT_FAILURE
var/available = get_amount()
if(!available)
balloon_alert(user, "not enough [uses_charge ? "charge" : "items"] left to use that!")
return 1
return ITEM_INTERACT_FAILURE
if (ishuman(M))
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(!affecting)
balloon_alert(user, "no body part there to work on!")
return 1
return ITEM_INTERACT_FAILURE
if(affecting.organ_tag == BP_HEAD)
if(H.head && istype(H.head,/obj/item/clothing/head/helmet/space))
balloon_alert(user, "you can't apply [src] through [H.head]!")
return 1
return ITEM_INTERACT_FAILURE
else
if(H.wear_suit && istype(H.wear_suit,/obj/item/clothing/suit/space))
balloon_alert(user, "you can't apply [src] through [H.wear_suit]!")
return 1
return ITEM_INTERACT_FAILURE
if(affecting.robotic == ORGAN_ROBOT)
balloon_alert(user, "this isn't useful at all on a robotic limb.")
return 1
return ITEM_INTERACT_FAILURE
if(affecting.robotic >= ORGAN_LIFELIKE)
balloon_alert(user, "you apply the [src], but it seems to have no effect...")
use(1)
return 1
return ITEM_INTERACT_FAILURE
H.UpdateDamageIcon()
else
M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2))
user.balloon_alert_visible( \
"[M] has been applied with [src] by [user].", \
"you apply \the [src] to [M]." \
)
use(1)
return ITEM_INTERACT_SUCCESS
M.updatehealth()
return ITEM_INTERACT_SUCCESS
/obj/item/stack/medical/proc/upgrade_stack(var/upgrade_amount)
. = FALSE
@@ -89,9 +90,9 @@
upgrade_to = /obj/item/stack/medical/bruise_pack
/obj/item/stack/medical/crude_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
/obj/item/stack/medical/crude_pack/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(..())
return 1
return ITEM_INTERACT_FAILURE
if (ishuman(M))
var/mob/living/carbon/human/H = M
@@ -103,7 +104,7 @@
if(affecting.is_bandaged())
balloon_alert(user, "[M]'s [affecting.name] is already bandaged.")
return 1
return ITEM_INTERACT_FAILURE
else
var/available = get_amount()
user.balloon_alert_visible("\the [user] starts bandaging [M]'s [affecting.name].", \
@@ -122,7 +123,7 @@
if(affecting.is_bandaged()) // We do a second check after the delay, in case it was bandaged after the first check.
balloon_alert(user, "[M]'s [affecting.name] is already bandaged.")
return 1
return ITEM_INTERACT_FAILURE
if(used >= available)
balloon_alert(user, "you run out of [src]!")
@@ -144,6 +145,7 @@
else
balloon_alert(user, "\the [src] is used up, but there are more wounds to treat on \the [affecting.name].")
use(used)
return ITEM_INTERACT_SUCCESS
/obj/item/stack/medical/bruise_pack
name = "roll of gauze"
@@ -157,9 +159,9 @@
upgrade_to = /obj/item/stack/medical/advanced/bruise_pack
/obj/item/stack/medical/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
/obj/item/stack/medical/bruise_pack/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(..())
return 1
return ITEM_INTERACT_FAILURE
if (ishuman(M))
var/mob/living/carbon/human/H = M
@@ -171,7 +173,7 @@
if(affecting.is_bandaged())
balloon_alert(user, "[M]'s [affecting.name] is already bandaged.")
return 1
return ITEM_INTERACT_FAILURE
else
var/available = get_amount()
user.balloon_alert_visible("\the [user] starts treating [M]'s [affecting.name].", \
@@ -217,6 +219,7 @@
else
user.balloon_alert(user, "\the [src] is used up, but there are more wounds to treat on \the [affecting.name].")
use(used)
return ITEM_INTERACT_SUCCESS
/obj/item/stack/medical/ointment
name = "ointment"
@@ -230,9 +233,9 @@
drop_sound = 'sound/items/drop/herb.ogg'
pickup_sound = 'sound/items/pickup/herb.ogg'
/obj/item/stack/medical/ointment/attack(mob/living/carbon/M as mob, mob/user as mob)
/obj/item/stack/medical/ointment/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(..())
return 1
return ITEM_INTERACT_FAILURE
if (ishuman(M))
var/mob/living/carbon/human/H = M
@@ -244,21 +247,22 @@
if(affecting.is_salved())
user.balloon_alert(user, "the wounds on [M]'s [affecting.name] have already been salved.")
return 1
return ITEM_INTERACT_FAILURE
else
user.balloon_alert_visible("\the [user] starts salving wounds on [M]'s [affecting.name].", \
"salving the wounds on [M]'s [affecting.name]." )
if(!do_after(user, 1 SECOND, affecting))
user.balloon_alert(user, "stand still to salve wounds.")
return 1
return ITEM_INTERACT_FAILURE
if(affecting.is_salved()) // We do a second check after the delay, in case it was bandaged after the first check.
user.balloon_alert(user, "[M]'s [affecting.name] have already been salved.")
return 1
return ITEM_INTERACT_FAILURE
user.balloon_alert_visible("[user] salved wounds on [M]'s [affecting.name].", \
"salved wounds on [M]'s [affecting.name]." )
use(1)
affecting.salve()
playsound(src, pick(apply_sounds), 25)
return ITEM_INTERACT_SUCCESS
/obj/item/stack/medical/ointment/simple
name = "ointment paste"
@@ -274,11 +278,11 @@
heal_brute = 7
apply_sounds = list('sound/effects/rip1.ogg','sound/effects/rip2.ogg','sound/effects/tape.ogg')
/obj/item/stack/medical/advanced/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
return 1
/obj/item/stack/medical/advanced/bruise_pack/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(..() == ITEM_INTERACT_FAILURE)
return ITEM_INTERACT_FAILURE
if (ishuman(M))
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
@@ -334,6 +338,8 @@
else
balloon_alert(user, "\the [src] is used up, but there are more wounds to treat on \the [affecting.name].")
use(used)
return ITEM_INTERACT_SUCCESS
return ITEM_INTERACT_FAILURE
/obj/item/stack/medical/advanced/ointment
name = "advanced burn kit"
@@ -343,11 +349,11 @@
heal_burn = 7
apply_sounds = list('sound/effects/ointment.ogg')
/obj/item/stack/medical/advanced/ointment/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
return 1
/obj/item/stack/medical/advanced/ointment/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(..() == ITEM_INTERACT_FAILURE)
return ITEM_INTERACT_FAILURE
if (ishuman(M))
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
@@ -356,16 +362,16 @@
if(affecting.is_salved())
user.balloon_alert(user, "[M]'s [affecting.name] has already been salved.")
return 1
return ITEM_INTERACT_FAILURE
else
user.balloon_alert_visible("\the [user] starts salving wounds on [M]'s [affecting.name].", \
"salving the wounds on [M]'s [affecting.name]." )
if(!do_after(user, 1 SECOND, affecting))
user.balloon_alert(user, "stand still to salve wounds.")
return 1
return ITEM_INTERACT_FAILURE
if(affecting.is_salved()) // We do a second check after the delay, in case it was bandaged after the first check.
user.balloon_alert(user, "[M]'s [affecting.name] have already been salved.")
return 1
return ITEM_INTERACT_FAILURE
user.balloon_alert_visible("[user] covers wounds on [M]'s [affecting.name] with regenerative membrane.", \
"covered wounds on [M]'s [affecting.name] with regenerative membrane." )
affecting.heal_damage(0,heal_burn)
@@ -373,6 +379,8 @@
affecting.salve()
playsound(src, pick(apply_sounds), 25)
update_icon()
return ITEM_INTERACT_SUCCESS
return ITEM_INTERACT_FAILURE
/obj/item/stack/medical/splint
name = "medical splints"
@@ -386,35 +394,35 @@
var/list/splintable_organs = list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO) //List of organs you can splint, natch.
/obj/item/stack/medical/splint/attack(mob/living/carbon/M as mob, mob/living/user as mob)
if(..())
return 1
/obj/item/stack/medical/splint/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(..() == ITEM_INTERACT_FAILURE)
return ITEM_INTERACT_FAILURE
if (ishuman(M))
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
var/limb = affecting.name
if(!(affecting.organ_tag in splintable_organs))
balloon_alert(user, "you can't use \the [src] to apply a splint there!")
return
return ITEM_INTERACT_FAILURE
if(affecting.splinted)
balloon_alert(user, "[M]'s [limb] is already splinted!")
return
return ITEM_INTERACT_FAILURE
if (M != user)
user.balloon_alert_visible("[user] starts to apply \the [src] to [M]'s [limb].", "applying \the [src] to [M]'s [limb].", "You hear something being wrapped.")
else
if(( !user.hand && (affecting.organ_tag in list(BP_R_ARM, BP_R_HAND)) || \
user.hand && (affecting.organ_tag in list(BP_L_ARM, BP_L_HAND)) ))
balloon_alert(user, "you can't apply a splint to the arm you're using!")
return
return ITEM_INTERACT_FAILURE
user.balloon_alert_visible("[user] starts to apply \the [src] to their [limb].", "applying \the [src] to your [limb].", "You hear something being wrapped.")
if(do_after(user, 5 SECONDS, affecting))
if(affecting.splinted)
balloon_alert(user, "[M]'s [limb] is already splinted!")
return
return ITEM_INTERACT_FAILURE
if(M == user && prob(75))
user.balloon_alert_visible("\the [user] fumbles [src].", "fumbling [src].", "You hear something being wrapped.")
return
return ITEM_INTERACT_FAILURE
if(ishuman(user))
var/obj/item/stack/medical/splint/S = split(1)
if(S)
@@ -424,7 +432,7 @@
user.balloon_alert_visible("\the [user] finishes applying [src] to [M]'s [limb].", "finished applying \the [src] to [M]'s [limb].", "You hear something being wrapped.")
else
user.balloon_alert_visible("\the [user] successfully applies [src] to their [limb].", "successfully applied \the [src] to your [limb].", "You hear something being wrapped.")
return
return ITEM_INTERACT_FAILURE
S.dropInto(src.loc) //didn't get applied, so just drop it
if(isrobot(user))
var/obj/item/stack/medical/splint/B = src
@@ -433,9 +441,9 @@
B.forceMove(affecting)
user.balloon_alert_visible("\the [user] finishes applying [src] to [M]'s [limb].", "finish applying \the [src] to [M]'s [limb].", "You hear something being wrapped.")
B.use(1)
return
return ITEM_INTERACT_SUCCESS
user.balloon_alert_visible("\the [user] fails to apply [src].", "failed to apply [src].", "You hear something being wrapped.")
return
return ITEM_INTERACT_FAILURE
/obj/item/stack/medical/splint/ghetto
+7 -5
View File
@@ -32,12 +32,13 @@
amount = 5
max_amount = 5
/obj/item/stack/medical/advanced/clotting/attack(mob/living/carbon/human/H, var/mob/user)
if(..())
return 1
/obj/item/stack/medical/advanced/clotting/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(..() == ITEM_INTERACT_FAILURE)
return ITEM_INTERACT_FAILURE
if(!istype(H))
return
if(!ishuman(M))
return ITEM_INTERACT_FAILURE
var/mob/living/carbon/human/H = M
var/clotted = 0
var/too_far_gone = 0
@@ -68,6 +69,7 @@
use(1)
playsound(src, pick(apply_sounds), 25)
update_icon()
return ITEM_INTERACT_SUCCESS
/obj/item/stack/medical/advanced/clotting/update_icon()
icon_state = "[initial(icon_state)]_[amount]"
+13 -8
View File
@@ -10,10 +10,10 @@
w_class = ITEMSIZE_SMALL
no_variants = FALSE
/obj/item/stack/nanopaste/attack(mob/living/M as mob, mob/user as mob)
if (!istype(M) || !istype(user))
return 0
if (istype(M,/mob/living/silicon/robot) && can_use(1)) //Repairing cyborgs
/obj/item/stack/nanopaste/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(!istype(M) || !istype(user))
return ITEM_INTERACT_FAILURE
if(istype(M,/mob/living/silicon/robot) && can_use(1)) //Repairing cyborgs
var/mob/living/silicon/robot/R = M
if (R.getBruteLoss() || R.getFireLoss())
if(do_after(user, 7 * toolspeed, target = R))
@@ -23,30 +23,34 @@
use(1)
user.balloon_alert_visible("\the [user] applied some [src] on [R]'s damaged areas.",\
"you apply some [src] at [R]'s damaged areas.")
return ITEM_INTERACT_SUCCESS
else
balloon_alert(user, "all [R]'s systems are nominal.")
return ITEM_INTERACT_FAILURE
if (ishuman(M)) //Repairing robolimbs
if(ishuman(M)) //Repairing robolimbs
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/S = H.get_organ(user.zone_sel.selecting)
if(!S)
balloon_alert(user, "no body part there to work on!")
return 1
return ITEM_INTERACT_FAILURE
if(S.organ_tag == BP_HEAD)
if(H.head && istype(H.head,/obj/item/clothing/head/helmet/space))
balloon_alert(user, "you can't apply [src] through [H.head]!")
return 1
return ITEM_INTERACT_FAILURE
else
if(H.wear_suit && istype(H.wear_suit,/obj/item/clothing/suit/space))
balloon_alert(user, "you can't apply [src] through [H.wear_suit]!")
return 1
return ITEM_INTERACT_FAILURE
if (S && (S.robotic >= ORGAN_ROBOT))
if(!S.get_damage())
balloon_alert(user, "nothing to fix here.")
return ITEM_INTERACT_FAILURE
else if((S.open < 2) && (S.brute_dam + S.burn_dam >= S.min_broken_damage) && !repair_external)
balloon_alert(user, "the damage is too extensive for this nanite swarm to handle.")
return ITEM_INTERACT_FAILURE
else if(can_use(1))
user.setClickCooldown(user.get_attack_speed(src))
if(S.open >= 2)
@@ -58,3 +62,4 @@
use(1)
user.balloon_alert_visible("\the [user] applies some nanite paste on [user != M ? "[M]'s [S.name]" : "[S]"] with [src].",\
"you apply some nanite paste on [user == M ? "your" : "[M]'s"] [S.name].")
return ITEM_INTERACT_SUCCESS
+6 -6
View File
@@ -143,16 +143,16 @@
/**
* Attack is called from the user's toy, aimed at target(another human), checking for target's toy.
*/
/obj/item/toy/mecha/attack(mob/living/carbon/human/target, mob/living/carbon/human/user)
/obj/item/toy/mecha/attack(mob/living/target, mob/living/user, target_zone, attack_modifier)
if(target == user)
to_chat(user, span_notice("Target another toy mech if you want to start a battle with yourself."))
return
return ITEM_INTERACT_FAILURE
else if(user.a_intent != I_HURT)
if(wants_to_battle) //prevent spamming someone with offers
to_chat(user, span_notice("You already are offering battle to someone!"))
return
return ITEM_INTERACT_FAILURE
if(!check_battle_start(user)) //if the user's mech isn't ready, don't bother checking
return
return ITEM_INTERACT_FAILURE
for(var/obj/item/I in target.get_all_held_items())
if(istype(I, /obj/item/toy/mecha)) //if you attack someone with a mech who's also holding a mech, offer to battle them
@@ -164,14 +164,14 @@
if(M.wants_to_battle) //if the target mech wants to battle, initiate the battle from their POV
mecha_brawl(M, target, user) //P = defender's mech / SRC = attacker's mech / target = defender / user = attacker
M.wants_to_battle = FALSE
return
return ITEM_INTERACT_SUCCESS
//extend the offer of battle to the other mech
to_chat(user, span_notice("You offer battle to [target.name]!"))
to_chat(target, span_notice(span_bold("[user.name] wants to battle with [user.p_their()] [name]!") + " " + span_italics("Attack them with a toy mech to initiate combat.")))
wants_to_battle = TRUE
addtimer(CALLBACK(src, PROC_REF(withdraw_offer), user), 6 SECONDS)
return
return ITEM_INTERACT_SUCCESS
..()
+3 -3
View File
@@ -42,8 +42,8 @@
reagents = R
R.my_atom = src
/obj/item/toy/balloon/attack(mob/living/carbon/human/M as mob, mob/user as mob)
return
/obj/item/toy/balloon/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
return NONE
/obj/item/toy/balloon/afterattack(atom/A as mob|obj, mob/user as mob, proximity)
if(!proximity) return
@@ -642,7 +642,7 @@
cooldown_length = 1 SECOND
// Attack mob
/obj/item/toy/plushie/carp/attack(mob/M as mob, mob/user as mob)
/obj/item/toy/plushie/carp/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
playsound(src, squeeze_sound, 20, 1) // Play bite sound in local area
return ..()
+7 -4
View File
@@ -456,7 +456,7 @@
slot_r_hand_str = 'icons/mob/items/righthand.dmi',
)
/obj/item/toy/flash/attack(mob/living/M, mob/user)
/obj/item/toy/flash/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(!cooldown)
playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1)
flick("[initial(icon_state)]2", src)
@@ -709,8 +709,8 @@
playsound(src, 'sound/weapons/revolver_spin.ogg', 100, 1)
spin_cylinder()
/obj/item/toy/russian_revolver/attack(mob/M, mob/living/user)
return
/obj/item/toy/russian_revolver/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
return NONE
/obj/item/toy/russian_revolver/afterattack(atom/target, mob/user, flag, params)
if(flag)
@@ -867,7 +867,7 @@
popped = 0
icon_state = "tastybread"
/obj/item/toy/snake_popper/attack(mob/living/M as mob, mob/user as mob)
/obj/item/toy/snake_popper/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(ishuman(M))
if(!popped)
to_chat(user, span_warning("A snake popped out of [src]!"))
@@ -891,6 +891,9 @@
var/datum/effect/effect/system/confetti_spread/s = new /datum/effect/effect/system/confetti_spread
s.set_up(5, 1, src)
s.start()
return ITEM_INTERACT_SUCCESS
return ITEM_INTERACT_FAILURE
return NONE
/obj/item/toy/snake_popper/emag_act(remaining_charges, mob/user)
if(real != 2)
+2 -2
View File
@@ -236,8 +236,8 @@
pickup_sound = 'sound/items/pickup/flesh.ogg'
slot_flags = SLOT_EARS | SLOT_MASK
/obj/item/trash/attack(mob/M as mob, mob/living/user as mob)
return
/obj/item/trash/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
return NONE
/obj/item/trash/beef
+2 -2
View File
@@ -68,10 +68,10 @@
desc = "A white cane. They are commonly used by the blind or visually impaired as a mobility tool or as a courtesy to others."
icon_state = "whitecane"
/obj/item/cane/white/attack(mob/M as mob, mob/user as mob)
/obj/item/cane/white/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(user.a_intent == I_HELP)
user.visible_message(span_notice("\The [user] has lightly tapped [M] on the ankle with their white cane!"))
return TRUE
return ITEM_INTERACT_SUCCESS
else
. = ..()
@@ -210,22 +210,26 @@
return FALSE
else return TRUE
/obj/item/capture_crystal/attack(mob/living/M, mob/living/user)
/obj/item/capture_crystal/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(bound_mob)
if(!bound_mob.devourable) //Don't eat if prefs are bad
return
return ITEM_INTERACT_FAILURE
if(user.zone_sel.selecting == "mouth") //Click while targetting the mouth and you eat/feed the stored mob to whoever you clicked on
if(bound_mob in contents)
user.visible_message("\The [user] moves \the [src] to [M]'s [M.vore_selected]...")
M.perform_the_nom(M, bound_mob, M, M.vore_selected)
return ITEM_INTERACT_SUCCESS
else if(M == user) //You don't have a mob, you ponder the orb instead of trying to capture yourself
user.visible_message("\The [user] ponders \the [src]...", "You ponder \the [src]...")
return ITEM_INTERACT_FAILURE
else if (cooldown_check()) //Try to capture someone without throwing
user.visible_message("\The [user] taps \the [M] with \the [src].")
activate(user, M)
return ITEM_INTERACT_SUCCESS
else
to_chat(user, span_notice("\The [src] emits an unpleasant tone... It is not ready yet."))
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
return ITEM_INTERACT_FAILURE
//Tries to unleash or recall your stored mob
/obj/item/capture_crystal/attack_self(mob/living/user)
@@ -879,11 +883,11 @@
active = TRUE
loadout = TRUE
/obj/item/capture_crystal/loadout/attack(mob/living/M, mob/living/user)
/obj/item/capture_crystal/loadout/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(!bound_mob && M != user)
to_chat(user, span_notice("\The [src] emits an unpleasant tone..."))
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
return
return ITEM_INTERACT_FAILURE
. = ..()
@@ -233,16 +233,16 @@ CIGARETTE PACKETS ARE IN FANCY.DM
STOP_PROCESSING(SSobj, src)
update_icon()
/obj/item/clothing/mask/smokable/attack(mob/living/carbon/human/H, mob/user, def_zone)
if(lit && H == user && istype(H))
/obj/item/clothing/mask/smokable/attack(mob/living/carbon/human/H, mob/living/user, target_zone, attack_modifier)
if(lit && H == user && ishuman(H))
var/obj/item/blocked = H.check_mouth_coverage()
if(blocked)
to_chat(H, span_warning("\The [blocked] is in the way!"))
return 1
return ITEM_INTERACT_FAILURE
to_chat(H, span_notice("You take a drag on your [name]."))
playsound(src, 'sound/items/cigs_lighters/inhale.ogg', 50, 0, -1)
smoke(5)
return 1
return ITEM_INTERACT_SUCCESS
return ..()
/obj/item/clothing/mask/smokable/attackby(obj/item/W as obj, mob/user as mob)
@@ -666,23 +666,24 @@ CIGARETTE PACKETS ARE IN FANCY.DM
update_icon()
return
/obj/item/flame/lighter/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(!istype(M, /mob))
return
/obj/item/flame/lighter/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(lit == 1)
M.ignite_mob()
add_attack_logs(user,M,"Lit on fire with [src]")
return ITEM_INTERACT_SUCCESS
if(istype(M.wear_mask, /obj/item/clothing/mask/smokable/cigarette) && user.zone_sel.selecting == O_MOUTH && lit)
var/obj/item/clothing/mask/smokable/cigarette/cig = M.wear_mask
if(M == user)
cig.attackby(src, user)
return ITEM_INTERACT_SUCCESS
else
if(istype(src, /obj/item/flame/lighter/zippo))
cig.light(span_notice(span_rose("[user] whips the [name] out and holds it for [M].")))
else
cig.light(span_notice("[user] holds the [name] out for [M], and lights the [cig.name]."))
return ITEM_INTERACT_SUCCESS
else
..()
@@ -879,16 +880,14 @@ CIGARETTE PACKETS ARE IN FANCY.DM
set_light(0)
STOP_PROCESSING(SSobj, src)
return
return ITEM_INTERACT_SUCCESS
/obj/item/flame/lighter/supermatter/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(!istype(M, /mob))
return
/obj/item/flame/lighter/supermatter/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(lit == 1)
M.ignite_mob()
add_attack_logs(user,M,"Lit on fire with [src]")
return ITEM_INTERACT_SUCCESS
if(istype(M.wear_mask, /obj/item/clothing/mask/smokable/cigarette) && user.zone_sel.selecting == O_MOUTH && lit)
var/obj/item/clothing/mask/smokable/cigarette/cig = M.wear_mask
@@ -899,6 +898,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
cig.light(span_notice(span_rose("[user] whips the [name] out and holds it for [M].")))
else
cig.light(span_notice("[user] holds the [name] out for [M], and lights the [cig.name]."))
return ITEM_INTERACT_SUCCESS
else
..()
@@ -953,26 +953,26 @@ CIGARETTE PACKETS ARE IN FANCY.DM
set_light(0)
STOP_PROCESSING(SSobj, src)
return
return ITEM_INTERACT_SUCCESS
/obj/item/flame/lighter/supermatter/syndismzippo/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(!istype(M, /mob))
return
/obj/item/flame/lighter/supermatter/syndismzippo/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(lit == 1)
M.ignite_mob()
add_attack_logs(user,M,"Lit on fire with [src]")
return ITEM_INTERACT_SUCCESS
if(istype(M.wear_mask, /obj/item/clothing/mask/smokable/cigarette) && user.zone_sel.selecting == O_MOUTH && lit)
var/obj/item/clothing/mask/smokable/cigarette/cig = M.wear_mask
if(M == user)
cig.attackby(src, user)
return ITEM_INTERACT_SUCCESS
else
if(istype(src, /obj/item/flame/lighter/supermatter/syndismzippo))
cig.light(span_notice(span_rose("[user] whips the [name] out and holds it for [M].")))
else
cig.light(span_notice("[user] holds the [name] out for [M], and lights the [cig.name]."))
return ITEM_INTERACT_SUCCESS
else
..()
@@ -1128,11 +1128,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
set_light(0)
STOP_PROCESSING(SSobj, src)
return ITEM_INTERACT_SUCCESS
/obj/item/flame/lighter/supermatter/expsmzippo/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if (!istype(M, /mob))
return
/obj/item/flame/lighter/supermatter/expsmzippo/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if (lit == 1)
M.ignite_mob()
add_attack_logs(user, M, "Lit on fire with [src]")
+7 -5
View File
@@ -42,21 +42,21 @@
else
icon_state = initial(icon_state)
/obj/item/lipstick/attack(mob/M as mob, mob/user as mob)
if(!open) return
if(!istype(M, /mob)) return
/obj/item/lipstick/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(!open)
return ITEM_INTERACT_FAILURE
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.lip_style) //if they already have lipstick on
to_chat(user, span_notice("You need to wipe off the old lipstick first!"))
return
return ITEM_INTERACT_FAILURE
if(H == user)
user.visible_message(span_notice("[user] does their lips with \the [src]."), \
span_notice("You take a moment to apply \the [src]. Perfect!"))
H.lip_style = colour
H.update_icons_body()
return ITEM_INTERACT_SUCCESS
else
user.visible_message(span_warning("[user] begins to do [H]'s lips with \the [src]."), \
span_notice("You begin to apply \the [src]."))
@@ -65,8 +65,10 @@
span_notice("You apply \the [src]."))
H.lip_style = colour
H.update_icons_body()
return ITEM_INTERACT_SUCCESS
else
to_chat(user, span_notice("Where are the lips on that?"))
return ITEM_INTERACT_FAILURE
//you can wipe off lipstick with paper! see code/modules/paperwork/paper.dm, paper/attack()
@@ -116,13 +116,11 @@
INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src)
return uses
/obj/item/dnainjector/attack(mob/M as mob, mob/user as mob)
if (!istype(M, /mob))
return
/obj/item/dnainjector/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if (!user.IsAdvancedToolUser())
return
return ITEM_INTERACT_FAILURE
if (in_use)
return
return ITEM_INTERACT_FAILURE
user.visible_message(span_danger("\The [user] is trying to inject \the [M] with \the [src]!"))
in_use = TRUE
@@ -131,7 +129,7 @@
if(!do_after(user, 5 SECONDS, target = src))
in_use = FALSE
return
return ITEM_INTERACT_FAILURE
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN)
@@ -142,10 +140,10 @@
var/mob/living/carbon/human/H = M
if(!istype(H))
to_chat(user, span_warning("Apparently it didn't work..."))
return
return ITEM_INTERACT_FAILURE
inject(M, user)
return
return ITEM_INTERACT_SUCCESS
// Traitgenes Injectors are randomized now due to no hardcoded genes. Split into good or bad, and then versions that specify what they do on the label.
@@ -91,8 +91,8 @@
target.cut_overlay(image_overlay)
qdel(src)
/obj/item/plastique/attack(mob/M as mob, mob/user as mob, def_zone)
return
/obj/item/plastique/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
return NONE
/obj/item/plastique/seismic
name = "seismic charge"
@@ -177,8 +177,9 @@
if(Adjacent(user))
. += "There is about [src.amount] square units of paper left!"
/obj/item/wrapping_paper/attack(mob/target as mob, mob/user as mob)
if(!ishuman(target)) return
/obj/item/wrapping_paper/attack(mob/living/target, mob/living/user, target_zone, attack_modifier)
if(!ishuman(target))
return ITEM_INTERACT_FAILURE
var/mob/living/carbon/human/H = target
if (istype(H.wear_suit, /obj/item/clothing/suit/straight_jacket) || istype(H.wear_suit, /obj/item/clothing/suit/shibari) || H.stat)
@@ -189,10 +190,13 @@
H.forceMove(present)
add_attack_logs(user,H,"Wrapped with [src]")
return ITEM_INTERACT_SUCCESS
else
to_chat(user, span_warning("You need more paper."))
return ITEM_INTERACT_FAILURE
else
to_chat(user, "They are moving around too much. A straightjacket would help.")
return ITEM_INTERACT_FAILURE
/obj/item/a_gift/advanced
+14 -10
View File
@@ -26,28 +26,30 @@
return ..()
/obj/item/handcuffs/attack(var/mob/living/carbon/C, var/mob/living/user)
/obj/item/handcuffs/attack(mob/living/carbon/C, mob/living/user, target_zone, attack_modifier)
if(!istype(C))
return
return ITEM_INTERACT_FAILURE
if(!user.IsAdvancedToolUser())
return
return ITEM_INTERACT_FAILURE
if (CLUMSY_FAIL_CHANCE(user))
to_chat(user, span_warning("Uh ... how do those things work?!"))
attempt_to_cuff(user, user)
return
return ITEM_INTERACT_SUCCESS
if(!C.handcuffed)
if (C == user)
attempt_to_cuff(user, user)
return
return ITEM_INTERACT_SUCCESS
//check for an aggressive grab (or robutts)
if(can_place(C, user))
attempt_to_cuff(C, user)
return ITEM_INTERACT_SUCCESS
else
to_chat(user, span_danger("You need to have a firm grip on [C] before you can put \the [src] on!"))
return ITEM_INTERACT_FAILURE
/obj/item/handcuffs/proc/can_place(var/mob/target, var/mob/user)
if(user == target)
@@ -216,28 +218,30 @@
return ..()
/obj/item/handcuffs/legcuffs/attack(var/mob/living/carbon/C, var/mob/living/user)
/obj/item/handcuffs/legcuffs/attack(mob/living/carbon/C, mob/living/user, target_zone, attack_modifier)
if(!istype(C))
return
return ITEM_INTERACT_FAILURE
if(!user.IsAdvancedToolUser())
return
return ITEM_INTERACT_FAILURE
if (CLUMSY_FAIL_CHANCE(user))
to_chat(user, span_warning("Uh ... how do those things work?!"))
place_legcuffs(user, user)
return
return ITEM_INTERACT_SUCCESS
if(!C.legcuffed)
if (C == user)
place_legcuffs(user, user)
return
return ITEM_INTERACT_SUCCESS
//check for an aggressive grab (or robutts)
if(can_place(C, user))
place_legcuffs(C, user)
return ITEM_INTERACT_SUCCESS
else
to_chat(user, span_danger("You need to have a firm grip on [C] before you can put \the [src] on!"))
return ITEM_INTERACT_FAILURE
/obj/item/handcuffs/legcuffs/proc/place_legcuffs(var/mob/living/carbon/target, var/mob/user)
playsound(src, cuff_sound, 30, 1, -2)
@@ -50,11 +50,11 @@
src.icon_state += "_[active]"
return
/obj/item/implanter/attack(mob/M as mob, mob/user as mob)
/obj/item/implanter/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if (!istype(M, /mob/living/carbon))
return
return ITEM_INTERACT_FAILURE
if(active)
if (imp)
if(imp)
M.visible_message(span_warning("[user] is attempting to implant [M]."))
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN)
@@ -75,11 +75,12 @@
BITSET(H.hud_updateflag, IMPLOYAL_HUD)
BITSET(H.hud_updateflag, BACKUP_HUD) //VOREStation Add - Backup HUD updates
src.imp = null
imp = null
update()
return ITEM_INTERACT_SUCCESS
else
to_chat(user, span_warning("You need to activate \the [src.name] first."))
return
return ITEM_INTERACT_FAILURE
/obj/item/implanter/loyalty
name = "implanter-loyalty"
@@ -125,12 +126,13 @@
icon_state = "cimplanter0"
return
/obj/item/implanter/compressed/attack(mob/M as mob, mob/user as mob)
/obj/item/implanter/compressed/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
var/obj/item/implant/compressed/c = imp
if (!c) return
if (c.scanned == null)
if(!c)
return ITEM_INTERACT_FAILURE
if(c.scanned == null)
to_chat(user, "Please scan an object with the implanter first.")
return
return ITEM_INTERACT_FAILURE
..()
/obj/item/implanter/compressed/afterattack(atom/A, mob/user as mob, proximity)
@@ -38,11 +38,11 @@
/obj/item/inducer/get_cell()
return cell
/obj/item/inducer/attack(mob/living/M, mob/living/user)
/obj/item/inducer/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(user.a_intent == I_HURT)
return ..()
else
return 0 //No accidental bludgeons!
return ITEM_INTERACT_FAILURE //No accidental bludgeons!
/obj/item/inducer/afterattack(atom/A, mob/living/carbon/user, proximity)
if(user.a_intent == I_HURT)
+4 -3
View File
@@ -8,7 +8,7 @@
throwforce = 0
// Attack mob
/obj/item/squishhammer/attack(mob/M as mob, mob/user as mob)
/obj/item/squishhammer/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
var/is_squished = M.tf_scale_x || M.tf_scale_y
playsound(src, 'sound/items/hooh.ogg', 50, 1)
if(!is_squished)
@@ -16,7 +16,7 @@
else
M.ClearTransform()
M.update_transform()
return ..()
return ITEM_INTERACT_SUCCESS
// Do not ever just leave this laying about, it will go horribly wrong!
/obj/item/squishhammer/dark
@@ -28,7 +28,7 @@
force = 0
throwforce = 0
/obj/item/squishhammer/dark/attack(mob/M as mob, mob/user as mob)
/obj/item/squishhammer/dark/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
..()
var/mob/living/carbon/human/H = M
if(istype(H))
@@ -37,3 +37,4 @@
var/turf/T = M.loc
if(isturf(T))
new /obj/effect/gibspawner/generic(T)
return ITEM_INTERACT_SUCCESS
@@ -83,7 +83,7 @@
qdel(loading)
update_icon()
/obj/item/material/kitchen/utensil/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
/obj/item/material/kitchen/utensil/attack(mob/living/carbon/M, mob/living/user, target_zone, attack_modifier)
if(!istype(M))
return ..()
@@ -106,20 +106,20 @@
M.vore_selected.nom_atom(F)
if(M == user)
if(!M.can_eat(loaded))
return
return ITEM_INTERACT_FAILURE
M.visible_message(span_bold("\The [user]") + " eats some of [loaded] with \the [src].")
else
user.visible_message(span_warning("\The [user] begins to feed \the [M]!"))
if(!(M.can_force_feed(user, loaded) && do_after(user, 5 SECONDS, M)))
return
return ITEM_INTERACT_FAILURE
M.visible_message(span_bold("\The [user]") + " feeds some of [loaded] to \the [M] with \the [src].")
playsound(src,'sound/items/eatfood.ogg', rand(10,40), 1)
loaded = null
update_icon()
return
return ITEM_INTERACT_SUCCESS
else
to_chat(user, span_warning("You don't have anything on \the [src].")) //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK
return
return ITEM_INTERACT_FAILURE
/obj/item/material/kitchen/utensil/on_rag_wipe()
. = ..()
@@ -210,10 +210,10 @@
drop_sound = 'sound/items/drop/wooden.ogg'
pickup_sound = 'sound/items/pickup/wooden.ogg'
/obj/item/material/kitchen/rollingpin/attack(mob/living/M as mob, mob/living/user as mob)
if (CLUMSY_HARM_CHANCE(user))
/obj/item/material/kitchen/rollingpin/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(CLUMSY_HARM_CHANCE(user))
to_chat(user, span_warning("\The [src] slips out of your hand and hits your head."))
user.take_organ_damage(10)
user.Paralyse(2)
return
return ITEM_INTERACT_SUCCESS
return ..()
@@ -43,22 +43,6 @@
icon_state = "unathiknife"
attack_verb = list("ripped", "torn", "cut")
can_cleave = FALSE
var/hits = 0
/obj/item/material/knife/machete/hatchet/unathiknife/attack(mob/M as mob, mob/user as mob)
if(hits > 0)
return
var/obj/item/I = user.get_inactive_hand()
if(istype(I, /obj/item/material/knife/machete/hatchet/unathiknife))
hits ++
var/obj/item/W = I
W.attack(M, user)
W.afterattack(M, user)
..()
/obj/item/material/knife/machete/hatchet/unathiknife/afterattack(mob/M as mob, mob/user as mob)
hits = initial(hits)
..()
/obj/item/material/minihoe // -- Numbers
name = "mini hoe"
@@ -126,11 +126,12 @@
add_fingerprint(user)
return
/obj/item/melee/energy/attack(mob/M, mob/user)
/obj/item/melee/energy/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(active && use_cell)
if(!use_charge(hitcost))
deactivate(user)
visible_message(span_notice("\The [src]'s blade flickers, before deactivating."))
return ITEM_INTERACT_FAILURE
return ..()
/obj/item/melee/energy/attackby(obj/item/W, mob/user)
+3 -5
View File
@@ -1,12 +1,10 @@
/obj/item/pai_cable/proc/plugin(obj/machinery/M as obj, mob/user as mob)
/obj/item/pai_cable/proc/plugin(obj/machinery/M, mob/user)
if(istype(M, /obj/machinery/door) || istype(M, /obj/machinery/camera))
//VOREStation Add - Can't hack secured_wires doors (vault, etc)
if(istype(M, /obj/machinery/door/airlock))
var/obj/machinery/door/airlock/A = M
if(A.secured_wires)
to_chat(user,span_warning("\The [M] doesn't have any acessible data ports for \the [src]!"))
return
//VOREStation Add End
user.visible_message("[user] inserts [src] into a data port on [M].", "You insert [src] into a data port on [M].", "You hear the satisfying click of a wire jack fastening into place.")
playsound(src, 'sound/machines/click.ogg', 50, 1)
user.drop_item()
@@ -15,5 +13,5 @@
else
user.visible_message("[user] fumbles to find a place on [M] to plug in [src].", "There aren't any ports on [M] that match the jack belonging to [src].")
/obj/item/pai_cable/attack(obj/machinery/M as obj, mob/user as mob)
src.plugin(M, user)
/obj/item/pai_cable/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
return NONE
@@ -304,22 +304,19 @@
reagents.trans_to_obj(C, (reagents.total_volume/contents.len))
return ..()
/obj/item/storage/fancy/cigarettes/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(!istype(M, /mob))
return
/obj/item/storage/fancy/cigarettes/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(M == user && user.zone_sel.selecting == O_MOUTH)
// Find ourselves a cig. Note that we could be full of lighters.
var/obj/item/clothing/mask/smokable/cigarette/cig = locate() in src
if(cig == null)
to_chat(user, span_notice("Looks like the packet is out of cigarettes."))
return
return ITEM_INTERACT_FAILURE
// Instead of running equip_to_slot_if_possible() we check here first,
// to avoid dousing cig with reagents if we're not going to equip it
if(!cig.mob_can_equip(user, slot_wear_mask))
return
return ITEM_INTERACT_FAILURE
// We call remove_from_storage first to manage the reagent transfer and
// UI updates.
@@ -329,6 +326,7 @@
reagents.maximum_volume = 15 * contents.len
to_chat(user, span_notice("You take a cigarette out of the pack."))
update_icon()
return ITEM_INTERACT_SUCCESS
else
..()
+2 -2
View File
@@ -173,12 +173,12 @@
to_chat(user, span_warning("[src] is out of charge."))
add_fingerprint(user)
/obj/item/melee/baton/attack(mob/M, mob/user)
/obj/item/melee/baton/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(status && CLUMSY_FAIL_CHANCE(user))
to_chat(user, span_danger("You accidentally hit yourself with the [src]!"))
user.Weaken(30)
deductcharge(hitcost)
return
return ITEM_INTERACT_SUCCESS
deductcharge(hitcost)
return ..()
@@ -22,9 +22,9 @@
pickup_sound = 'sound/items/pickup/weldingtool.ogg'
var/helpforce = 0 //For help intent things
/obj/item/surgical/attack(mob/M, mob/user)
/obj/item/surgical/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(user.a_intent == I_HELP) //A tad messy, but this should stop people from smacking their patients in surgery
return 0
return NONE
..()
/*
@@ -29,7 +29,7 @@
drop_sound = 'sound/items/drop/crowbar.ogg'
pickup_sound = 'sound/items/pickup/crowbar.ogg'
/obj/item/melee/classic_baton/attack(mob/M as mob, mob/living/user as mob)
/obj/item/melee/classic_baton/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if (CLUMSY_FAIL_CHANCE(user))
to_chat(user, span_warning("You club yourself over the head."))
user.Weaken(3 * force)
@@ -38,7 +38,7 @@
H.apply_damage(2*force, BRUTE, BP_HEAD)
else
user.take_organ_damage(2*force)
return
return ITEM_INTERACT_SUCCESS
return ..()
//Telescopic baton
@@ -99,9 +99,9 @@
return
/obj/item/melee/telebaton/attack(mob/target as mob, mob/living/user as mob)
/obj/item/melee/telebaton/attack(mob/living/target, mob/living/user, target_zone, attack_modifier)
if(on)
if (CLUMSY_FAIL_CHANCE(user))
if(CLUMSY_FAIL_CHANCE(user))
to_chat(user, span_warning("You club yourself over the head."))
user.Weaken(3 * force)
if(ishuman(user))
@@ -109,9 +109,5 @@
H.apply_damage(2*force, BRUTE, BP_HEAD)
else
user.take_organ_damage(2*force)
return
if(..())
//playsound(src, "swing_hit", 50, 1, -1)
return
else
return ..()
return ITEM_INTERACT_SUCCESS
return ..()
+21 -20
View File
@@ -19,38 +19,39 @@
return FALSE
/obj/item/tape_roll/attack(var/mob/living/carbon/human/H, var/mob/user)
if(istype(H))
/obj/item/tape_roll/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(user.a_intent == I_HELP)
return
return ITEM_INTERACT_FAILURE
if(!can_place(H, user))
to_chat(user, span_danger("You need to have a firm grip on [H] before you can use \the [src]!"))
return
return ITEM_INTERACT_FAILURE
else
if(user.zone_sel.selecting == O_EYES)
if(!H.organs_by_name[BP_HEAD])
to_chat(user, span_warning("\The [H] doesn't have a head."))
return
return ITEM_INTERACT_FAILURE
if(!H.has_eyes())
to_chat(user, span_warning("\The [H] doesn't have any eyes."))
return
return ITEM_INTERACT_FAILURE
if(H.glasses)
to_chat(user, span_warning("\The [H] is already wearing something on their eyes."))
return
return ITEM_INTERACT_FAILURE
if(H.head && (H.head.body_parts_covered & FACE))
to_chat(user, span_warning("Remove their [H.head] first."))
return
return ITEM_INTERACT_FAILURE
user.visible_message(span_danger("\The [user] begins taping over \the [H]'s eyes!"))
if(!do_after(user, 3 SECONDS, target = src))
return
return ITEM_INTERACT_FAILURE
if(!can_place(H, user))
return
return ITEM_INTERACT_FAILURE
if(!H || !src || !H.organs_by_name[BP_HEAD] || !H.has_eyes() || H.glasses || (H.head && (H.head.body_parts_covered & FACE)))
return
return ITEM_INTERACT_FAILURE
user.visible_message(span_danger("\The [user] has taped up \the [H]'s eyes!"))
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/blindfold/tape(H), slot_glasses, ignore_obstructions = FALSE)
@@ -60,26 +61,26 @@
else if(user.zone_sel.selecting == O_MOUTH || user.zone_sel.selecting == BP_HEAD)
if(!H.organs_by_name[BP_HEAD])
to_chat(user, span_warning("\The [H] doesn't have a head."))
return
return ITEM_INTERACT_FAILURE
if(!H.check_has_mouth())
to_chat(user, span_warning("\The [H] doesn't have a mouth."))
return
return ITEM_INTERACT_FAILURE
if(H.wear_mask)
to_chat(user, span_warning("\The [H] is already wearing a mask."))
return
return ITEM_INTERACT_FAILURE
if(H.head && (H.head.body_parts_covered & FACE))
to_chat(user, span_warning("Remove their [H.head] first."))
return
return ITEM_INTERACT_FAILURE
user.visible_message(span_danger("\The [user] begins taping up \the [H]'s mouth!"))
if(!do_after(user, 3 SECONDS, target = src))
return
return ITEM_INTERACT_FAILURE
if(!can_place(H, user))
return
return ITEM_INTERACT_FAILURE
if(!H || !src || !H.organs_by_name[BP_HEAD] || !H.check_has_mouth() || (H.head && (H.head.body_parts_covered & FACE)))
return
return ITEM_INTERACT_FAILURE
user.visible_message(span_danger("\The [user] has taped up \the [H]'s mouth!"))
@@ -89,7 +90,7 @@
else if(user.zone_sel.selecting == BP_R_HAND || user.zone_sel.selecting == BP_L_HAND)
if(!can_place(H, user))
return
return ITEM_INTERACT_FAILURE
var/obj/item/handcuffs/cable/tape/T = new(user)
playsound(src, 'sound/effects/tape.ogg',25)
@@ -99,7 +100,7 @@
qdel(T)
else
return ..()
return 1
return ITEM_INTERACT_SUCCESS
/obj/item/tape_roll/proc/stick(var/obj/item/W, mob/user)
if(!istype(W, /obj/item/paper) || istype(W, /obj/item/paper/sticky) || !user.unEquip(W))
@@ -55,7 +55,7 @@
if (prob(75))
pixel_y = rand(0, 16)
/obj/item/tool/screwdriver/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
/obj/item/tool/screwdriver/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(!istype(M) || user.a_intent == I_HELP)
return ..()
if(user.zone_sel.selecting != O_EYES && user.zone_sel.selecting != BP_HEAD)
@@ -67,9 +67,9 @@
if(max_fuel && loc == user)
. += "It contains [get_fuel()]/[src.max_fuel] units of fuel!"
/obj/item/weldingtool/attack(atom/A, mob/living/user, def_zone)
if(ishuman(A) && user.a_intent == I_HELP)
var/mob/living/carbon/human/H = A
/obj/item/weldingtool/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(ishuman(M) && user.a_intent == I_HELP)
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/S = H.organs_by_name[user.zone_sel.selecting]
if(!S || S.robotic < ORGAN_ROBOT || S.open == 3)
@@ -83,21 +83,21 @@
if(S.organ_tag == BP_HEAD)
if(H.head && istype(H.head,/obj/item/clothing/head/helmet/space))
to_chat(user, span_warning("You can't apply [src] through [H.head]!"))
return TRUE
return ITEM_INTERACT_FAILURE
else
if(H.wear_suit && istype(H.wear_suit,/obj/item/clothing/suit/space))
to_chat(user, span_warning("You can't apply [src] through [H.wear_suit]!"))
return TRUE
return ITEM_INTERACT_FAILURE
if(!welding)
to_chat(user, span_warning("You'll need to turn [src] on to patch the damage on [H]'s [S.name]!"))
return TRUE
return ITEM_INTERACT_FAILURE
if(S.robo_repair(15, BRUTE, "some dents", src, user))
remove_fuel(1, user)
return TRUE
return ITEM_INTERACT_SUCCESS
else
return TRUE //Stops you from accidentally harming someone while on help intent.
return ITEM_INTERACT_FAILURE //Stops you from accidentally harming someone while on help intent.
return ..()
@@ -44,7 +44,10 @@
if (prob(75))
pixel_y = rand(0, 16)
/obj/item/tool/wirecutters/attack(mob/living/carbon/C as mob, mob/user as mob)
/obj/item/tool/wirecutters/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if(!iscarbon(M))
return ..()
var/mob/living/carbon/C = M
if(istype(C) && user.a_intent == I_HELP && (C.handcuffed) && (istype(C.handcuffed, /obj/item/handcuffs/cable)))
user.visible_message("\The [user] cuts \the [C]'s restraints with \the [src]!",\
"You cut \the [C]'s restraints with \the [src]!",\
@@ -53,7 +56,7 @@
if(C.buckled && C.buckled.buckle_require_restraints)
C.buckled.unbuckle_mob()
C.update_handcuffed()
return
return ITEM_INTERACT_SUCCESS
else
..()
+3 -3
View File
@@ -19,7 +19,7 @@
COOLDOWN_DECLARE(shield_bash)
drop_sound = 'sound/items/trayhit1.ogg'
/obj/item/tray/attack(mob/living/carbon/M, mob/living/carbon/user)
/obj/item/tray/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
var/tray_sound = pick('sound/items/trayhit1.ogg', 'sound/items/trayhit2.ogg')
//var/attack_area = user.zone_sel.selecting
user.setClickCooldown(user.get_attack_speed(src))
@@ -41,7 +41,7 @@
M.Weaken(1)
user.take_organ_damage(2)
playsound(src, tray_sound, 50, 1)
return
return ITEM_INTERACT_SUCCESS
var/face_hit = FALSE
@@ -91,7 +91,7 @@
user.visible_message(span_danger("[user] slams [M] [face_hit ? "in the face " : ""]with the tray!"), runemessage = "CLANG!")
//user.apply_damage(rand(min_bonus_damage, max_bonus_damage), BRUTE, attack_area)
M.take_organ_damage(rand(min_bonus_damage, max_bonus_damage))
return
return ITEM_INTERACT_SUCCESS
/obj/item/tray/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/material/kitchen/rollingpin))
+5 -5
View File
@@ -12,7 +12,7 @@
drop_sound = 'sound/items/drop/sword.ogg'
pickup_sound = 'sound/items/pickup/sword.ogg'
/obj/item/nullrod/attack(mob/M as mob, mob/living/user as mob)
/obj/item/nullrod/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
add_attack_logs(user,M,"Hit with [src] (nullrod)")
@@ -21,19 +21,19 @@
if(!user.IsAdvancedToolUser())
to_chat(user, span_danger("You don't have the dexterity to do this!"))
return
return ITEM_INTERACT_FAILURE
if(CLUMSY_HARM_CHANCE(user))
to_chat(user, span_danger("The rod slips out of your hand and hits your head."))
user.take_organ_damage(10)
user.Paralyse(20)
return
return ITEM_INTERACT_SUCCESS
if(M.stat != DEAD)
if(user?.mind?.assigned_role != JOB_CHAPLAIN)
to_chat(user, span_danger("You feel that only a chaplain can wield the null rod's true power!"))
..()
return
return ITEM_INTERACT_FAILURE
if(ishuman(M))
var/mob/living/carbon/human/infected = M
@@ -60,7 +60,7 @@
else
to_chat(user, span_danger("The rod appears to do nothing."))
M.visible_message(span_danger("\The [user] waves \the [src] over \the [M]'s head."))
return
return ITEM_INTERACT_SUCCESS
/obj/item/nullrod/afterattack(atom/A, mob/user as mob, proximity)
if(!proximity)
+2 -2
View File
@@ -405,8 +405,8 @@ ADMIN_VERB(spawn_mail, R_SPAWN, "Spawn Mail", "Spawn mail for a specific player,
. = ..()
. += span_notice("Scan a letter to log it into the active database, then scan the person you wish to hand the letter to. Correctly scanning the recipient of the letter logged into the active database will add points to the supply budget.")
/obj/item/mail_scanner/attack()
return
/obj/item/mail_scanner/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
return NONE
/obj/item/mail_scanner/afterattack(atom/A, mob/user)
if(istype(A, /obj/item/mail))
@@ -71,7 +71,7 @@
padding_material = null
update_icon()
/obj/item/stool/attack(mob/M as mob, mob/user as mob)
/obj/item/stool/attack(mob/living/M, mob/living/user, target_zone, attack_modifier)
if (prob(5) && isliving(M))
user.visible_message(span_danger("[user] breaks [src] over [M]'s back!"))
user.setClickCooldown(user.get_attack_speed())
@@ -85,7 +85,7 @@
var/mob/living/T = M
T.Weaken(10)
T.apply_damage(20)
return
return ITEM_INTERACT_SUCCESS
..()
/obj/item/stool/ex_act(severity)