Decompiled source of MoonforgedBuildPieces v1.0.1

MoonforgedBuildPieces.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using Jotunn.Configs;
using Jotunn.Entities;
using Jotunn.Managers;
using UnityEngine;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("CaenosRelics")]
[assembly: AssemblyDescription("A Valheim mod that adds custom relics, statues, and decor.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Caenos")]
[assembly: AssemblyProduct("CaenosRelics Mod")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("e3243d22-4307-4008-ba36-9f326008cde5")]
[assembly: AssemblyFileVersion("2.2.2")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.2.2.0")]
namespace Moonforged.BuildPieces;

public class ConfigSync
{
	private readonly List<OwnConfigEntryBase> _entries = new List<OwnConfigEntryBase>();

	public bool IsSourceOfTruth { get; private set; } = true;


	public string ModName { get; }

	public ConfigSync(string name)
	{
		ModName = name;
	}

	public void AddEntry(OwnConfigEntryBase entry)
	{
		if (entry == null)
		{
			throw new ArgumentNullException("entry");
		}
		if (!_entries.Contains(entry))
		{
			_entries.Add(entry);
		}
	}

	public SyncedConfigEntry<T> AddConfigEntry<T>(ConfigEntry<T> entry)
	{
		if (entry == null)
		{
			throw new ArgumentNullException("entry");
		}
		SyncedConfigEntry<T> syncedConfigEntry = new SyncedConfigEntry<T>(entry);
		AddEntry(syncedConfigEntry);
		return syncedConfigEntry;
	}

	public void SetSourceOfTruth(bool isSource)
	{
		IsSourceOfTruth = isSource;
	}
}
public class LampColorSwitcher : MonoBehaviour, Interactable, Hoverable
{
	private int index = 0;

	private const int OFF_INDEX = -1;

	private Light[] lights;

	private Renderer[] allRenderers;

	private Renderer[] bulbRenderers;

	private LightFlicker[] flickers;

	private LightLod[] lods;

	private ParticleSystem[] particles;

	private ZNetView znv;

	private readonly Color[] colors = (Color[])(object)new Color[4]
	{
		new Color(1f, 0.82f, 0.28f),
		new Color(0.22f, 0.85f, 0.32f),
		new Color(0.28f, 0.48f, 0.95f),
		new Color(0.95f, 0.3f, 0.7f)
	};

	private readonly string[] names = new string[4] { "Yellow", "Green", "Blue", "Dvergr Pink" };

	private const string ZDO_KEY = "LampColorIndex";

	private const string ZDO_INIT = "initialized";

	private void Awake()
	{
		lights = ((Component)this).GetComponentsInChildren<Light>(true);
		allRenderers = ((Component)this).GetComponentsInChildren<Renderer>(true);
		bulbRenderers = Array.FindAll(allRenderers, delegate(Renderer r)
		{
			Material[] sharedMaterials = r.sharedMaterials;
			foreach (Material val2 in sharedMaterials)
			{
				if ((Object)(object)val2 != (Object)null && ((Object)val2).name.StartsWith("M_Bulb"))
				{
					return true;
				}
			}
			return false;
		});
		flickers = ((Component)this).GetComponentsInChildren<LightFlicker>(true);
		lods = ((Component)this).GetComponentsInChildren<LightLod>(true);
		particles = ((Component)this).GetComponentsInChildren<ParticleSystem>(true);
		Collider componentInChildren = ((Component)this).GetComponentInChildren<Collider>();
		if ((Object)(object)componentInChildren == (Object)null)
		{
			CapsuleCollider val = ((Component)this).gameObject.AddComponent<CapsuleCollider>();
			((Collider)val).isTrigger = true;
			val.radius = 0.25f;
			val.height = 1.2f;
		}
		znv = ((Component)this).GetComponent<ZNetView>();
		if (!Object.op_Implicit((Object)(object)znv))
		{
			return;
		}
		znv.Register<int>("SetLampState", (Action<long, int>)RPC_SetLampState);
		ZDO zDO = znv.GetZDO();
		if (zDO != null)
		{
			if (znv.IsOwner() && !zDO.GetBool("initialized", false))
			{
				index = Random.Range(0, colors.Length);
				zDO.Set("LampColorIndex", index);
				zDO.Set("initialized", true);
			}
			index = zDO.GetInt("LampColorIndex", index);
			ApplyState();
		}
	}

	public bool Interact(Humanoid user, bool hold, bool alt)
	{
		if (hold)
		{
			return false;
		}
		if (!Object.op_Implicit((Object)(object)znv) || !znv.IsOwner())
		{
			return false;
		}
		ZDO zDO = znv.GetZDO();
		if (zDO == null)
		{
			return false;
		}
		if (index == -1)
		{
			index = 0;
			zDO.Set("LampColorIndex", index);
			znv.InvokeRPC(ZNetView.Everybody, "SetLampState", new object[1] { index });
			return true;
		}
		if (index < colors.Length - 1)
		{
			index++;
		}
		else
		{
			index = -1;
		}
		zDO.Set("LampColorIndex", index);
		znv.InvokeRPC(ZNetView.Everybody, "SetLampState", new object[1] { index });
		return true;
	}

	public bool Interact(Humanoid user, bool hold)
	{
		return Interact(user, hold, alt: false);
	}

	public bool UseItem(Humanoid user, ItemData item)
	{
		return false;
	}

	private void RPC_SetLampState(long sender, int newState)
	{
		index = newState;
		ApplyState();
	}

	private void ApplyState()
	{
		//IL_0192: Unknown result type (might be due to invalid IL or missing references)
		//IL_0197: Unknown result type (might be due to invalid IL or missing references)
		//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f4: Unknown result type (might be due to invalid IL or missing references)
		//IL_02fa: Unknown result type (might be due to invalid IL or missing references)
		//IL_0157: Unknown result type (might be due to invalid IL or missing references)
		if (index == -1)
		{
			Light[] array = lights;
			foreach (Light val in array)
			{
				if (Object.op_Implicit((Object)(object)val))
				{
					((Behaviour)val).enabled = false;
				}
			}
			LightFlicker[] array2 = flickers;
			foreach (LightFlicker val2 in array2)
			{
				if (Object.op_Implicit((Object)(object)val2))
				{
					((Behaviour)val2).enabled = false;
				}
			}
			LightLod[] array3 = lods;
			foreach (LightLod val3 in array3)
			{
				if (Object.op_Implicit((Object)(object)val3))
				{
					((Behaviour)val3).enabled = false;
				}
			}
			ParticleSystem[] array4 = particles;
			foreach (ParticleSystem val4 in array4)
			{
				if (Object.op_Implicit((Object)(object)val4))
				{
					val4.Stop(true);
					((Component)val4).gameObject.SetActive(false);
				}
			}
			Renderer[] array5 = bulbRenderers;
			foreach (Renderer val5 in array5)
			{
				Material[] materials = val5.materials;
				foreach (Material val6 in materials)
				{
					if (val6.HasProperty("_EmissionColor"))
					{
						val6.DisableKeyword("_EMISSION");
						val6.SetColor("_EmissionColor", Color.black);
					}
				}
			}
			return;
		}
		Color val7 = colors[index];
		Light[] array6 = lights;
		foreach (Light val8 in array6)
		{
			if (Object.op_Implicit((Object)(object)val8))
			{
				((Behaviour)val8).enabled = true;
				val8.color = val7;
			}
		}
		LightFlicker[] array7 = flickers;
		foreach (LightFlicker val9 in array7)
		{
			if (Object.op_Implicit((Object)(object)val9))
			{
				((Behaviour)val9).enabled = true;
			}
		}
		LightLod[] array8 = lods;
		foreach (LightLod val10 in array8)
		{
			if (Object.op_Implicit((Object)(object)val10))
			{
				((Behaviour)val10).enabled = true;
			}
		}
		ParticleSystem[] array9 = particles;
		foreach (ParticleSystem val11 in array9)
		{
			if (Object.op_Implicit((Object)(object)val11))
			{
				((Component)val11).gameObject.SetActive(true);
				val11.Play();
			}
		}
		Renderer[] array10 = bulbRenderers;
		foreach (Renderer val12 in array10)
		{
			Material[] materials2 = val12.materials;
			foreach (Material val13 in materials2)
			{
				if (val13.HasProperty("_EmissionColor"))
				{
					val13.EnableKeyword("_EMISSION");
					val13.SetColor("_EmissionColor", val7 * 3f);
				}
			}
		}
	}

	public string GetHoverText()
	{
		if (index == -1)
		{
			return "[E] Turn On";
		}
		return "[E] Change color (" + names[index] + ")";
	}

	public string GetHoverName()
	{
		return "Lamp";
	}
}
[BepInPlugin("Moonforged.BuildPieces", "Moonforged Build Pieces", "1.0.1")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class MoonforgedBuildPieces : BaseUnityPlugin
{
	public const string PluginGUID = "Moonforged.BuildPieces";

	public const string PluginName = "Moonforged Build Pieces";

	public const string PluginVersion = "1.0.1";

	private AssetBundle relicsBundle;

	private static readonly List<GameObject> placedObjects = new List<GameObject>();

	public static void TrackAllPrefabsInBundle(AssetBundle bundle)
	{
		GameObject[] array = bundle.LoadAllAssets<GameObject>();
		foreach (GameObject val in array)
		{
			if ((Object)(object)val != (Object)null && (Object)(object)val.GetComponent<PlacementWatcher>() == (Object)null)
			{
				val.AddComponent<PlacementWatcher>().RegisterList = placedObjects;
			}
		}
	}

	private void Awake()
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
		new Harmony("moonforged.buildpieces.scalingdebug").PatchAll();
		RelicConfigManager.Init("Moonforged.BuildPieces", ((BaseUnityPlugin)this).Config);
		string[] manifestResourceNames = Assembly.GetExecutingAssembly().GetManifestResourceNames();
		foreach (string text in manifestResourceNames)
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)("FOUND RESOURCE: " + text));
		}
		string resourcePath = "Moonforged.BuildPieces.mbp";
		relicsBundle = EmbeddedAssetBundleLoader.LoadBundle(resourcePath);
		if ((Object)(object)relicsBundle == (Object)null)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)"Failed to load embedded AssetBundle.");
			return;
		}
		TrackAllPrefabsInBundle(relicsBundle);
		RelicRegistrar.InitConfig(((BaseUnityPlugin)this).Config);
		foreach (string allCategory in RelicRegistrar.GetAllCategories())
		{
			PieceManager.Instance.AddPieceCategory(allCategory);
		}
		PrefabManager.OnPrefabsRegistered += delegate
		{
			RelicRegistrar.RegisterAllRelics(relicsBundle);
		};
	}
}
public static class EmbeddedAssetBundleLoader
{
	public static AssetBundle LoadBundle(string resourcePath)
	{
		Assembly executingAssembly = Assembly.GetExecutingAssembly();
		using Stream stream = executingAssembly.GetManifestResourceStream(resourcePath);
		if (stream == null)
		{
			Debug.LogError((object)("AssetBundle resource not found: " + resourcePath));
			return null;
		}
		byte[] array = new byte[stream.Length];
		stream.Read(array, 0, array.Length);
		return AssetBundle.LoadFromMemory(array);
	}
}
public abstract class OwnConfigEntryBase
{
	public abstract string GetSerializedValue();

