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 WarheimStuff v1.0.1
WarheimStuff.dll
Decompiled 2 weeks agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using HarmonyLib; using Jewelcrafting; using Jotunn.Configs; using Jotunn.Entities; using Jotunn.Managers; using Jotunn.Utils; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("WarheimStuff")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("WarheimStuff")] [assembly: AssemblyCopyright("Copyright © 2021")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("e3243d22-4307-4008-ba36-9f326008cde5")] [assembly: AssemblyFileVersion("0.0.1")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.1.0")] namespace WarheimStuff; [HarmonyPatch(typeof(Skills), "Awake")] [HarmonyAfter(new string[] { "org.bepinex.plugins.professions" })] public static class ProfessionsKeepLevelsPatch { private static readonly HashSet<int> PatchedButtons = new HashSet<int>(); private static Type _professionsType; private static Type _helperType; private static Type _skillElementType; private static FieldInfo _professionPanelElementsField; private static FieldInfo _allowUnselectField; private static FieldInfo _professionChangeCooldownField; private static FieldInfo _serverTimeField; private static MethodInfo _updateSelectPanelSelectionsMethod; private static MethodInfo _fromProfessionMethod; private static MethodInfo _getActiveProfessionsMethod; private static MethodInfo _storeActiveProfessionsMethod; private static MethodInfo _getInactiveProfessionsMethod; private static MethodInfo _storeInactiveProfessionsMethod; private static MethodInfo _getHumanFriendlyTimeMethod; private static bool _reflectionReady; private static void Postfix() { //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Expected O, but got Unknown try { if (!PrepareReflection() || !(_professionPanelElementsField?.GetValue(null) is IDictionary dictionary) || dictionary.Count == 0) { return; } foreach (DictionaryEntry item in dictionary) { object professionObj = item.Key; object? value = item.Value; GameObject val = (GameObject)((value is GameObject) ? value : null); if ((Object)(object)val == (Object)null) { continue; } Component component = val.GetComponent(_skillElementType); if ((Object)(object)component == (Object)null) { continue; } object? obj = AccessTools.Field(_skillElementType, "Select")?.GetValue(component); Button val2 = (Button)((obj is Button) ? obj : null); if (!((Object)(object)val2 == (Object)null) && PatchedButtons.Add(((Object)val2).GetInstanceID())) { ((UnityEventBase)val2.onClick).RemoveAllListeners(); ((UnityEvent)val2.onClick).AddListener((UnityAction)delegate { OnProfessionButtonClicked(professionObj); }); } } } catch (Exception arg) { Debug.LogError((object)$"[WarheimStuff] Failed to rewire Professions buttons: {arg}"); } } private static bool PrepareReflection() { if (_reflectionReady) { return true; } _professionsType = AccessTools.TypeByName("Professions.Professions"); _helperType = AccessTools.TypeByName("Professions.Helper"); _skillElementType = AccessTools.TypeByName("Skill_Element"); if (_professionsType == null || _helperType == null || _skillElementType == null) { return false; } _professionPanelElementsField = AccessTools.Field(_professionsType, "professionPanelElements"); _allowUnselectField = AccessTools.Field(_professionsType, "allowUnselect"); _professionChangeCooldownField = AccessTools.Field(_professionsType, "professionChangeCooldown"); _serverTimeField = AccessTools.Field(_professionsType, "serverTime"); _updateSelectPanelSelectionsMethod = AccessTools.Method(_professionsType, "UpdateSelectPanelSelections", (Type[])null, (Type[])null); _fromProfessionMethod = AccessTools.Method(_professionsType, "fromProfession", (Type[])null, (Type[])null); _getActiveProfessionsMethod = AccessTools.Method(_helperType, "getActiveProfessions", (Type[])null, (Type[])null); _storeActiveProfessionsMethod = AccessTools.Method(_helperType, "storeActiveProfessions", (Type[])null, (Type[])null); _getInactiveProfessionsMethod = AccessTools.Method(_helperType, "getInactiveProfessions", (Type[])null, (Type[])null); _storeInactiveProfessionsMethod = AccessTools.Method(_helperType, "storeInactiveProfessions", (Type[])null, (Type[])null); _getHumanFriendlyTimeMethod = AccessTools.Method(_helperType, "getHumanFriendlyTime", (Type[])null, (Type[])null); _reflectionReady = _professionPanelElementsField != null && _allowUnselectField != null && _professionChangeCooldownField != null && _serverTimeField != null && _updateSelectPanelSelectionsMethod != null && _fromProfessionMethod != null && _getActiveProfessionsMethod != null && _storeActiveProfessionsMethod != null && _getInactiveProfessionsMethod != null && _storeInactiveProfessionsMethod != null && _getHumanFriendlyTimeMethod != null; return _reflectionReady; } private static void OnProfessionButtonClicked(object professionObj) { try { if (!PrepareReflection() || (Object)(object)Player.m_localPlayer == (Object)null) { return; } object obj = _getActiveProfessionsMethod.Invoke(null, null); if (obj == null) { return; } Type type = obj.GetType(); MethodInfo method = type.GetMethod("Contains"); MethodInfo method2 = type.GetMethod("Add"); MethodInfo method3 = type.GetMethod("Remove"); if (method != null && (bool)method.Invoke(obj, new object[1] { professionObj })) { if (!CanUnselectNow()) { return; } method3?.Invoke(obj, new object[1] { professionObj }); _storeActiveProfessionsMethod.Invoke(null, new object[1] { obj }); Player.m_localPlayer.m_customData["Professions LastProfessionChange"] = GetServerUnixTime().ToString(); } else { RestoreOldInactiveLevelIfNeeded(professionObj); method2?.Invoke(obj, new object[1] { professionObj }); _storeActiveProfessionsMethod.Invoke(null, new object[1] { obj }); } _updateSelectPanelSelectionsMethod.Invoke(null, null); } catch (Exception arg) { Debug.LogError((object)$"[WarheimStuff] Error in profession click override: {arg}"); } } private static bool CanUnselectNow() { object value = _allowUnselectField.GetValue(null); object value2 = _professionChangeCooldownField.GetValue(null); object obj = value?.GetType().GetProperty("Value")?.GetValue(value); object obj2 = value2?.GetType().GetProperty("Value")?.GetValue(value2); bool flag = string.Equals(obj?.ToString(), "On", StringComparison.OrdinalIgnoreCase); float num = ((obj2 != null) ? Convert.ToSingle(obj2) : 0f); if (!flag) { return false; } if (num <= 0f) { return true; } if (!Player.m_localPlayer.m_customData.TryGetValue("Professions LastProfessionChange", out var value3)) { return true; } if (!int.TryParse(value3, out var result)) { return true; } int serverUnixTime = GetServerUnixTime(); int num2 = result + (int)(num * 3600f) - serverUnixTime; if (num2 > 0) { string text = (string)_getHumanFriendlyTimeMethod.Invoke(null, new object[1] { num2 }); ((Character)Player.m_localPlayer).Message((MessageType)2, "You can change your profession in " + text + ".", 0, (Sprite)null); return false; } return true; } private static int GetServerUnixTime() { DateTime dateTime = (DateTime)_serverTimeField.GetValue(null); return (int)((DateTimeOffset)dateTime).ToUnixTimeSeconds(); } private static Skill GetOrCreateSkill(Player player, SkillType skillType) { //IL_0049: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)player == (Object)null) { return null; } object value = Traverse.Create((object)player).Field("m_skills").GetValue(); if (value == null) { return null; } object value2 = Traverse.Create(value).Method("GetSkill", new object[1] { skillType }).GetValue(); return (Skill)((value2 is Skill) ? value2 : null); } private static void RestoreOldInactiveLevelIfNeeded(object professionObj) { //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) try { object obj = _getInactiveProfessionsMethod.Invoke(null, null); if (!(obj is IDictionary dictionary) || !dictionary.Contains(professionObj)) { return; } float num = 0f; object obj2 = dictionary[professionObj]; if (obj2 != null) { num = Convert.ToSingle(obj2); } if (num <= 0f) { return; } object obj3 = _fromProfessionMethod.Invoke(null, new object[1] { professionObj }); if (obj3 != null) { SkillType skillType = (SkillType)obj3; Skill orCreateSkill = GetOrCreateSkill(Player.m_localPlayer, skillType); if (orCreateSkill != null) { orCreateSkill.m_level = Mathf.Max(orCreateSkill.m_level, num); } dictionary.Remove(professionObj); _storeInactiveProfessionsMethod.Invoke(null, new object[1] { obj }); } } catch (Exception arg) { Debug.LogWarning((object)$"[WarheimStuff] Failed to restore old inactive profession level: {arg}"); } } } [BepInPlugin("dzk.warheimstuff", "WarheimStuff", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] internal class WarheimStuff : BaseUnityPlugin { private enum WarheimRingType { DPS, Tank, Archer, Mage } public class SE_WarheimRingDPS : StatusEffect { public float m_staminaRegenMultiplier = 1f; public float m_damageMultiplier = 1f; public void SetStaminaRegenMultiplier(float value) { m_staminaRegenMultiplier = value; } public void SetDamageMultiplier(float value) { m_damageMultiplier = value; } public override void ModifyStaminaRegen(ref float staminaRegen) { staminaRegen *= m_staminaRegenMultiplier; } public override void ModifyAttack(SkillType skill, ref HitData hitData) { ((DamageTypes)(ref hitData.m_damage)).Modify(m_damageMultiplier); } } public class SE_WarheimRingTank : StatusEffect { public float m_healthPercentBonus; public float m_healthRegenMultiplier = 1f; public void SetHealthPercentBonus(float value) { m_healthPercentBonus = value; } public void SetHealthRegenMultiplier(float value) { m_healthRegenMultiplier = value; } public override void ModifyHealthRegen(ref float regenMultiplier) { regenMultiplier *= m_healthRegenMultiplier; } } public class SE_WarheimRingArcher : StatusEffect { public float m_staminaPercentBonus; public float m_moveSpeedMultiplier = 1f; public void SetStaminaPercentBonus(float value) { m_staminaPercentBonus = value; } public void SetMoveSpeedMultiplier(float value) { m_moveSpeedMultiplier = value; } public override void ModifySpeed(float baseSpeed, ref float speed, Character character, Vector3 dir) { speed *= m_moveSpeedMultiplier; } } public class SE_WarheimRingMage : StatusEffect { public float m_eitrPercentBonus; public float m_eitrRegenMultiplier = 1f; public void SetEitrPercentBonus(float value) { m_eitrPercentBonus = value; } public void SetEitrRegenMultiplier(float value) { m_eitrRegenMultiplier = value; } public override void ModifyEitrRegen(ref float regen) { regen *= m_eitrRegenMultiplier; } } public class SE_CollierWarheimDPS : StatusEffect { public float m_damageMultiplier = 1f; public float m_staminaRegenMultiplier = 1f; public void SetDamageMultiplier(float value) { m_damageMultiplier = value; } public void SetStaminaRegenMultiplier(float value) { m_staminaRegenMultiplier = value; } public override void ModifyAttack(SkillType skill, ref HitData hitData) { ((DamageTypes)(ref hitData.m_damage)).Modify(m_damageMultiplier); } public override void ModifyStaminaRegen(ref float staminaRegen) { staminaRegen *= m_staminaRegenMultiplier; } } public class SE_CollierWarheimMage : StatusEffect { public float m_eitr; public float m_skillup; public float m_regenModifier; public void SetEitr(float eitr) { m_eitr = eitr; } public void SetSkill(float skill) { m_skillup = skill; } public void SetRegenModifier(float regenModifier) { m_regenModifier = regenModifier; } public override void ModifyEitrRegen(ref float regen) { regen *= m_regenModifier; } public override void ModifySkillLevel(SkillType skill, ref float value) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Invalid comparison between Unknown and I4 //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Invalid comparison between Unknown and I4 if ((int)skill == 10 || (int)skill == 9) { value += m_skillup; } } } public class SE_CollierWarheimTank : StatusEffect { public float m_healthPercentBonus; public float m_healthRegenMultiplier = 1f; public void SetHealthPercentBonus(float value) { m_healthPercentBonus = value; } public void SetHealthRegenMultiplier(float value) { m_healthRegenMultiplier = value; } public override void ModifyHealthRegen(ref float regenMultiplier) { regenMultiplier *= m_healthRegenMultiplier; } } [HarmonyPatch] public static class Patch_IsNeckItem { private static MethodBase TargetMethod() { if (!Chainloader.PluginInfos.TryGetValue("org.bepinex.plugins.jewelcrafting", out var value)) { return null; } Assembly assembly = ((object)value.Instance).GetType().Assembly; Type type = assembly.GetType("Jewelcrafting.Visual"); if (type == null) { return null; } return AccessTools.Method(type, "IsNeckItem", (Type[])null, (Type[])null); } private static void Postfix(ItemData item, ref bool __result) { if ((Object)(object)item?.m_dropPrefab != (Object)null && ((Object)item.m_dropPrefab).name.StartsWith("JC_Necklace_Warheim")) { __result = true; } } } [HarmonyPatch] public static class Patch_IsFingerItem { private static MethodBase TargetMethod() { if (!Chainloader.PluginInfos.TryGetValue("org.bepinex.plugins.jewelcrafting", out var value)) { return null; } Assembly assembly = ((object)value.Instance).GetType().Assembly; Type type = assembly.GetType("Jewelcrafting.Visual"); if (type == null) { return null; } return AccessTools.Method(type, "IsFingerItem", (Type[])null, (Type[])null); } private static void Postfix(ItemData item, ref bool __result) { object obj; if (item == null) { obj = null; } else { GameObject dropPrefab = item.m_dropPrefab; obj = ((dropPrefab != null) ? ((Object)dropPrefab).name : null); } string text = (string)obj; if (!string.IsNullOrEmpty(text) && text.StartsWith("JC_Ring_Warheim", StringComparison.Ordinal)) { __result = true; } } } [HarmonyPatch(typeof(Player), "GetTotalFoodValue")] public static class FoodTotalsFromWarheimNecklacesPatch { [HarmonyPostfix] private static void Postfix(Player __instance, ref float hp, ref float eitr) { if ((Object)(object)__instance == (Object)null) { return; } SEMan value = Traverse.Create((object)__instance).Field("m_seman").GetValue<SEMan>(); if (value == null) { return; } List<StatusEffect> value2 = Traverse.Create((object)value).Field("m_statusEffects").GetValue<List<StatusEffect>>(); if (value2 == null) { return; } float num = 0f; float num2 = 0f; foreach (StatusEffect item in value2) { if (item is SE_CollierWarheimMage sE_CollierWarheimMage && sE_CollierWarheimMage.m_eitr != 0f) { num += sE_CollierWarheimMage.m_eitr; } if (item is SE_CollierWarheimTank sE_CollierWarheimTank && sE_CollierWarheimTank.m_healthPercentBonus != 0f) { num2 += sE_CollierWarheimTank.m_healthPercentBonus; } } if (num != 0f) { eitr += num; } if (num2 != 0f) { hp *= 1f + num2; } } } [HarmonyPatch(typeof(Player), "GetTotalFoodValue")] public static class FoodTotalsFromWarheimRingsPatch { [HarmonyPostfix] private static void Postfix(Player __instance, ref float hp, ref float stamina, ref float eitr) { if ((Object)(object)__instance == (Object)null) { return; } SEMan sEMan = ((Character)__instance).GetSEMan(); if (sEMan == null) { return; } float num = 0f; float num2 = 0f; float num3 = 0f; foreach (StatusEffect statusEffect in sEMan.GetStatusEffects()) { if (statusEffect is SE_WarheimRingTank sE_WarheimRingTank && sE_WarheimRingTank.m_healthPercentBonus != 0f) { num += sE_WarheimRingTank.m_healthPercentBonus; } if (statusEffect is SE_WarheimRingArcher sE_WarheimRingArcher && sE_WarheimRingArcher.m_staminaPercentBonus != 0f) { num2 += sE_WarheimRingArcher.m_staminaPercentBonus; } if (statusEffect is SE_WarheimRingMage sE_WarheimRingMage && sE_WarheimRingMage.m_eitrPercentBonus != 0f) { num3 += sE_WarheimRingMage.m_eitrPercentBonus; } } if (num != 0f) { hp += hp * num; } if (num2 != 0f) { stamina += stamina * num2; } if (num3 != 0f) { eitr += eitr * num3; } } } public const string PluginGUID = "dzk.warheimstuff"; public const string PluginName = "WarheimStuff"; public const string PluginVersion = "1.0.0"; public static AssetBundle WarheimBundle; private readonly float[] _tierSmall = new float[5] { 2f, 4f, 6f, 8f, 10f }; private readonly float[] _tierMedium = new float[5] { 1f, 2f, 3f, 4f, 5f }; private readonly float[] _tierLarge = new float[5] { 5f, 10f, 15f, 20f, 25f }; private void Awake() { //IL_0043: Unknown result type (might be due to invalid IL or missing references) LoadAssets(); PrefabManager.OnVanillaPrefabsAvailable += OnVanillaPrefabsReady; PrefabManager.OnVanillaPrefabsAvailable += OnVanillaItemsReady; PrefabManager.OnVanillaPrefabsAvailable += OnVanillaPrefabsAvailableForColliers; new Harmony("dzk.warheimstuff").PatchAll(); } private void OnVanillaPrefabsAvailableForColliers() { PrefabManager.OnVanillaPrefabsAvailable -= OnVanillaPrefabsAvailableForColliers; ((MonoBehaviour)this).StartCoroutine(AddColliersWhenReady()); } private IEnumerator AddColliersWhenReady() { while ((Object)(object)ObjectDB.instance == (Object)null || (Object)(object)ObjectDB.instance.GetStatusEffect(StringExtensionMethods.GetStableHashCode("GP_Moder")) == (Object)null) { yield return null; } AddColliers(); } private void LoadAssets() { WarheimBundle = AssetUtils.LoadAssetBundleFromResources("customcoins"); } private void OnVanillaPrefabsReady() { AddWarheimCoin(); } private void OnVanillaItemsReady() { PrefabManager.OnVanillaPrefabsAvailable -= OnVanillaPrefabsReady; PrefabManager.OnVanillaPrefabsAvailable -= OnVanillaItemsReady; } private void AddWarheimCoin() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0019: 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 GameObject val = WarheimBundle.LoadAsset<GameObject>("assets/custombb/warheimcoin.prefab"); CustomItem val2 = new CustomItem(val, true); ItemManager.Instance.AddItem(val2); GameObject val3 = WarheimBundle.LoadAsset<GameObject>("assets/custombb/goldbar.prefab"); CustomItem val4 = new CustomItem(val3, true); ItemManager.Instance.AddItem(val4); } private void AddColliers() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected O, but got Unknown //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Expected O, but got Unknown //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Expected O, but got Unknown //IL_0220: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Expected O, but got Unknown //IL_024b: Unknown result type (might be due to invalid IL or missing references) //IL_026c: Unknown result type (might be due to invalid IL or missing references) //IL_0273: Expected O, but got Unknown //IL_0372: Unknown result type (might be due to invalid IL or missing references) //IL_0379: Expected O, but got Unknown //IL_039d: Unknown result type (might be due to invalid IL or missing references) //IL_03be: Unknown result type (might be due to invalid IL or missing references) //IL_03c5: Expected O, but got Unknown //IL_04b7: Unknown result type (might be due to invalid IL or missing references) //IL_04be: Expected O, but got Unknown GameObject val = API.CreateNecklaceFromTemplate("Red", Color.red); API.MarkJewelry(val); ((Object)val).name = "JC_Necklace_Warheim_Sailing"; ItemConfig val2 = new ItemConfig(); val2.Name = "Collier du Capitaine"; val2.Description = "Ce collier vous permettra de toujours avoir le vent dans le dos."; Sprite icon1 = WarheimBundle.LoadAsset<Sprite>("colliersailing_icon.png"); val2.Icon = icon1; val2.AddRequirement("WarheimCoin", 40, 20); val2.CraftingStation = "piece_workbench"; val2.RepairStation = "piece_workbench"; SharedData shared = val.GetComponent<ItemDrop>().m_itemData.m_shared; StatusEffect val3 = WarheimBundle.LoadAsset<StatusEffect>("SE_SailingWarheim"); CustomStatusEffect val4 = new CustomStatusEffect(val3, false); ItemManager.Instance.AddStatusEffect(val4); shared.m_equipStatusEffect = val4.StatusEffect; CustomItem val5 = new CustomItem(val, false, val2); ItemManager.Instance.AddItem(val5); ItemManager.OnItemsRegistered += delegate { GameObject itemPrefab4 = ObjectDB.instance.GetItemPrefab("JC_Necklace_Warheim_Sailing"); ItemDrop val18 = ((itemPrefab4 != null) ? itemPrefab4.GetComponent<ItemDrop>() : null); if ((Object)(object)val18 != (Object)null) { val18.m_itemData.m_shared.m_icons = (Sprite[])(object)new Sprite[1] { icon1 }; } }; GameObject val6 = API.CreateNecklaceFromTemplate("Red", Color.red); API.MarkJewelry(val6); ((Object)val6).name = "JC_Necklace_Warheim_DPS"; ItemConfig val7 = new ItemConfig(); val7.Name = "Collier du Carnage"; val7.Description = "Ce collier augmente considérablement vos dégâts et votre régénération d'endurance."; Sprite icon2 = WarheimBundle.LoadAsset<Sprite>("collierdps_icon.png"); val7.Icon = icon2; val7.AddRequirement("WarheimCoin", 40, 20); val7.CraftingStation = "piece_workbench"; val7.RepairStation = "piece_workbench"; SharedData shared2 = val6.GetComponent<ItemDrop>().m_itemData.m_shared; shared2.m_icons = (Sprite[])(object)new Sprite[1] { icon2 }; SE_CollierWarheimDPS sE_CollierWarheimDPS = ScriptableObject.CreateInstance<SE_CollierWarheimDPS>(); ((Object)sE_CollierWarheimDPS).name = "SE_CollierWarheim_DPS"; ((StatusEffect)sE_CollierWarheimDPS).m_name = "Collier du Carnage"; ((StatusEffect)sE_CollierWarheimDPS).m_icon = icon2; ((StatusEffect)sE_CollierWarheimDPS).m_tooltip = "+15% de dégâts totaux et +10% de régénération d'endurance."; sE_CollierWarheimDPS.SetDamageMultiplier(1.15f); sE_CollierWarheimDPS.SetStaminaRegenMultiplier(1.1f); shared2.m_equipStatusEffect = (StatusEffect)(object)sE_CollierWarheimDPS; CustomItem val8 = new CustomItem(val6, false, val7); ItemManager.Instance.AddItem(val8); ItemManager.OnItemsRegistered += delegate { GameObject itemPrefab3 = ObjectDB.instance.GetItemPrefab("JC_Necklace_Warheim_DPS"); ItemDrop val17 = ((itemPrefab3 != null) ? itemPrefab3.GetComponent<ItemDrop>() : null); if ((Object)(object)val17 != (Object)null) { val17.m_itemData.m_shared.m_icons = (Sprite[])(object)new Sprite[1] { icon2 }; } }; GameObject val9 = API.CreateNecklaceFromTemplate("Red", Color.red); API.MarkJewelry(val9); ((Object)val9).name = "JC_Necklace_Warheim_Mage"; ItemConfig val10 = new ItemConfig(); val10.Name = "Collier du Mage"; val10.Description = "Ce collier augmente vos capacités magiques."; Sprite icon3 = WarheimBundle.LoadAsset<Sprite>("colliermage_icon.png"); val10.Icon = icon3; val10.AddRequirement("WarheimCoin", 40, 20); val10.CraftingStation = "piece_workbench"; val10.RepairStation = "piece_workbench"; SharedData shared3 = val9.GetComponent<ItemDrop>().m_itemData.m_shared; shared3.m_icons = (Sprite[])(object)new Sprite[1] { icon3 }; SE_CollierWarheimMage sE_CollierWarheimMage = ScriptableObject.CreateInstance<SE_CollierWarheimMage>(); ((Object)sE_CollierWarheimMage).name = "SE_CollierWarheim_Mage"; ((StatusEffect)sE_CollierWarheimMage).m_name = "Collier du Mage"; ((StatusEffect)sE_CollierWarheimMage).m_icon = icon3; ((StatusEffect)sE_CollierWarheimMage).m_tooltip = "+10% aux skills de magie, +30% de regen d'eitr, +50 d'eitr max."; sE_CollierWarheimMage.SetEitr(50f); sE_CollierWarheimMage.SetSkill(11f); sE_CollierWarheimMage.SetRegenModifier(1.3f); shared3.m_equipStatusEffect = (StatusEffect)(object)sE_CollierWarheimMage; CustomItem val11 = new CustomItem(val9, false, val10); ItemManager.Instance.AddItem(val11); ItemManager.OnItemsRegistered += delegate { GameObject itemPrefab2 = ObjectDB.instance.GetItemPrefab("JC_Necklace_Warheim_Mage"); ItemDrop val16 = ((itemPrefab2 != null) ? itemPrefab2.GetComponent<ItemDrop>() : null); if ((Object)(object)val16 != (Object)null) { val16.m_itemData.m_shared.m_icons = (Sprite[])(object)new Sprite[1] { icon3 }; } }; GameObject val12 = API.CreateNecklaceFromTemplate("Red", Color.red); API.MarkJewelry(val12); ((Object)val12).name = "JC_Necklace_Warheim_Tank"; ItemConfig val13 = new ItemConfig(); val13.Name = "Collier du Gardien"; val13.Description = "Ce collier augmente vos capacités défensives."; Sprite icon4 = WarheimBundle.LoadAsset<Sprite>("colliertank_icon.png"); val13.Icon = icon4; val13.AddRequirement("WarheimCoin", 40, 20); val13.CraftingStation = "piece_workbench"; val13.RepairStation = "piece_workbench"; SharedData shared4 = val12.GetComponent<ItemDrop>().m_itemData.m_shared; shared4.m_icons = (Sprite[])(object)new Sprite[1] { icon4 }; SE_CollierWarheimTank sE_CollierWarheimTank = ScriptableObject.CreateInstance<SE_CollierWarheimTank>(); ((Object)sE_CollierWarheimTank).name = "SE_CollierWarheim_Tank"; ((StatusEffect)sE_CollierWarheimTank).m_name = "Collier du Gardien"; ((StatusEffect)sE_CollierWarheimTank).m_icon = icon4; ((StatusEffect)sE_CollierWarheimTank).m_tooltip = "+10% de vie totale finale et +15% de régénération de vie."; sE_CollierWarheimTank.SetHealthPercentBonus(0.1f); sE_CollierWarheimTank.SetHealthRegenMultiplier(1.15f); shared4.m_equipStatusEffect = (StatusEffect)(object)sE_CollierWarheimTank; CustomItem val14 = new CustomItem(val12, false, val13); ItemManager.Instance.AddItem(val14); ItemManager.OnItemsRegistered += delegate { GameObject itemPrefab = ObjectDB.instance.GetItemPrefab("JC_Necklace_Warheim_Tank"); ItemDrop val15 = ((itemPrefab != null) ? itemPrefab.GetComponent<ItemDrop>() : null); if ((Object)(object)val15 != (Object)null) { val15.m_itemData.m_shared.m_icons = (Sprite[])(object)new Sprite[1] { icon4 }; } }; AddRings(); } private void AddRings() { AddRingSeries(WarheimRingType.DPS); AddRingSeries(WarheimRingType.Tank); AddRingSeries(WarheimRingType.Archer); AddRingSeries(WarheimRingType.Mage); } private void AddRingSeries(WarheimRingType type) { for (int i = 1; i <= 5; i++) { AddSingleRing(type, i); } } private void AddSingleRing(WarheimRingType type, int tier) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Expected O, but got Unknown //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Expected O, but got Unknown GameObject val = API.CreateRingFromTemplate("Red", Color.red); API.MarkJewelry(val); string typeName = type.ToString().ToUpperInvariant(); string name = $"JC_Ring_Warheim_{typeName}_T{tier}"; ((Object)val).name = name; string ringDisplayName = GetRingDisplayName(type, tier); string ringDescription = GetRingDescription(type, tier); Sprite icon = GetRingIcon(type, tier); ItemConfig val2 = new ItemConfig { Name = ringDisplayName, Description = ringDescription, Icon = icon, CraftingStation = "piece_workbench", RepairStation = "piece_workbench" }; val2.AddRequirement("WarheimCoin", GetRingCost(tier), Math.Max(1, GetRingCost(tier) * 5)); SharedData shared = val.GetComponent<ItemDrop>().m_itemData.m_shared; shared.m_icons = (Sprite[])(object)new Sprite[1] { icon }; StatusEffect equipStatusEffect = CreateRingStatusEffect(type, tier, icon); shared.m_equipStatusEffect = equipStatusEffect; CustomItem val3 = new CustomItem(val, false, val2); ItemManager.Instance.AddItem(val3); ItemManager.OnItemsRegistered += delegate { GameObject itemPrefab = ObjectDB.instance.GetItemPrefab($"JC_Ring_Warheim_{typeName}_T{tier}"); ItemDrop val4 = ((itemPrefab != null) ? itemPrefab.GetComponent<ItemDrop>() : null); if ((Object)(object)val4 != (Object)null) { val4.m_itemData.m_shared.m_icons = (Sprite[])(object)new Sprite[1] { icon }; } }; } private string GetRingDisplayName(WarheimRingType type, int tier) { if (1 == 0) { } string result = type switch { WarheimRingType.DPS => $"Anneau du Carnage T{tier}", WarheimRingType.Tank => $"Anneau du Gardien T{tier}", WarheimRingType.Archer => $"Anneau du Traqueur T{tier}", WarheimRingType.Mage => $"Anneau de l'Arcaniste T{tier}", _ => $"Anneau Warheim T{tier}", }; if (1 == 0) { } return result; } private string GetRingDescription(WarheimRingType type, int tier) { int num = tier - 1; if (1 == 0) { } string result = type switch { WarheimRingType.DPS => "Cet anneau augmente vos capacités offensives en général.", WarheimRingType.Tank => "Cet anneau augmente vos capacités défensives.", WarheimRingType.Archer => "Cet anneau augmente vos capacités d'archer.", WarheimRingType.Mage => "Cet anneau augmente vos capacités de mage.", _ => "Anneau Warheim.", }; if (1 == 0) { } return result; } private int GetRingCost(int tier) { if (1 == 0) { } int result = tier switch { 1 => 5, 2 => 10, 3 => 15, 4 => 20, 5 => 25, _ => 10, }; if (1 == 0) { } return result; } private Sprite GetRingIcon(WarheimRingType type, int tier) { string arg = type.ToString().ToLowerInvariant(); return WarheimBundle.LoadAsset<Sprite>($"ring_{arg}_t{tier}.png"); } private StatusEffect CreateRingStatusEffect(WarheimRingType type, int tier, Sprite icon) { int num = tier - 1; switch (type) { case WarheimRingType.DPS: { SE_WarheimRingDPS sE_WarheimRingDPS = ScriptableObject.CreateInstance<SE_WarheimRingDPS>(); ((Object)sE_WarheimRingDPS).name = $"SE_WarheimRing_DPS_T{tier}"; ((StatusEffect)sE_WarheimRingDPS).m_name = $"Anneau du Carnage T{tier}"; ((StatusEffect)sE_WarheimRingDPS).m_icon = icon; ((StatusEffect)sE_WarheimRingDPS).m_tooltip = $"+{_tierSmall[num]}% regen stamina, +{_tierMedium[num]}% dégâts totaux."; sE_WarheimRingDPS.SetStaminaRegenMultiplier(1f + _tierSmall[num] / 100f); sE_WarheimRingDPS.SetDamageMultiplier(1f + _tierMedium[num] / 100f); return (StatusEffect)(object)sE_WarheimRingDPS; } case WarheimRingType.Tank: { SE_WarheimRingTank sE_WarheimRingTank = ScriptableObject.CreateInstance<SE_WarheimRingTank>(); ((Object)sE_WarheimRingTank).name = $"SE_WarheimRing_Tank_T{tier}"; ((StatusEffect)sE_WarheimRingTank).m_name = $"Anneau du Gardien T{tier}"; ((StatusEffect)sE_WarheimRingTank).m_icon = icon; ((StatusEffect)sE_WarheimRingTank).m_tooltip = $"+{_tierSmall[num]}% vie totale, +{_tierLarge[num]}% regen vie."; sE_WarheimRingTank.SetHealthPercentBonus(_tierSmall[num] / 100f); sE_WarheimRingTank.SetHealthRegenMultiplier(1f + _tierLarge[num] / 100f); return (StatusEffect)(object)sE_WarheimRingTank; } case WarheimRingType.Archer: { SE_WarheimRingArcher sE_WarheimRingArcher = ScriptableObject.CreateInstance<SE_WarheimRingArcher>(); ((Object)sE_WarheimRingArcher).name = $"SE_WarheimRing_Archer_T{tier}"; ((StatusEffect)sE_WarheimRingArcher).m_name = $"Anneau du Traqueur T{tier}"; ((StatusEffect)sE_WarheimRingArcher).m_icon = icon; ((StatusEffect)sE_WarheimRingArcher).m_tooltip = $"+{_tierSmall[num]}% stamina totale, +{_tierMedium[num]}% vitesse de déplacement."; sE_WarheimRingArcher.SetStaminaPercentBonus(_tierSmall[num] / 100f); sE_WarheimRingArcher.SetMoveSpeedMultiplier(1f + _tierMedium[num] / 100f); return (StatusEffect)(object)sE_WarheimRingArcher; } case WarheimRingType.Mage: { SE_WarheimRingMage sE_WarheimRingMage = ScriptableObject.CreateInstance<SE_WarheimRingMage>(); ((Object)sE_WarheimRingMage).name = $"SE_WarheimRing_Mage_T{tier}"; ((StatusEffect)sE_WarheimRingMage).m_name = $"Anneau de l'Arcaniste T{tier}"; ((StatusEffect)sE_WarheimRingMage).m_icon = icon; ((StatusEffect)sE_WarheimRingMage).m_tooltip = $"+{_tierSmall[num]}% eitr total, +{_tierLarge[num]}% regen d'eitr."; sE_WarheimRingMage.SetEitrPercentBonus(_tierSmall[num] / 100f); sE_WarheimRingMage.SetEitrRegenMultiplier(1f + _tierLarge[num] / 100f); return (StatusEffect)(object)sE_WarheimRingMage; } default: return null; } } }