Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of ZetAspects VietHoa v1.0.1
plugins/NovaGC-ZetAspectsTranslator/ZetAspectsTranslator.dll
Decompiled 8 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Serialization; using TPDespair.ZetAspects; using ZetAspectsTranslator.Controllers; using ZetAspectsTranslator.Models; using ZetAspectsTranslator.Models.Exceptions; using ZetAspectsTranslator.Models.Extends; using ZetAspectsTranslator.Services; using ZetAspectsTranslator.Services.TranslationProvider; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("ZetAspectsTranslator")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+fe27d376d9184732a052fad8f6a516aa44f0bbb0")] [assembly: AssemblyProduct("ZetAspectsTranslator")] [assembly: AssemblyTitle("ZetAspectsTranslator")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ZetAspectsTranslator { [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("NovaGC.ZetAspectsTranslator", "ZetAspectsTranslator", "1.0.0")] public class ZetAspectsTranslatorPlugin : BaseUnityPlugin { public const string Guid = "NovaGC.ZetAspectsTranslator"; public const string Author = "NovaGC"; public const string Name = "ZetAspectsTranslator"; public const string Version = "1.0.0"; public const string BasePath = "NovaGC-ZetAspectsTranslator"; private readonly string[] _schemaFiles = new string[2] { "settings.schema.json", "tokens.schema.json" }; public void Awake() { Log.Init(((BaseUnityPlugin)this).Logger); string text = Path.Combine(Paths.PluginPath, "NovaGC-ZetAspectsTranslator", "NovaGC-ZetAspectsTranslator", "translations"); string text2 = Path.Combine(Paths.GameRootPath, "Risk of Rain 2_Data", "StreamingAssets", "LanguageOverrides", "ZetAspects"); InitFoldersAndSchemas(text, text2); TranslationController translationController = new TranslationController(); string[] array = new string[2] { text, text2 }; string[] array2 = array; foreach (string path in array2) { List<TranslationFileProvider> translations = (from x in Directory.GetFiles(path, "*.json") select new FileInfo(x) into x where !_schemaFiles.Contains(x.Name) orderby x.Name descending select new TranslationFileProvider(path, x.FullName)).ToList(); translationController.RegisterTranslations(translations); } } private void InitFoldersAndSchemas(string pathInPlugin, string pathInGame) { string[] source = new string[4] { pathInPlugin, pathInGame, Path.Combine(pathInPlugin, "tokens"), Path.Combine(pathInGame, "tokens") }; foreach (string item in source.Where((string x) => !Directory.Exists(x))) { Directory.CreateDirectory(item); } IEnumerable<FileInfo> enumerable = from x in _schemaFiles select new FileInfo(Path.Combine(pathInPlugin, x)) into x where x.Exists select x; foreach (FileInfo item2 in enumerable) { item2.CopyTo(Path.Combine(pathInGame, item2.Name), overwrite: true); } } } } namespace ZetAspectsTranslator.Services { internal static class Log { private static ManualLogSource _logSource; private static Action<object>[] _logMethods = Enumerable.Repeat<Action<object>>(delegate { }, 6).ToArray(); internal static void Init(ManualLogSource logSource) { _logSource = logSource; _logMethods = new Action<object>[6] { _logSource.LogDebug, _logSource.LogError, _logSource.LogFatal, _logSource.LogInfo, _logSource.LogMessage, _logSource.LogWarning }; } internal static void Debug(object data) { _logMethods[0](data); } internal static void Error(object data) { _logMethods[1](data); } internal static void Fatal(object data) { _logMethods[2](data); } internal static void Info(object data) { _logMethods[3](data); } internal static void Message(object data) { _logMethods[4](data); } internal static void Warning(object data) { _logMethods[5](data); } } } namespace ZetAspectsTranslator.Services.TranslationProvider { public interface ITranslationProvider { string Language { get; } Dictionary<string, string> Tokens { get; } } public class TranslationFileProvider : ITranslationProvider { private readonly string _baseTranslationsPath; private readonly HashSet<string> _processedFiles; public string Language { get; private set; } public Dictionary<string, string> Tokens { get; } public TranslationFileProvider(string baseTranslationsPath, string translationFileName) { _baseTranslationsPath = baseTranslationsPath; _processedFiles = new HashSet<string>(); Language = null; Tokens = new Dictionary<string, string>(); LoadTranslations(translationFileName); } private void LoadTranslations(string path) { if (!File.Exists(path)) { throw new FileNotFoundException(path); } Stack<ExtendsSetting> stack = new Stack<ExtendsSetting>(new ExtendsSetting[1] { new ExtendsSetting { Path = path, Type = ExtendsType.Setting } }); while (stack.Any()) { try { ExtendsSetting extendsSetting = stack.Pop(); extendsSetting.Path = GetFullPath(extendsSetting.Path); ExtendsSetting[] source = ProcessSetting(extendsSetting); foreach (ExtendsSetting item in source.Reverse()) { stack.Push(item); } _processedFiles.Add(new FileInfo(extendsSetting.Path).FullName); } catch (Exception data) { Log.Error(data); } } } private ExtendsSetting[] ProcessSetting(ExtendsSetting setting) { if (!File.Exists(setting.Path)) { throw new FileNotFoundException(setting.Path); } if (_processedFiles.Contains(setting.Path)) { throw new CyclicalDependenceException(setting.Path); } if (setting.Type == ExtendsType.Tokens) { Dictionary<string, string> tokens = ParseJsonFile<Dictionary<string, string>>(setting.Path); MergeTokens(tokens); return Array.Empty<ExtendsSetting>(); } TranslationSetting translationSetting = ParseJsonFile<TranslationSetting>(setting.Path); Language = (string.IsNullOrEmpty(Language) ? translationSetting.Language : Language); MergeTokens(translationSetting.Tokens); return translationSetting.Extends; } private T ParseJsonFile<T>(string path) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown using FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read); using StreamReader streamReader = new StreamReader(stream); JsonTextReader val = new JsonTextReader((TextReader)streamReader); try { JsonSerializer val2 = new JsonSerializer(); return val2.Deserialize<T>((JsonReader)(object)val); } finally { ((IDisposable)val)?.Dispose(); } } private void MergeTokens(Dictionary<string, string> tokens) { if (!tokens.Any()) { return; } IEnumerable<KeyValuePair<string, string>> enumerable = from token in tokens where token.Key != "$schema" where !Tokens.ContainsKey(token.Key) select token; foreach (KeyValuePair<string, string> item in enumerable) { Tokens.Add(item.Key, item.Value); } } private string GetFullPath(string path) { return new FileInfo(Path.IsPathFullyQualified(path) ? path : Path.Combine(_baseTranslationsPath, path)).FullName; } } } namespace ZetAspectsTranslator.Models { public class TranslationSetting { [JsonProperty("language")] public string Language { get; set; } [JsonProperty(/*Could not decode attribute arguments.*/)] public Dictionary<string, string> Tokens { get; set; } = new Dictionary<string, string>(); [JsonProperty(/*Could not decode attribute arguments.*/)] public ExtendsSetting[] Extends { get; set; } = Array.Empty<ExtendsSetting>(); } } namespace ZetAspectsTranslator.Models.Extends { public class ExtendsSetting { [JsonProperty("path")] public string Path { get; set; } [JsonProperty(/*Could not decode attribute arguments.*/)] [JsonConverter(typeof(StringEnumConverter), new object[] { typeof(CamelCaseNamingStrategy) })] public ExtendsType Type { get; set; } = ExtendsType.Tokens; } public enum ExtendsType { Setting, Tokens } } namespace ZetAspectsTranslator.Models.Exceptions { public class CyclicalDependenceException : Exception { public string Path { get; } public override string Message => "A cyclical relationship has been discovered. The file \"" + Path + "\"it has already been processed."; public CyclicalDependenceException(string path) { Path = path; base..ctor(); } } public class EmptyTokensException : Exception { private readonly string _language; public override string Message => "The " + _language + " translation does not contain tokens"; public EmptyTokensException(string language) { _language = language; } } } namespace ZetAspectsTranslator.Controllers { public class TranslationController { public void RegisterTranslations(IEnumerable<ITranslationProvider> translations) { foreach (ITranslationProvider translation in translations) { RegisterTranslation(translation); } } public void RegisterTranslation(ITranslationProvider translation) { try { RegisterTokens(translation.Language, translation.Tokens); Log.Info($"Registered {translation.Language} translation ({translation.Tokens.Count} tokens)"); } catch (Exception data) { Log.Error(data); } } private void RegisterTokens(string language, Dictionary<string, string> tokens) { if (!tokens.Any()) { throw new EmptyTokensException(language); } string targetLanguage = Language.targetLanguage; Language.targetLanguage = language; foreach (KeyValuePair<string, string> token in tokens) { Language.RegisterFragment(token.Key, token.Value); } Language.targetLanguage = targetLanguage; } } }