Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of balrond furniture reborn v1.2.5
plugins/BalrondFurnitureReborn.dll
Decompiled 2 weeks ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Logging; using HarmonyLib; using LitJson2; using UnityEngine; using UnityEngine.Audio; using YourModNamespace; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("BalrondFurnitureReborn")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("BalrondFurnitureReborn")] [assembly: AssemblyCopyright("Copyright © 2022")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("cde312a0-cf19-4264-8616-e1c74774beed")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace YourModNamespace { public class RingingBell : MonoBehaviour, Hoverable, Interactable { public string m_name = "Bell"; public float m_cooldown = 2f; public bool m_checkGuardStone = true; public Animator m_animator; public string m_triggerName = "ring"; public string m_ringClipName = "bell_ring"; public float m_soundEventTime = 0.12f; public EffectList m_ringEffects = new EffectList(); private ZNetView m_nview; private Piece m_piece; private int m_triggerHash; private static readonly int s_lastRingHash = "last_ring_time".GetHashCode(); private bool m_eventInjected; private void Awake() { m_nview = ((Component)this).GetComponent<ZNetView>(); if ((Object)(object)m_animator == (Object)null) { m_animator = ((Component)this).GetComponent<Animator>(); } if ((Object)(object)m_piece == (Object)null) { m_piece = ((Component)this).GetComponent<Piece>(); if ((Object)(object)m_piece != (Object)null) { m_name = m_piece.m_name; } } m_triggerHash = Animator.StringToHash(m_triggerName); InjectAnimationEvent(); if ((Object)(object)m_nview != (Object)null && m_nview.GetZDO() != null) { m_nview.Register("RPC_RingBell", (Action<long>)RPC_RingBell); } } private void InjectAnimationEvent() { //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Expected O, but got Unknown if (m_eventInjected || (Object)(object)m_animator == (Object)null || (Object)(object)m_animator.runtimeAnimatorController == (Object)null) { return; } AnimationClip val = null; AnimationClip[] animationClips = m_animator.runtimeAnimatorController.animationClips; for (int i = 0; i < animationClips.Length; i++) { if ((Object)(object)animationClips[i] != (Object)null && string.Equals(((Object)animationClips[i]).name, m_ringClipName, StringComparison.OrdinalIgnoreCase)) { val = animationClips[i]; break; } } if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("[RingingBell] Could not find animation clip: " + m_ringClipName)); return; } AnimationEvent[] events = val.events; for (int j = 0; j < events.Length; j++) { if (events[j] != null && events[j].functionName == "PlayBellSound") { m_eventInjected = true; return; } } AnimationEvent val2 = new AnimationEvent(); val2.time = m_soundEventTime; val2.functionName = "PlayBellSound"; val.AddEvent(val2); m_eventInjected = true; } public void PlayBellSound() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) m_ringEffects.Create(((Component)this).transform.position, ((Component)this).transform.rotation, (Transform)null, 1f, -1); } public string GetHoverName() { return m_name; } public string GetHoverText() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer == (Object)null) { return Localization.instance.Localize(m_name); } if (m_checkGuardStone && !PrivateArea.CheckAccess(((Component)this).transform.position, 0f, false, false)) { return Localization.instance.Localize(m_name + "\n$piece_noaccess"); } return Localization.instance.Localize(m_name + "\n[<color=yellow><b>$KEY_Use</b></color>] $piece_use"); } public bool Interact(Humanoid user, bool hold, bool alt) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) if (hold || (Object)(object)user == (Object)null || (Object)(object)user != (Object)(object)Player.m_localPlayer) { return false; } if (m_checkGuardStone && !PrivateArea.CheckAccess(((Component)this).transform.position, 0f, true, false)) { return true; } if (OnCooldown()) { return false; } if ((Object)(object)m_nview != (Object)null && m_nview.IsValid()) { m_nview.InvokeRPC("RPC_RingBell", Array.Empty<object>()); } else { TriggerRing(); } return true; } public bool UseItem(Humanoid user, ItemData item) { return false; } private void RPC_RingBell(long sender) { if ((Object)(object)m_nview != (Object)null && m_nview.GetZDO() != null && (Object)(object)ZNet.instance != (Object)null) { long ticks = ZNet.instance.GetTime().Ticks; long @long = m_nview.GetZDO().GetLong(s_lastRingHash, 0L); if ((double)(ticks - @long) / 10000000.0 < (double)m_cooldown) { return; } m_nview.GetZDO().Set(s_lastRingHash, ticks); } TriggerRing(); } private void TriggerRing() { if ((Object)(object)m_animator != (Object)null) { m_animator.ResetTrigger(m_triggerHash); m_animator.SetTrigger(m_triggerHash); } } private bool OnCooldown() { if ((Object)(object)m_nview == (Object)null || m_nview.GetZDO() == null || (Object)(object)ZNet.instance == (Object)null) { return false; } long @long = m_nview.GetZDO().GetLong(s_lastRingHash, 0L); if (@long == 0) { return false; } return (double)(ZNet.instance.GetTime().Ticks - @long) / 10000000.0 < (double)m_cooldown; } } } namespace BalrondFurnitureReborn { public class BalrondPlanter : MonoBehaviour, Interactable, Hoverable { private const string ZDO_FlowerKey = "BalrondPlanterName"; private const string UseItemText = "$tag_plantherbseed_bal"; public EffectList m_openEffects = new EffectList(); public EffectList m_closeEffects = new EffectList(); public bool m_checkGuardStone = true; public string m_name = "$tag_plantherb_bal"; public GameObject m_toggle; private Dictionary<string, GameObject> m_flowerObjects; private ZNetView m_nview; private string currentFlowerName = string.Empty; private static readonly string[] flowerList = new string[30] { "Carrot", "CarrotSeeds", "Onion", "OnionSeeds", "Snowleaf_bal", "Moss_bal", "Cabbage_bal", "CabbageSeeds_bal", "CabbageLeaf_bal", "Yarrow_bal", "Plantain_bal", "Lavender_bal", "Sage_bal", "Dandelion", "Thistle", "EnrichedSoil_bal", "Mint_bal", "Garlic", "GarlicSeeds_bal", "Apple", "AppleSeeds", "AcaiSeeds_bal", "CypressSeeds_bal", "PoplarSeeds_bal", "YggTreeSeed_bal", "StrawSeeds_bal", "Straw_bal", "SwampTreeSeeds_bal", "WillowSeeds_bal", "BirchSeeds" }; private void Awake() { m_nview = ((Component)this).GetComponent<ZNetView>(); if (!((Object)(object)m_nview == (Object)null) && m_nview.IsValid()) { if ((Object)(object)m_toggle == (Object)null) { ZLog.LogWarning((object)("BalrondPlanter: Missing m_toggle object on " + ((Object)((Component)this).gameObject).name)); return; } m_nview.Register<string>("RequestTogglePlant", (Action<long, string>)RPC_RequestTogglePlant); m_name = ((Component)this).GetComponent<Piece>().m_name; currentFlowerName = m_nview.GetZDO().GetString("BalrondPlanterName", string.Empty); CacheFlowerObjects(); ((MonoBehaviour)this).InvokeRepeating("UpdateUseVisual", 0f, 5f); } } private void CacheFlowerObjects() { m_flowerObjects = new Dictionary<string, GameObject>(StringComparer.Ordinal); string[] array = flowerList; foreach (string text in array) { Transform val = m_toggle.transform.Find(text); if ((Object)(object)val != (Object)null) { m_flowerObjects[text] = ((Component)val).gameObject; ((Component)val).gameObject.SetActive(false); } } } private void RPC_RequestTogglePlant(long sender, string plantName) { ZLog.Log((object)$"BalrondPlanter: RPC_RequestTogglePlant by {sender}, plant={plantName}"); if (!m_nview.IsOwner()) { ZLog.Log((object)"RPC_RequestTogglePlant: Not owner, aborting."); return; } if (!HasAccess()) { ZLog.Log((object)"RPC_RequestTogglePlant: No access."); return; } m_nview.GetZDO().SetOwner(sender); SetToggle(plantName); } public void SetToggle(string plantName) { if (m_nview.IsOwner()) { currentFlowerName = plantName ?? string.Empty; m_nview.GetZDO().Set("BalrondPlanterName", currentFlowerName); UpdateUseVisual(); } } private bool HasAccess() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) return !m_checkGuardStone || PrivateArea.CheckAccess(((Component)this).transform.position, 0f, true, false); } private void UpdateUseVisual() { foreach (KeyValuePair<string, GameObject> flowerObject in m_flowerObjects) { flowerObject.Value.SetActive(flowerObject.Key == currentFlowerName); } } private string L(string key) { return (Localization.instance != null) ? Localization.instance.Localize(key) : key; } private string GetLocalizedPlantName(string prefabName) { if (string.IsNullOrEmpty(prefabName)) { return string.Empty; } GameObject val = (((Object)(object)ObjectDB.instance != (Object)null) ? ObjectDB.instance.GetItemPrefab(prefabName) : null); if ((Object)(object)val == (Object)null) { return prefabName; } ItemDrop component = val.GetComponent<ItemDrop>(); if ((Object)(object)component == (Object)null || component.m_itemData == null || component.m_itemData.m_shared == null) { return prefabName; } string name = component.m_itemData.m_shared.m_name; return string.IsNullOrEmpty(name) ? prefabName : L(name); } public string GetHoverText() { if (!m_nview.IsValid()) { return string.Empty; } string text = L(m_name); if (!HasAccess()) { return text + "\n" + L("$piece_noaccess"); } string text2 = L("$tag_plantherbseed_bal"); string text3 = L("$tag_currentflower_bal"); string text4 = L("$tag_clearplanter_bal"); string value = L("$tag_nothingplanted_bal"); string text5 = L("$KEY_Use"); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine(text); stringBuilder.AppendLine("[<color=yellow><b>1-8</b></color>] " + text2); if (!string.IsNullOrEmpty(currentFlowerName) && currentFlowerName != "EnrichedSoil_bal") { stringBuilder.AppendLine("[" + text3 + "] " + GetLocalizedPlantName(currentFlowerName)); stringBuilder.AppendLine("[<color=yellow><b>" + text5 + "</b></color>] " + text4); } else { stringBuilder.AppendLine(value); } return stringBuilder.ToString(); } public string GetHoverName() { return L(m_name); } public bool Interact(Humanoid character, bool hold, bool alt) { if (hold) { return false; } if (!HasAccess()) { return true; } if (string.IsNullOrEmpty(currentFlowerName) || currentFlowerName == "EnrichedSoil_bal") { ((Character)character).Message((MessageType)2, L("$tag_nothingtoclear_bal"), 0, (Sprite)null); return true; } ((Character)character).Message((MessageType)2, L("$tag_plantedcleared_bal"), 0, (Sprite)null); m_nview.InvokeRPC("RequestTogglePlant", new object[1] { "EnrichedSoil_bal" }); return true; } public bool UseItem(Humanoid user, ItemData item) { if (!HasAccess()) { return true; } if (item == null || (Object)(object)item.m_dropPrefab == (Object)null) { return false; } if (flowerList.Contains(((Object)item.m_dropPrefab).name)) { string text = L("$tag_planted_bal"); string text2 = ((item.m_shared != null) ? L(item.m_shared.m_name) : ((Object)item.m_dropPrefab).name); ((Character)user).Message((MessageType)2, text + ": " + text2, 0, (Sprite)null); m_nview.InvokeRPC("RequestTogglePlant", new object[1] { ((Object)item.m_dropPrefab).name }); return true; } ((Character)user).Message((MessageType)2, L("$msg_wrongitem"), 0, (Sprite)null); return false; } } public class BalrondToggle : MonoBehaviour, Interactable, Hoverable { public EffectList m_openEffects = new EffectList(); public EffectList m_closeEffects = new EffectList(); public bool isActive = false; public bool m_checkGuardStone = true; public string m_name = "toggle shelfs"; public GameObject m_toggle; private ZNetView m_nview; private void Awake() { m_nview = ((Component)this).GetComponent<ZNetView>(); if (m_nview.GetZDO() == null) { return; } if ((Object)(object)m_toggle == (Object)null) { ZLog.Log((object)("Missing Toggle object: " + ((Object)((Component)this).gameObject).name)); return; } if (Object.op_Implicit((Object)(object)m_nview) && (Object)(object)m_toggle != (Object)null) { m_nview.Register<long>("RequestToggle", (Action<long, long>)RPC_RequestToggle); } ((MonoBehaviour)this).InvokeRepeating("UpdateUseVisual", 0f, 1f); } private void RPC_RequestToggle(long uid, long playerID) { //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) ZLog.Log((object)("Player " + uid + " wants to toggle " + ((Object)((Component)this).gameObject).name + " im: " + ZDOMan.GetSessionID())); if (!m_nview.IsOwner()) { ZLog.Log((object)" but im not the owner"); return; } if (m_checkGuardStone && !PrivateArea.CheckAccess(((Component)this).transform.position, 0f, false, false)) { ZLog.Log((object)" not yours"); return; } ZDOMan.instance.ForceSendZDO(uid, m_nview.GetZDO().m_uid); m_nview.GetZDO().SetOwner(uid); SetToggle(!isActive); } public void SetToggle(bool inUse) { //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) if (m_nview.IsOwner() && isActive != inUse) { isActive = inUse; UpdateUseVisual(); if (inUse) { m_openEffects.Create(((Component)this).transform.position, ((Component)this).transform.rotation, (Transform)null, 1f, -1); } else { m_closeEffects.Create(((Component)this).transform.position, ((Component)this).transform.rotation, (Transform)null, 1f, -1); } } } private void UpdateUseVisual() { bool active; if (m_nview.IsOwner()) { active = isActive; m_nview.GetZDO().Set(ZDOVars.s_inUse, isActive ? 1 : 0, false); } else { active = m_nview.GetZDO().GetInt(ZDOVars.s_inUse, 0) == 1; } m_toggle.SetActive(active); } public string GetHoverText() { //IL_0029: Unknown result type (might be due to invalid IL or missing references) if (!m_nview.IsValid()) { return ""; } if (m_checkGuardStone && !PrivateArea.CheckAccess(((Component)this).transform.position, 0f, false, false)) { return Localization.instance.Localize(m_name + "\n$piece_noaccess"); } return Localization.instance.Localize("Shelfs\n[<color=yellow><b>$KEY_Use</b></color>] " + m_name); } public string GetHoverName() { return m_name; } public bool Interact(Humanoid character, bool hold, bool alt) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) if (hold) { return false; } if (m_checkGuardStone && !PrivateArea.CheckAccess(((Component)this).transform.position, 0f, true, false)) { return true; } long playerID = Game.instance.GetPlayerProfile().GetPlayerID(); m_nview.InvokeRPC("RequestToggle", new object[1] { playerID }); return true; } public bool UseItem(Humanoid user, ItemData item) { return false; } } public class BalrondTranslator { public static Dictionary<string, Dictionary<string, string>> translations = new Dictionary<string, Dictionary<string, string>>(); public static Dictionary<string, string> getLanguage(string language) { Dictionary<string, string> result = null; try { result = translations[language]; } catch (Exception) { } return result; } } internal class BuildPieceList { public static string[] buildPieces = new string[146] { "core_wood_bed_bal", "piece_bed03_bal", "bed_noble_bal", "black_carpet_end_bal", "black_carpet_mid_bal", "elegant_carpet_bal", "linen_carpet_bal", "rug_balrond_bal", "rug_fenring_bal", "rug_fox_bal", "rug_habrok_bal", "rug_leatherscrap_bal", "rug_neck_bal", "rug_troll_bal", "rug_vigvisir_bal", "torn_carpet_bal", "clutter_bookset1_bal", "clutter_bookset2_bal", "clutter_bookset3_bal", "clutter_bottleset_bal", "clutter_clothset1_bal", "clutter_clothset2_bal", "clutter_cupset_bal", "clutter_cupset2_bal", "clutter_deskknife_bal", "clutter_ropepile_bal", "clutter_tableset_bal", "dvergr_bed_bal", "dvergr_cabinet_bal", "dvergr_cabinet_high_bal", "dvergr_cabinet_small_bal", "dvergr_cabinet_small_drawer_bal", "dvergr_cabinet_small_wall_bal", "dvergr_cabinet_wall_bal", "dvergr_chair_bal", "dvergr_chest_bal", "dvergr_shelf_bal", "dvergr_shelf_high_bal", "dvergr_shelf_wall_bal", "dvergr_shelf_wall_small_bal", "dvergr_stool_bal", "dvergr_table_bal", "hildir_table_bal", "piece_cartographytable_small_bal", "piece_table_drakkar_bal", "piece_table_round_noble_bal", "piece_table_round_small_bal", "corewood_stool_bal", "piece_darkwood_bench_bal", "piece_elegant_bench2_bal", "piece_emberwood_stool_bal", "piece_emberwoodchair_bal", "piece_sofa_bal", "piece_sofa_reverse_bal", "piece_elegant_bench_bal", "gabro_fireplace_bal", "Hearth_1x3_bal", "Hearth_2x2_bal", "Hearth_2x3_bal", "piece_ashwood_echandelier_bal", "piece_brazier_green_bal", "piece_brazierceiling_blue_bal", "piece_brazierceiling_green_bal", "piece_braziercolumn_bal", "piece_brazierstone_bal", "piece_candlechandelier_bal", "piece_crystal_walltorch_bal", "piece_crystalchandelier_bal", "piece_lantern_ceiling_bal", "runefire_bal", "charred_chest_bal", "corewood_crate_bal", "hardwood_crate_bal", "piece_chest_bronze_bal", "piece_chest_jewelbox_bal", "piece_chest_private_bal", "piece_chest_stone_bal", "piece_clamChest_bal", "piece_clamChestSmall_bal", "wood_shelf_wall_bal", "bookcabinet_bal", "scarecrow_bal", "wallrulescroll_bal", "flowergirland4m_bal", "HangingJute_bal", "HangingMedalions_bal", "piece_banner10_bal", "piece_banner11_bal", "piece_banner12_bal", "piece_banner13_bal", "piece_banner_balrond_bal", "piece_banner_black1_bal", "piece_banner_black2_bal", "piece_banner_black3_bal", "piece_banner_black4_bal", "piece_banner_metal1_bal", "piece_banner_metal1_long_bal", "piece_banner_metal2_bal", "piece_banner_metal2_long_bal", "piece_banner_metal3_bal", "piece_banner_metal3_long_bal", "piece_banner_metal4_bal", "piece_banner_metal4_long_bal", "piece_bannerLong_bal", "piece_curtain_big_bal", "piece_curtain_side_bal", "piece_flagBalrond_bal", "piece_flagDark_bal", "piece_flagRed_bal", "piece_flagStyle1_bal", "piece_flagTorn_bal", "blackmarble_runestone1_bal", "blackmarble_sarcophagus_bal", "bone_pile_bal", "BustStand_bal", "piece_bell_brass_bal", "piece_bell_iron_bal", "piece_chicken_nest_bal", "piece_deco_planter1x1_bal", "piece_mosscrown_bal", "side_wall_decor_bal", "simple_brasschain_bal", "simple_ironchain_bal", "StatueEagle_bal", "StatueFace_bal", "StatueOdin_bal", "StatueRaven_bal", "StatueThor_bal", "StatueWolf_bal", "StatueWood_bal", "stone_wolf_head_floor_bal", "stone_wolf_head_wall_bal", "WeaponDecor01_bal", "ground_spike_trap_bal", "herb_ladder_bal", "hook_itemstand_bal", "itemstand26_inner_bal", "itemstand26_outer_bal", "itemstand45_inner_bal", "itemstand45_outer_bal", "ladder_wood_2m_bal", "ladder_wood_4m_bal", "rostrum_itemstand_bal", "tabelcloth1_bal", "wagon_static_bal", "tombstone_bal" }; } public class BalrondWindControler : MonoBehaviour { public bool m_windDirection = false; public bool m_northdirection = false; public bool m_ = false; private float m_cover; public AudioSource[] m_sfxLoops; public float m_bomRotationSpeed = 200f; public float m_propellerRotationSpeed = -600f; public float m_minWindSpeed = 0.1f; public float m_minPitch = 1f; public float m_maxPitch = 1.5f; public float m_maxPitchVel = 1f; public float m_maxVol = 0.01f; public float m_maxVolVel = 0.5f; public float m_audioChangeSpeed = 2f; public Transform m_bom; public Transform m_kompas; public Transform m_propeller; private float m_propAngle; private Quaternion currentRotation = default(Quaternion); private void Start() { ((MonoBehaviour)this).InvokeRepeating("CheckCover", 0.1f, 5f); } private void Update() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: 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_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: 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_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: 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_008e: 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_0095: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: 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_00af: 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_0125: 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_0118: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) float powerOutput = GetPowerOutput(); Vector3 val = EnvMan.instance.GetWindDir(); if ((Object)(object)m_propeller != (Object)null) { val = -EnvMan.instance.GetWindDir(); } if ((Object)(object)m_bom != (Object)null) { Quaternion val2 = Quaternion.LookRotation(val); m_bom.rotation = Quaternion.RotateTowards(m_bom.rotation, val2, m_bomRotationSpeed * powerOutput * Time.deltaTime); } if ((Object)(object)m_kompas != (Object)null) { Vector3 forward = Vector3.forward; Quaternion val3 = Quaternion.LookRotation(forward, Vector3.up); m_kompas.rotation = Quaternion.RotateTowards(m_kompas.rotation, val3, m_bomRotationSpeed * powerOutput * Time.deltaTime); } if ((Object)(object)m_propeller != (Object)null) { float num = powerOutput * m_propellerRotationSpeed; m_propAngle += num * Time.deltaTime; m_propeller.localRotation = Quaternion.Euler(0f, 0f, m_propAngle); } if (Quaternion.Angle(currentRotation, m_bom.rotation) >= 0.1f) { UpdateAudio(Time.deltaTime); currentRotation = m_bom.rotation; } } public float GetPowerOutput() { return (1f - m_cover) * Utils.LerpStep(m_minWindSpeed, 1f, EnvMan.instance.GetWindIntensity()); } private void CheckCover() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) bool flag = default(bool); Cover.GetCoverForPoint(((Component)m_bom).transform.position, ref m_cover, ref flag, 0.5f); } private void UpdateAudio(float dt) { float powerOutput = GetPowerOutput(); float num = Mathf.Lerp(m_minPitch, m_maxPitch, Mathf.Clamp01(powerOutput / m_maxPitchVel)); float num2 = m_maxVol * Mathf.Clamp01(powerOutput / m_maxVolVel); AudioSource[] sfxLoops = m_sfxLoops; foreach (AudioSource val in sfxLoops) { val.volume = Mathf.MoveTowards(val.volume, num2, m_audioChangeSpeed * dt); val.pitch = Mathf.MoveTowards(val.pitch, num, m_audioChangeSpeed * dt); } } } public class DatabaseAddMethods { public void AddItems(List<GameObject> items) { foreach (GameObject item in items) { AddItem(item); } } public void AddRecipes(List<Recipe> recipes) { foreach (Recipe recipe in recipes) { AddRecipe(recipe); } } public void AddStatuseffects(List<StatusEffect> statusEffects) { foreach (StatusEffect statusEffect in statusEffects) { AddStatus(statusEffect); } } private bool IsObjectDBValid() { return (Object)(object)ObjectDB.instance != (Object)null && ObjectDB.instance.m_items.Count != 0 && ObjectDB.instance.m_recipes.Count != 0 && (Object)(object)ObjectDB.instance.GetItemPrefab("Amber") != (Object)null; } private void AddStatus(StatusEffect status) { if (!IsObjectDBValid()) { return; } if ((Object)(object)status != (Object)null) { if ((Object)(object)ObjectDB.instance.GetStatusEffect(status.m_nameHash) == (Object)null) { ObjectDB.instance.m_StatusEffects.Add(status); } else { Debug.Log((object)(Launch.projectName + ": " + ((Object)status).name + " - Status already in the game")); } } else { Debug.LogError((object)(Launch.projectName + ": " + ((Object)status).name + " - Status not found")); } } private void AddRecipe(Recipe recipe) { if (!IsObjectDBValid()) { return; } if ((Object)(object)recipe != (Object)null) { if ((Object)(object)ObjectDB.instance.m_recipes.Find((Recipe x) => ((Object)x).name == ((Object)recipe).name) == (Object)null) { if ((Object)(object)recipe.m_item != (Object)null) { ObjectDB.instance.m_recipes.Add(recipe); } } else { Debug.Log((object)(Launch.projectName + ": " + ((Object)recipe).name + " - Recipe with this name already in the Game")); } } else { Debug.LogError((object)(Launch.projectName + ": " + ((Object)recipe).name + " - Recipe not found")); } } private void AddItem(GameObject newPrefab) { if (!IsObjectDBValid()) { return; } ItemDrop component = newPrefab.GetComponent<ItemDrop>(); if ((Object)(object)component != (Object)null) { if ((Object)(object)ObjectDB.instance.GetItemPrefab(((Object)newPrefab).name) == (Object)null) { ObjectDB.instance.m_items.Add(newPrefab); Dictionary<int, GameObject> dictionary = (Dictionary<int, GameObject>)typeof(ObjectDB).GetField("m_itemByHash", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(ObjectDB.instance); dictionary[((Object)newPrefab).name.GetHashCode()] = newPrefab; } else { Debug.LogWarning((object)(Launch.projectName + ": " + ((Object)newPrefab).name + " - ItemDrop already exist")); } } else { Debug.LogError((object)(Launch.projectName + ": " + ((Object)newPrefab).name + " - ItemDrop not found on prefab")); } } } public class ModResourceLoader { public AssetBundle assetBundle; public List<GameObject> buildPrefabs = new List<GameObject>(); public List<GameObject> plantPrefabs = new List<GameObject>(); public List<GameObject> itemPrefabs = new List<GameObject>(); public List<GameObject> monsterPrefabs = new List<GameObject>(); public List<GameObject> vegetationPrefabs = new List<GameObject>(); public List<GameObject> clutterPrefabs = new List<GameObject>(); public List<GameObject> locationPrefabs = new List<GameObject>(); public List<GameObject> roomPrefabs = new List<GameObject>(); public List<GameObject> vfxPrefabs = new List<GameObject>(); public List<Recipe> recipes = new List<Recipe>(); public List<StatusEffect> statusEffects = new List<StatusEffect>(); public StatusEffect newBarleyStatus = null; public ShaderReplacment shaderReplacment = new ShaderReplacment(); public Sprite newLogo = null; public void loadAssets() { assetBundle = GetAssetBundleFromResources("furniturereborn_bal"); string basePath = "Assets/Custom/BalrondFurniture/"; loadPieces(basePath); loadOther(basePath); } public void AddPrefabsToZnetScene(ZNetScene zNetScene) { zNetScene.m_prefabs.AddRange(vegetationPrefabs); foreach (GameObject gm2 in buildPrefabs) { GameObject val = zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == ((Object)gm2).name); if ((Object)(object)val == (Object)null) { zNetScene.m_prefabs.Add(gm2); } } foreach (GameObject gm3 in vfxPrefabs) { GameObject val2 = zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == ((Object)gm3).name); if ((Object)(object)val2 == (Object)null) { zNetScene.m_prefabs.Add(gm3); } } zNetScene.m_prefabs.RemoveAll((GameObject x) => (Object)(object)x == (Object)null); addPlantstoCultivator(zNetScene); setBalrondWindControler(zNetScene); setBalrondBell(zNetScene); setupBuildPiecesList(zNetScene); addBalrondShelfToggle(zNetScene); addBalrondPlanter(zNetScene); } private void setupBuildPiecesList(ZNetScene zNetScene) { string[] array = new string[4] { "Hammer", "HammerIron", "HammerDverger", "HammerBlackmetal" }; GameObject val = zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == "Hammer"); PieceTable buildPieces = val.GetComponent<ItemDrop>().m_itemData.m_shared.m_buildPieces; string[] array2 = array; foreach (string name in array2) { addBuildpiecesToOtherHammer(name, buildPieces, zNetScene); } List<GameObject> pieces = buildPieces.m_pieces; foreach (GameObject buildPrefab in buildPrefabs) { setupRavenGuide(buildPrefab, zNetScene.m_prefabs); AddToBuildList(buildPrefab, pieces); } } private void addBuildpiecesToOtherHammer(string name, PieceTable pieceTable, ZNetScene zNetScene) { GameObject val = zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == name); if (!((Object)(object)val == (Object)null)) { val.GetComponent<ItemDrop>().m_itemData.m_shared.m_buildPieces = pieceTable; } } public void setupRavenGuide(GameObject gameObject, List<GameObject> gameObjects) { GameObject val = null; Transform val2 = gameObject.transform.Find("GuidePoint"); if ((Object)(object)val2 == (Object)null) { return; } GameObject val3 = gameObjects.Find((GameObject x) => ((Object)x).name == "piece_workbench"); if ((Object)(object)val3 != (Object)null) { GameObject gameObject2 = ((Component)val3.transform.Find("GuidePoint")).gameObject; if ((Object)(object)gameObject2 != (Object)null) { GuidePoint component = gameObject2.GetComponent<GuidePoint>(); if ((Object)(object)component != (Object)null) { val = component.m_ravenPrefab; } } } if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)"Ravens not found"); } else { ((Component)val2).GetComponent<GuidePoint>().m_ravenPrefab = val; } } public void setupBuildPiecesListDB() { GameObject val = ObjectDB.instance.m_items.Find((GameObject x) => ((Object)x).name == "Hammer"); List<GameObject> pieces = val.GetComponent<ItemDrop>().m_itemData.m_shared.m_buildPieces.m_pieces; foreach (GameObject buildPrefab in buildPrefabs) { AddToBuildList(buildPrefab, pieces); } } private void AddToBuildList(GameObject prefab, List<GameObject> buildPieces) { if ((Object)(object)buildPieces.Find((GameObject x) => ((Object)x).name == ((Object)prefab).name) == (Object)null) { buildPieces.Add(prefab); } } private void addPlantstoCultivator(ZNetScene zNetScene) { GameObject val = zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == "Cultivator"); PieceTable buildPieces = val.GetComponent<ItemDrop>().m_itemData.m_shared.m_buildPieces; List<GameObject> pieces = buildPieces.m_pieces; foreach (GameObject plantPrefab in plantPrefabs) { pieces.Add(plantPrefab); } } private void loadStatusFromPotion() { string[] source = new string[0]; foreach (GameObject itemPrefab in itemPrefabs) { if (source.Contains(((Object)itemPrefab).name)) { ItemDrop component = itemPrefab.GetComponent<ItemDrop>(); SharedData shared = component.m_itemData.m_shared; checkForStatus(shared.m_consumeStatusEffect); checkForStatus(shared.m_setStatusEffect); checkForStatus(shared.m_equipStatusEffect); checkForStatus(shared.m_attackStatusEffect); } } Debug.Log((object)("Loaded Potion status: " + statusEffects.Count)); } private void checkForStatus(StatusEffect status) { if ((Object)(object)status != (Object)null) { statusEffects.Add(status); } } private AssetBundle GetAssetBundleFromResources(string filename) { Assembly executingAssembly = Assembly.GetExecutingAssembly(); string name = executingAssembly.GetManifestResourceNames().Single((string str) => str.EndsWith(filename)); using Stream stream = executingAssembly.GetManifestResourceStream(name); return AssetBundle.LoadFromStream(stream); } private void loadPlants(string basePath) { string text = basePath + "Plants/"; string[] array = new string[0]; string[] array2 = array; foreach (string text2 in array2) { GameObject val = assetBundle.LoadAsset<GameObject>(text + text2 + ".prefab"); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Could not find plant with name: " + text2)); continue; } ShaderReplacment.Replace(val); plantPrefabs.Add(val); } } private void loadPieces(string basePath) { string text = basePath + "Pieces/"; string[] buildPieces = BuildPieceList.buildPieces; string[] array = buildPieces; foreach (string text2 in array) { GameObject val = assetBundle.LoadAsset<GameObject>(text + text2 + ".prefab"); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Could not find piece with name: " + text2)); continue; } ShaderReplacment.Replace(val); buildPrefabs.Add(val); } } private void loadItems(string basePath) { string text = basePath + "Items/"; string[] array = new string[0]; string[] array2 = array; foreach (string text2 in array2) { GameObject val = assetBundle.LoadAsset<GameObject>(text + text2 + ".prefab"); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Could not find item with name: " + text2)); continue; } ShaderReplacment.Replace(val); itemPrefabs.Add(val); } } private void loadVegetation(string basePath) { string text = basePath + "Vegetation/"; string[] array = new string[0]; string[] array2 = array; foreach (string text2 in array2) { GameObject val = assetBundle.LoadAsset<GameObject>(text + text2 + ".prefab"); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Could not find vegegation with name: " + text2)); continue; } ShaderReplacment.Replace(val); vegetationPrefabs.Add(val); } } private void loadOther(string basePath) { string text = basePath + "Other/"; string[] array = new string[2] { "sfx_bell_hit_bal", "vfx_tunes_bal" }; string[] array2 = array; foreach (string text2 in array2) { GameObject val = assetBundle.LoadAsset<GameObject>(text + text2 + ".prefab"); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Could not find object with name: " + text2)); continue; } ShaderReplacment.Replace(val); vfxPrefabs.Add(val); } } private DropData createDrop(ZNetScene zNetScene, string name, int min, int max, float chance) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) DropData result = default(DropData); result.m_stackMin = min; result.m_stackMax = max; result.m_weight = chance; result.m_item = getItem(zNetScene, name); return result; } private GameObject getItem(ZNetScene zNetScene, string name) { return zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == name); } public static void addBalrondPlanter(ZNetScene zNetScene) { string[] array = new string[1] { "piece_deco_planter1x1_bal" }; string[] array2 = array; foreach (string planterName in array2) { GameObject val = zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == planterName); BalrondPlanter balrondPlanter = val.GetComponent<BalrondPlanter>(); if ((Object)(object)balrondPlanter == (Object)null) { balrondPlanter = val.AddComponent<BalrondPlanter>(); } balrondPlanter.m_toggle = ((Component)val.transform.Find("flowers")).gameObject; } } public void setBalrondBell(ZNetScene zNetScene) { GameObject val = zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == "piece_bell_brass_bal"); if ((Object)(object)val.GetComponent<RingingBell>() == (Object)null) { trasnformRingBell(val, zNetScene); } GameObject val2 = zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == "piece_bell_iron_bal"); if ((Object)(object)val2.GetComponent<RingingBell>() == (Object)null) { trasnformRingBell(val2, zNetScene); } } public void setBalrondWindControler(ZNetScene zNetScene) { string[] array = new string[5] { "piece_flagBalrond_bal", "piece_flagRed_bal", "piece_flagDark_bal", "piece_flagStyle1_bal", "piece_flagTorn_bal" }; string[] array2 = array; foreach (string flagName in array2) { GameObject val = zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == flagName); if (!((Object)(object)val == (Object)null) && (Object)(object)val.GetComponent<BalrondWindControler>() == (Object)null) { transferWindmilToControler(val, zNetScene); } } } private void trasnformRingBell(GameObject gameObject, ZNetScene zNetScene) { NpcTalk component = gameObject.GetComponent<NpcTalk>(); if (!((Object)(object)component == (Object)null)) { RingingBell ringingBell = gameObject.GetComponent<RingingBell>(); if ((Object)(object)ringingBell == (Object)null) { ringingBell = gameObject.AddComponent<RingingBell>(); } ringingBell.m_ringEffects = component.m_randomTalkFX; Object.DestroyImmediate((Object)(object)component); } } private void transferWindmilToControler(GameObject gameObject, ZNetScene zNetScene) { Windmill component = gameObject.GetComponent<Windmill>(); if (!((Object)(object)component == (Object)null)) { BalrondWindControler balrondWindControler = gameObject.GetComponent<BalrondWindControler>(); if ((Object)(object)balrondWindControler == (Object)null) { balrondWindControler = gameObject.AddComponent<BalrondWindControler>(); } balrondWindControler.m_propeller = component.m_propeller; balrondWindControler.m_bom = component.m_bom; balrondWindControler.m_kompas = component.m_grindstone; balrondWindControler.m_sfxLoops = component.m_sfxLoops; if (((Object)gameObject).name == "weathervane_bal") { balrondWindControler.m_windDirection = true; } Object.DestroyImmediate((Object)(object)component); } } public static void addBalrondShelfToggle(ZNetScene zNetScene) { string[] array = new string[3] { "dvergr_shelf_wall_bal", "dvergr_shelf_high_bal", "dvergr_shelf_bal" }; string[] array2 = array; foreach (string shelfName in array2) { GameObject val = zNetScene.m_prefabs.Find((GameObject x) => ((Object)x).name == shelfName); if ((Object)(object)val != (Object)null) { Container component = val.GetComponent<Container>(); BalrondToggle balrondToggle = val.GetComponent<BalrondToggle>(); if ((Object)(object)balrondToggle == (Object)null) { balrondToggle = val.AddComponent<BalrondToggle>(); } balrondToggle.m_toggle = ((Component)val.transform.Find("toggle")).gameObject; if ((Object)(object)component != (Object)null) { balrondToggle.m_openEffects = component.m_openEffects; balrondToggle.m_closeEffects = component.m_closeEffects; Object.DestroyImmediate((Object)(object)component); } } } } } public class ShaderReplacment { public static List<GameObject> prefabsToReplaceShader = new List<GameObject>(); public static List<Material> materialsInPrefabs = new List<Material>(); public string[] shaderlist = new string[49] { "Custom/AlphaParticle", "Custom/Blob", "Custom/Bonemass", "Custom/Clouds", "Custom/Creature", "Custom/Decal", "Custom/Distortion", "Custom/Flow", "Custom/FlowOpaque", "Custom/Grass", "Custom/GuiScroll", "Custom/Heightmap", "Custom/icon", "Custom/InteriorSide", "Custom/LitGui", "Custom/LitParticles", "Custom/mapshader", "Custom/ParticleDecal", "Custom/Piece", "Custom/Player", "Custom/Rug", "Custom/ShadowBlob", "Custom/SkyboxProcedural", "Custom/SkyObject", "Custom/StaticRock", "Custom/Tar", "Custom/Trilinearmap", "Custom/UI/BGBlur", "Custom/Vegetation", "Custom/Water", "Custom/WaterBottom", "Custom/WaterMask", "Custom/Yggdrasil", "Custom/Yggdrasil/root", "Hidden/BlitCopyHDRTonemap", "Hidden/Dof/DepthOfFieldHdr", "Hidden/Dof/DX11Dof", "Hidden/Internal-Loading", "Hidden/Internal-UIRDefaultWorld", "Hidden/SimpleClear", "Hidden/SunShaftsComposite", "Lux Lit Particles/ Bumped", "Lux Lit Particles/ Tess Bumped", "Particles/Standard Surface2", "Particles/Standard Unlit2", "Standard TwoSided", "ToonDeferredShading2017", "Unlit/DepthWrite", "Unlit/Lighting" }; public static List<Shader> shaders = new List<Shader>(); private static readonly HashSet<Shader> CachedShaders = new HashSet<Shader>(); public static bool debug = true; public static Shader findShader(string name) { Shader[] array = Resources.FindObjectsOfTypeAll<Shader>(); if (array.Length == 0) { return null; } if (debug) { } return shaders.Find((Shader x) => ((Object)x).name == name); } public static Shader GetShaderByName(string name) { return shaders.Find((Shader x) => ((Object)x).name == name.Trim()); } public static void debugShaderList(List<Shader> shadersRes) { foreach (Shader shadersRe in shadersRes) { Debug.LogWarning((object)("SHADER NAME IS: " + ((Object)shadersRe).name)); } debug = false; } public static void Replace(GameObject gameObject) { prefabsToReplaceShader.Add(gameObject); GetMaterialsInPrefab(gameObject); } public static void GetMaterialsInPrefab(GameObject gameObject) { Renderer[] componentsInChildren = gameObject.GetComponentsInChildren<Renderer>(true); Renderer[] array = componentsInChildren; foreach (Renderer val in array) { Material[] sharedMaterials = val.sharedMaterials; if (sharedMaterials == null || sharedMaterials.Length == 0) { continue; } Material[] array2 = sharedMaterials; foreach (Material val2 in array2) { if ((Object)(object)val2 != (Object)null) { materialsInPrefabs.Add(val2); } } } } public static void getMeShaders() { AssetBundle[] array = Resources.FindObjectsOfTypeAll<AssetBundle>(); AssetBundle[] array2 = array; foreach (AssetBundle val in array2) { IEnumerable<Shader> enumerable3; try { IEnumerable<Shader> enumerable2; if (!val.isStreamedSceneAssetBundle || !Object.op_Implicit((Object)(object)val)) { IEnumerable<Shader> enumerable = val.LoadAllAssets<Shader>(); enumerable2 = enumerable; } else { enumerable2 = from shader in ((IEnumerable<string>)val.GetAllAssetNames()).Select((Func<string, Shader>)val.LoadAsset<Shader>) where (Object)(object)shader != (Object)null select shader; } enumerable3 = enumerable2; } catch (Exception) { continue; } if (enumerable3 == null) { continue; } foreach (Shader item in enumerable3) { CachedShaders.Add(item); } } } public static void runMaterialFix() { getMeShaders(); shaders.AddRange(CachedShaders); foreach (Material materialsInPrefab in materialsInPrefabs) { Shader shader = materialsInPrefab.shader; if (!((Object)(object)shader == (Object)null)) { string name = ((Object)shader).name; if (!(name == "Standard") && name.Contains("Balrond")) { setProperValue(materialsInPrefab, name); } } } } private static void setProperValue(Material material, string shaderName) { string name = shaderName.Replace("Balrond", "Custom"); name = checkNaming(name); Shader shaderByName = GetShaderByName(name); if (!((Object)(object)shaderByName == (Object)null)) { material.shader = shaderByName; } } private static string checkNaming(string name) { string result = name; if (name.Contains("Bumped")) { result = name.Replace("Custom", "Lux Lit Particles"); } if (name.Contains("Tess Bumped")) { result = name.Replace("Custom", "Lux Lit Particles"); } if (name.Contains("Standard Surface")) { result = name.Replace("Custom", "Particles"); result = result.Replace("Standard Surface2", "Standard Surface"); } if (name.Contains("Standard Unlit")) { result = name.Replace("Custom", "Particles"); result = result.Replace("Standard Unlit", "Standard Unlit2"); result = result.Replace("Standard Unlit22", "Standard Unlit2"); } return result; } } public class TableMapper { public static CraftingStation cauldron; public static CraftingStation workbench; public static CraftingStation heavyWorkbench; public static CraftingStation forge; public static CraftingStation ironworks; public static CraftingStation blackforge; public static CraftingStation stoneCutter; public static CraftingStation artisian; public static CraftingStation magetable; public static CraftingStation runeforge; public static CraftingStation tannery; public static CraftingStation fletcher; public static CraftingStation grill; public static CraftingStation alchemylab; public static List<GameObject> pieces = new List<GameObject>(); public static void setupTables(List<GameObject> list) { pieces = list; prepareTables(); } private static CraftingStation FindStation(List<GameObject> list, string name, CraftingStation alt = null) { GameObject val = list.Find((GameObject x) => ((Object)x).name == name); if ((Object)(object)val != (Object)null) { return val.GetComponent<CraftingStation>(); } Debug.LogWarning((object)("TableMapper - Station not found: " + name + " using: " + ((Object)alt).name)); if ((Object)(object)alt != (Object)null) { return alt; } return null; } private static void prepareTables() { cauldron = FindStation(pieces, "piece_cauldron"); workbench = FindStation(pieces, "piece_workbench"); heavyWorkbench = FindStation(pieces, "piece_heavy_workbench_bal", workbench); forge = FindStation(pieces, "forge"); ironworks = FindStation(pieces, "piece_metalworks_bal", forge); blackforge = FindStation(pieces, "blackforge"); stoneCutter = FindStation(pieces, "piece_stonecutter"); artisian = FindStation(pieces, "piece_artisanstation"); runeforge = FindStation(pieces, "piece_runeforge_bal", blackforge); magetable = FindStation(pieces, "piece_magetable"); fletcher = FindStation(pieces, "piece_fletcher_bal", workbench); } } public class JsonLoader { public string defaultPath = string.Empty; public void loadJson() { LoadTranslations(); justDefaultPath(); } public void justDefaultPath() { string configPath = Paths.ConfigPath; string text = Path.Combine(configPath, "BalrondFurnitureReborn-translation/"); defaultPath = text; } public void createDefaultPath() { string configPath = Paths.ConfigPath; string path = Path.Combine(configPath, "BalrondFurnitureReborn-translation/"); if (!Directory.Exists(path)) { CreateFolder(path); } defaultPath = path; } private string[] jsonFilePath(string folderName, string extension) { string configPath = Paths.ConfigPath; string path = Path.Combine(configPath, "BalrondFurnitureReborn-translation/"); if (!Directory.Exists(path)) { CreateFolder(path); } return Directory.GetFiles(path, extension); } private static void CreateFolder(string path) { try { Directory.CreateDirectory(path); } catch (Exception ex) { Debug.Log((object)("BalrondFurnitureReborn: Error creating folder: " + ex.Message)); } } private void LoadTranslations() { int num = 0; string[] array = jsonFilePath("Translation", "*.json"); foreach (string text in array) { string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(text); string json = File.ReadAllText(text); JsonData jsonData = JsonMapper.ToObject(json); Dictionary<string, string> dictionary = new Dictionary<string, string>(); foreach (string key in jsonData.Keys) { dictionary[key] = jsonData[key].ToString(); } if (dictionary != null) { BalrondTranslator.translations.Add(fileNameWithoutExtension, dictionary); num++; } else { Debug.LogError((object)("BalrondFurnitureReborn: Loading FAILED file: " + text)); } } } } [BepInPlugin("balrond.astafaraios.BalrondFurnitureReborn", "BalrondFurnitureReborn", "1.2.5")] public class Launch : BaseUnityPlugin { [HarmonyPatch(typeof(FejdStartup), "SetupGui")] private static class FejdStartup_SetupGUI { private static void Postfix() { try { if (Localization.instance != null) { string selectedLanguage = Localization.instance.GetSelectedLanguage(); Dictionary<string, string> translations = GetTranslations(selectedLanguage); AddTranslations(translations); } } catch (Exception ex) { if (Log != null) { Log.LogError((object)("FejdStartup.SetupGui Postfix failed: " + ex)); } } } } [HarmonyPriority(800)] [HarmonyPatch(typeof(Localization), "SetupLanguage")] private static class Translation_SetupLanguage { private static void Prefix(Localization __instance, string language) { try { Dictionary<string, string> translations = GetTranslations(language); AddTranslations(translations, __instance); } catch (Exception ex) { if (Log != null) { Log.LogError((object)("Localization.SetupLanguage Prefix failed: " + ex)); } } } } [HarmonyPriority(800)] [HarmonyPatch(typeof(Localization), "LoadCSV")] private static class Translation_LoadCSV { private static void Prefix(Localization __instance, string language) { try { Dictionary<string, string> translations = GetTranslations(language); AddTranslations(translations, __instance); } catch (Exception ex) { if (Log != null) { Log.LogError((object)("Localization.LoadCSV Prefix failed: " + ex)); } } } } [HarmonyPatch(typeof(AudioMan), "Awake")] private static class AudioMan_Awake_Patch { private static void Postfix(AudioMan __instance) { try { if ((Object)(object)__instance == (Object)null || (Object)(object)__instance.m_masterMixer == (Object)null) { return; } AudioMixerGroup outputAudioMixerGroup = __instance.m_masterMixer.outputAudioMixerGroup; if ((Object)(object)outputAudioMixerGroup == (Object)null) { return; } foreach (List<GameObject> allPrefabGroup in GetAllPrefabGroups()) { if (allPrefabGroup == null) { continue; } foreach (GameObject item in allPrefabGroup) { if ((Object)(object)item == (Object)null) { continue; } AudioSource[] componentsInChildren; try { componentsInChildren = item.GetComponentsInChildren<AudioSource>(true); } catch { continue; } if (componentsInChildren == null || componentsInChildren.Length == 0) { continue; } AudioSource[] array = componentsInChildren; foreach (AudioSource val in array) { if (!((Object)(object)val == (Object)null)) { val.outputAudioMixerGroup = outputAudioMixerGroup; } } } } } catch (Exception ex) { if (Log != null) { Log.LogError((object)("AudioMan.Awake Postfix failed: " + ex)); } } } } [HarmonyPatch(typeof(ObjectDB), "CopyOtherDB")] public static class Object_CopyOtherDB_Path { public static void Postfix() { try { SafeSetupDatabaseContent(); } catch (Exception ex) { if (Log != null) { Log.LogError((object)("ObjectDB.CopyOtherDB Postfix failed: " + ex)); } } } } [HarmonyPatch(typeof(ObjectDB), "Awake")] public static class ObjectDB_Awake_Path { public static void Postfix() { try { SafeSetupDatabaseContent(); } catch (Exception ex) { if (Log != null) { Log.LogError((object)("ObjectDB.Awake Postfix failed: " + ex)); } } } } [HarmonyPatch(typeof(ZNetScene), "Awake")] public static class ZNetScene_Awake_Path { public static bool hasSpawned; public static void Prefix(ZNetScene __instance) { if ((Object)(object)__instance == (Object)null) { Debug.LogWarning((object)(projectName + ": No ZNetScene found")); return; } try { modResourceLoader.AddPrefabsToZnetScene(__instance); } catch (Exception ex) { if (Log != null) { Log.LogError((object)("AddPrefabsToZnetScene failed: " + ex)); } } if (Launch.hasSpawned) { return; } try { buildPieceBuilder.SetupBuildPieces(__instance); } catch (Exception ex2) { if (Log != null) { Log.LogError((object)("SetupBuildPieces failed: " + ex2)); } } if (IsDedicatedServer()) { return; } try { ShaderReplacment.runMaterialFix(); } catch (Exception ex3) { if (Log != null) { Log.LogError((object)("runMaterialFix failed: " + ex3)); } } Launch.hasSpawned = true; hasSpawned = true; } } public const string PluginGUID = "balrond.astafaraios.BalrondFurnitureReborn"; public const string PluginName = "BalrondFurnitureReborn"; public const string PluginVersion = "1.2.5"; private static Harmony _harmony; internal static ManualLogSource Log; public static readonly ModResourceLoader modResourceLoader = new ModResourceLoader(); public static readonly DatabaseAddMethods databaseAddMethods = new DatabaseAddMethods(); public static readonly BuildPieceBuilder buildPieceBuilder = new BuildPieceBuilder(); public static readonly JsonLoader jsonLoader = new JsonLoader(); public static GameObject gui; public static GameObject gui2; public static string projectName = "BalrondFurnitureReborn"; public static GameObject RootObject; public static GameObject PrefabContainer; public static bool hasSpawned = false; private void Awake() { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; try { SafeLoadJson(); SafeLoadAssets(); if (_harmony == null) { _harmony = new Harmony("balrond.astafaraios.BalrondFurnitureReborn"); } _harmony.PatchAll(); Log.LogInfo((object)"BalrondFurnitureReborn loaded successfully."); } catch (Exception ex) { Log.LogError((object)("Error during Awake: " + ex)); } } private void OnDestroy() { try { if (_harmony != null) { _harmony.UnpatchSelf(); } } catch (Exception ex) { if (Log != null) { Log.LogError((object)("Error during OnDestroy: " + ex)); } } } private static void SafeLoadJson() { try { jsonLoader.loadJson(); } catch (Exception ex) { if (Log != null) { Log.LogError((object)("Failed to load JSON data: " + ex)); } } } private static void SafeLoadAssets() { try { modResourceLoader.loadAssets(); } catch (Exception ex) { if (Log != null) { Log.LogError((object)("Failed to load assets: " + ex)); } } } private static bool IsObjectDBValid() { try { if ((Object)(object)ObjectDB.instance == (Object)null) { return false; } if (ObjectDB.instance.m_items == null || ObjectDB.instance.m_items.Count == 0) { return false; } if (ObjectDB.instance.m_recipes == null || ObjectDB.instance.m_recipes.Count == 0) { return false; } return (Object)(object)ObjectDB.instance.GetItemPrefab("Amber") != (Object)null; } catch (Exception ex) { if (Log != null) { Log.LogWarning((object)("IsObjectDBValid failed: " + ex)); } return false; } } private static bool IsDedicatedServer() { try { return (Object)(object)ZNet.instance != (Object)null && ZNet.instance.IsDedicated(); } catch (Exception ex) { if (Log != null) { Log.LogWarning((object)("Dedicated server check failed: " + ex)); } return false; } } private static Dictionary<string, string> GetTranslations(string language) { try { Dictionary<string, string> result = BalrondTranslator.getLanguage("English"); if (!string.IsNullOrEmpty(language) && !string.Equals(language, "English", StringComparison.OrdinalIgnoreCase)) { Dictionary<string, string> language2 = BalrondTranslator.getLanguage(language); if (language2 != null) { result = language2; } else { Debug.Log((object)("BalrondFurnitureReborn: Did not find translation file for '" + language + "', loading English")); } } return result; } catch (Exception ex) { if (Log != null) { Log.LogError((object)("Failed to get translations for language '" + language + "': " + ex)); } return null; } } private static void AddTranslations(Dictionary<string, string> translations, Localization localizationInstance = null) { if (translations == null || translations.Count == 0) { Debug.LogWarning((object)"BalrondFurnitureReborn: No translation file found or translation set is empty."); return; } try { Localization val = localizationInstance ?? Localization.instance; if (val == null) { Debug.LogWarning((object)"BalrondFurnitureReborn: Localization instance is null."); return; } foreach (KeyValuePair<string, string> translation in translations) { if (!string.IsNullOrEmpty(translation.Key)) { val.AddWord(translation.Key, translation.Value ?? string.Empty); } } } catch (Exception ex) { if (Log != null) { Log.LogError((object)("Failed to add translations: " + ex)); } } } private static void SafeSetupDatabaseContent() { if (!IsObjectDBValid()) { return; } try { modResourceLoader.setupBuildPiecesListDB(); } catch (Exception ex) { if (Log != null) { Log.LogError((object)("setupBuildPiecesListDB failed: " + ex)); } } try { if (modResourceLoader.itemPrefabs != null) { databaseAddMethods.AddItems(modResourceLoader.itemPrefabs); } } catch (Exception ex2) { if (Log != null) { Log.LogError((object)("AddItems failed: " + ex2)); } } try { if (modResourceLoader.statusEffects != null) { databaseAddMethods.AddStatuseffects(modResourceLoader.statusEffects); } } catch (Exception ex3) { if (Log != null) { Log.LogError((object)("AddStatuseffects failed: " + ex3)); } } try { if (modResourceLoader.recipes != null) { databaseAddMethods.AddRecipes(modResourceLoader.recipes); } } catch (Exception ex4) { if (Log != null) { Log.LogError((object)("AddRecipes failed: " + ex4)); } } } private static IEnumerable<List<GameObject>> GetAllPrefabGroups() { if (modResourceLoader != null) { if (modResourceLoader.itemPrefabs != null) { yield return modResourceLoader.itemPrefabs; } if (modResourceLoader.buildPrefabs != null) { yield return modResourceLoader.buildPrefabs; } if (modResourceLoader.monsterPrefabs != null) { yield return modResourceLoader.monsterPrefabs; } if (modResourceLoader.vfxPrefabs != null) { yield return modResourceLoader.vfxPrefabs; } if (modResourceLoader.vegetationPrefabs != null) { yield return modResourceLoader.vegetationPrefabs; } } } } public class BuildPieceBuilder { private List<GameObject> list; private string[] piecesNames = BuildPieceList.buildPieces; public void SetupBuildPieces(ZNetScene zNetScene) { TableMapper.setupTables(zNetScene.m_prefabs); list = zNetScene.m_prefabs; string[] array = piecesNames; foreach (string name in array) { GameObject val = list.Find((GameObject x) => ((Object)x).name == name); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Cant find buildpiece with name: " + name)); } else { EditBuildPiece(val); } } } private void EditBuildPiece(GameObject gameObject) { //IL_2cff: Unknown result type (might be due to invalid IL or missing references) //IL_32fa: Unknown result type (might be due to invalid IL or missing references) //IL_2365: Unknown result type (might be due to invalid IL or missing references) //IL_1aaf: Unknown result type (might be due to invalid IL or missing references) //IL_40eb: Unknown result type (might be due to invalid IL or missing references) //IL_2a09: Unknown result type (might be due to invalid IL or missing references) //IL_31d3: Unknown result type (might be due to invalid IL or missing references) //IL_38fe: Unknown result type (might be due to invalid IL or missing references) //IL_1ea8: Unknown result type (might be due to invalid IL or missing references) //IL_3d3f: Unknown result type (might be due to invalid IL or missing references) //IL_3d9b: Unknown result type (might be due to invalid IL or missing references) //IL_24b2: Unknown result type (might be due to invalid IL or missing references) //IL_4255: Unknown result type (might be due to invalid IL or missing references) //IL_367e: Unknown result type (might be due to invalid IL or missing references) //IL_28b5: Unknown result type (might be due to invalid IL or missing references) //IL_3e84: Unknown result type (might be due to invalid IL or missing references) //IL_3fa3: Unknown result type (might be due to invalid IL or missing references) //IL_3101: Unknown result type (might be due to invalid IL or missing references) //IL_2f0d: Unknown result type (might be due to invalid IL or missing references) //IL_22f0: Unknown result type (might be due to invalid IL or missing references) //IL_2e3b: Unknown result type (might be due to invalid IL or missing references) //IL_2079: Unknown result type (might be due to invalid IL or missing references) //IL_2ab3: Unknown result type (might be due to invalid IL or missing references) //IL_168b: Unknown result type (might be due to invalid IL or missing references) //IL_1a2c: Unknown result type (might be due to invalid IL or missing references) //IL_189d: Unknown result type (might be due to invalid IL or missing references) //IL_323c: Unknown result type (might be due to invalid IL or missing references) //IL_21ab: Unknown result type (might be due to invalid IL or missing references) //IL_2614: Unknown result type (might be due to invalid IL or missing references) //IL_2760: Unknown result type (might be due to invalid IL or missing references) //IL_29b4: Unknown result type (might be due to invalid IL or missing references) //IL_264e: Unknown result type (might be due to invalid IL or missing references) //IL_3572: Unknown result type (might be due to invalid IL or missing references) //IL_1bae: Unknown result type (might be due to invalid IL or missing references) //IL_252a: Unknown result type (might be due to invalid IL or missing references) //IL_1b45: Unknown result type (might be due to invalid IL or missing references) //IL_3a16: Unknown result type (might be due to invalid IL or missing references) //IL_295f: Unknown result type (might be due to invalid IL or missing references) //IL_3852: Unknown result type (might be due to invalid IL or missing references) //IL_3435: Unknown result type (might be due to invalid IL or missing references) //IL_1fe3: Unknown result type (might be due to invalid IL or missing references) //IL_194d: Unknown result type (might be due to invalid IL or missing references) //IL_3a6b: Unknown result type (might be due to invalid IL or missing references) //IL_4012: Unknown result type (might be due to invalid IL or missing references) //IL_2688: Unknown result type (might be due to invalid IL or missing references) //IL_27b5: Unknown result type (might be due to invalid IL or missing references) //IL_2038: Unknown result type (might be due to invalid IL or missing references) //IL_3363: Unknown result type (might be due to invalid IL or missing references) //IL_2d4c: Unknown result type (might be due to invalid IL or missing references) //IL_1cf0: Unknown result type (might be due to invalid IL or missing references) //IL_407c: Unknown result type (might be due to invalid IL or missing references) //IL_280b: Unknown result type (might be due to invalid IL or missing references) //IL_2100: Unknown result type (might be due to invalid IL or missing references) //IL_35b3: Unknown result type (might be due to invalid IL or missing references) //IL_42aa: Unknown result type (might be due to invalid IL or missing references) //IL_1dd6: Unknown result type (might be due to invalid IL or missing references) //IL_3291: Unknown result type (might be due to invalid IL or missing references) //IL_2f76: Unknown result type (might be due to invalid IL or missing references) //IL_1c6d: Unknown result type (might be due to invalid IL or missing references) //IL_16e0: Unknown result type (might be due to invalid IL or missing references) //IL_1913: Unknown result type (might be due to invalid IL or missing references) //IL_39e9: Unknown result type (might be due to invalid IL or missing references) //IL_42ff: Unknown result type (might be due to invalid IL or missing references) //IL_2bf3: Unknown result type (might be due to invalid IL or missing references) //IL_2a5e: Unknown result type (might be due to invalid IL or missing references) //IL_2b28: Unknown result type (might be due to invalid IL or missing references) //IL_2860: Unknown result type (might be due to invalid IL or missing references) //IL_2b1c: Unknown result type (might be due to invalid IL or missing references) //IL_3fd0: Unknown result type (might be due to invalid IL or missing references) //IL_222f: Unknown result type (might be due to invalid IL or missing references) //IL_178a: Unknown result type (might be due to invalid IL or missing references) //IL_37e7: Unknown result type (might be due to invalid IL or missing references) //IL_33cc: Unknown result type (might be due to invalid IL or missing references) //IL_4351: Unknown result type (might be due to invalid IL or missing references) //IL_349e: Unknown result type (might be due to invalid IL or missing references) //IL_1efd: Unknown result type (might be due to invalid IL or missing references) //IL_185c: Unknown result type (might be due to invalid IL or missing references) //IL_3507: Unknown result type (might be due to invalid IL or missing references) //IL_2284: Unknown result type (might be due to invalid IL or missing references) //IL_17df: Unknown result type (might be due to invalid IL or missing references) //IL_23dc: Unknown result type (might be due to invalid IL or missing references) //IL_197a: Unknown result type (might be due to invalid IL or missing references) //IL_26eb: Unknown result type (might be due to invalid IL or missing references) //IL_216a: Unknown result type (might be due to invalid IL or missing references) //IL_3f34: Unknown result type (might be due to invalid IL or missing references) //IL_2e22: Unknown result type (might be due to invalid IL or missing references) //IL_1f7a: Unknown result type (might be due to invalid IL or missing references) //IL_3f76: Unknown result type (might be due to invalid IL or missing references) //IL_377c: Unknown result type (might be due to invalid IL or missing references) //IL_40a9: Unknown result type (might be due to invalid IL or missing references) //IL_3ec6: Unknown result type (might be due to invalid IL or missing references) //IL_36f3: Unknown result type (might be due to invalid IL or missing references) //IL_3de9: Unknown result type (might be due to invalid IL or missing references) //IL_35e1: Unknown result type (might be due to invalid IL or missing references) //IL_1d6d: Unknown result type (might be due to invalid IL or missing references) //IL_4140: Unknown result type (might be due to invalid IL or missing references) //IL_2dc1: Unknown result type (might be due to invalid IL or missing references) //IL_25da: Unknown result type (might be due to invalid IL or missing references) //IL_3e37: Unknown result type (might be due to invalid IL or missing references) //IL_2c48: Unknown result type (might be due to invalid IL or missing references) //IL_258c: Unknown result type (might be due to invalid IL or missing references) //IL_19d4: Unknown result type (might be due to invalid IL or missing references) //IL_1b04: Unknown result type (might be due to invalid IL or missing references) //IL_3953: Unknown result type (might be due to invalid IL or missing references) //IL_316a: Unknown result type (might be due to invalid IL or missing references) //IL_1cae: Unknown result type (might be due to invalid IL or missing references) //IL_302f: Unknown result type (might be due to invalid IL or missing references) //IL_39bc: Unknown result type (might be due to invalid IL or missing references) //IL_21ed: Unknown result type (might be due to invalid IL or missing references) //IL_41ff: Unknown result type (might be due to invalid IL or missing references) //IL_19a7: Unknown result type (might be due to invalid IL or missing references) //IL_38a8: Unknown result type (might be due to invalid IL or missing references) //IL_4196: Unknown result type (might be due to invalid IL or missing references) //IL_3f07: Unknown result type (might be due to invalid IL or missing references) //IL_1e3f: Unknown result type (might be due to invalid IL or missing references) //IL_1c2b: Unknown result type (might be due to invalid IL or missing references) //IL_290a: Unknown result type (might be due to invalid IL or missing references) //IL_1735: Unknown result type (might be due to invalid IL or missing references) //IL_3098: Unknown result type (might be due to invalid IL or missing references) //IL_1a6d: Unknown result type (might be due to invalid IL or missing references) //IL_2ea4: Unknown result type (might be due to invalid IL or missing references) //IL_243d: Unknown result type (might be due to invalid IL or missing references) //IL_2cb1: Unknown result type (might be due to invalid IL or missing references) Piece component = gameObject.gameObject.GetComponent<Piece>(); SetStation(component, TableMapper.workbench); component.m_resources = (Requirement[])(object)new Requirement[0]; switch (((Object)gameObject).name) { case "piece_flagRed_bal": SetStation(component, TableMapper.heavyWorkbench); component.m_category = (PieceCategory)4; AddResources(component, "DyeKit_bal", 2, "Raspberry", 3); AddResources(component, "LinenThread", 3); AddResources(component, "Wood", 1); break; case "piece_flagDark_bal": SetStation(component, TableMapper.heavyWorkbench); component.m_category = (PieceCategory)4; AddResources(component, "DyeKit_bal", 2, "Coal", 3); AddResources(component, "LinenThread", 3); AddResources(component, "Wood", 1); break; case "piece_flagStyle1_bal": SetStation(component, TableMapper.heavyWorkbench); component.m_category = (PieceCategory)4; AddResources(component, "DyeKit_bal", 2, "Cloudberry", 2); AddResources(component, "LinenThread", 3); AddResources(component, "Wood", 1); break; case "piece_flagTorn_bal": SetStation(component, TableMapper.heavyWorkbench); component.m_category = (PieceCategory)4; AddResources(component, "DyeKit_bal", 2, "Bloodbag", 1); AddResources(component, "LinenThread", 3); AddResources(component, "Wood", 1); break; case "piece_banner_balrond_bal": case "piece_flagBalrond_bal": SetStation(component, TableMapper.heavyWorkbench); component.m_category = (PieceCategory)4; AddResources(component, "DyeKit_bal", 1, "Cloudberry", 1); AddResources(component, "DyeKit_bal", 1, "Blueberries", 1); AddResources(component, "DyeKit_bal", 1, "Raspberry", 1); AddResources(component, "LinenThread", 3); AddResources(component, "Wood", 1); break; case "rug_leatherscrap_bal": SetStation(component, TableMapper.heavyWorkbench); component.m_category = (PieceCategory)4; AddResources(component, "LeatherScraps", 4); AddResources(component, "StrawThread_bal", 3, "LeatherScraps", 4); break; case "rug_balrond_bal": SetStation(component, TableMapper.heavyWorkbench); component.m_category = (PieceCategory)4; AddResources(component, "DyeKit_bal", 1, "Cloudberry", 2); AddResources(component, "DyeKit_bal", 1, "Blueberries", 2); AddResources(component, "DyeKit_bal", 1, "Raspberry", 2); AddResources(component, "LinenThread", 6); break; case "piece_bell_brass_bal": SetStation(component, TableMapper.forge); SetStation(component, TableMapper.heavyWorkbench); component.m_category = (PieceCategory)4; AddResources(component, "BellMetal_bal", 2); break; case "piece_bell_iron_bal": SetStation(component, TableMapper.forge); SetStation(component, TableMapper.heavyWorkbench); component.m_category = (PieceCategory)4; AddResources(component, "Iron", 2); break; case "simple_ironchain_bal": SetStation(component, TableMapper.forge); component.m_category = (PieceCategory)3; AddResources(component, "Chain", 1); break; case "simple_brasschain_bal": SetStation(component, TableMapper.forge); component.m_category = (PieceCategory)3; AddResources(component, "BrassChain_bal", 1, "Chain", 1); break; case "piece_table_drakkar_bal": SetStation(component, TableMapper.blackforge); component.m_category = (PieceCategory)4; AddResources(component, "YggdrasilWood", 20); AddResources(component, "CeramicPlate", 20); AddResources(component, "BronzeNails", 100); break; case "piece_clamChestSmall_bal": SetStation(component, TableMapper.heavyWorkbench); component.m_category = (PieceCategory)4; AddResources(component, "BoneFragments", 5); AddResources(component, "AmberPearl", 1); break; case "piece_clamChest_bal": SetStation(component, TableMapper.heavyWorkbench); component.m_category = (PieceCategory)4; AddResources(component, "BoneFragments", 10); AddResources(component, "SeaPearl_bal", 1, "AmberPearl", 1); break; case "piece_lantern_ceiling_bal": SetStation(component, TableMapper.blackforge); component.m_category = (PieceCategory)4; AddResources(component, "BrassChain_bal", 1, "Chain", 1); AddResources(component, "Lantern", 1); AddResources(component, "Copper", 1); break; case "tabelcloth1_bal": SetStation(component, TableMapper.workbench); component.m_category = (PieceCategory)4; AddResources(component, "JuteThread_bal", 1, "LeatherScraps", 5); AddResources(component, "StrawThread_bal", 2, "LinenThread", 1); break; case "clutter_clothset1_bal": case "clutter_clothset2_bal": SetStation(component, TableMapper.heavyWorkbench); component.m_category = (PieceCategory)4; AddResources(component, "FineWood", 2); AddResources(component, "StrawThread_bal", 4, "LinenThread", 2); AddResources(component, "JuteBlue", 1); AddResources(component, "JuteRed", 1); break; case "flowergirland4m_bal": SetStation(component, TableMapper.workbench); component.m_category = (PieceCategory)4; AddResources(component, "Wood", 1); AddResources(component, "Moss_bal", 3, "Thistle", 1); AddResources(component, "Dandelion", 2); break; case "WeaponDecor01_bal": SetStation(component, TableMapper.forge); AddResources(component, "Iron", 2); AddResources(component, "Stone", 4); component.m_category = (PieceCategory)4; break; case "wagon_static_bal": SetStation(component, TableMapper.forge); AddResources(component, "Iron", 3); AddResources(component, "FineWood", 15); component.m_category = (PieceCategory)0; break; case "hildir_table_bal": SetStation(component, TableMapper.forge); AddResources(component, "Iron", 1); AddResources(component, "FineWood", 8); component.m_category = (PieceCategory)4; break; case "piece_chest_bronze_bal": SetStation(component, TableMapper.forge); AddResources(component, "Bronze", 2); AddResources(component, "FineWood", 10); component.m_category = (PieceCategory)4; break; case "gabro_fireplace_bal": SetStation(component, TableMapper.stoneCutter); setFireplaceFuelItem(component, "Wood"); AddResources(component, "Wood", 5); AddResources(component, "FineWood", 4); AddResources(component, "Gabro_bal", 4); AddResources(component, "Stone", 2); component.m_category = (PieceCategory)4; break; case "piece_brazier_green_bal": SetStation(component, TableMapper.forge); setFireplaceFuelItem(component, "Guck"); AddResources(component, "Bronze", 5); AddResources(component, "Guck", 3); AddResources(component, "WolfClaw", 3); component.m_category = (PieceCategory)4; break; case "piece_brazierceiling_blue_bal": SetStation(component, TableMapper.forge); setFireplaceFuelItem(component, "GreydwarfEye"); AddResources(component, "Bronze", 3); AddResources(component, "GreydwarfEye", 5); AddResources(component, "BrassChain_bal", 1, "Chain", 1); component.m_category = (PieceCategory)4; break; case "piece_brazierceiling_green_bal": SetStation(component, TableMapper.forge); setFireplaceFuelItem(component, "Guck"); AddResources(component, "Bronze", 3); AddResources(component, "Guck", 3); AddResources(component, "BrassChain_bal", 1, "Chain", 1); component.m_category = (PieceCategory)4; break; case "BustStand_bal": SetStation(component, TableMapper.heavyWorkbench); AddResources(component, "RoundLog", 2); AddResources(component, "CarvedWood_bal", 2, "RoundLog", 2); AddResources(component, "FineWood", 2); component.m_category = (PieceCategory)4; break; case "piece_brazierstone_bal": SetStation(component, TableMapper.forge); setFireplaceFuelItem(component, "Coal"); AddResources(component, "RoundLog", 2); AddResources(component, "Coal", 2); AddResources(component, "Iron", 3); AddResources(component, "Stone", 4); component.m_category = (PieceCategory)4; break; case "herb_ladder_bal": SetStation(component, TableMapper.heavyWorkbench); AddResources(component, "RoundLog", 2); AddResources(component, "Straw_bal", 2, "Wood", 1); AddResources(component, "Dandelion", 2); AddResources(component, "FreshSeaweed", 2); component.m_category = (PieceCategory)4; break; case "clutter_bookset1_bal": case "clutter_bookset2_bal": case "clutter_bookset3_bal": SetStation(component, TableMapper.artisian); AddResources(component, "StrawThread_bal", 1); AddResources(component, "LeatherScraps", 1); AddResources(component, "Coal", 1); component.m_category = (PieceCategory)0; break; case "clutter_deskknife_bal": SetStation(component, TableMapper.heavyWorkbench); AddResources(component, "Flint", 1); AddResources(component, "FineWood", 1); component.m_category = (PieceCategory)0; break; case "itemstand26_inner_bal": case "itemstand26_outer_bal": case "itemstand45_inner_bal": case "itemstand45_outer_bal": SetStation(component, TableMapper.heavyWorkbench); component.m_resources = (Requirement[])(object)new Requirement[0]; AddResources(component, "CarvedWood_bal", 2, "RoundLog", 1); AddResources(component, "WoodNails_bal", 2, "Wood", 1); break; case "clutter_bottleset_bal": case "clutter_cupset_bal": case "clutter_cupset2_bal": case "clutter_tableset_bal": SetStation(component, TableMapper.heavyWorkbench); AddResources(component, "ClayBrick_bal", 1, "Wood", 2); AddResources(component, "FineWood", 1); component.m_category = (PieceCategory)0; break; case "piece_braziercolumn_bal": setFireplaceFuelItem(component, "Coal"); SetStation(component, TableMapper.stoneCutter); AddResources(component, "Stone", 12); AddResources(component, "Coal", 2); AddResources(component, "Iron", 1); component.m_category = (PieceCategory)0; break; case "Hearth_1x3_bal": setFireplaceFuelItem(component, "Wood"); SetStation(component, TableMapper.stoneCutter); AddResources(component, "Stone", 6); component.m_category = (PieceCategory)0; break; case "Hearth_2x3_bal": setFireplaceFuelItem(component, "Wood"); SetStation(component, TableMapper.stoneCutter); AddResources(component, "Stone", 12); component.m_category = (PieceCategory)0; break; case "Hearth_2x2_bal": setFireplaceFuelItem(component, "Wood"); SetStation(component, TableMapper.stoneCutter); AddResources(component, "Stone", 9); component.m_category = (PieceCategory)0; break; case "rostrum_itemstand_bal": SetStation(component, TableMapper.stoneCutter); AddResources(component, "Stone", 5); AddResources(component, "CarvedWood_bal", 3, "FineWood", 2); AddResources(component, "Resin", 2); component.m_category = (PieceCategory)4; break; case "charred_chest_bal": SetStation(component, TableMapper.magetable); AddResources(component, "CharredBone", 50); AddResources(component, "FlametalNew", 30); AddResources(component, "MorgenHeart", 2); AddResources(component, "Blackwood", 30); component.m_category = (PieceCategory)4; break; case "HangingMedalions_bal": SetStation(component, TableMapper.forge); component.m_resources = (Requirement[])(object)new Requirement[0]; AddResources(component, "JuteRed", 1); AddResources(component, "FineWood", 2); AddResources(component, "GreydwarfEye", 2); AddResources(component, "IronNails", 2); component.m_category = (PieceCategory)0; break; case "piece_ashwood_echandelier_bal": SetStation(component, TableMapper.blackforge); setFireplaceFuelItem(component, "Resin"); component.m_resources = (Requirement[])(object)new Requirement[0]; AddResources(component, "Flametal", 4); AddResources(component, "Blackwood", 10); AddResources(component, "Resin", 20); component.m_category = (PieceCategory)4; break; case "HangingJute_bal": SetStation(component, TableMapper.forge); component.m_resources = (Requirement[])(object)new Requirement[0]; AddResources(component, "JuteThread_bal", 1, "JuteRed", 1); AddResources(component, "Bloodbag", 1); AddResources(component, "IronNails", 1); component.m_category = (PieceCategory)0; break; case "piece_deco_planter1x1_bal": SetStation(component, TableMapper.heavyWorkbench); component.m_resources = (Requirement[])(object)new Requirement[0]; AddResources(component, "CarvedWood_bal", 1, "FineWood", 1); AddResources(component, "Stone", 1); AddResources(component, "WoodBucketWater_bal", 1, "Wood", 2); AddResources(component, "EnrichedSoil_bal", 2, "Flint", 1); component.m_category = (PieceCategory)0; break; case "blackmarble_sarcophagus_bal": SetStation(component, TableMapper.stoneCutter); component.m_resources = (Requirement[])(object)new Requirement[0]; AddResources(component, "BlackMarble", 25); AddResources(component, "BoneFragments", 25); AddResources(component, "GreydwarfEye", 10); AddResources(component, "DvergrKeyFragment", 1); component.m_category = (PieceCategory)4; break; case "StatueOdin_bal": SetStation(component, TableMapper.stoneCutter); component.m_resources = (Requirement[])(object)new Requirement[0]; AddResources(component, "BlackMarble", 15); AddResources(component, "Stone", 5); AddResources(component, "Opal_bal", 1, "Ruby", 1); component.m_category = (PieceCategory)0; break; case "StatueFace_bal": SetStation(component, TableMapper.stoneCutter); component.m_resources = (Requirement[])(object)new Requirement[0]; AddResources(component, "Stone", 10); AddResources(component, "Sapphire_bal", 1, "Ruby", 1); component.m_category = (PieceCategory)0; break; case "StatueEagle_bal": SetStation(component, TableMapper.stoneCutter); component.m_resources = (Requirement[])(object)new Requirement[0]; AddResources(component, "Stone", 20); component.m_category = (PieceCategory)0; break; case "StatueRaven_bal": SetStation(component, TableMapper.stoneCutter); component.m_resources = (Requirement[])(object)new Requirement[0]; AddResources(component, "Stone", 20); component.m_category = (PieceCategory)0; break; case "StatueWolf_bal": SetStation(component, TableMapper.stoneCutter); component.m_resources = (Requirement[])(object)new Requirement[0]; AddResources(component, "Stone", 50); component.m_category = (PieceCategory)0; break; case "StatueThor_bal": SetStation(component, TableMapper.stoneCutter); component.m_resources = (Requirement[])(object)new Requirement[0]; AddResources(component, "BlackMarble", 25); AddResources(component, "Stone", 10); AddResources(component, "Sapphire_bal", 2, "Ruby", 2); component.m_category = (PieceCategory)0; break; case "dvergr_bed_bal": SetStation(component, TableMapper.forge); component.m_resources = (Requirement[])(object)new Requirement[0]; AddResources(component, "Wood", 2); AddResources(component, "ScaleHide", 2); AddResources(component, "YggdrasilWood", 2); AddResources(component, "Copper", 2); component.m_category = (PieceCategory)4; break; case "dvergr_chair_bal": SetStation(component, TableMapper.forge); AddResources(component, "LeatherScraps", 2); AddResources(component, "YggdrasilWood", 2); AddResources(component, "Copper", 2); component.m_category = (PieceCategory)4; break; case "dvergr_chest_bal": SetStation(component, TableMapper.forge); AddResources(component, "BronzeNails", 12); AddResources(component, "YggdrasilWood", 5); AddResources(component, "Copper", 5); component.m_category = (PieceCategory)4; break; case "dvergr_shelf_bal": SetStation(component, TableMapper.forge); AddResources(component, "Wood", 2); AddResources(component, "YggdrasilWood", 1); AddResources(component, "Copper", 1); component.m_category = (PieceCategory)4; break; case "wood_shelf_wall_bal": SetStation(component, TableMapper.heavyWorkbench); AddResources(component, "CarvedWood_bal", 2, "RoundLog", 1); AddResources(component, "FineWood", 1); AddResources(component, "WoodNails_bal", 2, "Wood", 1); component.m_category = (PieceCategory)4; break; case "dvergr_shelf_high_bal": SetStation(component, TableMapper.forge); AddResources(component, "Wood", 3); AddResources(component, "YggdrasilWood", 2); AddResources(component, "Copper", 1); component.m_category = (PieceCategory)4; break; case "dvergr_shelf_wall_bal": SetStation(component, TableMapper.forge); AddResources(component, "Wood", 2); AddResources(component, "YggdrasilWood", 1); AddResources(component, "Copper", 1); component.m_category = (PieceCategory)4; break; case "dvergr_shelf_wall_small_bal": SetStation(component, TableMapper.forge); AddResources(component, "Wood", 1); AddResources(component, "YggdrasilWood", 1); AddResources(component, "Copper", 1); component.m_category = (PieceCategory)4; break; case "dvergr_cabinet_small_wall_bal": case "dvergr_cabinet_small_drawer_bal": case "dvergr_cabinet_small_bal": SetStation(component, TableMapper.forge); AddResources(component, "Wood", 2); AddResources(component, "YggdrasilWood", 2); AddResources(component, "Copper", 2); component.m_category = (PieceCategory)4; break; case "dvergr_cabinet_high_bal": case "dvergr_cabinet_bal": case "dvergr_cabinet_wall_bal": SetStation(component, TableMapper.forge); AddResources(component, "Wood", 4); AddResources(component, "YggdrasilWood", 3); AddResources(component, "Copper", 3); component.m_category = (PieceCategory)4; break; case "dvergr_stool_bal": SetStation(component, TableMapper.forge); AddResources(component, "Wood", 2); AddResources(component, "YggdrasilWood", 2); AddResources(component, "Copper", 2); component.m_category = (PieceCategory)4; break; case "dvergr_table_bal": SetStation(component, TableMapper.forge); AddResources(component, "IronNails", 8); AddResources(component, "Wood", 2); AddResources(component, "YggdrasilWood", 2); AddResources(component, "Copper", 2); component.m_category = (PieceCategory)4; break; case "piece_chest_private_bal": component.m_category = (PieceCategory)4; SetStation(component, TableMapper.magetable); AddResources(component, "BronzeNails", 40); AddResources(component, "YggdrasilWood", 25); AddResources(component, "DvergrKeyFragment", 1); AddResources(component, "Sap", 10); break; case "bed_noble_bal": SetStation(component, TableMapper.forge); AddResources(component, "FlametalNew", 2); AddResources(component, "Blackwood", 15); AddResources(component, "JuteRed", 4); AddResources(component, "LinenThread", 10); component.m_category = (PieceCategory)4; break; case "black_carpet_end_bal": SetStation(component, TableMapper.heavyWorkbench); AddResources(component, "AskHide", 1); AddResources(component, "LinenThread", 2); AddResources(component, "Coal", 2); component.m_category = (PieceCategory)4; break; case "black_carpet_mid_bal": SetStation(component, TableMapper.heavyWorkbench); AddResources(component, "AskHide", 2); AddResources(component, "LinenThread", 8); AddResources(component, "Coal", 4); AddResources(component, "JuteRed", 1); component.m_category = (PieceCategory)4; break; case "bone_pile_bal": SetStation(component, TableMapper.workbench); component.m_resources = (Requirement[])(object)new Requirement[0]; AddResources(component, "BoneFragments", 20); AddResources(component, "TrophySkeleton", 5); component.m_category = (PieceCategory)0; break; case "piece_mosscrown_bal": SetStation(component, TableMapper.workbench); component.m_resources = (Requirement[])(object)new Requirement[0]; AddResources(component, "Moss_bal", 5, "Dandelion", 2); AddResources(component, "Wood", 3); component.m_category = (PieceCategory)4; break; case "core_wood_bed_bal": SetStation(component, TableMapper.heavyWorkbench); component.m_resources = (Requirement[])(object)new Requirement[0]; AddResources(component, "TrollHide", 2); AddResources(component, "Straw_bal", 3, "Dandelion", 2); AddResources(component, "RoundLog", 5); AddResources(component, "Wood", 3); component.m_category = (PieceCategory)4; break; case "ground_spike_trap_bal": SetStation(component, TableMapper.workbench); component.m_resources = (Requirement[])(object)new Requirement[0]; AddResources(component, "Root", 2); AddResources(component, "Straw_bal", 2, "Wood", 1); AddResources(component, "BoneFragments", 5); component.m_category = (PieceCategory)0; break; case "piece_banner10_bal": SetStation(component, TableMapper.heavyWorkbench); component.m_category = (PieceCategory)4; AddResources(component, "FineWood", 2); AddResources(component, "DyeKit_bal", 1, "Cloudberry", 2); AddResources(component, "LeatherScraps", 3); AddResources(component, "StrawThread_bal", 3, "Wood", 2); break; case "piece_banner11_bal": SetStation(component, TableMapper.heavyWorkbench); component.m_category = (PieceCategory)4; AddResources(component, "FineWood", 2); AddResources(component, "DyeKit_bal", 1, "Blueberries", 3); AddResources(component, "LeatherScraps", 3); AddResources(component, "StrawThread_bal", 3, "Wood", 2); break; case "piece_banner12_bal": SetStation(component, TableMapper.heavyWorkbench); component.m_category = (PieceCategory)4; AddResources(component, "FineWood", 2); AddResources(component, "DyeKit_bal", 1, "Bloodbag", 1); AddResources(component, "JuteRed", 1); AddResources(component, "StrawThread_bal", 3, "Wood", 2); break; case "piece_banner13_bal": SetStation(component, TableMapper.heavyWorkbench); component.m_category = (PieceCategory)4; AddResources(component, "Blackwood", 1); AddResources(component, "DyeKit_bal", 1, "Bloodbag", 1); AddResources(component, "JuteRed", 1); AddResources(component, "StrawThread_bal", 3, "Wood", 2); break; case "piece_banner_metal1_bal": SetStation(component, TableMapper.forge); AddResources(component, "Iron", 1); AddResources(component, "LinenThread", 1); AddResources(component, "DyeKit_bal", 1, "Cloudberry", 2); AddResources(component, "Coal", 2); component.m_category = (PieceCategory)4; break; case "piece_banner_metal1_long_bal": SetStation(component, TableMapper.forge); AddResources(component, "Iron", 1); AddResources(component, "LinenThread", 2); AddResources(component, "DyeKit_bal", 2, "Cloudberry", 4); AddResources(component, "Coal", 2); component.m_category = (PieceCategory)4; break; case "piece_banner_metal2_bal": SetStation(component, TableMapper.forge); AddResources(component, "Iron", 1); AddResources(component, "LinenThread", 1); AddResources(component, "DyeKit_bal", 1, "Raspberry", 2); AddResources(component, "Coal", 2); component.m_category = (PieceCategory)4; break; case "piece_banner_metal2_long_bal": SetStation(component, TableMapper.forge); AddResources(component, "Iron", 1); AddResources(component, "LinenThread", 2); AddResources(component, "DyeKit_bal", 2, "Raspberry", 4); AddResources(component, "Coal", 2); component.m_category = (PieceCategory)4; break; case "piece_banner_metal4_bal": SetStation(component, TableMapper.forge); AddResources(component, "Iron", 1); AddResources(component, "LinenThread", 1); AddResources(component, "DyeKit_bal", 1, "Blueberries", 2); AddResources(component, "Coal", 2); component.m_category = (PieceCategory)4; break; case "piece_banner_metal4_long_bal": SetStation(component, TableMapper.forge); AddResources(component, "Iron", 1); AddResources(component, "LinenThread", 2); AddResources(component, "DyeKit_bal", 2, "Blueberries", 4); AddResources(component, "Coal", 2); component.m_category = (PieceCategory)4; break; case "piece_darkwood_bench_bal": SetStation(component, TableMapper.heavyWorkbench); AddResources(component, "ElderBark", 5); AddResources(component, "IronNails", 4); AddResources(component, "FineWood", 3); component.m_category = (PieceCategory)4; break; case "piece_banner_metal3_bal": SetStation(component, TableMapper.forge); AddResources(component, "Iron", 1); AddResources(component, "LinenThread", 1); AddResources(component, "DyeKit_bal", 1, "Guck", 2); AddResources(component, "Coal", 2); component.m_category = (PieceCategory)4; break; case "piece_banner_metal3_long_bal": SetStation(component, TableMapper.forge); AddResources(component, "Iron", 1); AddResources(component, "LinenThread", 2); AddResources(component, "DyeKit_bal", 2, "Guck", 4); AddResources(component, "Coal", 2); component.m_category = (PieceCategory)4; break; case "piece_banner_black1_bal": SetStation(component, TableMapper.forge); AddResources(component, "HardWood_bal", 1, "FineWood", 2); AddResources(component, "LeatherScraps", 4); AddResources(component, "DyeKit_bal", 2, "Blueberries", 3); AddResources(component, "Coal", 2); component.m_category = (PieceCategory)4; break; case "piece_banner_black2_bal": SetStation(component, TableMapper.forge); AddResources(component, "HardWood_bal", 1, "FineWood", 2); AddResources(component, "LeatherScraps", 4); AddResources(component, "DyeKit_bal", 2, "Resin", 3); AddResources(component, "Coal", 2); component.m_category = (PieceCategory)4; break; case "piece_banner_black3_bal": SetStation(component, TableMapper.forge); AddResources(component, "HardWood_bal", 1, "FineWood", 2); AddResources(component, "LeatherScraps", 4); AddResources(component, "DyeKit_bal", 2, "Guck", 1); AddResources(component, "Coal", 2); component.m_category = (PieceCategory)4; break; case "piece_banner_black4_bal": SetStation(component, TableMapper.forge); AddResources(component, "HardWood_bal", 1, "FineWood", 2); AddResources(component, "LeatherScraps", 4); AddResources(component, "DyeKit_bal", 2, "Bloodbag", 1); AddResources(component, "Coal", 2); component.m_category = (PieceCategory)4; break; case "piece_bed03_bal": SetStation(component, TableMapper.workbench); AddResources(component, "JuteRed", 2); AddResources(component, "JuteBlue", 4); AddResources(component, "Coal", 10); AddResources(component, "YggdrasilWood", 20); component.m_category = (PieceCategory)4; break; case "piece_chicken_nest_bal": SetStation(component, TableMapper.workbench); AddResources(component, "Straw_bal", 5, "Dandelion", 2); AddResources(component, "Wood", 1); component.m_category = (PieceCategory)4; break; case "clutter_ropepile_bal": SetStation(component, TableMapper.workbench); AddResources(component, "StrawThread_bal", 10