using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using DataModel; using HarmonyLib; using ModdingTales; using Newtonsoft.Json; using Spaghet.Runtime; using Unity.Mathematics; 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("TemplatePlugin")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Nth Dimension")] [assembly: AssemblyProduct("TemplatePlugin")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("TemplatePlugin")] [assembly: ComVisible(false)] [assembly: Guid("c303405d-e66c-4316-9cdb-4e3ca15c6360")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] namespace LordAshes; [BepInPlugin("org.lordashes.plugins.relay", "Relay Plugin", "2.0.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class RelayPlugin : BaseUnityPlugin { internal class HideImplementation { public static Guid subscription; public static void Start() { if (subscription != default(Guid)) { LoggingPlugin.LogDebug("Unsubscribing From Hide Subscription"); AssetDataPlugin.Unsubscribe(subscription); } LoggingPlugin.LogDebug("Subscribing To Hide Request"); subscription = AssetDataPlugin.Subscribe("org.lordashes.plugins.relay.hide", (Action)HideRequest); } public static void HideRequest(DatumChange change) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) LoggingPlugin.LogDebug("Notification: [Hide]: " + JsonConvert.SerializeObject((object)change)); CreatureBoardAsset val = null; CreaturePresenter.TryGetAsset(new CreatureGuid(change.source), ref val); if ((Object)(object)val != (Object)null) { LoggingPlugin.LogDebug("Setting Creature " + val.Name + " (" + ((object)val.CreatureId/*cast due to .constrained prefix*/).ToString() + ") Hide State To " + (change.value.ToString() != "0")); if (change.value.ToString() == "0") { CreatureManager.SetCreatureExplicitHideState(val.CreatureId, false); } else { CreatureManager.SetCreatureExplicitHideState(val.CreatureId, true); } } } } public static class InteractionsImplementation { public class P3 { public float x { get; set; } public float y { get; set; } public float z { get; set; } public static P3 FromFloat3(float3 f3) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) return new P3 { x = f3.x, y = f3.y, z = f3.z }; } public float3 ToFloat3() { //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 float3(x, y, z); } public override string ToString() { return "(" + x + "," + y + "," + z + ")"; } } [HarmonyPatch(typeof(Zone), "SendScriptMessage")] public static class PatchZoneSendScriptMessage { public static void Postfix(Zone __instance, in LocalMessageToScript message, ClientZoneData[] ____perClientZoneAssetData) { if (_LastObject != "") { string[] obj = new string[5] { "Object '", _LastObject, "' Has Changed To State '", null, null }; ushort expectededOpIndex = message.ExpectededOpIndex; obj[3] = expectededOpIndex.ToString(); obj[4] = "'"; LoggingPlugin.LogDebug(string.Concat(obj)); string lastObject = _LastObject; expectededOpIndex = message.ExpectededOpIndex; AssetDataPlugin.SetInfo(lastObject, "org.lordashes.plugins.relay.interaction", expectededOpIndex.ToString(), false); } } } [HarmonyPatch(typeof(PlaceableHandle), "Interact")] public static class PatchPlaceableHandleInteract { public static void Postfix(PlaceableHandle __instance, float3 pickPosition) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) _LastClick = pickPosition; float num = 999f; string text = ""; foreach (KeyValuePair interactiveObject in interactiveObjects) { float num2 = Vector3.Distance(float3.op_Implicit(pickPosition), float3.op_Implicit(interactiveObject.Value.ToFloat3())); LoggingPlugin.LogDebug("Analyzing '" + interactiveObject.Key + "' At " + interactiveObject.Value.ToString() + ", Dist: " + num2); if ((double)num2 < 2.0) { LoggingPlugin.LogTrace("Might Be '" + interactiveObject.Key + "'"); if (num2 < num) { num = num2; text = interactiveObject.Key; } } } if (num == 999f) { LoggingPlugin.LogDebug("Interaction: Not With A Monitoried Object"); _LastObject = ""; } else { LoggingPlugin.LogDebug("Interaction: With '" + text + "'"); _LastObject = text; } } } public static Dictionary interactiveObjects = new Dictionary(); public static float3 _LastClick = float3.zero; public static string _LastObject = ""; public static void Start() { try { string text = "org.lordashes.plugins.relay.Interaction." + ((object)Unsafe.As(ref BoardSessionManager.CurrentBoardInfo.CampaignId)/*cast due to .constrained prefix*/).ToString() + "." + ((object)Unsafe.As(ref BoardSessionManager.CurrentBoardInfo.Id)/*cast due to .constrained prefix*/).ToString() + ".json"; LoggingPlugin.LogDebug("Loading Object Interactions For '" + BoardSessionManager.CurrentBoardInfo.BoardName + "' (" + ((object)Unsafe.As(ref BoardSessionManager.CurrentBoardInfo.CampaignId)/*cast due to .constrained prefix*/).ToString() + ":" + ((object)Unsafe.As(ref BoardSessionManager.CurrentBoardInfo.Id)/*cast due to .constrained prefix*/).ToString() + ")"); if (File.Exists(text)) { string text2 = File.ReadAllText(text, (CacheType)999); interactiveObjects = JsonConvert.DeserializeObject>(text2); return; } LoggingPlugin.LogDebug("Missing Object Interactions File 'org.lordashes.plugins.relay." + ((object)Unsafe.As(ref BoardSessionManager.CurrentBoardInfo.CampaignId)/*cast due to .constrained prefix*/).ToString() + "." + ((object)Unsafe.As(ref BoardSessionManager.CurrentBoardInfo.Id)/*cast due to .constrained prefix*/).ToString() + "'"); interactiveObjects = new Dictionary(); } catch (Exception ex) { Reflection.CatchFullError(ex); } } } public static class Relayimplementation { public class Relay { public string trigger { get; set; } public string condition { get; set; } public string reaction { get; set; } public float reactionDelay { get; set; } = 0f; public string reactionAsset { get; set; } public string reactionValue { get; set; } public string description { get; set; } = "Relay"; } public class Relays { public Dictionary sources = new Dictionary(); public List relays = new List(); public Dictionary sinks = new Dictionary(); } private static Relays relays = null; public static List subscriptions = new List(); public static void Start() { try { LoggingPlugin.LogTrace("Reading Relay Configuration"); string text = "org.lordashes.plugins.relay.Relay." + ((object)Unsafe.As(ref BoardSessionManager.CurrentBoardInfo.CampaignId)/*cast due to .constrained prefix*/).ToString() + "." + ((object)Unsafe.As(ref BoardSessionManager.CurrentBoardInfo.Id)/*cast due to .constrained prefix*/).ToString() + ".json"; if (File.Exists(text)) { LoggingPlugin.LogDebug("Reading Relay Configuration '" + text + "' File"); relays = JsonConvert.DeserializeObject(File.ReadAllText(text, (CacheType)999)); } else { LoggingPlugin.LogDebug("Relay Configuration File '" + text + "' Mising"); } LoggingPlugin.LogDebug("Unsubscribing To Relay Sources"); foreach (Guid subscription in subscriptions) { LoggingPlugin.LogTrace("Unsubscribing To Relay Sources " + subscription); AssetDataPlugin.Unsubscribe(subscription); } subscriptions.Clear(); LoggingPlugin.LogDebug("Subscribing To Relay Sources"); foreach (KeyValuePair source in relays.sources) { LoggingPlugin.LogDebug("Subscribing To Relay Sources " + source.Key + " (" + source.Value + ")"); subscriptions.Add(AssetDataPlugin.Subscribe(source.Value, (Action)delegate(DatumChange change) { SubscriptionNotification(source.Key, change); })); } } catch (Exception ex) { Reflection.CatchFullError(ex); } } public static void SubscriptionNotification(string name, DatumChange change) { //IL_0446: Unknown result type (might be due to invalid IL or missing references) //IL_044b: Unknown result type (might be due to invalid IL or missing references) //IL_04f9: Unknown result type (might be due to invalid IL or missing references) //IL_04fe: Unknown result type (might be due to invalid IL or missing references) //IL_0177: 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_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_05b8: Unknown result type (might be due to invalid IL or missing references) //IL_0655: Unknown result type (might be due to invalid IL or missing references) //IL_061b: Unknown result type (might be due to invalid IL or missing references) //IL_0620: Unknown result type (might be due to invalid IL or missing references) //IL_06a4: Unknown result type (might be due to invalid IL or missing references) //IL_0741: Unknown result type (might be due to invalid IL or missing references) //IL_0707: Unknown result type (might be due to invalid IL or missing references) //IL_070c: Unknown result type (might be due to invalid IL or missing references) try { LoggingPlugin.LogDebug("Notification: [" + name + "]: " + JsonConvert.SerializeObject((object)change)); foreach (Relay item in relays.relays.Where((Relay r) => r.trigger == name)) { LoggingPlugin.LogDebug("Evaluation: [" + name + "]: Condition: " + item.condition); bool flag = true; string reactionAsset = item.reactionAsset; string text = ((item.reactionValue != null) ? item.reactionValue : ""); CreatureBoardAsset val = null; try { CreaturePresenter.TryGetAsset(new CreatureGuid(change.source.ToString()), ref val); } catch { } bool flag2 = (Object)(object)val != (Object)null && isPC(val); if (item.condition != "") { string[] array = item.condition.Split(new char[1] { '|' }); if (array.Length == 1) { array = new string[2] { "{V}", array[0] }; } array[0] = array[0].Replace("{?}", flag2 ? "T" : "F"); array[0] = array[0].Replace("{A}", ((object)change.action/*cast due to .constrained prefix*/).ToString()); array[0] = array[0].Replace("{K}", change.key.ToString()); array[0] = array[0].Replace("{N}", ((Object)(object)val != (Object)null) ? val.Name : change.source.ToString()); array[0] = array[0].Replace("{P}", change.previous.ToString()); array[0] = array[0].Replace("{S}", change.source.ToString()); array[0] = array[0].Replace("{V}", change.value.ToString()); Regex regex = new Regex(array[1]); flag = regex.IsMatch(array[0]); LoggingPlugin.LogTrace("Evaluation: [" + name + "]: Match: " + flag + ", Input: " + array[0] + ", Condition: " + array[1]); if (flag) { MatchCollection matchCollection = regex.Matches(array[0]); LoggingPlugin.LogTrace("Evaluation: [" + name + "]: Matches: " + ((matchCollection != null) ? matchCollection.Count.ToString() : "Null")); int num = 0; foreach (Match item2 in matchCollection) { num++; LoggingPlugin.LogTrace("Evaluation: [" + name + "]: Replacing {" + num + "} With " + item2.Value.ToString()); text = text.Replace("{" + num + "}", item2.Value.ToString()); LoggingPlugin.LogTrace("Evaluation: [" + name + "]: Replacing $ Reference"); text = ((text.IndexOf("$") > -1) ? item2.Result(text) : text); } LoggingPlugin.LogTrace("Evaluation: [" + name + "]: Reaction: " + item.reaction + ", Request: " + text); } } if (!flag) { continue; } text = text.Replace("{A}", ((object)change.action/*cast due to .constrained prefix*/).ToString()); text = text.Replace("{K}", change.key.ToString()); text = text.Replace("{N}", ((Object)(object)val != (Object)null) ? val.Name : change.source.ToString()); text = text.Replace("{P}", change.previous.ToString()); text = text.Replace("{S}", change.source.ToString()); text = text.Replace("{V}", change.value.ToString()); reactionAsset = reactionAsset.Replace("{A}", ((object)change.action/*cast due to .constrained prefix*/).ToString()); reactionAsset = reactionAsset.Replace("{K}", change.key.ToString()); reactionAsset = reactionAsset.Replace("{N}", ((Object)(object)val != (Object)null) ? val.Name : change.source.ToString()); reactionAsset = reactionAsset.Replace("{P}", change.previous.ToString()); reactionAsset = reactionAsset.Replace("{S}", change.source.ToString()); reactionAsset = reactionAsset.Replace("{V}", change.value.ToString()); string nameRef; for (nameRef = GetFirstBracketValue(text); nameRef != null; nameRef = GetFirstBracketValue(text)) { CreatureBoardAsset val2 = ((IEnumerable)(object)CreaturePresenter.GetTempReadOnlyViewOfAllCreatureAssets()).Where((CreatureBoardAsset cba) => cba.Name.ToLower() == nameRef.ToLower()).FirstOrDefault(); text = ((!((Object)(object)val2 != (Object)null)) ? text.Replace("{" + nameRef + "}", ((object)default(CreatureGuid)/*cast due to .constrained prefix*/).ToString()) : text.Replace("{" + nameRef + "}", ((object)val2.CreatureId/*cast due to .constrained prefix*/).ToString())); } for (nameRef = GetFirstBracketValue(reactionAsset); nameRef != null; nameRef = GetFirstBracketValue(reactionAsset)) { CreatureBoardAsset val3 = ((IEnumerable)(object)CreaturePresenter.GetTempReadOnlyViewOfAllCreatureAssets()).Where((CreatureBoardAsset cba) => cba.Name.ToLower() == nameRef.ToLower()).FirstOrDefault(); reactionAsset = ((!((Object)(object)val3 != (Object)null)) ? reactionAsset.Replace("{" + nameRef + "}", ((object)default(CreatureGuid)/*cast due to .constrained prefix*/).ToString()) : reactionAsset.Replace("{" + nameRef + "}", ((object)val3.CreatureId/*cast due to .constrained prefix*/).ToString())); } LoggingPlugin.LogDebug("Requesting: [" + item.reaction + "]: Asset: " + reactionAsset + ", Sink: " + relays.sinks[item.reaction] + ", Request: " + text); ((MonoBehaviour)_self).StartCoroutine(Reaction(item.reactionDelay, reactionAsset, relays.sinks[item.reaction], text)); } } catch (Exception ex) { Reflection.CatchFullError(ex); } } private static IEnumerator Reaction(float delay, string source, string key, string value) { LoggingPlugin.LogTrace("Delaying: Source: " + source + ", key: " + key + ", Value: " + value); yield return (object)new WaitForSeconds(delay); LoggingPlugin.LogTrace("Triggering: Source: " + source + ", key: " + key + ", Value: " + value); AssetDataPlugin.SetInfo(source, key, value, false); } public static string GetFirstBracketValue(string input) { Match match = Regex.Match(input, "\\{(.{2,})\\}"); return match.Success ? match.Groups[1].Value : null; } public static bool isPC(CreatureBoardAsset cba) { //IL_0016: 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) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) foreach (PlayerGuid key in CampaignSessionManager.PlayersInfo.Keys) { if (CreatureManager.PlayerOwnsCreature(key, cba.CreatureId)) { return true; } } return false; } } public const string Name = "Relay Plugin"; public const string Guid = "org.lordashes.plugins.relay"; public const string Version = "2.0.0.0"; public const string Author = "Lord Ashes"; public static RelayPlugin _self; 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Expected O, but got Unknown _self = this; LoggingPlugin.SetLogLevel(((BaseUnityPlugin)this).Config.Bind("Settings", "Diagnostic Level", (DiagnosticLevel)3, (ConfigDescription)null).Value); Debug.Log((object)(((object)this).GetType().AssemblyQualifiedName + ": Active. (Diagnostic Mode = " + ((object)LoggingPlugin.GetLogLevel()/*cast due to .constrained prefix*/).ToString() + ")")); Harmony val = new Harmony("org.lordashes.plugins.relay"); val.PatchAll(); BoardSessionManager.OnCurrentBoardChanged += delegate { Relayimplementation.Start(); InteractionsImplementation.Start(); }; Relayimplementation.Start(); InteractionsImplementation.Start(); HideImplementation.Start(); ModdingUtils.AddPluginToMenuList((BaseUnityPlugin)(object)this, "Lord Ashes'"); } private void Update() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) KeyboardShortcut val = new KeyboardShortcut((KeyCode)96, Array.Empty()); if (((KeyboardShortcut)(ref val)).IsUp()) { SystemMessage.AskForTextInput("Interactive Object:", "Name:", "Add", (Action)delegate(string s) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) InteractionsImplementation.interactiveObjects.Add(s, InteractionsImplementation.P3.FromFloat3(InteractionsImplementation._LastClick)); SystemMessage.DisplayInfoText("Added '" + s + "' At " + ((object)Unsafe.As(ref InteractionsImplementation._LastClick)/*cast due to .constrained prefix*/).ToString(), 2.5f, 0f, (Action)null); LoggingPlugin.LogInfo("File: org.lordashes.plugins.relay." + ((object)Unsafe.As(ref BoardSessionManager.CurrentBoardInfo.CampaignId)/*cast due to .constrained prefix*/).ToString() + "." + ((object)Unsafe.As(ref BoardSessionManager.CurrentBoardInfo.Id)/*cast due to .constrained prefix*/).ToString()); LoggingPlugin.LogInfo(JsonConvert.SerializeObject((object)InteractionsImplementation.interactiveObjects, (Formatting)1)); }, (Action)null, "Cancel", (Action)null, "Bob"); } } }