	public abstract void SetSerializedValue(string value);
}
public class PlacementWatcher : MonoBehaviour
{
	public List<GameObject> RegisterList;

	private void Start()
	{
		if (RegisterList != null && !RegisterList.Contains(((Component)this).gameObject))
		{
			RegisterList.Add(((Component)this).gameObject);
		}
	}

	private void OnDestroy()
	{
		if (RegisterList != null)
		{
			int num = RegisterList.IndexOf(((Component)this).gameObject);
			if (num >= 0)
			{
				RegisterList.RemoveAt(num);
			}
		}
	}
}
public static class RelicConfigManager
{
	private static ConfigSync _configSync;

	public static void Init(string modName, ConfigFile config)
	{
		_configSync = new ConfigSync(modName);
	}

	public static SyncedConfigEntry<T> AddEntry<T>(ConfigFile cfg, string section, string key, T defaultValue, string description)
	{
		ConfigEntry<T> entry = cfg.Bind<T>(section, key, defaultValue, description);
		return _configSync.AddConfigEntry<T>(entry);
	}

	public static void SetServerSync(bool enabled)
	{
		_configSync?.SetSourceOfTruth(enabled);
	}
}
public class RelicRegistration
{
	public string PrefabName;

	public string DisplayName;

	public RequirementConfig[] Requirements;

