using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.7", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("CustomPosters")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("LC posters API")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("CustomPosters")]
[assembly: AssemblyTitle("CustomPosters")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace CustomPosters
{
internal class Patches
{
private static bool _materialsUpdated = false;
private static string _selectedPack = null;
private static Material _copiedMaterial = null;
private static readonly List<GameObject> CreatedPosters = new List<GameObject>();
private static ManualLogSource Logger { get; set; }
public static void Init(ManualLogSource logger)
{
Logger = logger;
}
[HarmonyPatch(typeof(StartOfRound), "Start")]
[HarmonyPostfix]
private static void StartPatch(StartOfRound __instance)
{
_materialsUpdated = false;
CopyPlane001Material();
((MonoBehaviour)__instance).StartCoroutine(DelayedUpdateMaterialsAsync());
}
[HarmonyPatch(typeof(RoundManager), "GenerateNewLevelClientRpc")]
[HarmonyPostfix]
private static void GenerateNewLevelClientRpcPatch(int randomSeed, StartOfRound __instance)
{
if (!_materialsUpdated)
{
((MonoBehaviour)__instance).StartCoroutine(DelayedUpdateMaterialsAsync());
}
}
[HarmonyPatch(typeof(StartOfRound), "OnShipLandedMiscEvents")]
[HarmonyPostfix]
private static void OnShipLandedMiscEventsPatch(StartOfRound __instance)
{
if (!_materialsUpdated)
{
((MonoBehaviour)__instance).StartCoroutine(DelayedUpdateMaterialsAsync());
}
}
[HarmonyPatch(typeof(StartOfRound), "OnClientDisconnect")]
[HarmonyPostfix]
private static void OnClientDisconnectPatch(ulong clientId)
{
_materialsUpdated = false;
Logger.LogInfo((object)"Lobby left. Resetting materials.");
CleanUpPosters();
}
private static IEnumerator LoadTextureAsync(string filePath, Action<Texture2D> onComplete)
{
try
{
if (!File.Exists(filePath))
{
Logger.LogError((object)("Texture file not found: " + filePath));
onComplete?.Invoke(null);
yield break;
}
Texture2D texture = new Texture2D(2, 2);
byte[] fileData = File.ReadAllBytes(filePath);
if (ImageConversion.LoadImage(texture, fileData))
{
((Texture)texture).filterMode = (FilterMode)0;
onComplete?.Invoke(texture);
}
else
{
Logger.LogError((object)("Failed to load texture from " + filePath));
onComplete?.Invoke(null);
}
}
catch (Exception ex2)
{
Exception ex = ex2;
Logger.LogError((object)("Error loading texture from " + filePath + ": " + ex.Message));
onComplete?.Invoke(null);
}
}
private static void CopyPlane001Material()
{
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: Expected O, but got Unknown
GameObject val = GameObject.Find("Environment/HangarShip/Plane.001");
if ((Object)(object)val == (Object)null)
{
Logger.LogError((object)"Poster plane (Plane.001) not found under HangarShip!");
return;
}
MeshRenderer component = val.GetComponent<MeshRenderer>();
if ((Object)(object)component == (Object)null || ((Renderer)component).materials.Length == 0)
{
Logger.LogError((object)"Poster plane renderer or materials not found!");
return;
}
_copiedMaterial = new Material(((Renderer)component).material);
Logger.LogInfo((object)"Copied material from Plane.001.");
}
private static void HideVanillaPosterPlane()
{
GameObject val = GameObject.Find("Environment/HangarShip/Plane.001 (Old)");
if ((Object)(object)val != (Object)null)
{
val.SetActive(false);
return;
}
val = GameObject.Find("Environment/HangarShip/Plane.001");
if ((Object)(object)val != (Object)null)
{
val.SetActive(false);
}
}
private static void CleanUpPosters()
{
if (CreatedPosters.Count == 0)
{
return;
}
Logger.LogInfo((object)"Cleaning up existing posters.");
foreach (GameObject createdPoster in CreatedPosters)
{
if ((Object)(object)createdPoster != (Object)null)
{
Object.Destroy((Object)(object)createdPoster);
}
}
CreatedPosters.Clear();
}
private static IEnumerator CreateCustomPostersAsync()
{
CleanUpPosters();
GameObject environment = GameObject.Find("Environment");
if ((Object)(object)environment == (Object)null)
{
Logger.LogError((object)"Environment GameObject not found in the scene hierarchy!");
yield break;
}
Transform obj = environment.transform.Find("HangarShip");
GameObject hangarShip = ((obj != null) ? ((Component)obj).gameObject : null);
if ((Object)(object)hangarShip == (Object)null)
{
Logger.LogError((object)"HangarShip GameObject not found under Environment!");
yield break;
}
GameObject postersParent = new GameObject("CustomPosters");
postersParent.transform.SetParent(hangarShip.transform);
postersParent.transform.localPosition = Vector3.zero;
GameObject posterPlane = GameObject.Find("Environment/HangarShip/Plane.001");
if ((Object)(object)posterPlane == (Object)null)
{
Logger.LogError((object)"Poster plane (Plane.001) not found under HangarShip!");
yield break;
}
MeshRenderer originalRenderer = posterPlane.GetComponent<MeshRenderer>();
if ((Object)(object)originalRenderer == (Object)null || ((Renderer)originalRenderer).materials.Length == 0)
{
Logger.LogError((object)"Poster plane renderer or materials not found!");
yield break;
}
_ = ((Renderer)originalRenderer).material;
(Vector3 position, Vector3 rotation, Vector3 scale, string name)[] posterData = new(Vector3, Vector3, Vector3, string)[6]
{
(new Vector3(4.1886f, 2.9318f, -16.8409f), new Vector3(0f, 200.9872f, 0f), new Vector3(0.6391f, 0.4882f, 2f), "Poster1"),
(new Vector3(6.4202f, 2.4776f, -10.8226f), new Vector3(0f, 0f, 0f), new Vector3(0.7296f, 0.4896f, 1f), "Poster2"),
(new Vector3(9.9186f, 2.8591f, -17.4716f), new Vector3(0f, 180f, 356.3345f), new Vector3(0.7487f, 1.0539f, 1f), "Poster3"),
(new Vector3(5.2187f, 2.5963f, -11.0945f), new Vector3(0f, 337.5868f, 2.68f), new Vector3(0.7289f, 0.9989f, 1f), "Poster4"),
(new Vector3(5.5286f, 2.5882f, -17.3541f), new Vector3(0f, 201.1556f, 359.8f), new Vector3(0.5516f, 0.769f, 1f), "Poster5"),
(new Vector3(3.0647f, 2.8174f, -11.7341f), new Vector3(0f, 0f, 358.6752f), new Vector3(0.8596f, 1.2194f, 1f), "CustomTips")
};
if (Plugin.IsWiderShipModInstalled)
{
Logger.LogInfo((object)("Adjusting poster positions for WiderShipMod Extended Side: " + Plugin.WiderShipExtendedSide));
switch (Plugin.WiderShipExtendedSide)
{
case "Both":
posterData[0] = (new Vector3(4.6877f, 2.9407f, -19.62f), new Vector3(0f, 118.2274f, 0f), new Vector3(0.6391f, 0.4882f, 2f), "Poster1");
posterData[3] = (new Vector3(5.5699f, 2.5963f, -10.3268f), new Vector3(0f, 62.0324f, 2.6799f), new Vector3(0.7289f, 0.9989f, 1f), "Poster4");
posterData[4] = (new Vector3(5.3602f, 2.5882f, -18.3793f), new Vector3(0f, 118.0114f, 359.8f), new Vector3(0.5516f, 0.769f, 1f), "Poster5");
posterData[5] = (new Vector3(3.0947f, 2.8174f, -6.7253f), new Vector3(0f, 0f, 358.6752f), new Vector3(0.8596f, 1.2194f, 1f), "CustomTips");
break;
case "Right":
posterData[0] = (new Vector3(4.2224f, 2.9318f, -16.8609f), new Vector3(0f, 200.9872f, 0f), new Vector3(0.6391f, 0.4882f, 2f), "Poster1");
posterData[1] = (new Vector3(6.4202f, 2.4776f, -10.8226f), new Vector3(0f, 0f, 0f), new Vector3(0.7296f, 0.4896f, 1f), "Poster2");
posterData[2] = (new Vector3(9.9426f, 2.8591f, -17.4716f), new Vector3(0f, 180f, 356.3345f), new Vector3(0.7487f, 1.0539f, 1f), "Poster3");
posterData[3] = (new Vector3(5.5699f, 2.5963f, -10.3268f), new Vector3(0f, 62.0324f, 2.6799f), new Vector3(0.7289f, 0.9989f, 1f), "Poster4");
posterData[4] = (new Vector3(5.5386f, 2.5882f, -17.3641f), new Vector3(0f, 200.9099f, 359.8f), new Vector3(0.5516f, 0.769f, 1f), "Poster5");
posterData[5] = (new Vector3(3.0947f, 2.8174f, -6.733f), new Vector3(0f, 0f, 358.6752f), new Vector3(0.8596f, 1.2194f, 1f), "CustomTips");
break;
case "Left":
posterData[0] = (new Vector3(4.6777f, 2.9007f, -19.63f), new Vector3(0f, 118.2274f, 0f), new Vector3(0.6391f, 0.4882f, 2f), "Poster1");
posterData[1] = (new Vector3(6.4202f, 2.2577f, -10.8226f), new Vector3(0f, 0f, 0f), new Vector3(0.6391f, 0.4882f, 2f), "Poster2");
posterData[2] = (new Vector3(9.7197f, 2.8151f, -17.4716f), new Vector3(0f, 180f, 356.3345f), new Vector3(0.7487f, 1.0539f, 1f), "Poster3");
posterData[3] = (new Vector3(6.4449f, 3.0961f, -10.8221f), new Vector3(0f, 0.026f, 2.68f), new Vector3(0.7289f, 0.9989f, 1f), "Poster4");
posterData[4] = (new Vector3(5.3602f, 2.5482f, -18.3793f), new Vector3(0f, 118.0114f, 359.8f), new Vector3(0.5516f, 0.769f, 1f), "Poster5");
posterData[5] = (new Vector3(2.8647f, 2.7774f, -11.7341f), new Vector3(0f, 0f, 358.6752f), new Vector3(0.8596f, 1.2194f, 1f), "CustomTips");
break;
}
}
if (Plugin.Is2StoryShipModInstalled)
{
if (Plugin.IsShipWindowsInstalled)
{
Logger.LogInfo((object)"ShipWindows and 2 Story Ship Mod detected. Ignoring both configs and repositioning posters.");
posterData[0] = (new Vector3(6.5923f, 2.9318f, -17.4766f), new Vector3(0f, 179.2201f, 0f), new Vector3(0.6391f, 0.4882f, 2f), "Poster1");
posterData[1] = (new Vector3(9.0884f, 2.4776f, -8.8229f), new Vector3(0f, 0f, 0f), new Vector3(0.7296f, 0.4896f, 1f), "Poster2");
posterData[3] = (new Vector3(5.3599f, 2.5963f, -9.455f), new Vector3(0f, 307.2657f, 2.68f), new Vector3(0.7289f, 0.9989f, 1f), "Poster4");
posterData[4] = (new Vector3(10.2813f, 2.7482f, -8.8271f), new Vector3(0f, 0.9014f, 359.8f), new Vector3(0.5516f, 0.769f, 1f), "Poster5");
posterData[5] = (new Vector3(2.5679f, 2.6763f, -11.7341f), new Vector3(0f, 0f, 358.6752f), new Vector3(0.8596f, 1.2194f, 1f), "CustomTips");
}
if (Plugin.IsShipWindowsInstalled && Plugin.IsWiderShipModInstalled)
{
Logger.LogInfo((object)"ShipWindows and WiderShipMod detected with 2 Story Ship Mod. Using default 2 Story Ship Mod positions.");
posterData[0] = (new Vector3(6.5923f, 2.9318f, -22.4766f), new Vector3(0f, 179.2201f, 0f), new Vector3(0.6391f, 0.4882f, 2f), "Poster1");
posterData[1] = (new Vector3(9.0884f, 2.4776f, -5.8265f), new Vector3(0f, 0f, 0f), new Vector3(0.7296f, 0.4896f, 1f), "Poster2");
posterData[2] = (new Vector3(10.1364f, 2.8591f, -22.4788f), new Vector3(0f, 180.3376f, 0f), new Vector3(0.7487f, 1.0539f, 1f), "Poster3");
posterData[3] = (new Vector3(5.3599f, 2.5963f, -9.455f), new Vector3(0f, 307.2657f, 2.68f), new Vector3(0.7289f, 0.9989f, 1f), "Poster4");
posterData[4] = (new Vector3(7.8577f, 2.7482f, -22.4803f), new Vector3(0f, 179.7961f, 359.8f), new Vector3(0.5516f, 0.769f, 1f), "Poster5");
posterData[5] = (new Vector3(-5.8111f, 2.541f, -17.577f), new Vector3(0f, 270.0942f, 358.6752f), new Vector3(0.8596f, 1.2194f, 1f), "CustomTips");
}
else if (Plugin.IsWiderShipModInstalled)
{
Logger.LogInfo((object)"WiderShipMod detected with 2 Story Ship Mod. Using WiderShipMod-compatible positions.");
posterData[0] = (new Vector3(6.3172f, 2.9407f, -22.4766f), new Vector3(0f, 180f, 0f), new Vector3(0.6391f, 0.4882f, 2f), "Poster1");
posterData[1] = (new Vector3(9.5975f, 2.5063f, -5.8245f), new Vector3(0f, 0f, 0f), new Vector3(0.7296f, 0.4896f, 1f), "Poster2");
posterData[2] = (new Vector3(10.1364f, 2.8591f, -22.4788f), new Vector3(0f, 180f, 356.3345f), new Vector3(0.7487f, 1.0539f, 1f), "Poster3");
posterData[3] = (new Vector3(5.3599f, 2.5963f, -9.455f), new Vector3(0f, 307.2657f, 2.68f), new Vector3(0.7289f, 0.9989f, 1f), "Poster4");
posterData[4] = (new Vector3(7.5475f, 2.5882f, -22.4803f), new Vector3(0f, 180f, 359.8f), new Vector3(0.5516f, 0.769f, 1f), "Poster5");
posterData[5] = (new Vector3(-5.8111f, 2.541f, -17.577f), new Vector3(0f, 270.0942f, 358.6752f), new Vector3(0.8596f, 1.2194f, 1f), "CustomTips");
}
else
{
Logger.LogInfo((object)"2 Story Ship Mod detected. Repositioning posters based on window settings.");
if (Plugin.EnableRightWindows && Plugin.EnableLeftWindows)
{
Logger.LogInfo((object)"All windows are enabled. Repositioning posters to default 2 Story Ship Mod positions.");
posterData[0] = (new Vector3(10.1567f, 2.75f, -8.8293f), new Vector3(0f, 0f, 0f), new Vector3(0.6391f, 0.4882f, 2f), "Poster1");
posterData[1] = (new Vector3(9.0884f, 2.4776f, -8.8229f), new Vector3(0f, 0f, 0f), new Vector3(0.7296f, 0.4896f, 1f), "Poster2");
posterData[3] = (new Vector3(5.3599f, 2.5963f, -9.455f), new Vector3(0f, 307.2657f, 2.68f), new Vector3(0.7289f, 0.9989f, 1f), "Poster4");
posterData[4] = (new Vector3(6.1473f, 2.8195f, -17.4729f), new Vector3(0f, 179.7123f, 359.8f), new Vector3(0.5516f, 0.769f, 1f), "Poster5");
posterData[5] = (new Vector3(2.5679f, 2.6763f, -11.7341f), new Vector3(0f, 0f, 358.6752f), new Vector3(0.8596f, 1.2194f, 1f), "CustomTips");
}
else
{
if (!Plugin.EnableRightWindows)
{
Logger.LogInfo((object)"Right windows are disabled. Repositioning posters.");
posterData[0] = (new Vector3(4.0286f, 2.9318f, -16.7774f), new Vector3(0f, 200.9872f, 0f), new Vector3(0.6391f, 0.4882f, 2f), "Poster1");
posterData[1] = (new Vector3(9.0884f, 2.4776f, -8.8229f), new Vector3(0f, 0f, 0f), new Vector3(0.7296f, 0.4896f, 1f), "Poster2");
posterData[3] = (new Vector3(5.3599f, 2.5963f, -9.455f), new Vector3(0f, 307.2657f, 0f), new Vector3(0.7289f, 0.9989f, 1f), "Poster4");
posterData[4] = (new Vector3(5.3282f, 2.7482f, -17.2754f), new Vector3(0f, 202.3357f, 359.8f), new Vector3(0.5516f, 0.769f, 1f), "Poster5");
posterData[5] = (new Vector3(2.5679f, 2.6763f, -11.7341f), new Vector3(0f, 0f, 358.6752f), new Vector3(0.8596f, 1.2194f, 1f), "CustomTips");
}
if (!Plugin.EnableLeftWindows)
{
Logger.LogInfo((object)"Left windows are disabled. Repositioning posters.");
posterData[0] = (new Vector3(9.8324f, 2.9318f, -8.8257f), new Vector3(0f, 0f, 0f), new Vector3(0.6391f, 0.4882f, 2f), "Poster1");
posterData[1] = (new Vector3(7.3648f, 2.4776f, -8.8229f), new Vector3(0f, 0f, 0f), new Vector3(0.7296f, 0.4896f, 1f), "Poster2");
posterData[3] = (new Vector3(5.3599f, 2.5963f, -9.455f), new Vector3(0f, 307.2657f, 2.68f), new Vector3(0.7289f, 0.9989f, 1f), "Poster4");
posterData[4] = (new Vector3(6.1473f, 2.8195f, -17.4729f), new Vector3(0f, 179.7123f, 359.8f), new Vector3(0.5516f, 0.769f, 1f), "Poster5");
posterData[5] = (new Vector3(2.5679f, 2.6763f, -11.7341f), new Vector3(0f, 0f, 358.6752f), new Vector3(0.8596f, 1.2194f, 1f), "CustomTips");
}
}
}
}
if (Plugin.IsShipWindowsInstalled && Plugin.IsWindow2Enabled && !Plugin.IsWiderShipModInstalled && !Plugin.Is2StoryShipModInstalled)
{
Logger.LogInfo((object)"ShipWindows/Beta compatibility: Repositioning Poster4 & Poster2 due to window 2 being enabled.");
posterData[3].position = new Vector3(6.4449f, 3.0961f, -10.8221f);
posterData[1].position = new Vector3(6.4202f, 2.2577f, -10.8226f);
posterData[3].rotation = new Vector3(0f, 0f, 358.0874f);
posterData[3].scale = new Vector3(0.7289f, 0.9989f, 1f);
}
List<string> enabledPacks = Plugin.PosterFolders.Where((string folder) => PosterConfig.IsPackEnabled(folder)).ToList();
if (enabledPacks.Count == 0)
{
Logger.LogWarning((object)"No enabled packs found!");
yield break;
}
List<string> enabledPackNames = enabledPacks.Select((string pack) => Path.GetFileName(Path.GetDirectoryName(pack))).ToList();
Logger.LogInfo((object)("Enabled poster packs: " + string.Join(", ", enabledPackNames)));
List<string> packsToUse;
if (PosterConfig.PosterRandomizer.Value)
{
_selectedPack = enabledPacks[Plugin.Rand.Next(enabledPacks.Count)];
packsToUse = new List<string> { _selectedPack };
string selectedPackName = Path.GetFileName(Path.GetDirectoryName(_selectedPack));
Logger.LogInfo((object)("PosterRandomizer enabled. Using pack: " + selectedPackName));
}
else
{
packsToUse = enabledPacks;
Logger.LogInfo((object)"PosterRandomizer disabled. Combining all enabled packs.");
}
Dictionary<string, List<(Texture2D texture, string filePath)>> allTextures = new Dictionary<string, List<(Texture2D, string)>>();
foreach (string pack2 in packsToUse)
{
string postersPath = Path.Combine(pack2, "posters");
string tipsPath = Path.Combine(pack2, "tips");
if (Directory.Exists(postersPath))
{
string[] files = Directory.GetFiles(postersPath, "*.png");
foreach (string file2 in files)
{
yield return LoadTextureAsync(file2, delegate(Texture2D texture)
{
if ((Object)(object)texture != (Object)null)
{
string fileNameWithoutExtension2 = Path.GetFileNameWithoutExtension(file2);
if (!allTextures.ContainsKey(fileNameWithoutExtension2))
{
allTextures[fileNameWithoutExtension2] = new List<(Texture2D, string)>();
}
allTextures[fileNameWithoutExtension2].Add((texture, file2));
}
});
}
}
if (!Directory.Exists(tipsPath))
{
continue;
}
string[] files2 = Directory.GetFiles(tipsPath, "*.png");
foreach (string file in files2)
{
yield return LoadTextureAsync(file, delegate(Texture2D texture)
{
if ((Object)(object)texture != (Object)null)
{
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(file);
if (!allTextures.ContainsKey(fileNameWithoutExtension))
{
allTextures[fileNameWithoutExtension] = new List<(Texture2D, string)>();
}
allTextures[fileNameWithoutExtension].Add((texture, file));
}
});
}
}
if (allTextures.Count == 0)
{
Logger.LogWarning((object)"No textures found in enabled packs!");
yield break;
}
bool anyTextureLoaded = false;
for (int i = 0; i < posterData.Length; i++)
{
GameObject poster = GameObject.CreatePrimitive((PrimitiveType)5);
((Object)poster).name = posterData[i].name;
poster.transform.SetParent(postersParent.transform);
poster.transform.position = posterData[i].position;
poster.transform.rotation = Quaternion.Euler(posterData[i].rotation);
poster.transform.localScale = posterData[i].scale;
MeshRenderer renderer = poster.GetComponent<MeshRenderer>();
if (allTextures.TryGetValue(((Object)poster).name, out var textures) && textures.Count > 0)
{
(Texture2D texture, string filePath) textureData = textures[Plugin.Rand.Next(textures.Count)];
Material material = new Material(_copiedMaterial);
material.mainTexture = (Texture)(object)textureData.texture;
((Renderer)renderer).material = material;
anyTextureLoaded = true;
Logger.LogInfo((object)("Loaded texture for " + ((Object)poster).name + " from " + textureData.filePath));
CreatedPosters.Add(poster);
}
else
{
Logger.LogError((object)("No textures found for " + ((Object)poster).name + ". Disabling the poster."));
poster.SetActive(false);
}
yield return null;
textures = null;
}
if (!anyTextureLoaded)
{
Object.Destroy((Object)(object)postersParent);
Logger.LogWarning((object)"No custom posters were created due to missing textures.");
yield break;
}
Transform obj2 = hangarShip.transform.Find("Plane.001");
GameObject vanillaPlane = ((obj2 != null) ? ((Component)obj2).gameObject : null);
if ((Object)(object)vanillaPlane != (Object)null)
{
Logger.LogInfo((object)"Destroying vanilla Plane.001.");
Object.Destroy((Object)(object)vanillaPlane);
}
Logger.LogInfo((object)"Custom posters created successfully.");
}
private static IEnumerator DelayedUpdateMaterialsAsync()
{
if (!_materialsUpdated)
{
Logger.LogInfo((object)"Updating materials for custom posters");
GameObject posterPlane = GameObject.Find("Environment/HangarShip/Plane.001");
if ((Object)(object)posterPlane != (Object)null)
{
posterPlane.SetActive(false);
}
HideVanillaPosterPlane();
yield return CreateCustomPostersAsync();
_materialsUpdated = true;
}
}
}
[BepInPlugin("seeya.customposters", "CustomPosters", "1.3.5")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Plugin : BaseUnityPlugin
{
public const string PLUGIN_GUID = "seeya.customposters";
public const string PLUGIN_NAME = "CustomPosters";
public const string PLUGIN_VERSION = "1.3.5";
public static List<string> PosterFolders = new List<string>();
public static readonly List<string> PosterFiles = new List<string>();
public static readonly List<string> TipFiles = new List<string>();
public static Random Rand = new Random();
public static bool IsShipWindowsInstalled { get; private set; }
public static bool IsWindow2Enabled { get; private set; }
public static bool Is2StoryShipModInstalled { get; private set; }
public static bool EnableRightWindows { get; private set; } = true;
public static bool EnableLeftWindows { get; private set; } = true;
public static bool IsWiderShipModInstalled { get; private set; }
public static string WiderShipExtendedSide { get; private set; }
public static ManualLogSource StaticLogger { get; private set; }
private static void Check2StoryShipModConfig()
{
try
{
string path = Path.Combine(Paths.ConfigPath, "MelanieMelicious.2StoryShip.cfg");
if (!File.Exists(path))
{
StaticLogger.LogWarning((object)"2 Story Ship Mod config file not found. Using default window settings.");
return;
}
string[] array = File.ReadAllLines(path);
string[] array2 = array;
foreach (string text in array2)
{
if (text.Contains("Enable Right Windows"))
{
EnableRightWindows = text.Contains("true");
}
else if (text.Contains("Enable Left Windows"))
{
EnableLeftWindows = text.Contains("true");
}
}
}
catch (Exception ex)
{
StaticLogger.LogError((object)("Failed to read 2 Story Ship Mod config: " + ex.Message));
}
}
private void Awake()
{
//IL_022a: Unknown result type (might be due to invalid IL or missing references)
//IL_0230: Expected O, but got Unknown
try
{
StaticLogger = ((BaseUnityPlugin)this).Logger;
PosterFolders = Directory.GetDirectories(Paths.PluginPath, "CustomPosters", SearchOption.AllDirectories).ToList();
foreach (string posterFolder in PosterFolders)
{
string path = Path.Combine(posterFolder, "posters");
string path2 = Path.Combine(posterFolder, "tips");
if (Directory.Exists(path))
{
string[] files = Directory.GetFiles(path);
foreach (string text in files)
{
if (Path.GetExtension(text) != ".old")
{
PosterFiles.Add(text);
}
}
}
if (!Directory.Exists(path2))
{
continue;
}
string[] files2 = Directory.GetFiles(path2);
foreach (string text2 in files2)
{
if (Path.GetExtension(text2) != ".old")
{
TipFiles.Add(text2);
}
}
}
Is2StoryShipModInstalled = Chainloader.PluginInfos.ContainsKey("MelanieMelicious.2StoryShip");
if (Is2StoryShipModInstalled)
{
StaticLogger.LogInfo((object)"2 Story Ship Mod detected.");
Check2StoryShipModConfig();
}
IsShipWindowsInstalled = Chainloader.PluginInfos.ContainsKey("TestAccount666.ShipWindows") || Chainloader.PluginInfos.ContainsKey("TestAccount666.ShipWindowsBeta");
if (IsShipWindowsInstalled)
{
StaticLogger.LogInfo((object)"ShipWindows or ShipWindowsBeta detected.");
IsWindow2Enabled = CheckIfWindow2Enabled();
}
IsWiderShipModInstalled = Chainloader.PluginInfos.ContainsKey("mborsh.WiderShipMod");
if (IsWiderShipModInstalled)
{
StaticLogger.LogInfo((object)"WiderShipMod detected.");
WiderShipExtendedSide = GetWiderShipExtendedSide();
StaticLogger.LogInfo((object)("WiderShipMod Extended Side: " + WiderShipExtendedSide));
}
PosterConfig.Init(((BaseUnityPlugin)this).Logger);
Patches.Init(((BaseUnityPlugin)this).Logger);
Harmony val = new Harmony("seeya.customposters");
val.PatchAll(typeof(Patches));
StaticLogger.LogInfo((object)"Plugin CustomPosters (1.3.5) is loaded!");
}
catch (Exception ex)
{
StaticLogger.LogError((object)("Failed to initialize plugin: " + ex.Message));
}
}
private static bool CheckIfWindow2Enabled()
{
try
{
string path = Path.Combine(Paths.ConfigPath, "TestAccount666.ShipWindows.cfg");
if (File.Exists(path))
{
string[] array = File.ReadAllLines(path);
string[] array2 = array;
foreach (string text in array2)
{
if (text.Contains("EnableWindow2") && text.Contains("true"))
{
return true;
}
}
}
string path2 = Path.Combine(Paths.ConfigPath, "TestAccount666.ShipWindowsBeta.cfg");
if (File.Exists(path2))
{
string[] array3 = File.ReadAllLines(path2);
bool flag = false;
string[] array4 = array3;
foreach (string text2 in array4)
{
if (text2.Trim().StartsWith("[") && text2.Trim().EndsWith("]"))
{
flag = text2.Trim().Equals("[Left Window (SideLeft)]", StringComparison.OrdinalIgnoreCase);
}
if (flag && text2.Trim().StartsWith("1. Enabled", StringComparison.OrdinalIgnoreCase))
{
string[] array5 = text2.Split(new char[1] { '=' });
if (array5.Length > 1 && array5[1].Trim().Equals("true", StringComparison.OrdinalIgnoreCase))
{
return true;
}
}
}
}
StaticLogger.LogWarning((object)"ShipWindows or ShipWindowsBeta config file not found. Assuming Window 2 is disabled.");
return false;
}
catch (Exception ex)
{
StaticLogger.LogError((object)("Failed to read ShipWindows or ShipWindowsBeta config: " + ex.Message));
}
return false;
}
private static string GetWiderShipExtendedSide()
{
try
{
string path = Path.Combine(Paths.ConfigPath, "mborsh.WiderShipMod.cfg");
if (!File.Exists(path))
{
StaticLogger.LogWarning((object)"WiderShipMod config file not found. Assuming Extended Side is 'Both'.");
return "Both";
}
string[] array = File.ReadAllLines(path);
string[] array2 = array;
foreach (string text in array2)
{
if (text.Contains("Extended Side"))
{
if (text.Contains("Both"))
{
return "Both";
}
if (text.Contains("Right"))
{
return "Right";
}
if (text.Contains("Left"))
{
return "Left";
}
}
}
}
catch (Exception ex)
{
StaticLogger.LogError((object)("Failed to read WiderShipMod config: " + ex.Message));
}
return "Both";
}
}
internal class PosterConfig
{
private static ConfigFile configFile;
private static ManualLogSource Logger { get; set; }
public static ConfigEntry<bool> PosterRandomizer { get; private set; }
public static ConfigEntry<bool> LobbyRandom { get; private set; }
public static void Init(ManualLogSource logger)
{
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: Expected O, but got Unknown
Logger = logger;
configFile = new ConfigFile(Path.Combine(Paths.ConfigPath, "CustomPosters.cfg"), true);
PosterRandomizer = configFile.Bind<bool>("Settings", "PosterRandomizer", true, "If true, randomizes only poster packs. If false, combines all enabled packs and randomizes textures.");
foreach (string posterFolder in Plugin.PosterFolders)
{
int num = posterFolder.IndexOf("plugins\\", StringComparison.Ordinal);
if (num == -1)
{
Logger.LogError((object)("Invalid mod folder path: 'plugins\\' not found in " + posterFolder));
continue;
}
num += "plugins\\".Length;
int num2 = posterFolder.IndexOf("\\CustomPosters", num, StringComparison.Ordinal);
if (num2 == -1)
{
Logger.LogError((object)("Invalid mod folder path: '\\CustomPosters' not found in " + posterFolder));
continue;
}
string text = posterFolder.Substring(num, num2 - num);
ConfigEntry<bool> val = configFile.Bind<bool>(text, "Enabled", true, "Enable or disable " + text);
}
}
public static bool IsPackEnabled(string folder)
{
int num = folder.IndexOf("plugins\\", StringComparison.Ordinal);
if (num == -1)
{
return false;
}
num += "plugins\\".Length;
int num2 = folder.IndexOf("\\CustomPosters", num, StringComparison.Ordinal);
if (num2 == -1)
{
return false;
}
string text = folder.Substring(num, num2 - num);
return configFile.Bind<bool>(text, "Enabled", true, (ConfigDescription)null).Value;
}
}
public static class PluginInfo
{
public const string PLUGIN_GUID = "CustomPosters";
public const string PLUGIN_NAME = "CustomPosters";
public const string PLUGIN_VERSION = "1.0.0";
}
}