using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Threading.Tasks; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using BepInEx.NET.Common; using BepInExResoniteShim; using Elements.Core; using FrooxEngine; using FrooxEngine.UIX; using HarmonyLib; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(/*Could not decode attribute arguments.*/)] [assembly: TargetFramework(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")] [assembly: AssemblyCompany("art0007i")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+54ae6c0497419b27e8715876485501e8eb4ed2dd")] [assembly: AssemblyProduct("SaveImagePrompt")] [assembly: AssemblyTitle("SaveImagePrompt")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/art0007i/SaveImagePrompt")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace SaveImagePrompt; [ResonitePlugin("art0007i.SaveImagePrompt", "SaveImagePrompt", "1.0.0", "art0007i", "https://github.com/art0007i/SaveImagePrompt")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BasePlugin { [HarmonyPatch(typeof(PhotoMetadata), "NotifyOfScreenshot")] private class SaveImagePromptPatch { [CompilerGenerated] private sealed class <>c__DisplayClass0_0 { [StructLayout((LayoutKind)3)] private struct <b__1>d : IAsyncStateMachine { public int <>1__state; public AsyncTaskMethodBuilder <>t__builder; public <>c__DisplayClass0_0 <>4__this; private TaskAwaiter <>u__1; private TaskAwaiter <>u__2; private void MoveNext() { //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_0062: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: 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) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: 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) int num = <>1__state; <>c__DisplayClass0_0 <>c__DisplayClass0_ = <>4__this; try { TaskAwaiter val; TaskAwaiter val2; if (num != 0) { if (num == 1) { val = <>u__2; <>u__2 = default(TaskAwaiter); num = (<>1__state = -1); goto IL_00d6; } val2 = <>c__DisplayClass0_.tcs.Task.GetAwaiter(); if (!val2.IsCompleted) { num = (<>1__state = 0); <>u__1 = val2; ((AsyncTaskMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted, <b__1>d>(ref val2, ref this); return; } } else { val2 = <>u__1; <>u__1 = default(TaskAwaiter); num = (<>1__state = -1); } if (val2.GetResult()) { val = <>c__DisplayClass0_.worker.StartGlobalTask(<>c__DisplayClass0_.task).GetAwaiter(); if (!((TaskAwaiter)(ref val)).IsCompleted) { num = (<>1__state = 1); <>u__2 = val; ((AsyncTaskMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompletedb__1>d>(ref val, ref this); return; } goto IL_00d6; } goto end_IL_000e; IL_00d6: ((TaskAwaiter)(ref val)).GetResult(); end_IL_000e:; } catch (global::System.Exception exception) { <>1__state = -2; ((AsyncTaskMethodBuilder)(ref <>t__builder)).SetException(exception); return; } <>1__state = -2; ((AsyncTaskMethodBuilder)(ref <>t__builder)).SetResult(); } [DebuggerHidden] private void SetStateMachine(IAsyncStateMachine stateMachine) { ((AsyncTaskMethodBuilder)(ref <>t__builder)).SetStateMachine(stateMachine); } } public PhotoMetadata __instance; public TaskCompletionSource tcs; public Worker worker; public Func task; public SlotEvent <>9__4; internal void b__0() { //IL_0036: 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_0058: 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_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Expected O, but got Unknown //IL_0193: 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_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Expected O, but got Unknown //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_0200: Unknown result type (might be due to invalid IL or missing references) //IL_0205: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Expected O, but got Unknown //IL_020d: Expected O, but got Unknown <>c__DisplayClass0_1 CS$<>8__locals7 = new <>c__DisplayClass0_1 { CS$<>8__locals1 = this, dialog = Userspace.UserspaceWorld.RootSlot.AddSlot("Save Image Prompt", true) }; UIBuilder obj = RadiantUI_Panel.SetupPanel(CS$<>8__locals7.dialog, LocaleHelper.AsLocaleKey("Save Image?", (string)null, true, (Dictionary)null), new float2(400f, 300f), true, true); Slot obj2 = CS$<>8__locals7.dialog; float3 localScale = obj2.LocalScale; obj2.LocalScale = (ref localScale) * 0.0005f; RadiantUI_Constants.SetupEditorStyle(obj, false); obj.VerticalLayout(4f, 0f, (Alignment?)null, (bool?)null, (bool?)null); obj.Style.MinHeight = 64f; LocaleString val = LocaleString.op_Implicit($"Would you like to save the image: \"{((Component)__instance).Slot.Name}\" from world \"{((Worker)__instance).World.Name}\""); obj.Text(ref val, true, (Alignment?)null, true, (string)null); obj.Style.MinHeight = 32f; obj.HorizontalLayout(4f, 0f, (Alignment?)null); val = LocaleString.op_Implicit("Save"); colorX? val2 = Sub.GREEN; obj.Button(ref val, ref val2).LocalPressed += (ButtonEventHandler)delegate { CS$<>8__locals7.CS$<>8__locals1.tcs.SetResult(true); CS$<>8__locals7.dialog.Destroy(); }; val = LocaleString.op_Implicit("Discard"); val2 = Sub.RED; obj.Button(ref val, ref val2).LocalPressed += (ButtonEventHandler)delegate { CS$<>8__locals7.dialog.Destroy(); }; SlotPositioning.PositionInFrontOfUser(CS$<>8__locals7.dialog, (float3?)float3.Backward, (float3?)null, 0.7f, (User)null, true, true, false); Slot obj3 = CS$<>8__locals7.dialog; SlotEvent obj4 = <>9__4; if (obj4 == null) { SlotEvent val3 = delegate { _ = ((global::System.Threading.Tasks.Task)tcs.Task).IsCompleted; tcs.TrySetResult(false); }; SlotEvent val4 = val3; <>9__4 = val3; obj4 = val4; } obj3.OnPrepareDestroy += obj4; } internal void b__4(Slot s) { _ = ((global::System.Threading.Tasks.Task)tcs.Task).IsCompleted; tcs.TrySetResult(false); } [AsyncStateMachine(typeof(<b__1>d))] internal global::System.Threading.Tasks.Task? b__1() { //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) <b__1>d <b__1>d = default(<b__1>d); <b__1>d.<>t__builder = AsyncTaskMethodBuilder.Create(); <b__1>d.<>4__this = this; <b__1>d.<>1__state = -1; ((AsyncTaskMethodBuilder)(ref <b__1>d.<>t__builder)).Start<<b__1>d>(ref <b__1>d); return ((AsyncTaskMethodBuilder)(ref <b__1>d.<>t__builder)).Task; } } [CompilerGenerated] private sealed class <>c__DisplayClass0_1 { public Slot dialog; public <>c__DisplayClass0_0 CS$<>8__locals1; internal void b__2(IButton b, ButtonEventData e) { CS$<>8__locals1.tcs.SetResult(true); dialog.Destroy(); } internal void b__3(IButton b, ButtonEventData e) { dialog.Destroy(); } } [CompilerGenerated] private sealed class d__1 : global::System.Collections.Generic.IEnumerable, global::System.Collections.IEnumerable, global::System.Collections.Generic.IEnumerator, global::System.Collections.IEnumerator, global::System.IDisposable { private int <>1__state; private CodeInstruction <>2__current; private int <>l__initialThreadId; private global::System.Collections.Generic.IEnumerable codes; public global::System.Collections.Generic.IEnumerable <>3__codes; private MethodInfo 5__2; private global::System.Collections.Generic.IEnumerator <>7__wrap2; CodeInstruction global::System.Collections.Generic.IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object global::System.Collections.IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__1(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void global::System.IDisposable.Dispose() { int num = <>1__state; if (num == -3 || (uint)(num - 1) <= 1u) { try { } finally { <>m__Finally1(); } } 5__2 = null; <>7__wrap2 = null; <>1__state = -2; } private bool MoveNext() { //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Expected O, but got Unknown try { switch (<>1__state) { default: return false; case 0: <>1__state = -1; 5__2 = AccessTools.FirstMethod(typeof(Worker), (Func)((MethodInfo mi) => ((MemberInfo)mi).Name == "StartGlobalTask" && !((MethodBase)mi).IsGenericMethod)); <>7__wrap2 = codes.GetEnumerator(); <>1__state = -3; break; case 1: <>1__state = -3; break; case 2: <>1__state = -3; break; } if (((global::System.Collections.IEnumerator)<>7__wrap2).MoveNext()) { CodeInstruction current = <>7__wrap2.Current; if (CodeInstructionExtensions.Calls(current, 5__2)) { <>2__current = new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(SaveImagePromptPatch), "Proxy", (global::System.Type[])null, (global::System.Type[])null)); <>1__state = 1; return true; } <>2__current = current; <>1__state = 2; return true; } <>m__Finally1(); <>7__wrap2 = null; return false; } catch { //try-fault ((global::System.IDisposable)this).Dispose(); throw; } } bool global::System.Collections.IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>7__wrap2 != null) { ((global::System.IDisposable)<>7__wrap2).Dispose(); } } [DebuggerHidden] void global::System.Collections.IEnumerator.Reset() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) throw new NotSupportedException(); } [DebuggerHidden] global::System.Collections.Generic.IEnumerator global::System.Collections.Generic.IEnumerable.GetEnumerator() { d__1 d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; d__ = this; } else { d__ = new d__1(0); } d__.codes = <>3__codes; return d__; } [DebuggerHidden] global::System.Collections.IEnumerator global::System.Collections.IEnumerable.GetEnumerator() { return (global::System.Collections.IEnumerator)((global::System.Collections.Generic.IEnumerable)this).GetEnumerator(); } } public static global::System.Threading.Tasks.Task Proxy(Worker worker, Func task) { //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Expected O, but got Unknown <>c__DisplayClass0_0 CS$<>8__locals15 = new <>c__DisplayClass0_0(); CS$<>8__locals15.worker = worker; CS$<>8__locals15.task = task; if (!Enabled.Value) { return CS$<>8__locals15.worker.StartGlobalTask(CS$<>8__locals15.task); } CS$<>8__locals15.tcs = new TaskCompletionSource(); ref PhotoMetadata reference = ref CS$<>8__locals15.__instance; Worker obj = CS$<>8__locals15.worker; reference = (PhotoMetadata)(object)((obj is PhotoMetadata) ? obj : null); Userspace.UserspaceWorld.RunSynchronously((Action)delegate { //IL_0036: 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_0058: 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_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Expected O, but got Unknown //IL_0193: 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_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Expected O, but got Unknown //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_0200: Unknown result type (might be due to invalid IL or missing references) //IL_0205: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Expected O, but got Unknown //IL_020d: Expected O, but got Unknown <>c__DisplayClass0_0 <>c__DisplayClass0_ = CS$<>8__locals15; Slot dialog = Userspace.UserspaceWorld.RootSlot.AddSlot("Save Image Prompt", true); UIBuilder obj2 = RadiantUI_Panel.SetupPanel(dialog, LocaleHelper.AsLocaleKey("Save Image?", (string)null, true, (Dictionary)null), new float2(400f, 300f), true, true); Slot obj3 = dialog; float3 localScale = obj3.LocalScale; obj3.LocalScale = (ref localScale) * 0.0005f; RadiantUI_Constants.SetupEditorStyle(obj2, false); obj2.VerticalLayout(4f, 0f, (Alignment?)null, (bool?)null, (bool?)null); obj2.Style.MinHeight = 64f; LocaleString val = LocaleString.op_Implicit($"Would you like to save the image: \"{((Component)CS$<>8__locals15.__instance).Slot.Name}\" from world \"{((Worker)CS$<>8__locals15.__instance).World.Name}\""); obj2.Text(ref val, true, (Alignment?)null, true, (string)null); obj2.Style.MinHeight = 32f; obj2.HorizontalLayout(4f, 0f, (Alignment?)null); val = LocaleString.op_Implicit("Save"); colorX? val2 = Sub.GREEN; obj2.Button(ref val, ref val2).LocalPressed += (ButtonEventHandler)delegate { <>c__DisplayClass0_.tcs.SetResult(true); dialog.Destroy(); }; val = LocaleString.op_Implicit("Discard"); val2 = Sub.RED; obj2.Button(ref val, ref val2).LocalPressed += (ButtonEventHandler)delegate { dialog.Destroy(); }; SlotPositioning.PositionInFrontOfUser(dialog, (float3?)float3.Backward, (float3?)null, 0.7f, (User)null, true, true, false); Slot obj4 = dialog; SlotEvent obj5 = CS$<>8__locals15.<>9__4; if (obj5 == null) { SlotEvent val3 = delegate { _ = ((global::System.Threading.Tasks.Task)CS$<>8__locals15.tcs.Task).IsCompleted; CS$<>8__locals15.tcs.TrySetResult(false); }; SlotEvent val4 = val3; CS$<>8__locals15.<>9__4 = val3; obj5 = val4; } obj4.OnPrepareDestroy += obj5; }, false, (IUpdatable)null, false); return global::System.Threading.Tasks.Task.Run((Func)([AsyncStateMachine(typeof(<>c__DisplayClass0_0.<b__1>d))] () => { //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) <>c__DisplayClass0_0.<b__1>d <b__1>d = default(<>c__DisplayClass0_0.<b__1>d); <b__1>d.<>t__builder = AsyncTaskMethodBuilder.Create(); <b__1>d.<>4__this = CS$<>8__locals15; <b__1>d.<>1__state = -1; ((AsyncTaskMethodBuilder)(ref <b__1>d.<>t__builder)).Start<<>c__DisplayClass0_0.<b__1>d>(ref <b__1>d); return ((AsyncTaskMethodBuilder)(ref <b__1>d.<>t__builder)).Task; })); } [IteratorStateMachine(typeof(d__1))] public static global::System.Collections.Generic.IEnumerable Transpiler(global::System.Collections.Generic.IEnumerable codes) { MethodInfo lookFor = AccessTools.FirstMethod(typeof(Worker), (Func)((MethodInfo mi) => ((MemberInfo)mi).Name == "StartGlobalTask" && !((MethodBase)mi).IsGenericMethod)); global::System.Collections.Generic.IEnumerator enumerator = codes.GetEnumerator(); try { while (((global::System.Collections.IEnumerator)enumerator).MoveNext()) { CodeInstruction current = enumerator.Current; if (CodeInstructionExtensions.Calls(current, lookFor)) { yield return new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(SaveImagePromptPatch), "Proxy", (global::System.Type[])null, (global::System.Type[])null)); } else { yield return current; } } } finally { ((global::System.IDisposable)enumerator)?.Dispose(); } } } internal static ManualLogSource Log; internal static ConfigEntry Enabled; public override void Load() { Log = ((BasePlugin)this).Log; Enabled = ((BasePlugin)this).Config.Bind("General", "Enabled", true, "Should the mod be enabled?"); ((BasePlugin)this).HarmonyInstance.PatchAll(); } } public static class PluginMetadata { public const string GUID = "art0007i.SaveImagePrompt"; public const string NAME = "SaveImagePrompt"; public const string VERSION = "1.0.0"; public const string AUTHORS = "art0007i"; public const string REPOSITORY_URL = "https://github.com/art0007i/SaveImagePrompt"; }