]> git.deb.at Git - rhonda/theotherroles.git/commitdiff
Update to v4.1.3
authorMallöris <|||||@||.||>
Wed, 18 May 2022 21:14:56 +0000 (23:14 +0200)
committerMallöris <|||||@||.||>
Wed, 18 May 2022 21:14:56 +0000 (23:14 +0200)
12 files changed:
README.md
TheOtherRoles/Buttons.cs
TheOtherRoles/CustomOptionHolder.cs
TheOtherRoles/Helpers.cs
TheOtherRoles/Main.cs
TheOtherRoles/Objects/Footprint.cs
TheOtherRoles/Patches/PlayerControlPatch.cs
TheOtherRoles/Patches/UpdatePatch.cs
TheOtherRoles/Resources/ThirdParty/Submerged/Submerged.dll
TheOtherRoles/TheOtherRoles.cs
TheOtherRoles/TheOtherRoles.csproj
TheOtherRoles/packages.lock.json [new file with mode: 0644]

index 188ba0b66ec24b4e4f506f98723c196f5b2f7e46..5faba6afb84cc0f4a21415d8e7ea8680ff187eb1 100644 (file)
--- a/README.md
+++ b/README.md
@@ -40,6 +40,7 @@ The [Role Assignment](#role-assignment) sections explains how the roles are bein
 # Releases
 | Among Us - Version| Mod Version | Link |
 |----------|-------------|-----------------|
+| 2022.3.29| v4.1.3| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v4.1.3/TheOtherRoles.zip)
 | 2022.3.29| v4.1.2| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v4.1.2/TheOtherRoles.zip)
 | 2022.3.29| v4.1.1| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v4.1.1/TheOtherRoles.zip)
 | 2022.3.29| v4.1.0| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v4.1.0/TheOtherRoles.zip)
