From ee50214043e54710eff7cfe61b447a6de3ee5b22 Mon Sep 17 00:00:00 2001 From: mikx Date: Sat, 7 Feb 2026 03:08:08 -0500 Subject: [PATCH] (1.5.5) Localization --- MxValheim/KillFeed/Patch.cs | 12 +++-- MxValheim/Localization/KillFeed.cs | 17 ------- MxValheim/MxValheim.cs | 78 +++++++++++++++++++++++------- MxValheim/MxValheim.csproj | 23 ++++++--- README.md | 4 +- 5 files changed, 86 insertions(+), 48 deletions(-) delete mode 100644 MxValheim/Localization/KillFeed.cs diff --git a/MxValheim/KillFeed/Patch.cs b/MxValheim/KillFeed/Patch.cs index c60b45e..76e4cc0 100644 --- a/MxValheim/KillFeed/Patch.cs +++ b/MxValheim/KillFeed/Patch.cs @@ -46,8 +46,8 @@ namespace MxValheim.KillFeed } // Message Format Variables - string type1Separator = " a été tué par "; - string type2Separator = " a tué "; + string type1Separator = Localization.instance.Localize("$killfeed_format_type1"); + string type2Separator = Localization.instance.Localize("$killfeed_format_type2"); string finalMsg = ""; string attackerFormat = ""; string victimFormat = ""; @@ -58,7 +58,8 @@ namespace MxValheim.KillFeed starFormat = "★"; crossFormat = "✝"; attackerFormat = $"{attacker.ToUpper()}"; - if(type == 1) + + if (type == 1) { victimFormat = $"{crossFormat} {victim.ToUpper()}"; } else if(type == 2) @@ -81,8 +82,9 @@ namespace MxValheim.KillFeed victimFormat = $"{starFormat}{starFormat}{starFormat}{starFormat} {victim.ToUpper()}"; break; } - } - distanceFormat = $" à {distance:F1}m de distance."; + } + + distanceFormat = $"{Localization.instance.Localize("$killfeed_format_distance_before")}{distance:F1}m{Localization.instance.Localize("$killfeed_format_distance_after")}"; finalMsg = (type == 1) ? $"{victimFormat}{type1Separator}{attackerFormat}{distanceFormat}": // Player Death diff --git a/MxValheim/Localization/KillFeed.cs b/MxValheim/Localization/KillFeed.cs deleted file mode 100644 index 1db88cb..0000000 --- a/MxValheim/Localization/KillFeed.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MxValheim.Localization -{ - internal class KillFeed - { - Dictionary killfeedLocales = new Dictionary - { - { " has been killed by ", " a été tué par " }, - { " killed ", " a tué " } - }; - } -} diff --git a/MxValheim/MxValheim.cs b/MxValheim/MxValheim.cs index 033d2dc..9cc55a6 100644 --- a/MxValheim/MxValheim.cs +++ b/MxValheim/MxValheim.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Reflection; using System.Threading; using System.Xml; using TMPro; @@ -21,7 +22,7 @@ public class MxValheimMod : BaseUnityPlugin private const string ModGUID = "ovh.mxdev.mxvalheim"; private const string ModName = "MxValheim"; - private const string ModVersion = "1.5.4"; + private const string ModVersion = "1.5.5"; public static ConfigEntry Config_Locked; public static ConfigEntry Config_OreMultiplier; @@ -32,7 +33,9 @@ public class MxValheimMod : BaseUnityPlugin public static ConfigEntry Config_autoDoorCloseEnabled; public static ConfigEntry Config_autoDoorClose; - private static string WeightConfigPath => Path.Combine(Paths.ConfigPath, "mxvalheim.custom_weights.json"); + public static string modPath = Path.Combine(Paths.PluginPath, "MxValheim"); + public static string internalConfigsPath = Path.Combine(modPath, "Configs"); + private static string WeightConfigPath => Path.Combine(internalConfigsPath, "items_weight.json"); public static Dictionary WeightSettings = new Dictionary(); // Data structures @@ -73,12 +76,22 @@ public class MxValheimMod : BaseUnityPlugin Config_autoDoorCloseEnabled = Config.Bind("General", "AutoDoorCloseEnabled", true, "Your doors will auto close if enabled. See AutoDoorCloseTimer for the desired time."); Config_autoDoorClose = Config.Bind("General", "AutoDoorCloseTimer", 5.0f, "Your doors will auto close after the specified timer duration."); + LoadLocalization(); LoadJsonConfig(); Harmony harmony = new Harmony(ModGUID); harmony.PatchAll(); } + [HarmonyPatch(typeof(Localization), nameof(Localization.SetupLanguage))] + public static class Localization_SetupLanguage_Patch + { + public static void Postfix() + { + LoadLocalization(); + } + } + // --- TEST COMMAND: Type 'testkill' in F5 console --- [HarmonyPatch(typeof(Terminal), nameof(Terminal.InputText))] public static class ConsoleInputPatch @@ -86,21 +99,6 @@ public class MxValheimMod : BaseUnityPlugin static void Postfix(Terminal __instance) { string text = __instance.m_input.text; - if (text.ToLower() == "listiconsstore") - { - var spriteAsset = Resources.FindObjectsOfTypeAll().FirstOrDefault(x => x.name == "store_icons"); ; - - if (spriteAsset != null) - { - Debug.Log($"--- Listing all sprites in {spriteAsset.name} ---"); - for (int i = 0; i < spriteAsset.spriteCharacterTable.Count; i++) - { - var sprite = spriteAsset.spriteCharacterTable[i]; - Debug.Log($"Index: {i} | Name: {sprite.name}"); - } - } - } - if (text.ToLower() == "listicons") { var spriteAsset = Resources.FindObjectsOfTypeAll().FirstOrDefault(x => x.name == "icons"); ; @@ -176,6 +174,52 @@ public class MxValheimMod : BaseUnityPlugin if (_displayTimer <= 0 && _hudRoot != null) _hudRoot.SetActive(false); } + } + + public static void LoadLocalization() + { + if (Localization.instance == null) return; + + string modPath = Path.Combine(Paths.PluginPath, "MxValheim"); + string translationsPath = Path.Combine(modPath, "Translations"); + string lang = Localization.instance.GetSelectedLanguage(); + string filePath = Path.Combine(translationsPath, $"{lang}.json"); + + if (!File.Exists(filePath)) + { + filePath = Path.Combine(translationsPath, "English.json"); + } + + if (File.Exists(filePath)) + { + try + { + string json = File.ReadAllText(filePath); + var dict = JsonConvert.DeserializeObject>(json); + + // Get the method via Reflection to bypass "Inaccessible" errors + MethodInfo addWordMethod = typeof(Localization).GetMethod("AddWord", + BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + + if (addWordMethod != null) + { + foreach (var entry in dict) + { + // Parameters: (instance to run on, array of arguments) + addWordMethod.Invoke(Localization.instance, new object[] { entry.Key, entry.Value }); + } + Debug.Log($"[MxValheim] Successfully injected {dict.Count} strings for {lang}."); + } + else + { + Debug.LogError("[MxValheim] Critical Error: Could not find AddWord method in game code."); + } + } + catch (Exception e) + { + Debug.LogError($"[MxValheim] Error loading JSON: {e.Message}"); + } + } } private bool LoadJsonConfig() diff --git a/MxValheim/MxValheim.csproj b/MxValheim/MxValheim.csproj index a87dc39..9418bca 100644 --- a/MxValheim/MxValheim.csproj +++ b/MxValheim/MxValheim.csproj @@ -35,11 +35,11 @@ E:\SteamLibrary\steamapps\common\Valheim\BepInEx\core\0Harmony.dll - - E:\SteamLibrary\steamapps\common\Valheim\Valheim_Data\Managed\Assembly-CSharp-publicized.dll + + E:\SteamLibrary\steamapps\common\Valheim\Valheim_Data\Managed\publicized_assemblies\assembly_guiutils_publicized.dll - - E:\SteamLibrary\steamapps\common\Valheim\Valheim_Data\Managed\assembly_valheim-publicized.dll + + E:\SteamLibrary\steamapps\common\Valheim\Valheim_Data\Managed\publicized_assemblies\assembly_valheim_publicized.dll E:\SteamLibrary\steamapps\common\Valheim\BepInEx\core\BepInEx.dll @@ -48,6 +48,7 @@ E:\SteamLibrary\steamapps\common\Valheim\BepInEx\plugins\Newtonsoft.Json.dll + @@ -62,6 +63,10 @@ E:\SteamLibrary\steamapps\common\Valheim\Valheim_Data\Managed\UnityEngine.dll + + False + E:\SteamLibrary\steamapps\common\Valheim\Valheim_Data\Managed\UnityEngine.AssetBundleModule.dll + E:\SteamLibrary\steamapps\common\Valheim\Valheim_Data\Managed\UnityEngine.CoreModule.dll @@ -97,10 +102,12 @@ -copy /Y "$(TargetDir)$(TargetName).dll" "E:\SteamLibrary\steamapps\common\Valheim\BepInEx\plugins\" -copy /Y "$(TargetDir)$(TargetName).pdb" "E:\SteamLibrary\steamapps\common\Valheim\BepInEx\plugins\" +copy /Y "$(TargetDir)$(TargetName).dll" "E:\SteamLibrary\steamapps\common\Valheim\BepInEx\plugins\MxValheim\" +copy /Y "$(TargetDir)$(TargetName).pdb" "E:\SteamLibrary\steamapps\common\Valheim\BepInEx\plugins\MxValheim\" -copy /Y "$(TargetDir)$(TargetName).dll" "R:\Server\valdev\BepInEx\plugins\" -copy /Y "$(TargetDir)$(TargetName).pdb" "R:\Server\valdev\BepInEx\plugins\" +copy /Y "$(TargetDir)$(TargetName).dll" "R:\Server\valdev\BepInEx\plugins\MxValheim\" +copy /Y "$(TargetDir)$(TargetName).pdb" "R:\Server\valdev\BepInEx\plugins\MxValheim\" +if exist "E:\SteamLibrary\steamapps\common\Valheim\BepInEx\plugins\MxValheim.zip" del "E:\SteamLibrary\steamapps\common\Valheim\BepInEx\plugins\MxValheim.zip" +"C:\Program Files\7-Zip\7z.exe" a -tzip "E:\SteamLibrary\steamapps\common\Valheim\BepInEx\plugins\MxValheim.zip" "E:\SteamLibrary\steamapps\common\Valheim\BepInEx\plugins\MxValheim\*" \ No newline at end of file diff --git a/README.md b/README.md index 554bbc9..2a1c9ab 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ ![logo](https://mxdev.ovh/wp-content/uploads/2025/09/mxdev-1.png) ## MxValheim -Official Mx Valheim Mod. +Official **MxValheim Server** Mod. +**This mod is created to be used Client/Server side. A lot of features are not working in solo mode.** ## Features +- Use your client language with built-in localization. - Kill Feed with custom UI showing player kill and death. - Tweak individual item(s) weight in "BepInEx\config\mxvalheim.custom_weights.json". - Ore drop multiplier. (Value available in the generated config.)