Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of Echohold Station Fix v1.3.0
EchoholdCompatPatch.dll
Decompiled 2 weeks agousing 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 BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using REPOLib; using REPOLib.Modules; using UnityEngine; using UnityEngine.AI; using UnityEngine.Audio; using UnityEngine.SceneManagement; [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.5.0")] [assembly: AssemblyInformationalVersion("1.0.5")] [assembly: AssemblyProduct("EchoholdCompatPatch")] [assembly: AssemblyTitle("EchoholdCompatPatch")] [assembly: AssemblyVersion("1.0.5.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 EchoholdCompatPatch { [BepInPlugin("empress.repo.echoholdcompatpatch", "Empress Echohold Compat Patch", "1.0.5")] [BepInDependency(/*Could not decode attribute arguments.*/)] public sealed class EchoholdCompatPatchPlugin : BaseUnityPlugin { private sealed class EchoholdPrefabBuckets { public List<GameObject> StartRooms { get; set; } = new List<GameObject>(); public List<GameObject> Normal1 { get; set; } = new List<GameObject>(); public List<GameObject> Passage1 { get; set; } = new List<GameObject>(); public List<GameObject> DeadEnd1 { get; set; } = new List<GameObject>(); public List<GameObject> Extraction1 { get; set; } = new List<GameObject>(); public List<GameObject> Normal2 { get; set; } = new List<GameObject>(); public List<GameObject> Passage2 { get; set; } = new List<GameObject>(); public List<GameObject> DeadEnd2 { get; set; } = new List<GameObject>(); public List<GameObject> Extraction2 { get; set; } = new List<GameObject>(); public List<GameObject> Normal3 { get; set; } = new List<GameObject>(); public List<GameObject> Passage3 { get; set; } = new List<GameObject>(); public List<GameObject> DeadEnd3 { get; set; } = new List<GameObject>(); public List<GameObject> Extraction3 { get; set; } = new List<GameObject>(); 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; } internal const string PluginGuid = "empress.repo.echoholdcompatpatch"; internal const string PluginName = "Empress Echohold Compat Patch"; internal const string PluginVersion = "1.0.5"; private const string EchoholdBundleFileName = "Echohold.repobundle"; private const string EchoholdLevelName = "Level - Echohold"; private const string EchoholdLevelResourcePath = "Echohold"; private const float EchoholdLevelPointCheckRadius = 0.5f; private const float EchoholdLevelPointRepairRadius = 2f; private const float EchoholdLevelPointConnectDistance = 15f; private const float EchoholdLevelPointConnectForwardDot = -0.8f; private const float EchoholdLevelPointConnectApproachDot = 0.8f; private const float EchoholdLevelPointValidationDelay = 0.5f; private static readonly string[] EchoholdStartRoomNames = new string[1] { "Start Room - Echohold - Lab" }; private static readonly string[] EchoholdNormal1Names = new string[5] { "Module - Echohold - N - 1 - Corridor 2", "Module - Echohold - N - 1 - Main Corridor", "Module - Echohold - N - 1 - Server Room", "Module - Echohold - N - 1 - Zero Gravity Lab", "Module - Echohold - N - 1 - Corridor 3" }; private static readonly string[] EchoholdPassage1Names = new string[4] { "Module - Echohold - P - 1 - Cafeteria", "Module - Echohold - P - 1 - Control Room", "Module - Echohold - P - 1 - Engine Room", "Module - Echohold - P - 1 - Science Lab" }; private static readonly string[] EchoholdDeadEnd1Names = new string[5] { "Module - Echohold - DE - 1 - Crew Quarters", "Module - Echohold - DE - 1 - Crew Quarters 2", "Module - Echohold - DE - 1 - Lab Testing", "Module - Echohold - DE - 1 - Medical Room", "Module - Echohold - DE - 1 - Storage Room" }; private static readonly string[] EchoholdExtraction1Names = new string[1] { "Module - Echohold - E - 1 - Lab" }; private readonly Harmony _echoholdHarmony = new Harmony("empress.repo.echoholdcompatpatch"); private AssetBundle? _echoholdBundle; private bool _echoholdRepairApplied; private bool _echoholdRepairQueued; private bool _echoholdLoggedMissingBundle; private bool _echoholdLoggedMissingPrefabs; private bool _echoholdLoggedDoorMapFallback; internal static EchoholdCompatPatchPlugin? 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 += EchoholdHandleBundlesLoaded; _echoholdHarmony.PatchAll(); EchoholdPatchUnityWarningFilter(); if ((Object)(object)RunManager.instance != (Object)null) { ((MonoBehaviour)this).StartCoroutine(EchoholdRepairWhenReady()); } } private void OnDestroy() { BundleLoader.OnAllBundlesLoaded -= EchoholdHandleBundlesLoaded; _echoholdHarmony.UnpatchSelf(); if (Instance == this) { Instance = null; } } private void EchoholdHandleBundlesLoaded() { if (!_echoholdRepairQueued && !_echoholdRepairApplied) { _echoholdRepairQueued = true; ((MonoBehaviour)this).StartCoroutine(EchoholdRepairWhenReady()); } } private void EchoholdPatchUnityWarningFilter() { //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Expected O, but got Unknown //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Expected O, but got Unknown Type type = AccessTools.TypeByName("UnityEngine.DebugLogHandler"); if (!(type == null)) { MethodInfo methodInfo = AccessTools.Method(type, "LogFormat", new Type[4] { typeof(LogType), typeof(Object), typeof(string), typeof(object[]) }, (Type[])null); if (methodInfo != null) { _echoholdHarmony.Patch((MethodBase)methodInfo, new HarmonyMethod(typeof(EchoholdCompatPatchPlugin), "EchoholdSuppressMissingScriptWarningPrefix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } MethodInfo methodInfo2 = AccessTools.Method(type, "LogFormat", new Type[5] { typeof(LogType), typeof(LogOption), typeof(Object), typeof(string), typeof(object[]) }, (Type[])null); if (methodInfo2 != null) { _echoholdHarmony.Patch((MethodBase)methodInfo2, new HarmonyMethod(typeof(EchoholdCompatPatchPlugin), "EchoholdSuppressMissingScriptWarningPrefix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } } private IEnumerator EchoholdRepairWhenReady() { yield return null; for (int attempt = 0; attempt < 120; attempt++) { if (_echoholdRepairApplied) { break; } if (EchoholdTryRepairLevel()) { break; } yield return null; } _echoholdRepairQueued = false; } internal bool EchoholdTryRepairCurrentLevel() { List<Level> list = new List<Level>(); 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 EchoholdTryRepairLevel(list); } private bool EchoholdTryRepairLevel(IEnumerable<Level>? candidates = null) { if (_echoholdRepairApplied) { return true; } Level val = EchoholdFindLevel(candidates) ?? EchoholdFindLevel(Levels.AllLevels); if ((Object)(object)val == (Object)null) { return false; } AssetBundle val2 = EchoholdGetBundle(); if ((Object)(object)val2 == (Object)null) { if (!_echoholdLoggedMissingBundle) { _echoholdLoggedMissingBundle = true; ((BaseUnityPlugin)this).Logger.LogWarning((object)"Empress Echohold Compat Patch could not locate the Echohold bundle."); } return false; } _echoholdLoggedMissingBundle = false; EchoholdPrefabBuckets echoholdPrefabBuckets = EchoholdCollectPrefabs(val2); if (echoholdPrefabBuckets.StartRooms.Count == 0 || echoholdPrefabBuckets.TotalModuleCount == 0) { if (!_echoholdLoggedMissingPrefabs) { _echoholdLoggedMissingPrefabs = true; ((BaseUnityPlugin)this).Logger.LogError((object)"Empress Echohold Compat Patch could not rebuild the Echohold prefab lists from the original bundle."); } return false; } _echoholdLoggedMissingPrefabs = false; EchoholdApplyHideFlags((Object)(object)val2); EchoholdApplyHideFlags((Object)(object)val); EchoholdEnsureLevelFallbackData(val); EchoholdRegisterLevelObjects(val); val.StartRooms = EchoholdRegisterPrefabs(val, "StartRoom", echoholdPrefabBuckets.StartRooms); val.ModulesNormal1 = EchoholdRegisterPrefabs(val, "Normal", echoholdPrefabBuckets.Normal1); val.ModulesPassage1 = EchoholdRegisterPrefabs(val, "Passage", echoholdPrefabBuckets.Passage1); val.ModulesDeadEnd1 = EchoholdRegisterPrefabs(val, "DeadEnd", echoholdPrefabBuckets.DeadEnd1); val.ModulesExtraction1 = EchoholdRegisterPrefabs(val, "Extraction", echoholdPrefabBuckets.Extraction1); val.ModulesNormal2 = EchoholdRegisterPrefabs(val, "Normal", echoholdPrefabBuckets.Normal2); val.ModulesPassage2 = EchoholdRegisterPrefabs(val, "Passage", echoholdPrefabBuckets.Passage2); val.ModulesDeadEnd2 = EchoholdRegisterPrefabs(val, "DeadEnd", echoholdPrefabBuckets.DeadEnd2); val.ModulesExtraction2 = EchoholdRegisterPrefabs(val, "Extraction", echoholdPrefabBuckets.Extraction2); val.ModulesNormal3 = EchoholdRegisterPrefabs(val, "Normal", echoholdPrefabBuckets.Normal3); val.ModulesPassage3 = EchoholdRegisterPrefabs(val, "Passage", echoholdPrefabBuckets.Passage3); val.ModulesDeadEnd3 = EchoholdRegisterPrefabs(val, "DeadEnd", echoholdPrefabBuckets.DeadEnd3); val.ModulesExtraction3 = EchoholdRegisterPrefabs(val, "Extraction", echoholdPrefabBuckets.Extraction3); _echoholdRepairApplied = val.StartRooms.Count > 0 && EchoholdCountModules(val) > 0; if (_echoholdRepairApplied) { ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Empress Echohold Compat Patch repaired {((Object)val).name} with {val.StartRooms.Count} start rooms and {EchoholdCountModules(val)} modules."); } return _echoholdRepairApplied; } private static Level? EchoholdFindLevel(IEnumerable<Level>? candidates) { if (candidates == null) { return null; } foreach (Level candidate in candidates) { if (EchoholdIsEchoholdLevel(candidate)) { return candidate; } } return null; } private AssetBundle? EchoholdGetBundle() { if ((Object)(object)_echoholdBundle != (Object)null) { return _echoholdBundle; } foreach (AssetBundle allLoadedAssetBundle in AssetBundle.GetAllLoadedAssetBundles()) { if (EchoholdBundleMatches(allLoadedAssetBundle)) { _echoholdBundle = allLoadedAssetBundle; return _echoholdBundle; } } string text = Directory.GetFiles(Paths.PluginPath, "Echohold.repobundle", SearchOption.AllDirectories).FirstOrDefault(); if (string.IsNullOrWhiteSpace(text)) { return null; } _echoholdBundle = AssetBundle.LoadFromFile(text); if ((Object)(object)_echoholdBundle != (Object)null) { return _echoholdBundle; } foreach (AssetBundle allLoadedAssetBundle2 in AssetBundle.GetAllLoadedAssetBundles()) { if (EchoholdBundleMatches(allLoadedAssetBundle2)) { _echoholdBundle = allLoadedAssetBundle2; return _echoholdBundle; } } return _echoholdBundle; } private static bool EchoholdBundleMatches(AssetBundle? bundle) { if ((Object)(object)bundle == (Object)null) { return false; } try { if (!string.IsNullOrWhiteSpace(((Object)bundle).name) && ((Object)bundle).name.IndexOf("echohold", StringComparison.OrdinalIgnoreCase) >= 0) { return true; } } catch { } try { if (bundle.GetAllAssetNames().Any((string assetName) => assetName.IndexOf("echohold", StringComparison.OrdinalIgnoreCase) >= 0 || assetName.EndsWith("level - echohold.asset", StringComparison.OrdinalIgnoreCase))) { return true; } } catch { } try { Level[] array = bundle.LoadAllAssets<Level>(); for (int i = 0; i < array.Length; i++) { if (EchoholdIsEchoholdLevel(array[i])) { return true; } } } catch { } try { GameObject[] array2 = bundle.LoadAllAssets<GameObject>(); foreach (GameObject val in array2) { if (!((Object)(object)val == (Object)null) && (((Object)val).name.StartsWith("Start Room - Echohold -", StringComparison.OrdinalIgnoreCase) || ((Object)val).name.StartsWith("Module - Echohold -", StringComparison.OrdinalIgnoreCase))) { return true; } } } catch { } return false; } private static EchoholdPrefabBuckets EchoholdCollectPrefabs(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<string, GameObject> dictionary = new Dictionary<string, GameObject>(StringComparer.OrdinalIgnoreCase); StartRoom[] array = bundle.LoadAllAssets<StartRoom>(); foreach (StartRoom val in array) { EchoholdAddAssetByName(dictionary, ((Object)(object)val != (Object)null) ? ((Component)val).gameObject : null); } Module[] array2 = bundle.LoadAllAssets<Module>(); foreach (Module val2 in array2) { EchoholdAddAssetByName(dictionary, ((Object)(object)val2 != (Object)null) ? ((Component)val2).gameObject : null); } GameObject[] array3 = bundle.LoadAllAssets<GameObject>(); foreach (GameObject prefab in array3) { EchoholdAddAssetByName(dictionary, prefab); } if (!dictionary.Keys.Any((string name) => name.StartsWith("Start Room - Echohold -", StringComparison.OrdinalIgnoreCase)) || !dictionary.Keys.Any((string name) => name.StartsWith("Module - Echohold -", StringComparison.OrdinalIgnoreCase))) { array = Resources.FindObjectsOfTypeAll<StartRoom>(); Scene scene; foreach (StartRoom val3 in array) { if (!((Object)(object)val3 == (Object)null)) { scene = ((Component)val3).gameObject.scene; if (!((Scene)(ref scene)).IsValid()) { EchoholdAddAssetByName(dictionary, ((Component)val3).gameObject); } } } array2 = Resources.FindObjectsOfTypeAll<Module>(); foreach (Module val4 in array2) { if (!((Object)(object)val4 == (Object)null)) { scene = ((Component)val4).gameObject.scene; if (!((Scene)(ref scene)).IsValid()) { EchoholdAddAssetByName(dictionary, ((Component)val4).gameObject); } } } array3 = Resources.FindObjectsOfTypeAll<GameObject>(); foreach (GameObject val5 in array3) { if (!((Object)(object)val5 == (Object)null)) { scene = val5.scene; if (!((Scene)(ref scene)).IsValid()) { EchoholdAddAssetByName(dictionary, val5); } } } } return new EchoholdPrefabBuckets { StartRooms = EchoholdResolvePrefabs(dictionary, EchoholdStartRoomNames), Normal1 = EchoholdResolvePrefabs(dictionary, EchoholdNormal1Names), Passage1 = EchoholdResolvePrefabs(dictionary, EchoholdPassage1Names), DeadEnd1 = EchoholdResolvePrefabs(dictionary, EchoholdDeadEnd1Names), Extraction1 = EchoholdResolvePrefabs(dictionary, EchoholdExtraction1Names), Normal2 = new List<GameObject>(), Passage2 = new List<GameObject>(), DeadEnd2 = new List<GameObject>(), Extraction2 = new List<GameObject>(), Normal3 = new List<GameObject>(), Passage3 = new List<GameObject>(), DeadEnd3 = new List<GameObject>(), Extraction3 = new List<GameObject>() }; } private static void EchoholdAddAssetByName(IDictionary<string, GameObject> 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<GameObject> EchoholdResolvePrefabs(IReadOnlyDictionary<string, GameObject> prefabsByName, IEnumerable<string> names) { List<GameObject> list = new List<GameObject>(); foreach (string name in names) { if (prefabsByName.TryGetValue(name, out GameObject value)) { list.Add(value); } } return list; } private static void EchoholdRegisterLevelObjects(Level level) { if ((Object)(object)level.ConnectObject != (Object)null) { EchoholdRegisterNetworkPrefab("Level/" + (level.ResourcePath ?? "Echohold") + "/Other/" + ((Object)level.ConnectObject).name, level.ConnectObject); } if ((Object)(object)level.BlockObject != (Object)null) { EchoholdRegisterNetworkPrefab("Level/" + (level.ResourcePath ?? "Echohold") + "/Other/" + ((Object)level.BlockObject).name, level.BlockObject); } } private static List<PrefabRef> EchoholdRegisterPrefabs(Level level, string moduleTypeName, IEnumerable<GameObject> prefabs) { List<PrefabRef> list = new List<PrefabRef>(); foreach (GameObject item in prefabs.OrderBy<GameObject, string>((GameObject gameObject) => ((Object)gameObject).name, StringComparer.OrdinalIgnoreCase)) { PrefabRef val = EchoholdRegisterNetworkPrefab("Level/" + ((Object)level).name + "/" + moduleTypeName + "/" + ((Object)item).name, item); if (val != null) { list.Add(val); } } return list; } private static PrefabRef? EchoholdRegisterNetworkPrefab(string prefabId, GameObject prefab) { PrefabRef val = EchoholdGetRegisteredPrefabRef(prefabId, prefab); if (val != null) { return val; } EchoholdPreparePrefab(prefab); Utilities.FixAudioMixerGroups(prefab); return NetworkPrefabs.RegisterNetworkPrefab(prefabId, prefab); } private static PrefabRef? EchoholdGetRegisteredPrefabRef(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 EchoholdPreparePrefab(GameObject prefab) { EchoholdApplyHideFlags((Object)(object)prefab); EchoholdAssignFallbackAudioMixerGroups(prefab); EchoholdAssignFallbackPhysAttributes(prefab); } private static void EchoholdAssignFallbackAudioMixerGroups(GameObject prefab) { AudioMixerGroup val = EchoholdGetFallbackAudioMixerGroup(); if ((Object)(object)prefab == (Object)null || (Object)(object)val == (Object)null) { return; } AudioSource[] componentsInChildren = prefab.GetComponentsInChildren<AudioSource>(true); foreach (AudioSource val2 in componentsInChildren) { if (!((Object)(object)val2 == (Object)null) && !((Object)(object)val2.outputAudioMixerGroup != (Object)null)) { val2.outputAudioMixerGroup = val; } } } private static AudioMixerGroup? EchoholdGetFallbackAudioMixerGroup() { 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 void EchoholdAssignFallbackPhysAttributes(GameObject prefab) { if ((Object)(object)prefab == (Object)null) { return; } NotValuableObject[] componentsInChildren = prefab.GetComponentsInChildren<NotValuableObject>(true); foreach (NotValuableObject val in componentsInChildren) { if (!((Object)(object)val == (Object)null) && !((Object)(object)val.physAttributePreset != (Object)null)) { Rigidbody component = ((Component)val).GetComponent<Rigidbody>(); float mass = (((Object)(object)component != (Object)null && component.mass > 0f) ? component.mass : 1f); val.physAttributePreset = EchoholdCreateFallbackPhysAttribute(mass); } } } private static PhysAttribute EchoholdCreateFallbackPhysAttribute(float mass) { PhysAttribute obj = ScriptableObject.CreateInstance<PhysAttribute>(); obj.mass = Mathf.Max(0.01f, mass); EchoholdApplyHideFlags((Object)(object)obj); return obj; } private static int EchoholdCountModules(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 EchoholdIsCurrentLevel() { if (!EchoholdIsEchoholdLevel(((Object)(object)LevelGenerator.Instance != (Object)null) ? LevelGenerator.Instance.Level : null)) { return EchoholdIsEchoholdLevel(((Object)(object)RunManager.instance != (Object)null) ? RunManager.instance.levelCurrent : null); } return true; } internal static bool EchoholdShouldSuppressMissingScriptWarning(LogType logType, string? format, object[]? args) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 if ((int)logType != 2 || !EchoholdIsCurrentLevel()) { return false; } if (EchoholdIsMissingScriptWarning(format)) { return true; } if (args == null || args.Length == 0 || string.IsNullOrWhiteSpace(format)) { return false; } try { return EchoholdIsMissingScriptWarning(string.Format(format, args)); } catch { return false; } } internal static bool EchoholdShouldSuppressMissingScriptWarning(LogEventArgs? eventArgs) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Invalid comparison between Unknown and I4 if (eventArgs == null || (int)eventArgs.Level != 4 || !EchoholdIsCurrentLevel()) { return false; } if (!EchoholdIsUnityLogSource(eventArgs.Source)) { return false; } if (eventArgs.Data is string message) { return EchoholdIsMissingScriptWarning(message); } return EchoholdIsMissingScriptWarning(eventArgs.Data?.ToString()); } private static bool EchoholdIsUnityLogSource(ILogSource? source) { if (source != null) { return string.Equals(source.SourceName, "Unity Log", StringComparison.OrdinalIgnoreCase); } return false; } private static bool EchoholdIsMissingScriptWarning(string? message) { if (string.IsNullOrWhiteSpace(message)) { return false; } if (message.IndexOf("The referenced script", StringComparison.Ordinal) >= 0) { return message.IndexOf("missing", StringComparison.OrdinalIgnoreCase) >= 0; } return false; } private static bool EchoholdSuppressMissingScriptWarningPrefix(LogType logType, string format, object[] args) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) return !EchoholdShouldSuppressMissingScriptWarning(logType, format, args); } private static bool EchoholdIsEchoholdLevel(Level? level) { if ((Object)(object)level == (Object)null) { return false; } if (!string.Equals(((Object)level).name, "Level - Echohold", StringComparison.OrdinalIgnoreCase)) { return string.Equals(level.ResourcePath, "Echohold", StringComparison.OrdinalIgnoreCase); } return true; } internal static void EchoholdEnsureLevelFallbackData(Level? level) { if (EchoholdIsEchoholdLevel(level)) { Level val = level; if (val.ValuablePresets == null) { val.ValuablePresets = new List<LevelValuables>(); } val = level; if (val.AmbiencePresets == null) { val.AmbiencePresets = new List<LevelAmbience>(); } if (level.ValuablePresets.Count == 0 && (Object)(object)ValuablePresets.GenericValuablePreset != (Object)null) { level.ValuablePresets.Add(ValuablePresets.GenericValuablePreset); } if (level.AmbiencePresets.Count == 0 && EchoholdTryGetFallbackAmbience(out LevelAmbience ambience)) { level.AmbiencePresets.Add(ambience); } } } private static bool EchoholdTryGetFallbackAmbience(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 void EchoholdEnsureExtractionPointCompatibility(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 || !EchoholdIsCurrentLevel()) { return; } if ((Object)(object)extractionPoint.extractionArea == (Object)null) { GameObject val = GameObject.CreatePrimitive((PrimitiveType)2); ((Object)val).name = "Echohold 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<MeshRenderer>(); if ((Object)(object)component != (Object)null) { ((Renderer)component).enabled = false; } Collider component2 = val.GetComponent<Collider>(); if ((Object)(object)component2 != (Object)null) { Object.Destroy((Object)(object)component2); } val.SetActive(false); EchoholdApplyHideFlags((Object)(object)val); extractionPoint.extractionArea = val; } if ((Object)(object)extractionPoint.grossUp == (Object)null) { GameObject val2 = new GameObject("Echohold Patch GrossUp"); val2.transform.SetParent(((Component)extractionPoint).transform, false); val2.SetActive(false); EchoholdApplyHideFlags((Object)(object)val2); extractionPoint.grossUp = val2; } } internal void EchoholdRepairLevelPoints(LevelGenerator levelGenerator) { if ((Object)(object)levelGenerator == (Object)null || !EchoholdIsEchoholdLevel(levelGenerator.Level) || levelGenerator.LevelPathPoints == null) { return; } int num = 0; int num2 = 0; foreach (LevelPoint levelPathPoint in levelGenerator.LevelPathPoints) { if (EchoholdRepairLevelPoint(levelPathPoint)) { num++; } if (EchoholdRepairLevelPointRoom(levelPathPoint)) { num2++; } } if (num > 0 || num2 > 0) { ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Empress Echohold Compat Patch repaired {num} Echohold level points onto the navmesh and restored {num2} room links."); } } private static bool EchoholdRepairLevelPoint(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; EchoholdRepairLevelPointRoom(levelPoint); return true; } private static bool EchoholdRepairLevelPointRoom(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 EchoholdSilentLevelPointCheck(LevelPoint levelPoint) { if (!((Object)(object)levelPoint == (Object)null)) { 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 (EchoholdIsCurrentLevel()) { EchoholdRepairLevelPoint(levelPoint); EchoholdRepairLevelPointRoom(levelPoint); EchoholdRepairLevelPointConnections(levelPoint, LevelGenerator.Instance?.LevelPathPoints); } } } private static void EchoholdRepairLevelPointConnections(LevelPoint? levelPoint, IList<LevelPoint>? allLevelPoints) { if ((Object)(object)levelPoint == (Object)null) { return; } if (levelPoint.ConnectedPoints == null) { levelPoint.ConnectedPoints = new List<LevelPoint>(); } levelPoint.ConnectedPoints.RemoveAll((LevelPoint connectedPoint) => (Object)(object)connectedPoint == (Object)null); LevelPoint[] array = levelPoint.ConnectedPoints.ToArray(); for (int i = 0; i < array.Length; i++) { EchoholdAddLevelPointConnection(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 (EchoholdCanConnectLevelPoints(levelPoint, allLevelPoint, currentBestDistance, out var distance)) { val = allLevelPoint; currentBestDistance = distance; } } EchoholdAddLevelPointConnection(levelPoint, val); EchoholdAddLevelPointConnection(val, levelPoint); } private static bool EchoholdCanConnectLevelPoints(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 EchoholdAddLevelPointConnection(LevelPoint? source, LevelPoint? target) { if (!((Object)(object)source == (Object)null) && !((Object)(object)target == (Object)null)) { if (source.ConnectedPoints == null) { source.ConnectedPoints = new List<LevelPoint>(); } if (!source.ConnectedPoints.Contains(target)) { source.ConnectedPoints.Add(target); } } } internal GameObject EchoholdCreateFallbackDoorMapObject(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 = EchoholdInstantiateFallbackDoorMapObject(map, ((Component)layerParent).transform); ((Object)val).name = ((Object)((Component)door).gameObject).name; door.Target = val.transform; DirtFinderMapDoorTarget val2 = val.GetComponent<DirtFinderMapDoorTarget>() ?? val.AddComponent<DirtFinderMapDoorTarget>(); 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 (!_echoholdLoggedDoorMapFallback) { _echoholdLoggedDoorMapFallback = true; ((BaseUnityPlugin)this).Logger.LogWarning((object)"Empress Echohold Compat Patch injected fallback minimap door markers for missing Echohold door prefabs."); } return val; } private static GameObject EchoholdInstantiateFallbackDoorMapObject(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<GameObject>(map.Door1x1Object, parent); Collider[] componentsInChildren = val.GetComponentsInChildren<Collider>(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<Collider>(); 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<DirtFinderMapDoorTarget>() ?? val.AddComponent<DirtFinderMapDoorTarget>(); if (val2.HingeTransform == null) { val2.HingeTransform = val.transform; } EchoholdApplyHideFlags((Object)(object)val); return val; } private static void EchoholdApplyHideFlags(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<Transform>(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<Component>(); foreach (Component val2 in components) { if ((Object)(object)val2 != (Object)null) { ((Object)val2).hideFlags = (HideFlags)(((Object)val2).hideFlags | 0x23); } } } } } [HarmonyPatch(typeof(LevelGenerator), "StartRoomGeneration")] internal static class EchoholdCompatPatchStartRoomGenerationPatch { [HarmonyPrefix] private static void EchoholdPrefix() { EchoholdCompatPatchPlugin.Instance?.EchoholdTryRepairCurrentLevel(); } } [HarmonyPatch(typeof(ExtractionPoint), "Start")] internal static class EchoholdCompatPatchExtractionPointStartPatch { [HarmonyPostfix] private static void EchoholdPostfix(ExtractionPoint __instance) { EchoholdCompatPatchPlugin.EchoholdEnsureExtractionPointCompatibility(__instance); } } [HarmonyPatch(typeof(Levels), "RegisterLevelWithGame")] internal static class EchoholdCompatPatchRegisterLevelPatch { [HarmonyPrefix] private static void EchoholdPrefix(Level level) { EchoholdCompatPatchPlugin.EchoholdEnsureLevelFallbackData(level); } } [HarmonyPatch(typeof(Map), "AddDoor")] internal static class EchoholdCompatPatchMapAddDoorPatch { [HarmonyPrefix] private static bool EchoholdPrefix(Map __instance, DirtFinderMapDoor door, GameObject doorPrefab, ref GameObject __result) { if (!EchoholdCompatPatchPlugin.EchoholdIsCurrentLevel() || (Object)(object)door == (Object)null || (Object)(object)doorPrefab != (Object)null) { return true; } EchoholdCompatPatchPlugin instance = EchoholdCompatPatchPlugin.Instance; if ((Object)(object)instance == (Object)null) { return true; } __result = instance.EchoholdCreateFallbackDoorMapObject(__instance, door); return false; } } [HarmonyPatch(typeof(LevelGenerator), "NavMeshSetupRPC")] internal static class EchoholdCompatPatchNavMeshSetupPatch { [HarmonyPostfix] private static void EchoholdPostfix(LevelGenerator __instance) { EchoholdCompatPatchPlugin.Instance?.EchoholdRepairLevelPoints(__instance); } } [HarmonyPatch(typeof(LevelPoint), "NavMeshCheck")] internal static class EchoholdCompatPatchLevelPointNavMeshCheckPatch { [HarmonyPrefix] private static bool EchoholdPrefix(LevelPoint __instance, ref IEnumerator __result) { if (!EchoholdCompatPatchPlugin.EchoholdIsCurrentLevel()) { return true; } EchoholdCompatPatchPlugin instance = EchoholdCompatPatchPlugin.Instance; if ((Object)(object)instance == (Object)null) { return true; } __result = instance.EchoholdSilentLevelPointCheck(__instance); return false; } } [HarmonyPatch(typeof(UnityLogListener), "LogEvent")] internal static class EchoholdCompatPatchUnityLogListenerPatch { [HarmonyPrefix] private static bool EchoholdPrefix(LogEventArgs eventArgs) { return !EchoholdCompatPatchPlugin.EchoholdShouldSuppressMissingScriptWarning(eventArgs); } } [HarmonyPatch(typeof(UnityLogSource), "UnityLogMessageHandler")] internal static class EchoholdCompatPatchUnityLogSourcePatch { [HarmonyPrefix] private static bool EchoholdPrefix(LogEventArgs eventArgs) { return !EchoholdCompatPatchPlugin.EchoholdShouldSuppressMissingScriptWarning(eventArgs); } } [HarmonyPatch(typeof(Logger), "InternalLogEvent")] internal static class EchoholdCompatPatchInternalLogEventPatch { [HarmonyPrefix] private static bool EchoholdPrefix(LogEventArgs eventArgs) { return !EchoholdCompatPatchPlugin.EchoholdShouldSuppressMissingScriptWarning(eventArgs); } } }
EmpressPlasmaRifleWeaponCompatPatch.dll
Decompiled 2 weeks agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using Photon.Pun; using REPOLib.Modules; using REPOLib.Objects.Sdk; using UnityEngine; 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.12.0")] [assembly: AssemblyInformationalVersion("1.0.12")] [assembly: AssemblyProduct("EmpressPlasmaRifleWeaponCompatPatch")] [assembly: AssemblyTitle("EmpressPlasmaRifleWeaponCompatPatch")] [assembly: AssemblyVersion("1.0.12.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 EmpressPlasmaRifleWeaponCompatPatch { [BepInPlugin("Empress.Plasma_Rifle.WeaponCompatPatch", "Empress Plasma Rifle Weapon Compat Patch", "1.0.12")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public sealed class EmpressPlasmaRifleWeaponCompatPatchPlugin : BaseUnityPlugin { internal const string PluginGuid = "Empress.Plasma_Rifle.WeaponCompatPatch"; internal const string PluginName = "Empress Plasma Rifle Weapon Compat Patch"; internal const string PluginVersion = "1.0.12"; private const string CompatShootBulletRpcName = "EmpressCompatShootBulletRPC"; private static readonly string[] TargetTokens = new string[19] { "Plasma Rifle", "Energy Crystal", "Plasma Shotgun", "Plasma Pistol", "Plasma Railgun", "Item Gun PlasmaRifle", "Item Power Crystal", "Item Gun PlasmaShotgun", "Item Gun PlasmaPistol", "Item Gun PlasmaRailgun", "Valuable - EH - Sweepo", "REPOLib - Item - Plasma Pistol", "Valuable - EH - Energy Capsule", "REPOLib - Item - Plasma Railgun", "Valuable - EH - Alien Canister", "Valuable - EH - Nuke", "REPOLib - Item - Plasma Rifle", "Valuable - EH - Plant Container", "REPOLib - Item - Plasma Shotgun" }; private static EmpressPlasmaRifleWeaponCompatPatchPlugin? Instance; private static readonly Dictionary<string, MemberInfo?> MemberCache = new Dictionary<string, MemberInfo>(StringComparer.Ordinal); private readonly Harmony _harmony = new Harmony("Empress.Plasma_Rifle.WeaponCompatPatch"); private readonly HashSet<int> _loggedBatterySkips = new HashSet<int>(); private readonly HashSet<int> _preparedRootIds = new HashSet<int>(); private readonly HashSet<int> _preparedGunIds = new HashSet<int>(); private readonly HashSet<int> _preparedBatteryIds = new HashSet<int>(); private readonly Dictionary<int, bool> _targetRootCache = new Dictionary<int, bool>(); private bool _customPlasmaGunCompatibilityPatched; private float _customPlasmaGunCompatibilityRetryTimer; private void Awake() { Instance = this; _harmony.PatchAll(); _customPlasmaGunCompatibilityPatched = PatchCustomPlasmaGunCompatibility(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Empress Plasma Rifle Weapon Compat Patch is ready for Plasma Rifle."); } private void Update() { if (!_customPlasmaGunCompatibilityPatched) { _customPlasmaGunCompatibilityRetryTimer -= Time.unscaledDeltaTime; if (!(_customPlasmaGunCompatibilityRetryTimer > 0f)) { _customPlasmaGunCompatibilityRetryTimer = 1f; _customPlasmaGunCompatibilityPatched = PatchCustomPlasmaGunCompatibility(); } } } private void OnDestroy() { _harmony.UnpatchSelf(); if (Instance == this) { Instance = null; } } internal static void PrepareRegisteredItem(ItemContent? itemContent) { if (!((Object)(object)itemContent == (Object)null)) { Instance?.PrepareItemAttributes(itemContent.Prefab); } } internal static void PrepareRegisteredItem(ItemAttributes? itemAttributes) { Instance?.PrepareItemAttributes(itemAttributes); } internal static void PrepareBattery(ItemBattery? itemBattery) { Instance?.PrepareBatteryInternal(itemBattery); } internal static void FinishBatteryStart(ItemBattery? itemBattery) { Instance?.FinishBatteryStartInternal(itemBattery); } internal static void SyncBattery(ItemBattery? itemBattery) { Instance?.SyncBatteryStateInternal(itemBattery, forceVisualUpdate: true); } internal static bool CanRunBatteryUpdate(ItemBattery? itemBattery) { if (!((Object)(object)Instance == (Object)null)) { return Instance.CanRunBatteryUpdateInternal(itemBattery); } return true; } internal static void PrepareGun(ItemGun? itemGun) { Instance?.PrepareGunInternal(itemGun); } internal static void SyncGunBattery(ItemGun? itemGun) { Instance?.SyncGunBatteryInternal(itemGun); } internal static void HandleCustomPlasmaGunShootBulletRpc(object? plasmaGun, Vector3 endPosition, bool hit, PhotonMessageInfo info) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) Instance?.HandleCustomPlasmaGunShootBulletRpcInternal(plasmaGun, endPosition, hit, info); } internal static void PrepareCustomPlasmaGun(object? plasmaGun) { Component val = (Component)((plasmaGun is Component) ? plasmaGun : null); if (val != null) { Instance?.EnsureCustomPlasmaGunRelay(val); } } internal static bool HandleCustomPlasmaGunShootBullet(object? plasmaGun, Vector3 endPosition, bool hit) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Instance != (Object)null) { return Instance.HandleCustomPlasmaGunShootBulletInternal(plasmaGun, endPosition, hit); } return false; } private bool PatchCustomPlasmaGunCompatibility() { //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Expected O, but got Unknown //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Expected O, but got Unknown Type type = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault((Assembly assembly) => string.Equals(assembly.GetName().Name, "PlasmaGunAPI", StringComparison.OrdinalIgnoreCase))?.GetType("ItemPlasmaGun", throwOnError: false); MethodInfo methodInfo = ((type != null) ? AccessTools.Method(type, "Start", (Type[])null, (Type[])null) : null); MethodInfo methodInfo2 = ((type != null) ? AccessTools.Method(type, "ShootBullet", new Type[2] { typeof(Vector3), typeof(bool) }, (Type[])null) : null); if (methodInfo == null || methodInfo2 == null) { return false; } MethodInfo methodInfo3 = AccessTools.Method(typeof(EmpressPlasmaRifleWeaponCompatPatchPlugin), "PlasmaGunStartPostfix", (Type[])null, (Type[])null); MethodInfo methodInfo4 = AccessTools.Method(typeof(EmpressPlasmaRifleWeaponCompatPatchPlugin), "PlasmaGunShootBulletPrefix", (Type[])null, (Type[])null); if (methodInfo3 == null || methodInfo4 == null) { return false; } _harmony.Patch((MethodBase)methodInfo, (HarmonyMethod)null, new HarmonyMethod(methodInfo3), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); _harmony.Patch((MethodBase)methodInfo2, new HarmonyMethod(methodInfo4), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Applied Echohold PlasmaGunAPI compat bridge."); return true; } private static void PlasmaGunStartPostfix(object __instance) { PrepareCustomPlasmaGun(__instance); } private static bool PlasmaGunShootBulletPrefix(object __instance, Vector3 _endPosition, bool _hit) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) HandleCustomPlasmaGunShootBullet(__instance, _endPosition, _hit); return false; } private void PrepareItemAttributes(ItemAttributes? itemAttributes) { if (!((Object)(object)itemAttributes == (Object)null)) { PreparePrefab(GetRoot(((Component)itemAttributes).gameObject)); } } private void PreparePrefab(GameObject? root) { if (!((Object)(object)root == (Object)null) && IsTargetObject(root) && _preparedRootIds.Add(((Object)root).GetInstanceID())) { CleanupInvalidManagedLightTags(root); ItemAttributes[] componentsInChildren = root.GetComponentsInChildren<ItemAttributes>(true); foreach (ItemAttributes itemAttributes in componentsInChildren) { EnsureItemAttributes(itemAttributes); } ItemBattery[] componentsInChildren2 = root.GetComponentsInChildren<ItemBattery>(true); foreach (ItemBattery itemBattery in componentsInChildren2) { PrepareBatteryInternal(itemBattery); } ItemGun[] componentsInChildren3 = root.GetComponentsInChildren<ItemGun>(true); foreach (ItemGun itemGun in componentsInChildren3) { PrepareGunInternal(itemGun); } PhysGrabObject[] componentsInChildren4 = root.GetComponentsInChildren<PhysGrabObject>(true); for (int i = 0; i < componentsInChildren4.Length; i++) { EnsurePhysGrabObjectColliders(componentsInChildren4[i]); } } } private void EnsureItemAttributes(ItemAttributes? itemAttributes) { if (!((Object)(object)itemAttributes == (Object)null)) { SetFieldIfNull(itemAttributes, "photonView", ((Component)itemAttributes).GetComponent<PhotonView>() ?? ((Component)itemAttributes).GetComponentInParent<PhotonView>()); SetFieldIfNull(itemAttributes, "roomVolumeCheck", ((Component)itemAttributes).GetComponent<RoomVolumeCheck>() ?? ((Component)itemAttributes).GetComponentInParent<RoomVolumeCheck>()); SetFieldIfNull(itemAttributes, "itemEquippable", ((Component)itemAttributes).GetComponent<ItemEquippable>() ?? ((Component)itemAttributes).GetComponentInParent<ItemEquippable>()); SetFieldIfNull(itemAttributes, "physGrabObject", ((Component)itemAttributes).GetComponent<PhysGrabObject>() ?? ((Component)itemAttributes).GetComponentInChildren<PhysGrabObject>(true) ?? ((Component)itemAttributes).GetComponentInParent<PhysGrabObject>()); SetFieldIfNull(itemAttributes, "itemToggle", ((Component)itemAttributes).GetComponent<ItemToggle>() ?? ((Component)itemAttributes).GetComponentInParent<ItemToggle>()); } } private void PrepareBatteryInternal(ItemBattery? itemBattery) { if (!((Object)(object)itemBattery == (Object)null) && IsTargetObject(GetRoot(((Component)itemBattery).gameObject)) && (!_preparedBatteryIds.Contains(((Object)itemBattery).GetInstanceID()) || !HasBatteryCompatibility(itemBattery))) { ItemAttributes value = ((Component)itemBattery).GetComponent<ItemAttributes>() ?? ((Component)itemBattery).GetComponentInParent<ItemAttributes>(); ItemEquippable value2 = ((Component)itemBattery).GetComponent<ItemEquippable>() ?? ((Component)itemBattery).GetComponentInParent<ItemEquippable>(); PhysGrabObject value3 = ((Component)itemBattery).GetComponent<PhysGrabObject>() ?? ((Component)itemBattery).GetComponentInChildren<PhysGrabObject>(true) ?? ((Component)itemBattery).GetComponentInParent<PhysGrabObject>(); PhotonView value4 = ((Component)itemBattery).GetComponent<PhotonView>() ?? ((Component)itemBattery).GetComponentInParent<PhotonView>(); Transform value5 = GetFieldValue<Transform>(itemBattery, "batteryTransform") ?? FindChildByExactName(((Component)itemBattery).transform, "Item Battery") ?? FindChildByExactName(((Component)itemBattery).transform, "Battery Graphic") ?? FindChildContaining(((Component)itemBattery).transform, "battery") ?? ((Component)itemBattery).transform; SetFieldIfNull(itemBattery, "itemAttributes", value); SetFieldIfNull(itemBattery, "itemEquippable", value2); SetFieldIfNull(itemBattery, "physGrabObject", value3); SetFieldIfNull(itemBattery, "photonView", value4); SetFieldValue(itemBattery, "batteryTransform", value5); int num = GetFieldValue(itemBattery, "batteryBars", 0); float fieldValue = GetFieldValue(itemBattery, "batteryLife", 100f); ItemGun val = ((Component)itemBattery).GetComponent<ItemGun>() ?? ((Component)itemBattery).GetComponentInParent<ItemGun>(); float batteryDrain = (((Object)(object)val != (Object)null) ? Mathf.Max(GetFieldValue(val, "batteryDrain", 1f), 0.01f) : 1f); int num2 = DeriveBatteryBars(fieldValue, batteryDrain); bool flag = ShouldUseDerivedBatteryBars(itemBattery, val, num, fieldValue, num2); if (num <= 0 || flag) { num = num2; SetFieldValue(itemBattery, "batteryBars", num); } int num3 = CalculateBatteryDisplayBars(fieldValue, num); if (GetFieldValue(itemBattery, "batteryLifeInt", -1) < 0 || flag) { SetFieldValue(itemBattery, "batteryLifeInt", num3); } if (GetFieldValue(itemBattery, "currentBars", -1) < 0 || flag) { SetFieldValue(itemBattery, "currentBars", num3); } if (GetFieldValue(itemBattery, "batteryLifeCountBars", -1) < 0 || flag) { SetFieldValue(itemBattery, "batteryLifeCountBars", num3); } if (GetFieldValue(itemBattery, "batteryLifeCountBarsPrev", -1) < 0 || flag) { SetFieldValue(itemBattery, "batteryLifeCountBarsPrev", num3); } if (GetFieldValue(itemBattery, "batteryLife", -1f) < 0f) { SetFieldValue(itemBattery, "batteryLife", 100f); } if (GetFieldValue(itemBattery, "batteryDrainRate", 0f) <= 0f) { SetFieldValue(itemBattery, "batteryDrainRate", 1f); } if (GetFieldValue(itemBattery, "chargeRate", 0f) <= 0f) { SetFieldValue(itemBattery, "chargeRate", 25f); } if (GetFieldValue<List<GameObject>>(itemBattery, "chargerList") == null) { SetFieldValue(itemBattery, "chargerList", new List<GameObject>()); } BatteryVisualLogic val2 = GetFieldValue<BatteryVisualLogic>(itemBattery, "batteryVisualLogic") ?? ((Component)itemBattery).GetComponentInChildren<BatteryVisualLogic>(true); if ((Object)(object)val2 == (Object)null && IsSceneInstance(((Component)itemBattery).gameObject)) { val2 = CreateBatteryVisualLogic(itemBattery, num); } if ((Object)(object)val2 != (Object)null) { EnsureBatteryVisualLogic(itemBattery, val2, num); SetFieldValue(itemBattery, "batteryVisualLogic", val2); } if (HasBatteryCompatibility(itemBattery)) { _preparedBatteryIds.Add(((Object)itemBattery).GetInstanceID()); } } } private void FinishBatteryStartInternal(ItemBattery? itemBattery) { if ((Object)(object)itemBattery == (Object)null || !IsTargetObject(GetRoot(((Component)itemBattery).gameObject))) { return; } int batteryBars = Mathf.Max(GetFieldValue(itemBattery, "batteryBars", 0), 1); BatteryVisualLogic val = GetFieldValue<BatteryVisualLogic>(itemBattery, "batteryVisualLogic") ?? ((Component)itemBattery).GetComponentInChildren<BatteryVisualLogic>(true); if ((Object)(object)val == (Object)null) { val = CreateBatteryVisualLogic(itemBattery, batteryBars); if ((Object)(object)val != (Object)null) { SetFieldValue(itemBattery, "batteryVisualLogic", val); } } if (!((Object)(object)val == (Object)null)) { EnsureBatteryVisualLogic(itemBattery, val, batteryBars); TryInvoke(val, "BatteryBarsSet"); if (!GetFieldValue(itemBattery, "batteryActive", fallback: false) && !GetFieldValue(itemBattery, "isCharging", fallback: false)) { ((Component)val).gameObject.SetActive(false); } SyncBatteryStateInternal(itemBattery, forceVisualUpdate: true); } } private bool CanRunBatteryUpdateInternal(ItemBattery? itemBattery) { if ((Object)(object)itemBattery == (Object)null || !IsTargetObject(GetRoot(((Component)itemBattery).gameObject))) { return true; } if (HasBatteryCompatibility(itemBattery)) { _preparedBatteryIds.Add(((Object)itemBattery).GetInstanceID()); return true; } PrepareBatteryInternal(itemBattery); if (HasBatteryCompatibility(itemBattery)) { _preparedBatteryIds.Add(((Object)itemBattery).GetInstanceID()); return true; } if (_loggedBatterySkips.Add(((Object)itemBattery).GetInstanceID())) { ManualLogSource logger = ((BaseUnityPlugin)this).Logger; GameObject root = GetRoot(((Component)itemBattery).gameObject); logger.LogWarning((object)("Empress Plasma Rifle Weapon Compat Patch skipped a broken battery update on " + (((root != null) ? ((Object)root).name : null) ?? ((Object)((Component)itemBattery).gameObject).name) + " until its compatibility data was restored.")); } return false; } private void PrepareGunInternal(ItemGun? itemGun) { if (!((Object)(object)itemGun == (Object)null) && IsTargetObject(GetRoot(((Component)itemGun).gameObject)) && !_preparedGunIds.Contains(((Object)itemGun).GetInstanceID())) { PhysGrabObject value = ((Component)itemGun).GetComponent<PhysGrabObject>() ?? ((Component)itemGun).GetComponentInChildren<PhysGrabObject>(true) ?? ((Component)itemGun).GetComponentInParent<PhysGrabObject>(); ItemToggle value2 = ((Component)itemGun).GetComponent<ItemToggle>() ?? ((Component)itemGun).GetComponentInParent<ItemToggle>(); ItemBattery val = ((Component)itemGun).GetComponent<ItemBattery>() ?? ((Component)itemGun).GetComponentInParent<ItemBattery>(); PhotonView value3 = ((Component)itemGun).GetComponent<PhotonView>() ?? ((Component)itemGun).GetComponentInParent<PhotonView>(); PhysGrabObjectImpactDetector value4 = ((Component)itemGun).GetComponent<PhysGrabObjectImpactDetector>() ?? ((Component)itemGun).GetComponentInParent<PhysGrabObjectImpactDetector>(); RoomVolumeCheck value5 = ((Component)itemGun).GetComponent<RoomVolumeCheck>() ?? ((Component)itemGun).GetComponentInParent<RoomVolumeCheck>(); ItemEquippable value6 = ((Component)itemGun).GetComponent<ItemEquippable>() ?? ((Component)itemGun).GetComponentInParent<ItemEquippable>(); Transform val2 = GetFieldValue<Transform>(itemGun, "gunMuzzle") ?? FindChildByExactName(((Component)itemGun).transform, "Gun Muzzle") ?? FindChildByExactName(((Component)itemGun).transform, "Muzzle") ?? FindChildContaining(((Component)itemGun).transform, "muzzle"); GameObject value7 = GetFieldValue<GameObject>(itemGun, "muzzleFlashPrefab") ?? FindGameObjectByExactName(((Component)itemGun).transform, "Muzzle Flash") ?? FindGameObjectByExactName(((Component)itemGun).transform, "MuzzleFlash") ?? FindGameObjectContaining(((Component)itemGun).transform, "muzzle", "flash"); GameObject val3 = GetFieldValue<GameObject>(itemGun, "bulletPrefab") ?? FindGameObjectByExactName(((Component)itemGun).transform, "Bullet") ?? FindGameObjectContaining(((Component)itemGun).transform, "bullet"); Transform value8 = GetFieldValue<Transform>(itemGun, "gunTrigger") ?? FindChildByExactName(((Component)itemGun).transform, "Gun Trigger") ?? FindChildByExactName(((Component)itemGun).transform, "Trigger") ?? val2 ?? ((Component)itemGun).transform; HurtCollider value9 = GetFieldValue<HurtCollider>(itemGun, "hurtCollider") ?? (((Object)(object)val3 != (Object)null) ? val3.GetComponentInChildren<HurtCollider>(true) : null) ?? ((Component)itemGun).GetComponentInChildren<HurtCollider>(true); SetFieldIfNull(itemGun, "physGrabObject", value); SetFieldIfNull(itemGun, "itemToggle", value2); SetFieldIfNull(itemGun, "itemBattery", val); SetFieldIfNull(itemGun, "photonView", value3); SetFieldIfNull(itemGun, "impactDetector", value4); SetFieldIfNull(itemGun, "roomVolumeCheck", value5); SetFieldIfNull(itemGun, "itemEquippable", value6); SetFieldIfNull(itemGun, "gunMuzzle", val2); SetFieldIfNull(itemGun, "muzzleFlashPrefab", value7); SetFieldIfNull(itemGun, "bulletPrefab", val3); SetFieldIfNull(itemGun, "gunTrigger", value8); SetFieldIfNull(itemGun, "hurtCollider", value9); if (GetFieldValue(itemGun, "numberOfBullets", 0) <= 0) { SetFieldValue(itemGun, "numberOfBullets", 1); } if (GetFieldValue(itemGun, "shootCooldown", 0f) <= 0f) { SetFieldValue(itemGun, "shootCooldown", 0.1f); } if (GetFieldValue(itemGun, "batteryDrain", 0f) <= 0f) { SetFieldValue(itemGun, "batteryDrain", 1f); } if (GetFieldValue(itemGun, "batteryDrainFullBar", fallback: false) && GetFieldValue(itemGun, "batteryDrainFullBars", 0) <= 0) { SetFieldValue(itemGun, "batteryDrainFullBars", Mathf.Max(1, Mathf.RoundToInt(GetFieldValue(itemGun, "batteryDrain", 1f)))); } if ((Object)(object)val != (Object)null) { PrepareBatteryInternal(val); } _preparedGunIds.Add(((Object)itemGun).GetInstanceID()); } } private void SyncGunBatteryInternal(ItemGun? itemGun) { if (!((Object)(object)itemGun == (Object)null) && IsTargetObject(GetRoot(((Component)itemGun).gameObject))) { PrepareGunInternal(itemGun); ItemBattery val = ((Component)itemGun).GetComponent<ItemBattery>() ?? ((Component)itemGun).GetComponentInParent<ItemBattery>(); if (!((Object)(object)val == (Object)null)) { SyncBatteryStateInternal(val, forceVisualUpdate: true); } } } private EmpressPlasmaRifleWeaponCompatPatchPluginPlasmaGunRelay EnsureCustomPlasmaGunRelay(Component plasmaGunComponent) { PreparePrefab(GetRoot(plasmaGunComponent.gameObject)); EnsurePhysGrabObjectColliders(GetFieldValue<PhysGrabObject>(plasmaGunComponent, "physGrabObject") ?? plasmaGunComponent.GetComponent<PhysGrabObject>()); EmpressPlasmaRifleWeaponCompatPatchPluginPlasmaGunRelay empressPlasmaRifleWeaponCompatPatchPluginPlasmaGunRelay = plasmaGunComponent.GetComponent<EmpressPlasmaRifleWeaponCompatPatchPluginPlasmaGunRelay>(); if ((Object)(object)empressPlasmaRifleWeaponCompatPatchPluginPlasmaGunRelay == (Object)null) { empressPlasmaRifleWeaponCompatPatchPluginPlasmaGunRelay = plasmaGunComponent.gameObject.AddComponent<EmpressPlasmaRifleWeaponCompatPatchPluginPlasmaGunRelay>(); } empressPlasmaRifleWeaponCompatPatchPluginPlasmaGunRelay.Initialize(plasmaGunComponent); return empressPlasmaRifleWeaponCompatPatchPluginPlasmaGunRelay; } private bool HandleCustomPlasmaGunShootBulletInternal(object? plasmaGun, Vector3 endPosition, bool hit) { //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006e: 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_0052: Unknown result type (might be due to invalid IL or missing references) Component val = (Component)((plasmaGun is Component) ? plasmaGun : null); if (val == null) { return true; } if (!SemiFunc.IsMasterClientOrSingleplayer()) { return true; } EmpressPlasmaRifleWeaponCompatPatchPluginPlasmaGunRelay empressPlasmaRifleWeaponCompatPatchPluginPlasmaGunRelay = EnsureCustomPlasmaGunRelay(val); if (SemiFunc.IsMultiplayer()) { PhotonView val2 = GetFieldValue<PhotonView>(plasmaGun, "photonView") ?? val.GetComponent<PhotonView>(); if ((Object)(object)val2 != (Object)null) { val2.RPC("EmpressCompatShootBulletRPC", (RpcTarget)0, new object[2] { endPosition, hit }); return true; } } empressPlasmaRifleWeaponCompatPatchPluginPlasmaGunRelay.EmpressCompatShootBulletRPC(endPosition, hit); return true; } private void HandleCustomPlasmaGunShootBulletRpcInternal(object? plasmaGun, Vector3 endPosition, bool hit, PhotonMessageInfo info) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_0156: 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) Component val = (Component)((plasmaGun is Component) ? plasmaGun : null); if (val == null || (SemiFunc.IsMultiplayer() && !SemiFunc.MasterOnlyRPC(info))) { return; } PhysGrabObject val2 = GetFieldValue<PhysGrabObject>(plasmaGun, "physGrabObject") ?? val.GetComponent<PhysGrabObject>(); PhotonView val3 = GetFieldValue<PhotonView>(plasmaGun, "photonView") ?? val.GetComponent<PhotonView>(); if ((Object)(object)val2 != (Object)null && val2.playerGrabbing.Count > 1) { foreach (PhysGrabber item in val2.playerGrabbing.Where((PhysGrabber grabber) => (Object)(object)grabber != (Object)null).ToList()) { item.OverrideGrabRelease((val3 != null) ? val3.ViewID : (-1), 0.5f); } } Transform val4 = GetFieldValue<Transform>(plasmaGun, "gunMuzzle") ?? val.transform; GameObject fieldValue = GetFieldValue<GameObject>(plasmaGun, "bulletPrefab"); if ((Object)(object)fieldValue != (Object)null) { Component val5 = ((IEnumerable<Component>)Object.Instantiate<GameObject>(fieldValue, val4.position, val4.rotation).GetComponentsInChildren<Component>(true)).FirstOrDefault((Func<Component, bool>)((Component component) => (Object)(object)component != (Object)null && string.Equals(((object)component).GetType().Name, "PlasmaProjectile", StringComparison.Ordinal))); if ((Object)(object)val5 != (Object)null) { TryInvoke(val5, "SetProjectileData", val4.position, endPosition, hit); SetFieldValue(plasmaGun, "hurtCollider", val5.GetComponentInChildren<HurtCollider>()); TryInvoke(val5, "ActivateAll"); } } Sound fieldValue2 = GetFieldValue<Sound>(plasmaGun, "soundHit"); if (fieldValue2 != null) { fieldValue2.Play(endPosition, 1f, 1f, 1f, 1f); } Component fieldValue3 = GetFieldValue<Component>(plasmaGun, "energyTrailParticles"); if ((Object)(object)fieldValue3 != (Object)null) { TryInvoke(fieldValue3, "Play"); } } private static void EnsurePhysGrabObjectColliders(PhysGrabObject? physGrabObject) { if ((Object)(object)physGrabObject == (Object)null) { return; } List<Transform> fieldValue = GetFieldValue(physGrabObject, "colliders", new List<Transform>()); fieldValue.Clear(); int num = 0; Collider[] componentsInChildren = ((Component)physGrabObject).GetComponentsInChildren<Collider>(true); foreach (Collider val in componentsInChildren) { if (!((Object)(object)val == (Object)null) && !val.isTrigger) { PhysGrabObjectCollider val2 = ((Component)val).GetComponent<PhysGrabObjectCollider>(); if ((Object)(object)val2 == (Object)null) { val2 = ((Component)val).gameObject.AddComponent<PhysGrabObjectCollider>(); } SetFieldValue(val2, "physGrabObject", physGrabObject); SetFieldValue(val2, "colliderID", num++); fieldValue.Add(((Component)val).transform); } } SetFieldValue(physGrabObject, "colliders", fieldValue); } private static void CleanupInvalidManagedLightTags(GameObject root) { Transform[] componentsInChildren = root.GetComponentsInChildren<Transform>(true); for (int i = 0; i < componentsInChildren.Length; i++) { GameObject gameObject = ((Component)componentsInChildren[i]).gameObject; if (gameObject.CompareTag("Prop Lights") && (Object)(object)gameObject.GetComponent<PropLight>() == (Object)null) { gameObject.tag = "Untagged"; } if (gameObject.CompareTag("Prop Emission") && (Object)(object)gameObject.GetComponent<PropLightEmission>() == (Object)null) { gameObject.tag = "Untagged"; } } } private void SyncBatteryStateInternal(ItemBattery? itemBattery, bool forceVisualUpdate) { if ((Object)(object)itemBattery == (Object)null || !IsTargetObject(GetRoot(((Component)itemBattery).gameObject))) { return; } if (!HasBatteryCompatibility(itemBattery)) { PrepareBatteryInternal(itemBattery); if (!HasBatteryCompatibility(itemBattery)) { return; } } int num = Mathf.Max(GetFieldValue(itemBattery, "batteryBars", 0), 1); int num2 = CalculateBatteryDisplayBars(Mathf.Clamp(GetFieldValue(itemBattery, "batteryLife", 100f), 0f, 100f), num); int fieldValue = GetFieldValue(itemBattery, "batteryLifeInt", num2); int fieldValue2 = GetFieldValue(itemBattery, "currentBars", num2); int fieldValue3 = GetFieldValue(itemBattery, "batteryLifeCountBars", num2); int fieldValue4 = GetFieldValue(itemBattery, "batteryLifeCountBarsPrev", num2); bool flag = fieldValue != num2 || fieldValue2 != num2 || fieldValue3 != num2 || fieldValue4 != num2; SetFieldValue(itemBattery, "batteryLifeInt", num2); SetFieldValue(itemBattery, "currentBars", num2); SetFieldValue(itemBattery, "batteryLifeCountBars", num2); SetFieldValue(itemBattery, "batteryLifeCountBarsPrev", num2); BatteryVisualLogic val = GetFieldValue<BatteryVisualLogic>(itemBattery, "batteryVisualLogic") ?? ((Component)itemBattery).GetComponentInChildren<BatteryVisualLogic>(true); if ((Object)(object)val != (Object)null) { EnsureBatteryVisualLogic(itemBattery, val, num); SetFieldValue(val, "currentBars", num2); if (!((Component)val).gameObject.activeSelf && (num2 < num || GetFieldValue(itemBattery, "batteryActive", fallback: false) || GetFieldValue(itemBattery, "isCharging", fallback: false))) { ((Component)val).gameObject.SetActive(true); } if (flag || forceVisualUpdate) { TryInvoke(val, "BatteryBarsSet"); TryInvoke(val, "BatteryBarsUpdate", num2, true); } if (num2 <= 0) { TryInvoke(val, "OverrideBatteryOutWarning", 0.2f); } else if (num2 <= Mathf.Max(1, num / 2)) { TryInvoke(val, "OverrideChargeNeeded", 0.2f); } else { TryInvoke(val, "BatteryColorMainReset"); } } SyncLegacyAmmoIndicator(itemBattery, num2, num); BatteryUI val2 = FindBatteryUiInstance(); BatteryVisualLogic val3 = (((Object)(object)val2 != (Object)null) ? (GetFieldValue<BatteryVisualLogic>(val2, "batteryVisualLogic") ?? ((Component)val2).GetComponentInChildren<BatteryVisualLogic>(true)) : null); if ((Object)(object)val2 != (Object)null && (Object)(object)val3 != (Object)null && (Object)(object)GetFieldValue<ItemBattery>(val3, "itemBattery") == (Object)(object)itemBattery) { SetFieldValue(val2, "batteryCurrentBars", num2); SetFieldValue(val2, "batteryCurrenyBarsMax", num); SetFieldValue(val3, "itemBattery", itemBattery); TryInvoke(val3, "BatteryBarsSet"); TryInvoke(val3, "BatteryBarsUpdate", num2, true); } } private static int DeriveBatteryBars(float legacyBatteryLife, float batteryDrain) { if (legacyBatteryLife > 0f && batteryDrain > 0f) { return Mathf.Clamp(Mathf.RoundToInt(legacyBatteryLife / batteryDrain), 1, 200); } if (legacyBatteryLife > 0f) { return Mathf.Clamp(Mathf.RoundToInt(legacyBatteryLife / 10f), 1, 200); } return 10; } private static bool ShouldUseDerivedBatteryBars(ItemBattery itemBattery, ItemGun? itemGun, int batteryBars, float legacyBatteryLife, int derivedBatteryBars) { if (derivedBatteryBars <= 0) { return false; } if (batteryBars <= 0) { return true; } if ((Object)(object)itemGun == (Object)null) { return false; } if ((Object)(object)(GetFieldValue<BatteryVisualLogic>(itemBattery, "batteryVisualLogic") ?? ((Component)itemBattery).GetComponentInChildren<BatteryVisualLogic>(true)) != (Object)null) { return false; } if (batteryBars != 6) { return false; } if (legacyBatteryLife < 99f) { return false; } int fieldValue = GetFieldValue(itemBattery, "batteryLifeInt", 6); int fieldValue2 = GetFieldValue(itemBattery, "currentBars", 6); if (fieldValue == 6) { return fieldValue2 == 6; } return false; } private static int CalculateBatteryDisplayBars(float batteryLife, int batteryBars) { if (batteryBars <= 0) { return 0; } float num = 100f / (float)batteryBars; if (num <= 0f) { return 0; } return Mathf.Clamp(Mathf.RoundToInt(batteryLife / num), 0, batteryBars); } private static void SyncLegacyAmmoIndicator(ItemBattery itemBattery, int desiredBars, int batteryBars) { if (!IsSceneInstance(((Component)itemBattery).gameObject)) { return; } Transform val = FindLegacyBatteryGraphic(itemBattery); if ((Object)(object)val == (Object)null) { return; } MeshRenderer[] componentsInChildren = ((Component)val).GetComponentsInChildren<MeshRenderer>(true); for (int i = 0; i < componentsInChildren.Length; i++) { ((Renderer)componentsInChildren[i]).enabled = false; } EmpressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicator empressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicator = (((Object)(object)val.parent != (Object)null) ? ((Component)val.parent).GetComponentInChildren<EmpressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicator>(true) : null); if ((Object)(object)empressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicator == (Object)null) { empressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicator = BuildLegacyAmmoIndicator(val); } if (!((Object)(object)empressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicator == (Object)null)) { int filledBars = ((batteryBars > 0) ? Mathf.Clamp(Mathf.CeilToInt((float)desiredBars / (float)batteryBars * (float)empressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicator.BarCount), 0, empressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicator.BarCount) : 0); EmpressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicatorState state = EmpressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicatorState.Normal; if (desiredBars <= 0) { state = EmpressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicatorState.Empty; } else if (desiredBars <= Mathf.Max(1, batteryBars / 2)) { state = EmpressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicatorState.Low; } empressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicator.SetDisplay(filledBars, state); } } private static Transform? FindLegacyBatteryGraphic(ItemBattery itemBattery) { return FindChildByExactName(((Component)itemBattery).transform, "Battery Graphic") ?? FindChildContaining(((Component)itemBattery).transform, "battery", "graphic"); } private static bool IsSceneInstance(GameObject gameObject) { //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_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) Scene scene = gameObject.scene; if (((Scene)(ref scene)).IsValid()) { scene = gameObject.scene; return ((Scene)(ref scene)).isLoaded; } return false; } private static BatteryUI? FindBatteryUiInstance() { return ((IEnumerable<BatteryUI>)Resources.FindObjectsOfTypeAll<BatteryUI>()).FirstOrDefault((Func<BatteryUI, bool>)delegate(BatteryUI ui) { //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)ui != (Object)null) { Scene scene = ((Component)ui).gameObject.scene; return ((Scene)(ref scene)).IsValid(); } return false; }); } private static EmpressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicator? BuildLegacyAmmoIndicator(Transform legacyGraphic) { //IL_0025: 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_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0059: 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_008f: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: Unknown result type (might be due to invalid IL or missing references) //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_025a: Unknown result type (might be due to invalid IL or missing references) //IL_0281: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)legacyGraphic.parent == (Object)null) { return null; } GameObject val = CreateUiObject("Empress Legacy Ammo Indicator", legacyGraphic.parent, new Vector2(88f, 24f)); val.transform.localPosition = legacyGraphic.localPosition; val.transform.localRotation = legacyGraphic.localRotation; val.transform.localScale = new Vector3(Mathf.Max(legacyGraphic.localScale.x * 0.004f, 0.00075f), Mathf.Max(legacyGraphic.localScale.y * 0.004f, 0.00075f), Mathf.Max(legacyGraphic.localScale.z * 0.004f, 0.00075f)); Canvas obj = val.AddComponent<Canvas>(); obj.renderMode = (RenderMode)2; obj.overrideSorting = true; obj.sortingOrder = 2600; val.AddComponent<CanvasScaler>().dynamicPixelsPerUnit = 12f; val.AddComponent<GraphicRaycaster>(); EmpressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicator empressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicator = val.AddComponent<EmpressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicator>(); CreateImageObject("Frame Shadow", val.transform, new Vector2(0f, 0f), new Vector2(88f, 24f), new Color(0f, 0f, 0f, 0.45f)); RawImage frame = CreateImageObject("Frame Main", val.transform, new Vector2(0f, 0f), new Vector2(82f, 18f), new Color(0.25f, 1f, 0.15f, 1f)); RawImage background = CreateImageObject("Background", val.transform, new Vector2(0f, 0f), new Vector2(76f, 12f), new Color(0.03f, 0.07f, 0.03f, 0.92f)); GameObject val2 = CreateUiObject("Bar Container", val.transform, new Vector2(70f, 10f)); val2.GetComponent<RectTransform>().anchoredPosition = Vector2.zero; HorizontalLayoutGroup obj2 = val2.AddComponent<HorizontalLayoutGroup>(); ((HorizontalOrVerticalLayoutGroup)obj2).childControlHeight = false; ((HorizontalOrVerticalLayoutGroup)obj2).childControlWidth = false; ((HorizontalOrVerticalLayoutGroup)obj2).childForceExpandHeight = false; ((HorizontalOrVerticalLayoutGroup)obj2).childForceExpandWidth = false; ((HorizontalOrVerticalLayoutGroup)obj2).spacing = 2f; List<RawImage> list = new List<RawImage>(); for (int i = 0; i < 5; i++) { RawImage val3 = CreateUiObject("Bar " + (i + 1), val2.transform, new Vector2(10f, 10f)).AddComponent<RawImage>(); ((Graphic)val3).color = new Color(0.2f, 1f, 0.15f, 1f); list.Add(val3); } empressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicator.Initialize(frame, background, list); ApplyHideFlags((Object)(object)val); return empressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicator; } private static BatteryVisualLogic? CreateBatteryVisualLogic(ItemBattery itemBattery, int batteryBars) { BatteryVisualLogic val = CloneBatteryVisualLogic(itemBattery); if ((Object)(object)val != (Object)null) { return val; } return BuildBatteryVisualLogic(itemBattery, batteryBars); } private static BatteryVisualLogic? CloneBatteryVisualLogic(ItemBattery itemBattery) { //IL_0044: 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_0064: 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_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) BatteryVisualLogic val = FindTemplateBatteryVisualLogic(itemBattery); if ((Object)(object)val == (Object)null) { return null; } GameObject val2 = Object.Instantiate<GameObject>(((Component)val).gameObject, ((Component)itemBattery).transform); ((Object)val2).name = "Empress Battery Visual Logic"; val2.transform.localPosition = new Vector3(0f, 0.35f, 0f); val2.transform.localRotation = Quaternion.identity; if (val2.transform.localScale == Vector3.zero) { val2.transform.localScale = Vector3.one * 0.0065f; } ApplyHideFlags((Object)(object)val2); return val2.GetComponent<BatteryVisualLogic>(); } private static BatteryVisualLogic? FindTemplateBatteryVisualLogic(ItemBattery itemBattery) { ItemBattery itemBattery2 = itemBattery; return (from visual in Resources.FindObjectsOfTypeAll<BatteryVisualLogic>() where (Object)(object)visual != (Object)null && (Object)(object)((Component)visual).gameObject != (Object)(object)((Component)itemBattery2).gameObject where (Object)(object)GetFieldValue<GameObject>(visual, "batteryBarPrefab") != (Object)null orderby GetFieldValue(visual, "inUI", fallback: false) ? 1 : 0, IsTargetObject(GetRoot(((Component)visual).gameObject)) ? 1 : 0 select visual).FirstOrDefault(); } private static BatteryVisualLogic BuildBatteryVisualLogic(ItemBattery itemBattery, int batteryBars) { //IL_0015: 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_0045: 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_005f: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_01e9: Unknown result type (might be due to invalid IL or missing references) //IL_0202: Unknown result type (might be due to invalid IL or missing references) //IL_0223: Unknown result type (might be due to invalid IL or missing references) //IL_0236: Unknown result type (might be due to invalid IL or missing references) //IL_028a: Unknown result type (might be due to invalid IL or missing references) //IL_0299: Unknown result type (might be due to invalid IL or missing references) //IL_02b2: Unknown result type (might be due to invalid IL or missing references) //IL_02e0: Unknown result type (might be due to invalid IL or missing references) //IL_02ef: Unknown result type (might be due to invalid IL or missing references) //IL_0308: Unknown result type (might be due to invalid IL or missing references) //IL_0336: Unknown result type (might be due to invalid IL or missing references) //IL_0345: Unknown result type (might be due to invalid IL or missing references) //IL_035e: Unknown result type (might be due to invalid IL or missing references) GameObject val = CreateUiObject("Empress Battery Visual Logic", ((Component)itemBattery).transform, new Vector2(92f, 26f)); val.transform.localPosition = new Vector3(0f, 0.35f, 0f); val.transform.localRotation = Quaternion.identity; val.transform.localScale = Vector3.one * 0.0065f; Canvas obj = val.AddComponent<Canvas>(); obj.renderMode = (RenderMode)2; obj.overrideSorting = true; obj.sortingOrder = 2500; val.AddComponent<CanvasScaler>().dynamicPixelsPerUnit = 12f; val.AddComponent<GraphicRaycaster>(); BatteryVisualLogic obj2 = val.AddComponent<BatteryVisualLogic>(); RawImage value = CreateImageObject("Border Shadow", val.transform, new Vector2(0f, 0f), new Vector2(90f, 22f), new Color(0f, 0f, 0f, 0.45f)); RawImage value2 = CreateImageObject("Border Main", val.transform, new Vector2(0f, 0f), new Vector2(86f, 18f), new Color(0.96f, 0.86f, 0.2f, 1f)); RawImage value3 = CreateImageObject("Background", val.transform, new Vector2(0f, 0f), new Vector2(80f, 12f), new Color(0.08f, 0.08f, 0.08f, 0.88f)); RawImage val2 = CreateImageObject("Charge", val.transform, new Vector2(0f, 0f), new Vector2(76f, 10f), new Color(0.1f, 1f, 0.2f, 0.6f)); RawImage val3 = CreateImageObject("Drain", val.transform, new Vector2(0f, 0f), new Vector2(70f, 10f), new Color(1f, 0.35f, 0.1f, 0.6f)); GameObject val4 = CreateUiObject("Bar Container", val.transform, new Vector2(72f, 10f)); val4.GetComponent<RectTransform>().anchoredPosition = Vector2.zero; HorizontalLayoutGroup val5 = val4.AddComponent<HorizontalLayoutGroup>(); ((HorizontalOrVerticalLayoutGroup)val5).childControlHeight = false; ((HorizontalOrVerticalLayoutGroup)val5).childControlWidth = false; ((HorizontalOrVerticalLayoutGroup)val5).childForceExpandHeight = false; ((HorizontalOrVerticalLayoutGroup)val5).childForceExpandWidth = false; ((HorizontalOrVerticalLayoutGroup)val5).spacing = 2f; GameObject gameObject = ((Component)CreateImageObject("Battery Out Visual", val.transform, new Vector2(0f, 0f), new Vector2(88f, 24f), new Color(1f, 0f, 0f, 0.25f))).gameObject; gameObject.SetActive(false); GameObject gameObject2 = ((Component)CreateImageObject("Battery Charge Needed Visual", val.transform, new Vector2(0f, 0f), new Vector2(88f, 24f), new Color(1f, 0.55f, 0f, 0.2f))).gameObject; gameObject2.SetActive(false); GameObject gameObject3 = ((Component)CreateImageObject("Bar Prefab", val.transform, new Vector2(-5000f, -5000f), new Vector2(6f, 10f), new Color(1f, 0.92f, 0.3f, 1f))).gameObject; GameObject value4 = CreateBarEffectPrefab(val.transform); SetFieldValue(obj2, "batteryBarContainerGroup", val5); SetFieldValue(obj2, "batteryBarPrefab", gameObject3); SetFieldValue(obj2, "batteryBars", batteryBars); SetFieldValue(obj2, "batteryBarContainer", val4.transform); SetFieldValue(obj2, "inUI", false); SetFieldValue(obj2, "cameraTurn", true); SetFieldValue(obj2, "batteryBarCharge", ((Component)val2).transform); SetFieldValue(obj2, "batteryBarDrain", ((Component)val3).transform); SetFieldValue(obj2, "bars", new List<GameObject>()); SetFieldValue(obj2, "batteryBorderShadow", value); SetFieldValue(obj2, "batteryBorderMain", value2); SetFieldValue(obj2, "batteryBackground", value3); SetFieldValue(obj2, "batteryCharge", val2); SetFieldValue(obj2, "batteryDrain", val3); SetFieldValue(obj2, "batteryOutVisual", gameObject); SetFieldValue(obj2, "batteryChargeNeededVisual", gameObject2); SetFieldValue(obj2, "barLossEffectPrefab", value4); ApplyHideFlags((Object)(object)val); return obj2; } private static RawImage CreateImageObject(string name, Transform parent, Vector2 anchoredPosition, Vector2 size, Color color) { //IL_0002: 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) //IL_001a: Unknown result type (might be due to invalid IL or missing references) GameObject obj = CreateUiObject(name, parent, size); obj.GetComponent<RectTransform>().anchoredPosition = anchoredPosition; RawImage obj2 = obj.AddComponent<RawImage>(); ((Graphic)obj2).color = color; return obj2; } private static GameObject CreateUiObject(string name, Transform parent, Vector2 size) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Expected O, but got Unknown GameObject val = new GameObject(name, new Type[2] { typeof(RectTransform), typeof(CanvasRenderer) }); val.transform.SetParent(parent, false); RectTransform component = val.GetComponent<RectTransform>(); component.anchorMin = new Vector2(0.5f, 0.5f); component.anchorMax = new Vector2(0.5f, 0.5f); component.pivot = new Vector2(0.5f, 0.5f); component.sizeDelta = size; return val; } private static GameObject CreateBarEffectPrefab(Transform parent) { //IL_0010: 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_003b: 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_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Expected O, but got Unknown //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: 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_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Expected O, but got Unknown GameObject val = CreateUiObject("Bar Effect Prefab", parent, new Vector2(6f, 10f)); val.GetComponent<RectTransform>().anchoredPosition = new Vector2(-6000f, -6000f); ((Graphic)val.AddComponent<RawImage>()).color = Color.red; BatteryBarEffect val2 = val.AddComponent<BatteryBarEffect>(); val2.barLossEffect = true; val2.barColor = Color.red; val2.barAnimationCurve = AnimationCurve.EaseInOut(0f, 0f, 1f, 1f); val2.barFadeOutCurve = new AnimationCurve((Keyframe[])(object)new Keyframe[2] { new Keyframe(0f, 1f), new Keyframe(1f, 0f) }); val2.whiteFlashCurve = new AnimationCurve((Keyframe[])(object)new Keyframe[3] { new Keyframe(0f, 0f), new Keyframe(0.2f, 1f), new Keyframe(1f, 0f) }); return val; } private static void EnsureBatteryVisualLogic(ItemBattery itemBattery, BatteryVisualLogic batteryVisualLogic, int batteryBars) { SetFieldValue(itemBattery, "batteryVisualLogic", batteryVisualLogic); SetFieldValue(itemBattery, "batteryTransform", GetFieldValue<Transform>(itemBattery, "batteryTransform") ?? ((Component)batteryVisualLogic).transform); SetFieldValue(itemBattery, "batteryBars", batteryBars); SetFieldValue(itemBattery, "batteryLifeInt", Mathf.Clamp(GetFieldValue(itemBattery, "batteryLifeInt", batteryBars), 0, batteryBars)); SetFieldValue(itemBattery, "currentBars", Mathf.Clamp(GetFieldValue(itemBattery, "currentBars", batteryBars), 0, batteryBars)); SetFieldValue(itemBattery, "batteryLifeCountBars", Mathf.Clamp(GetFieldValue(itemBattery, "batteryLifeCountBars", batteryBars), 0, batteryBars)); SetFieldValue(itemBattery, "batteryLifeCountBarsPrev", Mathf.Clamp(GetFieldValue(itemBattery, "batteryLifeCountBarsPrev", batteryBars), 0, batteryBars)); SetFieldValue(batteryVisualLogic, "itemBattery", itemBattery); SetFieldValue(batteryVisualLogic, "batteryBars", batteryBars); SetFieldValue(batteryVisualLogic, "currentBars", GetFieldValue(itemBattery, "currentBars", batteryBars)); if ((Object)(object)GetFieldValue<HorizontalLayoutGroup>(batteryVisualLogic, "batteryBarContainerGroup") == (Object)null) { SetFieldValue(batteryVisualLogic, "batteryBarContainerGroup", ((Component)batteryVisualLogic).GetComponentInChildren<HorizontalLayoutGroup>(true)); } if ((Object)(object)GetFieldValue<Transform>(batteryVisualLogic, "batteryBarContainer") == (Object)null) { SetFieldValue(batteryVisualLogic, "batteryBarContainer", FindChildByExactName(((Component)batteryVisualLogic).transform, "Bar Container")); } if ((Object)(object)GetFieldValue<GameObject>(batteryVisualLogic, "batteryBarPrefab") == (Object)null) { SetFieldValue(batteryVisualLogic, "batteryBarPrefab", FindGameObjectByExactName(((Component)batteryVisualLogic).transform, "Bar Prefab")); } if ((Object)(object)GetFieldValue<Transform>(batteryVisualLogic, "batteryBarCharge") == (Object)null) { SetFieldValue(batteryVisualLogic, "batteryBarCharge", FindChildByExactName(((Component)batteryVisualLogic).transform, "Charge")); } if ((Object)(object)GetFieldValue<Transform>(batteryVisualLogic, "batteryBarDrain") == (Object)null) { SetFieldValue(batteryVisualLogic, "batteryBarDrain", FindChildByExactName(((Component)batteryVisualLogic).transform, "Drain")); } if ((Object)(object)GetFieldValue<RawImage>(batteryVisualLogic, "batteryBorderShadow") == (Object)null) { Transform? obj = FindChildByExactName(((Component)batteryVisualLogic).transform, "Border Shadow"); SetFieldValue(batteryVisualLogic, "batteryBorderShadow", (obj != null) ? ((Component)obj).GetComponent<RawImage>() : null); } if ((Object)(object)GetFieldValue<RawImage>(batteryVisualLogic, "batteryBorderMain") == (Object)null) { Transform? obj2 = FindChildByExactName(((Component)batteryVisualLogic).transform, "Border Main"); SetFieldValue(batteryVisualLogic, "batteryBorderMain", (obj2 != null) ? ((Component)obj2).GetComponent<RawImage>() : null); } if ((Object)(object)GetFieldValue<RawImage>(batteryVisualLogic, "batteryBackground") == (Object)null) { Transform? obj3 = FindChildByExactName(((Component)batteryVisualLogic).transform, "Background"); SetFieldValue(batteryVisualLogic, "batteryBackground", (obj3 != null) ? ((Component)obj3).GetComponent<RawImage>() : null); } if ((Object)(object)GetFieldValue<RawImage>(batteryVisualLogic, "batteryCharge") == (Object)null) { Transform? obj4 = FindChildByExactName(((Component)batteryVisualLogic).transform, "Charge"); SetFieldValue(batteryVisualLogic, "batteryCharge", (obj4 != null) ? ((Component)obj4).GetComponent<RawImage>() : null); } if ((Object)(object)GetFieldValue<RawImage>(batteryVisualLogic, "batteryDrain") == (Object)null) { Transform? obj5 = FindChildByExactName(((Component)batteryVisualLogic).transform, "Drain"); SetFieldValue(batteryVisualLogic, "batteryDrain", (obj5 != null) ? ((Component)obj5).GetComponent<RawImage>() : null); } if ((Object)(object)GetFieldValue<GameObject>(batteryVisualLogic, "batteryOutVisual") == (Object)null) { SetFieldValue(batteryVisualLogic, "batteryOutVisual", FindGameObjectByExactName(((Component)batteryVisualLogic).transform, "Battery Out Visual")); } if ((Object)(object)GetFieldValue<GameObject>(batteryVisualLogic, "batteryChargeNeededVisual") == (Object)null) { SetFieldValue(batteryVisualLogic, "batteryChargeNeededVisual", FindGameObjectByExactName(((Component)batteryVisualLogic).transform, "Battery Charge Needed Visual")); } if ((Object)(object)GetFieldValue<GameObject>(batteryVisualLogic, "barLossEffectPrefab") == (Object)null) { SetFieldValue(batteryVisualLogic, "barLossEffectPrefab", FindGameObjectByExactName(((Component)batteryVisualLogic).transform, "Bar Effect Prefab")); } if (GetFieldValue<List<GameObject>>(batteryVisualLogic, "bars") == null) { SetFieldValue(batteryVisualLogic, "bars", new List<GameObject>()); } } private static bool IsTargetObject(GameObject? gameObject) { if ((Object)(object)gameObject == (Object)null) { return false; } if ((Object)(object)Instance != (Object)null && Instance._targetRootCache.TryGetValue(((Object)(object)gameObject.transform.root != (Object)null) ? ((Object)((Component)gameObject.transform.root).gameObject).GetInstanceID() : ((Object)gameObject).GetInstanceID(), out var value)) { return value; } GameObject root = GetRoot(gameObject); bool flag = false; foreach (string item in EnumerateCandidateNames(root)) { if (MatchesTargetToken(item)) { flag = true; break; } } if ((Object)(object)Instance != (Object)null) { Instance._targetRootCache[((Object)root).GetInstanceID()] = flag; } return flag; } private static IEnumerable<string> EnumerateCandidateNames(GameObject root) { yield return ((Object)root).name; ItemAttributes[] componentsInChildren = root.GetComponentsInChildren<ItemAttributes>(true); foreach (ItemAttributes itemAttributes in componentsInChildren) { yield return ((Object)itemAttributes).name; yield return GetFieldValue(itemAttributes, "itemName", string.Empty); yield return GetFieldValue(itemAttributes, "itemAssetName", string.Empty); Item fieldValue = GetFieldValue<Item>(itemAttributes, "item"); if ((Object)(object)fieldValue != (Object)null) { yield return ((Object)fieldValue).name; } } ItemGun[] componentsInChildren2 = root.GetComponentsInChildren<ItemGun>(true); foreach (ItemGun val in componentsInChildren2) { yield return ((Object)val).name; } ItemBattery[] componentsInChildren3 = root.GetComponentsInChildren<ItemBattery>(true); foreach (ItemBattery val2 in componentsInChildren3) { yield return ((Object)val2).name; } } private static bool MatchesTargetToken(string? value) { string value2 = value; if (string.IsNullOrWhiteSpace(value2)) { return false; } return TargetTokens.Where((string token) => !string.IsNullOrWhiteSpace(token)).Any((string token) => value2.IndexOf(token, StringComparison.OrdinalIgnoreCase) >= 0); } private static GameObject GetRoot(GameObject gameObject) { if (!((Object)(object)gameObject.transform.root != (Object)null)) { return gameObject; } return ((Component)gameObject.transform.root).gameObject; } private static Transform? FindChildByExactName(Transform root, string name) { string name2 = name; return ((IEnumerable<Transform>)((Component)root).GetComponentsInChildren<Transform>(true)).FirstOrDefault((Func<Transform, bool>)((Transform child) => string.Equals(((Object)child).name, name2, StringComparison.OrdinalIgnoreCase))); } private static Transform? FindChildContaining(Transform root, params string[] fragments) { string[] fragments2 = fragments; return ((IEnumerable<Transform>)((Component)root).GetComponentsInChildren<Transform>(true)).FirstOrDefault((Func<Transform, bool>)((Transform child) => fragments2.All((string fragment) => ((Object)child).name.IndexOf(fragment, StringComparison.OrdinalIgnoreCase) >= 0))); } private static GameObject? FindGameObjectByExactName(Transform root, string name) { Transform? obj = FindChildByExactName(root, name); if (obj == null) { return null; } return ((Component)obj).gameObject; } private static GameObject? FindGameObjectContaining(Transform root, params string[] fragments) { Transform? obj = FindChildContaining(root, fragments); if (obj == null) { return null; } return ((Component)obj).gameObject; } private static T? GetFieldValue<T>(object instance, string fieldName) { return GetFieldValue(instance, fieldName, default(T)); } private static T GetFieldValue<T>(object instance, string fieldName, T fallback) { if (instance == null) { return fallback; } MemberInfo memberInfo = ResolveMember(instance.GetType(), fieldName); object obj = ((memberInfo is FieldInfo fieldInfo) ? fieldInfo.GetValue(instance) : ((!(memberInfo is PropertyInfo propertyInfo) || !propertyInfo.CanRead) ? null : propertyInfo.GetValue(instance))); object obj2 = obj; if (obj2 is T) { return (T)obj2; } if (obj2 == null) { return fallback; } try { return (T)Convert.ChangeType(obj2, typeof(T)); } catch { return fallback; } } private static void SetFieldValue(object instance, string fieldName, object? value) { if (instance == null) { return; } MemberInfo memberInfo = ResolveMember(instance.GetType(), fieldName); if (!(memberInfo is FieldInfo fieldInfo)) { if (memberInfo is PropertyInfo propertyInfo && propertyInfo.CanWrite) { propertyInfo.SetValue(instance, value); } } else { fieldInfo.SetValue(instance, value); } } private static void SetFieldIfNull(object instance, string fieldName, object? value) { if (value != null) { MemberInfo memberInfo = ResolveMember(instance.GetType(), fieldName); object obj = ((memberInfo is FieldInfo fieldInfo) ? fieldInfo.GetValue(instance) : ((!(memberInfo is PropertyInfo propertyInfo) || !propertyInfo.CanRead) ? new object() : propertyInfo.GetValue(instance))); if (obj == null) { SetFieldValue(instance, fieldName, value); } } } private static void TryInvoke(object instance, string methodName, params object[] args) { AccessTools.Method(instance.GetType(), methodName, (Type[])null, (Type[])null)?.Invoke(instance, args); } private static void ApplyHideFlags(Object obj) { //IL_0002: 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_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003f: 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_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) obj.hideFlags = (HideFlags)(obj.hideFlags | 0x23); GameObject val = (GameObject)(object)((obj is GameObject) ? obj : null); if (val == null) { return; } Transform[] componentsInChildren = val.GetComponentsInChildren<Transform>(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<Component>(); foreach (Component val2 in components) { if ((Object)(object)val2 != (Object)null) { ((Object)val2).hideFlags = (HideFlags)(((Object)val2).hideFlags | 0x23); } } } } private static MemberInfo? ResolveMember(Type type, string memberName) { string key = type.AssemblyQualifiedName + "|" + memberName; if (MemberCache.TryGetValue(key, out MemberInfo value)) { return value; } Type type2 = type; while (type2 != null) { FieldInfo field = type2.GetField(memberName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { MemberCache[key] = field; return field; } PropertyInfo property = type2.GetProperty(memberName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (property != null) { MemberCache[key] = property; return property; } type2 = type2.BaseType; } MemberCache[key] = null; return null; } private static bool HasBatteryCompatibility(ItemBattery itemBattery) { if ((Object)(object)GetFieldValue<BatteryVisualLogic>(itemBattery, "batteryVisualLogic") != (Object)null && (Object)(object)GetFieldValue<ItemAttributes>(itemBattery, "itemAttributes") != (Object)null && (Object)(object)GetFieldValue<ItemEquippable>(itemBattery, "itemEquippable") != (Object)null) { return (Object)(object)GetFieldValue<PhysGrabObject>(itemBattery, "physGrabObject") != (Object)null; } return false; } } [HarmonyPatch(typeof(Items), "RegisterItem", new Type[] { typeof(ItemContent) })] internal static class EmpressPlasmaRifleWeaponCompatPatchPluginRegisterItemContentPatch { [HarmonyPrefix] private static void Prefix(ItemContent itemContent) { EmpressPlasmaRifleWeaponCompatPatchPlugin.PrepareRegisteredItem(itemContent); } } [HarmonyPatch(typeof(Items), "RegisterItem", new Type[] { typeof(ItemAttributes) })] internal static class EmpressPlasmaRifleWeaponCompatPatchPluginRegisterItemAttributesPatch { [HarmonyPrefix] private static void Prefix(ItemAttributes itemAttributes) { EmpressPlasmaRifleWeaponCompatPatchPlugin.PrepareRegisteredItem(itemAttributes); } } [HarmonyPatch(typeof(ItemBattery), "Start")] internal static class EmpressPlasmaRifleWeaponCompatPatchPluginItemBatteryStartPatch { [HarmonyPrefix] private static void Prefix(ItemBattery __instance) { EmpressPlasmaRifleWeaponCompatPatchPlugin.PrepareBattery(__instance); } [HarmonyPostfix] private static void Postfix(ItemBattery __instance) { EmpressPlasmaRifleWeaponCompatPatchPlugin.FinishBatteryStart(__instance); } } [HarmonyPatch(typeof(ItemGun), "Start")] internal static class EmpressPlasmaRifleWeaponCompatPatchPluginItemGunStartPatch { [HarmonyPrefix] private static void Prefix(ItemGun __instance) { EmpressPlasmaRifleWeaponCompatPatchPlugin.PrepareGun(__instance); } } [HarmonyPatch(typeof(ItemGun), "ShootRPC")] internal static class EmpressPlasmaRifleWeaponCompatPatchPluginItemGunShootRpcPatch { [HarmonyPostfix] private static void Postfix(ItemGun __instance) { EmpressPlasmaRifleWeaponCompatPatchPlugin.SyncGunBattery(__instance); } } [HarmonyPatch(typeof(ItemBattery), "RemoveFullBar")] internal static class EmpressPlasmaRifleWeaponCompatPatchPluginItemBatteryRemoveFullBarPatch { [HarmonyPostfix] private static void Postfix(ItemBattery __instance) { EmpressPlasmaRifleWeaponCompatPatchPlugin.SyncBattery(__instance); } } [HarmonyPatch(typeof(ItemBattery), "SetBatteryLife")] internal static class EmpressPlasmaRifleWeaponCompatPatchPluginItemBatterySetBatteryLifePatch { [HarmonyPostfix] private static void Postfix(ItemBattery __instance) { EmpressPlasmaRifleWeaponCompatPatchPlugin.SyncBattery(__instance); } } [HarmonyPatch(typeof(ItemBattery), "BatteryFullPercentChangeLogic")] internal static class EmpressPlasmaRifleWeaponCompatPatchPluginItemBatteryFullPercentChangeLogicPatch { [HarmonyPostfix] private static void Postfix(ItemBattery __instance) { EmpressPlasmaRifleWeaponCompatPatchPlugin.SyncBattery(__instance); } } internal sealed class EmpressPlasmaRifleWeaponCompatPatchPluginPlasmaGunRelay : MonoBehaviour { private Component? _plasmaGun; internal void Initialize(Component plasmaGun) { _plasmaGun = plasmaGun; } private Component? ResolvePlasmaGun() { if ((Object)(object)_plasmaGun != (Object)null) { return _plasmaGun; } _plasmaGun = ((IEnumerable<Component>)((Component)this).GetComponents<Component>()).FirstOrDefault((Func<Component, bool>)((Component component) => (Object)(object)component != (Object)null && (Object)(object)component != (Object)(object)this && string.Equals(((object)component).GetType().Name, "ItemPlasmaGun", StringComparison.Ordinal))); return _plasmaGun; } [PunRPC] public void EmpressCompatShootBulletRPC(Vector3 _endPosition, bool _hit, PhotonMessageInfo _info = default(PhotonMessageInfo)) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) EmpressPlasmaRifleWeaponCompatPatchPlugin.HandleCustomPlasmaGunShootBulletRpc(ResolvePlasmaGun(), _endPosition, _hit, _info); } } internal enum EmpressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicatorState { Normal, Low, Empty } internal sealed class EmpressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicator : MonoBehaviour { private RawImage _frame; private RawImage _background; private List<RawImage> _bars; internal int BarCount => _bars?.Count ?? 0; internal void Initialize(RawImage frame, RawImage background, List<RawImage> bars) { _frame = frame; _background = background; _bars = bars; } internal void SetDisplay(int filledBars, EmpressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicatorState state) { //IL_004e: 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_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0032: 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_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: 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_0159: Unknown result type (might be due to invalid IL or missing references) if (_bars != null && _bars.Count != 0) { Color color = (Color)(state switch { EmpressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicatorState.Empty => new Color(1f, 0.18f, 0.18f, 1f), EmpressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicatorState.Low => new Color(1f, 0.82f, 0.2f, 1f), _ => new Color(0.25f, 1f, 0.15f, 1f), }); Color val = (Color)(state switch { EmpressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicatorState.Empty => new Color(1f, 0.18f, 0.18f, 1f), EmpressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicatorState.Low => new Color(1f, 0.82f, 0.2f, 1f), _ => new Color(0.25f, 1f, 0.15f, 1f), }); Color val2 = (Color)(state switch { EmpressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicatorState.Empty => new Color(0.22f, 0.02f, 0.02f, 0.95f), EmpressPlasmaRifleWeaponCompatPatchPluginLegacyAmmoIndicatorState.Low => new Color(0.12f, 0.09f, 0.02f, 0.92f), _ => new Color(0.02f, 0.08f, 0.02f, 0.9f), }); ((Graphic)_frame).color = color; ((Graphic)_background).color = val2; for (int i = 0; i < _bars.Count; i++) { ((Graphic)_bars[i]).color = ((i < filledBars) ? val : val2); } } } } }