Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of JotunnLib v0.1.10
JotunnLib.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using HarmonyLib; using JotunnLib.Entities; using JotunnLib.Events; using JotunnLib.Managers; using JotunnLib.Utils; using UnityEngine; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("JotunnLib")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("JotunnLib")] [assembly: AssemblyCopyright("Copyright © 2021")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("a6082a59-38be-4cab-9078-2c8fcda65b8f")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.0", FrameworkDisplayName = ".NET Framework 4")] [assembly: AssemblyVersion("1.0.0.0")] internal static class ObjImporter { private struct meshStruct { public Vector3[] vertices; public Vector3[] normals; public Vector2[] uv; public Vector2[] uv1; public Vector2[] uv2; public int[] triangles; public int[] faceVerts; public int[] faceUVs; public Vector3[] faceData; public string name; public string fileName; } public static Mesh ImportFile(string filePath) { //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_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: 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_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Expected O, but got Unknown //IL_009e: 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_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) meshStruct mesh = createMeshStruct(filePath); populateMeshStruct(ref mesh); Vector3[] array = (Vector3[])(object)new Vector3[mesh.faceData.Length]; Vector2[] array2 = (Vector2[])(object)new Vector2[mesh.faceData.Length]; Vector3[] array3 = (Vector3[])(object)new Vector3[mesh.faceData.Length]; int num = 0; Vector3[] faceData = mesh.faceData; foreach (Vector3 val in faceData) { array[num] = mesh.vertices[(int)val.x - 1]; if (val.y >= 1f) { array2[num] = mesh.uv[(int)val.y - 1]; } if (val.z >= 1f) { array3[num] = mesh.normals[(int)val.z - 1]; } num++; } Mesh val2 = new Mesh { vertices = array, uv = array2, normals = array3, triangles = mesh.triangles }; val2.RecalculateBounds(); val2.Optimize(); return val2; } private static meshStruct createMeshStruct(string filename) { int num = 0; int num2 = 0; int num3 = 0; int num4 = 0; int num5 = 0; meshStruct result = default(meshStruct); result.fileName = filename; StreamReader streamReader = File.OpenText(filename); string s = streamReader.ReadToEnd(); streamReader.Close(); using (StringReader stringReader = new StringReader(s)) { string text = stringReader.ReadLine(); char[] separator = new char[1] { ' ' }; while (text != null) { if (!text.StartsWith("f ") && !text.StartsWith("v ") && !text.StartsWith("vt ") && !text.StartsWith("vn ")) { text = stringReader.ReadLine(); if (text != null) { text = text.Replace(" ", " "); } continue; } text = text.Trim(); string[] array = text.Split(separator, 50); switch (array[0]) { case "v": num2++; break; case "vt": num3++; break; case "vn": num4++; break; case "f": num5 = num5 + array.Length - 1; num += 3 * (array.Length - 2); break; } text = stringReader.ReadLine(); if (text != null) { text = text.Replace(" ", " "); } } } result.triangles = new int[num]; result.vertices = (Vector3[])(object)new Vector3[num2]; result.uv = (Vector2[])(object)new Vector2[num3]; result.normals = (Vector3[])(object)new Vector3[num4]; result.faceData = (Vector3[])(object)new Vector3[num5]; return result; } private static void populateMeshStruct(ref meshStruct mesh) { //IL_037d: Unknown result type (might be due to invalid IL or missing references) //IL_0382: Unknown result type (might be due to invalid IL or missing references) //IL_034e: Unknown result type (might be due to invalid IL or missing references) //IL_0353: Unknown result type (might be due to invalid IL or missing references) //IL_03b5: Unknown result type (might be due to invalid IL or missing references) //IL_03ba: Unknown result type (might be due to invalid IL or missing references) //IL_02f0: Unknown result type (might be due to invalid IL or missing references) //IL_02f5: Unknown result type (might be due to invalid IL or missing references) //IL_031f: Unknown result type (might be due to invalid IL or missing references) //IL_0324: Unknown result type (might be due to invalid IL or missing references) //IL_03db: Unknown result type (might be due to invalid IL or missing references) //IL_0448: Unknown result type (might be due to invalid IL or missing references) //IL_044a: Unknown result type (might be due to invalid IL or missing references) StreamReader streamReader = File.OpenText(mesh.fileName); string s = streamReader.ReadToEnd(); streamReader.Close(); using StringReader stringReader = new StringReader(s); string text = stringReader.ReadLine(); char[] separator = new char[1] { ' ' }; char[] separator2 = new char[1] { '/' }; int num = 0; int num2 = 0; int num3 = 0; int num4 = 0; int num5 = 0; int num6 = 0; int num7 = 0; while (text != null) { if (!text.StartsWith("f ") && !text.StartsWith("v ") && !text.StartsWith("vt ") && !text.StartsWith("vn ") && !text.StartsWith("g ") && !text.StartsWith("usemtl ") && !text.StartsWith("mtllib ") && !text.StartsWith("vt1 ") && !text.StartsWith("vt2 ") && !text.StartsWith("vc ") && !text.StartsWith("usemap ")) { text = stringReader.ReadLine(); if (text != null) { text = text.Replace(" ", " "); } continue; } text = text.Trim(); string[] array = text.Split(separator, 50); switch (array[0]) { case "v": mesh.vertices[num3] = new Vector3(Convert.ToSingle(array[1]), Convert.ToSingle(array[2]), Convert.ToSingle(array[3])); num3++; break; case "vt": mesh.uv[num5] = new Vector2(Convert.ToSingle(array[1]), Convert.ToSingle(array[2])); num5++; break; case "vt1": mesh.uv[num6] = new Vector2(Convert.ToSingle(array[1]), Convert.ToSingle(array[2])); num6++; break; case "vt2": mesh.uv[num7] = new Vector2(Convert.ToSingle(array[1]), Convert.ToSingle(array[2])); num7++; break; case "vn": mesh.normals[num4] = new Vector3(Convert.ToSingle(array[1]), Convert.ToSingle(array[2]), Convert.ToSingle(array[3])); num4++; break; case "f": { int num8 = 1; List<int> list = new List<int>(); while (num8 < array.Length && (array[num8] ?? "").Length > 0) { Vector3 val = default(Vector3); string[] array2 = array[num8].Split(separator2, 3); val.x = Convert.ToInt32(array2[0]); if (array2.Length > 1) { if (array2[1] != "") { val.y = Convert.ToInt32(array2[1]); } val.z = Convert.ToInt32(array2[2]); } num8++; mesh.faceData[num2] = val; list.Add(num2); num2++; } for (num8 = 1; num8 + 2 < array.Length; num8++) { mesh.triangles[num] = list[0]; num++; mesh.triangles[num] = list[num8]; num++; mesh.triangles[num] = list[num8 + 1]; num++; } break; } } text = stringReader.ReadLine(); if (text != null) { text = text.Replace(" ", " "); } } } } namespace JotunnLib { public abstract class Manager : MonoBehaviour { internal virtual void Init() { } internal virtual void Load() { } internal virtual void Register() { } } [BepInPlugin("com.bepinex.plugins.jotunnlib", "JotunnLib", "0.1.9")] public class JotunnLib : BaseUnityPlugin { public const string Version = "0.1.9"; public const string ModGuid = "com.bepinex.plugins.jotunnlib"; private readonly List<Type> managerTypes = new List<Type> { typeof(LocalizationManager), typeof(EventManager), typeof(CommandManager), typeof(InputManager), typeof(SkillManager), typeof(PrefabManager), typeof(PieceManager), typeof(ObjectManager), typeof(ZoneManager) }; private readonly List<Manager> managers = new List<Manager>(); internal static GameObject RootObject; private void Awake() { //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_001e: Expected O, but got Unknown new Harmony("jotunnlib").PatchAll(); RootObject = new GameObject("_JotunnLibRoot"); Object.DontDestroyOnLoad((Object)(object)RootObject); foreach (Type managerType in managerTypes) { managers.Add((Manager)(object)RootObject.AddComponent(managerType)); } foreach (Manager manager in managers) { manager.Init(); } initCommands(); Debug.Log((object)"JotunnLib v0.1.9 loaded successfully"); } private void initCommands() { } } } namespace JotunnLib.Utils { public class ReflectionUtils { public static object InvokePrivate(object instance, string name, object[] args = null) { MethodInfo method = instance.GetType().GetMethod(name, BindingFlags.Instance | BindingFlags.NonPublic); if (method == null) { Type[] types = ((args == null) ? new Type[0] : args.Select((object arg) => arg.GetType()).ToArray()); method = instance.GetType().GetMethod(name, types); } if (method == null) { Debug.LogError((object)("Method " + name + " does not exist on type: " + instance.GetType())); return null; } return method.Invoke(instance, args); } public static T GetPrivateField<T>(object instance, string name) { FieldInfo field = instance.GetType().GetField(name, BindingFlags.Instance | BindingFlags.NonPublic); if (field == null) { Debug.LogError((object)("Variable " + name + " does not exist on type: " + instance.GetType())); return default(T); } return (T)field.GetValue(instance); } public static void SetPrivateField(object instance, string name, object value) { FieldInfo field = instance.GetType().GetField(name, BindingFlags.Instance | BindingFlags.NonPublic); if (field == null) { Debug.LogError((object)("Variable " + name + " does not exist on type: " + instance.GetType())); } else { field.SetValue(instance, value); } } public static T GetPrivateStaticField<T>(Type type, string name) { FieldInfo field = type.GetField(name, BindingFlags.Static | BindingFlags.NonPublic); if (field == null) { Debug.LogError((object)("Variable " + name + " does not exist on static type: " + type)); return default(T); } return (T)field.GetValue(null); } } public static class AssetUtils { public static Texture2D LoadTexture(string texturePath) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown //IL_002d: Expected O, but got Unknown string path = Path.Combine(Paths.PluginPath, texturePath); if (!File.Exists(path)) { return null; } byte[] array = File.ReadAllBytes(path); Texture2D val = new Texture2D(2, 2); ImageConversion.LoadImage(val, array); return val; } public static Mesh LoadMesh(string meshPath) { string text = Path.Combine(Paths.PluginPath, meshPath); if (!File.Exists(text)) { return null; } return ObjImporter.ImportFile(text); } } } namespace JotunnLib.Patches { internal class ObjectDBPatches { [HarmonyPatch(typeof(ObjectDB), "Awake")] public static class AwakePatch { public static void Postfix() { //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) Scene activeScene = SceneManager.GetActiveScene(); if (((Scene)(ref activeScene)).name == "main") { ObjectManager.Instance.Register(); ObjectManager.Instance.Load(); PieceManager.Instance.Register(); PieceManager.Instance.Load(); } } } } internal class ZInputPatches { [HarmonyPatch(typeof(ZInput), "Initialize")] public static class InitializePatch { public static void Prefix() { InputManager.Instance.Register(); } } [HarmonyPatch(typeof(ZInput), "Reset")] public static class ResetPatch { public static void Postfix(ref ZInput __instance) { InputManager.Instance.Load(__instance); } } } internal class ZoneSystemPatches { [HarmonyPatch(typeof(ZoneSystem), "Awake")] public static class AwakePatch { public static void Postfix() { } } [HarmonyPatch(typeof(ZoneSystem), "SpawnZone")] public static class SpawnZonePatch { public static void Prefix(Vector2i zoneID) { } } } internal class ZNetScenePatches { [HarmonyPatch(typeof(ZNetScene), "Awake")] public static class AwakePatch { public static void Postfix() { PrefabManager.Instance.Register(); PrefabManager.Instance.Load(); ZoneManager.Instance.Register(); ZoneManager.Instance.Load(); } } } internal class PlayerPatches { [HarmonyPatch(typeof(Player), "OnSpawned")] public static class OnSpawnedPatch { public static void Prefix(ref Player __instance, ref bool ___m_firstSpawn) { EventManager.OnPlayerSpawned(__instance); } } [HarmonyPatch(typeof(Player), "PlacePiece")] public static class PlacePiecePatch { public static void Postfix(ref Player __instance, Piece piece, bool __result, GameObject ___m_placementGhost) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) EventManager.OnPlayerPlacedPiece(new PlayerPlacedPieceEventArgs { Player = __instance, Piece = piece, Position = ___m_placementGhost.transform.position, Rotation = ___m_placementGhost.transform.rotation, Success = __result }); } } } internal class SkillsPatches { [HarmonyPatch(typeof(Skills), "Awake")] public static class AwakePatch { public static void Postfix(ref Skills __instance) { foreach (KeyValuePair<SkillType, SkillDef> skill in SkillManager.Instance.Skills) { SkillDef value = skill.Value; __instance.m_skills.Add(value); Console.WriteLine("Added extra skill: " + ((object)(SkillType)(ref value.m_skill)).ToString()); } } } [HarmonyPatch(typeof(Skills), "IsSkillValid")] public static class IsSkillValidPatch { public static bool Prefix(ref bool __result, SkillType type) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) foreach (KeyValuePair<SkillType, SkillDef> skill in SkillManager.Instance.Skills) { if (skill.Value.m_skill == type) { __result = true; return false; } } return true; } } } } namespace JotunnLib.Managers { public class CommandManager : Manager { private static List<ConsoleCommand> queuedCommands = new List<ConsoleCommand>(); public static CommandManager Instance { get; private set; } private void Awake() { if ((Object)(object)Instance != (Object)null) { Debug.LogError((object)("Error, two instances of singleton: " + ((object)this).GetType().Name)); } else { Instance = this; } } [Obsolete("Please use RegisterConsoleCommand(Terminal.ConsoleCommand cmd) instead", false)] public void RegisterConsoleCommand(ConsoleCommand cmd) { //IL_002b: 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) //IL_0040: Expected O, but got Unknown RegisterConsoleCommand(new ConsoleCommand(cmd.Name, cmd.Help, (ConsoleEvent)delegate(ConsoleEventArgs args) { cmd.Run(args.Args); }, false, false, false, false, false, (ConsoleOptionsFetcher)null)); } public void RegisterConsoleCommand(ConsoleCommand cmd) { if (!ReflectionUtils.GetPrivateStaticField<bool>(typeof(Terminal), "m_terminalInitialized")) { queuedCommands.Add(cmd); return; } Dictionary<string, ConsoleCommand> privateField = ReflectionUtils.GetPrivateField<Dictionary<string, ConsoleCommand>>(Console.instance, "commands"); if (queuedCommands.Count > 0) { foreach (ConsoleCommand queuedCommand in queuedCommands) { if (privateField.ContainsKey(queuedCommand.Command)) { Debug.LogError((object)("Cannot have two console commands with same name: " + cmd.Command)); return; } privateField.Add(queuedCommand.Command, queuedCommand); } queuedCommands.Clear(); } if (privateField.ContainsKey(cmd.Command)) { Debug.LogError((object)("Cannot have two console commands with same name: " + cmd.Command)); } else { privateField.Add(cmd.Command, cmd); } } } public class EventManager : Manager { internal static EventManager Instance { get; private set; } public static event EventHandler<PlayerEventArgs> PlayerSpawned; public static event EventHandler<PlayerPlacedPieceEventArgs> PlayerPlacedPiece; private static event EventHandler PlayerDied; private static event EventHandler PlayerSentChat; private static event EventHandler<PlayerEventArgs> PlayerConnected; private static event EventHandler<PlayerEventArgs> PlayerDisconnected; private void Awake() { if ((Object)(object)Instance != (Object)null) { Debug.LogError((object)("Error, two instances of singleton: " + ((object)this).GetType().Name)); } else { Instance = this; } } internal static void OnPlayerSpawned(Player player) { EventManager.PlayerSpawned?.Invoke(player, new PlayerEventArgs { Player = player }); } internal static void OnPlayerPlacedPiece(PlayerPlacedPieceEventArgs args) { EventManager.PlayerPlacedPiece?.Invoke(args.Player, args); } } public class InputManager : Manager { public EventHandler InputRegister; internal static Dictionary<string, ButtonConfig> Buttons = new Dictionary<string, ButtonConfig>(); private bool inputsRegistered; public static InputManager Instance { get; private set; } private void Awake() { if ((Object)(object)Instance != (Object)null) { Debug.LogError((object)("Error, two instances of singleton: " + ((object)this).GetType().Name)); } else { Instance = this; } } internal void Load(ZInput zinput) { //IL_007f: Unknown result type (might be due to invalid IL or missing references) Debug.Log((object)"---- Registering custom inputs ----"); if (zinput == null) { Debug.LogError((object)"\t-> ZInput does not exist yet, delaying..."); return; } foreach (KeyValuePair<string, ButtonConfig> button in Buttons) { ButtonConfig value = button.Value; if (value.Axis != null && value.Axis.Length > 0) { zinput.AddButton(value.Name, value.Axis, value.Inverted, value.RepeatDelay, value.RepeatInterval, true, false); } else { zinput.AddButton(value.Name, value.Key, value.RepeatDelay, value.RepeatInterval, true, false); } Debug.Log((object)("Registered input: " + button.Key)); } } internal override void Register() { if (!inputsRegistered) { InputRegister?.Invoke(null, EventArgs.Empty); inputsRegistered = true; } } public void RegisterButton(string name, ButtonConfig button) { if (Buttons.ContainsKey(name)) { Debug.LogError((object)("Cannot have duplicate button: " + name)); } else { Buttons.Add(name, button); } } public void RegisterButton(string name, KeyCode key, float repeatDelay = 0f, float repeatInterval = 0f) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) if (Buttons.ContainsKey(name)) { Debug.LogError((object)("Cannot have duplicate button: " + name)); return; } Buttons.Add(name, new ButtonConfig { Name = name, Key = key, RepeatDelay = repeatDelay, RepeatInterval = repeatInterval }); } public void RegisterButton(string name, string axis, bool inverted = false, float repeatDelay = 0f, float repeatInterval = 0f) { if (Buttons.ContainsKey(name)) { Debug.LogError((object)("Cannot have duplicate button: " + name)); return; } Buttons.Add(name, new ButtonConfig { Name = name, Axis = axis, Inverted = inverted, RepeatDelay = repeatDelay, RepeatInterval = repeatInterval }); } } public class LocalizationManager : Manager { internal Dictionary<string, List<LocalizationConfig>> Localizations = new Dictionary<string, List<LocalizationConfig>>(); public static LocalizationManager Instance { get; private set; } private void Awake() { if ((Object)(object)Instance != (Object)null) { Debug.LogError((object)("Error, two instances of singleton: " + ((object)this).GetType().Name)); } else { Instance = this; } } public void RegisterTranslation(string key, string text) { ReflectionUtils.InvokePrivate(Localization.instance, "AddWord", new object[2] { key, text }); } internal void RegisterTranslation(LocalizationConfig localization) { } } public class ObjectManager : Manager { internal List<GameObject> Items = new List<GameObject>(); internal List<Recipe> Recipes = new List<Recipe>(); public static ObjectManager Instance { get; private set; } public event EventHandler ObjectRegister; private void Awake() { if ((Object)(object)Instance != (Object)null) { Debug.LogError((object)("Error, two instances of singleton: " + ((object)this).GetType().Name)); } else { Instance = this; } } internal override void Register() { Debug.Log((object)"---- Registering custom objects ----"); Items.Clear(); Recipes.Clear(); this.ObjectRegister?.Invoke(null, EventArgs.Empty); } internal override void Load() { Debug.Log((object)"---- Loading custom objects ----"); foreach (GameObject item in Items) { try { ObjectDB.instance.m_items.Add(item); Debug.Log((object)("Loaded item: " + ((Object)item).name)); } catch (Exception ex) { Debug.Log((object)("Error loading item: " + ex)); } } foreach (Recipe recipe in Recipes) { try { ObjectDB.instance.m_recipes.Add(recipe); Debug.Log((object)("Loaded item recipe: " + ((Object)recipe).name)); } catch (Exception ex2) { Debug.Log((object)("Error loading recipe: " + ex2)); } } try { ReflectionUtils.InvokePrivate(ObjectDB.instance, "UpdateItemHashes"); } catch (Exception ex3) { Debug.Log((object)("Error updating item hashes: " + ex3)); } } public void RegisterItem(string prefabName) { Items.Add(PrefabManager.Instance.GetPrefab(prefabName)); } public void RegisterItem(GameObject item) { if (item.layer == 0) { item.layer = LayerMask.NameToLayer("item"); } Items.Add(item); } public void RegisterRecipe(RecipeConfig recipeConfig) { Recipe recipe = recipeConfig.GetRecipe(); if ((Object)(object)recipe == (Object)null) { Debug.LogError((object)("Failed to add recipe for item: " + recipeConfig.Item)); } else { Recipes.Add(recipe); } } public void RegisterRecipe(Recipe recipe) { if ((Object)(object)recipe == (Object)null) { Debug.LogError((object)"Failed to add null recipe"); } else { Recipes.Add(recipe); } } public GameObject GetItemPrefab(string name) { if (string.IsNullOrEmpty(name)) { return null; } return ObjectDB.instance.GetItemPrefab(name); } public ItemDrop GetItemDrop(string name) { GameObject itemPrefab = GetItemPrefab(name); if (itemPrefab == null) { return null; } return itemPrefab.GetComponent<ItemDrop>(); } } public class PieceManager : Manager { internal GameObject PieceTableContainer; private bool loaded; private Dictionary<string, PieceTable> pieceTables = new Dictionary<string, PieceTable>(); private Dictionary<string, string> pieceTableNameMap = new Dictionary<string, string> { { "Cultivator", "_CultivatorPieceTable" }, { "Hammer", "_HammerPieceTable" }, { "Hoe", "_HoePieceTable" } }; public static PieceManager Instance { get; private set; } public event EventHandler PieceTableRegister; public event EventHandler PieceRegister; private void Awake() { if ((Object)(object)Instance != (Object)null) { Debug.LogError((object)("Error, two instances of singleton: " + ((object)this).GetType().Name)); } else { Instance = this; } } internal override void Init() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown PieceTableContainer = new GameObject("PieceTables"); PieceTableContainer.transform.parent = JotunnLib.RootObject.transform; Debug.Log((object)"Initialized PieceTableManager"); } internal override void Register() { } internal override void Load() { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Expected O, but got Unknown if (loaded) { return; } pieceTables.Clear(); foreach (Transform item in PieceTableContainer.transform) { Object.Destroy((Object)(object)((Component)item).gameObject); } List<string> list = new List<string>(); Debug.Log((object)"---- Loading piece tables ----"); Object[] array = Resources.FindObjectsOfTypeAll(typeof(PieceTable)); for (int i = 0; i < array.Length; i++) { PieceTable val = (PieceTable)array[i]; try { string name = ((Object)((Component)val).gameObject).name; if (!pieceTables.ContainsKey(name)) { pieceTables.Add(name, val); } if (!list.Contains(name)) { list.Add(name); Debug.Log((object)("Loaded existing piece table: " + name)); } } catch (Exception ex) { Debug.Log((object)("Error loading piece table: " + ex)); } } this.PieceTableRegister?.Invoke(null, EventArgs.Empty); foreach (KeyValuePair<string, PieceTable> pieceTable in pieceTables) { try { PieceTable value = pieceTable.Value; string name2 = ((Object)((Component)value).gameObject).name; if (!list.Contains(name2)) { pieceTables.Add(name2, value); Debug.Log((object)("Registered piece table: " + name2)); } } catch (Exception ex2) { Debug.Log((object)("Error registering piece table: " + ex2)); } } Debug.Log((object)"---- Loading pieces ----"); this.PieceRegister?.Invoke(null, EventArgs.Empty); loaded = true; } public void RegisterPieceTable(string name) { //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) if (pieceTables.ContainsKey(name)) { Debug.Log((object)("Failed to register piece table with existing name: " + name)); return; } GameObject val = new GameObject(name); val.transform.parent = PieceTableContainer.transform; PieceTable value = val.AddComponent<PieceTable>(); pieceTables.Add(name, value); } public void RegisterPiece(string pieceTable, string prefabName) { GameObject prefab = PrefabManager.Instance.GetPrefab(prefabName); if (!Object.op_Implicit((Object)(object)prefab)) { Debug.LogError((object)("Failed to register Piece with invalid prefab: " + prefabName)); } else { RegisterPiece(pieceTable, prefab); } } internal void RegisterPiece(string pieceTable, GameObject prefab) { PieceTable pieceTable2 = getPieceTable(pieceTable); if (!Object.op_Implicit((Object)(object)pieceTable2)) { Debug.LogError((object)("Failed to register piece, Piece table does not exist: " + pieceTable)); return; } if (!Object.op_Implicit((Object)(object)prefab)) { Debug.LogError((object)"Failed to register Piece with null prefab"); return; } if (!Object.op_Implicit((Object)(object)prefab.GetComponent<Piece>())) { Debug.LogError((object)("Failed to register piece, Prefab does not have Piece component: " + ((Object)prefab).name)); return; } if (prefab.layer == 0) { prefab.layer = LayerMask.NameToLayer("piece"); } pieceTable2.m_pieces.Add(prefab); Debug.Log((object)("Registered piece: " + ((Object)prefab).name + " to " + pieceTable)); } private PieceTable getPieceTable(string name) { if (pieceTables.ContainsKey(name)) { return pieceTables[name]; } if (pieceTableNameMap.ContainsKey(name)) { return pieceTables[pieceTableNameMap[name]]; } return null; } } public class PrefabManager : Manager { internal static GameObject PrefabContainer; internal Dictionary<string, GameObject> Prefabs = new Dictionary<string, GameObject>(); private bool loaded; public static PrefabManager Instance { get; private set; } public event EventHandler PrefabRegister; public event EventHandler PrefabsLoaded; private void Awake() { if ((Object)(object)Instance != (Object)null) { Debug.LogError((object)("Error, two instances of singleton: " + ((object)this).GetType().Name)); } else { Instance = this; } } internal override void Init() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Expected O, but got Unknown PrefabContainer = new GameObject("Prefabs"); PrefabContainer.transform.parent = JotunnLib.RootObject.transform; PrefabContainer.SetActive(false); Debug.Log((object)"Initialized PrefabManager"); } internal override void Register() { } internal override void Load() { Debug.Log((object)"---- Registering custom prefabs ----"); if (!loaded) { this.PrefabRegister?.Invoke(null, EventArgs.Empty); } Dictionary<int, GameObject> privateField = ReflectionUtils.GetPrivateField<Dictionary<int, GameObject>>(ZNetScene.instance, "m_namedPrefabs"); foreach (KeyValuePair<string, GameObject> prefab in Prefabs) { try { GameObject value = prefab.Value; ZNetScene.instance.m_prefabs.Add(value); privateField.Add(StringExtensionMethods.GetStableHashCode(((Object)value).name), value); Debug.Log((object)("Registered prefab: " + prefab.Key)); } catch (Exception ex) { Debug.Log((object)("Error registering prefab: " + ex)); } } if (!loaded) { this.PrefabsLoaded?.Invoke(null, EventArgs.Empty); } Debug.Log((object)"All prefabs loaded"); loaded = true; } public void RegisterPrefab(GameObject prefab, string name = null) { if (name == null) { name = ((Object)prefab).name; } if (Object.op_Implicit((Object)(object)GetPrefab(name))) { Debug.LogError((object)("Failed to register prefab that already exists: " + name)); return; } ((Object)prefab).name = name; prefab.transform.parent = PrefabContainer.transform; prefab.SetActive(true); Prefabs.Add(name, prefab); } public void RegisterPrefab(PrefabConfig prefabConfig) { if (prefabConfig.BasePrefabName == null || prefabConfig.BasePrefabName == "") { prefabConfig.Prefab = CreatePrefab(prefabConfig.Name); } else { prefabConfig.Prefab = CreatePrefab(prefabConfig.Name, prefabConfig.BasePrefabName); } if ((Object)(object)prefabConfig.Prefab != (Object)null) { prefabConfig.Register(); } } public GameObject CreatePrefab(string name) { if (string.IsNullOrEmpty(name)) { Debug.LogError((object)("Failed to create prefab with invalid name: " + name)); return null; } if (Object.op_Implicit((Object)(object)GetPrefab(name))) { Debug.LogError((object)("Failed to create prefab, name already exists: " + name)); return null; } GameObject val = GameObject.CreatePrimitive((PrimitiveType)3); ((Object)val).name = name; val.transform.parent = PrefabContainer.transform; val.AddComponent<ZNetView>().m_persistent = true; Prefabs.Add(name, val); return val; } public GameObject CreatePrefab(string name, string baseName) { if (string.IsNullOrEmpty(name)) { Debug.LogError((object)("Failed to create prefab with invalid name: " + name)); return null; } if (Object.op_Implicit((Object)(object)GetPrefab(name))) { Debug.LogError((object)("Failed to create prefab, name already exists: " + name)); return null; } GameObject prefab = GetPrefab(baseName); if (!Object.op_Implicit((Object)(object)prefab)) { Debug.LogError((object)("Failed to create prefab, base does not exist: " + baseName)); return null; } GameObject val = Object.Instantiate<GameObject>(prefab, PrefabContainer.transform); ((Object)val).name = name; val.SetActive(true); Prefabs.Add(name, val); return val; } public GameObject GetPrefab(string name) { if (string.IsNullOrEmpty(name)) { return null; } if (Prefabs.ContainsKey(name)) { return Prefabs[name]; } if (!Object.op_Implicit((Object)(object)ZNetScene.instance)) { Debug.LogError((object)"\t-> ZNetScene instance null for some reason"); return null; } Dictionary<int, GameObject> privateField = ReflectionUtils.GetPrivateField<Dictionary<int, GameObject>>(ZNetScene.instance, "m_namedPrefabs"); int stableHashCode = StringExtensionMethods.GetStableHashCode(name); if (privateField.ContainsKey(stableHashCode)) { return privateField[stableHashCode]; } return null; } } internal class ZoneManager : Manager { internal List<ZoneVegetation> Vegetation = new List<ZoneVegetation>(); public static ZoneManager Instance { get; private set; } public event EventHandler ZoneLoad; private void Awake() { if ((Object)(object)Instance != (Object)null) { Debug.LogError((object)("Error, two instances of singleton: " + ((object)this).GetType().Name)); } else { Instance = this; } } internal override void Register() { Debug.Log((object)"---- Registering custom zone data ----"); this.ZoneLoad?.Invoke(null, EventArgs.Empty); foreach (ZoneVegetation item in Vegetation) { ZoneSystem.instance.m_vegetation.Add(item); Debug.Log((object)("Added vegetation: " + item.m_name)); } } public void RegisterVegetation(ZoneVegetation veg) { Vegetation.Add(veg); } } public class SkillManager : Manager { internal Dictionary<SkillType, SkillDef> Skills = new Dictionary<SkillType, SkillDef>(); private int nextSkillId = 1000; public static SkillManager Instance { get; private set; } private void Awake() { if ((Object)(object)Instance != (Object)null) { Debug.LogError((object)("Error, two instances of singleton: " + ((object)this).GetType().Name)); } else { Instance = this; } } [Obsolete("Use `RegisterSkill(SkillConfig config)` instead. This method could potentially cause users to lose skill save progress", true)] public SkillType RegisterSkill(string name, string description, float increaseStep = 1f, Sprite icon = null) { //IL_0045: 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_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0056: 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) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Expected O, but got Unknown //IL_00a7: Unknown result type (might be due to invalid IL or missing references) LocalizationManager.Instance.RegisterTranslation("skill_" + nextSkillId, name); LocalizationManager.Instance.RegisterTranslation("skill_" + nextSkillId + "_description", description); SkillDef val = new SkillDef { m_skill = (SkillType)nextSkillId, m_description = "$skill_" + nextSkillId + "_description", m_increseStep = increaseStep, m_icon = icon }; Skills.Add((SkillType)nextSkillId, val); nextSkillId++; return val.m_skill; } public SkillType RegisterSkill(SkillConfig skillConfig, bool registerLocalizations = true) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Invalid comparison between Unknown and I4 //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Expected I4, but got Unknown //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0109: 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_0132: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Expected O, but got Unknown //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) if (string.IsNullOrEmpty(skillConfig.Identifier)) { Debug.LogError((object)("Failed to register skill with invalid identifier: " + skillConfig.Identifier)); return (SkillType)0; } SkillType uID; if (Skills.ContainsKey(skillConfig.UID)) { uID = skillConfig.UID; Debug.LogError((object)("Failed to register skill with conflicting UID (m_skill): " + ((object)(SkillType)(ref uID)).ToString())); return (SkillType)0; } if ((int)skillConfig.UID < 1000) { Debug.LogError((object)("Failed to register skill with invalid UID (m_skill), please use a UID >= 1000: " + (int)skillConfig.UID)); return (SkillType)0; } if (registerLocalizations) { LocalizationManager instance = LocalizationManager.Instance; uID = skillConfig.UID; instance.RegisterTranslation("skill_" + ((object)(SkillType)(ref uID)).ToString(), skillConfig.Name); LocalizationManager instance2 = LocalizationManager.Instance; uID = skillConfig.UID; instance2.RegisterTranslation("skill_" + ((object)(SkillType)(ref uID)).ToString() + "_description", skillConfig.Description); } SkillDef val = new SkillDef { m_skill = skillConfig.UID }; uID = skillConfig.UID; val.m_description = "$skill_" + ((object)(SkillType)(ref uID)).ToString() + "_description"; val.m_increseStep = skillConfig.IncreaseStep; val.m_icon = skillConfig.Icon; SkillDef val2 = val; Skills.Add(skillConfig.UID, val2); return val2.m_skill; } public SkillType RegisterSkill(string identifer, string name, string description, float increaseStep = 1f, Sprite icon = null, bool registerLocalizations = true) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) return RegisterSkill(new SkillConfig { Identifier = identifer, Name = name, Description = description, IncreaseStep = increaseStep, Icon = icon }, registerLocalizations); } public SkillDef GetSkill(SkillType skillType) { //IL_0006: 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_005a: 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) if (Skills.ContainsKey(skillType)) { return Skills[skillType]; } if ((Object)(object)Player.m_localPlayer != (Object)null && (Object)(object)((Character)Player.m_localPlayer).GetSkills() != (Object)null) { foreach (SkillDef skill in ((Character)Player.m_localPlayer).GetSkills().m_skills) { if (skill.m_skill == skillType) { return skill; } } } return null; } public SkillDef GetSkill(string identifier) { if (string.IsNullOrEmpty(identifier)) { return null; } return GetSkill((SkillType)StringExtensionMethods.GetStableHashCode(identifier)); } } } namespace JotunnLib.Events { public class PlayerEventArgs : EventArgs { public Player Player { get; set; } } public class PlayerPlacedPieceEventArgs : PlayerEventArgs { public Piece Piece { get; set; } public Vector3 Position { get; set; } public Quaternion Rotation { get; set; } public bool Success { get; set; } } } namespace JotunnLib.Entities { public class ButtonConfig { public string Name { get; set; } public string Axis { get; set; } public KeyCode Key { get; set; } public bool Inverted { get; set; } public float RepeatDelay { get; set; } public float RepeatInterval { get; set; } } internal class LocalizationConfig { public Dictionary<string, string> Translations = new Dictionary<string, string>(); public string Language { get; set; } = "English"; } public class PieceConfig { public string Name { get; set; } public string Description { get; set; } = ""; public PieceRequirementConfig[] Requirements { get; set; } = new PieceRequirementConfig[0]; public Requirement[] GetRequirements() { Requirement[] array = (Requirement[])(object)new Requirement[Requirements.Length]; for (int i = 0; i < array.Length; i++) { array[i] = Requirements[i].GetPieceRequirement(); } return array; } } public class PieceRequirementConfig { public string Item { get; set; } public int Amount { get; set; } public int AmountPerLevel { get; set; } public bool Recover { get; set; } public Requirement GetPieceRequirement() { //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_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown return new Requirement { m_resItem = PrefabManager.Instance.GetPrefab(Item).GetComponent<ItemDrop>(), m_amount = Amount, m_amountPerLevel = AmountPerLevel, m_recover = Recover }; } } public abstract class PrefabConfig { public string Name { get; private set; } public string BasePrefabName { get; private set; } public GameObject Prefab { get; set; } public PrefabConfig(string name) { Name = name; } public PrefabConfig(string name, string baseName) { Name = name; BasePrefabName = baseName; } public abstract void Register(); public Piece AddPiece(PieceConfig pieceConfig) { Piece obj = Prefab.AddComponent<Piece>(); obj.m_name = pieceConfig.Name; obj.m_description = pieceConfig.Description; obj.m_resources = pieceConfig.GetRequirements(); return obj; } } public class RecipeConfig { public string Name { get; set; } public string Item { get; set; } public int Amount { get; set; } = 1; public bool Enabled { get; set; } = true; public string CraftingStation { get; set; } public string RepairStation { get; set; } public int MinStationLevel { get; set; } public PieceRequirementConfig[] Requirements { get; set; } = new PieceRequirementConfig[0]; public Recipe GetRecipe() { Requirement[] array = (Requirement[])(object)new Requirement[Requirements.Length]; for (int i = 0; i < array.Length; i++) { array[i] = Requirements[i].GetPieceRequirement(); } Recipe val = ScriptableObject.CreateInstance<Recipe>(); GameObject prefab = PrefabManager.Instance.GetPrefab(Item); if ((Object)(object)prefab == (Object)null) { Debug.LogError((object)("Error, recipe contained null item prefab for item: " + Item)); return null; } if (string.IsNullOrEmpty(Name)) { Name = "Recipe_" + Item; } ((Object)val).name = Name; val.m_item = prefab.GetComponent<ItemDrop>(); val.m_amount = Amount; val.m_enabled = Enabled; if (CraftingStation != null) { GameObject prefab2 = PrefabManager.Instance.GetPrefab(CraftingStation); CraftingStation component = prefab2.GetComponent<CraftingStation>(); if ((Object)(object)prefab2 == (Object)null || (Object)(object)component == (Object)null) { Debug.LogError((object)("Crafting station is not valid: " + CraftingStation)); return null; } val.m_craftingStation = component; } if (RepairStation != null) { GameObject prefab3 = PrefabManager.Instance.GetPrefab(RepairStation); CraftingStation component2 = prefab3.GetComponent<CraftingStation>(); if ((Object)(object)prefab3 == (Object)null || (Object)(object)component2 == (Object)null) { Debug.LogError((object)("Repair station is not valid: " + RepairStation)); return null; } val.m_craftingStation = component2; } val.m_minStationLevel = MinStationLevel; val.m_resources = array; return val; } } public class SkillConfig { private string _identifier; public string Identifier { get { return _identifier; } set { if (string.IsNullOrEmpty(value)) { Debug.LogError((object)("Error, SkillConfig cannot have invalid Identifier: " + value)); return; } _identifier = value; UID = (SkillType)StringExtensionMethods.GetStableHashCode(value); } } public SkillType UID { get; private set; } public string Name { get; set; } public string Description { get; set; } public Sprite Icon { get; set; } public float IncreaseStep { get; set; } } public abstract class ConsoleCommand { public abstract string Name { get; } public abstract string Help { get; } public abstract void Run(string[] args); } }