mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-26 13:39:16 +01:00
GPS to tgui (#19263)
* GPS to tgui * dead code * lol * default should always work
This commit is contained in:
@@ -23,6 +23,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
var/list/tracking_devices
|
||||
var/list/showing_tracked_names
|
||||
var/obj/compass_holder/compass
|
||||
var/theme
|
||||
pickup_sound = 'sound/items/pickup/device.ogg'
|
||||
drop_sound = 'sound/items/drop/device.ogg'
|
||||
|
||||
@@ -91,7 +92,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
return PROCESS_KILL
|
||||
update_holder()
|
||||
if(holder)
|
||||
update_compass(TRUE)
|
||||
update_compass(src, TRUE)
|
||||
|
||||
/obj/item/gps/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
@@ -115,7 +116,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
reachable_z_levels = reachable_z_levels || using_map.get_map_levels(origin.z, long_range)
|
||||
return (target.z in reachable_z_levels)
|
||||
|
||||
/obj/item/gps/proc/update_compass(var/update_compass_icon)
|
||||
/obj/item/gps/proc/update_compass(atom/movable/source, var/update_compass_icon)
|
||||
SIGNAL_HANDLER
|
||||
compass.hide_waypoints(FALSE)
|
||||
var/turf/my_turf = get_turf(src)
|
||||
@@ -157,10 +158,11 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
if(!is_in_processing_list)
|
||||
is_in_processing_list = TRUE
|
||||
START_PROCESSING(SSobj, src)
|
||||
update_compass(src, TRUE)
|
||||
else
|
||||
is_in_processing_list = FALSE
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
update_compass()
|
||||
update_compass(src)
|
||||
update_holder()
|
||||
update_icon()
|
||||
|
||||
@@ -190,173 +192,149 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
return TRUE
|
||||
if(special_handling)
|
||||
return FALSE
|
||||
display(user)
|
||||
|
||||
tgui_interact(user)
|
||||
|
||||
/obj/item/gps/tgui_state(mob/user)
|
||||
return GLOB.tgui_inventory_state
|
||||
|
||||
/obj/item/gps/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui, custom_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "Gps", name)
|
||||
ui.open()
|
||||
|
||||
/obj/item/gps/tgui_static_data(mob/user)
|
||||
. = ..()
|
||||
var/robot_theme
|
||||
if(isrobot(loc))
|
||||
var/mob/living/silicon/robot/robot_owner = loc
|
||||
robot_theme = robot_owner.get_ui_theme()
|
||||
.["theme"] = theme || robot_theme
|
||||
|
||||
// Compiles all the data not available directly from the GPS
|
||||
// Like the positions and directions to all other GPS units
|
||||
/obj/item/gps/proc/display_list()
|
||||
var/list/dat = list()
|
||||
/obj/item/gps/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
|
||||
|
||||
var/turf/curr = get_turf(src)
|
||||
var/area/my_area = get_area(src)
|
||||
|
||||
dat["my_area_name"] = strip_improper(my_area.name)
|
||||
dat["curr_x"] = curr.x
|
||||
dat["curr_y"] = curr.y
|
||||
dat["curr_z"] = curr.z
|
||||
dat["curr_z_name"] = strip_improper(using_map.get_zlevel_name(curr.z))
|
||||
dat["z_level_detection"] = using_map.get_map_levels(curr.z, long_range)
|
||||
var/list/data = list(
|
||||
"currentArea" = strip_improper(my_area.name),
|
||||
"power" = tracking,
|
||||
"tag" = gps_tag,
|
||||
"localMode" = local_mode,
|
||||
"currentCoords" = "[curr.x], [curr.y], [curr.z]",
|
||||
"currentZName" = strip_improper(using_map.get_zlevel_name(curr.z)),
|
||||
"canHide" = can_hide_signal,
|
||||
"isHidden" = hide_signal
|
||||
)
|
||||
|
||||
var/z_level_det = using_map.get_map_levels(curr.z, long_range)
|
||||
var/list/gps_list = list()
|
||||
for(var/obj/item/gps/G in GLOB.GPS_list - src)
|
||||
for(var/obj/item/gps/current_gps in GLOB.GPS_list - src)
|
||||
|
||||
if(!can_track(G, dat["z_level_detection"]))
|
||||
if(!can_track(current_gps, z_level_det))
|
||||
continue
|
||||
|
||||
var/gps_data[0]
|
||||
gps_data["ref"] = G
|
||||
gps_data["gps_tag"] = G.gps_tag
|
||||
var/area/gps_area = get_area(current_gps)
|
||||
var/turf/gps_turf = get_turf(current_gps)
|
||||
|
||||
var/area/A = get_area(G)
|
||||
gps_data["area_name"] = strip_improper(A.get_name())
|
||||
var/is_local = (curr.z == gps_turf.z)
|
||||
var/dist = get_dist(curr, gps_turf)
|
||||
var/is_poi = istype(current_gps, /obj/item/gps/internal/poi)
|
||||
|
||||
var/turf/T = get_turf(G)
|
||||
gps_data["z_name"] = strip_improper(using_map.get_zlevel_name(T.z))
|
||||
gps_data["direction"] = get_adir(curr, T)
|
||||
gps_data["degrees"] = round(Get_Angle(curr,T))
|
||||
gps_data["distX"] = T.x - curr.x
|
||||
gps_data["distY"] = T.y - curr.y
|
||||
gps_data["distance"] = get_dist(curr, T)
|
||||
gps_data["local"] = (curr.z == T.z)
|
||||
gps_data["x"] = T.x
|
||||
gps_data["y"] = T.y
|
||||
if(is_poi && is_local)
|
||||
dist = round(dist, 10)
|
||||
|
||||
gps_list[++gps_list.len] = gps_data
|
||||
var/list/gps_data = list(
|
||||
"ref" = "\ref[current_gps]",
|
||||
"gpsTag" = current_gps.gps_tag,
|
||||
"areaName" = strip_improper(gps_area.get_name()),
|
||||
"zName" = strip_improper(using_map.get_zlevel_name(gps_turf.z)),
|
||||
"local" = is_local,
|
||||
"trackingColor" = LAZYACCESS(tracking_devices, "\ref[current_gps]"),
|
||||
"trackingName" = LAZYACCESS(showing_tracked_names, "\ref[current_gps]"),
|
||||
)
|
||||
|
||||
dat["gps_list"] = gps_list
|
||||
if(!is_poi || is_local)
|
||||
gps_data["degrees"] = round(Get_Angle(curr, gps_turf))
|
||||
gps_data["coords"] = "[gps_turf.x], [gps_turf.y], [gps_turf.z]"
|
||||
gps_data["dist"] = dist
|
||||
|
||||
return dat
|
||||
UNTYPED_LIST_ADD(gps_list, gps_data)
|
||||
|
||||
/obj/item/gps/proc/display(mob/user)
|
||||
data["signals"] = gps_list
|
||||
|
||||
if(emped)
|
||||
to_chat(user, span_warning("It's busted!"))
|
||||
return data
|
||||
|
||||
/obj/item/gps/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
|
||||
var/list/dat = list()
|
||||
var/list/gps_data = display_list()
|
||||
|
||||
dat += "<table width = '100%'>"
|
||||
if(!tracking)
|
||||
dat += "<tr><td colspan = 6></td><a href='byond://?src=\ref[src];toggle_power=1'>\[Switch On\]</a></tr>"
|
||||
else
|
||||
dat += "<tr><td colspan = 6></td><a href='byond://?src=\ref[src];toggle_power=1'>\[Switch Off\]</a></tr>"
|
||||
dat += "<tr><td colspan = 2><b>Current location</b></td><td colspan = 2>[gps_data["my_area_name"]]</td><td colspan = 2><b>([gps_data["curr_x"]], [gps_data["curr_y"]], [gps_data["curr_z_name"]])</b></td></tr>"
|
||||
dat += "<tr><td colspan = 4>[hide_signal ? "Tagged" : "Broadcasting"] as '[gps_tag]'.</td>"
|
||||
dat += "<td><a href='byond://?src=\ref[src];tag=1'>\[Change Tag\]</a><a href='byond://?src=\ref[src];range=1'>\[Toggle Scan Range\]</a>[can_hide_signal ? "<a href='byond://?src=\ref[src];hide=1'>\[Toggle Signal Visibility\]</a>":""]</td></tr>"
|
||||
|
||||
var/list/gps_list = gps_data["gps_list"]
|
||||
if(gps_list.len)
|
||||
dat += "<tr><td colspan = 6><b>Detected signals</b></td></tr>"
|
||||
for(var/gps in gps_data["gps_list"])
|
||||
dat += "<tr>"
|
||||
var/gps_ref = "\ref[gps["ref"]]"
|
||||
dat += "<td>[gps["gps_tag"]]</td><td>[gps["area_name"]]</td>"
|
||||
|
||||
if(istype(gps_data["ref"], /obj/item/gps/internal/poi))
|
||||
dat += "<td>[gps["local"] ? "[gps["direction"]] Dist: [round(gps["distance"], 10)]m" : "[gps["z_name"]]"]</td>"
|
||||
else
|
||||
dat += "<td>([gps["x"]], [gps["y"]], [gps["z_name"]])</td>"
|
||||
|
||||
if(gps["local"])
|
||||
dat += "<td>[gps["distance"]]m</td><td>[gps["direction"]]</td>"
|
||||
else
|
||||
dat += "<td colspan = 2>Non-local signal.</td>"
|
||||
|
||||
if(LAZYACCESS(tracking_devices, gps_ref))
|
||||
dat += "<td><a href='byond://?src=\ref[src];stop_track=[gps_ref]'>\[Stop Tracking\]</a> <a href='byond://?src=\ref[src];track_color=[gps_ref]'>\[Colour [color_square(hex = LAZYACCESS(tracking_devices, gps_ref))]\]</a> <a href='byond://?src=\ref[src];track_label=[gps_ref]'>Show/Hide Label</a></td>"
|
||||
else
|
||||
dat += "<td><a href='byond://?src=\ref[src];start_track=[gps_ref]'>\[Start Tracking\]</a></td>"
|
||||
dat += "</tr>"
|
||||
else
|
||||
dat += "<tr><td colspan = 5>No other signals detected.</td></tr>"
|
||||
dat += "</table>"
|
||||
|
||||
var/datum/browser/popup = new(user, "gps_\ref[src]", "Global Positioning System", 700, 1000)
|
||||
popup.set_content(dat.Join(null))
|
||||
popup.open()
|
||||
|
||||
/obj/item/gps/Topic(var/href, var/list/href_list)
|
||||
if(..())
|
||||
return TRUE
|
||||
|
||||
if(href_list["toggle_power"])
|
||||
toggle_tracking()
|
||||
. = TRUE
|
||||
|
||||
if(href_list["track_label"])
|
||||
var/gps_ref = href_list["track_label"]
|
||||
var/obj/item/gps/gps = locate(gps_ref)
|
||||
if(istype(gps) && !QDELETED(gps) && !LAZYACCESS(showing_tracked_names, gps_ref))
|
||||
LAZYSET(showing_tracked_names, gps_ref, TRUE)
|
||||
else
|
||||
switch(action)
|
||||
if("power")
|
||||
toggle_tracking()
|
||||
return TRUE
|
||||
if("rename")
|
||||
var/new_name = sanitize(params["value"], 11)
|
||||
if(!new_name)
|
||||
return FALSE
|
||||
gps_tag = uppertext(new_name)
|
||||
name = "global positioning system ([gps_tag])"
|
||||
return TRUE
|
||||
if("localMode")
|
||||
local_mode = !local_mode
|
||||
return TRUE
|
||||
if("hideSignal")
|
||||
if(!can_hide_signal)
|
||||
return FALSE
|
||||
hide_signal = !hide_signal
|
||||
return TRUE
|
||||
if("trackLabel")
|
||||
var/gps_ref = params["ref"]
|
||||
if(!gps_ref)
|
||||
return FALSE
|
||||
var/obj/item/gps/gps = locate(gps_ref)
|
||||
if(istype(gps) && !QDELETED(gps) && !LAZYACCESS(showing_tracked_names, gps_ref))
|
||||
LAZYSET(showing_tracked_names, gps_ref, TRUE)
|
||||
else
|
||||
LAZYREMOVE(showing_tracked_names, gps_ref)
|
||||
return TRUE
|
||||
if("stopTrack")
|
||||
var/gps_ref = params["ref"]
|
||||
if(!gps_ref)
|
||||
return FALSE
|
||||
compass.clear_waypoint(gps_ref)
|
||||
LAZYREMOVE(tracking_devices, gps_ref)
|
||||
LAZYREMOVE(showing_tracked_names, gps_ref)
|
||||
to_chat(usr, span_notice("\The [src] is [LAZYACCESS(showing_tracked_names, gps_ref) ? "now showing" : "no longer showing"] labels for [gps.gps_tag]."))
|
||||
|
||||
if(href_list["stop_track"])
|
||||
var/gps_ref = href_list["stop_track"]
|
||||
var/obj/item/gps/gps = locate(gps_ref)
|
||||
compass.clear_waypoint(gps_ref)
|
||||
LAZYREMOVE(tracking_devices, gps_ref)
|
||||
LAZYREMOVE(showing_tracked_names, gps_ref)
|
||||
if(istype(gps) && !QDELETED(gps))
|
||||
to_chat(usr, span_notice("\The [src] is no longer tracking [gps.gps_tag]."))
|
||||
update_compass()
|
||||
. = TRUE
|
||||
|
||||
if(href_list["start_track"])
|
||||
var/gps_ref = href_list["start_track"]
|
||||
var/obj/item/gps/gps = locate(gps_ref)
|
||||
if(istype(gps) && !QDELETED(gps))
|
||||
update_compass(src, TRUE)
|
||||
return TRUE
|
||||
if("startTrack")
|
||||
var/gps_ref = params["ref"]
|
||||
if(!gps_ref)
|
||||
return FALSE
|
||||
var/obj/item/gps/gps = locate(gps_ref)
|
||||
if(!istype(gps) || QDELETED(gps))
|
||||
return FALSE
|
||||
LAZYSET(tracking_devices, gps_ref, "#00ffff")
|
||||
LAZYSET(showing_tracked_names, gps_ref, TRUE)
|
||||
to_chat(usr, span_notice("\The [src] is now tracking [gps.gps_tag]."))
|
||||
update_compass()
|
||||
. = TRUE
|
||||
|
||||
if(href_list["track_color"])
|
||||
var/obj/item/gps/gps = locate(href_list["track_color"])
|
||||
if(istype(gps) && !QDELETED(gps))
|
||||
var/new_colour = tgui_color_picker(usr, "Enter a new tracking color.", "GPS Waypoint Color")
|
||||
if(new_colour && istype(gps) && !QDELETED(gps) && holder == usr && !usr.incapacitated())
|
||||
to_chat(usr, span_notice("You adjust the colour \the [src] is using to highlight [gps.gps_tag]."))
|
||||
LAZYSET(tracking_devices, href_list["track_color"], new_colour)
|
||||
update_compass()
|
||||
. = TRUE
|
||||
|
||||
if(href_list["tag"])
|
||||
var/a = tgui_input_text(usr, "Please enter desired tag.", name, gps_tag, 10)
|
||||
a = uppertext(copytext(a, 1, 11))
|
||||
if(in_range(src, usr))
|
||||
gps_tag = a
|
||||
name = "global positioning system ([gps_tag])"
|
||||
to_chat(usr, "You set your GPS's tag to '[gps_tag]'.")
|
||||
. = TRUE
|
||||
|
||||
if(href_list["range"])
|
||||
local_mode = !local_mode
|
||||
to_chat(usr, "You set the signal receiver to [local_mode ? "'NARROW'" : "'BROAD'"].")
|
||||
. = TRUE
|
||||
|
||||
if(href_list["hide"])
|
||||
if(!can_hide_signal)
|
||||
return
|
||||
hide_signal = !hide_signal
|
||||
to_chat(usr, "You set the device to [hide_signal ? "not " : ""]broadcast a signal while scanning for other signals.")
|
||||
. = TRUE
|
||||
|
||||
if(. && loc == usr)
|
||||
display(usr)
|
||||
update_compass(src, TRUE)
|
||||
return TRUE
|
||||
if("trackColor")
|
||||
var/gps_ref = params["ref"]
|
||||
if(!gps_ref)
|
||||
return FALSE
|
||||
var/obj/item/gps/gps = locate(gps_ref)
|
||||
if(!istype(gps) || QDELETED(gps))
|
||||
return FALSE
|
||||
var/new_colour = sanitize_hexcolor(params["color"])
|
||||
if(!new_colour)
|
||||
return FALSE
|
||||
LAZYSET(tracking_devices, gps_ref, new_colour)
|
||||
update_compass(src, TRUE)
|
||||
return TRUE
|
||||
|
||||
/obj/item/gps/on // Defaults to off to avoid polluting the signal list with a bunch of GPSes without owners. If you need to spawn active ones, use these.
|
||||
tracking = TRUE
|
||||
@@ -478,45 +456,4 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
long_range = TRUE
|
||||
hide_signal = TRUE
|
||||
can_hide_signal = TRUE
|
||||
|
||||
/obj/item/gps/syndie/display(mob/user)
|
||||
|
||||
if(emped)
|
||||
to_chat(user, "It's busted!")
|
||||
return
|
||||
|
||||
var/list/dat = list()
|
||||
var/list/gps_data = display_list()
|
||||
|
||||
dat += "<table width = '100%'>"
|
||||
if(!tracking)
|
||||
dat += "<tr><td colspan = 6></td><a href='byond://?src=\ref[src];toggle_power=1'>\[Switch On\]</a></tr>"
|
||||
else
|
||||
dat += "<tr><td colspan = 6></td><a href='byond://?src=\ref[src];toggle_power=1'>\[Switch Off\]</a></tr>"
|
||||
dat += "<tr><td colspan = 2><b>Current location</b></td><td colspan = 2>[gps_data["my_area_name"]]</td><td colspan = 2><b>([gps_data["curr_x"]], [gps_data["curr_y"]], [gps_data["curr_z_name"]])</b></td></tr>"
|
||||
dat += "<tr><td colspan = 4>[hide_signal ? "Tagged" : "Broadcasting"] as '[gps_tag]'.</td>"
|
||||
dat += "<td><a href='byond://?src=\ref[src];tag=1'>\[Change Tag\]</a><a href='byond://?src=\ref[src];range=1'>\[Toggle Scan Range\]</a>[can_hide_signal ? "<a href='byond://?src=\ref[src];hide=1'>\[Toggle Signal Visibility\]</a>":""]</td></tr>"
|
||||
|
||||
var/list/gps_list = gps_data["gps_list"]
|
||||
if(gps_list.len)
|
||||
dat += "<tr><td colspan = 6><b>Detected signals</b></td></tr>"
|
||||
for(var/gps in gps_data["gps_list"])
|
||||
dat += "<tr>"
|
||||
var/gps_ref = "\ref[gps["ref"]]"
|
||||
dat += "<td>[gps["gps_tag"]]</td><td>[gps["area_name"]] ([gps["x"]], [gps["y"]], [gps["z_name"]])</td>"
|
||||
if(gps["local"])
|
||||
dat += "<td>[gps["distance"]]m</td><td>[gps["direction"]]</td>"
|
||||
else
|
||||
dat += "<td colspan = 2>Non-local signal.</td>"
|
||||
if(LAZYACCESS(tracking_devices, gps_ref))
|
||||
dat += "<td><a href='byond://?src=\ref[src];stop_track=[gps_ref]'>\[Stop Tracking\]</a> <a href='byond://?src=\ref[src];track_color=[gps_ref]'>\[Colour [color_square(hex = LAZYACCESS(tracking_devices, gps_ref))]\]</a> <a href='byond://?src=\ref[src];track_label=[gps_ref]'>Show/Hide Label</a></td>"
|
||||
else
|
||||
dat += "<td><a href='byond://?src=\ref[src];start_track=[gps_ref]'>\[Start Tracking\]</a></td>"
|
||||
dat += "</tr>"
|
||||
else
|
||||
dat += "<tr><td colspan = 6>No other signals detected.</td></tr>"
|
||||
dat += "</table>"
|
||||
|
||||
var/datum/browser/popup = new(user, "gps_\ref[src]", "Global Positioning System", 700, 1000)
|
||||
popup.set_content(dat.Join(null))
|
||||
popup.open()
|
||||
theme = "syndicate"
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
/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)) //Repairing cyborgs
|
||||
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))
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
return PAI_DEFAULT_CHASSIS
|
||||
|
||||
/datum/preference/text/pai_chassis/is_valid(value)
|
||||
if(!(value in SSpai.get_chassis_list()))
|
||||
if(!(value in SSpai.get_chassis_list()) && value != PAI_DEFAULT_CHASSIS)
|
||||
return FALSE
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
rebuild_overlay_lists(TRUE)
|
||||
|
||||
/obj/compass_holder/Destroy()
|
||||
QDEL_NULL_LIST(compass_waypoints)
|
||||
QDEL_LIST_ASSOC_VAL(compass_waypoints)
|
||||
. = ..()
|
||||
|
||||
/obj/compass_holder/proc/get_heading()
|
||||
|
||||
@@ -36,6 +36,11 @@
|
||||
src.modules += new /obj/item/dogborg/sleeper/lost(src)
|
||||
src.modules += new /obj/item/dogborg/pounce(src)
|
||||
|
||||
/obj/item/robot_module/robot/lost/adjust_gps(obj/item/gps/robot/robot_gps)
|
||||
robot_gps.long_range = TRUE
|
||||
robot_gps.hide_signal = TRUE
|
||||
robot_gps.can_hide_signal = TRUE
|
||||
|
||||
/obj/item/robot_module/robot/gravekeeper
|
||||
name = "gravekeeper robot module"
|
||||
hide_on_manifest = TRUE
|
||||
|
||||
@@ -174,7 +174,9 @@
|
||||
// Cyborgs (non-drones), default loadout. This will be given to every module.
|
||||
/obj/item/robot_module/robot/create_equipment(var/mob/living/silicon/robot/robot)
|
||||
..()
|
||||
src.modules += new /obj/item/gps/robot(src)
|
||||
var/obj/item/gps/robot/robot_gps = new /obj/item/gps/robot(src)
|
||||
adjust_gps(robot_gps)
|
||||
src.modules += robot_gps
|
||||
src.modules += new /obj/item/boop_module(src)
|
||||
src.modules += new /obj/item/robot_tongue(src)
|
||||
src.modules += new /obj/item/flash/robot(src)
|
||||
@@ -184,6 +186,9 @@
|
||||
src.modules += new /obj/item/gripper/scene(src)
|
||||
src.modules += new /obj/item/robo_dice(src)
|
||||
|
||||
/obj/item/robot_module/robot/proc/adjust_gps(obj/item/gps/robot/robot_gps)
|
||||
return
|
||||
|
||||
/obj/item/robot_module/robot/standard
|
||||
name = "standard robot module"
|
||||
pto_type = PTO_CIVILIAN
|
||||
|
||||
@@ -38,6 +38,11 @@
|
||||
id.forceMove(src)
|
||||
src.modules += id
|
||||
|
||||
/obj/item/robot_module/robot/syndicate/adjust_gps(obj/item/gps/robot/robot_gps)
|
||||
robot_gps.long_range = TRUE
|
||||
robot_gps.hide_signal = TRUE
|
||||
robot_gps.can_hide_signal = TRUE
|
||||
|
||||
/obj/item/robot_module/robot/syndicate/Destroy()
|
||||
src.modules -= id
|
||||
id = null
|
||||
|
||||
@@ -65,11 +65,13 @@
|
||||
has_eye_light_sprites = TRUE
|
||||
|
||||
/datum/robot_sprite/dogborg/tall/command
|
||||
sprite_hud_icon_state = "clerical"
|
||||
module_type = "Command"
|
||||
sprite_icon = 'icons/mob/robot/tallrobot/tallrobots.dmi'
|
||||
pixel_x = 0
|
||||
|
||||
/datum/robot_sprite/dogborg/raptor/command
|
||||
sprite_hud_icon_state = "clerical"
|
||||
module_type = "Command"
|
||||
sprite_icon = 'icons/mob/robot/raptor.dmi'
|
||||
|
||||
|
||||
@@ -1,77 +0,0 @@
|
||||
|
||||
// DEPRECATED - The normal GPS has the advanced features, now. This is obsolete.
|
||||
|
||||
// These are distinguished from the ordinary "Relay Position Devices" that just print your location
|
||||
// In that they are also all networked with each other to show each other's locations.
|
||||
/obj/item/gps/advanced
|
||||
name = "global positioning system"
|
||||
desc = "Helping lost spacemen find their way through the planets since 1995."
|
||||
icon = 'icons/obj/telescience.dmi'
|
||||
icon_state = "gps-c"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
slot_flags = SLOT_BELT
|
||||
origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2)
|
||||
gps_tag = "COM0"
|
||||
emped = 0
|
||||
|
||||
special_handling = TRUE
|
||||
|
||||
/obj/item/gps/advanced/Initialize(mapload)
|
||||
. = ..()
|
||||
add_overlay("working")
|
||||
|
||||
/obj/item/gps/advanced/emp_act(severity, recursive)
|
||||
emped = TRUE
|
||||
cut_overlay("working")
|
||||
add_overlay("emp")
|
||||
spawn(300)
|
||||
emped = FALSE
|
||||
cut_overlay("emp")
|
||||
add_overlay("working")
|
||||
|
||||
/obj/item/gps/advanced/attack_self(mob/user)
|
||||
. = ..(user)
|
||||
if(.)
|
||||
return TRUE
|
||||
|
||||
var/obj/item/gps/advanced/t = ""
|
||||
if(emped)
|
||||
t += "ERROR"
|
||||
else
|
||||
t += "<BR><A href='byond://?src=\ref[src];advtag=1'>Set Tag</A> "
|
||||
t += "<BR>Tag: [gps_tag]"
|
||||
|
||||
for(var/obj/item/gps/advanced/G in GLOB.GPS_list)
|
||||
var/turf/pos = get_turf(G)
|
||||
var/area/gps_area = get_area(G)
|
||||
var/tracked_gpstag = G.gps_tag
|
||||
if(G.emped == 1)
|
||||
t += "<BR>[tracked_gpstag]: ERROR"
|
||||
else
|
||||
t += "<BR>[tracked_gpstag]: [strip_improper(gps_area.name)] ([pos.x], [pos.y], [pos.z])"
|
||||
|
||||
var/datum/browser/popup = new(user, "GPS", name, 600, 450)
|
||||
popup.set_content(t)
|
||||
popup.open()
|
||||
|
||||
/obj/item/gps/advanced/Topic(href, href_list)
|
||||
..()
|
||||
if(href_list["advtag"] )
|
||||
var/a = tgui_input_text(usr, "Please enter desired tag.", name, gps_tag, 4)
|
||||
a = uppertext(copytext(a, 1, 5))
|
||||
if(src.loc == usr)
|
||||
gps_tag = a
|
||||
name = "global positioning system ([gps_tag])"
|
||||
attack_self(usr)
|
||||
|
||||
/obj/item/gps/advanced/science
|
||||
icon_state = "gps-s"
|
||||
gps_tag = "SCI0"
|
||||
|
||||
/obj/item/gps/advanced/engineering
|
||||
icon_state = "gps-e"
|
||||
gps_tag = "ENG0"
|
||||
|
||||
/obj/item/gps/advanced/security
|
||||
icon_state = "gps-sec"
|
||||
gps_tag = "SEC0"
|
||||
@@ -260,7 +260,7 @@ const ColorPresets: React.FC<ColorPresetsProps> = React.memo(
|
||||
))}
|
||||
</Stack.Item>
|
||||
</Stack>
|
||||
{!!onAllowEditing && (
|
||||
{!!onAllowEditing && presetList?.length && (
|
||||
<Button
|
||||
color={allowEditing ? 'green' : 'red'}
|
||||
position="absolute"
|
||||
|
||||
@@ -4,33 +4,45 @@ import { Window } from 'tgui/layouts';
|
||||
import {
|
||||
Box,
|
||||
Button,
|
||||
Divider,
|
||||
Icon,
|
||||
LabeledList,
|
||||
Section,
|
||||
Stack,
|
||||
Table,
|
||||
} from 'tgui-core/components';
|
||||
import { flow } from 'tgui-core/fp';
|
||||
import { clamp } from 'tgui-core/math';
|
||||
import type { BooleanLike } from 'tgui-core/react';
|
||||
import { vecLength, vecSubtract } from 'tgui-core/vector';
|
||||
import { PreferenceEditColor } from './PreferencesMenu/elements/ColorInput';
|
||||
|
||||
const coordsToVec = (coords: string) => coords.split(', ').map(parseFloat);
|
||||
|
||||
type Data = {
|
||||
theme: string | null;
|
||||
currentArea: string;
|
||||
power: BooleanLike;
|
||||
tag: string;
|
||||
updating: BooleanLike;
|
||||
currentCoords: string; // "x, y, z"
|
||||
globalmode: BooleanLike;
|
||||
localMode: BooleanLike;
|
||||
currentZName: string;
|
||||
signals: signal[];
|
||||
canHide: BooleanLike;
|
||||
isHidden: BooleanLike;
|
||||
};
|
||||
|
||||
type signal = {
|
||||
entrytag: string;
|
||||
coords: string;
|
||||
ref: string;
|
||||
gpsTag: string;
|
||||
areaName: string;
|
||||
local: BooleanLike;
|
||||
zName: string;
|
||||
trackingColor: string | null;
|
||||
trackingName: BooleanLike;
|
||||
coords?: string;
|
||||
degrees?: number;
|
||||
dist?: number;
|
||||
degrees: number;
|
||||
};
|
||||
|
||||
function sortSignal(a: signal, b: signal) {
|
||||
@@ -39,12 +51,23 @@ function sortSignal(a: signal, b: signal) {
|
||||
if (b.dist === undefined) return -1;
|
||||
if (a.dist < b.dist) return -1;
|
||||
if (a.dist > b.dist) return 1;
|
||||
else return a.entrytag.localeCompare(b.entrytag);
|
||||
else return a.gpsTag.localeCompare(b.gpsTag);
|
||||
}
|
||||
|
||||
export const Gps = (props) => {
|
||||
const { act, data } = useBackend<Data>();
|
||||
const { currentArea, currentCoords, globalmode, power, tag, updating } = data;
|
||||
const {
|
||||
theme,
|
||||
currentArea,
|
||||
currentCoords,
|
||||
localMode,
|
||||
power,
|
||||
tag,
|
||||
canHide,
|
||||
isHidden,
|
||||
currentZName,
|
||||
} = data;
|
||||
|
||||
const signals: signal[] = flow([
|
||||
(signals: signal[]) =>
|
||||
signals.map((signal, index) => {
|
||||
@@ -56,7 +79,7 @@ export const Gps = (props) => {
|
||||
vecLength(
|
||||
vecSubtract(
|
||||
coordsToVec(currentCoords),
|
||||
coordsToVec(signal.coords),
|
||||
coordsToVec(signal.coords || ''),
|
||||
),
|
||||
),
|
||||
);
|
||||
@@ -64,93 +87,182 @@ export const Gps = (props) => {
|
||||
}),
|
||||
(signals: signal[]) => signals.sort((a, b) => sortSignal(a, b)),
|
||||
])(data.signals || []);
|
||||
|
||||
return (
|
||||
<Window title="Global Positioning System" width={470} height={700}>
|
||||
<Window.Content scrollable>
|
||||
<Section
|
||||
title="Control"
|
||||
buttons={
|
||||
<Button
|
||||
icon="power-off"
|
||||
selected={power}
|
||||
onClick={() => act('power')}
|
||||
<Window
|
||||
title="Global Positioning System"
|
||||
width={600}
|
||||
height={700}
|
||||
theme={theme ? theme : undefined}
|
||||
>
|
||||
<Window.Content>
|
||||
<Stack fill vertical>
|
||||
<Stack.Item>
|
||||
<Section
|
||||
title="Control"
|
||||
buttons={
|
||||
<Button
|
||||
tooltip="Power off the GPS. Unpoered devices can not be tracked."
|
||||
icon="power-off"
|
||||
selected={power}
|
||||
onClick={() => act('power')}
|
||||
>
|
||||
{power ? 'On' : 'Off'}
|
||||
</Button>
|
||||
}
|
||||
>
|
||||
{power ? 'On' : 'Off'}
|
||||
</Button>
|
||||
}
|
||||
>
|
||||
<LabeledList>
|
||||
<LabeledList.Item label="Tag">
|
||||
<Button icon="pencil-alt" onClick={() => act('rename')}>
|
||||
{tag}
|
||||
</Button>
|
||||
</LabeledList.Item>
|
||||
<LabeledList.Item label="Scan Mode">
|
||||
<Button
|
||||
icon={updating ? 'unlock' : 'lock'}
|
||||
color={!updating && 'bad'}
|
||||
onClick={() => act('updating')}
|
||||
>
|
||||
{updating ? 'AUTO' : 'MANUAL'}
|
||||
</Button>
|
||||
</LabeledList.Item>
|
||||
<LabeledList.Item label="Range">
|
||||
<Button
|
||||
icon="sync"
|
||||
selected={!globalmode}
|
||||
onClick={() => act('globalmode')}
|
||||
>
|
||||
{globalmode ? 'MAXIMUM' : 'LOCAL'}
|
||||
</Button>
|
||||
</LabeledList.Item>
|
||||
</LabeledList>
|
||||
</Section>
|
||||
{!!power && (
|
||||
<>
|
||||
<Section title="Current Location">
|
||||
<Box fontSize="18px">
|
||||
{currentArea} ({currentCoords})
|
||||
</Box>
|
||||
</Section>
|
||||
<Section title="Detected Signals">
|
||||
<Table>
|
||||
<Table.Row bold>
|
||||
<Table.Cell>Name</Table.Cell>
|
||||
<Table.Cell collapsing>Direction</Table.Cell>
|
||||
<Table.Cell collapsing>Coordinates</Table.Cell>
|
||||
</Table.Row>
|
||||
{signals.map((signal, index) => (
|
||||
<Table.Row
|
||||
key={signal.entrytag + signal.coords + index}
|
||||
className="candystripe"
|
||||
<LabeledList>
|
||||
<LabeledList.Item label="Tag">
|
||||
<Button.Input
|
||||
fluid
|
||||
icon="pencil-alt"
|
||||
onCommit={(value) => act('rename', { value })}
|
||||
value={tag}
|
||||
/>
|
||||
</LabeledList.Item>
|
||||
<LabeledList.Item label="Range">
|
||||
<Button
|
||||
tooltip={`Adjust the signal receiver to ${localMode ? 'BROAD' : 'NARROW'}.`}
|
||||
icon={localMode ? 'signal' : 'tower-broadcast'}
|
||||
selected={!localMode}
|
||||
onClick={() => act('localMode')}
|
||||
>
|
||||
<Table.Cell bold color="label">
|
||||
{signal.entrytag}
|
||||
</Table.Cell>
|
||||
<Table.Cell
|
||||
collapsing
|
||||
opacity={
|
||||
signal.dist !== undefined &&
|
||||
clamp(1.2 / Math.log(Math.E + signal.dist / 20), 0.4, 1)
|
||||
}
|
||||
{localMode ? 'NARROW' : 'BROAD'}
|
||||
</Button>
|
||||
</LabeledList.Item>
|
||||
{!!canHide && (
|
||||
<LabeledList.Item label="Hide Signal">
|
||||
<Button
|
||||
tooltip={`Adjust the GPS to ${isHidden ? '' : 'not'} broadcast a signal.`}
|
||||
icon={isHidden ? 'eye-low-vision' : 'eye'}
|
||||
color={!isHidden && 'bad'}
|
||||
onClick={() => act('hideSignal')}
|
||||
>
|
||||
{signal.degrees !== undefined && (
|
||||
<Icon
|
||||
mr={1}
|
||||
size={1.2}
|
||||
name="arrow-up"
|
||||
rotation={signal.degrees}
|
||||
/>
|
||||
)}
|
||||
{signal.dist !== undefined && `${signal.dist}m`}
|
||||
</Table.Cell>
|
||||
<Table.Cell collapsing>{signal.coords}</Table.Cell>
|
||||
</Table.Row>
|
||||
))}
|
||||
</Table>
|
||||
{isHidden ? 'HIDDEN' : 'VISIBLE'}
|
||||
</Button>
|
||||
</LabeledList.Item>
|
||||
)}
|
||||
</LabeledList>
|
||||
</Section>
|
||||
</>
|
||||
)}
|
||||
</Stack.Item>
|
||||
{!!power && (
|
||||
<>
|
||||
<Stack.Item>
|
||||
<Section title="Current Location">
|
||||
<Box fontSize="18px">
|
||||
{currentArea} ({currentCoords} | {currentZName})
|
||||
</Box>
|
||||
</Section>
|
||||
</Stack.Item>
|
||||
<Stack.Item grow>
|
||||
<Section fill title="Detected Signals" scrollable>
|
||||
<Table>
|
||||
<Table.Row header>
|
||||
<Table.Cell>Name</Table.Cell>
|
||||
<Table.Cell collapsing>Options</Table.Cell>
|
||||
<Table.Cell collapsing>Direction</Table.Cell>
|
||||
<Table.Cell collapsing>Coordinates</Table.Cell>
|
||||
</Table.Row>
|
||||
{signals.length ? (
|
||||
signals.map((signal, index) => (
|
||||
<Table.Row
|
||||
key={signal.gpsTag + signal.coords + index}
|
||||
className="candystripe"
|
||||
>
|
||||
<Table.Cell bold color="label">
|
||||
{signal.gpsTag}
|
||||
</Table.Cell>
|
||||
<Table.Cell>
|
||||
{signal.trackingColor ? (
|
||||
<Stack>
|
||||
<Stack.Item>
|
||||
<Button
|
||||
tooltip="Stop tracking this GPS."
|
||||
color="red"
|
||||
icon="circle-stop"
|
||||
onClick={() =>
|
||||
act('stopTrack', { ref: signal.ref })
|
||||
}
|
||||
/>
|
||||
</Stack.Item>
|
||||
<Stack.Item>
|
||||
<PreferenceEditColor
|
||||
back_color={signal.trackingColor}
|
||||
onClose={(value) =>
|
||||
act('trackColor', {
|
||||
ref: signal.ref,
|
||||
color: value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Stack.Item>
|
||||
<Stack.Item>
|
||||
<Button
|
||||
selected={signal.trackingName}
|
||||
tooltip={`${signal.trackingName ? 'Hide' : 'Show'} this GPS label.`}
|
||||
icon="tag"
|
||||
onClick={() =>
|
||||
act('trackLabel', { ref: signal.ref })
|
||||
}
|
||||
/>
|
||||
</Stack.Item>
|
||||
</Stack>
|
||||
) : (
|
||||
<Button
|
||||
onClick={() =>
|
||||
act('startTrack', { ref: signal.ref })
|
||||
}
|
||||
>
|
||||
Track
|
||||
</Button>
|
||||
)}
|
||||
</Table.Cell>
|
||||
{signal.local ? (
|
||||
<Table.Cell
|
||||
collapsing
|
||||
opacity={
|
||||
signal.dist !== undefined &&
|
||||
clamp(
|
||||
1.2 / Math.log(Math.E + signal.dist / 20),
|
||||
0.4,
|
||||
1,
|
||||
)
|
||||
}
|
||||
>
|
||||
{signal.degrees !== undefined && (
|
||||
<Icon
|
||||
mr={1}
|
||||
size={1.2}
|
||||
name="arrow-up"
|
||||
rotation={signal.degrees}
|
||||
/>
|
||||
)}
|
||||
{signal.dist !== undefined && `${signal.dist}m`}
|
||||
</Table.Cell>
|
||||
) : (
|
||||
<Table.Cell collapsing>Non-local</Table.Cell>
|
||||
)}
|
||||
<Table.Cell collapsing>
|
||||
{signal.coords} | {signal.zName}
|
||||
</Table.Cell>
|
||||
</Table.Row>
|
||||
))
|
||||
) : (
|
||||
<>
|
||||
<Divider />
|
||||
<Table.Row>
|
||||
<Table.Cell align="center" color="label" colSpan={4}>
|
||||
No signals detetcted.
|
||||
</Table.Cell>
|
||||
</Table.Row>
|
||||
</>
|
||||
)}
|
||||
</Table>
|
||||
</Section>
|
||||
</Stack.Item>
|
||||
</>
|
||||
)}
|
||||
</Stack>
|
||||
</Window.Content>
|
||||
</Window>
|
||||
);
|
||||
|
||||
@@ -145,7 +145,7 @@ export const PreferenceEditColor = (
|
||||
<Floating
|
||||
onOpenChange={handleIsOpen}
|
||||
placement="top-end"
|
||||
contentClasses="VorePanel__Floating"
|
||||
contentClasses="VorePanel__Floating VorePanel__noScroll"
|
||||
content={
|
||||
<ColorSelector
|
||||
color={currentColor}
|
||||
@@ -175,13 +175,15 @@ export const PreferenceEditColor = (
|
||||
</Box>
|
||||
</Floating>
|
||||
</Stack.Item>
|
||||
<Stack.Item>
|
||||
<VorePanelTooltip
|
||||
tooltip={tooltip}
|
||||
tooltipPosition={tooltipPosition}
|
||||
displayText="?"
|
||||
/>
|
||||
</Stack.Item>
|
||||
{!!tooltip && (
|
||||
<Stack.Item>
|
||||
<VorePanelTooltip
|
||||
tooltip={tooltip}
|
||||
tooltipPosition={tooltipPosition}
|
||||
displayText="?"
|
||||
/>
|
||||
</Stack.Item>
|
||||
)}
|
||||
</Stack>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -168,7 +168,7 @@ export const VorePanelEditColor = (
|
||||
<Floating
|
||||
onOpenChange={handleIsOpen}
|
||||
placement="top-end"
|
||||
contentClasses="VorePanel__Floating"
|
||||
contentClasses="VorePanel__Floating VorePanel__noScroll"
|
||||
content={
|
||||
<ColorSelector
|
||||
color={currentColor}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
box-shadow: var(--shadow-glow-medium) hsla(0, 0%, 0%, 0.5);
|
||||
margin: var(--space-m);
|
||||
color: var(--color-text);
|
||||
overflow-y: scroll;
|
||||
overflow-y: hidden;
|
||||
overflow-x: hidden;
|
||||
padding: var(--space-m);
|
||||
}
|
||||
|
||||
@@ -1,19 +1,5 @@
|
||||
@use '../colors';
|
||||
|
||||
.VorePanel__Floating {
|
||||
height: 200px;
|
||||
background-color: var(--color-section);
|
||||
backdrop-filter: var(--blur-medium);
|
||||
border: var(--border-thickness-tiny) solid var(--color-border);
|
||||
border-radius: var(--border-radius-medium);
|
||||
box-shadow: var(--shadow-glow-medium) hsla(0, 0%, 0%, 0.5);
|
||||
margin: var(--space-m);
|
||||
color: var(--color-text);
|
||||
overflow-y: scroll;
|
||||
overflow-x: hidden;
|
||||
padding: var(--space-m);
|
||||
}
|
||||
|
||||
.VorePanel__floatingButton {
|
||||
cursor: var(--cursor-pointer);
|
||||
display: inline-block;
|
||||
@@ -93,3 +79,7 @@
|
||||
overflow-x: hidden;
|
||||
padding: var(--space-m);
|
||||
}
|
||||
|
||||
.VorePanel__Floating.VorePanel__noScroll {
|
||||
overflow-y: hidden;
|
||||
}
|
||||
|
||||
@@ -4709,7 +4709,6 @@
|
||||
#include "code\modules\tables\tables.dm"
|
||||
#include "code\modules\telesci\bscyrstal.dm"
|
||||
#include "code\modules\telesci\construction.dm"
|
||||
#include "code\modules\telesci\gps_advanced.dm"
|
||||
#include "code\modules\telesci\quantum_pad.dm"
|
||||
#include "code\modules\telesci\telepad.dm"
|
||||
#include "code\modules\telesci\telesci_computer.dm"
|
||||
|
||||
Reference in New Issue
Block a user