using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using MenuLib;
using MenuLib.MonoBehaviors;
using Photon.Pun;
using Photon.Realtime;
using TMPro;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyCompany("RightsManager")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+f46a21aecbead1b7bf05e3100fa98dd5145a387e")]
[assembly: AssemblyProduct("RightsManager")]
[assembly: AssemblyTitle("RightsManager")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace RightsManager;
[HarmonyPatch(typeof(ChatManager))]
internal class ChatManagerPatch
{
[HarmonyPatch("MessageSend")]
[HarmonyPrefix]
private static bool MessageSend_Prefix(ChatManager __instance, ref string ___chatMessage)
{
string[] array = ___chatMessage.Replace("|", string.Empty).ToLower().Split(' ');
string text = array[0];
string text2 = text;
if (text2 == "!rm")
{
UI.instance.OpenList();
return false;
}
return true;
}
}
internal static class Data
{
public const string Name = "Rights Manager";
public const string GUID = "com.coolchair.rightsmanager";
public const string Version = "1.0.0";
}
internal static class Lib
{
internal static Player GetPlayer(PlayerHealth health)
{
try
{
return GetPlayer(((Component)health).GetComponent());
}
catch
{
return null;
}
}
internal static Player GetPlayer(PhysGrabber grabber)
{
try
{
return GetPlayer(((Component)grabber).GetComponent());
}
catch
{
return null;
}
}
internal static Player GetPlayer(PlayerTumble tumble)
{
try
{
return GetPlayer(((Component)((Component)tumble).transform.parent).GetComponentInChildren());
}
catch
{
return null;
}
}
internal static Player GetPlayer(PlayerAvatar avatar)
{
try
{
return ((Component)avatar).GetComponent().Owner;
}
catch
{
return null;
}
}
internal static PlayerAvatar GetAvatar(Player p)
{
if (p == null)
{
return null;
}
try
{
return SemiFunc.PlayerAvatarGetFromPhotonPlayer(p);
}
catch
{
return null;
}
}
internal static PlayerDeathHead GetHead(Player p)
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Expected O, but got Unknown
try
{
PlayerAvatar avatar = GetAvatar(p);
if ((Object)(object)avatar == (Object)null)
{
return null;
}
return (PlayerDeathHead)GetValue(avatar, "playerDeathHead");
}
catch
{
return null;
}
}
internal static PlayerTumble GetTumble(Player p)
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Expected O, but got Unknown
try
{
PlayerAvatar avatar = GetAvatar(p);
if ((Object)(object)avatar == (Object)null)
{
return null;
}
return (PlayerTumble)GetValue(avatar, "tumble");
}
catch
{
return null;
}
}
internal static void Revive(Player p)
{
try
{
GetAvatar(p).Revive(false);
}
catch
{
}
}
internal static void Death(Player p)
{
try
{
GetAvatar(p).PlayerDeath(-1);
}
catch
{
}
}
internal static void Teleport(Player p, Vector3 pos)
{
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: 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_0060: Unknown result type (might be due to invalid IL or missing references)
try
{
PlayerAvatar avatar = GetAvatar(p);
if (!((Object)(object)avatar == (Object)null))
{
if ((bool)GetValue(avatar, "deadSet"))
{
Transform(((Component)GetHead(p)).gameObject, pos);
}
else if ((bool)GetValue(avatar, "isTumbling"))
{
Transform(((Component)GetTumble(p)).gameObject, pos);
}
else
{
avatar.Spawn(pos, Quaternion.identity);
}
}
}
catch
{
}
}
internal static void Transform(GameObject go, Vector3 position)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
Transform(go, position, go.transform.rotation);
}
internal static void Transform(GameObject go, Vector3 position, Quaternion rotation)
{
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
if (!SemiFunc.IsMasterClientOrSingleplayer())
{
return;
}
Rigidbody val = go.GetComponent();
if ((Object)(object)val == (Object)null)
{
val = go.GetComponentInChildren();
if ((Object)(object)val == (Object)null)
{
if (SemiFunc.IsMultiplayer())
{
return;
}
go.transform.position = position;
go.transform.rotation = rotation;
}
}
val.Move(position, rotation);
}
internal static bool IsChatOpened()
{
return (Object)(object)ChatManager.instance != (Object)null && (bool)GetValue(ChatManager.instance, "chatActive");
}
internal static bool IsAvaiable()
{
return SemiFunc.IsMasterClient() && SemiFunc.IsMultiplayer() && !SemiFunc.IsMainMenu() && !SemiFunc.IsSplashScreen();
}
internal static bool GetKeyDown(KeyCode key)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
return Input.GetKeyDown(key) && !IsChatOpened();
}
internal static FieldInfo GetField(object inst, string field)
{
return inst.GetType().GetField(field, BindingFlags.Instance | BindingFlags.NonPublic);
}
internal static object GetValue(object inst, string field)
{
return GetField(inst, field).GetValue(inst);
}
}
[BepInPlugin("com.coolchair.rightsmanager", "Rights Manager", "1.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
internal class Loader : BaseUnityPlugin
{
internal static ConfigEntry menuKey;
private void Awake()
{
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
((BaseUnityPlugin)this).Logger.LogInfo((object)"Loading...");
((BaseUnityPlugin)this).Logger.LogInfo((object)"Patching...");
new Harmony("com.coolchair.rightsmanager").PatchAll();
((BaseUnityPlugin)this).Logger.LogInfo((object)"Patched!");
((BaseUnityPlugin)this).Logger.LogInfo((object)"Loading configs...");
menuKey = ((BaseUnityPlugin)this).Config.Bind("Binds", "Menu", (KeyCode)291, (ConfigDescription)null);
((BaseUnityPlugin)this).Logger.LogInfo((object)"Configs loaded!");
((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded!");
}
}
[HarmonyPatch(typeof(PlayerHealth))]
internal static class PlayerHealthPatch
{
[HarmonyPatch("UpdateHealthRPC")]
[HarmonyPrefix]
private static bool UpdateHealthRPC_Prefix(PlayerHealth __instance, int healthNew, int healthMax, bool effect, bool hurtByHeal, PhotonMessageInfo _info = default(PhotonMessageInfo))
{
Player player = Lib.GetPlayer(__instance);
if (player == null)
{
return true;
}
if (!RM.HasRight(player, "health_lose") && (int)Lib.GetValue(__instance, "health") > healthNew)
{
((Component)__instance).GetComponent().RPC("UpdateHealthRPC", (RpcTarget)1, new object[4]
{
(int)Lib.GetValue(__instance, "health"),
healthMax,
false,
false
});
return false;
}
if (!RM.HasRight(player, "health_get") && (int)Lib.GetValue(__instance, "health") < healthNew)
{
((Component)__instance).GetComponent().RPC("UpdateHealthRPC", (RpcTarget)1, new object[4]
{
(int)Lib.GetValue(__instance, "health"),
healthMax,
false,
false
});
return false;
}
return true;
}
[HarmonyPatch("HurtOther")]
[HarmonyPrefix]
private static bool HurtOther_Prefix(PlayerHealth __instance, int damage, Vector3 hurtPosition, bool savingGrace, int enemyIndex = -1, bool hurtByHeal = false)
{
Player player = Lib.GetPlayer(__instance);
if (player == null)
{
return true;
}
if (!RM.HasRight(player, "health_lose"))
{
return false;
}
return true;
}
}
[HarmonyPatch(typeof(PlayerTumble))]
internal static class PlayerTumblePatch
{
[HarmonyPatch("TumbleForceRPC")]
[HarmonyPrefix]
private static bool TumbleForceRPC_Prefix(PlayerTumble __instance)
{
Player player = Lib.GetPlayer(__instance);
if (player == null)
{
return true;
}
if (!RM.HasRight(player, "tumble_jump"))
{
return false;
}
return true;
}
[HarmonyPatch("TumbleTorqueRPC")]
[HarmonyPrefix]
private static bool TumbleTorqueRPC_Prefix(PlayerTumble __instance)
{
Player player = Lib.GetPlayer(__instance);
if (player == null)
{
return true;
}
if (!RM.HasRight(player, "tumble_jump"))
{
return false;
}
return true;
}
[HarmonyPatch("TumbleRequestRPC")]
[HarmonyPrefix]
private static bool TumbleRequestRPC_Prefix(PlayerTumble __instance, bool _isTumbling)
{
Player player = Lib.GetPlayer(__instance);
if (player == null)
{
return true;
}
if (!RM.HasRight(player, "tumble_start") && _isTumbling)
{
return false;
}
if (!RM.HasRight(player, "tumble_end") && !_isTumbling)
{
return false;
}
return true;
}
}
[HarmonyPatch(typeof(PlayerAvatar))]
internal static class PlayerAvatarPatch
{
[HarmonyPatch("PlayerDeath")]
[HarmonyPrefix]
private static bool PlayerDeath_Prefix(PlayerAvatar __instance)
{
Player player = Lib.GetPlayer(__instance);
if (player == null)
{
return true;
}
if (!RM.HasRight(player, "health_death"))
{
return false;
}
return true;
}
[HarmonyPatch("PlayerDeathRPC")]
[HarmonyPrefix]
private static bool PlayerDeathRPC_Prefix(PlayerAvatar __instance)
{
Player player = Lib.GetPlayer(__instance);
if (player == null)
{
return true;
}
if (!RM.HasRight(player, "health_death"))
{
Lib.Revive(player);
return true;
}
return true;
}
}
[HarmonyPatch(typeof(ItemEquippable))]
internal static class ItemEquippablePatch
{
[HarmonyPatch("RPC_RequestEquip")]
[HarmonyPrefix]
private static bool RPC_RequestEquip_Prefix(ItemEquippable __instance, int physGrabberPhotonViewID)
{
Player owner = PhotonView.Find(physGrabberPhotonViewID).Owner;
try
{
return RM.HasRight(owner, "item_equip");
}
catch
{
return true;
}
}
}
[HarmonyPatch(typeof(PhysGrabObject))]
internal static class PhysGrabObjectPatch
{
private static bool CheckGrab(PhysGrabObject __instance, int playerPhotonID)
{
if ((Object)(object)((Component)__instance).GetComponent() != (Object)null && !RM.HasRight(PhotonView.Find(playerPhotonID).Owner, "valuable_grab"))
{
return false;
}
if ((Object)(object)((Component)__instance).GetComponent() != (Object)null && !RM.HasRight(PhotonView.Find(playerPhotonID).Owner, "item_grab"))
{
return false;
}
if ((Object)(object)((Component)__instance).GetComponent() != (Object)null && !RM.HasRight(PhotonView.Find(playerPhotonID).Owner, "tumble_grab"))
{
return false;
}
if ((Object)(object)((Component)__instance).GetComponent() != (Object)null && !RM.HasRight(PhotonView.Find(playerPhotonID).Owner, "head_grab"))
{
return false;
}
return true;
}
[HarmonyPatch("GrabStartedRPC")]
[HarmonyPrefix]
private static bool GrabStartedRPC_Prefix(PhysGrabObject __instance, int playerPhotonID)
{
return CheckGrab(__instance, playerPhotonID);
}
}
[HarmonyPatch(typeof(GameplayManager))]
internal static class GameplayManagerPatch
{
[HarmonyPatch("Start")]
[HarmonyPostfix]
private static void Start_Postfix(GameplayManager __instance)
{
((Component)__instance).gameObject.AddComponent();
}
}
internal static class RM
{
private static Dictionary> Rights = new Dictionary>();
internal static Collection GetBaseRights()
{
Collection collection = new Collection();
collection.Add("valuable_grab");
collection.Add("item_grab");
collection.Add("item_equip");
collection.Add("tumble_start");
collection.Add("tumble_end");
collection.Add("tumble_jump");
collection.Add("tumble_grab");
collection.Add("head_grab");
collection.Add("health_lose");
collection.Add("health_get");
collection.Add("health_death");
return collection;
}
private static Collection Validate(Player p)
{
if (!Rights.ContainsKey(p))
{
Rights.Add(p, GetBaseRights());
}
return Rights[p];
}
internal static bool HasRight(Player p, string right)
{
return Validate(p).Contains(right);
}
internal static void AddRight(Player p, string right)
{
if (Lib.IsAvaiable() && !HasRight(p, right))
{
Validate(p).Add(right);
}
}
internal static void RemoveRight(Player p, string right)
{
if (Lib.IsAvaiable() && HasRight(p, right))
{
Validate(p).Remove(right);
}
}
}
internal class UI : MonoBehaviour
{
internal static UI instance;
internal static REPOPopupPage playerslist;
internal static REPOPopupPage rightslist;
internal static Player selectedPlayer;
internal static Dictionary rb;
private void Awake()
{
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Expected O, but got Unknown
instance = this;
playerslist = null;
rightslist = null;
selectedPlayer = null;
rb = new Dictionary();
if (Lib.IsAvaiable())
{
MenuAPI.AddElementToEscapeMenu((BuilderDelegate)delegate(Transform parent)
{
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
MenuAPI.CreateREPOButton("Rights", (Action)OpenList, parent, new Vector2(200f, 65f));
});
}
}
internal void ReloadRights()
{
if ((Object)(object)rightslist != (Object)null && ((Behaviour)rightslist).isActiveAndEnabled)
{
rightslist.ClosePage(false);
Object.Destroy((Object)(object)rightslist);
}
rightslist = null;
OpenRights();
}
private void OpenRights()
{
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_0076: Expected O, but got Unknown
if ((Object)(object)rightslist == (Object)null)
{
rb = new Dictionary();
rightslist = MenuAPI.CreateREPOPopupPage("Rights", (PresetSide)1, false, false, 0f);
foreach (string right in RM.GetBaseRights())
{
rightslist.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform parent)
{
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
REPOButton val = MenuAPI.CreateREPOButton(right + " " + (RM.HasRight(selectedPlayer, right) ? "V" : "X"), (Action)delegate
{
if (RM.HasRight(selectedPlayer, right))
{
RM.RemoveRight(selectedPlayer, right);
((TMP_Text)rb[right].labelTMP).text = right + " " + (RM.HasRight(selectedPlayer, right) ? "V" : "X");
}
else
{
RM.AddRight(selectedPlayer, right);
((TMP_Text)rb[right].labelTMP).text = right + " " + (RM.HasRight(selectedPlayer, right) ? "V" : "X");
}
}, parent, default(Vector2));
rb.Add(right, val);
return ((REPOElement)val).rectTransform;
}, 0f, 0f);
}
rightslist.OpenPage(true);
}
else if (!((Behaviour)rightslist).isActiveAndEnabled)
{
rightslist.OpenPage(true);
}
}
internal void OpenList()
{
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
//IL_00a7: Expected O, but got Unknown
if (!Lib.IsAvaiable())
{
return;
}
if ((Object)(object)playerslist != (Object)null && ((Behaviour)playerslist).isActiveAndEnabled)
{
playerslist.ClosePage(false);
Object.Destroy((Object)(object)playerslist);
}
playerslist = MenuAPI.CreateREPOPopupPage("Players", (PresetSide)0, false, false, 0f);
Player[] playerList = PhotonNetwork.PlayerList;
foreach (Player p in playerList)
{
playerslist.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform parent)
{
//IL_002e: 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)
REPOButton val = MenuAPI.CreateREPOButton(p.NickName, (Action)delegate
{
selectedPlayer = p;
ReloadRights();
}, parent, default(Vector2));
return ((REPOElement)val).rectTransform;
}, 0f, 0f);
}
playerslist.OpenPage(true);
}
private void Update()
{
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
if (Lib.IsAvaiable() && Lib.GetKeyDown(Loader.menuKey.Value))
{
OpenList();
}
}
}