Decompiled source of ValheimTooler v1.11.0
BepInEx/plugins/ValheimTooler/SharpConfig.dll
Decompiled 3 weeks agousing System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Text; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.6.1", FrameworkDisplayName = ".NET Framework 4.6.1")] [assembly: AssemblyCompany("SharpConfig")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("Copyright 2013-2020 Cemalettin Dervis")] [assembly: AssemblyDescription("An easy to use CFG/INI configuration library for .NET.")] [assembly: AssemblyFileVersion("3.2.9.1")] [assembly: AssemblyInformationalVersion("3.2.9.1")] [assembly: AssemblyProduct("SharpConfig")] [assembly: AssemblyTitle("SharpConfig")] [assembly: AssemblyVersion("3.2.9.1")] namespace SharpConfig; public class Configuration : IEnumerable<Section>, IEnumerable { private static CultureInfo mCultureInfo; private static char mPreferredCommentChar; private static char mArrayElementSeparator; private static Dictionary<Type, ITypeStringConverter> mTypeStringConverters; internal readonly List<Section> mSections; public string StringRepresentation { get { StringBuilder sb = new StringBuilder(); bool isFirstSection = true; Section defaultSection = DefaultSection; if (defaultSection.SettingCount > 0) { WriteSection(DefaultSection); } foreach (Section mSection in mSections) { if (mSection != defaultSection) { WriteSection(mSection); } } return sb.ToString(); void WriteSection(Section section) { if (!isFirstSection) { sb.AppendLine(); } if (!isFirstSection && section.PreComment != null) { sb.AppendLine(); } if (section.Name != "$SharpConfigDefaultSection") { sb.AppendLine(section.ToString()); } foreach (Setting item in section) { sb.AppendLine(item.ToString()); } if (section.Name != "$SharpConfigDefaultSection" || section.SettingCount > 0) { isFirstSection = false; } } } } internal static ITypeStringConverter FallbackConverter { get; private set; } public static CultureInfo CultureInfo { get { return mCultureInfo; } set { mCultureInfo = value ?? throw new ArgumentNullException("value"); } } public static char[] ValidCommentChars { get; private set; } public static char PreferredCommentChar { get { return mPreferredCommentChar; } set { if (!Array.Exists(ValidCommentChars, (char c) => c == value)) { throw new ArgumentException("The specified char '" + value + "' is not allowed as a comment char."); } mPreferredCommentChar = value; } } public static char ArrayElementSeparator { get { return mArrayElementSeparator; } set { if (value == '\0') { throw new ArgumentException("Zero-character is not allowed."); } mArrayElementSeparator = value; } } public static bool OutputRawStringValues { get; set; } public static bool IgnoreInlineComments { get; set; } public static bool IgnorePreComments { get; set; } public static bool SpaceBetweenEquals { get; set; } public int SectionCount => mSections.Count; public Section this[int index] { get { if (index < 0 || index >= mSections.Count) { throw new ArgumentOutOfRangeException("index"); } return mSections[index]; } } public Section this[string name] { get { Section section = FindSection(name); if (section == null) { section = new Section(name); Add(section); } return section; } } public Section DefaultSection => this["$SharpConfigDefaultSection"]; static Configuration() { mCultureInfo = (CultureInfo)CultureInfo.InvariantCulture.Clone(); ValidCommentChars = new char[2] { '#', ';' }; mPreferredCommentChar = '#'; mArrayElementSeparator = ','; FallbackConverter = new FallbackStringConverter(); mTypeStringConverters = new Dictionary<Type, ITypeStringConverter> { { typeof(bool), new BoolStringConverter() }, { typeof(byte), new ByteStringConverter() }, { typeof(char), new CharStringConverter() }, { typeof(DateTime), new DateTimeStringConverter() }, { typeof(decimal), new DecimalStringConverter() }, { typeof(double), new DoubleStringConverter() }, { typeof(Enum), new EnumStringConverter() }, { typeof(short), new Int16StringConverter() }, { typeof(int), new Int32StringConverter() }, { typeof(long), new Int64StringConverter() }, { typeof(sbyte), new SByteStringConverter() }, { typeof(float), new SingleStringConverter() }, { typeof(string), new StringStringConverter() }, { typeof(ushort), new UInt16StringConverter() }, { typeof(uint), new UInt32StringConverter() }, { typeof(ulong), new UInt64StringConverter() } }; IgnoreInlineComments = false; IgnorePreComments = false; SpaceBetweenEquals = false; OutputRawStringValues = false; } public Configuration() { mSections = new List<Section>(); } public IEnumerator<Section> GetEnumerator() { return mSections.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public void Add(Section section) { if (section == null) { throw new ArgumentNullException("section"); } if (Contains(section)) { throw new ArgumentException("The specified section already exists in the configuration."); } mSections.Add(section); } public Section Add(string sectionName) { Section section = new Section(sectionName); Add(section); return section; } public bool Remove(string sectionName) { if (string.IsNullOrEmpty(sectionName)) { throw new ArgumentNullException("sectionName"); } return Remove(FindSection(sectionName)); } public bool Remove(Section section) { return mSections.Remove(section); } public void RemoveAllNamed(string sectionName) { if (string.IsNullOrEmpty(sectionName)) { throw new ArgumentNullException("sectionName"); } while (Remove(sectionName)) { } } public void Clear() { mSections.Clear(); } public bool Contains(Section section) { return mSections.Contains(section); } public bool Contains(string sectionName) { if (string.IsNullOrEmpty(sectionName)) { throw new ArgumentNullException("sectionName"); } return FindSection(sectionName) != null; } public bool Contains(string sectionName, string settingName) { if (string.IsNullOrEmpty(sectionName)) { throw new ArgumentNullException("sectionName"); } if (string.IsNullOrEmpty(settingName)) { throw new ArgumentNullException("settingName"); } return FindSection(sectionName)?.Contains(settingName) ?? false; } public static void RegisterTypeStringConverter(ITypeStringConverter converter) { if (converter == null) { throw new ArgumentNullException("converter"); } Type convertibleType = converter.ConvertibleType; if (mTypeStringConverters.ContainsKey(convertibleType)) { throw new InvalidOperationException("A converter for type '" + convertibleType.FullName + "' is already registered."); } mTypeStringConverters.Add(convertibleType, converter); } public static void DeregisterTypeStringConverter(Type type) { if (type == null) { throw new ArgumentNullException("type"); } if (!mTypeStringConverters.ContainsKey(type)) { throw new InvalidOperationException("No converter is registered for type '" + type.FullName + "'."); } mTypeStringConverters.Remove(type); } internal static ITypeStringConverter FindTypeStringConverter(Type type) { if (type.IsEnum) { type = typeof(Enum); } if (!mTypeStringConverters.TryGetValue(type, out var value)) { return FallbackConverter; } return value; } public static Configuration LoadFromFile(string filename) { return LoadFromFile(filename, null); } public static Configuration LoadFromFile(string filename, Encoding encoding) { if (string.IsNullOrEmpty(filename)) { throw new ArgumentNullException("filename"); } if (!File.Exists(filename)) { throw new FileNotFoundException("Configuration file not found.", filename); } if (encoding != null) { return LoadFromString(File.ReadAllText(filename, encoding)); } return LoadFromString(File.ReadAllText(filename)); } public static Configuration LoadFromStream(Stream stream) { return LoadFromStream(stream, null); } public static Configuration LoadFromStream(Stream stream, Encoding encoding) { if (stream == null) { throw new ArgumentNullException("stream"); } string source = null; StreamReader streamReader = ((encoding == null) ? new StreamReader(stream) : new StreamReader(stream, encoding)); using (streamReader) { source = streamReader.ReadToEnd(); } return LoadFromString(source); } public static Configuration LoadFromString(string source) { if (source == null) { throw new ArgumentNullException("source"); } return ConfigurationReader.ReadFromString(source); } public static Configuration LoadFromBinaryFile(string filename) { return LoadFromBinaryFile(filename, null); } public static Configuration LoadFromBinaryFile(string filename, BinaryReader reader) { if (string.IsNullOrEmpty(filename)) { throw new ArgumentNullException("filename"); } using FileStream stream = File.OpenRead(filename); return LoadFromBinaryStream(stream, reader); } public static Configuration LoadFromBinaryStream(Stream stream) { return LoadFromBinaryStream(stream, null); } public static Configuration LoadFromBinaryStream(Stream stream, BinaryReader reader) { if (stream == null) { throw new ArgumentNullException("stream"); } return ConfigurationReader.ReadFromBinaryStream(stream, reader); } public void SaveToFile(string filename) { SaveToFile(filename, null); } public void SaveToFile(string filename, Encoding encoding) { if (string.IsNullOrEmpty(filename)) { throw new ArgumentNullException("filename"); } using FileStream stream = new FileStream(filename, FileMode.Create, FileAccess.Write); SaveToStream(stream, encoding); } public void SaveToStream(Stream stream) { SaveToStream(stream, null); } public void SaveToStream(Stream stream, Encoding encoding) { if (stream == null) { throw new ArgumentNullException("stream"); } ConfigurationWriter.WriteToStreamTextual(this, stream, encoding); } public void SaveToBinaryFile(string filename) { SaveToBinaryFile(filename, null); } public void SaveToBinaryFile(string filename, BinaryWriter writer) { if (string.IsNullOrEmpty(filename)) { throw new ArgumentNullException("filename"); } using FileStream stream = new FileStream(filename, FileMode.Create, FileAccess.Write); SaveToBinaryStream(stream, writer); } public void SaveToBinaryStream(Stream stream) { SaveToBinaryStream(stream, null); } public void SaveToBinaryStream(Stream stream, BinaryWriter writer) { if (stream == null) { throw new ArgumentNullException("stream"); } ConfigurationWriter.WriteToStreamBinary(this, stream, writer); } public IEnumerable<Section> GetSectionsNamed(string name) { List<Section> list = new List<Section>(); foreach (Section mSection in mSections) { if (string.Equals(mSection.Name, name, StringComparison.OrdinalIgnoreCase)) { list.Add(mSection); } } return list; } private Section FindSection(string name) { foreach (Section mSection in mSections) { if (string.Equals(mSection.Name, name, StringComparison.OrdinalIgnoreCase)) { return mSection; } } return null; } } public abstract class ConfigurationElement { public string Name { get; } public string Comment { get; set; } public string PreComment { get; set; } internal ConfigurationElement(string name) { if (string.IsNullOrEmpty(name)) { throw new ArgumentNullException("name"); } Name = name; } public override string ToString() { string stringExpression = GetStringExpression(); if (Comment != null && PreComment != null && !Configuration.IgnoreInlineComments && !Configuration.IgnorePreComments) { return GetFormattedPreComment() + Environment.NewLine + stringExpression + " " + GetFormattedComment(); } if (Comment != null && !Configuration.IgnoreInlineComments) { return stringExpression + " " + GetFormattedComment(); } if (PreComment != null && !Configuration.IgnorePreComments) { return GetFormattedPreComment() + Environment.NewLine + stringExpression; } return stringExpression; } private string GetFormattedComment() { string text = Comment; int num = Comment.IndexOfAny(Environment.NewLine.ToCharArray()); if (num >= 0) { text = text.Substring(0, num); } return Configuration.PreferredCommentChar + " " + text; } private string GetFormattedPreComment() { string[] array = PreComment.Split(new string[2] { "\r\n", "\n" }, StringSplitOptions.None); return string.Join(Environment.NewLine, Array.ConvertAll(array, (string s) => Configuration.PreferredCommentChar + " " + s)); } protected abstract string GetStringExpression(); } internal static class ConfigurationReader { internal static Configuration ReadFromString(string source) { Configuration configuration = new Configuration(); using StringReader reader = new StringReader(source); Parse(reader, configuration); return configuration; } private static void Parse(StringReader reader, Configuration config) { Section section = new Section("$SharpConfigDefaultSection"); StringBuilder stringBuilder = new StringBuilder(); int length = Environment.NewLine.Length; int num = 0; string text; while ((text = reader.ReadLine()) != null) { num++; text = text.Trim(); if (string.IsNullOrEmpty(text)) { continue; } int commentIndex; string text2 = ParseComment(text, out commentIndex); if (commentIndex == 0) { if (!Configuration.IgnorePreComments) { stringBuilder.AppendLine(text2); } continue; } string text3 = text; if (commentIndex > 0) { text3 = text.Remove(commentIndex).Trim(); } if (text3.StartsWith("[")) { if (section != null && section.Name == "$SharpConfigDefaultSection") { config.mSections.Add(section); } section = ParseSection(text3, num); if (!Configuration.IgnoreInlineComments) { section.Comment = text2; } if (!Configuration.IgnorePreComments && stringBuilder.Length > 0) { stringBuilder.Remove(stringBuilder.Length - length, length); section.PreComment = stringBuilder.ToString(); stringBuilder.Length = 0; } config.mSections.Add(section); } else { Setting setting = ParseSetting(Configuration.IgnoreInlineComments ? text : text3, num); if (!Configuration.IgnoreInlineComments) { setting.Comment = text2; } if (section == null) { throw new ParserException($"The setting '{setting.Name}' has to be in a section.", num); } if (!Configuration.IgnorePreComments && stringBuilder.Length > 0) { stringBuilder.Remove(stringBuilder.Length - length, length); setting.PreComment = stringBuilder.ToString(); stringBuilder.Length = 0; } section.Add(setting); } } } private static bool IsInQuoteMarks(string line, int startIndex) { int num = startIndex; bool flag = false; while (--num >= 0) { if (line[num] == '"') { flag = true; break; } } bool flag2 = line.IndexOf('"', startIndex) > 0; return flag && flag2; } private static string ParseComment(string line, out int commentIndex) { string result = null; commentIndex = -1; do { commentIndex = line.IndexOfAny(Configuration.ValidCommentChars, commentIndex + 1); if (commentIndex < 0) { break; } if (commentIndex > 0 && line[commentIndex - 1] == '\\') { commentIndex = -1; return null; } if (!IsInQuoteMarks(line, commentIndex)) { result = line.Substring(commentIndex + 1).Trim(); break; } } while (commentIndex >= 0); return result; } private static Section ParseSection(string line, int lineNumber) { int num = line.LastIndexOf(']'); if (num < 0) { throw new ParserException("closing bracket missing.", lineNumber); } if (line.Length - 1 > num && line.Substring(num + 1).Trim().IndexOfAny(Configuration.ValidCommentChars) != 0) { string arg = line.Substring(num + 1); throw new ParserException($"unexpected token '{arg}'", lineNumber); } return new Section(line.Substring(1, line.Length - 2).Trim()); } private static Setting ParseSetting(string line, int lineNumber) { string text = null; bool flag = line.StartsWith("\""); int num2; if (flag) { int num = 0; do { num = line.IndexOf('"', num + 1); } while (num > 0 && line[num - 1] == '\\'); if (num < 0) { throw new ParserException("closing quote mark expected.", lineNumber); } text = line.Substring(1, num - 1); num2 = line.IndexOf('=', num + 1); } else { num2 = line.IndexOf('='); } if (num2 < 0) { throw new ParserException("setting assignment expected.", lineNumber); } if (!flag) { text = line.Substring(0, num2).Trim(); } string text2 = line.Substring(num2 + 1); text2 = text2.Trim(); if (string.IsNullOrEmpty(text)) { throw new ParserException("setting name expected.", lineNumber); } return new Setting(text, text2); } internal static Configuration ReadFromBinaryStream(Stream stream, BinaryReader reader) { if (stream == null) { throw new ArgumentNullException("stream"); } if (reader == null) { reader = new BinaryReader(stream); } Configuration configuration = new Configuration(); int num = reader.ReadInt32(); for (int i = 0; i < num; i++) { string name = reader.ReadString(); int num2 = reader.ReadInt32(); Section section = new Section(name); ReadCommentsBinary(reader, section); for (int j = 0; j < num2; j++) { Setting setting = new Setting(reader.ReadString()) { RawValue = reader.ReadString() }; ReadCommentsBinary(reader, setting); section.Add(setting); } configuration.Add(section); } return configuration; } private static void ReadCommentsBinary(BinaryReader reader, ConfigurationElement element) { if (reader.ReadBoolean()) { reader.ReadChar(); element.Comment = reader.ReadString(); } if (reader.ReadBoolean()) { reader.ReadChar(); element.PreComment = reader.ReadString(); } } } internal static class ConfigurationWriter { private class NonClosingBinaryWriter : BinaryWriter { public NonClosingBinaryWriter(Stream stream) : base(stream) { } protected override void Dispose(bool disposing) { } } internal static void WriteToStreamTextual(Configuration cfg, Stream stream, Encoding encoding) { if (stream == null) { throw new ArgumentNullException("stream"); } if (encoding == null) { encoding = Encoding.UTF8; } string stringRepresentation = cfg.StringRepresentation; byte[] array = new byte[encoding.GetByteCount(stringRepresentation)]; int bytes = encoding.GetBytes(stringRepresentation, 0, stringRepresentation.Length, array, 0); stream.Write(array, 0, bytes); stream.Flush(); } internal static void WriteToStreamBinary(Configuration cfg, Stream stream, BinaryWriter writer) { if (stream == null) { throw new ArgumentNullException("stream"); } if (writer == null) { writer = new NonClosingBinaryWriter(stream); } writer.Write(cfg.SectionCount); foreach (Section item in cfg) { writer.Write(item.Name); writer.Write(item.SettingCount); WriteCommentsBinary(writer, item); foreach (Setting item2 in item) { writer.Write(item2.Name); writer.Write(item2.RawValue); WriteCommentsBinary(writer, item2); } } writer.Close(); } private static void WriteCommentsBinary(BinaryWriter writer, ConfigurationElement element) { writer.Write(element.Comment != null); if (element.Comment != null) { writer.Write(' '); writer.Write(element.Comment); } writer.Write(element.PreComment != null); if (element.PreComment != null) { writer.Write(' '); writer.Write(element.PreComment); } } } public sealed class IgnoreAttribute : Attribute { } public interface ITypeStringConverter { Type ConvertibleType { get; } string ConvertToString(object value); object TryConvertFromString(string value, Type hint); } public abstract class TypeStringConverter<T> : ITypeStringConverter { public Type ConvertibleType => typeof(T); public abstract string ConvertToString(object value); public abstract object TryConvertFromString(string value, Type hint); } [Serializable] public sealed class ParserException : Exception { public int Line { get; private set; } internal ParserException(string message, int line) : base($"Line {line}: {message}") { Line = line; } } public sealed class Section : ConfigurationElement, IEnumerable<Setting>, IEnumerable { public const string DefaultSectionName = "$SharpConfigDefaultSection"; private readonly List<Setting> mSettings; public int SettingCount => mSettings.Count; public Setting this[int index] { get { if (index < 0 || index >= mSettings.Count) { throw new ArgumentOutOfRangeException("index"); } return mSettings[index]; } } public Setting this[string name] { get { Setting setting = FindSetting(name); if (setting == null) { setting = new Setting(name); mSettings.Add(setting); } return setting; } } public Section(string name) : base(name) { mSettings = new List<Setting>(); } public static Section FromObject(string name, object obj) { if (string.IsNullOrEmpty(name)) { throw new ArgumentException("The section name must not be null or empty.", "name"); } if (obj == null) { throw new ArgumentNullException("obj"); } Section section = new Section(name); Type type = obj.GetType(); PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public); foreach (PropertyInfo propertyInfo in properties) { if (propertyInfo.CanRead && !ShouldIgnoreMappingFor(propertyInfo)) { Setting item = new Setting(propertyInfo.Name, propertyInfo.GetValue(obj, null)); section.mSettings.Add(item); } } FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public); foreach (FieldInfo fieldInfo in fields) { if (!ShouldIgnoreMappingFor(fieldInfo)) { Setting item2 = new Setting(fieldInfo.Name, fieldInfo.GetValue(obj)); section.mSettings.Add(item2); } } return section; } public T ToObject<T>() where T : new() { T val = new T(); SetValuesTo(val); return val; } public object ToObject(Type type) { if (type == null) { throw new ArgumentNullException(type.Name); } object obj = Activator.CreateInstance(type); SetValuesTo(obj); return obj; } public void GetValuesFrom(object obj) { if (obj == null) { throw new ArgumentNullException("obj"); } Type type = obj.GetType(); PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public); foreach (PropertyInfo propertyInfo in properties) { if (propertyInfo.CanRead) { SetSettingValueFromMemberInfo(propertyInfo, obj); } } FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public); foreach (FieldInfo info in fields) { SetSettingValueFromMemberInfo(info, obj); } } private void SetSettingValueFromMemberInfo(MemberInfo info, object instance) { if (ShouldIgnoreMappingFor(info)) { return; } Setting setting = FindSetting(info.Name); if (setting != null) { object value = null; if (info is FieldInfo) { value = ((FieldInfo)info).GetValue(instance); } else if (info is PropertyInfo) { value = ((PropertyInfo)info).GetValue(instance, null); } setting.SetValue(value); } } public void SetValuesTo(object obj) { if (obj == null) { throw new ArgumentNullException("obj"); } Type type = obj.GetType(); PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public); foreach (PropertyInfo propertyInfo in properties) { if (!propertyInfo.CanWrite || ShouldIgnoreMappingFor(propertyInfo)) { continue; } Setting setting = FindSetting(propertyInfo.Name); if (setting == null) { continue; } object obj2 = (propertyInfo.PropertyType.IsArray ? setting.GetValueArray(propertyInfo.PropertyType.GetElementType()) : setting.GetValue(propertyInfo.PropertyType)); if (propertyInfo.PropertyType.IsArray) { Array array = obj2 as Array; Array array2 = propertyInfo.GetValue(obj, null) as Array; if (array != null && (array2 == null || array2.Length != array.Length)) { array2 = Array.CreateInstance(propertyInfo.PropertyType.GetElementType(), array.Length); } for (int j = 0; j < array.Length; j++) { array2?.SetValue(array.GetValue(j), j); } propertyInfo.SetValue(obj, array2, null); } else { propertyInfo.SetValue(obj, obj2, null); } } FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public); foreach (FieldInfo fieldInfo in fields) { if (fieldInfo.IsInitOnly || ShouldIgnoreMappingFor(fieldInfo)) { continue; } Setting setting2 = FindSetting(fieldInfo.Name); if (setting2 == null) { continue; } object obj3 = (fieldInfo.FieldType.IsArray ? setting2.GetValueArray(fieldInfo.FieldType.GetElementType()) : setting2.GetValue(fieldInfo.FieldType)); if (fieldInfo.FieldType.IsArray) { Array array3 = obj3 as Array; Array array4 = fieldInfo.GetValue(obj) as Array; if (array3 != null && (array4 == null || array4.Length != array3.Length)) { array4 = Array.CreateInstance(fieldInfo.FieldType.GetElementType(), array3.Length); } for (int k = 0; k < array3.Length; k++) { array4.SetValue(array3.GetValue(k), k); } fieldInfo.SetValue(obj, array4); } else { fieldInfo.SetValue(obj, obj3); } } } private static bool ShouldIgnoreMappingFor(MemberInfo member) { if (member.GetCustomAttributes(typeof(IgnoreAttribute), inherit: false).Length != 0) { return true; } if (member as PropertyInfo != null) { return (member as PropertyInfo).PropertyType.GetCustomAttributes(typeof(IgnoreAttribute), inherit: false).Length != 0; } if (member as FieldInfo != null) { return (member as FieldInfo).FieldType.GetCustomAttributes(typeof(IgnoreAttribute), inherit: false).Length != 0; } return false; } public IEnumerator<Setting> GetEnumerator() { return mSettings.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public void Add(Setting setting) { if (setting == null) { throw new ArgumentNullException("setting"); } if (Contains(setting)) { throw new ArgumentException("The specified setting already exists in the section."); } mSettings.Add(setting); } public Setting Add(string settingName) { return Add(settingName, string.Empty); } public Setting Add(string settingName, object settingValue) { Setting setting = new Setting(settingName, settingValue); Add(setting); return setting; } public bool Remove(string settingName) { if (string.IsNullOrEmpty(settingName)) { throw new ArgumentNullException("settingName"); } return Remove(FindSetting(settingName)); } public bool Remove(Setting setting) { return mSettings.Remove(setting); } public void RemoveAllNamed(string settingName) { if (string.IsNullOrEmpty(settingName)) { throw new ArgumentNullException("settingName"); } while (Remove(settingName)) { } } public void Clear() { mSettings.Clear(); } public bool Contains(Setting setting) { return mSettings.Contains(setting); } public bool Contains(string settingName) { if (string.IsNullOrEmpty(settingName)) { throw new ArgumentNullException("settingName"); } return FindSetting(settingName) != null; } public IEnumerable<Setting> GetSettingsNamed(string name) { List<Setting> list = new List<Setting>(); foreach (Setting mSetting in mSettings) { if (string.Equals(mSetting.Name, name, StringComparison.OrdinalIgnoreCase)) { list.Add(mSetting); } } return list; } private Setting FindSetting(string name) { foreach (Setting mSetting in mSettings) { if (string.Equals(mSetting.Name, name, StringComparison.OrdinalIgnoreCase)) { return mSetting; } } return null; } protected override string GetStringExpression() { return "[" + base.Name + "]"; } } public sealed class Setting : ConfigurationElement { private int mCachedArraySize; private bool mShouldCalculateArraySize; private char mCachedArrayElementSeparator; public bool IsEmpty => string.IsNullOrEmpty(RawValue); [Obsolete("Use StringValue instead")] public string StringValueTrimmed { get { string text = StringValue; if (text[0] == '"') { text = text.Trim(new char[1] { '"' }); } return text; } } public string RawValue { get; set; } = string.Empty; public string StringValue { get { return GetValue<string>().Trim(new char[1] { '"' }); } set { SetValue(value.Trim(new char[1] { '"' })); } } public string[] StringValueArray { get { return GetValueArray<string>(); } set { SetValue(value); } } public int IntValue { get { return GetValue<int>(); } set { SetValue(value); } } public int[] IntValueArray { get { return GetValueArray<int>(); } set { SetValue(value); } } public float FloatValue { get { return GetValue<float>(); } set { SetValue(value); } } public float[] FloatValueArray { get { return GetValueArray<float>(); } set { SetValue(value); } } public double DoubleValue { get { return GetValue<double>(); } set { SetValue(value); } } public double[] DoubleValueArray { get { return GetValueArray<double>(); } set { SetValue(value); } } public decimal DecimalValue { get { return GetValue<decimal>(); } set { SetValue(value); } } public decimal[] DecimalValueArray { get { return GetValueArray<decimal>(); } set { SetValue(value); } } public bool BoolValue { get { return GetValue<bool>(); } set { SetValue(value); } } public bool[] BoolValueArray { get { return GetValueArray<bool>(); } set { SetValue(value); } } public DateTime DateTimeValue { get { return GetValue<DateTime>(); } set { SetValue(value); } } public DateTime[] DateTimeValueArray { get { return GetValueArray<DateTime>(); } set { SetValue(value); } } public byte ByteValue { get { return GetValue<byte>(); } set { SetValue(value); } } public byte[] ByteValueArray { get { return GetValueArray<byte>(); } set { SetValue(value); } } public sbyte SByteValue { get { return GetValue<sbyte>(); } set { SetValue(value); } } public sbyte[] SByteValueArray { get { return GetValueArray<sbyte>(); } set { SetValue(value); } } public char CharValue { get { return GetValue<char>(); } set { SetValue(value); } } public char[] CharValueArray { get { if (ByteValueArray != null) { return Encoding.UTF8.GetChars(ByteValueArray); } return null; } set { if (value != null) { ByteValueArray = Encoding.UTF8.GetBytes(value); } else { SetEmptyValue(); } } } public bool IsArray => ArraySize >= 0; public int ArraySize { get { if (mCachedArrayElementSeparator != Configuration.ArrayElementSeparator) { mCachedArrayElementSeparator = Configuration.ArrayElementSeparator; mShouldCalculateArraySize = true; } if (mShouldCalculateArraySize) { mCachedArraySize = CalculateArraySize(); mShouldCalculateArraySize = false; } return mCachedArraySize; } } public Setting(string name) : this(name, string.Empty) { } public Setting(string name, object value) : base(name) { SetValue(value); mCachedArrayElementSeparator = Configuration.ArrayElementSeparator; } private int CalculateArraySize() { int num = 0; SettingArrayEnumerator settingArrayEnumerator = new SettingArrayEnumerator(RawValue, shouldCalcElemString: false); while (settingArrayEnumerator.Next()) { num++; } if (!settingArrayEnumerator.IsValid) { return -1; } return num; } public object GetValue(Type type) { if (type == null) { throw new ArgumentNullException("type"); } if (type.IsArray) { throw new InvalidOperationException("To obtain an array value, use GetValueArray() instead of GetValue()."); } if (IsArray) { throw new InvalidOperationException("The setting represents an array. Use GetValueArray() to obtain its value."); } return CreateObjectFromString(RawValue, type); } public object[] GetValueArray(Type elementType) { if (elementType.IsArray) { throw CreateJaggedArraysNotSupportedEx(elementType); } int arraySize = ArraySize; if (ArraySize < 0) { return null; } object[] array = new object[arraySize]; if (arraySize > 0) { SettingArrayEnumerator settingArrayEnumerator = new SettingArrayEnumerator(RawValue, shouldCalcElemString: true); int num = 0; while (settingArrayEnumerator.Next()) { array[num] = CreateObjectFromString(settingArrayEnumerator.Current, elementType); num++; } } return array; } public T GetValue<T>() { Type typeFromHandle = typeof(T); if (typeFromHandle.IsArray) { throw new InvalidOperationException("To obtain an array value, use GetValueArray() instead of GetValue()."); } if (IsArray) { throw new InvalidOperationException("The setting represents an array. Use GetValueArray() to obtain its value."); } return (T)CreateObjectFromString(RawValue, typeFromHandle); } public T[] GetValueArray<T>() { Type typeFromHandle = typeof(T); if (typeFromHandle.IsArray) { throw CreateJaggedArraysNotSupportedEx(typeFromHandle); } int arraySize = ArraySize; if (arraySize < 0) { return null; } T[] array = new T[arraySize]; if (arraySize > 0) { SettingArrayEnumerator settingArrayEnumerator = new SettingArrayEnumerator(RawValue, shouldCalcElemString: true); int num = 0; while (settingArrayEnumerator.Next()) { array[num] = (T)CreateObjectFromString(settingArrayEnumerator.Current, typeFromHandle); num++; } } return array; } public T GetValueOrDefault<T>(T defaultValue, bool setDefault = false) { Type typeFromHandle = typeof(T); if (typeFromHandle.IsArray) { throw new InvalidOperationException("GetValueOrDefault<T> cannot be used with arrays."); } if (IsArray) { throw new InvalidOperationException("The setting represents an array. Use GetValueArray() to obtain its value."); } object obj = CreateObjectFromString(RawValue, typeFromHandle, tryConvert: true); if (obj != null) { return (T)obj; } if (setDefault) { SetValue(defaultValue); } return defaultValue; } private static object CreateObjectFromString(string value, Type dstType, bool tryConvert = false) { Type underlyingType = Nullable.GetUnderlyingType(dstType); if (underlyingType != null) { if (string.IsNullOrEmpty(value)) { return null; } dstType = underlyingType; } object obj = Configuration.FindTypeStringConverter(dstType).TryConvertFromString(value, dstType); if (obj == null && !tryConvert) { throw SettingValueCastException.Create(value, dstType, null); } return obj; } public void SetValue(object value) { if (value == null) { SetEmptyValue(); return; } Type type = value.GetType(); if (type.IsArray) { Type elementType = type.GetElementType(); if (elementType != null && elementType.IsArray) { throw CreateJaggedArraysNotSupportedEx(type.GetElementType()); } Array array = value as Array; if (array != null) { string[] array2 = new string[array.Length]; for (int i = 0; i < array.Length; i++) { object value2 = array.GetValue(i); ITypeStringConverter typeStringConverter = Configuration.FindTypeStringConverter(value2.GetType()); array2[i] = GetValueForOutput(typeStringConverter.ConvertToString(value2)); } RawValue = "{" + string.Join(Configuration.ArrayElementSeparator.ToString(), array2) + "}"; } if (array != null) { mCachedArraySize = array.Length; } mShouldCalculateArraySize = false; } else { ITypeStringConverter typeStringConverter2 = Configuration.FindTypeStringConverter(type); RawValue = typeStringConverter2.ConvertToString(value); mShouldCalculateArraySize = true; } } private void SetEmptyValue() { RawValue = string.Empty; mCachedArraySize = -1; mShouldCalculateArraySize = false; } private static string GetValueForOutput(string rawValue) { if (Configuration.OutputRawStringValues) { return rawValue; } if (rawValue.StartsWith("{") && rawValue.EndsWith("}")) { return rawValue; } if (rawValue.StartsWith("\"") && rawValue.EndsWith("\"")) { return rawValue; } if (rawValue.IndexOf(" ", StringComparison.Ordinal) >= 0 || (rawValue.IndexOfAny(Configuration.ValidCommentChars) >= 0 && !Configuration.IgnoreInlineComments)) { rawValue = "\"" + rawValue + "\""; } return rawValue; } protected override string GetStringExpression() { if (Configuration.SpaceBetweenEquals) { return base.Name + " = " + GetValueForOutput(RawValue); } return base.Name + "=" + GetValueForOutput(RawValue); } private static ArgumentException CreateJaggedArraysNotSupportedEx(Type type) { Type elementType = type.GetElementType(); while (elementType != null && elementType.IsArray) { elementType = elementType.GetElementType(); } throw new ArgumentException("Jagged arrays are not supported. The type you have specified is '" + type.Name + "', but '" + elementType?.Name + "' was expected."); } } internal sealed class SettingArrayEnumerator { private readonly string mStringValue; private readonly bool mShouldCalcElemString; private int mIdxInString; private readonly int mLastRBraceIdx; private int mPrevElemIdxInString; private int mBraceBalance; private bool mIsInQuotes; private bool mIsDone; public string Current { get; private set; } public bool IsValid { get; private set; } public SettingArrayEnumerator(string value, bool shouldCalcElemString) { mStringValue = value; mIdxInString = -1; mLastRBraceIdx = -1; mShouldCalcElemString = shouldCalcElemString; IsValid = true; mIsDone = false; for (int i = 0; i < value.Length; i++) { char c = value[i]; if (c != ' ' && c != '{') { break; } if (c == '{') { mIdxInString = i + 1; mBraceBalance = 1; mPrevElemIdxInString = i + 1; break; } } if (mIdxInString < 0) { IsValid = false; mIsDone = true; return; } for (int num = value.Length - 1; num >= 0; num--) { char c2 = value[num]; if (c2 != ' ' && c2 != '}') { break; } if (c2 == '}') { mLastRBraceIdx = num; break; } } if (mLastRBraceIdx < 0) { IsValid = false; mIsDone = true; } else if (mIdxInString == mLastRBraceIdx || !IsNonEmptyValue(mStringValue, mIdxInString, mLastRBraceIdx)) { IsValid = true; mIsDone = true; } } private void UpdateElementString(int idx) { Current = mStringValue.Substring(mPrevElemIdxInString, idx - mPrevElemIdxInString); Current = Current.Trim(new char[1] { ' ' }); if (Current[Current.Length - 1] == '"') { Current = Current.Remove(Current.Length - 1, 1); } if (Current[0] == '"') { Current = Current.Remove(0, 1); } } public bool Next() { if (mIsDone) { return false; } int i; for (i = mIdxInString; i <= mLastRBraceIdx; i++) { char c = mStringValue[i]; if (c == '{' && !mIsInQuotes) { mBraceBalance++; } else if (c == '}' && !mIsInQuotes) { mBraceBalance--; if (i == mLastRBraceIdx) { if (!IsNonEmptyValue(mStringValue, mPrevElemIdxInString, i)) { IsValid = false; } else if (mShouldCalcElemString) { UpdateElementString(i); } mIsDone = true; break; } } else if (c == '"') { int num = mStringValue.IndexOf('"', i + 1); if (num > 0 && mStringValue[num - 1] != '\\') { i = num; mIsInQuotes = false; } else { mIsInQuotes = true; } } else if (c == Configuration.ArrayElementSeparator && mBraceBalance == 1 && !mIsInQuotes) { if (!IsNonEmptyValue(mStringValue, mPrevElemIdxInString, i)) { IsValid = false; } else if (mShouldCalcElemString) { UpdateElementString(i); } mPrevElemIdxInString = i + 1; i++; break; } } mIdxInString = i; if (mIsInQuotes) { IsValid = false; } return IsValid; } private static bool IsNonEmptyValue(string s, int begin, int end) { while (begin < end) { if (s[begin] != ' ') { return true; } begin++; } return false; } } [Serializable] public sealed class SettingValueCastException : Exception { private SettingValueCastException(string message, Exception innerException) : base(message, innerException) { } internal static SettingValueCastException Create(string stringValue, Type dstType, Exception innerException) { return new SettingValueCastException("Failed to convert value '" + stringValue + "' to type " + dstType.FullName + ".", innerException); } } internal sealed class FallbackStringConverter : ITypeStringConverter { public Type ConvertibleType => null; public string ConvertToString(object value) { try { return TypeDescriptor.GetConverter(value).ConvertToString(null, Configuration.CultureInfo, value); } catch (Exception innerException) { throw SettingValueCastException.Create(value.ToString(), value.GetType(), innerException); } } public object ConvertFromString(string value, Type hint) { try { return TypeDescriptor.GetConverter(hint).ConvertFrom(null, Configuration.CultureInfo, value); } catch (Exception innerException) { throw SettingValueCastException.Create(value, hint, innerException); } } public object TryConvertFromString(string value, Type hint) { return ConvertFromString(value, hint); } } internal sealed class BoolStringConverter : TypeStringConverter<bool> { public override string ConvertToString(object value) { return value.ToString(); } public override object TryConvertFromString(string value, Type hint) { switch (value.ToLowerInvariant()) { case "": case "false": case "off": case "no": case "n": case "0": return false; case "true": case "on": case "yes": case "y": case "1": return true; default: return null; } } } internal sealed class ByteStringConverter : TypeStringConverter<byte> { public override string ConvertToString(object value) { return value.ToString(); } public override object TryConvertFromString(string value, Type hint) { if (value == string.Empty) { return (byte)0; } if (!byte.TryParse(value, NumberStyles.Integer, Configuration.CultureInfo.NumberFormat, out var result)) { return null; } return result; } } internal sealed class CharStringConverter : TypeStringConverter<char> { public override string ConvertToString(object value) { return value.ToString(); } public override object TryConvertFromString(string value, Type hint) { if (value == string.Empty) { return '\0'; } if (!char.TryParse(value, out var result)) { return null; } return result; } } internal sealed class DateTimeStringConverter : TypeStringConverter<DateTime> { public override string ConvertToString(object value) { return ((DateTime)value).ToString(Configuration.CultureInfo.DateTimeFormat); } public override object TryConvertFromString(string value, Type hint) { if (value == string.Empty) { return default(DateTime); } if (!DateTime.TryParse(value, Configuration.CultureInfo.DateTimeFormat, DateTimeStyles.None, out var result)) { return null; } return result; } } internal sealed class DecimalStringConverter : TypeStringConverter<decimal> { public override string ConvertToString(object value) { return ((decimal)value).ToString(Configuration.CultureInfo.NumberFormat); } public override object TryConvertFromString(string value, Type hint) { if (value == string.Empty) { return 0m; } if (!decimal.TryParse(value, NumberStyles.Number, Configuration.CultureInfo.NumberFormat, out var result)) { return null; } return result; } } internal sealed class DoubleStringConverter : TypeStringConverter<double> { public override string ConvertToString(object value) { return ((double)value).ToString(Configuration.CultureInfo.NumberFormat); } public override object TryConvertFromString(string value, Type hint) { if (value == string.Empty) { return 0.0; } if (!double.TryParse(value, NumberStyles.Float | NumberStyles.AllowThousands, Configuration.CultureInfo.NumberFormat, out var result)) { return null; } return result; } } internal sealed class EnumStringConverter : TypeStringConverter<Enum> { public override string ConvertToString(object value) { return value.ToString(); } public override object TryConvertFromString(string value, Type hint) { if (value == string.Empty) { return 0.0; } value = RemoveTypeNames(value); if (!Enum.IsDefined(hint, value)) { return null; } return Enum.Parse(hint, value); } private static string RemoveTypeNames(string value) { int num = value.LastIndexOf('.'); if (num >= 0) { value = value.Substring(num + 1, value.Length - num - 1).Trim(); } return value; } } internal sealed class Int16StringConverter : TypeStringConverter<short> { public override string ConvertToString(object value) { return ((short)value).ToString(Configuration.CultureInfo.NumberFormat); } public override object TryConvertFromString(string value, Type hint) { if (value == string.Empty) { return (short)0; } if (!short.TryParse(value, NumberStyles.Integer, Configuration.CultureInfo.NumberFormat, out var result)) { return null; } return result; } } internal sealed class Int32StringConverter : TypeStringConverter<int> { public override string ConvertToString(object value) { return ((int)value).ToString(Configuration.CultureInfo.NumberFormat); } public override object TryConvertFromString(string value, Type hint) { if (value == string.Empty) { return 0; } if (!int.TryParse(value, NumberStyles.Integer, Configuration.CultureInfo.NumberFormat, out var result)) { return null; } return result; } } internal sealed class Int64StringConverter : TypeStringConverter<long> { public override string ConvertToString(object value) { return ((long)value).ToString(Configuration.CultureInfo.NumberFormat); } public override object TryConvertFromString(string value, Type hint) { if (value == string.Empty) { return 0L; } if (!long.TryParse(value, NumberStyles.Integer, Configuration.CultureInfo.NumberFormat, out var result)) { return null; } return result; } } internal sealed class SByteStringConverter : TypeStringConverter<sbyte> { public override string ConvertToString(object value) { return ((sbyte)value).ToString(Configuration.CultureInfo.NumberFormat); } public override object TryConvertFromString(string value, Type hint) { if (value == string.Empty) { return (sbyte)0; } if (!sbyte.TryParse(value, NumberStyles.Integer, Configuration.CultureInfo.NumberFormat, out var result)) { return null; } return result; } } internal sealed class SingleStringConverter : TypeStringConverter<float> { public override string ConvertToString(object value) { return ((float)value).ToString(Configuration.CultureInfo.NumberFormat); } public override object TryConvertFromString(string value, Type hint) { if (value == string.Empty) { return 0f; } if (!float.TryParse(value, NumberStyles.Float | NumberStyles.AllowThousands, Configuration.CultureInfo.NumberFormat, out var result)) { return null; } return result; } } internal sealed class StringStringConverter : TypeStringConverter<string> { public override string ConvertToString(object value) { return value.ToString().Trim(new char[1] { '"' }); } public override object TryConvertFromString(string value, Type hint) { return value.Trim(new char[1] { '"' }); } } internal sealed class UInt16StringConverter : TypeStringConverter<ushort> { public override string ConvertToString(object value) { return ((ushort)value).ToString(Configuration.CultureInfo.NumberFormat); } public override object TryConvertFromString(string value, Type hint) { if (value == string.Empty) { return (ushort)0; } if (!ushort.TryParse(value, NumberStyles.Integer, Configuration.CultureInfo.NumberFormat, out var result)) { return null; } return result; } } internal sealed class UInt32StringConverter : TypeStringConverter<uint> { public override string ConvertToString(object value) { return ((uint)value).ToString(Configuration.CultureInfo.NumberFormat); } public override object TryConvertFromString(string value, Type hint) { if (value == string.Empty) { return 0u; } if (!uint.TryParse(value, NumberStyles.Integer, Configuration.CultureInfo.NumberFormat, out var result)) { return null; } return result; } } internal sealed class UInt64StringConverter : TypeStringConverter<ulong> { public override string ConvertToString(object value) { return ((ulong)value).ToString(Configuration.CultureInfo.NumberFormat); } public override object TryConvertFromString(string value, Type hint) { if (value == string.Empty) { return 0uL; } if (!ulong.TryParse(value, NumberStyles.Integer, Configuration.CultureInfo.NumberFormat, out var result)) { return null; } return result; } }
BepInEx/plugins/ValheimTooler/ValheimTooler.dll
Decompiled 3 weeks ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Text; using System.Text.RegularExpressions; using HarmonyLib; using RapidGUI; using SharpConfig; using UnityEngine; using ValheimTooler.Configuration; using ValheimTooler.Core; using ValheimTooler.Core.Extensions; using ValheimTooler.Models; using ValheimTooler.Models.Mono; using ValheimTooler.UI; using ValheimTooler.Utils; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("ValheimTooler")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Astropilot")] [assembly: AssemblyProduct("ValheimTooler")] [assembly: AssemblyCopyright("Copyright © Astropilot 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("66a8de82-ae2d-4a68-bc1b-84452afe01bd")] [assembly: AssemblyFileVersion("1.11.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.11.0.0")] namespace RapidGUI { public interface IDoGUI { void DoGUI(); } public interface IDoGUIWindow { void DoGUIWindow(); void CloseWindow(); } public class RapidGUIBehaviour : MonoBehaviour { private static RapidGUIBehaviour s_instance; public KeyCode closeFocusedWindowKey = (KeyCode)113; public int prefixLabelSlideButton = 1; public Action onGUI; public static RapidGUIBehaviour Instance { get { //IL_0029: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)s_instance == (Object)null) { s_instance = Object.FindObjectOfType<RapidGUIBehaviour>(); if ((Object)(object)s_instance == (Object)null) { s_instance = new GameObject("RapidGUI").AddComponent<RapidGUIBehaviour>(); } if (Application.isPlaying) { Object.DontDestroyOnLoad((Object)(object)s_instance); } } return s_instance; } } public void OnGUI() { onGUI?.Invoke(); } } public static class RGUIUtility { private static readonly GUIContent s_tempContent = new GUIContent(); public static GUIContent TempContent(string text) { s_tempContent.text = text; s_tempContent.tooltip = null; s_tempContent.image = null; return s_tempContent; } public static Vector2 GetMouseScreenPos(Vector2? screenInsideOffset = null) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) Vector3 mousePosition = Input.mousePosition; Vector2 val = default(Vector2); ((Vector2)(ref val))..ctor(mousePosition.x, (float)Screen.height - mousePosition.y); if (screenInsideOffset.HasValue) { Vector2 val2 = new Vector2((float)Screen.width, (float)Screen.height) - screenInsideOffset.Value; val = Vector2.Min(val, val2); return val; } return val; } } public static class WindowInvoker { private static readonly HashSet<IDoGUIWindow> s_windows; private static IDoGUIWindow s_focusedWindow; static WindowInvoker() { s_windows = new HashSet<IDoGUIWindow>(); RapidGUIBehaviour instance = RapidGUIBehaviour.Instance; instance.onGUI = (Action)Delegate.Combine(instance.onGUI, new Action(DoGUI)); } public static void Add(IDoGUIWindow window) { s_windows.Add(window); } public static void Remove(IDoGUIWindow window) { s_windows.Remove(window); } public static void SetFocusedWindow(IDoGUIWindow window) { s_focusedWindow = window; } private static void DoGUI() { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Invalid comparison between Unknown and I4 //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Invalid comparison between Unknown and I4 //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) foreach (IDoGUIWindow s_window in s_windows) { s_window?.DoGUIWindow(); } Event current = Event.current; if ((int)current.type == 5 && current.keyCode == RapidGUIBehaviour.Instance.closeFocusedWindowKey && GUIUtility.keyboardControl == 0 && s_windows.Contains(s_focusedWindow)) { s_focusedWindow.CloseWindow(); s_focusedWindow = null; } if ((int)Event.current.type == 7) { s_windows.Clear(); } } } public static class RGUI { private class PopupWindow : IDoGUIWindow { public string label; public Vector2 pos; public Vector2 size; public int? result; public string[] displayOptions; public Vector2 scrollPosition; protected static readonly int s_popupWindowId = "Popup".GetHashCode(); public Rect GetWindowRect() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) return new Rect(pos, size); } public virtual void DoGUIWindow() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown //IL_0036: Unknown result type (might be due to invalid IL or missing references) GUI.skin = InterfaceMaker.CustomSkin; GUI.ModalWindow(s_popupWindowId, GetWindowRect(), (WindowFunction)delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) ScrollViewScope val = new ScrollViewScope(scrollPosition, Array.Empty<GUILayoutOption>()); try { scrollPosition = val.scrollPosition; for (int i = 0; i < displayOptions.Length; i++) { if (GUILayout.Button(displayOptions[i], InterfaceMaker.CustomSkin.button, Array.Empty<GUILayoutOption>())) { result = i; } } } finally { ((IDisposable)val)?.Dispose(); } Event current = Event.current; if ((int)current.rawType == 0) { Rect val2 = new Rect(Vector2.zero, size); if (!((Rect)(ref val2)).Contains(current.mousePosition)) { result = -1; } } }, label, InterfaceMaker.CustomSkin.GetStyle("popup")); } public void CloseWindow() { result = -1; } } private class SearchablePopupWindow : PopupWindow { public string _searchTerms; public string[] _displayOptionsCopy; public void SetSearchTerms(string searchTerms) { _searchTerms = searchTerms; } public override void DoGUIWindow() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Invalid comparison between Unknown and I4 //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Expected O, but got Unknown //IL_0059: Unknown result type (might be due to invalid IL or missing references) GUI.skin = InterfaceMaker.CustomSkin; if ((int)Event.current.type == 8) { _displayOptionsCopy = (string[])displayOptions.Clone(); } GUI.ModalWindow(PopupWindow.s_popupWindowId, GetWindowRect(), (WindowFunction)delegate { //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) _searchTerms = GUILayout.TextField(_searchTerms, Array.Empty<GUILayoutOption>()); if (_displayOptionsCopy.Length == 0) { GUILayout.Label("No results has been found!", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(150f) }); } else { scrollPosition = GUILayout.BeginScrollView(scrollPosition, Array.Empty<GUILayoutOption>()); for (int i = 0; i < _displayOptionsCopy.Length; i++) { if (GUILayout.Button(_displayOptionsCopy[i], InterfaceMaker.CustomSkin.button, Array.Empty<GUILayoutOption>())) { result = i; } } GUILayout.EndScrollView(); } Event current = Event.current; if ((int)current.rawType == 0) { Rect val = new Rect(Vector2.zero, size); if (!((Rect)(ref val)).Contains(current.mousePosition)) { result = -1; } } }, label, InterfaceMaker.CustomSkin.GetStyle("popup")); } } private static int s_popupControlId; private static readonly PopupWindow s_popupWindow = new PopupWindow(); private static readonly SearchablePopupWindow s_searchablePopupWindow = new SearchablePopupWindow(); public static string SelectionPopup(string current, string[] displayOptions) { int num = Array.IndexOf(displayOptions, current); GUILayout.Box(current, InterfaceMaker.CustomSkin.textField, Array.Empty<GUILayoutOption>()); int num2 = PopupOnLastRect(num, displayOptions); if (num2 != num) { current = displayOptions[num2]; } return current; } public static int SelectionPopup(int selectionIndex, string[] displayOptions) { GUILayout.Box((selectionIndex < 0 || displayOptions.Length <= selectionIndex) ? "" : displayOptions[selectionIndex], InterfaceMaker.CustomSkin.textField, Array.Empty<GUILayoutOption>()); return PopupOnLastRect(selectionIndex, displayOptions); } public static string SearchableSelectionPopup(string current, string[] displayOptions, ref string searchTerms) { int num = Array.IndexOf(displayOptions, current); GUILayout.Box(current, InterfaceMaker.CustomSkin.textField, Array.Empty<GUILayoutOption>()); int num2 = SearchablePopupOnLastRect(num, displayOptions, ref searchTerms); if (num2 != num) { current = displayOptions[num2]; } return current; } public static int SearchableSelectionPopup(int selectionIndex, string[] displayOptions, ref string searchTerms) { GUILayout.Box((selectionIndex < 0 || displayOptions.Length <= selectionIndex) ? "" : displayOptions[selectionIndex], InterfaceMaker.CustomSkin.textField, Array.Empty<GUILayoutOption>()); return SearchablePopupOnLastRect(selectionIndex, displayOptions, ref searchTerms); } public static int PopupOnLastRect(string[] displayOptions, string label = "") { return PopupOnLastRect(-1, displayOptions, -1, label); } public static int PopupOnLastRect(string[] displayOptions, int button, string label = "") { return PopupOnLastRect(-1, displayOptions, button, label); } public static int PopupOnLastRect(int selectionIndex, string[] displayOptions, int mouseButton = -1, string label = "") { //IL_0000: Unknown result type (might be due to invalid IL or missing references) return Popup(GUILayoutUtility.GetLastRect(), mouseButton, selectionIndex, displayOptions, label); } public static int SearchablePopupOnLastRect(string[] displayOptions, ref string searchTerms, string label = "") { return SearchablePopupOnLastRect(-1, displayOptions, ref searchTerms, -1, label); } public static int SearchablePopupOnLastRect(string[] displayOptions, int button, ref string searchTerms, string label = "") { return SearchablePopupOnLastRect(-1, displayOptions, ref searchTerms, button, label); } public static int SearchablePopupOnLastRect(int selectionIndex, string[] displayOptions, ref string searchTerms, int mouseButton = -1, string label = "") { //IL_0000: Unknown result type (might be due to invalid IL or missing references) return SearchablePopup(GUILayoutUtility.GetLastRect(), mouseButton, selectionIndex, displayOptions, ref searchTerms, label); } public static int Popup(Rect launchRect, int mouseButton, int selectionIndex, string[] displayOptions, string label = "") { //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Invalid comparison between Unknown and I4 //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Invalid comparison between Unknown and I4 //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Invalid comparison between Unknown and I4 //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Expected O, but got Unknown //IL_010a: Expected O, but got Unknown //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Invalid comparison between Unknown and I4 //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01be: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_01f3: Unknown result type (might be due to invalid IL or missing references) //IL_01f8: Unknown result type (might be due to invalid IL or missing references) //IL_0202: Unknown result type (might be due to invalid IL or missing references) //IL_0207: Unknown result type (might be due to invalid IL or missing references) //IL_020c: Unknown result type (might be due to invalid IL or missing references) //IL_0211: Unknown result type (might be due to invalid IL or missing references) //IL_0222: Unknown result type (might be due to invalid IL or missing references) //IL_0224: Unknown result type (might be due to invalid IL or missing references) //IL_0229: Unknown result type (might be due to invalid IL or missing references) //IL_0237: Unknown result type (might be due to invalid IL or missing references) //IL_0241: Unknown result type (might be due to invalid IL or missing references) //IL_0246: Unknown result type (might be due to invalid IL or missing references) //IL_024b: Unknown result type (might be due to invalid IL or missing references) //IL_0252: Unknown result type (might be due to invalid IL or missing references) //IL_0254: Unknown result type (might be due to invalid IL or missing references) //IL_0256: Unknown result type (might be due to invalid IL or missing references) //IL_025b: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) int result = selectionIndex; int controlID = GUIUtility.GetControlID((FocusType)2); if (s_popupControlId != controlID) { Event current = Event.current; Vector2 mousePosition = current.mousePosition; if ((int)current.type == 1 && (mouseButton < 0 || current.button == mouseButton) && ((Rect)(ref launchRect)).Contains(mousePosition) && displayOptions != null && displayOptions.Length != 0) { s_popupWindow.pos = RGUIUtility.GetMouseScreenPos(Vector2.one * 150f); s_popupControlId = controlID; current.Use(); } } else { EventType type = Event.current.type; int? result2 = s_popupWindow.result; if (result2.HasValue && (int)type == 8) { if (result2.Value >= 0) { result = result2.Value; } s_popupWindow.result = null; s_popupControlId = 0; } else { if ((int)type == 8 || (int)type == 7) { GUIStyle val = new GUIStyle(InterfaceMaker.CustomSkin.button) { padding = new RectOffset(24, 48, 2, 2) }; Vector2 zero = Vector2.zero; for (int i = 0; i < displayOptions.Length; i++) { Vector2 val2 = val.CalcSize(RGUIUtility.TempContent(displayOptions[i])); zero.x = Mathf.Max(zero.x, val2.x); zero.y += val2.y; } RectOffset margin = val.margin; zero.y += Mathf.Max(0, displayOptions.Length - 1) * Mathf.Max(margin.top, margin.bottom); GUIStyle verticalScrollbar = InterfaceMaker.OldSkin.verticalScrollbar; Vector2 val3 = verticalScrollbar.CalcScreenSize(Vector2.zero); RectOffset margin2 = verticalScrollbar.margin; GUIStyle horizontalScrollbar = InterfaceMaker.OldSkin.horizontalScrollbar; Vector2 val4 = horizontalScrollbar.CalcScreenSize(Vector2.zero); RectOffset margin3 = horizontalScrollbar.margin; zero += new Vector2(val3.x + (float)margin2.horizontal, val4.y + (float)margin3.vertical) + Vector2.one * 5f; Vector2 val5 = InterfaceMaker.CustomSkin.GetStyle("popup").CalcScreenSize(zero); Vector2 val6 = new Vector2((float)Screen.width, (float)Screen.height) - s_popupWindow.pos; s_popupWindow.size = Vector2.Min(val5, val6); } s_popupWindow.label = label; s_popupWindow.displayOptions = displayOptions; WindowInvoker.Add(s_popupWindow); } } return result; } public static int SearchablePopup(Rect launchRect, int mouseButton, int selectionIndex, string[] displayOptions, ref string searchTerms, string label = "") { //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Invalid comparison between Unknown and I4 //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Invalid comparison between Unknown and I4 //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Invalid comparison between Unknown and I4 //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Expected O, but got Unknown //IL_0139: Expected O, but got Unknown //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Invalid comparison between Unknown and I4 //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_01f4: Unknown result type (might be due to invalid IL or missing references) //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Unknown result type (might be due to invalid IL or missing references) //IL_0220: Unknown result type (might be due to invalid IL or missing references) //IL_0222: Unknown result type (might be due to invalid IL or missing references) //IL_0232: Unknown result type (might be due to invalid IL or missing references) //IL_0242: Unknown result type (might be due to invalid IL or missing references) //IL_0247: Unknown result type (might be due to invalid IL or missing references) //IL_0251: Unknown result type (might be due to invalid IL or missing references) //IL_0256: Unknown result type (might be due to invalid IL or missing references) //IL_025b: Unknown result type (might be due to invalid IL or missing references) //IL_0260: Unknown result type (might be due to invalid IL or missing references) //IL_0277: Unknown result type (might be due to invalid IL or missing references) //IL_0294: Unknown result type (might be due to invalid IL or missing references) //IL_0296: Unknown result type (might be due to invalid IL or missing references) //IL_029b: Unknown result type (might be due to invalid IL or missing references) //IL_02a9: Unknown result type (might be due to invalid IL or missing references) //IL_02b3: Unknown result type (might be due to invalid IL or missing references) //IL_02b8: Unknown result type (might be due to invalid IL or missing references) //IL_02bd: Unknown result type (might be due to invalid IL or missing references) //IL_02c4: Unknown result type (might be due to invalid IL or missing references) //IL_02c6: Unknown result type (might be due to invalid IL or missing references) //IL_02c8: Unknown result type (might be due to invalid IL or missing references) //IL_02cd: Unknown result type (might be due to invalid IL or missing references) int result = selectionIndex; int controlID = GUIUtility.GetControlID((FocusType)2); if (s_popupControlId != controlID) { Event current = Event.current; Vector2 mousePosition = current.mousePosition; if ((int)current.type == 1 && (mouseButton < 0 || current.button == mouseButton) && ((Rect)(ref launchRect)).Contains(mousePosition) && displayOptions != null && displayOptions.Length != 0) { s_searchablePopupWindow.pos = RGUIUtility.GetMouseScreenPos(Vector2.one * 150f); s_popupControlId = controlID; current.Use(); } } else { EventType type = Event.current.type; int? result2 = s_searchablePopupWindow.result; if (s_searchablePopupWindow._searchTerms != null) { if (!searchTerms.Equals(s_searchablePopupWindow._searchTerms)) { result = -1; } searchTerms = s_searchablePopupWindow._searchTerms; } if (result2.HasValue && (int)type == 8) { if (result2.Value >= 0) { result = result2.Value; } s_searchablePopupWindow.result = null; s_popupControlId = 0; } else { if ((int)type == 8 || (int)type == 7) { GUIStyle val = new GUIStyle(InterfaceMaker.CustomSkin.button) { padding = new RectOffset(24, 48, 2, 2) }; GUIStyle textField = InterfaceMaker.CustomSkin.textField; Vector2 zero = Vector2.zero; for (int i = 0; i < displayOptions.Length; i++) { Vector2 val2 = val.CalcSize(RGUIUtility.TempContent(displayOptions[i])); zero.x = Mathf.Max(zero.x, val2.x); zero.y += val2.y; } if (displayOptions.Length == 0) { zero.x += 150f; } RectOffset margin = val.margin; zero.y += Mathf.Max(0, displayOptions.Length - 1) * Mathf.Max(margin.top, margin.bottom); GUIStyle verticalScrollbar = InterfaceMaker.CustomSkin.verticalScrollbar; Vector2 val3 = verticalScrollbar.CalcScreenSize(Vector2.zero); RectOffset margin2 = verticalScrollbar.margin; GUIStyle horizontalScrollbar = InterfaceMaker.CustomSkin.horizontalScrollbar; Vector2 val4 = horizontalScrollbar.CalcScreenSize(Vector2.zero); RectOffset margin3 = horizontalScrollbar.margin; zero += new Vector2(val3.x + (float)margin2.horizontal, val4.y + (float)margin3.vertical) + Vector2.one * 5f; zero.y += textField.CalcHeight(RGUIUtility.TempContent("t"), zero.x); Vector2 val5 = InterfaceMaker.CustomSkin.GetStyle("popup").CalcScreenSize(zero); Vector2 val6 = new Vector2((float)Screen.width, (float)Screen.height) - s_searchablePopupWindow.pos; s_searchablePopupWindow.size = Vector2.Min(val5, val6); } s_searchablePopupWindow.SetSearchTerms(searchTerms); s_searchablePopupWindow.label = label; s_searchablePopupWindow.displayOptions = displayOptions; WindowInvoker.Add(s_searchablePopupWindow); } } return result; } } } namespace ValheimTooler { public class EntryPoint : MonoBehaviour { public static readonly int s_boxSpacing = 30; private Rect _valheimToolerRect; public static bool s_showMainWindow = true; private bool _wasMainWindowShowed; public static bool s_showItemGiver = false; private WindowToolbar _windowToolbar; private readonly string[] _toolbarChoices = new string[4] { "$vt_toolbar_player", "$vt_toolbar_entities", "$vt_toolbar_terrain_shaper", "$vt_toolbar_misc" }; private string _version; public void Start() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) _valheimToolerRect = new Rect(ConfigManager.s_mainWindowPosition.Value.x, ConfigManager.s_mainWindowPosition.Value.y, 800f, 300f); s_showMainWindow = ConfigManager.s_showAtStartup.Value; PlayerHacks.Start(); EntitiesItemsHacks.Start(); ItemGiver.Start(); MiscHacks.Start(); ESP.Start(); TerrainShaper.Start(); _version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); } public void Update() { if (ConfigManager.s_toggleInterfaceKey.Value.IsDown()) { s_showMainWindow = !s_showMainWindow; if (s_showMainWindow && (Object)(object)GameCamera.instance != (Object)null) { GameCamera.instance.SetFieldValue("m_mouseCapture", value: false); GameCamera.instance.CallMethod("UpdateMouseCapture"); } } PlayerHacks.Update(); EntitiesItemsHacks.Update(); ItemGiver.Update(); MiscHacks.Update(); ESP.Update(); TerrainShaper.Update(); } public void OnGUI() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) GUI.skin = InterfaceMaker.CustomSkin; if (s_showMainWindow) { _valheimToolerRect = GUILayout.Window(1001, _valheimToolerRect, new WindowFunction(ValheimToolerWindow), VTLocalization.instance.Localize("$vt_main_title (v" + _version + ")"), (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Height(10f), GUILayout.Width(10f) }); if (s_showItemGiver) { ItemGiver.DisplayGUI(); } _wasMainWindowShowed = true; ConfigManager.s_mainWindowPosition.Value = ((Rect)(ref _valheimToolerRect)).position; } else if (_wasMainWindowShowed) { if ((Object)(object)GameCamera.instance != (Object)null) { GameCamera.instance.SetFieldValue("m_mouseCapture", value: true); GameCamera.instance.CallMethod("UpdateMouseCapture"); } _wasMainWindowShowed = false; } ESP.DisplayGUI(); } private void ValheimToolerWindow(int windowID) { GUILayout.Space(10f); _windowToolbar = (WindowToolbar)GUILayout.Toolbar((int)_windowToolbar, _toolbarChoices.Select((string choice) => VTLocalization.instance.Localize(choice)).ToArray(), Array.Empty<GUILayoutOption>()); switch (_windowToolbar) { case WindowToolbar.PLAYER: PlayerHacks.DisplayGUI(); break; case WindowToolbar.ENTITIES_ITEMS: EntitiesItemsHacks.DisplayGUI(); break; case WindowToolbar.TERRAIN_SHAPER: TerrainShaper.DisplayGUI(); break; case WindowToolbar.MISC: MiscHacks.DisplayGUI(); break; } GUI.DragWindow(); } } internal class Loader { private static GameObject s_entryPoint = null; private static readonly Harmony s_harmony = new Harmony("ValheimTooler"); public static void Init() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown if ((Object)(object)s_entryPoint == (Object)null) { RunPatches(); s_entryPoint = new GameObject(); s_entryPoint.AddComponent<EntryPoint>(); s_entryPoint.AddComponent<RapidGUIBehaviour>(); Object.DontDestroyOnLoad((Object)(object)s_entryPoint); } } private static void RunPatches() { s_harmony.PatchAll(); } public static void Unload() { _Unload(); } private static void _Unload() { Object.Destroy((Object)(object)s_entryPoint); s_harmony.UnpatchSelf(); } } } namespace ValheimTooler.Utils { public static class ConfigManager { private static readonly ConfigFile s_settingsFile; private static readonly ConfigFile s_internalFile; private static readonly string s_configurationPath; private const string SettingsFileName = "valheimtooler_settings.cfg"; private const string InternalFileName = "valheimtooler_internal.cfg"; public static ConfigEntry<KeyboardShortcut> s_toggleInterfaceKey; public static ConfigEntry<bool> s_showAtStartup; public static ConfigEntry<string> s_language; public static ConfigEntry<KeyboardShortcut> s_godModeShortCut; public static ConfigEntry<KeyboardShortcut> s_unlimitedStaminaShortcut; public static ConfigEntry<KeyboardShortcut> s_flyModeShortcut; public static ConfigEntry<KeyboardShortcut> s_ghostModeShortcut; public static ConfigEntry<KeyboardShortcut> s_noPlacementCostShortcut; public static ConfigEntry<KeyboardShortcut> s_inventoryInfiniteWeightShortcut; public static ConfigEntry<KeyboardShortcut> s_instantCraftShortcut; public static ConfigEntry<KeyboardShortcut> s_guardianPowerAllShortcut; public static ConfigEntry<KeyboardShortcut> s_healAllShortcut; public static ConfigEntry<KeyboardShortcut> s_removeAllDropShortcut; public static ConfigEntry<KeyboardShortcut> s_terrainShapeShortcut; public static ConfigEntry<KeyboardShortcut> s_terrainLevelShortcut; public static ConfigEntry<KeyboardShortcut> s_terrainLowerShortcut; public static ConfigEntry<KeyboardShortcut> s_terrainRaiseShortcut; public static ConfigEntry<KeyboardShortcut> s_terrainResetShortcut; public static ConfigEntry<KeyboardShortcut> s_terrainSmoothShortcut; public static ConfigEntry<KeyboardShortcut> s_terrainPaintShortcut; public static ConfigEntry<KeyboardShortcut> s_espPlayersShortcut; public static ConfigEntry<KeyboardShortcut> s_espMonstersShortcut; public static ConfigEntry<KeyboardShortcut> s_espDroppedItemsShortcut; public static ConfigEntry<KeyboardShortcut> s_espDepositsShortcut; public static ConfigEntry<KeyboardShortcut> s_espPickablesShortcut; public static ConfigEntry<Vector2> s_mainWindowPosition; public static ConfigEntry<Vector2> s_itemGiverWindowPosition; public static ConfigEntry<bool> s_permanentPins; public static ConfigEntry<bool> s_espRadiusEnabled; public static ConfigEntry<float> s_espRadius; static ConfigManager() { //IL_04a5: Unknown result type (might be due to invalid IL or missing references) //IL_04d5: Unknown result type (might be due to invalid IL or missing references) string path = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "config_vt.path"); string path2 = ""; if (File.Exists(path)) { path2 = Path.GetFullPath(File.ReadAllText(path)); if (!Directory.Exists(path2)) { ZLog.Log((object)"[ValheimTooler - ConfigManager] Path given in config_vt.path file is incorrect."); path2 = ""; } } else { ZLog.Log((object)"[ValheimTooler - ConfigManager] Failed to find config_vt.path file."); } s_configurationPath = path2; string configPath = Path.Combine(s_configurationPath, "valheimtooler_settings.cfg"); string configPath2 = Path.Combine(s_configurationPath, "valheimtooler_internal.cfg"); s_settingsFile = new ConfigFile(configPath, saveOnInit: true); s_internalFile = new ConfigFile(configPath2, saveOnInit: true); s_toggleInterfaceKey = s_settingsFile.Bind("General", "ToggleInterfaceKey", new KeyboardShortcut((KeyCode)127), "Which key will show/hide the tool."); s_showAtStartup = s_settingsFile.Bind("General", "ShowAtStartup", defaultValue: true, "Choose whether or not to display the tool at startup."); s_language = s_settingsFile.Bind("General", "Language", "Auto", new ConfigDescription("Tool language, in auto the language is chosen according to the game language.", new AcceptableValueList<string>("Auto", "French", "English"))); s_godModeShortCut = s_settingsFile.Bind("Shortcuts", "GodMode", default(KeyboardShortcut), "The shortcut to use the god mode feature"); s_unlimitedStaminaShortcut = s_settingsFile.Bind("Shortcuts", "UnlimitedStamina", default(KeyboardShortcut), "The shortcut to use the unlimited stamina feature"); s_flyModeShortcut = s_settingsFile.Bind("Shortcuts", "FlyMode", default(KeyboardShortcut), "The shortcut to use the fly mode feature"); s_ghostModeShortcut = s_settingsFile.Bind("Shortcuts", "GhostMode", default(KeyboardShortcut), "The shortcut to use the ghost mode feature"); s_noPlacementCostShortcut = s_settingsFile.Bind("Shortcuts", "NoPlacementCost", default(KeyboardShortcut), "The shortcut to use the no placement cost feature"); s_inventoryInfiniteWeightShortcut = s_settingsFile.Bind("Shortcuts", "InventoryInfiniteWeight", default(KeyboardShortcut), "The shortcut to use the inventory with infinite weight feature"); s_instantCraftShortcut = s_settingsFile.Bind("Shortcuts", "InstantCraft", default(KeyboardShortcut), "The shortcut to use the instant craft feature"); s_guardianPowerAllShortcut = s_settingsFile.Bind("Shortcuts", "GuardianPowerAllPlayers", default(KeyboardShortcut), "The shortcut to give all players the selected guardian power"); s_healAllShortcut = s_settingsFile.Bind("Shortcuts", "HealAllPlayers", default(KeyboardShortcut), "Shortcut to heal all the players"); s_removeAllDropShortcut = s_settingsFile.Bind("Shortcuts", "RemoveAllDrops", default(KeyboardShortcut), "The shortcut to use the remove all drops feature"); s_terrainShapeShortcut = s_settingsFile.Bind("Shortcuts", "TerrainChangeShape", default(KeyboardShortcut), ""); s_terrainLevelShortcut = s_settingsFile.Bind("Shortcuts", "TerrainLevel", default(KeyboardShortcut), ""); s_terrainLowerShortcut = s_settingsFile.Bind("Shortcuts", "TerrainLower", default(KeyboardShortcut), ""); s_terrainRaiseShortcut = s_settingsFile.Bind("Shortcuts", "TerrainRaise", default(KeyboardShortcut), ""); s_terrainResetShortcut = s_settingsFile.Bind("Shortcuts", "TerrainReset", default(KeyboardShortcut), ""); s_terrainSmoothShortcut = s_settingsFile.Bind("Shortcuts", "TerrainSmooth", default(KeyboardShortcut), ""); s_terrainPaintShortcut = s_settingsFile.Bind("Shortcuts", "TerrainPaint", default(KeyboardShortcut), ""); s_espPlayersShortcut = s_settingsFile.Bind("Shortcuts", "ESPPlayers", default(KeyboardShortcut), "The shortcut to show/hide the ESP for players"); s_espMonstersShortcut = s_settingsFile.Bind("Shortcuts", "ESPMonsters", default(KeyboardShortcut), "The shortcut to show/hide the ESP for monsters"); s_espDroppedItemsShortcut = s_settingsFile.Bind("Shortcuts", "ESPDroppedItems", default(KeyboardShortcut), "The shortcut to show/hide the ESP for dropped items"); s_espDepositsShortcut = s_settingsFile.Bind("Shortcuts", "ESPDeposits", default(KeyboardShortcut), "The shortcut to show/hide the ESP for deposits"); s_espPickablesShortcut = s_settingsFile.Bind("Shortcuts", "ESPPickables", default(KeyboardShortcut), "The shortcut to show/hide the ESP for pickables"); s_mainWindowPosition = s_internalFile.Bind<Vector2>("Internal", "MainWindowPosition", new Vector2(5f, 5f)); s_itemGiverWindowPosition = s_internalFile.Bind<Vector2>("Internal", "ItemGiverPosition", new Vector2((float)(Screen.width - 400), 5f)); s_permanentPins = s_internalFile.Bind("Internal", "PermanentPins", defaultValue: false); s_espRadiusEnabled = s_internalFile.Bind("Internal", "RadiusEnabled", defaultValue: false); s_espRadius = s_internalFile.Bind("Internal", "RadiusValue", 5f); s_settingsFile.OrphanedEntries.Clear(); s_internalFile.OrphanedEntries.Clear(); s_settingsFile.Save(); s_internalFile.Save(); } } public class VTLocalization { public static readonly string s_cheatOn = "$vt_cheat_on"; public static readonly string s_cheatOff = "$vt_cheat_off"; private static VTLocalization s_instance; private static readonly char[] s_endChars = " (){}[]+-!?/\\\\&%,.:-=<>\n".ToCharArray(); private Dictionary<string, string> m_translations = new Dictionary<string, string>(); public static VTLocalization instance { get { if (s_instance == null) { Initialize(); } return s_instance; } } private static void Initialize() { if (s_instance == null) { s_instance = new VTLocalization(); } } private VTLocalization() { SetupLanguage("English"); string value = ConfigManager.s_language.Value; if (value == "Auto") { string @string = PlayerPrefs.GetString("language", ""); if (@string.Length > 0) { SetupLanguage(@string); } } else if (value != "English") { SetupLanguage(value); } } public string Localize(string text) { StringBuilder stringBuilder = new StringBuilder(); int num = 0; string word; int wordStart; int wordEnd; while (FindNextWord(text, num, out word, out wordStart, out wordEnd)) { stringBuilder.Append(text.Substring(num, wordStart - num)); stringBuilder.Append(Translate(word)); num = wordEnd; } stringBuilder.Append(text.Substring(num)); return stringBuilder.ToString(); } private bool FindNextWord(string text, int startIndex, out string word, out int wordStart, out int wordEnd) { if (startIndex >= text.Length - 1) { word = null; wordStart = -1; wordEnd = -1; return false; } wordStart = text.IndexOf('$', startIndex); if (wordStart != -1) { int num = text.IndexOfAny(s_endChars, wordStart); if (num != -1) { word = text.Substring(wordStart + 1, num - wordStart - 1); wordEnd = num; } else { word = text.Substring(wordStart + 1); wordEnd = text.Length; } return true; } word = null; wordEnd = -1; return false; } private string Translate(string word) { if (word.StartsWith("KEY_")) { string bindingName = word.Substring(4); return GetBoundKeyString(bindingName); } if (m_translations.TryGetValue(word, out var value)) { return value; } return "[" + word + "]"; } public string GetBoundKeyString(string bindingName) { string boundKeyString = ZInput.instance.GetBoundKeyString(bindingName, false); if (boundKeyString.Length > 0 && boundKeyString[0] == '$' && m_translations.TryGetValue(boundKeyString.Substring(1), out var value)) { return value; } return boundKeyString; } private void AddWord(string key, string text) { m_translations.Remove(key); m_translations.Add(key, text); } private void Clear() { m_translations.Clear(); } public bool SetupLanguage(string language) { if (!LoadCFG(language)) { return false; } return true; } public bool LoadCFG(string language) { byte[] embeddedResource = ResourceUtils.GetEmbeddedResource("Resources.Localization.translations.cfg"); if (embeddedResource == null) { ZLog.Log((object)"Failed to load the translation file!"); return false; } Configuration val = Configuration.LoadFromString(Encoding.UTF8.GetString(embeddedResource, 0, embeddedResource.Length)); if (!val.Contains(language)) { ZLog.Log((object)("Failed to find language: " + language)); return false; } foreach (Setting item in val[language]) { AddWord(((ConfigurationElement)item).Name, item.StringValue); } return true; } } public static class ReflectionExtensions { public static T GetFieldValue<T>(this object obj, string name) { BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy; return (T)(obj.GetType().GetField(name, bindingAttr)?.GetValue(obj)); } public static void SetFieldValue<T>(this object obj, string name, T value) { BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy; obj.GetType().GetField(name, bindingAttr)?.SetValue(obj, value); } public static object CallMethod(this object obj, string methodName, params object[] args) { BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy; MethodInfo method = obj.GetType().GetMethod(methodName, bindingAttr); if (method != null) { return method.Invoke(obj, args); } return null; } public static object CallStaticMethod<T>(string methodName, params object[] args) where T : new() { BindingFlags bindingAttr = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy; MethodInfo method = typeof(T).GetMethod(methodName, bindingAttr); if (method != null) { return method.Invoke(null, args); } return null; } } public static class ResourceUtils { private static Dictionary<string, GameObject> s_cachedPrefabs = new Dictionary<string, GameObject>(); public static byte[] ReadAllBytes(this Stream input) { byte[] array = new byte[16384]; using MemoryStream memoryStream = new MemoryStream(); int count; while ((count = input.Read(array, 0, array.Length)) > 0) { memoryStream.Write(array, 0, count); } return memoryStream.ToArray(); } public static byte[] GetEmbeddedResource(string resourceFileName, Assembly containingAssembly = null) { if (containingAssembly == null) { containingAssembly = Assembly.GetCallingAssembly(); } string name = containingAssembly.GetManifestResourceNames().Single((string str) => str.EndsWith(resourceFileName)); using Stream input = containingAssembly.GetManifestResourceStream(name); byte[] array = input.ReadAllBytes(); if (array.Length == 0) { Debug.LogWarning((object)string.Format("The resource %1 was not found", resourceFileName)); } return array; } public static Texture2D LoadTexture(byte[] texData) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Expected O, but got Unknown Texture2D val = new Texture2D(1, 1, (TextureFormat)5, false); MethodInfo method = typeof(Texture2D).GetMethod("LoadImage", new Type[1] { typeof(byte[]) }); if (method != null) { method.Invoke(val, new object[1] { texData }); } else { Type? type = Type.GetType("UnityEngine.ImageConversion, UnityEngine.ImageConversionModule"); if (type == null) { throw new ArgumentNullException("converter"); } MethodInfo? method2 = type.GetMethod("LoadImage", new Type[2] { typeof(Texture2D), typeof(byte[]) }); if (method2 == null) { throw new ArgumentNullException("converterMethod"); } method2.Invoke(null, new object[2] { val, texData }); } return val; } public static GameObject GetHiddenPrefab(string name) { if (s_cachedPrefabs.TryGetValue(name.ToLower(), out var value) && (Object)(object)value != (Object)null) { return value; } foreach (GameObject item in from t in Resources.FindObjectsOfTypeAll<Transform>() where (Object)(object)t.parent == (Object)null select t into x select ((Component)x).gameObject) { if (((Object)item).name.Equals(name, StringComparison.OrdinalIgnoreCase)) { if (s_cachedPrefabs.ContainsKey(name.ToLower())) { s_cachedPrefabs.Remove(name.ToLower()); } s_cachedPrefabs.Add(name.ToLower(), item); return item; } } return null; } } } namespace ValheimTooler.UI { internal class InterfaceMaker { private static GUISkin s_customSkin; private static Texture2D s_winBackground; private static Texture2D s_winTitleBackground; private static Texture2D s_boxBackground; private static Texture2D s_toggleOffBackground; private static Texture2D s_toggleOnBackground; private static Texture2D s_buttonNormalBackground; private static Texture2D s_buttonHoverBackground; private static Texture2D s_buttonActiveBackground; private static Texture2D s_buttonActiveNormalBackground; private static Texture2D s_buttonActiveHoverBackground; private static Texture2D s_buttonActiveActiveBackground; private static Texture2D s_fieldBackground; private static Texture2D s_scrollBackground; private static Texture2D s_scrollThumbBackground; private static Texture2D s_flatButtonNormalBackground; private static Texture2D s_flatButtonHoverBackground; private static Texture2D s_flatButtonActiveBackground; private static Font s_font; private static GUISkin s_oldSkin; public static GUISkin CustomSkin { get { if ((Object)(object)s_customSkin == (Object)null) { try { s_customSkin = CreateSkin(); } catch (Exception ex) { ZLog.Log((object)("Could not load custom GUISkin - " + ex.Message)); s_customSkin = GUI.skin; } } return s_customSkin; } } public static GUISkin OldSkin => s_oldSkin; private static GUISkin CreateSkin() { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Expected O, but got Unknown //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: Unknown result type (might be due to invalid IL or missing references) //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_0223: Unknown result type (might be due to invalid IL or missing references) //IL_02fc: Unknown result type (might be due to invalid IL or missing references) //IL_0326: Unknown result type (might be due to invalid IL or missing references) //IL_0350: Unknown result type (might be due to invalid IL or missing references) //IL_037a: Unknown result type (might be due to invalid IL or missing references) //IL_03a4: Unknown result type (might be due to invalid IL or missing references) //IL_03ce: Unknown result type (might be due to invalid IL or missing references) //IL_03f7: Unknown result type (might be due to invalid IL or missing references) //IL_0401: Expected O, but got Unknown //IL_040b: Unknown result type (might be due to invalid IL or missing references) //IL_0415: Expected O, but got Unknown //IL_042b: Unknown result type (might be due to invalid IL or missing references) //IL_0435: Expected O, but got Unknown //IL_0506: Unknown result type (might be due to invalid IL or missing references) //IL_0530: Unknown result type (might be due to invalid IL or missing references) //IL_055a: Unknown result type (might be due to invalid IL or missing references) //IL_0584: Unknown result type (might be due to invalid IL or missing references) //IL_05ae: Unknown result type (might be due to invalid IL or missing references) //IL_05d8: Unknown result type (might be due to invalid IL or missing references) //IL_0602: Unknown result type (might be due to invalid IL or missing references) //IL_062c: Unknown result type (might be due to invalid IL or missing references) //IL_0640: Unknown result type (might be due to invalid IL or missing references) //IL_064a: Expected O, but got Unknown //IL_0650: Unknown result type (might be due to invalid IL or missing references) //IL_068a: Unknown result type (might be due to invalid IL or missing references) //IL_068f: Unknown result type (might be due to invalid IL or missing references) //IL_0690: Unknown result type (might be due to invalid IL or missing references) //IL_069a: Expected O, but got Unknown //IL_069a: Unknown result type (might be due to invalid IL or missing references) //IL_06a6: Expected O, but got Unknown //IL_06cf: Unknown result type (might be due to invalid IL or missing references) //IL_06d9: Expected O, but got Unknown //IL_06e3: Unknown result type (might be due to invalid IL or missing references) //IL_06e8: Unknown result type (might be due to invalid IL or missing references) //IL_06ef: Unknown result type (might be due to invalid IL or missing references) //IL_06f6: Unknown result type (might be due to invalid IL or missing references) //IL_0702: Expected O, but got Unknown s_oldSkin = GUI.skin; GUISkin val = Object.Instantiate<GUISkin>(GUI.skin); Object.DontDestroyOnLoad((Object)(object)val); LoadTextures(); val.font = s_font; val.label.normal.textColor = Color.gray; val.box.onNormal.background = null; val.box.normal.background = s_boxBackground; val.box.normal.textColor = Color.gray; RectOffset padding = val.box.padding; padding.top += 7; RectOffset padding2 = val.box.padding; padding2.bottom += 7; RectOffset padding3 = val.box.padding; padding3.left += 7; RectOffset padding4 = val.box.padding; padding4.right += 7; val.window.border = new RectOffset(80, 80, 80, 20); RectOffset padding5 = val.window.padding; padding5.top += 5; val.window.onNormal.background = null; val.window.normal.background = s_winTitleBackground; val.window.normal.textColor = Color.white; val.button.normal.textColor = Color.white; val.button.normal.background = s_buttonNormalBackground; val.button.hover.textColor = Color.white; val.button.hover.background = s_buttonHoverBackground; val.button.active.textColor = Color.white; val.button.active.background = s_buttonActiveBackground; val.button.onNormal.textColor = Color.white; val.button.onNormal.background = s_buttonActiveNormalBackground; val.button.onHover.textColor = Color.white; val.button.onHover.background = s_buttonActiveHoverBackground; val.button.onActive.textColor = Color.white; val.button.onActive.background = s_buttonActiveActiveBackground; val.button.font = s_font; val.button.wordWrap = false; val.horizontalSliderThumb.normal.background = s_buttonNormalBackground; val.horizontalSliderThumb.hover.background = s_buttonHoverBackground; val.horizontalSliderThumb.active.background = s_buttonActiveBackground; val.horizontalSliderThumb.onNormal.background = s_buttonActiveNormalBackground; val.horizontalSliderThumb.onHover.background = s_buttonActiveHoverBackground; val.horizontalSliderThumb.onActive.background = s_buttonActiveActiveBackground; val.horizontalSlider.normal.background = s_scrollBackground; val.toggle.normal.textColor = Color.gray; val.toggle.normal.background = s_toggleOffBackground; val.toggle.onNormal.textColor = Color.gray; val.toggle.onNormal.background = s_toggleOnBackground; val.toggle.hover.textColor = Color.gray; val.toggle.hover.background = s_toggleOffBackground; val.toggle.onHover.textColor = Color.gray; val.toggle.onHover.background = s_toggleOnBackground; val.toggle.active.textColor = Color.gray; val.toggle.active.background = s_toggleOnBackground; val.toggle.onActive.textColor = Color.gray; val.toggle.onActive.background = s_toggleOffBackground; val.toggle.border = new RectOffset(0, 0, 0, 0); val.toggle.overflow = new RectOffset(0, 0, 0, 0); val.toggle.imagePosition = (ImagePosition)2; val.toggle.padding = new RectOffset(0, 0, 0, 0); val.toggle.fixedWidth = 30f; val.toggle.fixedHeight = 30f; RectOffset padding6 = val.button.padding; int top = (val.button.padding.bottom = 6); padding6.top = top; RectOffset padding7 = val.button.padding; top = (val.button.padding.left = 5); padding7.left = top; RectOffset border = val.button.border; top = (val.button.border.top = 0); border.bottom = top; RectOffset border2 = val.button.border; top = (val.button.border.right = 10); border2.left = top; val.textField.normal.background = s_fieldBackground; val.textField.normal.textColor = Color.white; val.textField.onNormal.background = s_fieldBackground; val.textField.onNormal.textColor = Color.white; val.textField.hover.background = s_fieldBackground; val.textField.hover.textColor = Color.white; val.textField.onHover.background = s_fieldBackground; val.textField.onHover.textColor = Color.white; val.textField.active.background = s_fieldBackground; val.textField.active.textColor = Color.white; val.textField.onActive.background = s_fieldBackground; val.textField.onActive.textColor = Color.white; val.textField.focused.background = s_fieldBackground; val.textField.focused.textColor = Color.white; val.textField.onFocused.background = s_fieldBackground; val.textField.onFocused.textColor = Color.white; val.textField.padding = new RectOffset(8, 8, 5, 5); val.settings.cursorColor = Color.white; val.verticalScrollbar.normal.background = s_scrollBackground; val.verticalScrollbarThumb.normal.background = s_scrollThumbBackground; GUIStyle val2 = new GUIStyle(val.box) { border = new RectOffset(), name = "popup" }; GUIStyleState normal = val2.normal; Texture2D background = (val2.hover.background = s_winBackground); normal.background = background; val2.border = new RectOffset(30, 30, 30, 30); GUIStyle val4 = new GUIStyle(OldSkin.label) { wordWrap = false, alignment = (TextAnchor)4, name = "flatButton" }; val4.normal.background = s_flatButtonNormalBackground; val4.hover.background = s_flatButtonHoverBackground; val4.onNormal.background = s_flatButtonActiveBackground; val.customStyles = (GUIStyle[])(object)new GUIStyle[2] { val2, val4 }; return val; } private static void LoadTextures() { //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01be: Expected O, but got Unknown //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_01e4: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_020e: Expected O, but got Unknown //IL_022f: Unknown result type (might be due to invalid IL or missing references) //IL_0234: Unknown result type (might be due to invalid IL or missing references) //IL_0254: Unknown result type (might be due to invalid IL or missing references) //IL_025e: Expected O, but got Unknown //IL_027f: Unknown result type (might be due to invalid IL or missing references) //IL_0284: Unknown result type (might be due to invalid IL or missing references) s_winBackground = ResourceUtils.LoadTexture(ResourceUtils.GetEmbeddedResource("Resources.window.png")); Object.DontDestroyOnLoad((Object)(object)s_winBackground); s_winTitleBackground = ResourceUtils.LoadTexture(ResourceUtils.GetEmbeddedResource("Resources.window_title.png")); Object.DontDestroyOnLoad((Object)(object)s_winTitleBackground); s_boxBackground = ResourceUtils.LoadTexture(ResourceUtils.GetEmbeddedResource("Resources.box.png")); Object.DontDestroyOnLoad((Object)(object)s_boxBackground); s_toggleOffBackground = ResourceUtils.LoadTexture(ResourceUtils.GetEmbeddedResource("Resources.toggle_off.png")); Object.DontDestroyOnLoad((Object)(object)s_toggleOffBackground); s_toggleOnBackground = ResourceUtils.LoadTexture(ResourceUtils.GetEmbeddedResource("Resources.toggle_on.png")); Object.DontDestroyOnLoad((Object)(object)s_toggleOnBackground); s_buttonNormalBackground = ResourceUtils.LoadTexture(ResourceUtils.GetEmbeddedResource("Resources.button_normal.png")); Object.DontDestroyOnLoad((Object)(object)s_buttonNormalBackground); s_buttonHoverBackground = ResourceUtils.LoadTexture(ResourceUtils.GetEmbeddedResource("Resources.button_hover.png")); Object.DontDestroyOnLoad((Object)(object)s_buttonHoverBackground); s_buttonActiveBackground = ResourceUtils.LoadTexture(ResourceUtils.GetEmbeddedResource("Resources.button_active.png")); Object.DontDestroyOnLoad((Object)(object)s_buttonActiveBackground); s_buttonActiveNormalBackground = ResourceUtils.LoadTexture(ResourceUtils.GetEmbeddedResource("Resources.button_active_normal.png")); Object.DontDestroyOnLoad((Object)(object)s_buttonActiveNormalBackground); s_buttonActiveHoverBackground = ResourceUtils.LoadTexture(ResourceUtils.GetEmbeddedResource("Resources.button_active_hover.png")); Object.DontDestroyOnLoad((Object)(object)s_buttonActiveHoverBackground); s_buttonActiveActiveBackground = ResourceUtils.LoadTexture(ResourceUtils.GetEmbeddedResource("Resources.button_active_active.png")); Object.DontDestroyOnLoad((Object)(object)s_buttonActiveActiveBackground); s_fieldBackground = ResourceUtils.LoadTexture(ResourceUtils.GetEmbeddedResource("Resources.field.png")); Object.DontDestroyOnLoad((Object)(object)s_fieldBackground); s_scrollBackground = ResourceUtils.LoadTexture(ResourceUtils.GetEmbeddedResource("Resources.scroll_background.png")); Object.DontDestroyOnLoad((Object)(object)s_scrollBackground); s_scrollThumbBackground = ResourceUtils.LoadTexture(ResourceUtils.GetEmbeddedResource("Resources.scroll_thumb.png")); Object.DontDestroyOnLoad((Object)(object)s_scrollThumbBackground); s_flatButtonNormalBackground = new Texture2D(1, 1); s_flatButtonNormalBackground.SetPixels((Color[])(object)new Color[1] { new Color(0.5f, 0.5f, 0.5f, 0.5f) }); s_flatButtonNormalBackground.Apply(); Object.DontDestroyOnLoad((Object)(object)s_flatButtonNormalBackground); s_flatButtonHoverBackground = new Texture2D(1, 1); s_flatButtonHoverBackground.SetPixels((Color[])(object)new Color[1] { new Color(0.5f, 0.5f, 0.5f, 0.2f) }); s_flatButtonHoverBackground.Apply(); Object.DontDestroyOnLoad((Object)(object)s_flatButtonHoverBackground); s_flatButtonActiveBackground = new Texture2D(1, 1); s_flatButtonActiveBackground.SetPixels((Color[])(object)new Color[1] { new Color(0.9f, 0.5f, 0.1f, 0.5f) }); s_flatButtonActiveBackground.Apply(); Object.DontDestroyOnLoad((Object)(object)s_flatButtonActiveBackground); s_font = ((IEnumerable<Font>)(Resources.FindObjectsOfTypeAll(typeof(Font)) as Font[])).FirstOrDefault((Func<Font, bool>)((Font f) => ((Object)f).name.Equals("AveriaSerifLibre-Bold"))); if ((Object)(object)s_font == (Object)null) { ZLog.Log((object)"Error while loading font!"); } } } public static class Utils { public static string ToggleButtonLabel(string labelCode, bool condition, KeyboardShortcut? shortcut) { return ToggleButtonLabelCustom(labelCode, condition, VTLocalization.s_cheatOn, VTLocalization.s_cheatOff, shortcut); } public static string ToggleButtonLabel(string labelCode, bool condition) { return ToggleButtonLabel(labelCode, condition, null); } public static string ToggleButtonLabelCustom(string labelCode, bool condition, string activeLabelCode, string normalLabelCode) { return ToggleButtonLabelCustom(labelCode, condition, activeLabelCode, normalLabelCode, null); } public static string ToggleButtonLabelCustom(string labelCode, bool condition, string activeLabelCode, string normalLabelCode, KeyboardShortcut? shortcut) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) string text = VTLocalization.instance.Localize(labelCode + " : " + (condition ? activeLabelCode : normalLabelCode)); if (shortcut.HasValue && (int)shortcut.Value.MainKey != 0) { text = text + " [" + shortcut.Value.ToString() + "]"; } return text; } public static string LabelWithShortcut(string labelCode, KeyboardShortcut? shortcut) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) string text = VTLocalization.instance.Localize(labelCode); if (shortcut.HasValue && (int)shortcut.Value.MainKey != 0) { text = text + " [" + shortcut.Value.ToString() + "]"; } return text; } } public static class SpriteManager { private static readonly Dictionary<string, Texture2D> s_atlasCache; static SpriteManager() { s_atlasCache = new Dictionary<string, Texture2D>(); } public static Texture2D TextureFromSprite(Sprite sprite, bool resize = true) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Expected O, but got Unknown //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) Rect val = sprite.rect; if (((Rect)(ref val)).width == (float)((Texture)sprite.texture).width) { return sprite.texture; } Texture2D val2; if (s_atlasCache.ContainsKey(((Object)sprite.texture).name)) { val2 = s_atlasCache[((Object)sprite.texture).name]; } else { val2 = DuplicateTexture(sprite.texture); s_atlasCache.Add(((Object)sprite.texture).name, val2); } val = sprite.rect; int num = (int)((Rect)(ref val)).width; val = sprite.rect; Texture2D val3 = new Texture2D(num, (int)((Rect)(ref val)).height); Texture2D obj = val2; val = sprite.textureRect; int num2 = Mathf.CeilToInt(((Rect)(ref val)).x); val = sprite.textureRect; int num3 = Mathf.CeilToInt(((Rect)(ref val)).y); val = sprite.textureRect; int num4 = Mathf.CeilToInt(((Rect)(ref val)).width); val = sprite.textureRect; Color[] pixels = obj.GetPixels(num2, num3, num4, Mathf.CeilToInt(((Rect)(ref val)).height)); val3.SetPixels(pixels); val3.Apply(); if (resize && (((Texture)val3).width > 200 || ((Texture)val3).height > 200)) { val3.Reinitialize(60, 60); } return val3; } public static Texture2D DuplicateTexture(Texture2D source) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Expected O, but got Unknown RenderTexture temporary = RenderTexture.GetTemporary(((Texture)source).width, ((Texture)source).height, 0, (RenderTextureFormat)7, (RenderTextureReadWrite)1); Graphics.Blit((Texture)(object)source, temporary); RenderTexture active = RenderTexture.active; RenderTexture.active = temporary; Texture2D val = new Texture2D(((Texture)source).width, ((Texture)source).height); val.ReadPixels(new Rect(0f, 0f, (float)((Texture)temporary).width, (float)((Texture)temporary).height), 0, 0); val.Apply(); RenderTexture.active = active; RenderTexture.ReleaseTemporary(temporary); return val; } } } namespace ValheimTooler.Properties { [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [DebuggerNonUserCode] [CompilerGenerated] public class Resources { private static ResourceManager resourceMan; private static CultureInfo resourceCulture; [EditorBrowsable(EditorBrowsableState.Advanced)] public static ResourceManager ResourceManager { get { if (resourceMan == null) { resourceMan = new ResourceManager("ValheimTooler.Properties.Resources", typeof(Resources).Assembly); } return resourceMan; } } [EditorBrowsable(EditorBrowsableState.Advanced)] public static CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } internal Resources() { } } } namespace ValheimTooler.Patches { [HarmonyPatch(typeof(Inventory), "IsTeleportable")] internal class AlwaysTeleportAllow { private static bool Prefix(ref bool __result) { if (PlayerHacks.s_bypassRestrictedTeleportable) { __result = true; return false; } return true; } } [HarmonyPatch(typeof(Destructible), "Start")] internal class AutoPinResources { private static Random s_random = new Random(); private const string Chars = "0123456789"; private static void Postfix(ref Destructible __instance) { if (!MiscHacks.s_enableAutopinMap) { return; } HoverText component = ((Component)__instance).GetComponent<HoverText>(); if (Object.op_Implicit((Object)(object)component) && !((Object)(object)((Component)__instance).gameObject.GetComponent<PinnedObject>() != (Object)null) && component.m_text.ToLower().Contains("deposit")) { string text = new string((from s in Enumerable.Repeat("0123456789", 5) select s[s_random.Next(s.Length)]).ToArray()); string text2 = component.GetHoverName() + " [VT" + text + "]"; ((Component)__instance).gameObject.AddComponent<PinnedObject>().Init(text2); ZLog.Log((object)("Pin candidate: " + text2)); } } } [HarmonyPatch(typeof(Player), "EdgeOfWorldKill", new Type[] { typeof(float) })] internal class EdgeMapKill { private static bool Prefix() { if ((Object)(object)Player.m_localPlayer != (Object)null && Player.m_localPlayer.VTInGodMode()) { return false; } return true; } } [HarmonyPatch(typeof(Player), "UseStamina", new Type[] { typeof(float) })] internal class InfiniteStamina { private static void Prefix(ref Player __instance, ref float v) { if (PlayerHacks.s_isInfiniteStaminaMe && (Object)(object)Player.m_localPlayer != (Object)null && __instance.GetPlayerID() == Player.m_localPlayer.GetPlayerID()) { v = 0f; } } } [HarmonyPatch(typeof(InventoryGui), "UpdateRecipe", new Type[] { typeof(Player), typeof(float) })] internal class InstantCraft { private static void Prefix(ref Player player, ref float dt) { if (PlayerHacks.s_instantCraft) { dt = 2f; } } } [HarmonyPatch(typeof(Inventory), "GetTotalWeight")] internal class InventoryNoWeightLimit { private static bool Prefix(ref float __result) { if (PlayerHacks.s_inventoryNoWeightLimit) { __result = 0f; return false; } return true; } } internal class NoPlacementCostRepair { [HarmonyPatch(typeof(InventoryGui), "CanRepair", new Type[] { typeof(ItemData) })] public class CanRepairPatch { private static bool Prefix(ref InventoryGui __instance, ref bool __result, ItemData item) { if ((Object)(object)Player.m_localPlayer == (Object)null) { return true; } bool fieldValue = Player.m_localPlayer.GetFieldValue<bool>("m_noPlacementCost"); if (fieldValue) { __result = fieldValue; return false; } return true; } } } internal class DisableInputWhenInterfaceIsShowed { [HarmonyPatch(typeof(Player), "TakeInput")] private class PlayerTakeInput { private static bool Prefix(ref bool __result) { if (EntryPoint.s_showMainWindow) { __result = false; return false; } return true; } } [HarmonyPatch(typeof(PlayerController), "InInventoryEtc")] private class PlayerControllerInInventoryEtc { private static bool Prefix(ref bool __result) { if (EntryPoint.s_showMainWindow) { __result = true; return false; } return true; } } [HarmonyPatch(typeof(InventoryGrid), "OnLeftClick", new Type[] { typeof(UIInputHandler) })] private class InventoryGridOnLeftClick { private static bool Prefix() { if (EntryPoint.s_showMainWindow) { return false; } return true; } } [HarmonyPatch(typeof(InventoryGrid), "OnRightClick", new Type[] { typeof(UIInputHandler) })] private class InventoryGridOnRightClick { private static bool Prefix() { if (EntryPoint.s_showMainWindow) { return false; } return true; } } } } namespace ValheimTooler.Models { public class TPTarget { public enum TargetType { PlayerNet, Player, Peer, MapPin } public readonly TargetType targetType; public readonly PlayerInfo playerNet; public readonly Player player; public readonly ZNetPeer peer; public readonly PinData minimapPin; public string Name => targetType switch { TargetType.PlayerNet => playerNet.m_name, TargetType.Player => player.GetPlayerName(), TargetType.Peer => peer.m_playerName, TargetType.MapPin => $"{minimapPin.m_name} ({minimapPin.m_type})", _ => "", }; public Vector3? Position { get { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) switch (targetType) { case TargetType.PlayerNet: if (playerNet.m_publicPosition) { return playerNet.m_position; } return null; case TargetType.Player: return ((Component)player).transform.position; case TargetType.Peer: return null; case TargetType.MapPin: { Vector3 pos = minimapPin.m_pos; pos.y = Mathf.Clamp(pos.y, ZoneSystem.instance.m_waterLevel, ZoneSystem.instance.m_waterLevel); return pos; } default: return null; } } } public TPTarget(TargetType targetType, object target) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Expected O, but got Unknown this.targetType = targetType; switch (targetType) { case TargetType.PlayerNet: playerNet = (PlayerInfo)target; break; case TargetType.Player: player = (Player)target; break; case TargetType.Peer: peer = (ZNetPeer)target; break; case TargetType.MapPin: minimapPin = (PinData)target; break; } } public override string ToString() { //IL_0077: Unknown result type (might be due to invalid IL or missing references) return targetType switch { TargetType.PlayerNet => "Player " + playerNet.m_name, TargetType.Player => "Player " + player.GetPlayerName(), TargetType.Peer => "Player " + peer.m_playerName, TargetType.MapPin => $"Map pin: {minimapPin.m_name} ({minimapPin.m_type})", _ => "Unknow", }; } } } namespace ValheimTooler.Models.Mono { internal class PinnedObject : MonoBehaviour { public PinData pin; public void Init(string aName) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) pin = Minimap.instance.AddPin(((Component)this).transform.position, (PinType)3, aName, ConfigManager.s_permanentPins.Value, false, 0L, ""); ZLog.Log((object)$"Tracking: {aName} at {((Component)this).transform.position.x} {((Component)this).transform.position.y} {((Component)this).transform.position.z}"); } private void OnDestroy() { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) if (pin != null && (Object)(object)Minimap.instance != (Object)null && !ConfigManager.s_permanentPins.Value) { Minimap.instance.RemovePin(pin); ZLog.Log((object)$"Removing: {pin.m_name} at {((Component)this).transform.position.x} {((Component)this).transform.position.y} {((Component)this).transform.position.z}"); } } } } namespace ValheimTooler.Core { public static class EntitiesItemsHacks { private static string s_entityQuantityText = "1"; private static int s_entityLevelIdx = 0; private static int s_entityPrefabIdx = 0; private static string s_entitySearchTerms = ""; private static string s_previousSearchTerms = ""; private static float s_updateTimer = 0f; private static readonly float s_updateTimerInterval = 1.5f; private static readonly List<string> s_entityLevels = new List<string>(); private static readonly List<string> s_entityPrefabs = new List<string>(); private static List<string> s_entityPrefabsFiltered = new List<string>(); private static int NameComparator(string a, string b) { return string.Compare(a, b, StringComparison.InvariantCultureIgnoreCase); } public static void Start() { for (int i = 1; i <= 5; i++) { s_entityLevels.Add(i.ToString()); } } public static void Update() { if (Time.time >= s_updateTimer && s_entityPrefabs.Count == 0) { if (Object.op_Implicit((Object)(object)ZNetScene.instance)) { foreach (GameObject prefab in ZNetScene.instance.m_prefabs) { if (!((Object)prefab).name.Contains("_")) { s_entityPrefabs.Add(((Object)prefab).name); } } s_entityPrefabs.Sort(NameComparator); s_entityPrefabsFiltered = s_entityPrefabs; } s_updateTimer = Time.time + s_updateTimerInterval; } if (ConfigManager.s_removeAllDropShortcut.Value.IsDown()) { RemoveAllDrops(); } } public static void DisplayGUI() { GUILayout.BeginVertical(VTLocalization.instance.Localize("$vt_entities_spawn_title"), GUI.skin.box, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); GUILayout.Space((float)EntryPoint.s_boxSpacing); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label(VTLocalization.instance.Localize("$vt_entities_spawn_entity_name :"), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); s_entityPrefabIdx = RGUI.SearchableSelectionPopup(s_entityPrefabIdx, s_entityPrefabsFiltered.ToArray(), ref s_entitySearchTerms); SearchItem(s_entitySearchTerms); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label(VTLocalization.instance.Localize("$vt_entities_spawn_quantity :"), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); s_entityQuantityText = GUILayout.TextField(s_entityQuantityText, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label(VTLocalization.instance.Localize("$vt_entities_spawn_level :"), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); s_entityLevelIdx = RGUI.SelectionPopup(s_entityLevelIdx, s_entityLevels.ToArray()); GUILayout.EndHorizontal(); if (GUILayout.Button(VTLocalization.instance.Localize("$vt_entities_spawn_button"), Array.Empty<GUILayoutOption>()) && int.TryParse(s_entityQuantityText, out var result) && int.TryParse(s_entityLevels[s_entityLevelIdx], out var result2) && result <= 100 && s_entityPrefabIdx < s_entityPrefabsFiltered.Count && s_entityPrefabIdx >= 0) { SpawnEntities(s_entityPrefabsFiltered[s_entityPrefabIdx], result2, result); } GUILayout.EndVertical(); GUILayout.BeginVertical(VTLocalization.instance.Localize("$vt_entities_drops_title"), GUI.skin.box, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); GUILayout.Space((float)EntryPoint.s_boxSpacing); if (GUILayout.Button(ValheimTooler.UI.Utils.LabelWithShortcut("$vt_entities_drops_button", ConfigManager.s_removeAllDropShortcut.Value), Array.Empty<GUILayoutOption>())) { RemoveAllDrops(); } GUILayout.EndVertical(); GUILayout.BeginVertical(VTLocalization.instance.Localize("$vt_entities_item_giver_title"), GUI.skin.box, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); GUILayout.Space((float)EntryPoint.s_boxSpacing); if (GUILayout.Button(EntryPoint.s_showItemGiver ? VTLocalization.instance.Localize("$vt_entities_item_giver_button_hide") : VTLocalization.instance.Localize("$vt_entities_item_giver_button_show"), Array.Empty<GUILayoutOption>())) { EntryPoint.s_showItemGiver = !EntryPoint.s_showItemGiver; } GUILayout.EndVertical(); } private static void SearchItem(string search) { if (s_previousSearchTerms.Equals(search)) { return; } if (search.Length == 0) { s_entityPrefabsFiltered = s_entityPrefabs; } else { string searchLower = search.ToLower(); s_entityPrefabsFiltered = s_entityPrefabs.Where((string i) => i.ToLower().Contains(searchLower)).ToList(); } s_previousSearchTerms = search; } private static void SpawnEntity(GameObject entityPrefab, int level) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)entityPrefab != (Object)null && (Object)(object)Player.m_localPlayer != (Object)null) { Vector3 val = Random.insideUnitSphere * 0.5f; Character component = Object.Instantiate<GameObject>(entityPrefab, ((Component)Player.m_localPlayer).transform.position + ((Component)Player.m_localPlayer).transform.forward * 2f + Vector3.up + val, Quaternion.identity).GetComponent<Character>(); if ((Object)(object)component != (Object)null) { component.SetLevel(level); } } } private static void SpawnEntities(string entityPrefab, int level, int quantity) { if ((Object)(object)ZNetScene.instance == (Object)null) { return; } GameObject prefab = ZNetScene.instance.GetPrefab(entityPrefab); if (!((Object)(object)prefab == (Object)null)) { for (int i = 0; i < quantity; i++) { SpawnEntity(prefab, level); } } } private static void RemoveAllDrops() { ItemDrop[] array = Object.FindObjectsOfType<ItemDrop>(); foreach (ItemDrop val in array) { Fish component = ((Component)val).gameObject.GetComponent<Fish>(); if (!Object.op_Implicit((Object)(object)component) || component.IsOutOfWater()) { ZNetView component2 = ((Component)val).GetComponent<ZNetView>(); if (Object.op_Implicit((Object)(object)component2) && component2.IsValid()) { component2.Destroy(); } } } } } public static class ItemGiver { private class InventoryItem { public GameObject itemPrefab; public ItemDrop itemDrop; public GUIContent guiContent; public int variant; public InventoryItem(GameObject itemPrefab, ItemDrop itemDrop, GUIContent guiContent, int variant) { this.itemPrefab = itemPrefab; this.itemDrop = itemDrop; this.guiContent = guiContent; this.variant = variant; } } private static Rect s_itemGiverRect; private static Vector2 s_itemGiverScrollPosition; private static readonly List<InventoryItem> s_items = new List<InventoryItem>(); private static List<InventoryItem> s_itemsFiltered = new List<InventoryItem>(); private static List<GUIContent> s_itemsGUIFiltered = new List<GUIContent>(); private static int s_selectedItem = 0; private static string s_quantityItem = "1"; private static string s_qualityItem = "1"; private static string s_searchTerms = ""; private static string s_previousSearchTerms = ""; public static void Start() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Expected O, but got Unknown s_itemGiverRect = new Rect(ConfigManager.s_itemGiverWindowPosition.Value.x, ConfigManager.s_itemGiverWindowPosition.Value.y, 400f, 400f); if ((Object)(object)ObjectDB.instance == (Object)null) { return; } foreach (GameObject item2 in ObjectDB.instance.m_items) { ItemDrop component = item2.GetComponent<ItemDrop>(); ItemData itemData = component.m_itemData; if (itemData != null && itemData.m_shared?.m_icons?.Length <= 0) { continue; } for (int i = 0; i < component.m_itemData.m_shared.m_icons.Length; i++) { try { GUIContent val = new GUIContent((Texture)(object)SpriteManager.TextureFromSprite(component.m_itemData.m_shared.m_icons[i]), Localization.instance.Localize(component.m_itemData.m_shared.m_name + ((i > 0) ? (" Variant " + i) : ""))); InventoryItem item = new InventoryItem(item2, component, val, i); s_itemsGUIFiltered.Add(val); s_items.Add(item); s_itemsFiltered.Add(item); } catch { ZLog.Log((object)$"[ValheimTooler - ItemGiver] Failed to load item {component.m_itemData.m_shared.m_name} with variant {i}. This item will be ignored."); } } } } public static void Update() { } public static void DisplayGUI() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) s_itemGiverRect = GUILayout.Window(1002, s_itemGiverRect, new WindowFunction(ItemGiverWindow), VTLocalization.instance.Localize("$vt_item_giver_title"), Array.Empty<GUILayoutOption>()); ConfigManager.s_itemGiverWindowPosition.Value = ((Rect)(ref s_itemGiverRect)).position; } public static void ItemGiverWindow(int windowID) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_01f2: Unknown result type (might be due to invalid IL or missing references) //IL_01f8: Expected O, but got Unknown //IL_0202: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_0211: Unknown result type (might be due to invalid IL or missing references) //IL_021c: Unknown result type (might be due to invalid IL or missing references) //IL_0226: Unknown result type (might be due to invalid IL or missing references) //IL_027c: Unknown result type (might be due to invalid IL or missing references) //IL_0241: Unknown result type (might be due to invalid IL or missing references) //IL_0250: Unknown result type (might be due to invalid IL or missing references) //IL_025a: Unknown result type (might be due to invalid IL or missing references) //IL_0290: Unknown result type (might be due to invalid IL or missing references) //IL_02a0: Unknown result type (might be due to invalid IL or missing references) //IL_0302: Unknown result type (might be due to invalid IL or missing references) //IL_02bb: Unknown result type (might be due to invalid IL or missing references) //IL_02d0: Unknown result type (might be due to invalid IL or missing references) //IL_02e0: Unknown result type (might be due to invalid IL or missing references) //IL_0317: Unknown result type (might be due to invalid IL or missing references) //IL_031e: Unknown result type (might be due to invalid IL or missing references) //IL_0325: Unknown result type (might be due to invalid IL or missing references) //IL_032c: Unknown result type (might be due to invalid IL or missing references) //IL_0333: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)ObjectDB.instance == (Object)null || ObjectDB.instance.m_items.Count == 0) { return; } GUIStyle val = new GUIStyle(GUI.skin.label); val.normal.textColor = Color.white; GUILayout.Space((float)EntryPoint.s_boxSpacing); s_searchTerms = GUILayout.TextField(s_searchTerms, Array.Empty<GUILayoutOption>()); SearchItem(s_searchTerms); s_itemGiverScrollPosition = GUILayout.BeginScrollView(s_itemGiverScrollPosition, GUI.skin.box, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(350f) }); s_selectedItem = GUILayout.SelectionGrid(s_selectedItem, s_itemsGUIFiltered.ToArray(), 4, InterfaceMaker.CustomSkin.GetStyle("flatButton"), Array.Empty<GUILayoutOption>()); GUILayout.EndScrollView(); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label(VTLocalization.instance.Localize("$vt_item_giver_quantity :"), val, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); s_quantityItem = GUILayout.TextField(s_quantityItem, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label(VTLocalization.instance.Localize("$vt_item_giver_quality :"), val, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); s_qualityItem = GUILayout.TextField(s_qualityItem, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); GUILayout.EndHorizontal(); if (GUILayout.Button(VTLocalization.instance.Localize("$vt_item_giver_button"), Array.Empty<GUILayoutOption>()) && int.TryParse(s_quantityItem, out var result) && int.TryParse(s_qualityItem, out var result2)) { Player.m_localPlayer.VTAddItemToInventory(((Object)s_itemsFiltered[s_selectedItem].itemPrefab).name, result, result2, s_itemsFiltered[s_selectedItem].variant); } if (GUI.tooltip != "") { GUIContent val2 = new GUIContent(GUI.tooltip); Vector2 val3 = new GUIStyle(GUI.skin.textField).CalcSize(val2); Vector2 val4 = default(Vector2); if (Event.current.mousePosition.x + val3.x > ((Rect)(ref s_itemGiverRect)).width) { val4.x = Event.current.mousePosition.x - (Event.current.mousePosition.x + val3.x - ((Rect)(ref s_itemGiverRect)).width); } else { val4.x = Event.current.mousePosition.x; } if (Event.current.mousePosition.y + 30f + val3.y > ((Rect)(ref s_itemGiverRect)).height) { val4.y = Event.current.mousePosition.y + 30f - (Event.current.mousePosition.y + 30f + val3.y - ((Rect)(ref s_itemGiverRect)).height); } else { val4.y = Event.current.mousePosition.y + 30f; } GUI.Box(new Rect(val4.x, val4.y, val3.x, val3.y), val2, GUI.skin.textField); } GUI.DragWindow(); } private static void SearchItem(string search) { search = search.ToLower(); if (s_previousSearchTerms.Equals(search)) { return; } if (search.Length == 0) { s_itemsFiltered = s_items; s_itemsGUIFiltered = s_itemsFiltered.Select((InventoryItem i) => i.guiContent).ToList(); } else { s_itemsFiltered = s_items.Where((InventoryItem i) => Localization.instance.Localize(i.itemDrop.m_itemData.m_shared.m_name + ((i.variant > 0) ? (" Variant " + i.variant) : "")).ToLower().Contains(search)).ToList(); s_itemsGUIFiltered = s_itemsFiltered.Select((InventoryItem i) => i.guiContent).ToList(); } s_previousSearchTerms = search; } } public static class MiscHacks { public static bool s_enableAutopinMap = false; private static int s_playerDamageIdx = 0; private static string s_damageToDeal = "1"; private static string s_worldMessageText = ""; private static string s_chatUsernameText = ""; private static string s_chatMessageText = ""; private static bool s_isShoutMessage = false; private static List<Player> s_players = null; private static float s_updateTimer = 0f; private static readonly float s_updateTimerInterval = 1.5f; public static void Start() { } public static void Update() { if (Time.time >= s_updateTimer) { s_players = Player.GetAllPlayers(); s_updateTimer = Time.time + s_updateTimerInterval; } if (ConfigManager.s_espPlayersShortcut.Value.IsDown()) { ActionToggleESPPlayers(sendNotification: true); } if (ConfigManager.s_espMonstersShortcut.Value.IsDown()) { ActionToggleESPMonsters(sendNotification: true); } if (ConfigManager.s_espDroppedItemsShortcut.Value.IsDown()) { ActionToggleESPDroppedItems(sendNotification: true); } if (ConfigManager.s_espDepositsShortcut.Value.IsDown()) { ActionToggleESPDeposits(sendNotification: true); } if (ConfigManager.s_espPickablesShortcut.Value.IsDown()) { ActionToggleESPPickables(sendNotification: true); } } public static void DisplayGUI() { GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.BeginVertical(Array.Empty<GUILayoutOption>()); GUILayout.BeginVertical(VTLocalization.instance.Localize("$vt_misc_damage_title"), GUI.skin.box, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); GUILayout.Space((float)EntryPoint.s_boxSpacing); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label(VTLocalization.instance.Localize("$vt_misc_damage_player :"), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); s_playerDamageIdx = RGUI.SelectionPopup(s_playerDamageIdx, s_players?.Select((Player p) => p.GetPlayerName()).ToArray()); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label(VTLocalization.instance.Localize("$vt_misc_damage_value :"), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); s_damageToDeal = GUILayout.TextField(s_damageToDeal, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); GUILayout.EndHorizontal(); if (GUILayout.Button(VTLocalization.instance.Localize("$vt_misc_damage_button_player"), Array.Empty<GUILayoutOption>()) && int.TryParse(s_damageToDeal, out var result)) { ((Character)(object)s_players[s_playerDamageIdx]).VTDamage(result); } if (GUILayout.Button(VTLocalization.instance.Localize("$vt_misc_damage_button_entities"), Array.Empty<GUILayoutOption>())) { DamageAllCharacters(); } if (GUILayout.Button(VTLocalization.instance.Localize("$vt_misc_damage_button_players"), Array.Empty<GUILayoutOption>())) { DamageAllOtherPlayers(); } GUILayout.EndVertical(); GUILayout.BeginVertical(VTLocalization.instance.Localize("$vt_misc_map_title"), GUI.skin.box, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); GUILayout.Space((float)EntryPoint.s_boxSpacing); if (GUILayout.Button(ValheimTooler.UI.Utils.ToggleButtonLabel("$vt_misc_autopin", s_enableAutopinMap), Array.Empty<GUILayoutOption>())) { s_enableAutopinMap = !s_enableAutopinMap; } GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); ConfigManager.s_permanentPins.Value = GUILayout.Toggle(ConfigManager.s_permanentPins.Value, "", Array.Empty<GUILayoutOption>()); GUILayout.Label(VTLocalization.instance.Localize("$vt_misc_autopin_permanent"), Array.Empty<GUILayoutOption>()); GUILayout.EndHorizontal(); if (GUILayout.Button(VTLocalization.instance.Localize("$vt_misc_autopin_clear"), Array.Empty<GUILayoutOption>()) && (Object)(object)Minimap.instance != (Object)null) { foreach (PinData item in new List<PinData>(Minimap.instance.GetFieldValue<List<PinData>>("m_pins"))) { if (Regex.IsMatch(item.m_name, "^.+\\[VT[0-9]{5}]$")) { Minimap.instance.RemovePin(item); } } } GUILayout.EndVertical(); GUILayout.BeginVertical(VTLocalization.instance.Localize("$vt_misc_event_title"), GUI.skin.box, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); GUILayout.Space((float)EntryPoint.s_boxSpacing); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label(VTLocalization.instance.Localize("$vt_misc_event_message :"), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); s_worldMessageText = GUILayout.TextField(s_worldMessageText, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); GUILayout.EndHorizontal(); if (GUILayout.Button(VTLocalization.instance.Localize("$vt_misc_event_button"), Array.Empty<GUILayoutOption>())) { MessageAllInRange((MessageType)2, s_worldMessageText); } GUILayout.EndVertical(); GUILayout.EndVertical(); GUILayout.BeginVertical(Array.Empty<GUILayoutOption>()); GUILayout.BeginVertical(VTLocalization.instance.Localize("$vt_misc_chat_title"), GUI.skin.box, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); GUILayout.Space((float)EntryPoint.s_boxSpacing); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label(VTLocalization.instance.Localize("$vt_misc_chat_username :"), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); s_chatUsernameText = GUILayout.TextField(s_chatUsernameText, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
BepInEx/plugins/ValheimTooler/ValheimToolerMod.dll
Decompiled 3 weeks agousing System; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using HarmonyLib; using ValheimTooler; using ValheimToolerMod.Patches; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("ValheimToolerMod")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ValheimToolerMod")] [assembly: AssemblyCopyright("Copyright © Astropilot 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("3d5f17bb-bb22-440e-848e-5f5f45a530f9")] [assembly: AssemblyFileVersion("1.11.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.11.0.0")] namespace ValheimToolerMod { [BepInPlugin("com.github.Astropilot.ValheimTooler", "ValheimTooler", "1.11.0")] [BepInProcess("valheim.exe")] public class ValheimToolerMod : BaseUnityPlugin { private const string PluginGUID = "com.github.Astropilot.ValheimTooler"; private const string PluginName = "ValheimTooler"; private const string PluginVersion = "1.11.0"; private Harmony _harmony; private void Awake() { FejdStartupPatch.OnGameInitialized += LoadPlugin; _harmony = Harmony.CreateAndPatchAll(typeof(FejdStartupPatch), "com.github.Astropilot.ValheimTooler"); } private void OnDestroy() { Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } CallLoaderUnload(); } private void LoadPlugin() { FejdStartupPatch.OnGameInitialized -= LoadPlugin; Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } _harmony = null; string directoryName = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); string path = Path.Combine(directoryName, "config_vt.path"); File.WriteAllText(path, Paths.ConfigPath); CallLoaderInit(); } private static Type GetLoaderType() { Type typeFromHandle = typeof(EntryPoint); Type type = typeFromHandle.Assembly.GetType("ValheimTooler.Loader"); if ((object)type == null) { throw new Exception("Can't find Type ValheimTooler.Loader"); } return type; } private void CallLoader(string methodName) { Type loaderType = GetLoaderType(); MethodInfo method = loaderType.GetMethod(methodName, BindingFlags.Static | BindingFlags.Public); if ((object)method == null) { throw new Exception("Can't find method " + methodName); } method.Invoke(null, new object[0]); ((BaseUnityPlugin)this).Logger.LogDebug((object)("Called ValheimTooler.Loader." + methodName)); } private void CallLoaderInit() { CallLoader("Init"); } private void CallLoaderUnload() { CallLoader("Unload"); } } } namespace ValheimToolerMod.Patches { internal class FejdStartupPatch { public static event Action OnGameInitialized; [HarmonyPatch(typeof(FejdStartup), "Start")] [HarmonyPostfix] private static void OnFejdStartup(FejdStartup __instance) { Delegate[] invocationList = FejdStartupPatch.OnGameInitialized.GetInvocationList(); for (int i = 0; i < invocationList.Length; i++) { Action action = (Action)invocationList[i]; action(); } } } }