using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using HarmonyLib; using Microsoft.CodeAnalysis; using Photon.Pun; using REPOLib; using REPOLib.Modules; using Unity.AI.Navigation; using UnityEngine; using UnityEngine.AI; using UnityEngine.Audio; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Empress")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.7.0")] [assembly: AssemblyInformationalVersion("1.0.7")] [assembly: AssemblyProduct("TwilightForestCompatPatch")] [assembly: AssemblyTitle("TwilightForestCompatPatch")] [assembly: AssemblyVersion("1.0.7.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace TwilightForestCompatPatch { [BepInPlugin("empress.repo.twilightforestcompatpatch", "Empress Twilight Forest Compat Patch", "1.0.7")] [BepInDependency(/*Could not decode attribute arguments.*/)] public sealed class TwilightForestCompatPatchPlugin : BaseUnityPlugin { private sealed class TwilightPrefabBuckets { public List StartRooms { get; set; } = new List(); public List Normal1 { get; set; } = new List(); public List Passage1 { get; set; } = new List(); public List DeadEnd1 { get; set; } = new List(); public List Extraction1 { get; set; } = new List(); public List Normal2 { get; set; } = new List(); public List Passage2 { get; set; } = new List(); public List DeadEnd2 { get; set; } = new List(); public List Extraction2 { get; set; } = new List(); public List Normal3 { get; set; } = new List(); public List Passage3 { get; set; } = new List(); public List DeadEnd3 { get; set; } = new List(); public List Extraction3 { get; set; } = new List(); public int TotalModuleCount => Normal1.Count + Passage1.Count + DeadEnd1.Count + Extraction1.Count + Normal2.Count + Passage2.Count + DeadEnd2.Count + Extraction2.Count + Normal3.Count + Passage3.Count + DeadEnd3.Count + Extraction3.Count; } private sealed class TwilightLoadingGraphic { public AssetBundle Bundle { get; } public Sprite Sprite { get; } public string ResourcePath { get; } public bool CanUsePrefabRef { get; } public TwilightLoadingGraphic(AssetBundle bundle, Sprite sprite, string resourcePath, bool canUsePrefabRef) { Bundle = bundle; Sprite = sprite; ResourcePath = resourcePath; CanUsePrefabRef = canUsePrefabRef; } } internal const string PluginGuid = "empress.repo.twilightforestcompatpatch"; internal const string PluginName = "Empress Twilight Forest Compat Patch"; internal const string PluginVersion = "1.0.7"; private const string TwilightBundleFileName = "Minecraft_Twilight_Forest.repobundle"; private const string TwilightLevelName = "Level - Twilightforest"; private const string TwilightLevelResourcePath = "Twilightforest"; private const float TwilightLevelPointCheckRadius = 0.5f; private const float TwilightLevelPointRepairRadius = 2f; private const float TwilightLevelPointConnectDistance = 15f; private const float TwilightLevelPointConnectForwardDot = -0.8f; private const float TwilightLevelPointConnectApproachDot = 0.8f; private const float TwilightLevelPointValidationDelay = 0.5f; private const int TwilightVehicleVolumeCount = 4; private const float TwilightVehicleVolumeSideOffset = 2f; private const float TwilightVehicleVolumeForwardOffset = 2.5f; private const float TwilightVehicleVolumeForwardSpacing = 2f; private const float TwilightChargingStationForwardOffset = 6.5f; private static readonly string[] TwilightStartRoomNames = new string[1] { "Start Room - Twilight - Entrance" }; private static readonly string[] TwilightNormal1Names = new string[8] { "Module - Twilight - Lone Oak", "Module -- Twilight - Hedge Cross", "Module -- Twilight - TreeClimb", "Module -- Twilight - Ruined Portal", "Module -- Twilight - Labyrinth Entrance", "Module -- Twilight - Hedge Intersection", "Module -- Twilight - Hedge Spider Spawner", "Module -- Twilight - Hedge Transformation Tree" }; private static readonly string[] TwilightPassage1Names = new string[2] { "Module -- Twilight - Log Passage", "Module -- Twilight - Naga Skeleton" }; private static readonly string[] TwilightDeadEnd1Names = new string[1] { "Module -- Twilight - Witch Hut Dead End" }; private static readonly string[] TwilightExtraction1Names = new string[1] { "Module -- Twilight - Questing_Grove" }; private static readonly string[] TwilightNormal2Names = new string[2] { "Module -- Twilight - Stone Pit", "Module -- Twilight - Hollow Hill" }; private static readonly string[] TwilightPassage2Names = new string[1] { "Module -- Twilight - Maze Passage" }; private static readonly string[] TwilightDeadEnd2Names = new string[1] { "Module -- Twilight - Lich Tower Dead End1" }; private static readonly string[] TwilightExtraction2Names = new string[1] { "Module -- Twilight - Questing_Grove" }; private static readonly string[] TwilightNormal3Names = new string[2] { "Module -- Twilight - Mangrove Tree", "Module -- Twilight - Castle Forcefields" }; private static readonly string[] TwilightPassage3Names = new string[1] { "Module -- Twilight - Lava Passage" }; private static readonly string[] TwilightDeadEnd3Names = new string[1] { "Module -- Twilight - Dark Tower Dead End" }; private static readonly string[] TwilightExtraction3Names = new string[1] { "Module -- Twilight - Questing_Grove" }; private static readonly string[] TwilightLoadingGraphicFieldNames = new string[3] { "LoadingGraphic01", "LoadingGraphic02", "LoadingGraphic03" }; private static readonly string[] TwilightPreferredLoadingGraphicNames = new string[3] { "level twilightforest 04", "level twilightforest 05", "level twilightforest 06" }; private static readonly List TwilightLoadingSprites = new List(); private readonly Harmony _twilightHarmony = new Harmony("empress.repo.twilightforestcompatpatch"); private AssetBundle? _twilightBundle; private bool _twilightRepairApplied; private bool _twilightRepairQueued; private bool _twilightLoggedMissingBundle; private bool _twilightLoggedMissingPrefabs; private bool _twilightLoggedDoorMapFallback; internal static TwilightForestCompatPatchPlugin? Instance { get; private set; } private void Awake() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) Instance = this; GameObject gameObject = ((Component)this).gameObject; ((Object)gameObject).hideFlags = (HideFlags)(((Object)gameObject).hideFlags | 0x23); BundleLoader.OnAllBundlesLoaded += TwilightHandleBundlesLoaded; _twilightHarmony.PatchAll(); if ((Object)(object)RunManager.instance != (Object)null) { ((MonoBehaviour)this).StartCoroutine(TwilightRepairWhenReady()); } } private void TwilightHandleBundlesLoaded() { if (_twilightRepairQueued || _twilightRepairApplied) { return; } _twilightRepairQueued = true; try { TwilightTryRepairLevel(); } finally { _twilightRepairQueued = false; } } private IEnumerator TwilightRepairWhenReady() { yield return null; for (int attempt = 0; attempt < 120; attempt++) { if (_twilightRepairApplied) { break; } if (TwilightTryRepairLevel()) { break; } yield return null; } _twilightRepairQueued = false; } internal bool TwilightTryRepairCurrentLevel() { List list = new List(); if ((Object)(object)LevelGenerator.Instance != (Object)null && (Object)(object)LevelGenerator.Instance.Level != (Object)null) { list.Add(LevelGenerator.Instance.Level); } if ((Object)(object)RunManager.instance != (Object)null && (Object)(object)RunManager.instance.levelCurrent != (Object)null) { list.Add(RunManager.instance.levelCurrent); } return TwilightTryRepairLevel(list); } private bool TwilightTryRepairLevel(IEnumerable? candidates = null) { if (_twilightRepairApplied) { return true; } Level val = TwilightFindLevel(candidates) ?? TwilightFindLevel(Levels.AllLevels); if ((Object)(object)val == (Object)null) { return false; } AssetBundle val2 = TwilightGetBundle(); if ((Object)(object)val2 == (Object)null) { if (!_twilightLoggedMissingBundle) { _twilightLoggedMissingBundle = true; ((BaseUnityPlugin)this).Logger.LogWarning((object)"Empress Twilight Forest Compat Patch could not locate the Twilight Forest bundle."); } return false; } _twilightLoggedMissingBundle = false; TwilightPrefabBuckets twilightPrefabBuckets = TwilightCollectPrefabs(val2); if (twilightPrefabBuckets.StartRooms.Count == 0 || twilightPrefabBuckets.TotalModuleCount == 0) { if (!_twilightLoggedMissingPrefabs) { _twilightLoggedMissingPrefabs = true; ((BaseUnityPlugin)this).Logger.LogError((object)"Empress Twilight Forest Compat Patch could not rebuild the Twilight Forest prefab lists from the original bundle."); } return false; } _twilightLoggedMissingPrefabs = false; TwilightApplyHideFlags((Object)(object)val2); TwilightApplyHideFlags((Object)(object)val); TwilightEnsureLevelFallbackData(val); TwilightEnsureLevelLoadingGraphics(val, val2); TwilightRegisterLevelObjects(val); val.StartRooms = TwilightRegisterPrefabs(val, "StartRoom", twilightPrefabBuckets.StartRooms); val.ModulesNormal1 = TwilightRegisterPrefabs(val, "Normal", twilightPrefabBuckets.Normal1); val.ModulesPassage1 = TwilightRegisterPrefabs(val, "Passage", twilightPrefabBuckets.Passage1); val.ModulesDeadEnd1 = TwilightRegisterPrefabs(val, "DeadEnd", twilightPrefabBuckets.DeadEnd1); val.ModulesExtraction1 = TwilightRegisterPrefabs(val, "Extraction", twilightPrefabBuckets.Extraction1); val.ModulesNormal2 = TwilightRegisterPrefabs(val, "Normal", twilightPrefabBuckets.Normal2); val.ModulesPassage2 = TwilightRegisterPrefabs(val, "Passage", twilightPrefabBuckets.Passage2); val.ModulesDeadEnd2 = TwilightRegisterPrefabs(val, "DeadEnd", twilightPrefabBuckets.DeadEnd2); val.ModulesExtraction2 = TwilightRegisterPrefabs(val, "Extraction", twilightPrefabBuckets.Extraction2); val.ModulesNormal3 = TwilightRegisterPrefabs(val, "Normal", twilightPrefabBuckets.Normal3); val.ModulesPassage3 = TwilightRegisterPrefabs(val, "Passage", twilightPrefabBuckets.Passage3); val.ModulesDeadEnd3 = TwilightRegisterPrefabs(val, "DeadEnd", twilightPrefabBuckets.DeadEnd3); val.ModulesExtraction3 = TwilightRegisterPrefabs(val, "Extraction", twilightPrefabBuckets.Extraction3); _twilightRepairApplied = val.StartRooms.Count > 0 && TwilightCountModules(val) > 0; if (_twilightRepairApplied) { ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Empress Twilight Forest Compat Patch repaired {((Object)val).name} with {val.StartRooms.Count} start rooms and {TwilightCountModules(val)} modules."); } return _twilightRepairApplied; } private static Level? TwilightFindLevel(IEnumerable? candidates) { if (candidates == null) { return null; } foreach (Level candidate in candidates) { if (TwilightIsTwilightLevel(candidate)) { return candidate; } } return null; } private AssetBundle? TwilightGetBundle() { if ((Object)(object)_twilightBundle != (Object)null) { return _twilightBundle; } foreach (AssetBundle allLoadedAssetBundle in AssetBundle.GetAllLoadedAssetBundles()) { try { if (allLoadedAssetBundle.GetAllAssetNames().Any((string assetName) => assetName.EndsWith("level - twilightforest.asset", StringComparison.OrdinalIgnoreCase) || assetName.EndsWith("tfassettestmod.asset", StringComparison.OrdinalIgnoreCase))) { _twilightBundle = allLoadedAssetBundle; return _twilightBundle; } } catch { } } string text = Directory.GetFiles(Paths.PluginPath, "Minecraft_Twilight_Forest.repobundle", SearchOption.AllDirectories).FirstOrDefault(); if (string.IsNullOrWhiteSpace(text)) { return null; } _twilightBundle = AssetBundle.LoadFromFile(text); return _twilightBundle; } private static TwilightPrefabBuckets TwilightCollectPrefabs(AssetBundle bundle) { //IL_0113: 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_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) Dictionary dictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); StartRoom[] array = bundle.LoadAllAssets(); foreach (StartRoom val in array) { TwilightAddAssetByName(dictionary, ((Object)(object)val != (Object)null) ? ((Component)val).gameObject : null); } Module[] array2 = bundle.LoadAllAssets(); foreach (Module val2 in array2) { TwilightAddAssetByName(dictionary, ((Object)(object)val2 != (Object)null) ? ((Component)val2).gameObject : null); } GameObject[] array3 = bundle.LoadAllAssets(); foreach (GameObject prefab in array3) { TwilightAddAssetByName(dictionary, prefab); } if (!dictionary.Keys.Any((string name) => name.StartsWith("Start Room - Twilight -", StringComparison.OrdinalIgnoreCase)) || !dictionary.Keys.Any((string name) => name.Contains("Twilight", StringComparison.OrdinalIgnoreCase) && name.StartsWith("Module", StringComparison.OrdinalIgnoreCase))) { array = Resources.FindObjectsOfTypeAll(); Scene scene; foreach (StartRoom val3 in array) { if (!((Object)(object)val3 == (Object)null)) { scene = ((Component)val3).gameObject.scene; if (!((Scene)(ref scene)).IsValid()) { TwilightAddAssetByName(dictionary, ((Component)val3).gameObject); } } } array2 = Resources.FindObjectsOfTypeAll(); foreach (Module val4 in array2) { if (!((Object)(object)val4 == (Object)null)) { scene = ((Component)val4).gameObject.scene; if (!((Scene)(ref scene)).IsValid()) { TwilightAddAssetByName(dictionary, ((Component)val4).gameObject); } } } array3 = Resources.FindObjectsOfTypeAll(); foreach (GameObject val5 in array3) { if (!((Object)(object)val5 == (Object)null)) { scene = val5.scene; if (!((Scene)(ref scene)).IsValid()) { TwilightAddAssetByName(dictionary, val5); } } } } return new TwilightPrefabBuckets { StartRooms = TwilightResolvePrefabs(dictionary, TwilightStartRoomNames), Normal1 = TwilightResolvePrefabs(dictionary, TwilightNormal1Names), Passage1 = TwilightResolvePrefabs(dictionary, TwilightPassage1Names), DeadEnd1 = TwilightResolvePrefabs(dictionary, TwilightDeadEnd1Names), Extraction1 = TwilightResolvePrefabs(dictionary, TwilightExtraction1Names), Normal2 = TwilightResolvePrefabs(dictionary, TwilightNormal2Names), Passage2 = TwilightResolvePrefabs(dictionary, TwilightPassage2Names), DeadEnd2 = TwilightResolvePrefabs(dictionary, TwilightDeadEnd2Names), Extraction2 = TwilightResolvePrefabs(dictionary, TwilightExtraction2Names), Normal3 = TwilightResolvePrefabs(dictionary, TwilightNormal3Names), Passage3 = TwilightResolvePrefabs(dictionary, TwilightPassage3Names), DeadEnd3 = TwilightResolvePrefabs(dictionary, TwilightDeadEnd3Names), Extraction3 = TwilightResolvePrefabs(dictionary, TwilightExtraction3Names) }; } private static void TwilightAddAssetByName(IDictionary prefabsByName, GameObject? prefab) { if (!((Object)(object)prefab == (Object)null) && !string.IsNullOrWhiteSpace(((Object)prefab).name) && !prefabsByName.ContainsKey(((Object)prefab).name)) { prefabsByName[((Object)prefab).name] = prefab; } } private static List TwilightResolvePrefabs(IReadOnlyDictionary prefabsByName, IEnumerable names) { List list = new List(); foreach (string name in names) { if (prefabsByName.TryGetValue(name, out GameObject value)) { list.Add(value); } } return list; } private static void TwilightRegisterLevelObjects(Level level) { if (level.ConnectObject != null) { GameObject val = TwilightResolvePrefab(level.ConnectObject); if ((Object)(object)val != (Object)null) { TwilightRegisterNetworkPrefab("Level/" + TwilightGetLevelPath(level) + "/Other/" + TwilightGetPrefabName(level.ConnectObject, val), val); } } if (level.BlockObject != null) { GameObject val2 = TwilightResolvePrefab(level.BlockObject); if ((Object)(object)val2 != (Object)null) { TwilightRegisterNetworkPrefab("Level/" + TwilightGetLevelPath(level) + "/Other/" + TwilightGetPrefabName(level.BlockObject, val2), val2); } } } private static string TwilightGetLevelPath(Level level) { if (!string.IsNullOrWhiteSpace(((Object)level).name)) { return ((Object)level).name; } return "Twilightforest"; } private static string TwilightGetPrefabName(PrefabRef prefabRef, GameObject prefab) { if (!string.IsNullOrWhiteSpace(prefabRef.PrefabName)) { return prefabRef.PrefabName; } return ((Object)prefab).name; } private static GameObject? TwilightResolvePrefab(PrefabRef? prefabRef) { if (prefabRef == null) { return null; } if (prefabRef.IsValid()) { return prefabRef.Prefab; } AssetBundle bundle = prefabRef.Bundle; if ((Object)(object)bundle == (Object)null || string.IsNullOrWhiteSpace(prefabRef.PrefabName)) { return null; } GameObject[] array = bundle.LoadAllAssets(); foreach (GameObject val in array) { if ((Object)(object)val != (Object)null && string.Equals(((Object)val).name, prefabRef.PrefabName, StringComparison.OrdinalIgnoreCase)) { return val; } } return null; } private static List TwilightRegisterPrefabs(Level level, string moduleTypeName, IEnumerable prefabs) { List list = new List(); foreach (GameObject item in prefabs.OrderBy((GameObject gameObject) => ((Object)gameObject).name, StringComparer.OrdinalIgnoreCase)) { PrefabRef val = TwilightRegisterNetworkPrefab("Level/" + ((Object)level).name + "/" + moduleTypeName + "/" + ((Object)item).name, item); if (val != null) { list.Add(val); } } return list; } private static PrefabRef? TwilightRegisterNetworkPrefab(string prefabId, GameObject prefab) { PrefabRef val = TwilightGetRegisteredPrefabRef(prefabId, prefab); if (val != null) { return val; } TwilightPreparePrefab(prefab); Utilities.FixAudioMixerGroups(prefab); return NetworkPrefabs.RegisterNetworkPrefab(prefabId, prefab); } private static PrefabRef? TwilightGetRegisteredPrefabRef(string prefabId, GameObject prefab) { if (!NetworkPrefabs.PrefabRefs.TryGetValue(prefabId, out var value) || value == null) { return null; } if ((Object)(object)value.Prefab == (Object)null || (Object)(object)value.Prefab == (Object)(object)prefab) { return value; } return null; } private static void TwilightPreparePrefab(GameObject prefab) { TwilightApplyHideFlags((Object)(object)prefab); TwilightEnsureVehicleSupport(prefab); TwilightNormalizeBoxColliderSizes(prefab); TwilightIgnoreUnreadableMeshesForNavMesh(prefab); TwilightAssignFallbackAudioMixerGroups(prefab); TwilightAssignFallbackPhysAttributes(prefab); TwilightAssignFallbackChargingStationData(prefab); } private static void TwilightNormalizeBoxColliderSizes(GameObject prefab) { //IL_0024: 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_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)prefab == (Object)null) { return; } BoxCollider[] componentsInChildren = prefab.GetComponentsInChildren(true); Vector3 val2 = default(Vector3); foreach (BoxCollider val in componentsInChildren) { if (!((Object)(object)val == (Object)null)) { Vector3 size = val.size; ((Vector3)(ref val2))..ctor(Mathf.Abs(size.x), Mathf.Abs(size.y), Mathf.Abs(size.z)); if (size != val2) { val.size = val2; } } } } private static void TwilightIgnoreUnreadableMeshesForNavMesh(GameObject prefab) { if ((Object)(object)prefab == (Object)null) { return; } MeshFilter[] componentsInChildren = prefab.GetComponentsInChildren(true); foreach (MeshFilter val in componentsInChildren) { if (!((Object)(object)((val != null) ? val.sharedMesh : null) == (Object)null) && !TwilightMeshIsReadable(val.sharedMesh)) { TwilightIgnoreObjectFromNavMeshBuild(((Component)val).gameObject); } } SkinnedMeshRenderer[] componentsInChildren2 = prefab.GetComponentsInChildren(true); foreach (SkinnedMeshRenderer val2 in componentsInChildren2) { if (!((Object)(object)((val2 != null) ? val2.sharedMesh : null) == (Object)null) && !TwilightMeshIsReadable(val2.sharedMesh)) { TwilightIgnoreObjectFromNavMeshBuild(((Component)val2).gameObject); } } } private static bool TwilightMeshIsReadable(Mesh mesh) { try { return mesh.isReadable; } catch { return false; } } private static void TwilightIgnoreObjectFromNavMeshBuild(GameObject gameObject) { if (!((Object)(object)gameObject == (Object)null)) { NavMeshModifier obj = gameObject.GetComponent() ?? gameObject.AddComponent(); obj.ignoreFromBuild = true; obj.applyToChildren = false; } } private static void TwilightEnsureVehicleSupport(GameObject prefab) { if (!((Object)(object)prefab == (Object)null) && TwilightIsStartRoomPrefab(prefab)) { TwilightEnsureVehicleItemVolumes(prefab); TwilightEnsureVehicleChargingStation(prefab); } } private static bool TwilightIsStartRoomPrefab(GameObject prefab) { GameObject prefab2 = prefab; if (!((Object)(object)prefab2.GetComponentInChildren(true) != (Object)null)) { return TwilightStartRoomNames.Any((string name) => string.Equals(((Object)prefab2).name, name, StringComparison.OrdinalIgnoreCase)); } return true; } private static void TwilightEnsureVehicleItemVolumes(GameObject prefab) { int num = prefab.GetComponentsInChildren(true).Count(TwilightIsVehicleItemVolume); if (num < 4) { Transform parent = TwilightFindOrCreateVehicleSupportRoot(prefab); Transform anchor = TwilightFindTruckAnchor(prefab); for (int i = num; i < 4; i++) { TwilightCreateVehicleItemVolume(parent, anchor, i); } } } private static bool TwilightIsVehicleItemVolume(ItemVolume itemVolume) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Invalid comparison between Unknown and I4 return (int)TwilightGetComponentField((Component)(object)itemVolume, "itemVolume", (itemVolume)0) == 9; } private static void TwilightCreateVehicleItemVolume(Transform parent, Transform anchor, int index) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Expected O, but got Unknown //IL_0087: 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_00b6: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject((index == 0) ? "Item Volume vehicle" : $"Item Volume vehicle ({index})"); val.SetActive(false); val.transform.SetParent(parent, false); val.transform.SetPositionAndRotation(TwilightGetVehicleVolumePosition(anchor, index), anchor.rotation); ItemVolume target = val.AddComponent(); TwilightSetComponentField((Component)(object)target, "itemVolume", (object)(itemVolume)9); GameObject val2 = new GameObject("Vehicle"); val2.transform.SetParent(val.transform, false); val2.transform.localPosition = Vector3.zero; val2.transform.localRotation = Quaternion.identity; val2.transform.localScale = new Vector3(2.6f, 1.4f, 4f); TwilightSetComponentField((Component)(object)target, "volumes", new List { val2 }); TwilightApplyHideFlags((Object)(object)val); } private static Vector3 TwilightGetVehicleVolumePosition(Transform anchor, int index) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0055: 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) float num = ((index % 2 == 0) ? (-2f) : 2f); float num2 = 2.5f + (float)(index / 2) * 2f; return anchor.position + anchor.right * num + anchor.forward * num2 + Vector3.up * 0.25f; } private static Transform TwilightFindTruckAnchor(GameObject prefab) { LevelPoint[] componentsInChildren = prefab.GetComponentsInChildren(true); foreach (LevelPoint val in componentsInChildren) { if ((Object)(object)val != (Object)null && TwilightGetComponentField((Component)(object)val, "Truck", fallback: false)) { return ((Component)val).transform; } } RoomVolume[] componentsInChildren2 = prefab.GetComponentsInChildren(true); foreach (RoomVolume val2 in componentsInChildren2) { if ((Object)(object)val2 != (Object)null && TwilightGetComponentField((Component)(object)val2, "Truck", fallback: false)) { return ((Component)val2).transform; } } return prefab.transform; } private static Transform TwilightFindOrCreateVehicleSupportRoot(GameObject prefab) { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Expected O, but got Unknown Transform val = ((IEnumerable)prefab.GetComponentsInChildren(true)).FirstOrDefault((Func)((Transform child) => (Object)(object)child != (Object)null && string.Equals(((Object)child).name, "Empress Vehicle Support", StringComparison.OrdinalIgnoreCase))); if ((Object)(object)val != (Object)null) { return val; } GameObject val2 = new GameObject("Empress Vehicle Support"); val2.transform.SetParent(prefab.transform, false); TwilightApplyHideFlags((Object)val2); return val2.transform; } private static void TwilightEnsureVehicleChargingStation(GameObject prefab) { //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_014f: 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) if (prefab.GetComponentsInChildren(true).Any(TwilightIsVehicleChargingStation)) { return; } ChargingStation val = TwilightFindFallbackChargingStationTemplate(); if (!((Object)(object)val == (Object)null) && TwilightIsVehicleChargingStation(val)) { ChargingStation val2 = TwilightFindLegacyChargingStation(prefab); Transform val3 = TwilightFindOrCreateVehicleSupportRoot(prefab); Transform val4 = TwilightFindTruckAnchor(prefab); GameObject val5 = TwilightCloneInactiveChargingStationTemplate(val); ((Object)val5).name = "Charging Station New"; val5.transform.SetParent(val3, false); if ((Object)(object)val2 != (Object)null) { val5.transform.SetPositionAndRotation(((Component)val2).transform.position, ((Component)val2).transform.rotation); ((Component)val2).gameObject.SetActive(false); } else { val5.transform.SetPositionAndRotation(val4.position + val4.forward * 6.5f + Vector3.up * 0.05f, Quaternion.LookRotation(-val4.forward, Vector3.up)); } Transform val6 = TwilightFindChildByExactName(val5.transform, "Charge Area"); if ((Object)(object)val6 != (Object)null) { val6.localScale = new Vector3(Mathf.Max(val6.localScale.x, 4f), Mathf.Max(val6.localScale.y, 2f), Mathf.Max(val6.localScale.z, 4f)); } ChargingStation component = val5.GetComponent(); if ((Object)(object)component != (Object)null) { TwilightEnsureChargingStationCompatibility(component); } TwilightApplyHideFlags((Object)(object)val5); Utilities.FixAudioMixerGroups(val5); } } private static GameObject TwilightCloneInactiveChargingStationTemplate(ChargingStation template) { GameObject gameObject = ((Component)template).gameObject; bool activeSelf = gameObject.activeSelf; try { if (activeSelf) { gameObject.SetActive(false); } GameObject obj = Object.Instantiate(gameObject); obj.SetActive(false); return obj; } finally { if ((Object)(object)gameObject != (Object)null && activeSelf) { gameObject.SetActive(true); } } } internal static void TwilightActivateVehicleChargingStation(StartRoom? startRoom) { if ((Object)(object)startRoom == (Object)null || !TwilightIsCurrentLevel() || !TwilightIsStartRoomPrefab(((Component)startRoom).gameObject)) { return; } ChargingStation[] componentsInChildren = ((Component)startRoom).GetComponentsInChildren(true); foreach (ChargingStation val in componentsInChildren) { if ((Object)(object)val != (Object)null && TwilightIsVehicleChargingStation(val) && string.Equals(((Object)((Component)val).gameObject).name, "Charging Station New", StringComparison.OrdinalIgnoreCase) && !((Component)val).gameObject.activeSelf) { ((Component)val).gameObject.SetActive(true); } } ItemVolume[] componentsInChildren2 = ((Component)startRoom).GetComponentsInChildren(true); foreach (ItemVolume val2 in componentsInChildren2) { if ((Object)(object)val2 != (Object)null && TwilightIsVehicleItemVolume(val2) && !((Component)val2).gameObject.activeSelf) { ((Component)val2).gameObject.SetActive(true); } } } private static T TwilightGetComponentField(Component target, string fieldName, T fallback) { if ((Object)(object)target == (Object)null) { return fallback; } try { if (AccessTools.Field(((object)target).GetType(), fieldName) == null) { return fallback; } return (T)((Traverse.Create((object)target).Field(fieldName).GetValue() is T val) ? ((object)val) : ((object)fallback)); } catch { return fallback; } } private static void TwilightSetComponentField(Component target, string fieldName, object value) { if ((Object)(object)target == (Object)null) { return; } try { if (!(AccessTools.Field(((object)target).GetType(), fieldName) == null)) { Traverse.Create((object)target).Field(fieldName).SetValue(value); } } catch { } } private static void TwilightAssignFallbackAudioMixerGroups(GameObject prefab) { AudioMixerGroup val = TwilightGetFallbackAudioMixerGroup(); if ((Object)(object)prefab == (Object)null || (Object)(object)val == (Object)null) { return; } AudioSource[] componentsInChildren = prefab.GetComponentsInChildren(true); foreach (AudioSource val2 in componentsInChildren) { if (!((Object)(object)val2 == (Object)null) && !((Object)(object)val2.outputAudioMixerGroup != (Object)null)) { val2.outputAudioMixerGroup = val; } } } private static void TwilightAssignFallbackPhysAttributes(GameObject prefab) { if ((Object)(object)prefab == (Object)null) { return; } NotValuableObject[] componentsInChildren = prefab.GetComponentsInChildren(true); foreach (NotValuableObject val in componentsInChildren) { if (!((Object)(object)val == (Object)null) && !((Object)(object)val.physAttributePreset != (Object)null)) { Rigidbody component = ((Component)val).GetComponent(); float mass = (((Object)(object)component != (Object)null && component.mass > 0f) ? component.mass : 1f); val.physAttributePreset = TwilightCreateFallbackPhysAttribute(mass); } } } private static void TwilightAssignFallbackChargingStationData(GameObject prefab) { if (!((Object)(object)prefab == (Object)null)) { ChargingStation[] componentsInChildren = prefab.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { TwilightEnsureChargingStationCompatibility(componentsInChildren[i]); } } } internal static void TwilightEnsureChargingStationCompatibility(ChargingStation? chargingStation) { //IL_01d8: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_02ee: Unknown result type (might be due to invalid IL or missing references) //IL_0302: Unknown result type (might be due to invalid IL or missing references) //IL_0370: Unknown result type (might be due to invalid IL or missing references) //IL_0384: Unknown result type (might be due to invalid IL or missing references) //IL_04ae: Unknown result type (might be due to invalid IL or missing references) //IL_052d: Unknown result type (might be due to invalid IL or missing references) //IL_0609: Unknown result type (might be due to invalid IL or missing references) //IL_07bc: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)chargingStation == (Object)null) { return; } ChargingStation val = TwilightFindFallbackChargingStationTemplate(); Transform templateRoot = (((Object)(object)val != (Object)null) ? ((Component)val).transform : null); Transform transform = ((Component)chargingStation).transform; int num = Mathf.Max(TwilightGetChargingStationField(chargingStation, "maxCrystals", 10), ((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "maxCrystals", 10) : 10); TwilightSetChargingStationField(chargingStation, "maxCrystals", num); int num2 = Mathf.Max(TwilightGetChargingStationField(chargingStation, "energyPerCrystal", 10), ((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "energyPerCrystal", 10) : 10); TwilightSetChargingStationField(chargingStation, "energyPerCrystal", num2); int num3 = Mathf.Max(TwilightGetChargingStationField(chargingStation, "chargeSegments", 40), ((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "chargeSegments", 40) : 40); TwilightSetChargingStationField(chargingStation, "chargeSegments", num3); List value = TwilightGetChargingStationField>(chargingStation, "itemsCharging") ?? new List(); TwilightSetChargingStationField(chargingStation, "itemsCharging", value); List list = TwilightGetChargingStationField>(chargingStation, "stationLights") ?? new List(); list.Clear(); TwilightSetChargingStationField(chargingStation, "stationLights", list); List list2 = TwilightGetChargingStationField>(chargingStation, "stationLightMaxIntensities") ?? new List(); list2.Clear(); TwilightSetChargingStationField(chargingStation, "stationLightMaxIntensities", list2); TwilightSetChargingStationField(chargingStation, "scanColliders", TwilightGetChargingStationField>>(chargingStation, "scanColliders") ?? new Dictionary>()); TwilightSetChargingStationField(chargingStation, "scanColliderIndex", TwilightGetChargingStationField>(chargingStation, "scanColliderIndex") ?? new Dictionary()); TwilightSetChargingStationField(chargingStation, "scanOrder", TwilightGetChargingStationField>(chargingStation, "scanOrder") ?? new List()); List list3 = TwilightGetChargingStationField>(chargingStation, "crystals") ?? new List(); Scene scene = ((Component)chargingStation).gameObject.scene; if (!((Scene)(ref scene)).IsValid()) { list3.Clear(); } else { list3.RemoveAll((Transform crystal) => (Object)(object)crystal == (Object)null); } TwilightSetChargingStationField(chargingStation, "crystals", list3); PhotonView value2 = TwilightGetChargingStationField(chargingStation, "photonView") ?? ((Component)chargingStation).GetComponent(); TwilightSetChargingStationField(chargingStation, "photonView", value2); GameObject value3 = TwilightMapGameObject(transform, templateRoot, ((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "meshObject") : null) ?? TwilightGetChargingStationField(chargingStation, "meshObject") ?? TwilightFindBestRendererGameObject(transform) ?? TwilightCreateFallbackMeshObject(transform); TwilightSetChargingStationField(chargingStation, "meshObject", value3); Transform value4 = TwilightMapTransform(transform, templateRoot, ((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "chargeBar") : null) ?? TwilightGetChargingStationField(chargingStation, "chargeBar") ?? TwilightFindChildByExactName(transform, "Charge") ?? TwilightCreateFallbackAnchor(transform, "Charge", new Vector3(0f, 0.38f, 0.12f), new Vector3(0.75f, 0.12f, 0.12f)); TwilightSetChargingStationField(chargingStation, "chargeBar", value4); Transform value5 = TwilightMapTransform(transform, templateRoot, ((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "chargeArea") : null) ?? TwilightGetChargingStationField(chargingStation, "chargeArea") ?? TwilightFindChildByExactName(transform, "Charge Area") ?? TwilightCreateFallbackAnchor(transform, "Charge Area", new Vector3(0f, 0.65f, 0.7f), new Vector3(1.1f, 1.1f, 1.1f)); TwilightSetChargingStationField(chargingStation, "chargeArea", value5); Transform value6 = TwilightMapTransform(transform, templateRoot, ((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "lockedTransform") : null) ?? TwilightGetChargingStationField(chargingStation, "lockedTransform") ?? TwilightFindChildByExactName(transform, "Locked"); TwilightSetChargingStationField(chargingStation, "lockedTransform", value6); Transform value7 = TwilightMapTransform(transform, templateRoot, ((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "crystalCylinder") : null) ?? TwilightGetChargingStationField(chargingStation, "crystalCylinder") ?? TwilightFindChildByExactName(transform, "Crystal Cylinder") ?? TwilightFindChildContaining(transform, "crystal") ?? TwilightCreateFallbackCrystalCylinder(transform, num); TwilightSetChargingStationField(chargingStation, "crystalCylinder", value7); object obj = TwilightMapComponent(transform, templateRoot, ((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "light1") : null); if (obj == null) { obj = TwilightGetChargingStationField(chargingStation, "light1"); if (obj == null) { Transform? obj2 = TwilightFindChildByExactName(transform, "Light1"); obj = ((obj2 != null) ? ((Component)obj2).GetComponent() : null) ?? TwilightCreateFallbackLight(transform, "Light1", new Vector3(-0.16f, 0.62f, 0.16f), 0.8f); } } Light value8 = (Light)obj; TwilightSetChargingStationField(chargingStation, "light1", value8); object obj3 = TwilightMapComponent(transform, templateRoot, ((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "light2") : null); if (obj3 == null) { obj3 = TwilightGetChargingStationField(chargingStation, "light2"); if (obj3 == null) { Transform? obj4 = TwilightFindChildByExactName(transform, "Light2"); obj3 = ((obj4 != null) ? ((Component)obj4).GetComponent() : null) ?? TwilightCreateFallbackLight(transform, "Light2", new Vector3(0.16f, 0.62f, 0.16f), 0.8f); } } Light value9 = (Light)obj3; TwilightSetChargingStationField(chargingStation, "light2", value9); object obj5 = TwilightMapGameObject(transform, templateRoot, ((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "subtleLight") : null); if (obj5 == null) { obj5 = TwilightGetChargingStationField(chargingStation, "subtleLight"); if (obj5 == null) { Transform? obj6 = TwilightFindChildByExactName(transform, "Subtle Light"); obj5 = ((obj6 != null) ? ((Component)obj6).gameObject : null) ?? ((Component)TwilightCreateFallbackSubtleLight(transform)).gameObject; } } GameObject val2 = (GameObject)obj5; TwilightSetChargingStationField(chargingStation, "subtleLight", val2); Light value10 = TwilightMapComponent(transform, templateRoot, ((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "barLight") : null) ?? TwilightGetChargingStationField(chargingStation, "barLight") ?? ((val2 != null) ? val2.GetComponent() : null) ?? TwilightCreateFallbackLight(transform, "Bar Light", new Vector3(0f, 0.48f, 0.08f), 0.8f); TwilightSetChargingStationField(chargingStation, "barLight", value10); object obj7 = TwilightMapComponent(transform, templateRoot, ((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "lightParticle") : null); if (obj7 == null) { obj7 = TwilightGetChargingStationField(chargingStation, "lightParticle"); if (obj7 == null) { Transform? obj8 = TwilightFindChildByExactName(transform, "Light Particle"); obj7 = ((obj8 != null) ? ((Component)obj8).GetComponent() : null) ?? TwilightCreateFallbackParticleSystem(transform, "Light Particle"); } } ParticleSystem value11 = (ParticleSystem)obj7; TwilightSetChargingStationField(chargingStation, "lightParticle", value11); object obj9 = TwilightMapComponent(transform, templateRoot, ((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "fireflyParticles") : null); if (obj9 == null) { obj9 = TwilightGetChargingStationField(chargingStation, "fireflyParticles"); if (obj9 == null) { Transform? obj10 = TwilightFindChildByExactName(transform, "Firefly Particles"); obj9 = ((obj10 != null) ? ((Component)obj10).GetComponent() : null) ?? TwilightCreateFallbackParticleSystem(transform, "Firefly Particles"); } } ParticleSystem value12 = (ParticleSystem)obj9; TwilightSetChargingStationField(chargingStation, "fireflyParticles", value12); object obj11 = TwilightMapComponent(transform, templateRoot, ((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "bitsParticles") : null); if (obj11 == null) { obj11 = TwilightGetChargingStationField(chargingStation, "bitsParticles"); if (obj11 == null) { Transform? obj12 = TwilightFindChildByExactName(transform, "Bits Particles"); obj11 = ((obj12 != null) ? ((Component)obj12).GetComponent() : null) ?? TwilightCreateFallbackParticleSystem(transform, "Bits Particles"); } } ParticleSystem value13 = (ParticleSystem)obj11; TwilightSetChargingStationField(chargingStation, "bitsParticles", value13); AnimationCurve val3 = TwilightGetChargingStationField(chargingStation, "chargeCurve"); if (val3 == null || val3.length == 0) { AnimationCurve val4 = (((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "chargeCurve") : null); val3 = (AnimationCurve)((val4 == null || val4.length <= 0) ? ((object)AnimationCurve.EaseInOut(0f, 0f, 1f, 1f)) : ((object)new AnimationCurve(val4.keys))); } TwilightSetChargingStationField(chargingStation, "chargeCurve", val3); TwilightEnsureChargingStationCurve(chargingStation, val, "chargeLaserFlickerOnCurve", AnimationCurve.Linear(0f, 0f, 1f, 1f)); TwilightEnsureChargingStationCurve(chargingStation, val, "chargeLaserFlickerOffCurve", AnimationCurve.Linear(0f, 0f, 1f, 1f)); TwilightEnsureChargingStationCurve(chargingStation, val, "chargeLaserIntroBounceCurve", AnimationCurve.EaseInOut(0f, 0f, 1f, 1f)); TwilightEnsureChargingStationCurve(chargingStation, val, "chargeLaserSettleBounceCurve", AnimationCurve.EaseInOut(0f, 0f, 1f, 1f)); Sound value14 = TwilightEnsureChargingStationSound(TwilightGetChargingStationField(chargingStation, "soundStart"), ((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "soundStart") : null, transform, templateRoot, "Sound Start", requireSource: false); TwilightSetChargingStationField(chargingStation, "soundStart", value14); Sound value15 = TwilightEnsureChargingStationSound(TwilightGetChargingStationField(chargingStation, "soundStop"), ((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "soundStop") : null, transform, templateRoot, "Sound Stop", requireSource: false); TwilightSetChargingStationField(chargingStation, "soundStop", value15); Sound value16 = TwilightEnsureChargingStationSound(TwilightGetChargingStationField(chargingStation, "soundLoop"), ((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "soundLoop") : null, transform, templateRoot, "Sound Loop", requireSource: true); TwilightSetChargingStationField(chargingStation, "soundLoop", value16); Sound value17 = TwilightEnsureChargingStationSound(TwilightGetChargingStationField(chargingStation, "soundPowerCrystalBreak"), ((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "soundPowerCrystalBreak") : null, transform, templateRoot, "Sound Crystal Break", requireSource: false); TwilightSetChargingStationField(chargingStation, "soundPowerCrystalBreak", value17); Item value18 = TwilightGetChargingStationField(chargingStation, "item") ?? (((Object)(object)val != (Object)null) ? TwilightGetChargingStationField(val, "item") : null) ?? TwilightFindPowerCrystalItem(); TwilightSetChargingStationField(chargingStation, "item", value18); } private static void TwilightEnsureChargingStationCurve(ChargingStation chargingStation, ChargingStation? template, string fieldName, AnimationCurve fallbackCurve) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Expected O, but got Unknown //IL_0046: Unknown result type (might be due to invalid IL or missing references) AnimationCurve val = TwilightGetChargingStationField(chargingStation, fieldName); if (val == null || val.length == 0) { AnimationCurve val2 = (((Object)(object)template != (Object)null) ? TwilightGetChargingStationField(template, fieldName) : null); val = ((val2 != null && val2.length > 0) ? new AnimationCurve(val2.keys) : new AnimationCurve(fallbackCurve.keys)); } TwilightSetChargingStationField(chargingStation, fieldName, val); } private static ChargingStation? TwilightFindFallbackChargingStationTemplate() { ChargingStation val = null; if (RunManager.instance?.levels != null) { foreach (Level level in RunManager.instance.levels) { if ((Object)(object)level == (Object)null || TwilightIsTwilightLevel(level)) { continue; } GameObject val2 = TwilightGetFirstValidPrefab(level.StartRooms); if ((Object)(object)val2 == (Object)null) { continue; } ChargingStation[] componentsInChildren = val2.GetComponentsInChildren(true); foreach (ChargingStation val3 in componentsInChildren) { if (!((Object)(object)val3 == (Object)null)) { if (TwilightIsVehicleChargingStation(val3)) { return val3; } if (val == null) { val = val3; } } } } } return Resources.FindObjectsOfTypeAll().Where(delegate(ChargingStation candidate) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)candidate != (Object)null) { Scene scene = ((Component)candidate).gameObject.scene; return !((Scene)(ref scene)).IsValid(); } return false; }).OrderByDescending(TwilightIsVehicleChargingStation) .FirstOrDefault() ?? val; } private static ChargingStation? TwilightFindLegacyChargingStation(GameObject prefab) { return ((IEnumerable)prefab.GetComponentsInChildren(true)).FirstOrDefault((Func)((ChargingStation candidate) => (Object)(object)candidate != (Object)null && !TwilightIsVehicleChargingStation(candidate))); } private static bool TwilightIsVehicleChargingStation(ChargingStation? chargingStation) { if ((Object)(object)chargingStation == (Object)null) { return false; } Transform transform = ((Component)chargingStation).transform; if ((Object)(object)TwilightFindChildByExactName(transform, "Charge Area") != (Object)null) { return (Object)(object)TwilightFindChildByExactName(transform, "Line Between Two Points") != (Object)null; } return false; } private static GameObject? TwilightGetFirstValidPrefab(IEnumerable? prefabRefs) { if (prefabRefs == null) { return null; } foreach (PrefabRef prefabRef in prefabRefs) { if (prefabRef == null) { continue; } try { GameObject val = TwilightResolvePrefab(prefabRef); if ((Object)(object)val != (Object)null) { return val; } } catch { } } return null; } private static Sound TwilightEnsureChargingStationSound(Sound? currentSound, Sound? templateSound, Transform stationRoot, Transform? templateRoot, string audioName, bool requireSource) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Expected O, but got Unknown //IL_002d: 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) if (currentSound == null) { currentSound = new Sound(); } TwilightNormalizeSound(currentSound); if (templateSound != null) { currentSound.Sounds = templateSound.Sounds ?? Array.Empty(); currentSound.Type = templateSound.Type; currentSound.Volume = templateSound.Volume; TwilightSetSoundVolumeDefault(currentSound, TwilightGetSoundVolumeDefault(templateSound, currentSound.Volume)); currentSound.VolumeRandom = templateSound.VolumeRandom; currentSound.Pitch = templateSound.Pitch; currentSound.PitchRandom = templateSound.PitchRandom; currentSound.SpatialBlend = templateSound.SpatialBlend; currentSound.Doppler = templateSound.Doppler; currentSound.ReverbMix = templateSound.ReverbMix; currentSound.FalloffMultiplier = templateSound.FalloffMultiplier; currentSound.OffscreenVolume = templateSound.OffscreenVolume; currentSound.OffscreenFalloff = templateSound.OffscreenFalloff; currentSound.Source = TwilightMapComponent(stationRoot, templateRoot, templateSound.Source) ?? currentSound.Source; } if (requireSource && (Object)(object)currentSound.Source == (Object)null) { currentSound.Source = TwilightCreateFallbackAudioSource(stationRoot, audioName); } return currentSound; } private static float TwilightGetSoundVolumeDefault(Sound? sound, float fallback) { if (sound == null) { return fallback; } try { FieldInfo fieldInfo = AccessTools.Field(((object)sound).GetType(), "VolumeDefault"); if (fieldInfo == null) { return fallback; } return (fieldInfo.GetValue(sound) is float num) ? num : fallback; } catch { return fallback; } } private static void TwilightSetSoundVolumeDefault(Sound? sound, float value) { if (sound == null) { return; } try { AccessTools.Field(((object)sound).GetType(), "VolumeDefault")?.SetValue(sound, value); } catch { } } private static T? TwilightGetChargingStationField(ChargingStation? chargingStation, string fieldName) { return TwilightGetChargingStationField(chargingStation, fieldName, default(T)); } private static T TwilightGetChargingStationField(ChargingStation? chargingStation, string fieldName, T fallback) { if ((Object)(object)chargingStation == (Object)null) { return fallback; } try { return (T)((Traverse.Create((object)chargingStation).Field(fieldName).GetValue() is T val) ? ((object)val) : ((object)fallback)); } catch { return fallback; } } private static void TwilightSetChargingStationField(ChargingStation? chargingStation, string fieldName, object? value) { if ((Object)(object)chargingStation == (Object)null) { return; } try { Traverse.Create((object)chargingStation).Field(fieldName).SetValue(value); } catch { } } private static void TwilightNormalizeSound(Sound? sound) { if (sound != null) { Sound val = sound; if (val.Sounds == null) { val.Sounds = Array.Empty(); } val = sound; if (val.LowPassIgnoreColliders == null) { val.LowPassIgnoreColliders = new List(); } } } private static Transform? TwilightFindChildByExactName(Transform root, string name) { string name2 = name; return ((IEnumerable)((Component)root).GetComponentsInChildren(true)).FirstOrDefault((Func)((Transform child) => (Object)(object)child != (Object)null && string.Equals(((Object)child).name, name2, StringComparison.OrdinalIgnoreCase))); } private static Transform? TwilightFindChildContaining(Transform root, string value) { string value2 = value; return ((IEnumerable)((Component)root).GetComponentsInChildren(true)).FirstOrDefault((Func)((Transform child) => (Object)(object)child != (Object)null && ((Object)child).name.IndexOf(value2, StringComparison.OrdinalIgnoreCase) >= 0)); } private static string? TwilightGetRelativePath(Transform root, Transform? target) { if ((Object)(object)root == (Object)null || (Object)(object)target == (Object)null) { return null; } if ((Object)(object)target == (Object)(object)root) { return string.Empty; } Stack stack = new Stack(); Transform val = target; while ((Object)(object)val != (Object)null && (Object)(object)val != (Object)(object)root) { stack.Push(((Object)val).name); val = val.parent; } if ((Object)(object)val != (Object)(object)root) { return null; } return string.Join("/", stack); } private static Transform? TwilightMapTransform(Transform targetRoot, Transform? templateRoot, Transform? templateTransform) { if ((Object)(object)targetRoot == (Object)null || (Object)(object)templateRoot == (Object)null || (Object)(object)templateTransform == (Object)null) { return null; } string text = TwilightGetRelativePath(templateRoot, templateTransform); if (text == null) { return null; } if (text.Length != 0) { return targetRoot.Find(text); } return targetRoot; } private static TComponent? TwilightMapComponent(Transform targetRoot, Transform? templateRoot, TComponent? templateComponent) where TComponent : Component { Transform val = TwilightMapTransform(targetRoot, templateRoot, ((Object)(object)templateComponent != (Object)null) ? ((Component)templateComponent).transform : null); if (!((Object)(object)val != (Object)null)) { return default(TComponent); } return ((Component)val).GetComponent(); } private static GameObject? TwilightMapGameObject(Transform targetRoot, Transform? templateRoot, GameObject? templateObject) { Transform val = TwilightMapTransform(targetRoot, templateRoot, ((Object)(object)templateObject != (Object)null) ? templateObject.transform : null); if (!((Object)(object)val != (Object)null)) { return null; } return ((Component)val).gameObject; } private static GameObject? TwilightFindBestRendererGameObject(Transform root) { Transform root2 = root; return (from renderer in (from renderer in ((Component)root2).GetComponentsInChildren(true) where (Object)(object)renderer != (Object)null && (Object)(object)((Component)renderer).gameObject != (Object)(object)((Component)root2).gameObject select renderer).OrderByDescending(delegate(Renderer renderer) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) Bounds bounds = renderer.bounds; Vector3 size = ((Bounds)(ref bounds)).size; return ((Vector3)(ref size)).sqrMagnitude; }) select ((Component)renderer).gameObject).FirstOrDefault(); } private static GameObject TwilightCreateFallbackMeshObject(Transform stationRoot) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) GameObject obj = GameObject.CreatePrimitive((PrimitiveType)3); ((Object)obj).name = "Charging Station Mesh"; obj.transform.SetParent(stationRoot, false); obj.transform.localPosition = new Vector3(0f, 0.45f, 0f); obj.transform.localScale = new Vector3(0.75f, 0.9f, 0.6f); Collider component = obj.GetComponent(); if ((Object)(object)component != (Object)null) { Object.DestroyImmediate((Object)(object)component); } TwilightApplyHideFlags((Object)(object)obj); return obj; } private static Transform TwilightCreateFallbackAnchor(Transform stationRoot, string name, Vector3 localPosition, Vector3 localScale) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown GameObject val = new GameObject(name); val.transform.SetParent(stationRoot, false); val.transform.localPosition = localPosition; val.transform.localRotation = Quaternion.identity; val.transform.localScale = localScale; TwilightApplyHideFlags((Object)val); return val.transform; } private static Transform TwilightCreateFallbackCrystalCylinder(Transform stationRoot, int crystalCount) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_002d: 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_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("Crystal Cylinder"); val.transform.SetParent(stationRoot, false); val.transform.localPosition = new Vector3(0f, 0.6f, 0f); val.transform.localRotation = Quaternion.Euler(90f, 0f, 0f); TwilightApplyHideFlags((Object)(object)val); int num = Mathf.Max(1, crystalCount); for (int i = 0; i < num; i++) { GameObject obj = GameObject.CreatePrimitive((PrimitiveType)3); ((Object)obj).name = $"Crystal {i + 1}"; obj.transform.SetParent(val.transform, false); float num2 = MathF.PI * 2f * (float)i / (float)num; obj.transform.localPosition = new Vector3(Mathf.Cos(num2) * 0.18f, Mathf.Sin(num2) * 0.18f, 0f); obj.transform.localScale = new Vector3(0.07f, 0.07f, 0.18f); Collider component = obj.GetComponent(); if ((Object)(object)component != (Object)null) { Object.DestroyImmediate((Object)(object)component); } } return val.transform; } private static Light TwilightCreateFallbackLight(Transform stationRoot, string name, Vector3 localPosition, float intensity) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(name); val.transform.SetParent(stationRoot, false); val.transform.localPosition = localPosition; Light obj = val.AddComponent(); obj.type = (LightType)2; obj.range = 2f; obj.intensity = intensity; obj.color = new Color(1f, 0.9f, 0.35f); TwilightApplyHideFlags((Object)(object)val); return obj; } private static Light TwilightCreateFallbackSubtleLight(Transform stationRoot) { //IL_0015: 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) Light obj = TwilightCreateFallbackLight(stationRoot, "Subtle Light", new Vector3(0f, 0.55f, 0.05f), 0.5f); obj.range = 2.5f; obj.color = new Color(0.7f, 0.7f, 0.3f); return obj; } private static ParticleSystem TwilightCreateFallbackParticleSystem(Transform stationRoot, string name) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(name); val.transform.SetParent(stationRoot, false); val.transform.localPosition = Vector3.zero; ParticleSystem obj = val.AddComponent(); MainModule main = obj.main; ((MainModule)(ref main)).playOnAwake = false; ((MainModule)(ref main)).loop = false; ((MainModule)(ref main)).duration = 0.25f; ((MainModule)(ref main)).startLifetime = MinMaxCurve.op_Implicit(0.15f); ((MainModule)(ref main)).startSpeed = MinMaxCurve.op_Implicit(0.05f); ((MainModule)(ref main)).startSize = MinMaxCurve.op_Implicit(0.02f); EmissionModule emission = obj.emission; ((EmissionModule)(ref emission)).enabled = false; TwilightApplyHideFlags((Object)(object)val); return obj; } private static AudioSource TwilightCreateFallbackAudioSource(Transform stationRoot, string name) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(name); val.transform.SetParent(stationRoot, false); val.transform.localPosition = Vector3.zero; AudioSource obj = val.AddComponent(); obj.playOnAwake = false; obj.spatialBlend = 1f; obj.outputAudioMixerGroup = TwilightGetFallbackAudioMixerGroup(); TwilightApplyHideFlags((Object)(object)val); return obj; } private static Item? TwilightFindPowerCrystalItem() { return ((IEnumerable)Resources.FindObjectsOfTypeAll()).FirstOrDefault((Func)((Item item) => (Object)(object)item != (Object)null && (string.Equals(item.itemName, "Power Crystal", StringComparison.OrdinalIgnoreCase) || string.Equals(((Object)item).name, "Item Power Crystal", StringComparison.OrdinalIgnoreCase) || ((Object)item).name.IndexOf("Power Crystal", StringComparison.OrdinalIgnoreCase) >= 0))); } private static PhysAttribute TwilightCreateFallbackPhysAttribute(float mass) { PhysAttribute obj = ScriptableObject.CreateInstance(); obj.mass = Mathf.Max(0.01f, mass); TwilightApplyHideFlags((Object)(object)obj); return obj; } private static AudioMixerGroup? TwilightGetFallbackAudioMixerGroup() { if ((Object)(object)AudioManager.instance == (Object)null) { return null; } return AudioManager.instance.SoundMasterGroup ?? AudioManager.instance.PersistentSoundGroup ?? AudioManager.instance.MusicMasterGroup ?? AudioManager.instance.MicrophoneSoundGroup ?? AudioManager.instance.MicrophoneSpectateGroup ?? AudioManager.instance.TTSSoundGroup ?? AudioManager.instance.TTSSpectateGroup; } private static int TwilightCountModules(Level level) { return (level.ModulesNormal1?.Count ?? 0) + (level.ModulesPassage1?.Count ?? 0) + (level.ModulesDeadEnd1?.Count ?? 0) + (level.ModulesExtraction1?.Count ?? 0) + (level.ModulesNormal2?.Count ?? 0) + (level.ModulesPassage2?.Count ?? 0) + (level.ModulesDeadEnd2?.Count ?? 0) + (level.ModulesExtraction2?.Count ?? 0) + (level.ModulesNormal3?.Count ?? 0) + (level.ModulesPassage3?.Count ?? 0) + (level.ModulesDeadEnd3?.Count ?? 0) + (level.ModulesExtraction3?.Count ?? 0); } internal static bool TwilightIsCurrentLevel() { if (!TwilightIsTwilightLevel(((Object)(object)LevelGenerator.Instance != (Object)null) ? LevelGenerator.Instance.Level : null)) { return TwilightIsTwilightLevel(((Object)(object)RunManager.instance != (Object)null) ? RunManager.instance.levelCurrent : null); } return true; } private static bool TwilightIsTwilightLevel(Level? level) { if ((Object)(object)level == (Object)null) { return false; } if (!string.Equals(((Object)level).name, "Level - Twilightforest", StringComparison.OrdinalIgnoreCase) && !string.Equals(((Object)level).name, "Twilightforest", StringComparison.OrdinalIgnoreCase) && (string.IsNullOrWhiteSpace(((Object)level).name) || ((Object)level).name.IndexOf("twilight", StringComparison.OrdinalIgnoreCase) < 0)) { if (!string.IsNullOrWhiteSpace(level.NarrativeName)) { return level.NarrativeName.IndexOf("twilight", StringComparison.OrdinalIgnoreCase) >= 0; } return false; } return true; } internal static void TwilightEnsureLevelFallbackData(Level? level) { if (TwilightIsTwilightLevel(level)) { Level val = level; if (val.ValuablePresets == null) { val.ValuablePresets = new List(); } val = level; if (val.AmbiencePresets == null) { val.AmbiencePresets = new List(); } if (level.ValuablePresets.Count == 0 && (Object)(object)ValuablePresets.GenericValuablePreset != (Object)null) { level.ValuablePresets.Add(ValuablePresets.GenericValuablePreset); } if (level.AmbiencePresets.Count == 0 && TwilightTryGetFallbackAmbience(out LevelAmbience ambience)) { level.AmbiencePresets.Add(ambience); } } } private static void TwilightEnsureLevelLoadingGraphics(Level level, AssetBundle bundle) { List list = TwilightCollectLoadingGraphics(bundle); TwilightCacheLoadingSprites(list); string[] twilightLoadingGraphicFieldNames = TwilightLoadingGraphicFieldNames; foreach (string text in twilightLoadingGraphicFieldNames) { if (list.Count != 0 || !TwilightLevelLoadingGraphicValid(level, text)) { TwilightLoadingGraphic twilightLoadingGraphic = ((list.Count > 0) ? list[Math.Min(Array.IndexOf(TwilightLoadingGraphicFieldNames, text), list.Count - 1)] : null); if (twilightLoadingGraphic == null || !TwilightSetLevelLoadingGraphic(level, text, twilightLoadingGraphic)) { TwilightCopyFallbackLevelLoadingGraphic(level, text); } } } } private static List TwilightCollectLoadingGraphics(AssetBundle bundle) { List list = new List(); HashSet hashSet = new HashSet(StringComparer.OrdinalIgnoreCase); List source = (from sprite in bundle.LoadAllAssets() where (Object)(object)sprite != (Object)null && !string.IsNullOrWhiteSpace(((Object)sprite).name) select sprite).ToList(); string[] twilightPreferredLoadingGraphicNames = TwilightPreferredLoadingGraphicNames; foreach (string preferredName in twilightPreferredLoadingGraphicNames) { Sprite val = ((IEnumerable)source).FirstOrDefault((Func)((Sprite candidate) => string.Equals(((Object)candidate).name, preferredName, StringComparison.OrdinalIgnoreCase))); if (!((Object)(object)val == (Object)null) && hashSet.Add(((Object)val).name)) { bool canUsePrefabRef = (Object)(object)bundle.LoadAsset(((Object)val).name) != (Object)null; list.Add(new TwilightLoadingGraphic(bundle, val, ((Object)val).name, canUsePrefabRef)); } } foreach (string item in bundle.GetAllAssetNames().OrderBy(TwilightLoadingGraphicRank).ThenBy((string name) => name, StringComparer.OrdinalIgnoreCase)) { Sprite val2 = bundle.LoadAsset(item); if (!((Object)(object)val2 == (Object)null) && hashSet.Add(item)) { list.Add(new TwilightLoadingGraphic(bundle, val2, item, canUsePrefabRef: true)); } } foreach (Sprite item2 in source.OrderBy((Sprite sprite) => TwilightLoadingGraphicRank(((Object)sprite).name)).ThenBy((Sprite sprite) => ((Object)sprite).name, StringComparer.OrdinalIgnoreCase)) { if (!((Object)(object)item2 == (Object)null) && !string.IsNullOrWhiteSpace(((Object)item2).name) && hashSet.Add(((Object)item2).name)) { bool canUsePrefabRef2 = (Object)(object)bundle.LoadAsset(((Object)item2).name) != (Object)null; list.Add(new TwilightLoadingGraphic(bundle, item2, ((Object)item2).name, canUsePrefabRef2)); } } return list; } private static void TwilightCacheLoadingSprites(IEnumerable graphics) { TwilightLoadingSprites.Clear(); foreach (TwilightLoadingGraphic graphic in graphics) { if ((Object)(object)graphic.Sprite != (Object)null && !TwilightLoadingSprites.Contains(graphic.Sprite)) { TwilightLoadingSprites.Add(graphic.Sprite); } if (TwilightLoadingSprites.Count >= TwilightLoadingGraphicFieldNames.Length) { break; } } } internal static void TwilightApplyLoadingGraphics(LoadingUI? loadingUI) { if (!((Object)(object)loadingUI == (Object)null) && TwilightIsCurrentLevel() && TwilightLoadingSprites.Count != 0) { TwilightApplyLoadingGraphic(loadingUI.loadingGraphic01, 0); TwilightApplyLoadingGraphic(loadingUI.loadingGraphic02, 1); TwilightApplyLoadingGraphic(loadingUI.loadingGraphic03, 2); } } private static void TwilightApplyLoadingGraphic(Image? image, int index) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)image == (Object)null)) { Sprite sprite = TwilightLoadingSprites[Math.Min(index, TwilightLoadingSprites.Count - 1)]; image.sprite = sprite; ((Graphic)image).color = Color.white; } } private static int TwilightLoadingGraphicRank(string value) { if (string.IsNullOrWhiteSpace(value)) { return 1000; } string text = value.ToLowerInvariant(); int num = 0; if (text.Contains("loading")) { num -= 100; } if (text.Contains("graphic")) { num -= 50; } if (text.Contains("twilight")) { num -= 25; } if (text.Contains("forest")) { num -= 10; } if (text.Contains("icon")) { num += 100; } return num; } private static bool TwilightLevelLoadingGraphicValid(Level level, string fieldName) { try { object obj = AccessTools.Field(((object)level).GetType(), fieldName)?.GetValue(level); if (obj == null) { return false; } Sprite val = (Sprite)((obj is Sprite) ? obj : null); if (val != null) { return (Object)(object)val != (Object)null; } object obj2 = obj.GetType().GetMethod("IsValid", Type.EmptyTypes)?.Invoke(obj, Array.Empty()); return obj2 is bool && (bool)obj2; } catch { return false; } } private static bool TwilightSetLevelLoadingGraphic(Level level, string fieldName, TwilightLoadingGraphic graphic) { try { FieldInfo fieldInfo = AccessTools.Field(((object)level).GetType(), fieldName); if (fieldInfo == null) { return false; } if (typeof(Sprite).IsAssignableFrom(fieldInfo.FieldType)) { fieldInfo.SetValue(level, graphic.Sprite); return true; } if (!fieldInfo.FieldType.Name.StartsWith("PrefabRef", StringComparison.Ordinal)) { return false; } if (!graphic.CanUsePrefabRef) { return false; } object obj = fieldInfo.GetValue(level) ?? Activator.CreateInstance(fieldInfo.FieldType); if (obj == null) { return false; } MethodInfo method = fieldInfo.FieldType.GetMethod("SetPrefab", new Type[2] { typeof(AssetBundle), typeof(string) }); if (method != null) { method.Invoke(obj, new object[2] { graphic.Bundle, graphic.ResourcePath }); } else { AccessTools.Field(fieldInfo.FieldType, "bundle")?.SetValue(obj, graphic.Bundle); AccessTools.Field(fieldInfo.FieldType, "resourcePath")?.SetValue(obj, graphic.ResourcePath); AccessTools.Field(fieldInfo.FieldType, "prefabName")?.SetValue(obj, Path.GetFileNameWithoutExtension(graphic.ResourcePath)); } fieldInfo.SetValue(level, obj); return TwilightLevelLoadingGraphicValid(level, fieldName); } catch { return false; } } private static bool TwilightCopyFallbackLevelLoadingGraphic(Level level, string fieldName) { if (RunManager.instance?.levels == null) { return false; } FieldInfo fieldInfo = AccessTools.Field(((object)level).GetType(), fieldName); if (fieldInfo == null) { return false; } foreach (Level level2 in RunManager.instance.levels) { if ((Object)(object)level2 == (Object)null || TwilightIsTwilightLevel(level2)) { continue; } object value = fieldInfo.GetValue(level2); if (value != null) { fieldInfo.SetValue(level, value); if (TwilightLevelLoadingGraphicValid(level, fieldName)) { return true; } } } return false; } private static bool TwilightTryGetFallbackAmbience(out LevelAmbience ambience) { ambience = null; if ((Object)(object)AudioManager.instance != (Object)null && AudioManager.instance.levelAmbiences != null) { foreach (LevelAmbience levelAmbience in AudioManager.instance.levelAmbiences) { if (!((Object)(object)levelAmbience == (Object)null)) { ambience = levelAmbience; return true; } } } if ((Object)(object)RunManager.instance != (Object)null && RunManager.instance.levels != null) { foreach (Level level in RunManager.instance.levels) { if (level?.AmbiencePresets == null) { continue; } foreach (LevelAmbience ambiencePreset in level.AmbiencePresets) { if (!((Object)(object)ambiencePreset == (Object)null)) { ambience = ambiencePreset; return true; } } } } return false; } internal static bool TwilightShouldSuppressUnityLog(LogType logType, string? format, object[]? args) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Invalid comparison between Unknown and I4 //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) if (!TwilightIsCurrentLevel()) { return false; } string text = TwilightFormatUnityLogMessage(format, args); if (string.IsNullOrWhiteSpace(text)) { return false; } if ((int)logType == 2 && text.StartsWith("BoxCollider does not support negative scale or size.", StringComparison.Ordinal)) { return true; } if ((int)logType == 0 && text.StartsWith("RuntimeNavMeshBuilder: Source mesh ", StringComparison.Ordinal) && text.IndexOf("does not allow read access", StringComparison.OrdinalIgnoreCase) >= 0) { return true; } if ((int)logType == 0) { if (!text.StartsWith("Level Point: ", StringComparison.Ordinal)) { return text.StartsWith(" Point Name: ", StringComparison.Ordinal); } return true; } return false; } private static string TwilightFormatUnityLogMessage(string? format, object[]? args) { if (format == null) { return string.Empty; } if (args == null || args.Length == 0) { return format; } try { return string.Format(format, args); } catch { return format; } } internal static void TwilightEnsureExtractionPointCompatibility(ExtractionPoint extractionPoint) { //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Expected O, but got Unknown if ((Object)(object)extractionPoint == (Object)null || !TwilightIsCurrentLevel()) { return; } if ((Object)(object)extractionPoint.extractionArea == (Object)null) { GameObject val = GameObject.CreatePrimitive((PrimitiveType)2); ((Object)val).name = "Twilight Patch Extraction Area"; val.transform.SetParent(((Component)extractionPoint).transform, false); val.transform.localPosition = Vector3.zero; val.transform.localRotation = Quaternion.identity; val.transform.localScale = Vector3.one * 0.1f; MeshRenderer component = val.GetComponent(); if ((Object)(object)component != (Object)null) { ((Renderer)component).enabled = false; } Collider component2 = val.GetComponent(); if ((Object)(object)component2 != (Object)null) { Object.Destroy((Object)(object)component2); } val.SetActive(false); TwilightApplyHideFlags((Object)(object)val); extractionPoint.extractionArea = val; } if ((Object)(object)extractionPoint.grossUp == (Object)null) { GameObject val2 = new GameObject("Twilight Patch GrossUp"); val2.transform.SetParent(((Component)extractionPoint).transform, false); val2.SetActive(false); TwilightApplyHideFlags((Object)(object)val2); extractionPoint.grossUp = val2; } } internal void TwilightRepairLevelPoints(LevelGenerator levelGenerator) { if ((Object)(object)levelGenerator == (Object)null || !TwilightIsTwilightLevel(levelGenerator.Level) || levelGenerator.LevelPathPoints == null) { return; } int num = 0; int num2 = 0; foreach (LevelPoint levelPathPoint in levelGenerator.LevelPathPoints) { if (TwilightRepairLevelPoint(levelPathPoint)) { num++; } if (TwilightRepairLevelPointRoom(levelPathPoint)) { num2++; } } if (num > 0 || num2 > 0) { ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Empress Twilight Forest Compat Patch repaired {num} Twilight Forest level points onto the navmesh and restored {num2} room links."); } } internal bool TwilightTryStartSilentLevelPoint(LevelPoint levelPoint) { if (!TwilightIsTwilightLevelPoint(levelPoint)) { return false; } if ((Object)(object)LevelGenerator.Instance != (Object)null) { LevelGenerator instance = LevelGenerator.Instance; if (instance.LevelPathPoints == null) { instance.LevelPathPoints = new List(); } if (!LevelGenerator.Instance.LevelPathPoints.Contains(levelPoint)) { LevelGenerator.Instance.LevelPathPoints.Add(levelPoint); } if (levelPoint.Truck) { LevelGenerator.Instance.LevelPathTruck = levelPoint; } } if ((Object)(object)((Component)levelPoint).GetComponentInParent() != (Object)null) { TwilightSetLevelPointBool(levelPoint, "inStartRoom", value: true); } ((MonoBehaviour)this).StartCoroutine(TwilightSilentLevelPointCheck(levelPoint)); return true; } private static void TwilightSetLevelPointBool(LevelPoint levelPoint, string fieldName, bool value) { try { AccessTools.Field(((object)levelPoint).GetType(), fieldName)?.SetValue(levelPoint, value); } catch { } } private static bool TwilightIsTwilightLevelPoint(LevelPoint? levelPoint) { if ((Object)(object)levelPoint == (Object)null) { return false; } if (TwilightIsCurrentLevel()) { return true; } Module componentInParent = ((Component)levelPoint).GetComponentInParent(); if ((Object)(object)componentInParent != (Object)null && !string.IsNullOrWhiteSpace(((Object)componentInParent).name) && ((Object)componentInParent).name.IndexOf("twilight", StringComparison.OrdinalIgnoreCase) >= 0) { return true; } StartRoom componentInParent2 = ((Component)levelPoint).GetComponentInParent(); if ((Object)(object)componentInParent2 != (Object)null && !string.IsNullOrWhiteSpace(((Object)componentInParent2).name) && ((Object)componentInParent2).name.IndexOf("twilight", StringComparison.OrdinalIgnoreCase) >= 0) { return true; } Transform val = ((Component)levelPoint).transform; while ((Object)(object)val != (Object)null) { if (!string.IsNullOrWhiteSpace(((Object)val).name) && ((Object)val).name.IndexOf("twilight", StringComparison.OrdinalIgnoreCase) >= 0) { return true; } val = val.parent; } return false; } private static bool TwilightRepairLevelPoint(LevelPoint? levelPoint) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0017: 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_0043: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)levelPoint == (Object)null) { return false; } Vector3 position = ((Component)levelPoint).transform.position; NavMeshHit val = default(NavMeshHit); if (NavMesh.SamplePosition(position, ref val, 0.5f, -1)) { return false; } NavMeshHit val2 = default(NavMeshHit); if (!NavMesh.SamplePosition(position, ref val2, 2f, -1)) { return false; } ((Component)levelPoint).transform.position = ((NavMeshHit)(ref val2)).position; TwilightRepairLevelPointRoom(levelPoint); return true; } private static bool TwilightRepairLevelPointRoom(LevelPoint? levelPoint) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)levelPoint == (Object)null || (Object)(object)levelPoint.Room != (Object)null) { return false; } RoomVolume room = default(RoomVolume); Vector3 val = default(Vector3); if (!SemiFunc.GetRoomVolumeAtPosition(((Component)levelPoint).transform.position, ref room, ref val)) { return false; } levelPoint.Room = room; return true; } internal IEnumerator TwilightSilentLevelPointCheck(LevelPoint levelPoint) { if ((Object)(object)levelPoint == (Object)null) { yield break; } while ((Object)(object)LevelGenerator.Instance == (Object)null || !LevelGenerator.Instance.Generated) { yield return (object)new WaitForSeconds(0.1f); } yield return (object)new WaitForSeconds(0.5f); if (TwilightIsCurrentLevel()) { TwilightRepairLevelPoint(levelPoint); TwilightRepairLevelPointRoom(levelPoint); TwilightRepairLevelPointConnections(levelPoint, LevelGenerator.Instance?.LevelPathPoints); if (levelPoint.ModuleConnect) { TwilightSetLevelPointBool(levelPoint, "ModuleConnected", value: true); } } } private static void TwilightRepairLevelPointConnections(LevelPoint? levelPoint, IList? allLevelPoints) { if ((Object)(object)levelPoint == (Object)null) { return; } if (levelPoint.ConnectedPoints == null) { levelPoint.ConnectedPoints = new List(); } levelPoint.ConnectedPoints.RemoveAll((LevelPoint connectedPoint) => (Object)(object)connectedPoint == (Object)null); LevelPoint[] array = levelPoint.ConnectedPoints.ToArray(); for (int i = 0; i < array.Length; i++) { TwilightAddLevelPointConnection(array[i], levelPoint); } if (!levelPoint.ModuleConnect || allLevelPoints == null || levelPoint.ConnectedPoints.Count > 0) { return; } LevelPoint val = null; float currentBestDistance = float.MaxValue; foreach (LevelPoint allLevelPoint in allLevelPoints) { if (TwilightCanConnectLevelPoints(levelPoint, allLevelPoint, currentBestDistance, out var distance)) { val = allLevelPoint; currentBestDistance = distance; } } TwilightAddLevelPointConnection(levelPoint, val); TwilightAddLevelPointConnection(val, levelPoint); } private static bool TwilightCanConnectLevelPoints(LevelPoint source, LevelPoint? candidate, float currentBestDistance, out float distance) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) distance = 0f; if ((Object)(object)source == (Object)null || (Object)(object)candidate == (Object)null || (Object)(object)source == (Object)(object)candidate || !candidate.ModuleConnect) { return false; } Vector3 val = ((Component)source).transform.position - ((Component)candidate).transform.position; if (((Vector3)(ref val)).sqrMagnitude <= Mathf.Epsilon) { return false; } distance = ((Vector3)(ref val)).magnitude; if (distance >= 15f || distance >= currentBestDistance) { return false; } if (Vector3.Dot(((Component)candidate).transform.forward, ((Component)source).transform.forward) > -0.8f) { return false; } return Vector3.Dot(((Component)candidate).transform.forward, ((Vector3)(ref val)).normalized) > 0.8f; } private static void TwilightAddLevelPointConnection(LevelPoint? source, LevelPoint? target) { if (!((Object)(object)source == (Object)null) && !((Object)(object)target == (Object)null)) { if (source.ConnectedPoints == null) { source.ConnectedPoints = new List(); } if (!source.ConnectedPoints.Contains(target)) { source.ConnectedPoints.Add(target); } } } internal GameObject TwilightCreateFallbackDoorMapObject(Map map, DirtFinderMapDoor door) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) MapLayer layerParent = map.GetLayerParent(((Component)door).transform.position.y); GameObject val = TwilightInstantiateFallbackDoorMapObject(map, ((Component)layerParent).transform); ((Object)val).name = ((Object)((Component)door).gameObject).name; door.Target = val.transform; DirtFinderMapDoorTarget val2 = val.GetComponent() ?? val.AddComponent(); val2.Target = ((Component)door).transform; val2.Layer = layerParent; DirtFinderMapDoorTarget val3 = val2; if (val3.HingeTransform == null) { val3.HingeTransform = val.transform; } map.DoorUpdate(val2.HingeTransform, ((Component)door).transform, layerParent); if (!_twilightLoggedDoorMapFallback) { _twilightLoggedDoorMapFallback = true; ((BaseUnityPlugin)this).Logger.LogWarning((object)"Empress Twilight Forest Compat Patch injected fallback minimap door markers for missing Twilight Forest door prefabs."); } return val; } private static GameObject TwilightInstantiateFallbackDoorMapObject(Map map, Transform parent) { //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) GameObject val; if ((Object)(object)map.Door1x1Object != (Object)null) { val = Object.Instantiate(map.Door1x1Object, parent); Collider[] componentsInChildren = val.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { Object.Destroy((Object)(object)componentsInChildren[i]); } } else { val = GameObject.CreatePrimitive((PrimitiveType)3); val.transform.SetParent(parent, false); val.transform.localScale = new Vector3(0.12f, 0.12f, 0.3f); Collider component = val.GetComponent(); if ((Object)(object)component != (Object)null) { Object.Destroy((Object)(object)component); } } val.transform.localPosition = Vector3.zero; val.transform.localRotation = Quaternion.identity; DirtFinderMapDoorTarget val2 = val.GetComponent() ?? val.AddComponent(); if (val2.HingeTransform == null) { val2.HingeTransform = val.transform; } TwilightApplyHideFlags((Object)(object)val); return val; } private static void TwilightApplyHideFlags(Object obj) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) if (obj == (Object)null) { return; } obj.hideFlags = (HideFlags)(obj.hideFlags | 0x23); GameObject val = (GameObject)(object)((obj is GameObject) ? obj : null); if (val == null) { return; } Transform[] componentsInChildren = val.GetComponentsInChildren(true); foreach (Transform obj2 in componentsInChildren) { ((Object)obj2).hideFlags = (HideFlags)(((Object)obj2).hideFlags | 0x23); GameObject gameObject = ((Component)obj2).gameObject; ((Object)gameObject).hideFlags = (HideFlags)(((Object)gameObject).hideFlags | 0x23); Component[] components = ((Component)obj2).GetComponents(); foreach (Component val2 in components) { if ((Object)(object)val2 != (Object)null) { ((Object)val2).hideFlags = (HideFlags)(((Object)val2).hideFlags | 0x23); } } } } } [HarmonyPatch(typeof(LevelPoint), "Start")] internal static class TwilightForestCompatPatchLevelPointStartPatch { [HarmonyPrefix] private static bool TwilightPrefix(LevelPoint __instance) { TwilightForestCompatPatchPlugin instance = TwilightForestCompatPatchPlugin.Instance; if ((Object)(object)instance == (Object)null || !instance.TwilightTryStartSilentLevelPoint(__instance)) { return true; } return false; } } [HarmonyPatch(typeof(LoadingUI), "LevelAnimationStart")] internal static class TwilightForestCompatPatchLoadingUILevelAnimationStartPatch { [HarmonyPostfix] private static void TwilightPostfix(LoadingUI __instance) { TwilightForestCompatPatchPlugin.TwilightApplyLoadingGraphics(__instance); } } [HarmonyPatch(typeof(LevelGenerator), "StartRoomGeneration")] internal static class TwilightForestCompatPatchStartRoomGenerationPatch { [HarmonyPrefix] private static void TwilightPrefix() { TwilightForestCompatPatchPlugin.Instance?.TwilightTryRepairCurrentLevel(); } } [HarmonyPatch(typeof(StartRoom), "Start")] internal static class TwilightForestCompatPatchStartRoomStartPatch { [HarmonyPostfix] private static void TwilightPostfix(StartRoom __instance) { TwilightForestCompatPatchPlugin.TwilightActivateVehicleChargingStation(__instance); } } [HarmonyPatch(typeof(ExtractionPoint), "Start")] internal static class TwilightForestCompatPatchExtractionPointStartPatch { [HarmonyPostfix] private static void TwilightPostfix(ExtractionPoint __instance) { TwilightForestCompatPatchPlugin.TwilightEnsureExtractionPointCompatibility(__instance); } } [HarmonyPatch(typeof(ChargingStation), "Start")] internal static class TwilightForestCompatPatchChargingStationStartPatch { [HarmonyPrefix] private static void TwilightPrefix(ChargingStation __instance) { if (TwilightForestCompatPatchPlugin.TwilightIsCurrentLevel()) { TwilightForestCompatPatchPlugin.TwilightEnsureChargingStationCompatibility(__instance); } } } [HarmonyPatch(typeof(Levels), "RegisterLevelWithGame")] internal static class TwilightForestCompatPatchRegisterLevelPatch { [HarmonyPrefix] private static void TwilightPrefix(Level level) { TwilightForestCompatPatchPlugin.TwilightEnsureLevelFallbackData(level); } } [HarmonyPatch(typeof(Map), "AddDoor")] internal static class TwilightForestCompatPatchMapAddDoorPatch { [HarmonyPrefix] private static bool TwilightPrefix(Map __instance, DirtFinderMapDoor door, GameObject doorPrefab, ref GameObject __result) { if (!TwilightForestCompatPatchPlugin.TwilightIsCurrentLevel() || (Object)(object)door == (Object)null || (Object)(object)doorPrefab != (Object)null) { return true; } TwilightForestCompatPatchPlugin instance = TwilightForestCompatPatchPlugin.Instance; if ((Object)(object)instance == (Object)null) { return true; } __result = instance.TwilightCreateFallbackDoorMapObject(__instance, door); return false; } } [HarmonyPatch(typeof(LevelGenerator), "NavMeshSetupRPC")] internal static class TwilightForestCompatPatchNavMeshSetupPatch { [HarmonyPostfix] private static void TwilightPostfix(LevelGenerator __instance) { TwilightForestCompatPatchPlugin.Instance?.TwilightRepairLevelPoints(__instance); } } [HarmonyPatch(typeof(LevelPoint), "NavMeshCheck")] internal static class TwilightForestCompatPatchLevelPointNavMeshCheckPatch { [HarmonyPrefix] private static bool TwilightPrefix(LevelPoint __instance, ref IEnumerator __result) { if (!TwilightForestCompatPatchPlugin.TwilightIsCurrentLevel()) { return true; } TwilightForestCompatPatchPlugin instance = TwilightForestCompatPatchPlugin.Instance; if ((Object)(object)instance == (Object)null) { return true; } __result = instance.TwilightSilentLevelPointCheck(__instance); return false; } } [HarmonyPatch] internal static class TwilightForestCompatPatchUnityLogPatch { private static IEnumerable TargetMethods() { Type type = AccessTools.TypeByName("UnityEngine.DebugLogHandler"); if (!(type == null)) { return from method in AccessTools.GetDeclaredMethods(type) where method.Name == "LogFormat" select method; } return Enumerable.Empty(); } [HarmonyPrefix] private static bool TwilightPrefix(LogType logType, string format, object[] args) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) return !TwilightForestCompatPatchPlugin.TwilightShouldSuppressUnityLog(logType, format, args); } } }