lag fixes + dll updater

This commit is contained in:
SillyStar-Github 2026-04-06 16:33:31 -04:00
parent bf3516898c
commit b3c2200c7e
13 changed files with 231 additions and 25 deletions

View file

@ -0,0 +1,111 @@
using MelonLoader;
using MelonLoader.Utils;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PvZ_Fusion_Translator.AssetStore
{
public static class DllStore
{
public static Dictionary<string, byte[]> dllData = new Dictionary<string, byte[]>()
{
{ "Blooms_QOL.dll", null },
{ "HideMetalObjects.dll", null },
{ "PvZ_Fusion_Translator.dll", null }
};
public static bool updateOnClose = false;
public static void Init(string gameVersion) => TryGetNewDll(gameVersion);
public static void TryGetNewDll(string gameVersion)
{
bool ableToUpdate = true;
string unableReason = "";
string getGameVersionRequest = Utils.GetDataFromWeb("https://raw.githubusercontent.com/SillyStar-Github/PvZF-Translation-DLLs/refs/heads/main/CURRENT_GAME_VER").Result;
if(getGameVersionRequest != null)
{
Log.LogDebug($"Requst game version: {getGameVersionRequest} -> {Utils.CalculateGameVersion(getGameVersionRequest)}");
Log.LogDebug($"This game version: {gameVersion} -> {Utils.CalculateGameVersion(gameVersion)}");
if (Utils.CalculateGameVersion(getGameVersionRequest) != Utils.CalculateGameVersion(gameVersion))
{
ableToUpdate = false;
unableReason = "Incorrect game version...";
}
}
else
{
ableToUpdate = false;
unableReason = "Couldn't get latest game version info...";
}
if (ableToUpdate)
{
foreach(var key in dllData.Keys)
{
byte[] newDllRequest = Utils.GetByteDataFromWeb($"https://raw.githubusercontent.com/SillyStar-Github/PvZF-Translation-DLLs/refs/heads/main/{key}").Result;
if(newDllRequest != null)
{
dllData[key] = newDllRequest;
SaveNewDll(key);
}
else
{
Log.LogError($"Couldn't get latest {key} data!");
}
}
}
else
{
Log.LogError($"Unable to update! {unableReason}");
}
}
public static void SaveNewDll(string name)
{
byte[] newDllData = dllData[name];
if(newDllData != null)
{
string basePath = MelonEnvironment.ModsDirectory;
string toSavePath = Path.Combine(basePath, name + ".update");
File.WriteAllBytes(toSavePath, newDllData);
}
}
public static void UpdateNewDll()
{
foreach(var pair in dllData)
{
if(pair.Value != null)
{
updateOnClose = true;
}
}
if(updateOnClose)
{
int processId = (Process.GetCurrentProcess().Id);
var assembly = Core.Instance.MelonAssembly.Assembly;
string programName = "PvZ_Fusion_Translator.Resources.ModUpdateUtil.exe";
using var exeResourceStream = assembly.GetManifestResourceStream(programName);
string tempPath = Path.Combine(Path.GetTempPath(), "ModUpdateUtil.exe");
using (var fileStream = File.Create(tempPath))
{
exeResourceStream.CopyTo(fileStream);
}
Process.Start(new ProcessStartInfo
{
FileName = tempPath,
Arguments = $"{processId.ToString()} {string.Join(",", dllData.Keys)} {MelonEnvironment.ModsDirectory}",
UseShellExecute = true
});
}
}
}
}

View file

@ -31,6 +31,9 @@ namespace PvZ_Fusion_Translator
{ {
base.OnInitializeMelon(); base.OnInitializeMelon();
Instance = this; Instance = this;
DllStore.Init(MelonLoader.InternalUtils.UnityInformationHandler.GameVersion);
Config(); Config();
#if MULTI_LANGUAGE #if MULTI_LANGUAGE
FileLoader.LoadLanguage(); FileLoader.LoadLanguage();
@ -40,6 +43,7 @@ namespace PvZ_Fusion_Translator
AudioStore.Init(); AudioStore.Init();
FontStore.Init(); FontStore.Init();
Utils.RegisterPlantIndices(); Utils.RegisterPlantIndices();
//Utils.RegisterRecipeLinks(); //Utils.RegisterRecipeLinks();
} }
@ -56,6 +60,7 @@ namespace PvZ_Fusion_Translator
#if MULTI_LANGUAGE #if MULTI_LANGUAGE
FileLoader.SaveLanguage(); FileLoader.SaveLanguage();
#endif #endif
DllStore.UpdateNewDll();
#if OBFUSCATE && !RELEASE #if OBFUSCATE && !RELEASE
CheckSumStore.ConvertMD5Json(); CheckSumStore.ConvertMD5Json();
#endif #endif
@ -80,7 +85,7 @@ namespace PvZ_Fusion_Translator
if (Input.GetKeyDown(KeyCode.Delete)) if (Input.GetKeyDown(KeyCode.Delete))
{ {
Utils.OpenTrello(); Utils.OpenOnlineAlmanac();
} }
TowerManager_Patch.UpdateText(); TowerManager_Patch.UpdateText();

