Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of ThievingElite v0.0.1
ThievingElite.dll
Decompiled 10 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using HG; using Microsoft.CodeAnalysis; using R2API; using RoR2; using ThievingElite.thieving; 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("ThievingElite")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+bf70ad059b785eeacd2902c196dfdf9893414494")] [assembly: AssemblyProduct("ThievingElite")] [assembly: AssemblyTitle("ThievingElite")] [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 ThievingElite { public static class Asset { public static AssetBundle mainBundle; public const string bundleName = "thievingelite_assets"; public const string assetBundleFolder = "assetbundles"; public static string AssetBundlePath => Path.Combine(Path.GetDirectoryName(Main.PInfo.Location), "thievingelite_assets"); public static void Init() { mainBundle = AssetBundle.LoadFromFile(AssetBundlePath); string[] allAssetNames = mainBundle.GetAllAssetNames(); foreach (string text in allAssetNames) { } Sprite val = mainBundle.LoadAsset<Sprite>("ThievingIcon.png"); } } 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.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("Horse5333.ThievingElite", "ThievingElite", "0.0.1")] public class Main : BaseUnityPlugin { public const string PluginGUID = "Horse5333.ThievingElite"; public const string PluginAuthor = "Horse5333"; public const string PluginName = "ThievingElite"; public const string PluginVersion = "0.0.1"; private List<ItemDef> stolenItems = new List<ItemDef>(); public static PluginInfo PInfo { get; private set; } public void Awake() { PInfo = ((BaseUnityPlugin)this).Info; Asset.Init(); new Thieving(); GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt; GlobalEventManager.onCharacterDeathGlobal += GlobalEventManager_onCharacterDeathGlobal; Stage.onServerStageComplete += Stage_onServerStageComplete; } private void Update() { } private void GlobalEventManager_onServerDamageDealt(DamageReport damageReport) { //IL_0044: 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_004b: 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_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Invalid comparison between Unknown and I4 //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Invalid comparison between Unknown and I4 //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Invalid comparison between Unknown and I4 //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Invalid comparison between Unknown and I4 //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Invalid comparison between Unknown and I4 //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Invalid comparison between Unknown and I4 //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Invalid comparison between Unknown and I4 //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Invalid comparison between Unknown and I4 if ((Object)(object)damageReport.attackerBody == (Object)null || !damageReport.victimBody.isPlayerControlled) { return; } CharacterBody component = damageReport.attacker.GetComponent<CharacterBody>(); BuffIndex val = BuffCatalog.FindBuffIndex("EliteThievingBuff"); if (!component.HasBuff(val)) { return; } CharacterBody victimBody = damageReport.victimBody; float num = damageReport.damageDealt * 100f / damageReport.victimBody.maxHealth; Enumerator<ItemDef> enumerator = ItemCatalog.allItemDefs.GetEnumerator(); try { while (enumerator.MoveNext()) { ItemDef current = enumerator.Current; int itemCount = victimBody.inventory.GetItemCount(current); if (itemCount <= 0) { continue; } float num2 = 100f; if ((int)current.tier == 0 || (int)current.tier == 6) { num2 = 100f - Mathf.Floor(1250f / (num + 30f)); } else if ((int)current.tier == 1 || (int)current.tier == 7) { num2 = 100f - Mathf.Min(100f, -1500f / (num - 100f)); } else if ((int)current.tier == 2 || (int)current.tier == 8) { num2 = 100f - 0.75f * (num - 15f); } else if ((int)current.tier == 3 || (int)current.tier == 4 || (int)current.tier == 9) { num2 = 100f - num; } for (int i = 0; i < itemCount; i++) { if (!Util.CheckRoll(num2, victimBody.master)) { victimBody.inventory.RemoveItem(current, 1); damageReport.attackerBody.inventory.GiveItem(current, 1); stolenItems.Add(current); } } } } finally { ((IDisposable)enumerator).Dispose(); } } private void GlobalEventManager_onCharacterDeathGlobal(DamageReport damageReport) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: 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_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) CharacterBody component = ((Component)damageReport.victim).GetComponent<CharacterBody>(); BuffIndex val = BuffCatalog.FindBuffIndex("EliteThievingBuff"); if (!component.HasBuff(val)) { return; } List<ItemDef> list = new List<ItemDef>(); foreach (ItemDef stolenItem in stolenItems) { if (component.inventory.GetItemCount(stolenItem) > 0) { component.inventory.RemoveItem(stolenItem, 1); PickupDropletController.CreatePickupDroplet(PickupCatalog.FindPickupIndex(stolenItem.itemIndex), component.corePosition, new Vector3(7f * (Random.value - 0.5f), 25f, 7f * (Random.value - 0.5f))); list.Add(stolenItem); } } foreach (ItemDef item in list) { if (!stolenItems.Remove(item)) { } } } private void Stage_onServerStageComplete(Stage stage) { stolenItems.Clear(); } } } namespace ThievingElite.thieving { public class Thieving { public enum EliteTier { None, T1, T1Honor, T1GuildedHonor, T1Guilded, T2, Lunar } public static Color AffixThievingColor = new Color(0f, 0f, 0f); public static EquipmentDef AffixThievingEquipment; public static CustomEquipment CustomThievingEquipment; public static BuffDef AffixThievingBuff; public static EliteDef AffixThievingElite; public static CustomElite CustomThievingElite; public static CustomElite CustomThievingEliteHonor; public ItemStealController itemStealController; public static float healthMult = 4f; public static float damageMult = 3f; public static float affixDropChance = 0.00025f; private static Material ThievingMat = Asset.mainBundle.LoadAsset<Material>("ThievingMaterial.mat"); public static Texture2D eliteRamp = Asset.mainBundle.LoadAsset<Texture2D>("ThievingRamp.png"); private static Sprite eliteIcon = Asset.mainBundle.LoadAsset<Sprite>("ThievingIcon.png"); public Thieving() { AddLanguageTokens(); SetupBuff(); SetupEquipment(); SetupElite(); AddContent(); ItemAPI.Add(CustomThievingEquipment); } private void AddContent() { EliteAPI.Add(CustomThievingElite); EliteAPI.Add(CustomThievingEliteHonor); ContentAddition.AddBuffDef(AffixThievingBuff); } private void SetupBuff() { //IL_0050: 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) AffixThievingBuff = ScriptableObject.CreateInstance<BuffDef>(); ((Object)AffixThievingBuff).name = "EliteThievingBuff"; AffixThievingBuff.canStack = false; AffixThievingBuff.isCooldown = false; AffixThievingBuff.isDebuff = false; AffixThievingBuff.buffColor = new Color(1f, 1f, 1f); AffixThievingBuff.iconSprite = eliteIcon; } private void SetupEquipment() { //IL_003d: 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_009f: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Expected O, but got Unknown //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Expected O, but got Unknown AffixThievingEquipment = ScriptableObject.CreateInstance<EquipmentDef>(); AffixThievingEquipment.appearsInMultiPlayer = true; AffixThievingEquipment.appearsInSinglePlayer = true; AffixThievingEquipment.canBeRandomlyTriggered = false; AffixThievingEquipment.canDrop = false; AffixThievingEquipment.colorIndex = (ColorIndex)5; AffixThievingEquipment.cooldown = 0f; AffixThievingEquipment.isLunar = false; AffixThievingEquipment.isBoss = false; AffixThievingEquipment.passiveBuffDef = AffixThievingBuff; AffixThievingEquipment.dropOnDeathChance = affixDropChance; AffixThievingEquipment.enigmaCompatible = false; AffixThievingEquipment.pickupModelPrefab = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/EliteFire/PickupEliteFire.prefab").WaitForCompletion(), "PickupAffixThieving", false); Renderer[] componentsInChildren = AffixThievingEquipment.pickupModelPrefab.GetComponentsInChildren<Renderer>(); foreach (Renderer val in componentsInChildren) { val.material = ThievingMat; } AffixThievingEquipment.nameToken = "EQUIPMENT_AFFIX_THIEVING_NAME"; AffixThievingEquipment.descriptionToken = "EQUIPMENT_AFFIX_THIEVING_DESC"; AffixThievingEquipment.pickupToken = "EQUIPMENT_AFFIX_THIEVING_PICKUP"; AffixThievingEquipment.loreToken = "EQUIPMENT_AFFIX_THIEVING_LORE"; ((Object)AffixThievingEquipment).name = "AffixTHIEVING"; CustomThievingEquipment = new CustomEquipment(AffixThievingEquipment, new ItemDisplayRuleDict(Array.Empty<ItemDisplayRule>())); } private void SetupElite() { //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_001a: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Expected O, but got Unknown //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Expected O, but got Unknown AffixThievingElite = ScriptableObject.CreateInstance<EliteDef>(); AffixThievingElite.color = Color32.op_Implicit(AffixThievingColor); AffixThievingElite.eliteEquipmentDef = AffixThievingEquipment; AffixThievingElite.modifierToken = "ELITE_MODIFIER_THIEVING"; ((Object)AffixThievingElite).name = "EliteThieving"; AffixThievingElite.healthBoostCoefficient = 2f; AffixThievingElite.damageBoostCoefficient = 4f; AffixThievingBuff.eliteDef = AffixThievingElite; CustomThievingElite = new CustomElite(AffixThievingElite, GetVanillaEliteTierDef(EliteTier.T1), eliteRamp); CustomThievingEliteHonor = new CustomElite("EliteThievingHonor", AffixThievingEquipment, Color32.op_Implicit(AffixThievingColor), "ELITE_MODIFIER_THIEVING", GetVanillaEliteTierDef(EliteTier.T1Honor), eliteRamp); CustomThievingEliteHonor.EliteDef.healthBoostCoefficient = 1.5f; CustomThievingEliteHonor.EliteDef.damageBoostCoefficient = 2.5f; } private void AddLanguageTokens() { LanguageAPI.Add("ELITE_MODIFIER_THIEVING", "Thieving {0}"); LanguageAPI.Add("EQUIPMENT_AFFIX_THIEVING_NAME", "Thieving Aspect"); LanguageAPI.Add("EQUIPMENT_AFFIX_THIEVING_PICKUP", "Become an aspect of Thieving"); LanguageAPI.Add("EQUIPMENT_AFFIX_THIEVING_DESC", "Become an aspect of Thieving"); LanguageAPI.Add("EQUIPMENT_AFFIX_THIEVING_LORE", "Thieving Aspect Lore"); } private IEnumerable<EliteTierDef> GetVanillaEliteTierDef(EliteTier tier) { if (1 == 0) { } IEnumerable<EliteTierDef> result = tier switch { EliteTier.None => null, EliteTier.T1 => new <>z__ReadOnlyArray<EliteTierDef>((EliteTierDef[])(object)new EliteTierDef[2] { EliteAPI.VanillaEliteTiers[1], EliteAPI.VanillaEliteTiers[4] }), EliteTier.T1Honor => new <>z__ReadOnlyArray<EliteTierDef>((EliteTierDef[])(object)new EliteTierDef[2] { EliteAPI.VanillaEliteTiers[2], EliteAPI.VanillaEliteTiers[3] }), _ => new <>z__ReadOnlySingleElementList<EliteTierDef>(EliteAPI.VanillaEliteTiers[(int)tier]), }; if (1 == 0) { } return result; } } } [CompilerGenerated] internal sealed class <>z__ReadOnlyArray<T> : IEnumerable, ICollection, IList, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection<T>, IList<T> { int ICollection.Count => _items.Length; bool ICollection.IsSynchronized => false; object ICollection.SyncRoot => this; object IList.this[int index] { get { return _items[index]; } set { throw new NotSupportedException(); } } bool IList.IsFixedSize => true; bool IList.IsReadOnly => true; int IReadOnlyCollection<T>.Count => _items.Length; T IReadOnlyList<T>.this[int index] => _items[index]; int ICollection<T>.Count => _items.Length; bool ICollection<T>.IsReadOnly => true; T IList<T>.this[int index] { get { return _items[index]; } set { throw new NotSupportedException(); } } public <>z__ReadOnlyArray(T[] items) { _items = items; } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)_items).GetEnumerator(); } void ICollection.CopyTo(Array array, int index) { ((ICollection)_items).CopyTo(array, index); } int IList.Add(object value) { throw new NotSupportedException(); } void IList.Clear() { throw new NotSupportedException(); } bool IList.Contains(object value) { return ((IList)_items).Contains(value); } int IList.IndexOf(object value) { return ((IList)_items).IndexOf(value); } void IList.Insert(int index, object value) { throw new NotSupportedException(); } void IList.Remove(object value) { throw new NotSupportedException(); } void IList.RemoveAt(int index) { throw new NotSupportedException(); } IEnumerator<T> IEnumerable<T>.GetEnumerator() { return ((IEnumerable<T>)_items).GetEnumerator(); } void ICollection<T>.Add(T item) { throw new NotSupportedException(); } void ICollection<T>.Clear() { throw new NotSupportedException(); } bool ICollection<T>.Contains(T item) { return ((ICollection<T>)_items).Contains(item); } void ICollection<T>.CopyTo(T[] array, int arrayIndex) { ((ICollection<T>)_items).CopyTo(array, arrayIndex); } bool ICollection<T>.Remove(T item) { throw new NotSupportedException(); } int IList<T>.IndexOf(T item) { return ((IList<T>)_items).IndexOf(item); } void IList<T>.Insert(int index, T item) { throw new NotSupportedException(); } void IList<T>.RemoveAt(int index) { throw new NotSupportedException(); } } [CompilerGenerated] internal sealed class <>z__ReadOnlySingleElementList<T> : IEnumerable, ICollection, IList, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection<T>, IList<T> { private sealed class Enumerator : IDisposable, IEnumerator, IEnumerator<T> { object IEnumerator.Current => _item; T IEnumerator<T>.Current => _item; public Enumerator(T item) { _item = item; } bool IEnumerator.MoveNext() { return !_moveNextCalled && (_moveNextCalled = true); } void IEnumerator.Reset() { _moveNextCalled = false; } void IDisposable.Dispose() { } } int ICollection.Count => 1; bool ICollection.IsSynchronized => false; object ICollection.SyncRoot => this; object IList.this[int index] { get { if (index != 0) { throw new IndexOutOfRangeException(); } return _item; } set { throw new NotSupportedException(); } } bool IList.IsFixedSize => true; bool IList.IsReadOnly => true; int IReadOnlyCollection<T>.Count => 1; T IReadOnlyList<T>.this[int index] { get { if (index != 0) { throw new IndexOutOfRangeException(); } return _item; } } int ICollection<T>.Count => 1; bool ICollection<T>.IsReadOnly => true; T IList<T>.this[int index] { get { if (index != 0) { throw new IndexOutOfRangeException(); } return _item; } set { throw new NotSupportedException(); } } public <>z__ReadOnlySingleElementList(T item) { _item = item; } IEnumerator IEnumerable.GetEnumerator() { return new Enumerator(_item); } void ICollection.CopyTo(Array array, int index) { array.SetValue(_item, index); } int IList.Add(object value) { throw new NotSupportedException(); } void IList.Clear() { throw new NotSupportedException(); } bool IList.Contains(object value) { return EqualityComparer<T>.Default.Equals(_item, (T)value); } int IList.IndexOf(object value) { return (!EqualityComparer<T>.Default.Equals(_item, (T)value)) ? (-1) : 0; } void IList.Insert(int index, object value) { throw new NotSupportedException(); } void IList.Remove(object value) { throw new NotSupportedException(); } void IList.RemoveAt(int index) { throw new NotSupportedException(); } IEnumerator<T> IEnumerable<T>.GetEnumerator() { return new Enumerator(_item); } void ICollection<T>.Add(T item) { throw new NotSupportedException(); } void ICollection<T>.Clear() { throw new NotSupportedException(); } bool ICollection<T>.Contains(T item) { return EqualityComparer<T>.Default.Equals(_item, item); } void ICollection<T>.CopyTo(T[] array, int arrayIndex) { array[arrayIndex] = _item; } bool ICollection<T>.Remove(T item) { throw new NotSupportedException(); } int IList<T>.IndexOf(T item) { return (!EqualityComparer<T>.Default.Equals(_item, item)) ? (-1) : 0; } void IList<T>.Insert(int index, T item) { throw new NotSupportedException(); } void IList<T>.RemoveAt(int index) { throw new NotSupportedException(); } }