Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of VoidCoinUtils v1.0.0
VoidCoins.dll
Decompiled 2 weeks agousing 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.Configuration; using BepInEx.Logging; using Microsoft.CodeAnalysis; using On.RoR2; using R2API; using RiskOfOptions; using RiskOfOptions.OptionConfigs; using RiskOfOptions.Options; using RoR2; using RoR2.ExpansionManagement; using UnityEngine; using UnityEngine.AddressableAssets; [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("VoidCoins")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("VoidCoins")] [assembly: AssemblyTitle("VoidCoins")] [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 VoidCoins { 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); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("acanthi.VoidCoinUtils", "VoidCoinUtils", "1.0.0")] public class VoidCoins : BaseUnityPlugin { public enum SimulacrumOptions { SimulacrumOnly, ClassicOnly, All } public class VoidCoinUserStorage { public NetworkUser user = null; public PlayerCharacterMasterController userPlayerCharacterMaster = null; public int coinsCreatedThisStage = 0; } public const string PluginGUID = "acanthi.VoidCoinUtils"; public const string PluginAuthor = "acanthi"; public const string PluginName = "VoidCoinUtils"; public const string PluginVersion = "1.0.0"; public static ConfigEntry<float> dropChance; public static ConfigEntry<float> dropChanceMultiplier; public static ConfigEntry<bool> onlyVoidEnemies; public static ConfigEntry<bool> shareVoidCoins; public static ConfigEntry<SimulacrumOptions> simulacrum; public static ConfigEntry<bool> editLanguage; public static ExpansionDef expansionNeeded; public List<VoidCoinUserStorage> coinStorage = new List<VoidCoinUserStorage>(); public void ResetCoinStorage() { coinStorage.Clear(); } public void SetUpCoinStorage() { foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances) { if ((Object)(object)instance.networkUser == (Object)null) { continue; } bool flag = false; foreach (VoidCoinUserStorage item in coinStorage) { if ((Object)(object)item.user == (Object)(object)instance.networkUser) { flag = true; } } if (!flag) { VoidCoinUserStorage voidCoinUserStorage = new VoidCoinUserStorage(); voidCoinUserStorage.user = instance.networkUser; voidCoinUserStorage.userPlayerCharacterMaster = instance; voidCoinUserStorage.coinsCreatedThisStage = 0; coinStorage.Add(voidCoinUserStorage); ((BaseUnityPlugin)this).Logger.LogDebug((object)("Registered " + voidCoinUserStorage.user.userName + " to the Void Coin Storage!")); } } } public VoidCoinUserStorage FindCoinStorageFromPlayerCharacter(PlayerCharacterMasterController playerCharacterMaster) { foreach (VoidCoinUserStorage item in coinStorage) { if ((Object)(object)item.userPlayerCharacterMaster == (Object)(object)playerCharacterMaster) { return item; } } return null; } public void Awake() { //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_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Expected O, but got Unknown //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Expected O, but got Unknown //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Expected O, but got Unknown //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Expected O, but got Unknown //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Expected O, but got Unknown //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Expected O, but got Unknown Log.Init(((BaseUnityPlugin)this).Logger); InitConfig(); if (editLanguage.Value) { CreateLang(); } expansionNeeded = Addressables.LoadAssetAsync<ExpansionDef>((object)"RoR2/DLC1/Common/DLC1.asset").WaitForCompletion(); GlobalEventManager.onCharacterDeathGlobal += GlobalEventManager_onCharacterDeathGlobal; Run.OnUserAdded += new hook_OnUserAdded(Run_OnUserAdded); Run.OnUserRemoved += new hook_OnUserRemoved(Run_OnUserRemoved); Run.Start += new hook_Start(Run_Start); Run.BeginGameOver += new hook_BeginGameOver(Run_BeginGameOver); Run.OnServerSceneChanged += new hook_OnServerSceneChanged(Run_OnServerSceneChanged); if (shareVoidCoins.Value) { VoidCoinDef.GrantPickup += new hook_GrantPickup(VoidCoinDef_GrantPickup); } } private void CreateLang() { LanguageAPI.Add("PICKUP_VOID_COIN", "Void Coin"); LanguageAPI.Add("VOID_COIN_PICKUP_CONTEXT", "Pick up Void Coin"); LanguageAPI.Add("PICKUP_VOID_COIN_DESCRIPTION", "A <sprite name=\"VoidCoin\" tint=1>Void Coin. Radiates a ominous energy. Used as currency."); ((ResourceAvailability)(ref MiscPickupCatalog.availability)).CallWhenAvailable((Action)delegate { MiscPickups.VoidCoin.descriptionToken = "PICKUP_VOID_COIN_DESCRIPTION"; }); } private void VoidCoinDef_GrantPickup(orig_GrantPickup orig, VoidCoinDef self, ref GrantContext context) { orig.Invoke(self, ref context); NetworkUser val = Util.LookUpBodyNetworkUser(context.body); foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances) { if (Object.op_Implicit((Object)(object)instance.networkUser) && (Object)(object)instance.networkUser != (Object)(object)val) { instance.master.GiveVoidCoins(1u); } } } private void Run_OnServerSceneChanged(orig_OnServerSceneChanged orig, Run self, string sceneName) { orig.Invoke(self, sceneName); foreach (VoidCoinUserStorage item in coinStorage) { item.coinsCreatedThisStage = 0; } } private void Run_Start(orig_Start orig, Run self) { orig.Invoke(self); SetUpCoinStorage(); } private void Run_BeginGameOver(orig_BeginGameOver orig, Run self, GameEndingDef gameEndingDef) { orig.Invoke(self, gameEndingDef); ResetCoinStorage(); } private void Run_OnUserAdded(orig_OnUserAdded orig, Run self, NetworkUser user) { orig.Invoke(self, user); SetUpCoinStorage(); } private void Run_OnUserRemoved(orig_OnUserRemoved orig, Run self, NetworkUser user) { orig.Invoke(self, user); foreach (VoidCoinUserStorage item in coinStorage) { if ((Object)(object)item.user == (Object)(object)user) { coinStorage.Remove(item); } } } private void GlobalEventManager_onCharacterDeathGlobal(DamageReport damageReport) { //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Invalid comparison between Unknown and I4 //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) CharacterMaster val = damageReport.attackerMaster; if (!Run.instance.IsExpansionEnabled(expansionNeeded) || !Object.op_Implicit((Object)(object)val)) { return; } if (Object.op_Implicit((Object)(object)val.minionOwnership.ownerMaster)) { val = val.minionOwnership.ownerMaster; } PlayerCharacterMasterController component = ((Component)val).GetComponent<PlayerCharacterMasterController>(); if (((int)damageReport.victimBody.teamComponent.teamIndex == 4 || !onlyVoidEnemies.Value) && (Run.instance is InfiniteTowerRun || simulacrum.Value != 0) && (!(Run.instance is InfiniteTowerRun) || simulacrum.Value != SimulacrumOptions.ClassicOnly) && Object.op_Implicit((Object)(object)component)) { float num = (float)((double)dropChance.Value * Math.Pow(dropChanceMultiplier.Value / 100f, FindCoinStorageFromPlayerCharacter(component).coinsCreatedThisStage)); ((BaseUnityPlugin)this).Logger.LogDebug((object)num.ToString()); if (Util.CheckRoll(num, 0f, (CharacterMaster)null)) { PickupDropletController.CreatePickupDroplet(PickupCatalog.FindPickupIndex(MiscPickups.VoidCoin.miscPickupIndex), ((Component)damageReport.victim).transform.position, Vector3.up * 10f); FindCoinStorageFromPlayerCharacter(component).coinsCreatedThisStage++; } } } private void InitConfig() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: 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 //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Expected O, but got Unknown //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Expected O, but got Unknown //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Expected O, but got Unknown //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Expected O, but got Unknown //IL_0177: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Expected O, but got Unknown //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Expected O, but got Unknown //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Expected O, but got Unknown //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01c9: Expected O, but got Unknown dropChance = ((BaseUnityPlugin)this).Config.Bind<float>("Coin Drops", "Initial Drop Chance", 13f, new ConfigDescription("How likely is it for an enemy to drop a Void Coin...", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 100f), Array.Empty<object>())); dropChanceMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Coin Drops", "Repeat Drop Multiplier", 50f, new ConfigDescription("After an enemy is killed, reduce the original chance by... (50% = Half the initial chance; Resets on stage start.)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 100f), Array.Empty<object>())); onlyVoidEnemies = ((BaseUnityPlugin)this).Config.Bind<bool>("Coin Drops", "Only Void Enemies", true, "Only Void enemies may drop Void Coins..."); shareVoidCoins = ((BaseUnityPlugin)this).Config.Bind<bool>("Coin Drops", "Share Void Coin Pickups", false, "Void Coin pickups are shared..."); simulacrum = ((BaseUnityPlugin)this).Config.Bind<SimulacrumOptions>("Coin Drops", "Game Modes Allowed", SimulacrumOptions.All, "Void Coins will only drop in..."); editLanguage = ((BaseUnityPlugin)this).Config.Bind<bool>("Language", "Edit Language Files", true, "Void Coins will have better language formatting. (Requires restart!)"); ModSettingsManager.SetModDescription("Fully comprehensive Void Coins mod!"); ModSettingsManager.AddOption((BaseOption)new StepSliderOption(dropChance, new StepSliderConfig { min = 0f, max = 100f, increment = 0.1f })); ModSettingsManager.AddOption((BaseOption)new StepSliderOption(dropChanceMultiplier, new StepSliderConfig { min = 0f, max = 100f, increment = 1f })); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(onlyVoidEnemies)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(shareVoidCoins)); shareVoidCoins.SettingChanged += delegate { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown if (shareVoidCoins.Value) { VoidCoinDef.GrantPickup += new hook_GrantPickup(VoidCoinDef_GrantPickup); } else { VoidCoinDef.GrantPickup -= new hook_GrantPickup(VoidCoinDef_GrantPickup); } }; ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)simulacrum)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(editLanguage, true)); } } }