using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using ExitGames.Client.Photon; using HarmonyLib; using Microsoft.CodeAnalysis; using REPOLib; using REPOLib.Modules; using REPOLib.Objects.Sdk; using REPOMod.Items; using REPOMod.Patches; using REPOMod.Systems; using REPOMod.UI; using REPOMod.Utils; using TMPro; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.Rendering; 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: IgnoresAccessChecksTo("")] [assembly: AssemblyCompany("MR_QualiwTek")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("REPOModSDK")] [assembly: AssemblyTitle("REPOModSDK")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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] [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] [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 REPOMod { [BepInPlugin("com.repomod.solarpower", "REPO Solar Power", "1.0.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { internal static ManualLogSource Logger; private static Harmony _harmony; private static bool _gameSystemsStarted; private void Awake() { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Expected O, but got Unknown Logger = ((BaseUnityPlugin)this).Logger; Logger.LogInfo((object)"Plugin com.repomod.solarpower is loaded!"); ConfigManager.Initialize(((BaseUnityPlugin)this).Config); LocalizationManager.Initialize(((BaseUnityPlugin)this).Config); _harmony = new Harmony("com.repomod.solarpower"); _harmony.PatchAll(Assembly.GetExecutingAssembly()); EnergySystem.Initialize(); LightDetectionSystem.Initialize(); ModNetworkSync.Initialize(); ItemManager.RegisterItems(); Logger.LogInfo((object)"========================================"); Logger.LogInfo((object)"REPO Solar Power Mod initialized!"); Logger.LogInfo((object)"Developed by MR_QualiwTek TTV!"); Logger.LogInfo((object)"Special thanks to Damlis (:"); Logger.LogInfo((object)"Made with Love"); Logger.LogInfo((object)("Language: " + LocalizationManager.GetCurrentLanguage())); Logger.LogInfo((object)$"Clock format: {ConfigManager.ClockFormat.Value}-hour"); Logger.LogInfo((object)$"Generator capacity: {ConfigManager.GeneratorCapacity.Value}"); Logger.LogInfo((object)$"Generator efficiency: {ConfigManager.GeneratorEfficiency.Value:P0}"); Logger.LogInfo((object)"========================================"); } private void OnDestroy() { if (_harmony != null) { _harmony.UnpatchSelf(); Logger.LogInfo((object)"Harmony patches unloaded."); } DayNightCycle.Dispose(); EnergySystem.Dispose(); WeatherSystem.Dispose(); ModNetworkSync.Dispose(); } private void Update() { try { bool isRestrictedMap = MapHelper.IsRestrictedMap; if (isRestrictedMap && _gameSystemsStarted) { _gameSystemsStarted = false; DayNightCycle.Dispose(); WeatherSystem.Dispose(); } else if (!isRestrictedMap && !_gameSystemsStarted) { _gameSystemsStarted = true; DayNightCycle.Initialize(); WeatherSystem.Initialize(); } } catch { } DayNightCycle.Update(); EnergySystem.Update(); LightDetectionSystem.Update(); WeatherSystem.Update(); ModNetworkSync.Update(); EnemyAIPatch.Update(); PlayerPatches.Tick(); DebugSpawnMenu.Update(); } private void OnGUI() { DebugSpawnMenu.OnGUI(); WeatherClockUI.OnGUI(); } } public static class PluginInfo { public const string PLUGIN_GUID = "com.repomod.solarpower"; public const string PLUGIN_NAME = "REPO Solar Power"; public const string PLUGIN_VERSION = "1.0.1"; } } namespace REPOMod.Utils { public static class ConfigManager { private const int MIN_CAPACITY = 25; private const int MAX_CAPACITY = 5000; private const float MIN_EFFICIENCY = 0.1f; private const float MAX_EFFICIENCY = 10f; private const float MIN_CHARGE_RATE = 0f; private const float MAX_CHARGE_RATE = 100f; private const float MIN_VOLUME = 0f; private const float MAX_VOLUME = 1f; private const float MIN_TIME_SPEED = 0.1f; private const float MAX_TIME_SPEED = 10f; private static readonly HashSet _validLanguages = new HashSet { "English", "Turkish" }; public static ConfigEntry EnableDebugMode { get; private set; } public static ConfigEntry Language { get; private set; } public static ConfigEntry ClockFormat { get; private set; } public static ConfigEntry TimeSpeedMultiplier { get; private set; } public static ConfigEntry SunriseHour { get; private set; } public static ConfigEntry SunsetHour { get; private set; } public static ConfigEntry GeneratorCapacity { get; private set; } public static ConfigEntry GeneratorEfficiency { get; private set; } public static ConfigEntry SolarPanelChargeRate { get; private set; } public static ConfigEntry SolarChargeMultiplier { get; private set; } public static ConfigEntry OrbEnergyPerOrb { get; private set; } public static ConfigEntry ConnectSoundVolume { get; private set; } public static ConfigEntry DisconnectSoundVolume { get; private set; } public static ConfigEntry MapArctic { get; private set; } public static ConfigEntry MapManor { get; private set; } public static ConfigEntry MapMuseum { get; private set; } public static ConfigEntry MapWizard { get; private set; } public static ConfigEntry MapDefault { get; private set; } public static ConfigEntry EnableWeather { get; private set; } public static ConfigEntry WeatherChangeIntervalMinutes { get; private set; } public static ConfigEntry WeatherSunnyMultiplier { get; private set; } public static ConfigEntry WeatherCloudyMultiplier { get; private set; } public static ConfigEntry WeatherFoggyMultiplier { get; private set; } public static ConfigEntry WeatherRainyMultiplier { get; private set; } public static ConfigEntry WeatherStormyMultiplier { get; private set; } public static ConfigEntry WeatherSnowyMultiplier { get; private set; } public static ConfigEntry EnableWeatherVisuals { get; private set; } public static ConfigEntry EnableWeatherSounds { get; private set; } public static ConfigEntry WeatherSoundVolume { get; private set; } public static ConfigEntry EnableClockWeatherHUD { get; private set; } public static void Initialize(ConfigFile config) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Expected O, but got Unknown //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Expected O, but got Unknown //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Expected O, but got Unknown //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Expected O, but got Unknown //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Expected O, but got Unknown //IL_0231: Unknown result type (might be due to invalid IL or missing references) //IL_023b: Expected O, but got Unknown //IL_025b: Unknown result type (might be due to invalid IL or missing references) //IL_0265: Expected O, but got Unknown //IL_0285: Unknown result type (might be due to invalid IL or missing references) //IL_028f: Expected O, but got Unknown //IL_02af: Unknown result type (might be due to invalid IL or missing references) //IL_02b9: Expected O, but got Unknown //IL_02d9: Unknown result type (might be due to invalid IL or missing references) //IL_02e3: Expected O, but got Unknown //IL_032c: Unknown result type (might be due to invalid IL or missing references) //IL_0336: Expected O, but got Unknown //IL_0366: Unknown result type (might be due to invalid IL or missing references) //IL_0370: Expected O, but got Unknown //IL_0390: Unknown result type (might be due to invalid IL or missing references) //IL_039a: Expected O, but got Unknown //IL_03ba: Unknown result type (might be due to invalid IL or missing references) //IL_03c4: Expected O, but got Unknown //IL_03e4: Unknown result type (might be due to invalid IL or missing references) //IL_03ee: Expected O, but got Unknown //IL_040e: Unknown result type (might be due to invalid IL or missing references) //IL_0418: Expected O, but got Unknown //IL_0438: Unknown result type (might be due to invalid IL or missing references) //IL_0442: Expected O, but got Unknown //IL_04a6: Unknown result type (might be due to invalid IL or missing references) //IL_04b0: Expected O, but got Unknown EnableDebugMode = config.Bind("General", "EnableDebugMode", false, "Enable debug logging for the mod."); Language = config.Bind("General", "Language", "English", new ConfigDescription("Mod language.", (AcceptableValueBase)(object)new AcceptableValueList(new string[2] { "English", "Turkish" }), Array.Empty())); ClockFormat = config.Bind("Time", "ClockFormat", 24, new ConfigDescription("Clock display format: 12-hour (AM/PM) or 24-hour.", (AcceptableValueBase)(object)new AcceptableValueList(new int[2] { 12, 24 }), Array.Empty())); TimeSpeedMultiplier = config.Bind("Time", "TimeSpeedMultiplier", 1f, "Multiplier for how fast time passes. Range: 0.1-10.0"); SunriseHour = config.Bind("Time", "SunriseHour", 8, new ConfigDescription("Hour when sunrise begins (solar panels start charging). Max: 24.", (AcceptableValueBase)(object)new AcceptableValueRange(0, 24), Array.Empty())); SunsetHour = config.Bind("Time", "SunsetHour", 18, new ConfigDescription("Hour when sunset ends (solar panels stop charging). Max: 24.", (AcceptableValueBase)(object)new AcceptableValueRange(0, 24), Array.Empty())); GeneratorCapacity = config.Bind("Generator", "GeneratorCapacity", 500, "Maximum crystal energy capacity. Range: 25-5000."); GeneratorEfficiency = config.Bind("Generator", "GeneratorEfficiency", 2f, "Energy efficiency multiplier when charging from ship. Range: 0.1-10.0"); SolarPanelChargeRate = config.Bind("SolarPanel", "SolarPanelChargeRate", 5f, "Base charge rate per second. Range: 0-100."); SolarChargeMultiplier = config.Bind("SolarPanel", "SolarChargeMultiplier", 1f, "Multiplier for solar charge rate based on light intensity."); OrbEnergyPerOrb = config.Bind("OrbFuel", "OrbEnergyPerOrb", 5f, new ConfigDescription("Energy gained per orb (flat, regardless of orb value).", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 100f), Array.Empty())); ConnectSoundVolume = config.Bind("Audio", "ConnectSoundVolume", 1f, "Volume for cable connect sound. Range: 0.0-1.0."); DisconnectSoundVolume = config.Bind("Audio", "DisconnectSoundVolume", 1f, "Volume for cable disconnect sound. Range: 0.0-1.0."); AcceptableValueRange val = new AcceptableValueRange(0f, 2f); MapArctic = config.Bind("Maps", "Arctic", 1.2f, new ConfigDescription("Solar light multiplier for Arctic (McJannek Station). Snow reflection boosts light.", (AcceptableValueBase)(object)val, Array.Empty())); MapManor = config.Bind("Maps", "Manor", 0.8f, new ConfigDescription("Solar light multiplier for Headman Manor (indoor mansion, less sunlight).", (AcceptableValueBase)(object)val, Array.Empty())); MapMuseum = config.Bind("Maps", "Museum", 0.7f, new ConfigDescription("Solar light multiplier for the Museum (mostly indoors).", (AcceptableValueBase)(object)val, Array.Empty())); MapWizard = config.Bind("Maps", "Wizard", 0.9f, new ConfigDescription("Solar light multiplier for Wizard (Swiftbroom Academy).", (AcceptableValueBase)(object)val, Array.Empty())); MapDefault = config.Bind("Maps", "Default", 1f, new ConfigDescription("Solar light multiplier for any other map.", (AcceptableValueBase)(object)val, Array.Empty())); EnableWeather = config.Bind("Weather", "EnableWeather", true, "Enable the dynamic weather system (affects solar panel efficiency)."); WeatherChangeIntervalMinutes = config.Bind("Weather", "WeatherChangeIntervalMinutes", 5f, new ConfigDescription("How often the weather changes (in real minutes).", (AcceptableValueBase)(object)new AcceptableValueRange(1f, 60f), Array.Empty())); AcceptableValueRange val2 = new AcceptableValueRange(0f, 2f); WeatherSunnyMultiplier = config.Bind("Weather", "SunnyEfficiency", 1f, new ConfigDescription("Solar efficiency multiplier during sunny weather.", (AcceptableValueBase)(object)val2, Array.Empty())); WeatherCloudyMultiplier = config.Bind("Weather", "CloudyEfficiency", 0.7f, new ConfigDescription("Solar efficiency multiplier during cloudy weather.", (AcceptableValueBase)(object)val2, Array.Empty())); WeatherFoggyMultiplier = config.Bind("Weather", "FoggyEfficiency", 0.5f, new ConfigDescription("Solar efficiency multiplier during foggy weather.", (AcceptableValueBase)(object)val2, Array.Empty())); WeatherRainyMultiplier = config.Bind("Weather", "RainyEfficiency", 0.35f, new ConfigDescription("Solar efficiency multiplier during rainy weather.", (AcceptableValueBase)(object)val2, Array.Empty())); WeatherStormyMultiplier = config.Bind("Weather", "StormyEfficiency", 0.15f, new ConfigDescription("Solar efficiency multiplier during stormy weather.", (AcceptableValueBase)(object)val2, Array.Empty())); WeatherSnowyMultiplier = config.Bind("Weather", "SnowyEfficiency", 0.4f, new ConfigDescription("Solar efficiency multiplier during snowy weather (snow reflects some light).", (AcceptableValueBase)(object)val2, Array.Empty())); EnableWeatherVisuals = config.Bind("Weather", "EnableWeatherVisuals", true, "Show visual weather effects (fog, darkness, rain particles, lightning)."); EnableWeatherSounds = config.Bind("Weather", "EnableWeatherSounds", true, "Play weather sound effects (rain, thunder)."); WeatherSoundVolume = config.Bind("Weather", "WeatherSoundVolume", 0.5f, new ConfigDescription("Volume of weather sound effects.", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 1f), Array.Empty())); EnableClockWeatherHUD = config.Bind("HUD", "EnableClockWeatherHUD", true, "Show the clock + weather HUD at the top-center of the screen (hidden in Lobby/Arena/Shop)."); ValidateConfig(); Plugin.Logger.LogInfo((object)"Configuration loaded and validated."); } public static float GetMapLightMultiplier(string mapName) { if (string.IsNullOrEmpty(mapName)) { return MapDefault.Value; } string text = mapName.ToLowerInvariant().Replace(" ", "").Replace("-", ""); if (text.Contains("arctic")) { return MapArctic.Value; } if (text.Contains("manor")) { return MapManor.Value; } if (text.Contains("museum")) { return MapMuseum.Value; } if (text.Contains("wizard")) { return MapWizard.Value; } if (text.Contains("lobby") || text.Contains("arena") || text.Contains("shop")) { return 0f; } return MapDefault.Value; } private static void ValidateConfig() { string value = Language.Value; if (!_validLanguages.Contains(value)) { Plugin.Logger.LogWarning((object)("Invalid language: " + value + ". Setting to English.")); Language.Value = "English"; } if (ClockFormat.Value != 12 && ClockFormat.Value != 24) { Plugin.Logger.LogWarning((object)$"Invalid ClockFormat: {ClockFormat.Value}. Setting to 24."); ClockFormat.Value = 24; } TimeSpeedMultiplier.Value = ClampValue(TimeSpeedMultiplier.Value, 0.1f, 10f, "TimeSpeedMultiplier"); GeneratorCapacity.Value = ClampValue(GeneratorCapacity.Value, 25, 5000, "GeneratorCapacity"); GeneratorEfficiency.Value = ClampValue(GeneratorEfficiency.Value, 0.1f, 10f, "GeneratorEfficiency"); SolarPanelChargeRate.Value = ClampValue(SolarPanelChargeRate.Value, 0f, 100f, "SolarPanelChargeRate"); ConnectSoundVolume.Value = ClampValue(ConnectSoundVolume.Value, 0f, 1f, "ConnectSoundVolume"); DisconnectSoundVolume.Value = ClampValue(DisconnectSoundVolume.Value, 0f, 1f, "DisconnectSoundVolume"); ValidateSunriseSunset(); } private static void ValidateSunriseSunset() { if (SunriseHour.Value < 0 || SunriseHour.Value >= 24) { Plugin.Logger.LogWarning((object)$"Invalid SunriseHour: {SunriseHour.Value}. Setting to 8."); SunriseHour.Value = 8; } if (SunsetHour.Value <= SunriseHour.Value || SunsetHour.Value > 24) { Plugin.Logger.LogWarning((object)$"Invalid SunsetHour: {SunsetHour.Value}. Setting to 18."); SunsetHour.Value = 18; } } private static T ClampValue(T value, T min, T max, string name) where T : IComparable { if (value.CompareTo(min) < 0) { Plugin.Logger.LogWarning((object)$"{name} value {value} is below minimum {min}. Clamping."); return min; } if (value.CompareTo(max) > 0) { Plugin.Logger.LogWarning((object)$"{name} value {value} is above maximum {max}. Clamping."); return max; } return value; } } public static class LocalizationManager { private static ConfigEntry _languageConfig; private static readonly Dictionary> _translations = new Dictionary> { ["item_solar_panel"] = new Dictionary { ["English"] = "Solar Panel", ["Turkish"] = "Güneş Paneli" }, ["item_generator"] = new Dictionary { ["English"] = "Generator", ["Turkish"] = "Jeneratör" }, ["item_cable"] = new Dictionary { ["English"] = "Cable", ["Turkish"] = "Kablo" }, ["desc_solar_panel"] = new Dictionary { ["English"] = "Generates energy from sunlight. Connect to a generator with a cable.", ["Turkish"] = "Güneş ışığından enerji üretir. Kablo ile jeneratöre bağlayın." }, ["desc_generator"] = new Dictionary { ["English"] = "Stores crystal energy. Can be charged from ship or solar panels.", ["Turkish"] = "Kristal enerjisini depolar. Gemi veya güneş panelinden şarj edilebilir." }, ["desc_cable"] = new Dictionary { ["English"] = "Connects solar panels to generators.", ["Turkish"] = "Güneş panellerini jeneratöre bağlar." }, ["msg_connect_cable"] = new Dictionary { ["English"] = "Press E to connect cable", ["Turkish"] = "Kabloyu bağlamak için E tuşuna basın" }, ["msg_disconnect_cable"] = new Dictionary { ["English"] = "Press E to disconnect cable", ["Turkish"] = "Kabloyu çıkarmak için E tuşuna basın" }, ["msg_cable_connected"] = new Dictionary { ["English"] = "Cable connected!", ["Turkish"] = "Kablo bağlandı!" }, ["msg_cable_disconnected"] = new Dictionary { ["English"] = "Cable disconnected!", ["Turkish"] = "Kablo çıkarıldı!" }, ["msg_generator_full"] = new Dictionary { ["English"] = "Generator is full!", ["Turkish"] = "Jeneratör dolu!" }, ["msg_night_time"] = new Dictionary { ["English"] = "Solar panels don't work at night.", ["Turkish"] = "Güneş panelleri gece çalışmaz." }, ["msg_use_orb"] = new Dictionary { ["English"] = "Press E to use orb as fuel", ["Turkish"] = "Küreyi yakıt olarak kullanmak için E tuşuna basın" }, ["msg_orb_used"] = new Dictionary { ["English"] = "Orb used! Energy gained: {0}", ["Turkish"] = "Küre kullanıldı! Kazanılan enerji: {0}" }, ["msg_cable_too_far"] = new Dictionary { ["English"] = "Solar panel is too far! Max distance: 3 meters", ["Turkish"] = "Güneş paneli çok uzak! Mesafe: 3 metre" }, ["msg_cable_jammed"] = new Dictionary { ["English"] = "Cable is jammed! Try again.", ["Turkish"] = "Kablo takıldı! Tekrar deneyin." }, ["ui_energy"] = new Dictionary { ["English"] = "Energy", ["Turkish"] = "Enerji" }, ["ui_capacity"] = new Dictionary { ["English"] = "Capacity", ["Turkish"] = "Kapasite" }, ["ui_efficiency"] = new Dictionary { ["English"] = "Efficiency", ["Turkish"] = "Verimlilik" }, ["ui_time"] = new Dictionary { ["English"] = "Time", ["Turkish"] = "Saat" }, ["ui_day"] = new Dictionary { ["English"] = "Day", ["Turkish"] = "Gündüz" }, ["ui_night"] = new Dictionary { ["English"] = "Night", ["Turkish"] = "Gece" }, ["ui_charging"] = new Dictionary { ["English"] = "Charging", ["Turkish"] = "Şarj Oluyor" }, ["ui_not_charging"] = new Dictionary { ["English"] = "Not Charging", ["Turkish"] = "Şarj Olmuyor" }, ["ui_connected"] = new Dictionary { ["English"] = "Connected", ["Turkish"] = "Bağlı" }, ["ui_disconnected"] = new Dictionary { ["English"] = "Disconnected", ["Turkish"] = "Bağlı Değil" }, ["config_language"] = new Dictionary { ["English"] = "Language", ["Turkish"] = "Dil" }, ["weather_sunny"] = new Dictionary { ["English"] = "Sunny", ["Turkish"] = "Güneşli" }, ["weather_cloudy"] = new Dictionary { ["English"] = "Cloudy", ["Turkish"] = "Bulutlu" }, ["weather_foggy"] = new Dictionary { ["English"] = "Foggy", ["Turkish"] = "Sisli" }, ["weather_rainy"] = new Dictionary { ["English"] = "Rainy", ["Turkish"] = "Yağmurlu" }, ["weather_stormy"] = new Dictionary { ["English"] = "Stormy", ["Turkish"] = "Fırtınalı" }, ["weather_snowy"] = new Dictionary { ["English"] = "Snowy", ["Turkish"] = "Karlı" } }; private static readonly HashSet _validLanguages = new HashSet { "English", "Turkish" }; public static void Initialize(ConfigFile config) { _languageConfig = ConfigManager.Language; ValidateLanguage(); } private static void ValidateLanguage() { string value = _languageConfig.Value; if (!_validLanguages.Contains(value)) { Plugin.Logger.LogWarning((object)("Invalid language: " + value + ". Setting to English.")); _languageConfig.Value = "English"; } } public static string Get(string key) { if (_translations.TryGetValue(key, out Dictionary value)) { string currentLanguage = GetCurrentLanguage(); if (value.TryGetValue(currentLanguage, out var value2)) { return value2; } if (value.TryGetValue("English", out var value3)) { return value3; } } return "[" + key + "]"; } public static string Get(string key, params object[] args) { string text = Get(key); try { return string.Format(text, args); } catch { return text; } } public static string GetCurrentLanguage() { string text = _languageConfig?.Value ?? "English"; if (!_validLanguages.Contains(text)) { return "English"; } return text; } public static void SetLanguage(string language) { if (_validLanguages.Contains(language)) { _languageConfig.Value = language; } else { Plugin.Logger.LogWarning((object)("Attempted to set invalid language: " + language)); } } public static IEnumerable GetAvailableLanguages() { return _validLanguages; } } public static class MapHelper { public static bool IsRestrictedMap { get { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) Scene activeScene = SceneManager.GetActiveScene(); string name = ((Scene)(ref activeScene)).name; if (string.IsNullOrEmpty(name)) { return true; } string text = name.ToLowerInvariant(); if (text.Contains("menu") || text.Contains("lobby") || text.Contains("shop") || text.Contains("arena")) { return true; } try { return SemiFunc.RunIsLobby() || SemiFunc.RunIsLobbyMenu() || SemiFunc.RunIsShop() || SemiFunc.RunIsArena(); } catch { return true; } } } public static bool SolarChargingAllowed => !IsRestrictedMap; } } namespace REPOMod.UI { public class BatteryUI : MonoBehaviour { [Header("UI Settings")] [SerializeField] private float displayDistance = 2f; [Header("UI Elements")] [SerializeField] private GameObject uiPanel; [SerializeField] private TextMeshProUGUI chargeText; [SerializeField] private Slider chargeSlider; [Header("Colors")] [SerializeField] private Color highColor = Color.green; [SerializeField] private Color mediumColor = Color.yellow; [SerializeField] private Color lowColor = Color.red; private BatteryPack _battery; private Transform _playerCamera; public static BatteryUI Instance { get; private set; } private void Awake() { Instance = this; CreateUI(); } private void CreateUI() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_0036: 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_0050: Expected O, but got Unknown //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Expected O, but got Unknown //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0124: 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_0170: Unknown result type (might be due to invalid IL or missing references) //IL_0177: Expected O, but got Unknown //IL_01a3: 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_01cf: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("BatteryUI_Canvas"); Canvas val2 = val.AddComponent(); val2.renderMode = (RenderMode)2; val2.worldCamera = Camera.main; RectTransform component = val.GetComponent(); component.sizeDelta = new Vector2(2f, 0.4f); uiPanel = new GameObject("Panel"); uiPanel.transform.SetParent(val.transform); RectTransform val3 = uiPanel.AddComponent(); val3.anchorMin = Vector2.zero; val3.anchorMax = Vector2.one; val3.sizeDelta = Vector2.zero; Image val4 = uiPanel.AddComponent(); ((Graphic)val4).color = new Color(0f, 0f, 0f, 0.7f); GameObject val5 = new GameObject("ChargeText"); val5.transform.SetParent(uiPanel.transform); RectTransform val6 = val5.AddComponent(); val6.anchorMin = new Vector2(0f, 0.5f); val6.anchorMax = new Vector2(1f, 1f); val6.sizeDelta = new Vector2(-10f, 0f); chargeText = val5.AddComponent(); ((TMP_Text)chargeText).fontSize = 20f; ((TMP_Text)chargeText).alignment = (TextAlignmentOptions)514; ((Graphic)chargeText).color = Color.white; GameObject val7 = new GameObject("ChargeSlider"); val7.transform.SetParent(uiPanel.transform); RectTransform val8 = val7.AddComponent(); val8.anchorMin = new Vector2(0f, 0f); val8.anchorMax = new Vector2(1f, 0.5f); val8.sizeDelta = new Vector2(-10f, 0f); chargeSlider = val7.AddComponent(); val.SetActive(false); } private void Start() { Camera main = Camera.main; _playerCamera = ((main != null) ? ((Component)main).transform : null); } private void Update() { if (!((Object)(object)_playerCamera == (Object)null)) { CheckForBattery(); } } private void CheckForBattery() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006b: 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_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) BatteryPack[] array = Object.FindObjectsOfType(); BatteryPack batteryPack = null; float num = float.MaxValue; BatteryPack[] array2 = array; foreach (BatteryPack batteryPack2 in array2) { float num2 = Vector3.Distance(_playerCamera.position, ((Component)batteryPack2).transform.position); if (num2 < displayDistance && num2 < num) { Vector3 val = ((Component)batteryPack2).transform.position - _playerCamera.position; Vector3 normalized = ((Vector3)(ref val)).normalized; float num3 = Vector3.Dot(_playerCamera.forward, normalized); if (num3 > 0.5f) { num = num2; batteryPack = batteryPack2; } } } if ((Object)(object)batteryPack != (Object)null) { ShowUI(batteryPack); } else { HideUI(); } } private void ShowUI(BatteryPack battery) { //IL_003f: 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_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) _battery = battery; if (!uiPanel.activeSelf) { uiPanel.SetActive(true); } if ((Object)(object)_battery != (Object)null) { ((Component)this).transform.position = ((Component)_battery).transform.position + Vector3.up * 0.8f; ((Component)this).transform.LookAt(_playerCamera); ((Component)this).transform.Rotate(0f, 180f, 0f); } UpdateDisplay(); } private void HideUI() { _battery = null; if (uiPanel.activeSelf) { uiPanel.SetActive(false); } } private void UpdateDisplay() { //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: 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) if (!((Object)(object)_battery == (Object)null)) { float currentEnergy = _battery.CurrentEnergy; float maxCapacity = _battery.MaxCapacity; float energyPercentage = _battery.EnergyPercentage; string text = ""; if (_battery.IsInSolarSlot) { text = " (Charging)"; } else if (_battery.IsConnectedToGenerator) { text = " (Discharging)"; } ((TMP_Text)chargeText).text = $"[Battery: {(int)currentEnergy}/{(int)maxCapacity} Crystal | {energyPercentage:P0}]{text}"; chargeSlider.value = energyPercentage; if (energyPercentage > 0.5f) { ((Graphic)chargeText).color = highColor; } else if (energyPercentage > 0.25f) { ((Graphic)chargeText).color = mediumColor; } else { ((Graphic)chargeText).color = lowColor; } } } private void OnDestroy() { if ((Object)(object)Instance == (Object)(object)this) { Instance = null; } } } public static class DebugSpawnMenu { [CompilerGenerated] private static class <>O { public static WindowFunction <0>__DrawWindow; } private static bool _isOpen; private static bool _showAllItems; private static Vector2 _scrollPos; private static Rect _windowRect = new Rect(60f, 60f, 360f, 480f); private static string _statusMessage = ""; private static float _statusClearTime; private const int WINDOW_ID = 331433; public static void Update() { if (!ConfigManager.EnableDebugMode.Value) { if (_isOpen) { Close(); } return; } if (WasF11PressedThisFrame()) { if (_isOpen) { Close(); } else { Open(); } } if (_isOpen) { Cursor.lockState = (CursorLockMode)0; Cursor.visible = true; } } private static void Open() { _isOpen = true; _statusMessage = ""; } private static void Close() { _isOpen = false; Cursor.lockState = (CursorLockMode)1; Cursor.visible = false; } private static bool WasF11PressedThisFrame() { try { return Input.GetKeyDown((KeyCode)292); } catch (InvalidOperationException) { Keyboard current = Keyboard.current; return current != null && ((ButtonControl)current.f11Key).wasPressedThisFrame; } } public static void OnGUI() { //IL_0019: 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) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_002e: 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_0039: Expected O, but got Unknown if (_isOpen && ConfigManager.EnableDebugMode.Value) { Rect windowRect = _windowRect; object obj = <>O.<0>__DrawWindow; if (obj == null) { WindowFunction val = DrawWindow; <>O.<0>__DrawWindow = val; obj = (object)val; } _windowRect = GUILayout.Window(331433, windowRect, (WindowFunction)obj, "Solar Power - Item Spawner [F11]", Array.Empty()); } } private static void DrawWindow(int windowId) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0536: Unknown result type (might be due to invalid IL or missing references) //IL_054e: Unknown result type (might be due to invalid IL or missing references) //IL_0553: Unknown result type (might be due to invalid IL or missing references) //IL_060b: Unknown result type (might be due to invalid IL or missing references) GUILayout.BeginVertical(Array.Empty()); if (!ModNetworkSync.IsHost) { GUI.color = Color.yellow; GUILayout.Label("! Only the HOST can spawn items / change weather !", Array.Empty()); GUI.color = Color.white; } GUILayout.Label("Current Weather: " + WeatherSystem.GetWeatherName(), Array.Empty()); if (ModNetworkSync.IsHost) { GUILayout.BeginHorizontal(Array.Empty()); if (GUILayout.Button("Sunny", Array.Empty())) { TrySetWeather(WeatherType.Sunny); } if (GUILayout.Button("Cloudy", Array.Empty())) { TrySetWeather(WeatherType.Cloudy); } if (GUILayout.Button("Foggy", Array.Empty())) { TrySetWeather(WeatherType.Foggy); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(Array.Empty()); if (GUILayout.Button("Rainy", Array.Empty())) { TrySetWeather(WeatherType.Rainy); } if (GUILayout.Button("Stormy", Array.Empty())) { TrySetWeather(WeatherType.Stormy); } if (GUILayout.Button("Snowy", Array.Empty())) { TrySetWeather(WeatherType.Snowy); } GUILayout.EndHorizontal(); } GUILayout.Space(5f); Generator[] array = Object.FindObjectsOfType(); if (array != null && array.Length != 0 && ModNetworkSync.IsHost) { GUILayout.Space(5f); GUILayout.Label($"--- Generator Energy ({array.Length} active) ---", Array.Empty()); Generator[] array2 = array; foreach (Generator generator in array2) { if ((Object)(object)generator == (Object)null) { continue; } float currentEnergy = generator.CurrentEnergy; float maxEnergy = generator.MaxEnergy; float num = Mathf.Max(1f, maxEnergy * 0.1f); GUILayout.Label($"ID {generator.InstanceId}: {currentEnergy:F0} / {maxEnergy:F0}", Array.Empty()); GUILayout.BeginHorizontal(Array.Empty()); if (GUILayout.Button($"+{num:F0}", Array.Empty())) { EnergySystem.AddEnergy(generator.InstanceId, num); SetStatus($"Added {num:F0} energy to Generator {generator.InstanceId}"); } if (GUILayout.Button($"-{num:F0}", Array.Empty())) { float num2 = Mathf.Min(num, currentEnergy); if (num2 > 0f) { EnergySystem.ConsumeEnergy(generator.InstanceId, num2); SetStatus($"Removed {num2:F0} energy from Generator {generator.InstanceId}"); } else { SetStatus("Generator already empty."); } } if (GUILayout.Button("Fill", Array.Empty())) { EnergySystem.AddEnergy(generator.InstanceId, maxEnergy - currentEnergy); SetStatus($"Generator {generator.InstanceId} filled."); } if (GUILayout.Button("Empty", Array.Empty())) { EnergySystem.ConsumeEnergy(generator.InstanceId, currentEnergy); SetStatus($"Generator {generator.InstanceId} emptied."); } GUILayout.EndHorizontal(); } GUILayout.Space(5f); } SolarPanel[] array3 = Object.FindObjectsOfType(); if (array3 != null && array3.Length != 0 && ModNetworkSync.IsHost) { GUILayout.Label($"--- Solar Panel Storage ({array3.Length} active) ---", Array.Empty()); SolarPanel[] array4 = array3; foreach (SolarPanel solarPanel in array4) { if (!((Object)(object)solarPanel == (Object)null)) { GUILayout.Label($"ID {solarPanel.InstanceId}: {solarPanel.StoredEnergy:F0} / {30f:F0}", Array.Empty()); GUILayout.BeginHorizontal(Array.Empty()); if (GUILayout.Button("+5", Array.Empty())) { solarPanel.AddStoredEnergy(5f); SetStatus($"Added 5 energy to Solar Panel {solarPanel.InstanceId}"); } if (GUILayout.Button("-5", Array.Empty())) { solarPanel.AddStoredEnergy(-5f); SetStatus($"Removed 5 energy from Solar Panel {solarPanel.InstanceId}"); } if (GUILayout.Button("Fill", Array.Empty())) { solarPanel.AddStoredEnergy(30f); SetStatus($"Solar Panel {solarPanel.InstanceId} filled."); } if (GUILayout.Button("Empty", Array.Empty())) { solarPanel.AddStoredEnergy(-30f); SetStatus($"Solar Panel {solarPanel.InstanceId} emptied."); } GUILayout.EndHorizontal(); } } GUILayout.Space(5f); } _showAllItems = GUILayout.Toggle(_showAllItems, " Show ALL game items", Array.Empty()); GUILayout.Space(5f); IReadOnlyList readOnlyList = (_showAllItems ? Items.AllItems : Items.RegisteredItems); if (readOnlyList == null || readOnlyList.Count == 0) { GUILayout.Label(_showAllItems ? "No items found (not in a game yet?)" : "No mod items registered.", Array.Empty()); } else { GUILayout.Label($"Items ({readOnlyList.Count}):", Array.Empty()); _scrollPos = GUILayout.BeginScrollView(_scrollPos, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(330f) }); foreach (Item item in readOnlyList) { if (!((Object)(object)item == (Object)null) && GUILayout.Button(item.itemName, Array.Empty())) { TrySpawnItem(item); } } GUILayout.EndScrollView(); } if (!string.IsNullOrEmpty(_statusMessage) && Time.time < _statusClearTime) { GUILayout.Label(_statusMessage, Array.Empty()); } GUILayout.Space(5f); if (GUILayout.Button("Close (F11)", Array.Empty())) { Close(); } GUILayout.EndVertical(); GUI.DragWindow(new Rect(0f, 0f, 10000f, 20f)); } private static void TrySpawnItem(Item item) { //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_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) if (!ModNetworkSync.IsHost) { SetStatus("Failed: only the host can spawn items."); return; } Camera main = Camera.main; if ((Object)(object)main == (Object)null) { SetStatus("Failed: no camera found (are you in a game?)"); return; } Vector3 val = ((Component)main).transform.position + ((Component)main).transform.forward * 2f + Vector3.up * 0.5f; GameObject val2 = Items.SpawnItem(item, val, Quaternion.identity); if ((Object)(object)val2 != (Object)null) { SetStatus("Spawned: " + item.itemName); Plugin.Logger.LogInfo((object)$"[DebugSpawnMenu] Spawned {item.itemName} at {val}"); } else { SetStatus("Failed to spawn: " + item.itemName + " (check log)"); } } private static void TrySetWeather(WeatherType weather) { if (!ModNetworkSync.IsHost) { SetStatus("Failed: only the host can change weather."); return; } WeatherSystem.SetWeather(weather); ModNetworkSync.BroadcastState(); SetStatus("Weather set to: " + WeatherSystem.GetWeatherName()); } private static void SetStatus(string message) { _statusMessage = message; _statusClearTime = Time.time + 5f; } } public class GeneratorUI : MonoBehaviour { [Header("UI Settings")] [SerializeField] private float displayDistance = 3f; [SerializeField] private float updateInterval = 0.1f; [Header("UI Elements")] [SerializeField] private GameObject uiPanel; [SerializeField] private TextMeshProUGUI energyText; [SerializeField] private Slider energySlider; [SerializeField] private Image chargingIcon; [Header("Colors")] [SerializeField] private Color lowEnergyColor = Color.red; [SerializeField] private Color mediumEnergyColor = Color.yellow; [SerializeField] private Color highEnergyColor = Color.green; [SerializeField] private Color chargingColor = Color.cyan; private Generator _generator; private Transform _playerCamera; private float _updateTimer; private bool _isVisible; public static GeneratorUI Instance { get; private set; } private void Awake() { Instance = this; CreateUI(); } private void CreateUI() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_0036: 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_0050: Expected O, but got Unknown //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Expected O, but got Unknown //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_0177: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Expected O, but got Unknown //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: Unknown result type (might be due to invalid IL or missing references) //IL_01e5: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Unknown result type (might be due to invalid IL or missing references) //IL_021e: Expected O, but got Unknown //IL_024a: Unknown result type (might be due to invalid IL or missing references) //IL_0260: Unknown result type (might be due to invalid IL or missing references) //IL_0276: Unknown result type (might be due to invalid IL or missing references) //IL_028c: Unknown result type (might be due to invalid IL or missing references) //IL_02aa: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("GeneratorUI_Canvas"); Canvas val2 = val.AddComponent(); val2.renderMode = (RenderMode)2; val2.worldCamera = Camera.main; RectTransform component = val.GetComponent(); component.sizeDelta = new Vector2(2f, 0.5f); uiPanel = new GameObject("Panel"); uiPanel.transform.SetParent(val.transform); RectTransform val3 = uiPanel.AddComponent(); val3.anchorMin = Vector2.zero; val3.anchorMax = Vector2.one; val3.sizeDelta = Vector2.zero; Image val4 = uiPanel.AddComponent(); ((Graphic)val4).color = new Color(0f, 0f, 0f, 0.7f); GameObject val5 = new GameObject("EnergyText"); val5.transform.SetParent(uiPanel.transform); RectTransform val6 = val5.AddComponent(); val6.anchorMin = new Vector2(0f, 0.5f); val6.anchorMax = new Vector2(1f, 1f); val6.sizeDelta = new Vector2(-20f, 0f); val6.anchoredPosition = new Vector2(0f, 0f); energyText = val5.AddComponent(); ((TMP_Text)energyText).fontSize = 24f; ((TMP_Text)energyText).alignment = (TextAlignmentOptions)514; ((Graphic)energyText).color = Color.white; GameObject val7 = new GameObject("EnergySlider"); val7.transform.SetParent(uiPanel.transform); RectTransform val8 = val7.AddComponent(); val8.anchorMin = new Vector2(0f, 0f); val8.anchorMax = new Vector2(1f, 0.5f); val8.sizeDelta = new Vector2(-20f, 0f); val8.anchoredPosition = new Vector2(0f, 0f); energySlider = val7.AddComponent(); GameObject val9 = new GameObject("ChargingIcon"); val9.transform.SetParent(uiPanel.transform); RectTransform val10 = val9.AddComponent(); val10.anchorMin = new Vector2(1f, 0.5f); val10.anchorMax = new Vector2(1f, 0.5f); val10.sizeDelta = new Vector2(30f, 30f); val10.anchoredPosition = new Vector2(-20f, 0f); chargingIcon = val9.AddComponent(); ((Graphic)chargingIcon).color = chargingColor; ((Behaviour)chargingIcon).enabled = false; val.SetActive(false); } private void Start() { Camera main = Camera.main; _playerCamera = ((main != null) ? ((Component)main).transform : null); } private void Update() { if (!((Object)(object)_playerCamera == (Object)null)) { _updateTimer += Time.deltaTime; if (!(_updateTimer < updateInterval)) { _updateTimer = 0f; CheckForGenerator(); } } } private void CheckForGenerator() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006b: 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_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) Generator[] array = Object.FindObjectsOfType(); Generator generator = null; float num = float.MaxValue; Generator[] array2 = array; foreach (Generator generator2 in array2) { float num2 = Vector3.Distance(_playerCamera.position, ((Component)generator2).transform.position); if (num2 < displayDistance && num2 < num) { Vector3 val = ((Component)generator2).transform.position - _playerCamera.position; Vector3 normalized = ((Vector3)(ref val)).normalized; float num3 = Vector3.Dot(_playerCamera.forward, normalized); if (num3 > 0.5f) { num = num2; generator = generator2; } } } if ((Object)(object)generator != (Object)null) { ShowUI(generator); } else { HideUI(); } } private void ShowUI(Generator generator) { //IL_003f: 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_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) _generator = generator; if (!uiPanel.activeSelf) { uiPanel.SetActive(true); } if ((Object)(object)_generator != (Object)null) { ((Component)this).transform.position = ((Component)_generator).transform.position + Vector3.up * 1.5f; ((Component)this).transform.LookAt(_playerCamera); ((Component)this).transform.Rotate(0f, 180f, 0f); } UpdateDisplay(); } private void HideUI() { _generator = null; if (uiPanel.activeSelf) { uiPanel.SetActive(false); } } private void UpdateDisplay() { //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_generator == (Object)null) && _generator.EnergyData != null) { float currentEnergy = _generator.CurrentEnergy; float maxEnergy = _generator.MaxEnergy; float energyPercentage = _generator.EnergyPercentage; string arg = (_generator.EnergyData.IsChargingFromSolar ? " âš¡" : ""); ((TMP_Text)energyText).text = $"[{(int)currentEnergy} / {(int)maxEnergy} Crystal]{arg}"; energySlider.value = energyPercentage; if (_generator.EnergyData.IsChargingFromSolar) { ((Graphic)energyText).color = chargingColor; } else if (energyPercentage < 0.33f) { ((Graphic)energyText).color = lowEnergyColor; } else if (energyPercentage < 0.66f) { ((Graphic)energyText).color = mediumEnergyColor; } else { ((Graphic)energyText).color = highEnergyColor; } ((Behaviour)chargingIcon).enabled = _generator.EnergyData.IsChargingFromSolar; } } private void OnDestroy() { if ((Object)(object)Instance == (Object)(object)this) { Instance = null; } } } public class SolarPanelUI : MonoBehaviour { [Header("UI Settings")] [SerializeField] private float displayDistance = 3f; [SerializeField] private float updateInterval = 0.1f; [Header("UI Elements")] [SerializeField] private GameObject uiPanel; [SerializeField] private TextMeshProUGUI infoText; [SerializeField] private Slider efficiencySlider; [SerializeField] private Image statusIcon; [Header("Status Colors")] [SerializeField] private Color chargingColor = Color.green; [SerializeField] private Color idleColor = Color.yellow; [SerializeField] private Color noLightColor = Color.red; [SerializeField] private Color nightColor = Color.blue; [Header("Weather Icons")] [SerializeField] private Sprite sunnyIcon; [SerializeField] private Sprite cloudyIcon; [SerializeField] private Sprite nightIcon; [SerializeField] private Sprite noLightIcon; private SolarPanel _solarPanel; private Transform _playerCamera; private float _updateTimer; private string _currentMapName = "Default"; public static SolarPanelUI Instance { get; private set; } private void Awake() { Instance = this; CreateUI(); DetectCurrentMap(); } private void CreateUI() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_0036: 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_0050: Expected O, but got Unknown //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Expected O, but got Unknown //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_013a: 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_015d: Expected O, but got Unknown //IL_0189: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Unknown result type (might be due to invalid IL or missing references) //IL_021e: Expected O, but got Unknown //IL_024a: Unknown result type (might be due to invalid IL or missing references) //IL_0260: Unknown result type (might be due to invalid IL or missing references) //IL_0276: Unknown result type (might be due to invalid IL or missing references) //IL_028c: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("SolarPanelUI_Canvas"); Canvas val2 = val.AddComponent(); val2.renderMode = (RenderMode)2; val2.worldCamera = Camera.main; RectTransform component = val.GetComponent(); component.sizeDelta = new Vector2(2.5f, 0.6f); uiPanel = new GameObject("Panel"); uiPanel.transform.SetParent(val.transform); RectTransform val3 = uiPanel.AddComponent(); val3.anchorMin = Vector2.zero; val3.anchorMax = Vector2.one; val3.sizeDelta = Vector2.zero; Image val4 = uiPanel.AddComponent(); ((Graphic)val4).color = new Color(0f, 0f, 0f, 0.7f); GameObject val5 = new GameObject("StatusIcon"); val5.transform.SetParent(uiPanel.transform); RectTransform val6 = val5.AddComponent(); val6.anchorMin = new Vector2(0f, 0.5f); val6.anchorMax = new Vector2(0f, 0.5f); val6.sizeDelta = new Vector2(30f, 30f); val6.anchoredPosition = new Vector2(20f, 0f); statusIcon = val5.AddComponent(); GameObject val7 = new GameObject("InfoText"); val7.transform.SetParent(uiPanel.transform); RectTransform val8 = val7.AddComponent(); val8.anchorMin = new Vector2(0f, 0.5f); val8.anchorMax = new Vector2(1f, 1f); val8.sizeDelta = new Vector2(-50f, 0f); val8.anchoredPosition = new Vector2(10f, 0f); infoText = val7.AddComponent(); ((TMP_Text)infoText).fontSize = 18f; ((TMP_Text)infoText).alignment = (TextAlignmentOptions)513; ((Graphic)infoText).color = Color.white; GameObject val9 = new GameObject("EfficiencySlider"); val9.transform.SetParent(uiPanel.transform); RectTransform val10 = val9.AddComponent(); val10.anchorMin = new Vector2(0f, 0f); val10.anchorMax = new Vector2(1f, 0.5f); val10.sizeDelta = new Vector2(-20f, 0f); val10.anchoredPosition = new Vector2(0f, 0f); efficiencySlider = val9.AddComponent(); val.SetActive(false); } private void Start() { Camera main = Camera.main; _playerCamera = ((main != null) ? ((Component)main).transform : null); } private void DetectCurrentMap() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) Scene activeScene = SceneManager.GetActiveScene(); string name = ((Scene)(ref activeScene)).name; if (name.Contains("Desert") || name.Contains("desert")) { _currentMapName = "Desert"; } else if (name.Contains("Underground") || name.Contains("underground") || name.Contains("Cave")) { _currentMapName = "Underground"; } else if (name.Contains("Cloudy") || name.Contains("cloudy") || name.Contains("Fog")) { _currentMapName = "Cloudy"; } else if (name.Contains("Forest") || name.Contains("forest")) { _currentMapName = "Forest"; } else if (name.Contains("Snow") || name.Contains("snow") || name.Contains("Ice")) { _currentMapName = "Snow"; } else { _currentMapName = "Default"; } } private void Update() { if (!((Object)(object)_playerCamera == (Object)null)) { _updateTimer += Time.deltaTime; if (!(_updateTimer < updateInterval)) { _updateTimer = 0f; CheckForSolarPanel(); } } } private void CheckForSolarPanel() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006b: 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_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) SolarPanel[] array = Object.FindObjectsOfType(); SolarPanel solarPanel = null; float num = float.MaxValue; SolarPanel[] array2 = array; foreach (SolarPanel solarPanel2 in array2) { float num2 = Vector3.Distance(_playerCamera.position, ((Component)solarPanel2).transform.position); if (num2 < displayDistance && num2 < num) { Vector3 val = ((Component)solarPanel2).transform.position - _playerCamera.position; Vector3 normalized = ((Vector3)(ref val)).normalized; float num3 = Vector3.Dot(_playerCamera.forward, normalized); if (num3 > 0.5f) { num = num2; solarPanel = solarPanel2; } } } if ((Object)(object)solarPanel != (Object)null) { ShowUI(solarPanel); } else { HideUI(); } } private void ShowUI(SolarPanel panel) { //IL_003f: 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_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) _solarPanel = panel; if (!uiPanel.activeSelf) { uiPanel.SetActive(true); } if ((Object)(object)_solarPanel != (Object)null) { ((Component)this).transform.position = ((Component)_solarPanel).transform.position + Vector3.up * 1.2f; ((Component)this).transform.LookAt(_playerCamera); ((Component)this).transform.Rotate(0f, 180f, 0f); } UpdateDisplay(); } private void HideUI() { _solarPanel = null; if (uiPanel.activeSelf) { uiPanel.SetActive(false); } } private void UpdateDisplay() { //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_0094: 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_00be: 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_0105: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_solarPanel == (Object)null)) { float currentLightIntensity = _solarPanel.CurrentLightIntensity; float chargeRate = _solarPanel.GetChargeRate(); bool isCharging = _solarPanel.IsCharging; bool isConnectedToGenerator = _solarPanel.IsConnectedToGenerator; float mapLightMultiplier = ConfigManager.GetMapLightMultiplier(_currentMapName); float num = currentLightIntensity * mapLightMultiplier * 100f; string arg; Color color; if (!isConnectedToGenerator) { arg = "Not Connected"; color = idleColor; statusIcon.sprite = cloudyIcon; } else if (DayNightCycle.IsNighttime) { arg = "Night"; color = nightColor; statusIcon.sprite = nightIcon; } else if (currentLightIntensity < 0.1f) { arg = "No Light"; color = noLightColor; statusIcon.sprite = noLightIcon; } else if (isCharging) { arg = "Charging"; color = chargingColor; statusIcon.sprite = sunnyIcon; } else { arg = "Idle"; color = idleColor; statusIcon.sprite = cloudyIcon; } string arg2 = (isCharging ? $"+{chargeRate:F1}/s" : "0/s"); ((TMP_Text)infoText).text = $"Efficiency: {num:F0}%\n{arg} | {arg2}"; ((Graphic)infoText).color = color; efficiencySlider.value = num / 100f; ((Graphic)statusIcon).color = color; } } private void OnDestroy() { if ((Object)(object)Instance == (Object)(object)this) { Instance = null; } } } public static class WeatherClockUI { private static readonly Color STAMINA_YELLOW = new Color(1f, 0.81f, 0.1f); private static Texture2D _whiteTex; private static Texture2D[] _icons; private const int ICON_SIZE = 16; public static void OnGUI() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Invalid comparison between Unknown and I4 //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Expected O, but got Unknown //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Expected O, but got Unknown //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Expected O, but got Unknown //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Expected O, but got Unknown //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: 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_010a: Expected O, but got Unknown //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_0135: 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_0170: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Unknown result type (might be due to invalid IL or missing references) //IL_0228: Unknown result type (might be due to invalid IL or missing references) //IL_022f: Unknown result type (might be due to invalid IL or missing references) //IL_0263: Unknown result type (might be due to invalid IL or missing references) //IL_0270: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) if ((int)Event.current.type == 7 && ConfigManager.EnableClockWeatherHUD.Value && !MapHelper.IsRestrictedMap && DayNightCycle.IsInitialized && WeatherSystem.IsInitialized && !((Object)(object)Camera.main == (Object)null)) { EnsureTextures(); string formattedTime = DayNightCycle.GetFormattedTime(); string weatherName = WeatherSystem.GetWeatherName(); GUIStyle val = new GUIStyle(GUI.skin.label); val.alignment = (TextAnchor)4; val.fontSize = 14; val.fontStyle = (FontStyle)1; val.normal.textColor = STAMINA_YELLOW; GUIStyle val2 = new GUIStyle(val); val2.fontSize = 11; GUIStyle val3 = new GUIStyle(val); val3.normal.textColor = new Color(0f, 0f, 0f, 0.8f); GUIStyle val4 = new GUIStyle(val2); val4.normal.textColor = new Color(0f, 0f, 0f, 0.8f); Vector2 val5 = val.CalcSize(new GUIContent(formattedTime)); Vector2 val6 = val2.CalcSize(new GUIContent(weatherName)); float num = (float)Screen.width / 2f; float num2 = 8f; Rect val7 = default(Rect); ((Rect)(ref val7))..ctor(num - val5.x / 2f, num2, val5.x, val5.y); GUI.Label(new Rect(((Rect)(ref val7)).x + 1f, ((Rect)(ref val7)).y + 1f, ((Rect)(ref val7)).width, ((Rect)(ref val7)).height), formattedTime, val3); GUI.Label(val7, formattedTime, val); float num3 = num2 + val5.y + 2f; float num4 = 20f + val6.x; float num5 = num - num4 / 2f; int currentWeather = (int)WeatherSystem.CurrentWeather; if (_icons != null && currentWeather >= 0 && currentWeather < _icons.Length && (Object)(object)_icons[currentWeather] != (Object)null) { GUI.DrawTexture(new Rect(num5, num3 + (val6.y - 16f) / 2f, 16f, 16f), (Texture)(object)_icons[currentWeather]); } Rect val8 = default(Rect); ((Rect)(ref val8))..ctor(num5 + 16f + 4f, num3, val6.x, val6.y); GUI.Label(new Rect(((Rect)(ref val8)).x + 1f, ((Rect)(ref val8)).y + 1f, ((Rect)(ref val8)).width, ((Rect)(ref val8)).height), weatherName, val4); GUI.Label(val8, weatherName, val2); } } private static void EnsureTextures() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_whiteTex == (Object)null) { _whiteTex = new Texture2D(1, 1); _whiteTex.SetPixel(0, 0, Color.white); _whiteTex.Apply(); } if (_icons == null) { _icons = (Texture2D[])(object)new Texture2D[6]; _icons[0] = MakeSunIcon(); _icons[1] = MakeCloudIcon(new Color(0.75f, 0.75f, 0.78f)); _icons[2] = MakeFogIcon(); _icons[3] = MakeRainIcon(stormy: false); _icons[4] = MakeRainIcon(stormy: true); _icons[5] = MakeSnowIcon(); } } private static Texture2D NewIcon() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_0039: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(16, 16, (TextureFormat)4, false); ((Texture)val).filterMode = (FilterMode)0; Color val2 = default(Color); ((Color)(ref val2))..ctor(0f, 0f, 0f, 0f); for (int i = 0; i < 16; i++) { for (int j = 0; j < 16; j++) { val.SetPixel(i, j, val2); } } return val; } private static Texture2D MakeSunIcon() { //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) Texture2D val = NewIcon(); Color val2 = default(Color); ((Color)(ref val2))..ctor(1f, 0.85f, 0.2f); int num = 8; for (int i = 0; i < 16; i++) { for (int j = 0; j < 16; j++) { float num2 = Mathf.Sqrt((float)((i - num) * (i - num) + (j - num) * (j - num))); if (num2 <= 4f) { val.SetPixel(i, j, val2); } } } for (int k = 1; k <= 2; k++) { val.SetPixel(num, num + 5 + k, val2); val.SetPixel(num, num - 5 - k, val2); val.SetPixel(num + 5 + k, num, val2); val.SetPixel(num - 5 - k, num, val2); } val.Apply(); return val; } private static Texture2D MakeCloudIcon(Color color) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) Texture2D val = NewIcon(); DrawCircle(val, 5, 7, 3f, color); DrawCircle(val, 9, 8, 4f, color); DrawCircle(val, 12, 7, 3f, color); for (int i = 3; i <= 13; i++) { for (int j = 4; j <= 7; j++) { val.SetPixel(i, j, color); } } val.Apply(); return val; } private static Texture2D MakeFogIcon() { //IL_003b: Unknown result type (might be due to invalid IL or missing references) Texture2D val = NewIcon(); Color val2 = default(Color); ((Color)(ref val2))..ctor(0.7f, 0.7f, 0.72f); for (int i = 0; i < 4; i++) { int num = 3 + i * 3; int num2 = ((i % 2 == 0) ? 2 : 4); for (int j = num2; j < num2 + 10; j++) { val.SetPixel(j, num, val2); } } val.Apply(); return val; } private static Texture2D MakeRainIcon(bool stormy) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0018: 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_003d: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: 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_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_012a: 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) Texture2D val = NewIcon(); Color val2 = (stormy ? new Color(0.4f, 0.42f, 0.5f) : new Color(0.6f, 0.62f, 0.68f)); DrawCircle(val, 5, 11, 2.5f, val2); DrawCircle(val, 9, 12, 3f, val2); DrawCircle(val, 12, 11, 2.5f, val2); for (int i = 3; i <= 13; i++) { for (int j = 9; j <= 11; j++) { val.SetPixel(i, j, val2); } } Color val3 = default(Color); ((Color)(ref val3))..ctor(0.4f, 0.6f, 1f); val.SetPixel(5, 6, val3); val.SetPixel(5, 5, val3); val.SetPixel(9, 5, val3); val.SetPixel(9, 4, val3); val.SetPixel(12, 6, val3); val.SetPixel(12, 5, val3); if (stormy) { Color val4 = default(Color); ((Color)(ref val4))..ctor(1f, 0.9f, 0.2f); val.SetPixel(8, 7, val4); val.SetPixel(7, 6, val4); val.SetPixel(8, 5, val4); val.SetPixel(7, 4, val4); val.SetPixel(8, 3, val4); val.SetPixel(7, 2, val4); } val.Apply(); return val; } private static Texture2D MakeSnowIcon() { //IL_0025: 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_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: 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) Texture2D val = NewIcon(); Color val2 = default(Color); ((Color)(ref val2))..ctor(0.8f, 0.82f, 0.88f); DrawCircle(val, 5, 11, 2.5f, val2); DrawCircle(val, 9, 12, 3f, val2); DrawCircle(val, 12, 11, 2.5f, val2); for (int i = 3; i <= 13; i++) { for (int j = 9; j <= 11; j++) { val.SetPixel(i, j, val2); } } Color white = Color.white; val.SetPixel(5, 6, white); val.SetPixel(9, 4, white); val.SetPixel(12, 6, white); val.SetPixel(7, 3, white); val.SetPixel(11, 2, white); val.Apply(); return val; } private static void DrawCircle(Texture2D tex, int cx, int cy, float radius, Color color) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < 16; i++) { for (int j = 0; j < 16; j++) { float num = Mathf.Sqrt((float)((i - cx) * (i - cx) + (j - cy) * (j - cy))); if (num <= radius) { tex.SetPixel(i, j, color); } } } } } } namespace REPOMod.Systems { public static class DayNightCycle { private static float _currentTime; private static float _timeAccumulator; private static bool _isInitialized; private const float BASE_SECONDS_PER_HOUR = 60f; private const int DAY_CYCLE_HOURS = 24; public static float CurrentTime => _currentTime; public static bool IsInitialized => _isInitialized; public static int CurrentHour => Mathf.FloorToInt(_currentTime); public static int CurrentMinute => Mathf.FloorToInt((_currentTime - (float)CurrentHour) * 60f); public static bool IsDaytime { get { int value = ConfigManager.SunriseHour.Value; int value2 = ConfigManager.SunsetHour.Value; if (_currentTime >= (float)value) { return _currentTime < (float)value2; } return false; } } public static bool IsNighttime => !IsDaytime; public static float GetLightIntensity() { int value = ConfigManager.SunriseHour.Value; int value2 = ConfigManager.SunsetHour.Value; if (_currentTime < (float)value || _currentTime >= (float)value2) { return 0f; } float num = value2 - value; float num2 = (float)value + num / 2f; float num3 = Mathf.Abs(_currentTime - num2); float num4 = 1f - num3 / (num / 2f); return Mathf.Clamp01(num4) * WeatherSystem.GetSunlightMultiplier(); } public static bool CanSolarPanelsCharge() { if (IsDaytime) { return GetLightIntensity() > 0.1f; } return false; } public static string GetFormattedTime() { int currentHour = CurrentHour; int currentMinute = CurrentMinute; int value = ConfigManager.ClockFormat.Value; if (value == 12) { string arg = ((currentHour < 12) ? "AM" : "PM"); int num = currentHour % 12; if (num == 0) { num = 12; } return $"{num:D2}:{currentMinute:D2} {arg}"; } return $"{currentHour:D2}:{currentMinute:D2}"; } public static string GetPeriodOfDay() { if (IsDaytime) { return LocalizationManager.Get("ui_day"); } return LocalizationManager.Get("ui_night"); } public static void SetTimeFromNetwork(float time) { _currentTime = Mathf.Clamp(time, 0f, 24f); } public static void Initialize() { _currentTime = ConfigManager.SunriseHour.Value; _timeAccumulator = 0f; _isInitialized = true; Plugin.Logger.LogInfo((object)$"Day/Night cycle initialized. Clock format: {ConfigManager.ClockFormat.Value}-hour"); } public static void Update() { if (!_isInitialized) { return; } float value = ConfigManager.TimeSpeedMultiplier.Value; float num = 60f / value; _timeAccumulator += Time.deltaTime; if (_timeAccumulator >= num) { float num2 = _timeAccumulator / num; _timeAccumulator = 0f; _currentTime += num2; if (_currentTime >= 24f) { _currentTime -= 24f; } if (ConfigManager.EnableDebugMode.Value) { Plugin.Logger.LogDebug((object)$"Time: {GetFormattedTime()} | Light: {GetLightIntensity():F2}"); } } } public static void Dispose() { _isInitialized = false; } } public static class EnemyAIPatch { private static readonly List _activeGenerators = new List(); private static float _updateInterval = 0.5f; private static float _updateTimer; public static void Update() { _updateTimer += Time.deltaTime; if (!(_updateTimer < _updateInterval)) { _updateTimer = 0f; _activeGenerators.Clear(); _activeGenerators.AddRange(Object.FindObjectsOfType()); if (ConfigManager.EnableDebugMode.Value && _activeGenerators.Count > 0) { Plugin.Logger.LogDebug((object)$"Active noisy generators: {_activeGenerators.Count}"); } } } public static GeneratorSound GetNearestGenerator(Vector3 position, float maxRange = 50f) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) return EnemyAIHelper.GetNearestGenerator(position, maxRange); } public static bool IsWithinGeneratorHearingRange(Vector3 position, out GeneratorSound heardGenerator) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) return EnemyAIHelper.IsWithinGeneratorHearingRange(position, out heardGenerator); } } public static class EnemyAIHelper { public static GeneratorSound GetNearestGenerator(Vector3 position, float maxRange = 50f) { //IL_0021: 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) GeneratorSound[] array = Object.FindObjectsOfType(); GeneratorSound result = null; float num = maxRange; GeneratorSound[] array2 = array; foreach (GeneratorSound generatorSound in array2) { if (!((Object)(object)generatorSound == (Object)null)) { float num2 = Vector3.Distance(position, ((Component)generatorSound).transform.position); if (num2 < num) { num = num2; result = generatorSound; } } } return result; } public static bool IsWithinGeneratorHearingRange(Vector3 position, out GeneratorSound heardGenerator) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) heardGenerator = null; GeneratorSound[] array = Object.FindObjectsOfType(); foreach (GeneratorSound generatorSound in array) { if (!((Object)(object)generatorSound == (Object)null)) { float num = Vector3.Distance(position, ((Component)generatorSound).transform.position); if (num <= generatorSound.GetHearingRange()) { heardGenerator = generatorSound; return true; } } } return false; } } public static class EnergySystem { public class GeneratorData { public int InstanceId; public float CurrentEnergy; public float MaxEnergy; public float Efficiency; public bool IsConnectedToSolar; public int ConnectedSolarPanelId; public bool IsChargingFromSolar; public float SolarChargeRate; public float LastSyncTime; public float EnergyPercentage { get { if (!(MaxEnergy > 0f)) { return 0f; } return CurrentEnergy / MaxEnergy; } } public bool IsFull => CurrentEnergy >= MaxEnergy; public bool IsEmpty => CurrentEnergy <= 0f; public GeneratorData(int instanceId, float maxEnergy, float efficiency) { InstanceId = instanceId; MaxEnergy = maxEnergy; Efficiency = efficiency; CurrentEnergy = 0f; IsConnectedToSolar = false; ConnectedSolarPanelId = -1; IsChargingFromSolar = false; SolarChargeRate = 0f; LastSyncTime = 0f; } } private static readonly Dictionary _generators = new Dictionary(); private static readonly object _lock = new object(); private static bool _isInitialized; public static void Initialize() { lock (_lock) { _generators.Clear(); _isInitialized = true; } Plugin.Logger.LogInfo((object)"Energy system initialized."); } public static void Update() { if (!_isInitialized) { return; } lock (_lock) { List list = new List(_generators.Keys); foreach (int item in list) { if (_generators.TryGetValue(item, out GeneratorData value) && value != null) { UpdateGeneratorCharging(value); } } } } private static void UpdateGeneratorCharging(GeneratorData generator) { if (generator.IsConnectedToSolar && DayNightCycle.CanSolarPanelsCharge()) { float value = ConfigManager.SolarPanelChargeRate.Value; float value2 = ConfigManager.SolarChargeMultiplier.Value; float lightIntensity = DayNightCycle.GetLightIntensity(); float num = value * value2 * lightIntensity * Time.deltaTime; AddEnergyInternal(generator, num); generator.IsChargingFromSolar = true; generator.SolarChargeRate = num / Mathf.Max(Time.deltaTime, 0.001f); } else { generator.IsChargingFromSolar = false; generator.SolarChargeRate = 0f; } } public static GeneratorData RegisterGenerator(int instanceId) { lock (_lock) { if (_generators.ContainsKey(instanceId)) { Plugin.Logger.LogWarning((object)$"Generator {instanceId} already registered. Returning existing."); return _generators[instanceId]; } float num = ConfigManager.GeneratorCapacity.Value; float value = ConfigManager.GeneratorEfficiency.Value; GeneratorData generatorData = new GeneratorData(instanceId, num, value); _generators[instanceId] = generatorData; Plugin.Logger.LogInfo((object)$"Generator registered. ID: {instanceId}, Capacity: {num}, Efficiency: {value:P0}"); return generatorData; } } public static void UnregisterGenerator(int instanceId) { lock (_lock) { if (_generators.Remove(instanceId)) { Plugin.Logger.LogInfo((object)$"Generator unregistered. ID: {instanceId}"); } } } public static GeneratorData GetGenerator(int instanceId) { lock (_lock) { _generators.TryGetValue(instanceId, out GeneratorData value); return value; } } public static bool AddEnergyFromShip(int instanceId, float baseEnergy) { GeneratorData generator = GetGenerator(instanceId); if (generator == null) { Plugin.Logger.LogWarning((object)$"AddEnergyFromShip: Generator {instanceId} not found."); return false; } if (generator.IsFull) { return false; } float amount = baseEnergy * generator.Efficiency; return AddEnergy(instanceId, amount); } public static bool AddEnergy(int instanceId, float amount) { if (amount <= 0f) { return false; } GeneratorData generator = GetGenerator(instanceId); if (generator == null) { Plugin.Logger.LogWarning((object)$"AddEnergy: Generator {instanceId} not found."); return false; } return AddEnergyInternal(generator, amount); } private static bool AddEnergyInternal(GeneratorData generator, float amount) { if (generator.IsFull) { return false; } float currentEnergy = generator.CurrentEnergy; generator.CurrentEnergy = Mathf.Min(generator.CurrentEnergy + amount, generator.MaxEnergy); return generator.CurrentEnergy > currentEnergy; } public static bool ConsumeEnergy(int instanceId, float amount) { if (amount <= 0f) { return false; } GeneratorData generator = GetGenerator(instanceId); if (generator == null) { Plugin.Logger.LogWarning((object)$"ConsumeEnergy: Generator {instanceId} not found."); return false; } if (generator.CurrentEnergy < amount) { return false; } generator.CurrentEnergy -= amount; return true; } public static float AddEnergyFromOrb(int instanceId, float orbValue) { if (orbValue <= 0f) { return 0f; } GeneratorData generator = GetGenerator(instanceId); if (generator == null) { Plugin.Logger.LogWarning((object)$"AddEnergyFromOrb: Generator {instanceId} not found."); return 0f; } if (generator.IsFull) { return 0f; } float value = ConfigManager.OrbEnergyPerOrb.Value; float currentEnergy = generator.CurrentEnergy; AddEnergyInternal(generator, value); return generator.CurrentEnergy - currentEnergy; } public static void ConnectSolarPanel(int generatorId, int solarPanelId) { GeneratorData generator = GetGenerator(generatorId); if (generator == null) { Plugin.Logger.LogWarning((object)$"ConnectSolarPanel: Generator {generatorId} not found."); return; } generator.IsConnectedToSolar = true; generator.ConnectedSolarPanelId = solarPanelId; Plugin.Logger.LogInfo((object)$"Solar panel {solarPanelId} connected to generator {generatorId}"); } public static void DisconnectSolarPanel(int generatorId) { GeneratorData generator = GetGenerator(generatorId); if (generator == null) { Plugin.Logger.LogWarning((object)$"DisconnectSolarPanel: Generator {generatorId} not found."); return; } generator.IsConnectedToSolar = false; generator.ConnectedSolarPanelId = -1; generator.IsChargingFromSolar = false; generator.SolarChargeRate = 0f; Plugin.Logger.LogInfo((object)$"Solar panel disconnected from generator {generatorId}"); } public static List GetAllGenerators() { lock (_lock) { return new List(_generators.Values); } } public static float GetTotalEnergy() { float num = 0f; lock (_lock) { foreach (KeyValuePair generator in _generators) { if (generator.Value != null) { num += generator.Value.CurrentEnergy; } } return num; } } public static void Dispose() { lock (_lock) { _generators.Clear(); _isInitialized = false; } } } public static class LightDetectionSystem { private static List _sunLights = new List(); private static bool _hasSunLight; private static float _lastCacheTime; private const float CACHE_INTERVAL = 5f; public static void Initialize() { CacheLightSources(); Plugin.Logger.LogInfo((object)"Light detection system initialized."); } public static void CacheLightSources() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Invalid comparison between Unknown and I4 _sunLights.Clear(); _hasSunLight = false; Light[] array = Object.FindObjectsOfType(); Light[] array2 = array; foreach (Light val in array2) { if ((int)val.type == 1) { _sunLights.Add(val); _hasSunLight = true; } } _lastCacheTime = Time.time; if (ConfigManager.EnableDebugMode.Value) { Plugin.Logger.LogDebug((object)$"Found {_sunLights.Count} sun light(s) in scene."); } } public static bool CanReceiveSunlight(Vector3 position, float detectionRadius = 10f) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) if (_hasSunLight) { foreach (Light sunLight in _sunLights) { if (((Behaviour)sunLight).enabled && sunLight.intensity > 0.1f && IsPositionInSunlight(position, sunLight)) { return true; } } } if (HasLineOfSightToSky(position, detectionRadius)) { return true; } if (GetAmbientLightIntensity(position) > 0.3f) { return true; } return DayNightCycle.IsDaytime; } public static float GetSunlightIntensity(Vector3 position, float detectionRadius = 10f) { //IL_0055: 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_002a: Unknown result type (might be due to invalid IL or missing references) float num = 0f; if (_hasSunLight) { foreach (Light sunLight in _sunLights) { if (((Behaviour)sunLight).enabled) { float sunIntensityAtPosition = GetSunIntensityAtPosition(position, sunLight); num = Mathf.Max(num, sunIntensityAtPosition); } } } if (HasLineOfSightToSky(position, detectionRadius)) { num = Mathf.Max(num, 0.8f); } float ambientLightIntensity = GetAmbientLightIntensity(position); num = Mathf.Max(num, ambientLightIntensity); num *= DayNightCycle.GetLightIntensity(); return Mathf.Clamp01(num); } private static bool IsPositionInSunlight(Vector3 position, Light sunLight) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: 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_0012: Unknown result type (might be due to invalid IL or missing references) Vector3 val = -((Component)sunLight).transform.forward; RaycastHit val2 = default(RaycastHit); if (Physics.Raycast(position, val, ref val2, 100f)) { return false; } return true; } private static float GetSunIntensityAtPosition(Vector3 position, Light sunLight) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) if (!IsPositionInSunlight(position, sunLight)) { return 0f; } return sunLight.intensity; } private static bool HasLineOfSightToSky(Vector3 position, float maxDistance = 10f) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: 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_0044: 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_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) Vector3 val = position + Vector3.up * 0.5f; RaycastHit val2 = default(RaycastHit); if (Physics.Raycast(val, Vector3.up, ref val2, maxDistance)) { if (((RaycastHit)(ref val2)).collider.isTrigger || IsTransparent(((RaycastHit)(ref val2)).collider)) { return HasLineOfSightToSky(((RaycastHit)(ref val2)).point + Vector3.up * 0.1f, maxDistance - ((RaycastHit)(ref val2)).distance); } return false; } return true; } private static bool IsTransparent(Collider collider) { Renderer component = ((Component)collider).GetComponent(); if ((Object)(object)component == (Object)null) { return false; } Material material = component.material; if ((Object)(object)material == (Object)null) { return false; } if (material.renderQueue >= 3000) { return true; } return false; } private static float GetAmbientLightIntensity(Vector3 position) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) float[] array = new float[9]; SphericalHarmonicsL2 val = default(SphericalHarmonicsL2); LightProbes.GetInterpolatedProbe(position, (Renderer)null, ref val); float num = 0f; for (int i = 0; i < 3; i++) { num += ((SphericalHarmonicsL2)(ref val))[i, 0]; } return Mathf.Clamp01(num); } public static void Update() { if (Time.time - _lastCacheTime > 5f) { CacheLightSources(); } } public static string GetDebugInfo(Vector3 position) { //IL_0029: 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) return $"Sun Lights: {_sunLights.Count}\n" + $"Can Receive Sun: {CanReceiveSunlight(position)}\n" + $"Intensity: {GetSunlightIntensity(position):F2}\n" + $"Daytime: {DayNightCycle.IsDaytime}\n" + "Time: " + DayNightCycle.GetFormattedTime(); } } public static class ModNetworkSync { private static NetworkedEvent _stateSyncEvent; private static float _broadcastTimer; private static bool _isInitialized; private const float BROADCAST_INTERVAL = 15f; public static bool IsHost { get { try { return SemiFunc.IsMasterClientOrSingleplayer(); } catch { return true; } } } public static void Initialize() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown try { _stateSyncEvent = new NetworkedEvent("SolarPower_StateSync", (Action)HandleStateSync); _isInitialized = true; Plugin.Logger.LogInfo((object)"Network sync initialized (host-authoritative)."); } catch (Exception ex) { Plugin.Logger.LogError((object)("Failed to initialize network sync: " + ex.Message)); } } public static void Update() { if (_isInitialized && IsHost) { _broadcastTimer += Time.deltaTime; if (_broadcastTimer >= 15f) { _broadcastTimer = 0f; BroadcastState(); } } } public static void BroadcastState() { //IL_003c: Unknown result type (might be due to invalid IL or missing references) if (!_isInitialized || !IsHost) { return; } try { object[] array = new object[2] { (int)WeatherSystem.CurrentWeather, DayNightCycle.CurrentTime }; _stateSyncEvent.RaiseEvent((object)array, NetworkingEvents.RaiseOthers, SendOptions.SendReliable); } catch (Exception ex) { Plugin.Logger.LogError((object)("Failed to broadcast state: " + ex.Message)); } } private static void HandleStateSync(EventData eventData) { if (IsHost) { return; } try { if (!(eventData.CustomData is object[] array) || array.Length < 2 || !(array[0] is int num)) { return; } if (num < 0 || num > 5) { Plugin.Logger.LogWarning((object)$"[Security] Invalid weather value received: {num}"); } else { if (!(array[1] is float num2)) { return; } if (float.IsNaN(num2) || float.IsInfinity(num2) || num2 < 0f || num2 > 24f) { Plugin.Logger.LogWarning((object)$"[Security] Invalid time value received: {num2}"); return; } WeatherSystem.SetWeatherFromNetwork((WeatherType)num); DayNightCycle.SetTimeFromNetwork(num2); if (ConfigManager.EnableDebugMode.Value) { Plugin.Logger.LogDebug((object)$"[Sync] Applied host state: Weather={(WeatherType)num}, Time={num2:F2}"); } } } catch (Exception ex) { Plugin.Logger.LogError((object)("Error handling state sync: " + ex.Message)); } } public static void Dispose() { _isInitialized = false; } } public class NetworkSync : MonoBehaviour { [Header("Sync Settings")] [SerializeField] private float syncInterval = 0.5f; private float _lastMessageTime; private const float MIN_MESSAGE_INTERVAL = 0.1f; private int _messageCount; private float _messageResetTime; private const int MAX_MESSAGES_PER_SECOND = 15; private bool _isInitialized; private int _networkId; private CableConnector _cableConnector; private Generator _generator; private SolarPanel _solarPanel; private float _lastSyncedEnergy; private bool _lastSyncedCableState; private int _lastSyncedConnectedPanel = -1; private const float MAX_ENERGY_VALUE = 10000f; private const float MIN_ENERGY_VALUE = 0f; private const float MAX_LIGHT_INTENSITY = 1f; private const float MIN_LIGHT_INTENSITY = 0f; public int NetworkId => _networkId; private void Awake() { _networkId = ((Object)this).GetInstanceID(); _isInitialized = true; _messageResetTime = Time.time; _cableConnector = ((Component)this).GetComponent(); _generator = ((Component)this).GetComponent(); _solarPanel = ((Component)this).GetComponent(); } private void Update() { if (_isInitialized && Time.time - _messageResetTime >= 1f) { _messageCount = 0; _messageResetTime = Time.time; } } public void SendCableState(bool isConnected, int solarPanelId) { if (ValidateRateLimit() && ValidateCableState(isConnected, solarPanelId)) { solarPanelId = Mathf.Max(-1, solarPanelId); if (ConfigManager.EnableDebugMode.Value) { Plugin.Logger.LogDebug((object)$"[NetworkSync] Cable state sent: Connected={isConnected}, Panel={solarPanelId}"); } } } public void SendGeneratorEnergy(float energy) { if (ValidateRateLimit() && ValidateEnergyValue(energy)) { energy = Mathf.Clamp(energy, 0f, 10000f); if (ConfigManager.EnableDebugMode.Value) { Plugin.Logger.LogDebug((object)$"[NetworkSync] Generator energy sent: {energy}"); } } } public void SendSolarPanelState(bool isCharging, float lightIntensity) { if (ValidateRateLimit() && ValidateLightIntensity(lightIntensity)) { lightIntensity = Mathf.Clamp(lightIntensity, 0f, 1f); if (ConfigManager.EnableDebugMode.Value) { Plugin.Logger.LogDebug((object)$"[NetworkSync] Solar panel state sent: Charging={isCharging}, Intensity={lightIntensity}"); } } } public void ReceiveCableState(bool isConnected, int solarPanelId, float timestamp) { if (ValidateTimestamp(timestamp) && ValidateCableState(isConnected, solarPanelId) && !((Object)(object)_cableConnector == (Object)null)) { if (isConnected && solarPanelId >= 0) { _cableConnector.RemoteConnect(solarPanelId); } else { _cableConnector.RemoteDisconnect(); } } } public void ReceiveGeneratorEnergy(float energy, float timestamp) { if (ValidateTimestamp(timestamp)) { if (!ValidateEnergyValue(energy)) { Plugin.Logger.LogWarning((object)$"[Security] Invalid energy value received: {energy}"); } else if (!((Object)(object)_generator == (Object)null) && _generator.EnergyData != null) { _generator.EnergyData.CurrentEnergy = Mathf.Lerp(_generator.EnergyData.CurrentEnergy, energy, 0.5f); } } } public void ReceiveSolarPanelState(bool isCharging, float lightIntensity, float timestamp) { if (ValidateTimestamp(timestamp)) { if (!ValidateLightIntensity(lightIntensity)) { Plugin.Logger.LogWarning((object)$"[Security] Invalid light intensity received: {lightIntensity}"); } else { _ = (Object)(object)_solarPanel == (Object)null; } } } private bool ValidateRateLimit() { if (_messageCount >= 15) { Plugin.Logger.LogWarning((object)$"[Security] Rate limit exceeded for NetworkSync {_networkId}"); return false; } if (Time.time - _lastMessageTime < 0.1f) { return false; } _messageCount++; _lastMessageTime = Time.time; return true; } private bool ValidateCableState(bool isConnected, int solarPanelId) { if (isConnected && solarPanelId < 0) { Plugin.Logger.LogWarning((object)$"[Security] Invalid cable state: Connected but PanelId={solarPanelId}"); return false; } return true; } private bool ValidateEnergyValue(float energy) { if (float.IsNaN(energy) || float.IsInfinity(energy)) { Plugin.Logger.LogWarning((object)$"[Security] Invalid energy value: {energy}"); return false; } if (energy < 0f || energy > 10000f) { Plugin.Logger.LogWarning((object)$"[Security] Energy value out of range: {energy}"); return false; } return true; } private bool ValidateLightIntensity(float intensity) { if (float.IsNaN(intensity) || float.IsInfinity(intensity)) { Plugin.Logger.LogWarning((object)$"[Security] Invalid light intensity: {intensity}"); return false; } if (intensity < 0f || intensity > 1f) { Plugin.Logger.LogWarning((object)$"[Security] Light intensity out of range: {intensity}"); return false; } return true; } private bool ValidateTimestamp(float timestamp) { if (Time.time - timestamp > 5f) { Plugin.Logger.LogWarning((object)$"[Security] Stale message received. Timestamp: {timestamp}, Current: {Time.time}"); return false; } if (timestamp > Time.time + 1f) { Plugin.Logger.LogWarning((object)$"[Security] Future message received. Timestamp: {timestamp}, Current: {Time.time}"); return false; } return true; } private void OnDestroy() { _isInitialized = false; } } public enum WeatherType { Sunny, Cloudy, Foggy, Rainy, Stormy, Snowy } public static class WeatherSystem { private static WeatherType _currentWeather = WeatherType.Sunny; private static float _weatherTimer; private static float _lastWeatherChangeTime; private static bool _isInitialized; private static readonly Random _random = new Random(); private static GameObject _weatherObject; private static ParticleSystem _rainParticles; private static ParticleSystem _snowParticles; private static Light _lightningLight; private static float _lightningTimer; private static float _lightningFlashRemaining; private static readonly List _puddles = new List(); private static float _puddleSpawnTimer; private static Material _puddleMaterial; private const int MAX_PUDDLES = 25; private static AudioSource _rainAudioSource; private static AudioSource _thunderAudioSource; private static AudioSource _windAudioSource; private static AudioClip _rainClip; private static AudioClip _thunderClip; private static AudioClip _windClip; private static bool _savedSettingsValid; private static bool _savedFogEnabled; private static FogMode _savedFogMode; private static float _savedFogDensity; private static Color _savedFogColor; private static float _savedAmbientIntensity; public static WeatherType CurrentWeather => _currentWeather; public static bool IsInitialized => _isInitialized; public static void Initialize() { WeatherType[] array = new WeatherType[3] { WeatherType.Sunny, WeatherType.Foggy, WeatherType.Cloudy }; _currentWeather = array[_random.Next(array.Length)]; _lastWeatherChangeTime = ConfigManager.SunriseHour.Value; _lightningTimer = 0f; _isInitialized = true; Plugin.Logger.LogInfo((object)$"Weather system initialized. Current weather: {_currentWeather}"); } public static void Dispose() { _isInitialized = false; RestoreRenderSettings(); DestroyWeatherObject(); } public static float GetSunlightMultiplier() { if (!_isInitialized || !ConfigManager.EnableWeather.Value) { return 1f; } return _currentWeather switch { WeatherType.Sunny => ConfigManager.WeatherSunnyMultiplier.Value * 1.3f, WeatherType.Cloudy => ConfigManager.WeatherCloudyMultiplier.Value, WeatherType.Foggy => ConfigManager.WeatherFoggyMultiplier.Value, WeatherType.Rainy => ConfigManager.WeatherRainyMultiplier.Value, WeatherType.Stormy => ConfigManager.WeatherStormyMultiplier.Value, WeatherType.Snowy => ConfigManager.WeatherSnowyMultiplier.Value, _ => 1f, }; } public static string GetWeatherName() { return LocalizationManager.Get("weather_" + _currentWeather.ToString().ToLowerInvariant()); } public static void Update() { if (!_isInitialized) { return; } if (!ConfigManager.EnableWeather.Value) { if (_currentWeather != WeatherType.Sunny) { SetWeather(WeatherType.Sunny); } return; } if (MapHelper.IsRestrictedMap) { if (_currentWeather != WeatherType.Sunny) { SetWeather(WeatherType.Sunny); } ClearPuddles(immediate: true); return; } if (ModNetworkSync.IsHost && ShouldChangeWeather()) { _lastWeatherChangeTime = DayNightCycle.CurrentTime; WeatherType nextWeather = GetNextWeather(); if (nextWeather != _currentWeather) { SetWeather(nextWeather); ModNetworkSync.BroadcastState(); } } UpdateEffects(); } public static void SetWeather(WeatherType weather) { if (_currentWeather != weather) { _currentWeather = weather; Plugin.Logger.LogInfo((object)$"Weather changed to: {weather}"); if (weather == WeatherType.Sunny || weather == WeatherType.Cloudy) { RestoreRenderSettings(); } } } public static void SetWeatherFromNetwork(WeatherType weather) { _lastWeatherChangeTime = DayNightCycle.CurrentTime; SetWeather(weather); } private static bool ShouldChangeWeather() { float currentTime = DayNightCycle.CurrentTime; float num = currentTime - _lastWeatherChangeTime; if (num < 0f) { num += 24f; } return num >= 6f; } private static WeatherType GetNextWeather() { switch (_currentWeather) { case WeatherType.Sunny: if (_random.Next(2) != 0) { return WeatherType.Cloudy; } return WeatherType.Foggy; case WeatherType.Foggy: if (_random.Next(2) != 0) { return WeatherType.Cloudy; } return WeatherType.Sunny; case WeatherType.Cloudy: if (_random.Next(2) != 0) { return WeatherType.Snowy; } return WeatherType.Rainy; case WeatherType.Rainy: return WeatherType.Stormy; case WeatherType.Stormy: return WeatherType.Sunny; case WeatherType.Snowy: return WeatherType.Sunny; default: return WeatherType.Sunny; } } private static void UpdateEffects() { //IL_00b4: 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_00c3: 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_0214: Unknown result type (might be due to invalid IL or missing references) //IL_0219: 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_0228: Unknown result type (might be due to invalid IL or missing references) Camera main = Camera.main; bool flag = ConfigManager.EnableWeatherVisuals.Value && (Object)(object)main != (Object)null; bool flag2 = ConfigManager.EnableWeatherSounds.Value && (Object)(object)main != (Object)null; bool flag3 = _currentWeather == WeatherType.Rainy || _currentWeather == WeatherType.Stormy; bool flag4 = _currentWeather == WeatherType.Snowy; bool flag5 = _currentWeather == WeatherType.Foggy || flag3; bool flag6 = _currentWeather == WeatherType.Cloudy; if (flag && (flag5 || flag6)) { ApplyFogSettings(); } else if (_savedSettingsValid && !flag5 && !flag6) { RestoreRenderSettings(); } if (flag3 && (Object)(object)main != (Object)null) { EnsureWeatherObject(); _weatherObject.transform.position = ((Component)main).transform.position + Vector3.up * 12f; if (flag && !_rainParticles.isPlaying) { _rainParticles.Play(); } else if (!flag && _rainParticles.isPlaying) { _rainParticles.Stop(); } if (flag2) { if (!_rainAudioSource.isPlaying) { _rainAudioSource.Play(); } float volume = ConfigManager.WeatherSoundVolume.Value * ((_currentWeather == WeatherType.Stormy) ? 1f : 0.6f); _rainAudioSource.volume = volume; } else if ((Object)(object)_rainAudioSource != (Object)null && _rainAudioSource.isPlaying) { _rainAudioSource.Stop(); } if (_currentWeather == WeatherType.Stormy) { UpdateLightning(flag, flag2); } } else if ((Object)(object)_weatherObject != (Object)null) { if ((Object)(object)_rainParticles != (Object)null && _rainParticles.isPlaying) { _rainParticles.Stop(); } if ((Object)(object)_rainAudioSource != (Object)null && _rainAudioSource.isPlaying) { _rainAudioSource.Stop(); } if ((Object)(object)_lightningLight != (Object)null) { ((Behaviour)_lightningLight).enabled = false; } } if (flag4 && (Object)(object)main != (Object)null && flag) { EnsureWeatherObject(); _weatherObject.transform.position = ((Component)main).transform.position + Vector3.up * 12f; if (!_snowParticles.isPlaying) { _snowParticles.Play(); } } else if ((Object)(object)_snowParticles != (Object)null && _snowParticles.isPlaying) { _snowParticles.Stop(); } if (flag6 && flag2) { EnsureWeatherObject(); if (!_windAudioSource.isPlaying) { _windAudioSource.Play(); } _windAudioSource.volume = ConfigManager.WeatherSoundVolume.Value * 0.35f; } else if ((Object)(object)_windAudioSource != (Object)null && _windAudioSource.isPlaying) { _windAudioSource.Stop(); } if (flag3 && flag && (Object)(object)main != (Object)null) { UpdatePuddleSpawning(main); } else { ClearPuddles(immediate: false); } } private static void UpdatePuddleSpawning(Camera cam) { //IL_005f: 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_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: 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) //IL_008b: 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_0096: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //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_018b: Unknown result type (might be due to invalid IL or missing references) //IL_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Expected O, but got Unknown //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Expected O, but got Unknown //IL_0102: Unknown result type (might be due to invalid IL or missing references) _puddles.RemoveAll((GameObject p) => (Object)(object)p == (Object)null); _puddleSpawnTimer += Time.deltaTime; if (_puddleSpawnTimer < 1.5f || _puddles.Count >= 25) { return; } _puddleSpawnTimer = 0f; Vector2 val = Random.insideUnitCircle * 10f; Vector3 val2 = ((Component)cam).transform.position + new Vector3(val.x, 2f, val.y); RaycastHit val3 = default(RaycastHit); if (Physics.Raycast(val2, Vector3.down, ref val3, 15f) && !(Vector3.Dot(((RaycastHit)(ref val3)).normal, Vector3.up) < 0.85f)) { if ((Object)(object)_puddleMaterial == (Object)null) { Shader val4 = Shader.Find("Sprites/Default"); _puddleMaterial = new Material(val4); _puddleMaterial.color = new Color(0.25f, 0.32f, 0.45f, 0.45f); } GameObject val5 = GameObject.CreatePrimitive((PrimitiveType)5); ((Object)val5).name = "REPOMod_Puddle"; Object.Destroy((Object)(object)val5.GetComponent()); val5.transform.position = ((RaycastHit)(ref val3)).point + Vector3.up * 0.01f; val5.transform.rotation = Quaternion.LookRotation(-((RaycastHit)(ref val3)).normal); float num = Random.Range(0.4f, 1.2f); val5.transform.localScale = new Vector3(num, num, 1f); Renderer component = val5.GetComponent(); component.material = new Material(_puddleMaterial); val5.AddComponent(); _puddles.Add(val5); } } private static void ClearPuddles(bool immediate) { _puddles.RemoveAll((GameObject p) => (Object)(object)p == (Object)null); foreach (GameObject puddle in _puddles) { if (immediate) { Object.Destroy((Object)(object)puddle); continue; } PuddleFade component = puddle.GetComponent(); if ((Object)(object)component != (Object)null) { component.BeginFade(); } } if (immediate) { _puddles.Clear(); } } private static void ApplyFogSettings() { //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_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) if (!_savedSettingsValid) { _savedFogEnabled = RenderSettings.fog; _savedFogMode = RenderSettings.fogMode; _savedFogDensity = RenderSettings.fogDensity; _savedFogColor = RenderSettings.fogColor; _savedAmbientIntensity = RenderSettings.ambientIntensity; _savedSettingsValid = true; } RenderSettings.fog = true; RenderSettings.fogMode = (FogMode)2; switch (_currentWeather) { case WeatherType.Cloudy: RenderSettings.fogDensity = 0.012f; RenderSettings.fogColor = new Color(0.55f, 0.57f, 0.6f); RenderSettings.ambientIntensity = _savedAmbientIntensity * 0.75f; break; case WeatherType.Foggy: RenderSettings.fogDensity = 0.06f; RenderSettings.fogColor = new Color(0.7f, 0.7f, 0.72f); RenderSettings.ambientIntensity = _savedAmbientIntensity * 0.8f; break; case WeatherType.Rainy: RenderSettings.fogDensity = 0.025f; RenderSettings.fogColor = new Color(0.45f, 0.48f, 0.55f); RenderSettings.ambientIntensity = _savedAmbientIntensity * 0.6f; break; case WeatherType.Stormy: RenderSettings.fogDensity = 0.035f; RenderSettings.fogColor = new Color(0.3f, 0.32f, 0.38f); RenderSettings.ambientIntensity = _savedAmbientIntensity * 0.4f; break; } } private static void RestoreRenderSettings() { //IL_0012: 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) if (_savedSettingsValid) { RenderSettings.fog = _savedFogEnabled; RenderSettings.fogMode = _savedFogMode; RenderSettings.fogDensity = _savedFogDensity; RenderSettings.fogColor = _savedFogColor; RenderSettings.ambientIntensity = _savedAmbientIntensity; _savedSettingsValid = false; } } private static void UpdateLightning(bool visualsEnabled, bool soundsEnabled) { if (_lightningFlashRemaining > 0f) { _lightningFlashRemaining -= Time.deltaTime; if ((Object)(object)_lightningLight != (Object)null) { _lightningLight.intensity = Mathf.Lerp(0f, 8f, _lightningFlashRemaining / 0.2f); if (_lightningFlashRemaining <= 0f) { ((Behaviour)_lightningLight).enabled = false; } } } _lightningTimer -= Time.deltaTime; if (_lightningTimer <= 0f) { _lightningTimer = 5f + (float)_random.NextDouble() * 10f; if (visualsEnabled && (Object)(object)_lightningLight != (Object)null) { ((Behaviour)_lightningLight).enabled = true; _lightningFlashRemaining = 0.2f; } if (soundsEnabled && (Object)(object)_thunderAudioSource != (Object)null && (Object)(object)_thunderClip != (Object)null) { _thunderAudioSource.PlayOneShot(_thunderClip, ConfigManager.WeatherSoundVolume.Value); } } } private static void EnsureWeatherObject() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0040: 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_0061: 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_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: 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_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_011e: 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) //IL_016a: Expected O, but got Unknown //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: 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_01cf: 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_01f4: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Unknown result type (might be due to invalid IL or missing references) //IL_021c: Unknown result type (might be due to invalid IL or missing references) //IL_0225: Unknown result type (might be due to invalid IL or missing references) //IL_0234: Unknown result type (might be due to invalid IL or missing references) //IL_0239: Unknown result type (might be due to invalid IL or missing references) //IL_0254: Unknown result type (might be due to invalid IL or missing references) //IL_0263: Unknown result type (might be due to invalid IL or missing references) //IL_0268: Unknown result type (might be due to invalid IL or missing references) //IL_0279: Unknown result type (might be due to invalid IL or missing references) //IL_028f: Unknown result type (might be due to invalid IL or missing references) //IL_02a5: Unknown result type (might be due to invalid IL or missing references) //IL_0312: Unknown result type (might be due to invalid IL or missing references) //IL_0319: Expected O, but got Unknown //IL_031b: Unknown result type (might be due to invalid IL or missing references) //IL_0338: Unknown result type (might be due to invalid IL or missing references) //IL_0342: Unknown result type (might be due to invalid IL or missing references) //IL_0364: Unknown result type (might be due to invalid IL or missing references) //IL_036b: Expected O, but got Unknown //IL_0389: Unknown result type (might be due to invalid IL or missing references) //IL_0393: Unknown result type (might be due to invalid IL or missing references) //IL_03b3: Unknown result type (might be due to invalid IL or missing references) //IL_03e8: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_weatherObject != (Object)null)) { _weatherObject = new GameObject("REPOMod_WeatherEffects"); Object.DontDestroyOnLoad((Object)(object)_weatherObject); _rainParticles = _weatherObject.AddComponent(); MainModule main = _rainParticles.main; ((MainModule)(ref main)).loop = true; ((MainModule)(ref main)).startLifetime = MinMaxCurve.op_Implicit(1.2f); ((MainModule)(ref main)).startSpeed = MinMaxCurve.op_Implicit(18f); ((MainModule)(ref main)).startSize = new MinMaxCurve(0.015f, 0.04f); ((MainModule)(ref main)).startColor = MinMaxGradient.op_Implicit(new Color(0.7f, 0.75f, 0.85f, 0.5f)); ((MainModule)(ref main)).maxParticles = 3000; ((MainModule)(ref main)).simulationSpace = (ParticleSystemSimulationSpace)1; EmissionModule emission = _rainParticles.emission; ((EmissionModule)(ref emission)).rateOverTime = MinMaxCurve.op_Implicit(900f); ShapeModule shape = _rainParticles.shape; ((ShapeModule)(ref shape)).shapeType = (ParticleSystemShapeType)5; ((ShapeModule)(ref shape)).scale = new Vector3(30f, 0.5f, 30f); VelocityOverLifetimeModule velocityOverLifetime = _rainParticles.velocityOverLifetime; ((VelocityOverLifetimeModule)(ref velocityOverLifetime)).enabled = true; ((VelocityOverLifetimeModule)(ref velocityOverLifetime)).y = new MinMaxCurve(-20f); ParticleSystemRenderer component = ((Component)_rainParticles).GetComponent(); component.renderMode = (ParticleSystemRenderMode)1; component.lengthScale = 6f; ((Renderer)component).material = CreateRainMaterial(); _rainParticles.Stop(); GameObject val = new GameObject("REPOMod_SnowParticles"); val.transform.SetParent(_weatherObject.transform, false); _snowParticles = val.AddComponent(); MainModule main2 = _snowParticles.main; ((MainModule)(ref main2)).loop = true; ((MainModule)(ref main2)).startLifetime = MinMaxCurve.op_Implicit(6f); ((MainModule)(ref main2)).startSpeed = MinMaxCurve.op_Implicit(2f); ((MainModule)(ref main2)).startSize = new MinMaxCurve(0.04f, 0.1f); ((MainModule)(ref main2)).startColor = MinMaxGradient.op_Implicit(new Color(1f, 1f, 1f, 0.9f)); ((MainModule)(ref main2)).maxParticles = 6000; ((MainModule)(ref main2)).simulationSpace = (ParticleSystemSimulationSpace)1; EmissionModule emission2 = _snowParticles.emission; ((EmissionModule)(ref emission2)).rateOverTime = MinMaxCurve.op_Implicit(800f); ShapeModule shape2 = _snowParticles.shape; ((ShapeModule)(ref shape2)).shapeType = (ParticleSystemShapeType)5; ((ShapeModule)(ref shape2)).scale = new Vector3(30f, 0.5f, 30f); VelocityOverLifetimeModule velocityOverLifetime2 = _snowParticles.velocityOverLifetime; ((VelocityOverLifetimeModule)(ref velocityOverLifetime2)).enabled = true; ((VelocityOverLifetimeModule)(ref velocityOverLifetime2)).y = new MinMaxCurve(-1.5f); ((VelocityOverLifetimeModule)(ref velocityOverLifetime2)).x = new MinMaxCurve(-0.4f, 0.4f); ((VelocityOverLifetimeModule)(ref velocityOverLifetime2)).z = new MinMaxCurve(-0.4f, 0.4f); ParticleSystemRenderer component2 = ((Component)_snowParticles).GetComponent(); component2.renderMode = (ParticleSystemRenderMode)0; component2.sortMode = (ParticleSystemSortMode)1; ((Renderer)component2).sortingOrder = 100; component2.maxParticleSize = 0.3f; Shader val2 = Shader.Find("Particles/Standard Unlit") ?? Shader.Find("Sprites/Default"); if ((Object)(object)val2 == (Object)null) { val2 = Shader.Find("Standard"); } Material val3 = new Material(val2); val3.color = Color.white; val3.EnableKeyword("_EMISSION"); val3.SetColor("_EmissionColor", Color.white * 0.3f); ((Renderer)component2).material = val3; _snowParticles.Stop(); GameObject val4 = new GameObject("REPOMod_LightningLight"); val4.transform.SetParent(_weatherObject.transform, false); val4.transform.localPosition = Vector3.up * 20f; val4.transform.rotation = Quaternion.Euler(60f, 0f, 0f); _lightningLight = val4.AddComponent(); _lightningLight.type = (LightType)1; _lightningLight.color = new Color(0.85f, 0.88f, 1f); _lightningLight.intensity = 0f; ((Behaviour)_lightningLight).enabled = false; _rainClip = CreateRainClip(); _thunderClip = CreateThunderClip(); _rainAudioSource = _weatherObject.AddComponent(); _rainAudioSource.clip = _rainClip; _rainAudioSource.loop = true; _rainAudioSource.spatialBlend = 0f; _rainAudioSource.volume = ConfigManager.WeatherSoundVolume.Value; _thunderAudioSource = _weatherObject.AddComponent(); _thunderAudioSource.spatialBlend = 0f; _windClip = CreateWindClip(); _windAudioSource = _weatherObject.AddComponent(); _windAudioSource.clip = _windClip; _windAudioSource.loop = true; _windAudioSource.spatialBlend = 0f; _windAudioSource.volume = 0f; Plugin.Logger.LogInfo((object)"Weather effects object created."); } } private static void DestroyWeatherObject() { if ((Object)(object)_weatherObject != (Object)null) { Object.Destroy((Object)(object)_weatherObject); _weatherObject = null; _rainParticles = null; _snowParticles = null; _lightningLight = null; _rainAudioSource = null; _thunderAudioSource = null; _windAudioSource = null; } ClearPuddles(immediate: true); } private static Material CreateRainMaterial() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown //IL_003b: Unknown result type (might be due to invalid IL or missing references) Shader val = Shader.Find("Particles/Standard Unlit"); if ((Object)(object)val == (Object)null) { val = Shader.Find("Sprites/Default"); } Material val2 = new Material(val); val2.color = new Color(0.7f, 0.75f, 0.85f, 0.5f); return val2; } private static AudioClip CreateRainClip() { int num = 88200; float[] array = new float[num]; Random random = new Random(12345); float num2 = 0f; for (int i = 0; i < num; i++) { float num3 = (float)(random.NextDouble() * 2.0 - 1.0); num2 += 0.25f * (num3 - num2); array[i] = num2 * 0.5f; } AudioClip val = AudioClip.Create("REPOMod_Rain", num, 1, 22050, false); val.SetData(array, 0); return val; } private static AudioClip CreateThunderClip() { int num = 55125; float[] array = new float[num]; Random random = new Random(54321); float num2 = 0f; for (int i = 0; i < num; i++) { float num3 = (float)(random.NextDouble() * 2.0 - 1.0); num2 += 0.05f * (num3 - num2); float num4 = (float)i / (float)num; float num5 = Mathf.Exp(-4f * num4); array[i] = num2 * num5 * 2.5f; } AudioClip val = AudioClip.Create("REPOMod_Thunder", num, 1, 22050, false); val.SetData(array, 0); return val; } private static AudioClip CreateWindClip() { int num = 66150; float[] array = new float[num]; Random random = new Random(98765); float num2 = 0f; for (int i = 0; i < num; i++) { float num3 = (float)(random.NextDouble() * 2.0 - 1.0); num2 += 0.08f * (num3 - num2); float num4 = (float)i / (float)num; float num5 = Mathf.Sin(num4 * MathF.PI * 4f) * 0.5f + 0.5f; array[i] = num2 * num5 * 0.35f; } AudioClip val = AudioClip.Create("REPOMod_Wind", num, 1, 22050, false); val.SetData(array, 0); return val; } } public class PuddleFade : MonoBehaviour { private bool _fading; private float _fadeDuration = 8f; private float _fadeTimer; private Renderer _renderer; private Color _startColor; private void Awake() { //IL_0026: 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) _renderer = ((Component)this).GetComponent(); if ((Object)(object)_renderer != (Object)null) { _startColor = _renderer.material.color; } } public void BeginFade() { _fading = true; } private void Update() { //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_006b: Unknown result type (might be due to invalid IL or missing references) if (_fading && !((Object)(object)_renderer == (Object)null)) { _fadeTimer += Time.deltaTime; float num = Mathf.Clamp01(_fadeTimer / _fadeDuration); Color startColor = _startColor; startColor.a = Mathf.Lerp(_startColor.a, 0f, num); _renderer.material.color = startColor; if (num >= 1f) { Object.Destroy((Object)(object)((Component)this).gameObject); } } } } } namespace REPOMod.Patches { [HarmonyPatch(typeof(ItemBattery))] public static class ItemBatteryPatch { [HarmonyPatch("Awake")] [HarmonyPostfix] private static void AwakePostfix(ItemBattery __instance) { FieldInfo field = typeof(ItemBattery).GetField("itemAttributes", BindingFlags.Instance | BindingFlags.NonPublic); if (field == null) { return; } object? value = field.GetValue(__instance); ItemAttributes val = (ItemAttributes)((value is ItemAttributes) ? value : null); if (!((Object)(object)val != (Object)null)) { ItemAttributes componentInParent = ((Component)__instance).GetComponentInParent(); if ((Object)(object)componentInParent != (Object)null) { field.SetValue(__instance, componentInParent); Plugin.Logger.LogDebug((object)("ItemBattery.Awake: linked ItemAttributes from parent for '" + ((Object)((Component)__instance).gameObject).name + "'.")); } } } [HarmonyPatch("Update")] [HarmonyPrefix] private static bool UpdatePrefix(ItemBattery __instance) { object? obj = typeof(ItemBattery).GetField("itemAttributes", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(__instance); ItemAttributes val = (ItemAttributes)((obj is ItemAttributes) ? obj : null); if ((Object)(object)val == (Object)null || (Object)(object)val.colorPreset == (Object)null) { float batteryLife = __instance.batteryLife; FieldInfo field = typeof(ItemBattery).GetField("batteryLifeInt", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo field2 = typeof(ItemBattery).GetField("batteryLifePrev", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { int batteryBars = __instance.batteryBars; int num = (int)Mathf.Round(batteryLife / (100f / (float)batteryBars)); num = Mathf.Min(num, batteryBars); field.SetValue(__instance, num); } if (field2 != null) { field2.SetValue(__instance, batteryLife); } return false; } return true; } [HarmonyPatch("SetBatteryLife")] [HarmonyPrefix] private static bool SetBatteryLifePrefix(ItemBattery __instance, int _batteryLife) { object? obj = typeof(ItemBattery).GetField("itemAttributes", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(__instance); ItemAttributes val = (ItemAttributes)((obj is ItemAttributes) ? obj : null); if ((Object)(object)val == (Object)null || (Object)(object)val.colorPreset == (Object)null) { __instance.batteryLife = _batteryLife; int batteryBars = __instance.batteryBars; int num = (int)Mathf.Round((float)_batteryLife / (100f / (float)batteryBars)); num = Mathf.Min(num, batteryBars); __instance.batteryLife = (float)num * (100f / (float)batteryBars); typeof(ItemBattery).GetField("batteryLifeInt", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(__instance, num); MethodInfo method = typeof(ItemBattery).GetMethod("BatteryFullPercentChange", BindingFlags.Instance | BindingFlags.NonPublic); if (method != null) { try { method.Invoke(__instance, new object[1] { num }); } catch { } } Plugin.Logger.LogDebug((object)("ItemBattery.SetBatteryLife: safe mode for '" + ((Object)((Component)__instance).gameObject).name + "' (missing ItemAttributes/colorPreset).")); return false; } return true; } } public static class PlayerPatches { private static CableConnector _selectedCable; private static bool _isHoldingCable; private static PlayerController _localPlayer; public static void Tick() { if ((Object)(object)_localPlayer == (Object)null) { _localPlayer = Object.FindObjectOfType(); if ((Object)(object)_localPlayer == (Object)null) { return; } } HandleCableInteraction(_localPlayer); HandleOrbFuelInteraction(_localPlayer); ApplyWeightPenalty(_localPlayer); HandleModItemInventory(_localPlayer); } private static void ApplyWeightPenalty(PlayerController player) { _ = GeneratorWeight.IsAnyGeneratorCarried; } private static void HandleCableInteraction(PlayerController player) { if (Input.GetMouseButtonDown(0)) { TryGrabCable(player); } if (Input.GetMouseButtonUp(0)) { ReleaseCable(); } if (Input.GetKeyDown((KeyCode)101)) { InteractWithCable(); } } private static void TryGrabCable(PlayerController player) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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) if (_isHoldingCable) { return; } Collider[] array = Physics.OverlapSphere(((Component)player).transform.position, 3f); Collider[] array2 = array; RaycastHit val3 = default(RaycastHit); foreach (Collider val in array2) { CableConnector component = ((Component)val).GetComponent(); if ((Object)(object)component == (Object)null || component.IsConnected || (Object)(object)Camera.main == (Object)null) { continue; } Ray val2 = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(val2, ref val3, 5f) && !((Object)(object)((RaycastHit)(ref val3)).collider != (Object)(object)val)) { _selectedCable = component; _isHoldingCable = true; Transform playerHand = ((Component)player).transform.Find("Hand") ?? ((Component)player).transform; component.GrabCable(playerHand); if (ConfigManager.EnableDebugMode.Value) { Plugin.Logger.LogDebug((object)"Cable grabbed"); } break; } } } private static void ReleaseCable() { if (_isHoldingCable && !((Object)(object)_selectedCable == (Object)null)) { _selectedCable.ReleaseCable(); _selectedCable = null; _isHoldingCable = false; } } private static void InteractWithCable() { _selectedCable?.OnInteract(); } private static void HandleOrbFuelInteraction(PlayerController player) { //IL_0056: Unknown result type (might be due to invalid IL or missing references) PhysGrabber componentInChildren = ((Component)player).GetComponentInChildren(); if ((Object)(object)componentInChildren == (Object)null || !componentInChildren.grabbed) { return; } GameObject val = null; if ((Object)(object)componentInChildren.grabbedObjectTransform != (Object)null) { val = ((Component)componentInChildren.grabbedObjectTransform).gameObject; } if ((Object)(object)val == (Object)null) { return; } OrbFuelHandler component = val.GetComponent(); if ((Object)(object)component == (Object)null) { return; } Collider[] array = Physics.OverlapSphere(((Component)player).transform.position, 2f); Collider[] array2 = array; foreach (Collider val2 in array2) { Generator component2 = ((Component)val2).GetComponent(); if (!((Object)(object)component2 == (Object)null)) { if (Input.GetKeyDown((KeyCode)101)) { component.UseAsFuel(component2); } break; } } } private static void HandleModItemInventory(PlayerController player) { PhysGrabber componentInChildren = ((Component)player).GetComponentInChildren(); if ((Object)(object)componentInChildren == (Object)null || !componentInChildren.grabbed) { return; } GameObject val = null; if ((Object)(object)componentInChildren.grabbedObjectTransform != (Object)null) { val = ((Component)componentInChildren.grabbedObjectTransform).gameObject; } if ((Object)(object)val == (Object)null || (!((Object)(object)val.GetComponent() != (Object)null) && !((Object)(object)val.GetComponent() != (Object)null)) || !Input.GetKeyDown((KeyCode)103)) { return; } try { MethodInfo method = ((object)componentInChildren).GetType().GetMethod("Release", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (method != null) { method.Invoke(componentInChildren, null); } else { FieldInfo field = ((object)componentInChildren).GetType().GetField("grabbed", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { field.SetValue(componentInChildren, false); } } Plugin.Logger.LogDebug((object)"Dropped mod item for inventory interaction"); } catch (Exception ex) { Plugin.Logger.LogError((object)("Error dropping mod item: " + ex.Message)); } } } } namespace REPOMod.Items { public class BatteryPack : MonoBehaviour { [Header("Battery Settings")] [SerializeField] private float maxCapacity = 200f; [SerializeField] private float currentEnergy; [SerializeField] private bool isInSolarSlot; [SerializeField] private bool isConnectedToGenerator; [Header("Visual")] [SerializeField] private Light chargeIndicator; [SerializeField] private Renderer batteryRenderer; [SerializeField] private Material chargedMaterial; [SerializeField] private Material halfChargedMaterial; [SerializeField] private Material lowChargeMaterial; [SerializeField] private Material emptyMaterial; [Header("Audio")] [SerializeField] private AudioSource audioSource; [SerializeField] private AudioClip insertSound; [SerializeField] private AudioClip removeSound; [SerializeField] private AudioClip chargeLoopSound; private SolarPanel _connectedSolarPanel; private Generator _connectedGenerator; private float _chargeRate = 2f; public float CurrentEnergy => currentEnergy; public float MaxCapacity => maxCapacity; public float EnergyPercentage { get { if (!(maxCapacity > 0f)) { return 0f; } return currentEnergy / maxCapacity; } } public bool IsFull => currentEnergy >= maxCapacity; public bool IsEmpty => currentEnergy <= 0f; public bool IsInSolarSlot => isInSolarSlot; public bool IsConnectedToGenerator => isConnectedToGenerator; private void Awake() { maxCapacity = (float)ConfigManager.GeneratorCapacity.Value / 2.5f; } private void Update() { UpdateCharging(); UpdateDischarging(); UpdateVisuals(); } private void UpdateCharging() { if (isInSolarSlot && !((Object)(object)_connectedSolarPanel == (Object)null) && !IsFull && DayNightCycle.CanSolarPanelsCharge()) { float currentLightIntensity = _connectedSolarPanel.CurrentLightIntensity; float num = _chargeRate * currentLightIntensity * Time.deltaTime; currentEnergy = Mathf.Min(currentEnergy + num, maxCapacity); } } private void UpdateDischarging() { if (isConnectedToGenerator && !((Object)(object)_connectedGenerator == (Object)null) && !IsEmpty) { float num = 5f; float num2 = num * Time.deltaTime; float num3 = EnergySystem.AddEnergyFromOrb(_connectedGenerator.InstanceId, num2 * 1000f); currentEnergy = Mathf.Max(currentEnergy - num3, 0f); } } private void UpdateVisuals() { //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)batteryRenderer == (Object)null)) { if (EnergyPercentage > 0.75f) { batteryRenderer.material = chargedMaterial; } else if (EnergyPercentage > 0.5f) { batteryRenderer.material = halfChargedMaterial; } else if (EnergyPercentage > 0.25f) { batteryRenderer.material = lowChargeMaterial; } else { batteryRenderer.material = emptyMaterial; } if ((Object)(object)chargeIndicator != (Object)null) { ((Behaviour)chargeIndicator).enabled = !IsEmpty; chargeIndicator.intensity = EnergyPercentage * 2f; chargeIndicator.color = Color.Lerp(Color.red, Color.green, EnergyPercentage); } } } public void InsertIntoSolarSlot(SolarPanel solarPanel) { if (!((Object)(object)solarPanel == (Object)null)) { _connectedSolarPanel = solarPanel; isInSolarSlot = true; isConnectedToGenerator = false; _connectedGenerator = null; PlaySound(insertSound); Plugin.Logger.LogInfo((object)$"Battery inserted into solar panel. Current charge: {currentEnergy:F0}/{maxCapacity:F0}"); } } public void RemoveFromSolarSlot() { isInSolarSlot = false; _connectedSolarPanel = null; PlaySound(removeSound); Plugin.Logger.LogInfo((object)$"Battery removed from solar panel. Current charge: {currentEnergy:F0}/{maxCapacity:F0}"); } public void ConnectToGenerator(Generator generator) { if (!((Object)(object)generator == (Object)null)) { _connectedGenerator = generator; isConnectedToGenerator = true; isInSolarSlot = false; _connectedSolarPanel = null; PlaySound(insertSound); Plugin.Logger.LogInfo((object)$"Battery connected to generator. Current charge: {currentEnergy:F0}/{maxCapacity:F0}"); } } public void DisconnectFromGenerator() { isConnectedToGenerator = false; _connectedGenerator = null; PlaySound(removeSound); Plugin.Logger.LogInfo((object)$"Battery disconnected from generator. Current charge: {currentEnergy:F0}/{maxCapacity:F0}"); } public float GetAvailableEnergy() { return currentEnergy; } private void PlaySound(AudioClip clip) { if ((Object)(object)audioSource != (Object)null && (Object)(object)clip != (Object)null) { audioSource.PlayOneShot(clip, ConfigManager.ConnectSoundVolume.Value); } } private void OnDrawGizmosSelected() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) Gizmos.color = Color.yellow; Gizmos.DrawWireSphere(((Component)this).transform.position, 1f); } } public class CableConnector : MonoBehaviour { public const float CABLE_LENGTH = 3f; private const float CONNECT_RANGE = 3f; [Header("Cable Settings (Read Only)")] [SerializeField] private float cableLengthDisplay = 3f; [Header("Layer Masks")] [SerializeField] private LayerMask solarPanelLayer; [Header("Cable Visual")] [SerializeField] private LineRenderer cableRenderer; [SerializeField] private Material connectedMaterial; [SerializeField] private Material disconnectedMaterial; [SerializeField] private float cableWidth = 0.05f; [Header("Audio")] [SerializeField] private AudioSource audioSource; [SerializeField] private AudioClip connectSound; [SerializeField] private AudioClip disconnectSound; [SerializeField] private AudioClip plugSound; [SerializeField] private AudioClip unplugSound; [Header("Cable Points")] [SerializeField] private Transform cableStartPoint; private Generator _parentGenerator; private SolarPanel _connectedSolarPanel; private bool _isCableOut; private bool _isPlayerHoldingCable; private Transform _playerHand; private Vector3[] _cablePoints = (Vector3[])(object)new Vector3[10]; private NetworkSync _networkSync; public Generator ParentGenerator => _parentGenerator; public SolarPanel ConnectedSolarPanel => _connectedSolarPanel; public bool IsCableOut => _isCableOut; public bool IsConnected => (Object)(object)_connectedSolarPanel != (Object)null; public static float MaxCableLength => 3f; private void Awake() { _parentGenerator = ((Component)this).GetComponentInParent(); if ((Object)(object)_parentGenerator == (Object)null) { Plugin.Logger.LogError((object)"CableConnector must be child of a Generator!"); ((Behaviour)this).enabled = false; return; } _networkSync = ((Component)this).GetComponent(); if ((Object)(object)_networkSync == (Object)null) { _networkSync = ((Component)this).gameObject.AddComponent(); } InitializeCableRenderer(); } private void InitializeCableRenderer() { //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown if ((Object)(object)cableRenderer == (Object)null) { cableRenderer = ((Component)this).gameObject.AddComponent(); } cableRenderer.startWidth = cableWidth; cableRenderer.endWidth = cableWidth; cableRenderer.positionCount = _cablePoints.Length; if ((Object)(object)disconnectedMaterial != (Object)null) { ((Renderer)cableRenderer).material = disconnectedMaterial; } else { ((Renderer)cableRenderer).material = new Material(Shader.Find("Sprites/Default")); } ((Renderer)cableRenderer).enabled = false; } private void Update() { if (_isPlayerHoldingCable) { UpdateCablePosition(); } UpdateCableVisual(); HandleEKeyInteraction(); } private void HandleEKeyInteraction() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0084: 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_009e: Unknown result type (might be due to invalid IL or missing references) if (!Input.GetKeyDown((KeyCode)101) || (Object)(object)Camera.main == (Object)null) { return; } float num = Vector3.Distance(((Component)this).transform.position, ((Component)Camera.main).transform.position); if (num > 2.5f) { return; } if (IsConnected) { Disconnect(); return; } SolarPanel[] array = Object.FindObjectsOfType(); SolarPanel solarPanel = null; float num2 = 3f; Vector3 val = (((Object)(object)cableStartPoint != (Object)null) ? cableStartPoint.position : ((Component)this).transform.position); SolarPanel[] array2 = array; foreach (SolarPanel solarPanel2 in array2) { float num3 = Vector3.Distance(val, ((Component)solarPanel2).transform.position); if (num3 < num2) { num2 = num3; solarPanel = solarPanel2; } } if ((Object)(object)solarPanel != (Object)null) { ConnectToSolarPanel(solarPanel); } else { Plugin.Logger.LogInfo((object)$"CableConnector: no SolarPanel within {3f}m to connect."); } } public void GrabCable(Transform playerHand) { if (!_isPlayerHoldingCable && !_isPlayerHoldingCable) { _playerHand = playerHand; _isPlayerHoldingCable = true; _isCableOut = true; if ((Object)(object)cableRenderer != (Object)null) { ((Renderer)cableRenderer).enabled = true; } PlaySound(plugSound); _networkSync?.SendCableState(isConnected: true, -1); Plugin.Logger.LogDebug((object)"Cable grabbed by player"); } } public void ReleaseCable() { if (_isPlayerHoldingCable) { _isPlayerHoldingCable = false; _playerHand = null; if (TryConnectToNearbySolarPanel() && (Object)(object)_connectedSolarPanel != (Object)null) { _networkSync?.SendCableState(isConnected: false, _connectedSolarPanel.InstanceId); } else { _networkSync?.SendCableState(isConnected: false, -1); } Plugin.Logger.LogDebug((object)"Cable released by player"); } } private void UpdateCablePosition() { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0023: 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_0041: 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_0043: 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_0049: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0067: 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_0071: 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_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_playerHand == (Object)null)) { Vector3 val = (((Object)(object)cableStartPoint != (Object)null) ? cableStartPoint.position : ((Component)this).transform.position); Vector3 val2 = _playerHand.position; Vector3 val3 = val2 - val; float magnitude = ((Vector3)(ref val3)).magnitude; if (magnitude > 3f) { val2 = val + ((Vector3)(ref val3)).normalized * 3f; magnitude = 3f; } for (int i = 0; i < _cablePoints.Length; i++) { float num = (float)i / (float)(_cablePoints.Length - 1); Vector3 val4 = Vector3.Lerp(val, val2, num); float num2 = Mathf.Sin(num * MathF.PI) * 0.3f; val4.y -= num2; _cablePoints[i] = val4; } } } private void UpdateCableVisual() { //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0062: 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) //IL_0080: 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_0083: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)cableRenderer == (Object)null) { return; } if (!_isCableOut && !IsConnected) { ((Renderer)cableRenderer).enabled = false; return; } ((Renderer)cableRenderer).enabled = true; if (IsConnected && (Object)(object)_connectedSolarPanel != (Object)null) { Vector3 start = (((Object)(object)cableStartPoint != (Object)null) ? cableStartPoint.position : ((Component)this).transform.position); Vector3 cableConnectionPoint = _connectedSolarPanel.GetCableConnectionPoint(); UpdateCablePoints(start, cableConnectionPoint); if ((Object)(object)connectedMaterial != (Object)null) { ((Renderer)cableRenderer).material = connectedMaterial; } } else if (_isPlayerHoldingCable) { ((Renderer)cableRenderer).material = disconnectedMaterial; } cableRenderer.SetPositions(_cablePoints); } private void UpdateCablePoints(Vector3 start, Vector3 end) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0024: 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_002b: 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_0057: Unknown result type (might be due to invalid IL or missing references) Vector3 val = end - start; float magnitude = ((Vector3)(ref val)).magnitude; for (int i = 0; i < _cablePoints.Length; i++) { float num = (float)i / (float)(_cablePoints.Length - 1); Vector3 val2 = Vector3.Lerp(start, end, num); float num2 = Mathf.Sin(num * MathF.PI) * 0.2f; val2.y -= num2; _cablePoints[i] = val2; } } private bool TryConnectToNearbySolarPanel() { //IL_0021: 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) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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) Vector3 val = (((Object)(object)cableStartPoint != (Object)null) ? cableStartPoint.position : ((Component)this).transform.position); Collider[] array = Physics.OverlapSphere(val, 3f, LayerMask.op_Implicit(solarPanelLayer)); SolarPanel solarPanel = null; float num = float.MaxValue; Collider[] array2 = array; foreach (Collider val2 in array2) { SolarPanel component = ((Component)val2).GetComponent(); if (!((Object)(object)component == (Object)null)) { float num2 = Vector3.Distance(val, ((Component)component).transform.position); if (num2 < num && num2 <= 3f) { num = num2; solarPanel = component; } } } if ((Object)(object)solarPanel != (Object)null) { ConnectToSolarPanel(solarPanel); return true; } _isCableOut = false; return false; } public void ConnectToSolarPanel(SolarPanel panel) { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_002d: 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_0040: 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) if ((Object)(object)panel == (Object)null) { Plugin.Logger.LogWarning((object)"Attempted to connect to null solar panel!"); return; } Vector3 val = (((Object)(object)cableStartPoint != (Object)null) ? cableStartPoint.position : ((Component)this).transform.position); float num = Vector3.Distance(val, ((Component)panel).transform.position); if (num > 3f) { Plugin.Logger.LogWarning((object)$"Solar panel too far! Distance: {num}, Max: {3f}"); return; } if ((Object)(object)_connectedSolarPanel != (Object)null && (Object)(object)_connectedSolarPanel != (Object)(object)panel) { Disconnect(); } _connectedSolarPanel = panel; _isCableOut = false; panel.ConnectToGenerator(_parentGenerator.InstanceId); PlaySound(connectSound); NotificationManager.Show(LocalizationManager.Get("msg_cable_connected")); Plugin.Logger.LogInfo((object)$"Cable connected from Generator {_parentGenerator.InstanceId} to Solar Panel {panel.InstanceId}"); } public void Disconnect() { if (!((Object)(object)_connectedSolarPanel == (Object)null)) { int instanceId = _connectedSolarPanel.InstanceId; SolarPanel connectedSolarPanel = _connectedSolarPanel; _connectedSolarPanel = null; connectedSolarPanel.DisconnectFromGenerator(); _isCableOut = false; PlaySound(disconnectSound); NotificationManager.Show(LocalizationManager.Get("msg_cable_disconnected")); Plugin.Logger.LogInfo((object)$"Cable disconnected from Solar Panel {instanceId}"); } } public void OnInteract() { if (IsConnected) { Disconnect(); } else if (_isPlayerHoldingCable) { ReleaseCable(); } } public void RemoteConnect(int solarPanelId) { SolarPanel[] array = Object.FindObjectsOfType(); SolarPanel[] array2 = array; foreach (SolarPanel solarPanel in array2) { if (solarPanel.InstanceId == solarPanelId) { ConnectToSolarPanel(solarPanel); break; } } } public void RemoteDisconnect() { Disconnect(); } private void PlaySound(AudioClip clip) { if ((Object)(object)audioSource != (Object)null && (Object)(object)clip != (Object)null) { float num = (IsConnected ? ConfigManager.ConnectSoundVolume.Value : ConfigManager.DisconnectSoundVolume.Value); audioSource.PlayOneShot(clip, num); } } private void OnDrawGizmosSelected() { //IL_0021: 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) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: 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_0046: Unknown result type (might be due to invalid IL or missing references) Vector3 val = (((Object)(object)cableStartPoint != (Object)null) ? cableStartPoint.position : ((Component)this).transform.position); Gizmos.color = Color.green; Gizmos.DrawWireSphere(val, 3f); Gizmos.color = Color.yellow; Gizmos.DrawWireSphere(val, 3f); } } public static class NotificationManager { public static void Show(string message, float duration = 2f) { Plugin.Logger.LogInfo((object)("[Notification] " + message)); } } public class CableEffects : MonoBehaviour { [Header("Electricity Effect")] [SerializeField] private ParticleSystem electricityParticles; [SerializeField] private float particleEmissionRate = 10f; [SerializeField] private Color electricityColor = new Color(0.5f, 0.8f, 1f, 0.8f); [Header("Connection Sound")] [SerializeField] private AudioSource audioSource; [SerializeField] private AudioClip connectSound; [SerializeField] private AudioClip disconnectSound; [SerializeField] private AudioClip electricityLoopSound; [SerializeField] private float soundVolume = 0.5f; private LineRenderer _lineRenderer; private bool _isConnected; private float _effectTimer; private void Awake() { _lineRenderer = ((Component)this).GetComponent(); CreateElectricityParticles(); } private void CreateElectricityParticles() { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: 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_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_008b: 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_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: 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) if ((Object)(object)electricityParticles == (Object)null) { GameObject val = new GameObject("ElectricityParticles"); val.transform.SetParent(((Component)this).transform); val.transform.localPosition = Vector3.zero; electricityParticles = val.AddComponent(); MainModule main = electricityParticles.main; ((MainModule)(ref main)).startLifetime = MinMaxCurve.op_Implicit(0.3f); ((MainModule)(ref main)).startSpeed = MinMaxCurve.op_Implicit(2f); ((MainModule)(ref main)).startSize = MinMaxCurve.op_Implicit(0.02f); ((MainModule)(ref main)).startColor = MinMaxGradient.op_Implicit(electricityColor); ((MainModule)(ref main)).maxParticles = 50; ((MainModule)(ref main)).playOnAwake = false; EmissionModule emission = electricityParticles.emission; ((EmissionModule)(ref emission)).rateOverTime = MinMaxCurve.op_Implicit(0f); ShapeModule shape = electricityParticles.shape; ((ShapeModule)(ref shape)).shapeType = (ParticleSystemShapeType)12; VelocityOverLifetimeModule velocityOverLifetime = electricityParticles.velocityOverLifetime; ((VelocityOverLifetimeModule)(ref velocityOverLifetime)).enabled = true; ((VelocityOverLifetimeModule)(ref velocityOverLifetime)).space = (ParticleSystemSimulationSpace)0; } } public void PlayConnectEffect() { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) _isConnected = true; PlaySound(connectSound); if ((Object)(object)electricityParticles != (Object)null) { EmissionModule emission = electricityParticles.emission; ((EmissionModule)(ref emission)).rateOverTime = MinMaxCurve.op_Implicit(particleEmissionRate); electricityParticles.Play(); } if ((Object)(object)electricityLoopSound != (Object)null && (Object)(object)audioSource != (Object)null) { audioSource.clip = electricityLoopSound; audioSource.loop = true; audioSource.volume = soundVolume * 0.3f; ((MonoBehaviour)this).Invoke("StartLoopSound", 0.5f); } } public void PlayDisconnectEffect() { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) _isConnected = false; PlaySound(disconnectSound); if ((Object)(object)electricityParticles != (Object)null) { EmissionModule emission = electricityParticles.emission; ((EmissionModule)(ref emission)).rateOverTime = MinMaxCurve.op_Implicit(0f); electricityParticles.Stop(); } if ((Object)(object)audioSource != (Object)null) { audioSource.Stop(); audioSource.loop = false; } ((MonoBehaviour)this).CancelInvoke("StartLoopSound"); } private void StartLoopSound() { if (_isConnected && (Object)(object)audioSource != (Object)null) { audioSource.Play(); } } private void PlaySound(AudioClip clip) { if ((Object)(object)audioSource != (Object)null && (Object)(object)clip != (Object)null) { audioSource.PlayOneShot(clip, soundVolume); } } private void Update() { if (_isConnected && (Object)(object)electricityParticles != (Object)null) { _effectTimer += Time.deltaTime; if (_effectTimer > Random.Range(0.5f, 2f)) { _effectTimer = 0f; electricityParticles.Emit(3); } } } private void OnDestroy() { if ((Object)(object)electricityParticles != (Object)null) { Object.Destroy((Object)(object)((Component)electricityParticles).gameObject); } } } public class Generator : MonoBehaviour { [Header("Settings")] [SerializeField] private float interactionRange = 3f; [SerializeField] private LayerMask playerLayer; [Header("Visual")] [SerializeField] private Light powerIndicator; [SerializeField] private Renderer generatorRenderer; [SerializeField] private Material lowEnergyMaterial; [SerializeField] private Material mediumEnergyMaterial; [SerializeField] private Material highEnergyMaterial; [SerializeField] private Material fullEnergyMaterial; [Header("UI")] [SerializeField] private GameObject energyDisplayPrefab; [SerializeField] private Transform displayPosition; [Header("Audio")] [SerializeField] private AudioSource audioSource; [SerializeField] private AudioClip chargeSound; [SerializeField] private AudioClip fullSound; [SerializeField] private AudioClip orbUseSound; private int _instanceId; private EnergySystem.GeneratorData _energyData; private bool _isBeingChargedFromShip; private static Texture2D _whiteTexture; private static readonly List _allGenerators = new List(); private float _itemChargeRange = 3f; private const float BATTERY_BAR_PERCENT = 16.666666f; private bool _wasChargingItem; private float _itemChargeTimer; private static PhysGrabber _cachedGrabber; private bool _wasDrainingItem; private float _itemDrainTimer; private const float ORB_CONSUME_RANGE = 3f; private ItemBattery _itemBattery; private bool _batteryMirrorInit; private float _lastBatteryLife; private AudioSource _humSource; private static AudioClip _humClip; private static AudioClip _zapClip; private ParticleSystem _sparkParticles; private static readonly Color VANILLA_YELLOW = new Color(1f, 0.81f, 0.1f); public static IReadOnlyList AllGenerators => _allGenerators; public int InstanceId => _instanceId; public EnergySystem.GeneratorData EnergyData => _energyData; public float CurrentEnergy => _energyData?.CurrentEnergy ?? 0f; public float MaxEnergy => _energyData?.MaxEnergy ?? 0f; public float EnergyPercentage => _energyData?.EnergyPercentage ?? 0f; private void OnEnable() { if (!_allGenerators.Contains(this)) { _allGenerators.Add(this); } } private void OnDisable() { _allGenerators.Remove(this); } private void Awake() { //IL_0118: Unknown result type (might be due to invalid IL or missing references) _instanceId = ((Object)this).GetInstanceID(); Generator[] componentsInParent = ((Component)this).GetComponentsInParent(true); Generator[] array = componentsInParent; foreach (Generator generator in array) { if ((Object)(object)generator != (Object)(object)this && generator._instanceId != 0) { Plugin.Logger.LogWarning((object)$"Duplicate Generator component detected on '{((Object)((Component)this).gameObject).name}' (ID={_instanceId}). Removing extra component only."); Object.Destroy((Object)(object)this); return; } } Generator[] components = ((Component)this).GetComponents(); if (components.Length > 1 && (Object)(object)components[0] != (Object)(object)this) { Plugin.Logger.LogWarning((object)$"Duplicate Generator component on same GameObject '{((Object)((Component)this).gameObject).name}' (ID={_instanceId}). Removing extra component only."); Object.Destroy((Object)(object)this); return; } _energyData = EnergySystem.RegisterGenerator(_instanceId); Plugin.Logger.LogInfo((object)$"Generator {_instanceId} initialized - Indestructible"); CleanupLegacyComponents(); EnsureComponents(); Plugin.Logger.LogInfo((object)$"Generator {_instanceId} spawned at {((Component)this).transform.position}. Collider={(Object)(object)((Component)this).GetComponent() != (Object)null} RB={(Object)(object)((Component)this).GetComponent() != (Object)null}"); } private void CleanupLegacyComponents() { MonoBehaviour[] components = ((Component)this).GetComponents(); MonoBehaviour[] array = components; foreach (MonoBehaviour val in array) { if (!((Object)(object)val == (Object)null)) { string name = ((object)val).GetType().Name; if (name == "ItemPrefab") { Object.Destroy((Object)(object)val); Plugin.Logger.LogDebug((object)$"Removed legacy ItemPrefab from Generator {_instanceId}"); } } } } private void EnsureComponents() { //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) Rigidbody val = ((Component)this).GetComponent(); if ((Object)(object)val == (Object)null) { val = ((Component)this).gameObject.AddComponent(); val.mass = 1f; val.drag = 0.5f; val.angularDrag = 2f; val.useGravity = true; val.interpolation = (RigidbodyInterpolation)1; val.collisionDetectionMode = (CollisionDetectionMode)1; } else { val.useGravity = true; val.drag = 0.5f; val.angularDrag = 2f; } val.constraints = (RigidbodyConstraints)0; if ((Object)(object)((Component)this).GetComponent() == (Object)null) { BoxCollider val2 = ((Component)this).gameObject.AddComponent(); val2.size = new Vector3(0.5f, 0.5f, 0.5f); val2.center = new Vector3(0f, 0.25f, 0f); Plugin.Logger.LogInfo((object)$"Runtime BoxCollider added to Generator {_instanceId}"); } EnsureGrabComponents(); if ((Object)(object)((Component)this).GetComponent() == (Object)null) { AudioSource val3 = ((Component)this).gameObject.AddComponent(); val3.spatialBlend = 1f; val3.minDistance = 1f; val3.maxDistance = 10f; } EnsureCableConnector(); } private void EnsureGrabComponents() { try { bool flag = (Object)(object)((Component)this).GetComponent() != (Object)null; bool flag2 = (Object)(object)((Component)this).GetComponent() != (Object)null; if (!flag2) { ((Component)this).gameObject.AddComponent(); } if (!flag) { ((Component)this).gameObject.AddComponent(); } int num = 0; Collider[] componentsInChildren = ((Component)this).GetComponentsInChildren(true); foreach (Collider val in componentsInChildren) { if (!val.isTrigger && (Object)(object)((Component)val).GetComponent() == (Object)null) { ((Component)val).gameObject.AddComponent(); num++; } } Plugin.Logger.LogInfo((object)$"Generator {_instanceId} grab setup: PhysGrabObject={flag}, ImpactDetector={flag2}, PhysGrabObjectColliders added={num}"); _itemBattery = ((Component)this).GetComponent(); if ((Object)(object)_itemBattery == (Object)null) { _itemBattery = ((Component)this).gameObject.AddComponent(); Plugin.Logger.LogInfo((object)$"Generator {_instanceId}: runtime ItemBattery added (vanilla charging integration)."); } _itemBattery.autoDrain = false; _itemBattery.hasBatteryVisuals = false; _itemBattery.isUnchargable = false; } catch (Exception ex) { Plugin.Logger.LogWarning((object)$"Generator {_instanceId}: could not ensure grab components: {ex.Message}"); } } private void EnsureCableConnector() { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0042: Unknown result type (might be due to invalid IL or missing references) CableConnector componentInChildren = ((Component)this).GetComponentInChildren(true); if ((Object)(object)componentInChildren == (Object)null) { GameObject val = new GameObject("CableConnector"); val.transform.SetParent(((Component)this).transform); val.transform.localPosition = new Vector3(0f, 0.5f, -0.4f); componentInChildren = val.AddComponent(); Plugin.Logger.LogInfo((object)$"Runtime CableConnector added to Generator {_instanceId}"); } } private void Update() { UpdateVisuals(); UpdateEnergyDisplay(); HandleItemCharging(); HandleItemDraining(); HandleOrbConsumption(); UpdateBatteryMirror(); UpdateAudioFx(); } private void UpdateBatteryMirror() { if ((Object)(object)_itemBattery == (Object)null || _energyData == null || !ModNetworkSync.IsHost) { return; } float num = _energyData.EnergyPercentage * 100f; if (!_batteryMirrorInit) { _itemBattery.batteryLife = num; _lastBatteryLife = num; _batteryMirrorInit = true; return; } float num2 = _itemBattery.batteryLife - _lastBatteryLife; if (num2 > 0.001f) { float amount = num2 / 100f * _energyData.MaxEnergy * 0.01f; EnergySystem.AddEnergy(_instanceId, amount); if (_energyData.IsFull) { PlaySound(fullSound); } } float num3 = _energyData.EnergyPercentage * 100f; _itemBattery.batteryLife = num3; _lastBatteryLife = num3; } private void HandleItemCharging() { //IL_004d: 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) if (_energyData == null || _energyData.IsEmpty) { _wasChargingItem = false; } else { if ((Object)(object)Camera.main == (Object)null) { return; } if (!Input.GetKey((KeyCode)102)) { _wasChargingItem = false; _itemChargeTimer = 0f; return; } float num = Vector3.Distance(((Component)this).transform.position, ((Component)Camera.main).transform.position); if (num > _itemChargeRange) { _wasChargingItem = false; _itemChargeTimer = 0f; return; } ItemBattery heldItemBattery = GetHeldItemBattery(); if ((Object)(object)heldItemBattery == (Object)null) { _wasChargingItem = false; _itemChargeTimer = 0f; return; } float batteryLife = GetBatteryLife(heldItemBattery); if (batteryLife >= 100f) { _wasChargingItem = false; _itemChargeTimer = 0f; return; } _wasChargingItem = true; _itemChargeTimer += Time.deltaTime; if (_itemChargeTimer >= 1f) { _itemChargeTimer -= 1f; if (EnergySystem.ConsumeEnergy(_instanceId, 1f)) { AddBatteryBar(heldItemBattery); Plugin.Logger.LogInfo((object)$"Generator {_instanceId}: +1 battery bar to '{((Object)((Component)heldItemBattery).gameObject).name}' (battery now {GetBatteryLife(heldItemBattery):F0}%). Generator: {_energyData.CurrentEnergy:F0}/{_energyData.MaxEnergy:F0}"); } } } } private ItemBattery GetHeldItemBattery() { if ((Object)(object)_cachedGrabber == (Object)null) { _cachedGrabber = Object.FindObjectOfType(); } if ((Object)(object)_cachedGrabber == (Object)null) { return null; } if (!_cachedGrabber.grabbed || (Object)(object)_cachedGrabber.grabbedObjectTransform == (Object)null) { return null; } Transform grabbedObjectTransform = _cachedGrabber.grabbedObjectTransform; if ((Object)(object)((Component)grabbedObjectTransform).GetComponentInParent() == (Object)(object)this) { return null; } return ((Component)grabbedObjectTransform).GetComponentInParent(); } private static float GetBatteryLife(ItemBattery battery) { return battery.batteryLife; } private static void AddBatteryBar(ItemBattery battery) { battery.batteryLife = Mathf.Min(battery.batteryLife + 16.666666f, 100f); } private void HandleItemDraining() { //IL_004d: 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) if (_energyData == null || _energyData.IsFull) { _wasDrainingItem = false; } else { if ((Object)(object)Camera.main == (Object)null) { return; } if (!Input.GetKey((KeyCode)103)) { _wasDrainingItem = false; _itemDrainTimer = 0f; return; } float num = Vector3.Distance(((Component)this).transform.position, ((Component)Camera.main).transform.position); if (num > _itemChargeRange) { _wasDrainingItem = false; _itemDrainTimer = 0f; return; } ItemBattery heldItemBattery = GetHeldItemBattery(); if ((Object)(object)heldItemBattery == (Object)null || heldItemBattery.batteryLife < 16.666666f) { _wasDrainingItem = false; _itemDrainTimer = 0f; return; } _wasDrainingItem = true; _itemDrainTimer += Time.deltaTime; if (_itemDrainTimer >= 1f) { _itemDrainTimer -= 1f; if (heldItemBattery.batteryLife >= 16.666666f) { heldItemBattery.batteryLife -= 16.666666f; EnergySystem.AddEnergy(_instanceId, 1f); PlayZap(); Plugin.Logger.LogInfo((object)$"Generator {_instanceId}: drained 1 bar from '{((Object)((Component)heldItemBattery).gameObject).name}' (+1 energy). Generator: {_energyData.CurrentEnergy:F0}/{_energyData.MaxEnergy:F0}"); } } } } private void HandleOrbConsumption() { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) if (_energyData == null || _energyData.IsFull || (Object)(object)Camera.main == (Object)null || !Input.GetKeyDown((KeyCode)103) || !ModNetworkSync.IsHost) { return; } float num = Vector3.Distance(((Component)this).transform.position, ((Component)Camera.main).transform.position); if (num > _itemChargeRange || (Object)(object)GetHeldItemBattery() != (Object)null) { return; } EnemyValuable val = null; float num2 = 3f; EnemyValuable[] array = Object.FindObjectsOfType(); foreach (EnemyValuable val2 in array) { float num3 = Vector3.Distance(((Component)this).transform.position, ((Component)val2).transform.position); if (num3 < num2) { num2 = num3; val = val2; } } if (!((Object)(object)val == (Object)null)) { float value = ConfigManager.OrbEnergyPerOrb.Value; EnergySystem.AddEnergy(_instanceId, value); SpawnOrbConsumeEffect(((Component)val).transform.position); PlayZap(); PhysGrabObject componentInParent = ((Component)val).GetComponentInParent(); if ((Object)(object)componentInParent != (Object)null) { componentInParent.DestroyPhysGrabObject(); } else { Object.Destroy((Object)(object)((Component)val).gameObject); } Plugin.Logger.LogInfo((object)$"Generator {_instanceId}: consumed orb (+{value} energy). Generator: {_energyData.CurrentEnergy:F0}/{_energyData.MaxEnergy:F0}"); } } private static void SpawnOrbConsumeEffect(Vector3 position) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_0011: 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) GameObject val = new GameObject("REPOMod_OrbConsumeFlash"); val.transform.position = position; Light val2 = val.AddComponent(); val2.type = (LightType)2; val2.color = new Color(1f, 0.85f, 0.3f); val2.range = 4f; val2.intensity = 6f; val.AddComponent(); } private void UpdateAudioFx() { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) bool flag = _wasChargingItem || _wasDrainingItem || (_energyData != null && _energyData.IsChargingFromSolar); if ((Object)(object)_humSource == (Object)null) { if ((Object)(object)_humClip == (Object)null) { _humClip = CreateHumClip(); } GameObject val = new GameObject("REPOMod_GeneratorHum"); val.transform.SetParent(((Component)this).transform, false); _humSource = val.AddComponent(); _humSource.clip = _humClip; _humSource.loop = true; _humSource.spatialBlend = 1f; _humSource.minDistance = 1f; _humSource.maxDistance = 8f; _humSource.volume = 0.35f; } if (flag && !_humSource.isPlaying) { _humSource.Play(); } else if (!flag && _humSource.isPlaying) { _humSource.Stop(); } if ((Object)(object)_sparkParticles == (Object)null) { _sparkParticles = CreateSparkParticles(((Component)this).transform); } EmissionModule emission = _sparkParticles.emission; ((EmissionModule)(ref emission)).enabled = flag; } private void PlayZap() { //IL_0046: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_zapClip == (Object)null) { _zapClip = CreateZapClip(); } if ((Object)(object)audioSource != (Object)null) { audioSource.PlayOneShot(_zapClip, 0.6f); } else { AudioSource.PlayClipAtPoint(_zapClip, ((Component)this).transform.position, 0.6f); } } private static AudioClip CreateHumClip() { int num = 44100; float[] array = new float[num]; for (int i = 0; i < num; i++) { float num2 = (float)i / 22050f; array[i] = (Mathf.Sin(MathF.PI * 120f * num2) * 0.5f + Mathf.Sin(MathF.PI * 240f * num2) * 0.3f + Mathf.Sin(MathF.PI * 360f * num2) * 0.15f) * 0.4f; } AudioClip val = AudioClip.Create("REPOMod_GenHum", num, 1, 22050, false); val.SetData(array, 0); return val; } private static AudioClip CreateZapClip() { int num = 7717; float[] array = new float[num]; Random random = new Random(777); for (int i = 0; i < num; i++) { float num2 = (float)i / (float)num; float num3 = Mathf.Exp(-8f * num2); float num4 = (float)(random.NextDouble() * 2.0 - 1.0); float num5 = Mathf.Sin(MathF.PI * 2f * (900f - 500f * num2) * ((float)i / 22050f)); array[i] = (num4 * 0.4f + num5 * 0.6f) * num3 * 0.7f; } AudioClip val = AudioClip.Create("REPOMod_Zap", num, 1, 22050, false); val.SetData(array, 0); return val; } internal static ParticleSystem CreateSparkParticles(Transform parent) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_003a: 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_0047: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0073: 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_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Expected O, but got Unknown //IL_012f: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("REPOMod_Sparks"); val.transform.SetParent(parent, false); val.transform.localPosition = Vector3.up * 0.4f; ParticleSystem val2 = val.AddComponent(); MainModule main = val2.main; ((MainModule)(ref main)).startLifetime = MinMaxCurve.op_Implicit(0.35f); ((MainModule)(ref main)).startSpeed = new MinMaxCurve(1.5f, 3.5f); ((MainModule)(ref main)).startSize = new MinMaxCurve(0.015f, 0.04f); ((MainModule)(ref main)).startColor = MinMaxGradient.op_Implicit(new Color(1f, 0.85f, 0.3f)); ((MainModule)(ref main)).maxParticles = 80; ((MainModule)(ref main)).gravityModifier = MinMaxCurve.op_Implicit(1.5f); EmissionModule emission = val2.emission; ((EmissionModule)(ref emission)).rateOverTime = MinMaxCurve.op_Implicit(25f); ((EmissionModule)(ref emission)).enabled = false; ShapeModule shape = val2.shape; ((ShapeModule)(ref shape)).shapeType = (ParticleSystemShapeType)0; ((ShapeModule)(ref shape)).radius = 0.1f; ParticleSystemRenderer component = ((Component)val2).GetComponent(); Shader val3 = Shader.Find("Particles/Standard Unlit") ?? Shader.Find("Sprites/Default"); Material val4 = new Material(val3); val4.color = new Color(1f, 0.85f, 0.3f); ((Renderer)component).material = val4; return val2; } private void UpdateVisuals() { //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: 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_008f: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) if (_energyData == null) { return; } if ((Object)(object)powerIndicator != (Object)null) { ((Behaviour)powerIndicator).enabled = _energyData.CurrentEnergy > 0f; powerIndicator.intensity = _energyData.EnergyPercentage * 2f; if (_energyData.IsFull) { powerIndicator.color = Color.green; } else if (_energyData.EnergyPercentage > 0.5f) { powerIndicator.color = Color.Lerp(Color.yellow, Color.green, _energyData.EnergyPercentage); } else { powerIndicator.color = Color.Lerp(Color.red, Color.yellow, _energyData.EnergyPercentage * 2f); } } if ((Object)(object)generatorRenderer != (Object)null) { if (_energyData.IsFull) { generatorRenderer.material = fullEnergyMaterial; } else if (_energyData.EnergyPercentage > 0.66f) { generatorRenderer.material = highEnergyMaterial; } else if (_energyData.EnergyPercentage > 0.33f) { generatorRenderer.material = mediumEnergyMaterial; } else { generatorRenderer.material = lowEnergyMaterial; } } } private void OnGUI() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Invalid comparison between Unknown and I4 //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_003a: 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_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0073: 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_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0088: 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_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Expected O, but got Unknown //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Expected O, but got Unknown //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Expected O, but got Unknown //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Expected O, but got Unknown //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: 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_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Unknown result type (might be due to invalid IL or missing references) //IL_01f7: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_0214: Unknown result type (might be due to invalid IL or missing references) //IL_021b: Unknown result type (might be due to invalid IL or missing references) //IL_024d: Unknown result type (might be due to invalid IL or missing references) //IL_0252: Unknown result type (might be due to invalid IL or missing references) //IL_0274: Unknown result type (might be due to invalid IL or missing references) //IL_0286: Unknown result type (might be due to invalid IL or missing references) //IL_02a6: Unknown result type (might be due to invalid IL or missing references) //IL_02d0: Unknown result type (might be due to invalid IL or missing references) //IL_0317: Unknown result type (might be due to invalid IL or missing references) //IL_034e: Unknown result type (might be due to invalid IL or missing references) //IL_0369: Unknown result type (might be due to invalid IL or missing references) //IL_0389: Unknown result type (might be due to invalid IL or missing references) //IL_0390: Expected O, but got Unknown //IL_03a1: Unknown result type (might be due to invalid IL or missing references) //IL_03a6: Unknown result type (might be due to invalid IL or missing references) //IL_03b8: Unknown result type (might be due to invalid IL or missing references) //IL_043e: Unknown result type (might be due to invalid IL or missing references) //IL_0448: Expected O, but got Unknown //IL_0443: Unknown result type (might be due to invalid IL or missing references) //IL_0448: Unknown result type (might be due to invalid IL or missing references) //IL_044b: Unknown result type (might be due to invalid IL or missing references) //IL_0464: Unknown result type (might be due to invalid IL or missing references) //IL_046b: Unknown result type (might be due to invalid IL or missing references) //IL_0472: Unknown result type (might be due to invalid IL or missing references) if ((int)Event.current.type != 7 || _energyData == null || (Object)(object)Camera.main == (Object)null) { return; } float num = Vector3.Distance(((Component)this).transform.position, ((Component)Camera.main).transform.position); if (num > 5f) { return; } Vector3 val = ((Component)this).transform.position + Vector3.up * 1f; Vector3 val2 = Camera.main.WorldToViewportPoint(val); if (val2.z < 0f) { return; } float num2 = val2.x * (float)Screen.width; float num3 = (1f - val2.y) * (float)Screen.height; float num4 = Mathf.Clamp01(1f - Mathf.Max(0f, num - 4f)); if (!(num4 <= 0.01f)) { if ((Object)(object)_whiteTexture == (Object)null) { _whiteTexture = new Texture2D(1, 1); _whiteTexture.SetPixel(0, 0, Color.white); _whiteTexture.Apply(); } GUIStyle val3 = new GUIStyle(GUI.skin.label); val3.alignment = (TextAnchor)4; val3.fontSize = 15; val3.fontStyle = (FontStyle)1; Color vANILLA_YELLOW = VANILLA_YELLOW; vANILLA_YELLOW.a = num4; val3.normal.textColor = vANILLA_YELLOW; string text = "GENERATOR"; if (_wasChargingItem) { text = "CHARGING ITEM [F]"; } else if (_wasDrainingItem) { text = "DRAINING ITEM [G]"; } Vector2 val4 = val3.CalcSize(new GUIContent(text)); GUIStyle val5 = new GUIStyle(val3); val5.normal.textColor = new Color(0f, 0f, 0f, num4 * 0.8f); GUI.Label(new Rect(num2 - val4.x / 2f + 1f, num3 - 34f + 1f, val4.x, val4.y), text, val5); GUI.Label(new Rect(num2 - val4.x / 2f, num3 - 34f, val4.x, val4.y), text, val3); float num5 = 96f; float num6 = 22f; float num7 = num2 - num5 / 2f; float num8 = num3 - 12f; Color color = GUI.color; GUI.color = new Color(VANILLA_YELLOW.r, VANILLA_YELLOW.g, VANILLA_YELLOW.b, num4); GUI.DrawTexture(new Rect(num7, num8, num5, num6), (Texture)(object)_whiteTexture); GUI.color = new Color(0.12f, 0.08f, 0f, num4); GUI.DrawTexture(new Rect(num7 + 2f, num8 + 2f, num5 - 4f, num6 - 4f), (Texture)(object)_whiteTexture); int num9 = Mathf.RoundToInt(_energyData.EnergyPercentage * 10f); GUI.color = new Color(VANILLA_YELLOW.r, VANILLA_YELLOW.g, VANILLA_YELLOW.b, num4); for (int i = 0; i < num9; i++) { float num10 = num7 + 4f + (float)i * 9f; GUI.DrawTexture(new Rect(num10, num8 + 4f, 7f, 14f), (Texture)(object)_whiteTexture); } GUI.color = color; if (ConfigManager.EnableDebugMode.Value) { GUIStyle val6 = new GUIStyle(GUI.skin.label); val6.alignment = (TextAnchor)4; val6.fontSize = 11; Color white = Color.white; white.a = num4; val6.normal.textColor = white; string text2 = (_energyData.IsChargingFromSolar ? $" +{_energyData.SolarChargeRate:F1}/s" : ""); string text3 = $"{_energyData.CurrentEnergy:F0}/{_energyData.MaxEnergy:F0}{text2} (ID {_instanceId})"; Vector2 val7 = val6.CalcSize(new GUIContent(text3)); GUI.Label(new Rect(num2 - val7.x / 2f, num8 + num6 + 4f, val7.x, val7.y), text3, val6); } } } private void UpdateEnergyDisplay() { if ((Object)(object)energyDisplayPrefab != (Object)null) { EnergyDisplay component = energyDisplayPrefab.GetComponent(); if ((Object)(object)component != (Object)null) { component.UpdateDisplay(_energyData.CurrentEnergy, _energyData.MaxEnergy, _energyData.IsChargingFromSolar, _energyData.SolarChargeRate); } } } public bool ChargeFromShip(float baseEnergy) { if (_energyData == null) { return false; } if (_energyData.IsFull) { PlaySound(fullSound); return false; } bool flag = EnergySystem.AddEnergyFromShip(_instanceId, baseEnergy); if (flag) { PlaySound(chargeSound); Plugin.Logger.LogInfo((object)$"Generator {_instanceId} charged from ship. Energy: {_energyData.CurrentEnergy}/{_energyData.MaxEnergy}"); } return flag; } public float UseOrbAsFuel(float orbValue) { if (_energyData == null) { return 0f; } if (_energyData.IsFull) { PlaySound(fullSound); return 0f; } float num = EnergySystem.AddEnergyFromOrb(_instanceId, orbValue); if (num > 0f) { PlaySound(orbUseSound); Plugin.Logger.LogInfo((object)$"Generator {_instanceId} charged with orb. Energy gained: {num}, Total: {_energyData.CurrentEnergy}/{_energyData.MaxEnergy}"); } return num; } public bool ConsumeEnergy(float amount) { if (_energyData == null) { return false; } return EnergySystem.ConsumeEnergy(_instanceId, amount); } public Vector3 GetCableConnectionPoint() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0015: 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) return ((Component)this).transform.position + Vector3.up * 1f; } private void PlaySound(AudioClip clip) { if ((Object)(object)audioSource != (Object)null && (Object)(object)clip != (Object)null) { audioSource.PlayOneShot(clip); } } private void OnDestroy() { if (_energyData != null) { EnergySystem.UnregisterGenerator(_instanceId); } } private void OnDrawGizmosSelected() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0020: 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) Gizmos.color = Color.blue; Gizmos.DrawWireSphere(((Component)this).transform.position, interactionRange); Gizmos.color = Color.cyan; Gizmos.DrawSphere(GetCableConnectionPoint(), 0.1f); } } public class OrbConsumeFlash : MonoBehaviour { private Light _light; private float _life = 0.6f; private float _maxIntensity; private void Awake() { _light = ((Component)this).GetComponent(); _maxIntensity = (((Object)(object)_light != (Object)null) ? _light.intensity : 0f); } private void Update() { _life -= Time.deltaTime; if ((Object)(object)_light != (Object)null) { _light.intensity = _maxIntensity * Mathf.Clamp01(_life / 0.6f); } if (_life <= 0f) { Object.Destroy((Object)(object)((Component)this).gameObject); } } } public class EnergyDisplay : MonoBehaviour { [SerializeField] private TextMeshPro energyText; [SerializeField] private Slider energySlider; [SerializeField] private GameObject chargingIndicator; public void UpdateDisplay(float current, float max, bool isCharging, float chargeRate) { if ((Object)(object)energyText != (Object)null) { string text = (isCharging ? $" (+{chargeRate:F1}/s)" : ""); ((TMP_Text)energyText).text = string.Format("{0}: {1:F0}/{2:F0}{3}", LocalizationManager.Get("ui_energy"), current, max, text); } if ((Object)(object)energySlider != (Object)null) { energySlider.value = ((max > 0f) ? (current / max) : 0f); } if ((Object)(object)chargingIndicator != (Object)null) { chargingIndicator.SetActive(isCharging); } } } public class GeneratorLight : MonoBehaviour { [Header("Light Settings")] [SerializeField] private Light generatorLight; [SerializeField] private Renderer glowRenderer; [SerializeField] private float baseIntensity = 2f; [SerializeField] private float maxIntensity = 10f; [Header("Color Settings")] [SerializeField] private Color lowEnergyColor = new Color(1f, 0.3f, 0.1f); [SerializeField] private Color mediumEnergyColor = new Color(1f, 0.8f, 0.2f); [SerializeField] private Color highEnergyColor = new Color(0.2f, 1f, 0.3f); [SerializeField] private Color fullEnergyColor = new Color(0.8f, 1f, 0.9f); [Header("Pulse Settings")] [SerializeField] private float pulseSpeed = 2f; [SerializeField] private float pulseAmount = 0.3f; private Generator _generator; private float _pulseTimer; private bool _isCharging; private bool _isDischarging; private void Awake() { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown //IL_003c: 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) _generator = ((Component)this).GetComponent(); if ((Object)(object)generatorLight == (Object)null) { GameObject val = new GameObject("GeneratorLight"); val.transform.SetParent(((Component)this).transform); val.transform.localPosition = Vector3.up * 0.5f; generatorLight = val.AddComponent(); generatorLight.type = (LightType)2; generatorLight.range = 10f; generatorLight.shadows = (LightShadows)0; } } private void Update() { if (!((Object)(object)_generator == (Object)null) && _generator.EnergyData != null) { UpdateLightState(); UpdateColor(); UpdateIntensity(); UpdatePulse(); } } private void UpdateLightState() { _isCharging = _generator.EnergyData.IsChargingFromSolar || _generator.EnergyData.CurrentEnergy > 0f; _isDischarging = _generator.EnergyData.CurrentEnergy > 0f; } private void UpdateColor() { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_0069: 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_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) float energyPercentage = _generator.EnergyPercentage; Color val = (_generator.EnergyData.IsFull ? fullEnergyColor : ((energyPercentage > 0.66f) ? highEnergyColor : ((!(energyPercentage > 0.33f)) ? lowEnergyColor : mediumEnergyColor))); float efficiency = _generator.EnergyData.Efficiency; if (efficiency > 1.5f) { val = Color.Lerp(val, Color.cyan, 0.2f); } generatorLight.color = Color.Lerp(generatorLight.color, val, Time.deltaTime * 5f); if ((Object)(object)glowRenderer != (Object)null) { glowRenderer.material.SetColor("_EmissionColor", val * 2f); glowRenderer.material.EnableKeyword("_EMISSION"); } } private void UpdateIntensity() { float energyPercentage = _generator.EnergyPercentage; float efficiency = _generator.EnergyData.Efficiency; float num = Mathf.Lerp(baseIntensity, maxIntensity, energyPercentage); float num2 = Mathf.Clamp(efficiency / 2f, 0.5f, 2f); num *= num2; if (_isCharging) { num *= 1.3f; } generatorLight.intensity = Mathf.Lerp(generatorLight.intensity, num, Time.deltaTime * 3f); } private void UpdatePulse() { if (_generator.EnergyData.IsFull) { _pulseTimer += Time.deltaTime * pulseSpeed; float num = Mathf.Sin(_pulseTimer) * pulseAmount + 1f; Light obj = generatorLight; obj.intensity *= num; } } public float GetDetectionRange() { return generatorLight.range * (generatorLight.intensity / baseIntensity); } } public class GeneratorOverload : MonoBehaviour { [Header("Overload Settings")] [SerializeField] private float overloadCheckInterval = 1f; [SerializeField] private float overloadTriggerTime = 180f; [SerializeField] private float lockDuration = 60f; [SerializeField] private float cooldownDuration = 300f; [SerializeField] private float energyLossPercentage = 0.1f; [Header("Visual Effects")] [SerializeField] private ParticleSystem sparkParticles; [SerializeField] private Light overloadLight; [SerializeField] private AudioSource audioSource; [SerializeField] private AudioClip overloadWarningSound; [SerializeField] private AudioClip overloadTripSound; private Generator _generator; private bool _isOverloaded; private bool _isLocked; private float _overloadTimer; private float _lockTimer; private float _cooldownTimer; private bool _warningPlayed; public bool IsLocked => _isLocked; public bool IsOverloaded => _isOverloaded; public float RemainingLockTime => _lockTimer; private void Awake() { _generator = ((Component)this).GetComponent(); } private void Update() { if (!((Object)(object)_generator == (Object)null) && _generator.EnergyData != null) { UpdateCooldown(); if (_isLocked) { UpdateLock(); } else if (_isOverloaded) { UpdateOverload(); } else { CheckForOverload(); } } } private void UpdateCooldown() { if (_cooldownTimer > 0f) { _cooldownTimer -= Time.deltaTime; } } private void CheckForOverload() { if (_generator.EnergyData.IsFull && _generator.EnergyData.IsConnectedToSolar && DayNightCycle.CanSolarPanelsCharge() && !(_cooldownTimer > 0f)) { _isOverloaded = true; _overloadTimer = 0f; _warningPlayed = false; Plugin.Logger.LogInfo((object)"Generator entering overload state! Disconnect cable or reduce input!"); } } private void UpdateOverload() { _overloadTimer += Time.deltaTime; if (!_warningPlayed && (Object)(object)overloadWarningSound != (Object)null && (Object)(object)audioSource != (Object)null) { audioSource.PlayOneShot(overloadWarningSound); _warningPlayed = true; } UpdateOverloadEffects(); if (!_generator.EnergyData.IsConnectedToSolar || !_generator.EnergyData.IsFull) { ResetOverload(); } else if (_overloadTimer >= overloadTriggerTime) { TriggerOverload(); } } private void UpdateOverloadEffects() { //IL_00a1: 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_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: 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) if ((Object)(object)sparkParticles != (Object)null) { if (!sparkParticles.isPlaying) { sparkParticles.Play(); } EmissionModule emission = sparkParticles.emission; ((EmissionModule)(ref emission)).rateOverTime = MinMaxCurve.op_Implicit(Mathf.Lerp(10f, 50f, _overloadTimer / overloadTriggerTime)); } if ((Object)(object)overloadLight != (Object)null) { ((Behaviour)overloadLight).enabled = true; overloadLight.intensity = Mathf.Lerp(1f, 3f, _overloadTimer / overloadTriggerTime); overloadLight.color = Color.Lerp(Color.yellow, Color.red, _overloadTimer / overloadTriggerTime); } } private void TriggerOverload() { _isOverloaded = false; _isLocked = true; _lockTimer = lockDuration; _cooldownTimer = cooldownDuration; float num = _generator.EnergyData.CurrentEnergy * energyLossPercentage; _generator.EnergyData.CurrentEnergy -= num; if ((Object)(object)overloadTripSound != (Object)null && (Object)(object)audioSource != (Object)null) { audioSource.PlayOneShot(overloadTripSound); } StopOverloadEffects(); Plugin.Logger.LogWarning((object)$"Generator overloaded! Lost {num:F0} energy. Locked for {lockDuration:F0} seconds."); NotificationManager.Show($"OVERLOAD! Lost {num:F0} energy. Generator locked for {(int)lockDuration}s"); } private void UpdateLock() { _lockTimer -= Time.deltaTime; if (_lockTimer <= 0f) { _isLocked = false; Plugin.Logger.LogInfo((object)"Generator unlocked."); } } private void ResetOverload() { _isOverloaded = false; _overloadTimer = 0f; _warningPlayed = false; StopOverloadEffects(); Plugin.Logger.LogInfo((object)"Overload reset - cable disconnected."); } private void StopOverloadEffects() { if ((Object)(object)sparkParticles != (Object)null) { sparkParticles.Stop(); } if ((Object)(object)overloadLight != (Object)null) { ((Behaviour)overloadLight).enabled = false; } } public void ManualReset() { ResetOverload(); _isLocked = false; _lockTimer = 0f; _cooldownTimer = 0f; } private void OnDestroy() { StopOverloadEffects(); } } public class GeneratorSound : MonoBehaviour { [Header("Audio Settings")] [SerializeField] private AudioSource audioSource; [SerializeField] private AudioClip humLoopSound; [SerializeField] private AudioClip chargeLoopSound; [SerializeField] private AudioClip dischargeLoopSound; [Header("Sound Properties")] [SerializeField] private float baseVolume = 0.1f; [SerializeField] private float maxVolume = 0.4f; [SerializeField] private float basePitch = 0.8f; [SerializeField] private float maxPitch = 1.5f; [SerializeField] private float minFrequency = 50f; [Header("Range Settings")] [SerializeField] private float baseHearingRange = 10f; [SerializeField] private float maxHearingRange = 30f; private Generator _generator; private bool _isPlaying; private float _targetVolume; private float _targetPitch; private static float _loudestGeneratorRange; private static Vector3 _loudestGeneratorPosition; public static float LoudestGeneratorRange => _loudestGeneratorRange; public static Vector3 LoudestGeneratorPosition => _loudestGeneratorPosition; public float CurrentHearingRange { get; private set; } private void Awake() { _generator = ((Component)this).GetComponent(); if ((Object)(object)audioSource == (Object)null) { audioSource = ((Component)this).gameObject.AddComponent(); audioSource.spatialBlend = 1f; audioSource.loop = true; audioSource.playOnAwake = false; audioSource.minDistance = 2f; audioSource.maxDistance = maxHearingRange; audioSource.rolloffMode = (AudioRolloffMode)1; } } private void Update() { if (!((Object)(object)_generator == (Object)null) && _generator.EnergyData != null) { UpdateSoundState(); UpdateVolume(); UpdatePitch(); UpdateHearingRange(); } } private void UpdateSoundState() { bool flag = _generator.EnergyData.CurrentEnergy > 0f; if (flag && !_isPlaying) { PlayHum(); } else if (!flag && _isPlaying) { StopHum(); } } private void PlayHum() { if (!((Object)(object)audioSource == (Object)null) && !((Object)(object)humLoopSound == (Object)null)) { audioSource.clip = humLoopSound; audioSource.Play(); _isPlaying = true; } } private void StopHum() { if (!((Object)(object)audioSource == (Object)null)) { audioSource.Stop(); _isPlaying = false; } } private void UpdateVolume() { if (_isPlaying) { float energyPercentage = _generator.EnergyPercentage; float efficiency = _generator.EnergyData.Efficiency; _targetVolume = Mathf.Lerp(baseVolume, maxVolume, energyPercentage); float num = Mathf.Clamp(efficiency / 2f, 0.5f, 2f); _targetVolume *= num; if (_generator.EnergyData.IsChargingFromSolar) { _targetVolume *= 1.2f; } audioSource.volume = Mathf.Lerp(audioSource.volume, _targetVolume, Time.deltaTime * 2f); } } private void UpdatePitch() { if (_isPlaying) { float energyPercentage = _generator.EnergyPercentage; _targetPitch = Mathf.Lerp(basePitch, maxPitch, energyPercentage); float efficiency = _generator.EnergyData.Efficiency; if (efficiency > 1.5f) { _targetPitch *= 1.1f; } audioSource.pitch = Mathf.Lerp(audioSource.pitch, _targetPitch, Time.deltaTime * 2f); } } private void UpdateHearingRange() { //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) float energyPercentage = _generator.EnergyPercentage; float efficiency = _generator.EnergyData.Efficiency; CurrentHearingRange = Mathf.Lerp(baseHearingRange, maxHearingRange, energyPercentage); float num = Mathf.Clamp(efficiency / 2f, 0.5f, 2f); CurrentHearingRange *= num; if (CurrentHearingRange > _loudestGeneratorRange) { _loudestGeneratorRange = CurrentHearingRange; _loudestGeneratorPosition = ((Component)this).transform.position; } if ((Object)(object)audioSource != (Object)null) { audioSource.maxDistance = CurrentHearingRange; } } public float GetHearingRange() { return CurrentHearingRange; } private void OnDestroy() { if (_isPlaying) { StopHum(); } } } public class GeneratorWeight : MonoBehaviour { [Header("Weight Settings")] [SerializeField] private float speedReduction = 0.3f; [SerializeField] private float jumpReduction = 0.2f; private Generator _generator; private bool _isCarried; private float _originalSpeed; private float _originalJump; private static bool _anyGeneratorCarried; private static float _totalSpeedReduction; public static bool IsAnyGeneratorCarried => _anyGeneratorCarried; public static float TotalSpeedReduction => _totalSpeedReduction; private void Awake() { _generator = ((Component)this).GetComponent(); } private void OnEnable() { Item component = ((Component)this).GetComponent(); _ = (Object)(object)component != (Object)null; } public void OnPickup() { if (!_isCarried) { _isCarried = true; _anyGeneratorCarried = true; _totalSpeedReduction = speedReduction; ApplySpeedReduction(); Plugin.Logger.LogInfo((object)"Generator picked up. Player speed reduced by 30%."); } } public void OnDrop() { if (_isCarried) { _isCarried = false; _anyGeneratorCarried = false; _totalSpeedReduction = 0f; RemoveSpeedReduction(); Plugin.Logger.LogInfo((object)"Generator dropped. Player speed restored."); } } private void ApplySpeedReduction() { PlayerController val = Object.FindObjectOfType(); if (!((Object)(object)val == (Object)null)) { Plugin.Logger.LogInfo((object)$"Applied speed reduction: {speedReduction:P0}"); } } private void RemoveSpeedReduction() { PlayerController val = Object.FindObjectOfType(); if (!((Object)(object)val == (Object)null)) { Plugin.Logger.LogInfo((object)"Removed speed reduction."); } } public static float GetSpeedMultiplier() { if (!_anyGeneratorCarried) { return 1f; } return 1f - _totalSpeedReduction; } private void OnDestroy() { if (_isCarried) { RemoveSpeedReduction(); _anyGeneratorCarried = false; _totalSpeedReduction = 0f; } } } public static class ItemManager { private const string BundleFileName = "repomod.assets"; public static void RegisterItems() { try { string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string text = Path.Combine(directoryName, "repomod.assets"); if (!File.Exists(text)) { Plugin.Logger.LogError((object)("Asset bundle not found at: " + text)); return; } BundleLoader.LoadBundle(text, (Action)delegate(AssetBundle assetBundle) { if ((Object)(object)assetBundle == (Object)null) { Plugin.Logger.LogError((object)"Failed to load asset bundle!"); } else { RegisterSolarPanel(assetBundle); RegisterGenerator(assetBundle); Plugin.Logger.LogInfo((object)"All items registered successfully!"); } }, false); } catch (Exception ex) { Plugin.Logger.LogError((object)("Error loading items: " + ex.Message)); } } private static void RegisterSolarPanel(AssetBundle bundle) { try { ItemContent val = bundle.LoadAsset("SolarPanel_Item"); if ((Object)(object)val != (Object)null) { Items.RegisterItem(val); Plugin.Logger.LogInfo((object)"Solar Panel item registered."); } else { Plugin.Logger.LogWarning((object)"SolarPanel_Item not found in bundle."); } } catch (Exception ex) { Plugin.Logger.LogError((object)("Error registering Solar Panel: " + ex.Message)); } } private static void RegisterGenerator(AssetBundle bundle) { try { ItemContent val = bundle.LoadAsset("Generator_Item"); if ((Object)(object)val != (Object)null) { int num = Random.Range(300000, 600001); PropertyInfo propertyInfo = ((object)val).GetType().GetProperty("value") ?? ((object)val).GetType().GetProperty("Value"); if (propertyInfo != null && propertyInfo.CanWrite) { propertyInfo.SetValue(val, num); Plugin.Logger.LogInfo((object)$"Generator price set to {num}."); } else { (((object)val).GetType().GetField("value") ?? ((object)val).GetType().GetField("Value"))?.SetValue(val, num); Plugin.Logger.LogInfo((object)$"Generator price field set to {num}."); } Items.RegisterItem(val); Plugin.Logger.LogInfo((object)"Generator item registered."); } else { Plugin.Logger.LogWarning((object)"Generator_Item not found in bundle."); } } catch (Exception ex) { Plugin.Logger.LogError((object)("Error registering Generator: " + ex.Message)); } } } public class OrbFuelHandler : MonoBehaviour { [Header("Settings")] [SerializeField] private float interactionRange = 2f; [SerializeField] private LayerMask generatorLayer; [Header("Visual")] [SerializeField] private GameObject fuelEffectPrefab; [SerializeField] private Light glowLight; [Header("Audio")] [SerializeField] private AudioSource audioSource; [SerializeField] private AudioClip fuelUseSound; private Item _item; private float _orbValue; private bool _isBeingUsed; public float OrbValue => _orbValue; private void Awake() { _item = ((Component)this).GetComponent(); if ((Object)(object)_item != (Object)null) { _orbValue = GetItemDollarValue(_item); } } private static float GetItemDollarValue(Item item) { FieldInfo field = typeof(Item).GetField("dollarValue", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { return Convert.ToSingle(field.GetValue(item)); } FieldInfo field2 = typeof(Item).GetField("itemValue", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field2 != null) { return Convert.ToSingle(field2.GetValue(item)); } return 1000f; } private void Update() { CheckForGeneratorInteraction(); } private void CheckForGeneratorInteraction() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) Collider[] array = Physics.OverlapSphere(((Component)this).transform.position, interactionRange, LayerMask.op_Implicit(generatorLayer)); Collider[] array2 = array; foreach (Collider val in array2) { Generator component = ((Component)val).GetComponent(); if ((Object)(object)component != (Object)null) { if (Input.GetKeyDown((KeyCode)101)) { UseAsFuel(component); } break; } } } public bool UseAsFuel(Generator generator) { if ((Object)(object)generator == (Object)null) { return false; } if (_isBeingUsed) { return false; } _isBeingUsed = true; if (generator.EnergyData != null && generator.EnergyData.IsFull) { Plugin.Logger.LogInfo((object)"Generator is full! Cannot use orb."); NotificationManager.Show(LocalizationManager.Get("msg_generator_full")); _isBeingUsed = false; return false; } float potentialEnergy = GetPotentialEnergy(); float num = generator.MaxEnergy - generator.CurrentEnergy; if (potentialEnergy > num) { Plugin.Logger.LogWarning((object)$"Orb energy ({potentialEnergy:F1}) exceeds remaining capacity ({num:F1}). Some energy will be wasted."); } float num2 = generator.UseOrbAsFuel(_orbValue); if (num2 > 0f) { PlayFuelEffects(); NotificationManager.Show(LocalizationManager.Get("msg_orb_used", num2.ToString("F1"))); Plugin.Logger.LogInfo((object)$"Orb used as fuel. Value: ${_orbValue}, Energy gained: {num2}"); Object.Destroy((Object)(object)((Component)this).gameObject); return true; } _isBeingUsed = false; return false; } private void PlayFuelEffects() { //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)audioSource != (Object)null && (Object)(object)fuelUseSound != (Object)null) { audioSource.PlayOneShot(fuelUseSound); } if ((Object)(object)fuelEffectPrefab != (Object)null) { Object.Instantiate(fuelEffectPrefab, ((Component)this).transform.position, Quaternion.identity); } if ((Object)(object)glowLight != (Object)null) { ((MonoBehaviour)this).StartCoroutine(FlashLight()); } } private IEnumerator FlashLight() { ((Behaviour)glowLight).enabled = true; glowLight.intensity = 3f; float elapsed = 0f; float duration = 0.5f; while (elapsed < duration) { elapsed += Time.deltaTime; glowLight.intensity = Mathf.Lerp(3f, 0f, elapsed / duration); yield return null; } ((Behaviour)glowLight).enabled = false; } public float GetPotentialEnergy() { return ConfigManager.OrbEnergyPerOrb.Value; } private void OnDrawGizmosSelected() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) Gizmos.color = Color.magenta; Gizmos.DrawWireSphere(((Component)this).transform.position, interactionRange); } } public class OrbSmelter : MonoBehaviour { [Header("Smelter Settings")] [SerializeField] private float meltDuration = 10f; [SerializeField] private float interactionRange = 2f; [Header("Visual")] [SerializeField] private Transform hopperCover; [SerializeField] private Transform orbVisual; [SerializeField] private ParticleSystem meltParticles; [SerializeField] private Light meltLight; [SerializeField] private Renderer glassRenderer; [SerializeField] private Material glassOpenMaterial; [SerializeField] private Material glassClosedMaterial; [Header("Audio")] [SerializeField] private AudioSource audioSource; [SerializeField] private AudioClip insertSound; [SerializeField] private AudioClip meltLoopSound; [SerializeField] private AudioClip completeSound; private Generator _generator; private bool _isMelting; private float _meltTimer; private float _currentOrbValue; private bool _coverOpen = true; public bool IsMelting => _isMelting; public float MeltProgress { get { if (!_isMelting) { return 0f; } return _meltTimer / meltDuration; } } public float RemainingTime { get { if (!_isMelting) { return 0f; } return meltDuration - _meltTimer; } } private void Awake() { _generator = ((Component)this).GetComponent(); if ((Object)(object)_generator == (Object)null) { Plugin.Logger.LogError((object)"OrbSmelter requires Generator component!"); ((Behaviour)this).enabled = false; } } private void Update() { if (_isMelting) { UpdateMelting(); } else { CheckForInteraction(); } } private void CheckForInteraction() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) Collider[] array = Physics.OverlapSphere(((Component)this).transform.position, interactionRange); Collider[] array2 = array; foreach (Collider val in array2) { OrbFuelHandler component = ((Component)val).GetComponent(); if ((Object)(object)component != (Object)null && Input.GetKeyDown((KeyCode)101)) { StartMelting(component); break; } } } public bool StartMelting(OrbFuelHandler orbFuel) { if ((Object)(object)orbFuel == (Object)null) { return false; } if (_isMelting) { return false; } if (_generator.EnergyData != null && _generator.EnergyData.IsFull) { NotificationManager.Show(LocalizationManager.Get("msg_generator_full")); return false; } _currentOrbValue = orbFuel.OrbValue; _isMelting = true; _meltTimer = 0f; CloseCover(); PlaySound(insertSound); if ((Object)(object)meltParticles != (Object)null) { meltParticles.Play(); } if ((Object)(object)audioSource != (Object)null && (Object)(object)meltLoopSound != (Object)null) { audioSource.clip = meltLoopSound; audioSource.loop = true; audioSource.Play(); } Object.Destroy((Object)(object)((Component)orbFuel).gameObject); Plugin.Logger.LogInfo((object)$"Orb smelting started. Value: ${_currentOrbValue}. Melting for {meltDuration} seconds."); return true; } private void UpdateMelting() { _meltTimer += Time.deltaTime; UpdateMeltEffects(); if (_meltTimer >= meltDuration) { CompleteMelting(); } } private void UpdateMeltEffects() { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0057: 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_006f: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) float num = _meltTimer / meltDuration; if ((Object)(object)orbVisual != (Object)null) { float num2 = Mathf.Lerp(1f, 0.1f, num); orbVisual.localScale = Vector3.one * num2; } if ((Object)(object)meltParticles != (Object)null) { EmissionModule emission = meltParticles.emission; ((EmissionModule)(ref emission)).rateOverTime = MinMaxCurve.op_Implicit(Mathf.Lerp(20f, 5f, num)); } if ((Object)(object)meltLight != (Object)null) { meltLight.intensity = Mathf.Lerp(2f, 0.5f, num); meltLight.color = Color.Lerp(Color.cyan, Color.blue, num); } } private void CompleteMelting() { //IL_0088: Unknown result type (might be due to invalid IL or missing references) _isMelting = false; float value = ConfigManager.OrbEnergyPerOrb.Value; float num = _generator.UseOrbAsFuel(_currentOrbValue); OpenCover(); PlaySound(completeSound); if ((Object)(object)meltParticles != (Object)null) { meltParticles.Stop(); } if ((Object)(object)audioSource != (Object)null) { audioSource.Stop(); audioSource.loop = false; } if ((Object)(object)orbVisual != (Object)null) { orbVisual.localScale = Vector3.zero; } if ((Object)(object)meltLight != (Object)null) { ((Behaviour)meltLight).enabled = false; } NotificationManager.Show(LocalizationManager.Get("msg_orb_used", num.ToString("F1"))); Plugin.Logger.LogInfo((object)$"Orb smelting complete. Energy gained: {num:F1}"); } private void CloseCover() { _coverOpen = false; if ((Object)(object)glassRenderer != (Object)null && (Object)(object)glassClosedMaterial != (Object)null) { glassRenderer.material = glassClosedMaterial; } if ((Object)(object)hopperCover != (Object)null) { ((MonoBehaviour)this).StartCoroutine(AnimateCover(opening: false)); } } private void OpenCover() { _coverOpen = true; if ((Object)(object)glassRenderer != (Object)null && (Object)(object)glassOpenMaterial != (Object)null) { glassRenderer.material = glassOpenMaterial; } if ((Object)(object)hopperCover != (Object)null) { ((MonoBehaviour)this).StartCoroutine(AnimateCover(opening: true)); } } private IEnumerator AnimateCover(bool opening) { float duration = 0.5f; float elapsed = 0f; Vector3 startPos = hopperCover.localPosition; Vector3 endPos = (opening ? (startPos + Vector3.up * 0.2f) : (startPos - Vector3.up * 0.2f)); while (elapsed < duration) { elapsed += Time.deltaTime; float num = elapsed / duration; hopperCover.localPosition = Vector3.Lerp(startPos, endPos, num); yield return null; } hopperCover.localPosition = endPos; } private void PlaySound(AudioClip clip) { if ((Object)(object)audioSource != (Object)null && (Object)(object)clip != (Object)null) { audioSource.PlayOneShot(clip, ConfigManager.ConnectSoundVolume.Value); } } private void OnDrawGizmosSelected() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) Gizmos.color = Color.cyan; Gizmos.DrawWireSphere(((Component)this).transform.position, interactionRange); } } public static class RuntimeItemLoader { private static Material _solarPanelMaterial; private static Material _generatorMaterial; private static Texture2D _solarPanelTexture; private static Texture2D _generatorTexture; public static void Initialize() { string directoryName = Path.GetDirectoryName(typeof(RuntimeItemLoader).Assembly.Location); string basePath = Path.Combine(directoryName, "..", "..", ".."); LoadTextures(basePath); CreateMaterials(); Plugin.Logger.LogInfo((object)"Runtime item loader initialized."); } private static void LoadTextures(string basePath) { //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Expected O, but got Unknown string text = Path.Combine(basePath, "solar-panel", "textures", "Mat_Color.jpg"); if (File.Exists(text)) { byte[] array = File.ReadAllBytes(text); _solarPanelTexture = new Texture2D(2, 2); ImageConversion.LoadImage(_solarPanelTexture, array); Plugin.Logger.LogInfo((object)"Solar panel texture loaded."); } else { Plugin.Logger.LogWarning((object)("Solar panel texture not found: " + text)); _solarPanelTexture = CreateFallbackTexture(new Color(0.12f, 0.23f, 0.37f)); } string text2 = Path.Combine(basePath, "generator", "textures", "lambert1_albedo.jpeg"); if (File.Exists(text2)) { byte[] array2 = File.ReadAllBytes(text2); _generatorTexture = new Texture2D(2, 2); ImageConversion.LoadImage(_generatorTexture, array2); Plugin.Logger.LogInfo((object)"Generator texture loaded."); } else { Plugin.Logger.LogWarning((object)("Generator texture not found: " + text2)); _generatorTexture = CreateFallbackTexture(new Color(0.18f, 0.29f, 0.23f)); } } private static void CreateMaterials() { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_006e: 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_008c: Expected O, but got Unknown //IL_00e6: Unknown result type (might be due to invalid IL or missing references) _solarPanelMaterial = new Material(Shader.Find("Standard")); ((Object)_solarPanelMaterial).name = "SolarPanel_Runtime"; _solarPanelMaterial.mainTexture = (Texture)(object)_solarPanelTexture; _solarPanelMaterial.SetFloat("_Metallic", 0.8f); _solarPanelMaterial.SetFloat("_Glossiness", 0.6f); _solarPanelMaterial.color = new Color(0.12f, 0.23f, 0.37f); _generatorMaterial = new Material(Shader.Find("Standard")); ((Object)_generatorMaterial).name = "Generator_Runtime"; _generatorMaterial.mainTexture = (Texture)(object)_generatorTexture; _generatorMaterial.SetFloat("_Metallic", 0.7f); _generatorMaterial.SetFloat("_Glossiness", 0.5f); _generatorMaterial.color = new Color(0.18f, 0.29f, 0.23f); } private static Texture2D CreateFallbackTexture(Color color) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Expected O, but got Unknown //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(64, 64); Color[] array = (Color[])(object)new Color[4096]; for (int i = 0; i < array.Length; i++) { array[i] = color; } val.SetPixels(array); val.Apply(); return val; } public static GameObject CreateSolarPanel() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_0046: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("SolarPanel"); MeshFilter val2 = val.AddComponent(); MeshRenderer val3 = val.AddComponent(); val2.mesh = GenerateSolarPanelMesh(); ((Renderer)val3).material = _solarPanelMaterial; BoxCollider val4 = val.AddComponent(); val4.size = new Vector3(4.3f, 0.15f, 2.1f); val.AddComponent(); Plugin.Logger.LogInfo((object)"Solar panel created at runtime."); return val; } public static GameObject CreateGenerator() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_0046: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("Generator"); MeshFilter val2 = val.AddComponent(); MeshRenderer val3 = val.AddComponent(); val2.mesh = GenerateGeneratorMesh(); ((Renderer)val3).material = _generatorMaterial; BoxCollider val4 = val.AddComponent(); val4.size = new Vector3(1f, 1.2f, 1f); val.AddComponent(); val.AddComponent(); Plugin.Logger.LogInfo((object)"Generator created at runtime."); return val; } private static Mesh GenerateSolarPanelMesh() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: 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_0049: 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_0064: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: 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_009a: 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_00b5: 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_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: 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_0106: Unknown result type (might be due to invalid IL or missing references) //IL_011d: 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_0139: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_015a: 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_0176: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_01a9: 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_01c5: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_01fd: 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_0219: Unknown result type (might be due to invalid IL or missing references) //IL_021e: Unknown result type (might be due to invalid IL or missing references) //IL_0235: Unknown result type (might be due to invalid IL or missing references) //IL_023a: Unknown result type (might be due to invalid IL or missing references) //IL_0251: Unknown result type (might be due to invalid IL or missing references) //IL_0256: Unknown result type (might be due to invalid IL or missing references) //IL_026d: Unknown result type (might be due to invalid IL or missing references) //IL_0272: Unknown result type (might be due to invalid IL or missing references) //IL_0289: Unknown result type (might be due to invalid IL or missing references) //IL_028e: Unknown result type (might be due to invalid IL or missing references) //IL_02a5: Unknown result type (might be due to invalid IL or missing references) //IL_02aa: Unknown result type (might be due to invalid IL or missing references) //IL_02c1: Unknown result type (might be due to invalid IL or missing references) //IL_02c6: Unknown result type (might be due to invalid IL or missing references) //IL_02dd: Unknown result type (might be due to invalid IL or missing references) //IL_02e2: Unknown result type (might be due to invalid IL or missing references) //IL_02f9: Unknown result type (might be due to invalid IL or missing references) //IL_02fe: Unknown result type (might be due to invalid IL or missing references) //IL_0315: Unknown result type (might be due to invalid IL or missing references) //IL_031a: Unknown result type (might be due to invalid IL or missing references) Mesh val = new Mesh(); ((Object)val).name = "SolarPanel_Runtime"; Vector3[] vertices = (Vector3[])(object)new Vector3[28] { new Vector3(-1.8175f, -0.0782f, 0.1603f), new Vector3(-1.8175f, -0.0017f, 0.1603f), new Vector3(-1.2663f, -0.0782f, 0.1603f), new Vector3(-1.2663f, -0.0017f, 0.1603f), new Vector3(-1.2663f, -0.0782f, -0.1603f), new Vector3(-1.2663f, -0.0017f, -0.1603f), new Vector3(-1.8175f, -0.0782f, -0.1603f), new Vector3(-1.8175f, -0.0017f, -0.1603f), new Vector3(-2.1627f, 0.0346f, -1.036f), new Vector3(-2.1267f, 0.0176f, 1f), new Vector3(2.1627f, 0.0346f, -1.036f), new Vector3(2.1267f, 0.0176f, 1f), new Vector3(2.1627f, 0.0346f, 1.036f), new Vector3(2.1267f, 0.0176f, -1f), new Vector3(-2.1627f, 0.0346f, 1.036f), new Vector3(-2.1267f, 0.0176f, -1f), new Vector3(-2.1627f, -0.0176f, 1.036f), new Vector3(-2.1627f, 0.0176f, 1.036f), new Vector3(2.1627f, -0.0176f, 1.036f), new Vector3(2.1627f, 0.0176f, 1.036f), new Vector3(2.1627f, -0.0176f, -1.036f), new Vector3(2.1627f, 0.0176f, -1.036f), new Vector3(-2.1627f, -0.0176f, -1.036f), new Vector3(-2.1627f, 0.0176f, -1.036f), new Vector3(-2.1267f, 0.0346f, 1f), new Vector3(2.1267f, 0.0346f, 1f), new Vector3(2.1267f, 0.0346f, -1f), new Vector3(-2.1267f, 0.0346f, -1f) }; int[] triangles = new int[138] { 2, 3, 1, 2, 1, 0, 4, 5, 3, 4, 3, 2, 6, 7, 5, 6, 5, 4, 0, 1, 7, 0, 7, 6, 4, 2, 0, 4, 0, 6, 18, 19, 17, 18, 17, 16, 20, 21, 19, 20, 19, 18, 22, 23, 21, 22, 21, 20, 16, 17, 23, 16, 23, 22, 11, 13, 15, 11, 15, 9, 22, 20, 18, 22, 18, 16, 12, 25, 24, 12, 24, 14, 8, 23, 17, 8, 17, 14, 10, 26, 25, 10, 25, 12, 24, 9, 15, 24, 15, 27, 8, 27, 26, 8, 26, 10, 10, 21, 23, 10, 23, 8, 14, 24, 27, 14, 27, 8, 27, 15, 13, 27, 13, 26, 25, 11, 9, 25, 9, 24, 14, 17, 19, 14, 19, 12, 26, 13, 11, 26, 11, 25, 12, 19, 21, 12, 21, 10 }; val.vertices = vertices; val.triangles = triangles; val.RecalculateNormals(); val.RecalculateBounds(); return val; } private static Mesh GenerateGeneratorMesh() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: 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) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0099: 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_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: 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) Mesh val = new Mesh(); ((Object)val).name = "Generator_Runtime"; Vector3[] vertices = (Vector3[])(object)new Vector3[8] { new Vector3(-0.5f, -0.6f, -0.5f), new Vector3(0.5f, -0.6f, -0.5f), new Vector3(0.5f, 0.6f, -0.5f), new Vector3(-0.5f, 0.6f, -0.5f), new Vector3(-0.5f, -0.6f, 0.5f), new Vector3(0.5f, -0.6f, 0.5f), new Vector3(0.5f, 0.6f, 0.5f), new Vector3(-0.5f, 0.6f, 0.5f) }; int[] triangles = new int[36] { 0, 2, 1, 0, 3, 2, 4, 5, 6, 4, 6, 7, 0, 1, 5, 0, 5, 4, 3, 7, 6, 3, 6, 2, 0, 4, 7, 0, 7, 3, 1, 2, 6, 1, 6, 5 }; val.vertices = vertices; val.triangles = triangles; val.RecalculateNormals(); val.RecalculateBounds(); return val; } } public class SolarPanel : MonoBehaviour { [Header("Settings")] [SerializeField] private float chargeRange = 10f; [SerializeField] private LayerMask generatorLayer; [Header("Visual")] [SerializeField] private Light indicatorLight; [SerializeField] private Material activeMaterial; [SerializeField] private Material inactiveMaterial; [SerializeField] private Renderer panelRenderer; [Header("Audio")] [SerializeField] private AudioSource audioSource; [SerializeField] private AudioClip chargeStartSound; [SerializeField] private AudioClip chargeStopSound; [Header("Cable Connection")] [SerializeField] private Transform cableConnectionPoint; private int _instanceId; private bool _isCharging; private bool _isConnectedToGenerator; private int _connectedGeneratorId = -1; private Generator _connectedGenerator; private bool _isDestroyed; public const float MAX_STORED_ENERGY = 30f; private float _storedEnergy; private const float TRANSFER_RATE = 1f; private float _transferTimer; private float _manualTransferTimer; private bool _isManualTransferring; private LineRenderer _cableLine; private const float CABLE_MAX_DISTANCE = 10f; private AudioSource _humSource; private static AudioClip _panelHumClip; private ParticleSystem _sparkParticles; private float _lightDetectionRadius = 5f; private bool _hasLineOfSightToSky; private float _currentLightIntensity; private NetworkSync _networkSync; private static readonly Color VANILLA_YELLOW = new Color(1f, 0.81f, 0.1f); private static Texture2D _whiteTexture; public float StoredEnergy => _storedEnergy; public float StoredPercentage => _storedEnergy / 30f; public int InstanceId => _instanceId; public bool IsCharging => _isCharging; public bool IsConnectedToGenerator => _isConnectedToGenerator; public float CurrentLightIntensity => _currentLightIntensity; private void Awake() { _instanceId = ((Object)this).GetInstanceID(); _isDestroyed = false; _networkSync = ((Component)this).GetComponent(); if ((Object)(object)_networkSync == (Object)null) { _networkSync = ((Component)this).gameObject.AddComponent(); } EnsureIndicatorLight(); EnsureGrabComponents(); Plugin.Logger.LogInfo((object)$"Solar Panel {_instanceId} initialized"); } private void EnsureGrabComponents() { try { if ((Object)(object)((Component)this).GetComponent() == (Object)null) { ((Component)this).gameObject.AddComponent(); } if ((Object)(object)((Component)this).GetComponent() == (Object)null) { ((Component)this).gameObject.AddComponent(); } int num = 0; Collider[] componentsInChildren = ((Component)this).GetComponentsInChildren(true); foreach (Collider val in componentsInChildren) { if (!val.isTrigger && (Object)(object)((Component)val).GetComponent() == (Object)null) { ((Component)val).gameObject.AddComponent(); num++; } } Rigidbody component = ((Component)this).GetComponent(); if ((Object)(object)component != (Object)null) { component.constraints = (RigidbodyConstraints)0; } Plugin.Logger.LogInfo((object)$"Solar Panel {_instanceId} grab setup: PhysGrabObjectColliders added={num}"); } catch (Exception ex) { Plugin.Logger.LogWarning((object)$"Solar Panel {_instanceId}: could not ensure grab components: {ex.Message}"); } } private void EnsureIndicatorLight() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected O, but got Unknown //IL_0040: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)indicatorLight != (Object)null)) { GameObject val = new GameObject("IndicatorLight"); val.transform.SetParent(((Component)this).transform); val.transform.localPosition = new Vector3(0f, 0.2f, 0f); indicatorLight = val.AddComponent(); indicatorLight.type = (LightType)2; indicatorLight.range = 2f; indicatorLight.intensity = 0f; ((Behaviour)indicatorLight).enabled = false; } } private void OnDestroy() { _isDestroyed = true; try { if (_isConnectedToGenerator && _connectedGeneratorId >= 0) { EnergySystem.DisconnectSolarPanel(_connectedGeneratorId); } } catch (Exception ex) { Plugin.Logger.LogError((object)("Error during Solar Panel destruction: " + ex.Message)); } Plugin.Logger.LogInfo((object)$"Solar Panel {_instanceId} destroyed"); } private void Update() { if (!_isDestroyed) { TryAutoConnect(); UpdateLightDetection(); UpdateCharging(); UpdateSelfCharging(); UpdateGeneratorTransfer(); HandleManualTransfer(); UpdateCableVisual(); UpdateVisuals(); UpdateAudioFx(); } } private void TryAutoConnect() { //IL_0049: 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) if (_isConnectedToGenerator) { return; } Generator generator = null; float num = 10f; foreach (Generator allGenerator in Generator.AllGenerators) { if (!((Object)(object)allGenerator == (Object)null) && allGenerator.EnergyData != null && !allGenerator.EnergyData.IsFull) { float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)allGenerator).transform.position); if (num2 < num) { num = num2; generator = allGenerator; } } } if ((Object)(object)generator != (Object)null) { ConnectToGenerator(generator.InstanceId); EnergySystem.ConnectSolarPanel(generator.InstanceId, _instanceId); } } private void UpdateSelfCharging() { if (MapHelper.SolarChargingAllowed && !(_storedEnergy >= 30f) && !(_currentLightIntensity <= 0.1f)) { float num = ConfigManager.SolarPanelChargeRate.Value * ConfigManager.SolarChargeMultiplier.Value * _currentLightIntensity; _storedEnergy = Mathf.Min(_storedEnergy + num * Time.deltaTime, 30f); } } private void UpdateGeneratorTransfer() { if (!_isConnectedToGenerator || (Object)(object)_connectedGenerator == (Object)null || _storedEnergy < 1f || _connectedGenerator.EnergyData == null || _connectedGenerator.EnergyData.IsFull || _currentLightIntensity <= 0.1f || !MapHelper.SolarChargingAllowed) { return; } _transferTimer += Time.deltaTime; if (_transferTimer >= 1f) { _transferTimer -= 1f; if (EnergySystem.AddEnergy(_connectedGenerator.InstanceId, 1f)) { _storedEnergy -= 1f; } } } private void HandleManualTransfer() { //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) _isManualTransferring = false; if ((Object)(object)Camera.main == (Object)null) { return; } if (!Input.GetKey((KeyCode)103)) { _manualTransferTimer = 0f; return; } if (_storedEnergy < 1f) { _manualTransferTimer = 0f; return; } float num = Vector3.Distance(((Component)this).transform.position, ((Component)Camera.main).transform.position); if (num > 3f) { _manualTransferTimer = 0f; return; } Generator generator = null; float num2 = 5f; foreach (Generator allGenerator in Generator.AllGenerators) { if (!((Object)(object)allGenerator == (Object)null) && allGenerator.EnergyData != null && !allGenerator.EnergyData.IsFull) { float num3 = Vector3.Distance(((Component)this).transform.position, ((Component)allGenerator).transform.position); if (num3 < num2) { num2 = num3; generator = allGenerator; } } } if ((Object)(object)generator == (Object)null) { _manualTransferTimer = 0f; return; } _isManualTransferring = true; _manualTransferTimer += Time.deltaTime; if (_manualTransferTimer >= 1f) { _manualTransferTimer -= 1f; if (EnergySystem.AddEnergy(generator.InstanceId, 1f)) { _storedEnergy -= 1f; Plugin.Logger.LogInfo((object)$"Solar Panel {_instanceId}: manual transfer 1 energy -> Generator {generator.InstanceId} (panel: {_storedEnergy:F0}/{30f:F0})"); } } } private void UpdateCableVisual() { //IL_0037: 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_019b: 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_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: 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_01af: 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_01be: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: Unknown result type (might be due to invalid IL or missing references) //IL_01d9: Unknown result type (might be due to invalid IL or missing references) //IL_01de: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_01f3: Unknown result type (might be due to invalid IL or missing references) //IL_0200: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Expected O, but got Unknown //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Expected O, but got Unknown //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) if (!_isConnectedToGenerator || (Object)(object)_connectedGenerator == (Object)null) { if ((Object)(object)_cableLine != (Object)null) { ((Renderer)_cableLine).enabled = false; } return; } float num = Vector3.Distance(((Component)this).transform.position, ((Component)_connectedGenerator).transform.position); if (num > 10f) { Plugin.Logger.LogInfo((object)$"Solar Panel {_instanceId}: cable snapped (distance {num:F1}m > {10f}m)."); DisconnectFromGenerator(); if ((Object)(object)_cableLine != (Object)null) { ((Renderer)_cableLine).enabled = false; } return; } if ((Object)(object)_cableLine == (Object)null) { GameObject val = new GameObject("REPOMod_CableLine"); val.transform.SetParent(((Component)this).transform, false); _cableLine = val.AddComponent(); _cableLine.positionCount = 3; _cableLine.startWidth = 0.03f; _cableLine.endWidth = 0.03f; Shader val2 = Shader.Find("Sprites/Default"); Material val3 = new Material(val2); val3.color = new Color(0.45f, 0.25f, 0.1f); ((Renderer)_cableLine).material = val3; _cableLine.startColor = new Color(0.1f, 0.1f, 0.1f); _cableLine.endColor = new Color(0.45f, 0.25f, 0.1f); } ((Renderer)_cableLine).enabled = true; Vector3 val4 = GetCableConnectionPoint(); Vector3 val5 = _connectedGenerator.GetCableConnectionPoint(); Vector3 val6 = (val4 + val5) / 2f + Vector3.down * Mathf.Min(0.5f, num * 0.12f); _cableLine.SetPosition(0, val4); _cableLine.SetPosition(1, val6); _cableLine.SetPosition(2, val5); } private void UpdateAudioFx() { //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Expected O, but got Unknown //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) bool flag = (_currentLightIntensity > 0.1f && _storedEnergy < 30f && MapHelper.SolarChargingAllowed) || _isManualTransferring || (_isConnectedToGenerator && _storedEnergy >= 1f); if ((Object)(object)_humSource == (Object)null) { if ((Object)(object)_panelHumClip == (Object)null) { _panelHumClip = CreatePanelHumClip(); } GameObject val = new GameObject("REPOMod_PanelHum"); val.transform.SetParent(((Component)this).transform, false); _humSource = val.AddComponent(); _humSource.clip = _panelHumClip; _humSource.loop = true; _humSource.spatialBlend = 1f; _humSource.minDistance = 1f; _humSource.maxDistance = 6f; _humSource.volume = 0.25f; } if (flag && !_humSource.isPlaying) { _humSource.Play(); } else if (!flag && _humSource.isPlaying) { _humSource.Stop(); } if ((Object)(object)_sparkParticles == (Object)null) { _sparkParticles = Generator.CreateSparkParticles(((Component)this).transform); } EmissionModule emission = _sparkParticles.emission; ((EmissionModule)(ref emission)).enabled = _isManualTransferring || (_isConnectedToGenerator && _storedEnergy >= 1f); } private static AudioClip CreatePanelHumClip() { int num = 44100; float[] array = new float[num]; for (int i = 0; i < num; i++) { float num2 = (float)i / 22050f; array[i] = (Mathf.Sin(MathF.PI * 440f * num2) * 0.4f + Mathf.Sin(MathF.PI * 880f * num2) * 0.15f) * 0.25f; } AudioClip val = AudioClip.Create("REPOMod_PanelHum", num, 1, 22050, false); val.SetData(array, 0); return val; } public void AddStoredEnergy(float amount) { _storedEnergy = Mathf.Clamp(_storedEnergy + amount, 0f, 30f); } private void UpdateLightDetection() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002a: 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) if (_isDestroyed) { return; } try { Vector3 val = ((Component)this).transform.position + Vector3.up * 0.5f; RaycastHit val2 = default(RaycastHit); if (Physics.Raycast(val, Vector3.up, ref val2, _lightDetectionRadius, ~LayerMask.GetMask(new string[1] { "Player" }))) { _hasLineOfSightToSky = false; } else { _hasLineOfSightToSky = true; } if (_hasLineOfSightToSky && DayNightCycle.CanSolarPanelsCharge() && MapHelper.SolarChargingAllowed) { _currentLightIntensity = DayNightCycle.GetLightIntensity(); } else { _currentLightIntensity = 0f; } } catch (Exception ex) { Plugin.Logger.LogError((object)("Error in UpdateLightDetection: " + ex.Message)); _currentLightIntensity = 0f; } } private void UpdateCharging() { if (_isDestroyed) { return; } bool isCharging = _isCharging; _isCharging = _isConnectedToGenerator && _currentLightIntensity > 0.1f; if (_isCharging != isCharging) { if (_isCharging) { PlaySound(chargeStartSound); Plugin.Logger.LogDebug((object)$"Solar Panel {_instanceId} started charging."); } else { PlaySound(chargeStopSound); Plugin.Logger.LogDebug((object)$"Solar Panel {_instanceId} stopped charging."); } _networkSync?.SendSolarPanelState(_isCharging, _currentLightIntensity); } } private void UpdateVisuals() { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) if (_isDestroyed) { return; } try { if ((Object)(object)indicatorLight != (Object)null) { ((Behaviour)indicatorLight).enabled = _isCharging; indicatorLight.intensity = _currentLightIntensity * 2f; indicatorLight.color = Color.Lerp(Color.red, Color.green, _currentLightIntensity); } if ((Object)(object)panelRenderer != (Object)null) { panelRenderer.material = (_isCharging ? activeMaterial : inactiveMaterial); } } catch (Exception ex) { Plugin.Logger.LogError((object)("Error in UpdateVisuals: " + ex.Message)); } } public void ConnectToGenerator(int generatorId) { if (_isDestroyed) { return; } _isConnectedToGenerator = true; _connectedGeneratorId = generatorId; _connectedGenerator = null; foreach (Generator allGenerator in Generator.AllGenerators) { if ((Object)(object)allGenerator != (Object)null && allGenerator.InstanceId == generatorId) { _connectedGenerator = allGenerator; break; } } Plugin.Logger.LogInfo((object)$"Solar Panel {_instanceId} connected to Generator {generatorId}"); } public void DisconnectFromGenerator() { if (!_isDestroyed) { if (_connectedGeneratorId >= 0 || (Object)(object)_connectedGenerator != (Object)null) { EnergySystem.DisconnectSolarPanel(_connectedGeneratorId); } _isConnectedToGenerator = false; _connectedGeneratorId = -1; _connectedGenerator = null; if ((Object)(object)_cableLine != (Object)null) { ((Renderer)_cableLine).enabled = false; } Plugin.Logger.LogInfo((object)$"Solar Panel {_instanceId} disconnected from generator"); } } public float GetChargeRate() { if (!_isCharging || _isDestroyed) { return 0f; } float value = ConfigManager.SolarPanelChargeRate.Value; float value2 = ConfigManager.SolarChargeMultiplier.Value; return value * value2 * _currentLightIntensity; } private void OnGUI() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Invalid comparison between Unknown and I4 //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0067: 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_0071: 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_0077: 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) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Expected O, but got Unknown //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Expected O, but got Unknown //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Expected O, but got Unknown //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Expected O, but got Unknown //IL_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_01e7: Unknown result type (might be due to invalid IL or missing references) //IL_01ee: Unknown result type (might be due to invalid IL or missing references) //IL_01f5: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_0219: Unknown result type (might be due to invalid IL or missing references) //IL_0220: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Unknown result type (might be due to invalid IL or missing references) //IL_0258: Unknown result type (might be due to invalid IL or missing references) //IL_025d: Unknown result type (might be due to invalid IL or missing references) //IL_027f: Unknown result type (might be due to invalid IL or missing references) //IL_0291: Unknown result type (might be due to invalid IL or missing references) //IL_02b1: Unknown result type (might be due to invalid IL or missing references) //IL_02db: Unknown result type (might be due to invalid IL or missing references) //IL_031d: Unknown result type (might be due to invalid IL or missing references) //IL_0354: Unknown result type (might be due to invalid IL or missing references) //IL_036f: Unknown result type (might be due to invalid IL or missing references) //IL_0380: Unknown result type (might be due to invalid IL or missing references) //IL_0387: Expected O, but got Unknown //IL_0398: Unknown result type (might be due to invalid IL or missing references) //IL_039d: Unknown result type (might be due to invalid IL or missing references) //IL_03af: Unknown result type (might be due to invalid IL or missing references) //IL_03f9: Unknown result type (might be due to invalid IL or missing references) //IL_0403: Expected O, but got Unknown //IL_03fe: Unknown result type (might be due to invalid IL or missing references) //IL_0403: Unknown result type (might be due to invalid IL or missing references) //IL_0406: Unknown result type (might be due to invalid IL or missing references) //IL_041f: Unknown result type (might be due to invalid IL or missing references) //IL_0426: Unknown result type (might be due to invalid IL or missing references) //IL_042d: Unknown result type (might be due to invalid IL or missing references) //IL_0454: Unknown result type (might be due to invalid IL or missing references) //IL_045b: Expected O, but got Unknown //IL_046c: Unknown result type (might be due to invalid IL or missing references) //IL_0471: Unknown result type (might be due to invalid IL or missing references) //IL_0483: Unknown result type (might be due to invalid IL or missing references) //IL_04e0: Unknown result type (might be due to invalid IL or missing references) //IL_04ea: Expected O, but got Unknown //IL_04e5: Unknown result type (might be due to invalid IL or missing references) //IL_04ea: Unknown result type (might be due to invalid IL or missing references) //IL_04ed: Unknown result type (might be due to invalid IL or missing references) //IL_0506: Unknown result type (might be due to invalid IL or missing references) //IL_050d: Unknown result type (might be due to invalid IL or missing references) //IL_0514: Unknown result type (might be due to invalid IL or missing references) if ((int)Event.current.type != 7 || _isDestroyed || (Object)(object)Camera.main == (Object)null) { return; } float num = Vector3.Distance(((Component)this).transform.position, ((Component)Camera.main).transform.position); if (num > 5f) { return; } Vector3 val = Camera.main.WorldToViewportPoint(((Component)this).transform.position + Vector3.up * 0.8f); if (val.z < 0f) { return; } float num2 = val.x * (float)Screen.width; float num3 = (1f - val.y) * (float)Screen.height; float num4 = Mathf.Clamp01(1f - Mathf.Max(0f, num - 4f)); if (!(num4 <= 0.01f)) { if ((Object)(object)_whiteTexture == (Object)null) { _whiteTexture = new Texture2D(1, 1); _whiteTexture.SetPixel(0, 0, Color.white); _whiteTexture.Apply(); } GUIStyle val2 = new GUIStyle(GUI.skin.label); val2.alignment = (TextAnchor)4; val2.fontSize = 14; val2.fontStyle = (FontStyle)1; Color vANILLA_YELLOW = VANILLA_YELLOW; vANILLA_YELLOW.a = num4; val2.normal.textColor = vANILLA_YELLOW; string text = "SOLAR PANEL"; if (_isManualTransferring) { text = "TRANSFERRING [G]"; } else if (_currentLightIntensity > 0.1f && _storedEnergy < 30f) { text = "CHARGING"; } Vector2 val3 = val2.CalcSize(new GUIContent(text)); GUIStyle val4 = new GUIStyle(val2); val4.normal.textColor = new Color(0f, 0f, 0f, num4 * 0.8f); GUI.Label(new Rect(num2 - val3.x / 2f + 1f, num3 - 32f + 1f, val3.x, val3.y), text, val4); GUI.Label(new Rect(num2 - val3.x / 2f, num3 - 32f, val3.x, val3.y), text, val2); float num5 = 86f; float num6 = 20f; float num7 = num2 - num5 / 2f; float num8 = num3 - 10f; Color color = GUI.color; GUI.color = new Color(VANILLA_YELLOW.r, VANILLA_YELLOW.g, VANILLA_YELLOW.b, num4); GUI.DrawTexture(new Rect(num7, num8, num5, num6), (Texture)(object)_whiteTexture); GUI.color = new Color(0.12f, 0.08f, 0f, num4); GUI.DrawTexture(new Rect(num7 + 2f, num8 + 2f, num5 - 4f, num6 - 4f), (Texture)(object)_whiteTexture); int num9 = Mathf.RoundToInt(StoredPercentage * 10f); GUI.color = new Color(VANILLA_YELLOW.r, VANILLA_YELLOW.g, VANILLA_YELLOW.b, num4); for (int i = 0; i < num9; i++) { float num10 = num7 + 4f + (float)i * 8f; GUI.DrawTexture(new Rect(num10, num8 + 4f, 6f, 12f), (Texture)(object)_whiteTexture); } GUI.color = color; GUIStyle val5 = new GUIStyle(GUI.skin.label); val5.alignment = (TextAnchor)4; val5.fontSize = 12; Color vANILLA_YELLOW2 = VANILLA_YELLOW; vANILLA_YELLOW2.a = num4; val5.normal.textColor = vANILLA_YELLOW2; float num11 = ConfigManager.SolarPanelChargeRate.Value * ConfigManager.SolarChargeMultiplier.Value * _currentLightIntensity; if (!MapHelper.SolarChargingAllowed) { num11 = 0f; } string text2 = $"Eff: {num11:F1}/s"; Vector2 val6 = val5.CalcSize(new GUIContent(text2)); GUI.Label(new Rect(num2 - val6.x / 2f, num8 + num6 + 2f, val6.x, val6.y), text2, val5); if (ConfigManager.EnableDebugMode.Value) { GUIStyle val7 = new GUIStyle(GUI.skin.label); val7.alignment = (TextAnchor)4; val7.fontSize = 11; Color white = Color.white; white.a = num4; val7.normal.textColor = white; string text3 = string.Format("{0:F0}/{1:F0} | Light: {2:F2} | {3}", _storedEnergy, 30f, _currentLightIntensity, _isConnectedToGenerator ? "Connected" : "Not connected"); Vector2 val8 = val7.CalcSize(new GUIContent(text3)); GUI.Label(new Rect(num2 - val8.x / 2f, num8 + num6 + 18f, val8.x, val8.y), text3, val7); } } } public Vector3 GetCableConnectionPoint() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: 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)cableConnectionPoint != (Object)null) { return cableConnectionPoint.position; } return ((Component)this).transform.position + Vector3.up * 0.5f; } public void MakeIndestructible() { Plugin.Logger.LogInfo((object)$"Solar Panel {_instanceId} made indestructible"); } private void PlaySound(AudioClip clip) { if ((Object)(object)audioSource != (Object)null && (Object)(object)clip != (Object)null && !_isDestroyed) { audioSource.PlayOneShot(clip, ConfigManager.ConnectSoundVolume.Value); } } private void OnDrawGizmosSelected() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) Gizmos.color = Color.yellow; Gizmos.DrawWireSphere(((Component)this).transform.position, _lightDetectionRadius); Gizmos.color = Color.green; Gizmos.DrawWireSphere(((Component)this).transform.position, chargeRange); Gizmos.color = Color.cyan; Gizmos.DrawSphere(GetCableConnectionPoint(), 0.1f); } } [RequireComponent(typeof(MeshFilter))] [RequireComponent(typeof(MeshRenderer))] public class SolarPanelMeshGenerator : MonoBehaviour { [Header("Settings")] [SerializeField] private float scaleFactor = 0.01f; [SerializeField] private Material panelMaterial; [Header("Optional Components")] [SerializeField] private bool addCollider = true; [SerializeField] private bool addSolarPanelComponent = true; private void Awake() { GenerateMesh(); SetupComponents(); } public void GenerateMesh() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_005a: 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_0075: Unknown result type (might be due to invalid IL or missing references) //IL_0080: 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) //IL_009b: 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_00c1: 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_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_010d: 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_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0143: 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) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_01b7: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01d9: Unknown result type (might be due to invalid IL or missing references) //IL_01de: Unknown result type (might be due to invalid IL or missing references) //IL_01f5: Unknown result type (might be due to invalid IL or missing references) //IL_0200: Unknown result type (might be due to invalid IL or missing references) //IL_0205: Unknown result type (might be due to invalid IL or missing references) //IL_021c: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_0243: Unknown result type (might be due to invalid IL or missing references) //IL_024e: Unknown result type (might be due to invalid IL or missing references) //IL_0253: Unknown result type (might be due to invalid IL or missing references) //IL_026a: Unknown result type (might be due to invalid IL or missing references) //IL_0275: Unknown result type (might be due to invalid IL or missing references) //IL_027a: Unknown result type (might be due to invalid IL or missing references) //IL_0291: Unknown result type (might be due to invalid IL or missing references) //IL_029c: Unknown result type (might be due to invalid IL or missing references) //IL_02a1: Unknown result type (might be due to invalid IL or missing references) //IL_02b8: Unknown result type (might be due to invalid IL or missing references) //IL_02c3: Unknown result type (might be due to invalid IL or missing references) //IL_02c8: Unknown result type (might be due to invalid IL or missing references) //IL_02df: Unknown result type (might be due to invalid IL or missing references) //IL_02ea: 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_0306: Unknown result type (might be due to invalid IL or missing references) //IL_0311: Unknown result type (might be due to invalid IL or missing references) //IL_0316: Unknown result type (might be due to invalid IL or missing references) //IL_032d: Unknown result type (might be due to invalid IL or missing references) //IL_0338: Unknown result type (might be due to invalid IL or missing references) //IL_033d: Unknown result type (might be due to invalid IL or missing references) //IL_0354: Unknown result type (might be due to invalid IL or missing references) //IL_035f: Unknown result type (might be due to invalid IL or missing references) //IL_0364: Unknown result type (might be due to invalid IL or missing references) //IL_037b: Unknown result type (might be due to invalid IL or missing references) //IL_0386: Unknown result type (might be due to invalid IL or missing references) //IL_038b: Unknown result type (might be due to invalid IL or missing references) //IL_03a2: Unknown result type (might be due to invalid IL or missing references) //IL_03ad: Unknown result type (might be due to invalid IL or missing references) //IL_03b2: Unknown result type (might be due to invalid IL or missing references) //IL_03c9: Unknown result type (might be due to invalid IL or missing references) //IL_03d4: Unknown result type (might be due to invalid IL or missing references) //IL_03d9: Unknown result type (might be due to invalid IL or missing references) //IL_03f0: Unknown result type (might be due to invalid IL or missing references) //IL_03fb: Unknown result type (might be due to invalid IL or missing references) //IL_0400: Unknown result type (might be due to invalid IL or missing references) //IL_0417: Unknown result type (might be due to invalid IL or missing references) //IL_0422: Unknown result type (might be due to invalid IL or missing references) //IL_0427: Unknown result type (might be due to invalid IL or missing references) //IL_043e: Unknown result type (might be due to invalid IL or missing references) //IL_0449: Unknown result type (might be due to invalid IL or missing references) //IL_044e: Unknown result type (might be due to invalid IL or missing references) //IL_046b: Unknown result type (might be due to invalid IL or missing references) //IL_0470: Unknown result type (might be due to invalid IL or missing references) //IL_0486: Unknown result type (might be due to invalid IL or missing references) //IL_048b: Unknown result type (might be due to invalid IL or missing references) //IL_04a1: Unknown result type (might be due to invalid IL or missing references) //IL_04a6: Unknown result type (might be due to invalid IL or missing references) //IL_04bc: Unknown result type (might be due to invalid IL or missing references) //IL_04c1: Unknown result type (might be due to invalid IL or missing references) //IL_04d7: Unknown result type (might be due to invalid IL or missing references) //IL_04dc: Unknown result type (might be due to invalid IL or missing references) //IL_04f2: Unknown result type (might be due to invalid IL or missing references) //IL_04f7: Unknown result type (might be due to invalid IL or missing references) //IL_0510: Unknown result type (might be due to invalid IL or missing references) //IL_0515: Unknown result type (might be due to invalid IL or missing references) //IL_0526: Unknown result type (might be due to invalid IL or missing references) //IL_052b: Unknown result type (might be due to invalid IL or missing references) //IL_053c: Unknown result type (might be due to invalid IL or missing references) //IL_0541: Unknown result type (might be due to invalid IL or missing references) //IL_0552: Unknown result type (might be due to invalid IL or missing references) //IL_0557: Unknown result type (might be due to invalid IL or missing references) //IL_0568: Unknown result type (might be due to invalid IL or missing references) //IL_056d: Unknown result type (might be due to invalid IL or missing references) //IL_057e: Unknown result type (might be due to invalid IL or missing references) //IL_0583: Unknown result type (might be due to invalid IL or missing references) //IL_0594: Unknown result type (might be due to invalid IL or missing references) //IL_0599: Unknown result type (might be due to invalid IL or missing references) //IL_05aa: Unknown result type (might be due to invalid IL or missing references) //IL_05af: Unknown result type (might be due to invalid IL or missing references) //IL_05c0: Unknown result type (might be due to invalid IL or missing references) //IL_05c5: Unknown result type (might be due to invalid IL or missing references) //IL_05d7: Unknown result type (might be due to invalid IL or missing references) //IL_05dc: Unknown result type (might be due to invalid IL or missing references) //IL_05ee: Unknown result type (might be due to invalid IL or missing references) //IL_05f3: Unknown result type (might be due to invalid IL or missing references) //IL_0605: Unknown result type (might be due to invalid IL or missing references) //IL_060a: Unknown result type (might be due to invalid IL or missing references) //IL_061c: Unknown result type (might be due to invalid IL or missing references) //IL_0621: Unknown result type (might be due to invalid IL or missing references) //IL_0633: Unknown result type (might be due to invalid IL or missing references) //IL_0638: Unknown result type (might be due to invalid IL or missing references) //IL_064a: Unknown result type (might be due to invalid IL or missing references) //IL_064f: Unknown result type (might be due to invalid IL or missing references) //IL_0661: Unknown result type (might be due to invalid IL or missing references) //IL_0666: Unknown result type (might be due to invalid IL or missing references) //IL_0678: Unknown result type (might be due to invalid IL or missing references) //IL_067d: Unknown result type (might be due to invalid IL or missing references) //IL_068f: Unknown result type (might be due to invalid IL or missing references) //IL_0694: Unknown result type (might be due to invalid IL or missing references) //IL_06a6: Unknown result type (might be due to invalid IL or missing references) //IL_06ab: Unknown result type (might be due to invalid IL or missing references) //IL_06bd: Unknown result type (might be due to invalid IL or missing references) //IL_06c2: Unknown result type (might be due to invalid IL or missing references) //IL_06d4: Unknown result type (might be due to invalid IL or missing references) //IL_06d9: Unknown result type (might be due to invalid IL or missing references) //IL_06eb: Unknown result type (might be due to invalid IL or missing references) //IL_06f0: Unknown result type (might be due to invalid IL or missing references) //IL_0702: Unknown result type (might be due to invalid IL or missing references) //IL_0707: Unknown result type (might be due to invalid IL or missing references) //IL_0719: Unknown result type (might be due to invalid IL or missing references) //IL_071e: Unknown result type (might be due to invalid IL or missing references) //IL_0730: Unknown result type (might be due to invalid IL or missing references) //IL_0735: Unknown result type (might be due to invalid IL or missing references) //IL_0747: Unknown result type (might be due to invalid IL or missing references) //IL_074c: Unknown result type (might be due to invalid IL or missing references) //IL_075e: Unknown result type (might be due to invalid IL or missing references) //IL_0763: Unknown result type (might be due to invalid IL or missing references) //IL_0775: Unknown result type (might be due to invalid IL or missing references) //IL_077a: Unknown result type (might be due to invalid IL or missing references) //IL_078c: Unknown result type (might be due to invalid IL or missing references) //IL_0791: Unknown result type (might be due to invalid IL or missing references) //IL_07a3: Unknown result type (might be due to invalid IL or missing references) //IL_07a8: Unknown result type (might be due to invalid IL or missing references) //IL_07ba: Unknown result type (might be due to invalid IL or missing references) //IL_07bf: Unknown result type (might be due to invalid IL or missing references) //IL_07d1: Unknown result type (might be due to invalid IL or missing references) //IL_07d6: Unknown result type (might be due to invalid IL or missing references) //IL_07e8: Unknown result type (might be due to invalid IL or missing references) //IL_07ed: Unknown result type (might be due to invalid IL or missing references) //IL_07ff: Unknown result type (might be due to invalid IL or missing references) //IL_0804: Unknown result type (might be due to invalid IL or missing references) //IL_0816: Unknown result type (might be due to invalid IL or missing references) //IL_081b: Unknown result type (might be due to invalid IL or missing references) //IL_082d: Unknown result type (might be due to invalid IL or missing references) //IL_0832: Unknown result type (might be due to invalid IL or missing references) //IL_0844: Unknown result type (might be due to invalid IL or missing references) //IL_0849: Unknown result type (might be due to invalid IL or missing references) //IL_085b: Unknown result type (might be due to invalid IL or missing references) //IL_0860: Unknown result type (might be due to invalid IL or missing references) //IL_0872: Unknown result type (might be due to invalid IL or missing references) //IL_0877: Unknown result type (might be due to invalid IL or missing references) //IL_0889: Unknown result type (might be due to invalid IL or missing references) //IL_088e: Unknown result type (might be due to invalid IL or missing references) //IL_08a0: Unknown result type (might be due to invalid IL or missing references) //IL_08a5: Unknown result type (might be due to invalid IL or missing references) //IL_08b7: Unknown result type (might be due to invalid IL or missing references) //IL_08bc: Unknown result type (might be due to invalid IL or missing references) //IL_08ce: Unknown result type (might be due to invalid IL or missing references) //IL_08d3: Unknown result type (might be due to invalid IL or missing references) //IL_08e5: Unknown result type (might be due to invalid IL or missing references) //IL_08ea: Unknown result type (might be due to invalid IL or missing references) //IL_08fc: Unknown result type (might be due to invalid IL or missing references) //IL_0901: Unknown result type (might be due to invalid IL or missing references) //IL_0913: Unknown result type (might be due to invalid IL or missing references) //IL_0918: Unknown result type (might be due to invalid IL or missing references) //IL_092a: Unknown result type (might be due to invalid IL or missing references) //IL_092f: Unknown result type (might be due to invalid IL or missing references) //IL_0941: Unknown result type (might be due to invalid IL or missing references) //IL_0946: Unknown result type (might be due to invalid IL or missing references) //IL_0958: Unknown result type (might be due to invalid IL or missing references) //IL_095d: Unknown result type (might be due to invalid IL or missing references) //IL_096f: Unknown result type (might be due to invalid IL or missing references) //IL_0974: Unknown result type (might be due to invalid IL or missing references) //IL_0986: Unknown result type (might be due to invalid IL or missing references) //IL_098b: Unknown result type (might be due to invalid IL or missing references) //IL_099d: Unknown result type (might be due to invalid IL or missing references) //IL_09a2: Unknown result type (might be due to invalid IL or missing references) //IL_09b4: Unknown result type (might be due to invalid IL or missing references) //IL_09b9: Unknown result type (might be due to invalid IL or missing references) //IL_09cb: Unknown result type (might be due to invalid IL or missing references) //IL_09d0: Unknown result type (might be due to invalid IL or missing references) //IL_09e2: Unknown result type (might be due to invalid IL or missing references) //IL_09e7: Unknown result type (might be due to invalid IL or missing references) //IL_09f9: Unknown result type (might be due to invalid IL or missing references) //IL_09fe: Unknown result type (might be due to invalid IL or missing references) //IL_0a10: Unknown result type (might be due to invalid IL or missing references) //IL_0a15: Unknown result type (might be due to invalid IL or missing references) //IL_0a27: Unknown result type (might be due to invalid IL or missing references) //IL_0a2c: Unknown result type (might be due to invalid IL or missing references) //IL_0a3e: Unknown result type (might be due to invalid IL or missing references) //IL_0a43: Unknown result type (might be due to invalid IL or missing references) //IL_0a55: Unknown result type (might be due to invalid IL or missing references) //IL_0a5a: Unknown result type (might be due to invalid IL or missing references) //IL_0a6c: Unknown result type (might be due to invalid IL or missing references) //IL_0a71: Unknown result type (might be due to invalid IL or missing references) //IL_0a83: Unknown result type (might be due to invalid IL or missing references) //IL_0a88: Unknown result type (might be due to invalid IL or missing references) //IL_0a9a: Unknown result type (might be due to invalid IL or missing references) //IL_0a9f: Unknown result type (might be due to invalid IL or missing references) //IL_0ab1: Unknown result type (might be due to invalid IL or missing references) //IL_0ab6: Unknown result type (might be due to invalid IL or missing references) //IL_0ac8: Unknown result type (might be due to invalid IL or missing references) //IL_0acd: Unknown result type (might be due to invalid IL or missing references) //IL_0adf: Unknown result type (might be due to invalid IL or missing references) //IL_0ae4: Unknown result type (might be due to invalid IL or missing references) //IL_0af6: Unknown result type (might be due to invalid IL or missing references) //IL_0afb: Unknown result type (might be due to invalid IL or missing references) //IL_0b0d: Unknown result type (might be due to invalid IL or missing references) //IL_0b12: Unknown result type (might be due to invalid IL or missing references) //IL_0b24: Unknown result type (might be due to invalid IL or missing references) //IL_0b29: Unknown result type (might be due to invalid IL or missing references) //IL_0b3b: Unknown result type (might be due to invalid IL or missing references) //IL_0b40: Unknown result type (might be due to invalid IL or missing references) //IL_0b52: Unknown result type (might be due to invalid IL or missing references) //IL_0b57: Unknown result type (might be due to invalid IL or missing references) //IL_0b69: Unknown result type (might be due to invalid IL or missing references) //IL_0b6e: Unknown result type (might be due to invalid IL or missing references) //IL_0b80: Unknown result type (might be due to invalid IL or missing references) //IL_0b85: Unknown result type (might be due to invalid IL or missing references) //IL_0b97: Unknown result type (might be due to invalid IL or missing references) //IL_0b9c: Unknown result type (might be due to invalid IL or missing references) //IL_0bae: Unknown result type (might be due to invalid IL or missing references) //IL_0bb3: Unknown result type (might be due to invalid IL or missing references) //IL_0bc5: Unknown result type (might be due to invalid IL or missing references) //IL_0bca: Unknown result type (might be due to invalid IL or missing references) //IL_0bdc: Unknown result type (might be due to invalid IL or missing references) //IL_0be1: Unknown result type (might be due to invalid IL or missing references) //IL_0bf3: Unknown result type (might be due to invalid IL or missing references) //IL_0bf8: Unknown result type (might be due to invalid IL or missing references) //IL_0c0a: Unknown result type (might be due to invalid IL or missing references) //IL_0c0f: Unknown result type (might be due to invalid IL or missing references) //IL_0c21: Unknown result type (might be due to invalid IL or missing references) //IL_0c26: Unknown result type (might be due to invalid IL or missing references) //IL_0c38: Unknown result type (might be due to invalid IL or missing references) //IL_0c3d: Unknown result type (might be due to invalid IL or missing references) //IL_0c4f: Unknown result type (might be due to invalid IL or missing references) //IL_0c54: Unknown result type (might be due to invalid IL or missing references) //IL_0c66: Unknown result type (might be due to invalid IL or missing references) //IL_0c6b: Unknown result type (might be due to invalid IL or missing references) //IL_0c7d: Unknown result type (might be due to invalid IL or missing references) //IL_0c82: Unknown result type (might be due to invalid IL or missing references) //IL_0d3a: Unknown result type (might be due to invalid IL or missing references) //IL_0d41: Expected O, but got Unknown //IL_0d52: Unknown result type (might be due to invalid IL or missing references) Mesh val = new Mesh(); ((Object)val).name = "SolarPanel_Generated"; Vector3[] array = (Vector3[])(object)new Vector3[28] { new Vector3(-181.7509f, -7.817061f, 16.027332f) * scaleFactor, new Vector3(-181.7509f, -0.168927f, 16.027332f) * scaleFactor, new Vector3(-126.62912f, -7.817061f, 16.027332f) * scaleFactor, new Vector3(-126.62912f, -0.168927f, 16.027332f) * scaleFactor, new Vector3(-126.62912f, -7.817061f, -16.027332f) * scaleFactor, new Vector3(-126.62912f, -0.168927f, -16.027332f) * scaleFactor, new Vector3(-181.7509f, -7.817061f, -16.027332f) * scaleFactor, new Vector3(-181.7509f, -0.168927f, -16.027332f) * scaleFactor, new Vector3(-216.2701f, 3.462121f, -103.6f) * scaleFactor, new Vector3(-212.6701f, 1.762121f, 100f) * scaleFactor, new Vector3(216.2701f, 3.462121f, -103.6f) * scaleFactor, new Vector3(212.6701f, 1.762121f, 100f) * scaleFactor, new Vector3(216.2701f, 3.462121f, 103.6f) * scaleFactor, new Vector3(212.6701f, 1.762121f, -100f) * scaleFactor, new Vector3(-216.2701f, 3.462121f, 103.6f) * scaleFactor, new Vector3(-212.6701f, 1.762121f, -100f) * scaleFactor, new Vector3(-216.2701f, -1.762121f, 103.6f) * scaleFactor, new Vector3(-216.2701f, 1.762121f, 103.6f) * scaleFactor, new Vector3(216.2701f, -1.762121f, 103.6f) * scaleFactor, new Vector3(216.2701f, 1.762121f, 103.6f) * scaleFactor, new Vector3(216.2701f, -1.762121f, -103.6f) * scaleFactor, new Vector3(216.2701f, 1.762121f, -103.6f) * scaleFactor, new Vector3(-216.2701f, -1.762121f, -103.6f) * scaleFactor, new Vector3(-216.2701f, 1.762121f, -103.6f) * scaleFactor, new Vector3(-212.6701f, 3.462121f, 100f) * scaleFactor, new Vector3(212.6701f, 3.462121f, 100f) * scaleFactor, new Vector3(212.6701f, 3.462121f, -100f) * scaleFactor, new Vector3(-212.6701f, 3.462121f, -100f) * scaleFactor }; Vector3[] array2 = (Vector3[])(object)new Vector3[6] { new Vector3(0f, 0f, 1f), new Vector3(1f, 0f, 0f), new Vector3(0f, 0f, -1f), new Vector3(-1f, 0f, 0f), new Vector3(0f, -1f, 0f), new Vector3(0f, 1f, 0f) }; Vector2[] uv = (Vector2[])(object)new Vector2[84] { new Vector2(0.563176f, 0.914985f), new Vector2(0.563176f, 0.931308f), new Vector2(0.680819f, 0.931308f), new Vector2(0.680819f, 0.914985f), new Vector2(0.563176f, 0.932636f), new Vector2(0.563176f, 0.948959f), new Vector2(0.631588f, 0.948959f), new Vector2(0.631588f, 0.932636f), new Vector2(0.563176f, 0.897335f), new Vector2(0.563176f, 0.913658f), new Vector2(0.680819f, 0.913658f), new Vector2(0.680819f, 0.897335f), new Vector2(0.374466f, 0.932201f), new Vector2(0.374466f, 0.948524f), new Vector2(0.442878f, 0.948524f), new Vector2(0.442878f, 0.932201f), new Vector2(0.444206f, 0.897335f), new Vector2(0.444206f, 0.965747f), new Vector2(0.561848f, 0.965747f), new Vector2(0.561848f, 0.897335f), new Vector2(0.038148f, 0.000664f), new Vector2(0.038148f, 0.008185f), new Vector2(0.961292f, 0.008185f), new Vector2(0.961292f, 0.000664f), new Vector2(0.000664f, 0.897335f), new Vector2(0.000664f, 0.904856f), new Vector2(0.442878f, 0.904856f), new Vector2(0.442878f, 0.897335f), new Vector2(0.038141f, 0.013141f), new Vector2(0.038141f, 0.020663f), new Vector2(0.961285f, 0.020663f), new Vector2(0.961285f, 0.013141f), new Vector2(0.000664f, 0.909812f), new Vector2(0.000664f, 0.917334f), new Vector2(0.442878f, 0.917334f), new Vector2(0.442878f, 0.909812f), new Vector2(0.051722f, 0.46916f), new Vector2(0.051722f, 0.896007f), new Vector2(0.959498f, 0.896007f), new Vector2(0.959498f, 0.46916f), new Vector2(0.038134f, 0.467832f), new Vector2(0.961277f, 0.467832f), new Vector2(0.961277f, 0.025619f), new Vector2(0.038134f, 0.025619f), new Vector2(0.159729f, 0.978913f), new Vector2(0.170255f, 0.989424f), new Vector2(0.82898f, 0.989424f), new Vector2(0.839353f, 0.978913f), new Vector2(0.442878f, 0.920962f), new Vector2(0.000664f, 0.920962f), new Vector2(0.036807f, 0.249864f), new Vector2(0.029123f, 0.257548f), new Vector2(0.029123f, 0.684395f), new Vector2(0.036807f, 0.692078f), new Vector2(0.442878f, 0.925918f), new Vector2(0.442878f, 0.92229f), new Vector2(0.016028f, 0.92229f), new Vector2(0.016028f, 0.925918f), new Vector2(0.838165f, 0.977586f), new Vector2(0.827638f, 0.967075f), new Vector2(0.168913f, 0.967075f), new Vector2(0.15854f, 0.977586f), new Vector2(0.961285f, 0.024291f), new Vector2(0.038141f, 0.024291f), new Vector2(0.020113f, 0.692078f), new Vector2(0.027796f, 0.684395f), new Vector2(0.027796f, 0.257548f), new Vector2(0.020113f, 0.249864f), new Vector2(0.908758f, 0.99438f), new Vector2(0.908758f, 0.990752f), new Vector2(0.000996f, 0.990752f), new Vector2(0.000996f, 0.99438f), new Vector2(0.947751f, 0.999336f), new Vector2(0.947751f, 0.995708f), new Vector2(0.039989f, 0.995708f), new Vector2(0.039989f, 0.999336f), new Vector2(0.961292f, 0.011814f), new Vector2(0.038148f, 0.011814f), new Vector2(0.442878f, 0.930874f), new Vector2(0.442878f, 0.927245f), new Vector2(0.016037f, 0.927245f), new Vector2(0.016037f, 0.930874f), new Vector2(0.442878f, 0.908485f), new Vector2(0.000664f, 0.908485f) }; int[] array3 = new int[138] { 2, 3, 1, 2, 1, 0, 4, 5, 3, 4, 3, 2, 6, 7, 5, 6, 5, 4, 0, 1, 7, 0, 7, 6, 4, 2, 0, 4, 0, 6, 18, 19, 17, 18, 17, 16, 20, 21, 19, 20, 19, 18, 22, 23, 21, 22, 21, 20, 16, 17, 23, 16, 23, 22, 11, 13, 15, 11, 15, 9, 22, 20, 18, 22, 18, 16, 12, 25, 24, 12, 24, 14, 8, 23, 17, 8, 17, 14, 10, 26, 25, 10, 25, 12, 24, 9, 15, 24, 15, 27, 8, 27, 26, 8, 26, 10, 10, 21, 23, 10, 23, 8, 14, 24, 27, 14, 27, 8, 27, 15, 13, 27, 13, 26, 25, 11, 9, 25, 9, 24, 14, 17, 19, 14, 19, 12, 26, 13, 11, 26, 11, 25, 12, 19, 21, 12, 21, 10 }; val.vertices = array; val.uv = uv; val.triangles = array3; val.RecalculateNormals(); val.RecalculateBounds(); val.RecalculateTangents(); val.Optimize(); MeshFilter val2 = ((Component)this).GetComponent(); if ((Object)(object)val2 == (Object)null) { val2 = ((Component)this).gameObject.AddComponent(); } val2.mesh = val; MeshRenderer val3 = ((Component)this).GetComponent(); if ((Object)(object)val3 == (Object)null) { val3 = ((Component)this).gameObject.AddComponent(); } if ((Object)(object)panelMaterial != (Object)null) { ((Renderer)val3).material = panelMaterial; } else { Material val4 = new Material(Shader.Find("Standard")); val4.color = new Color(0.12f, 0.23f, 0.37f); val4.SetFloat("_Metallic", 0.8f); val4.SetFloat("_Glossiness", 0.6f); ((Renderer)val3).material = val4; } Plugin.Logger.LogInfo((object)$"Solar panel mesh generated: {array.Length} vertices, {array3.Length / 3} triangles"); } private void SetupComponents() { //IL_0034: 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) if (addCollider) { BoxCollider val = ((Component)this).GetComponent(); if ((Object)(object)val == (Object)null) { val = ((Component)this).gameObject.AddComponent(); } val.size = new Vector3(4.5f, 0.2f, 2.2f); val.center = Vector3.zero; } if (addSolarPanelComponent) { SolarPanel component = ((Component)this).GetComponent(); if ((Object)(object)component == (Object)null) { component = ((Component)this).gameObject.AddComponent(); } } } public void ApplyTexture(string texturePath) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown if (!File.Exists(texturePath)) { Plugin.Logger.LogWarning((object)("Texture not found: " + texturePath)); return; } byte[] array = File.ReadAllBytes(texturePath); Texture2D val = new Texture2D(2, 2); ImageConversion.LoadImage(val, array); MeshRenderer component = ((Component)this).GetComponent(); if ((Object)(object)component != (Object)null && (Object)(object)((Renderer)component).material != (Object)null) { ((Renderer)component).material.mainTexture = (Texture)(object)val; Plugin.Logger.LogInfo((object)("Texture applied: " + texturePath)); } } public void ApplyTextureFromResources(string resourcePath) { Texture2D val = Resources.Load(resourcePath); if ((Object)(object)val != (Object)null) { MeshRenderer component = ((Component)this).GetComponent(); if ((Object)(object)component != (Object)null && (Object)(object)((Renderer)component).material != (Object)null) { ((Renderer)component).material.mainTexture = (Texture)(object)val; Plugin.Logger.LogInfo((object)("Texture applied from Resources: " + resourcePath)); } } else { Plugin.Logger.LogWarning((object)("Texture not found in Resources: " + resourcePath)); } } } } namespace REPOModSDK { [HarmonyPatch(typeof(PlayerController))] internal static class ExamplePlayerControllerPatch { [HarmonyPrefix] [HarmonyPatch("Start")] private static void Start_Prefix(PlayerController __instance) { REPOModSDK.Logger.LogDebug((object)$"{__instance} Start Prefix"); } [HarmonyPostfix] [HarmonyPatch("Start")] private static void Start_Postfix(PlayerController __instance) { REPOModSDK.Logger.LogDebug((object)$"{__instance} Start Postfix"); } } [BepInPlugin("MR_QualiwTek.REPOModSDK", "REPOModSDK", "1.0")] public class REPOModSDK : BaseUnityPlugin { internal static REPOModSDK Instance { get; private set; } internal static ManualLogSource Logger => Instance._logger; private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger; internal Harmony? Harmony { get; set; } private void Awake() { Instance = this; ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; Patch(); Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!"); } internal void Patch() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //IL_0025: Expected O, but got Unknown if (Harmony == null) { Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID); Harmony val2 = val; Harmony = val; } Harmony.PatchAll(); } internal void Unpatch() { Harmony? harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } } private void Update() { } } }