using 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; using Jotunn.Configs; using Jotunn.Entities; using Jotunn.Managers; using Jotunn.Utils; using PvpOverhaul.API; using TMPro; 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 PatchedButtons = new HashSet(); 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 { Count: not 0 } dictionary)) { 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}"); } } } public static class WarheimPdf { public class SE_WarheimPdfCooldown : StatusEffect { } private static class PdfCastBar { private static GameObject _root; private static Text _text; private static readonly Color Gold = new Color(1f, 0.78f, 0.35f, 1f); public static void Show() { //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Expected O, but got Unknown //IL_009e: 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_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_014f: 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) //IL_017c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_root != (Object)null) { _root.SetActive(true); SetProgress(0f, 10f); return; } Hud instance = Hud.instance; object obj; if (instance == null) { obj = null; } else { GameObject rootObject = instance.m_rootObject; obj = ((rootObject != null) ? rootObject.GetComponentInParent() : null); } Canvas val = (Canvas)obj; if (!((Object)(object)val == (Object)null)) { _root = new GameObject("WarheimPdfCastText"); _root.transform.SetParent(((Component)val).transform, false); RectTransform val2 = _root.AddComponent(); val2.anchorMin = new Vector2(0.5f, 0f); val2.anchorMax = new Vector2(0.5f, 0f); val2.pivot = new Vector2(0.5f, 0.5f); val2.anchoredPosition = new Vector2(0f, 145f); val2.sizeDelta = new Vector2(520f, 40f); _text = _root.AddComponent(); _text.alignment = (TextAnchor)4; _text.font = Resources.GetBuiltinResource("Arial.ttf"); _text.fontSize = 22; _text.fontStyle = (FontStyle)1; ((Graphic)_text).color = Gold; Outline val3 = _root.AddComponent(); ((Shadow)val3).effectColor = Color.black; ((Shadow)val3).effectDistance = new Vector2(1.8f, -1.8f); SetProgress(0f, 10f); } } public static void SetProgress(float progress, float remaining) { if (!((Object)(object)_root == (Object)null) && !((Object)(object)_text == (Object)null)) { _text.text = $"Canalisation de la Pierre de Foyer... {remaining:0.0}s"; } } public static void Hide() { if ((Object)(object)_root != (Object)null) { _root.SetActive(false); } } } [HarmonyPatch(typeof(Humanoid), "UseItem")] private static class Humanoid_UseItem_PdfPatch { private static bool Prefix(Humanoid __instance, Inventory inventory, ItemData item, bool fromInventoryGui) { if ((Object)(object)__instance == (Object)null || item == null || !IsPdf(item)) { return true; } Player val = (Player)(object)((__instance is Player) ? __instance : null); if (val == null) { return true; } TryUse(val, item); return false; } } [HarmonyPatch(typeof(Player), "OnSpawned")] private static class Player_OnSpawned_PdfCooldownPatch { private static void Postfix(Player __instance) { if (!((Object)(object)__instance == (Object)null) && !((Object)(object)__instance != (Object)(object)Player.m_localPlayer)) { ((MonoBehaviour)__instance).StartCoroutine(ReapplyCooldownAfterSpawn(__instance)); } } } private const string PdfSimplePrefab = "PdfSimple"; private const string PdfWarheimPrefab = "PdfWarheim"; private const string CooldownKey = "Warheim.Pdf.CooldownUntilUtc"; private const float PdfSimpleCooldownSeconds = 3600f; private const float PdfWarheimCooldownSeconds = 1800f; private const float CastDuration = 10f; private static bool _isCasting; private const string PdfSimpleCooldownSeName = "SE_WarheimPdfSimpleCooldown"; private const string PdfWarheimCooldownSeName = "SE_WarheimPdfWarheimCooldown"; private static Sprite _pdfSimpleIcon; private static Sprite _pdfWarheimIcon; private static StatusEffect _pdfSimpleCooldownSe; private static StatusEffect _pdfWarheimCooldownSe; private static AudioClip _castAudioClip; private static GameObject _castVfxPrefab; public static bool IsPdf(ItemData item) { string prefabName = GetPrefabName(item); return prefabName == "PdfSimple" || prefabName == "PdfWarheim"; } private static bool IsSimple(ItemData item) { return GetPrefabName(item) == "PdfSimple"; } private static bool IsWarheim(ItemData item) { return GetPrefabName(item) == "PdfWarheim"; } private static string GetPrefabName(ItemData item) { string text = (((Object)(object)item?.m_dropPrefab != (Object)null) ? ((Object)item.m_dropPrefab).name : ""); Logger.LogInfo((object)("PDF DEBUG PREFAB = " + text)); return text; } private static float GetCooldownSeconds(ItemData item) { return IsWarheim(item) ? 1800f : 3600f; } private static bool ShouldConsume(ItemData item) { return IsSimple(item); } public static bool TryUse(Player player, ItemData item) { if ((Object)(object)player == (Object)null || item == null || !IsPdf(item)) { return false; } if (_isCasting) { ((Character)player).Message((MessageType)2, "La Pierre de Foyer est déjà en cours d'utilisation.", 0, (Sprite)null); return true; } double cooldownRemainingSeconds = GetCooldownRemainingSeconds(player); if (cooldownRemainingSeconds > 0.0) { ((Character)player).Message((MessageType)2, "Pierre de Foyer en rechargement : " + FormatTime(cooldownRemainingSeconds), 0, (Sprite)null); return true; } if (!CanTeleport(player, showMessage: true)) { return true; } ((MonoBehaviour)player).StartCoroutine(CastAndTeleport(player, item)); return true; } private static IEnumerator CastAndTeleport(Player player, ItemData item) { _isCasting = true; AudioSource castAudio = StartCastSound(player); GameObject castVfx = StartCastVfx(player); player.StartEmote("sit", false); Vector3 startPosition = ((Component)player).transform.position; ((Character)player).Message((MessageType)2, "Canalisation de la Pierre de Foyer...", 0, (Sprite)null); float timer = 0f; PdfCastBar.Show(); while (timer < 10f) { if ((Object)(object)player == (Object)null || ((Character)player).IsDead()) { _isCasting = false; PdfCastBar.Hide(); StopCastSound(castAudio); StopCastVfx(castVfx); yield break; } if (IsTryingToMove() || Vector3.Distance(startPosition, ((Component)player).transform.position) > 0.75f) { ((Character)player).Message((MessageType)2, "Canalisation interrompue.", 0, (Sprite)null); _isCasting = false; PdfCastBar.Hide(); StopCastSound(castAudio); StopCastVfx(castVfx); yield break; } float progress = timer / 10f; PdfCastBar.SetProgress(progress, 10f - timer); timer += Time.deltaTime; yield return null; } PdfCastBar.Hide(); if (!CanTeleport(player, showMessage: true)) { _isCasting = false; PdfCastBar.Hide(); StopCastSound(castAudio); StopCastVfx(castVfx); yield break; } if (!TryGetBedSpawnPoint(player, out var spawnPoint)) { ((Character)player).Message((MessageType)2, "Aucun point de retour trouvé.", 0, (Sprite)null); _isCasting = false; PdfCastBar.Hide(); StopCastSound(castAudio); StopCastVfx(castVfx); yield break; } ((Character)player).TeleportTo(spawnPoint, ((Component)player).transform.rotation, true); float cooldown = GetCooldownSeconds(item); SetCooldown(player, cooldown, item); ApplyCooldownStatusEffect(player, cooldown); if (ShouldConsume(item)) { ((Humanoid)player).GetInventory().RemoveItem(item, 1); } ((Character)player).Message((MessageType)2, "La Pierre de Foyer vous ramène chez vous.", 0, (Sprite)null); StopCastSound(castAudio); StopCastVfx(castVfx); _isCasting = false; } private static bool IsTryingToMove() { return Input.GetKey((KeyCode)119) || Input.GetKey((KeyCode)97) || Input.GetKey((KeyCode)115) || Input.GetKey((KeyCode)100) || Input.GetKey((KeyCode)32) || Input.GetKey((KeyCode)306); } private static void ApplyCooldownStatusEffect(Player player, double durationSeconds) { if (!((Object)(object)player == (Object)null)) { SEMan sEMan = ((Character)player).GetSEMan(); if (sEMan != null) { sEMan.RemoveStatusEffect(StringExtensionMethods.GetStableHashCode("SE_WarheimPdfSimpleCooldown"), false); sEMan.RemoveStatusEffect(StringExtensionMethods.GetStableHashCode("SE_WarheimPdfWarheimCooldown"), false); string value; bool flag = player.m_customData.TryGetValue("Warheim.Pdf.Type", out value) && value == "Warheim"; SE_WarheimPdfCooldown sE_WarheimPdfCooldown = ScriptableObject.CreateInstance(); ((Object)sE_WarheimPdfCooldown).name = (flag ? "SE_WarheimPdfWarheimCooldown" : "SE_WarheimPdfSimpleCooldown"); ((StatusEffect)sE_WarheimPdfCooldown).m_name = (flag ? "Pierre de Foyer Warheim" : "Pierre de Foyer"); ((StatusEffect)sE_WarheimPdfCooldown).m_tooltip = "Recharge restante : " + FormatTime(durationSeconds); ((StatusEffect)sE_WarheimPdfCooldown).m_icon = (flag ? _pdfWarheimIcon : _pdfSimpleIcon); ((StatusEffect)sE_WarheimPdfCooldown).m_ttl = (float)durationSeconds; Logger.LogInfo((object)$"[WarheimPdf] Adding SE {((Object)sE_WarheimPdfCooldown).name}, icon={(Object)(object)((StatusEffect)sE_WarheimPdfCooldown).m_icon != (Object)null}, ttl={((StatusEffect)sE_WarheimPdfCooldown).m_ttl}"); sEMan.AddStatusEffect((StatusEffect)(object)sE_WarheimPdfCooldown, true, 0, 0f); } } } private static bool CanTeleport(Player player, bool showMessage) { if (!((Humanoid)player).IsTeleportable()) { if (showMessage) { ((Character)player).Message((MessageType)2, "Une force empêche la Pierre de Foyer de fonctionner.", 0, (Sprite)null); } return false; } if (HasBlockedStatusEffect(player)) { if (showMessage) { ((Character)player).Message((MessageType)2, "Impossible d'utiliser la Pierre de Foyer en combat.", 0, (Sprite)null); } return false; } return true; } private static bool HasBlockedStatusEffect(Player player) { SEMan sEMan = ((Character)player).GetSEMan(); if (sEMan == null) { return false; } return sEMan.HaveStatusEffect(StringExtensionMethods.GetStableHashCode("SE_PvpModes_Bounty")) || sEMan.HaveStatusEffect(StringExtensionMethods.GetStableHashCode("SE_Combat")) || sEMan.HaveStatusEffect(StringExtensionMethods.GetStableHashCode("SE_PvP")) || sEMan.HaveStatusEffect(StringExtensionMethods.GetStableHashCode("PvpTweaks_SE_Combat")) || sEMan.HaveStatusEffect(StringExtensionMethods.GetStableHashCode("PvpTweaks_SE_NoTeleport")); } private static bool TryGetBedSpawnPoint(Player player, out Vector3 point) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0047: 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_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) point = Vector3.zero; Game instance = Game.instance; PlayerProfile val = ((instance != null) ? instance.GetPlayerProfile() : null); if (val == null) { return false; } if (val.HaveCustomSpawnPoint()) { point = val.GetCustomSpawnPoint(); return true; } point = val.GetHomePoint(); return point != Vector3.zero; } private static void SetCooldown(Player player, float seconds, ItemData item) { long num = DateTimeOffset.UtcNow.AddSeconds(seconds).ToUnixTimeSeconds(); player.m_customData["Warheim.Pdf.CooldownUntilUtc"] = num.ToString(); player.m_customData["Warheim.Pdf.Type"] = (IsWarheim(item) ? "Warheim" : "Simple"); } private static double GetCooldownRemainingSeconds(Player player) { if (!player.m_customData.TryGetValue("Warheim.Pdf.CooldownUntilUtc", out var value)) { return 0.0; } if (!long.TryParse(value, out var result)) { return 0.0; } long num = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); double num2 = result - num; if (num2 <= 0.0) { player.m_customData.Remove("Warheim.Pdf.CooldownUntilUtc"); return 0.0; } return num2; } private static string FormatTime(double seconds) { TimeSpan timeSpan = TimeSpan.FromSeconds(seconds); if (timeSpan.TotalMinutes >= 1.0) { return $"{(int)timeSpan.TotalMinutes}m {timeSpan.Seconds}s"; } return $"{timeSpan.Seconds}s"; } public static void InitStatusEffects(AssetBundle bundle) { //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Expected O, but got Unknown //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Expected O, but got Unknown string[] allAssetNames = bundle.GetAllAssetNames(); foreach (string text in allAssetNames) { if (text.Contains("pdf")) { Logger.LogInfo((object)("PDF ASSET = " + text)); } } _pdfSimpleIcon = bundle.LoadAsset("assets/pdf/pdfsimpleicon.png"); _pdfWarheimIcon = bundle.LoadAsset("assets/pdf/pdfwarheimicon.png"); _castVfxPrefab = bundle.LoadAsset("assets/pdf/vfx_pdf_cast.prefab"); Logger.LogInfo((object)$"PDF VFX loaded = {(Object)(object)_castVfxPrefab != (Object)null}"); _pdfSimpleCooldownSe = CreateCooldownSe("SE_WarheimPdfSimpleCooldown", "Pierre de Foyer en recharge", "Votre Pierre de Foyer simple se recharge.", _pdfSimpleIcon, 3600f); _pdfWarheimCooldownSe = CreateCooldownSe("SE_WarheimPdfWarheimCooldown", "Pierre de Foyer Warheim en recharge", "Votre Pierre de Foyer Warheim se recharge.", _pdfWarheimIcon, 1800f); _castAudioClip = bundle.LoadAsset("assets/pdf/pdf_cast_loop.mp3"); Logger.LogInfo((object)$"PDF SFX loaded = {(Object)(object)_castAudioClip != (Object)null}"); ItemManager.Instance.AddStatusEffect(new CustomStatusEffect(_pdfSimpleCooldownSe, false)); ItemManager.Instance.AddStatusEffect(new CustomStatusEffect(_pdfWarheimCooldownSe, false)); } private static GameObject StartCastVfx(Player player) { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_castVfxPrefab == (Object)null) { Logger.LogWarning((object)"[WarheimPdf] Cast VFX prefab is null"); return null; } GameObject val = Object.Instantiate(_castVfxPrefab); val.transform.position = ((Component)player).transform.position + new Vector3(0f, 0.05f, 0f); val.transform.rotation = Quaternion.identity; val.transform.SetParent(((Component)player).transform, true); Logger.LogInfo((object)$"[WarheimPdf] Cast VFX spawned at {val.transform.position}"); return val; } private static void StopCastVfx(GameObject vfx) { if ((Object)(object)vfx != (Object)null) { Object.Destroy((Object)(object)vfx); } } private static AudioSource StartCastSound(Player player) { if ((Object)(object)_castAudioClip == (Object)null) { Logger.LogWarning((object)"[WarheimPdf] Cast SFX clip is null"); return null; } AudioSource val = ((Component)player).gameObject.AddComponent(); val.clip = _castAudioClip; val.loop = true; val.playOnAwake = false; val.spatialBlend = 0f; val.volume = 1f; val.Play(); Logger.LogInfo((object)"[WarheimPdf] Cast SFX started"); return val; } private static void StopCastSound(AudioSource source) { if (!((Object)(object)source == (Object)null)) { source.Stop(); Object.Destroy((Object)(object)source); } } private static StatusEffect CreateCooldownSe(string name, string displayName, string tooltip, Sprite icon, float duration) { SE_WarheimPdfCooldown sE_WarheimPdfCooldown = ScriptableObject.CreateInstance(); ((Object)sE_WarheimPdfCooldown).name = name; ((StatusEffect)sE_WarheimPdfCooldown).m_name = displayName; ((StatusEffect)sE_WarheimPdfCooldown).m_tooltip = tooltip; ((StatusEffect)sE_WarheimPdfCooldown).m_icon = icon; ((StatusEffect)sE_WarheimPdfCooldown).m_ttl = duration; return (StatusEffect)(object)sE_WarheimPdfCooldown; } private static IEnumerator ReapplyCooldownAfterSpawn(Player player) { yield return null; yield return (object)new WaitForSeconds(1f); double remaining = GetCooldownRemainingSeconds(player); if (!(remaining <= 0.0)) { ApplyCooldownStatusEffect(player, remaining); } } } [BepInPlugin("dzk.warheimstuff", "WarheimStuff", "1.0.6")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] internal class WarheimStuff : BaseUnityPlugin { private readonly struct PvpItemDef { public readonly string Path; public readonly float Resilience; public PvpItemDef(string path, float resilience) { Path = path; Resilience = resilience; } } 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; } } public class SE_WarheimRingGladiator : StatusEffect { public float m_regenMultiplier = 1f; public void SetRegenMultiplier(float value) { m_regenMultiplier = value; } public override void ModifyHealthRegen(ref float regenMultiplier) { regenMultiplier *= m_regenMultiplier; } public override void ModifyStaminaRegen(ref float staminaRegen) { staminaRegen *= m_regenMultiplier; } public override void ModifyEitrRegen(ref float regen) { regen *= m_regenMultiplier; } } public class SE_CollierWarheimGladiator : StatusEffect { public float m_health; public float m_stamina; public float m_eitr; public void SetBonuses(float health, float stamina, float eitr) { m_health = health; m_stamina = stamina; m_eitr = eitr; } } [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 stamina, ref float eitr) { if ((Object)(object)__instance == (Object)null) { return; } SEMan value = Traverse.Create((object)__instance).Field("m_seman").GetValue(); if (value == null) { return; } List value2 = Traverse.Create((object)value).Field("m_statusEffects").GetValue>(); if (value2 == null) { return; } float num = 0f; float num2 = 0f; float num3 = 0f; float num4 = 0f; foreach (StatusEffect item in value2) { if (item is SE_CollierWarheimMage { m_eitr: not 0f } sE_CollierWarheimMage) { num += sE_CollierWarheimMage.m_eitr; } if (item is SE_CollierWarheimTank { m_healthPercentBonus: not 0f } sE_CollierWarheimTank) { num2 += sE_CollierWarheimTank.m_healthPercentBonus; } if (item is SE_CollierWarheimGladiator sE_CollierWarheimGladiator) { num3 += sE_CollierWarheimGladiator.m_health; num4 += sE_CollierWarheimGladiator.m_stamina; num += sE_CollierWarheimGladiator.m_eitr; } } if (num != 0f) { eitr += num; } if (num2 != 0f) { hp *= 1f + num2; } if (num3 != 0f) { hp += num3; } if (num4 != 0f) { stamina += num4; } } } [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 { m_healthPercentBonus: not 0f } sE_WarheimRingTank) { num += sE_WarheimRingTank.m_healthPercentBonus; } if (statusEffect is SE_WarheimRingArcher { m_staminaPercentBonus: not 0f } sE_WarheimRingArcher) { num2 += sE_WarheimRingArcher.m_staminaPercentBonus; } if (statusEffect is SE_WarheimRingMage { m_eitrPercentBonus: not 0f } sE_WarheimRingMage) { num3 += sE_WarheimRingMage.m_eitrPercentBonus; } } if (num != 0f) { hp += hp * num; } if (num2 != 0f) { stamina += stamina * num2; } if (num3 != 0f) { eitr += eitr * num3; } } } [HarmonyPatch(typeof(Player), "GetBodyArmor")] public static class WarheimJewelryArmorPatch { [HarmonyPostfix] private static void Postfix(Player __instance, ref float __result) { if ((Object)(object)__instance == (Object)null) { return; } Inventory inventory = ((Humanoid)__instance).GetInventory(); if (inventory == null) { return; } foreach (ItemData equippedItem in inventory.GetEquippedItems()) { if (!((Object)(object)equippedItem?.m_dropPrefab == (Object)null)) { string name = ((Object)equippedItem.m_dropPrefab).name; if (name.StartsWith("JC_Ring_Warheim", StringComparison.Ordinal) || name.StartsWith("JC_Necklace_Warheim", StringComparison.Ordinal)) { __result += Mathf.Max(1f, (float)equippedItem.m_quality); } } } } } [HarmonyPatch] public static class WarheimJewelryArmorTooltipPatch { private static IEnumerable TargetMethods() { return AccessTools.GetDeclaredMethods(typeof(ItemData)).FindAll((MethodInfo m) => m.Name == "GetTooltip"); } [HarmonyPostfix] private static void Postfix(ItemData __instance, ref string __result) { if (!((Object)(object)__instance?.m_dropPrefab == (Object)null) && !string.IsNullOrEmpty(__result)) { string name = ((Object)__instance.m_dropPrefab).name; if ((name.StartsWith("JC_Ring_Warheim", StringComparison.Ordinal) || name.StartsWith("JC_Necklace_Warheim", StringComparison.Ordinal)) && !__result.Contains("Armure :")) { int num = Mathf.Max(1, __instance.m_quality); __result += $"\nArmure : {num}"; } } } } public const string PluginGUID = "dzk.warheimstuff"; public const string PluginName = "WarheimStuff"; public const string PluginVersion = "1.0.6"; public static AssetBundle WarheimBundle; private static readonly PvpItemDef[] PvpItems = new PvpItemDef[14] { new PvpItemDef("assets/pvpitems/pvpswordohs1.prefab", 25f), new PvpItemDef("assets/pvpitems/pvpaxeohs1.prefab", 25f), new PvpItemDef("assets/pvpitems/pvpaxeths1.prefab", 35f), new PvpItemDef("assets/pvpitems/pvpswordths1.prefab", 35f), new PvpItemDef("assets/pvpitems/pvpatgeirs1.prefab", 35f), new PvpItemDef("assets/pvpitems/pvpbucklers1.prefab", 25f), new PvpItemDef("assets/pvpitems/pvptowers1.prefab", 35f), new PvpItemDef("assets/pvpitems/pvpspears1.prefab", 25f), new PvpItemDef("assets/pvpitems/pvpbows1.prefab", 20f), new PvpItemDef("assets/pvpitems/pvpdaggerss1.prefab", 15f), new PvpItemDef("assets/pvpitems/pvpmaceohs1.prefab", 25f), new PvpItemDef("assets/pvpitems/pvpsledgeths1.prefab", 40f), new PvpItemDef("assets/pvpitems/pvpcrossbows1.prefab", 20f), new PvpItemDef("assets/pvpitems/pvpstaffs1.prefab", 30f) }; 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(); AddPvpItems(); AddPdfItems(); } 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("assets/custombb/warheimcoin.prefab"); CustomItem val2 = new CustomItem(val, true); ItemManager.Instance.AddItem(val2); GameObject val3 = WarheimBundle.LoadAsset("assets/custombb/goldbar.prefab"); CustomItem val4 = new CustomItem(val3, true); ItemManager.Instance.AddItem(val4); } private void AddPdfItems() { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Expected O, but got Unknown WarheimPdf.InitStatusEffects(WarheimBundle); GameObject val = WarheimBundle.LoadAsset("assets/pdf/pdfsimple.prefab"); ItemConfig val2 = new ItemConfig(); val2.AddRequirement("Stone", 10, 0); val2.AddRequirement("SurtlingCore", 1, 0); val2.CraftingStation = "piece_workbench"; val2.RepairStation = "piece_workbench"; CustomItem val3 = new CustomItem(val, false, val2); ItemManager.Instance.AddItem(val3); GameObject val4 = WarheimBundle.LoadAsset("assets/pdf/pdfwarheim.prefab"); CustomItem val5 = new CustomItem(val4, true); ItemManager.Instance.AddItem(val5); } private void AddPvpItems() { PvpItemDef[] pvpItems = PvpItems; for (int i = 0; i < pvpItems.Length; i++) { PvpItemDef pvpItemDef = pvpItems[i]; AddPvpItem(pvpItemDef.Path, pvpItemDef.Resilience); } } private void AddPvpItem(string path, float resilience) { //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown GameObject val = WarheimBundle.LoadAsset(path); if ((Object)(object)val == (Object)null) { Logger.LogWarning((object)("Missing prefab: " + path)); return; } ItemDrop component = val.GetComponent(); if ((Object)(object)component == (Object)null) { Logger.LogWarning((object)("Prefab has no ItemDrop: " + path)); return; } PvpResilienceAPI.SetResilience(component.m_itemData, resilience); CustomItem val2 = new CustomItem(val, false); ItemManager.Instance.AddItem(val2); } 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_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Expected O, but got Unknown //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Expected O, but got Unknown //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Expected O, but got Unknown //IL_024e: Unknown result type (might be due to invalid IL or missing references) //IL_0255: Expected O, but got Unknown //IL_0279: Unknown result type (might be due to invalid IL or missing references) //IL_029a: Unknown result type (might be due to invalid IL or missing references) //IL_02a1: Expected O, but got Unknown //IL_03b8: Unknown result type (might be due to invalid IL or missing references) //IL_03bf: Expected O, but got Unknown //IL_03e3: Unknown result type (might be due to invalid IL or missing references) //IL_0404: Unknown result type (might be due to invalid IL or missing references) //IL_040b: Expected O, but got Unknown //IL_0515: Unknown result type (might be due to invalid IL or missing references) //IL_051c: 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("colliersailing_icon.png"); val2.Icon = icon1; val2.AddRequirement("WarheimCoin", 40, 20); val2.CraftingStation = "piece_workbench"; val2.RepairStation = "piece_workbench"; SharedData shared = val.GetComponent().m_itemData.m_shared; shared.m_armor = 1f; shared.m_armorPerLevel = 1f; StatusEffect val3 = WarheimBundle.LoadAsset("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 itemPrefab = ObjectDB.instance.GetItemPrefab("JC_Necklace_Warheim_Sailing"); ItemDrop val15 = ((itemPrefab != null) ? itemPrefab.GetComponent() : null); if ((Object)(object)val15 != (Object)null) { val15.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("collierdps_icon.png"); val7.Icon = icon2; val7.AddRequirement("WarheimCoin", 40, 20); val7.CraftingStation = "piece_workbench"; val7.RepairStation = "piece_workbench"; SharedData shared2 = val6.GetComponent().m_itemData.m_shared; shared2.m_icons = (Sprite[])(object)new Sprite[1] { icon2 }; shared2.m_armor = 1f; shared2.m_armorPerLevel = 1f; SE_CollierWarheimDPS sE_CollierWarheimDPS = ScriptableObject.CreateInstance(); ((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 itemPrefab = ObjectDB.instance.GetItemPrefab("JC_Necklace_Warheim_DPS"); ItemDrop val15 = ((itemPrefab != null) ? itemPrefab.GetComponent() : null); if ((Object)(object)val15 != (Object)null) { val15.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("colliermage_icon.png"); val10.Icon = icon3; val10.AddRequirement("WarheimCoin", 40, 20); val10.CraftingStation = "piece_workbench"; val10.RepairStation = "piece_workbench"; SharedData shared3 = val9.GetComponent().m_itemData.m_shared; shared3.m_icons = (Sprite[])(object)new Sprite[1] { icon3 }; shared3.m_armor = 1f; shared3.m_armorPerLevel = 1f; SE_CollierWarheimMage sE_CollierWarheimMage = ScriptableObject.CreateInstance(); ((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 itemPrefab = ObjectDB.instance.GetItemPrefab("JC_Necklace_Warheim_Mage"); ItemDrop val15 = ((itemPrefab != null) ? itemPrefab.GetComponent() : null); if ((Object)(object)val15 != (Object)null) { val15.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("colliertank_icon.png"); val13.Icon = icon4; val13.AddRequirement("WarheimCoin", 40, 20); val13.CraftingStation = "piece_workbench"; val13.RepairStation = "piece_workbench"; SharedData shared4 = val12.GetComponent().m_itemData.m_shared; shared4.m_icons = (Sprite[])(object)new Sprite[1] { icon4 }; shared4.m_armor = 1f; shared4.m_armorPerLevel = 1f; SE_CollierWarheimTank sE_CollierWarheimTank = ScriptableObject.CreateInstance(); ((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() : null); if ((Object)(object)val15 != (Object)null) { val15.m_itemData.m_shared.m_icons = (Sprite[])(object)new Sprite[1] { icon4 }; } }; AddGladiatorJewelry(); AddRings(); ItemManager.OnItemsRegistered += ApplyAllWarheimJewelryArmor; } private static void ApplyAllWarheimJewelryArmor() { if ((Object)(object)ObjectDB.instance == (Object)null) { return; } foreach (GameObject item in ObjectDB.instance.m_items) { if (!((Object)(object)item == (Object)null)) { string name = ((Object)item).name; if (name.StartsWith("JC_Ring_Warheim") || name.StartsWith("JC_Necklace_Warheim")) { ItemDrop component = item.GetComponent(); ApplyJewelryArmor(component); } } } } private static void ApplyJewelryArmor(ItemDrop item) { if (item?.m_itemData?.m_shared != null) { item.m_itemData.m_shared.m_armor = 1f; item.m_itemData.m_shared.m_armorPerLevel = 1f; } } private void AddGladiatorJewelry() { //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_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Expected O, but got Unknown //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Expected O, but got Unknown //IL_0253: Unknown result type (might be due to invalid IL or missing references) //IL_025a: Expected O, but got Unknown GameObject val = API.CreateRingFromTemplate("Red", Color.red); API.MarkJewelry(val); ((Object)val).name = "JC_Ring_Warheim_Pvp_S1"; ItemConfig val2 = new ItemConfig(); val2.Name = "Anneau du Gladiateur Saison 1"; val2.Description = "Cet anneau fut porté par les Vikings les plus brutaux de Warheim."; Sprite ringIcon = WarheimBundle.LoadAsset("assets/pvpitems/icons/rings1icon.png"); val2.Icon = ringIcon; SharedData shared = val.GetComponent().m_itemData.m_shared; shared.m_icons = (Sprite[])(object)new Sprite[1] { ringIcon }; shared.m_armor = 1f; shared.m_armorPerLevel = 1f; PvpResilienceAPI.SetResilience(val.GetComponent().m_itemData, 25f); SE_WarheimRingGladiator sE_WarheimRingGladiator = ScriptableObject.CreateInstance(); ((Object)sE_WarheimRingGladiator).name = "SE_WarheimRing_Gladiator_S1"; ((StatusEffect)sE_WarheimRingGladiator).m_name = "Anneau du Gladiateur Saison 1"; ((StatusEffect)sE_WarheimRingGladiator).m_icon = ringIcon; ((StatusEffect)sE_WarheimRingGladiator).m_tooltip = "Cet anneau vous octroye 25 de résilience ainsi que 15% de régénération de vie, endurance & eitr."; sE_WarheimRingGladiator.SetRegenMultiplier(1.15f); shared.m_equipStatusEffect = (StatusEffect)(object)sE_WarheimRingGladiator; CustomItem val3 = new CustomItem(val, false, val2); ItemManager.Instance.AddItem(val3); ItemManager.OnItemsRegistered += delegate { GameObject itemPrefab = ObjectDB.instance.GetItemPrefab("JC_Ring_Warheim_Pvp_S1"); ItemDrop val7 = ((itemPrefab != null) ? itemPrefab.GetComponent() : null); if ((Object)(object)val7 != (Object)null) { val7.m_itemData.m_shared.m_icons = (Sprite[])(object)new Sprite[1] { ringIcon }; val7.m_itemData.m_shared.m_armor = 1f; val7.m_itemData.m_shared.m_armorPerLevel = 1f; } }; GameObject val4 = API.CreateNecklaceFromTemplate("Red", Color.red); API.MarkJewelry(val4); ((Object)val4).name = "JC_Necklace_Warheim_Pvp_S1"; ItemConfig val5 = new ItemConfig(); val5.Name = "Collier du Gladiateur Saison 1"; val5.Description = "Ce collier, si vous le voulez autour du cou d'un Viking, ne signifie qu'une chose : Courez. Vite, et loin."; Sprite neckIcon = WarheimBundle.LoadAsset("assets/pvpitems/icons/necks1icon.png"); val5.Icon = neckIcon; SharedData shared2 = val4.GetComponent().m_itemData.m_shared; shared2.m_icons = (Sprite[])(object)new Sprite[1] { neckIcon }; shared2.m_armor = 1f; shared2.m_armorPerLevel = 1f; PvpResilienceAPI.SetResilience(val4.GetComponent().m_itemData, 35f); SE_CollierWarheimGladiator sE_CollierWarheimGladiator = ScriptableObject.CreateInstance(); ((Object)sE_CollierWarheimGladiator).name = "SE_CollierWarheim_Gladiator_S1"; ((StatusEffect)sE_CollierWarheimGladiator).m_name = "Collier du Gladiateur Saison 1"; ((StatusEffect)sE_CollierWarheimGladiator).m_icon = neckIcon; ((StatusEffect)sE_CollierWarheimGladiator).m_tooltip = "Ce collier augmente votre résilience de 35 ainsi que vos attributs de vie, endurance & eitr de 50."; sE_CollierWarheimGladiator.SetBonuses(50f, 50f, 50f); shared2.m_equipStatusEffect = (StatusEffect)(object)sE_CollierWarheimGladiator; CustomItem val6 = new CustomItem(val4, false, val5); ItemManager.Instance.AddItem(val6); ItemManager.OnItemsRegistered += delegate { GameObject itemPrefab = ObjectDB.instance.GetItemPrefab("JC_Necklace_Warheim_Pvp_S1"); ItemDrop val7 = ((itemPrefab != null) ? itemPrefab.GetComponent() : null); if ((Object)(object)val7 != (Object)null) { val7.m_itemData.m_shared.m_icons = (Sprite[])(object)new Sprite[1] { neckIcon }; val7.m_itemData.m_shared.m_armor = 1f; val7.m_itemData.m_shared.m_armorPerLevel = 1f; } }; } 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_018d: Unknown result type (might be due to invalid IL or missing references) //IL_0194: 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" }; int ringCost = GetRingCost(tier); val2.AddRequirement("WarheimCoin", ringCost, ringCost + 5); if (tier > 1) { string text = $"JC_Ring_Warheim_{typeName}_T{tier - 1}"; val2.AddRequirement(text, 1, 0); } SharedData shared = val.GetComponent().m_itemData.m_shared; shared.m_armor = 1f; shared.m_armorPerLevel = 1f; 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() : 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($"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(); ((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(); ((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(); ((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(); ((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; } } } internal static class WeightPanelFix { [HarmonyPatch] private static class InventoryGui_Awake_Patch { private static MethodBase TargetMethod() { return AccessTools.Method(typeof(InventoryGui), "Awake", (Type[])null, (Type[])null); } private static void Postfix(InventoryGui __instance) { if (!((Object)(object)__instance?.m_weight == (Object)null) && (Object)(object)((Component)__instance.m_weight).GetComponent() == (Object)null) { ((Component)__instance.m_weight).gameObject.AddComponent(); } } } private sealed class WarheimWeightPanelOffset : MonoBehaviour { private TMP_Text _text; private void Awake() { _text = ((Component)this).GetComponent(); } private void OnEnable() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown Canvas.willRenderCanvases += new WillRenderCanvases(Apply); } private void OnDisable() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown Canvas.willRenderCanvases -= new WillRenderCanvases(Apply); } private void OnDestroy() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown Canvas.willRenderCanvases -= new WillRenderCanvases(Apply); } private void Apply() { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_text == (Object)null) { return; } Transform parent = _text.transform.parent; if (!((Object)(object)parent == (Object)null)) { RectTransform component = ((Component)parent).GetComponent(); if (!((Object)(object)component == (Object)null)) { component.anchoredPosition = new Vector2(40f, component.anchoredPosition.y); } } } } private const float WeightPanelX = 40f; }