mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-28 15:48:49 +01:00
[MIRROR] Gripper fixes (#12714)
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
This commit is contained in:
co-authored by
Cameron Lennox
parent
62d4e50a7f
commit
afcea67115
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
. = ..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
..()
|
||||
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user