using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using ModdingTales; using Newtonsoft.Json; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("AutoMoveCCMPlugin")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Nth Dimension")] [assembly: AssemblyProduct("AutoMoveCCMPlugin")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("AutoMoveCCMPlugin")] [assembly: ComVisible(false)] [assembly: Guid("c303405d-e66c-4316-9cdb-4e3ca15c6360")] [assembly: AssemblyFileVersion("1.2.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.2.0.0")] namespace LordAshes; [BepInPlugin("org.lordashes.plugins.automovecmm", "Auto Move Plugin (CCM)", "1.2.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class AutoMovePlugin : BaseUnityPlugin { public static class CreatureBoardAsset_DropAtLocation_Patch { public static bool Prefix(Vector3 pos) { return true; } public static void Postfix(object __instance, Vector3 pos) { //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Expected O, but got Unknown //IL_02c9: Unknown result type (might be due to invalid IL or missing references) //IL_02d0: Expected O, but got Unknown //IL_030b: Unknown result type (might be due to invalid IL or missing references) //IL_0312: 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_031c: Unknown result type (might be due to invalid IL or missing references) //IL_036b: Unknown result type (might be due to invalid IL or missing references) //IL_0372: Unknown result type (might be due to invalid IL or missing references) //IL_0377: Unknown result type (might be due to invalid IL or missing references) //IL_037c: Unknown result type (might be due to invalid IL or missing references) //IL_040b: Unknown result type (might be due to invalid IL or missing references) //IL_0412: Unknown result type (might be due to invalid IL or missing references) //IL_0417: Unknown result type (might be due to invalid IL or missing references) //IL_041c: Unknown result type (might be due to invalid IL or missing references) LoggingPlugin.LogDebug("Asset DropAtLocation Patch"); string text = Reflection.Property(_CreatureBoardAsset, "Name", (string)null).GetValue(__instance).ToString(); LoggingPlugin.LogDebug("Asset Name: " + text); object cid = Reflection.Property(_CreatureBoardAsset, "CreatureId", (string)null).GetValue(__instance); LoggingPlugin.LogDebug("Asset Cid: " + cid.ToString()); Transform val = (Transform)Reflection.Field(_CreatureBoardAsset, "Rotator", (string)null).GetValue(__instance); LoggingPlugin.LogDebug("Asset " + text + " (" + cid?.ToString() + ") Moved"); foreach (PathApplication movingAsset in _self.movingAssets) { LoggingPlugin.LogDebug("Moving Asset Cid " + Reflection.Property(_CreatureBoardAsset, "CreatureId", (string)null).GetValue(movingAsset.asset)?.ToString() + " Vs This Cid " + Reflection.Property(_CreatureBoardAsset, "CreatureId", (string)null).GetValue(__instance)); } List list = _self.movingAssets.Where((PathApplication ma) => Reflection.Property(_CreatureBoardAsset, "CreatureId", (string)null).GetValue(ma.asset) == cid).ToList(); if (list.Count > 0) { LoggingPlugin.LogDebug("Asset " + text + " (" + cid?.ToString() + ") Is A Auto Move Asset"); if (list[0].proximity > 0f) { LoggingPlugin.LogDebug("Asset " + text + " (" + cid?.ToString() + ") Is A Auto Move Asset With Proximity " + list[0].proximity); { foreach (object item in _self.GetAssetsByType(AssetType.pc)) { string text2 = Reflection.Property(_CreatureBoardAsset, "Name", (string)null).GetValue(item).ToString(); object value = Reflection.Property(_CreatureBoardAsset, "CreatureId", (string)null).GetValue(item); Transform val2 = (Transform)Reflection.Field(_CreatureBoardAsset, "Rotator", (string)null).GetValue(item); string[] obj = new string[11] { "Asset ", text, " (", cid?.ToString(), ") Is ", null, null, null, null, null, null }; Vector3 val3 = val.position - val2.position; obj[5] = ((Vector3)(ref val3)).magnitude.ToString(); obj[6] = " Away From "; obj[7] = text2; obj[8] = " ("; obj[9] = value?.ToString(); obj[10] = ")"; LoggingPlugin.LogDebug(string.Concat(obj)); val3 = val.position - val2.position; if ((double)((Vector3)(ref val3)).magnitude < (double)list[0].proximity + 0.5) { string[] obj2 = new string[10] { "Asset ", text, " (", cid?.ToString(), ") Stopped By Proximity To ", text2, " (", value?.ToString(), "). Distance = ", null }; val3 = val.position - val2.position; obj2[9] = ((Vector3)(ref val3)).magnitude.ToString(); LoggingPlugin.LogDebug(string.Concat(obj2)); list[0].paused = true; break; } } return; } } LoggingPlugin.LogDebug("Asset " + text + " (" + cid?.ToString() + ") Proximity Is Set To " + list[0].proximity); } else { LoggingPlugin.LogDebug("No Players Found"); } } } public class P3 { public float x { get; set; } public float y { get; set; } public float z { get; set; } public P3() { } public P3(float x, float y, float z) { this.x = x; this.y = y; this.z = z; } public P3(Vector3 pos) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) x = pos.x; y = pos.y; z = pos.z; } public Vector3 ToVector3() { //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_001b: Unknown result type (might be due to invalid IL or missing references) return new Vector3(x, y, z); } public override string ToString() { return x + "," + y + "," + z; } } public class Path { public string name { get; set; } = ""; public List steps { get; set; } = new List(); } public class PathApplication { public string pathName { get; set; } = ""; public P3 appliedAt { get; set; } = new P3(0f, 0f, 0f); public float proximity { get; set; } = 0f; public bool paused { get; set; } = false; public ushort step { get; set; } = 0; public object asset { get; set; } } public enum OperationMode { RealTimeMode = 1, TurnBasedMode } public enum AssetType { pc, npc } [CompilerGenerated] private sealed class <>c__DisplayClass45_0 { public AutoMovePlugin <>4__this; public AssetInfo info; } [CompilerGenerated] private sealed class <>c__DisplayClass45_1 { public object cid; public <>c__DisplayClass45_0 CS$<>8__locals1; } [CompilerGenerated] private sealed class <>c__DisplayClass45_2 { public Transform rotator; public <>c__DisplayClass45_1 CS$<>8__locals2; internal void b__0(object proximity) { CS$<>8__locals2.CS$<>8__locals1.<>4__this.SetPath(CS$<>8__locals2.CS$<>8__locals1.info, CS$<>8__locals2.cid, int.Parse(proximity.ToString()), rotator); } } [CompilerGenerated] private sealed class d__39 : IEnumerator, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public float stepDelay; public AutoMovePlugin <>4__this; private List.Enumerator <>s__1; private PathApplication 5__2; private Transform 5__3; private Vector3 5__4; private Vector3 5__5; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__39(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>s__1 = default(List.Enumerator); 5__2 = null; 5__3 = null; <>1__state = -2; } private bool MoveNext() { //IL_04d5: Unknown result type (might be due to invalid IL or missing references) //IL_04df: Expected O, but got Unknown //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Expected O, but got Unknown //IL_0304: Unknown result type (might be due to invalid IL or missing references) //IL_0309: Unknown result type (might be due to invalid IL or missing references) //IL_0221: 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_0392: Unknown result type (might be due to invalid IL or missing references) //IL_0398: Unknown result type (might be due to invalid IL or missing references) //IL_039d: Unknown result type (might be due to invalid IL or missing references) //IL_03a2: Unknown result type (might be due to invalid IL or missing references) //IL_03ca: Unknown result type (might be due to invalid IL or missing references) //IL_03d0: Unknown result type (might be due to invalid IL or missing references) //IL_03d5: Unknown result type (might be due to invalid IL or missing references) //IL_03da: Unknown result type (might be due to invalid IL or missing references) //IL_03eb: Unknown result type (might be due to invalid IL or missing references) //IL_041e: Unknown result type (might be due to invalid IL or missing references) //IL_0454: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; break; } LoggingPlugin.LogTrace("Executing Mini Step(s)"); <>s__1 = <>4__this.movingAssets.GetEnumerator(); try { while (<>s__1.MoveNext()) { 5__2 = <>s__1.Current; LoggingPlugin.LogDebug("Considering Mini " + Reflection.Property(_CreatureBoardAsset, "Name", (string)null).GetValue(5__2.asset)?.ToString() + " (" + Reflection.Property(_CreatureBoardAsset, "CreatureId", (string)null).GetValue(5__2.asset)?.ToString() + ")"); if (!5__2.paused) { LoggingPlugin.LogDebug("Moving Mini " + Reflection.Property(_CreatureBoardAsset, "Name", (string)null).GetValue(5__2.asset)?.ToString() + " (" + Reflection.Property(_CreatureBoardAsset, "CreatureId", (string)null).GetValue(5__2.asset)?.ToString() + ") Using " + 5__2.pathName); 5__3 = (Transform)Reflection.Field(_CreatureBoardAsset, "Rotator", (string)null).GetValue(5__2.asset); 5__2.step++; if (5__2.step >= <>4__this.paths[5__2.pathName].steps.Count) { 5__2.step = 0; 5__4 = Vector3.zero; LoggingPlugin.LogDebug("Mini " + Reflection.Property(_CreatureBoardAsset, "Name", (string)null).GetValue(5__2.asset)?.ToString() + " (" + Reflection.Property(_CreatureBoardAsset, "CreatureId", (string)null).GetValue(5__2.asset)?.ToString() + ") Path Loop To " + 5__2.appliedAt); } else { 5__4 = <>4__this.paths[5__2.pathName].steps.ElementAt(5__2.step).ToVector3(); string[] obj = new string[6] { "Mini ", Reflection.Property(_CreatureBoardAsset, "Name", (string)null).GetValue(5__2.asset)?.ToString(), " (", Reflection.Property(_CreatureBoardAsset, "CreatureId", (string)null).GetValue(5__2.asset)?.ToString(), ") Moved To ", null }; Vector3 val = 5__3.position + 5__4; obj[5] = ((object)(Vector3)(ref val)).ToString(); LoggingPlugin.LogTrace(string.Concat(obj)); } 5__5 = 5__2.appliedAt.ToVector3() + 5__4; 5__5.y = 5__3.position.y; Reflection.Execute(Reflection.Method(_CreatureBoardAsset, "DropAtLocation", (string[])null), 5__2.asset, new object[1] { 5__5 }, 0); Reflection.Execute(Reflection.Method(_CreatureBoardAsset, "RotateTowards", (string[])null), 5__2.asset, new object[1] { 5__5 }, 0); 5__3 = null; } 5__2 = null; } } finally { ((IDisposable)<>s__1).Dispose(); } <>s__1 = default(List.Enumerator); if (<>4__this.stepMode.Value != OperationMode.TurnBasedMode) { LoggingPlugin.LogTrace("Executing Mini Step Wait"); <>2__current = (object)new WaitForSeconds(stepDelay); <>1__state = 1; return true; } LoggingPlugin.LogTrace("Executing Mini Step Complete"); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class d__45 : IEnumerator, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public AssetInfo info; public AutoMovePlugin <>4__this; private <>c__DisplayClass45_0 <>8__1; private <>c__DisplayClass45_1 <>8__2; private object 5__3; private <>c__DisplayClass45_2 <>8__4; private string 5__5; private Exception 5__6; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__45(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>8__1 = null; <>8__2 = null; 5__3 = null; <>8__4 = null; 5__5 = null; 5__6 = null; <>1__state = -2; } private bool MoveNext() { //IL_033a: Unknown result type (might be due to invalid IL or missing references) //IL_0344: Expected O, but got Unknown //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>8__1 = new <>c__DisplayClass45_0(); <>8__1.<>4__this = <>4__this; <>8__1.info = info; LoggingPlugin.LogDebug("Processing Menu Request"); try { <>8__2 = new <>c__DisplayClass45_1(); <>8__2.CS$<>8__locals1 = <>8__1; <>8__2.cid = Reflection.Property(_LocalClient, "SelectedCreatureId", (string)null).GetValue(null); LoggingPlugin.LogDebug("CCM Selection: Path " + <>8__2.CS$<>8__locals1.info.name + " On Creature " + <>8__2.cid.ToString()); 5__3 = Reflection.Execute(Reflection.Method(_CreaturePresenter, "TryGetAsset", (string[])null), (object)null, new object[2] { <>8__2.cid, null }, 2); if (5__3 != null) { <>8__4 = new <>c__DisplayClass45_2(); <>8__4.CS$<>8__locals2 = <>8__2; <>8__4.rotator = (Transform)Reflection.Field(_CreatureBoardAsset, "Rotator", (string)null).GetValue(5__3); 5__5 = AssetDataPlugin.ReadInfo(<>8__4.CS$<>8__locals2.cid.ToString(), "org.lordashes.plugins.automovecmm"); LoggingPlugin.LogDebug("Current Creature " + <>8__4.CS$<>8__locals2.cid.ToString() + " Path Is " + ((5__5 == null || 5__5 == "") ? "Null. Set Path." : (5__5 + ". Remove Path."))); if (5__5 == null || 5__5 == "") { Reflection.Execute(Reflection.Method(_SystemMessage, "AskForTextInput", new string[9] { "System.String", "System.String", "System.Int32", "System.String", "System.Action`1[System.String]", "System.Action", "System.String", "System.Action", "System.String" }), (object)null, new object[9] { "Path Name", "Stop If PC Is Within N Tiles (0=OFF):", 1, "Apply", (Action)delegate(object proximity) { <>8__4.CS$<>8__locals2.CS$<>8__locals1.<>4__this.SetPath(<>8__4.CS$<>8__locals2.CS$<>8__locals1.info, <>8__4.CS$<>8__locals2.cid, int.Parse(proximity.ToString()), <>8__4.rotator); }, null, "Cancel", null, "0" }, 0); } else { LoggingPlugin.LogDebug("Clear Path On Creature " + <>8__4.CS$<>8__locals2.cid.ToString()); AssetDataPlugin.ClearInfo(<>8__4.CS$<>8__locals2.cid.ToString(), "org.lordashes.plugins.automovecmm", false); } <>8__4 = null; 5__5 = null; } <>8__2 = null; 5__3 = null; } catch (Exception ex) { 5__6 = ex; Reflection.CatchFullError(5__6); } <>2__current = (object)new WaitForSeconds(1f); <>1__state = 1; return true; case 1: <>1__state = -1; return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class d__44 : IEnumerator, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public ReadOnlyDictionary existingAssets; public Func, string, IEnumerator> callback; public AutoMovePlugin <>4__this; private string 5__1; private Texture2D 5__2; private byte[] 5__3; private Dictionary 5__4; private Dictionary.ValueCollection.Enumerator <>s__5; private Path 5__6; private AssetInfo 5__7; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__44(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } 5__1 = null; 5__2 = null; 5__3 = null; 5__4 = null; <>s__5 = default(Dictionary.ValueCollection.Enumerator); 5__6 = null; 5__7 = null; <>1__state = -2; } private bool MoveNext() { //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: 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_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_0198: 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_01b1: Expected O, but got Unknown //IL_01d4: Unknown result type (might be due to invalid IL or missing references) //IL_01de: Expected O, but got Unknown try { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -3; File.WriteAllBytes(5__1 + "/Portrait." + 5__7.prefab + ".png", 5__3, (CacheType)999); 5__7 = null; goto IL_022d; } <>1__state = -1; <>4__this.LoadPaths(); 5__1 = Paths.PluginPath + "/.cache/org.lordashes.plugins.commoncustomsmenu/"; 5__2 = Image.LoadTexture("org.lordashes.plugins.automovecmm.png", (CacheType)999); 5__3 = ImageConversion.EncodeToPNG(5__2); 5__4 = new Dictionary(); <>s__5 = <>4__this.paths.Values.GetEnumerator(); <>1__state = -3; goto IL_0235; IL_022d: 5__6 = null; goto IL_0235; IL_0235: if (<>s__5.MoveNext()) { 5__6 = <>s__5.Current; if (!existingAssets.ContainsKey(5__6.name)) { 5__7 = new AssetInfo { provider = "AutoMove", filename = "Path:" + 5__6.name, pack = "AutoMoveCore", prefab = 5__6.name, name = 5__6.name, kind = "Creature", category = "Path", header = "Relative Paths", groupName = "Registered Paths", description = "Relative Path For Auto Move Plugin", author = "Lord Ashes", comment = "Auto Move Plugin", hasAnimations = false, hasAudio = false, hasBlendshapes = false, tags = "Move,Plugin" }; 5__4.Add(5__7.prefab, 5__7); <>2__current = (object)new WaitForSeconds(0.1f); <>1__state = 1; return true; } goto IL_022d; } <>m__Finally1(); <>s__5 = default(Dictionary.ValueCollection.Enumerator); LoggingPlugin.LogDebug("Sending CCM Registration For " + 5__4.Count + " New Auto Move Assets"); ((MonoBehaviour)_self).StartCoroutine(callback(5__4, "AutoMove")); return false; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; ((IDisposable)<>s__5).Dispose(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class d__49 : IEnumerator, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public AutoMovePlugin <>4__this; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__49(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Expected O, but got Unknown //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; break; } try { MethodInfo methodInfo = Reflection.Method(_SystemMessage, "DisplayInfoText", (string[])null); object[] array = new object[4]; DiagnosticLevel logLevel = LoggingPlugin.GetLogLevel(); array[0] = "Auto Move Plugin (CCM): Using '" + ((object)(DiagnosticLevel)(ref logLevel)).ToString() + "' diagnostics.\r\nUse 'Info' for better performance"; array[1] = 10; array[2] = Type.Missing; array[3] = Type.Missing; Reflection.Execute(methodInfo, (object)null, array, 0); Reflection.Execute(Reflection.Method(_SystemMessage, "DisplayInfoText", (string[])null), (object)null, new object[4] { "Auto Move Plugin (CCM): Use 'Debug' or 'Trace' for\r\ntroubleshooting only.", 10, Type.Missing, Type.Missing }, 0); } catch { goto IL_00ce; } return false; IL_00ce: <>2__current = (object)new WaitForSeconds(1f); <>1__state = 1; return true; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public const string Name = "Auto Move Plugin (CCM)"; public const string Guid = "org.lordashes.plugins.automovecmm"; public const string Version = "1.2.0.0"; public const string Author = "Lord Ashes"; public static AutoMovePlugin _self = null; public ConfigEntry triggerStartRecord; public ConfigEntry triggerStepRecord; public ConfigEntry triggerEndRecord; public ConfigEntry triggerDeleteLastStep; public ConfigEntry triggerApplyPath; public ConfigEntry triggerRemovePath; public ConfigEntry triggerPausePath; public ConfigEntry triggerModeChange; public ConfigEntry triggerManualStep; public Dictionary paths = null; public List movingAssets = new List(); public Path newPath = new Path(); public Vector3 recordingPositionReference = Vector3.zero; public List pathsToAdd = new List(); public List pathsToRemove = new List(); public ConfigEntry stepDelay; public ConfigEntry stepMode; public static Type _CampaignSessionManager = Reflection.Type("CampaignSessionManager", (string[])null, (string[])null, 0); public static Type _CreatureBoardAsset = Reflection.Type("CreatureBoardAsset", (string[])null, (string[])null, 0); public static Type _CreatureGuid = Reflection.Type("CreatureGuid", (string[])null, (string[])null, 0); public static Type _CreatureManager = Reflection.Type("CreatureManager", (string[])null, (string[])null, 0); public static Type _CreaturePresenter = Reflection.Type("CreaturePresenter", (string[])null, (string[])null, 0); public static Type _LocalClient = Reflection.Type("LocalClient", (string[])null, (string[])null, 0); public static Type _SystemMessage = Reflection.Type("SystemMessage", (string[])null, (string[])null, 0); public void ApplyPatch(Harmony harmony) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown //IL_0044: Expected O, but got Unknown harmony.Patch((MethodBase)Reflection.Method(_CreatureBoardAsset, "DropAtLocation", (string[])null), new HarmonyMethod(typeof(CreatureBoardAsset_DropAtLocation_Patch), "Prefix", (Type[])null), new HarmonyMethod(typeof(CreatureBoardAsset_DropAtLocation_Patch), "Postfix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } private void Awake() { //IL_001e: 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_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0080: 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_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01e9: Unknown result type (might be due to invalid IL or missing references) //IL_021d: Unknown result type (might be due to invalid IL or missing references) //IL_02d7: Unknown result type (might be due to invalid IL or missing references) //IL_02dd: Invalid comparison between Unknown and I4 //IL_0302: Unknown result type (might be due to invalid IL or missing references) //IL_030c: Expected O, but got Unknown //IL_0313: Unknown result type (might be due to invalid IL or missing references) //IL_034a: Expected O, but got Unknown _self = this; LoggingPlugin.SetLogLevel(((BaseUnityPlugin)this).Config.Bind("Settings", "Diagnostic Level", (DiagnosticLevel)3, (ConfigDescription)null).Value); string? assemblyQualifiedName = ((object)this).GetType().AssemblyQualifiedName; DiagnosticLevel logLevel = LoggingPlugin.GetLogLevel(); LoggingPlugin.LogInfo(assemblyQualifiedName + ": Active. (Diagnostic Mode = " + ((object)(DiagnosticLevel)(ref logLevel)).ToString() + ")"); triggerStartRecord = ((BaseUnityPlugin)this).Config.Bind("Hotkeys", "Start Recording A New Path", new KeyboardShortcut((KeyCode)306, (KeyCode[])(object)new KeyCode[1] { (KeyCode)282 }), (ConfigDescription)null); triggerStepRecord = ((BaseUnityPlugin)this).Config.Bind("Hotkeys", "Recording Step", new KeyboardShortcut((KeyCode)306, (KeyCode[])(object)new KeyCode[1] { (KeyCode)283 }), (ConfigDescription)null); triggerDeleteLastStep = ((BaseUnityPlugin)this).Config.Bind("Hotkeys", "Delete Last Step Of Path", new KeyboardShortcut((KeyCode)306, (KeyCode[])(object)new KeyCode[1] { (KeyCode)284 }), (ConfigDescription)null); triggerEndRecord = ((BaseUnityPlugin)this).Config.Bind("Hotkeys", "End Recording A New Path", new KeyboardShortcut((KeyCode)306, (KeyCode[])(object)new KeyCode[1] { (KeyCode)285 }), (ConfigDescription)null); triggerApplyPath = ((BaseUnityPlugin)this).Config.Bind("Hotkeys", "Apply Path", new KeyboardShortcut((KeyCode)306, (KeyCode[])(object)new KeyCode[1] { (KeyCode)277 }), (ConfigDescription)null); triggerRemovePath = ((BaseUnityPlugin)this).Config.Bind("Hotkeys", "Remove Path", new KeyboardShortcut((KeyCode)306, (KeyCode[])(object)new KeyCode[1] { (KeyCode)127 }), (ConfigDescription)null); triggerPausePath = ((BaseUnityPlugin)this).Config.Bind("Hotkeys", "Pause Path", new KeyboardShortcut((KeyCode)306, (KeyCode[])(object)new KeyCode[1] { (KeyCode)280 }), (ConfigDescription)null); triggerModeChange = ((BaseUnityPlugin)this).Config.Bind("Hotkeys", "Toggle Mode", new KeyboardShortcut((KeyCode)306, (KeyCode[])(object)new KeyCode[1] { (KeyCode)279 }), (ConfigDescription)null); triggerManualStep = ((BaseUnityPlugin)this).Config.Bind("Hotkeys", "Manual Step", new KeyboardShortcut((KeyCode)306, (KeyCode[])(object)new KeyCode[1] { (KeyCode)281 }), (ConfigDescription)null); stepDelay = ((BaseUnityPlugin)this).Config.Bind("Settings", "Step Delay", 1f, (ConfigDescription)null); stepMode = ((BaseUnityPlugin)this).Config.Bind("Settings", "Step Mode", OperationMode.RealTimeMode, (ConfigDescription)null); AssetDataPlugin.Subscribe("org.lordashes.plugins.automovecmm", (Action)ModifyAssetPath, (Func)Checker.CheckSourceAsCreature); string text = CommonCustomsMenuPlugin.RegisterProviderV2("AutoMove", "Auto Move Paths", "1.2.0.0", (Func, Func, string, IEnumerator>, IEnumerator>)RegisterAssets, (Action)delegate(AssetInfo assetInfo) { LoggingPlugin.LogDebug("CCM Selection"); LoggingPlugin.LogTrace(JsonConvert.SerializeObject((object)assetInfo)); ((MonoBehaviour)_self).StartCoroutine(ProcessAssetSelection(assetInfo)); }); ((MonoBehaviour)_self).StartCoroutine(MoveAssets(stepDelay.Value)); if ((int)LoggingPlugin.GetLogLevel() >= 4) { ((MonoBehaviour)this).StartCoroutine(WarnAboutLogLevel()); } LoadPaths(); ApplyPatch(new Harmony("org.lordashes.plugins.automovecmm")); ModdingUtils.Initialize((BaseUnityPlugin)(object)this, new ManualLogSource("Auto Move Plugin (CCM)"), "Lord Ashes" + ("Lord Ashes".ToUpper().EndsWith("S") ? "'" : "'s"), false); } private void Update() { //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) //IL_00db: 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_023a: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Unknown result type (might be due to invalid IL or missing references) //IL_0413: Unknown result type (might be due to invalid IL or missing references) //IL_0418: Unknown result type (might be due to invalid IL or missing references) //IL_04eb: Unknown result type (might be due to invalid IL or missing references) //IL_04f0: 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_06fb: Unknown result type (might be due to invalid IL or missing references) //IL_0966: Unknown result type (might be due to invalid IL or missing references) //IL_096b: Unknown result type (might be due to invalid IL or missing references) //IL_0cb7: Unknown result type (might be due to invalid IL or missing references) //IL_0cbc: Unknown result type (might be due to invalid IL or missing references) //IL_0585: Unknown result type (might be due to invalid IL or missing references) //IL_058c: Expected O, but got Unknown //IL_0599: Unknown result type (might be due to invalid IL or missing references) //IL_059f: Unknown result type (might be due to invalid IL or missing references) //IL_05a4: Unknown result type (might be due to invalid IL or missing references) //IL_05dc: Unknown result type (might be due to invalid IL or missing references) //IL_05e1: Unknown result type (might be due to invalid IL or missing references) //IL_0619: Unknown result type (might be due to invalid IL or missing references) //IL_061f: Unknown result type (might be due to invalid IL or missing references) //IL_0624: Unknown result type (might be due to invalid IL or missing references) //IL_0dcc: Unknown result type (might be due to invalid IL or missing references) //IL_0dd1: Unknown result type (might be due to invalid IL or missing references) //IL_0911: Unknown result type (might be due to invalid IL or missing references) //IL_0916: Unknown result type (might be due to invalid IL or missing references) //IL_0ad4: Unknown result type (might be due to invalid IL or missing references) //IL_0adb: Expected O, but got Unknown //IL_0afd: Unknown result type (might be due to invalid IL or missing references) //IL_0b02: Unknown result type (might be due to invalid IL or missing references) //IL_0b2c: Unknown result type (might be due to invalid IL or missing references) //IL_0b2e: Unknown result type (might be due to invalid IL or missing references) //IL_0b33: Unknown result type (might be due to invalid IL or missing references) //IL_0b51: Unknown result type (might be due to invalid IL or missing references) //IL_0b56: Unknown result type (might be due to invalid IL or missing references) //IL_0b58: Unknown result type (might be due to invalid IL or missing references) //IL_0b8c: Unknown result type (might be due to invalid IL or missing references) //IL_0b91: Unknown result type (might be due to invalid IL or missing references) //IL_0b94: Unknown result type (might be due to invalid IL or missing references) //IL_0b99: Unknown result type (might be due to invalid IL or missing references) //IL_0b9b: Unknown result type (might be due to invalid IL or missing references) //IL_0ba0: Unknown result type (might be due to invalid IL or missing references) //IL_0c08: Unknown result type (might be due to invalid IL or missing references) //IL_0c0d: Unknown result type (might be due to invalid IL or missing references) //IL_0c0f: Unknown result type (might be due to invalid IL or missing references) //IL_0c14: Unknown result type (might be due to invalid IL or missing references) //IL_0c33: Unknown result type (might be due to invalid IL or missing references) //IL_0c5c: Unknown result type (might be due to invalid IL or missing references) KeyboardShortcut value = triggerApplyPath.Value; if (((KeyboardShortcut)(ref value)).IsUp()) { if ((bool)Reflection.Property(_LocalClient, "IsInGmMode", (string)null).GetValue(null)) { Reflection.Execute(Reflection.Method(_SystemMessage, "AskForTextInput", (string[])null), (object)null, new object[8] { "Path Name", "Enter Path Name, Proximity:", "Add", (Action)delegate(object pathName) { ApplyPath(pathName); }, null, "Cancel", null, ",0" }, 0); } else { Reflection.Execute(Reflection.Method(_SystemMessage, "DisplayInfoText", (string[])null), (object)null, new object[4] { "Auto Move Operation 'Apply Path' Is Available To GM Only", Type.Missing, Type.Missing, Type.Missing }, 0); } } value = triggerRemovePath.Value; if (((KeyboardShortcut)(ref value)).IsUp()) { if ((bool)Reflection.Property(_LocalClient, "IsInGmMode", (string)null).GetValue(null)) { object obj = Reflection.Execute(Reflection.Method(_CreaturePresenter, "TryGetAsset", (string[])null), (object)null, new object[2] { Reflection.Property(_LocalClient, "SelectedCreatureId", (string)null).GetValue(null), null }, 2); AssetDataPlugin.ClearInfo(Reflection.Property(obj.GetType(), "CreatureId", (string)null).GetValue(obj).ToString(), "org.lordashes.plugins.automovecmm", false); LoggingPlugin.LogDebug("Sending Path Remove Request To " + Reflection.Property(obj.GetType(), "Name", (string)null).GetValue(obj)?.ToString() + " (" + Reflection.Property(obj.GetType(), "CreatureId", (string)null).GetValue(obj)?.ToString() + ")"); } else { Reflection.Execute(Reflection.Method(_SystemMessage, "DisplayInfoText", (string[])null), (object)null, new object[4] { "Auto Move Operation 'Remove Path' Is Available To GM Only", Type.Missing, Type.Missing, Type.Missing }, 0); } } value = triggerPausePath.Value; if (((KeyboardShortcut)(ref value)).IsUp()) { if ((bool)Reflection.Property(_LocalClient, "IsInGmMode", (string)null).GetValue(null)) { for (int i = 0; i < movingAssets.Count; i++) { if (Reflection.Property(_CreatureBoardAsset, "CreatureId", (string)null).GetValue(movingAssets.ElementAt(i).asset) == Reflection.Property(_LocalClient, "SelectedCreatureId", (string)null).GetValue(null)) { movingAssets.ElementAt(i).paused = !movingAssets.ElementAt(i).paused; LoggingPlugin.LogDebug("Toggling Path Pause To " + (movingAssets.ElementAt(i).paused ? "Paused" : "Not Paused") + " On Creature " + Reflection.Property(_CreatureBoardAsset, "Name", (string)null).GetValue(movingAssets.ElementAt(i).asset)?.ToString() + " (" + Reflection.Property(_CreatureBoardAsset, "CreatureId", (string)null).GetValue(movingAssets.ElementAt(i).asset).ToString() + ")"); } } } else { Reflection.Execute(Reflection.Method(_SystemMessage, "DisplayInfoText", (string[])null), (object)null, new object[4] { "Auto Move Operation 'Pause/Unpause Path' Is Available To GM Only", Type.Missing, Type.Missing, Type.Missing }, 0); } } value = triggerStartRecord.Value; if (((KeyboardShortcut)(ref value)).IsUp()) { if ((bool)Reflection.Property(_LocalClient, "IsInGmMode", (string)null).GetValue(null)) { Reflection.Execute(Reflection.Method(_SystemMessage, "AskForTextInput", (string[])null), (object)null, new object[8] { "Path Name", "Enter Name For The New Path:", "Add", (Action)delegate(object pathName) { StartRecording(pathName); }, null, "Cancel", null, "" }, 0); } else { Reflection.Execute(Reflection.Method(_SystemMessage, "DisplayInfoText", (string[])null), (object)null, new object[4] { "Auto Move Operation 'Start Record' Is Available To GM Only", Type.Missing, Type.Missing, Type.Missing }, 0); } } value = triggerStepRecord.Value; Vector3 val2; if (((KeyboardShortcut)(ref value)).IsUp()) { if ((bool)Reflection.Property(_LocalClient, "IsInGmMode", (string)null).GetValue(null)) { object obj2 = Reflection.Execute(Reflection.Method(_CreaturePresenter, "TryGetAsset", (string[])null), (object)null, new object[2] { Reflection.Property(_LocalClient, "SelectedCreatureId", (string)null).GetValue(null), null }, 2); if (obj2 != null) { Transform val = (Transform)Reflection.Field(_CreatureBoardAsset, "Rotator", (string)null).GetValue(obj2); newPath.steps.Add(new P3(val.position - recordingPositionReference)); string[] obj3 = new string[8] { "Path '", newPath.name, "' Added Step ", null, null, null, null, null }; val2 = val.position; obj3[3] = ((object)(Vector3)(ref val2)).ToString(); obj3[4] = " - "; obj3[5] = ((object)(Vector3)(ref recordingPositionReference)).ToString(); obj3[6] = " = "; obj3[7] = new P3(val.position - recordingPositionReference).ToString(); LoggingPlugin.LogDebug(string.Concat(obj3)); Reflection.Execute(Reflection.Method(_SystemMessage, "DisplayInfoText", (string[])null), (object)null, new object[4] { "Recording Path '" + newPath.name + "' Step " + newPath.steps.Count, Type.Missing, Type.Missing, Type.Missing }, 0); } } else { Reflection.Execute(Reflection.Method(_SystemMessage, "DisplayInfoText", (string[])null), (object)null, new object[4] { "Auto Move Operation 'Record Step' Is Available To GM Only", Type.Missing, Type.Missing, Type.Missing }, 0); } } value = triggerEndRecord.Value; if (((KeyboardShortcut)(ref value)).IsUp()) { if ((bool)Reflection.Property(_LocalClient, "IsInGmMode", (string)null).GetValue(null)) { if (newPath.name != null && newPath.name != "") { LoggingPlugin.LogDebug("Adding Path '" + newPath.name + "' To Paths"); paths.Add(newPath.name.ToUpper(), newPath); LoggingPlugin.LogDebug("Getting Configuration File Location"); string text = File.Find("org.lordashes.plugins.automovecmm.paths.json", (CacheType)999).FirstOrDefault(); if (text == null) { LoggingPlugin.LogDebug("Creating Default Paths File"); text = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "/CustomData/org.lordashes.plugins.automovecmm.paths.json"; } LoggingPlugin.LogDebug("Configuration File Location = " + text); File.WriteAllText(text, JsonConvert.SerializeObject((object)paths.Values, (Formatting)1), (CacheType)999); Reflection.Execute(Reflection.Method(_SystemMessage, "DisplayInfoText", (string[])null), (object)null, new object[4] { "Saved Path '" + newPath.name + "' With " + newPath.steps.Count + ". Steps.", Type.Missing, Type.Missing, Type.Missing }, 0); LoggingPlugin.LogDebug("Saved Path '" + newPath.name + "' With " + newPath.steps.Count + ". Steps To " + text); newPath = new Path(); recordingPositionReference = Vector3.zero; } } else { Reflection.Execute(Reflection.Method(_SystemMessage, "DisplayInfoText", (string[])null), (object)null, new object[4] { "Auto Move Operation 'End Record' Is Available To GM Only", Type.Missing, Type.Missing, Type.Missing }, 0); } } value = triggerDeleteLastStep.Value; if (((KeyboardShortcut)(ref value)).IsUp()) { if ((bool)Reflection.Property(_LocalClient, "IsInGmMode", (string)null).GetValue(null)) { if (newPath.name != null && newPath.name != "") { object obj4 = Reflection.Execute(Reflection.Method(_CreaturePresenter, "TryGetAsset", (string[])null), (object)null, new object[2] { Reflection.Property(_LocalClient, "SelectedCreatureId", (string)null).GetValue(null), null }, 2); if (obj4 != null) { Reflection.Execute(Reflection.Method(_SystemMessage, "DisplayInfoText", (string[])null), (object)null, new object[4] { "Deleted Path '" + newPath.name + "' Step " + newPath.steps.Count, Type.Missing, Type.Missing, Type.Missing }, 0); LoggingPlugin.LogDebug("Deleting Path '" + newPath.name + "' Step " + newPath.steps.Count); Transform val3 = (Transform)Reflection.Field(_CreatureBoardAsset, "Rotator", (string)null).GetValue(obj4); Vector3 val4 = newPath.steps.ElementAt(newPath.steps.Count - 1).ToVector3(); newPath.steps.RemoveAt(newPath.steps.Count - 1); val4 = -1f * val4; Reflection.Execute(Reflection.Method(_CreatureBoardAsset, "MoveTo", (string[])null), obj4, new object[1] { val3.position + val4 }, 0); Vector3 val5 = newPath.steps.ElementAt(newPath.steps.Count - 1).ToVector3(); Vector3 val6 = recordingPositionReference + val5; string[] obj5 = new string[6] { "Mini ", Reflection.Property(_CreatureBoardAsset, "Name", (string)null).GetValue(obj4)?.ToString(), " (", Reflection.Property(_CreatureBoardAsset, "CreatureId", (string)null).GetValue(obj4).ToString(), ") Moved To ", null }; val2 = recordingPositionReference + val5; obj5[5] = ((object)(Vector3)(ref val2)).ToString(); LoggingPlugin.LogTrace(string.Concat(obj5)); val6.y = val3.position.y; Reflection.Execute(Reflection.Method(_CreatureBoardAsset, "DropAtLocation", (string[])null), obj4, new object[1] { val6 }, 0); } } } else { Reflection.Execute(Reflection.Method(_SystemMessage, "DisplayInfoText", (string[])null), (object)null, new object[4] { "Auto Move Operation 'Delete Last Step' Is Available To GM Only", Type.Missing, Type.Missing, Type.Missing }, 0); } } value = triggerModeChange.Value; if (((KeyboardShortcut)(ref value)).IsUp()) { if (stepMode.Value == OperationMode.RealTimeMode) { stepMode.Value = OperationMode.TurnBasedMode; } else { stepMode.Value = OperationMode.RealTimeMode; } Reflection.Execute(Reflection.Method(_SystemMessage, "DisplayInfoText", (string[])null), (object)null, new object[4] { "Auto Move Plugin Set To " + ((stepMode.Value == OperationMode.RealTimeMode) ? "RealTime" : "Manual") + " Mode", Type.Missing, Type.Missing, Type.Missing }, 0); LoggingPlugin.LogDebug("Auto Move Plugin Set To " + ((stepMode.Value == OperationMode.RealTimeMode) ? "RealTime" : "Manual") + " Mode"); if (stepMode.Value == OperationMode.RealTimeMode) { ((MonoBehaviour)_self).StartCoroutine(MoveAssets(stepDelay.Value)); } } value = triggerManualStep.Value; if (((KeyboardShortcut)(ref value)).IsUp()) { LoggingPlugin.LogDebug("Manual Step"); ((MonoBehaviour)_self).StartCoroutine(MoveAssets(stepDelay.Value)); } if (pathsToRemove.Count > 0) { foreach (object item in pathsToRemove) { for (int j = 0; j < movingAssets.Count; j++) { object value2 = Reflection.Property(_CreatureBoardAsset, "CreatureId", (string)null).GetValue(movingAssets.ElementAt(j).asset); LoggingPlugin.LogDebug("Found Asset Cid " + value2.ToString() + " While Searching For " + item.ToString()); if (value2.ToString() == item.ToString()) { LoggingPlugin.LogDebug("Removing Creature " + Reflection.Property(_LocalClient, "SelectedCreatureId", (string)null).GetValue(null).ToString() + " From MovingAssets"); movingAssets.RemoveAt(j); } } } pathsToRemove.Clear(); } if (pathsToAdd.Count > 0) { LoggingPlugin.LogTrace("Adding New Creatures To MovingAssets"); movingAssets.AddRange(pathsToAdd); pathsToAdd.Clear(); LoggingPlugin.LogTrace("Contains " + movingAssets.Count + " Auto Moving Assets"); } } private void ApplyPath(object pathName) { //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Expected O, but got Unknown //IL_00dd: Unknown result type (might be due to invalid IL or missing references) string text = pathName.ToString().Substring(0, pathName.ToString().IndexOf(",")); string text2 = pathName.ToString().Substring(pathName.ToString().IndexOf(",") + 1); if (paths.ContainsKey(text.ToUpper())) { object obj = Reflection.Execute(Reflection.Method(_CreaturePresenter, "TryGetAsset", (string[])null), (object)null, new object[2] { Reflection.Property(_LocalClient, "SelectedCreatureId", (string)null).GetValue(null), null }, 0); Transform val = (Transform)Reflection.Field(obj.GetType(), "Rotator", (string)null).GetValue(obj); AssetDataPlugin.SetInfo(Reflection.Property(obj.GetType(), "CreatureId", (string)null).GetValue(obj).ToString(), "org.lordashes.plugins.automovecmm", pathName.ToString().ToUpper() + "," + new P3(val.position).ToString(), false); LoggingPlugin.LogDebug("Sending Path '" + pathName?.ToString() + "' Add Request To " + Reflection.Property(obj.GetType(), "CreatureId", (string)null).GetValue(obj)?.ToString() + " (" + Reflection.Property(obj.GetType(), "CreatureId", (string)null).GetValue(obj).ToString() + ")"); } else { Reflection.Execute(Reflection.Method(_SystemMessage, "DisplayInfoText", (string[])null), (object)null, new object[4] { "Path '" + pathName?.ToString() + "' Does Not Exist. No Path Added To Selected Creature.", Type.Missing, Type.Missing, Type.Missing }, 0); } } private void StartRecording(object pathName) { //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) object obj = Reflection.Execute(Reflection.Method(_CreaturePresenter, "TryGetAsset", (string[])null), (object)null, new object[2] { Reflection.Property(_LocalClient, "SelectedCreatureId", (string)null).GetValue(null), null }, 2); if (obj != null) { Transform val = (Transform)Reflection.Field(obj.GetType(), "Rotator", (string)null).GetValue(obj); newPath = new Path { name = pathName.ToString() }; recordingPositionReference = val.position; Reflection.Execute(Reflection.Method(_SystemMessage, "DisplayInfoText", (string[])null), (object)null, new object[4] { "Started Recording Path '" + pathName?.ToString() + "'. Step 1 recorded.", Type.Missing, Type.Missing, Type.Missing }, 0); newPath.steps.Add(new P3(Vector3.zero)); } } [IteratorStateMachine(typeof(d__39))] private IEnumerator MoveAssets(float stepDelay) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__39(0) { <>4__this = this, stepDelay = stepDelay }; } private void ModifyAssetPath(DatumChange change) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: 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_0103: Expected I4, but got Unknown LoggingPlugin.LogTrace("Path: ModifyAssetPath"); string[] obj = new string[5] { "Remote Path Request For Action ", null, null, null, null }; ChangeAction action = change.action; obj[1] = ((object)(ChangeAction)(ref action)).ToString(); obj[2] = " To Asset "; obj[3] = change.source; obj[4] = (((int)change.action != 1) ? (" And Value " + ((change.value == null) ? "Null" : change.value)) : ""); LoggingPlugin.LogDebug(string.Concat(obj)); if ((int)change.action == 0 && paths == null) { LoadPaths(); } LoggingPlugin.LogDebug("Number Of Paths Defined = " + ((paths != null) ? paths.Count.ToString() : "0")); string[] array = null; ChangeAction action2 = change.action; ChangeAction val = action2; switch ((int)val) { case 0: case 2: LoggingPlugin.LogTrace("Processing Initial/Add Request"); array = change.value.ToString().Split(new char[1] { ',' }); AddPath(change.source, array[0], float.Parse(array[1], CultureInfo.InvariantCulture), new P3(float.Parse(array[2], CultureInfo.InvariantCulture), float.Parse(array[3], CultureInfo.InvariantCulture), float.Parse(array[4], CultureInfo.InvariantCulture))); break; case 1: LoggingPlugin.LogTrace("Processing Remove Request"); RemovePath(change.source); break; case 3: LoggingPlugin.LogTrace("Processing Modify:Remove Request"); RemovePath(change.source); LoggingPlugin.LogTrace("Processing Modify:Add Request"); array = change.value.ToString().Split(new char[1] { ',' }); AddPath(change.source, array[0], float.Parse(array[1], CultureInfo.InvariantCulture), new P3(float.Parse(array[2], CultureInfo.InvariantCulture), float.Parse(array[3], CultureInfo.InvariantCulture), float.Parse(array[4], CultureInfo.InvariantCulture))); break; } LoggingPlugin.LogTrace("Path Exit: ModifyAssetPath"); } private void AddPath(object cidString, string pathName, float proximity, P3 startPos) { //IL_0186: Unknown result type (might be due to invalid IL or missing references) LoggingPlugin.LogTrace("Adding Path To Add Stack"); object obj = Reflection.New(_CreatureGuid, new object[1] { cidString.ToString() }); object obj2 = Reflection.Execute(Reflection.Method(_CreaturePresenter, "TryGetAsset", (string[])null), (object)null, new object[2] { obj, null }, 2); if (obj2 != null) { string text = Reflection.Property(_CreatureBoardAsset, "Name", (string)null).GetValue(obj2).ToString(); object obj3 = Reflection.Property(_CreatureBoardAsset, "CreatureId", (string)null).GetValue(obj2).ToString(); LoggingPlugin.LogDebug("Obtained reference to creature " + text + " (" + obj3?.ToString() + ")"); pathsToAdd.Add(new PathApplication { appliedAt = startPos, pathName = pathName.ToUpper(), asset = obj2, proximity = proximity, paused = false, step = ushort.MaxValue }); LoggingPlugin.LogDebug("Dropping creature " + text + " (" + obj3?.ToString() + "/" + obj?.ToString() + ")"); Reflection.Execute(Reflection.Method(_CreatureBoardAsset, "DropAtLocation", (string[])null), obj2, new object[1] { startPos.ToVector3() }, 0); LoggingPlugin.LogDebug("Displaying system message for creature " + text + " (" + obj3?.ToString() + "/" + obj?.ToString() + ")"); try { Reflection.Execute(Reflection.Method(_SystemMessage, "DisplayInfoText", (string[])null), (object)null, new object[4] { "Path '" + pathName + "' Added To Creature " + Reflection.Property(_CreatureBoardAsset, "Name", (string)null).GetValue(obj2)?.ToString() + " (" + obj.ToString() + ")", Type.Missing, Type.Missing, Type.Missing }, 0); } catch (Exception ex) { LoggingPlugin.LogDebug("Failed To Generate System Message"); Reflection.CatchFullError(ex); } LoggingPlugin.LogDebug("Path '" + pathName + "' Added To Creature " + Reflection.Property(_CreatureBoardAsset, "Name", (string)null).GetValue(obj2)?.ToString() + " (" + obj.ToString() + ")"); } else { LoggingPlugin.LogTrace("Referenced Asset Is Null"); } } private void RemovePath(object cid) { pathsToRemove.Add(cid); Reflection.Execute(Reflection.Method(_SystemMessage, "DisplayInfoText", (string[])null), (object)null, new object[4] { "Path Removed From Creature " + cid, Type.Missing, Type.Missing, Type.Missing }, 0); LoggingPlugin.LogDebug("Path Removed From Creature " + cid); } private void LoadPaths() { LoggingPlugin.LogTrace("Path: LoadPaths"); try { LoggingPlugin.LogDebug("Getting Path File Content"); string text = File.ReadAllText("org.lordashes.plugins.automovecmm.paths.json", (CacheType)999); LoggingPlugin.LogTrace("Path File Content:\r\n" + text); paths = new Dictionary(); Path[] array = JsonConvert.DeserializeObject(text); foreach (Path path in array) { paths.Add(path.name.ToUpper(), path); } LoggingPlugin.LogInfo("Loaded " + paths.Count + " Paths (" + string.Join(",", paths.Keys) + ")"); } catch (Exception ex) { LoggingPlugin.LogInfo("No Paths File Found. Error: " + ex.Message); paths = new Dictionary(); } LoggingPlugin.LogTrace("Path Exit: LoadPaths"); } [IteratorStateMachine(typeof(d__44))] private IEnumerator RegisterAssets(ReadOnlyDictionary existingAssets, Func, string, IEnumerator> callback) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__44(0) { <>4__this = this, existingAssets = existingAssets, callback = callback }; } [IteratorStateMachine(typeof(d__45))] private IEnumerator ProcessAssetSelection(AssetInfo info) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__45(0) { <>4__this = this, info = info }; } private void SetPath(AssetInfo info, object cid, float proximity, Transform rotator) { //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: 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_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) LoggingPlugin.LogDebug("Set Path " + info.name + " On Creature " + cid.ToString()); AssetDataPlugin.SetInfo(cid.ToString(), "org.lordashes.plugins.automovecmm", info.prefab + "," + proximity + "," + rotator.position.x + "," + rotator.position.y + "," + rotator.position.z, false); } public List GetAssetsByType(AssetType assetType) { List pcs = new List(); foreach (object key in ((Dictionary)Reflection.Field(_CampaignSessionManager, "PlayersInfo", (string)null).GetValue(null)).Keys) { string text = (string)Reflection.Execute(Reflection.Method(_CampaignSessionManager, "GetPlayerName", (string[])null), (object)null, new object[1] { key }, 0); LoggingPlugin.LogDebug("Checking Owned Assets Of Player " + text + " (" + key.ToString() + ")"); object[] array = null; Reflection.Execute(Reflection.Method(_CreatureManager, "TryGetPlayerOwnedCreatureIds", (string[])null), (object)null, new object[2] { key, array }, 0); LoggingPlugin.LogDebug("Player " + text + " (" + key.ToString() + ") Owns " + array.Length + " Assets (" + string.Join(",", array) + ")"); pcs.AddRange(array); } if (assetType == AssetType.pc) { return ((object[])Reflection.Execute(Reflection.Method(_CreaturePresenter, "GetTempReadOnlyViewOfAllCreatureAssets", (string[])null), (object)null, new object[0], 0)).Where((object a) => pcs.Contains(Reflection.Property(_CreatureBoardAsset, "CreatureId", (string)null).GetValue(a))).ToList(); } return ((object[])Reflection.Execute(Reflection.Method(_CreaturePresenter, "GetTempReadOnlyViewOfAllCreatureAssets", (string[])null), (object)null, new object[0], 0)).Where((object a) => !pcs.Contains(Reflection.Property(_CreatureBoardAsset, "CreatureId", (string)null).GetValue(a))).ToList(); } [IteratorStateMachine(typeof(d__49))] private IEnumerator WarnAboutLogLevel() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__49(0) { <>4__this = this }; } }