Files
Aurora.3/code/modules/mining/ore_detector.dm
Geeves f4ecbcb3b0 Ore Detectors (#10182)
Replaced ore radars with ore detectors. It display pings in the darkness when it spots the ore, even through walls.
    Mining stationbounds and drones now get ore detectors.
    You can now see psi-pings through walls again.
2020-12-16 23:24:10 +02:00

119 lines
3.2 KiB
Plaintext

/obj/item/ore_detector
name = "ore detector"
desc = "A device capable of locating and displaying ores to the average untrained hole explorer."
icon = 'icons/obj/contained_items/tools/ore_scanner.dmi'
icon_state = "ore_scanner"
item_state = "ore_scanner"
w_class = ITEMSIZE_SMALL
slot_flags = SLOT_BELT
force = 1
var/active = FALSE
var/datum/weakref/our_user
var/list/search_ores = list()
var/ping_rate = 4 SECONDS
var/last_ping = 0
var/list/ore_names
/obj/item/ore_detector/examine(mob/user, distance)
if(..(user, 1))
to_chat(user, FONT_SMALL(SPAN_NOTICE("Alt-click to set the ore you wish to search for.")))
/obj/item/ore_detector/Destroy()
deactivate()
return ..()
/obj/item/ore_detector/update_icon()
icon_state = "ore_scanner[active ? "-active" : ""]"
/obj/item/ore_detector/attack_self(mob/user)
if(!length(search_ores))
to_chat(user, SPAN_WARNING("You haven't set an ore to search for yet!"))
return
active = !active
var/msg = "You [active ? "activate" : "deactivate"] \the [src]."
to_chat(user, SPAN_NOTICE(msg))
if(active)
activate(user)
else
deactivate()
/obj/item/ore_detector/AltClick(mob/user)
if(!length(ore_names))
ore_names = list()
for(var/ore_n in ore_data)
var/ore/O = ore_data[ore_n]
var/ore_name = O.display_name
ore_names += ore_name
if(loc == user)
var/datum/vueui/ui = SSvueui.get_open_ui(user, src)
if(!ui)
ui = new(user, src, "devices-oredetector", 320, 220, capitalize_first_letters(name))
ui.open()
else
return ..()
/obj/item/ore_detector/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui)
if(!data)
data = list()
VUEUI_SET_CHECK_LIST(data["ore_names"], ore_names, ., data)
VUEUI_SET_CHECK_LIST(data["selected_ores"], search_ores, ., data)
/obj/item/ore_detector/Topic(href, href_list)
..()
if(href_list["chosen_ore"])
if(href_list["chosen_ore"] in search_ores)
search_ores -= href_list["chosen_ore"]
else
search_ores += href_list["chosen_ore"]
SSvueui.check_uis_for_change(src)
/obj/item/ore_detector/process()
if(last_ping + ping_rate > world.time)
return
if(isnull(our_user))
deactivate()
return
var/mob/M = our_user.resolve()
if(loc != M && loc.loc != M)
deactivate()
return
last_ping = world.time
var/turf/our_turf = get_turf(src)
for(var/turf/simulated/mineral/mine_turf in RANGE_TURFS(7, our_turf))
if(isnull(our_user)) // in the event it's dropped midsweep
return
if(mine_turf.mineral && (mine_turf.mineral.display_name in search_ores))
var/image/ore_ping = image(icon = 'icons/obj/contained_items/tools/ore_scanner.dmi', icon_state = "signal_overlay", loc = our_turf, layer = OBFUSCATION_LAYER + 0.1)
pixel_shift_to_turf(ore_ping, our_turf, mine_turf)
M << ore_ping
QDEL_IN(ore_ping, 4 SECONDS)
/obj/item/ore_detector/emp_act()
deactivate()
/obj/item/ore_detector/proc/activate(var/mob/user)
if(!length(search_ores))
return
START_PROCESSING(SSprocessing, src)
our_user = WEAKREF(user)
update_icon()
/obj/item/ore_detector/proc/deactivate()
STOP_PROCESSING(SSprocessing, src)
our_user = null
update_icon()
/obj/item/ore_detector/throw_at()
..()
deactivate()
/obj/item/ore_detector/dropped()
..()
deactivate()
/obj/item/ore_detector/on_give()
deactivate()