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 ExtendedStatusEffects v0.0.1
plugins/ValkyrieStatusEffects.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Text; using BepInEx; using HarmonyLib; using Jotunn.Entities; using Jotunn.Managers; using Jotunn.Utils; using SimpleJson; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("ValkyrieStatusEffects")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ValkyrieStatusEffects")] [assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("58b2d542-66ac-4436-a3db-8844bb0c7991")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace ValkyrieStatusEffects; public class ExtendedStatusEffect : SE_Stats { public float m_maxHealth; public float m_maxStamina; public float m_maxEitr; public float m_damageReduction; public Dictionary<SkillType, float> m_weaponDamageModifiers = new Dictionary<SkillType, float>(); public float m_healingMultiplier; public string GetWeaponDamageModifiersTooltip() { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: 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_004d: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Expected I4, but got Unknown if (m_weaponDamageModifiers.Count == 0) { return ""; } string text = ""; foreach (KeyValuePair<SkillType, float> weaponDamageModifier in m_weaponDamageModifiers) { if (weaponDamageModifier.Value != 0f) { SkillType key = weaponDamageModifier.Key; switch (key - 1) { case 6: text += "\n$skill_axes: "; break; case 9: text += "\n$skill_bloodmagic: "; break; case 7: text += "\n$skill_bows: "; break; case 2: text += "\n$skill_clubs: "; break; case 13: text += "\n$skill_crossbows: "; break; case 8: text += "\n$skill_elementalmagic: "; break; case 1: text += "\n$skill_knives: "; break; case 11: text += "\n$skill_pickaxes: "; break; case 3: text += "\n$skill_polearms: "; break; case 4: text += "\n$skill_spears: "; break; case 0: text += "\n$skill_swords: "; break; case 10: text += "\n$skill_unarmed: "; break; } text += $"<color=orange>{((weaponDamageModifier.Value > 0f) ? '+' : '-')}{weaponDamageModifier.Value * 100f}% DMG</color>"; } } return text; } public override string GetTooltipString() { //IL_054e: Unknown result type (might be due to invalid IL or missing references) //IL_05a9: Unknown result type (might be due to invalid IL or missing references) StringBuilder stringBuilder = new StringBuilder(256); if (((StatusEffect)this).m_tooltip.Length > 0) { stringBuilder.AppendFormat("{0}\n", ((StatusEffect)this).m_tooltip); } if (base.m_runStaminaDrainModifier != 0f) { stringBuilder.AppendFormat("$se_runstamina: <color=orange>{0}%</color>\n", (base.m_runStaminaDrainModifier * 100f).ToString("+0;-0")); } if (m_maxHealth != 0f) { stringBuilder.AppendFormat("HP: <color=orange>{0}</color>\n", m_maxHealth.ToString()); } if (base.m_healthOverTime != 0f) { stringBuilder.AppendFormat("$se_health: <color=orange>{0}</color>\n", base.m_healthOverTime.ToString()); } if (m_maxStamina != 0f) { stringBuilder.AppendFormat("Stamina: <color=orange>{0}</color>\n", m_maxStamina.ToString()); } if (base.m_staminaOverTime != 0f) { stringBuilder.AppendFormat("$se_stamina: <color=orange>{0}</color>\n", base.m_staminaOverTime.ToString()); } if (m_maxEitr != 0f) { stringBuilder.AppendFormat("Eitr: <color=orange>{0}</color>\n", m_maxEitr.ToString()); } if (base.m_eitrOverTime != 0f) { stringBuilder.AppendFormat("$se_eitr: <color=orange>{0}</color>\n", base.m_eitrOverTime.ToString()); } if (base.m_healthRegenMultiplier != 1f) { stringBuilder.AppendFormat("$se_healthregen: <color=orange>{0}%</color>\n", ((base.m_healthRegenMultiplier - 1f) * 100f).ToString("+0;-0")); } if (base.m_staminaRegenMultiplier != 1f) { stringBuilder.AppendFormat("$se_staminaregen: <color=orange>{0}%</color>\n", ((base.m_staminaRegenMultiplier - 1f) * 100f).ToString("+0;-0")); } if (base.m_eitrRegenMultiplier != 1f) { stringBuilder.AppendFormat("$se_eitrregen: <color=orange>{0}%</color>\n", ((base.m_eitrRegenMultiplier - 1f) * 100f).ToString("+0;-0")); } if (base.m_addMaxCarryWeight != 0f) { stringBuilder.AppendFormat("$se_max_carryweight: <color=orange>{0}</color>\n", base.m_addMaxCarryWeight.ToString("+0;-0")); } if (base.m_mods.Count > 0) { stringBuilder.Append(SE_Stats.GetDamageModifiersTooltipString(base.m_mods)); stringBuilder.Append("\n"); } if (base.m_noiseModifier != 0f) { stringBuilder.AppendFormat("$se_noisemod: <color=orange>{0}%</color>\n", (base.m_noiseModifier * 100f).ToString("+0;-0")); } if (base.m_stealthModifier != 0f) { stringBuilder.AppendFormat("$se_sneakmod: <color=orange>{0}%</color>\n", (base.m_stealthModifier * 100f).ToString("+0;-0")); } if (base.m_speedModifier != 0f) { stringBuilder.AppendFormat("$item_movement_modifier: <color=orange>{0}%</color>\n", (base.m_speedModifier * 100f).ToString("+0;-0")); } if (base.m_maxMaxFallSpeed != 0f) { stringBuilder.AppendFormat("$item_limitfallspeed: <color=orange>{0}m/s</color>\n", base.m_maxMaxFallSpeed.ToString("0")); } if (base.m_fallDamageModifier != 0f) { stringBuilder.AppendFormat("$item_falldamage: <color=orange>{0}%</color>\n", (base.m_fallDamageModifier * 100f).ToString("+0;-0")); } if (base.m_jumpModifier.y != 0f) { stringBuilder.AppendFormat("$se_jumpheight: <color=orange>{0}%</color>\n", (base.m_jumpModifier.y * 100f).ToString("+0;-0")); } if (base.m_jumpModifier.x != 0f || base.m_jumpModifier.z != 0f) { stringBuilder.AppendFormat("$se_jumplength: <color=orange>{0}%</color>\n", (Mathf.Max(base.m_jumpModifier.x, base.m_jumpModifier.z) * 100f).ToString("+0;-0")); } if (base.m_jumpStaminaUseModifier != 0f) { stringBuilder.AppendFormat("$se_jumpstamina: <color=orange>{0}%</color>\n", (base.m_jumpStaminaUseModifier * 100f).ToString("+0;-0")); } if (base.m_attackStaminaUseModifier != 0f) { stringBuilder.AppendFormat("$se_attackstamina: <color=orange>{0}%</color>\n", (base.m_attackStaminaUseModifier * 100f).ToString("+0;-0")); } if (base.m_blockStaminaUseModifier != 0f) { stringBuilder.AppendFormat("$se_blockstamina: <color=orange>{0}%</color>\n", (base.m_blockStaminaUseModifier * 100f).ToString("+0;-0")); } if (base.m_dodgeStaminaUseModifier != 0f) { stringBuilder.AppendFormat("$se_dodgestamina: <color=orange>{0}%</color>\n", (base.m_dodgeStaminaUseModifier * 100f).ToString("+0;-0")); } if (base.m_swimStaminaUseModifier != 0f) { stringBuilder.AppendFormat("$se_swimstamina: <color=orange>{0}%</color>\n", (base.m_dodgeStaminaUseModifier * 100f).ToString("+0;-0")); } if (base.m_homeItemStaminaUseModifier != 0f) { stringBuilder.AppendFormat("$base_item_modifier: <color=orange>{0}%</color>\n", (base.m_homeItemStaminaUseModifier * 100f).ToString("+0;-0")); } if (base.m_sneakStaminaUseModifier != 0f) { stringBuilder.AppendFormat("$se_sneakstamina: <color=orange>{0}%</color>\n", (base.m_sneakStaminaUseModifier * 100f).ToString("+0;-0")); } if (base.m_runStaminaUseModifier != 0f) { stringBuilder.AppendFormat("$se_runstamina: <color=orange>{0}%</color>\n", (base.m_runStaminaUseModifier * 100f).ToString("+0;-0")); } if ((int)base.m_skillLevel != 0 && base.m_skillLevelModifier != 0f) { stringBuilder.AppendFormat("{0} <color=orange>{1}</color>\n", Localization.instance.Localize("$skill_" + ((object)(SkillType)(ref base.m_skillLevel)).ToString().ToLower()), base.m_skillLevelModifier.ToString("+0;-0")); } if ((int)base.m_skillLevel2 != 0 && base.m_skillLevelModifier2 != 0f) { stringBuilder.AppendFormat("{0} <color=orange>{1}</color>\n", Localization.instance.Localize("$skill_" + ((object)(SkillType)(ref base.m_skillLevel2)).ToString().ToLower()), base.m_skillLevelModifier2.ToString("+0;-0")); } if (base.m_percentigeDamageModifiers.m_blunt != 0f) { stringBuilder.AppendFormat("$inventory_blunt: <color=orange>{0}%</color>\n", (base.m_percentigeDamageModifiers.m_blunt * 100f).ToString("+0;-0")); } if (base.m_percentigeDamageModifiers.m_slash != 0f) { stringBuilder.AppendFormat("$inventory_slash: <color=orange>{0}%</color>\n", (base.m_percentigeDamageModifiers.m_slash * 100f).ToString("+0;-0")); } if (base.m_percentigeDamageModifiers.m_pierce != 0f) { stringBuilder.AppendFormat("$inventory_pierce: <color=orange>{0}%</color>\n", (base.m_percentigeDamageModifiers.m_pierce * 100f).ToString("+0;-0")); } if (base.m_percentigeDamageModifiers.m_chop != 0f) { stringBuilder.AppendFormat("$inventory_chop: <color=orange>{0}%</color>\n", (base.m_percentigeDamageModifiers.m_chop * 100f).ToString("+0;-0")); } if (base.m_percentigeDamageModifiers.m_pickaxe != 0f) { stringBuilder.AppendFormat("$inventory_pickaxe: <color=orange>{0}%</color>\n", (base.m_percentigeDamageModifiers.m_pickaxe * 100f).ToString("+0;-0")); } if (base.m_percentigeDamageModifiers.m_fire != 0f) { stringBuilder.AppendFormat("$inventory_fire: <color=orange>{0}%</color>\n", (base.m_percentigeDamageModifiers.m_fire * 100f).ToString("+0;-0")); } if (base.m_percentigeDamageModifiers.m_frost != 0f) { stringBuilder.AppendFormat("$inventory_frost: <color=orange>{0}%</color>\n", (base.m_percentigeDamageModifiers.m_frost * 100f).ToString("+0;-0")); } if (base.m_percentigeDamageModifiers.m_lightning != 0f) { stringBuilder.AppendFormat("$inventory_lightning: <color=orange>{0}%</color>\n", (base.m_percentigeDamageModifiers.m_lightning * 100f).ToString("+0;-0")); } if (base.m_percentigeDamageModifiers.m_poison != 0f) { stringBuilder.AppendFormat("$inventory_poison: <color=orange>{0}%</color>\n", (base.m_percentigeDamageModifiers.m_poison * 100f).ToString("+0;-0")); } if (base.m_percentigeDamageModifiers.m_spirit != 0f) { stringBuilder.AppendFormat("$inventory_spirit: <color=orange>{0}%</color>\n", (base.m_percentigeDamageModifiers.m_spirit * 100f).ToString("+0;-0")); } if (m_damageReduction != 0f) { stringBuilder.AppendFormat("Reducción de daño: <color=orange>{0}%</color>\n", (m_damageReduction * 100f).ToString("+0;-0")); } if (m_weaponDamageModifiers.Count > 0) { stringBuilder.Append(GetWeaponDamageModifiersTooltip()); stringBuilder.Append("\n"); } return stringBuilder.ToString(); } } [BepInPlugin("com.valkyrie.statuseffects", "Valkyrie's Status Effects", "0.0.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] public class Main : BaseUnityPlugin { [HarmonyPatch] private class Patches { private static readonly Converter<StatusEffect, ExtendedStatusEffect> SEtoESEConverter = (StatusEffect se) => (ExtendedStatusEffect)(object)se; private static List<ExtendedStatusEffect> GetExtendedSEs(SEMan seman) { return seman.GetStatusEffects().FindAll((StatusEffect se) => ((object)se).GetType() == typeof(ExtendedStatusEffect)).ConvertAll(SEtoESEConverter); } [HarmonyPostfix] [HarmonyPatch(typeof(Attack), "ModifyDamage")] private static void Attack_ModifyDamagePatch(ref HitData hitData, ref float damageFactor) { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) foreach (ExtendedStatusEffect extendedSE in GetExtendedSEs(hitData.GetAttacker().GetSEMan())) { foreach (KeyValuePair<SkillType, float> weaponDamageModifier in extendedSE.m_weaponDamageModifiers) { if (hitData.m_skill == weaponDamageModifier.Key) { ((DamageTypes)(ref hitData.m_damage)).Modify(1f + weaponDamageModifier.Value); } } } } [HarmonyPrefix] [HarmonyPatch(typeof(Character), "RPC_Damage")] private static void Character_RPC_DamagePatch(Character __instance, long sender, ref HitData hit) { List<ExtendedStatusEffect> extendedSEs = GetExtendedSEs(__instance.GetSEMan()); float num = 0f; foreach (ExtendedStatusEffect item in extendedSEs) { num += item.m_damageReduction; } float num2 = 1f - num; ((DamageTypes)(ref hit.m_damage)).Modify(num2); } [HarmonyPrefix] [HarmonyPatch(typeof(Player), "GetTotalFoodValue")] private static bool Player_UpdateStatsPatch(Player __instance, out float hp, out float stamina, out float eitr) { hp = __instance.m_baseHP; stamina = __instance.m_baseStamina; eitr = 0f; foreach (Food food in __instance.GetFoods()) { hp += food.m_health; stamina += food.m_stamina; eitr += food.m_eitr; } foreach (ExtendedStatusEffect extendedSE in GetExtendedSEs(((Character)__instance).GetSEMan())) { hp += extendedSE.m_maxHealth; stamina += extendedSE.m_maxStamina; eitr += extendedSE.m_maxEitr; } return false; } } public const string PluginGUID = "com.valkyrie.statuseffects"; public const string PluginName = "Valkyrie's Status Effects"; public const string PluginVersion = "0.0.1"; public static Dictionary<int, StatusEffect> statusEffects = new Dictionary<int, StatusEffect>(); private static readonly string pluginPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); private static readonly string configPath = Paths.ConfigPath; private static readonly string seFolderPath = Path.Combine(configPath, "ValkyrieStatusEffects"); private static readonly string iconsPath = Path.Combine(seFolderPath, "Icons"); private static Harmony harm = new Harmony("ValkyrieStatusEffects"); private void Awake() { SetupFiles(); DefaultJSON(); PrefabManager.OnVanillaPrefabsAvailable += delegate { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown CustomItem val = new CustomItem("KerekMegChest", "ArmorBronzeChest"); val.ItemDrop.m_itemData.m_shared.m_equipStatusEffect = GeneralExtensions.GetValueSafe<int, StatusEffect>(statusEffects, StringExtensionMethods.GetStableHashCode("Kerek Meg")); ItemManager.Instance.AddItem(val); }; harm.PatchAll(); } private void SetupFiles() { if (!Directory.Exists(seFolderPath)) { Directory.CreateDirectory(seFolderPath); } } private void LoadAllSE() { string[] directories = Directory.GetDirectories(seFolderPath); for (int i = 0; i < directories.Length; i++) { string[] files = Directory.GetFiles(directories[i]); foreach (string path in files) { LoadSE(path); } } directories = Directory.GetFiles(seFolderPath); foreach (string path2 in directories) { LoadSE(path2); } } private void LoadSE(string path) { File.Exists(path); } private void DefaultJSON() { //IL_001e: 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_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003d: 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_004c: 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0079: 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_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Expected O, but got Unknown ExtendedStatusEffect extendedStatusEffect = ScriptableObject.CreateInstance<ExtendedStatusEffect>(); ((Object)extendedStatusEffect).name = "Test Extended SE"; ((StatusEffect)extendedStatusEffect).m_name = "Test Extended SE"; ((StatusEffect)extendedStatusEffect).m_attributes = (StatusAttribute)2; ((SE_Stats)extendedStatusEffect).m_mods = new List<DamageModPair> { new DamageModPair { m_modifier = (DamageModifier)3, m_type = (DamageType)1 }, new DamageModPair { m_modifier = (DamageModifier)6, m_type = (DamageType)224 }, new DamageModPair { m_modifier = (DamageModifier)1, m_type = (DamageType)8 } }; ((SE_Stats)extendedStatusEffect).m_raiseSkill = (SkillType)10; extendedStatusEffect.m_maxEitr = 50f; extendedStatusEffect.m_maxStamina = 75f; extendedStatusEffect.m_maxHealth = 100f; string contents = SimpleJson.SerializeObject((object)SerializeSE(extendedStatusEffect)); string path = Path.Combine(seFolderPath, "SE_Default.json"); File.WriteAllText(path, contents); DeserializeSE(File.ReadAllText(path)); CustomStatusEffect val = new CustomStatusEffect((StatusEffect)(object)extendedStatusEffect, false); statusEffects.Add(StringExtensionMethods.GetStableHashCode(((Object)extendedStatusEffect).name), val.StatusEffect); ItemManager.Instance.AddStatusEffect(val); } private ExtendedStatusEffect DeserializeSE(Dictionary<string, object> sse) { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: 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_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_024a: Unknown result type (might be due to invalid IL or missing references) //IL_024f: Unknown result type (might be due to invalid IL or missing references) //IL_0272: Unknown result type (might be due to invalid IL or missing references) //IL_0277: Unknown result type (might be due to invalid IL or missing references) //IL_02bb: Unknown result type (might be due to invalid IL or missing references) //IL_02c0: Unknown result type (might be due to invalid IL or missing references) //IL_02f4: Unknown result type (might be due to invalid IL or missing references) //IL_02f9: Unknown result type (might be due to invalid IL or missing references) //IL_031c: Unknown result type (might be due to invalid IL or missing references) //IL_0321: Unknown result type (might be due to invalid IL or missing references) //IL_03b3: Unknown result type (might be due to invalid IL or missing references) //IL_03c2: Unknown result type (might be due to invalid IL or missing references) //IL_03c7: Unknown result type (might be due to invalid IL or missing references) //IL_03d6: Unknown result type (might be due to invalid IL or missing references) ExtendedStatusEffect extendedStatusEffect = new ExtendedStatusEffect(); ((Object)extendedStatusEffect).name = GeneralExtensions.GetTypedValue<string>(sse, "name"); ((StatusEffect)extendedStatusEffect).m_name = GeneralExtensions.GetTypedValue<string>(sse, "m_name"); ((StatusEffect)extendedStatusEffect).m_activationAnimation = GeneralExtensions.GetTypedValue<string>(sse, "m_activationAnimation"); ((StatusEffect)extendedStatusEffect).m_attributes = DeserializeEnum<StatusAttribute>(GeneralExtensions.GetTypedValue<string>(sse, "m_attributes")); ((StatusEffect)extendedStatusEffect).m_category = GeneralExtensions.GetTypedValue<string>(sse, "m_category"); ((StatusEffect)extendedStatusEffect).m_cooldown = GeneralExtensions.GetTypedValue<float>(sse, "m_cooldown"); ((StatusEffect)extendedStatusEffect).m_repeatInterval = GeneralExtensions.GetTypedValue<float>(sse, "m_repeatInterval"); ((StatusEffect)extendedStatusEffect).m_repeatMessage = GeneralExtensions.GetTypedValue<string>(sse, "m_repeatMessage"); ((StatusEffect)extendedStatusEffect).m_repeatMessageType = DeserializeEnum<MessageType>(GeneralExtensions.GetTypedValue<string>(sse, "m_repeatMessageType")); ((StatusEffect)extendedStatusEffect).m_startMessage = GeneralExtensions.GetTypedValue<string>(sse, "m_startMessage"); ((StatusEffect)extendedStatusEffect).m_startMessageType = DeserializeEnum<MessageType>(GeneralExtensions.GetTypedValue<string>(sse, "m_startMessageType")); ((StatusEffect)extendedStatusEffect).m_stopMessage = GeneralExtensions.GetTypedValue<string>(sse, "m_stopMessage"); ((StatusEffect)extendedStatusEffect).m_stopMessageType = DeserializeEnum<MessageType>(GeneralExtensions.GetTypedValue<string>(sse, "m_stopMessageType")); ((StatusEffect)extendedStatusEffect).m_tooltip = GeneralExtensions.GetTypedValue<string>(sse, "m_tooltip"); ((StatusEffect)extendedStatusEffect).m_ttl = GeneralExtensions.GetTypedValue<float>(sse, "m_ttl"); ((SE_Stats)extendedStatusEffect).m_tickInterval = GeneralExtensions.GetTypedValue<float>(sse, "m_tickInterval"); extendedStatusEffect.m_maxHealth = GeneralExtensions.GetTypedValue<float>(sse, "m_maxHealth"); extendedStatusEffect.m_maxStamina = GeneralExtensions.GetTypedValue<float>(sse, "m_maxStamina"); extendedStatusEffect.m_maxEitr = GeneralExtensions.GetTypedValue<float>(sse, "m_maxEitr"); ((SE_Stats)extendedStatusEffect).m_maxMaxFallSpeed = GeneralExtensions.GetTypedValue<float>(sse, "m_maxMaxFallSpeed"); ((SE_Stats)extendedStatusEffect).m_addMaxCarryWeight = GeneralExtensions.GetTypedValue<float>(sse, "m_addMaxCarryWeight"); ((SE_Stats)extendedStatusEffect).m_damageModifier = GeneralExtensions.GetTypedValue<float>(sse, "m_damageModifier"); ((SE_Stats)extendedStatusEffect).m_eitrOverTime = GeneralExtensions.GetTypedValue<float>(sse, "m_eitrOverTime"); ((SE_Stats)extendedStatusEffect).m_eitrOverTimeDuration = GeneralExtensions.GetTypedValue<float>(sse, "m_eitrOverTimeDuration"); ((SE_Stats)extendedStatusEffect).m_eitrRegenMultiplier = GeneralExtensions.GetTypedValue<float>(sse, "m_eitrRegenMultiplier"); ((SE_Stats)extendedStatusEffect).m_fallDamageModifier = GeneralExtensions.GetTypedValue<float>(sse, "m_fallDamageModifier"); ((SE_Stats)extendedStatusEffect).m_healthOverTime = GeneralExtensions.GetTypedValue<float>(sse, "m_healthOverTime"); ((SE_Stats)extendedStatusEffect).m_healthOverTimeDuration = GeneralExtensions.GetTypedValue<float>(sse, "m_healthOverTimeDuration"); ((SE_Stats)extendedStatusEffect).m_healthOverTimeInterval = GeneralExtensions.GetTypedValue<float>(sse, "m_healthOverTimeInterval"); ((SE_Stats)extendedStatusEffect).m_healthPerTick = GeneralExtensions.GetTypedValue<float>(sse, "m_healthPerTick"); ((SE_Stats)extendedStatusEffect).m_healthPerTickMinHealthPercentage = GeneralExtensions.GetTypedValue<float>(sse, "m_healthPerTickMinHealthPercentage"); ((SE_Stats)extendedStatusEffect).m_healthRegenMultiplier = GeneralExtensions.GetTypedValue<float>(sse, "m_healthRegenMultiplier"); ((SE_Stats)extendedStatusEffect).m_jumpModifier = ParseVector3(GeneralExtensions.GetTypedValue<string>(sse, "m_jumpModifier")); ((SE_Stats)extendedStatusEffect).m_jumpStaminaUseModifier = GeneralExtensions.GetTypedValue<float>(sse, "m_jumpStaminaUseModifier"); ((SE_Stats)extendedStatusEffect).m_modifyAttackSkill = DeserializeEnum<SkillType>(GeneralExtensions.GetTypedValue<string>(sse, "m_modifyAttackSkill")); ((SE_Stats)extendedStatusEffect).m_mods = DeserializeDamageModifiers((Dictionary<string, string>)SimpleJson.DeserializeObject(GeneralExtensions.GetTypedValue<string>(sse, "m_mods"))); ((SE_Stats)extendedStatusEffect).m_noiseModifier = GeneralExtensions.GetTypedValue<float>(sse, "m_noiseModifier"); ((SE_Stats)extendedStatusEffect).m_raiseSkill = DeserializeEnum<SkillType>(GeneralExtensions.GetTypedValue<string>(sse, "m_raiseSkill")); ((SE_Stats)extendedStatusEffect).m_raiseSkillModifier = GeneralExtensions.GetTypedValue<float>(sse, "m_raiseSkillModifier"); ((SE_Stats)extendedStatusEffect).m_runStaminaDrainModifier = GeneralExtensions.GetTypedValue<float>(sse, "m_runStaminaDrainModifier"); ((SE_Stats)extendedStatusEffect).m_skillLevel = DeserializeEnum<SkillType>(GeneralExtensions.GetTypedValue<string>(sse, "m_skillLevel")); ((SE_Stats)extendedStatusEffect).m_skillLevelModifier = GeneralExtensions.GetTypedValue<float>(sse, "m_skillLevelModifier"); ((SE_Stats)extendedStatusEffect).m_skillLevel2 = DeserializeEnum<SkillType>(GeneralExtensions.GetTypedValue<string>(sse, "m_skillLevel2")); ((SE_Stats)extendedStatusEffect).m_skillLevelModifier2 = GeneralExtensions.GetTypedValue<float>(sse, "m_skillLevelModifier2"); ((SE_Stats)extendedStatusEffect).m_speedModifier = GeneralExtensions.GetTypedValue<float>(sse, "m_speedModifier"); ((SE_Stats)extendedStatusEffect).m_staminaDrainPerSec = GeneralExtensions.GetTypedValue<float>(sse, "m_staminaDrainPerSec"); ((SE_Stats)extendedStatusEffect).m_staminaOverTime = GeneralExtensions.GetTypedValue<float>(sse, "m_staminaOverTime"); ((SE_Stats)extendedStatusEffect).m_staminaOverTimeDuration = GeneralExtensions.GetTypedValue<float>(sse, "m_staminaOverTimeDuration"); ((SE_Stats)extendedStatusEffect).m_staminaRegenMultiplier = GeneralExtensions.GetTypedValue<float>(sse, "m_staminaRegenMultiplier"); ((SE_Stats)extendedStatusEffect).m_stealthModifier = GeneralExtensions.GetTypedValue<float>(sse, "m_stealthModifier"); ((StatusEffect)extendedStatusEffect).m_icon = Sprite.Create(LoadTexture(GeneralExtensions.GetTypedValue<string>(sse, "m_icon")), new Rect(Vector2.zero, new Vector2(48f, 48f)), new Vector2(24f, 24f)); return extendedStatusEffect; } private string SerializeSE(ExtendedStatusEffect se) { //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_0303: Unknown result type (might be due to invalid IL or missing references) //IL_034c: Unknown result type (might be due to invalid IL or missing references) //IL_038f: Unknown result type (might be due to invalid IL or missing references) //IL_03bc: Unknown result type (might be due to invalid IL or missing references) Dictionary<string, object> obj = new Dictionary<string, object> { { "name", ((Object)se).name }, { "m_name", ((StatusEffect)se).m_name }, { "m_activationAnimation", ((StatusEffect)se).m_activationAnimation }, { "m_attributes", SerializeEnum<StatusAttribute>(((StatusEffect)se).m_attributes) }, { "m_category", ((StatusEffect)se).m_category }, { "m_cooldown", ((StatusEffect)se).m_cooldown }, { "m_repeatInterval", ((StatusEffect)se).m_repeatInterval }, { "m_repeatMessage", ((StatusEffect)se).m_repeatMessage }, { "m_repeatMessageType", SerializeEnum<MessageType>(((StatusEffect)se).m_repeatMessageType) }, { "m_startMessage", ((StatusEffect)se).m_startMessage }, { "m_startMessageType", SerializeEnum<MessageType>(((StatusEffect)se).m_startMessageType) }, { "m_stopMessage", ((StatusEffect)se).m_stopMessage }, { "m_stopMessageType", SerializeEnum<MessageType>(((StatusEffect)se).m_stopMessageType) }, { "m_tooltip", ((StatusEffect)se).m_tooltip }, { "m_ttl", ((StatusEffect)se).m_ttl }, { "m_tickInterval", ((SE_Stats)se).m_tickInterval }, { "m_maxHealth", se.m_maxHealth }, { "m_maxStamina", se.m_maxStamina }, { "m_maxEitr", se.m_maxEitr }, { "m_maxMaxFallSpeed", ((SE_Stats)se).m_maxMaxFallSpeed }, { "m_addMaxCarryWeight", ((SE_Stats)se).m_addMaxCarryWeight }, { "m_damageModifier", ((SE_Stats)se).m_damageModifier }, { "m_eitrOverTime", ((SE_Stats)se).m_eitrOverTime }, { "m_eitrOverTimeDuration", ((SE_Stats)se).m_eitrOverTimeDuration }, { "m_eitrRegenMultiplier", ((SE_Stats)se).m_eitrRegenMultiplier }, { "m_fallDamageModifier", ((SE_Stats)se).m_fallDamageModifier }, { "m_healthOverTime", ((SE_Stats)se).m_healthOverTime }, { "m_healthOverTimeDuration", ((SE_Stats)se).m_healthOverTimeDuration }, { "m_healthOverTimeInterval", ((SE_Stats)se).m_healthOverTimeInterval }, { "m_healthPerTick", ((SE_Stats)se).m_healthPerTick }, { "m_healthPerTickMinHealthPercentage", ((SE_Stats)se).m_healthPerTickMinHealthPercentage }, { "m_healthRegenMultiplier", ((SE_Stats)se).m_healthRegenMultiplier }, { "m_jumpModifier", $"{((SE_Stats)se).m_jumpModifier.x},{((SE_Stats)se).m_jumpModifier.y},{((SE_Stats)se).m_jumpModifier.z}" }, { "m_jumpStaminaUseModifier", ((SE_Stats)se).m_jumpStaminaUseModifier }, { "m_modifyAttackSkill", ((SE_Stats)se).m_modifyAttackSkill }, { "m_mods", SimpleJson.SerializeObject((object)SerializeDamageModifiers(((SE_Stats)se).m_mods)) }, { "m_noiseModifier", ((SE_Stats)se).m_noiseModifier }, { "m_raiseSkill", SerializeEnum<SkillType>(((SE_Stats)se).m_raiseSkill) }, { "m_raiseSkillModifier", ((SE_Stats)se).m_raiseSkillModifier }, { "m_runStaminaDrainModifier", ((SE_Stats)se).m_runStaminaDrainModifier }, { "m_skillLevel", SerializeEnum<SkillType>(((SE_Stats)se).m_skillLevel) }, { "m_skillLevelModifier", ((SE_Stats)se).m_skillLevelModifier }, { "m_skillLevel2", SerializeEnum<SkillType>(((SE_Stats)se).m_skillLevel2) }, { "m_skillLevelModifier2", ((SE_Stats)se).m_skillLevelModifier2 }, { "m_speedModifier", ((SE_Stats)se).m_speedModifier }, { "m_staminaDrainPerSec", ((SE_Stats)se).m_staminaDrainPerSec }, { "m_staminaOverTime", ((SE_Stats)se).m_staminaOverTime }, { "m_staminaOverTimeDuration", ((SE_Stats)se).m_staminaOverTimeDuration }, { "m_staminaRegenMultiplier", ((SE_Stats)se).m_staminaRegenMultiplier }, { "m_stealthModifier", ((SE_Stats)se).m_stealthModifier } }; Sprite icon = ((StatusEffect)se).m_icon; obj.Add("m_icon", (icon != null) ? ((Object)icon).name : null); return SimpleJson.SerializeObject((object)obj); } private Dictionary<string, string> SerializeDamageModifiers(List<DamageModPair> dmps) { //IL_0011: 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_0019: 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_0025: 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) Dictionary<string, string> dictionary = new Dictionary<string, string>(); foreach (DamageModPair dmp in dmps) { dictionary.Add(SerializeEnum<DamageType>(dmp.m_type), SerializeEnum<DamageModifier>(dmp.m_modifier)); } return dictionary; } private List<DamageModPair> DeserializeDamageModifiers(Dictionary<string, string> dmps) { //IL_001a: 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_002f: Unknown result type (might be due to invalid IL or missing references) //IL_003e: 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) //IL_0048: Unknown result type (might be due to invalid IL or missing references) List<DamageModPair> list = new List<DamageModPair>(); foreach (KeyValuePair<string, string> dmp in dmps) { list.Add(new DamageModPair { m_type = DeserializeEnum<DamageType>(dmp.Key), m_modifier = DeserializeEnum<DamageModifier>(dmp.Value) }); } return list; } public T DeserializeEnum<T>(string e) { return (T)Enum.Parse(typeof(T), e); } public string SerializeEnum<T>(T e) { return Enum.GetName(typeof(T), e); } private Vector3 ParseVector3(string v) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) string[] array = v.Split(new char[1] { ',' }); if (array.Length != 3) { return Vector3.zero; } return new Vector3(float.Parse(array[0]), float.Parse(array[1]), float.Parse(array[2])); } private Texture2D LoadTexture(string path, int w = 48, int h = 48) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown Texture2D val = new Texture2D(w, h); if (!File.Exists(path)) { return val; } ImageConversion.LoadImage(val, File.ReadAllBytes(path)); return val; } private StatusEffect DeserializeSE(string json) { return null; } }