Decompiled source of ValheimTooler v1.11.0

BepInEx/plugins/ValheimTooler/SharpConfig.dll

Decompiled 3 weeks ago
using 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
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 ago
using 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();
			}
		}
	}
}