Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of RightsManager v1.0.1
RightsManager.dll
Decompiled a day agousing 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("<b>|</b>", 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<PlayerAvatar>()); } catch { return null; } } internal static Player GetPlayer(PhysGrabber grabber) { try { return GetPlayer(((Component)grabber).GetComponent<PlayerAvatar>()); } catch { return null; } } internal static Player GetPlayer(PlayerTumble tumble) { try { return GetPlayer(((Component)((Component)tumble).transform.parent).GetComponentInChildren<PlayerAvatar>()); } catch { return null; } } internal static Player GetPlayer(PlayerAvatar avatar) { try { return ((Component)avatar).GetComponent<PhotonView>().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<Rigidbody>(); if ((Object)(object)val == (Object)null) { val = go.GetComponentInChildren<Rigidbody>(); 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<KeyCode> 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<KeyCode>("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<PhotonView>().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<PhotonView>().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<ValuableObject>() != (Object)null && !RM.HasRight(PhotonView.Find(playerPhotonID).Owner, "valuable_grab")) { return false; } if ((Object)(object)((Component)__instance).GetComponent<ItemAttributes>() != (Object)null && !RM.HasRight(PhotonView.Find(playerPhotonID).Owner, "item_grab")) { return false; } if ((Object)(object)((Component)__instance).GetComponent<PlayerTumble>() != (Object)null && !RM.HasRight(PhotonView.Find(playerPhotonID).Owner, "tumble_grab")) { return false; } if ((Object)(object)((Component)__instance).GetComponent<PlayerDeathHead>() != (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<UI>(); } } internal static class RM { private static Dictionary<Player, Collection<string>> Rights = new Dictionary<Player, Collection<string>>(); internal static Collection<string> GetBaseRights() { Collection<string> collection = new Collection<string>(); 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<string> 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<string, REPOButton> 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<string, REPOButton>(); 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<string, REPOButton>(); 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(); } } }