	public string Description;

	public string Category;

	public int Comfort;

	public RelicRegistration(string prefab, string display, RequirementConfig[] reqs, string desc, string cat, int comfort = 0)
	{
		PrefabName = prefab;
		DisplayName = display;
		Requirements = reqs;
		Description = desc;
		Category = cat;
		Comfort = comfort;
	}
}
public static class RelicRegistrar
{
	private static bool wasAlreadyRegistered = false;

	private static SyncedConfigEntry<string> FurnitureCategoryConfig;

	private static SyncedConfigEntry<string> BuildingCategoryConfig;

	private static SyncedConfigEntry<string> ClutterCategoryConfig;

	private static SyncedConfigEntry<string> StatuesCategoryConfig;

	public static readonly List<RelicRegistration> AllRegistrations = new List<RelicRegistration>
	{
		new RelicRegistration("M_PersianRug_1", "Persian Rug I", (RequirementConfig[])(object)new RequirementConfig[1]
		{
			new RequirementConfig("JuteRed", 4, 0, true)
		}, "A custom decorative piece.", "furniture"),
		new RelicRegistration("M_PersianRug_2", "Persian Rug II", (RequirementConfig[])(object)new RequirementConfig[1]
		{
			new RequirementConfig("JuteBlue", 4, 0, true)
		}, "A custom decorative piece.", "furniture"),
		new RelicRegistration("M_PersianRug_3", "Persian Rug III", (RequirementConfig[])(object)new RequirementConfig[1]
		{
			new RequirementConfig("JuteRed", 4, 0, true)
		}, "A custom decorative piece.", "furniture"),
		new RelicRegistration("M_PersianRug_4", "Regal Persian Rug", (RequirementConfig[])(object)new RequirementConfig[2]
		{
			new RequirementConfig("JuteRed", 4, 0, true),
			new RequirementConfig("JuteBlue", 4, 0, true)
		}, "A custom decorative piece.", "furniture"),
		new RelicRegistration("M_Jute_Stairs_Rug", "Jute Stair Rug", (RequirementConfig[])(object)new RequirementConfig[1]
		{
			new RequirementConfig("JuteRed", 4, 0, true)
		}, "A custom decorative piece.", "furniture"),
		new RelicRegistration("M_Jute_Stairs_Rug_Blue", "Blue Jute Stair Rug", (RequirementConfig[])(object)new RequirementConfig[1]
		{
			new RequirementConfig("JuteBlue", 4, 0, true)
		}, "A custom decorative piece.", "furniture"),
		new RelicRegistration("M_Jute_Stairs_Rug_Blue_Runed", "Runed Blue Jute Stair Rug", (RequirementConfig[])(object)new RequirementConfig[1]
		{
			new RequirementConfig("JuteBlue", 4, 0, true)
		}, "A custom decorative piece.", "furniture"),
		new RelicRegistration("M_Jute_Stairs_Rug_Small", "Small Jute Stair Rug", (RequirementConfig[])(object)new RequirementConfig[1]
		{
			new RequirementConfig("JuteRed", 2, 0, true)
		}, "A custom decorative piece.", "furniture"),
		new RelicRegistration("M_Jute_Stairs_Runed", "Runed Jute Stair Rug", (RequirementConfig[])(object)new RequirementConfig[1]
		{
			new RequirementConfig("JuteRed", 4, 0, true)
		}, "A custom decorative piece.", "furniture"),
		new RelicRegistration("M_Stairs_Rug_Wool", "Wool Stair Rug", (RequirementConfig[])(object)new RequirementConfig[1]
		{
			new RequirementConfig("DeerHide", 4, 0, true)
		}, "A custom decorative piece.", "furniture"),
		new RelicRegistration("M_Stairs_Rug_Green_Runed", "Runed Green Stair Rug", (RequirementConfig[])(object)new RequirementConfig[2]
		{
			new RequirementConfig("JuteRed", 4, 0, true),
			new RequirementConfig("Ooze", 1, 0, true)
		}, "A custom decorative piece.", "furniture"),
		new RelicRegistration("M_Stairs_Rug_Green", "Green Stair Rug", (RequirementConfig[])(object)new RequirementConfig[2]
		{
			new RequirementConfig("JuteRed", 4, 0, true),
			new RequirementConfig("Ooze", 1, 0, true)
		}, "A custom decorative piece.", "furniture"),
		new RelicRegistration("M_BlueRug", "Blue Rug", (RequirementConfig[])(object)new RequirementConfig[1]
		{
			new RequirementConfig("JuteBlue", 4, 0, true)
		}, "A custom decorative piece.", "furniture"),
		new RelicRegistration("M_Red_2m_semiround_rug", "Red Semiround Rug", (RequirementConfig[])(object)new RequirementConfig[1]
		{
			new RequirementConfig("JuteRed", 4, 0, true)
		}, "A custom decorative piece.", "furniture"),
		new RelicRegistration("M_2m_semiround_rug", "Brown Semiround Rug", (RequirementConfig[])(object)new RequirementConfig[1]
		{
			new RequirementConfig("DeerHide", 4, 0, true)
		}, "A custom decorative piece.", "furniture"),
		new RelicRegistration("M_Jute_Round_Red_Rug", "Round Red Jute Rug", (RequirementConfig[])(object)new RequirementConfig[1]
		{
			new RequirementConfig("JuteRed", 4, 0, true)
		}, "A custom decorative piece.", "furniture"),
		new RelicRegistration("M_Jute_Red_Simple_Rug", "Simple Red Jute Rug", (RequirementConfig[])(object)new RequirementConfig[1]
		{
			new RequirementConfig("JuteRed", 4, 0, true)
		}, "A custom decorative piece.", "furniture"),
		new RelicRegistration("M_AsianTeaSetPlate", "Tea Plate", (RequirementConfig[])(object)new RequirementConfig[2]
		{
			new RequirementConfig("Wood", 1, 0, true),
			new RequirementConfig("FineWood", 1, 0, true)
		}, "A custom decorative piece.", "clutter"),
		new RelicRegistration("M_bigplate", "Large Porcelain Plate", (RequirementConfig[])(object)new RequirementConfig[2]
		{
			new RequirementConfig("Stone", 5, 0, true),
			new RequirementConfig("Resin", 2, 0, true)
		}, "A custom decorative piece.", "clutter"),
		new RelicRegistration("M_cup1", "Porcelain Tea Cup", (RequirementConfig[])(object)new RequirementConfig[2]
		{
			new RequirementConfig("Stone", 5, 0, true),
			new RequirementConfig("Resin", 2, 0, true)
		}, "A custom decorative piece.", "clutter"),
		new RelicRegistration("M_justplate1", "Large Porcelain Plate II", (RequirementConfig[])(object)new RequirementConfig[2]
		{
			new RequirementConfig("Stone", 5, 0, true),
			new RequirementConfig("Resin", 2, 0, true)
		}, "A custom decorative piece.", "clutter"),
		new RelicRegistration("M_justcup1", "Porcelain Tea Cup II", (RequirementConfig[])(object)new RequirementConfig[2]
		{
			new RequirementConfig("Stone", 5, 0, true),
			new RequirementConfig("Resin", 2, 0, true)
		}, "A custom decorative piece.", "clutter"),
		new RelicRegistration("M_teapot", "Porcelain Teapot", (RequirementConfig[])(object)new RequirementConfig[2]
		{
			new RequirementConfig("Stone", 5, 0, true),
			new RequirementConfig("Resin", 2, 0, true)
		}, "A custom decorative piece.", "clutter"),
		new RelicRegistration("M_AsianTeaPot", "Asian Teapot", (RequirementConfig[])(object)new RequirementConfig[2]
		{
			new RequirementConfig("Stone", 5, 0, true),
			new RequirementConfig("Resin", 2, 0, true)
		}, "A custom decorative piece.", "clutter"),
		new RelicRegistration("M_AsianTeaCup", "Asian Tea Cup", (RequirementConfig[])(object)new RequirementConfig[2]
		{
			new RequirementConfig("Stone", 5, 0, true),
			new RequirementConfig("Resin", 2, 0, true)
		}, "A custom decorative piece.", "clutter"),
		new RelicRegistration("M_AsianTeaPotLid", "Teapot Lid", (RequirementConfig[])(object)new RequirementConfig[2]
		{
			new RequirementConfig("Stone", 5, 0, true),
			new RequirementConfig("Resin", 2, 0, true)
		}, "A custom decorative piece.", "clutter"),
		new RelicRegistration("M_ChineseVase", "Chinese Vase", (RequirementConfig[])(object)new RequirementConfig[2]
		{
			new RequirementConfig("Crystal", 5, 0, true),
			new RequirementConfig("Resin", 2, 0, true)
		}, "A custom decorative piece.", "clutter"),
		new RelicRegistration("M_ChineseTeaSet", "Chinese Tea Set", (RequirementConfig[])(object)new RequirementConfig[2]
		{
			new RequirementConfig("Stone", 5, 0, true),
			new RequirementConfig("Resin", 2, 0, true)
		}, "A custom decorative piece.", "clutter"),
		new RelicRegistration("M_Classic_Lamp", "Classic Street Lamp", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Resin", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_Japanese_Lamp", "Japanese Street Lamp", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Resin", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_Classic_Iron_Bench", "Classic Iron Bench", (RequirementConfig[])(object)new RequirementConfig[2]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true)
		}, "Dvergr Forged Classic Iron Bench.", "furniture"),
		new RelicRegistration("M_Classic_Double_Lamp", "Classic Double Lamp", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Resin", 4, 0, true)
		}, "Dvergr Forged Classic Iron 2x Lamp.", "building"),
		new RelicRegistration("M_Classic_Double_Lamp_2", "Classic Double Lamp II", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Resin", 4, 0, true)
		}, "Dvergr Forged Classic Iron 2x Lamp.", "building"),
		new RelicRegistration("M_classic_bin", "Classic Garden Bin", (RequirementConfig[])(object)new RequirementConfig[2]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true)
		}, "Dvergr Forged Classic Iron Bin.", "furniture"),
		new RelicRegistration("M_Classic_Single_Lamp", "Classic Single Lamp", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Resin", 4, 0, true)
		}, "Dvergr Forged Classic Iron 1x Lamp.", "building"),
		new RelicRegistration("M_Chinese_Lamp", "Chinese Lamp", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Resin", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_classic_quad_light", "Classic Quad Lamp", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Resin", 4, 0, true)
		}, "Dvergr Forged Classic Iron 4x Lamp.", "building"),
		new RelicRegistration("M_Classic_Wall_Lamp", "Classic Wall Lamp", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Resin", 4, 0, true)
		}, "Dvergr Forged Classic Iron Wall Lamp.", "building"),
		new RelicRegistration("M_Classic_Wall_Lamp_2", "Classic Wall Lamp II", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Resin", 4, 0, true)
		}, "Dvergr Forged Classic Iron Wall Lamp.", "building"),
		new RelicRegistration("M_Pirate_Ship_Cannon", "Pirate Cannon", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Resin", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_Pirate_Ship_Cannon_Balls", "Cannonballs", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Resin", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_M1857_12Pounder_Cannon_Cannonballs", "12-Pounder Cannonballs", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Resin", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_M1857_12Pounder_Cannon", "12-Pounder Cannon", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Resin", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_BrownBearMozaic", "Bear Mosaic Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_GreenCloverMozaic", "Clover Mosaic Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_CrowMozaic", "Crow Mosaic Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_RoundMozaic", "Round Mosaic Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_ChurchMozaic", "Church Rose Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_WorldTreeMozaic", "World Tree Mosaic Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_OdinMozaic", "Odin Mosaic Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_ArchedWindowMozaic", "Valkyrie Mosaic Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_ArchedWindowGreen", "Green Arched Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_ArchedWindowPurple", "Purple Arched Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_ArchedWindowPurpleM", "Purple Mosaic Arched Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_ArchedWindowRedM", "Red Mosaic Arched Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_ArchedWindowRed", "Red Arched Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_ArchedWindowBat", "Bat Arched Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_ElfMozaic", "Elf Stained Glass Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_WolfMozaic", "Wolf Stained Glass Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_ArchedWindowC", "Arched Stained Glass Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_Window_1", "H-Pattern Window I", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_Window_2", "H-Pattern Window II", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_Window_3", "H-Pattern Window III", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_Window_2x1", "2×1 Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_Window_2x2", "2×2 Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_Window2x2", "Sunflower 2×2 Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_WoodFrame_Rose_Window", "Rosewood Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_Taker2x3", "Underworld 2×3 Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_MageMozaic", "Mage Stained Glass Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building"),
		new RelicRegistration("M_Mage_Round_Window_Mozaic", "Mage Round Stained Glass Window", (RequirementConfig[])(object)new RequirementConfig[3]
		{
			new RequirementConfig("Iron", 10, 0, true),
			new RequirementConfig("Wood", 4, 0, true),
			new RequirementConfig("Crystal", 4, 0, true)
		}, "", "building")
	};

	public static void InitConfig(ConfigFile cfg)
	{
		FurnitureCategoryConfig = RelicConfigManager.AddEntry(cfg, "Categories", "FurnitureCategory", "Moonforged Furniture", "Hammer tab name for all Moonforged furniture pieces.");
		BuildingCategoryConfig = RelicConfigManager.AddEntry(cfg, "Categories", "BuildingCategory", "Moonforged Building", "Hammer tab name for all Moonforged building pieces.");
		ClutterCategoryConfig = RelicConfigManager.AddEntry(cfg, "Categories", "ClutterCategory", "Moonforged Clutter", "Hammer tab name for all Moonforged clutter pieces.");
		StatuesCategoryConfig = RelicConfigManager.AddEntry(cfg, "Categories", "StatuesCategory", "Moonforged Statues", "Hammer tab name for all Moonforged statue pieces.");
	}

	public static IEnumerable<string> GetAllCategories()
	{
		return AllRegistrations.Select((RelicRegistration r) => CategoryToTab(r.Category)).Distinct();
	}

	private static string CategoryToTab(string category)
	{
		string text = category.ToLower();
		if (1 == 0)
		{
		}
		string result = text switch
		{
			"statue" => (StatuesCategoryConfig != null) ? StatuesCategoryConfig.Value : "Moonforged Statues", 
			"clutter" => (ClutterCategoryConfig != null) ? ClutterCategoryConfig.Value : "Moonforged Clutter", 
			"building" => (BuildingCategoryConfig != null) ? BuildingCategoryConfig.Value : "Moonforged Building", 
			"furniture" => (FurnitureCategoryConfig != null) ? FurnitureCategoryConfig.Value : "Moonforged Furniture", 
			_ => category, 
		};
		if (1 == 0)
		{
		}
		return result;
	}

	public static void RegisterAllRelics(AssetBundle bundle)
	{
		if (wasAlreadyRegistered)
		{
			return;
		}
		foreach (RelicRegistration allRegistration in AllRegistrations)
		{
			RegisterRelic(bundle, allRegistration);
		}
		wasAlreadyRegistered = true;
	}

	private static void RegisterRelic(AssetBundle bundle, RelicRegistration reg)
	{
		//IL_03f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_03f9: Expected O, but got Unknown
		//IL_040f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0414: Unknown result type (might be due to invalid IL or missing references)
		//IL_0420: Expected O, but got Unknown
		//IL_0431: Unknown result type (might be due to invalid IL or missing references)
		//IL_0436: Unknown result type (might be due to invalid IL or missing references)
		//IL_0443: Expected O, but got Unknown
		//IL_0480: Unknown result type (might be due to invalid IL or missing references)
		//IL_0487: Expected O, but got Unknown
		//IL_049e: Unknown result type (might be due to invalid IL or missing references)
		//IL_04a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_04b0: Expected O, but got Unknown
		//IL_04c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_04c6: Unknown result type (might be due to invalid IL or missing references)
		//IL_04d3: Expected O, but got Unknown
		//IL_05dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_05e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_05ed: Unknown result type (might be due to invalid IL or missing references)
		//IL_05ff: Unknown result type (might be due to invalid IL or missing references)
		//IL_0608: Unknown result type (might be due to invalid IL or missing references)
		//IL_0617: Expected O, but got Unknown
		//IL_0620: Unknown result type (might be due to invalid IL or missing references)
		//IL_062a: Expected O, but got Unknown
		if ((Object)(object)bundle == (Object)null)
		{
			return;
		}
		GameObject val = bundle.LoadAsset<GameObject>(reg.PrefabName);
		if ((Object)(object)val == (Object)null)
		{
			return;
		}
		((Object)val).name = reg.PrefabName;
		ZNetView val2 = val.GetComponent<ZNetView>() ?? val.AddComponent<ZNetView>();
		val2.m_persistent = true;
		val2.m_syncInitialScale = true;
		if (!Object.op_Implicit((Object)(object)val.GetComponent<ZSyncTransform>()))
		{
			val.AddComponent<ZSyncTransform>();
		}
		Piece val3 = val.GetComponent<Piece>() ?? val.AddComponent<Piece>();
		val3.m_name = reg.DisplayName;
		val3.m_description = reg.Description;
		val3.m_groundOnly = false;
		GameObject val4 = null;
		GameObject val5 = null;
		GameObject val6 = null;
		GameObject val7 = null;
		string text = reg.PrefabName.ToLowerInvariant();
		bool flag = false;
		if (reg.DisplayName != null && reg.DisplayName.ToLower().Contains("window"))
		{
			flag = true;
		}
		if (reg.PrefabName.ToLower().Contains("mozaic"))
		{
			flag = true;
		}
		HashSet<string> hashSet = new HashSet<string> { "M_teapot", "M_cup1", "M_justcup1", "M_justplate1", "M_bigplate", "M_AsianTeaPot", "M_AsianTeaCup", "M_AsianTeaPotLid", "M_ChineseVase" };
		bool flag2 = hashSet.Contains(reg.PrefabName);
		bool flag3 = text.Contains("rug") || text.Contains("carpet");
		bool flag4 = text.Contains("lamp") || text.Contains("lantern") || text.Contains("light");
		bool flag5 = text.Contains("cannon");
		bool flag6 = text.Contains("bench") || text.Contains("bin");
		if (flag2)
		{
			ZNetScene instance = ZNetScene.instance;
			val4 = ((instance != null) ? instance.GetPrefab("vfx_Place_crystal") : null);
			ZNetScene instance2 = ZNetScene.instance;
			val5 = ((instance2 != null) ? instance2.GetPrefab("sfx_build_hammer_crystal") : null);
			ZNetScene instance3 = ZNetScene.instance;
			val7 = ((instance3 != null) ? instance3.GetPrefab("sfx_clay_pot_break") : null);
		}
		else if (flag3)
		{
			ZNetScene instance4 = ZNetScene.instance;
			val4 = ((instance4 != null) ? instance4.GetPrefab("vfx_Place_wood") : null);
			ZNetScene instance5 = ZNetScene.instance;
			val5 = ((instance5 != null) ? instance5.GetPrefab("sfx_build_hammer_wood") : null);
			ZNetScene instance6 = ZNetScene.instance;
			val6 = ((instance6 != null) ? instance6.GetPrefab("vfx_destroyed") : null);
			ZNetScene instance7 = ZNetScene.instance;
			val7 = ((instance7 != null) ? instance7.GetPrefab("sfx_wood_break") : null);
		}
		else if (flag4 || flag5 || flag6)
		{
			ZNetScene instance8 = ZNetScene.instance;
			val4 = ((instance8 != null) ? instance8.GetPrefab("vfx_Place_stone") : null);
			ZNetScene instance9 = ZNetScene.instance;
			val5 = ((instance9 != null) ? instance9.GetPrefab("sfx_build_hammer_metal") : null);
			ZNetScene instance10 = ZNetScene.instance;
			val6 = ((instance10 != null) ? instance10.GetPrefab("vfx_destroyed") : null);
			ZNetScene instance11 = ZNetScene.instance;
			val7 = ((instance11 != null) ? instance11.GetPrefab("sfx_metal_blocked") : null);
		}
		else if (flag)
		{
			ZNetScene instance12 = ZNetScene.instance;
			val4 = ((instance12 != null) ? instance12.GetPrefab("vfx_Place_crystal") : null);
			ZNetScene instance13 = ZNetScene.instance;
			val5 = ((instance13 != null) ? instance13.GetPrefab("sfx_build_hammer_crystal") : null);
			ZNetScene instance14 = ZNetScene.instance;
			val7 = ((instance14 != null) ? instance14.GetPrefab("sfx_clay_pot_break") : null);
		}
		else
		{
			ZNetScene instance15 = ZNetScene.instance;
			val4 = ((instance15 != null) ? instance15.GetPrefab("vfx_Place_wood") : null);
			ZNetScene instance16 = ZNetScene.instance;
			val5 = ((instance16 != null) ? instance16.GetPrefab("sfx_build_hammer_wood") : null);
			ZNetScene instance17 = ZNetScene.instance;
			val6 = ((instance17 != null) ? instance17.GetPrefab("vfx_destroyed") : null);
			ZNetScene instance18 = ZNetScene.instance;
			val7 = ((instance18 != null) ? instance18.GetPrefab("sfx_wood_break") : null);
		}
		EffectList val8 = new EffectList();
		List<EffectData> list = new List<EffectData>();
		if ((Object)(object)val4 != (Object)null)
		{
			list.Add(new EffectData
			{
				m_prefab = val4
			});
		}
		if ((Object)(object)val5 != (Object)null)
		{
			list.Add(new EffectData
			{
				m_prefab = val5
			});
		}
		val8.m_effectPrefabs = list.ToArray();
		val3.m_placeEffect = val8;
		WearNTear val9 = val.GetComponent<WearNTear>() ?? val.AddComponent<WearNTear>();
		val9.m_health = 1000f;
		val9.m_noRoofWear = true;
		EffectList val10 = new EffectList();
		List<EffectData> list2 = new List<EffectData>();
		if ((Object)(object)val6 != (Object)null)
		{
			list2.Add(new EffectData
			{
				m_prefab = val6
			});
		}
		if ((Object)(object)val7 != (Object)null)
		{
			list2.Add(new EffectData
			{
				m_prefab = val7
			});
		}
		val10.m_effectPrefabs = list2.ToArray();
		val9.m_destroyedEffect = val10;
		if (reg.Comfort > 0)
		{
			val3.m_comfort = reg.Comfort;
		}
		Sprite val11 = bundle.LoadAsset<Sprite>(reg.PrefabName);
		if ((Object)(object)val11 != (Object)null)
		{
			val3.m_icon = val11;
		}
		if (flag4 && (Object)(object)val.GetComponent<LampColorSwitcher>() == (Object)null)
		{
			val.AddComponent<LampColorSwitcher>();
		}
		if (flag)
		{
			Renderer[] componentsInChildren = val.GetComponentsInChildren<Renderer>(true);
			foreach (Renderer val12 in componentsInChildren)
			{
				if (Object.op_Implicit((Object)(object)val12))
				{
					val12.shadowCastingMode = (ShadowCastingMode)1;
					val12.receiveShadows = true;
				}
			}
		}
		string craftingStation = (reg.Requirements.Any((RequirementConfig r) => r.Item.ToLower() == "iron") ? "forge" : "piece_workbench");
		PieceConfig val13 = new PieceConfig
		{
			PieceTable = "Hammer",
			Category = CategoryToTab(reg.Category),
			CraftingStation = craftingStation,
			Requirements = reg.Requirements
		};
		PieceManager.Instance.AddPiece(new CustomPiece(val, true, val13));
	}
}
public class SyncedConfigEntry<T> : OwnConfigEntryBase
{
	public ConfigEntry<T> Entry { get; }

	public T Value
	{
		get
		{
			return Entry.Value;
		}
		set
		{
			Entry.Value = value;
		}
	}

	public SyncedConfigEntry(ConfigEntry<T> entry)
	{
		Entry = entry;
	}

	public override string GetSerializedValue()
	{
		return ((ConfigEntryBase)Entry).GetSerializedValue();
	}

	public override void SetSerializedValue(string value)
	{
		((ConfigEntryBase)Entry).SetSerializedValue(value);
	}
}