Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of DroneRecycler v1.1.0
DroneRecycler.dll
Decompiled 6 months agousing System; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using Microsoft.CodeAnalysis; using Mono.Cecil; using MonoMod.Cil; using On.RoR2; using On.RoR2.CharacterAI; using RiskOfOptions; using RiskOfOptions.Options; using RoR2; using RoR2.CharacterAI; using RoR2.UI; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Networking; [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Chinchi")] [assembly: AssemblyConfiguration("Release")] [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyDescription("The Equipment Drone uses the Recycler on command.")] [assembly: AssemblyProduct("DroneRecycler")] [assembly: AssemblyTitle("DroneRecycler")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/schinchi/DroneRecycler")] [assembly: AssemblyFileVersion("1.1.0.0")] [assembly: AssemblyInformationalVersion("1.1.0+81774e8a0e13c35e2c6da54a06d7481e933e9a2c")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.0.0")] [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 DroneRecycler { internal class Configs { internal static ConfigEntry<KeyboardShortcut> CommandKey { get; private set; } internal static ConfigEntry<bool> IsCommandManual { get; private set; } internal static void Init(ConfigFile config, string assemblyLocation) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) CommandKey = config.Bind<KeyboardShortcut>("Settings", "Command Key", new KeyboardShortcut((KeyCode)99, Array.Empty<KeyCode>()), "Which key to use to manually issue or revoke the recycling command."); IsCommandManual = config.Bind<bool>("Settings", "Is Command Manual", false, "Whether assigning an Equipment Drone to recycle an item is done by pressing a key (see 'Command Key') after pinging a pickup or it is done automatically. If this is enabled, the 'Command Key' can further be used to revoke the command."); if (Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions")) { RiskOfOptionsInit(assemblyLocation); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static void RiskOfOptionsInit(string assemblyLocation) { //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Expected O, but got Unknown //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Expected O, but got Unknown //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) FileInfo fileInfo = null; FileInfo[] files = new DirectoryInfo(Path.GetDirectoryName(assemblyLocation)).GetFiles("icon.png", SearchOption.TopDirectoryOnly); if (files != null && files.Length != 0) { fileInfo = files[0]; } if (fileInfo != null) { string name = "DroneRecyclerIcon"; Texture2D val = new Texture2D(256, 256); ((Object)val).name = name; if (ImageConversion.LoadImage(val, File.ReadAllBytes(fileInfo.FullName))) { Sprite obj = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f)); ((Object)obj).name = name; ModSettingsManager.SetModIcon(obj, "Chinchi.DroneRecycler", "DroneRecycler"); } } ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(IsCommandManual)); ModSettingsManager.AddOption((BaseOption)new KeyBindOption(CommandKey)); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("Chinchi.DroneRecycler", "DroneRecycler", "1.1.0")] public class DroneRecycler : BaseUnityPlugin { public const string PluginGUID = "Chinchi.DroneRecycler"; public const string PluginAuthor = "Chinchi"; public const string PluginName = "DroneRecycler"; public const string PluginVersion = "1.1.0"; internal const string RiskOfOptionsGUID = "com.rune580.riskofoptions"; internal static MasterIndex equipmentDroneIndex = MasterIndex.none; public void Awake() { Log.Init(((BaseUnityPlugin)this).Logger); Configs.Init(((BaseUnityPlugin)this).Config, ((BaseUnityPlugin)this).Info.Location); Hooks.Init(); RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(Patch)); } private void Update() { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)Run.instance) || !Configs.IsCommandManual.Value) { return; } KeyboardShortcut value = Configs.CommandKey.Value; if (!Input.GetKeyDown(((KeyboardShortcut)(ref value)).MainKey)) { return; } value = Configs.CommandKey.Value; if (!((KeyboardShortcut)(ref value)).Modifiers.All((Func<KeyCode, bool>)Input.GetKey) || MPEventSystemManager.eventSystems.Values.Any((MPEventSystem x) => Object.op_Implicit((Object)(object)x) & Object.op_Implicit((Object)(object)((EventSystem)x).currentSelectedGameObject)) || Object.op_Implicit((Object)(object)EventSystem.current.currentSelectedGameObject) || PauseScreenController.instancesList.Count > 0) { return; } NetworkUser? obj = NetworkUser.readOnlyLocalPlayersList.FirstOrDefault(); CharacterMaster val = ((obj != null) ? obj.master : null); if (Object.op_Implicit((Object)(object)val)) { CharacterMaster val2 = Utils.FindEquipmentDroneWithRecycler(((Component)val).gameObject); if (Object.op_Implicit((Object)(object)val2)) { GameObject gameObject = ((Component)val2).GetComponent<BaseAI>().customTarget.gameObject; ((Component)val).GetComponent<EquipmentDroneRecyclerController>().SetTarget(val2, ((Object)(object)gameObject == (Object)(object)((Component)Hooks.pingedTarget).gameObject) ? null : Hooks.pingedTarget); } } } private void Patch() { //IL_0005: 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) //IL_0028: Unknown result type (might be due to invalid IL or missing references) GameObject masterPrefab = MasterCatalog.GetMasterPrefab(MasterCatalog.FindMasterIndex("EquipmentDroneMaster")); CharacterMaster val = default(CharacterMaster); if (Object.op_Implicit((Object)(object)masterPrefab) && masterPrefab.TryGetComponent<CharacterMaster>(ref val)) { equipmentDroneIndex = val.masterIndex; PatchAI(); PatchPlayer(); } else { Log.Error("EquipmentDrone not found"); } } private void PatchAI() { //IL_0000: 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_004e: 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_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0093: 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_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) GameObject masterPrefab = MasterCatalog.GetMasterPrefab(equipmentDroneIndex); if (!Object.op_Implicit((Object)(object)masterPrefab)) { return; } AISkillDriver[] components = masterPrefab.GetComponents<AISkillDriver>(); AISkillDriver obj = masterPrefab.AddComponent<AISkillDriver>(); obj.customName = "RecyclePickup"; obj.skillSlot = (SkillSlot)(-1); obj.requireEquipmentReady = true; obj.maxDistance = 30f; obj.activationRequiresAimConfirmation = true; obj.moveTargetType = (TargetType)3; obj.aimType = (AimType)1; obj.movementType = (MovementType)1; obj.shouldFireEquipment = true; obj.resetCurrentEnemyOnNextDriverSelection = true; AISkillDriver obj2 = masterPrefab.AddComponent<AISkillDriver>(); obj2.customName = "ApproachPickup"; obj2.skillSlot = (SkillSlot)(-1); obj2.minDistance = 30f; obj2.moveTargetType = (TargetType)3; obj2.aimType = (AimType)1; obj2.movementType = (MovementType)1; AISkillDriver obj3 = masterPrefab.AddComponent<AISkillDriver>(); obj3.customName = "StrafePickup"; obj3.skillSlot = (SkillSlot)(-1); obj3.minDistance = 20f; obj3.maxDistance = 30f; obj3.moveTargetType = (TargetType)3; obj3.aimType = (AimType)1; obj3.movementType = (MovementType)2; AISkillDriver obj4 = masterPrefab.AddComponent<AISkillDriver>(); obj4.customName = "BackUpFromPickup"; obj4.skillSlot = (SkillSlot)(-1); obj4.maxDistance = 20f; obj4.moveTargetType = (TargetType)3; obj4.aimType = (AimType)1; obj4.movementType = (MovementType)3; AISkillDriver[] array = components; foreach (AISkillDriver val in array) { Component obj5 = masterPrefab.AddComponent(((object)val).GetType()); FieldInfo[] fields = ((object)val).GetType().GetFields(); foreach (FieldInfo fieldInfo in fields) { fieldInfo.SetValue(obj5, fieldInfo.GetValue(val)); } Object.DestroyImmediate((Object)(object)val); } } private void PatchPlayer() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) GameObject masterPrefab = MasterCatalog.GetMasterPrefab(MasterCatalog.FindMasterIndex("PlayerMaster")); if ((Object)(object)masterPrefab == (Object)null) { Log.Error("PlayerMaster not found"); } else { ((Behaviour)masterPrefab.AddComponent<EquipmentDroneRecyclerController>()).enabled = false; } } } internal class EquipmentDroneRecyclerController : NetworkBehaviour { private CharacterMaster drone; private GenericPickupController pickup; private static int kCmdCmdSetTarget; private void Awake() { if (!NetworkServer.active) { ((Behaviour)this).enabled = false; } } private void FixedUpdate() { if (!Object.op_Implicit((Object)(object)drone)) { ((Behaviour)this).enabled = false; } else if (!Object.op_Implicit((Object)(object)pickup) || pickup.NetworkRecycled) { BaseAI[] aiComponents = drone.AiComponents; for (int i = 0; i < aiComponents.Length; i++) { aiComponents[i].customTarget.gameObject = null; } ((Behaviour)this).enabled = false; } } internal void SetTarget(CharacterMaster droneMaster, GenericPickupController pickup) { //IL_001e: 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_0023: 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_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_004c: 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_0043: Unknown result type (might be due to invalid IL or missing references) if (Util.HasEffectiveAuthority(((NetworkBehaviour)this).netIdentity)) { NetworkInstanceId droneNetId = (Object.op_Implicit((Object)(object)droneMaster) ? ((NetworkBehaviour)droneMaster).netId : NetworkInstanceId.Invalid); NetworkInstanceId pickupNetId = (Object.op_Implicit((Object)(object)pickup) ? ((NetworkBehaviour)pickup).netId : NetworkInstanceId.Invalid); if (NetworkServer.active) { SetTargetInternal(droneNetId, pickupNetId); } else { CallCmdSetTarget(droneNetId, pickupNetId); } } } [Command] private void CmdSetTarget(NetworkInstanceId droneNetId, NetworkInstanceId pickupNetId) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) SetTargetInternal(droneNetId, pickupNetId); } private void SetTargetInternal(NetworkInstanceId droneNetId, NetworkInstanceId pickupNetId) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) GameObject obj = Util.FindNetworkObject(pickupNetId); pickup = ((obj != null) ? obj.GetComponent<GenericPickupController>() : null); GameObject obj2 = Util.FindNetworkObject(droneNetId); drone = ((obj2 != null) ? obj2.GetComponent<CharacterMaster>() : null); BaseAI[] aiComponents = drone.aiComponents; for (int i = 0; i < aiComponents.Length; i++) { Target customTarget = aiComponents[i].customTarget; GenericPickupController obj3 = pickup; customTarget.gameObject = ((obj3 != null) ? ((Component)obj3).gameObject : null); } ((Behaviour)this).enabled = Object.op_Implicit((Object)(object)drone) && Object.op_Implicit((Object)(object)pickup); } private void UNetVersion() { } protected static void InvokeCmdCmdSetTarget(NetworkBehaviour obj, NetworkReader reader) { //IL_001d: 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) if (!NetworkServer.active) { Debug.LogError((object)"Command CmdSetTarget called on client."); } else { ((EquipmentDroneRecyclerController)(object)obj).CmdSetTarget(reader.ReadNetworkId(), reader.ReadNetworkId()); } } public void CallCmdSetTarget(NetworkInstanceId droneNetId, NetworkInstanceId pickupNetId) { //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) //IL_0067: 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_0022: 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) if (!NetworkClient.active) { Debug.LogError((object)"Command function CmdSetTarget called on server."); return; } if (((NetworkBehaviour)this).isServer) { CmdSetTarget(droneNetId, pickupNetId); return; } NetworkWriter val = new NetworkWriter(); val.Write((short)0); val.Write((short)5); val.WritePackedUInt32((uint)kCmdCmdSetTarget); val.Write(((Component)this).GetComponent<NetworkIdentity>().netId); val.Write(droneNetId); val.Write(pickupNetId); ((NetworkBehaviour)this).SendCommandInternal(val, 0, "CmdSetTarget"); } static EquipmentDroneRecyclerController() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown kCmdCmdSetTarget = 1918539950; NetworkBehaviour.RegisterCommandDelegate(typeof(EquipmentDroneRecyclerController), kCmdCmdSetTarget, new CmdDelegate(InvokeCmdCmdSetTarget)); NetworkCRC.RegisterBehaviour("EquipmentDroneRecyclerController", 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 Hooks { [CompilerGenerated] private static class <>O { public static hook_GetBullseyePosition <0>__IsTargetPickup; public static hook_RebuildPing <1>__CommandEquipmentDroneWithPing; } internal static GenericPickupController pingedTarget; public static void Init() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown object obj = <>O.<0>__IsTargetPickup; if (obj == null) { hook_GetBullseyePosition val = IsTargetPickup; <>O.<0>__IsTargetPickup = val; obj = (object)val; } Target.GetBullseyePosition += (hook_GetBullseyePosition)obj; object obj2 = <>O.<1>__CommandEquipmentDroneWithPing; if (obj2 == null) { hook_RebuildPing val2 = CommandEquipmentDroneWithPing; <>O.<1>__CommandEquipmentDroneWithPing = val2; obj2 = (object)val2; } PingerController.RebuildPing += (hook_RebuildPing)obj2; } private static bool IsTargetPickup(orig_GetBullseyePosition orig, Target self, out Vector3 position) { return orig.Invoke(self, ref position) | (Object.op_Implicit((Object)(object)self.gameObject) && Object.op_Implicit((Object)(object)self.gameObject.GetComponent<GenericPickupController>())); } private static void CommandEquipmentDroneWithPing(orig_RebuildPing orig, PingerController self, PingInfo pingInfo) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, pingInfo); PingIndicator pingIndicator = self.pingIndicator; object obj; if (pingIndicator == null) { obj = null; } else { GameObject pingTarget = pingIndicator.pingTarget; obj = ((pingTarget != null) ? pingTarget.GetComponent<GenericPickupController>() : null); } GenericPickupController val = (pingedTarget = (GenericPickupController)obj); if (Object.op_Implicit((Object)(object)val) && !val.Recycled && !Configs.IsCommandManual.Value) { CharacterMaster val2 = Utils.FindEquipmentDroneWithRecycler(((Component)self).gameObject); if (Object.op_Implicit((Object)(object)val2)) { ((Component)self).GetComponent<EquipmentDroneRecyclerController>().SetTarget(val2, val); } } } } internal static class Log { private static ManualLogSource _logger; internal static void Init(ManualLogSource logger) { _logger = logger; } internal static void Info(object data) { _logger.LogInfo(data); } internal static void Debug(object data) { _logger.LogDebug(data); } internal static void Message(object data) { _logger.LogMessage(data); } internal static void Warning(object data) { _logger.LogWarning(data); } internal static void Error(object data) { _logger.LogError(data); } internal static void Fatal(object data) { _logger.LogFatal(data); } internal static void PatchFail(string message) { _logger.LogError((object)("Failed to patch " + message)); } internal static void PatchFail(ILContext il) { PatchFail(((MemberReference)il.Method).Name); } } internal class Utils { public static CharacterMaster FindEquipmentDroneWithRecycler(GameObject masterObject) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //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_0067: 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) MinionGroup val = MinionGroup.FindGroup(((NetworkBehaviour)masterObject.GetComponent<CharacterMaster>()).netId); if (val != null) { MasterIndex equipmentDroneIndex = DroneRecycler.equipmentDroneIndex; MinionOwnership[] members = val.members; CharacterMaster val3 = default(CharacterMaster); foreach (MinionOwnership val2 in members) { if (Object.op_Implicit((Object)(object)val2) && Object.op_Implicit((Object)(object)((Component)val2).gameObject) && ((Component)val2).gameObject.TryGetComponent<CharacterMaster>(ref val3) && val3.masterIndex == equipmentDroneIndex && val3.inventory.currentEquipmentIndex == Equipment.Recycle.equipmentIndex) { return val3; } } } return null; } } }