diff --git a/code/__DEFINES/inventory/accessories.dm b/code/__DEFINES/inventory/accessories.dm
index 36528fdb095..c19ae8a4d49 100644
--- a/code/__DEFINES/inventory/accessories.dm
+++ b/code/__DEFINES/inventory/accessories.dm
@@ -13,5 +13,6 @@
#define ACCESSORY_SLOT_ARMOR_S 0x1000
#define ACCESSORY_SLOT_ARMOR_M 0x2000
#define ACCESSORY_SLOT_HELM_C 0x4000
+#define ACCESSORY_SLOT_HELM_R 0x8000
#define ACCESSORY_SLOT_TORSO (ACCESSORY_SLOT_UTILITY|ACCESSORY_SLOT_WEAPON)
diff --git a/code/__DEFINES/machinery.dm b/code/__DEFINES/machinery.dm
index 209e432b011..97c31383a26 100644
--- a/code/__DEFINES/machinery.dm
+++ b/code/__DEFINES/machinery.dm
@@ -83,6 +83,8 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called manu
#define NETWORK_OUTSIDE "Outside"
#define NETWORK_EXPLORATION "Exploration"
#define NETWORK_XENOBIO "Xenobiology"
+#define NETWORK_CIV_HELMETS "Public Helmets"
+#define NETWORK_SEC_HELMETS "Security Helmets"
#define NETWORK_EXPLO_HELMETS "Exploration Helmets"
//! Off Station Camera Networks
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 205e938419d..818c695a115 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -2,8 +2,8 @@
name = "helmet"
desc = "Standard headgear. Protects well enough against a wide range of attacks."
icon_state = "helmet"
- valid_accessory_slots = (ACCESSORY_SLOT_HELM_C)
- restricted_accessory_slots = (ACCESSORY_SLOT_HELM_C)
+ valid_accessory_slots = ACCESSORY_SLOT_HELM_C|ACCESSORY_SLOT_HELM_R
+ restricted_accessory_slots = ACCESSORY_SLOT_HELM_C|ACCESSORY_SLOT_HELM_R
clothing_flags = THICKMATERIAL
armor_type = /datum/armor/station/medium
inv_hide_flags = HIDEEARS|BLOCKHEADHAIR
@@ -26,7 +26,7 @@
desc = "A helmet painted in Peacekeeper blue. Stands out like a sore thumb."
icon_state = "helmet_sol"
armor_type = /datum/armor/oricon/peacekeeper
- valid_accessory_slots = null
+ valid_accessory_slots = ACCESSORY_SLOT_HELM_R
/obj/item/clothing/head/helmet/oricon/command
name = "command helmet"
@@ -61,7 +61,7 @@
armor_type = /datum/armor/station/riot
item_state_slots = list(SLOT_ID_RIGHT_HAND = "swat", SLOT_ID_LEFT_HAND = "swat")
siemens_coefficient = 0.5
- valid_accessory_slots = null
+ valid_accessory_slots = ACCESSORY_SLOT_HELM_R
action_button_name = "Toggle Visor"
/obj/item/clothing/head/helmet/riot/attack_self(mob/user)
@@ -83,7 +83,7 @@
item_state_slots = list(SLOT_ID_RIGHT_HAND = "helmet", SLOT_ID_LEFT_HAND = "helmet")
armor_type = /datum/armor/station/ablative
siemens_coefficient = 0.2
- valid_accessory_slots = null
+ valid_accessory_slots = ACCESSORY_SLOT_HELM_R
/obj/item/clothing/head/helmet/ballistic
name = "ballistic helmet"
@@ -92,7 +92,7 @@
item_state_slots = list(SLOT_ID_RIGHT_HAND = "helmet", SLOT_ID_LEFT_HAND = "helmet")
armor_type = /datum/armor/station/ballistic
siemens_coefficient = 0.7
- valid_accessory_slots = null
+ valid_accessory_slots = ACCESSORY_SLOT_HELM_R
/obj/item/clothing/head/helmet/combat
name = "combat helmet"
@@ -102,7 +102,7 @@
armor_type = /datum/armor/station/combat
inv_hide_flags = HIDEEARS|HIDEEYES|BLOCKHEADHAIR
siemens_coefficient = 0.6
- valid_accessory_slots = null
+ valid_accessory_slots = ACCESSORY_SLOT_HELM_R
/obj/item/clothing/head/helmet/redcombat
name = "combat helmet"
@@ -185,7 +185,7 @@
armor_type = /datum/armor/station/tactical
inv_hide_flags = HIDEEARS|BLOCKHAIR
siemens_coefficient = 0.7
- valid_accessory_slots = null
+ valid_accessory_slots = ACCESSORY_SLOT_HELM_R
/obj/item/clothing/head/helmet/augment
name = "Augment Array"
@@ -232,7 +232,7 @@
icon_state = "erthelmet_cmd"
item_state_slots = list(SLOT_ID_RIGHT_HAND = "syndicate-helm-green", SLOT_ID_LEFT_HAND = "syndicate-helm-green")
armor_type = /datum/armor/centcom/ert
- valid_accessory_slots = null
+ valid_accessory_slots = ACCESSORY_SLOT_HELM_R
//Commander
/obj/item/clothing/head/helmet/ert/command
diff --git a/code/modules/clothing/spacesuits/void/station.dm b/code/modules/clothing/spacesuits/void/station.dm
index 05adf8a2ead..007848b460a 100644
--- a/code/modules/clothing/spacesuits/void/station.dm
+++ b/code/modules/clothing/spacesuits/void/station.dm
@@ -193,6 +193,7 @@
armor_type = /datum/armor/station/secsuit
siemens_coefficient = 0.7
light_overlay = "helmet_light_dual"
+ camera_networks = list(NETWORK_SEC_HELMETS)
/obj/item/clothing/suit/space/void/security
name = "security voidsuit"
@@ -380,6 +381,7 @@
name = "head of security protosuit helmet"
icon_state = "hosproto"
armor_type = /datum/armor/security/hos/space
+ camera_networks = list(NETWORK_SEC_HELMETS)
/obj/item/clothing/suit/space/void/headofsecurity
desc = "A customized security voidsuit. Has additional composite armor."
diff --git a/code/modules/clothing/under/accessories/armor.dm b/code/modules/clothing/under/accessories/armor.dm
index f71c2f837a9..227fc4aebe5 100644
--- a/code/modules/clothing/under/accessories/armor.dm
+++ b/code/modules/clothing/under/accessories/armor.dm
@@ -440,6 +440,70 @@
desc = "A fabric cover for armored helmets. This one has SAARE's colors."
icon_state = "helmcover_saare"
+/////////////////
+//Helmet Cameras
+/////////////////
+
+/obj/item/clothing/accessory/armor/helmetcamera
+ name = "helmet camera"
+ desc = "A small camera that attaches to helmets."
+ icon_override = 'icons/mob/clothing/ties.dmi'
+ icon = 'icons/obj/clothing/modular_armor.dmi'
+ icon_state = "helmcam"
+ slot = ACCESSORY_SLOT_HELM_R
+ var/obj/machinery/camera/camera
+ var/list/camera_networks
+ camera_networks = list(NETWORK_CIV_HELMETS)
+
+
+/obj/item/clothing/accessory/armor/helmetcamera/attack_self(mob/user)
+ . = ..()
+ if(.)
+ return
+ if(camera_networks)
+ if(!camera)
+ camera = new /obj/machinery/camera(src)
+ camera.replace_networks(camera_networks)
+ camera.set_status(FALSE) //So the camera will activate in the following check.
+
+ if(camera.status == TRUE)
+ camera.set_status(FALSE)
+ to_chat(usr, "Camera deactivated.")
+ else
+ camera.set_status(TRUE)
+ camera.c_tag = usr.name
+ to_chat(usr, "User scanned as [camera.c_tag]. Camera activated.")
+ else
+ to_chat(usr, "This object does not have a camera.") //Shouldnt ever be visible for helmet cams.
+ return
+
+/obj/item/clothing/accessory/armor/helmetcamera/examine(mob/user)
+ . = ..()
+ if(camera_networks && get_dist(user,src) <= 1)
+ . += "The [camera ? "" : "in"]active."
+
+/obj/item/clothing/accessory/armor/helmetcamera/body
+ name = "body camera"
+ desc = "A small camera that attaches to most uniforms."
+ icon_override = 'icons/mob/clothing/ties.dmi'
+ icon = 'icons/obj/clothing/modular_armor.dmi'
+ icon_state = "helmcam_body"
+ slot = ACCESSORY_SLOT_DECOR
+ camera_networks = list(NETWORK_CIV_HELMETS)
+
+/obj/item/clothing/accessory/armor/helmetcamera/security
+ name = "\improper Security helmet camera"
+ desc = "A small camera that attaches to helmets. This one has its feed restricted to Security."
+ icon_state = "helmcam_sec"
+ camera_networks = list(NETWORK_SEC_HELMETS)
+
+/obj/item/clothing/accessory/armor/helmetcamera/exploration
+ name = "\improper Exploration helmet camera"
+ desc = "A small camera that attaches to helmets. This one has its feed restricted to Exploration."
+ icon_state = "helmcam_explo"
+ camera_networks = list(NETWORK_EXPLO_HELMETS)
+
+
//Lightweight Limb Plating - These are incompatible with plate carriers.
//Debug variant
diff --git a/code/modules/modular_computers/computers/subtypes/preset_laptop.dm b/code/modules/modular_computers/computers/subtypes/preset_laptop.dm
index 079a8a0b9d6..7e2351e67d8 100644
--- a/code/modules/modular_computers/computers/subtypes/preset_laptop.dm
+++ b/code/modules/modular_computers/computers/subtypes/preset_laptop.dm
@@ -64,3 +64,37 @@
card_slot = new/obj/item/computer_hardware/card_slot(src)
battery_module = new/obj/item/computer_hardware/battery_module/super(src)
battery_module.charge_to_full()
+
+///////
+//Roles
+///////
+
+/obj/item/modular_computer/laptop/preset/custom_loadout/standard/security
+ name = "\improper Security Officer's laptop"
+
+/obj/item/modular_computer/laptop/preset/custom_loadout/standard/security/install_default_programs()
+ ..()
+ hard_drive.store_file(new/datum/computer_file/program/camera_monitor())
+ hard_drive.store_file(new/datum/computer_file/program/camera_monitor/sechelmet())
+ hard_drive.store_file(new/datum/computer_file/program/digitalwarrant())
+
+/obj/item/modular_computer/laptop/preset/custom_loadout/standard/security/warden
+ name = "\improper Warden's laptop"
+
+/obj/item/modular_computer/laptop/preset/custom_loadout/standard/security/warden/install_default_programs()
+ ..()
+ //hard_drive.store_file(new/datum/computer_file/program/warden()) This will hopefully have a working alert level shifter program that only has access to green, blue, and yellow.
+
+/obj/item/modular_computer/laptop/preset/custom_loadout/standard/security/hos
+ name = "\improper Head of Security's laptop"
+
+/obj/item/modular_computer/laptop/preset/custom_loadout/standard/security/hos/install_default_programs()
+ ..()
+ hard_drive.store_file(new/datum/computer_file/program/comm())
+
+/obj/item/modular_computer/laptop/preset/custom_loadout/standard/pathfinder
+ name = "\improper Pathfinder's laptop"
+
+/obj/item/modular_computer/laptop/preset/custom_loadout/standard/pathfinder/install_default_programs()
+ ..()
+ hard_drive.store_file(new/datum/computer_file/program/camera_monitor/explohelmet())
diff --git a/code/modules/modular_computers/file_system/programs/generic/camera.dm b/code/modules/modular_computers/file_system/programs/generic/camera.dm
index 1dc18affcfb..b8db705ac9b 100644
--- a/code/modules/modular_computers/file_system/programs/generic/camera.dm
+++ b/code/modules/modular_computers/file_system/programs/generic/camera.dm
@@ -41,3 +41,42 @@
size = 14
tguimodule_path = /datum/tgui_module_old/camera/ntos/ert
available_on_ntnet = 0
+
+//Helmet Cameras
+/datum/computer_file/program/camera_monitor/helmet
+ filename = "helmetcammon"
+ filedesc = "Helmet Camera Monitoring"
+ tguimodule_path = /datum/tgui_module_old/camera/ntos/helmet
+ program_icon_state = "cameras"
+ program_key_state = "generic_key"
+ program_menu_icon = "search"
+ extended_desc = "This program allows remote access to all civilian helmet cameras."
+ size = 8
+ available_on_ntnet = 1
+ requires_ntnet = 1
+
+/datum/computer_file/program/camera_monitor/sechelmet
+ filename = "sechelmetcammon"
+ filedesc = "Security Helmet Camera Monitoring"
+ tguimodule_path = /datum/tgui_module_old/camera/ntos/security_helmet
+ program_icon_state = "cameras"
+ program_key_state = "generic_key"
+ program_menu_icon = "search"
+ extended_desc = "This program allows remote access to all civilian helmet cameras. This camera network requires Security clearance."
+ size = 8
+ available_on_ntnet = 1
+ requires_ntnet = 1
+ required_access = ACCESS_SECURITY_EQUIPMENT
+
+/datum/computer_file/program/camera_monitor/explohelmet
+ filename = "explohelmetcammon"
+ filedesc = "Exploration Helmet Camera Monitoring"
+ tguimodule_path = /datum/tgui_module_old/camera/ntos/exploration_helmet
+ program_icon_state = "cameras"
+ program_key_state = "generic_key"
+ program_menu_icon = "search"
+ extended_desc = "This program allows remote access to all civilian helmet cameras. This camera network requires Exploration clearance."
+ size = 8
+ available_on_ntnet = 1
+ requires_ntnet = 1
+ required_access = ACCESS_GENERAL_EXPLORER
diff --git a/code/modules/tgui/modules/camera.dm b/code/modules/tgui/modules/camera.dm
index f3397a72bb1..08f100bf7aa 100644
--- a/code/modules/tgui/modules/camera.dm
+++ b/code/modules/tgui/modules/camera.dm
@@ -296,3 +296,21 @@
/datum/tgui_module_old/camera/ntos/hacked/New(host)
. = ..(host, GLOB.using_map.station_networks.Copy())
+
+//Crew Helmet Cams
+/datum/tgui_module_old/camera/ntos/helmet
+ name = "Public Helmet Camera Monitor"
+
+/datum/tgui_module_old/camera/ntos/helmet/New(host)
+ . = ..(host, list(NETWORK_CIV_HELMETS))
+/datum/tgui_module_old/camera/ntos/security_helmet
+ name = "Security Helmet Camera Monitor"
+
+/datum/tgui_module_old/camera/ntos/security_helmet/New(host)
+ . = ..(host, list(NETWORK_SEC_HELMETS))
+
+/datum/tgui_module_old/camera/ntos/exploration_helmet
+ name = "Exploration Helmet Camera Monitor"
+
+/datum/tgui_module_old/camera/ntos/exploration_helmet/New(host)
+ . = ..(host, list(NETWORK_EXPLO_HELMETS))
diff --git a/icons/mob/clothing/ties.dmi b/icons/mob/clothing/ties.dmi
index c2d53425c0b..e2e8dc6616a 100644
Binary files a/icons/mob/clothing/ties.dmi and b/icons/mob/clothing/ties.dmi differ
diff --git a/icons/obj/clothing/Sprite-0002.dmi b/icons/obj/clothing/Sprite-0002.dmi
new file mode 100644
index 00000000000..948401a6185
Binary files /dev/null and b/icons/obj/clothing/Sprite-0002.dmi differ
diff --git a/icons/obj/clothing/modular_armor.dmi b/icons/obj/clothing/modular_armor.dmi
index 79857a61fc1..f3003f37db6 100644
Binary files a/icons/obj/clothing/modular_armor.dmi and b/icons/obj/clothing/modular_armor.dmi differ
diff --git a/maps/map_files/rift/rift-05-surface2.dmm b/maps/map_files/rift/rift-05-surface2.dmm
index 753b7a9b83e..80f4a203839 100644
--- a/maps/map_files/rift/rift-05-surface2.dmm
+++ b/maps/map_files/rift/rift-05-surface2.dmm
@@ -13379,9 +13379,6 @@
/obj/structure/cable/green{
icon_state = "1-4"
},
-/obj/machinery/light{
- dir = 1
- },
/turf/simulated/floor/wood,
/area/crew_quarters/sleep/Dorm_5)
"iqx" = (
diff --git a/maps/rift/rift_defines.dm b/maps/rift/rift_defines.dm
index 408e1715f13..9fa6cc79a9b 100644
--- a/maps/rift/rift_defines.dm
+++ b/maps/rift/rift_defines.dm
@@ -129,7 +129,6 @@
NETWORK_SECURITY,
NETWORK_TCOMMS,
NETWORK_LYTHIOS,
- NETWORK_EXPLO_HELMETS
)
secondary_networks = list(
NETWORK_ERT,
@@ -140,7 +139,10 @@
NETWORK_ALARM_POWER,
NETWORK_ALARM_FIRE,
NETWORK_TALON_HELMETS,
- NETWORK_TALON_SHIP
+ NETWORK_TALON_SHIP,
+ NETWORK_CIV_HELMETS,
+ NETWORK_EXPLO_HELMETS,
+ NETWORK_SEC_HELMETS
)
bot_patrolling = FALSE