using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security.Cryptography;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using Bounce.Singletons;
using Bounce.Unmanaged;
using Newtonsoft.Json;
using RadialUI;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("LightPlugin")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("LightPlugin")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("LightPlugin")]
[assembly: ComVisible(false)]
[assembly: Guid("c303405d-e66c-4316-9cdb-4e3ca15c6360")]
[assembly: AssemblyFileVersion("2.7.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("2.7.0.0")]
namespace LordAshes;
[BepInPlugin("org.lordashes.plugins.light", "Light Plug-In", "2.7.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.*/)]
public class LightPlugin : BaseUnityPlugin
{
public static class Utility
{
public static bool isBoardLoaded()
{
return SimpleSingletonBehaviour<CameraController>.HasInstance && SingletonStateMBehaviour<BoardSessionManager, State<BoardSessionManager>>.HasInstance && !BoardSessionManager.IsLoading;
}
public static Guid GuidFromString(string input)
{
using MD5 mD = MD5.Create();
byte[] b = mD.ComputeHash(Encoding.Default.GetBytes(input));
return new Guid(b);
}
public static GameObject GetBaseLoader(CreatureGuid cid)
{
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
try
{
CreatureBoardAsset val = null;
CreaturePresenter.TryGetAsset(cid, ref val);
if ((Object)(object)val != (Object)null)
{
Transform match = null;
Traverse(((Component)val).transform, "BaseLoader", 0, 10, ref match);
if ((Object)(object)match != (Object)null)
{
Debug.Log((object)("Light Plug-In: Base Loader '" + ((Object)match.GetChild(0)).name + "' Found"));
return ((Component)match.GetChild(0)).gameObject;
}
Debug.LogWarning((object)"Light Plug-In: Could Not Find Base Loader");
return null;
}
return null;
}
catch
{
return null;
}
}
public static GameObject GetAssetLoader(CreatureGuid cid)
{
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
try
{
CreatureBoardAsset val = null;
CreaturePresenter.TryGetAsset(cid, ref val);
if ((Object)(object)val != (Object)null)
{
Transform match = null;
Traverse(((Component)val).transform, "AssetLoader", 0, 10, ref match);
if ((Object)(object)match != (Object)null)
{
Debug.Log((object)("Light Plug-In: Asset Loader '" + ((Object)match.GetChild(0)).name + "' Found"));
return ((Component)match.GetChild(0)).gameObject;
}
Debug.LogWarning((object)"Light Plug-In: Could Not Find Asset Loader");
return null;
}
return null;
}
catch
{
return null;
}
}
public static void Traverse(Transform root, string seek, int depth, int depthMax, ref Transform match)
{
try
{
if ((Object)(object)match != (Object)null)
{
return;
}
if (((Object)root).name == seek)
{
match = root;
return;
}
foreach (Transform item in ExtensionMethods.Children(root))
{
if (depth < depthMax)
{
Traverse(item, seek, depth + 1, depthMax, ref match);
}
}
}
catch
{
}
}
public static float ParseFloat(string value)
{
return float.Parse(value, CultureInfo.InvariantCulture);
}
public static string GetCreatureName(string nameBlock)
{
if (nameBlock == null)
{
return "(Unknown)";
}
if (!nameBlock.Contains("<size=0>"))
{
return nameBlock;
}
return nameBlock.Substring(0, nameBlock.IndexOf("<size=0>")).Trim();
}
public static void PostOnMainPage(MemberInfo plugin)
{
SceneManager.sceneLoaded += delegate(Scene scene, LoadSceneMode mode)
{
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Expected O, but got Unknown
try
{
if (((Scene)(ref scene)).name == "UI")
{
TextMeshProUGUI uITextByName = GetUITextByName("BETA");
if (Object.op_Implicit((Object)(object)uITextByName))
{
((TMP_Text)uITextByName).text = "INJECTED BUILD - unstable mods";
}
}
else
{
TextMeshProUGUI uITextByName2 = GetUITextByName("TextMeshPro Text");
if (Object.op_Implicit((Object)(object)uITextByName2))
{
BepInPlugin val = (BepInPlugin)Attribute.GetCustomAttribute(plugin, typeof(BepInPlugin));
if (((TMP_Text)uITextByName2).text.EndsWith("</size>"))
{
((TMP_Text)uITextByName2).text = ((TMP_Text)uITextByName2).text + "\n\nMods Currently Installed:\n";
}
TextMeshProUGUI val2 = uITextByName2;
((TMP_Text)val2).text = ((TMP_Text)val2).text + "\nLord Ashes' " + val.Name + " - " + val.Version;
}
}
}
catch (Exception ex)
{
Debug.Log((object)ex);
}
};
}
private static TextMeshProUGUI GetUITextByName(string name)
{
TextMeshProUGUI[] array = Object.FindObjectsOfType<TextMeshProUGUI>();
for (int i = 0; i < array.Length; i++)
{
if (((Object)array[i]).name == name)
{
return array[i];
}
}
return null;
}
}
public enum SubscriptionState
{
unsubscribed,
waiting,
subscribed
}
public class F3
{
public float x { get; set; } = 0f;
public float y { get; set; } = 0f;
public float z { get; set; } = 0f;
public F3()
{
}
public F3(float x, float y, float z)
{
this.x = x;
this.y = y;
this.z = 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 Vector3 ToVector3FromTalespireToUnity()
{
//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, z, y);
}
}
public class LightBehaviour
{
public bool flicker { get; set; } = false;
public float intensityMin { get; set; } = 0f;
public float intensityMax { get; set; } = 0f;
public float deltaMax { get; set; } = 0f;
public bool sight { get; set; } = false;
public bool hiddenBase { get; set; } = false;
}
public class LightMenu
{
public string iconName { get; set; } = "Light.png";
public bool onlyGM { get; set; } = false;
public string menuNode { get; set; } = "";
public string menuLink { get; set; } = "";
}
public class LightProperties
{
public LightType type { get; set; } = (LightType)0;
public Color color { get; set; } = Color.FromArgb(255, 255, 255, 255);
public float range { get; set; } = 3.5f;
public float spotAngle { get; set; } = 25f;
public LightShadows shadows { get; set; } = (LightShadows)2;
}
public class LightSpecs
{
public string name { get; set; } = "Light";
public LightProperties specs { get; set; } = new LightProperties();
public F3 position { get; set; } = null;
public F3 rotation { get; set; } = null;
public LightBehaviour behaviour { get; set; } = new LightBehaviour();
public LightMenu menu { get; set; } = new LightMenu();
}
public class LegacyLightSpecs
{
public string name { get; set; } = "Light";
public LightType lightType { get; set; } = (LightType)2;
public LightShadows shadowType { get; set; } = (LightShadows)2;
public string iconName { get; set; } = "Light.png";
public float intensity { get; set; } = 0.01f;
public Color color { get; set; } = Color.FromArgb(255, 255, 128);
public float range { get; set; } = 2f;
public string pos { get; set; } = "0,0.75,0";
public string rot { get; set; } = "90,0,0";
public float spotAngle { get; set; } = 15f;
public bool flicker { get; set; } = false;
public float intensityMin { get; set; } = 0f;
public float deltaMax { get; set; } = 0f;
public bool sight { get; set; } = false;
public bool hiddenBase { get; set; } = false;
public bool onlyGM { get; set; } = false;
public string menuNode { get; set; } = "";
public string menuLink { get; set; } = "";
}
public const string Name = "Light Plug-In";
public const string Guid = "org.lordashes.plugins.light";
public const string Version = "2.7.0.0";
public const string Author = "Lord Ashes";
public static string configLocation = "";
public static Dictionary<string, LightSpecs> lights = new Dictionary<string, LightSpecs>();
private GuiMenu menu = new GuiMenu();
private static float intensityMultiplier = 300f;
private int flickerSequencer = 0;
private int flickerSteps = 20;
private SubscriptionState subscription = SubscriptionState.unsubscribed;
private static LightPlugin self = null;
private static ConcurrentQueue<DatumChange[]> backlog = new ConcurrentQueue<DatumChange[]>();
private ConfigEntry<KeyboardShortcut> triggerManualApply { get; set; }
private ConfigEntry<KeyboardShortcut> triggerRereadConfig { get; set; }
private ConfigEntry<float> subscriptionDelay { get; set; }
private MenuStyle menuStyle { get; set; }
private Color menuLinkColor { get; set; }
private Color menuSelectionColor { get; set; }
public void RadialMenuRequest(CreatureGuid cid, NGuid rid, string lightName)
{
if (lightName == "None")
{
Debug.Log((object)"Light Plugin: Requesting No Light");
AssetDataPlugin.ClearInfo(((object)(NGuid)(ref rid)).ToString(), "org.lordashes.plugins.light", false);
}
else if (lights.ContainsKey(lightName))
{
AssetDataPlugin.SetInfo(((object)(NGuid)(ref rid)).ToString(), "org.lordashes.plugins.light", lightName, false);
}
else
{
Debug.Log((object)("Light Plugin: Don't Seem To Have A '" + lightName + "' Light"));
}
}
public void LightRequest(DatumChange change)
{
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
//IL_00e4: Invalid comparison between Unknown and I4
//IL_0118: Unknown result type (might be due to invalid IL or missing references)
//IL_0234: Unknown result type (might be due to invalid IL or missing references)
//IL_02a9: Unknown result type (might be due to invalid IL or missing references)
//IL_018d: Unknown result type (might be due to invalid IL or missing references)
//IL_02f1: Unknown result type (might be due to invalid IL or missing references)
//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
Debug.Log((object)"Light Plugin: Changes Received");
if (subscription != SubscriptionState.subscribed)
{
Debug.Log((object)"Light Plugin: Addings Changes To Backlog");
backlog.Enqueue((DatumChange[])(object)new DatumChange[1] { change });
return;
}
string[] obj = new string[11]
{
"Light Plugin: Change '", null, null, null, null, null, null, null, null, null,
null
};
ChangeAction action = change.action;
obj[1] = ((object)(ChangeAction)(ref action)).ToString();
obj[2] = "' for '";
obj[3] = change.source;
obj[4] = "' from '";
obj[5] = change.previous?.ToString();
obj[6] = "' To '";
obj[7] = change.value?.ToString();
obj[8] = "' (";
obj[9] = change.key;
obj[10] = ")";
Debug.Log((object)string.Concat(obj));
bool flag = true;
if ((int)change.action != 1)
{
flag = !lights[change.value.ToString()].behaviour.sight || LocalClient.CanControlCreature(new CreatureGuid(change.source));
Debug.Log((object)("Light Plugin: Processing A '" + change.value?.ToString() + "' Light Request (Sight Light: " + lights[change.value.ToString()].behaviour.sight + " | Controlled: " + LocalClient.CanControlCreature(new CreatureGuid(change.source)) + " => " + flag + ")"));
if (flag)
{
ProcessRequest(new CreatureGuid(change.source), change.value.ToString());
}
}
else
{
flag = !(change.previous.ToString() != "") || !lights[change.previous.ToString()].behaviour.sight || LocalClient.CanControlCreature(new CreatureGuid(change.source));
Debug.Log((object)("Light Plugin: Processing A No Light Request (Sight Light: " + ((change.previous.ToString() != "") ? lights[change.previous.ToString()].behaviour.sight.ToString() : "N/A") + " | Controlled: " + LocalClient.CanControlCreature(new CreatureGuid(change.source)) + " => " + flag + ")"));
if (flag)
{
ProcessRequest(new CreatureGuid(change.source), "");
}
}
}
private void ProcessRequest(CreatureGuid cid, string lightName)
{
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
if (lightName != "")
{
ProcessLightRequest(cid, lights[lightName]);
}
else
{
ProcessLightRequest(cid, null);
}
}
private void ProcessLightRequest(CreatureGuid cid, LightSpecs ls)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
//IL_00ad: Expected O, but got Unknown
//IL_0175: Unknown result type (might be due to invalid IL or missing references)
//IL_01ed: Unknown result type (might be due to invalid IL or missing references)
//IL_0223: Unknown result type (might be due to invalid IL or missing references)
//IL_0234: Unknown result type (might be due to invalid IL or missing references)
//IL_0255: Unknown result type (might be due to invalid IL or missing references)
//IL_0264: Unknown result type (might be due to invalid IL or missing references)
//IL_0276: Unknown result type (might be due to invalid IL or missing references)
//IL_02a1: Unknown result type (might be due to invalid IL or missing references)
//IL_02c1: Unknown result type (might be due to invalid IL or missing references)
//IL_0335: Unknown result type (might be due to invalid IL or missing references)
//IL_0379: Unknown result type (might be due to invalid IL or missing references)
//IL_037e: Unknown result type (might be due to invalid IL or missing references)
//IL_0382: Unknown result type (might be due to invalid IL or missing references)
//IL_03a3: Unknown result type (might be due to invalid IL or missing references)
//IL_03c3: Unknown result type (might be due to invalid IL or missing references)
//IL_03f9: Unknown result type (might be due to invalid IL or missing references)
//IL_0406: Unknown result type (might be due to invalid IL or missing references)
CreatureBoardAsset val = default(CreatureBoardAsset);
CreaturePresenter.TryGetAsset(cid, ref val);
if (ls != null)
{
GameObject val2 = null;
GameObject[] array = Object.FindObjectsOfType<GameObject>();
foreach (GameObject val3 in array)
{
if (((Object)val3).name.StartsWith("Effect:Light:") && ((Object)val3).name.EndsWith(((object)(CreatureGuid)(ref cid)).ToString()))
{
val2 = val3;
break;
}
}
if ((Object)(object)val2 == (Object)null)
{
Debug.Log((object)"Light Plugin: Creating New Light Socket");
val2 = new GameObject("Effect:Light:" + ((object)(CreatureGuid)(ref cid)).ToString());
((Object)val2).name = "Effect:Light:" + ((object)(CreatureGuid)(ref cid)).ToString();
}
Light val4 = val2.GetComponent<Light>();
if ((Object)(object)val4 == (Object)null)
{
Debug.Log((object)"Light Plugin: Creating New Light");
val4 = val2.AddComponent<Light>();
((Object)val4).name = "Effect:Light:" + ((object)(CreatureGuid)(ref cid)).ToString();
}
Debug.Log((object)("Light Plugin: Applying:\r\n" + JsonConvert.SerializeObject((object)ls)));
Debug.Log((object)"Light Plugin: Adjusting The Light");
((Object)val4).name = "Effect:Light:" + ls.name + ":" + ((object)(CreatureGuid)(ref cid)).ToString();
val4.intensity = ls.behaviour.intensityMax;
val4.type = ls.specs.type;
val4.color = new Color((float)(int)ls.specs.color.R / 255f, (float)(int)ls.specs.color.G / 255f, (float)(int)ls.specs.color.B / 255f, (float)(int)ls.specs.color.A / 255f);
val4.range = ls.specs.range;
val4.spotAngle = ls.specs.spotAngle;
val4.shadows = ls.specs.shadows;
Debug.Log((object)("Light Plugin: Color = " + Convert.ToString(val4.color)));
val2.transform.position = Utility.GetBaseLoader(val.CreatureId).transform.position;
val2.transform.SetParent(Utility.GetBaseLoader(val.CreatureId).transform);
Debug.Log((object)("Light Plugin: Secured Light To Base (Pos: " + Convert.ToString(val2.transform.position) + ", Rot: " + Convert.ToString(val2.transform.eulerAngles) + ")"));
Debug.Log((object)("Light Plugin: Light Offset (Pos: " + JsonConvert.SerializeObject((object)ls.position) + ", Rot: " + JsonConvert.SerializeObject((object)ls.rotation) + ")"));
val2.transform.localPosition = ls.position.ToVector3FromTalespireToUnity();
Transform transform = val2.transform;
Quaternion val5 = Quaternion.Euler(ls.rotation.x - 90f, ls.rotation.y + 180f, ls.rotation.z + 180f);
transform.localEulerAngles = ((Quaternion)(ref val5)).eulerAngles;
Debug.Log((object)("Light Plugin: Adjusting Light Position (Pos: " + Convert.ToString(val2.transform.localPosition) + ", Rot: " + Convert.ToString(val2.transform.localEulerAngles) + ")"));
if (ls.behaviour.hiddenBase)
{
CreatureManager.SetCreatureExplicitHideState(val.CreatureId, true);
CreatureManager.SetCreatureName(val.CreatureId, "<color=red>");
}
Debug.Log((object)"Light Plugin: Light Ready");
return;
}
Debug.Log((object)"Light Plugin: Extinguishing Light");
GameObject val6 = null;
GameObject[] array2 = Object.FindObjectsOfType<GameObject>();
foreach (GameObject val7 in array2)
{
if (((Object)val7).name.StartsWith("Effect:Light:") && ((Object)val7).name.EndsWith(((object)(CreatureGuid)(ref cid)).ToString()))
{
val6 = val7;
break;
}
}
if ((Object)(object)val6 != (Object)null)
{
Object.Destroy((Object)(object)val6);
}
Debug.Log((object)"Light Plugin: Light Removed");
}
private void Awake()
{
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
//IL_0130: Unknown result type (might be due to invalid IL or missing references)
//IL_0255: Unknown result type (might be due to invalid IL or missing references)
//IL_025a: Unknown result type (might be due to invalid IL or missing references)
//IL_0265: Unknown result type (might be due to invalid IL or missing references)
//IL_027a: Unknown result type (might be due to invalid IL or missing references)
//IL_028c: Unknown result type (might be due to invalid IL or missing references)
//IL_02b7: Expected O, but got Unknown
//IL_034f: Unknown result type (might be due to invalid IL or missing references)
//IL_0354: Unknown result type (might be due to invalid IL or missing references)
//IL_035b: Expected O, but got Unknown
//IL_04af: Unknown result type (might be due to invalid IL or missing references)
//IL_04d6: Unknown result type (might be due to invalid IL or missing references)
//IL_04e0: Expected O, but got Unknown
//IL_040e: Unknown result type (might be due to invalid IL or missing references)
//IL_0435: Unknown result type (might be due to invalid IL or missing references)
//IL_043f: Expected O, but got Unknown
self = this;
Debug.Log((object)("Light Plugin: " + ((object)this).GetType().AssemblyQualifiedName + " Is Active."));
flickerSteps = ((BaseUnityPlugin)this).Config.Bind<int>("Settings", "Updates per flicker update", 20, (ConfigDescription)null).Value;
menuStyle = ((BaseUnityPlugin)this).Config.Bind<MenuStyle>("Settings", "GUI menu style", (MenuStyle)0, (ConfigDescription)null).Value;
menuLinkColor = ((BaseUnityPlugin)this).Config.Bind<Color>("Settings", "GUI menu link color", Color.black, (ConfigDescription)null).Value;
menuSelectionColor = ((BaseUnityPlugin)this).Config.Bind<Color>("Settings", "GUI menu selection color", Color.gray, (ConfigDescription)null).Value;
subscriptionDelay = ((BaseUnityPlugin)this).Config.Bind<float>("Settings", "Startup light application delay", 10f, (ConfigDescription)null);
triggerManualApply = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Hotkeys", "Manual re-apply of lights", new KeyboardShortcut((KeyCode)114, (KeyCode[])(object)new KeyCode[1] { (KeyCode)305 }), (ConfigDescription)null);
triggerRereadConfig = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Hotkeys", "Reread lights configuration", new KeyboardShortcut((KeyCode)108, (KeyCode[])(object)new KeyCode[1] { (KeyCode)305 }), (ConfigDescription)null);
ReadConfiguration(ref lights);
Debug.Log((object)"Light Plugin: Detecting Usage Of Sub-Menus");
bool flag = false;
foreach (LightSpecs value in lights.Values)
{
if (value.menu.menuNode != "")
{
flag = true;
break;
}
}
if (flag)
{
Debug.Log((object)"Light Plugin: Using GUI Menus With Hierarchy.");
Debug.Log((object)"Light Plugin: Adding Extinguish Light Option");
LightSpecs lightSpecs = new LightSpecs
{
name = "None",
menu = new LightMenu
{
iconName = "None.png",
menuNode = "Root"
}
};
if (lights.ContainsKey(lightSpecs.name))
{
lights.Remove(lightSpecs.name);
}
lights.Add(lightSpecs.name, lightSpecs);
Debug.Log((object)"Light Plugin: Adding Light Options");
RadialUIPlugin.AddCustomButtonOnCharacter("org.lordashes.plugins.light", new ItemArgs
{
Title = "Light",
Icon = Image.LoadSprite("Light.png", (CacheType)999),
Action = delegate
{
Debug.Log((object)"Light Plugin: Opening GUI Menu");
menu.Open("Root", (Action<string>)LightSelectionHandler);
},
CloseMenuOnActivate = true
}, (Func<NGuid, NGuid, bool>)((NGuid guid1, NGuid guid2) => true));
foreach (LightSpecs value2 in lights.Values)
{
if (menu.GetNode(value2.menu.menuNode) == null)
{
Debug.Log((object)("Light Plugin: Making Node '" + value2.menu.menuNode + "' For '" + value2.name + "'"));
MenuNode val = new MenuNode(value2.menu.menuNode, (IMenuItem[])(object)new IMenuItem[0], menuStyle);
menu.AddNode(val);
}
if (value2.menu.menuLink != "")
{
Debug.Log((object)("Light Plugin: Adding Link '" + value2.menu.menuLink + "' To Node '" + value2.menu.menuNode + "' For '" + value2.name + "'"));
menu.GetNode(value2.menu.menuNode).AddLink(new MenuLink(value2.menu.menuLink, value2.name, menuLinkColor, Image.LoadTexture(value2.menu.iconName, (CacheType)999), value2.menu.onlyGM));
}
else
{
Debug.Log((object)("Light Plugin: Adding Selection '" + value2.name + "' To Node '" + value2.menu.menuNode + "'"));
menu.GetNode(value2.menu.menuNode).AddSelection(new MenuSelection(value2.name, value2.name, menuSelectionColor, Image.LoadTexture(value2.menu.iconName, (CacheType)999), value2.menu.onlyGM));
Debug.Log((object)"Light Plugin: Adding To Light Dictionary");
}
}
}
else
{
Debug.Log((object)"Light Plugin: Using Flat Radial Menu.");
Debug.Log((object)"Light Plugin: Adding Extinguish Light Option");
LightSpecs lightSpecs2 = new LightSpecs
{
name = "None",
menu = new LightMenu
{
iconName = "None.png"
}
};
if (lights.ContainsKey(lightSpecs2.name))
{
lights.Remove(lightSpecs2.name);
}
lights.Add(lightSpecs2.name, lightSpecs2);
Debug.Log((object)"Light Plugin: Adding Light Options");
RadialSubmenu.EnsureMainMenuItem("org.lordashes.plugins.light", (MenuType)1, "Light", Image.LoadSprite("Light.png", (CacheType)999));
foreach (LightSpecs light in lights.Values)
{
RadialSubmenu.CreateSubMenuItem("org.lordashes.plugins.light", light.name, Image.LoadSprite(light.menu.iconName, (CacheType)999), (Action<CreatureGuid, string, MapMenuItem>)delegate(CreatureGuid cid, string s, MapMenuItem mmi)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
RadialMenuRequest(cid, RadialUIPlugin.GetLastRadialTargetCreature(), light.name);
}, true, (Func<bool>)delegate
{
//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)
bool isInGmMode = LocalClient.IsInGmMode;
return (LocalClient.CanControlCreature(new CreatureGuid(RadialUIPlugin.GetLastRadialTargetCreature())) && (isInGmMode || !light.menu.onlyGM)) ? true : false;
});
}
}
AssetDataPlugin.Subscribe("org.lordashes.plugins.light", (Action<DatumChange>)LightRequest);
Utility.PostOnMainPage(((object)this).GetType());
}
private IEnumerator DelayLightSubscription(float delay)
{
Debug.Log((object)"Light Plugin: Delaying Light Message Processing");
subscription = SubscriptionState.waiting;
yield return (object)new WaitForSeconds(delay);
if (subscription == SubscriptionState.waiting)
{
Debug.Log((object)"Light Plugin: Start Light Message Processing");
subscription = SubscriptionState.subscribed;
}
}
private void LightSelectionHandler(string lightName)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
RadialMenuRequest(LocalClient.SelectedCreatureId, RadialUIPlugin.GetLastRadialTargetCreature(), lightName);
}
private void Update()
{
//IL_0344: Unknown result type (might be due to invalid IL or missing references)
//IL_0349: Unknown result type (might be due to invalid IL or missing references)
//IL_0376: Unknown result type (might be due to invalid IL or missing references)
//IL_037b: Unknown result type (might be due to invalid IL or missing references)
//IL_0113: Unknown result type (might be due to invalid IL or missing references)
//IL_0118: Unknown result type (might be due to invalid IL or missing references)
//IL_02e2: Unknown result type (might be due to invalid IL or missing references)
if (Utility.isBoardLoaded())
{
if (subscription == SubscriptionState.unsubscribed)
{
subscription = SubscriptionState.waiting;
Debug.Log((object)"Light Plugin: Board Loaded");
((MonoBehaviour)self).StartCoroutine(DelayLightSubscription(subscriptionDelay.Value));
}
if (backlog.Count > 0 && subscription == SubscriptionState.subscribed)
{
Debug.Log((object)("Light Plugin: Backlog=" + backlog.Count + ". Processing..."));
DatumChange[] result = null;
if (backlog.TryDequeue(out result))
{
DatumChange[] array = result;
foreach (DatumChange change in array)
{
LightRequest(change);
}
}
}
flickerSequencer++;
if (flickerSequencer >= flickerSteps)
{
flickerSequencer = 0;
}
if (flickerSequencer == 0)
{
foreach (CreatureBoardAsset item in (IEnumerable<CreatureBoardAsset>)CreaturePresenter.GetTempReadOnlyViewOfAllCreatureAssets())
{
Light componentInChildren = ((Component)item).GetComponentInChildren<Light>();
if ((Object)(object)componentInChildren != (Object)null && ((Object)componentInChildren).name.StartsWith("Effect:Light:"))
{
string text = ((Object)componentInChildren).name.Substring("Effect:Light:".Length);
text = text.Substring(0, text.IndexOf(":"));
if (lights.ContainsKey(text) && lights[text].behaviour.flicker)
{
Random random = new Random();
float num = random.Next(0, 100);
float intensity = num / 100f * (lights[text].behaviour.intensityMax - lights[text].behaviour.intensityMin) + lights[text].behaviour.intensityMin;
componentInChildren.intensity = intensity;
float num2 = lights[text].behaviour.deltaMax * (float)random.Next(0, 100) / 100f;
float num3 = lights[text].behaviour.deltaMax * (float)random.Next(0, 100) / 100f;
((Component)componentInChildren).transform.localPosition = new Vector3(lights[text].position.x + num2, lights[text].position.y, lights[text].position.z + num3);
}
}
}
}
}
else if (!Utility.isBoardLoaded() && subscription != 0)
{
Debug.Log((object)"Light Plugin: Board Unloaded");
subscription = SubscriptionState.unsubscribed;
}
KeyboardShortcut value = triggerManualApply.Value;
if (((KeyboardShortcut)(ref value)).IsUp())
{
Debug.Log((object)"Light Plugin: Manual Re-Apply");
AssetDataPlugin.Reset("org.lordashes.plugins.light");
}
value = triggerRereadConfig.Value;
if (((KeyboardShortcut)(ref value)).IsUp())
{
Debug.Log((object)"Light Plugin: Reread Configuration");
ReadConfiguration(ref lights);
}
}
private void OnGUI()
{
menu.Draw();
}
public static void ReadConfiguration(ref Dictionary<string, LightSpecs> lights)
{
//IL_026f: Unknown result type (might be due to invalid IL or missing references)
//IL_02a7: Unknown result type (might be due to invalid IL or missing references)
lights.Clear();
Debug.Log((object)"Light Plugin: Deserialize JSON Light File.");
if (File.Exists("LightSpecs.json"))
{
Debug.Log((object)"Light Plugin: Found Light Specs Configuration");
configLocation = File.Find("LightSpecs.json", (CacheType)999)[0];
string text = File.ReadAllText(configLocation, (CacheType)999);
List<LightSpecs> list = JsonConvert.DeserializeObject<List<LightSpecs>>(text);
{
foreach (LightSpecs item in list)
{
lights.Add(item.name, item);
Debug.Log((object)("Light Plugin:\r\n" + JsonConvert.SerializeObject((object)item)));
}
return;
}
}
if (File.Exists("LightTypes.json"))
{
Debug.Log((object)"Light Plugin: Found Light Type Configuration");
configLocation = File.Find("LightTypes.json", (CacheType)999)[0];
string text2 = File.ReadAllText(configLocation, (CacheType)999);
List<LegacyLightSpecs> list2 = JsonConvert.DeserializeObject<List<LegacyLightSpecs>>(text2);
foreach (LegacyLightSpecs item2 in list2)
{
string[] array = item2.pos.Split(new char[1] { ',' });
string[] array2 = item2.rot.Split(new char[1] { ',' });
LightSpecs lightSpecs = new LightSpecs
{
behaviour = new LightBehaviour
{
deltaMax = item2.deltaMax,
flicker = item2.flicker,
hiddenBase = item2.hiddenBase,
intensityMax = item2.intensity * intensityMultiplier,
intensityMin = item2.intensityMin * intensityMultiplier,
sight = item2.sight
},
menu = new LightMenu
{
iconName = item2.iconName,
menuLink = item2.menuLink,
menuNode = item2.menuNode,
onlyGM = item2.onlyGM
},
name = item2.name,
position = new F3(Utility.ParseFloat(array[0]), Utility.ParseFloat(array[1]), Utility.ParseFloat(array[2])),
rotation = new F3(Utility.ParseFloat(array2[0]), Utility.ParseFloat(array2[1]), Utility.ParseFloat(array2[2])),
specs = new LightProperties
{
type = item2.lightType,
color = item2.color,
range = item2.range,
spotAngle = item2.spotAngle,
shadows = item2.shadowType
}
};
lights.Add(lightSpecs.name, lightSpecs);
}
File.WriteAllText(File.Find("LightTypes.json", (CacheType)999)[0].Replace("LightTypes.json", "LightSpecs.json"), JsonConvert.SerializeObject((object)lights.Values, (Formatting)1), (CacheType)999);
}
else
{
Debug.Log((object)"Light Plugin: Missing Light Configuration");
Environment.Exit(0);
}
}
public static void UpdateLight(CreatureGuid holder, LightSpecs ls)
{
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
if (!lights.ContainsKey(ls.name))
{
lights.Add(ls.name, ls);
RadialSubmenu.CreateSubMenuItem("org.lordashes.plugins.light", ls.name, Image.LoadSprite(ls.menu.iconName, (CacheType)999), (Action<CreatureGuid, string, MapMenuItem>)delegate(CreatureGuid cid, string s, MapMenuItem mmi)
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
self.RadialMenuRequest(cid, RadialUIPlugin.GetLastRadialTargetCreature(), ls.name);
}, true, (Func<bool>)delegate
{
//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)
bool isInGmMode = LocalClient.IsInGmMode;
return (LocalClient.CanControlCreature(new CreatureGuid(RadialUIPlugin.GetLastRadialTargetCreature())) && (isInGmMode || !ls.menu.onlyGM)) ? true : false;
});
}
else
{
lights[ls.name] = ls;
}
self.ProcessLightRequest(holder, ls);
}
}