From f4685cfe011b88637e700dc6bf30a50b0c721434 Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Sat, 10 Feb 2018 22:06:12 -0500 Subject: [PATCH] [s] Fixes altclick exploits --- code/_onclick/ai.dm | 4 + code/datums/components/material_container.dm | 2 +- code/datums/components/rotation.dm | 8 +- code/game/machinery/computer/apc_control.dm | 2 +- .../game/machinery/computer/buildandrepair.dm | 2 +- code/game/machinery/defibrillator_mount.dm | 4 +- code/game/machinery/deployable.dm | 4 +- code/game/machinery/hologram.dm | 4 - code/game/machinery/launch_pad.dm | 4 +- code/game/mecha/mecha_actions.dm | 2 +- code/game/objects/items/cards_ids.dm | 7 +- code/game/objects/items/crayons.dm | 2 +- .../objects/items/devices/geiger_counter.dm | 2 +- code/game/objects/items/devices/gps.dm | 4 +- code/game/objects/items/extinguisher.dm | 2 + code/game/objects/items/flamethrower.dm | 2 +- code/game/objects/items/pet_carrier.dm | 4 +- code/game/objects/items/stacks/stack.dm | 7 +- code/game/objects/items/storage/belt.dm | 2 +- code/game/objects/items/storage/fancy.dm | 4 +- code/game/objects/items/storage/lockbox.dm | 2 +- code/game/objects/items/toys.dm | 2 +- code/game/objects/items/twohanded.dm | 2 +- .../objects/structures/beds_chairs/bed.dm | 5 +- .../objects/structures/beds_chairs/chair.dm | 6 +- .../structures/crates_lockers/closets.dm | 3 +- code/game/objects/structures/extinguisher.dm | 2 +- code/game/objects/structures/guncase.dm | 2 +- code/game/objects/structures/morgue.dm | 3 +- code/game/objects/structures/reflector.dm | 5 +- .../clockcult/clock_items/clockwork_slab.dm | 2 +- .../devil/true_devil/_true_devil.dm | 6 +- .../antagonists/wizard/equipment/artefact.dm | 414 ++++++++++++++++++ code/modules/assembly/infrared.dm | 7 +- .../atmospherics/machinery/airalarm.dm | 3 +- code/modules/clothing/clothing.dm | 4 +- code/modules/clothing/head/jobs.dm | 2 +- code/modules/clothing/head/soft_caps.dm | 134 ++++++ code/modules/clothing/masks/breath.dm | 3 +- code/modules/clothing/suits/toggles.dm | 3 +- code/modules/clothing/under/accessories.dm | 2 +- .../kitchen_machinery/microwave.dm | 2 +- code/modules/games/cas.dm | 4 +- .../integrated_electronics/core/assemblies.dm | 2 +- .../core/integrated_circuit.dm | 2 +- .../integrated_electronics/core/printer.dm | 2 +- code/modules/mining/abandoned_crates.dm | 4 +- .../mining/equipment/marker_beacons.dm | 14 +- code/modules/mob/living/carbon/human/human.dm | 8 +- code/modules/mob/living/living.dm | 7 +- code/modules/mob/living/silicon/pai/pai.dm | 2 + .../modules/mob/living/silicon/robot/robot.dm | 6 +- .../mob/living/simple_animal/simple_animal.dm | 12 +- code/modules/paperwork/paperplane.dm | 15 +- code/modules/paperwork/pen.dm | 6 +- code/modules/paperwork/photocopier.dm | 2 +- code/modules/power/apc.dm | 3 +- .../projectiles/guns/ballistic/shotgun.dm | 2 +- .../chemistry/machinery/chem_master.dm | 10 +- code/modules/vehicles/ridden.dm | 2 +- 60 files changed, 660 insertions(+), 129 deletions(-) diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index ac03465773..14c48fbcaa 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -176,6 +176,10 @@ toggle_on() add_fingerprint(usr) +/* Holopads */ +/obj/machinery/holopad/AIAltClick(mob/living/silicon/ai/user) + hangup_all_calls() + // // Override TurfAdjacent for AltClicking // diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index 548cdb8f97..830f2d9a42 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -78,7 +78,7 @@ requested_amount = input(user, "How much do you want to insert?", "Inserting [S.singular_name]s") as num|null if(isnull(requested_amount) || (requested_amount <= 0)) return - if(QDELETED(I) || QDELETED(user) || QDELETED(src) || parent != current_parent || !user.canUseTopic(current_parent) || !user.is_holding(I) || !user.Adjacent(current_parent)) + if(QDELETED(I) || QDELETED(user) || QDELETED(src) || parent != current_parent || !user.canUseTopic(current_parent, BE_CLOSE) || !user.is_holding(I)) return if(!user.temporarilyRemoveItemFromInventory(I)) to_chat(user, "[I] is stuck to you and cannot be placed into [parent].") diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index 23d5fda5d4..0a985a69cc 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -12,11 +12,11 @@ var/rotation_flags = NONE var/default_rotation_direction = ROTATION_CLOCKWISE - + /datum/component/simple_rotation/Initialize(rotation_flags = NONE ,can_user_rotate,can_be_rotated,after_rotation) if(!ismovableatom(parent)) return COMPONENT_INCOMPATIBLE - + //throw if no rotation direction is specificed ? src.rotation_flags = rotation_flags @@ -25,7 +25,7 @@ src.can_user_rotate = can_user_rotate else src.can_user_rotate = CALLBACK(src,.proc/default_can_user_rotate) - + if(can_be_rotated) src.can_be_rotated = can_be_rotated else @@ -89,7 +89,7 @@ after_rotation.Invoke(user,rotation_type) /datum/component/simple_rotation/proc/default_can_user_rotate(mob/living/user, rotation_type) - if(!istype(user) || !user.Adjacent(parent) || user.incapacitated()) + if(!istype(user) || !user.canUseTopic(parent, BE_CLOSE, NO_DEXTERY)) to_chat(user, "You can't do that right now!") return FALSE return TRUE diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index 4d4f1cb71f..03da8e2891 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -94,7 +94,7 @@ /obj/machinery/computer/apc_control/Topic(href, href_list) if(..()) return - if(!usr || !usr.canUseTopic(src) || usr.incapacitated() || stat || QDELETED(src)) + if(!usr || !usr.canUseTopic(src) || stat || QDELETED(src)) return if(href_list["authenticate"]) var/obj/item/card/id/ID = usr.get_active_held_item() diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 1cf95877dd..e32114340f 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -147,7 +147,7 @@ /obj/structure/frame/computer/AltClick(mob/user) ..() - if(!in_range(src, user) || !isliving(user) || user.incapacitated()) + if(!isliving(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return if(anchored) diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index c9b9670191..7f66045a81 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -118,8 +118,8 @@ update_icon() return TRUE -/obj/machinery/defibrillator_mount/AltClick(mob/living/user) - if(!user.Adjacent(src) || !istype(user)) +/obj/machinery/defibrillator_mount/AltClick(mob/living/carbon/user) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return if(!defib) to_chat(user, "It'd be hard to remove a defib unit from a mount that has none.") diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 0af5e832bf..007ef8e986 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -135,8 +135,8 @@ ..() to_chat(user, "Alt-click to toggle modes.") -/obj/item/grenade/barrier/AltClick(mob/living/user) - if(!istype(user) || user.incapacitated()) +/obj/item/grenade/barrier/AltClick(mob/living/carbon/user) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return toggle_mode(user) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 0642f1bef8..594394ea8a 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -137,10 +137,6 @@ Possible to do for anyone motivated enough: return ..() -/obj/machinery/holopad/AltClick(mob/living/carbon/human/user) - if(isAI(user)) - hangup_all_calls() - return /obj/machinery/holopad/interact(mob/living/carbon/human/user) //Carn: Hologram requests. if(!istype(user)) diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index d66427b9bc..e00e172e68 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -168,10 +168,10 @@ /obj/machinery/launchpad/briefcase/MouseDrop(over_object, src_location, over_location) . = ..() - if(over_object == usr && Adjacent(usr)) + if(over_object == usr) if(!briefcase || !usr.can_hold_items()) return - if(usr.incapacitated()) + if(!usr.canUseTopic(src, BE_CLOSE, ismonkey(usr))) to_chat(usr, "You can't do that right now!") return usr.visible_message("[usr] starts closing [src]...", "You start closing [src]...") diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm index 480c24b87f..eee71818c5 100644 --- a/code/game/mecha/mecha_actions.dm +++ b/code/game/mecha/mecha_actions.dm @@ -138,7 +138,7 @@ chassis.toggle_strafe() /obj/mecha/AltClick(mob/living/user) - if(user == occupant) + if((user == occupant) && user.canUseTopic(src)) toggle_strafe() /obj/mecha/proc/toggle_strafe() diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 9e83a92847..f3940115d1 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -113,10 +113,11 @@ update_label() /obj/item/card/id/attack_self(mob/user) - user.visible_message("[user] shows you: [icon2html(src, viewers(user))] [src.name].", \ + if(Adjacent(user)) + user.visible_message("[user] shows you: [icon2html(src, viewers(user))] [src.name].", \ "You show \the [src.name].") - src.add_fingerprint(user) - return + add_fingerprint(user) + return /obj/item/card/id/examine(mob/user) ..() diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index afdeb4c658..428412e11a 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -145,7 +145,7 @@ ui.open() /obj/item/toy/crayon/spraycan/AltClick(mob/user) - if(user.canUseTopic(src, be_close=TRUE)) + if(user.canUseTopic(src, BE_CLOSE, ismonkey(user))) if(has_cap) is_capped = !is_capped to_chat(user, "The cap on [src] is now [is_capped ? "on" : "off"].") diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index 6eb1017ae5..481ca2a722 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -183,7 +183,7 @@ return ..() /obj/item/device/geiger_counter/AltClick(mob/living/user) - if(!istype(user) || user.incapacitated()) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return ..() if(!scanning) to_chat(usr, "[src] must be on to reset its radiation level!") diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 2c75166789..b3e33ec8ba 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -41,10 +41,12 @@ GLOBAL_LIST_EMPTY(GPS_list) add_overlay("working") /obj/item/device/gps/AltClick(mob/user) + if(!user.canUseTopic(src, BE_CLOSE)) + return toggletracking(user) /obj/item/device/gps/proc/toggletracking(mob/user) - if(!user.canUseTopic(src, be_close=TRUE)) + if(!user.canUseTopic(src, BE_CLOSE)) return //user not valid to use gps if(emped) to_chat(user, "It's busted!") diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index b184868676..ecbb4de4a0 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -191,6 +191,8 @@ return ..() /obj/item/extinguisher/AltClick(mob/user) + if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return EmptyExtinguisher(user) /obj/item/extinguisher/proc/EmptyExtinguisher(var/mob/user) diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index 8cc6d6b179..4bea9053a7 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -135,7 +135,7 @@ toggle_igniter(user) /obj/item/flamethrower/AltClick(mob/user) - if(ptank && isliving(user) && !user.incapacitated() && Adjacent(user)) + if(ptank && isliving(user) && user.canUseTopic(src, BE_CLOSE, ismonkey(user))) user.put_in_hands(ptank) ptank = null to_chat(user, "You remove the plasma tank from [src]!") diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index 4acebd6a34..fbdacfdbda 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -70,7 +70,7 @@ update_icon() /obj/item/pet_carrier/AltClick(mob/living/user) - if(open || !user.canUseTopic(src, be_close=TRUE)) + if(open || !user.canUseTopic(src, BE_CLOSE)) return locked = !locked to_chat(user, "You flip the lock switch [locked ? "down" : "up"].") @@ -151,7 +151,7 @@ add_overlay("[locked ? "" : "un"]locked") /obj/item/pet_carrier/MouseDrop(atom/over_atom) - if(isopenturf(over_atom) && usr.Adjacent(over_atom) && open && occupants.len) + if(isopenturf(over_atom) && usr.canUseTopic(src, BE_CLOSE, ismonkey(usr)) && usr.Adjacent(over_atom) && open && occupants.len) usr.visible_message("[usr] unloads [src].", \ "You unload [src] onto [over_atom].") for(var/V in occupants) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index ccf4cfa860..d12f787d7d 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -310,10 +310,7 @@ ..() /obj/item/stack/AltClick(mob/living/user) - if(!istype(user) || !user.canUseTopic(src)) - to_chat(user, "You can't do that right now!") - return - if(!in_range(src, user)) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return if(is_cyborg) return @@ -324,7 +321,7 @@ var/min = 0 var/max = get_amount() var/stackmaterial = round(input(user,"How many sheets do you wish to take out of this stack? (Maximum [max])") as num) - if(stackmaterial == null || stackmaterial <= min || stackmaterial >= get_amount() || !user.canUseTopic(src)) + if(stackmaterial == null || stackmaterial <= min || stackmaterial >= get_amount() || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return else change_stack(user,stackmaterial) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 3300f64948..8a44571220 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -511,7 +511,7 @@ to_chat(user, "Alt-click it to quickly draw the blade.") /obj/item/storage/belt/sabre/AltClick(mob/user) - if(!ishuman(user) || !user.canUseTopic(src, be_close=TRUE)) + if(!iscarbon(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return if(contents.len) var/obj/item/I = contents[1] diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index d21e6988f2..2baf26abae 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -129,8 +129,8 @@ ..() to_chat(user, "Alt-click to extract contents.") -/obj/item/storage/fancy/cigarettes/AltClick(mob/user) - if(user.stat || user.restrained()) +/obj/item/storage/fancy/cigarettes/AltClick(mob/living/carbon/user) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return var/obj/item/clothing/mask/cigarette/W = locate(/obj/item/clothing/mask/cigarette) in contents if(W && contents.len > 0) diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index 195d5b25f5..51a0d476c3 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -129,7 +129,7 @@ to_chat(user, "Alt-click to [open ? "close":"open"] it.") /obj/item/storage/lockbox/medal/AltClick(mob/user) - if(user.canUseTopic(src, be_close=TRUE)) + if(user.canUseTopic(src, BE_CLOSE)) if(!locked) open = (open ? FALSE : TRUE) update_icon() diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index dd3ef50a39..8350fce2b5 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -856,7 +856,7 @@ set name = "Flip Card" set category = "Object" set src in range(1) - if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained()) + if(!ishuman(usr) || !usr.canUseTopic(src, BE_CLOSE)) return if(!flipped) src.flipped = 1 diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index b7013f5210..a6f4a52f69 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -516,7 +516,7 @@ qdel(src) /obj/item/twohanded/spear/AltClick(mob/user) - if(user.canUseTopic(src, be_close=TRUE)) + if(user.canUseTopic(src, BE_CLOSE)) ..() if(!explosive) return diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 72764f436d..b4b05e20a8 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -78,13 +78,10 @@ /obj/structure/bed/roller/MouseDrop(over_object, src_location, over_location) . = ..() if(over_object == usr && Adjacent(usr)) - if(!ishuman(usr)) + if(!ishuman(usr) || !usr.canUseTopic(src, BE_CLOSE)) return 0 if(has_buckled_mobs()) return 0 - if(usr.incapacitated()) - to_chat(usr, "You can't do that right now!") - return 0 usr.visible_message("[usr] collapses \the [src.name].", "You collapse \the [src.name].") var/obj/structure/bed/roller/B = new foldabletype(get_turf(src)) usr.put_in_hands(B) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 9c5fa40c62..913d22aa74 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -36,7 +36,7 @@ var/mob/living/L = user if(istype(L)) - if(!user.Adjacent(src) || user.incapacitated()) + if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) to_chat(user, "You can't do that right now!") return FALSE else @@ -225,7 +225,7 @@ if(over_object == usr && Adjacent(usr)) if(!item_chair || !usr.can_hold_items() || has_buckled_mobs() || src.flags_1 & NODECONSTRUCT_1) return - if(usr.incapacitated()) + if(!usr.canUseTopic(src, BE_CLOSE, ismonkey(usr))) to_chat(usr, "You can't do that right now!") return usr.visible_message("[usr] grabs \the [src.name].", "You grab \the [src.name].") @@ -383,7 +383,7 @@ /obj/structure/chair/brass/AltClick(mob/living/user) turns = 0 - if(!user.canUseTopic(src, be_close = TRUE)) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return if(!isprocessing) user.visible_message("[user] spins [src] around, and Ratvarian technology keeps it spinning FOREVER.", \ diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index de833f2bb1..08700369b9 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -394,8 +394,7 @@ /obj/structure/closet/AltClick(mob/user) ..() - if(!user.canUseTopic(src, be_close=TRUE) || !isturf(loc)) - to_chat(user, "You can't do that right now!") + if(!user.canUseTopic(src, BE_CLOSE) || !isturf(loc)) return if(opened || !secure) return diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 0a3574b1a6..bb223b2e04 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -98,7 +98,7 @@ attack_hand(user) /obj/structure/extinguisher_cabinet/AltClick(mob/living/user) - if(user.incapacitated() || !Adjacent(user) || !istype(user)) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return toggle_cabinet(user) diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm index 25073853ad..dd1f5609be 100644 --- a/code/game/objects/structures/guncase.dm +++ b/code/game/objects/structures/guncase.dm @@ -81,7 +81,7 @@ var/obj/item/O = locate(href_list["retrieve"]) in contents if(!O || !istype(O)) return - if(!usr.canUseTopic(src) || !open) + if(!usr.canUseTopic(src, BE_CLOSE) || !open) return if(ishuman(usr)) if(!usr.put_in_hands(O)) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 6a2c763f4a..91c42f41af 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -150,8 +150,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an /obj/structure/bodycontainer/morgue/AltClick(mob/user) ..() - if(user.incapacitated()) - to_chat(user, "You can't do that right now!") + if(!user.canUseTopic(src, BE_CLOSE)) return beeper = !beeper to_chat(user, "You turn the speaker function [beeper ? "off" : "on"].") diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index a8ca42bff5..c8ef972a63 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -161,7 +161,7 @@ to_chat(user, "The rotation is locked!") return FALSE var/new_angle = input(user, "Input a new angle for primary reflection face.", "Reflector Angle", rotation_angle) as null|num - if(!user.canUseTopic(src, be_close=TRUE)) + if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) to_chat(user, "You can't do that right now!") return if(!isnull(new_angle)) @@ -169,8 +169,7 @@ return TRUE /obj/structure/reflector/AltClick(mob/user) - if(!user.canUseTopic(src, be_close=TRUE)) - to_chat(user, "You can't do that right now!") + if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return else if(finished) rotate(user) diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm index fd8674f96f..01160e8b2e 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm @@ -160,7 +160,7 @@ access_display(user) /obj/item/clockwork/slab/AltClick(mob/living/user) - if(is_servant_of_ratvar(user) && linking) + if(is_servant_of_ratvar(user) && linking && user.canUseTopic(src, BE_CLOSE, ismonkey(user))) linking = null to_chat(user, "Object link canceled.") diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm index 499dfd5941..3ad71af961 100644 --- a/code/modules/antagonists/devil/true_devil/_true_devil.dm +++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm @@ -94,10 +94,10 @@ /mob/living/carbon/true_devil/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE) if(incapacitated()) - return 0 + return FALSE if(be_close && !in_range(M, src)) - return 0 - return 1 + return FALSE + return TRUE /mob/living/carbon/true_devil/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) return 666 diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 279834223a..8ae385d848 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD //Apprenticeship contract - moved to antag_spawner.dm @@ -409,3 +410,416 @@ /obj/effect/temp_visual/tornado/Initialize() . = ..() animate(src, pixel_x = -500, time = 40) +======= + +//Apprenticeship contract - moved to antag_spawner.dm + +///////////////////////////Veil Render////////////////////// + +/obj/item/veilrender + name = "veil render" + desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast city." + icon = 'icons/obj/wizard.dmi' + icon_state = "render" + item_state = "knife" + lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi' + force = 15 + throwforce = 10 + w_class = WEIGHT_CLASS_NORMAL + hitsound = 'sound/weapons/bladeslice.ogg' + var/charges = 1 + var/spawn_type = /obj/singularity/wizard + var/spawn_amt = 1 + var/activate_descriptor = "reality" + var/rend_desc = "You should run now." + var/spawn_fast = 0 //if 1, ignores checking for mobs on loc before spawning + +/obj/item/veilrender/attack_self(mob/user) + if(charges > 0) + new /obj/effect/rend(get_turf(user), spawn_type, spawn_amt, rend_desc, spawn_fast) + charges-- + user.visible_message("[src] hums with power as [user] deals a blow to [activate_descriptor] itself!") + else + to_chat(user, "The unearthly energies that powered the blade are now dormant.") + +/obj/effect/rend + name = "tear in the fabric of reality" + desc = "You should run now." + icon = 'icons/effects/effects.dmi' + icon_state = "rift" + density = TRUE + anchored = TRUE + var/spawn_path = /mob/living/simple_animal/cow //defaulty cows to prevent unintentional narsies + var/spawn_amt_left = 20 + var/spawn_fast = 0 + +/obj/effect/rend/New(loc, var/spawn_type, var/spawn_amt, var/desc, var/spawn_fast) + src.spawn_path = spawn_type + src.spawn_amt_left = spawn_amt + src.desc = desc + src.spawn_fast = spawn_fast + START_PROCESSING(SSobj, src) + return + +/obj/effect/rend/process() + if(!spawn_fast) + if(locate(/mob) in loc) + return + new spawn_path(loc) + spawn_amt_left-- + if(spawn_amt_left <= 0) + qdel(src) + +/obj/effect/rend/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/nullrod)) + user.visible_message("[user] seals \the [src] with \the [I].") + qdel(src) + return + else + return ..() + +/obj/effect/rend/singularity_pull() + return + +/obj/effect/rend/singularity_pull() + return + +/obj/item/veilrender/vealrender + name = "veal render" + desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast farm." + spawn_type = /mob/living/simple_animal/cow + spawn_amt = 20 + activate_descriptor = "hunger" + rend_desc = "Reverberates with the sound of ten thousand moos." + +/obj/item/veilrender/honkrender + name = "honk render" + desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast circus." + spawn_type = /mob/living/simple_animal/hostile/retaliate/clown + spawn_amt = 10 + activate_descriptor = "depression" + rend_desc = "Gently wafting with the sounds of endless laughter." + icon_state = "clownrender" + +////TEAR IN REALITY + +/obj/singularity/wizard + name = "tear in the fabric of reality" + desc = "This isn't right." + icon = 'icons/effects/224x224.dmi' + icon_state = "reality" + pixel_x = -96 + pixel_y = -96 + grav_pull = 6 + consume_range = 3 + current_size = STAGE_FOUR + allowed_size = STAGE_FOUR + +/obj/singularity/wizard/process() + move() + eat() + return +/////////////////////////////////////////Scrying/////////////////// + +/obj/item/scrying + name = "scrying orb" + desc = "An incandescent orb of otherworldly energy, staring into it gives you vision beyond mortal means." + icon = 'icons/obj/projectiles.dmi' + icon_state ="bluespace" + throw_speed = 3 + throw_range = 7 + throwforce = 15 + damtype = BURN + force = 15 + hitsound = 'sound/items/welder2.ogg' + + var/xray_granted = FALSE + +/obj/item/scrying/equipped(mob/user) + if(!xray_granted && ishuman(user)) + var/mob/living/carbon/human/H = user + if(!(H.dna.check_mutation(XRAY))) + H.dna.add_mutation(XRAY) + xray_granted = TRUE + . = ..() + +/obj/item/scrying/attack_self(mob/user) + to_chat(user, "You can see...everything!") + visible_message("[user] stares into [src], their eyes glazing over.") + user.ghostize(1) + +/////////////////////////////////////////Necromantic Stone/////////////////// + +/obj/item/device/necromantic_stone + name = "necromantic stone" + desc = "A shard capable of resurrecting humans as skeleton thralls." + icon = 'icons/obj/wizard.dmi' + icon_state = "necrostone" + item_state = "electronic" + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + w_class = WEIGHT_CLASS_TINY + var/list/spooky_scaries = list() + var/unlimited = 0 + +/obj/item/device/necromantic_stone/unlimited + unlimited = 1 + +/obj/item/device/necromantic_stone/attack(mob/living/carbon/human/M, mob/living/carbon/human/user) + if(!istype(M)) + return ..() + + if(!istype(user) || !user.canUseTopic(M, BE_CLOSE)) + return + + if(M.stat != DEAD) + to_chat(user, "This artifact can only affect the dead!") + return + + if(!M.mind || !M.client) + to_chat(user, "There is no soul connected to this body...") + return + + check_spooky()//clean out/refresh the list + if(spooky_scaries.len >= 3 && !unlimited) + to_chat(user, "This artifact can only affect three undead at a time!") + return + + M.set_species(/datum/species/skeleton, icon_update=0) + M.revive(full_heal = 1, admin_revive = 1) + spooky_scaries |= M + to_chat(M, "You have been revived by [user.real_name]!") + to_chat(M, "[user.p_they(TRUE)] [user.p_are()] your master now, assist them even if it costs you your new life!") + + equip_roman_skeleton(M) + + desc = "A shard capable of resurrecting humans as skeleton thralls[unlimited ? "." : ", [spooky_scaries.len]/3 active thralls."]" + +/obj/item/device/necromantic_stone/proc/check_spooky() + if(unlimited) //no point, the list isn't used. + return + + for(var/X in spooky_scaries) + if(!ishuman(X)) + spooky_scaries.Remove(X) + continue + var/mob/living/carbon/human/H = X + if(H.stat == DEAD) + H.dust(TRUE) + spooky_scaries.Remove(X) + continue + listclearnulls(spooky_scaries) + +//Funny gimmick, skeletons always seem to wear roman/ancient armour +/obj/item/device/necromantic_stone/proc/equip_roman_skeleton(mob/living/carbon/human/H) + for(var/obj/item/I in H) + H.dropItemToGround(I) + + var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionaire) + H.equip_to_slot_or_del(new hat(H), slot_head) + H.equip_to_slot_or_del(new /obj/item/clothing/under/roman(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), slot_shoes) + H.put_in_hands(new /obj/item/shield/riot/roman(H), TRUE) + H.put_in_hands(new /obj/item/claymore(H), TRUE) + H.equip_to_slot_or_del(new /obj/item/twohanded/spear(H), slot_back) + + +/obj/item/voodoo + name = "wicker doll" + desc = "Something creepy about it." + icon = 'icons/obj/wizard.dmi' + icon_state = "voodoo" + item_state = "electronic" + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + var/mob/living/carbon/human/target = null + var/list/mob/living/carbon/human/possible = list() + var/obj/item/voodoo_link = null + var/cooldown_time = 30 //3s + var/cooldown = 0 + max_integrity = 10 + resistance_flags = FLAMMABLE + +/obj/item/voodoo/attackby(obj/item/I, mob/user, params) + if(target && cooldown < world.time) + if(I.is_hot()) + to_chat(target, "You suddenly feel very hot") + target.bodytemperature += 50 + GiveHint(target) + else if(is_pointed(I)) + to_chat(target, "You feel a stabbing pain in [parse_zone(user.zone_selected)]!") + target.Knockdown(40) + GiveHint(target) + else if(istype(I, /obj/item/bikehorn)) + to_chat(target, "HONK") + SEND_SOUND(target, 'sound/items/airhorn.ogg') + target.adjustEarDamage(0,3) + GiveHint(target) + cooldown = world.time +cooldown_time + return + + if(!voodoo_link) + if(I.loc == user && istype(I) && I.w_class <= WEIGHT_CLASS_SMALL) + if (user.transferItemToLoc(I,src)) + voodoo_link = I + to_chat(user, "You attach [I] to the doll.") + update_targets() + +/obj/item/voodoo/check_eye(mob/user) + if(loc != user) + user.reset_perspective(null) + user.unset_machine() + +/obj/item/voodoo/attack_self(mob/user) + if(!target && possible.len) + target = input(user, "Select your victim!", "Voodoo") as null|anything in possible + return + + if(user.zone_selected == "chest") + if(voodoo_link) + target = null + voodoo_link.forceMove(drop_location()) + to_chat(user, "You remove the [voodoo_link] from the doll.") + voodoo_link = null + update_targets() + return + + if(target && cooldown < world.time) + switch(user.zone_selected) + if("mouth") + var/wgw = sanitize(input(user, "What would you like the victim to say", "Voodoo", null) as text) + target.say(wgw) + log_game("[user][user.key] made [target][target.key] say [wgw] with a voodoo doll.") + if("eyes") + user.set_machine(src) + user.reset_perspective(target) + spawn(100) + user.reset_perspective(null) + user.unset_machine() + if("r_leg","l_leg") + to_chat(user, "You move the doll's legs around.") + var/turf/T = get_step(target,pick(GLOB.cardinals)) + target.Move(T) + if("r_arm","l_arm") + target.click_random_mob() + GiveHint(target) + if("head") + to_chat(user, "You smack the doll's head with your hand.") + target.Dizzy(10) + to_chat(target, "You suddenly feel as if your head was hit with a hammer!") + GiveHint(target,user) + cooldown = world.time + cooldown_time + +/obj/item/voodoo/proc/update_targets() + possible = list() + if(!voodoo_link) + return + var/list/prints = voodoo_link.return_fingerprints() + if(!length(prints)) + return FALSE + for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + if(prints[md5(H.dna.uni_identity)]) + possible |= H + +/obj/item/voodoo/proc/GiveHint(mob/victim,force=0) + if(prob(50) || force) + var/way = dir2text(get_dir(victim,get_turf(src))) + to_chat(victim, "You feel a dark presence from [way]") + if(prob(20) || force) + var/area/A = get_area(src) + to_chat(victim, "You feel a dark presence from [A.name]") + +/obj/item/voodoo/suicide_act(mob/living/carbon/user) + user.visible_message("[user] links the voodoo doll to themself and sits on it, infinitely crushing themself! It looks like [user.p_theyre()] trying to commit suicide!") + user.gib() + return(BRUTELOSS) + +/obj/item/voodoo/fire_act(exposed_temperature, exposed_volume) + if(target) + target.adjust_fire_stacks(20) + target.IgniteMob() + GiveHint(target,1) + return ..() + +//Provides a decent heal, need to pump every 6 seconds +/obj/item/organ/heart/cursed/wizard + pump_delay = 60 + heal_brute = 25 + heal_burn = 25 + heal_oxy = 25 + +//Warp Whistle: Provides uncontrolled long distance teleportation. + +/obj/item/warpwhistle + name = "warp whistle" + desc = "One toot on this whistle will send you to a far away land!" + icon = 'icons/obj/wizard.dmi' + icon_state = "whistle" + var/on_cooldown = 0 //0: usable, 1: in use, 2: on cooldown + var/mob/living/carbon/last_user + +/obj/item/warpwhistle/proc/interrupted(mob/living/carbon/user) + if(!user || QDELETED(src) || user.notransform) + on_cooldown = FALSE + return TRUE + return FALSE + +/obj/item/warpwhistle/attack_self(mob/living/carbon/user) + if(!istype(user) || on_cooldown) + return + on_cooldown = TRUE + last_user = user + var/turf/T = get_turf(user) + playsound(T,'sound/magic/warpwhistle.ogg', 200, 1) + user.canmove = 0 + new /obj/effect/temp_visual/tornado(T) + sleep(20) + if(interrupted(user)) + return + user.invisibility = INVISIBILITY_MAXIMUM + user.status_flags |= GODMODE + sleep(20) + if(interrupted(user)) + return + var/breakout = 0 + while(breakout < 50) + var/turf/potential_T = find_safe_turf() + if(T.z != potential_T.z || abs(get_dist_euclidian(potential_T,T)) > 50 - breakout) + user.forceMove(potential_T) + user.canmove = 0 + T = potential_T + break + breakout += 1 + new /obj/effect/temp_visual/tornado(T) + sleep(20) + if(interrupted(user)) + return + user.invisibility = initial(user.invisibility) + user.status_flags &= ~GODMODE + user.canmove = 1 + on_cooldown = 2 + sleep(40) + on_cooldown = 0 + +/obj/item/warpwhistle/Destroy() + if(on_cooldown == 1 && last_user) //Flute got dunked somewhere in the teleport + last_user.invisibility = initial(last_user.invisibility) + last_user.status_flags &= ~GODMODE + last_user.canmove = 1 + return ..() + +/obj/effect/temp_visual/tornado + icon = 'icons/obj/wizard.dmi' + icon_state = "tornado" + name = "tornado" + desc = "This thing sucks!" + layer = FLY_LAYER + randomdir = 0 + duration = 40 + pixel_x = 500 + +/obj/effect/temp_visual/tornado/Initialize() + . = ..() + animate(src, pixel_x = -500, time = 40) +>>>>>>> bfde5ac... [s] Fixes altclick exploits (#35456) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 071cfa7eef..8c46d30591 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -161,17 +161,14 @@ set category = "Object" set src in usr - if(usr.incapacitated()) + if(!usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) return setDir(turn(dir, -90)) /obj/item/device/assembly/infra/AltClick(mob/user) ..() - if(user.incapacitated()) - to_chat(user, "You can't do that right now!") - return - if(!in_range(src, user)) + if(!user.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) return else rotate() diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 9880d0ba46..7925d586e7 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -734,8 +734,7 @@ /obj/machinery/airalarm/AltClick(mob/user) ..() - if(!issilicon(user) && (!user.canUseTopic(src, be_close=TRUE) || !isturf(loc))) - to_chat(user, "You can't do that right now!") + if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc)) return else togglelock(user) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 9923e19803..0ea1328299 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -90,7 +90,7 @@ return ..() /obj/item/clothing/AltClick(mob/user) - if(pockets && pockets.quickdraw && pockets.contents.len && !user.incapacitated()) + if(istype(user) && user.canUseTopic(src, BE_CLOSE, ismonkey(user)) && pockets && pockets.quickdraw && pockets.contents.len) var/obj/item/I = pockets.contents[1] if(!I) return @@ -244,7 +244,7 @@ BLIND // can't see anything if(..()) return 1 - if(!user.canUseTopic(src, be_close=TRUE)) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) to_chat(user, "You can't do that right now!") return else diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index d540b5b963..0a1adb1dca 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -87,7 +87,7 @@ to_chat(user, "Alt-click to take a candy corn.") /obj/item/clothing/head/fedora/det_hat/AltClick(mob/user) - if(user.canUseTopic(src, be_close=TRUE)) + if(user.canUseTopic(src, BE_CLOSE, ismonkey(user))) ..() if(loc == user) if(candy_cooldown < world.time) diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index ec99487b4b..831a011a4c 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/item/clothing/head/soft name = "cargo cap" desc = "It's a baseball hat in a tasteless yellow colour." @@ -130,3 +131,136 @@ icon_state = "emtsoft" item_color = "emt" dog_fashion = null +======= +/obj/item/clothing/head/soft + name = "cargo cap" + desc = "It's a baseball hat in a tasteless yellow colour." + icon_state = "cargosoft" + item_state = "helmet" + item_color = "cargo" + + dog_fashion = /datum/dog_fashion/head/cargo_tech + + var/flipped = 0 + +/obj/item/clothing/head/soft/dropped() + src.icon_state = "[item_color]soft" + src.flipped=0 + ..() + +/obj/item/clothing/head/soft/verb/flipcap() + set category = "Object" + set name = "Flip cap" + + flip(usr) + + +/obj/item/clothing/head/soft/AltClick(mob/user) + ..() + if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return + else + flip(user) + + +/obj/item/clothing/head/soft/proc/flip(mob/user) + if(!user.incapacitated()) + src.flipped = !src.flipped + if(src.flipped) + icon_state = "[item_color]soft_flipped" + to_chat(user, "You flip the hat backwards.") + else + icon_state = "[item_color]soft" + to_chat(user, "You flip the hat back in normal position.") + usr.update_inv_head() //so our mob-overlays update + +/obj/item/clothing/head/soft/examine(mob/user) + ..() + to_chat(user, "Alt-click the cap to flip it [flipped ? "forwards" : "backwards"].") + +/obj/item/clothing/head/soft/red + name = "red cap" + desc = "It's a baseball hat in a tasteless red colour." + icon_state = "redsoft" + item_color = "red" + dog_fashion = null + +/obj/item/clothing/head/soft/blue + name = "blue cap" + desc = "It's a baseball hat in a tasteless blue colour." + icon_state = "bluesoft" + item_color = "blue" + dog_fashion = null + +/obj/item/clothing/head/soft/green + name = "green cap" + desc = "It's a baseball hat in a tasteless green colour." + icon_state = "greensoft" + item_color = "green" + dog_fashion = null + +/obj/item/clothing/head/soft/yellow + name = "yellow cap" + desc = "It's a baseball hat in a tasteless yellow colour." + icon_state = "yellowsoft" + item_color = "yellow" + dog_fashion = null + +/obj/item/clothing/head/soft/grey + name = "grey cap" + desc = "It's a baseball hat in a tasteful grey colour." + icon_state = "greysoft" + item_color = "grey" + dog_fashion = null + +/obj/item/clothing/head/soft/orange + name = "orange cap" + desc = "It's a baseball hat in a tasteless orange colour." + icon_state = "orangesoft" + item_color = "orange" + dog_fashion = null + +/obj/item/clothing/head/soft/mime + name = "white cap" + desc = "It's a baseball hat in a tasteless white colour." + icon_state = "mimesoft" + item_color = "mime" + dog_fashion = null + +/obj/item/clothing/head/soft/purple + name = "purple cap" + desc = "It's a baseball hat in a tasteless purple colour." + icon_state = "purplesoft" + item_color = "purple" + dog_fashion = null + +/obj/item/clothing/head/soft/black + name = "black cap" + desc = "It's a baseball hat in a tasteless black colour." + icon_state = "blacksoft" + item_color = "black" + dog_fashion = null + +/obj/item/clothing/head/soft/rainbow + name = "rainbow cap" + desc = "It's a baseball hat in a bright rainbow of colors." + icon_state = "rainbowsoft" + item_color = "rainbow" + dog_fashion = null + +/obj/item/clothing/head/soft/sec + name = "security cap" + desc = "It's a robust baseball hat in tasteful red colour." + icon_state = "secsoft" + item_color = "sec" + armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 20, acid = 50) + strip_delay = 60 + dog_fashion = null + +/obj/item/clothing/head/soft/emt + name = "EMT cap" + desc = "It's a baseball hat with a dark turquoise color and a reflective cross on the top." + icon_state = "emtsoft" + item_color = "emt" + dog_fashion = null +>>>>>>> bfde5ac... [s] Fixes altclick exploits (#35456) diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 9fd328c2d6..f7c99a24d3 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -23,8 +23,7 @@ obj/item/clothing/mask/breath/suicide_act(mob/living/carbon/user) /obj/item/clothing/mask/breath/AltClick(mob/user) ..() - if(!user.canUseTopic(src, be_close=TRUE)) - to_chat(user, "You can't do that right now!") + if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return else adjustmask(user) diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index d036710ce4..d09db447a8 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -93,8 +93,7 @@ /obj/item/clothing/suit/toggle/AltClick(mob/user) ..() - if(!user.canUseTopic(src, be_close=TRUE)) - to_chat(user, "You can't do that right now!") + if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return else suit_toggle(user) diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 30105fecac..df0783e4e7 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -69,7 +69,7 @@ return /obj/item/clothing/accessory/AltClick(mob/user) - if(user.canUseTopic(src, be_close=TRUE)) + if(istype(user) && user.canUseTopic(src, BE_CLOSE, ismonkey(user))) if(initial(above_suit)) above_suit = !above_suit to_chat(user, "[src] will be worn [above_suit ? "above" : "below"] your suit.") diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index b38712b375..5bc2be78ce 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -169,7 +169,7 @@ interact(user) /obj/machinery/microwave/AltClick(mob/user) - if(user.canUseTopic(src, be_close=TRUE) && !(operating || broken > 0 || panel_open || !anchored || dirty == 100)) + if(user.canUseTopic(src, BE_CLOSE) && !(operating || broken > 0 || panel_open || !anchored || dirty == 100)) cook() /******************* diff --git a/code/modules/games/cas.dm b/code/modules/games/cas.dm index 00e513dcbd..5a4f949fcb 100644 --- a/code/modules/games/cas.dm +++ b/code/modules/games/cas.dm @@ -117,7 +117,7 @@ set name = "Flip Card" set category = "Object" set src in range(1) - if(!usr.canUseTopic(src,1)) + if(!ishuman(usr) || !usr.canUseTopic(src, BE_CLOSE)) return if(!flipped) name = "CAS card" @@ -127,7 +127,7 @@ update_icon() /obj/item/toy/cards/singlecard/cas/AltClick(mob/living/user) - if(!user.canUseTopic(src,1)) + if(!ishuman(user) || !user.canUseTopic(src, BE_CLOSE)) return Flip() diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index fc4ac2e364..b039c1e968 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -24,7 +24,7 @@ armor = list(melee = 50, bullet = 70, laser = 70, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 0, acid = 0) /obj/item/device/electronic_assembly/proc/check_interactivity(mob/user) - return user.canUseTopic(src,be_close = TRUE) + return user.canUseTopic(src, BE_CLOSE) /obj/item/device/electronic_assembly/Initialize() diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm index 43d7dd1ad1..82dead20c3 100644 --- a/code/modules/integrated_electronics/core/integrated_circuit.dm +++ b/code/modules/integrated_electronics/core/integrated_circuit.dm @@ -68,7 +68,7 @@ a creative player the means to solve many problems. Circuits are held inside an if(assembly) return assembly.check_interactivity(user) else - return user.canUseTopic(src,be_close = TRUE) + return user.canUseTopic(src, BE_CLOSE) /obj/item/integrated_circuit/Initialize() displayed_name = name diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm index c5336094f1..f17744faae 100644 --- a/code/modules/integrated_electronics/core/printer.dm +++ b/code/modules/integrated_electronics/core/printer.dm @@ -10,7 +10,7 @@ var/list/program // Currently loaded save, in form of list /obj/item/device/integrated_circuit_printer/proc/check_interactivity(mob/user) - return user.canUseTopic(src, be_close = TRUE) + return user.canUseTopic(src, BE_CLOSE) /obj/item/device/integrated_circuit_printer/upgraded upgraded = TRUE diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index c20971fe9d..db11737a49 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -154,7 +154,7 @@ if(locked) to_chat(user, "The crate is locked with a Deca-code lock.") var/input = input(usr, "Enter [codelen] digits. All digits must be unique.", "Deca-Code Lock", "") as text - if(user.canUseTopic(src, 1)) + if(user.canUseTopic(src, BE_CLOSE)) var/list/sanitised = list() var/sanitycheck = 1 for(var/i=1,i<=length(input),i++) //put the guess into a list @@ -180,7 +180,7 @@ return ..() /obj/structure/closet/crate/secure/loot/AltClick(mob/living/user) - if(!user.canUseTopic(src)) + if(!user.canUseTopic(src, BE_CLOSE)) return attack_hand(user) //this helps you not blow up so easily by overriding unlocking which results in an immediate boom. diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm index d2abbe6f74..e93e3713c3 100644 --- a/code/modules/mining/equipment/marker_beacons.dm +++ b/code/modules/mining/equipment/marker_beacons.dm @@ -57,13 +57,10 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list( transfer_fingerprints_to(M) /obj/item/stack/marker_beacon/AltClick(mob/living/user) - if(user.incapacitated() || !istype(user)) - to_chat(user, "You can't do that right now!") - return - if(!in_range(src, user)) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors - if(user.incapacitated() || !istype(user) || !in_range(src, user)) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return if(input_color) picked_color = input_color @@ -129,13 +126,10 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list( /obj/structure/marker_beacon/AltClick(mob/living/user) ..() - if(user.incapacitated() || !istype(user)) - to_chat(user, "You can't do that right now!") - return - if(!in_range(src, user)) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors - if(user.incapacitated() || !istype(user) || !in_range(src, user)) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return if(input_color) picked_color = input_color diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 48b1c6b6b8..94d1cfef91 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -724,13 +724,13 @@ /mob/living/carbon/human/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE) if(incapacitated() || lying ) - return + return FALSE if(!Adjacent(M) && (M.loc != src)) if((be_close == 0) && (dna.check_mutation(TK))) if(tkMaxRangeCheck(src, M)) - return 1 - return - return 1 + return TRUE + return FALSE + return TRUE /mob/living/carbon/human/resist_restraints() if(wear_suit && wear_suit.breakouttime) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 9301e3b409..fd7ae7e22f 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -787,13 +787,14 @@ /mob/living/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE) if(incapacitated()) - return + return FALSE if(no_dextery) if(be_close && in_range(M, src)) - return 1 + return TRUE else to_chat(src, "You don't have the dexterity to do this!") - return + return FALSE + /mob/living/proc/can_use_guns(obj/item/G) if(G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser()) to_chat(src, "You don't have the dexterity to do this!") diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 779d5dcded..cd6cbebbda 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -185,6 +185,8 @@ // See software.dm for Topic() /mob/living/silicon/pai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE) + if(be_close && !in_range(M, src)) + return FALSE return TRUE /mob/proc/makePAI(delold) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 46b8612dda..c2e0abb349 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -879,10 +879,10 @@ /mob/living/silicon/robot/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE) if(stat || lockcharge || low_power_mode) - return + return FALSE if(be_close && !in_range(M, src)) - return - return 1 + return FALSE + return TRUE /mob/living/silicon/robot/updatehealth() ..() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 73bab3468b..631e4589d6 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -377,23 +377,23 @@ /mob/living/simple_animal/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE) if(incapacitated()) - return 0 + return FALSE if(no_dextery || dextrous) if(be_close && !in_range(M, src)) - return 0 + return FALSE else to_chat(src, "You don't have the dexterity to do this!") - return 0 - return 1 + return FALSE + return TRUE /mob/living/simple_animal/stripPanelUnequip(obj/item/what, mob/who, where) - if(!canUseTopic(who, TRUE)) + if(!canUseTopic(who, BE_CLOSE)) return else ..() /mob/living/simple_animal/stripPanelEquip(obj/item/what, mob/who, where) - if(!canUseTopic(who, TRUE)) + if(!canUseTopic(who, BE_CLOSE)) return else ..() diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index 3753febca2..e4908c57c7 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -99,12 +99,9 @@ H.emote("scream") /obj/item/paper/AltClick(mob/living/carbon/user, obj/item/I) - if ( istype(user) ) - if( (!in_range(src, user)) || user.stat || user.restrained() ) - return - to_chat(user, "You fold [src] into the shape of a plane!") - user.temporarilyRemoveItemFromInventory(src) - I = new /obj/item/paperplane(user, src) - user.put_in_hands(I) - else - to_chat(user, " You lack the dexterity to fold \the [src]. ") + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return + to_chat(user, "You fold [src] into the shape of a plane!") + user.temporarilyRemoveItemFromInventory(src) + I = new /obj/item/paperplane(user, src) + user.put_in_hands(I) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 4b093641d9..955f7e5810 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -128,12 +128,12 @@ if(isobj(O) && proximity) if(O.obj_flags & UNIQUE_RENAME) var/penchoice = input(user, "What would you like to edit?", "Rename or change description?") as null|anything in list("Rename","Change description") - if(!QDELETED(O) && user.canUseTopic(O, be_close = TRUE)) + if(!QDELETED(O) && user.canUseTopic(O, BE_CLOSE)) if(penchoice == "Rename") var/input = stripped_input(user,"What do you want to name \the [O.name]?", ,"", MAX_NAME_LEN) var/oldname = O.name - if(!QDELETED(O) && user.canUseTopic(O, be_close = TRUE)) + if(!QDELETED(O) && user.canUseTopic(O, BE_CLOSE)) if(oldname == input) to_chat(user, "You changed \the [O.name] to... well... \the [O.name].") return @@ -146,7 +146,7 @@ if(penchoice == "Change description") var/input = stripped_input(user,"Describe \the [O.name] here", ,"", 100) - if(!QDELETED(O) && user.canUseTopic(O, be_close = TRUE)) + if(!QDELETED(O) && user.canUseTopic(O, BE_CLOSE)) O.desc = input to_chat(user, "You have successfully changed \the [O.name]'s description.") return diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index b48f3392df..6fa13fe8c3 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -313,7 +313,7 @@ /obj/machinery/photocopier/MouseDrop_T(mob/target, mob/user) check_ass() //Just to make sure that you can re-drag somebody onto it after they moved off. - if (!istype(target) || target.anchored || target.buckled || !Adjacent(user) || !Adjacent(target) || !user.canUseTopic(src, 1) || target == ass || copier_blocked()) + if (!istype(target) || target.anchored || target.buckled || !Adjacent(target) || !user.canUseTopic(src, BE_CLOSE) || target == ass || copier_blocked()) return src.add_fingerprint(user) if(target == user) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 695b01e0b7..a99ccd4d14 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -662,8 +662,7 @@ /obj/machinery/power/apc/AltClick(mob/user) ..() - if(!issilicon(user) && (!user.canUseTopic(src, be_close=TRUE) || !isturf(loc))) - to_chat(user, "You can't do that right now!") + if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc)) return else togglelock(user) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 6382b231a8..315178368d 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -240,7 +240,7 @@ to_chat(user, "You switch to tube A.") /obj/item/gun/ballistic/shotgun/automatic/dual_tube/AltClick(mob/living/user) - if(user.incapacitated() || !Adjacent(user) || !istype(user)) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return pump() diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index ffa73aa994..c336e3b745 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -223,7 +223,7 @@ return vol_each = min(reagents.total_volume / amount, 50) var/name = stripped_input(usr,"Name:","Name your pill!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN) - if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE)) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE)) return var/obj/item/reagent_containers/pill/P @@ -237,7 +237,7 @@ reagents.trans_to(P,vol_each) else var/name = stripped_input(usr, "Name:", "Name your pack!", reagents.get_master_reagent_name(), MAX_NAME_LEN) - if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE)) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE)) return var/obj/item/reagent_containers/food/condiment/pack/P = new/obj/item/reagent_containers/food/condiment/pack(drop_location()) @@ -259,7 +259,7 @@ return vol_each = min(reagents.total_volume / amount, 40) var/name = stripped_input(usr,"Name:","Name your patch!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN) - if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE)) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE)) return var/obj/item/reagent_containers/pill/P @@ -277,7 +277,7 @@ if(condi) var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN) - if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE)) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE)) return var/obj/item/reagent_containers/food/condiment/P = new(drop_location()) P.originalname = name @@ -290,7 +290,7 @@ amount_full = round(reagents.total_volume / 30) vol_part = reagents.total_volume % 30 var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN) - if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE)) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE)) return var/obj/item/reagent_containers/glass/bottle/P diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index 5690bb1ad4..408b37cf12 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -42,7 +42,7 @@ return ..() /obj/vehicle/ridden/AltClick(mob/user) - if(user.Adjacent(src) && inserted_key) + if(inserted_key && user.canUseTopic(src, BE_CLOSE, ismonkey(user))) if(!is_occupant(user)) to_chat(user, "You must be riding the [src] to remove [src]'s key!") return