using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using InControl;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using Silksong.ScreenshotMarker;
using Silksong.ScreenshotMarker.Extensions;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.UIElements;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("Silksong.ScreenshotMarker")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.2.2.0")]
[assembly: AssemblyInformationalVersion("1.2.2+b4d703337d8ce3abc66d499972bef801b8676ef1")]
[assembly: AssemblyProduct("Silksong.ScreenshotMarker")]
[assembly: AssemblyTitle("ScreenshotMarker")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/DemoJameson/Silksong.ScreenshotMarker")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.2.2.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
public class ScreenshotDisplay : MonoBehaviour
{
private static ScreenshotDisplay? instance;
private Texture2D? screenshotTexture;
private Sprite? screenshotSprite;
public static bool IsShowing => (Object)(object)instance != (Object)null;
public static void Show(string filePath)
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
if (Object.op_Implicit((Object)(object)instance))
{
Close();
}
instance = new GameObject("ScreenshotMarker_ScreenshotDisplay").AddComponent<ScreenshotDisplay>();
instance.InitializeUI(filePath);
}
public static void Close()
{
if (Object.op_Implicit((Object)(object)instance))
{
Object.Destroy((Object)(object)((Component)instance).gameObject);
instance = null;
}
}
private void InitializeUI(string filePath)
{
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Expected O, but got Unknown
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
//IL_008c: Unknown result type (might be due to invalid IL or missing references)
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: 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_00b5: 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_00d7: Unknown result type (might be due to invalid IL or missing references)
//IL_00e1: Expected O, but got Unknown
//IL_0117: Unknown result type (might be due to invalid IL or missing references)
//IL_0126: 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_0165: Unknown result type (might be due to invalid IL or missing references)
//IL_017a: Unknown result type (might be due to invalid IL or missing references)
//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
Canvas obj = ((Component)this).gameObject.AddComponent<Canvas>();
obj.renderMode = (RenderMode)0;
obj.sortingOrder = 9999;
CanvasScaler obj2 = ((Component)this).gameObject.AddComponent<CanvasScaler>();
obj2.uiScaleMode = (ScaleMode)1;
obj2.referenceResolution = new Vector2((float)Screen.width, (float)Screen.height);
GameObject val = new GameObject("ScreenshotMarker_Panel");
val.transform.SetParent(((Component)this).transform, false);
((Graphic)val.AddComponent<Image>()).color = new Color(0f, 0f, 0f, 0.8f);
RectTransform component = val.GetComponent<RectTransform>();
component.anchorMin = Vector2.zero;
component.anchorMax = Vector2.one;
component.sizeDelta = Vector2.zero;
GameObject val2 = new GameObject("ScreenshotMarker_Image");
val2.transform.SetParent(val.transform, false);
Image obj3 = val2.AddComponent<Image>();
byte[] array = File.ReadAllBytes(filePath);
screenshotTexture = new Texture2D(2, 2);
ImageConversion.LoadImage(screenshotTexture, array);
screenshotSprite = Sprite.Create(screenshotTexture, new Rect(0f, 0f, (float)((Texture)screenshotTexture).width, (float)((Texture)screenshotTexture).height), new Vector2(0.5f, 0.5f));
obj3.sprite = screenshotSprite;
RectTransform component2 = val2.GetComponent<RectTransform>();
component2.anchorMin = new Vector2(0.5f, 0.5f);
component2.anchorMax = new Vector2(0.5f, 0.5f);
component2.pivot = new Vector2(0.5f, 0.5f);
float value = PluginConfig.ScreenshotScale.Value;
float num = (float)Screen.width * value;
float num2 = (float)Screen.height * value;
float num3 = (float)((Texture)screenshotTexture).width / (float)((Texture)screenshotTexture).height;
float num4;
float num5;
if (num / num2 > num3)
{
num4 = num2;
num5 = num4 * num3;
}
else
{
num5 = num;
num4 = num5 / num3;
}
component2.sizeDelta = new Vector2(num5, num4);
((Component)this).gameObject.AddComponent<ScreenshotDisplayController>();
}
private void OnDestroy()
{
if ((Object)(object)screenshotSprite != (Object)null)
{
Object.Destroy((Object)(object)screenshotSprite);
}
if ((Object)(object)screenshotTexture != (Object)null)
{
Object.Destroy((Object)(object)screenshotTexture);
}
}
}
public class ScreenshotDisplayController : MonoBehaviour
{
private void Update()
{
HeroActions inputActions = ManagerSingleton<InputHandler>.Instance.inputActions;
if (PluginConfig.ScreenshotKey.IsDown() || Input.GetKeyDown((KeyCode)27) || ((OneAxisInputControl)inputActions.MenuSubmit).WasPressed || ((OneAxisInputControl)inputActions.MenuCancel).WasPressed || ((OneAxisInputControl)inputActions.MenuExtra).WasPressed || ((OneAxisInputControl)inputActions.MenuSuper).WasPressed || ((OneAxisInputControl)inputActions.Jump).WasPressed || ((OneAxisInputControl)inputActions.Evade).WasPressed || ((OneAxisInputControl)inputActions.Dash).WasPressed || ((OneAxisInputControl)inputActions.SuperDash).WasPressed || ((OneAxisInputControl)inputActions.DreamNail).WasPressed || ((OneAxisInputControl)inputActions.Attack).WasPressed || ((OneAxisInputControl)inputActions.Cast).WasPressed || ((OneAxisInputControl)inputActions.QuickMap).WasPressed || ((OneAxisInputControl)inputActions.QuickCast).WasPressed || ((OneAxisInputControl)inputActions.Taunt).WasPressed || ((OneAxisInputControl)inputActions.OpenInventory).WasPressed || ((OneAxisInputControl)inputActions.OpenInventoryMap).WasPressed || ((OneAxisInputControl)inputActions.OpenInventoryJournal).WasPressed || ((OneAxisInputControl)inputActions.OpenInventoryTools).WasPressed || ((OneAxisInputControl)inputActions.OpenInventoryQuests).WasPressed || ((OneAxisInputControl)inputActions.Pause).WasPressed)
{
ScreenshotDisplay.Close();
}
}
}
namespace BepInEx
{
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
[Conditional("CodeGeneration")]
internal sealed class BepInAutoPluginAttribute : Attribute
{
public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
{
}
}
}
namespace BepInEx.Preloader.Core.Patching
{
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
[Conditional("CodeGeneration")]
internal sealed class PatcherAutoPluginAttribute : Attribute
{
public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
{
}
}
}
namespace Silksong.ScreenshotMarker
{
public record MarkerData
{
public string Name;
public DateTime Time;
public string FileName;
public Vector2 Position;
[CompilerGenerated]
protected virtual bool PrintMembers(StringBuilder builder)
{
RuntimeHelpers.EnsureSufficientExecutionStack();
builder.Append("Name = ");
builder.Append((object?)Name);
builder.Append(", Time = ");
builder.Append(Time.ToString());
builder.Append(", FileName = ");
builder.Append((object?)FileName);
builder.Append(", Position = ");
builder.Append(((object)(Vector2)(ref Position)).ToString());
return true;
}
}
[HarmonyPatch]
public class MarkerManager : PluginComponent
{
[CompilerGenerated]
private sealed class <CreateFlashEffect>d__28 : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
private GameObject <flashObject>5__2;
private Image <flashImage>5__3;
private float <defaultAlpha>5__4;
private float <duration>5__5;
private float <elapsed>5__6;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <CreateFlashEffect>d__28(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<flashObject>5__2 = null;
<flashImage>5__3 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Expected O, but got Unknown
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
//IL_010b: Unknown result type (might be due to invalid IL or missing references)
switch (<>1__state)
{
default:
return false;
case 0:
{
<>1__state = -1;
<flashObject>5__2 = new GameObject("ScreenshotMarker_Flash");
Canvas obj = <flashObject>5__2.AddComponent<Canvas>();
obj.renderMode = (RenderMode)0;
obj.sortingOrder = 9999;
CanvasScaler obj2 = <flashObject>5__2.AddComponent<CanvasScaler>();
obj2.uiScaleMode = (ScaleMode)1;
obj2.referenceResolution = new Vector2(1920f, 1080f);
<flashImage>5__3 = <flashObject>5__2.AddComponent<Image>();
<defaultAlpha>5__4 = 0.25f;
((Graphic)<flashImage>5__3).color = new Color(1f, 1f, 1f, <defaultAlpha>5__4);
<duration>5__5 = 0.3f;
<elapsed>5__6 = 0f;
break;
}
case 1:
<>1__state = -1;
break;
}
if (<elapsed>5__6 < <duration>5__5)
{
<elapsed>5__6 += Time.deltaTime;
float num = Mathf.Lerp(<defaultAlpha>5__4, 0f, <elapsed>5__6 / <duration>5__5);
((Graphic)<flashImage>5__3).color = new Color(1f, 1f, 1f, num);
<>2__current = null;
<>1__state = 1;
return true;
}
Object.Destroy((Object)(object)<flashObject>5__2);
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 <CreateScreenshotMarker>d__14 : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <CreateScreenshotMarker>d__14(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: Expected O, but got Unknown
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
//IL_0076: Unknown result type (might be due to invalid IL or missing references)
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
//IL_0128: Unknown result type (might be due to invalid IL or missing references)
//IL_0163: 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)
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = (object)new WaitForEndOfFrame();
<>1__state = 1;
return true;
case 1:
{
<>1__state = -1;
int currentSaveSlot = MarkerManager.currentSaveSlot;
GameMap gameMap = GameManager._instance.gameMap;
gameMap.UpdateCurrentScene();
Vector2 mapPosition = gameMap.GetMapPosition(Vector2.op_Implicit(HeroController._instance.transform.position), gameMap.currentScene, gameMap.currentSceneObj, gameMap.currentScenePos, gameMap.currentSceneSize);
foreach (MarkerData item2 in markerDataList.ToList())
{
if (Vector2.Distance(item2.Position, mapPosition) < 0.1f)
{
RemoveMarkerData(item2);
}
}
string fileName = DateTime.Now.ToString("yyyyMMdd_HHmmss_fff") + (RenoDxOrLumaEnabled ? ".exr" : ".png");
string screenshotFilePath = GetScreenshotFilePath(currentSaveSlot, fileName);
MarkerData item = new MarkerData
{
Name = PluginComponent.CurrentSceneName,
Time = DateTime.Now,
FileName = fileName,
Position = mapPosition
};
Directory.CreateDirectory(GetScreenshotPath(currentSaveSlot));
TakeScreenshot(screenshotFilePath);
markerDataList.Add(item);
SaveMakers(currentSaveSlot);
MapMarkerMenu mapMarkerMenu = gameMap.mapManager.mapMarkerMenu;
VibrationManager.PlayVibrationClipOneShot(mapMarkerMenu.placementVibration, (VibrationTarget?)null, false, "", false);
if (!Object.op_Implicit((Object)(object)placeAudioSource))
{
placeAudioSource = new GameObject("ScreenshotMarker_PlaceAudioSource").AddComponent<AudioSource>();
AudioClip placeClip = mapMarkerMenu.placeClip;
placeAudioSource.clip = placeClip;
}
placeAudioSource.Play();
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();
}
}
private static List<MarkerData> markerDataList = new List<MarkerData>();
private static List<GameObject> spawnedMapMarkers = new List<GameObject>();
private static Sprite sprite;
private static string markerNamePrefix = "ScreenshotMarker_";
private static MarkerTypes ScreenshotMarkerType = (MarkerTypes)9527;
private static AudioSource placeAudioSource = null;
private static bool? renoDxOrLumaEnabled;
private static int currentSaveSlot => GameManager._instance.profileID;
private static bool RenoDxOrLumaEnabled
{
get
{
if (renoDxOrLumaEnabled.HasValue)
{
return renoDxOrLumaEnabled.Value;
}
if (File.Exists(Path.Combine(Paths.GameRootPath, "dxgi.dll")))
{
renoDxOrLumaEnabled = File.Exists(Path.Combine(Paths.GameRootPath, "renodx-hollowknight-silksong.addon64")) || File.Exists(Path.Combine(Paths.GameRootPath, "Luma-Unity Engine.addon"));
}
else
{
renoDxOrLumaEnabled = false;
}
return renoDxOrLumaEnabled.Value;
}
}
private void Awake()
{
//IL_000d: 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)
//IL_0019: Expected O, but got Unknown
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: 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_0047: Expected O, but got Unknown
byte[] embeddedResourceBytes = GetEmbeddedResourceBytes("ScreenshotMarker.png");
Texture2D val = new Texture2D(2, 2);
ImageConversion.LoadImage(val, embeddedResourceBytes);
sprite = Sprite.Create(val, new Rect(0f, 0f, 73f, 73f), Vector2.one / 2f);
if (Object.op_Implicit((Object)(object)GameManager._instance) && currentSaveSlot > 0)
{
LoadMarkers(currentSaveSlot);
}
}
private void OnDestroy()
{
foreach (GameObject spawnedMapMarker in spawnedMapMarkers)
{
Object.Destroy((Object)(object)spawnedMapMarker);
}
Object.Destroy((Object)(object)sprite);
Object.Destroy((Object)(object)placeAudioSource);
ScreenshotDisplay.Close();
}
private void LateUpdate()
{
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Invalid comparison between Unknown and I4
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Invalid comparison between Unknown and I4
if (!PluginConfig.Enabled.Value || !Object.op_Implicit((Object)(object)HeroController._instance) || HeroController._instance.IsInputBlocked() || (Object.op_Implicit((Object)(object)GameManager._instance) && ((int)GameManager._instance.GameState != 4 || (GameManager._instance.IsMemoryScene() && (int)GameManager._instance.GetCurrentMapZoneEnum() != 21))))
{
return;
}
HeroActions inputActions = ManagerSingleton<InputHandler>.Instance.inputActions;
if ((PluginConfig.ScreenshotKey.IsDown() || (((OneAxisInputControl)inputActions.QuickMap).WasPressed && ((OneAxisInputControl)inputActions.DreamNail).IsPressed)) && currentSaveSlot > 0)
{
((MonoBehaviour)this).StartCoroutine(CreateScreenshotMarker());
if (PluginConfig.FlashEffect.Value)
{
((MonoBehaviour)this).StartCoroutine(CreateFlashEffect());
}
}
}
private static string GetScreenshotPath(int saveSlot)
{
return Path.Combine(Paths.ConfigPath, "ScreenshotMarker", "Save_" + saveSlot);
}
private static string GetScreenshotFilePath(int saveSlot, string fileName)
{
return Path.Combine(GetScreenshotPath(saveSlot), fileName);
}
private static string GetMarkerDataPath(int saveSlot)
{
return Path.Combine(GetScreenshotPath(saveSlot), "marker_data.json");
}
[IteratorStateMachine(typeof(<CreateScreenshotMarker>d__14))]
private static IEnumerator CreateScreenshotMarker()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <CreateScreenshotMarker>d__14(0);
}
private static GameObject CreateMarker(GameMap gameMap, int index)
{
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Expected O, but got Unknown
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
if (spawnedMapMarkers.Count > index)
{
return spawnedMapMarkers[index];
}
GameObject val = Object.Instantiate<GameObject>(gameMap.mapMarkerTemplates[0], gameMap.markerParent);
((Object)val).name = $"{markerNamePrefix}{index}";
SpriteRenderer componentInChildren = val.GetComponentInChildren<SpriteRenderer>();
componentInChildren.sprite = sprite;
MaterialPropertyBlock val2 = new MaterialPropertyBlock();
val2.SetFloat(Shader.PropertyToID("_TimeOffset"), Random.Range(0f, 10f));
((Renderer)componentInChildren).SetPropertyBlock(val2);
InvMarker componentInChildren2 = val.GetComponentInChildren<InvMarker>();
componentInChildren2.Colour = ScreenshotMarkerType;
componentInChildren2.Index = index;
spawnedMapMarkers.Add(val);
return val;
}
[HarmonyPatch(typeof(MapMarkerMenu), "AddToCollidingList")]
[HarmonyPostfix]
private static void MapMarkerMenuAddToCollidingList(MapMarkerMenu __instance)
{
//IL_0018: 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_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
List<GameObject> collidingMarkers = __instance.collidingMarkers;
Vector3 cursorPosition = __instance.placementCursor.transform.position;
Vector3 gameMapPosition = ((Component)__instance.gameMap).transform.parent.position;
collidingMarkers.Sort(delegate(GameObject go1, GameObject go2)
{
//IL_0006: 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_0011: 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_001c: 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)
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: 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_0042: Unknown result type (might be due to invalid IL or missing references)
//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)
float num = Vector2.Distance(Vector2.op_Implicit(go1.transform.position - gameMapPosition), Vector2.op_Implicit(cursorPosition));
float num2 = Vector2.Distance(Vector2.op_Implicit(go2.transform.position - gameMapPosition), Vector2.op_Implicit(cursorPosition)) - num;
if (num2 > 0f)
{
return 1;
}
return (num2 < 0f) ? (-1) : 0;
});
}
[HarmonyPatch(typeof(Platform), "GetMenuAction", new Type[]
{
typeof(HeroActions),
typeof(bool),
typeof(bool)
})]
[HarmonyPrefix]
private static bool InventoryItemSelectedActionDoAction()
{
if (ScreenshotDisplay.IsShowing)
{
return false;
}
return true;
}
[HarmonyPatch(typeof(MapMarkerMenu), "Update")]
[HarmonyPrefix]
private static bool MapMarkerMenuUpdate(MapMarkerMenu __instance)
{
//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_0076: Unknown result type (might be due to invalid IL or missing references)
//IL_007b: 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_005a: Invalid comparison between Unknown and I4
if (__instance.inPlacementMode && __instance.collidingMarkers.Count > 0 && !ScreenshotDisplay.IsShowing)
{
HeroActions inputActions = ManagerSingleton<InputHandler>.Instance.inputActions;
MenuActions menuAction = Platform.Current.GetMenuAction(inputActions, false, false);
if (PluginConfig.ScreenshotKey.IsDown() || ((OneAxisInputControl)inputActions.QuickMap).WasPressed || (int)menuAction == 3)
{
List<GameObject> collidingMarkers = __instance.collidingMarkers;
InvMarker component = collidingMarkers[collidingMarkers.Count - 1].GetComponent<InvMarker>();
if (component.Colour != ScreenshotMarkerType)
{
return true;
}
MarkerData markerData = markerDataList[component.Index];
string screenshotFilePath = GetScreenshotFilePath(currentSaveSlot, markerData.FileName);
if (File.Exists(screenshotFilePath))
{
ScreenshotDisplay.Show(screenshotFilePath);
}
else
{
RemoveScreenshotMarker(__instance);
}
return false;
}
}
if (ScreenshotDisplay.IsShowing)
{
return false;
}
return true;
}
[HarmonyPatch(typeof(MapMarkerMenu), "RemoveMarker")]
[HarmonyPrefix]
private static bool RemoveMarker(MapMarkerMenu __instance)
{
//IL_0018: 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)
List<GameObject> collidingMarkers = __instance.collidingMarkers;
if (collidingMarkers[collidingMarkers.Count - 1].GetComponent<InvMarker>().Colour != ScreenshotMarkerType)
{
return true;
}
RemoveScreenshotMarker(__instance);
return false;
}
private static void RemoveScreenshotMarker(MapMarkerMenu markerMenu)
{
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
List<GameObject> collidingMarkers = markerMenu.collidingMarkers;
GameObject val = collidingMarkers[collidingMarkers.Count - 1];
InvMarker component = val.GetComponent<InvMarker>();
RemoveMarkerData(markerDataList[component.Index]);
collidingMarkers.Remove(val);
if (collidingMarkers.Count <= 0)
{
markerMenu.IsNotColliding();
}
markerMenu.audioSource.PlayOneShot(markerMenu.removeClip);
VibrationManager.PlayVibrationClipOneShot(markerMenu.placementVibration, (VibrationTarget?)null, false, "", false);
markerMenu.gameMap.SetupMapMarkers();
}
[HarmonyPatch(typeof(GameMap), "SetupMapMarkers")]
[HarmonyPostfix]
private static void SetupMapMarkers(GameMap __instance)
{
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
if (PluginConfig.Enabled.Value && !CollectableItemManager.IsInHiddenMode())
{
for (int i = 0; i < IEnumerableExtensions.GetCount((IEnumerable)markerDataList); i++)
{
GameObject obj = CreateMarker(__instance, i);
obj.SetActive(true);
Extensions.SetLocalPosition2D(obj.transform, markerDataList[i].Position);
}
}
}
[HarmonyPatch(typeof(GameMap), "DisableMarkers")]
[HarmonyPostfix]
private static void DisableMarkers()
{
foreach (GameObject spawnedMapMarker in spawnedMapMarkers)
{
Object.Destroy((Object)(object)spawnedMapMarker);
}
spawnedMapMarkers.Clear();
}
[HarmonyPatch(typeof(GameManager), "SetLoadedGameData", new Type[]
{
typeof(SaveGameData),
typeof(int)
})]
[HarmonyPostfix]
private static void LoadMarkers(int saveSlot)
{
if (!File.Exists(GetMarkerDataPath(saveSlot)))
{
markerDataList.Clear();
}
else
{
markerDataList = JsonConvert.DeserializeObject<List<MarkerData>>(File.ReadAllText(GetMarkerDataPath(saveSlot))) ?? new List<MarkerData>();
}
}
[HarmonyPatch(typeof(GameManager), "ClearSaveFile")]
[HarmonyPostfix]
private static void ClearMarkers(int saveSlot)
{
if (Directory.Exists(GetScreenshotPath(saveSlot)))
{
Directory.Delete(GetScreenshotPath(saveSlot), recursive: true);
}
markerDataList.Clear();
}
private static void SaveMakers(int saveSlot)
{
File.WriteAllText(GetMarkerDataPath(saveSlot), JsonConvert.SerializeObject((object)markerDataList));
}
private static void RemoveMarkerData(MarkerData markerData)
{
if (markerDataList.Remove(markerData))
{
File.Delete(GetScreenshotFilePath(currentSaveSlot, markerData.FileName));
SaveMakers(currentSaveSlot);
}
}
private static void TakeScreenshot(string filePath)
{
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Expected O, but got Unknown
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: Expected O, but got Unknown
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
int width = Screen.width;
int height = Screen.height;
float num = (float)width / (float)height;
int num2 = Mathf.Min(height, 1080);
int num3 = Mathf.RoundToInt(num * (float)num2);
Camera main = Camera.main;
RenderTexture targetTexture = main.targetTexture;
RenderTexture active = RenderTexture.active;
RenderTexture val2 = (main.targetTexture = new RenderTexture(num3, num2, 24, (RenderTextureFormat)(RenoDxOrLumaEnabled ? 2 : 7)));
main.Render();
RenderTexture.active = val2;
Texture2D val3 = new Texture2D(num3, num2, (TextureFormat)(RenoDxOrLumaEnabled ? 17 : 3), false);
val3.ReadPixels(new Rect(0f, 0f, (float)num3, (float)num2), 0, 0);
if (RenoDxOrLumaEnabled)
{
Color[] pixels = val3.GetPixels();
for (int i = 0; i < pixels.Length; i++)
{
pixels[i].a = 1f;
}
val3.SetPixels(pixels);
}
val3.Apply();
if (RenoDxOrLumaEnabled)
{
File.WriteAllBytes(filePath, ImageConversion.EncodeToEXR(val3, (EXRFlags)8));
}
else
{
File.WriteAllBytes(filePath, ImageConversion.EncodeToPNG(val3));
}
main.targetTexture = targetTexture;
RenderTexture.active = active;
Object.Destroy((Object)(object)val2);
Object.Destroy((Object)(object)val3);
}
[IteratorStateMachine(typeof(<CreateFlashEffect>d__28))]
private static IEnumerator CreateFlashEffect()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <CreateFlashEffect>d__28(0);
}
private static byte[] GetEmbeddedResourceBytes(string resourceName)
{
Assembly executingAssembly = Assembly.GetExecutingAssembly();
string text = "Silksong.ScreenshotMarker." + resourceName;
using Stream stream = executingAssembly.GetManifestResourceStream(text);
if (stream == null)
{
throw new ArgumentException("找不到资源: " + text);
}
using MemoryStream memoryStream = new MemoryStream();
stream.CopyTo(memoryStream);
return memoryStream.ToArray();
}
}
[BepInPlugin("mod.silksong.screenshotmarker", "Screenshot Marker", "1.2.2")]
public class Plugin : BaseUnityPlugin
{
public const string Id = "mod.silksong.screenshotmarker";
public static Plugin Instance { get; private set; }
public static ManualLogSource LogSource => ((BaseUnityPlugin)Instance).Logger;
public static string Name => "Screenshot Marker";
public static string Version => "1.2.2";
private void Awake()
{
Instance = this;
PluginComponent.Initialize(((Component)this).gameObject);
}
}
public abstract class PluginComponent : MonoBehaviour
{
private static string? currentSceneName;
public static ManualLogSource Logger => Plugin.LogSource;
public static string CurrentSceneName => GameManager.instance.sceneName;
public static string PreviousSceneName => GameManager.instance.lastSceneName;
public static void Initialize(GameObject gameObject)
{
List<Type> list = (from type in Assembly.GetExecutingAssembly().GetTypes()
where !type.IsAbstract && type.IsSubclassOf(typeof(PluginComponent))
select type).ToList();
list.Sort((Type type, Type otherType) => GetPriority(otherType) - GetPriority(type));
foreach (Type item in list)
{
gameObject.AddComponent(item);
}
}
private static int GetPriority(Type type)
{
object[] customAttributes = type.GetCustomAttributes(typeof(PluginComponentPriorityAttribute), inherit: false);
int num = 0;
if (num < customAttributes.Length)
{
return ((PluginComponentPriorityAttribute)customAttributes[num]).Priority;
}
return 0;
}
}
[AttributeUsage(AttributeTargets.Class)]
public class PluginComponentPriorityAttribute : Attribute
{
public int Priority { get; }
public PluginComponentPriorityAttribute(int priority)
{
Priority = priority;
base..ctor();
}
}
public class PluginConfig : PluginComponent
{
public static ConfigEntry<bool> Enabled { get; private set; }
public static ConfigEntry<bool> FlashEffect { get; private set; }
public static ConfigEntry<float> ScreenshotScale { get; private set; }
public static ConfigEntry<KeyboardShortcut> ScreenshotKey { get; private set; }
private void Awake()
{
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Expected O, but got Unknown
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
ConfigFile config = ((BaseUnityPlugin)Plugin.Instance).Config;
Enabled = config.Bind<bool>("General", "Screenshot Marker", true, "Whether to enable screenshot marker");
FlashEffect = config.Bind<bool>("General", "Flash Effect", true, "Whether to enable flash effect when taking a screenshot");
ScreenshotScale = config.Bind<float>("General", "Screenshot Scale", 0.75f, new ConfigDescription("The scale of the screenshot", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>()));
ScreenshotKey = config.Bind<KeyboardShortcut>("General", "Screenshot Key", new KeyboardShortcut((KeyCode)112, Array.Empty<KeyCode>()), "The key to take a screenshot and remove marker");
}
}
public class PluginPatch : PluginComponent
{
private Harmony harmony;
private void Awake()
{
harmony = Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null);
}
private void OnDestroy()
{
harmony.UnpatchSelf();
}
}
}
namespace Silksong.ScreenshotMarker.Extensions
{
public static class ConfigEntryExtensions
{
public static bool IsDown(this ConfigEntry<KeyboardShortcut> configEntry)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: 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_0020: 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)
KeyboardShortcut value = configEntry.Value;
if (!((KeyboardShortcut)(ref value)).Modifiers.Any())
{
IInputSystem current = UnityInput.Current;
value = configEntry.Value;
return current.GetKeyDown(((KeyboardShortcut)(ref value)).MainKey);
}
value = configEntry.Value;
return ((KeyboardShortcut)(ref value)).IsDown();
}
}
public static class ListExtensions
{
public static T? GetOrDefault<T>(this List<T> list, int index)
{
if (list.Count > index)
{
return list[index];
}
return default(T);
}
}
}