diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm
index 28e81b33792..ce5fbd847bc 100644
--- a/code/game/jobs/job/supervisor.dm
+++ b/code/game/jobs/job/supervisor.dm
@@ -257,7 +257,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
suit = /obj/item/clothing/suit/storage/internalaffairs
shoes = /obj/item/clothing/shoes/brown
l_ear = /obj/item/radio/headset/headset_sec/alt
- glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses/read_only
id = /obj/item/card/id/security
l_pocket = /obj/item/laser_pointer
r_pocket = /obj/item/flash
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index b0ad5a23b1d..bd66901c4ab 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -998,7 +998,7 @@
to_chat(user, "You flip the switch on the underside of [src].")
active = 1
visible_message("[src] softly beeps and whirs to life!")
- playsound(src.loc, 'sound/machines/defib_SaftyOn.ogg', 25, 1)
+ playsound(src.loc, 'sound/machines/defib_saftyOn.ogg', 25, 1)
atom_say("This is ship ID #[rand(1,1000)] to Orion Port Authority. We're coming in for landing, over.")
sleep(20)
visible_message("[src] begins to vibrate...")
diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm
index 2bcf604e980..a71081f0be1 100644
--- a/code/game/machinery/dance_machine.dm
+++ b/code/game/machinery/dance_machine.dm
@@ -148,7 +148,7 @@
selection = available[selected]
updateUsrDialog()
if("horn")
- deejay('sound/items/airhorn2.ogg')
+ deejay('sound/items/Airhorn2.ogg')
if("alert")
deejay('sound/misc/notice1.ogg')
if("siren")
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 6f838319040..adf22a06850 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -1,7 +1,7 @@
/obj/machinery/door
name = "door"
desc = "It opens and closes."
- icon = 'icons/obj/doors/Doorint.dmi'
+ icon = 'icons/obj/doors/doorint.dmi'
icon_state = "door1"
anchored = TRUE
opacity = 1
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 3770a311ed0..48561914a16 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -80,7 +80,7 @@
else if(glass)
user.visible_message("[user] bangs on \the [src].",
"You bang on \the [src].")
- playsound(get_turf(src), 'sound/effects/Glassknock.ogg', 10, 1)
+ playsound(get_turf(src), 'sound/effects/glassknock.ogg', 10, 1)
/obj/machinery/door/firedoor/attackby(obj/item/C, mob/user, params)
add_fingerprint(user)
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 011b2c6fab8..f5fdecea3f6 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -516,7 +516,7 @@
energy_drain = 30
origin_tech = "materials=3;plasmatech=4;engineering=3"
projectile = /obj/item/projectile/plasma/adv/mech
- fire_sound = 'sound/weapons/laser.ogg'
+ fire_sound = 'sound/weapons/Laser.ogg'
/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma/can_attach(obj/mecha/M as obj)
if(istype(M, /obj/mecha/working))
diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm
index 1143954faef..4573545f969 100644
--- a/code/game/objects/items/weapons/clown_items.dm
+++ b/code/game/objects/items/weapons/clown_items.dm
@@ -32,7 +32,7 @@
desc = "Damn son, where'd you find this?"
icon_state = "air_horn"
origin_tech = "materials=4;engineering=4"
- honk_sounds = list('sound/items/airhorn2.ogg' = 1)
+ honk_sounds = list('sound/items/Airhorn2.ogg' = 1)
/obj/item/bikehorn/golden
name = "golden bike horn"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 03fca152fa9..663b3cbf160 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -245,6 +245,7 @@
new /obj/item/restraints/handcuffs(src)
new /obj/item/melee/baton/loaded(src)
new /obj/item/clothing/glasses/sunglasses(src)
+ new /obj/item/clothing/glasses/hud/security/sunglasses/read_only(src)
new /obj/item/clothing/glasses/hud/health/health_advanced
new /obj/item/clothing/head/beret/centcom/officer(src)
new /obj/item/clothing/head/beret/centcom/officer/navy(src)
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 28114f46a8c..25314db064c 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -174,7 +174,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("Something knocks on [src].")
add_fingerprint(user)
- playsound(src, 'sound/effects/Glassknock.ogg', 50, 1)
+ playsound(src, 'sound/effects/glassknock.ogg', 50, 1)
/obj/structure/window/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
if(!can_be_reached(user))
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index ff8de1a6a82..fb4f3736d6c 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -83,6 +83,7 @@
origin_tech = "magnets=3;combat=2"
var/global/list/jobs[0]
HUDType = DATA_HUD_SECURITY_ADVANCED
+ var/read_only = FALSE
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
@@ -114,6 +115,9 @@
invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these
prescription_upgradable = 0
+/obj/item/clothing/glasses/hud/security/sunglasses/read_only
+ read_only = TRUE
+
/obj/item/clothing/glasses/hud/security/sunglasses
name = "HUDSunglasses"
desc = "Sunglasses with a HUD."
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index be2b3506e67..03726353022 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -363,8 +363,8 @@
for(var/datum/data/record/R in data_core.security)
if(R.fields["id"] == E.fields["id"])
criminal = R.fields["criminal"]
-
- msg += "Criminal status: \[[criminal]\]\n"
+ var/criminal_status = hasHUD(user, "read_only_security") ? "\[[criminal]\]" : "\[[criminal]\]"
+ msg += "Criminal status: [criminal_status]\n"
msg += "Security records: \[View\] \[Add comment\]\n"
if(hasHUD(user,"medical"))
@@ -408,7 +408,12 @@
var/obj/item/organ/internal/cyberimp/eyes/hud/CIH = H.get_int_organ(/obj/item/organ/internal/cyberimp/eyes/hud)
switch(hudtype)
if("security")
- return istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/hud/security/sunglasses) || istype(CIH,/obj/item/organ/internal/cyberimp/eyes/hud/security)
+ return istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(CIH,/obj/item/organ/internal/cyberimp/eyes/hud/security)
+ if("read_only_security")
+ var/obj/item/clothing/glasses/hud/security/S
+ if(istype(H.glasses, /obj/item/clothing/glasses/hud/security))
+ S = H.glasses
+ return !istype(CIH,/obj/item/organ/internal/cyberimp/eyes/hud/security) && S && S.read_only
if("medical")
return istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(H.glasses, /obj/item/clothing/glasses/hud/health/health_advanced) || istype(CIH,/obj/item/organ/internal/cyberimp/eyes/hud/medical)
else
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index a6400142086..2f9ad47399b 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -656,7 +656,21 @@ var/list/ai_verbs_default = list(
return
if(href_list["ai_take_control"]) //Mech domination
+
var/obj/mecha/M = locate(href_list["ai_take_control"])
+
+ if(!M)
+ return
+
+ var/mech_has_controlbeacon = FALSE
+ for(var/obj/item/mecha_parts/mecha_tracking/ai_control/A in M.trackers)
+ mech_has_controlbeacon = TRUE
+ break
+ if(!can_dominate_mechs && !mech_has_controlbeacon)
+ message_admins("Warning: possible href exploit by [key_name(usr)] - attempted control of a mecha without can_dominate_mechs or a control beacon in the mech.")
+ log_debug("Warning: possible href exploit by [key_name(usr)] - attempted control of a mecha without can_dominate_mechs or a control beacon in the mech.")
+ return
+
if(controlled_mech)
to_chat(src, "You are already loaded into an onboard computer!")
return
@@ -670,7 +684,7 @@ var/list/ai_verbs_default = list(
to_chat(src, "You aren't in your core!")
return
if(M)
- M.transfer_ai(AI_MECH_HACK,src, usr) //Called om the mech itself.
+ M.transfer_ai(AI_MECH_HACK, src, usr) //Called om the mech itself.
else if(href_list["faketrack"])
var/mob/target = locate(href_list["track"]) in GLOB.mob_list
diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm
index 1797fc8b4bd..c834aa3c382 100644
--- a/code/modules/mob/living/silicon/pai/recruit.dm
+++ b/code/modules/mob/living/silicon/pai/recruit.dm
@@ -23,18 +23,33 @@ var/datum/paiController/paiController // Global handler for pAI candidates
var/askDelay = 10 * 60 * 1 // One minute [ms * sec * min]
/datum/paiController/Topic(href, href_list[])
+
+ var/datum/paiCandidate/candidate = locateUID(href_list["candidate"])
+
+ if(candidate)
+ if(!istype(candidate))
+ message_admins("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate is not a pAI)")
+ log_debug("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate is not a pAI)")
+ return
+
+ if(candidate.key && usr.key && candidate.key != usr.key)
+ message_admins("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr are different mobs)")
+ log_debug("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr are different mobs)")
+ return
+
if("signup" in href_list)
var/mob/dead/observer/O = locate(href_list["signup"])
- if(!O) return
+ if(!O)
+ return
if(!(O in GLOB.respawnable_list))
to_chat(O, "You've given up your ability to respawn!")
return
- if(!check_recruit(O)) return
+ if(!check_recruit(O))
+ return
recruitWindow(O)
return
if(href_list["download"])
- var/datum/paiCandidate/candidate = locate(href_list["candidate"])
var/obj/item/paicard/card = locate(href_list["device"])
if(card.pai)
return
@@ -59,7 +74,6 @@ var/datum/paiController/paiController // Global handler for pAI candidates
usr << browse(null, "window=findPai")
if(href_list["new"])
- var/datum/paiCandidate/candidate = locate(href_list["candidate"])
var/option = href_list["option"]
var/t = ""
@@ -183,28 +197,28 @@ var/datum/paiController/paiController // Global handler for pAI candidates
- | Name: |
+ Name: |
[candidate.name] |
| What you plan to call yourself. Suggestions: Any character name you would choose for a station character OR an AI. |
- | Description: |
+ Description: |
[candidate.description] |
| What sort of pAI you typically play; your mannerisms, your quirks, etc. This can be as sparse or as detailed as you like. |
- | Preferred Role: |
+ Preferred Role: |
[candidate.role] |
| Do you like to partner with sneaky social ninjas? Like to help security hunt down thugs? Enjoy watching an engineer's back while he saves the station yet again? This doesn't have to be limited to just station jobs. Pretty much any general descriptor for what you'd like to be doing works here. |
- | OOC Comments: |
+ OOC Comments: |
[candidate.comments] |
@@ -215,17 +229,17 @@ var/datum/paiController/paiController // Global handler for pAI candidates