@@ -104,6 +105,11 @@ The [Role Assignment](#role-assignment) sections explains how the roles are bein
 <details>
   <summary>Click to show the Changelog</summary>
 
+**Version 4.1.3**
+- Fixed morphling's being morphed during meetings
+- Fixed hide player names hiding the player's name during meetings
+- Added an option to the mayor: "Number Of Remote Meetings", so that the amount of mobile meetings is limited.
+
 **Version 4.1.2**
 - Made some general performance fixes. Special thanks to [probablyadnf](https://github.com/simonkellly)
 - Added an option to the ninja to get invisible after kill for x-seconds
index f059789876f9a572a3b8b74e4ee213898a5171b6..30dbfed75eb17674a47ff7fcd942c49f30138929 100644 (file)
@@ -1491,23 +1491,25 @@ namespace TheOtherRoles
             mayorMeetingButton = new CustomButton(
                () => {
                    PlayerControl.LocalPlayer.NetTransform.Halt(); // Stop current movement 
-                   Helpers.handleVampireBiteOnBodyReport(); // Manually call Vampire handling, since the CmdReportDeadBody Prefix won't be called
+                   Mayor.remoteMeetingsLeft--;
+                      Helpers.handleVampireBiteOnBodyReport(); // Manually call Vampire handling, since the CmdReportDeadBody Prefix won't be called
                    RPCProcedure.uncheckedCmdReportDeadBody(PlayerControl.LocalPlayer.PlayerId, Byte.MinValue);
 
                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.UncheckedCmdReportDeadBody, Hazel.SendOption.Reliable, -1);
                    writer.Write(PlayerControl.LocalPlayer.PlayerId);
                    writer.Write(Byte.MaxValue);
                    AmongUsClient.Instance.FinishRpcImmediately(writer);
+                   mayorMeetingButton.Timer = 1f;
                },
                () => { return Mayor.mayor != null && Mayor.mayor == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead ;},
                () => {
-                   mayorMeetingButton.actionButton.OverrideText("Emergency");
+                   mayorMeetingButton.actionButton.OverrideText("Emergency ("+ Mayor.remoteMeetingsLeft + ")");
                    bool sabotageActive = false;
                    foreach (PlayerTask task in PlayerControl.LocalPlayer.myTasks.GetFastEnumerator())
                        if (task.TaskType == TaskTypes.FixLights || task.TaskType == TaskTypes.RestoreOxy || task.TaskType == TaskTypes.ResetReactor || task.TaskType == TaskTypes.ResetSeismic || task.TaskType == TaskTypes.FixComms || task.TaskType == TaskTypes.StopCharles
                            || SubmergedCompatibility.IsSubmerged && task.TaskType == SubmergedCompatibility.RetrieveOxygenMask)
                            sabotageActive = true;
-                   return !sabotageActive && PlayerControl.LocalPlayer.CanMove;
+                   return !sabotageActive && PlayerControl.LocalPlayer.CanMove && (Mayor.remoteMeetingsLeft > 0);
                },
                () => { mayorMeetingButton.Timer = mayorMeetingButton.MaxTimer; },
                Mayor.getMeetingSprite(),
index fcfbfbeb9817b750c9c1ec902c7bf95512dc79d4..2f8d90b4c0cfd814d58c004573fcac1649c0fc7f 100644 (file)
@@ -98,6 +98,7 @@ namespace TheOtherRoles {
         public static CustomOption mayorCanSeeVoteColors;
         public static CustomOption mayorTasksNeededToSeeVoteColors;
         public static CustomOption mayorMeetingButton;
+        public static CustomOption mayorMaxRemoteMeetings;
 
         public static CustomOption portalmakerSpawnRate;
         public static CustomOption portalmakerCooldown;
@@ -406,6 +407,7 @@ namespace TheOtherRoles {
             mayorCanSeeVoteColors = CustomOption.Create(81, Types.Crewmate, "Mayor Can See Vote Colors", false, mayorSpawnRate);
             mayorTasksNeededToSeeVoteColors = CustomOption.Create(82, Types.Crewmate, "Completed Tasks Needed To See Vote Colors", 5f, 0f, 20f, 1f, mayorCanSeeVoteColors);
             mayorMeetingButton = CustomOption.Create(83, Types.Crewmate, "Mobile Emergency Button", true, mayorSpawnRate);
+            mayorMaxRemoteMeetings = CustomOption.Create(84, Types.Crewmate, "Number Of Remote Meetings", 1f, 1f, 5f, 1f, mayorMeetingButton);
 
             engineerSpawnRate = CustomOption.Create(90, Types.Crewmate, cs(Engineer.color, "Engineer"), rates, null, true);
             engineerNumberOfFixes = CustomOption.Create(91, Types.Crewmate, "Number Of Sabotage Fixes", 1f, 1f, 3f, 1f, engineerSpawnRate);
index 853afb22c11dcfabca28da6f8c879677cec8abe6..aa84afbab0061253c4143d9b2d7bcc61105a6d33 100644 (file)
@@ -17,12 +17,19 @@ namespace TheOtherRoles {
         SuppressKill,
         BlankKill
     }
-    public static class Helpers {
+    public static class Helpers
+    {
+
+        public static Dictionary<string, Sprite> CachedSprites = new();
 
         public static Sprite loadSpriteFromResources(string path, float pixelsPerUnit) {
-            try {
+            try
+            {
+                if (CachedSprites.TryGetValue(path + pixelsPerUnit, out var sprite)) return sprite;
                 Texture2D texture = loadTextureFromResources(path);
-                return Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f), pixelsPerUnit);
+                sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f), pixelsPerUnit);
+                sprite.hideFlags |= HideFlags.HideAndDontSave | HideFlags.DontSaveInEditor;
+                return CachedSprites[path + pixelsPerUnit] = sprite;
             } catch {
                 System.Console.WriteLine("Error loading sprite from path: " + path);
             }
index 54a5ca3436d28a829e3b38d285199f610246afc6..04338828933436b17c323959cf664bd608b72b9a 100644 (file)
@@ -22,7 +22,7 @@ namespace TheOtherRoles
     public class TheOtherRolesPlugin : BasePlugin
     {
         public const string Id = "me.eisbison.theotherroles";
-        public const string VersionString = "4.1.2";
+        public const string VersionString = "4.1.3";
 
         public static Version Version = Version.Parse(VersionString);
         internal static BepInEx.Logging.ManualLogSource Logger;
index d5aa86c06b3ac58e6d042d5ecb2af9ca1ade3823..c3aa892c3e8e7fac39fef16b187faf85a8f9ff6f 100644 (file)
 using System;
+using System.Collections.Concurrent;
 using System.Collections.Generic;
 using TheOtherRoles.Utilities;
 using UnityEngine;
 
-namespace TheOtherRoles.Objects {
-    class Footprint {
-        private static List<Footprint> footprints = new List<Footprint>();
-        private static Sprite sprite;
-        private Color color;
-        private GameObject footprint;
-        private SpriteRenderer spriteRenderer;
-        private PlayerControl owner;
-        private bool anonymousFootprints;
+namespace TheOtherRoles.Objects 
+{
+    public class FootprintHolder : MonoBehaviour
+    {
+        static FootprintHolder() => ClassInjector.RegisterTypeInIl2Cpp<FootprintHolder>();
 
-        public static Sprite getFootprintSprite() {
-            if (sprite) return sprite;
-            sprite = Helpers.loadSpriteFromResources("TheOtherRoles.Resources.Footprint.png", 600f);
-            return sprite;
-        }
-
-        public Footprint(float footprintDuration, bool anonymousFootprints, PlayerControl player) {
-            this.owner = player;
-            this.anonymousFootprints = anonymousFootprints;
-            if (anonymousFootprints)
-                this.color = Palette.PlayerColors[6];
-            else
-                this.color = Palette.PlayerColors[(int) player.Data.DefaultOutfit.ColorId];
+        public FootprintHolder(IntPtr ptr) : base(ptr) { }
 
-            footprint = new GameObject("Footprint");
-            footprint.AddSubmergedComponent(SubmergedCompatibility.Classes.ElevatorMover);
-            Vector3 position = new Vector3(player.transform.position.x, player.transform.position.y, player.transform.position.y / 1000 + 0.001f);
-            footprint.transform.position = position;
-            footprint.transform.localPosition = position;
-            footprint.transform.SetParent(player.transform.parent);
+        private static FootprintHolder _instance;
+        public static FootprintHolder Instance
+        {
+            get => _instance ? _instance : _instance = new GameObject("FootprintHolder").AddComponent<FootprintHolder>();
+            set => _instance = value;
 
-            footprint.transform.Rotate(0.0f, 0.0f, UnityEngine.Random.Range(0.0f, 360.0f));
+        }
+        
+        private static Sprite _footprintSprite;
+        private static Sprite FootprintSprite => _footprintSprite ??= Helpers.loadSpriteFromResources("TheOtherRoles.Resources.Footprint.png", 600f);
 
+        private static bool AnonymousFootprints => TheOtherRoles.Detective.anonymousFootprints;
+        private static float FootprintDuration => TheOtherRoles.Detective.footprintDuration;
+        
+        private class Footprint
+        {
+            public GameObject GameObject;
+            public Transform Transform;
+            public SpriteRenderer Renderer;
+            public PlayerControl Owner;
+            public GameData.PlayerInfo Data;
+            public float Lifetime;
 
-            spriteRenderer = footprint.AddComponent<SpriteRenderer>();
-            spriteRenderer.sprite = getFootprintSprite();
-            spriteRenderer.color = color;
+            public Footprint()
+            {
+                GameObject = new("Footprint") { layer = 8 };
+                Transform = GameObject.transform;
+                Renderer = GameObject.AddComponent<SpriteRenderer>();
+                Renderer.sprite = FootprintSprite;
+                Renderer.color = Color.clear;
+                GameObject.AddSubmergedComponent(SubmergedCompatibility.Classes.ElevatorMover);
+            }
+        }
 
-            footprint.SetActive(true);
-            footprints.Add(this);
+       
 
-            FastDestroyableSingleton<HudManager>.Instance.StartCoroutine(Effects.Lerp(footprintDuration, new Action<float>((p) => {
-            Color c = color;
-            if (!anonymousFootprints && owner != null) {
-                if (owner == Morphling.morphling && Morphling.morphTimer > 0 && Morphling.morphTarget?.Data != null)
-                    c = Palette.ShadowColors[Morphling.morphTarget.Data.DefaultOutfit.ColorId];
-                else if (Camouflager.camouflageTimer > 0)
-                    c = Palette.PlayerColors[6];
+        private readonly ConcurrentBag<Footprint> _pool = new();
+        private readonly List<Footprint> _activeFootprints = new();
+        private readonly List<Footprint> _toRemove = new();
+        
+        [HideFromIl2Cpp]
+        public void MakeFootprint(PlayerControl player)
+        {
+            if (!_pool.TryTake(out var print))
+            {
+                print = new();
             }
 
-            if (spriteRenderer) spriteRenderer.color = new Color(c.r, c.g, c.b, Mathf.Clamp01(1 - p));
+            print.Lifetime = FootprintDuration;
+            
+            var pos = player.transform.position;
+            pos.z = pos.y / 1000f + 0.001f;
+            print.Transform.SetPositionAndRotation(pos, Quaternion.EulerRotation(0, 0, UnityEngine.Random.Range(0.0f, 360.0f)));
+            print.GameObject.SetActive(true);
+            print.Owner = player;
+            print.Data = player.Data;
+            _activeFootprints.Add(print);
+        }
 
-            if (p == 1f && footprint != null) {
-                UnityEngine.Object.Destroy(footprint);
-                footprints.Remove(this);
+        private void Update()
+        {
+            var dt = Time.deltaTime;
+            _toRemove.Clear();
+            foreach (var activeFootprint in _activeFootprints)
+            {
+                var p = activeFootprint.Lifetime / FootprintDuration;
+                
+                if (activeFootprint.Lifetime <= 0)
+                {
+                    _toRemove.Add(activeFootprint);
+                    continue;
+                }
+                
+                Color color;
+                if (AnonymousFootprints || Camouflager.camouflageTimer > 0)
+                {
+                    color = Palette.PlayerColors[6];
+                }
+                else if (activeFootprint.Owner == Morphling.morphling && Morphling.morphTimer > 0 && Morphling.morphTarget && Morphling.morphTarget.Data != null)
+                {
+                    color = Palette.PlayerColors[Morphling.morphTarget.Data.DefaultOutfit.ColorId];
+                }
+                else
+                {
+                    color = Palette.PlayerColors[activeFootprint.Data.DefaultOutfit.ColorId];
+                }
+
+                color.a = Math.Clamp(p, 0f, 1f);
+                activeFootprint.Renderer.color = color;
+
+                activeFootprint.Lifetime -= dt;
+            }
+            
+            foreach (var footprint in _toRemove)
+            {
+                footprint.GameObject.SetActive(false);
+                _activeFootprints.Remove(footprint);
+                _pool.Add(footprint);
             }
-            })));
+        }
+
+        private void OnDestroy()
+        {
+            Instance = null;
         }
     }
 }
index 9722ea426e984bcbbe23b4e25da1fed9928b5a00..169c3f3c235457750935d6f3130ca640920da33c 100644 (file)
@@ -184,8 +184,9 @@ namespace TheOtherRoles.Patches {
             if (Detective.timer <= 0f) {
                 Detective.timer = Detective.footprintIntervall;
                 foreach (PlayerControl player in PlayerControl.AllPlayerControls.GetFastEnumerator()) {
-                    if (player != null && player != PlayerControl.LocalPlayer && !player.Data.IsDead && !player.inVent) {
-                        new Footprint(Detective.footprintDuration, Detective.anonymousFootprints, player);
+                    if (player != null && player != PlayerControl.LocalPlayer && !player.Data.IsDead && !player.inVent) 
+                    {
+                        FootprintHolder.Instance.MakeFootprint(player);
                     }
                 }
             }
index 2d591d6b8f98fa9ffb78cb8686744940ed427049..ecc9bb541366311d252e25aeb7cca2e7cabdafe8 100644 (file)
@@ -23,20 +23,19 @@ namespace TheOtherRoles.Patches {
             foreach (var data in GameData.Instance.AllPlayers.GetFastEnumerator())
             {
                 var player = data.Object;
-                string text;
+                string text = data.PlayerName;
                 Color color;
                 if (player)
                 {
-                    String playerName = data.PlayerName;
+                    var playerName = text;
                     if (morphTimerNotUp && morphTargetNotNull && Morphling.morphling == player) playerName = Morphling.morphTarget.Data.PlayerName;
                     var nameText = player.nameText;
                 
-                    nameText.text = text = Helpers.hidePlayerName(localPlayer, player) ? "" : playerName;
+                    nameText.text = Helpers.hidePlayerName(localPlayer, player) ? "" : playerName;
                     nameText.color = color = amImpostor && data.Role.IsImpostor ? Palette.ImpostorRed : Color.white;
                 }
                 else
                 {
-                    text = data.PlayerName;
                     color = Color.white;
                 }
                 
index 483e9627815115c84a38d80b0ad09b525f9ee8ac..2018ff56d1896577a82f90a53c70f5c535fe77d7 100644 (file)
Binary files a/TheOtherRoles/Resources/ThirdParty/Submerged/Submerged.dll and b/TheOtherRoles/Resources/ThirdParty/Submerged/Submerged.dll differ
index 0e5aaa321daec4337c4dabc463bcfebbc418453d..139eb8c700d1560a7b638c75cb3b77947c483222 100644 (file)
@@ -129,6 +129,8 @@ namespace TheOtherRoles
             public static Color color = new Color32(32, 77, 66, byte.MaxValue);
             public static Minigame emergency = null;
             public static Sprite emergencySprite = null;
+            public static int remoteMeetingsLeft = 1;        
+
 
             public static bool canSeeVoteColors = false;
             public static int tasksNeededToSeeVoteColors;
@@ -145,7 +147,7 @@ namespace TheOtherRoles
                 mayor = null;
                 emergency = null;
                 emergencySprite = null;
-
+                       remoteMeetingsLeft = Mathf.RoundToInt(CustomOptionHolder.mayorMaxRemoteMeetings.getFloat()); 
                 canSeeVoteColors = CustomOptionHolder.mayorCanSeeVoteColors.getBool();
                 tasksNeededToSeeVoteColors = (int)CustomOptionHolder.mayorTasksNeededToSeeVoteColors.getFloat();
                 meetingButton = CustomOptionHolder.mayorMeetingButton.getBool();
index 3ce2e4f7233aa4f0df94da16c9397dbbf695a586..35c59289d028df2335d24a33601d9cd8656b32df 100644 (file)
@@ -1,25 +1,26 @@
 <Project Sdk="Microsoft.NET.Sdk">
-    <PropertyGroup>
-        <TargetFramework>netstandard2.1</TargetFramework>
-        <Version>4.1.2</Version>
-        <Description>TheOtherRoles</Description>
-        <Authors>Eisbison</Authors>
+       <PropertyGroup>
+               <TargetFramework>netstandard2.1</TargetFramework>
+               <Version>4.1.3</Version>
+               <Description>TheOtherRoles</Description>
+               <Authors>Eisbison</Authors>
                <LangVersion>latest</LangVersion>
-        <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    </PropertyGroup>
+               <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+               <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
+       </PropertyGroup>
 
-    <ItemGroup>
-        <EmbeddedResource Include="Resources\**" />
-    </ItemGroup>
+       <ItemGroup>
+               <EmbeddedResource Include="Resources\**" />
+       </ItemGroup>
 
-    <ItemGroup>
-        <PackageReference Include="AmongUs.GameLibs.Steam" Version="2022.3.29" />
-        <PackageReference Include="BepInEx.IL2CPP" Version="6.0.0-be.559" />
-        <PackageReference Include="BepInEx.IL2CPP.MSBuild" Version="1.1.1" />
-    </ItemGroup>
+       <ItemGroup>
+               <PackageReference Include="AmongUs.GameLibs.Steam" Version="2022.3.29" />
+               <PackageReference Include="BepInEx.IL2CPP" Version="6.0.0-be.559" />
+               <PackageReference Include="BepInEx.IL2CPP.MSBuild" Version="1.1.1" />
+       </ItemGroup>
 
-    <Target Name="CopyCustomContent" AfterTargets="AfterBuild">
-        <Message Text="Second occurrence" />
-        <Copy SourceFiles="$(ProjectDir)\bin\$(Configuration)\netstandard2.1\TheOtherRoles.dll" DestinationFolder="$(AmongUsLatest)/BepInEx/plugins/" />
-    </Target>
+       <Target Name="CopyCustomContent" AfterTargets="AfterBuild" Condition="Exists('$(AmongUsLatest)/BepInEx/plugins/')">
+               <Message Text="Second occurrence" />
+               <Copy SourceFiles="$(ProjectDir)\bin\$(Configuration)\netstandard2.1\TheOtherRoles.dll" DestinationFolder="$(AmongUsLatest)/BepInEx/plugins/" />
+       </Target>
 </Project>
diff --git a/TheOtherRoles/packages.lock.json b/TheOtherRoles/packages.lock.json
new file mode 100644 (file)
index 0000000..a92cbd2
--- /dev/null
@@ -0,0 +1,474 @@
+{
+  "version": 1,
+  "dependencies": {
+    ".NETStandard,Version=v2.1": {
+      "AmongUs.GameLibs.Steam": {
+        "type": "Direct",
+        "requested": "[2022.3.29, )",
+        "resolved": "2022.3.29",
+        "contentHash": "EStKwHGq8MMvSRxIHjlh31VJmCZrGHZ/xoDDN33L5gh7XJLWBFufo6+5ueezndSRpanoCkqLwuTkG73KCS2J1A=="
+      },
+      "BepInEx.IL2CPP": {
+        "type": "Direct",
+        "requested": "[6.0.0-be.559, )",
+        "resolved": "6.0.0-be.559",
+        "contentHash": "s0PSNq7Gr1/OWh+Yw2SGu8QYMow5lp6iP5hozxReMaJIGctnb/lUPj1pjeVP33pWWDomXwsWN76dCAW2qIY0tg==",
+        "dependencies": {
+          "BepInEx.Core": "6.0.0-be.559",
+          "BepInEx.Il2Cpp.TlsAdapter": "1.0.1",
+          "HarmonyX": "2.10.0",
+          "Iced": "1.17.0",
+          "Il2CppAssemblyUnhollower.BaseLib": "0.4.33",
+          "Il2CppAssemblyUnhollower.BaseLib.Legacy": "0.4.33",
+          "Il2CppAssemblyUnhollower.Lib": "0.4.33",
+          "Il2CppDumper": "6.6.4",
+          "MonoMod.RuntimeDetour": "22.3.23.4",
+          "Samboy063.Cpp2IL.Core": "2022.0.4"
+        }
+      },
+      "BepInEx.IL2CPP.MSBuild": {
+        "type": "Direct",
+        "requested": "[1.1.1, )",
+        "resolved": "1.1.1",
+        "contentHash": "uUSo4TuamyEIVg+ICNeJMSSW/arKWHGpfBFINc4fdF5kppfHFrsDURKzNPmDvxivtLsiuGthck9J/5uPXgIcTg=="
+      },
+      "BepInEx.Core": {
+        "type": "Transitive",
+        "resolved": "6.0.0-be.559",
+        "contentHash": "pjqwrVxD3JKz/Qz4gn8phzi0mEJucb1EVVcF/2A4oQ1+ytRnBUcOYldg1GCkzLoVYwbuhE0J2bXfUOGawRUwog==",
+        "dependencies": {
+          "HarmonyX": "2.10.0",
+          "MonoMod.Utils": "22.3.23.4",
+          "SemanticVersioning": "2.0.2"
+        }
+      },
+      "BepInEx.Il2Cpp.TlsAdapter": {
+        "type": "Transitive",
+        "resolved": "1.0.1",
+        "contentHash": "kTfX6312X0Fvwks+t7Ul3YO2jMSbqNS2Jx/85Cgl6lbAjEJnKzsmx7Krmd66dbnx0eY/QMjaV2r6LyWmQARtdA==",
+        "dependencies": {
+          "HarmonyX": "2.3.1"
+        }
+      },
+      "HarmonyX": {
+        "type": "Transitive",
+        "resolved": "2.10.0",
+        "contentHash": "4ayiy/dlCiW86K2N7Jvbf+VpI5wvP7dncv/6oRmfwRi32UCmCRzCGzsxdMfzJZkp6/26oBW+DrD8vi4UejzVAg==",
+        "dependencies": {
+          "MonoMod.RuntimeDetour": "22.3.23.4",
+          "System.Reflection.Emit": "4.7.0"
+        }
+      },
+      "Iced": {
+        "type": "Transitive",
+        "resolved": "1.17.0",
+        "contentHash": "8x+HCVTl/HHTGpscH3vMBhV8sknN/muZFw9s3TsI8SA6+c43cOTCi2+jE4KsU8pNLbJ++iF2ZFcpcXHXtDglnw=="
+      },
+      "Il2CppAssemblyUnhollower.BaseLib": {
+        "type": "Transitive",
+        "resolved": "0.4.33",
+        "contentHash": "QiltA4HJt6DvrFCcS4vQnirPV4WmQKZNG8M4lCn51k7yyx5LW0xix8HqE4Xt1IVo1Ei+60t5aLRga4W2ktve5w==",
+        "dependencies": {
+          "Iced": "1.15.0"
+        }
+      },
+      "Il2CppAssemblyUnhollower.BaseLib.Legacy": {
+        "type": "Transitive",
+        "resolved": "0.4.33",
+        "contentHash": "4o2Z44uqmI/6VBNpyhKJ1JksuqtrOgNrNkbv00ljITs3KedrcqZqGXCP+RaJF2ej4Fkr67fGsATshZ9B8f7izQ==",
+        "dependencies": {
+          "Il2CppAssemblyUnhollower.BaseLib": "0.4.33"
+        }
+      },
+      "Il2CppAssemblyUnhollower.Lib": {
+        "type": "Transitive",
+        "resolved": "0.4.33",
+        "contentHash": "1l7tqjAdzRyq+FP6h//Lojlr0PviEc5adfvsit9BZBQtmBUZoifAccAfXAiU0zLv5pbvHiAguspgmeRdUT1yUw==",
+        "dependencies": {
+          "Il2CppAssemblyUnhollower.BaseLib": "0.4.33",
+          "Il2CppAssemblyUnhollower.BaseLib.Legacy": "0.4.33",
+          "Mono.Cecil": "0.11.3"
+        }
+      },
+      "Il2CppDumper": {
+        "type": "Transitive",
+        "resolved": "6.6.4",
+        "contentHash": "aqjmlyigdZ5FS9ElMNlaCExlgSmAiho4BeIcVwkmzHGnomBzopjOCxqIX9vc/575TQ87TKoaGW2KP+3b5xI15A==",
+        "dependencies": {
+          "Mono.Cecil": "0.11.3"
+        }
+      },
+      "IndexRange": {
+        "type": "Transitive",
+        "resolved": "1.0.0",
+        "contentHash": "6TgS1JLSUkpmPLfXBPaAgB39ZUix8E4soXWk2XSDcscVe84i1JKzIAtA7jHbRHSkOOrcr6YA0MpLCeq98y9mYQ=="
+      },
+      "js6pak.Gee.External.Capstone": {
+        "type": "Transitive",
+        "resolved": "2.1.0",
+        "contentHash": "YYpq7NM50bSSVUDjXyV/eiITk6syXqItPjKBOb3jEWS6RFsk0DNhpWMPW6b3hKDmArARuWDU6S2pVu1IeVrvIA=="
+      },
+      "Microsoft.NETCore.Platforms": {
+        "type": "Transitive",
+        "resolved": "1.1.0",
+        "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A=="
+      },
+      "Microsoft.NETCore.Targets": {
+        "type": "Transitive",
+        "resolved": "1.1.0",
+        "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg=="
+      },
+      "Mono.Cecil": {
+        "type": "Transitive",
+        "resolved": "0.11.4",
+        "contentHash": "IC1h5g0NeJGHIUgzM1P82ld57knhP0IcQfrYITDPXlNpMYGUrsG5TxuaWTjaeqDNQMBDNZkB8L0rBnwsY6JHuQ=="
+      },
+      "MonoMod.RuntimeDetour": {
+        "type": "Transitive",
+        "resolved": "22.3.23.4",
+        "contentHash": "2nwwFfwYDSgUzhi+1MutTg1gyUgXoMS4+E04vHOFp84Vxs0oBkkn4mGAfhkr272y0j3vqIBzo2aT9pXRlCd/ZA==",
+        "dependencies": {
+          "Mono.Cecil": "0.11.4",
+          "MonoMod.Utils": "22.3.23.4",
+          "System.Collections.NonGeneric": "4.3.0",
+          "System.ComponentModel.TypeConverter": "4.3.0",
+          "System.IO.FileSystem.Primitives": "4.3.0",
+          "System.Reflection.Emit.ILGeneration": "4.7.0",
+          "System.Reflection.Emit.Lightweight": "4.7.0",
+          "System.Reflection.TypeExtensions": "4.7.0"
+        }
+      },
+      "MonoMod.Utils": {
+        "type": "Transitive",
+        "resolved": "22.3.23.4",
+        "contentHash": "xso1rHFfcsPy3X1kj2uDk115z9tLTMxPEnba/zdNB6WazvrLRWGPuV9d4hHwr1iVz5quTFlZCbLBlE5fS2TqLA==",
+        "dependencies": {
+          "Mono.Cecil": "0.11.4",
+          "System.Collections.NonGeneric": "4.3.0",
+          "System.ComponentModel.TypeConverter": "4.3.0",
+          "System.IO.FileSystem.Primitives": "4.3.0",
+          "System.Reflection.Emit.ILGeneration": "4.7.0",
+          "System.Reflection.Emit.Lightweight": "4.7.0",
+          "System.Reflection.TypeExtensions": "4.7.0"
+        }
+      },
+      "Samboy063.Cpp2IL.Core": {
+        "type": "Transitive",
+        "resolved": "2022.0.4",
+        "contentHash": "6fLZDkAmnClogPwDWCkB5NYG1uqUShOkdNap4ud3m5cLI57BiBRzBoUBEKV+9SNtSirUrEAOUP+0kIfduTLYWQ==",
+        "dependencies": {
+          "HarmonyX": "2.5.5",
+          "Iced": "1.11.1",
+          "IndexRange": "1.0.0",
+          "Mono.Cecil": "0.11.4",
+          "Samboy063.LibCpp2IL": "2022.0.4",
+          "System.Runtime.InteropServices": "4.3.0",
+          "System.ValueTuple": "4.5.0",
+          "js6pak.Gee.External.Capstone": "2.1.0"
+        }
+      },
+      "Samboy063.LibCpp2IL": {
+        "type": "Transitive",
+        "resolved": "2022.0.4",
+        "contentHash": "KxUvnPgGSIgmLqVbK2fMCUmL+RJK0Ccvhkj2boVMtkE9feEFxtriHX7YkqZGQtXs55CpyETm8nZfYhj1m2bYkQ==",
+        "dependencies": {
+          "IndexRange": "1.0.0",
+          "Samboy063.WasmDisassembler": "2022.0.2"
+        }
+      },
+      "Samboy063.WasmDisassembler": {
+        "type": "Transitive",
+        "resolved": "2022.0.2",
+        "contentHash": "2uu+xBb7M3HKfBx9tAY6jiDieAf0hRnQjSmGX+7IdE6i24dYsx6TYgtrLvRx5lOuF2M8DijZ5H8yQ1pcuCs2SA=="
+      },
+      "SemanticVersioning": {
+        "type": "Transitive",
+        "resolved": "2.0.2",
+        "contentHash": "4EQgYdNZ92SyaO7YFk6olVnebF5V+jrHyMUjvPq89tLeMo8NSfgDF+6Zwq/lgh9j/0yfQp9Lkm0ZA0rUATCZFA=="
+      },
+      "System.Collections": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==",
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "1.1.0",
+          "Microsoft.NETCore.Targets": "1.1.0",
+          "System.Runtime": "4.3.0"
+        }
+      },
+      "System.Collections.NonGeneric": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==",
+        "dependencies": {
+          "System.Diagnostics.Debug": "4.3.0",
+          "System.Globalization": "4.3.0",
+          "System.Resources.ResourceManager": "4.3.0",
+          "System.Runtime": "4.3.0",
+          "System.Runtime.Extensions": "4.3.0",
+          "System.Threading": "4.3.0"
+        }
+      },
+      "System.Collections.Specialized": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==",
+        "dependencies": {
+          "System.Collections.NonGeneric": "4.3.0",
+          "System.Globalization": "4.3.0",
+          "System.Globalization.Extensions": "4.3.0",
+          "System.Resources.ResourceManager": "4.3.0",
+          "System.Runtime": "4.3.0",
+          "System.Runtime.Extensions": "4.3.0",
+          "System.Threading": "4.3.0"
+        }
+      },
+      "System.ComponentModel": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==",
+        "dependencies": {
+          "System.Runtime": "4.3.0"
+        }
+      },
+      "System.ComponentModel.Primitives": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "j8GUkCpM8V4d4vhLIIoBLGey2Z5bCkMVNjEZseyAlm4n5arcsJOeI3zkUP+zvZgzsbLTYh4lYeP/ZD/gdIAPrw==",
+        "dependencies": {
+          "System.ComponentModel": "4.3.0",
+          "System.Resources.ResourceManager": "4.3.0",
+          "System.Runtime": "4.3.0"
+        }
+      },
+      "System.ComponentModel.TypeConverter": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "16pQ6P+EdhcXzPiEK4kbA953Fu0MNG2ovxTZU81/qsCd1zPRsKc3uif5NgvllCY598k6bI0KUyKW8fanlfaDQg==",
+        "dependencies": {
+          "System.Collections": "4.3.0",
+          "System.Collections.NonGeneric": "4.3.0",
+          "System.Collections.Specialized": "4.3.0",
+          "System.ComponentModel": "4.3.0",
+          "System.ComponentModel.Primitives": "4.3.0",
+          "System.Globalization": "4.3.0",
+          "System.Linq": "4.3.0",
+          "System.Reflection": "4.3.0",
+          "System.Reflection.Extensions": "4.3.0",
+          "System.Reflection.Primitives": "4.3.0",
+          "System.Reflection.TypeExtensions": "4.3.0",
+          "System.Resources.ResourceManager": "4.3.0",
+          "System.Runtime": "4.3.0",
+          "System.Runtime.Extensions": "4.3.0",
+          "System.Threading": "4.3.0"
+        }
+      },
+      "System.Diagnostics.Debug": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==",
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "1.1.0",
+          "Microsoft.NETCore.Targets": "1.1.0",
+          "System.Runtime": "4.3.0"
+        }
+      },
+      "System.Globalization": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==",
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "1.1.0",
+          "Microsoft.NETCore.Targets": "1.1.0",
+          "System.Runtime": "4.3.0"
+        }
+      },
+      "System.Globalization.Extensions": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==",
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "1.1.0",
+          "System.Globalization": "4.3.0",
+          "System.Resources.ResourceManager": "4.3.0",
+          "System.Runtime": "4.3.0",
+          "System.Runtime.Extensions": "4.3.0",
+          "System.Runtime.InteropServices": "4.3.0"
+        }
+      },
+      "System.IO": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==",
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "1.1.0",
+          "Microsoft.NETCore.Targets": "1.1.0",
+          "System.Runtime": "4.3.0",
+          "System.Text.Encoding": "4.3.0",
+          "System.Threading.Tasks": "4.3.0"
+        }
+      },
+      "System.IO.FileSystem.Primitives": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==",
+        "dependencies": {
+          "System.Runtime": "4.3.0"
+        }
+      },
+      "System.Linq": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==",
+        "dependencies": {
+          "System.Collections": "4.3.0",
+          "System.Diagnostics.Debug": "4.3.0",
+          "System.Resources.ResourceManager": "4.3.0",
+          "System.Runtime": "4.3.0",
+          "System.Runtime.Extensions": "4.3.0"
+        }
+      },
+      "System.Reflection": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==",
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "1.1.0",
+          "Microsoft.NETCore.Targets": "1.1.0",
+          "System.IO": "4.3.0",
+          "System.Reflection.Primitives": "4.3.0",
+          "System.Runtime": "4.3.0"
+        }
+      },
+      "System.Reflection.Emit": {
+        "type": "Transitive",
+        "resolved": "4.7.0",
+        "contentHash": "VR4kk8XLKebQ4MZuKuIni/7oh+QGFmZW3qORd1GvBq/8026OpW501SzT/oypwiQl4TvT8ErnReh/NzY9u+C6wQ=="
+      },
+      "System.Reflection.Emit.ILGeneration": {
+        "type": "Transitive",
+        "resolved": "4.7.0",
+        "contentHash": "AucBYo3DSI0IDxdUjKksBcQJXPHyoPyrCXYURW1WDsLI4M65Ar/goSHjdnHOAY9MiYDNKqDlIgaYm+zL2hA1KA=="
+      },
+      "System.Reflection.Emit.Lightweight": {
+        "type": "Transitive",
+        "resolved": "4.7.0",
+        "contentHash": "a4OLB4IITxAXJeV74MDx49Oq2+PsF6Sml54XAFv+2RyWwtDBcabzoxiiJRhdhx+gaohLh4hEGCLQyBozXoQPqA=="
+      },
+      "System.Reflection.Extensions": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==",
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "1.1.0",
+          "Microsoft.NETCore.Targets": "1.1.0",
+          "System.Reflection": "4.3.0",
+          "System.Runtime": "4.3.0"
+        }
+      },
+      "System.Reflection.Primitives": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==",
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "1.1.0",
+          "Microsoft.NETCore.Targets": "1.1.0",
+          "System.Runtime": "4.3.0"
+        }
+      },
+      "System.Reflection.TypeExtensions": {
+        "type": "Transitive",
+        "resolved": "4.7.0",
+        "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA=="
+      },
+      "System.Resources.ResourceManager": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==",
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "1.1.0",
+          "Microsoft.NETCore.Targets": "1.1.0",
+          "System.Globalization": "4.3.0",
+          "System.Reflection": "4.3.0",
+          "System.Runtime": "4.3.0"
+        }
+      },
+      "System.Runtime": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==",
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "1.1.0",
+          "Microsoft.NETCore.Targets": "1.1.0"
+        }
+      },
+      "System.Runtime.Extensions": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==",
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "1.1.0",
+          "Microsoft.NETCore.Targets": "1.1.0",
+          "System.Runtime": "4.3.0"
+        }
+      },
+      "System.Runtime.Handles": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==",
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "1.1.0",
+          "Microsoft.NETCore.Targets": "1.1.0",
+          "System.Runtime": "4.3.0"
+        }
+      },
+      "System.Runtime.InteropServices": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==",
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "1.1.0",
+          "Microsoft.NETCore.Targets": "1.1.0",
+          "System.Reflection": "4.3.0",
+          "System.Reflection.Primitives": "4.3.0",
+          "System.Runtime": "4.3.0",
+          "System.Runtime.Handles": "4.3.0"
+        }
+      },
+      "System.Text.Encoding": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==",
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "1.1.0",
+          "Microsoft.NETCore.Targets": "1.1.0",
+          "System.Runtime": "4.3.0"
+        }
+      },
+      "System.Threading": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==",
+        "dependencies": {
+          "System.Runtime": "4.3.0",
+          "System.Threading.Tasks": "4.3.0"
+        }
+      },
+      "System.Threading.Tasks": {
+        "type": "Transitive",
+        "resolved": "4.3.0",
+        "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==",
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "1.1.0",
+          "Microsoft.NETCore.Targets": "1.1.0",
+          "System.Runtime": "4.3.0"
+        }
+      },
+      "System.ValueTuple": {
+        "type": "Transitive",
+        "resolved": "4.5.0",
+        "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ=="
+      }
+    }
+  }
+}
\ No newline at end of file