Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of ScrapMore v1.3.0
plugins/ScrapMore/ScrapMore.dll
Decompiled 8 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using Microsoft.CodeAnalysis; using MonoMod.RuntimeDetour; using On.RoR2; using RoR2; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Events; using UnityEngine.Networking; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.UI; [assembly: AssemblyTitle("ScrapMore")] [assembly: AssemblyProduct("ScrapMore")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyCompany("ScrapMore")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: CompilationRelaxations(8)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] [Microsoft.CodeAnalysis.Embedded] [CompilerGenerated] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ScrapMore { internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object data) { _logSource.LogDebug(data); } internal static void Error(object data) { _logSource.LogError(data); } internal static void Fatal(object data) { _logSource.LogFatal(data); } internal static void Info(object data) { _logSource.LogInfo(data); } internal static void Message(object data) { _logSource.LogMessage(data); } internal static void Warning(object data) { _logSource.LogWarning(data); } } [BepInPlugin("Rude.ScrapMore", "ScrapMore", "1.0.0")] public class ScrapMorePlugin : BaseUnityPlugin { public const string PluginGUID = "Rude.ScrapMore"; public const string PluginAuthor = "Rude"; public const string PluginName = "ScrapMore"; public const string PluginVersion = "1.0.0"; private static Hook overrideHook; private Queue<QueuedScrapOperation> scrapQueue = new Queue<QueuedScrapOperation>(); private int scrapAmount = 0; public void Start() { } public void Awake() { Log.Init(((BaseUnityPlugin)this).Logger); Log.Info("Initiated logger"); AddNetworkBehaviour(); HookScrapping(); HookWindow(); } public void Update() { if (scrapQueue.Count > 0) { Log.Info("Scrap queue contains item"); QueuedScrapOperation queuedScrapOperation = scrapQueue.Peek(); Log.Info($"Scrap amount we want: {scrapAmount}; Scrap amount we have: {queuedScrapOperation.scrapper.maxItemsToScrapAtATime}"); if (queuedScrapOperation.scrapper.maxItemsToScrapAtATime == scrapAmount) { Log.Info("Doing scrap"); scrapQueue.Dequeue().doScrap(); } } } private void AddNetworkBehaviour() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) AsyncOperationHandle<GameObject> val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Core/PlayerMaster.prefab"); val.Completed += delegate(AsyncOperationHandle<GameObject> obj) { if (Object.op_Implicit((Object)(object)obj.Result)) { obj.Result.AddComponent<ShareScrapperAmount>(); } }; } private void createSlider(Transform canvasTransform, int maxItems) { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Expected O, but got Unknown //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0089: 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_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Expected O, but got Unknown //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Expected O, but got Unknown //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_0213: Unknown result type (might be due to invalid IL or missing references) //IL_021a: Expected O, but got Unknown //IL_0243: Unknown result type (might be due to invalid IL or missing references) //IL_025a: Unknown result type (might be due to invalid IL or missing references) //IL_0271: Unknown result type (might be due to invalid IL or missing references) //IL_0288: Unknown result type (might be due to invalid IL or missing references) //IL_02b8: Unknown result type (might be due to invalid IL or missing references) //IL_02bf: Expected O, but got Unknown //IL_02df: Unknown result type (might be due to invalid IL or missing references) //IL_02ff: Unknown result type (might be due to invalid IL or missing references) //IL_03a8: Unknown result type (might be due to invalid IL or missing references) //IL_03af: Expected O, but got Unknown //IL_03d3: Unknown result type (might be due to invalid IL or missing references) //IL_03ea: Unknown result type (might be due to invalid IL or missing references) //IL_0439: Unknown result type (might be due to invalid IL or missing references) GameObject val2 = new GameObject("MyManualSlider", new Type[4] { typeof(RectTransform), typeof(CanvasRenderer), typeof(Image), typeof(Slider) }); val2.transform.SetParent(canvasTransform, false); RectTransform component = val2.GetComponent<RectTransform>(); component.sizeDelta = new Vector2(400f, 20f); component.anchoredPosition = new Vector2(0f, 450f); Image component2 = val2.GetComponent<Image>(); ((Graphic)component2).color = new Color(0f, 0f, 0f, 0.5f); GameObject val3 = new GameObject("Fill Area", new Type[1] { typeof(RectTransform) }); val3.transform.SetParent(val2.transform, false); RectTransform component3 = val3.GetComponent<RectTransform>(); component3.anchorMin = new Vector2(0f, 0f); component3.anchorMax = new Vector2(1f, 1f); component3.offsetMin = new Vector2(5f, 5f); component3.offsetMax = new Vector2(-5f, -5f); GameObject val4 = new GameObject("Fill", new Type[2] { typeof(RectTransform), typeof(Image) }); val4.transform.SetParent(val3.transform, false); Image component4 = val4.GetComponent<Image>(); ((Graphic)component4).color = Color.white; RectTransform component5 = val4.GetComponent<RectTransform>(); component5.anchorMin = new Vector2(0f, 0f); component5.anchorMax = new Vector2(1f, 1f); component5.offsetMin = Vector2.zero; component5.offsetMax = Vector2.zero; GameObject val5 = new GameObject("Handle Slide Area", new Type[1] { typeof(RectTransform) }); val5.transform.SetParent(val2.transform, false); RectTransform component6 = val5.GetComponent<RectTransform>(); component6.anchorMin = new Vector2(0f, 0f); component6.anchorMax = new Vector2(1f, 1f); component6.offsetMin = new Vector2(5f, 5f); component6.offsetMax = new Vector2(-5f, -5f); GameObject val6 = new GameObject("Handle", new Type[2] { typeof(RectTransform), typeof(Image) }); val6.transform.SetParent(val5.transform, false); Image component7 = val6.GetComponent<Image>(); ((Graphic)component7).color = Color.white; RectTransform component8 = val6.GetComponent<RectTransform>(); component8.sizeDelta = new Vector2(20f, 20f); Slider component9 = val2.GetComponent<Slider>(); component9.fillRect = component5; component9.handleRect = component8; ((Selectable)component9).targetGraphic = (Graphic)(object)component7; component9.direction = (Direction)0; component9.minValue = 1f; component9.maxValue = Math.Max(10, maxItems); component9.value = 10f; component9.wholeNumbers = true; ((Selectable)component9).interactable = true; GameObject val7 = new GameObject("ScrapAmountText", new Type[3] { typeof(RectTransform), typeof(CanvasRenderer), typeof(Text) }); val7.transform.SetParent(canvasTransform, false); RectTransform component10 = val7.GetComponent<RectTransform>(); component10.sizeDelta = new Vector2(300f, 30f); component10.anchoredPosition = new Vector2(0f, 470f); Text scrapAmountText = val7.GetComponent<Text>(); scrapAmountText.font = Resources.GetBuiltinResource<Font>("Arial.ttf"); scrapAmountText.fontSize = 18; scrapAmountText.alignment = (TextAnchor)4; ((Graphic)scrapAmountText).color = Color.white; scrapAmountText.text = $"Scrap amount: {component9.value}"; ((UnityEvent<float>)(object)component9.onValueChanged).AddListener((UnityAction<float>)delegate(float val) { scrapAmount = Mathf.RoundToInt(val); scrapAmountText.text = $"Scrap amount: {scrapAmount}"; }); } private void changeScrapperAmount(ScrapperController scrapperController, int amount) { LocalUser firstLocalUser = LocalUserManager.GetFirstLocalUser(); if (firstLocalUser != null && (Object)(object)firstLocalUser.cachedMaster != (Object)null) { ((Component)firstLocalUser.cachedMaster).GetComponent<ShareScrapperAmount>().ChangeScrapperAmount(((Component)scrapperController).gameObject, amount); } } private void HookScrapping() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown ScrapperController.BeginScrapping += (hook_BeginScrapping)delegate(orig_BeginScrapping orig, ScrapperController self, int activator) { ((object)orig).GetType(); changeScrapperAmount(self, scrapAmount); QueuedScrapOperation item = new QueuedScrapOperation(delegate { orig.Invoke(self, activator); }, self, scrapAmount); scrapQueue.Enqueue(item); }; } private void HookWindow() { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown MethodInfo method = typeof(PickupPickerController).GetMethod("OnDisplayBegin", BindingFlags.Instance | BindingFlags.NonPublic); MethodInfo method2 = typeof(ScrapMorePlugin).GetMethod("OnDisplayBegin", BindingFlags.Instance | BindingFlags.NonPublic); overrideHook = new Hook((MethodBase)method, method2, (object)this); } private void OnDisplayBegin(Action<PickupPickerController, NetworkUIPromptController, LocalUser, CameraRigController> orig, PickupPickerController self, NetworkUIPromptController networkUIPromptController, LocalUser localUser, CameraRigController cameraRigController) { orig(self, networkUIPromptController, localUser, cameraRigController); Transform canvasTransform = ((Component)self.panelInstanceController).transform.Find("MainPanel"); Inventory inventory = LocalUserManager.GetFirstLocalUser().cachedMasterController.master.inventory; scrapAmount = 10; createSlider(canvasTransform, inventory.itemStacks.Max()); Log.Info("Created game object"); } } internal class ShareScrapperAmount : NetworkBehaviour { private static int kCmdCmdChangeScrapperAmount; private static int kRpcRpcChangeScrapperAmount; public void ChangeScrapperAmount(GameObject scrapper, int amount) { if (NetworkServer.active) { CallRpcChangeScrapperAmount(scrapper, amount); } else { CallCmdChangeScrapperAmount(scrapper, amount); } } [Command] private void CmdChangeScrapperAmount(GameObject scrapper, int amount) { Log.Info($"Client changing scrapper amount on {((Object)scrapper).name} to {amount}"); CallRpcChangeScrapperAmount(scrapper, amount); } [ClientRpc] private void RpcChangeScrapperAmount(GameObject scrapper, int amount) { Log.Info($"Server changing scrapper amount on {((Object)scrapper).name} to {amount}"); ChangeScrapperAmountInternal(scrapper, amount); } private void ChangeScrapperAmountInternal(GameObject scrapper, int amount) { if ((Object)(object)scrapper == (Object)null) { Log.Error("Error: Scrapper game object is null"); } ScrapperController component = scrapper.GetComponent<ScrapperController>(); if ((Object)(object)component == (Object)null) { Log.Error("Error: Game object " + ((Object)scrapper).name + " is not a valid scrapper"); } component.maxItemsToScrapAtATime = amount; } private void UNetVersion() { } protected static void InvokeCmdCmdChangeScrapperAmount(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkServer.active) { Debug.LogError((object)"Command CmdChangeScrapperAmount called on client."); } else { ((ShareScrapperAmount)(object)obj).CmdChangeScrapperAmount(reader.ReadGameObject(), (int)reader.ReadPackedUInt32()); } } public void CallCmdChangeScrapperAmount(GameObject scrapper, int amount) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_005c: Unknown result type (might be due to invalid IL or missing references) if (!NetworkClient.active) { Debug.LogError((object)"Command function CmdChangeScrapperAmount called on server."); return; } if (((NetworkBehaviour)this).isServer) { CmdChangeScrapperAmount(scrapper, amount); return; } NetworkWriter val = new NetworkWriter(); val.Write((short)0); val.Write((short)5); val.WritePackedUInt32((uint)kCmdCmdChangeScrapperAmount); val.Write(((Component)this).GetComponent<NetworkIdentity>().netId); val.Write(scrapper); val.WritePackedUInt32((uint)amount); ((NetworkBehaviour)this).SendCommandInternal(val, 0, "CmdChangeScrapperAmount"); } protected static void InvokeRpcRpcChangeScrapperAmount(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkClient.active) { Debug.LogError((object)"RPC RpcChangeScrapperAmount called on server."); } else { ((ShareScrapperAmount)(object)obj).RpcChangeScrapperAmount(reader.ReadGameObject(), (int)reader.ReadPackedUInt32()); } } public void CallRpcChangeScrapperAmount(GameObject scrapper, int amount) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { Debug.LogError((object)"RPC Function RpcChangeScrapperAmount called on client."); return; } NetworkWriter val = new NetworkWriter(); val.Write((short)0); val.Write((short)2); val.WritePackedUInt32((uint)kRpcRpcChangeScrapperAmount); val.Write(((Component)this).GetComponent<NetworkIdentity>().netId); val.Write(scrapper); val.WritePackedUInt32((uint)amount); ((NetworkBehaviour)this).SendRPCInternal(val, 0, "RpcChangeScrapperAmount"); } static ShareScrapperAmount() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown kCmdCmdChangeScrapperAmount = -700044649; NetworkBehaviour.RegisterCommandDelegate(typeof(ShareScrapperAmount), kCmdCmdChangeScrapperAmount, new CmdDelegate(InvokeCmdCmdChangeScrapperAmount)); kRpcRpcChangeScrapperAmount = -1824389267; NetworkBehaviour.RegisterRpcDelegate(typeof(ShareScrapperAmount), kRpcRpcChangeScrapperAmount, new CmdDelegate(InvokeRpcRpcChangeScrapperAmount)); NetworkCRC.RegisterBehaviour("ShareScrapperAmount", 0); } public override bool OnSerialize(NetworkWriter writer, bool forceAll) { bool result = default(bool); return result; } public override void OnDeserialize(NetworkReader reader, bool initialState) { } } internal class QueuedScrapOperation { public readonly Action doScrap; public readonly ScrapperController scrapper; public readonly int scrapAmount; public QueuedScrapOperation(Action doScrap, ScrapperController scrapper, int scrapAmount) { this.doScrap = doScrap; this.scrapper = scrapper; this.scrapAmount = scrapAmount; } } }