[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
+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)