Files
Bubberstation/code/modules/wiremod/components/sensors/view_sensor.dm
SkyratBot cfe2039de9 [MIRROR] View Sensor circuits now have a range modifier [MDB IGNORE] (#18260)
* View Sensor circuits now have a range modifier (#72123)

## About The Pull Request

Adds the ability to use ranges between 0 and 5 for View Sensor circuits.
Currently these nodes are locked to 5 tiles and it is rather difficult
to limit the area this circuit effects either for speed reasons or
otherwise. This PR makes it a simple variable that remains capped at 5,
admins can raise the cap by modifying a variable.
## Why It's Good For The Game

I mostly use circuits as an admin, I can't for the life of me figure out
how to make a shorter range AOE circuit although I imagine its possible
by comparing x and y coordinates of things in the list and yourself this
is far to finicky. Players can also utilize this to, for example check
all objects on the tile the view sensor is on, "possible" at the moment
but way to finicky compared to a 5 tiles.
## Changelog
🆑
qol: You can now reduce the range of View Sensor circuits.
/🆑

Co-authored-by: Mothblocks <35135081+Mothblocks@ users.noreply.github.com>

* View Sensor circuits now have a range modifier

Co-authored-by: NamelessFairy <40036527+NamelessFairy@users.noreply.github.com>
Co-authored-by: Mothblocks <35135081+Mothblocks@ users.noreply.github.com>
2022-12-24 21:54:58 -08:00

70 lines
2.1 KiB
Plaintext

/**
* # View Sensor
*
* Returns all movable objects in view.
*/
/obj/item/circuit_component/view_sensor
display_name = "View Sensor"
desc = "Outputs a list with all movable objects in it's view. Requires a shell. Max range of 5 tiles."
category = "Sensor"
circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL
power_usage_per_input = 10 //Normal components have 1
///Allows setting the range of the view sensor
var/datum/port/input/range
/// The result from the output
var/datum/port/output/result
var/datum/port/output/cooldown
var/see_invisible = SEE_INVISIBLE_LIVING
var/view_cooldown = 1 SECONDS
var/maximum_range = 5 //Variablised incase admins want to increase it.
/obj/item/circuit_component/view_sensor/populate_ports()
range = add_input_port("Range", PORT_TYPE_NUMBER, default = maximum_range)
result = add_output_port("Result", PORT_TYPE_LIST(PORT_TYPE_ATOM))
cooldown = add_output_port("Scan On Cooldown", PORT_TYPE_SIGNAL)
/obj/item/circuit_component/view_sensor/get_ui_notices()
. = ..()
. += create_ui_notice("Scan Cooldown: [DisplayTimeText(view_cooldown)]", "orange", "stopwatch")
/obj/item/circuit_component/view_sensor/input_received(datum/port/input/port)
if(TIMER_COOLDOWN_CHECK(parent, COOLDOWN_CIRCUIT_VIEW_SENSOR))
result.set_output(null)
cooldown.set_output(COMPONENT_SIGNAL)
return
if(!parent || !parent.shell)
result.set_output(null)
return
if(!isturf(parent.shell.loc))
if(isliving(parent.shell.loc))
var/mob/living/owner = parent.shell.loc
if(parent.shell != owner.get_active_held_item() && parent.shell != owner.get_inactive_held_item())
result.set_output(null)
return
else
result.set_output(null)
return
var/range_value = clamp(range.value, 0, maximum_range)
var/object_list = list()
for(var/atom/movable/target in view(range_value, get_turf(parent.shell)))
if(target.mouse_opacity == MOUSE_OPACITY_TRANSPARENT)
continue
if(target.invisibility > see_invisible)
continue
if(target.IsObscured())
continue
object_list += target
result.set_output(object_list)
TIMER_COOLDOWN_START(parent, COOLDOWN_CIRCUIT_VIEW_SENSOR, view_cooldown)