Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sentry laptop now uses camera manager #5309

Merged
merged 1 commit into from
Dec 30, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 21 additions & 98 deletions code/modules/defenses/sentry_computer.dm
Original file line number Diff line number Diff line change
Expand Up @@ -48,41 +48,18 @@
// Stuff needed to render the map

/// asset name for the game map
var/map_name

/// camera screen which renders the world
var/atom/movable/screen/map_view/cam_screen

/// camera screen which shows a blank error
var/atom/movable/screen/background/cam_background

var/list/cam_plane_masters
var/camera_map_name

/obj/item/device/sentry_computer/Initialize(mapload)
. = ..()
if(cell_type)
cell = new cell_type()
cell.charge = cell.maxcharge
// set up cameras
map_name = "sentry_computer_[REF(src)]_map"
cam_screen = new
cam_screen.name = "screen"
cam_screen.assigned_map = map_name
cam_screen.del_on_map_removal = FALSE
cam_screen.screen_loc = "[map_name]:1,1"
cam_background = new
cam_background.assigned_map = map_name
cam_background.del_on_map_removal = FALSE

cam_plane_masters = list()
for(var/plane in subtypesof(/atom/movable/screen/plane_master) - /atom/movable/screen/plane_master/blackness)
var/atom/movable/screen/plane_master/instance = new plane()
instance.assigned_map = map_name
instance.del_on_map_removal = FALSE
if(instance.blend_mode_override)
instance.blend_mode = instance.blend_mode_override
instance.screen_loc = "[map_name]:CENTER"
cam_plane_masters += instance

RegisterSignal(src, COMSIG_CAMERA_MAPNAME_ASSIGNED, PROC_REF(camera_mapname_update))

AddComponent(/datum/component/camera_manager)
SEND_SIGNAL(src, COMSIG_CAMERA_CLEAR)

faction_group = FACTION_LIST_MARINE
transceiver.forceMove(src)
Expand All @@ -94,16 +71,18 @@

/obj/item/device/sentry_computer/Destroy()
. = ..()
UnregisterSignal(src, COMSIG_CAMERA_MAPNAME_ASSIGNED)
QDEL_NULL(cell)
QDEL_NULL(cam_background)
QDEL_NULL(cam_screen)
QDEL_NULL(transceiver)
QDEL_NULL(voice)
last_camera_turf = null
current = null
registered_tools = null
paired_sentry = null

/obj/item/device/sentry_computer/proc/camera_mapname_update(source, value)
camera_map_name = value

/obj/item/device/sentry_computer/Move(NewLoc, direct)
..()
if(table_setup || open || on)
Expand Down Expand Up @@ -321,7 +300,7 @@

if(current == target)
current = null
update_active_camera()
SEND_SIGNAL(src, COMSIG_CAMERA_CLEAR)

/obj/item/device/sentry_computer/ui_status(mob/user, datum/ui_state/state)
. = ..()
Expand All @@ -332,15 +311,13 @@


/obj/item/device/sentry_computer/ui_close(mob/user)

// Unregister map objects
user.client.clear_map(map_name)
SEND_SIGNAL(src, COMSIG_CAMERA_UNREGISTER_UI, user)


/obj/item/device/sentry_computer/ui_static_data(mob/user)
. = list()
.["sentry_static"] = list()
.["mapRef"] = map_name
.["mapRef"] = camera_map_name
var/index = 1
for(var/sentry in paired_sentry)
var/list/sentry_holder = list()
Expand Down Expand Up @@ -396,13 +373,8 @@

/obj/item/device/sentry_computer/tgui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
update_active_camera()
if (!ui)
// Register map objects
user.client.register_map_obj(cam_background)
user.client.register_map_obj(cam_screen)
for(var/plane in cam_plane_masters)
user.client.register_map_obj(plane)
SEND_SIGNAL(src, COMSIG_CAMERA_REGISTER_UI, user)
ui = new(user, src, "SentryGunUI", name)
ui.open()

Expand All @@ -426,7 +398,12 @@
if("set-camera")
current = sentry
playsound(src, get_sfx("terminal_button"), 25, FALSE)
update_active_camera()
var/obj/structure/machinery/defenses/sentry/defense = sentry
if (defense.has_camera)
defense.set_range()
var/datum/shape/rectangle/current_bb = defense.range_bounds
SEND_SIGNAL(src, COMSIG_CAMERA_SET_AREA, current_bb.center_x, current_bb.center_y, defense.loc.z, current_bb.width, current_bb.height)

return TRUE
if("ping")
playsound(sentry, 'sound/machines/twobeep.ogg', 50, 1)
Expand All @@ -439,62 +416,8 @@
if("clear-camera")
current = null
playsound(src, get_sfx("terminal_button"), 25, FALSE)
update_active_camera()
SEND_SIGNAL(src, COMSIG_CAMERA_CLEAR)
return TRUE
if("ui-interact")
playsound(src, get_sfx("terminal_button"), 25, FALSE)
return FALSE

/**
* Set the displayed camera to the static not-connected.
*/
/obj/item/device/sentry_computer/proc/show_camera_static()
cam_screen.vis_contents.Cut()
last_camera_turf = null
cam_background.icon_state = "scanline2"
cam_background.fill_rect(1, 1, 15, 15)

/**
* Update camera settings and redraw camera on the current variable.
*/
/obj/item/device/sentry_computer/proc/update_active_camera()
// Show static if can't use the camera
if(isnull(current) || !current.has_camera || current.placed != 1)
show_camera_static()
return

// Is this camera located in or attached to a living thing, Vehicle or helmet? If so, assume the camera's loc is the living (or non) thing.
var/cam_location = current
if(isliving(current.loc) || isVehicle(current.loc))
cam_location = current.loc
else if(istype(current.loc, /obj/item/clothing/head/helmet/marine))
var/obj/item/clothing/head/helmet/marine/helmet = current.loc
cam_location = helmet.loc
// If we're not forcing an update for some reason and the cameras are in the same location,
// we don't need to update anything.
// Most security cameras will end here as they're not moving.
if(last_camera_turf == get_turf(cam_location))
return

// Cameras that get here are moving, and are likely attached to some moving atom such as cyborgs.
last_camera_turf = get_turf(cam_location)
current.set_range()
var/datum/shape/rectangle/current_bb = current.range_bounds
var/x_size = current_bb.width
var/y_size = current_bb.height
var/target = locate(current_bb.center_x, current_bb.center_y, current.loc.z)
var/list/guncamera_zone = range("[x_size]x[y_size]", target)

var/list/visible_turfs = list()

for(var/turf/visible_turf in guncamera_zone)
visible_turfs += visible_turf

var/list/bbox = get_bbox_of_atoms(visible_turfs)
var/size_x = bbox[3] - bbox[1] + 1
var/size_y = bbox[4] - bbox[2] + 1
cam_screen.icon = null
cam_screen.icon_state = "clear"
cam_screen.vis_contents = visible_turfs
cam_background.icon_state = "clear"
cam_background.fill_rect(1, 1, size_x, size_y)
Loading