using System;
using System.Collections.Generic;
using System.Diagnostics;
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 BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Jotunn.Managers;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("FloorsAreRoofsPlugin")]
[assembly: AssemblyDescription("A tiny mod that makes Valheim floors count as a roof so you can build a flat-roofed house")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("FloorsAreRoofsPlugin")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("f31344ca-e6be-44c2-8f7b-41fd6ac15b76")]
[assembly: AssemblyFileVersion("2.0.2")]
[assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.0.2.0")]
[module: UnverifiableCode]
namespace FloorsAreRoofs;
[BepInPlugin("bonesbro.val.floorsareroofs", "Floors Are Roofs", "2.0.2")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class FloorsAreRoofsPlugin : BaseUnityPlugin
{
private const string PluginId = "bonesbro.val.floorsareroofs";
public const string Version = "2.0.2";
public const string ModName = "Floors Are Roofs";
private const string DefaultPrefabsConfigSetting = "wood_floor,wood_floor_1x1";
private const string DefaultHammersConfigSetting = "Hammer";
private const bool DefaultRainDamageConfigSetting = true;
protected static bool PatchingHasAlreadySucceeded = false;
internal static bool RemoveRainDamage = true;
internal static string PrefabListInConfigSettings = "";
internal static string HammersListInConfigSettings = "";
internal static string[] PrefabList = new string[0];
internal static string[] HammerList = new string[0];
private Harmony _Harmony;
public static ManualLogSource Log;
private void Awake()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Expected O, but got Unknown
Log = new ManualLogSource((string)null);
_Harmony = Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null);
((BaseUnityPlugin)this).Config.Bind<int>("General", "NexusID", 1039, "Nexus mod ID for updates");
PrefabListInConfigSettings = ((BaseUnityPlugin)this).Config.Bind<string>("General", "PrefabsToChange", "wood_floor,wood_floor_1x1", "List of the prefab pieces to weatherproof. Comma-separate each prefab name. Default: wood_floor,wood_floor_1x1").Value;
HammersListInConfigSettings = ((BaseUnityPlugin)this).Config.Bind<string>("General", "Hammers", "Hammer", "List of hammer tools whose recipes we'll search to find the pieces to update. These are the prefab names for each hammer piece. Comma-separate each prefab name. Default: Hammer").Value;
RemoveRainDamage = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "RemoveRainDamage", true, "Prevent the floor pieces from taking wear and tear damage from rain.").Value;
Debug.Log((object)string.Format("[floorsareroofs]: Initializing using config settings: PrefabsToChange:[{0}], Hammers:[{1}], RemoveRainDamage:[{2}]", PrefabListInConfigSettings ?? "null", HammersListInConfigSettings ?? "null", RemoveRainDamage));
if (string.IsNullOrWhiteSpace(PrefabListInConfigSettings))
{
PrefabListInConfigSettings = "wood_floor,wood_floor_1x1";
}
if (string.IsNullOrWhiteSpace(HammersListInConfigSettings))
{
HammersListInConfigSettings = "Hammer";
}
string text = PrefabListInConfigSettings.Replace(" ", "");
string text2 = HammersListInConfigSettings.Replace(" ", "");
char[] separator = new char[1] { ',' };
PrefabList = text.Split(separator, StringSplitOptions.RemoveEmptyEntries);
HammerList = text2.Split(separator, StringSplitOptions.RemoveEmptyEntries);
PieceManager.OnPiecesRegistered += PieceManager_OnPiecesRegistered;
}
private void PieceManager_OnPiecesRegistered()
{
Debug.Log((object)"[floorsareroofs]: Triggered from PieceManager_OnPiecesRegistered");
PatchFloor();
}
private void OnDestroy()
{
Harmony harmony = _Harmony;
if (harmony != null)
{
harmony.UnpatchAll("bonesbro.val.floorsareroofs");
}
}
internal static void PatchFloor()
{
Debug.Log((object)"[floorsareroofs]: Beginning patch attempt");
if (PrefabList.Length == 0)
{
Debug.LogError((object)"[floorsareroofs]: Error: No prefabs defined in config setting PrefabsToChange.");
return;
}
if (HammerList.Length == 0)
{
Debug.LogError((object)"[floorsareroofs]: Error: No prefabs defined in config setting Hammers.");
return;
}
if ((Object)(object)ObjectDB.instance == (Object)null)
{
Debug.LogError((object)"[floorsareroofs]: ObjectDB is null");
return;
}
int num = 0;
bool flag = true;
string[] hammerList = HammerList;
foreach (string hammerName in hammerList)
{
int cFloorsUpdated = 0;
flag &= UpdatePiecesInHammer(hammerName, out cFloorsUpdated);
num += cFloorsUpdated;
}
Debug.Log((object)$"[floorsareroofs]: Successfully updated {num} floors. Config setting has {PrefabList.Length} floors specified.");
if (flag)
{
if (num == PrefabList.Length)
{
Debug.Log((object)"[floorsareroofs]: Floors updated finished successfully.");
return;
}
Debug.Log((object)"[floorsareroofs]: Floor update finished, but it looks like we couldn't find some of the floors you specified. Please doublecheck your config settings.");
LogConfigSettingHelp();
}
else
{
Debug.LogError((object)"[floorsareroofs]: Floor update finished, but there were errors. Please doublecheck your config settings.");
LogConfigSettingHelp();
}
}
private static void LogConfigSettingHelp()
{
Debug.Log((object)"[floorsareroofs]: The config settings are case-sensitive, each item should be separated by a comma, and there should be no spaces before or after the commas.");
if (HammersListInConfigSettings != "Hammer")
{
Debug.Log((object)("[floorsareroofs]: You have a non-default config setting for Hammers. Default: Hammer. Your setting: " + HammersListInConfigSettings));
}
if (PrefabListInConfigSettings != "wood_floor,wood_floor_1x1")
{
Debug.Log((object)("[floorsareroofs]: You have a non-default config setting for PrefabsToChange. Default: wood_floor,wood_floor_1x1. Your setting: " + PrefabListInConfigSettings));
}
}
private static bool UpdatePiecesInHammer(string hammerName, out int cFloorsUpdated)
{
cFloorsUpdated = 0;
Debug.Log((object)("[floorsareroofs]: Starting to patches pieces in Hammer " + hammerName + "."));
GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(hammerName);
if ((Object)(object)itemPrefab == (Object)null)
{
Debug.LogError((object)("[floorsareroofs]: Could not find tool " + hammerName + " in ObjectDB."));
return false;
}
ItemDrop val = default(ItemDrop);
if (!itemPrefab.TryGetComponent<ItemDrop>(ref val))
{
Debug.LogError((object)("[floorsareroofs]: Could not get itemdrop from hammer " + hammerName));
return false;
}
PieceTable val2 = val?.m_itemData?.m_shared?.m_buildPieces;
if ((Object)(object)val2 == (Object)null)
{
Debug.LogError((object)("[floorsareroofs]: Could not find piecetable in hammer " + hammerName));
return false;
}
if (val2.m_pieces == null || val2.m_pieces.Count == 0)
{
Debug.LogError((object)("[floorsareroofs]: Could not find any pieces in hammerPieceTable for hammer " + hammerName));
return false;
}
List<GameObject> list = val2.m_pieces.FindAll((GameObject i) => PrefabList.Contains((i != null) ? ((Object)i).name : null));
if (list == null || list.Count == 0)
{
Debug.Log((object)("[floorsareroofs]: Could not find any of the specified floors in hammer piece " + hammerName + ". Continuing..."));
return true;
}
foreach (GameObject item in list)
{
if (PatchAFloor(item))
{
cFloorsUpdated++;
}
}
Debug.Log((object)$"[floorsareroofs]: Finished with hammer {hammerName}. Sucessfully updated {cFloorsUpdated} floors.");
return true;
}
private static bool PatchAFloor(GameObject go)
{
Debug.Log((object)("[floorsareroofs]: Preparing to patch " + ((Object)go).name));
Transform val = default(Transform);
if (!go.TryGetComponent<Transform>(ref val))
{
Debug.LogError((object)("[floorsareroofs]: Could not find Transform in floor " + ((Object)go).name));
return false;
}
WearNTear val2 = default(WearNTear);
if (!go.TryGetComponent<WearNTear>(ref val2))
{
Debug.LogError((object)("[floorsareroofs]: Could not find WearNTear in floor " + ((Object)go).name));
return false;
}
bool flag = false;
for (int i = 0; i < val.childCount; i++)
{
Transform child = val.GetChild(i);
if (!(((child != null) ? ((Object)child).name : null) != "collider"))
{
flag = true;
if (((Component)child).tag == "leaky")
{
((Component)child).tag = "roof";
Debug.Log((object)("[floorsareroofs] Successfully patched " + ((Object)go).name + " into a roof"));
continue;
}
if (((Component)child).tag == "roof")
{
Debug.Log((object)("[floorsareroofs] " + ((Object)go).name + " is already a roof"));
continue;
}
Debug.LogError((object)("[floorsareroofs]: Could not patch " + ((Object)go).name + ". Its collider has tag '" + (((Component)child).tag ?? "[null]") + "' instead of 'leaky'"));
}
}
if (!flag)
{
Debug.LogError((object)("[floorsareroofs]: Could not find collider in " + ((Object)go).name));
return false;
}
if (RemoveRainDamage)
{
if (val2.m_noRoofWear)
{
Debug.Log((object)("[floorsareroofs] " + ((Object)go).name + " patched to not degrade in the rain"));
val2.m_noRoofWear = false;
}
else
{
Debug.Log((object)("[floorsareroofs] " + ((Object)go).name + " already does not degrade in the rain"));
}
}
else
{
Debug.Log((object)("[floorsareroofs] Not updating " + ((Object)go).name + ".m_noRoofWear because config setting RemoveRainDamage is false"));
}
return true;
}
}