diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm
index 525a77e3fd9..f3d59d3649e 100644
--- a/code/modules/mob/language/language.dm
+++ b/code/modules/mob/language/language.dm
@@ -203,8 +203,10 @@
if(!(L.flags & NONGLOBAL))
if(L == default_language)
dat += "[L.name] ([get_language_prefix()][L.key]) - default - reset
[L.desc]
"
- else
+ else if (can_speak(L))
dat += "[L.name] ([get_language_prefix()][L.key]) - set default
[L.desc]
"
+ else
+ dat += "[L.name] ([get_language_prefix()][L.key]) - cannot speak!
[L.desc]
"
src << browse(dat, "window=checklanguage")
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index 3f0fa31708a..40930700d1f 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -3,6 +3,7 @@
/obj/item/device/mmi/digital/New()
src.brainmob = new(src)
src.brainmob.add_language("Robot Talk")
+ src.brainmob.add_language("Encoded Audio Language")
src.brainmob.loc = src
src.brainmob.container = src
src.brainmob.stat = 0
diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm
index aaf947a13d4..0f4db8c1eb7 100644
--- a/code/modules/mob/living/carbon/brain/brain.dm
+++ b/code/modules/mob/living/carbon/brain/brain.dm
@@ -57,5 +57,8 @@
canmove = 0
return canmove
-/mob/living/carbon/brain/binarycheck()
+/mob/living/carbon/brain/isSynthetic()
return istype(loc, /obj/item/device/mmi/digital)
+
+/mob/living/carbon/brain/binarycheck()
+ return isSynthetic()
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index c32317da615..5ca686cae37 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -446,7 +446,7 @@
chem_effects[effect] = magnitude
/mob/living/carbon/get_default_language()
- if(default_language)
+ if(default_language && can_speak(default_language))
return default_language
if(!species)
diff --git a/code/modules/mob/living/default_language.dm b/code/modules/mob/living/default_language.dm
index eb4d3d032f4..5204fb879b5 100644
--- a/code/modules/mob/living/default_language.dm
+++ b/code/modules/mob/living/default_language.dm
@@ -5,6 +5,10 @@
set name = "Set Default Language"
set category = "IC"
+ if(language && !can_speak(language))
+ src << "You are unable to speak that language."
+ return
+
if(language)
src << "You will now speak [language] if you do not specify a language when speaking."
else
diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm
index d59c2af6097..43e933c00c9 100644
--- a/code/modules/research/prosfab_designs.dm
+++ b/code/modules/research/prosfab_designs.dm
@@ -44,6 +44,7 @@
H.real_name = "Synthmorph #[rand(100,999)]"
H.name = H.real_name
H.dir = 2
+ H.add_language("Encoded Audio Language")
return H
//////////////////// Prosthetics ////////////////////
diff --git a/html/changelogs/ForFoxSake-LanguageFixes.yml b/html/changelogs/ForFoxSake-LanguageFixes.yml
new file mode 100644
index 00000000000..2b1bc302294
--- /dev/null
+++ b/html/changelogs/ForFoxSake-LanguageFixes.yml
@@ -0,0 +1,9 @@
+author: ForFoxSake
+
+delete-after: True
+
+changes:
+ - bugfix: "Fixed a possible href exploit allowing any living player to speak any language."
+ - bugfix: "Organic beings can no longer speak Encoded Audio Language, although they can still understand it just fine."
+ - tweak: "Positronic brains can now speak Encoded Audio Language."
+ - tweak: "Station manufactured Full Body Prosthetics can now speak Encoded Audio Language."
\ No newline at end of file