mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-28 07:39:13 +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
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user