diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 3179e7c2d1..2d40396d91 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -415,6 +415,8 @@
desc = "It's an extra resilient airlock intended for spacefaring vessels."
icon = 'icons/obj/doors/shuttledoors.dmi'
explosion_resistance = 20
+ opacity = 0
+ glass = 1
assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft
// Airlock opens from top-bottom instead of left-right.
diff --git a/code/modules/clothing/head/pilot_helmet.dm b/code/modules/clothing/head/pilot_helmet.dm
new file mode 100644
index 0000000000..feb60ae3a3
--- /dev/null
+++ b/code/modules/clothing/head/pilot_helmet.dm
@@ -0,0 +1,201 @@
+//Pilot
+
+/obj/item/clothing/head/pilot
+ name = "pilot helmet"
+ desc = "Standard pilot gear. Protects the head from impacts."
+ icon_state = "pilot_helmet1"
+ item_icons = list(slot_head_str = 'icons/mob/pilot_helmet.dmi')
+ sprite_sheets = list(
+ SPECIES_TESHARI = 'icons/mob/species/seromi/pilot_helmet.dmi'
+ )
+ flags = THICKMATERIAL
+ armor = list(melee = 20, bullet = 10, laser = 10, energy = 5, bomb = 10, bio = 0, rad = 0)
+ flags_inv = HIDEEARS
+ cold_protection = HEAD
+ min_cold_protection_temperature = HELMET_MIN_COLD_PROTECTION_TEMPERATURE
+ heat_protection = HEAD
+ max_heat_protection_temperature = HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
+ w_class = ITEMSIZE_NORMAL
+
+ var/obj/machinery/computer/shuttle_control/web/shuttle_comp
+ var/obj/screen/pilot_hud
+ var/list/images
+ var/list/raw_images
+ var/last_status
+
+/obj/item/clothing/head/pilot/initialize()
+ . = ..()
+
+ images = list()
+ raw_images = list()
+
+ pilot_hud = new(src)
+ pilot_hud.screen_loc = "1,1"
+ pilot_hud.icon = 'icons/obj/piloting_overlay.dmi'
+ pilot_hud.icon_state = "dimmer"
+ pilot_hud.layer = SCREEN_LAYER
+ pilot_hud.plane = PLANE_FULLSCREEN
+ pilot_hud.mouse_opacity = 0
+ pilot_hud.alpha = 0
+
+ var/image/I
+ I = image(pilot_hud.icon,pilot_hud,"top_bar",layer=SCREEN_LAYER+1)
+ I.appearance_flags = RESET_ALPHA
+ I.alpha = 145
+ images["top_bar"] = I
+ raw_images += I
+
+ I = image(pilot_hud.icon,pilot_hud,"top_dots",layer=SCREEN_LAYER+1)
+ I.appearance_flags = RESET_ALPHA
+ I.alpha = 200
+ images["topdots"] = I
+ raw_images += I
+
+ I = image(pilot_hud.icon,pilot_hud,"words_discon",layer=SCREEN_LAYER+1) //words_standby, words_flying, words_spool, words_discon
+ I.appearance_flags = RESET_ALPHA
+ I.alpha = 200
+ images["top_words"] = I
+ raw_images += I
+
+ I = image(pilot_hud.icon,pilot_hud,"",layer=SCREEN_LAYER+1)
+ I.appearance_flags = RESET_ALPHA
+ I.alpha = 200
+ images["charging"] = I
+ raw_images += I
+
+ I = image(pilot_hud.icon,pilot_hud,"left_bar",layer=SCREEN_LAYER+1)
+ I.appearance_flags = RESET_ALPHA
+ I.alpha = 0
+ images["left_bar"] = I
+ raw_images += I
+
+ I = image(pilot_hud.icon,pilot_hud,"right_bar",layer=SCREEN_LAYER+1)
+ I.appearance_flags = RESET_ALPHA
+ I.alpha = 0
+ images["right_bar"] = I
+ raw_images += I
+
+ I = image(pilot_hud.icon,pilot_hud,"flyboxes",layer=SCREEN_LAYER+1)
+ I.appearance_flags = RESET_ALPHA
+ I.alpha = 0
+ images["flyboxes"] = I
+ raw_images += I
+
+ I = image(pilot_hud.icon,pilot_hud,"horizon",layer=SCREEN_LAYER+1)
+ I.appearance_flags = RESET_ALPHA
+ I.alpha = 0
+ images["horizon"] = I
+ raw_images += I
+
+/obj/item/clothing/head/pilot/proc/update_hud(var/status)
+ if(last_status == status)
+ return
+
+ last_status = status
+
+ if(status == SHUTTLE_INTRANSIT)
+ var/image/I = images["top_words"]
+ I.icon_state = "words_flying"
+ I = images["left_bar"]
+ I.alpha = 200
+ I = images["right_bar"]
+ I.alpha = 200
+ I = images["flyboxes"]
+ I.alpha = 200
+ I = images["horizon"]
+ I.alpha = 200
+ I = images["charging"]
+ I.icon_state = ""
+ animate(pilot_hud,alpha=255,time=3 SECONDS)
+
+ else if(status == SHUTTLE_IDLE)
+ var/image/I = images["top_words"]
+ I.icon_state = "words_standby"
+ I = images["left_bar"]
+ I.alpha = 0
+ I = images["right_bar"]
+ I.alpha = 0
+ I = images["flyboxes"]
+ I.alpha = 0
+ I = images["horizon"]
+ I.alpha = 0
+ I = images["charging"]
+ I.icon_state = ""
+ animate(pilot_hud,alpha=0,time=3 SECONDS)
+
+ else if(status == SHUTTLE_WARMUP)
+ var/image/I = images["top_words"]
+ I.icon_state = "words_spool"
+ I = images["left_bar"]
+ I.alpha = 200
+ I = images["right_bar"]
+ I.alpha = 200
+ I = images["flyboxes"]
+ I.alpha = 0
+ I = images["horizon"]
+ I.alpha = 0
+ I = images["charging"]
+ I.icon_state = "charging"
+ animate(pilot_hud,alpha=255,time=3 SECONDS)
+
+ else if(status == "discon")
+ var/image/I = images["top_words"]
+ I.icon_state = "words_discon"
+ I = images["left_bar"]
+ I.alpha = 0
+ I = images["right_bar"]
+ I.alpha = 0
+ I = images["flyboxes"]
+ I.alpha = 0
+ I = images["horizon"]
+ I.alpha = 0
+ I = images["charging"]
+ I.icon_state = ""
+ animate(pilot_hud,alpha=0,time=3 SECONDS)
+
+/obj/item/clothing/head/pilot/verb/hud_colors()
+ set name = "Alter HUD color"
+ set desc = "Change the color of the piloting HUD."
+ set category = "Object"
+ set src in usr
+
+ var/newcolor = input(usr,"Pick a color!","HUD Color") as null|color
+ if(newcolor)
+ for(var/img in list("top_words","left_bar","right_bar","flyboxes"))
+ var/image/I = images[img]
+ I.color = newcolor
+
+/obj/item/clothing/head/pilot/Destroy()
+ for(var/img in raw_images)
+ var/image/I = img
+ I.loc = null
+ shuttle_comp = null
+ qdel(pilot_hud)
+ return ..()
+
+/obj/item/clothing/head/pilot/equipped(var/mob/user,var/slot)
+ . = ..()
+ if(slot == slot_head && user.client)
+ user.client.screen |= pilot_hud
+ user.client.images |= raw_images
+
+/obj/item/clothing/head/pilot/dropped(var/mob/user)
+ . = ..()
+ if(user.client)
+ user.client.screen -= pilot_hud
+ user.client.images -= raw_images
+
+/obj/item/clothing/head/pilot/alt
+ name = "pilot helmet"
+ desc = "Standard pilot gear. Protects the head from impacts. This one has a retractable visor"
+ icon_state = "pilot_helmet2"
+ action_button_name = "Toggle Visor"
+
+/obj/item/clothing/head/pilot/alt/attack_self(mob/user as mob)
+ if(src.icon_state == initial(icon_state))
+ src.icon_state = "[icon_state]up"
+ user << "You raise the visor on the pilot helmet."
+ else
+ src.icon_state = initial(icon_state)
+ user << "You lower the visor on the pilot helmet."
+ update_clothing_icon() //so our mob-overlays update
\ No newline at end of file
diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm
index 618ec3ff05..ed90e66c6a 100644
--- a/code/modules/shuttles/shuttle.dm
+++ b/code/modules/shuttles/shuttle.dm
@@ -90,7 +90,7 @@
make_sounds(origin, HYPERSPACE_END)
return //someone cancelled the launch
- on_shuttle_departure()
+ on_shuttle_departure(origin)
moving_status = SHUTTLE_INTRANSIT //shouldn't matter but just to be safe
move(origin, destination)
@@ -127,10 +127,10 @@
depart_time = world.time
- on_shuttle_departure(departing)
-
moving_status = SHUTTLE_INTRANSIT
+ on_shuttle_departure(departing)
+
move(departing, interim, direction)
interim.shuttle_arrived()
diff --git a/code/modules/shuttles/shuttles_web.dm b/code/modules/shuttles/shuttles_web.dm
index a8ca493470..90e5141535 100644
--- a/code/modules/shuttles/shuttles_web.dm
+++ b/code/modules/shuttles/shuttles_web.dm
@@ -16,6 +16,7 @@
var/autopilot_first_delay = null // If your want your shuttle to stay for a different amount of time for the first time, set this.
var/can_rename = TRUE // Lets the pilot rename the shuttle. Only available once.
category = /datum/shuttle/web_shuttle
+ var/list/obj/item/clothing/head/pilot/helmets
/datum/shuttle/web_shuttle/New()
current_area = locate(current_area)
@@ -27,10 +28,12 @@
autopilot_delay = autopilot_first_delay
if(!visible_name)
visible_name = name
+ helmets = list()
..()
/datum/shuttle/web_shuttle/Destroy()
qdel(web_master)
+ helmets.Cut()
return ..()
@@ -42,16 +45,30 @@
..()
last_move = world.time
+/datum/shuttle/web_shuttle/short_jump()
+ . = ..()
+ update_helmets()
+
+/datum/shuttle/web_shuttle/long_jump()
+ . = ..()
+ update_helmets()
+
/datum/shuttle/web_shuttle/on_shuttle_departure()
+ . = ..()
web_master.on_shuttle_departure()
+ update_helmets()
/datum/shuttle/web_shuttle/on_shuttle_arrival()
+ . = ..()
web_master.on_shuttle_arrival()
+ update_helmets()
/datum/shuttle/web_shuttle/proc/build_destinations()
return
/datum/shuttle/web_shuttle/process()
+ update_helmets()
+
if(moving_status == SHUTTLE_IDLE)
if(web_master.autopath) // We're currently flying a path.
autopilot_say("Continuing route.")
@@ -92,6 +109,20 @@
autopilot_say("Taking off.")
web_master.process_autopath()
+/datum/shuttle/web_shuttle/proc/update_helmets()
+ for(var/helm in helmets)
+ if(!helm)
+ helmets -= helm
+ continue
+ var/obj/item/clothing/head/pilot/H = helm
+ if(!H.shuttle_comp || get_area(H.shuttle_comp) != get_area(H))
+ H.shuttle_comp = null
+ H.audible_message("\The [H] pings as it loses it's connection with the ship.")
+ H.update_hud("discon")
+ helmets -= H
+ else
+ H.update_hud(moving_status)
+
/datum/shuttle/web_shuttle/proc/adjust_autopilot(on)
if(on)
if(autopilot)
@@ -154,6 +185,19 @@
for(var/lost in find_sensors)
log_debug("[my_area] shuttle computer couldn't find [lost] sensor!")
+/obj/machinery/computer/shuttle_control/web/attackby(obj/I, mob/user)
+ var/datum/shuttle/web_shuttle/shuttle = shuttle_controller.shuttles[shuttle_tag]
+ if(shuttle && istype(I,/obj/item/clothing/head/pilot))
+ var/obj/item/clothing/head/pilot/H = I
+ H.shuttle_comp = src
+ shuttle.helmets |= I
+ to_chat(user,"You register the helmet with the ship's console.")
+ shuttle.update_helmets()
+ return
+
+ return ..()
+
+
// Fairly copypasta-y.
/obj/machinery/computer/shuttle_control/web/attack_hand(mob/user)
if(..(user))
diff --git a/maps/southern_cross/icons/mob/sc_head.dmi b/icons/mob/pilot_helmet.dmi
similarity index 100%
rename from maps/southern_cross/icons/mob/sc_head.dmi
rename to icons/mob/pilot_helmet.dmi
diff --git a/maps/southern_cross/icons/mob/species/teshari/sc_head.dmi b/icons/mob/species/seromi/pilot_helmet.dmi
similarity index 100%
rename from maps/southern_cross/icons/mob/species/teshari/sc_head.dmi
rename to icons/mob/species/seromi/pilot_helmet.dmi
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 70594a801a..a0c2983ea7 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/piloting_overlay.dmi b/icons/obj/piloting_overlay.dmi
new file mode 100644
index 0000000000..56074a5004
Binary files /dev/null and b/icons/obj/piloting_overlay.dmi differ
diff --git a/maps/southern_cross/items/clothing/sc_head.dm b/maps/southern_cross/items/clothing/sc_head.dm
deleted file mode 100644
index bcc1c98965..0000000000
--- a/maps/southern_cross/items/clothing/sc_head.dm
+++ /dev/null
@@ -1,37 +0,0 @@
-//Pilot
-
-/obj/item/clothing/head/pilot
- name = "pilot helmet"
- desc = "Standard pilot gear. Protects the head from impacts."
- icon_state = "pilot_helmet1"
- item_icons = list(slot_head_str = 'maps/southern_cross/icons/mob/sc_head.dmi')
- icon = 'maps/southern_cross/icons/obj/sc_hats.dmi'
- sprite_sheets = list(
- "Teshari" = 'maps/southern_cross/icons/mob/species/teshari/sc_head.dmi'
- )
- flags = THICKMATERIAL
- armor = list(melee = 20, bullet = 10, laser = 10, energy = 5, bomb = 10, bio = 0, rad = 0)
- flags_inv = HIDEEARS
- cold_protection = HEAD
- min_cold_protection_temperature = HELMET_MIN_COLD_PROTECTION_TEMPERATURE
- heat_protection = HEAD
- max_heat_protection_temperature = HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
- w_class = ITEMSIZE_NORMAL
-
-/obj/item/clothing/head/pilot/alt
- name = "pilot helmet"
- desc = "Standard pilot gear. Protects the head from impacts. This one has a retractable visor"
- icon_state = "pilot_helmet2"
- sprite_sheets = list(
- "Teshari" = 'maps/southern_cross/icons/mob/species/teshari/sc_head.dmi'
- )
- action_button_name = "Toggle Visor"
-
-/obj/item/clothing/head/pilot/alt/attack_self(mob/user as mob)
- if(src.icon_state == initial(icon_state))
- src.icon_state = "[icon_state]up"
- user << "You raise the visor on the pilot helmet."
- else
- src.icon_state = initial(icon_state)
- user << "You lower the visor on the pilot helmet."
- update_clothing_icon() //so our mob-overlays update
\ No newline at end of file
diff --git a/maps/southern_cross/southern_cross.dm b/maps/southern_cross/southern_cross.dm
index 7ddc08f49d..29c4f295f2 100644
--- a/maps/southern_cross/southern_cross.dm
+++ b/maps/southern_cross/southern_cross.dm
@@ -25,7 +25,6 @@
#include "items/headset_sc.dm"
#include "items/clothing/sc_suit.dm"
#include "items/clothing/sc_under.dm"
- #include "items/clothing/sc_head.dm"
#include "items/clothing/sc_accessory.dm"
#include "job/outfits.dm"
#include "structures/closets/engineering.dm"
diff --git a/polaris.dme b/polaris.dme
index 189c3665ec..ec2d3c53df 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -1358,6 +1358,7 @@
#include "code\modules\clothing\head\jobs.dm"
#include "code\modules\clothing\head\misc.dm"
#include "code\modules\clothing\head\misc_special.dm"
+#include "code\modules\clothing\head\pilot_helmet.dm"
#include "code\modules\clothing\head\soft_caps.dm"
#include "code\modules\clothing\head\solgov.dm"
#include "code\modules\clothing\masks\boxing.dm"