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 BepInEx.Logging; using HarmonyLib; using Jotunn.Configs; using Jotunn.Entities; using Jotunn.Managers; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("FehuAssets")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("FehuAssets")] [assembly: AssemblyTitle("FehuAssets")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace FehuAssets { [BepInPlugin("fehu.assets", "FehuAssets", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public sealed class FehuAssetsPlugin : BaseUnityPlugin { [HarmonyPatch(typeof(Player), "RemovePiece")] private static class PlayerRemovePiecePatch { private static readonly FieldInfo? HoveringPieceField = AccessTools.Field(typeof(Player), "m_hoveringPiece"); private static bool Prefix(Player __instance) { object? obj = HoveringPieceField?.GetValue(__instance); Piece val = (Piece)((obj is Piece) ? obj : null); if ((Object)(object)val == (Object)null || !IsFehuPiece(val)) { return true; } DestroyFehuPiece(val); return false; } private static bool IsFehuPiece(Piece piece) { return FehuAssetsPlugin.IsFehuPiece(piece); } } private readonly struct DancerPrefabSpec { public string SourcePath { get; } public string SourceName { get; } public string ExposedPrefabName { get; } public string DisplayName { get; } public string Description { get; } public DancerGroup Group { get; } public DancerPrefabSpec(string sourcePath, string sourceName, string exposedPrefabName, string displayName, string description, DancerGroup group) { SourcePath = sourcePath; SourceName = sourceName; ExposedPrefabName = exposedPrefabName; DisplayName = displayName; Description = description; Group = group; } } private readonly struct RequirementSpec { public string Item { get; } public int Amount { get; } public bool Recover { get; } public RequirementSpec(string item, int amount, bool recover) { Item = item; Amount = amount; Recover = recover; } } private enum DancerGroup { Standing, Sitting, Laying } private readonly struct StructurePrefabSpec { public string PrefabName { get; } public string DisplayName { get; } public string Description { get; } public StructureKind Kind { get; } public RequirementSpec[] Requirements { get; } public StructurePrefabSpec(string prefabName, string displayName, string description, StructureKind kind, RequirementSpec[] requirements) { PrefabName = prefabName; DisplayName = displayName; Description = description; Kind = kind; Requirements = requirements; } } private enum StructureKind { Sigil, Monument, Totem } [CompilerGenerated] private sealed class d__59 : IEnumerator, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public FehuAssetsPlugin <>4__this; private int 5__2; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__59(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { int num = <>1__state; FehuAssetsPlugin fehuAssetsPlugin = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; 5__2 = 0; break; case 1: <>1__state = -1; 5__2++; break; } if (5__2 < 300) { if ((Object)(object)ZNetScene.instance != (Object)null && (Object)(object)ZNetScene.instance.GetPrefab("piece_stonestair") != (Object)null) { fehuAssetsPlugin.RegisterStructurePrefabs(); return false; } <>2__current = null; <>1__state = 1; return true; } fehuAssetsPlugin.Log.LogError((object)"Timed out waiting for vanilla Valheim prefabs. Fehu Sigil/Monument/Totem were not registered."); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public const string ModGuid = "fehu.assets"; public const string ModName = "FehuAssets"; public const string ModVersion = "1.0.0"; public const string JotunnGuid = "com.jotunn.jotunn"; private const string BundleResourceName = "FehuAssets.Resources.fehu_dancers.bundle"; private const string WhoreHousePrefabName = "GlitnirWhoreHouse"; private const string WhoreHousePrefabPath = "assets/bagual/glitnirlocations/whorehouse/glitnirwhorehouse.prefab"; private static readonly Harmony Harmony = new Harmony("fehu.assets"); private static readonly DancerPrefabSpec[] DancerPrefabs = new DancerPrefabSpec[11] { Dancer("Interior/Decor_1Andar/Diane_Dancer", "Diane_Dancer", "Fehu_DianeDancer", "Astrid Firebraid"), Dancer("Interior/Mulheres/Emily_Dancing", "Emily_Dancing", "Fehu_EmilyDancer", "Freydis Goldhair"), Dancer("Interior/Mulheres/Freya_RedHair_Dancing", "Freya_RedHair_Dancing", "Fehu_FreyaDancer", "Runa Moonveil"), Dancer("Interior/Mulheres/Martha_Dancing", "Martha_Dancing", "Fehu_MarthaDancer", "Thyra Silkstep"), Dancer("Interior/Mulheres/ElficGirl_Blond_Dancer", "ElficGirl_Blond_Dancer", "Fehu_BlondElfDancer", "Eira Silvermist"), Dancer("Interior/Mulheres/ElficGirl_RedHair_Dancer", "ElficGirl_RedHair_Dancer", "Fehu_RedElfDancer", "Ylva Ravenhair"), Dancer("Interior/Mulheres/ElficGirl_Brunette_Dancer", "ElficGirl_Brunette_Dancer", "Fehu_BrunetteElfDancer", "Solveig Honeywine"), Dancer("Interior/Mulheres/ElficGirl_Brunette_Idle", "ElficGirl_Brunette_Idle", "Fehu_BrunetteIdle", "Ingrid Shadowstep"), Sitting("Interior/Mulheres/FreyaSentada01", "FreyaSentada01", "Fehu_FreyaSitting01", "Runa Sitting I"), Sitting("Interior/Mulheres/FreyaSentada02", "FreyaSentada02", "Fehu_FreyaSitting02", "Runa Sitting II"), Laying("Interior/Mulheres/FreyaDeitada01", "FreyaDeitada01", "Fehu_FreyaLaying", "Runa Laying") }; private static readonly StructurePrefabSpec[] StructurePrefabs = new StructurePrefabSpec[3] { new StructurePrefabSpec("piece_fehu_sigil", "Fehu Sigil", "A sacred Fehu rune marker.", StructureKind.Sigil, new RequirementSpec[4] { new RequirementSpec("Stone", 60, recover: true), new RequirementSpec("FineWood", 25, recover: true), new RequirementSpec("SurtlingCore", 5, recover: true), new RequirementSpec("Bronze", 5, recover: true) }), new StructurePrefabSpec("piece_fehu_monument", "Fehu Monument", "A heavy stone monument bearing the Fehu rune.", StructureKind.Monument, new RequirementSpec[4] { new RequirementSpec("Stone", 100, recover: true), new RequirementSpec("BlackMarble", 30, recover: true), new RequirementSpec("SurtlingCore", 8, recover: true), new RequirementSpec("Bronze", 10, recover: true) }), new StructurePrefabSpec("piece_fehu_totem", "Fehu Totem", "A small ritual marker for camps and gathering places.", StructureKind.Totem, new RequirementSpec[4] { new RequirementSpec("Wood", 30, recover: true), new RequirementSpec("RoundLog", 10, recover: true), new RequirementSpec("BoneFragments", 10, recover: true), new RequirementSpec("SurtlingCore", 1, recover: true) }) }; private static AssetBundle? _bundle; private static GameObject? _whoreHousePrefab; private static readonly List RegisteredPrefabs = new List(); private static readonly Dictionary Icons = new Dictionary(); private static ConfigEntry? _enableBuildPieces; private static ConfigEntry? _enableStandingDancers; private static ConfigEntry? _enableSittingDancers; private static ConfigEntry? _enableLayingDancers; private static ConfigEntry? _pieceTable; private static ConfigEntry? _pieceCategory; private static ConfigEntry? _requiredCraftingStation; private static ConfigEntry? _colliderSizeMultiplier; private static ConfigEntry? _recipeCostMultiplier; private static ConfigEntry? _recoverResources; private static ConfigEntry? _standingItem1; private static ConfigEntry? _standingItem1Amount; private static ConfigEntry? _standingItem2; private static ConfigEntry? _standingItem2Amount; private static ConfigEntry? _standingItem3; private static ConfigEntry? _standingItem3Amount; private static ConfigEntry? _standingItem4; private static ConfigEntry? _standingItem4Amount; private static ConfigEntry? _sittingItem1; private static ConfigEntry? _sittingItem1Amount; private static ConfigEntry? _sittingItem2; private static ConfigEntry? _sittingItem2Amount; private static ConfigEntry? _sittingItem3; private static ConfigEntry? _sittingItem3Amount; private static ConfigEntry? _sittingItem4; private static ConfigEntry? _sittingItem4Amount; private static ConfigEntry? _layingItem1; private static ConfigEntry? _layingItem1Amount; private static ConfigEntry? _layingItem2; private static ConfigEntry? _layingItem2Amount; private static ConfigEntry? _layingItem3; private static ConfigEntry? _layingItem3Amount; private static ConfigEntry? _layingItem4; private static ConfigEntry? _layingItem4Amount; private ManualLogSource Log => ((BaseUnityPlugin)this).Logger; private void Awake() { //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Expected O, but got Unknown //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Expected O, but got Unknown //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Expected O, but got Unknown //IL_022a: Unknown result type (might be due to invalid IL or missing references) //IL_0234: Expected O, but got Unknown //IL_0284: Unknown result type (might be due to invalid IL or missing references) //IL_028e: Expected O, but got Unknown //IL_02dd: Unknown result type (might be due to invalid IL or missing references) //IL_02e7: Expected O, but got Unknown //IL_0336: Unknown result type (might be due to invalid IL or missing references) //IL_0340: Expected O, but got Unknown //IL_038f: Unknown result type (might be due to invalid IL or missing references) //IL_0399: Expected O, but got Unknown //IL_03e9: Unknown result type (might be due to invalid IL or missing references) //IL_03f3: Expected O, but got Unknown //IL_0442: Unknown result type (might be due to invalid IL or missing references) //IL_044c: Expected O, but got Unknown //IL_049b: Unknown result type (might be due to invalid IL or missing references) //IL_04a5: Expected O, but got Unknown //IL_04f4: Unknown result type (might be due to invalid IL or missing references) //IL_04fe: Expected O, but got Unknown //IL_054e: Unknown result type (might be due to invalid IL or missing references) //IL_0558: Expected O, but got Unknown //IL_05a7: Unknown result type (might be due to invalid IL or missing references) //IL_05b1: Expected O, but got Unknown try { _enableBuildPieces = ((BaseUnityPlugin)this).Config.Bind("General", "Enable build pieces", true, "Register the Fehu dancer build pieces in the Hammer Fehu tab."); _enableStandingDancers = ((BaseUnityPlugin)this).Config.Bind("General", "Enable standing dancers", true, "Register standing and dancing Fehu build pieces."); _enableSittingDancers = ((BaseUnityPlugin)this).Config.Bind("General", "Enable sitting dancers", true, "Register seated Fehu build pieces."); _enableLayingDancers = ((BaseUnityPlugin)this).Config.Bind("General", "Enable laying dancers", true, "Register laying Fehu build pieces."); _pieceTable = ((BaseUnityPlugin)this).Config.Bind("Build", "Piece table", "Hammer", "Jotunn piece table used for Fehu pieces. Default: Hammer."); _pieceCategory = ((BaseUnityPlugin)this).Config.Bind("Build", "Piece category", "Fehu", "Hammer tab/category name for Fehu pieces."); _requiredCraftingStation = ((BaseUnityPlugin)this).Config.Bind("Build", "Required crafting station", string.Empty, "Required station prefab name. Empty means no station requirement. Example: piece_workbench."); _colliderSizeMultiplier = ((BaseUnityPlugin)this).Config.Bind("Build", "Collider size multiplier", 1f, new ConfigDescription("Multiplier for Fehu dancer removal/selection collider size.", (AcceptableValueBase)(object)new AcceptableValueRange(0.25f, 4f), Array.Empty())); _recipeCostMultiplier = ((BaseUnityPlugin)this).Config.Bind("Recipes", "Recipe cost multiplier", 1f, new ConfigDescription("Multiplier applied to all Fehu dancer recipe costs.", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 10f), Array.Empty())); _recoverResources = ((BaseUnityPlugin)this).Config.Bind("Recipes", "Recover resources", true, "Recover materials when a Fehu dancer build piece is removed."); _standingItem1 = ((BaseUnityPlugin)this).Config.Bind("Recipes - Standing dancers", "Item 1", "FineWood", "First recipe item for standing dancer pieces."); _standingItem1Amount = ((BaseUnityPlugin)this).Config.Bind("Recipes - Standing dancers", "Item 1 amount", 10, new ConfigDescription("Amount of item 1 for standing dancer pieces.", (AcceptableValueBase)(object)new AcceptableValueRange(0, 999), Array.Empty())); _standingItem2 = ((BaseUnityPlugin)this).Config.Bind("Recipes - Standing dancers", "Item 2", "LinenThread", "Second recipe item for standing dancer pieces."); _standingItem2Amount = ((BaseUnityPlugin)this).Config.Bind("Recipes - Standing dancers", "Item 2 amount", 4, new ConfigDescription("Amount of item 2 for standing dancer pieces.", (AcceptableValueBase)(object)new AcceptableValueRange(0, 999), Array.Empty())); _standingItem3 = ((BaseUnityPlugin)this).Config.Bind("Recipes - Standing dancers", "Item 3", "Coins", "Third recipe item for standing dancer pieces."); _standingItem3Amount = ((BaseUnityPlugin)this).Config.Bind("Recipes - Standing dancers", "Item 3 amount", 25, new ConfigDescription("Amount of item 3 for standing dancer pieces.", (AcceptableValueBase)(object)new AcceptableValueRange(0, 999), Array.Empty())); _standingItem4 = ((BaseUnityPlugin)this).Config.Bind("Recipes - Standing dancers", "Item 4", "SurtlingCore", "Fourth recipe item for standing dancer pieces."); _standingItem4Amount = ((BaseUnityPlugin)this).Config.Bind("Recipes - Standing dancers", "Item 4 amount", 3, new ConfigDescription("Amount of item 4 for standing dancer pieces.", (AcceptableValueBase)(object)new AcceptableValueRange(0, 999), Array.Empty())); _sittingItem1 = ((BaseUnityPlugin)this).Config.Bind("Recipes - Sitting dancers", "Item 1", "FineWood", "First recipe item for sitting dancer pieces."); _sittingItem1Amount = ((BaseUnityPlugin)this).Config.Bind("Recipes - Sitting dancers", "Item 1 amount", 8, new ConfigDescription("Amount of item 1 for sitting dancer pieces.", (AcceptableValueBase)(object)new AcceptableValueRange(0, 999), Array.Empty())); _sittingItem2 = ((BaseUnityPlugin)this).Config.Bind("Recipes - Sitting dancers", "Item 2", "DeerHide", "Second recipe item for sitting dancer pieces."); _sittingItem2Amount = ((BaseUnityPlugin)this).Config.Bind("Recipes - Sitting dancers", "Item 2 amount", 4, new ConfigDescription("Amount of item 2 for sitting dancer pieces.", (AcceptableValueBase)(object)new AcceptableValueRange(0, 999), Array.Empty())); _sittingItem3 = ((BaseUnityPlugin)this).Config.Bind("Recipes - Sitting dancers", "Item 3", "Coins", "Third recipe item for sitting dancer pieces."); _sittingItem3Amount = ((BaseUnityPlugin)this).Config.Bind("Recipes - Sitting dancers", "Item 3 amount", 20, new ConfigDescription("Amount of item 3 for sitting dancer pieces.", (AcceptableValueBase)(object)new AcceptableValueRange(0, 999), Array.Empty())); _sittingItem4 = ((BaseUnityPlugin)this).Config.Bind("Recipes - Sitting dancers", "Item 4", "SurtlingCore", "Fourth recipe item for sitting dancer pieces."); _sittingItem4Amount = ((BaseUnityPlugin)this).Config.Bind("Recipes - Sitting dancers", "Item 4 amount", 3, new ConfigDescription("Amount of item 4 for sitting dancer pieces.", (AcceptableValueBase)(object)new AcceptableValueRange(0, 999), Array.Empty())); _layingItem1 = ((BaseUnityPlugin)this).Config.Bind("Recipes - Laying dancers", "Item 1", "FineWood", "First recipe item for laying dancer pieces."); _layingItem1Amount = ((BaseUnityPlugin)this).Config.Bind("Recipes - Laying dancers", "Item 1 amount", 8, new ConfigDescription("Amount of item 1 for laying dancer pieces.", (AcceptableValueBase)(object)new AcceptableValueRange(0, 999), Array.Empty())); _layingItem2 = ((BaseUnityPlugin)this).Config.Bind("Recipes - Laying dancers", "Item 2", "DeerHide", "Second recipe item for laying dancer pieces."); _layingItem2Amount = ((BaseUnityPlugin)this).Config.Bind("Recipes - Laying dancers", "Item 2 amount", 6, new ConfigDescription("Amount of item 2 for laying dancer pieces.", (AcceptableValueBase)(object)new AcceptableValueRange(0, 999), Array.Empty())); _layingItem3 = ((BaseUnityPlugin)this).Config.Bind("Recipes - Laying dancers", "Item 3", "Coins", "Third recipe item for laying dancer pieces."); _layingItem3Amount = ((BaseUnityPlugin)this).Config.Bind("Recipes - Laying dancers", "Item 3 amount", 20, new ConfigDescription("Amount of item 3 for laying dancer pieces.", (AcceptableValueBase)(object)new AcceptableValueRange(0, 999), Array.Empty())); _layingItem4 = ((BaseUnityPlugin)this).Config.Bind("Recipes - Laying dancers", "Item 4", "SurtlingCore", "Fourth recipe item for laying dancer pieces."); _layingItem4Amount = ((BaseUnityPlugin)this).Config.Bind("Recipes - Laying dancers", "Item 4 amount", 3, new ConfigDescription("Amount of item 4 for laying dancer pieces.", (AcceptableValueBase)(object)new AcceptableValueRange(0, 999), Array.Empty())); if (!_enableBuildPieces.Value) { Log.LogInfo((object)"Fehu dancer build pieces are disabled in config."); return; } _bundle = LoadEmbeddedDancerBundle(); _whoreHousePrefab = LoadWhoreHousePrefab(_bundle); Harmony.PatchAll(typeof(FehuAssetsPlugin).Assembly); EnsurePieceCategory(); RegisterDancerPrefabs(_whoreHousePrefab); } catch (Exception arg) { Log.LogError((object)string.Format("Failed to initialize {0}: {1}", "FehuAssets", arg)); } } private void OnDestroy() { Harmony.UnpatchSelf(); } private AssetBundle LoadEmbeddedDancerBundle() { Assembly executingAssembly = Assembly.GetExecutingAssembly(); using Stream stream = executingAssembly.GetManifestResourceStream("FehuAssets.Resources.fehu_dancers.bundle"); if (stream == null) { string text = string.Join(", ", executingAssembly.GetManifestResourceNames()); throw new InvalidOperationException("Embedded dancer bundle resource 'FehuAssets.Resources.fehu_dancers.bundle' was not found. Available resources: " + text); } using MemoryStream memoryStream = new MemoryStream(); stream.CopyTo(memoryStream); AssetBundle obj = AssetBundle.LoadFromMemory(memoryStream.ToArray()); if ((Object)(object)obj == (Object)null) { throw new InvalidOperationException("Unity failed to load embedded Fehu dancers AssetBundle."); } Log.LogInfo((object)"Loaded embedded Fehu dancers AssetBundle."); return obj; } private GameObject LoadWhoreHousePrefab(AssetBundle bundle) { GameObject val = bundle.LoadAsset("GlitnirWhoreHouse"); if ((Object)(object)val == (Object)null) { val = bundle.LoadAsset("assets/bagual/glitnirlocations/whorehouse/glitnirwhorehouse.prefab"); } if ((Object)(object)val == (Object)null) { string text = string.Join(", ", from name in bundle.GetAllAssetNames() where name.IndexOf("whorehouse", StringComparison.OrdinalIgnoreCase) >= 0 select name); throw new InvalidOperationException("Could not load 'GlitnirWhoreHouse'. Matching bundle assets: " + text); } return val; } private static int RemoveFehuPieces(float? radius) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) Vector3 val = (((Object)(object)Player.m_localPlayer != (Object)null) ? ((Component)Player.m_localPlayer).transform.position : Vector3.zero); int num = 0; Piece[] array = Object.FindObjectsByType((FindObjectsSortMode)0); foreach (Piece val2 in array) { if (IsFehuPiece(val2) && (!radius.HasValue || !(Vector3.Distance(val, ((Component)val2).transform.position) > radius.Value))) { DestroyFehuPiece(val2); num++; } } return num; } private static void DestroyFehuPiece(Piece piece) { ZNetView component = ((Component)piece).GetComponent(); if ((Object)(object)component != (Object)null && component.IsValid()) { if (!component.IsOwner()) { component.ClaimOwnership(); } component.Destroy(); } else { Object.Destroy((Object)(object)((Component)piece).gameObject); } } private static bool IsFehuPiece(Piece piece) { return ((Object)((Component)piece).gameObject).name.StartsWith("Fehu_", StringComparison.Ordinal); } private void RegisterDancerPrefabs(GameObject whoreHousePrefab) { //IL_0106: Unknown result type (might be due to invalid IL or missing references) DancerPrefabSpec[] dancerPrefabs = DancerPrefabs; for (int i = 0; i < dancerPrefabs.Length; i++) { DancerPrefabSpec spec = dancerPrefabs[i]; if (!IsGroupEnabled(spec.Group)) { Log.LogInfo((object)("Skipped disabled Fehu build piece '" + spec.ExposedPrefabName + "'.")); continue; } Transform val = whoreHousePrefab.transform.Find(spec.SourcePath); if ((Object)(object)val == (Object)null) { val = FindDeepChild(whoreHousePrefab.transform, spec.SourceName); } if ((Object)(object)val == (Object)null) { Log.LogError((object)("Missing dancer GameObject '" + spec.SourceName + "' at '" + spec.SourcePath + "'.")); continue; } GameObject val2 = CreateDancerPiecePrefab(((Component)val).gameObject, spec); Sprite orCreateIcon = GetOrCreateIcon(spec); PrepareBuildPiece(val2, spec, orCreateIcon); val2.SetActive(true); val2.transform.position = new Vector3(0f, -10000f, 0f); Object.DontDestroyOnLoad((Object)(object)val2); RegisterWithJotunn(val2, spec, orCreateIcon); RegisteredPrefabs.Add(val2); Log.LogInfo((object)("Registered Fehu build piece '" + spec.ExposedPrefabName + "' from '" + spec.SourceName + "'.")); } Log.LogInfo((object)$"Registered {RegisteredPrefabs.Count}/{DancerPrefabs.Length} Fehu dancer build pieces in the Fehu tab."); } private void RegisterStructurePrefabs() { //IL_005c: Unknown result type (might be due to invalid IL or missing references) int num = 0; StructurePrefabSpec[] structurePrefabs = StructurePrefabs; for (int i = 0; i < structurePrefabs.Length; i++) { StructurePrefabSpec spec = structurePrefabs[i]; try { GameObject val = CreateStructurePrefab(spec); Sprite icon = CreateStructureIcon(spec); PrepareBuildPiece(val, spec.DisplayName, spec.Description, icon); val.SetActive(true); val.transform.position = new Vector3(0f, -10000f, 0f); Object.DontDestroyOnLoad((Object)(object)val); RegisterWithJotunn(val, spec.DisplayName, spec.Description, spec.Requirements, icon); RegisteredPrefabs.Add(val); num++; Log.LogInfo((object)("Registered Fehu structure piece '" + spec.PrefabName + "'.")); } catch (Exception arg) { Log.LogError((object)$"Failed to register Fehu structure '{spec.PrefabName}': {arg}"); } } Log.LogInfo((object)$"Registered {num}/{StructurePrefabs.Length} Fehu structure pieces in the Fehu tab."); } [IteratorStateMachine(typeof(d__59))] private IEnumerator RegisterStructurePrefabsWhenReady() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__59(0) { <>4__this = this }; } private static DancerPrefabSpec Dancer(string sourcePath, string sourceName, string exposedPrefabName, string displayName) { return new DancerPrefabSpec(sourcePath, sourceName, exposedPrefabName, displayName, DescriptionFor(exposedPrefabName), DancerGroup.Standing); } private static DancerPrefabSpec Sitting(string sourcePath, string sourceName, string exposedPrefabName, string displayName) { return new DancerPrefabSpec(sourcePath, sourceName, exposedPrefabName, displayName, DescriptionFor(exposedPrefabName), DancerGroup.Sitting); } private static DancerPrefabSpec Laying(string sourcePath, string sourceName, string exposedPrefabName, string displayName) { return new DancerPrefabSpec(sourcePath, sourceName, exposedPrefabName, displayName, DescriptionFor(exposedPrefabName), DancerGroup.Laying); } private static string DescriptionFor(string exposedPrefabName) { return exposedPrefabName switch { "Fehu_DianeDancer" => "Ognistowłosa tancerka Fehu, która wnosi do sali ciepło, rytm i odrobinę niebezpiecznego blasku.", "Fehu_EmilyDancer" => "Złotowłosa ozdoba długiego domu, lekka jak pieśń przy miodzie i jasna jak poranny skarb.", "Fehu_FreyaDancer" => "Runa Moonveil tańczy jak srebrny cień pod księżycem, spokojna i hipnotyczna.", "Fehu_MarthaDancer" => "Thyra Silkstep trzyma rytm z gracją dworskiej artystki i pewnością kogoś, kto zna swoją scenę.", "Fehu_BlondElfDancer" => "Elficka tancerka o jasnych włosach, stworzona do komnat pełnych światła, złota i cichej magii.", "Fehu_RedElfDancer" => "Rudowłosa elfka Fehu, żywa iskra wśród lamp, run i nocnych opowieści.", "Fehu_BrunetteElfDancer" => "Solveig Honeywine porusza się miękko i pewnie, jakby każdy krok był częścią starego rytuału.", "Fehu_BrunetteIdle" => "Ingrid Shadowstep czeka w ciszy, chłodna, elegancka i gotowa do ozdobienia mrocznej sali.", "Fehu_FreyaSitting01" => "Siedząca Runa, spokojna dekoracja do komnat, łaźni i prywatnych zakątków.", "Fehu_FreyaSitting02" => "Druga poza siedzącej Runy, bardziej dworska, idealna przy tronie albo palenisku.", "Fehu_FreyaLaying" => "Leżąca Runa, leniwa ozdoba komnaty odpoczynku, łóżka albo zacisznej alkowy.", _ => "Dekoracyjna tancerka Fehu.", }; } private static void PrepareBuildPiece(GameObject prefab, DancerPrefabSpec spec, Sprite icon) { PrepareBuildPiece(prefab, spec.DisplayName, spec.Description, icon); } private static GameObject CreateDancerPiecePrefab(GameObject source, DancerPrefabSpec spec) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_006b: 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_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) GameObject val = CreateBuildPieceRoot(spec.ExposedPrefabName); val.SetActive(false); GameObject val2 = Object.Instantiate(source); ((Object)val2).name = spec.SourceName + "_Visual"; SanitizeDancerPrefab(val2); val2.transform.SetParent(val.transform, false); val2.transform.localPosition = Vector3.zero; val2.transform.localRotation = Quaternion.identity; Bounds val3 = CalculateRendererBounds(val); if (((Bounds)(ref val3)).size != Vector3.zero) { Vector3 val4 = default(Vector3); ((Vector3)(ref val4))..ctor(((Bounds)(ref val3)).center.x, ((Bounds)(ref val3)).min.y, ((Bounds)(ref val3)).center.z); Transform transform = val2.transform; transform.localPosition -= val4; } return val; } private static GameObject CreateBuildPieceRoot(string prefabName) { //IL_0046: Unknown result type (might be due to invalid IL or missing references) ZNetScene instance = ZNetScene.instance; GameObject val = (((Object)(object)instance != (Object)null) ? instance.GetPrefab("piece_woodpole") : null); if ((Object)(object)val == (Object)null && (Object)(object)instance != (Object)null) { val = instance.GetPrefab("piece_stonefloor2x2"); } GameObject val2 = (GameObject)(((Object)(object)val != (Object)null) ? ((object)Object.Instantiate(val)) : ((object)new GameObject(prefabName))); ((Object)val2).name = prefabName; Transform[] array = ((IEnumerable)val2.transform).Cast().ToArray(); for (int i = 0; i < array.Length; i++) { Object.DestroyImmediate((Object)(object)((Component)array[i]).gameObject); } Renderer[] componentsInChildren = val2.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { Object.DestroyImmediate((Object)(object)componentsInChildren[i]); } Collider[] componentsInChildren2 = val2.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren2.Length; i++) { Object.DestroyImmediate((Object)(object)componentsInChildren2[i]); } Rigidbody[] componentsInChildren3 = val2.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren3.Length; i++) { Object.DestroyImmediate((Object)(object)componentsInChildren3[i]); } return val2; } private static Bounds CalculateRendererBounds(GameObject target) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) Renderer[] componentsInChildren = target.GetComponentsInChildren(true); if (componentsInChildren.Length == 0) { return new Bounds(Vector3.zero, Vector3.zero); } Bounds bounds = componentsInChildren[0].bounds; for (int i = 1; i < componentsInChildren.Length; i++) { ((Bounds)(ref bounds)).Encapsulate(componentsInChildren[i].bounds); } return bounds; } private static void PrepareBuildPiece(GameObject prefab, string displayName, string description, Sprite icon) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) SetLayerRecursive(prefab, LayerMask.NameToLayer("piece")); ZNetView obj = prefab.GetComponent() ?? prefab.AddComponent(); obj.m_persistent = true; obj.m_type = (ObjectType)0; Piece obj2 = prefab.GetComponent() ?? prefab.AddComponent(); obj2.m_name = displayName; obj2.m_description = description; obj2.m_icon = icon; obj2.m_enabled = true; obj2.m_category = (PieceCategory)0; obj2.m_craftingStation = null; obj2.m_resources = Array.Empty(); MakePlacementPermissive(obj2); EnsureRemovalTarget(prefab); RemoveProblematicWearNTear(prefab); } private static void EnsureRemovalTarget(GameObject prefab) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) BoxCollider val = prefab.GetComponent() ?? prefab.AddComponent(); ((Collider)val).isTrigger = false; float num = Mathf.Clamp(_colliderSizeMultiplier?.Value ?? 1f, 0.25f, 4f); Bounds val2 = CalculateRendererBounds(prefab); if (((Bounds)(ref val2)).size == Vector3.zero) { val.center = new Vector3(0f, 1f, 0f); val.size = new Vector3(0.8f, 2f, 0.8f) * num; } else { Vector3 center = prefab.transform.InverseTransformPoint(((Bounds)(ref val2)).center); val.center = center; val.size = new Vector3(Mathf.Max(0.8f, ((Bounds)(ref val2)).size.x + 0.25f), Mathf.Max(0.8f, ((Bounds)(ref val2)).size.y + 0.25f), Mathf.Max(0.8f, ((Bounds)(ref val2)).size.z + 0.25f)) * num; } } private static void SanitizeDancerPrefab(GameObject prefab) { RemoveComponentsByTypeName(prefab, "Character", "Humanoid", "MonsterAI", "BaseAI", "AnimalAI", "Tameable", "Procreation", "Growup", "Ragdoll", "ZSyncAnimation"); Collider[] componentsInChildren = prefab.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { Object.DestroyImmediate((Object)(object)componentsInChildren[i]); } Rigidbody[] componentsInChildren2 = prefab.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren2.Length; i++) { Object.DestroyImmediate((Object)(object)componentsInChildren2[i]); } ZNetView[] componentsInChildren3 = prefab.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren3.Length; i++) { Object.DestroyImmediate((Object)(object)componentsInChildren3[i]); } Piece[] componentsInChildren4 = prefab.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren4.Length; i++) { Object.DestroyImmediate((Object)(object)componentsInChildren4[i]); } WearNTear[] componentsInChildren5 = prefab.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren5.Length; i++) { Object.DestroyImmediate((Object)(object)componentsInChildren5[i]); } } private static void RemoveComponentsByTypeName(GameObject prefab, params string[] typeNames) { HashSet hashSet = new HashSet(typeNames, StringComparer.Ordinal); Component[] componentsInChildren = prefab.GetComponentsInChildren(true); foreach (Component val in componentsInChildren) { if ((Object)(object)val != (Object)null && hashSet.Contains(((object)val).GetType().Name)) { Object.DestroyImmediate((Object)(object)val); } } } private static void SetLayerRecursive(GameObject target, int layer) { if (layer >= 0) { target.layer = layer; Transform[] componentsInChildren = target.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { ((Component)componentsInChildren[i]).gameObject.layer = layer; } } } private static GameObject CreateStructurePrefab(StructurePrefabSpec spec) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: 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_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_01e4: Unknown result type (might be due to invalid IL or missing references) //IL_01f8: Unknown result type (might be due to invalid IL or missing references) //IL_021e: Unknown result type (might be due to invalid IL or missing references) //IL_0223: Unknown result type (might be due to invalid IL or missing references) //IL_0237: Unknown result type (might be due to invalid IL or missing references) //IL_025d: Unknown result type (might be due to invalid IL or missing references) //IL_0262: Unknown result type (might be due to invalid IL or missing references) //IL_0276: Unknown result type (might be due to invalid IL or missing references) //IL_029c: Unknown result type (might be due to invalid IL or missing references) //IL_02a1: Unknown result type (might be due to invalid IL or missing references) //IL_02b5: Unknown result type (might be due to invalid IL or missing references) //IL_02db: Unknown result type (might be due to invalid IL or missing references) //IL_02e0: Unknown result type (might be due to invalid IL or missing references) //IL_02f4: Unknown result type (might be due to invalid IL or missing references) //IL_031a: Unknown result type (might be due to invalid IL or missing references) //IL_031f: Unknown result type (might be due to invalid IL or missing references) //IL_0333: Unknown result type (might be due to invalid IL or missing references) //IL_0359: Unknown result type (might be due to invalid IL or missing references) //IL_035e: Unknown result type (might be due to invalid IL or missing references) //IL_0372: Unknown result type (might be due to invalid IL or missing references) //IL_0398: Unknown result type (might be due to invalid IL or missing references) //IL_039d: Unknown result type (might be due to invalid IL or missing references) //IL_03b1: Unknown result type (might be due to invalid IL or missing references) //IL_03d7: Unknown result type (might be due to invalid IL or missing references) //IL_03dc: Unknown result type (might be due to invalid IL or missing references) //IL_03f0: Unknown result type (might be due to invalid IL or missing references) //IL_0416: Unknown result type (might be due to invalid IL or missing references) //IL_041b: Unknown result type (might be due to invalid IL or missing references) //IL_042f: Unknown result type (might be due to invalid IL or missing references) //IL_0455: Unknown result type (might be due to invalid IL or missing references) //IL_045a: Unknown result type (might be due to invalid IL or missing references) //IL_046e: Unknown result type (might be due to invalid IL or missing references) //IL_0494: Unknown result type (might be due to invalid IL or missing references) //IL_0499: Unknown result type (might be due to invalid IL or missing references) //IL_04ad: Unknown result type (might be due to invalid IL or missing references) //IL_04ce: Unknown result type (might be due to invalid IL or missing references) //IL_04fd: Unknown result type (might be due to invalid IL or missing references) //IL_0502: Unknown result type (might be due to invalid IL or missing references) //IL_0516: Unknown result type (might be due to invalid IL or missing references) //IL_053c: Unknown result type (might be due to invalid IL or missing references) //IL_0541: Unknown result type (might be due to invalid IL or missing references) //IL_0546: Unknown result type (might be due to invalid IL or missing references) //IL_056c: Unknown result type (might be due to invalid IL or missing references) //IL_0571: Unknown result type (might be due to invalid IL or missing references) //IL_0576: Unknown result type (might be due to invalid IL or missing references) //IL_059c: Unknown result type (might be due to invalid IL or missing references) //IL_05b0: Unknown result type (might be due to invalid IL or missing references) //IL_05c4: Unknown result type (might be due to invalid IL or missing references) //IL_05ea: Unknown result type (might be due to invalid IL or missing references) //IL_05ef: Unknown result type (might be due to invalid IL or missing references) //IL_0603: Unknown result type (might be due to invalid IL or missing references) //IL_0629: Unknown result type (might be due to invalid IL or missing references) //IL_062e: Unknown result type (might be due to invalid IL or missing references) //IL_0642: Unknown result type (might be due to invalid IL or missing references) //IL_0663: Unknown result type (might be due to invalid IL or missing references) GameObject val = CreateBuildPieceRoot(spec.PrefabName); val.layer = LayerMask.NameToLayer("piece"); Material material = CreateMaterial("FehuAssets_RuneGold", new Color(1f, 0.62f, 0.08f, 1f)); switch (spec.Kind) { case StructureKind.Sigil: AddPrefabChild(val, "piece_stonefloor2x2", "stone_plinth", new Vector3(0f, 0f, 0f), Vector3.zero, new Vector3(1.15f, 0.35f, 0.85f)); AddPrefabChild(val, "piece_darkwoodpole4", "left_post", new Vector3(-0.62f, 0.95f, -0.08f), Vector3.zero, new Vector3(0.85f, 0.85f, 0.85f)); AddPrefabChild(val, "piece_darkwoodpole4", "right_post", new Vector3(0.62f, 0.95f, -0.08f), Vector3.zero, new Vector3(0.85f, 0.85f, 0.85f)); AddPrefabChild(val, "piece_stonewall1x1", "dark_stone_face", new Vector3(0f, 0.92f, -0.16f), Vector3.zero, new Vector3(0.9f, 0.95f, 0.25f)); AddFehuRuneFromBeams(val, "sigil", new Vector3(0f, 1.02f, -0.36f), 0.78f, material); AddPrefabChild(val, "piece_dvergr_lantern", "low_lantern", new Vector3(0.1f, 0.42f, -0.18f), Vector3.zero, new Vector3(0.55f, 0.55f, 0.55f)); break; case StructureKind.Monument: AddPrefabChild(val, "piece_stonefloor4x4", "main_base", new Vector3(0f, 0f, 0f), Vector3.zero, new Vector3(1f, 0.35f, 0.75f)); AddPrefabChild(val, "piece_stonestair", "stair_1", new Vector3(0f, 0.12f, -1.05f), Vector3.zero, new Vector3(0.95f, 0.8f, 0.95f)); AddPrefabChild(val, "piece_stonestair", "stair_2", new Vector3(0f, 0.34f, -0.75f), Vector3.zero, new Vector3(0.75f, 0.7f, 0.75f)); AddPrefabChild(val, "piece_stonewall2x1", "left_wall", new Vector3(-0.42f, 1.25f, 0.1f), Vector3.zero, new Vector3(0.65f, 1.2f, 0.65f)); AddPrefabChild(val, "piece_stonewall2x1", "right_wall", new Vector3(0.42f, 1.25f, 0.1f), Vector3.zero, new Vector3(0.65f, 1.2f, 0.65f)); AddPrefabChild(val, "piece_stonewall1x1", "cap", new Vector3(0f, 2.35f, 0.1f), Vector3.zero, new Vector3(1.2f, 0.35f, 0.55f)); AddPrefabChild(val, "piece_darkwoodpole4", "left_pillar", new Vector3(-1.15f, 1.4f, 0f), Vector3.zero, new Vector3(0.9f, 0.9f, 0.9f)); AddPrefabChild(val, "piece_darkwoodpole4", "right_pillar", new Vector3(1.15f, 1.4f, 0f), Vector3.zero, new Vector3(0.9f, 0.9f, 0.9f)); AddPrefabChild(val, "piece_banner01", "left_banner", new Vector3(-1.45f, 1.25f, -0.12f), Vector3.zero, new Vector3(0.8f, 0.8f, 0.8f)); AddPrefabChild(val, "piece_banner01", "right_banner", new Vector3(1.45f, 1.25f, -0.12f), Vector3.zero, new Vector3(0.8f, 0.8f, 0.8f)); AddPrefabChild(val, "piece_groundtorch", "left_torch", new Vector3(-0.75f, 0.35f, -0.65f), Vector3.zero, new Vector3(0.8f, 0.8f, 0.8f)); AddPrefabChild(val, "piece_groundtorch", "right_torch", new Vector3(0.75f, 0.35f, -0.65f), Vector3.zero, new Vector3(0.8f, 0.8f, 0.8f)); AddFehuRuneFromBeams(val, "monument", new Vector3(0f, 1.48f, -0.36f), 0.95f, material); break; case StructureKind.Totem: AddPrefabChild(val, "piece_stonefloor2x2", "rock_base", new Vector3(0f, 0f, 0f), Vector3.zero, new Vector3(0.85f, 0.35f, 0.85f)); AddPrefabChild(val, "piece_woodpole2", "core_a", new Vector3(-0.12f, 1.05f, 0f), Vector3.zero, Vector3.one); AddPrefabChild(val, "piece_woodpole2", "core_b", new Vector3(0.12f, 1.05f, 0f), Vector3.zero, Vector3.one); AddPrefabChild(val, "piece_darkwoodbeam", "crossbar", new Vector3(0f, 1.62f, 0f), new Vector3(0f, 90f, 0f), new Vector3(0.95f, 0.95f, 0.95f)); AddPrefabChild(val, "piece_dvergr_lantern", "left_lantern", new Vector3(-0.95f, 1.05f, 0f), Vector3.zero, new Vector3(0.55f, 0.55f, 0.55f)); AddPrefabChild(val, "piece_dvergr_lantern", "right_lantern", new Vector3(0.95f, 1.05f, 0f), Vector3.zero, new Vector3(0.55f, 0.55f, 0.55f)); AddFehuRuneFromBeams(val, "totem", new Vector3(0f, 1.28f, -0.18f), 0.62f, material); break; } return val; } private static void AddFehuRuneFromBeams(GameObject root, string prefix, Vector3 center, float scale, Material? material) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: 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) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0088: 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) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) AddPrefabChild(root, "piece_darkwoodbeam", prefix + "_fehu_stave", center + new Vector3(-0.12f * scale, 0f, 0f), new Vector3(0f, 0f, 90f), new Vector3(0.42f * scale, 0.42f * scale, 0.42f * scale), material); AddPrefabChild(root, "piece_darkwoodbeam", prefix + "_fehu_top_branch", center + new Vector3(0.16f * scale, 0.22f * scale, -0.01f), new Vector3(0f, 0f, 32f), new Vector3(0.36f * scale, 0.36f * scale, 0.36f * scale), material); AddPrefabChild(root, "piece_darkwoodbeam", prefix + "_fehu_mid_branch", center + new Vector3(0.13f * scale, -0.02f * scale, -0.01f), new Vector3(0f, 0f, 32f), new Vector3(0.31f * scale, 0.31f * scale, 0.31f * scale), material); } private static GameObject AddPrefabChild(GameObject parent, string prefabName, string childName, Vector3 localPosition, Vector3 localEuler, Vector3 localScale, Material? material = null) { //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006e: 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_0080: Unknown result type (might be due to invalid IL or missing references) GameObject val = Object.Instantiate(ZNetScene.instance.GetPrefab(prefabName) ?? throw new InvalidOperationException("Vanilla Valheim prefab '" + prefabName + "' was not found.")); ((Object)val).name = childName; StripBuildComponents(val); if ((Object)(object)material != (Object)null) { ApplyMaterial(val, material); } val.transform.SetParent(parent.transform, false); val.transform.localPosition = localPosition; val.transform.localRotation = Quaternion.Euler(localEuler); val.transform.localScale = localScale; SetLayerRecursive(val, parent.layer); return val; } private static void ApplyMaterial(GameObject target, Material material) { Renderer[] componentsInChildren = target.GetComponentsInChildren(true); foreach (Renderer val in componentsInChildren) { Material[] sharedMaterials = val.sharedMaterials; for (int j = 0; j < sharedMaterials.Length; j++) { sharedMaterials[j] = material; } val.sharedMaterials = sharedMaterials; } } private static void StripBuildComponents(GameObject prefab) { ZNetView[] componentsInChildren = prefab.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { Object.DestroyImmediate((Object)(object)componentsInChildren[i]); } Piece[] componentsInChildren2 = prefab.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren2.Length; i++) { Object.DestroyImmediate((Object)(object)componentsInChildren2[i]); } WearNTear[] componentsInChildren3 = prefab.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren3.Length; i++) { Object.DestroyImmediate((Object)(object)componentsInChildren3[i]); } Collider[] componentsInChildren4 = prefab.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren4.Length; i++) { Object.DestroyImmediate((Object)(object)componentsInChildren4[i]); } } private static void AddFehuRune(GameObject parent, Material? main, Material? accent, float width, float height, float z) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) AddBox(parent, "fehu_stave", new Vector3((0f - width) * 0.35f, height * 0.55f, z), new Vector3(0.14f, height, 0.12f), main); AddBox(parent, "fehu_branch_top", new Vector3(width * 0.08f, height * 0.85f, z - 0.01f), new Vector3(width, 0.12f, 0.13f), accent, (Vector3?)new Vector3(0f, 0f, -35f)); AddBox(parent, "fehu_branch_mid", new Vector3(width * 0.05f, height * 0.58f, z - 0.01f), new Vector3(width * 0.82f, 0.12f, 0.13f), accent, (Vector3?)new Vector3(0f, 0f, -35f)); } private static void AddBox(GameObject parent, string name, Vector3 localPosition, Vector3 localScale, Material? material, Vector3? localEuler = null) { //IL_0031: 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_0049: 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_0067: Unknown result type (might be due to invalid IL or missing references) GameObject obj = GameObject.CreatePrimitive((PrimitiveType)3); ((Object)obj).name = name; obj.layer = parent.layer; obj.transform.SetParent(parent.transform, false); obj.transform.localPosition = localPosition; obj.transform.localRotation = Quaternion.Euler((Vector3)(((??)localEuler) ?? Vector3.zero)); obj.transform.localScale = localScale; Renderer component = obj.GetComponent(); if ((Object)(object)material != (Object)null) { component.material = material; } Collider component2 = obj.GetComponent(); if ((Object)(object)component2 != (Object)null) { Object.DestroyImmediate((Object)(object)component2); } } private static Material? CreateMaterial(string name, Color color) { //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Expected O, but got Unknown //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) Shader val = Shader.Find("Legacy Shaders/Diffuse") ?? Shader.Find("Diffuse") ?? Shader.Find("Sprites/Default") ?? Shader.Find("Unlit/Color") ?? Shader.Find("Standard"); if ((Object)(object)val == (Object)null) { return null; } Material val2 = new Material(val) { name = name }; val2.color = color; if (val2.HasProperty("_Color")) { val2.SetColor("_Color", color); } Object.DontDestroyOnLoad((Object)(object)val2); return val2; } private static void MakePlacementPermissive(Piece piece) { Type typeFromHandle = typeof(Piece); SetPieceField(typeFromHandle, piece, "m_groundOnly", value: false); SetPieceField(typeFromHandle, piece, "m_groundPiece", value: false); SetPieceField(typeFromHandle, piece, "m_cultivatedGroundOnly", value: false); SetPieceField(typeFromHandle, piece, "m_waterPiece", value: false); SetPieceField(typeFromHandle, piece, "m_noInWater", value: false); SetPieceField(typeFromHandle, piece, "m_notOnWood", value: false); SetPieceField(typeFromHandle, piece, "m_notOnFloor", value: false); SetPieceField(typeFromHandle, piece, "m_notOnTiltingSurface", value: false); SetPieceField(typeFromHandle, piece, "m_inCeilingOnly", value: false); SetPieceField(typeFromHandle, piece, "m_onlyInTeleportArea", value: false); SetPieceField(typeFromHandle, piece, "m_allowedInDungeons", value: true); SetPieceField(typeFromHandle, piece, "m_canBeRemoved", value: true); SetPieceField(typeFromHandle, piece, "m_clipGround", value: false); SetPieceField(typeFromHandle, piece, "m_clipEverything", value: false); } private static void SetPieceField(Type pieceType, Piece piece, string fieldName, bool value) { FieldInfo field = pieceType.GetField(fieldName, BindingFlags.Instance | BindingFlags.Public); if (field?.FieldType == typeof(bool)) { field.SetValue(piece, value); } } private static void SetBoolField(Type type, object instance, string fieldName, bool value) { FieldInfo field = type.GetField(fieldName, BindingFlags.Instance | BindingFlags.Public); if (field?.FieldType == typeof(bool)) { field.SetValue(instance, value); } } private static void SetFloatField(Type type, object instance, string fieldName, float value) { FieldInfo field = type.GetField(fieldName, BindingFlags.Instance | BindingFlags.Public); if (field?.FieldType == typeof(float)) { field.SetValue(instance, value); } } private static void SetEnumField(Type type, object instance, string fieldName, string value) { FieldInfo field = type.GetField(fieldName, BindingFlags.Instance | BindingFlags.Public); if ((object)field != null && field.FieldType.IsEnum) { field.SetValue(instance, Enum.Parse(field.FieldType, value)); } } private static bool IsGroupEnabled(DancerGroup group) { return group switch { DancerGroup.Standing => _enableStandingDancers?.Value ?? true, DancerGroup.Sitting => _enableSittingDancers?.Value ?? true, DancerGroup.Laying => _enableLayingDancers?.Value ?? true, _ => true, }; } private static int ScaleAmount(int amount) { float num = _recipeCostMultiplier?.Value ?? 1f; return Mathf.Max(0, Mathf.CeilToInt((float)amount * num)); } private static void RemoveProblematicWearNTear(GameObject prefab) { WearNTear[] componentsInChildren = prefab.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { Object.DestroyImmediate((Object)(object)componentsInChildren[i]); } } private static Sprite GetOrCreateIcon(DancerPrefabSpec spec) { if (Icons.TryGetValue(spec.ExposedPrefabName, out Sprite value)) { return value; } Sprite val = LoadEmbeddedIcon(spec) ?? CreateFallbackIcon(spec); Icons[spec.ExposedPrefabName] = val; return val; } private static Sprite? LoadEmbeddedIcon(DancerPrefabSpec spec) { //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0065: 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_0083: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Expected O, but got Unknown //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) string name = "FehuAssets.Resources.Icons." + spec.ExposedPrefabName + ".rgba"; using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name); if (stream == null) { return null; } using MemoryStream memoryStream = new MemoryStream(); stream.CopyTo(memoryStream); byte[] array = memoryStream.ToArray(); if (array.Length != 65536) { return null; } Texture2D val = new Texture2D(128, 128, (TextureFormat)4, false) { name = spec.ExposedPrefabName + "_IconTexture", filterMode = (FilterMode)1, wrapMode = (TextureWrapMode)1 }; val.LoadRawTextureData(array); val.Apply(false, true); Sprite obj = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f), (float)((Texture)val).width); ((Object)obj).name = spec.ExposedPrefabName + "_Icon"; Object.DontDestroyOnLoad((Object)(object)val); Object.DontDestroyOnLoad((Object)(object)obj); return obj; } private static Sprite CreateFallbackIcon(DancerPrefabSpec spec) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: 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_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_007f: 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_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_0382: Unknown result type (might be due to invalid IL or missing references) //IL_0391: Unknown result type (might be due to invalid IL or missing references) //IL_0248: Unknown result type (might be due to invalid IL or missing references) //IL_0245: Unknown result type (might be due to invalid IL or missing references) //IL_024a: Unknown result type (might be due to invalid IL or missing references) //IL_025e: Unknown result type (might be due to invalid IL or missing references) //IL_025f: Unknown result type (might be due to invalid IL or missing references) //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_0274: Unknown result type (might be due to invalid IL or missing references) //IL_02a4: Unknown result type (might be due to invalid IL or missing references) //IL_02a9: Unknown result type (might be due to invalid IL or missing references) //IL_02bf: Unknown result type (might be due to invalid IL or missing references) //IL_02c1: Unknown result type (might be due to invalid IL or missing references) //IL_02e9: Unknown result type (might be due to invalid IL or missing references) //IL_02ee: 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_0305: Unknown result type (might be due to invalid IL or missing references) //IL_032f: Unknown result type (might be due to invalid IL or missing references) //IL_0334: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(128, 128, (TextureFormat)4, false) { name = spec.ExposedPrefabName + "_IconTexture", filterMode = (FilterMode)1, wrapMode = (TextureWrapMode)1 }; Color32 val2 = ColorFromName(spec.ExposedPrefabName); Color32 val3 = HairColorFor(spec.ExposedPrefabName); Color32 val4 = default(Color32); ((Color32)(ref val4))..ctor((byte)(val2.r / 3), (byte)(val2.g / 3), (byte)(val2.b / 3), byte.MaxValue); Color32 val5 = default(Color32); ((Color32)(ref val5))..ctor((byte)Mathf.Min(255, val2.r + 70), (byte)Mathf.Min(255, val2.g + 70), (byte)Mathf.Min(255, val2.b + 70), byte.MaxValue); Color32[] array = (Color32[])(object)new Color32[16384]; for (int i = 0; i < 128; i++) { for (int j = 0; j < 128; j++) { bool flag = j < 5 || i < 5 || j >= 123 || i >= 123; bool num = InEllipse(j, i, 64, 34, 21, 23); bool flag2 = InEllipse(j, i, 64, 29, 28, 22) && !InEllipse(j, i, 64, 43, 18, 14); bool flag3 = j >= 56 && j <= 72 && i >= 52 && i <= 67; bool num2 = InEllipse(j, i, 64, 83, 31, 36); bool num3 = InEllipse(j, i, 64, 98, 38, 25); bool flag4 = i >= 70 && i <= 82 && Mathf.Abs(j - 64) < 18; bool flag5 = Mathf.Abs((float)(j - 39) + (float)(i - 74) * 0.35f) < 6f && i >= 58 && i <= 100; bool flag6 = Mathf.Abs((float)(j - 89) - (float)(i - 74) * 0.35f) < 6f && i >= 58 && i <= 100; bool flag7 = Mathf.Abs(j - 26) + Mathf.Abs(i - 28) < 9 || Mathf.Abs(j - 101) + Mathf.Abs(i - 92) < 8; array[i * 128 + j] = (flag ? val5 : val4); if (num3) { array[i * 128 + j] = val4; } if (num2) { array[i * 128 + j] = val2; } if (flag5 || flag6 || flag3) { array[i * 128 + j] = new Color32((byte)236, (byte)188, (byte)150, byte.MaxValue); } if (flag4) { array[i * 128 + j] = val5; } if (num) { array[i * 128 + j] = new Color32((byte)236, (byte)188, (byte)150, byte.MaxValue); } if (flag2) { array[i * 128 + j] = val3; } if (flag7) { array[i * 128 + j] = new Color32(byte.MaxValue, (byte)236, (byte)154, byte.MaxValue); } } } val.SetPixels32(array); val.Apply(false, true); Sprite obj = Sprite.Create(val, new Rect(0f, 0f, 128f, 128f), new Vector2(0.5f, 0.5f), 128f); ((Object)obj).name = spec.ExposedPrefabName + "_Icon"; Object.DontDestroyOnLoad((Object)(object)val); Object.DontDestroyOnLoad((Object)(object)obj); return obj; } private static Sprite CreateStructureIcon(StructurePrefabSpec spec) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_005e: 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_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_021b: Unknown result type (might be due to invalid IL or missing references) //IL_022a: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(128, 128, (TextureFormat)4, false) { name = spec.PrefabName + "_IconTexture", filterMode = (FilterMode)1, wrapMode = (TextureWrapMode)1 }; Color32 element = ((spec.Kind == StructureKind.Monument) ? new Color32((byte)54, (byte)62, (byte)66, byte.MaxValue) : new Color32((byte)45, (byte)38, (byte)31, byte.MaxValue)); Color32 color = default(Color32); ((Color32)(ref color))..ctor((byte)55, (byte)235, (byte)190, byte.MaxValue); Color32 color2 = default(Color32); ((Color32)(ref color2))..ctor((byte)145, (byte)151, (byte)145, byte.MaxValue); Color32 color3 = default(Color32); ((Color32)(ref color3))..ctor((byte)95, (byte)65, (byte)39, byte.MaxValue); Color32[] array = Enumerable.Repeat(element, 16384).ToArray(); DrawRect(array, 128, 12, 108, 104, 8, color2); switch (spec.Kind) { case StructureKind.Sigil: DrawRect(array, 128, 54, 24, 10, 76, color3); DrawRotatedRect(array, 128, 69, 41, 58, 9, -32f, color); DrawRotatedRect(array, 128, 67, 63, 48, 9, -32f, color); break; case StructureKind.Monument: DrawRect(array, 128, 38, 20, 52, 88, color2); DrawRect(array, 128, 56, 34, 8, 60, color); DrawRotatedRect(array, 128, 72, 48, 43, 7, -32f, color); DrawRotatedRect(array, 128, 70, 66, 35, 7, -32f, color); break; case StructureKind.Totem: DrawRect(array, 128, 59, 24, 10, 82, color3); DrawRotatedRect(array, 128, 70, 45, 55, 9, -22f, color3); DrawRotatedRect(array, 128, 68, 66, 42, 8, -22f, color3); DrawRect(array, 128, 54, 84, 20, 20, color); break; } val.SetPixels32(array); val.Apply(false, true); Sprite obj = Sprite.Create(val, new Rect(0f, 0f, 128f, 128f), new Vector2(0.5f, 0.5f), 128f); ((Object)obj).name = spec.PrefabName + "_Icon"; Object.DontDestroyOnLoad((Object)(object)val); Object.DontDestroyOnLoad((Object)(object)obj); return obj; } private static void DrawRect(Color32[] pixels, int size, int x, int y, int w, int h, Color32 color) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) for (int i = Mathf.Max(0, y); i < Mathf.Min(size, y + h); i++) { for (int j = Mathf.Max(0, x); j < Mathf.Min(size, x + w); j++) { pixels[i * size + j] = color; } } } private static void DrawRotatedRect(Color32[] pixels, int size, int cx, int cy, int w, int h, float degrees, Color32 color) { //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) float num = degrees * ((float)Math.PI / 180f); float num2 = Mathf.Cos(num); float num3 = Mathf.Sin(num); int num4 = Mathf.CeilToInt((float)Mathf.Max(w, h) * 0.75f); for (int i = Mathf.Max(0, cy - num4); i < Mathf.Min(size, cy + num4); i++) { for (int j = Mathf.Max(0, cx - num4); j < Mathf.Min(size, cx + num4); j++) { float num5 = j - cx; float num6 = i - cy; float num7 = num5 * num2 + num6 * num3; float num8 = (0f - num5) * num3 + num6 * num2; if (Mathf.Abs(num7) <= (float)w * 0.5f && Mathf.Abs(num8) <= (float)h * 0.5f) { pixels[i * size + j] = color; } } } } private static bool InEllipse(int x, int y, int cx, int cy, int rx, int ry) { float num = (float)(x - cx) / (float)rx; float num2 = (float)(y - cy) / (float)ry; return num * num + num2 * num2 <= 1f; } private static Color32 HairColorFor(string prefabName) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) if (prefabName.Contains("Blond") || prefabName.Contains("Emily")) { return new Color32((byte)238, (byte)194, (byte)83, byte.MaxValue); } if (prefabName.Contains("Red") || prefabName.Contains("Diane") || prefabName.Contains("Freya")) { return new Color32((byte)165, (byte)62, (byte)42, byte.MaxValue); } if (prefabName.Contains("Brunette") || prefabName.Contains("Martha")) { return new Color32((byte)78, (byte)45, (byte)33, byte.MaxValue); } return new Color32((byte)170, (byte)148, (byte)118, byte.MaxValue); } private static Color32 ColorFromName(string name) { //IL_004f: Unknown result type (might be due to invalid IL or missing references) uint num = 2166136261u; foreach (char c in name) { num ^= c; num *= 16777619; } return new Color32((byte)(90 + (num & 0x7F)), (byte)(70 + ((num >> 8) & 0x7F)), (byte)(80 + ((num >> 16) & 0x7F)), byte.MaxValue); } private static Transform? FindDeepChild(Transform parent, string name) { for (int i = 0; i < parent.childCount; i++) { Transform child = parent.GetChild(i); if (((Object)child).name == name) { return child; } Transform val = FindDeepChild(child, name); if ((Object)(object)val != (Object)null) { return val; } } return null; } private void RegisterWithJotunn(GameObject prefab, DancerPrefabSpec spec, Sprite icon) { RequirementConfig[] requirements = (from requirement in ((IEnumerable)GetRequirements(spec.Group)).Select((Func)((RequirementSpec requirement) => new RequirementConfig(requirement.Item, ScaleAmount(requirement.Amount), 0, _recoverResources?.Value ?? requirement.Recover))) where !string.IsNullOrWhiteSpace(requirement.Item) && requirement.Amount > 0 select requirement).ToArray(); RegisterWithJotunn(prefab, spec.DisplayName, spec.Description, requirements, icon); } private void RegisterWithJotunn(GameObject prefab, string displayName, string description, RequirementSpec[] requirementSpecs, Sprite icon) { RequirementConfig[] requirements = (from requirement in ((IEnumerable)requirementSpecs).Select((Func)((RequirementSpec requirement) => new RequirementConfig(requirement.Item, ScaleAmount(requirement.Amount), 0, _recoverResources?.Value ?? requirement.Recover))) where !string.IsNullOrWhiteSpace(requirement.Item) && requirement.Amount > 0 select requirement).ToArray(); RegisterWithJotunn(prefab, displayName, description, requirements, icon); } private void RegisterWithJotunn(GameObject prefab, string displayName, string description, RequirementConfig[] requirements, Sprite icon) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Expected O, but got Unknown //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Expected O, but got Unknown if (requirements.Length > 4) { requirements = requirements.Take(4).ToArray(); } PieceConfig val = new PieceConfig { Name = displayName, Description = description, Enabled = true, PieceTable = CleanConfigString(_pieceTable, "Hammer"), Category = CleanConfigString(_pieceCategory, "Fehu"), CraftingStation = CleanConfigString(_requiredCraftingStation, string.Empty), Icon = icon, Requirements = requirements }; CustomPiece val2 = new CustomPiece(prefab, true, val) { PieceTable = val.PieceTable, Category = val.Category }; PieceManager.Instance.AddPiece(val2); Log.LogInfo((object)("Prepared recipe for '" + displayName + "': " + string.Join(", ", requirements.Select((RequirementConfig requirement) => $"{requirement.Item} x{requirement.Amount}")))); } private void EnsurePieceCategory() { string text = CleanConfigString(_pieceTable, "Hammer"); string text2 = CleanConfigString(_pieceCategory, "Fehu"); object instance = PieceManager.Instance; foreach (MethodInfo item in from method in instance.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public) where method.Name == "AddPieceCategory" select method) { ParameterInfo[] parameters = item.GetParameters(); try { if (parameters.Length == 2 && parameters[0].ParameterType == typeof(string) && parameters[1].ParameterType == typeof(string)) { item.Invoke(instance, new object[2] { text, text2 }); Log.LogInfo((object)("Ensured Fehu hammer category '" + text2 + "' in table '" + text + "'.")); return; } if (parameters.Length == 1 && parameters[0].ParameterType == typeof(string)) { item.Invoke(instance, new object[1] { text2 }); Log.LogInfo((object)("Ensured Fehu hammer category '" + text2 + "'.")); return; } } catch (Exception ex) { Log.LogWarning((object)("Could not add Fehu category using " + item.Name + ": " + ex.Message)); } } Log.LogWarning((object)("Could not find Jotunn AddPieceCategory overload. Fehu pieces will fall back to category '" + text2 + "' only.")); } private static RequirementSpec[] GetRequirements(DancerGroup group) { return group switch { DancerGroup.Standing => new RequirementSpec[4] { Requirement(_standingItem1, _standingItem1Amount), Requirement(_standingItem2, _standingItem2Amount), Requirement(_standingItem3, _standingItem3Amount), Requirement(_standingItem4, _standingItem4Amount) }, DancerGroup.Sitting => new RequirementSpec[4] { Requirement(_sittingItem1, _sittingItem1Amount), Requirement(_sittingItem2, _sittingItem2Amount), Requirement(_sittingItem3, _sittingItem3Amount), Requirement(_sittingItem4, _sittingItem4Amount) }, DancerGroup.Laying => new RequirementSpec[4] { Requirement(_layingItem1, _layingItem1Amount), Requirement(_layingItem2, _layingItem2Amount), Requirement(_layingItem3, _layingItem3Amount), Requirement(_layingItem4, _layingItem4Amount) }, _ => Array.Empty(), }; } private static RequirementSpec Requirement(ConfigEntry? item, ConfigEntry? amount) { return new RequirementSpec(CleanConfigString(item, string.Empty), amount?.Value ?? 0, recover: true); } private static string CleanConfigString(ConfigEntry? entry, string fallback) { string text = entry?.Value?.Trim() ?? string.Empty; if (!string.IsNullOrWhiteSpace(text)) { return text; } return fallback; } } }