Files
e021ec7176 [MIRROR] Blocks (most instances of) screen elements from entering base atom /Click (#27049)
* Blocks (most instances of) screen elements from entering base atom `/Click` (#82236)

## About The Pull Request

Fixes #76495

This PR prevents (most) screen elements from running base
`/atom/proc/Click` and `/mob/proc/ClickOn()` when clickend.

(The only exception I found to it was the cursor catcher for scopes.)

Why?
Most, if not everything in `ClickOn` is considered "in world"
interacting. It abides by `incapacitated`, runs `faceAtom`, etc.
This means, currently, you can "interact" with screen elements using in
world elements. For example, TK-ing / pointing a gun at your mood face.

Right now this affects very little, but there is a large potential for
errors. All you have to do is forget a sanity check in `afterattack` and
suddenly you have an item that can affect your screen objects.
The only example I found was the `/item/godstaff`, which can color some
of your screen elements. But there may be more. Like guns.

Note:
Many, many screen elements ALREADY do not fall down into atom click.
They simply don't call parent. Which is totally fine.
I am just ensuring ALL* screen elements do not fall down into atom
click.

## Changelog

🆑 Melbert
fix: Blocks mobs from trying to "physically" interact with some of their
hud elements, such as using Telekinesis or point a gun at your mood
meter.
/🆑

* Blocks (most instances of) screen elements from entering base atom `/Click`

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
2024-04-04 13:38:44 -04:00

67 lines
2.7 KiB
Plaintext

///Status effect applied when casting a fishing rod at someone, provided the attached fishing hook allows it.
/datum/status_effect/grouped/hooked
id = "hooked"
duration = -1
tick_interval = -1
status_type = STATUS_EFFECT_MULTIPLE
alert_type = /atom/movable/screen/alert/status_effect/hooked
/datum/status_effect/grouped/hooked/proc/try_unhook()
return do_after(owner, 2 SECONDS, timed_action_flags = IGNORE_USER_LOC_CHANGE, extra_checks = CALLBACK(src, PROC_REF(still_exists)), interaction_key = DOAFTER_SOURCE_REMOVING_HOOK)
/datum/status_effect/grouped/hooked/proc/still_exists()
return !QDELETED(src)
/datum/status_effect/grouped/hooked/on_creation(mob/living/new_owner, datum/beam/fishing_line/source)
. = ..()
if(!.) //merged with an existing effect
return
RegisterSignal(source, COMSIG_QDELETING, PROC_REF(on_fishing_line_deleted))
/datum/status_effect/grouped/hooked/merge_with_existing(datum/status_effect/grouped/hooked/existing, datum/beam/fishing_line/source)
existing.RegisterSignal(source, COMSIG_QDELETING, PROC_REF(on_fishing_line_deleted))
/datum/status_effect/grouped/hooked/proc/on_fishing_line_deleted(datum/source)
SIGNAL_HANDLER
owner.remove_status_effect(type, source)
/atom/movable/screen/alert/status_effect/hooked
name = "Snagged By Hook"
desc = "You're being caught like a fish by some asshat! Click to safely remove the hook or move away far enough to snap it off."
icon_state = "hooked"
/atom/movable/screen/alert/status_effect/hooked/Click()
. = ..()
if(!.)
return
if(!owner.can_resist())
return
owner.balloon_alert(owner, "removing hook...")
var/datum/status_effect/grouped/hooked/effect = owner.has_status_effect(attached_effect.type)
if(!effect.try_unhook())
return
owner.balloon_alert(owner, "hook removed")
var/datum/beam/fishing_line/rand_source = pick(effect.sources)
qdel(rand_source)
///Version used by the jawed fishing hook, which also applies slowdown
/datum/status_effect/grouped/hooked/jaws
id = "hooked_jaws"
alert_type = /atom/movable/screen/alert/status_effect/hooked/jaws
/datum/status_effect/grouped/hooked/jaws/on_apply()
. = ..()
owner.add_movespeed_modifier(/datum/movespeed_modifier/hook_jawed)
/datum/status_effect/grouped/hooked/jaws/on_remove()
. = ..()
owner.remove_movespeed_modifier(/datum/movespeed_modifier/hook_jawed)
/datum/status_effect/grouped/hooked/jaws/try_unhook()
return do_after(owner, 10 SECONDS, extra_checks = CALLBACK(src, PROC_REF(still_exists)), interaction_key = DOAFTER_SOURCE_REMOVING_HOOK)
/atom/movable/screen/alert/status_effect/hooked/jaws
name = "Snagged By Jaws"
desc = "You've been snagged by some sort of beartrap-slash-fishing-hook-gizmo! Click to safely remove the hook or move away far enough to snap it off."
icon_state = "hooked_jaws"