From 0b65fd1b66ffe9fb6ee36917e5ac7b857eb2292e Mon Sep 17 00:00:00 2001 From: RimiNosha <106692773+RimiNosha@users.noreply.github.com> Date: Wed, 24 Aug 2022 22:33:33 +0100 Subject: [PATCH] [NO GBP] Fix Languages Being Reset if You Load in Early (#15680) * Account for the fact GLOB.language_datum_instances doesn't get populated until part way through the load process which I couldn't test because my dumb DD doesn't respond for like 2 minutes and getting to the 30s mark on the UI * Account for the fact people do indeed use multiple characters, so it would be a good idea to fix languages on characters that are being switched to while avoiding saving more than is necessary to ensure the server isn't lagged to death should some smartass decide to switch between characters really fast to screw with the server * Commit suggestion! Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com> * Apply recommendations! * Fix outdated languages being applied by default! Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com> --- code/modules/client/preferences.dm | 10 ++++++---- .../master_files/code/modules/client/preferences.dm | 4 +++- .../client/preferences/middleware/languages.dm | 10 +++++++--- modular_skyrat/modules/better_vox/code/vox_species.dm | 1 - .../customization/modules/client/preferences.dm | 11 +++++++++++ .../customization/modules/language/_species.dm | 11 ----------- .../modules/mob/living/carbon/human/species.dm | 6 ------ .../modules/mob/living/carbon/human/species/lizard.dm | 2 -- .../mob/living/carbon/human/species/podweak.dm | 2 -- .../living/carbon/human/species/robotic/_robotic.dm | 1 - .../living/carbon/human/species/roundstartslime.dm | 4 ---- .../modules/mob/living/carbon/human/species/skrell.dm | 1 - .../modules/mob/living/carbon/human/species/vox.dm | 1 - modular_skyrat/modules/teshari/code/_teshari.dm | 1 - tgstation.dme | 2 +- 15 files changed, 28 insertions(+), 39 deletions(-) create mode 100644 modular_skyrat/modules/customization/modules/client/preferences.dm delete mode 100644 modular_skyrat/modules/customization/modules/language/_species.dm diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 46afe5362d3..78ce3b9ecd7 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -114,10 +114,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(loaded_preferences_successfully) if(load_character()) // SKYRAT EDIT START - Sanitizing languages - for(var/lang_path as anything in languages) - var/datum/language/language = GLOB.language_datum_instances[lang_path] - if(!language || language.secret) - languages.Remove(lang_path) + sanitize_languages() // SKYRAT EDIT END return // SKYRAT EDIT - Don't remove this. Just don't. Nothing is worth forced random characters. //we couldn't load character data so just randomize the character appearance + name @@ -233,6 +230,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) randomise_appearance_prefs() save_character() + // SKYRAT EDIT START - Sanitizing languages + if(sanitize_languages()) + save_character() + // SKYRAT EDIT END + for (var/datum/preference_middleware/preference_middleware as anything in middleware) preference_middleware.on_new_character(usr) diff --git a/modular_skyrat/master_files/code/modules/client/preferences.dm b/modular_skyrat/master_files/code/modules/client/preferences.dm index 1782c20cb92..a9662dec8d4 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences.dm @@ -101,8 +101,10 @@ /datum/preferences/proc/get_optional_languages() var/list/lang_list = list() - for(var/lang in pref_species.learnable_languages) + var/datum/language_holder/lang_holder = new pref_species.species_language_holder() + for(var/lang in lang_holder.spoken_languages) lang_list[lang] = TRUE + qdel(lang_holder) return lang_list /datum/preferences/proc/get_available_languages() diff --git a/modular_skyrat/master_files/code/modules/client/preferences/middleware/languages.dm b/modular_skyrat/master_files/code/modules/client/preferences/middleware/languages.dm index 240d34ee360..3554c344d83 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences/middleware/languages.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences/middleware/languages.dm @@ -54,8 +54,10 @@ preferences.languages = list() var/species_type = preferences.read_preference(/datum/preference/choiced/species) var/datum/species/species = new species_type() - for(var/language in species.learnable_languages) + var/datum/language_holder/lang_holder = new species.species_language_holder() + for(var/language in lang_holder.spoken_languages) preferences.languages[language] = LANGUAGE_SPOKEN + qdel(lang_holder) qdel(species) . = ..() @@ -72,9 +74,10 @@ var/max_languages = preferences.all_quirks.Find(QUIRK_LINGUIST) ? 4 : 3 var/species_type = preferences.read_preference(/datum/preference/choiced/species) var/datum/species/species = new species_type() + var/datum/language_holder/lang_holder = new species.species_language_holder() if(!preferences.languages || !preferences.languages.len || (preferences.languages && preferences.languages.len > max_languages)) // Too many languages, or no languages. preferences.languages = list() - for(var/language in species.learnable_languages) + for(var/language in lang_holder.spoken_languages) preferences.languages[language] = LANGUAGE_SPOKEN var/list/selected_languages = list() var/list/unselected_languages = list() @@ -82,7 +85,7 @@ var/datum/language/language = GLOB.language_datum_instances[language_name] if(language.secret) continue - if(species.always_customizable && !(language.type in species.learnable_languages)) // For the ghostrole species. We don't want ashwalkers speaking beachtongue now. + if(species.always_customizable && !(language.type in lang_holder.spoken_languages)) // For the ghostrole species. We don't want ashwalkers speaking beachtongue now. continue if(preferences.languages[language.type]) selected_languages += list(list( @@ -96,6 +99,7 @@ "name" = language.name, "icon" = sanitize_css_class_name(language.name) )) + qdel(lang_holder) qdel(species) data["total_language_points"] = max_languages diff --git a/modular_skyrat/modules/better_vox/code/vox_species.dm b/modular_skyrat/modules/better_vox/code/vox_species.dm index e1f5f3dfefc..347c0d65282 100644 --- a/modular_skyrat/modules/better_vox/code/vox_species.dm +++ b/modular_skyrat/modules/better_vox/code/vox_species.dm @@ -38,7 +38,6 @@ outfit_important_for_life = /datum/outfit/vox species_language_holder = /datum/language_holder/vox changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT - learnable_languages = list(/datum/language/common, /datum/language/vox, /datum/language/schechi) // Vox are cold resistant, but also heat sensitive bodytemp_heat_damage_limit = (BODYTEMP_HEAT_DAMAGE_LIMIT - 15) // being cold resistant, should make you heat sensitive actual effect ingame isn't much diff --git a/modular_skyrat/modules/customization/modules/client/preferences.dm b/modular_skyrat/modules/customization/modules/client/preferences.dm new file mode 100644 index 00000000000..edf14ccedb5 --- /dev/null +++ b/modular_skyrat/modules/customization/modules/client/preferences.dm @@ -0,0 +1,11 @@ +/// Cleans up any invalid languages. Typically happens on language renames and codedels. +/datum/preferences/proc/sanitize_languages() + var/languages_edited = FALSE + for(var/lang_path as anything in languages) + var/datum/language/language = new lang_path() + // Yes, checking subtypes is VERY necessary, because byond doesn't check to see if a path is valid at runtime! + // If you delete /datum/language/meme, it will still load as /datum/language/meme, and will instantiate with /datum/language's defaults! + if(!(language.type in subtypesof(/datum/language)) || language.secret) + languages.Remove(lang_path) + languages_edited = TRUE + return languages_edited diff --git a/modular_skyrat/modules/customization/modules/language/_species.dm b/modular_skyrat/modules/customization/modules/language/_species.dm deleted file mode 100644 index ef835aafd25..00000000000 --- a/modular_skyrat/modules/customization/modules/language/_species.dm +++ /dev/null @@ -1,11 +0,0 @@ -/datum/species/plasmaman - learnable_languages = list( - /datum/language/common, - /datum/language/calcic - ) - -/datum/species/human/felinid - learnable_languages = list( - /datum/language/common, - /datum/language/yangyu - ) diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm index 6e29f6ea074..9381fcddd94 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm @@ -258,7 +258,6 @@ GLOBAL_LIST_EMPTY(customizable_races) ///What accessories can a species have aswell as their default accessory of such type e.g. "frills" = "Aquatic". Default accessory colors is dictated by the accessory properties and mutcolors of the specie var/list/default_mutant_bodyparts = list() /// List of all the languages our species can learn NO MATTER their background - var/list/learnable_languages = list(/datum/language/common) /datum/species/New() . = ..() @@ -276,12 +275,10 @@ GLOBAL_LIST_EMPTY(customizable_races) /datum/species/human/felinid mutant_bodyparts = list() default_mutant_bodyparts = list("tail" = "Cat", "ears" = "Cat") - learnable_languages = list(/datum/language/common, /datum/language/nekomimetic) /datum/species/human mutant_bodyparts = list() default_mutant_bodyparts = list("ears" = "None", "tail" = "None", "wings" = "None") - learnable_languages = list(/datum/language/common, /datum/language/uncommon) /datum/species/mush mutant_bodyparts = list() @@ -293,18 +290,15 @@ GLOBAL_LIST_EMPTY(customizable_races) mutant_bodyparts = list() can_have_genitals = FALSE can_augment = FALSE - learnable_languages = list(/datum/language/common, /datum/language/calcic) /datum/species/ethereal mutant_bodyparts = list() can_have_genitals = FALSE can_augment = FALSE - learnable_languages = list(/datum/language/common, /datum/language/voltaic) /datum/species/pod name = "Primal Podperson" always_customizable = TRUE - learnable_languages = list(/datum/language/common, /datum/language/sylvan) /datum/species/proc/get_random_features() var/list/returned = MANDATORY_FEATURE_LIST diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/lizard.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/lizard.dm index 440e1c3080b..47379377a55 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/lizard.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/lizard.dm @@ -21,7 +21,6 @@ "taur" = "None", "wings" = "None", ) - learnable_languages = list(/datum/language/common, /datum/language/draconic) payday_modifier = 0.75 /datum/species/lizard/get_random_features() @@ -67,7 +66,6 @@ FACEHAIR ) always_customizable = TRUE - learnable_languages = list(/datum/language/ashtongue) /datum/species/lizard/ashwalker/prepare_human_for_preview(mob/living/carbon/human/lizard, lizard_color = "#990000") . = ..(lizard, lizard_color) diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm index 5b86aa5fb39..0c6b329b16f 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm @@ -5,7 +5,6 @@ TRAIT_PLANT_SAFE, TRAIT_LITERATE, ) - learnable_languages = list(/datum/language/common, /datum/language/sylvan) //I guess plants are smart and they can speak common payday_modifier = 0.75 /datum/species/pod/podweak @@ -28,7 +27,6 @@ mutant_bodyparts = list() default_mutant_bodyparts = list() - learnable_languages = list(/datum/language/common, /datum/language/sylvan) always_customizable = FALSE /datum/species/pod/podweak/spec_life(mob/living/carbon/human/H, delta_time, times_fired) diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/robotic/_robotic.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/robotic/_robotic.dm index 4be8679b5f3..de6c4500cd0 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/robotic/_robotic.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/robotic/_robotic.dm @@ -36,7 +36,6 @@ mutantheart = /obj/item/organ/internal/heart/robot_ipc mutantliver = /obj/item/organ/internal/liver/robot_ipc exotic_blood = /datum/reagent/fuel/oil - learnable_languages = list(/datum/language/common, /datum/language/machine) /datum/species/robotic/spec_life(mob/living/carbon/human/H) if(H.stat == SOFT_CRIT || H.stat == HARD_CRIT) diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/roundstartslime.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/roundstartslime.dm index 45a815b4b97..7153c272d1f 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/roundstartslime.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/roundstartslime.dm @@ -20,10 +20,6 @@ mutant_bodyparts = list() hair_color = "mutcolor" hair_alpha = 160 //a notch brighter so it blends better. - learnable_languages = list( - /datum/language/common, - /datum/language/slime - ) /datum/species/jelly/get_species_description() return placeholder_description diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/skrell.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/skrell.dm index 3e48206f55d..44331768321 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/skrell.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/skrell.dm @@ -38,7 +38,6 @@ mutantheart = /obj/item/organ/internal/heart/skrell mutantliver = /obj/item/organ/internal/liver/skrell mutanttongue = /obj/item/organ/internal/tongue/skrell - learnable_languages = list(/datum/language/common, /datum/language/skrell) bodypart_overrides = list( BODY_ZONE_HEAD = /obj/item/bodypart/head/mutant/skrell, BODY_ZONE_CHEST = /obj/item/bodypart/chest/mutant/skrell, diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm index bedb4829235..e53a8e0b7cb 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm @@ -40,7 +40,6 @@ outfit_important_for_life = /datum/outfit/vox species_language_holder = /datum/language_holder/vox changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT - learnable_languages = list(/datum/language/common, /datum/language/vox, /datum/language/schechi) // Vox are cold resistant, but also heat sensitive bodytemp_heat_damage_limit = (BODYTEMP_HEAT_DAMAGE_LIMIT - 15) // being cold resistant, should make you heat sensitive actual effect ingame isn't much bodytemp_cold_damage_limit = (BODYTEMP_COLD_DAMAGE_LIMIT - 30) diff --git a/modular_skyrat/modules/teshari/code/_teshari.dm b/modular_skyrat/modules/teshari/code/_teshari.dm index 791bc4f10d5..2da95152ad4 100644 --- a/modular_skyrat/modules/teshari/code/_teshari.dm +++ b/modular_skyrat/modules/teshari/code/_teshari.dm @@ -61,7 +61,6 @@ bodytemp_cold_damage_limit = (BODYTEMP_COLD_DAMAGE_LIMIT + TESHARI_TEMP_OFFSET) species_language_holder = /datum/language_holder/teshari body_size_restricted = TRUE - learnable_languages = list(/datum/language/common, /datum/language/vox, /datum/language/schechi) bodypart_overrides = list( BODY_ZONE_HEAD = /obj/item/bodypart/head/mutant/teshari, BODY_ZONE_CHEST = /obj/item/bodypart/chest/mutant/teshari, diff --git a/tgstation.dme b/tgstation.dme index 49e735c952c..5abe6371da6 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5249,6 +5249,7 @@ #include "modular_skyrat\modules\customization\game\objects\items\storage\rings.dm" #include "modular_skyrat\modules\customization\game\objects\items\tanks\n2_tanks.dm" #include "modular_skyrat\modules\customization\modules\admin\donator_list.dm" +#include "modular_skyrat\modules\customization\modules\client\preferences.dm" #include "modular_skyrat\modules\customization\modules\client\augment\_augment.dm" #include "modular_skyrat\modules\customization\modules\client\augment\implants.dm" #include "modular_skyrat\modules\customization\modules\client\augment\limbs.dm" @@ -5307,7 +5308,6 @@ #include "modular_skyrat\modules\customization\modules\hydroponics\grown\tea_coffee.dm" #include "modular_skyrat\modules\customization\modules\jobs\_job.dm" #include "modular_skyrat\modules\customization\modules\language\_language_holder.dm" -#include "modular_skyrat\modules\customization\modules\language\_species.dm" #include "modular_skyrat\modules\customization\modules\language\ashtongue.dm" #include "modular_skyrat\modules\customization\modules\language\beachbum.dm" #include "modular_skyrat\modules\customization\modules\language\buzzwords.dm"