using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using Microsoft.CodeAnalysis;
using MonoMod.RuntimeDetour.HookGen;
using On.RoR2;
using On.RoR2.UI;
using R2API.Utils;
using RiskOfOptions;
using RiskOfOptions.OptionConfigs;
using RiskOfOptions.Options;
using RoR2;
using RoR2.UI;
using TMPro;
using UnityEngine;
using UnityEngine.Networking;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("PermaPings")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("PermaPings")]
[assembly: AssemblyTitle("PermaPings")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.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.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace PermaPings
{
internal static class Hooks
{
[CompilerGenerated]
private static class <>O
{
public static hook_Update <0>__PlayerCharacterMasterController_Update;
public static Action<Stage> <1>__ResetPings;
public static hook_Update <2>__PingIndicator_Update;
public static Action<Action<NetworkIdentity, bool>, NetworkIdentity, bool> <3>__NetworkIdentity_set_isPingable;
}
public static void Init()
{
//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: Expected O, but got Unknown
//IL_0053: 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_005e: Expected O, but got Unknown
object obj = <>O.<0>__PlayerCharacterMasterController_Update;
if (obj == null)
{
hook_Update val = PlayerCharacterMasterController_Update;
<>O.<0>__PlayerCharacterMasterController_Update = val;
obj = (object)val;
}
PlayerCharacterMasterController.Update += (hook_Update)obj;
Stage.onServerStageComplete += PermaPingerController.ResetPings;
object obj2 = <>O.<2>__PingIndicator_Update;
if (obj2 == null)
{
hook_Update val2 = PingIndicator_Update;
<>O.<2>__PingIndicator_Update = val2;
obj2 = (object)val2;
}
PingIndicator.Update += (hook_Update)obj2;
MethodInfo propertySetter = Reflection.GetPropertySetter(typeof(NetworkIdentity), "isPingable");
HookEndpointManager.Add((MethodBase)propertySetter, (Delegate)new Action<Action<NetworkIdentity, bool>, NetworkIdentity, bool>(NetworkIdentity_set_isPingable));
}
private static void NetworkIdentity_set_isPingable(Action<NetworkIdentity, bool> orig, NetworkIdentity self, bool value)
{
orig(self, value);
if (!value)
{
PermaPingerController.AttemptRemovePing(self);
}
}
private static void PingIndicator_Update(orig_Update orig, PingIndicator self)
{
if (!PermaPingerController.permapingsIndicators.Contains(self))
{
orig.Invoke(self);
}
}
private static void PlayerCharacterMasterController_Update(orig_Update orig, PlayerCharacterMasterController self)
{
//IL_003d: 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)
orig.Invoke(self);
if (self.hasEffectiveAuthority && Object.op_Implicit((Object)(object)self.bodyInputs) && Object.op_Implicit((Object)(object)self.body) && PermaPingsConfig.GetPermaPingKeyDown())
{
PermaPingerController.AttemptPing(new Ray(self.bodyInputs.aimOrigin, self.bodyInputs.aimDirection), ((Component)self.body).gameObject, ((Component)self).gameObject);
}
}
}
internal static class PermaPingerController
{
private static List<PingInfo> permapings = new List<PingInfo>();
public static List<PingIndicator> permapingsIndicators = new List<PingIndicator>();
public static void AttemptPing(Ray aimRay, GameObject bodyObject, GameObject owner)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: 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)
PingInfo result = default(PingInfo);
if (PingerController.GeneratePingInfo(aimRay, bodyObject, ref result) && (Object)(object)result.targetNetworkIdentity != (Object)null)
{
int num = permapings.FindIndex((PingInfo permaping) => (Object)(object)permaping.targetNetworkIdentity == (Object)(object)result.targetNetworkIdentity);
if (num == -1)
{
permapings.Add(result);
BuildPing(result, owner);
}
else
{
RemovePing(num);
}
}
}
public static void AttemptRemovePing(NetworkIdentity networkIdentity)
{
int num = permapings.FindIndex((PingInfo permaping) => (Object)(object)permaping.targetNetworkIdentity == (Object)(object)networkIdentity);
if (num != -1)
{
RemovePing(num);
}
}
private static void BuildPing(PingInfo pingInfo, GameObject owner)
{
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: 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_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: 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_00a3: Unknown result type (might be due to invalid IL or missing references)
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
GameObject val = Object.Instantiate<GameObject>(LegacyResourcesAPI.Load<GameObject>("Prefabs/PingIndicator"));
PingIndicator component = val.GetComponent<PingIndicator>();
component.pingOwner = owner;
component.pingOrigin = pingInfo.origin;
component.pingNormal = pingInfo.normal;
component.pingTarget = ((PingInfo)(ref pingInfo)).targetGameObject;
component.RebuildPing();
Transform transform = component.interactablePingGameObjects[0].transform;
transform.localScale *= PermaPingsConfig.permaPingSize.Value / 100f;
SpriteRenderer component2 = component.interactablePingGameObjects[0].GetComponent<SpriteRenderer>();
Color color = (Color)(((??)GetItemColor(((PingInfo)(ref pingInfo)).targetGameObject)) ?? component2.color);
color.a *= PermaPingsConfig.permaPingAlpha.Value / 100f;
component2.color = color;
TextMeshPro pingText = component.pingText;
((TMP_Text)pingText).fontSize = ((TMP_Text)pingText).fontSize * (PermaPingsConfig.permaPingSize.Value / 100f);
TextMeshPro pingText2 = component.pingText;
((TMP_Text)pingText2).alpha = ((TMP_Text)pingText2).alpha * (PermaPingsConfig.permaPingAlpha.Value / 100f);
permapingsIndicators.Add(component);
}
private static Color? GetItemColor(GameObject interactable)
{
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
//IL_00b6: 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_00bf: Unknown result type (might be due to invalid IL or missing references)
if (!PermaPingsConfig.permaPingItemTierColor.Value)
{
return null;
}
GenericPickupController component;
if ((Object)(object)(component = interactable.GetComponent<GenericPickupController>()) != (Object)null)
{
return ((PickupIndex)(ref component.pickupIndex)).GetPickupColor();
}
PickupPickerController component2;
if ((Object)(object)interactable.GetComponent<ScrapperController>() == (Object)null && (Object)(object)(component2 = interactable.GetComponent<PickupPickerController>()) != (Object)null && component2.options.Length != 0)
{
return ((PickupIndex)(ref component2.options[0].pickupIndex)).GetPickupColor();
}
ShopTerminalBehavior component3;
if ((Object)(object)(component3 = interactable.GetComponent<ShopTerminalBehavior>()) != (Object)null)
{
PickupIndex val = component3.CurrentPickupIndex();
return ((PickupIndex)(ref val)).GetPickupColor();
}
return null;
}
internal static void RemovePing(int index)
{
permapings.RemoveAt(index);
if ((Object)(object)permapingsIndicators[index] != (Object)null && (Object)(object)((Component)permapingsIndicators[index]).gameObject != (Object)null)
{
PingIndicator obj = permapingsIndicators[index];
Object.Destroy((Object)(object)((obj != null) ? ((Component)obj).gameObject : null));
}
permapingsIndicators.RemoveAt(index);
}
internal static void ResetPings(Stage stage)
{
permapings = new List<PingInfo>();
permapingsIndicators = new List<PingIndicator>();
}
}
[BepInPlugin("kyryh.permapings", "PermaPings", "1.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class PermaPings : BaseUnityPlugin
{
public const string PluginGUID = "kyryh.permapings";
public const string PluginName = "PermaPings";
public const string PluginVersion = "1.0.0";
public static ManualLogSource Log { get; private set; }
private void Awake()
{
Log = ((BaseUnityPlugin)this).Logger;
PermaPingsConfig.Init(((BaseUnityPlugin)this).Config);
Hooks.Init();
((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin kyryh.permapings is loaded!");
}
public static void LogDebug(object data)
{
Log.LogDebug(data);
}
public static void LogError(object data)
{
Log.LogError(data);
}
}
internal static class PermaPingsConfig
{
public static ConfigEntry<KeyboardShortcut> permaPingKey;
public static ConfigEntry<float> permaPingAlpha;
public static ConfigEntry<float> permaPingSize;
public static ConfigEntry<bool> permaPingItemTierColor;
public static void Init(ConfigFile config)
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
permaPingKey = config.Bind<KeyboardShortcut>("Keybinds", "PermaPingButton", new KeyboardShortcut((KeyCode)326, Array.Empty<KeyCode>()), "Which key to use to place a permanent ping");
permaPingAlpha = config.Bind<float>("Visuals", "PermaPingAlpha", 50f, "Alpha value of the perma-ping icon, i.e. how opaque it is\n100 means it's completely visible, 0 means it's completely transparent");
permaPingSize = config.Bind<float>("Visuals", "PermaPingSize", 75f, "Size of the perma-ping icon and text");
permaPingItemTierColor = config.Bind<bool>("Visuals", "PermaPingItemTierColor", true, "Whether to use the pinged item's tier as the ping's color");
if (Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions"))
{
AddConfigOptions();
}
}
public static bool GetPermaPingKeyDown()
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
IInputSystem current = UnityInput.Current;
KeyboardShortcut value = permaPingKey.Value;
return current.GetKeyDown(((KeyboardShortcut)(ref value)).MainKey);
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
private static void AddConfigOptions()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Expected O, but got Unknown
//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_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Expected O, but got Unknown
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Expected O, but got Unknown
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Expected O, but got Unknown
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Expected O, but got Unknown
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_0076: Expected O, but got Unknown
ModSettingsManager.AddOption((BaseOption)new KeyBindOption(permaPingKey));
ModSettingsManager.AddOption((BaseOption)new SliderOption(permaPingAlpha, new SliderConfig
{
min = 0f,
max = 100f
}));
ModSettingsManager.AddOption((BaseOption)new SliderOption(permaPingSize, new SliderConfig
{
min = 0f,
max = 100f
}));
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(permaPingItemTierColor));
}
}
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "PermaPings";
public const string PLUGIN_NAME = "PermaPings";
public const string PLUGIN_VERSION = "1.0.0";
}
}