View file

@ -41,6 +41,10 @@ namespace PvZ_Fusion_Translator
internal static void LoadStrings(Utils.LanguageEnum language) internal static void LoadStrings(Utils.LanguageEnum language)
{ {
string stringDir = GetAssetDir(AssetType.Strings, Utils.Language); string stringDir = GetAssetDir(AssetType.Strings, Utils.Language);
if (!Directory.Exists(stringDir))
{
Directory.CreateDirectory(stringDir);
}
if(!Utils.useLocal) if(!Utils.useLocal)
{ {
@ -128,6 +132,14 @@ namespace PvZ_Fusion_Translator
} }
// load almanacs // load almanacs
string almanacDir = GetAssetDir(AssetType.Almanac, Utils.Language);
if(!Directory.Exists(almanacDir))
{
Directory.CreateDirectory(almanacDir);
}
string plantAlmanacContent = Utils.GetDataFromWeb($"https://raw.githubusercontent.com/Teyliu/PVZF-Translation/refs/heads/main/PvZ_Fusion_Translator/Localization/{Utils.Language.ToString()}/Almanac/LawnStringsTranslate.json").Result; string plantAlmanacContent = Utils.GetDataFromWeb($"https://raw.githubusercontent.com/Teyliu/PVZF-Translation/refs/heads/main/PvZ_Fusion_Translator/Localization/{Utils.Language.ToString()}/Almanac/LawnStringsTranslate.json").Result;
if(plantAlmanacContent != null) if(plantAlmanacContent != null)
@ -136,7 +148,6 @@ namespace PvZ_Fusion_Translator
} }
else else
{ {
string almanacDir = GetAssetDir(AssetType.Almanac, Utils.Language);
string path = Path.Combine(almanacDir, "LawnStringsTranslate.json"); string path = Path.Combine(almanacDir, "LawnStringsTranslate.json");
if(File.Exists(path)) if(File.Exists(path))
{ {
@ -152,7 +163,6 @@ namespace PvZ_Fusion_Translator
} }
else else
{ {
string almanacDir = GetAssetDir(AssetType.Almanac, Utils.Language);
string path = Path.Combine(almanacDir, "ZombieStringsTranslate.json"); string path = Path.Combine(almanacDir, "ZombieStringsTranslate.json");
if(File.Exists(path)) if(File.Exists(path))
{ {
@ -219,7 +229,14 @@ namespace PvZ_Fusion_Translator
} }
string almanacDir = GetAssetDir(AssetType.Almanac, Utils.Language); string almanacDir = GetAssetDir(AssetType.Almanac, Utils.Language);
if(!Directory.Exists(almanacDir))
{
Directory.CreateDirectory(almanacDir);
}
string plantAlmanacPath = Path.Combine(almanacDir, "LawnStringsTranslate.json"); string plantAlmanacPath = Path.Combine(almanacDir, "LawnStringsTranslate.json");
if(File.Exists(plantAlmanacPath)) if(File.Exists(plantAlmanacPath))
{ {
AlmanacPlantMenu_Patch.almanacJson = File.ReadAllText(plantAlmanacPath); AlmanacPlantMenu_Patch.almanacJson = File.ReadAllText(plantAlmanacPath);
@ -422,12 +439,16 @@ namespace PvZ_Fusion_Translator
string baseUrl = $"https://raw.githubusercontent.com/Teyliu/PVZF-Translation/refs/heads/main/PvZ_Fusion_Translator/"; string baseUrl = $"https://raw.githubusercontent.com/Teyliu/PVZF-Translation/refs/heads/main/PvZ_Fusion_Translator/";
string url = baseUrl + path; string url = baseUrl + path;
byte[] imageData = Utils.GetImageDataFromWeb(url).Result; byte[] imageData = Utils.GetByteDataFromWeb(url).Result;
if(imageData != null) if(imageData != null)
{ {
string fileName = Path.GetFileName(downloadPath); string fileName = Path.GetFileName(downloadPath);
Texture2D texture2D = Utils.LoadImage(imageData); Texture2D texture2D = Utils.LoadImage(imageData);
TextureStore.textureDict[fileName] = imageData; TextureStore.textureDict[fileName] = imageData;
if(!Directory.Exists(Path.GetDirectoryName(downloadPath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(downloadPath));
}
File.WriteAllBytes(downloadPath, imageData); File.WriteAllBytes(downloadPath, imageData);
} }
} }
@ -531,12 +552,16 @@ namespace PvZ_Fusion_Translator
string baseUrl = $"https://raw.githubusercontent.com/Teyliu/PVZF-Translation/refs/heads/main/PvZ_Fusion_Translator/"; string baseUrl = $"https://raw.githubusercontent.com/Teyliu/PVZF-Translation/refs/heads/main/PvZ_Fusion_Translator/";
string url = baseUrl + path; string url = baseUrl + path;
byte[] imageData = Utils.GetImageDataFromWeb(url).Result; byte[] imageData = Utils.GetByteDataFromWeb(url).Result;
if(imageData != null) if(imageData != null)
{ {
string fileName = Path.GetFileName(downloadPath); string fileName = Path.GetFileName(downloadPath);
Texture2D texture2D = Utils.LoadImage(imageData); Texture2D texture2D = Utils.LoadImage(imageData);
TextureStore.spriteDict[fileName] = imageData; TextureStore.spriteDict[fileName] = imageData;
if(!Directory.Exists(Path.GetDirectoryName(downloadPath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(downloadPath));
}
File.WriteAllBytes(downloadPath, imageData); File.WriteAllBytes(downloadPath, imageData);
} }
} }
@ -641,12 +666,16 @@ namespace PvZ_Fusion_Translator
string baseUrl = $"https://raw.githubusercontent.com/Teyliu/PVZF-Translation/refs/heads/main/PvZ_Fusion_Translator/"; string baseUrl = $"https://raw.githubusercontent.com/Teyliu/PVZF-Translation/refs/heads/main/PvZ_Fusion_Translator/";
string url = baseUrl + path; string url = baseUrl + path;
byte[] imageData = Utils.GetImageDataFromWeb(url).Result; byte[] imageData = Utils.GetByteDataFromWeb(url).Result;
if (imageData != null) if (imageData != null)
{ {
string fileName = Path.GetFileName(downloadPath); string fileName = Path.GetFileName(downloadPath);
Texture2D texture2D = Utils.LoadImage(imageData); Texture2D texture2D = Utils.LoadImage(imageData);
TextureStore.textureDict[fileName] = imageData; TextureStore.textureDict[fileName] = imageData;
if(!Directory.Exists(Path.GetDirectoryName(downloadPath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(downloadPath));
}
File.WriteAllBytes(downloadPath, imageData); File.WriteAllBytes(downloadPath, imageData);
} }
} }
@ -743,12 +772,16 @@ namespace PvZ_Fusion_Translator
string baseUrl = $"https://raw.githubusercontent.com/Teyliu/PVZF-Translation/refs/heads/main/PvZ_Fusion_Translator/"; string baseUrl = $"https://raw.githubusercontent.com/Teyliu/PVZF-Translation/refs/heads/main/PvZ_Fusion_Translator/";
string url = baseUrl + path; string url = baseUrl + path;
byte[] imageData = Utils.GetImageDataFromWeb(url).Result; byte[] imageData = Utils.GetByteDataFromWeb(url).Result;
if (imageData != null) if (imageData != null)
{ {
string fileName = Path.GetFileName(downloadPath); string fileName = Path.GetFileName(downloadPath);
Texture2D texture2D = Utils.LoadImage(imageData); Texture2D texture2D = Utils.LoadImage(imageData);
TextureStore.textureDict[fileName] = imageData; TextureStore.textureDict[fileName] = imageData;
if(!Directory.Exists(Path.GetDirectoryName(downloadPath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(downloadPath));
}
File.WriteAllBytes(downloadPath, imageData); File.WriteAllBytes(downloadPath, imageData);
} }
} }

View file

@ -107,7 +107,7 @@ namespace PvZ_Fusion_Translator.Patches.BaseTextObjects
{ {
txt.text = superEditorPlantMatch; txt.text = superEditorPlantMatch;
} }
else if((Regex.Match(txt.text, @"(<color[^>]*>.*?</color>)", RegexOptions.Singleline).Success) && !StringStore.translationString.ContainsKey(txt.text)) else if((Regex.Match(txt.text, @"(<color[^>]*>.*?</color>)", RegexOptions.Singleline).Success) && (!StringStore.translationString.ContainsKey(txt.text) && !StringStore.fsTipCollectionString.ContainsKey(txt.text) && !StringStore.izTipCollectionString.ContainsKey(txt.text)))
{ {
txt.text = StringStore.TranslateColorText(txt.text, true); txt.text = StringStore.TranslateColorText(txt.text, true);
if (txt.gameObject.name.Contains("main")) if (txt.gameObject.name.Contains("main"))

View file

@ -32,7 +32,7 @@ namespace PvZ_Fusion_Translator.Patches.BaseTextObjects
{ {
__instance.text = __instance.text.Replace("\n", " "); __instance.text = __instance.text.Replace("\n", " ");
if (__instance.name == "LevelName2" || __instance.name == "LevelName3") if ((__instance.name == "LevelName2" || __instance.name == "LevelName3") && !(__instance.gameObject.transform.parent.name.Contains("Difficulty") || __instance.gameObject.name.Contains("Difficulty")))
{ {
TowerManager_Patch.updatedText.Add(__instance.transform); TowerManager_Patch.updatedText.Add(__instance.transform);
} }

View file

@ -9,9 +9,38 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects.ButtonObjects
[HarmonyPatch(typeof(InGameBtn))] [HarmonyPatch(typeof(InGameBtn))]
public static class InGameBtn_Patch public static class InGameBtn_Patch
{ {
[HarmonyPatch(nameof(InGameBtn.Update))] [HarmonyPatch(nameof(InGameBtn.Start))]
[HarmonyPostfix] [HarmonyPostfix]
private static void Update(InGameBtn __instance) private static void Start(InGameBtn __instance)
{
Transform sceneText = __instance.transform.FindChild("SceneText");
if(sceneText != null)
{
TextMeshProUGUI sceneTextTMP = sceneText.transform.GetComponent<TextMeshProUGUI>();
if(sceneTextTMP != null)
{
sceneTextTMP = AssetStore.StringStore.TranslateText(sceneTextTMP);
}
Transform sceneTextShadow = sceneText.transform.FindChild("SceneText");
if(sceneTextShadow != null)
{
TextMeshProUGUI sceneTextShadowTMP = sceneTextShadow.transform.GetComponent<TextMeshProUGUI>();
if (sceneTextShadowTMP != null)
{
sceneTextShadowTMP = AssetStore.StringStore.TranslateText(sceneTextShadowTMP);
}
}
}
foreach(TextMeshProUGUI text in __instance.transform.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText(text.text);
}
}
[HarmonyPatch(nameof(InGameBtn.ChangeStrings))]
[HarmonyPostfix]
private static void ChangeStrings(InGameBtn __instance)
{ {
Transform sceneText = __instance.transform.FindChild("SceneText"); Transform sceneText = __instance.transform.FindChild("SceneText");
if(sceneText != null) if(sceneText != null)

View file

@ -11,6 +11,7 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects.MinorObjects
[HarmonyPatch(nameof(Money.Update))] [HarmonyPatch(nameof(Money.Update))]
private static void Update(Money __instance) private static void Update(Money __instance)
{ {
if (!Utils.CheckForUntranslatedText(__instance.beanCount.text)) return;
__instance.beanCount.text = StringStore.TranslateText(__instance.beanCount.text); __instance.beanCount.text = StringStore.TranslateText(__instance.beanCount.text);
__instance.beanCount2.text = StringStore.TranslateText(__instance.beanCount2.text); __instance.beanCount2.text = StringStore.TranslateText(__instance.beanCount2.text);
} }

View file

@ -14,11 +14,8 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects
[HarmonyPostfix] [HarmonyPostfix]
private static void Update(UIDifficulty __instance) private static void Update(UIDifficulty __instance)
{ {
if (!Utils.CheckForUntranslatedText(__instance.t.text)) return;
__instance.t.text = StringStore.TranslateText(__instance.t.text); __instance.t.text = StringStore.TranslateText(__instance.t.text);
foreach(TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText(text.text);
}
} }
} }
} }

View file

@ -16,6 +16,8 @@ namespace PvZ_Fusion_Translator.Patches.Managers
foreach (Transform transform in updatedText) foreach (Transform transform in updatedText)
{ {
if (transform != null) if (transform != null)
{
if(transform.gameObject.active)
{ {
transform.GetComponent<TextMeshProUGUI>().text = StringStore.TranslateText(transform.GetComponent<TextMeshProUGUI>().text); transform.GetComponent<TextMeshProUGUI>().text = StringStore.TranslateText(transform.GetComponent<TextMeshProUGUI>().text);
} }
@ -23,3 +25,4 @@ namespace PvZ_Fusion_Translator.Patches.Managers
} }
} }
} }
}

View file

@ -31,6 +31,7 @@
<ItemGroup> <ItemGroup>
<None Remove=".gitattributes" /> <None Remove=".gitattributes" />
<None Remove=".gitignore" /> <None Remove=".gitignore" />
<None Remove="Resources\ModUpdateUtil.exe" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -390,6 +391,7 @@
<ItemGroup> <ItemGroup>
<Compile Include="AssetStore\CheckSumStore.cs" /> <Compile Include="AssetStore\CheckSumStore.cs" />
<Compile Include="AssetStore\DllStore.cs" />
<Compile Include="AssetStore\FontStore.cs" /> <Compile Include="AssetStore\FontStore.cs" />
<Compile Include="AssetStore\StringStore.cs" /> <Compile Include="AssetStore\StringStore.cs" />
<Compile Include="AssetStore\TextureStore.cs" /> <Compile Include="AssetStore\TextureStore.cs" />
@ -550,6 +552,10 @@
<Compile Include="Utils.cs" /> <Compile Include="Utils.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\ModUpdateUtil.exe" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup> </ItemGroup>
@ -558,5 +564,6 @@
<Exec Command="COPY &quot;$(TargetPath)&quot; &quot;$(GamePath)\Mods\&quot;" /> <Exec Command="COPY &quot;$(TargetPath)&quot; &quot;$(GamePath)\Mods\&quot;" />
<Exec Command="COPY &quot;$(TargetPath)&quot; &quot;$(GamePath)\Translation Builds\&quot;" /> <Exec Command="COPY &quot;$(TargetPath)&quot; &quot;$(GamePath)\Translation Builds\&quot;" />
<Exec Command="COPY &quot;$(TargetPath)&quot; &quot;C:\Users\rainb\Documents\GitHub\PVZF-Translation\&quot;" /> <Exec Command="COPY &quot;$(TargetPath)&quot; &quot;C:\Users\rainb\Documents\GitHub\PVZF-Translation\&quot;" />
<Exec Command="COPY &quot;$(TargetPath)&quot; &quot;C:\Users\rainb\Documents\GitHub\PvZF-Translation-DLLs\&quot;" />
</Target> </Target>
</Project> </Project>

Binary file not shown.

View file

@ -93,9 +93,9 @@ namespace PvZ_Fusion_Translator
Process.Start("explorer.exe", saveDirectory); Process.Start("explorer.exe", saveDirectory);
} }
public static void OpenTrello() public static void OpenOnlineAlmanac()
{ {
string website = "https://trello.com/b/DcdT1kUp"; string website = "https://carroti4ch.itch.io/almanac";
Process.Start(new ProcessStartInfo(website) { UseShellExecute = true }); Process.Start(new ProcessStartInfo(website) { UseShellExecute = true });
} }
@ -420,7 +420,7 @@ namespace PvZ_Fusion_Translator
} }
} }
public static async Task<byte[]> GetImageDataFromWeb(string url, bool isLog = true) public static async Task<byte[]> GetByteDataFromWeb(string url, bool isLog = true)
{ {
if (isLog) if (isLog)
{ {
@ -501,6 +501,26 @@ namespace PvZ_Fusion_Translator
} }
} }
public static int CalculateGameVersion(string gameVersion)
{
int res = 0;
string[] gameVersionParts = gameVersion.Split('.');
int startingPower = (int)Math.Max(gameVersionParts.Length, 3);
for (int i = 0; i < startingPower; i++)
{
int factor = 0;
if (i < gameVersionParts.Length)
{
factor = int.Parse(gameVersionParts[i]);
}
int power = startingPower - i;
res += factor * (int)Math.Pow(10, power - 1);
}
return res;
}
#if MULTI_LANGUAGE #if MULTI_LANGUAGE
internal static void ChangeLanguage(string language) internal static void ChangeLanguage(string language)
{ {