diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index ff1395d971f..e0664f080e6 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -1993,7 +1993,7 @@
/turf/open/floor/plasteel,
/area/construction/mining/aux_base)
"afG" = (
-/obj/machinery/computer/camera_advanced/base_construction{
+/obj/machinery/computer/camera_advanced/base_construction/aux{
dir = 8
},
/obj/effect/turf_decal/tile/yellow,
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index f31bfb053f0..9a8627e5981 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -9853,7 +9853,7 @@
c_tag = "Auxillary Base Construction";
dir = 8
},
-/obj/machinery/computer/camera_advanced/base_construction{
+/obj/machinery/computer/camera_advanced/base_construction/aux{
dir = 8
},
/obj/effect/turf_decal/tile/yellow,
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index e8a3bc77fc5..45878c3525d 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -85899,7 +85899,7 @@
/area/security/main)
"cJk" = (
/obj/effect/turf_decal/bot,
-/obj/machinery/computer/camera_advanced/base_construction{
+/obj/machinery/computer/camera_advanced/base_construction/aux{
dir = 4
},
/obj/effect/decal/cleanable/dirt,
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 6be05b6ec73..f4bffdf5e9e 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -18275,7 +18275,7 @@
/obj/machinery/light{
dir = 8
},
-/obj/machinery/computer/camera_advanced/base_construction{
+/obj/machinery/computer/camera_advanced/base_construction/aux{
dir = 4
},
/obj/effect/turf_decal/tile/yellow{
diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm
index d47a0fb9d5c..bd7fc128f1b 100644
--- a/code/game/machinery/computer/camera_advanced.dm
+++ b/code/game/machinery/computer/camera_advanced.dm
@@ -132,7 +132,8 @@
var/mob/living/L = user
if(!eyeobj)
CreateEye()
-
+ if(!eyeobj) //Eye creation failed
+ return
if(!eyeobj.eye_initialized)
var/camera_location
var/turf/myturf = get_turf(src)
diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm
index e720efadd81..1eb38559b66 100644
--- a/code/game/objects/items/circuitboards/computer_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm
@@ -173,10 +173,20 @@
build_path = /obj/machinery/computer/auxiliary_base
/obj/item/circuitboard/computer/base_construction
- name = "circuit board (Aux Mining Base Construction Console)"
+ name = "circuit board (Generic Base Construction Console)"
icon_state = "engineering"
build_path = /obj/machinery/computer/camera_advanced/base_construction
+/obj/item/circuitboard/computer/base_construction/aux
+ name = "circuit board (Aux Mining Base Construction Console)"
+ icon_state = "engineering"
+ build_path = /obj/machinery/computer/camera_advanced/base_construction/aux
+
+/obj/item/circuitboard/computer/base_construction/centcom
+ name = "circuit board (Centcom Base Construction Console)"
+ icon_state = "engineering"
+ build_path = /obj/machinery/computer/camera_advanced/base_construction/centcom
+
/obj/item/circuitboard/computer/comm_monitor
name = "Telecommunications Monitor (Computer Board)"
icon_state = "engineering"
diff --git a/code/game/objects/structures/construction_consolse/construction_actions.dm b/code/game/objects/structures/construction_consolse/construction_actions.dm
new file mode 100644
index 00000000000..48d5a75d2ec
--- /dev/null
+++ b/code/game/objects/structures/construction_consolse/construction_actions.dm
@@ -0,0 +1,152 @@
+/datum/action/innate/camera_off/base_construction
+ name = "Log out"
+
+///Generic construction action for base [construction consoles][/obj/machinery/computer/camera_advanced/base_construction].
+/datum/action/innate/construction
+ icon_icon = 'icons/mob/actions/actions_construction.dmi'
+ ///Console's eye mob
+ var/mob/camera/ai_eye/remote/base_construction/remote_eye
+ ///Console itself
+ var/obj/machinery/computer/camera_advanced/base_construction/base_console
+ ///Is this used to build only on the station z level?
+ var/only_station_z = TRUE
+
+/datum/action/innate/construction/Activate()
+ if(!target)
+ return TRUE
+ remote_eye = owner.remote_control
+ base_console = target
+
+///Sanity check for any construction action that relies on an RCD being in the base console
+/datum/action/innate/construction/proc/check_rcd()
+ //The console must always have an RCD.
+ if(!base_console.internal_rcd)
+ CRASH("Base console is somehow missing an internal RCD!")
+
+///Check a loction to see if it is inside the aux base at the station. Camera visbility checks omitted so as to not hinder construction.
+/datum/action/innate/construction/proc/check_spot()
+ var/turf/build_target = get_turf(remote_eye)
+ var/area/build_area = get_area(build_target)
+ var/area/area_constraint = base_console.allowed_area
+ //If the console has no allowed_area var, then we're free to build wherever
+ if (!area_constraint)
+ return TRUE
+ if(!istype(build_area, area_constraint))
+ to_chat(owner, "You can only build within [area_constraint]!")
+ return FALSE
+ if(only_station_z && !is_station_level(build_target.z))
+ to_chat(owner, "[area_constraint] has launched and can no longer be modified.")
+ return FALSE
+ return TRUE
+
+/datum/action/innate/construction/build
+ name = "Build"
+ button_icon_state = "build"
+
+/datum/action/innate/construction/build/Activate()
+ if(..())
+ return
+ if(!check_spot())
+ return
+ var/turf/target_turf = get_turf(remote_eye)
+ var/atom/rcd_target = target_turf
+ //Find airlocks and other shite
+ for(var/obj/S in target_turf)
+ if(LAZYLEN(S.rcd_vals(owner,base_console.internal_rcd)))
+ rcd_target = S //If we don't break out of this loop we'll get the last placed thing
+ owner.changeNext_move(CLICK_CD_RANGE)
+ check_rcd()
+ base_console.internal_rcd.afterattack(rcd_target, owner, TRUE) //Activate the RCD and force it to work remotely!
+ playsound(target_turf, 'sound/items/deconstruct.ogg', 60, TRUE)
+
+/datum/action/innate/construction/switch_mode
+ name = "Switch Mode"
+ button_icon_state = "builder_mode"
+
+/datum/action/innate/construction/switch_mode/Activate()
+ if(..())
+ return
+ var/list/buildlist = list("Walls and Floors" = 1,"Airlocks" = 2,"Deconstruction" = 3,"Windows and Grilles" = 4)
+ var/buildmode = input("Set construction mode.", "Base Console", null) in buildlist
+ check_rcd()
+ base_console.internal_rcd.mode = buildlist[buildmode]
+ to_chat(owner, "Build mode is now [buildmode].")
+
+/datum/action/innate/construction/airlock_type
+ name = "Select Airlock Type"
+ button_icon_state = "airlock_select"
+
+/datum/action/innate/construction/airlock_type/Activate()
+ if(..())
+ return
+ check_rcd()
+ base_console.internal_rcd.change_airlock_setting()
+
+/datum/action/innate/construction/window_type
+ name = "Select Window Glass"
+ button_icon_state = "window_select"
+
+/datum/action/innate/construction/window_type/Activate()
+ if(..())
+ return
+ check_rcd()
+ base_console.internal_rcd.toggle_window_glass()
+
+///Generic action used with base construction consoles to build anything that can't be built with an RCD
+/datum/action/innate/construction/place_structure
+ name = "Place Generic Structure"
+ var/obj/structure_path
+ var/structure_name
+ var/place_sound
+
+/datum/action/innate/construction/place_structure/Activate()
+ if(..())
+ return
+ var/turf/place_turf = get_turf(remote_eye)
+ if(!base_console.structures[structure_name])
+ to_chat(owner, "[base_console] is out of [structure_name]!")
+ return
+ if(!check_spot())
+ return
+ //Can't place inside a closed turf
+ if(place_turf.density)
+ to_chat(owner, "[structure_name] may only be placed on a floor.")
+ return
+ //Can't place two dense objects inside eachother
+ if(initial(structure_path.density) && place_turf.is_blocked_turf())
+ to_chat(owner, "Location is obstructed by something. Please clear the location and try again.")
+ return
+ var/obj/placed_structure = new structure_path(place_turf)
+ base_console.structures[structure_name]--
+ var/remaining = base_console.structures[structure_name]
+ playsound(place_turf, place_sound, 50, TRUE)
+ after_place(placed_structure, remaining)
+
+///Proc to handle additional behavior after placing an object
+/datum/action/innate/construction/place_structure/proc/after_place()
+ return
+
+/datum/action/innate/construction/place_structure/fan
+ name = "Place Tiny Fan"
+ button_icon_state = "build_fan"
+ structure_name = "fans"
+ structure_path = /obj/structure/fans/tiny
+ place_sound = 'sound/machines/click.ogg'
+
+/datum/action/innate/construction/place_structure/turret/after_place(obj/placed_structure, remaining)
+ to_chat(owner, "Tiny fan placed. [remaining] fans remaining.")
+
+/datum/action/innate/construction/place_structure/turret
+ name = "Install Plasma Anti-Wildlife Turret"
+ button_icon_state = "build_turret"
+ structure_name = "turrets"
+ structure_path = /obj/machinery/porta_turret/aux_base
+ place_sound = 'sound/items/drill_use.ogg'
+
+/datum/action/innate/construction/place_structure/turret/after_place(obj/placed_structure, remaining)
+ var/obj/machinery/computer/auxiliary_base/turret_controller = locate() in get_area(placed_structure)
+ if(!turret_controller)
+ to_chat(owner, "Warning: Aux base controller not found. Turrets might not work properly.")
+ return
+ turret_controller.turrets += placed_structure
+ to_chat(owner, "You've constructed an additional turret. [remaining] turrets remaining.")
diff --git a/code/game/objects/structures/construction_consolse/construction_console.dm b/code/game/objects/structures/construction_consolse/construction_console.dm
new file mode 100644
index 00000000000..056419946da
--- /dev/null
+++ b/code/game/objects/structures/construction_consolse/construction_console.dm
@@ -0,0 +1,134 @@
+/**
+ * Camera console used to control a base building drone
+ *
+ * Using this console will put the user in control of a [base building drone][/mob/camera/ai_eye/remote/base_construction].
+ * The drone will appear somewhere within the allowed_area var, or if no area is specified, at the location of the console.area
+ * Upon interacting, the user will be granted a set of base building actions that will generally be carried out at the drone's location.
+ * To create a new base builder system, this class should be the only thing that needs to be subtyped.
+ *
+ */
+/obj/machinery/computer/camera_advanced/base_construction
+ name = "generic base construction console"
+ desc = "An industrial computer integrated with a camera-assisted rapid construction drone."
+ networks = list("ss13")
+ circuit = /obj/item/circuitboard/computer/base_construction
+ off_action = new/datum/action/innate/camera_off/base_construction
+ jump_action = null
+ icon_screen = "mining"
+ icon_keyboard = "rd_key"
+ light_color = LIGHT_COLOR_PINK
+ ///Area that the eyeobj will be constrained to. If null, eyeobj will be able to build and move anywhere.
+ var/area/allowed_area
+ ///Assoc. list ("structure_name" : count) that keeps track of the number of special structures that can't be built with an RCD, for example, tiny fans or turrets.
+ var/list/structures = list()
+ ///Internal RCD. Some construction actions rely on having this.
+ var/obj/item/construction/rcd/internal/internal_rcd
+ ///Actions given to the console user to help with base building. Actions are generally carried out at the location of the eyeobj
+ var/list/datum/action/innate/construction_actions
+
+/obj/machinery/computer/camera_advanced/base_construction/Initialize(mapload)
+ . = ..()
+ //Populate the actions list with the different action objects that will be granted to console users
+ populate_actions_list()
+ //Map spawned consoles will automatically restock their materials
+ if(mapload)
+ restock_materials()
+
+/**
+ * Fill the construction_actios list with actions
+ *
+ * Instantiate each action object that we'll be giving to users of
+ * this console, and put it in the construction actions list.
+ */
+/obj/machinery/computer/camera_advanced/base_construction/proc/populate_actions_list()
+ construction_actions = list()
+
+/**
+ * Reload materials used by the console
+ *
+ * Restocks any materials used by the base construction console.
+ * This might mean refilling the internal RCD (should it be initialized), or
+ * giving the structures list default values.
+ */
+/obj/machinery/computer/camera_advanced/base_construction/proc/restock_materials()
+ return
+
+///Find a spawn location for the eyeobj. If no allowed_area is defined, spawn ontop of the console.
+/obj/machinery/computer/camera_advanced/base_construction/proc/find_spawn_spot()
+ if (allowed_area)
+ return pick(get_area_turfs(allowed_area))
+ return get_turf(src)
+
+/obj/machinery/computer/camera_advanced/base_construction/CreateEye()
+ var/turf/spawn_spot = find_spawn_spot()
+ if (!spawn_spot)
+ return FALSE
+ eyeobj = new /mob/camera/ai_eye/remote/base_construction(spawn_spot, src)
+ eyeobj.origin = src
+ return TRUE
+
+/obj/machinery/computer/camera_advanced/base_construction/attackby(obj/item/W, mob/user, params)
+ //If we have an internal RCD, we can refill it by slapping the console with some materials
+ if(internal_rcd && (istype(W, /obj/item/rcd_ammo) || istype(W, /obj/item/stack/sheet)))
+ internal_rcd.attackby(W, user, params)
+ else
+ return ..()
+
+/obj/machinery/computer/camera_advanced/base_construction/Destroy()
+ qdel(internal_rcd)
+ return ..()
+
+///Go through every action object in the construction_action list (which should be fully initialized by now) and grant it to the user.
+/obj/machinery/computer/camera_advanced/base_construction/GrantActions(mob/living/user)
+ ..()
+ for (var/datum/action/innate/construction_action in construction_actions)
+ if(construction_action)
+ construction_action.target = src
+ construction_action.Grant(user)
+ actions += construction_action
+ //When the eye is in use, make it visible to players so they know when someone is building.
+ eyeobj.invisibility = 0
+
+/obj/machinery/computer/camera_advanced/base_construction/remove_eye_control(mob/living/user)
+ ..()
+ //Hide the eye when not in use.
+ eyeobj.invisibility = INVISIBILITY_MAXIMUM
+
+/**
+ * A mob used by [/obj/machinery/computer/camera_advanced/base_construction] for building in specific areas.
+ *
+ * Controlled by a user who is using a base construction console.
+ * The user will be granted a set of building actions by the console, and the actions will be carried out by this mob.
+ * The mob is constrained to a given area defined by the base construction console.
+ *
+ */
+/mob/camera/ai_eye/remote/base_construction
+ name = "construction holo-drone"
+ //Allows any curious crew to watch the base after it leaves. (This is safe as the base cannot be modified once it leaves)
+ move_on_shuttle = TRUE
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "construction_drone"
+ ///Reference to the camera console controlling this drone
+ var/obj/machinery/computer/camera_advanced/base_construction/linked_console
+
+/mob/camera/ai_eye/remote/base_construction/Initialize(mapload, obj/machinery/computer/camera_advanced/console_link)
+ linked_console = console_link
+ return ..()
+
+/mob/camera/ai_eye/remote/base_construction/setLoc(t)
+ var/area/curr_area = get_area(t)
+ //Only move if we're in the allowed area. If no allowed area is defined, then we're free to move wherever.
+ if(!linked_console.allowed_area || istype(curr_area, linked_console.allowed_area))
+ return ..()
+
+/mob/camera/ai_eye/remote/base_construction/relaymove(mob/living/user, direction)
+ //This camera eye is visible, and as such needs to keep it's dir updated
+ dir = direction
+ return ..()
+
+///[Base console's][/obj/machinery/computer/camera_advanced/base_construction] internal RCD. Has a large material capacity and a fast buildspeed.
+/obj/item/construction/rcd/internal
+ name = "internal RCD"
+ max_matter = 600
+ no_ammo_message = "Internal matter exhausted. Please add additional materials."
+ delay_mod = 0.5
diff --git a/code/game/objects/structures/construction_consolse/construction_console_aux.dm b/code/game/objects/structures/construction_consolse/construction_console_aux.dm
new file mode 100644
index 00000000000..16179fbb02e
--- /dev/null
+++ b/code/game/objects/structures/construction_consolse/construction_console_aux.dm
@@ -0,0 +1,36 @@
+///base consturctino console subtype for the mining aux base
+/obj/machinery/computer/camera_advanced/base_construction/aux
+ name = "aux base construction console"
+ circuit = /obj/item/circuitboard/computer/base_construction/aux
+ structures = list("fans" = 0, "turrets" = 0)
+ allowed_area = /area/shuttle/auxiliary_base
+
+/obj/machinery/computer/camera_advanced/base_construction/aux/Initialize(mapload)
+ internal_rcd = new(src)
+ return ..()
+
+/obj/machinery/computer/camera_advanced/base_construction/aux/restock_materials()
+ internal_rcd.matter = internal_rcd.max_matter
+ structures["fans"] = 4
+ structures["turrets"] = 4
+
+/obj/machinery/computer/camera_advanced/base_construction/aux/populate_actions_list()
+ construction_actions = list()
+ construction_actions.Add(new /datum/action/innate/construction/switch_mode())//Action for switching the RCD's build modes
+ construction_actions.Add(new /datum/action/innate/construction/build()) //Action for using the RCD
+ construction_actions.Add(new /datum/action/innate/construction/airlock_type()) //Action for setting the airlock type
+ construction_actions.Add(new /datum/action/innate/construction/window_type()) //Action for setting the window type
+ construction_actions.Add(new /datum/action/innate/construction/place_structure/fan()) //Action for spawning fans
+ construction_actions.Add(new /datum/action/innate/construction/place_structure/turret()) //Action for spawning turrets
+
+/obj/machinery/computer/camera_advanced/base_construction/aux/find_spawn_spot()
+ //Aux base controller. Where the eyeobj will spawn.
+ var/obj/machinery/computer/auxiliary_base/aux_controller
+ for(var/obj/machinery/computer/auxiliary_base/potential_aux_console in GLOB.machines)
+ if(istype(get_area(potential_aux_console), allowed_area))
+ aux_controller = potential_aux_console
+ break
+ if(!aux_controller)
+ say("ERROR: Unable to locate auxiliary base controller!")
+ return null
+ return aux_controller
diff --git a/code/game/objects/structures/construction_consolse/construction_console_centcom.dm b/code/game/objects/structures/construction_consolse/construction_console_centcom.dm
new file mode 100644
index 00000000000..8cab9f3379c
--- /dev/null
+++ b/code/game/objects/structures/construction_consolse/construction_console_centcom.dm
@@ -0,0 +1,16 @@
+///admin-only base consturctino console subtype for building anywhere!
+/obj/machinery/computer/camera_advanced/base_construction/centcom
+ name = "centcom base construction console"
+ circuit = /obj/item/circuitboard/computer/base_construction/centcom
+
+/obj/machinery/computer/camera_advanced/base_construction/centcom/Initialize(mapload)
+ internal_rcd = new(src)
+ return ..()
+
+/obj/machinery/computer/camera_advanced/base_construction/centcom/restock_materials()
+ internal_rcd.matter = internal_rcd.max_matter
+
+/obj/machinery/computer/camera_advanced/base_construction/centcom/populate_actions_list()
+ construction_actions = list()
+ construction_actions.Add(new /datum/action/innate/construction/switch_mode())//Action for switching the RCD's build modes
+ construction_actions.Add(new /datum/action/innate/construction/build()) //Action for using the RCD
diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm
deleted file mode 100644
index 2668becd1eb..00000000000
--- a/code/modules/mining/aux_base_camera.dm
+++ /dev/null
@@ -1,276 +0,0 @@
-//Aux base construction console
-/mob/camera/ai_eye/remote/base_construction
- name = "construction holo-drone"
- move_on_shuttle = 1 //Allows any curious crew to watch the base after it leaves. (This is safe as the base cannot be modified once it leaves)
- icon = 'icons/obj/mining.dmi'
- icon_state = "construction_drone"
- var/area/starting_area
-
-/mob/camera/ai_eye/remote/base_construction/Initialize()
- . = ..()
- starting_area = get_area(loc)
-
-/mob/camera/ai_eye/remote/base_construction/setLoc(t)
- var/area/curr_area = get_area(t)
- if(curr_area == starting_area || istype(curr_area, /area/shuttle/auxiliary_base))
- return ..()
- //While players are only allowed to build in the base area, but consoles starting outside the base can move into the base area to begin work.
-
-
-/mob/camera/ai_eye/remote/base_construction/relaymove(mob/living/user, direction)
- dir = direction //This camera eye is visible as a drone, and needs to keep the dir updated
- return ..()
-
-
-/obj/item/construction/rcd/internal //Base console's internal RCD. Roundstart consoles are filled, rebuilt cosoles start empty.
- name = "internal RCD"
- max_matter = 600 //Bigger container and faster speeds due to being specialized and stationary.
- no_ammo_message = "Internal matter exhausted. Please add additional materials."
- delay_mod = 0.5
-
-/obj/machinery/computer/camera_advanced/base_construction
- name = "base construction console"
- desc = "An industrial computer integrated with a camera-assisted rapid construction drone."
- networks = list("ss13")
- var/obj/item/construction/rcd/internal/RCD //Internal RCD. The computer passes user commands to this in order to avoid massive copypaste.
- circuit = /obj/item/circuitboard/computer/base_construction
- off_action = new/datum/action/innate/camera_off/base_construction
- jump_action = null
- var/datum/action/innate/aux_base/switch_mode/switch_mode_action = new //Action for switching the RCD's build modes
- var/datum/action/innate/aux_base/build/build_action = new //Action for using the RCD
- var/datum/action/innate/aux_base/airlock_type/airlock_mode_action = new //Action for setting the airlock type
- var/datum/action/innate/aux_base/window_type/window_action = new //Action for setting the window type
- var/datum/action/innate/aux_base/place_fan/fan_action = new //Action for spawning fans
- var/fans_remaining = 0 //Number of fans in stock.
- var/datum/action/innate/aux_base/install_turret/turret_action = new //Action for spawning turrets
- var/turret_stock = 0 //Turrets in stock
- var/obj/machinery/computer/auxiliary_base/found_aux_console //Tracker for the Aux base console, so the eye can always find it.
-
- icon_screen = "mining"
- icon_keyboard = "rd_key"
-
- light_color = LIGHT_COLOR_PINK
-
-/obj/machinery/computer/camera_advanced/base_construction/Initialize()
- . = ..()
- RCD = new(src)
-
-/obj/machinery/computer/camera_advanced/base_construction/Initialize(mapload)
- . = ..()
- if(mapload) //Map spawned consoles have a filled RCD and stocked special structures
- RCD.matter = RCD.max_matter
- fans_remaining = 4
- turret_stock = 4
-
-/obj/machinery/computer/camera_advanced/base_construction/CreateEye()
-
- var/spawn_spot
- for(var/obj/machinery/computer/auxiliary_base/ABC in GLOB.machines)
- if(istype(get_area(ABC), /area/shuttle/auxiliary_base))
- found_aux_console = ABC
- break
-
- if(found_aux_console)
- spawn_spot = found_aux_console
- else
- spawn_spot = src
-
-
- eyeobj = new /mob/camera/ai_eye/remote/base_construction(get_turf(spawn_spot))
- eyeobj.origin = src
-
-
-/obj/machinery/computer/camera_advanced/base_construction/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/rcd_ammo) || istype(W, /obj/item/stack/sheet))
- RCD.attackby(W, user, params) //If trying to feed the console more materials, pass it along to the RCD.
- else
- return ..()
-
-/obj/machinery/computer/camera_advanced/base_construction/Destroy()
- qdel(RCD)
- return ..()
-
-/obj/machinery/computer/camera_advanced/base_construction/GrantActions(mob/living/user)
- ..()
-
- if(switch_mode_action)
- switch_mode_action.target = src
- switch_mode_action.Grant(user)
- actions += switch_mode_action
-
- if(build_action)
- build_action.target = src
- build_action.Grant(user)
- actions += build_action
-
- if(airlock_mode_action)
- airlock_mode_action.target = src
- airlock_mode_action.Grant(user)
- actions += airlock_mode_action
-
- if(window_action)
- window_action.target = src
- window_action.Grant(user)
- actions += window_action
-
- if(fan_action)
- fan_action.target = src
- fan_action.Grant(user)
- actions += fan_action
-
- if(turret_action)
- turret_action.target = src
- turret_action.Grant(user)
- actions += turret_action
-
- eyeobj.invisibility = 0 //When the eye is in use, make it visible to players so they know when someone is building.
-
-/obj/machinery/computer/camera_advanced/base_construction/remove_eye_control(mob/living/user)
- ..()
- eyeobj.invisibility = INVISIBILITY_MAXIMUM //Hide the eye when not in use.
-
-/datum/action/innate/aux_base //Parent aux base action
- icon_icon = 'icons/mob/actions/actions_construction.dmi'
- var/mob/living/C //Mob using the action
- var/mob/camera/ai_eye/remote/base_construction/remote_eye //Console's eye mob
- var/obj/machinery/computer/camera_advanced/base_construction/B //Console itself
-
-/datum/action/innate/aux_base/Activate()
- if(!target)
- return TRUE
- C = owner
- remote_eye = C.remote_control
- B = target
- if(!B.RCD) //The console must always have an RCD.
- B.RCD = new /obj/item/construction/rcd/internal(src) //If the RCD is lost somehow, make a new (empty) one!
-
-/datum/action/innate/aux_base/proc/check_spot()
-//Check a loction to see if it is inside the aux base at the station. Camera visbility checks omitted so as to not hinder construction.
- var/turf/build_target = get_turf(remote_eye)
- var/area/build_area = get_area(build_target)
-
- if(!istype(build_area, /area/shuttle/auxiliary_base))
- to_chat(owner, "You can only build within the mining base!")
- return FALSE
-
- if(!is_station_level(build_target.z))
- to_chat(owner, "The mining base has launched and can no longer be modified.")
- return FALSE
-
- return TRUE
-
-/datum/action/innate/camera_off/base_construction
- name = "Log out"
-
-//*******************FUNCTIONS*******************
-
-/datum/action/innate/aux_base/build
- name = "Build"
- button_icon_state = "build"
-
-/datum/action/innate/aux_base/build/Activate()
- if(..())
- return
-
- if(!check_spot())
- return
-
- var/turf/target_turf = get_turf(remote_eye)
- var/atom/rcd_target = target_turf
-
- //Find airlocks and other shite
- for(var/obj/S in target_turf)
- if(LAZYLEN(S.rcd_vals(owner,B.RCD)))
- rcd_target = S //If we don't break out of this loop we'll get the last placed thing
-
- owner.changeNext_move(CLICK_CD_RANGE)
- B.RCD.afterattack(rcd_target, owner, TRUE) //Activate the RCD and force it to work remotely!
- playsound(target_turf, 'sound/items/deconstruct.ogg', 60, TRUE)
-
-/datum/action/innate/aux_base/switch_mode
- name = "Switch Mode"
- button_icon_state = "builder_mode"
-
-/datum/action/innate/aux_base/switch_mode/Activate()
- if(..())
- return
-
- var/list/buildlist = list("Walls and Floors" = 1,"Airlocks" = 2,"Deconstruction" = 3,"Windows and Grilles" = 4)
- var/buildmode = input("Set construction mode.", "Base Console", null) in buildlist
- B.RCD.mode = buildlist[buildmode]
- to_chat(owner, "Build mode is now [buildmode].")
-
-/datum/action/innate/aux_base/airlock_type
- name = "Select Airlock Type"
- button_icon_state = "airlock_select"
-
-/datum/action/innate/aux_base/airlock_type/Activate()
- if(..())
- return
-
- B.RCD.change_airlock_setting()
-
-
-/datum/action/innate/aux_base/window_type
- name = "Select Window Glass"
- button_icon_state = "window_select"
-
-/datum/action/innate/aux_base/window_type/Activate()
- if(..())
- return
- B.RCD.toggle_window_glass()
-
-/datum/action/innate/aux_base/place_fan
- name = "Place Tiny Fan"
- button_icon_state = "build_fan"
-
-/datum/action/innate/aux_base/place_fan/Activate()
- if(..())
- return
-
- var/turf/fan_turf = get_turf(remote_eye)
-
- if(!B.fans_remaining)
- to_chat(owner, "[B] is out of fans!")
- return
-
- if(!check_spot())
- return
-
- if(fan_turf.density)
- to_chat(owner, "Fans may only be placed on a floor.")
- return
-
- new /obj/structure/fans/tiny(fan_turf)
- B.fans_remaining--
- to_chat(owner, "Tiny fan placed. [B.fans_remaining] remaining.")
- playsound(fan_turf, 'sound/machines/click.ogg', 50, TRUE)
-
-/datum/action/innate/aux_base/install_turret
- name = "Install Plasma Anti-Wildlife Turret"
- button_icon_state = "build_turret"
-
-/datum/action/innate/aux_base/install_turret/Activate()
- if(..())
- return
-
- if(!check_spot())
- return
-
- if(!B.turret_stock)
- to_chat(owner, "Unable to construct additional turrets.")
- return
-
- var/turf/turret_turf = get_turf(remote_eye)
-
- if(turret_turf.is_blocked_turf())
- to_chat(owner, "Location is obstructed by something. Please clear the location and try again.")
- return
-
- var/obj/machinery/porta_turret/aux_base/T = new /obj/machinery/porta_turret/aux_base(turret_turf)
- if(B.found_aux_console)
- B.found_aux_console.turrets += T //Add new turret to the console's control
-
- B.turret_stock--
- to_chat(owner, "Turret installation complete!")
- playsound(turret_turf, 'sound/items/drill_use.ogg', 65, TRUE)
diff --git a/tgstation.dme b/tgstation.dme
index b03a47a0761..91b9fc19ae1 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1285,6 +1285,10 @@
#include "code\game\objects\structures\beds_chairs\chair.dm"
#include "code\game\objects\structures\beds_chairs\pew.dm"
#include "code\game\objects\structures\beds_chairs\sofa.dm"
+#include "code\game\objects\structures\construction_consolse\construction_actions.dm"
+#include "code\game\objects\structures\construction_consolse\construction_console.dm"
+#include "code\game\objects\structures\construction_consolse\construction_console_aux.dm"
+#include "code\game\objects\structures\construction_consolse\construction_console_centcom.dm"
#include "code\game\objects\structures\crates_lockers\closets.dm"
#include "code\game\objects\structures\crates_lockers\crates.dm"
#include "code\game\objects\structures\crates_lockers\closets\bodybag.dm"
@@ -2210,7 +2214,6 @@
#include "code\modules\mapping\space_management\zlevel_manager.dm"
#include "code\modules\mining\abandoned_crates.dm"
#include "code\modules\mining\aux_base.dm"
-#include "code\modules\mining\aux_base_camera.dm"
#include "code\modules\mining\fulton.dm"
#include "code\modules\mining\machine_processing.dm"
#include "code\modules\mining\machine_redemption.dm"