using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using Jotunn.Configs; using Jotunn.Entities; using Jotunn.Managers; using UnityEngine; using UnityEngine.Animations; using UnityEngine.Playables; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("0.0.0.0")] namespace RavenwoodRelicsStatues; public class DarkAngelStatueInteract : MonoBehaviour, Hoverable, Interactable { private const string RpcName = "RWS_PlayDarkAngelAnimation"; private const string InteractionObjectName = "Interaction"; private static AnimationClip sharedAnimationClip; private static Object sharedSoundAsset; private AnimationClip animationClip; private Object soundAsset; private Animator animator; private ZNetView netView; private PlayableGraph playableGraph; private Coroutine stopRoutine; private GameObject activeSoundObject; public void SetAnimationClip(AnimationClip clip) { animationClip = clip; if ((Object)(object)clip != (Object)null) { sharedAnimationClip = clip; } } public void SetSoundAsset(Object asset) { soundAsset = asset; if (asset != (Object)null) { sharedSoundAsset = asset; } } private void Awake() { if ((Object)(object)animationClip == (Object)null) { animationClip = sharedAnimationClip; } if (soundAsset == (Object)null) { soundAsset = sharedSoundAsset; } netView = ((Component)this).GetComponent(); animator = ResolveAnimator(); EnsureInteractionProxy(); if ((Object)(object)netView != (Object)null) { netView.Register("RWS_PlayDarkAngelAnimation", (Action)RPC_PlayAnimation); } } public string GetHoverName() { return "The Dark Angel Statue"; } public string GetHoverText() { return "The Dark Angel Statue\n[E] Animate"; } public bool Interact(Humanoid user, bool hold, bool alt) { if (hold) { return false; } if ((Object)(object)animationClip == (Object)null) { animationClip = sharedAnimationClip; } if ((Object)(object)animationClip == (Object)null) { return false; } if ((Object)(object)netView != (Object)null && netView.IsValid()) { netView.InvokeRPC(ZNetView.Everybody, "RWS_PlayDarkAngelAnimation", Array.Empty()); } else { PlayAnimation(); } return true; } public bool UseItem(Humanoid user, ItemData item) { return false; } private void RPC_PlayAnimation(long sender) { PlayAnimation(); } private void PlayAnimation() { //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_008c: 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_0093: 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_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)animationClip == (Object)null) { animationClip = sharedAnimationClip; } if (!((Object)(object)animationClip == (Object)null)) { animator = ResolveAnimator(); if (!((Object)(object)animator == (Object)null)) { StopCurrentAnimation(); playableGraph = PlayableGraph.Create("RWS_DarkAngel_Animation"); ((PlayableGraph)(ref playableGraph)).SetTimeUpdateMode((DirectorUpdateMode)1); AnimationPlayableOutput val = AnimationPlayableOutput.Create(playableGraph, "DarkAngelOutput", animator); AnimationClipPlayable val2 = AnimationClipPlayable.Create(playableGraph, animationClip); PlayableExtensions.SetTime(val2, 0.0); PlayableExtensions.SetSpeed(val2, 1.0); PlayableOutputExtensions.SetSourcePlayable(val, val2); ((PlayableGraph)(ref playableGraph)).Play(); ((PlayableGraph)(ref playableGraph)).Evaluate(0f); PlaySound(); stopRoutine = ((MonoBehaviour)this).StartCoroutine(StopAfter(animationClip.length)); } } } private void PlaySound() { //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0253: Unknown result type (might be due to invalid IL or missing references) //IL_025d: Expected O, but got Unknown //IL_026e: Unknown result type (might be due to invalid IL or missing references) if (soundAsset == (Object)null) { soundAsset = sharedSoundAsset; } if (soundAsset == (Object)null) { return; } StopCurrentSound(); Type type = Type.GetType("UnityEngine.AudioSource, UnityEngine.AudioModule"); if (type == null) { return; } Object obj = soundAsset; GameObject val = (GameObject)(object)((obj is GameObject) ? obj : null); if (val != null) { activeSoundObject = Object.Instantiate(val, ((Component)this).transform.position, Quaternion.identity); ((Object)activeSoundObject).name = "sfx_RWS_The_Dark_Angel_Statue"; bool flag = false; Transform[] componentsInChildren = activeSoundObject.GetComponentsInChildren(true); Transform[] array = componentsInChildren; foreach (Transform val2 in array) { if (!((Object)(object)val2 == (Object)null)) { Component component = ((Component)val2).GetComponent(type); if (!((Object)(object)component == (Object)null)) { type.GetProperty("playOnAwake")?.SetValue(component, false, null); type.GetProperty("loop")?.SetValue(component, false, null); type.GetProperty("volume")?.SetValue(component, 1f, null); type.GetProperty("spatialBlend")?.SetValue(component, 1f, null); type.GetProperty("minDistance")?.SetValue(component, 1f, null); type.GetProperty("maxDistance")?.SetValue(component, 25f, null); type.GetMethod("Play", Type.EmptyTypes)?.Invoke(component, null); flag = true; } } } if (!flag) { StopCurrentSound(); } return; } Type type2 = Type.GetType("UnityEngine.AudioClip, UnityEngine.AudioModule"); if (type2 == null || !type2.IsInstanceOfType(soundAsset)) { return; } activeSoundObject = new GameObject("sfx_RWS_The_Dark_Angel_Statue"); activeSoundObject.transform.position = ((Component)this).transform.position; activeSoundObject.transform.SetParent(((Component)this).transform, true); Component val3 = activeSoundObject.AddComponent(type); if ((Object)(object)val3 == (Object)null) { StopCurrentSound(); return; } type.GetProperty("clip")?.SetValue(val3, soundAsset, null); type.GetProperty("playOnAwake")?.SetValue(val3, false, null); type.GetProperty("loop")?.SetValue(val3, false, null); type.GetProperty("volume")?.SetValue(val3, 1f, null); type.GetProperty("spatialBlend")?.SetValue(val3, 1f, null); type.GetProperty("minDistance")?.SetValue(val3, 1f, null); type.GetProperty("maxDistance")?.SetValue(val3, 25f, null); type.GetMethod("Play", Type.EmptyTypes)?.Invoke(val3, null); float soundLength = GetSoundLength(soundAsset); if (soundLength > 0f) { Object.Destroy((Object)(object)activeSoundObject, soundLength + 0.1f); } } private static float GetSoundLength(Object asset) { if (asset == (Object)null) { return 0f; } return (((object)asset).GetType().GetProperty("length")?.GetValue(asset, null) is float num) ? num : 0f; } private void StopCurrentSound() { if ((Object)(object)activeSoundObject != (Object)null) { Object.Destroy((Object)(object)activeSoundObject); activeSoundObject = null; } } private Animator ResolveAnimator() { Animator val = ((Component)this).GetComponent(); if ((Object)(object)val == (Object)null) { val = ((Component)this).gameObject.AddComponent(); } ((Behaviour)val).enabled = true; val.cullingMode = (AnimatorCullingMode)0; return val; } private void EnsureInteractionProxy() { Transform val = null; Transform[] componentsInChildren = ((Component)this).GetComponentsInChildren(true); Transform[] array = componentsInChildren; foreach (Transform val2 in array) { if (!((Object)(object)val2 == (Object)null) && !((Object)(object)((Component)val2).gameObject == (Object)(object)((Component)this).gameObject) && string.Equals(((Object)val2).name, "Interaction", StringComparison.OrdinalIgnoreCase)) { val = val2; break; } } if (!((Object)(object)val == (Object)null)) { ((Component)val).gameObject.layer = ((Component)this).gameObject.layer; if ((Object)(object)((Component)val).GetComponent() == (Object)null) { ((Component)val).gameObject.AddComponent(); } } } private IEnumerator StopAfter(float seconds) { yield return (object)new WaitForSeconds(Mathf.Max(0.05f, seconds)); StopCurrentAnimation(); } private void StopCurrentAnimation() { if (stopRoutine != null) { ((MonoBehaviour)this).StopCoroutine(stopRoutine); stopRoutine = null; } if (((PlayableGraph)(ref playableGraph)).IsValid()) { ((PlayableGraph)(ref playableGraph)).Destroy(); } } private void OnDestroy() { StopCurrentAnimation(); StopCurrentSound(); } } public class DarkAngelStatueInteractProxy : MonoBehaviour, Hoverable, Interactable { private DarkAngelStatueInteract GetOwner() { return ((Component)this).GetComponentInParent(); } public string GetHoverName() { DarkAngelStatueInteract owner = GetOwner(); return ((Object)(object)owner != (Object)null) ? owner.GetHoverName() : "The Dark Angel Statue"; } public string GetHoverText() { DarkAngelStatueInteract owner = GetOwner(); return ((Object)(object)owner != (Object)null) ? owner.GetHoverText() : string.Empty; } public bool Interact(Humanoid user, bool hold, bool alt) { DarkAngelStatueInteract owner = GetOwner(); return (Object)(object)owner != (Object)null && owner.Interact(user, hold, alt); } public bool UseItem(Humanoid user, ItemData item) { DarkAngelStatueInteract owner = GetOwner(); return (Object)(object)owner != (Object)null && owner.UseItem(user, item); } } public class DragonStatueInteract : MonoBehaviour, Hoverable, Interactable { private const string RpcName = "RWS_PlayDragonStatueAnimation"; private const string InteractionObjectName = "Interaction"; private const string FireObjectName = "Fire_Main"; private const float FireStartDelay = 1.691f; private const float FireDuration = 1.75f; private static AnimationClip sharedAnimationClip; private static Object sharedSoundAsset; private AnimationClip animationClip; private Object soundAsset; private Animator animator; private ZNetView netView; private PlayableGraph playableGraph; private Coroutine stopRoutine; private Coroutine fireStartRoutine; private Coroutine fireRoutine; private GameObject activeSoundObject; private Component fireParticleSystem; public void SetAnimationClip(AnimationClip clip) { animationClip = clip; if ((Object)(object)clip != (Object)null) { sharedAnimationClip = clip; } } public void SetSoundAsset(Object asset) { soundAsset = asset; if (asset != (Object)null) { sharedSoundAsset = asset; } } private void Awake() { if ((Object)(object)animationClip == (Object)null) { animationClip = sharedAnimationClip; } if (soundAsset == (Object)null) { soundAsset = sharedSoundAsset; } netView = ((Component)this).GetComponent(); animator = ResolveAnimator(); fireParticleSystem = ResolveFireParticleSystem(); EnsureInteractionProxy(); StopFire(); if ((Object)(object)netView != (Object)null) { netView.Register("RWS_PlayDragonStatueAnimation", (Action)RPC_PlayAnimation); } } public string GetHoverName() { return "Dragon Statue"; } public string GetHoverText() { return "Dragon Statue\n[E] Animate"; } public bool Interact(Humanoid user, bool hold, bool alt) { if (hold) { return false; } if ((Object)(object)animationClip == (Object)null) { animationClip = sharedAnimationClip; } if ((Object)(object)animationClip == (Object)null) { return false; } if ((Object)(object)netView != (Object)null && netView.IsValid()) { netView.InvokeRPC(ZNetView.Everybody, "RWS_PlayDragonStatueAnimation", Array.Empty()); } else { PlayAnimation(); } return true; } public bool UseItem(Humanoid user, ItemData item) { return false; } private void RPC_PlayAnimation(long sender) { PlayAnimation(); } private void PlayAnimation() { //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_008c: 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_0093: 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_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)animationClip == (Object)null) { animationClip = sharedAnimationClip; } if (!((Object)(object)animationClip == (Object)null)) { animator = ResolveAnimator(); if (!((Object)(object)animator == (Object)null)) { StopCurrentAnimation(); playableGraph = PlayableGraph.Create("RWS_DragonStatue_Animation"); ((PlayableGraph)(ref playableGraph)).SetTimeUpdateMode((DirectorUpdateMode)1); AnimationPlayableOutput val = AnimationPlayableOutput.Create(playableGraph, "DragonStatueOutput", animator); AnimationClipPlayable val2 = AnimationClipPlayable.Create(playableGraph, animationClip); PlayableExtensions.SetTime(val2, 0.0); PlayableExtensions.SetSpeed(val2, 1.0); PlayableOutputExtensions.SetSourcePlayable(val, val2); ((PlayableGraph)(ref playableGraph)).Play(); ((PlayableGraph)(ref playableGraph)).Evaluate(0f); PlaySound(); ScheduleFire(); stopRoutine = ((MonoBehaviour)this).StartCoroutine(StopAfter(animationClip.length)); } } } private void ScheduleFire() { StopFire(); fireStartRoutine = ((MonoBehaviour)this).StartCoroutine(StartFireAfter(1.691f)); } private IEnumerator StartFireAfter(float seconds) { yield return (object)new WaitForSeconds(Mathf.Max(0f, seconds)); fireStartRoutine = null; PlayFire(); } private void PlayFire() { if ((Object)(object)fireParticleSystem == (Object)null) { fireParticleSystem = ResolveFireParticleSystem(); } if ((Object)(object)fireParticleSystem == (Object)null) { return; } StopFire(); if (!fireParticleSystem.gameObject.activeSelf) { fireParticleSystem.gameObject.SetActive(true); } Type type = ((object)fireParticleSystem).GetType(); MethodInfo method = type.GetMethod("Play", new Type[1] { typeof(bool) }); if (method == null) { return; } try { method.Invoke(fireParticleSystem, new object[1] { true }); fireRoutine = ((MonoBehaviour)this).StartCoroutine(StopFireAfter(1.75f)); } catch (Exception) { } } private Component ResolveFireParticleSystem() { Transform[] componentsInChildren = ((Component)this).GetComponentsInChildren(true); Transform[] array = componentsInChildren; foreach (Transform val in array) { if ((Object)(object)val == (Object)null || !string.Equals(((Object)val).name, "Fire_Main", StringComparison.OrdinalIgnoreCase)) { continue; } Type type = Type.GetType("UnityEngine.ParticleSystem, UnityEngine.ParticleSystemModule"); if (type != null) { Component component = ((Component)val).GetComponent(type); if ((Object)(object)component != (Object)null) { return component; } } Component[] components = ((Component)val).GetComponents(); Component[] array2 = components; foreach (Component val2 in array2) { if ((Object)(object)val2 != (Object)null && string.Equals(((object)val2).GetType().FullName, "UnityEngine.ParticleSystem", StringComparison.Ordinal)) { return val2; } } } return null; } private IEnumerator StopFireAfter(float seconds) { yield return (object)new WaitForSeconds(Mathf.Max(0.05f, seconds)); fireRoutine = null; StopFire(); } private void StopFire() { if (fireStartRoutine != null) { ((MonoBehaviour)this).StopCoroutine(fireStartRoutine); fireStartRoutine = null; } if (fireRoutine != null) { ((MonoBehaviour)this).StopCoroutine(fireRoutine); fireRoutine = null; } if ((Object)(object)fireParticleSystem == (Object)null) { return; } Type type = ((object)fireParticleSystem).GetType(); try { MethodInfo[] methods = type.GetMethods(); foreach (MethodInfo methodInfo in methods) { if (string.Equals(methodInfo.Name, "Stop", StringComparison.Ordinal)) { ParameterInfo[] parameters = methodInfo.GetParameters(); if (parameters.Length == 2 && !(parameters[0].ParameterType != typeof(bool)) && parameters[1].ParameterType.IsEnum) { object obj = Enum.Parse(parameters[1].ParameterType, "StopEmittingAndClear"); methodInfo.Invoke(fireParticleSystem, new object[2] { true, obj }); break; } } } type.GetMethod("Clear", new Type[1] { typeof(bool) })?.Invoke(fireParticleSystem, new object[1] { true }); } catch (Exception) { } } private void PlaySound() { //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0253: Unknown result type (might be due to invalid IL or missing references) //IL_025d: Expected O, but got Unknown //IL_026e: Unknown result type (might be due to invalid IL or missing references) if (soundAsset == (Object)null) { soundAsset = sharedSoundAsset; } if (soundAsset == (Object)null) { return; } StopCurrentSound(); Type type = Type.GetType("UnityEngine.AudioSource, UnityEngine.AudioModule"); if (type == null) { return; } Object obj = soundAsset; GameObject val = (GameObject)(object)((obj is GameObject) ? obj : null); if (val != null) { activeSoundObject = Object.Instantiate(val, ((Component)this).transform.position, Quaternion.identity); ((Object)activeSoundObject).name = "sfx_RWS_Dragon_Statue"; bool flag = false; Transform[] componentsInChildren = activeSoundObject.GetComponentsInChildren(true); Transform[] array = componentsInChildren; foreach (Transform val2 in array) { if (!((Object)(object)val2 == (Object)null)) { Component component = ((Component)val2).GetComponent(type); if (!((Object)(object)component == (Object)null)) { type.GetProperty("playOnAwake")?.SetValue(component, false, null); type.GetProperty("loop")?.SetValue(component, false, null); type.GetProperty("volume")?.SetValue(component, 1f, null); type.GetProperty("spatialBlend")?.SetValue(component, 1f, null); type.GetProperty("minDistance")?.SetValue(component, 1f, null); type.GetProperty("maxDistance")?.SetValue(component, 25f, null); type.GetMethod("Play", Type.EmptyTypes)?.Invoke(component, null); flag = true; } } } if (!flag) { StopCurrentSound(); } return; } Type type2 = Type.GetType("UnityEngine.AudioClip, UnityEngine.AudioModule"); if (type2 == null || !type2.IsInstanceOfType(soundAsset)) { return; } activeSoundObject = new GameObject("sfx_RWS_Dragon_Statue"); activeSoundObject.transform.position = ((Component)this).transform.position; activeSoundObject.transform.SetParent(((Component)this).transform, true); Component val3 = activeSoundObject.AddComponent(type); if ((Object)(object)val3 == (Object)null) { StopCurrentSound(); return; } type.GetProperty("clip")?.SetValue(val3, soundAsset, null); type.GetProperty("playOnAwake")?.SetValue(val3, false, null); type.GetProperty("loop")?.SetValue(val3, false, null); type.GetProperty("volume")?.SetValue(val3, 1f, null); type.GetProperty("spatialBlend")?.SetValue(val3, 1f, null); type.GetProperty("minDistance")?.SetValue(val3, 1f, null); type.GetProperty("maxDistance")?.SetValue(val3, 25f, null); type.GetMethod("Play", Type.EmptyTypes)?.Invoke(val3, null); float soundLength = GetSoundLength(soundAsset); if (soundLength > 0f) { Object.Destroy((Object)(object)activeSoundObject, soundLength + 0.1f); } } private static float GetSoundLength(Object asset) { if (asset == (Object)null) { return 0f; } return (((object)asset).GetType().GetProperty("length")?.GetValue(asset, null) is float num) ? num : 0f; } private void StopCurrentSound() { if ((Object)(object)activeSoundObject != (Object)null) { Object.Destroy((Object)(object)activeSoundObject); activeSoundObject = null; } } private Animator ResolveAnimator() { Animator val = ((Component)this).GetComponent(); if ((Object)(object)val == (Object)null) { val = ((Component)this).gameObject.AddComponent(); } ((Behaviour)val).enabled = true; val.cullingMode = (AnimatorCullingMode)0; return val; } private void EnsureInteractionProxy() { Transform val = null; Transform[] componentsInChildren = ((Component)this).GetComponentsInChildren(true); Transform[] array = componentsInChildren; foreach (Transform val2 in array) { if (!((Object)(object)val2 == (Object)null) && !((Object)(object)((Component)val2).gameObject == (Object)(object)((Component)this).gameObject) && string.Equals(((Object)val2).name, "Interaction", StringComparison.OrdinalIgnoreCase)) { val = val2; break; } } if (!((Object)(object)val == (Object)null)) { ((Component)val).gameObject.layer = ((Component)this).gameObject.layer; if ((Object)(object)((Component)val).GetComponent() == (Object)null) { ((Component)val).gameObject.AddComponent(); } } } private IEnumerator StopAfter(float seconds) { yield return (object)new WaitForSeconds(Mathf.Max(0.05f, seconds)); StopCurrentAnimation(); } private void StopCurrentAnimation() { if (stopRoutine != null) { ((MonoBehaviour)this).StopCoroutine(stopRoutine); stopRoutine = null; } if (((PlayableGraph)(ref playableGraph)).IsValid()) { ((PlayableGraph)(ref playableGraph)).Destroy(); } StopFire(); } private void OnDestroy() { StopCurrentAnimation(); StopCurrentSound(); } } public class DragonStatueInteractProxy : MonoBehaviour, Hoverable, Interactable { private DragonStatueInteract GetOwner() { return ((Component)this).GetComponentInParent(); } public string GetHoverName() { DragonStatueInteract owner = GetOwner(); return ((Object)(object)owner != (Object)null) ? owner.GetHoverName() : "Dragon Statue"; } public string GetHoverText() { DragonStatueInteract owner = GetOwner(); return ((Object)(object)owner != (Object)null) ? owner.GetHoverText() : string.Empty; } public bool Interact(Humanoid user, bool hold, bool alt) { DragonStatueInteract owner = GetOwner(); return (Object)(object)owner != (Object)null && owner.Interact(user, hold, alt); } public bool UseItem(Humanoid user, ItemData item) { DragonStatueInteract owner = GetOwner(); return (Object)(object)owner != (Object)null && owner.UseItem(user, item); } } [BepInPlugin("Ravenwood.RelicsStatues", "Ravenwood Relics Statues", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class RavenwoodRelicsStatues : BaseUnityPlugin { public const string PluginGUID = "Ravenwood.RelicsStatues"; public const string PluginName = "Ravenwood Relics Statues"; public const string PluginVersion = "1.0.0"; private AssetBundle statuesBundle; private void Awake() { //IL_0029: Unknown result type (might be due to invalid IL or missing references) RelicRegistrar.InitConfig(((BaseUnityPlugin)this).Config); foreach (string allCategory in RelicRegistrar.GetAllCategories()) { PieceManager.Instance.AddPieceCategory(allCategory); } Assembly executingAssembly = Assembly.GetExecutingAssembly(); string text = executingAssembly.GetManifestResourceNames().FirstOrDefault((string r) => r.ToLowerInvariant().Contains("ravenwoodstatues")); if (string.IsNullOrEmpty(text)) { return; } using (Stream stream = executingAssembly.GetManifestResourceStream(text)) { if (stream == null) { return; } using MemoryStream memoryStream = new MemoryStream(); stream.CopyTo(memoryStream); statuesBundle = AssetBundle.LoadFromMemory(memoryStream.ToArray()); } if (!((Object)(object)statuesBundle == (Object)null)) { PrefabManager.OnPrefabsRegistered += RegisterNow; } } private void RegisterNow() { if (!((Object)(object)statuesBundle == (Object)null)) { RelicRegistrar.RegisterAllRelics(statuesBundle); PrefabManager.OnPrefabsRegistered -= RegisterNow; } } } public class RelicRegistration { public string PrefabName; public string DisplayName; public RequirementConfig[] Requirements; public string Description; public int Comfort; public RelicRegistration(string prefab, string display, RequirementConfig[] reqs, string desc, int comfort = 0) { PrefabName = prefab; DisplayName = display; Requirements = reqs; Description = desc; Comfort = comfort; } } public static class RelicRegistrar { private static bool wasAlreadyRegistered = false; private const ComfortGroup RavenwoodThroneComfortGroup = (ComfortGroup)1381454676; private const ComfortGroup RavenwoodWerewolfBustComfortGroup = (ComfortGroup)1381454679; private const ComfortGroup RavenwoodHorseBustComfortGroup = (ComfortGroup)1381454664; private static ConfigEntry customHammerTabConfig; private static readonly Dictionary> recipeConfigs = new Dictionary>(StringComparer.OrdinalIgnoreCase); private static readonly Dictionary> runeRockSoundConfigs = new Dictionary>(StringComparer.OrdinalIgnoreCase); private static readonly HashSet RuneRockSoundPrefabs = new HashSet(StringComparer.OrdinalIgnoreCase) { "RWS_Statue_RuneRock1", "RWS_Statue_RuneRock2", "RWS_Statue_RuneRock3" }; private static readonly HashSet StonePlacementSoundPrefabs = new HashSet(StringComparer.OrdinalIgnoreCase) { "RWS_The_White_Throne", "RWS_The_Black_Throne", "RWS_Valkyrie_Statue", "RWS_The_Grey_Throne", "RWS_The_Golden_Throne", "RWS_Odin_On_Throne", "RWS_Lion_Statue", "RWS_Horse_Bust", "RWS_Werewolf_Bust", "RWS_Gargoyle_Dog", "RWS_Gargoyle_Statue", "RWS_Statue_Dragon", "RWS_Statue_RuneRock1", "RWS_Statue_RuneRock2", "RWS_Statue_RuneRock3", "RWS_Medal_Cthulhu", "RWS_Medal_Octopus", "RWS_Medal_Sectarian", "RWS_Statue_Column", "RWS_Statue_Crab", "RWS_Statue_Cthulhu", "RWS_Statue_Demon", "RWS_Statue_Fish", "RWS_Statue_Obelisk", "RWS_Statue_Snake" }; private static readonly HashSet StoneDestructionSoundPrefabs = new HashSet(StringComparer.OrdinalIgnoreCase) { "RWS_The_White_Throne", "RWS_The_Black_Throne", "RWS_Valkyrie_Statue", "RWS_The_Grey_Throne", "RWS_The_Golden_Throne", "RWS_Odin_On_Throne", "RWS_Lion_Statue", "RWS_Horse_Bust", "RWS_Werewolf_Bust", "RWS_Gargoyle_Dog", "RWS_Gargoyle_Statue" }; public static readonly List AllRegistrations = new List { new RelicRegistration("RWS_Heimdall_Armour", "Heimdall Armour", (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig("Bronze", 10, 0, true), new RequirementConfig("RWc_Bear", 10, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_The_Dark_Angel_Statue", "The Dark Angel Statue (Animated)", (RequirementConfig[])(object)new RequirementConfig[4] { new RequirementConfig("RWc_Bear", 4, 0, true), new RequirementConfig("RWc_Snake", 3, 0, true), new RequirementConfig("RWc_Wolf", 2, 0, true), new RequirementConfig("RWc_Lion", 1, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_The_Dark_Knight_Armour", "The Dark Knight Armour", (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig("Iron", 10, 0, true), new RequirementConfig("RWc_Snake", 10, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_The_Templar_Armour", "The Templar Armour", (RequirementConfig[])(object)new RequirementConfig[4] { new RequirementConfig("Bronze", 3, 0, true), new RequirementConfig("Silver", 5, 0, true), new RequirementConfig("RWc_Bear", 2, 0, true), new RequirementConfig("RWc_Wolf", 2, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Dragon_Statue", "Dragon Statue (Animated+Saddle)", (RequirementConfig[])(object)new RequirementConfig[1] { new RequirementConfig("RWc_Raven", 1, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Werewolf", "Werewolf Statue (Animated)", (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig("RWc_Snake", 10, 0, true), new RequirementConfig("RWc_Lion", 1, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Werewolf_Mirrored_Left", "Werewolf Statue Left", (RequirementConfig[])(object)new RequirementConfig[1] { new RequirementConfig("RWc_Snake", 5, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Werewolf_Mirrored_Right", "Werewolf Statue Right", (RequirementConfig[])(object)new RequirementConfig[1] { new RequirementConfig("RWc_Snake", 5, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Gargoyle_Statue", "Gargoyle Statue", (RequirementConfig[])(object)new RequirementConfig[3] { new RequirementConfig("Stone", 10, 0, true), new RequirementConfig("RWc_Bear", 1, 0, true), new RequirementConfig("RWc_Snake", 3, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Gargoyle_Dog", "Gargoyle Dog Statue", (RequirementConfig[])(object)new RequirementConfig[3] { new RequirementConfig("Stone", 10, 0, true), new RequirementConfig("RWc_Deer", 5, 0, true), new RequirementConfig("RWc_Snake", 3, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Werewolf_Bust", "Werewolf Bust", (RequirementConfig[])(object)new RequirementConfig[3] { new RequirementConfig("Stone", 5, 0, true), new RequirementConfig("RWc_Deer", 5, 0, true), new RequirementConfig("RWc_Snake", 2, 0, true) }, "A Ravenwood statue relic.", 1), new RelicRegistration("RWS_Horse_Bust", "Horse Bust", (RequirementConfig[])(object)new RequirementConfig[3] { new RequirementConfig("BlackMarble", 5, 0, true), new RequirementConfig("RWc_Deer", 1, 0, true), new RequirementConfig("RWc_Snake", 2, 0, true) }, "A Ravenwood statue relic.", 1), new RelicRegistration("RWS_Lion_Statue", "Lion Statue", (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig("Stone", 40, 0, true), new RequirementConfig("RWc_Deer", 40, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Odin_On_Throne", "Odin On The Throne", (RequirementConfig[])(object)new RequirementConfig[3] { new RequirementConfig("Stone", 120, 0, true), new RequirementConfig("Silver", 120, 0, true), new RequirementConfig("RWc_Wolf", 12, 0, true) }, "A Ravenwood statue relic.", 1), new RelicRegistration("RWS_The_Golden_Throne", "The Golden Throne", (RequirementConfig[])(object)new RequirementConfig[3] { new RequirementConfig("Stone", 100, 0, true), new RequirementConfig("FlametalNew", 100, 0, true), new RequirementConfig("RWc_Lion", 5, 0, true) }, "A Ravenwood statue relic.", 1), new RelicRegistration("RWS_The_Grey_Throne", "The Grey Throne", (RequirementConfig[])(object)new RequirementConfig[3] { new RequirementConfig("Stone", 100, 0, true), new RequirementConfig("Iron", 100, 0, true), new RequirementConfig("RWc_Snake", 50, 0, true) }, "A Ravenwood statue relic.", 1), new RelicRegistration("RWS_The_White_Throne", "The White Throne", (RequirementConfig[])(object)new RequirementConfig[3] { new RequirementConfig("Stone", 100, 0, true), new RequirementConfig("Silver", 100, 0, true), new RequirementConfig("RWc_Wolf", 20, 0, true) }, "A Ravenwood statue relic.", 1), new RelicRegistration("RWS_The_Black_Throne", "The Black Throne", (RequirementConfig[])(object)new RequirementConfig[3] { new RequirementConfig("Stone", 100, 0, true), new RequirementConfig("BlackMetal", 100, 0, true), new RequirementConfig("RWc_Bear", 100, 0, true) }, "A Ravenwood statue relic.", 1), new RelicRegistration("RWS_Valkyrie_Statue", "A Valkyrie Statue", (RequirementConfig[])(object)new RequirementConfig[4] { new RequirementConfig("RWc_Deer", 3, 0, true), new RequirementConfig("RWc_Bear", 3, 0, true), new RequirementConfig("RWc_Wolf", 3, 0, true), new RequirementConfig("RWc_Lion", 3, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Statue_Dragon", "Dragon Statue", (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig("Stone", 20, 0, true), new RequirementConfig("RWc_Snake", 5, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Statue_RuneRock1", "Rune Rock 1 Wisplight", (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig("Wisp", 1, 0, true), new RequirementConfig("RWc_Wolf", 1, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Statue_RuneRock2", "Rune Rock 2 Wisplight", (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig("Wisp", 1, 0, true), new RequirementConfig("RWc_Wolf", 1, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Statue_RuneRock3", "Rune Rock 3 Wisplight", (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig("Wisp", 1, 0, true), new RequirementConfig("RWc_Wolf", 1, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Medal_Cthulhu", "Cthulhu Medal", (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig("Stone", 5, 0, true), new RequirementConfig("RWc_Snake", 4, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Medal_Octopus", "Octopus Medal", (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig("Stone", 5, 0, true), new RequirementConfig("RWc_Snake", 4, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Medal_Sectarian", "Sectarian Medal", (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig("Stone", 5, 0, true), new RequirementConfig("RWc_Wolf", 2, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Statue_Column", "Stone Column", (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig("Stone", 40, 0, true), new RequirementConfig("RWc_Snake", 5, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Statue_Crab", "Crab Statue", (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig("Stone", 25, 0, true), new RequirementConfig("RWc_Snake", 5, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Statue_Cthulhu", "Cthulhu Statue", (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig("Stone", 25, 0, true), new RequirementConfig("RWc_Snake", 5, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Statue_Demon", "Demon Statue", (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig("Stone", 40, 0, true), new RequirementConfig("RWc_Snake", 5, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Statue_Fish", "Fish Statue", (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig("Stone", 10, 0, true), new RequirementConfig("RWc_Snake", 3, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Statue_Obelisk", "Obelisk", (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig("Stone", 30, 0, true), new RequirementConfig("RWc_Snake", 5, 0, true) }, "A Ravenwood statue relic."), new RelicRegistration("RWS_Statue_Snake", "Snake Statue", (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig("Stone", 25, 0, true), new RequirementConfig("RWc_Snake", 5, 0, true) }, "A Ravenwood statue relic.") }; public static void InitConfig(ConfigFile config) { if (config == null || recipeConfigs.Count > 0) { return; } customHammerTabConfig = config.Bind("General", "CustomHammerTab", "Ravenwood", "Hammer build-menu tab used by all Ravenwood Relics Statues pieces. Restart Valheim after changing this setting."); foreach (string runeRockSoundPrefab in RuneRockSoundPrefabs) { runeRockSoundConfigs[runeRockSoundPrefab] = config.Bind("Rune Rock Sounds", runeRockSoundPrefab, true, "Enable the built-in sound on " + runeRockSoundPrefab + ". Set to false to disable it. Restart Valheim after changing this setting."); } foreach (RelicRegistration allRegistration in AllRegistrations) { ConfigEntry val = config.Bind("Recipes", allRegistration.PrefabName, GetDefaultRecipeText(allRegistration), "Build recipe for this prefab. Format: ItemPrefab:Amount. Separate multiple requirements with commas, for example: RWc_Deer:1,Wood:5. Restart Valheim after changing this setting."); if (string.Equals(val.Value?.Trim(), "Coins:1", StringComparison.OrdinalIgnoreCase)) { val.Value = "RWc_Deer:1"; } if (string.Equals(allRegistration.PrefabName, "RWS_Medal_Chthulhu", StringComparison.OrdinalIgnoreCase) && string.Equals(val.Value?.Trim(), "RWc_Deer:1", StringComparison.OrdinalIgnoreCase)) { val.Value = GetDefaultRecipeText(allRegistration); } recipeConfigs[allRegistration.PrefabName] = val; } } public static void RegisterAllRelics(AssetBundle bundle) { if (wasAlreadyRegistered || (Object)(object)bundle == (Object)null) { return; } int num = 0; int num2 = 0; foreach (RelicRegistration allRegistration in AllRegistrations) { if (RegisterRelic(bundle, allRegistration)) { num++; } else { num2++; } } wasAlreadyRegistered = true; } private static bool RegisterRelic(AssetBundle bundle, RelicRegistration reg) { //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_02f3: Unknown result type (might be due to invalid IL or missing references) //IL_02f8: Unknown result type (might be due to invalid IL or missing references) //IL_0304: Unknown result type (might be due to invalid IL or missing references) //IL_0310: 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_032b: Expected O, but got Unknown //IL_0334: Unknown result type (might be due to invalid IL or missing references) //IL_033e: Expected O, but got Unknown if ((Object)(object)bundle == (Object)null) { return false; } if (reg == null || string.IsNullOrWhiteSpace(reg.PrefabName)) { return false; } GameObject val = bundle.LoadAsset(reg.PrefabName); if ((Object)(object)val == (Object)null) { return false; } ((Object)val).name = reg.PrefabName; ApplyRuneRockSoundConfig(reg.PrefabName, val); ZNetView val2 = val.GetComponent(); if ((Object)(object)val2 == (Object)null) { val2 = val.AddComponent(); } val2.m_persistent = true; val2.m_syncInitialScale = true; if (!Object.op_Implicit((Object)(object)val.GetComponent())) { val.AddComponent(); } Piece val3 = val.GetComponent() ?? val.AddComponent(); val3.m_name = reg.DisplayName; val3.m_description = reg.Description; val3.m_comfort = reg.Comfort; if (reg.PrefabName.EndsWith("_Throne", StringComparison.OrdinalIgnoreCase)) { val3.m_comfortGroup = (ComfortGroup)1381454676; } else if (string.Equals(reg.PrefabName, "RWS_Werewolf_Bust", StringComparison.OrdinalIgnoreCase)) { val3.m_comfortGroup = (ComfortGroup)1381454679; } else if (string.Equals(reg.PrefabName, "RWS_Horse_Bust", StringComparison.OrdinalIgnoreCase)) { val3.m_comfortGroup = (ComfortGroup)1381454664; } val3.m_groundOnly = false; WearNTear val4 = val.GetComponent() ?? val.AddComponent(); val4.m_health = 1000000f; val4.m_noRoofWear = true; val4.m_noSupportWear = false; val4.m_supports = true; if (string.Equals(reg.PrefabName, "RWS_Statue_Column", StringComparison.OrdinalIgnoreCase)) { val4.m_noSupportWear = false; val4.m_supports = true; } ConfigurePlacementAndDestructionEffects(reg.PrefabName, val3, val4); if (string.Equals(reg.PrefabName, "RWS_The_Dark_Angel_Statue", StringComparison.OrdinalIgnoreCase)) { AnimationClip animationClip = FindAnimationClip(bundle, "Mon_BlackDragon31_Btl_Skl08"); Object soundAsset = FindAssetByName(bundle, "sfx_RWS_The_Dark_Angel_Statue"); DarkAngelStatueInteract darkAngelStatueInteract = val.GetComponent() ?? val.AddComponent(); darkAngelStatueInteract.SetAnimationClip(animationClip); darkAngelStatueInteract.SetSoundAsset(soundAsset); } if (string.Equals(reg.PrefabName, "RWS_Dragon_Statue", StringComparison.OrdinalIgnoreCase)) { AnimationClip animationClip2 = FindDragonAnimationClip(bundle); Object soundAsset2 = FindAssetByName(bundle, "sfx_RWS_Dragon_Statue"); DragonStatueInteract dragonStatueInteract = val.GetComponent() ?? val.AddComponent(); dragonStatueInteract.SetAnimationClip(animationClip2); dragonStatueInteract.SetSoundAsset(soundAsset2); } if (string.Equals(reg.PrefabName, "RWS_Werewolf", StringComparison.OrdinalIgnoreCase)) { AnimationClip animationClip3 = FindAnimationClip(bundle, "werewolf_skeleton_howl"); Object soundAsset3 = FindAssetByName(bundle, "sfx_RWS_Werewolf"); WerewolfStatueInteract werewolfStatueInteract = val.GetComponent() ?? val.AddComponent(); werewolfStatueInteract.SetAnimationClip(animationClip3); werewolfStatueInteract.SetSoundAsset(soundAsset3); } Sprite val5 = bundle.LoadAsset(reg.PrefabName); if ((Object)(object)val5 != (Object)null) { val3.m_icon = val5; } PieceConfig val6 = new PieceConfig { PieceTable = "Hammer", Category = GetConfiguredHammerTab(), CraftingStation = "piece_workbench", Requirements = GetConfiguredRequirements(reg) }; PieceManager.Instance.AddPiece(new CustomPiece(val, true, val6)); return true; } private static AnimationClip FindAnimationClip(AssetBundle bundle, string clipName) { if ((Object)(object)bundle == (Object)null || string.IsNullOrWhiteSpace(clipName)) { return null; } AnimationClip val = bundle.LoadAsset(clipName); if ((Object)(object)val != (Object)null) { return val; } AnimationClip val2 = ((IEnumerable)bundle.LoadAllAssets()).FirstOrDefault((Func)((AnimationClip clip) => (Object)(object)clip != (Object)null && string.Equals(((Object)clip).name, clipName, StringComparison.OrdinalIgnoreCase))); if ((Object)(object)val2 != (Object)null) { return val2; } string[] allAssetNames = bundle.GetAllAssetNames(); foreach (string text in allAssetNames) { AnimationClip[] source = bundle.LoadAssetWithSubAssets(text); AnimationClip val3 = ((IEnumerable)source).FirstOrDefault((Func)((AnimationClip clip) => (Object)(object)clip != (Object)null && string.Equals(((Object)clip).name, clipName, StringComparison.OrdinalIgnoreCase))); if ((Object)(object)val3 != (Object)null) { return val3; } } return null; } private static Object FindAssetByName(AssetBundle bundle, string assetName) { if ((Object)(object)bundle == (Object)null || string.IsNullOrWhiteSpace(assetName)) { return null; } Object val = bundle.LoadAsset(assetName); if (val != (Object)null) { return val; } Object val2 = ((IEnumerable)bundle.LoadAllAssets()).FirstOrDefault((Func)((Object asset) => asset != (Object)null && string.Equals(asset.name, assetName, StringComparison.OrdinalIgnoreCase))); if (val2 != (Object)null) { return val2; } string[] allAssetNames = bundle.GetAllAssetNames(); foreach (string text in allAssetNames) { Object[] source = bundle.LoadAssetWithSubAssets(text); Object val3 = ((IEnumerable)source).FirstOrDefault((Func)((Object asset) => asset != (Object)null && string.Equals(asset.name, assetName, StringComparison.OrdinalIgnoreCase))); if (val3 != (Object)null) { return val3; } } return null; } private static AnimationClip FindDragonAnimationClip(AssetBundle bundle) { if ((Object)(object)bundle == (Object)null) { return null; } string[] array = new string[5] { "Qishilong_skill09", "RWS_Dragon_Statue", "RWS_Dragon_Statue_Animation", "Dragon_Statue", "DragonStatue" }; string[] array2 = array; foreach (string clipName in array2) { AnimationClip val = FindAnimationClip(bundle, clipName); if ((Object)(object)val != (Object)null) { return val; } } AnimationClip[] source = bundle.LoadAllAssets(); AnimationClip val2 = ((IEnumerable)source).FirstOrDefault((Func)((AnimationClip clip) => (Object)(object)clip != (Object)null && ((Object)clip).name.IndexOf("dragon", StringComparison.OrdinalIgnoreCase) >= 0 && !string.Equals(((Object)clip).name, "Mon_BlackDragon31_Btl_Skl08", StringComparison.OrdinalIgnoreCase))); if ((Object)(object)val2 != (Object)null) { return val2; } AnimationClip[] array3 = source.Where((AnimationClip clip) => (Object)(object)clip != (Object)null && !string.Equals(((Object)clip).name, "Mon_BlackDragon31_Btl_Skl08", StringComparison.OrdinalIgnoreCase)).ToArray(); return (array3.Length == 1) ? array3[0] : null; } private static void ConfigurePlacementAndDestructionEffects(string prefabName, Piece piece, WearNTear wear) { //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Expected O, but got Unknown //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Expected O, but got Unknown if (!((Object)(object)piece == (Object)null) && !((Object)(object)wear == (Object)null)) { bool flag = !string.IsNullOrWhiteSpace(prefabName) && StonePlacementSoundPrefabs.Contains(prefabName); bool flag2 = !string.IsNullOrWhiteSpace(prefabName) && StoneDestructionSoundPrefabs.Contains(prefabName); GameObject prefab = PrefabManager.Instance.GetPrefab(flag ? "sfx_build_hammer_stone" : "sfx_build_hammer_metal"); GameObject prefab2 = PrefabManager.Instance.GetPrefab(flag2 ? "sfx_rock_destroyed" : "sfx_build_hammer_metal"); GameObject prefab3 = PrefabManager.Instance.GetPrefab("vfx_destroyed"); if (piece.m_placeEffect == null) { piece.m_placeEffect = new EffectList(); } if (wear.m_destroyedEffect == null) { wear.m_destroyedEffect = new EffectList(); } RemoveEffectsByName(piece.m_placeEffect, "sfx_build_hammer_metal", "sfx_build_hammer_stone"); RemoveEffectsByName(wear.m_destroyedEffect, "sfx_build_hammer_metal", "sfx_build_hammer_stone", "sfx_rock_destroyed"); AddEffectIfMissing(piece.m_placeEffect, prefab); AddEffectIfMissing(wear.m_destroyedEffect, prefab3); AddEffectIfMissing(wear.m_destroyedEffect, prefab2); } } private static void RemoveEffectsByName(EffectList effectList, params string[] prefabNames) { if (effectList == null || effectList.m_effectPrefabs == null || prefabNames == null || prefabNames.Length == 0) { return; } effectList.m_effectPrefabs = effectList.m_effectPrefabs.Where((EffectData effect) => effect == null || (Object)(object)effect.m_prefab == (Object)null || !prefabNames.Any((string name) => string.Equals(((Object)effect.m_prefab).name, name, StringComparison.OrdinalIgnoreCase))).ToArray(); } private static void AddEffectIfMissing(EffectList effectList, GameObject effectPrefab) { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0069: 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_007c: Expected O, but got Unknown if (effectList != null && !((Object)(object)effectPrefab == (Object)null)) { List list = (effectList.m_effectPrefabs ?? Array.Empty()).ToList(); if (!list.Any((EffectData effect) => effect != null && (Object)(object)effect.m_prefab != (Object)null && string.Equals(((Object)effect.m_prefab).name, ((Object)effectPrefab).name, StringComparison.OrdinalIgnoreCase))) { list.Add(new EffectData { m_prefab = effectPrefab, m_enabled = true, m_variant = -1 }); effectList.m_effectPrefabs = list.ToArray(); } } } private static void ApplyRuneRockSoundConfig(string prefabName, GameObject prefab) { if ((Object)(object)prefab == (Object)null || string.IsNullOrWhiteSpace(prefabName) || !RuneRockSoundPrefabs.Contains(prefabName) || !runeRockSoundConfigs.TryGetValue(prefabName, out var value) || value == null || value.Value) { return; } Behaviour[] componentsInChildren = prefab.GetComponentsInChildren(true); Behaviour[] array = componentsInChildren; foreach (Behaviour val in array) { if ((Object)(object)val == (Object)null || !string.Equals(((object)val).GetType().Name, "ZSFX", StringComparison.OrdinalIgnoreCase)) { continue; } DisableZSFXPlayOnAwake(val); val.enabled = false; AudioSource[] components = ((Component)val).GetComponents(); AudioSource[] array2 = components; foreach (AudioSource val2 in array2) { if (!((Object)(object)val2 == (Object)null)) { val2.Stop(); val2.playOnAwake = false; val2.loop = false; val2.mute = true; ((Behaviour)val2).enabled = false; } } } } private static void DisableZSFXPlayOnAwake(Behaviour zsfx) { if (!((Object)(object)zsfx == (Object)null)) { Type type = ((object)zsfx).GetType(); FieldInfo field = type.GetField("m_playOnAwake", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null && field.FieldType == typeof(bool)) { field.SetValue(zsfx, false); } } } private static string GetConfiguredHammerTab() { string text = customHammerTabConfig?.Value?.Trim(); return string.IsNullOrWhiteSpace(text) ? "Ravenwood" : text; } private static string GetDefaultRecipeText(RelicRegistration reg) { if (reg?.Requirements == null || reg.Requirements.Length == 0) { return "RWc_Deer:1"; } return string.Join(", ", reg.Requirements.Select((RequirementConfig requirement) => $"{requirement.Item}:{requirement.Amount}")); } private static RequirementConfig[] GetConfiguredRequirements(RelicRegistration reg) { //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Expected O, but got Unknown if (reg == null || string.IsNullOrWhiteSpace(reg.PrefabName)) { return reg?.Requirements; } if (!recipeConfigs.TryGetValue(reg.PrefabName, out var value) || value == null) { return reg.Requirements; } string value2 = value.Value; if (string.IsNullOrWhiteSpace(value2)) { return reg.Requirements; } List list = new List(); string[] array = value2.Split(new char[2] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries); string[] array2 = array; foreach (string text in array2) { string text2 = text.Trim(); int num = text2.IndexOf(':'); if (num > 0 && num < text2.Length - 1) { string text3 = text2.Substring(0, num).Trim(); string s = text2.Substring(num + 1).Trim(); if (!string.IsNullOrWhiteSpace(text3) && int.TryParse(s, out var result) && result > 0) { list.Add(new RequirementConfig(text3, result, 0, true)); } } } if (list.Count == 0) { return reg.Requirements; } return list.ToArray(); } public static IEnumerable GetAllCategories() { return new string[1] { GetConfiguredHammerTab() }; } } public class WerewolfStatueInteract : MonoBehaviour, Hoverable, Interactable { private const string RpcName = "RWS_PlayWerewolfAnimation"; private const string InteractionObjectName = "Interaction"; private static AnimationClip sharedAnimationClip; private static Object sharedSoundAsset; private AnimationClip animationClip; private Object soundAsset; private Animator animator; private ZNetView netView; private PlayableGraph playableGraph; private Coroutine stopRoutine; private GameObject activeSoundObject; public void SetAnimationClip(AnimationClip clip) { animationClip = clip; if ((Object)(object)clip != (Object)null) { sharedAnimationClip = clip; } } public void SetSoundAsset(Object asset) { soundAsset = asset; if (asset != (Object)null) { sharedSoundAsset = asset; } } private void Awake() { if ((Object)(object)animationClip == (Object)null) { animationClip = sharedAnimationClip; } if (soundAsset == (Object)null) { soundAsset = sharedSoundAsset; } netView = ((Component)this).GetComponent(); animator = ResolveAnimator(); EnsureInteractionProxy(); if ((Object)(object)netView != (Object)null) { netView.Register("RWS_PlayWerewolfAnimation", (Action)RPC_PlayAnimation); } } public string GetHoverName() { return "Werewolf Statue"; } public string GetHoverText() { return "Werewolf Statue\n[E] Howl"; } public bool Interact(Humanoid user, bool hold, bool alt) { if (hold) { return false; } if ((Object)(object)animationClip == (Object)null) { animationClip = sharedAnimationClip; } if ((Object)(object)animationClip == (Object)null) { return false; } if ((Object)(object)netView != (Object)null && netView.IsValid()) { netView.InvokeRPC(ZNetView.Everybody, "RWS_PlayWerewolfAnimation", Array.Empty()); } else { PlayAnimation(); } return true; } public bool UseItem(Humanoid user, ItemData item) { return false; } private void RPC_PlayAnimation(long sender) { PlayAnimation(); } private void PlayAnimation() { //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_008c: 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_0093: 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_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)animationClip == (Object)null) { animationClip = sharedAnimationClip; } if (!((Object)(object)animationClip == (Object)null)) { animator = ResolveAnimator(); if (!((Object)(object)animator == (Object)null)) { StopCurrentAnimation(); playableGraph = PlayableGraph.Create("RWS_Werewolf_Animation"); ((PlayableGraph)(ref playableGraph)).SetTimeUpdateMode((DirectorUpdateMode)1); AnimationPlayableOutput val = AnimationPlayableOutput.Create(playableGraph, "WerewolfOutput", animator); AnimationClipPlayable val2 = AnimationClipPlayable.Create(playableGraph, animationClip); PlayableExtensions.SetTime(val2, 0.0); PlayableExtensions.SetSpeed(val2, 1.0); PlayableOutputExtensions.SetSourcePlayable(val, val2); ((PlayableGraph)(ref playableGraph)).Play(); ((PlayableGraph)(ref playableGraph)).Evaluate(0f); PlaySound(); stopRoutine = ((MonoBehaviour)this).StartCoroutine(StopAfter(animationClip.length)); } } } private void PlaySound() { //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0253: Unknown result type (might be due to invalid IL or missing references) //IL_025d: Expected O, but got Unknown //IL_026e: Unknown result type (might be due to invalid IL or missing references) if (soundAsset == (Object)null) { soundAsset = sharedSoundAsset; } if (soundAsset == (Object)null) { return; } StopCurrentSound(); Type type = Type.GetType("UnityEngine.AudioSource, UnityEngine.AudioModule"); if (type == null) { return; } Object obj = soundAsset; GameObject val = (GameObject)(object)((obj is GameObject) ? obj : null); if (val != null) { activeSoundObject = Object.Instantiate(val, ((Component)this).transform.position, Quaternion.identity); ((Object)activeSoundObject).name = "sfx_RWS_Werewolf"; bool flag = false; Transform[] componentsInChildren = activeSoundObject.GetComponentsInChildren(true); Transform[] array = componentsInChildren; foreach (Transform val2 in array) { if (!((Object)(object)val2 == (Object)null)) { Component component = ((Component)val2).GetComponent(type); if (!((Object)(object)component == (Object)null)) { type.GetProperty("playOnAwake")?.SetValue(component, false, null); type.GetProperty("loop")?.SetValue(component, false, null); type.GetProperty("volume")?.SetValue(component, 1f, null); type.GetProperty("spatialBlend")?.SetValue(component, 1f, null); type.GetProperty("minDistance")?.SetValue(component, 1f, null); type.GetProperty("maxDistance")?.SetValue(component, 25f, null); type.GetMethod("Play", Type.EmptyTypes)?.Invoke(component, null); flag = true; } } } if (!flag) { StopCurrentSound(); } return; } Type type2 = Type.GetType("UnityEngine.AudioClip, UnityEngine.AudioModule"); if (type2 == null || !type2.IsInstanceOfType(soundAsset)) { return; } activeSoundObject = new GameObject("sfx_RWS_Werewolf"); activeSoundObject.transform.position = ((Component)this).transform.position; activeSoundObject.transform.SetParent(((Component)this).transform, true); Component val3 = activeSoundObject.AddComponent(type); if ((Object)(object)val3 == (Object)null) { StopCurrentSound(); return; } type.GetProperty("clip")?.SetValue(val3, soundAsset, null); type.GetProperty("playOnAwake")?.SetValue(val3, false, null); type.GetProperty("loop")?.SetValue(val3, false, null); type.GetProperty("volume")?.SetValue(val3, 1f, null); type.GetProperty("spatialBlend")?.SetValue(val3, 1f, null); type.GetProperty("minDistance")?.SetValue(val3, 1f, null); type.GetProperty("maxDistance")?.SetValue(val3, 25f, null); type.GetMethod("Play", Type.EmptyTypes)?.Invoke(val3, null); float soundLength = GetSoundLength(soundAsset); if (soundLength > 0f) { Object.Destroy((Object)(object)activeSoundObject, soundLength + 0.1f); } } private static float GetSoundLength(Object asset) { if (asset == (Object)null) { return 0f; } return (((object)asset).GetType().GetProperty("length")?.GetValue(asset, null) is float num) ? num : 0f; } private void StopCurrentSound() { if ((Object)(object)activeSoundObject != (Object)null) { Object.Destroy((Object)(object)activeSoundObject); activeSoundObject = null; } } private Animator ResolveAnimator() { Animator val = ((Component)this).GetComponent(); if ((Object)(object)val == (Object)null) { val = ((Component)this).gameObject.AddComponent(); } ((Behaviour)val).enabled = true; val.cullingMode = (AnimatorCullingMode)0; return val; } private void EnsureInteractionProxy() { Transform val = null; Transform[] componentsInChildren = ((Component)this).GetComponentsInChildren(true); Transform[] array = componentsInChildren; foreach (Transform val2 in array) { if (!((Object)(object)val2 == (Object)null) && !((Object)(object)((Component)val2).gameObject == (Object)(object)((Component)this).gameObject) && string.Equals(((Object)val2).name, "Interaction", StringComparison.OrdinalIgnoreCase)) { val = val2; break; } } if ((Object)(object)val != (Object)null) { ((Component)val).gameObject.layer = ((Component)this).gameObject.layer; if ((Object)(object)((Component)val).GetComponent() == (Object)null) { ((Component)val).gameObject.AddComponent(); } return; } Transform[] array2 = componentsInChildren; foreach (Transform val3 in array2) { if ((Object)(object)val3 == (Object)null || (Object)(object)((Component)val3).gameObject == (Object)(object)((Component)this).gameObject) { continue; } Component[] components = ((Component)val3).GetComponents(); bool flag = false; Component[] array3 = components; foreach (Component val4 in array3) { if (!((Object)(object)val4 == (Object)null)) { string fullName = ((object)val4).GetType().FullName; if (!string.IsNullOrEmpty(fullName) && fullName.StartsWith("UnityEngine.", StringComparison.Ordinal) && fullName.EndsWith("Collider", StringComparison.Ordinal)) { flag = true; break; } } } if (flag) { ((Component)val3).gameObject.layer = ((Component)this).gameObject.layer; if ((Object)(object)((Component)val3).GetComponent() == (Object)null) { ((Component)val3).gameObject.AddComponent(); } } } } private IEnumerator StopAfter(float seconds) { yield return (object)new WaitForSeconds(Mathf.Max(0.05f, seconds)); StopCurrentAnimation(); } private void StopCurrentAnimation() { if (stopRoutine != null) { ((MonoBehaviour)this).StopCoroutine(stopRoutine); stopRoutine = null; } if (((PlayableGraph)(ref playableGraph)).IsValid()) { ((PlayableGraph)(ref playableGraph)).Destroy(); } } private void OnDestroy() { StopCurrentAnimation(); StopCurrentSound(); } } public class WerewolfStatueInteractProxy : MonoBehaviour, Hoverable, Interactable { private WerewolfStatueInteract GetOwner() { return ((Component)this).GetComponentInParent(); } public string GetHoverName() { WerewolfStatueInteract owner = GetOwner(); return ((Object)(object)owner != (Object)null) ? owner.GetHoverName() : "Werewolf Statue"; } public string GetHoverText() { WerewolfStatueInteract owner = GetOwner(); return ((Object)(object)owner != (Object)null) ? owner.GetHoverText() : string.Empty; } public bool Interact(Humanoid user, bool hold, bool alt) { WerewolfStatueInteract owner = GetOwner(); return (Object)(object)owner != (Object)null && owner.Interact(user, hold, alt); } public bool UseItem(Humanoid user, ItemData item) { WerewolfStatueInteract owner = GetOwner(); return (Object)(object)owner != (Object)null && owner.UseItem(user, item); } }