using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Text; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using PowerNetworkStructures; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("PowerGridIsolator")] [assembly: AssemblyDescription("Dyson Sphere Program BepInEx mod.")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("PowerGridIsolator")] [assembly: AssemblyCopyright("Copyright (c) 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("00000000-0000-0000-0000-000000000000")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = "")] [assembly: AssemblyVersion("1.0.0.0")] namespace PowerGridIsolator; internal sealed class PluginConfig { public readonly ConfigEntry EnableIsolation; public readonly ConfigEntry MaxGroups; public readonly ConfigEntry ToggleTagModeKey; public readonly ConfigEntry DebugLog; public PluginConfig(ConfigFile config) { //IL_005b: Unknown result type (might be due to invalid IL or missing references) EnableIsolation = config.Bind("General", "EnableIsolation", true, "Master switch for the power-grid isolation filter. When true, poles tagged into different isolation groups never merge into the same PowerNetwork, even if physically in range. When false, the patch short-circuits and vanilla merge behaviour applies regardless of any tags."); MaxGroups = config.Bind("General", "MaxGroups", 9, "Highest selectable isolation group id (1-9 by default). Group 0 is always \"ungrouped / vanilla\" and is not counted against this limit."); ToggleTagModeKey = config.Bind("Hotkeys", "ToggleTagModeKey", new KeyboardShortcut((KeyCode)103, (KeyCode[])(object)new KeyCode[1] { (KeyCode)306 }), "Toggle pole-tagging mode. While active, a small window shows the current group (pick 1-MaxGroups via its buttons): left-click a power pole to assign it to the current group, right-click a tagged pole clears it back to group 0 (vanilla). Works on already-built poles, not just newly placed ones."); DebugLog = config.Bind("Diagnostics", "DebugLog", false, "Enable verbose diagnostic logging. Off by default; toggle on for first-run verification. Prints category-tagged lines ([config], [patch], [merge]) to the BepInEx console."); } } internal static class PowerGridIsolatorLog { private static ManualLogSource logger; private static ConfigEntry debugEntry; public static void Init(ManualLogSource src, ConfigEntry debug) { logger = src; debugEntry = debug; } public static void Info(string msg) { if (debugEntry != null && debugEntry.Value && logger != null) { logger.LogInfo((object)("[PowerGridIsolator] " + msg)); } } public static void Warn(string msg) { if (logger != null) { logger.LogWarning((object)("[PowerGridIsolator] " + msg)); } } public static void Error(string msg) { if (logger != null) { logger.LogError((object)("[PowerGridIsolator] " + msg)); } } public static bool IsDebugEnabled() { if (debugEntry != null) { return debugEntry.Value; } return false; } } [HarmonyPatch(typeof(UIBuildingGrid), "Update")] internal static class DragBoxGridPatch { private static readonly FieldRef MaterialRef = AccessTools.FieldRefAccess("material"); private static readonly FieldRef DisplayScaleRef = AccessTools.FieldRefAccess("displayScale"); private static readonly Color TintColor = new Color(1f, 0.5f, 0.05f, 1f); [HarmonyPostfix] [HarmonyPriority(200)] private static void Postfix(UIBuildingGrid __instance) { //IL_007e: 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_00f3: 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_0137: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) TagTool tool = TagToolInitPatch.tool; if (tool == null || !((BuildTool)tool).active || !tool.DragGratBox.HasValue) { return; } PlanetData localPlanet = GameMain.localPlanet; if (localPlanet != null && localPlanet.aux != null) { PlanetGrid val = null; if (localPlanet.aux.activeGridIndex < localPlanet.aux.customGrids.Count) { val = localPlanet.aux.customGrids[localPlanet.aux.activeGridIndex]; } if (val != null) { Vector4 value = tool.DragGratBox.Value; float num = localPlanet.realRadius * 2f; float num2 = DisplayScaleRef.Invoke(__instance); num2 = ((Mathf.Abs(num2 - num) > 10f) ? num : (num2 * 0.8f + num * 0.2f)); DisplayScaleRef.Invoke(__instance) = num2; __instance.gridRnd.enabled = true; ((Component)__instance.gridRnd).transform.localScale = new Vector3(num2, num2, num2); ((Component)__instance.gridRnd).transform.rotation = val.rotation; Material obj = MaterialRef.Invoke(__instance); obj.SetFloat("_Segment", (float)val.segment); obj.SetColor("_TintColor", TintColor); obj.SetFloat("_ReformMode", 0f); obj.SetFloat("_ZMin", -0.5f); obj.SetVector("_CursorGratBox", value); } } } } [HarmonyPatch(typeof(PowerSystem), "OnNodeAdded")] internal static class PowerNetworkPatch { internal sealed class HiddenNetwork { public PowerNetwork Net; public List Nodes; } private static readonly List EmptyNodes = new List(); [HarmonyPrefix] private static void Prefix(PowerSystem __instance, int nodeId, out List __state) { __state = null; try { if (!Plugin.Config.EnableIsolation.Value || __instance == null || __instance.nodePool == null || nodeId <= 0 || nodeId >= __instance.nodePool.Length) { return; } int planetId = ((__instance.planet != null) ? __instance.planet.id : 0); int entityId = __instance.nodePool[nodeId].entityId; int num = GroupStore.GetGroup(planetId, entityId); List list = (__state = new List()); PowerNetwork[] netPool = __instance.netPool; PowerNodeComponent[] nodePool = __instance.nodePool; for (int i = 1; i < __instance.netCursor; i++) { PowerNetwork val = netPool[i]; if (val != null && val.id != 0 && val.nodes != null && val.nodes.Count != 0) { int id = val.nodes[0].id; if (id > 0 && id < nodePool.Length && GroupStore.GetGroup(planetId, nodePool[id].entityId) != num) { list.Add(new HiddenNetwork { Net = val, Nodes = val.nodes }); val.nodes = EmptyNodes; } } } if (list.Count > 0 && PowerGridIsolatorLog.IsDebugEnabled()) { PowerGridIsolatorLog.Info("[merge] entityId=" + entityId + " group=" + num + " hid " + list.Count + " out-of-group network(s) for this connection pass"); } } catch (Exception ex) { PowerGridIsolatorLog.Error("OnNodeAdded group-filter prefix threw: " + ex); } } [HarmonyFinalizer] private static Exception Finalizer(Exception __exception, List __state) { if (__state != null) { for (int i = 0; i < __state.Count; i++) { __state[i].Net.nodes = __state[i].Nodes; } } return __exception; } } [HarmonyPatch(typeof(GameMain), "Start")] internal static class QuickBarButtonPatch { private static UIButton button; [HarmonyPostfix] private static void Postfix() { //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Expected O, but got Unknown //IL_007f: 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_00ab: 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_00c5: 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)button != (Object)null) { return; } try { UIButton infiniteEnergyButton = UIRoot.instance.uiGame.energyBar.infiniteEnergyButton; if ((Object)(object)infiniteEnergyButton == (Object)null) { return; } GameObject val = Object.Instantiate(((Component)infiniteEnergyButton).gameObject, ((Component)infiniteEnergyButton).transform.parent.parent); ((Object)val).name = "[PowerGridIsolator] Toggle"; RectTransform val2 = (RectTransform)((Component)UIRoot.instance.uiGame.energyBar.energyChangesTip).transform; Transform transform = val.transform; float x = ((Transform)val2).localPosition.x; Rect rect = val2.rect; transform.localPosition = new Vector3(x - ((Rect)(ref rect)).width / 1.5f - 50f, val.transform.localPosition.y, val.transform.localPosition.z); val.SetActive(true); Sprite val3 = FindPowerNodeIcon(); if ((Object)(object)val3 != (Object)null) { Transform val4 = val.transform.Find("icon"); if ((Object)(object)val4 != (Object)null) { Image component = ((Component)val4).GetComponent(); if ((Object)(object)component != (Object)null) { component.sprite = val3; } } } button = val.GetComponent(); button.onClick += OnClick; button.tips.corner = 8; button.tips.tipTitle = "PowerGridIsolator"; button.tips.tipText = "Toggle pole-tagging mode (" + FormatShortcut(Plugin.Config.ToggleTagModeKey.Value) + ")"; PowerGridIsolatorLog.Info("[ui] Quick-bar toggle button created."); } catch (Exception ex) { PowerGridIsolatorLog.Warn("[ui] Failed to create quick-bar button: " + ex); } } private static void OnClick(int _) { if (Plugin.Config.EnableIsolation.Value) { TagToolActivatePatch.RequestToggle(); } } private static string FormatShortcut(KeyboardShortcut shortcut) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: 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_004a: Unknown result type (might be due to invalid IL or missing references) StringBuilder stringBuilder = new StringBuilder(); foreach (KeyCode modifier in ((KeyboardShortcut)(ref shortcut)).Modifiers) { stringBuilder.Append(modifier).Append(" + "); } stringBuilder.Append(((KeyboardShortcut)(ref shortcut)).MainKey); return stringBuilder.ToString(); } private static Sprite FindPowerNodeIcon() { ItemProto[] dataArray = ((ProtoSet)(object)LDB.items).dataArray; foreach (ItemProto val in dataArray) { if (val != null && val.prefabDesc != null && val.prefabDesc.isPowerNode) { return val.iconSprite; } } return null; } } [HarmonyPatch(typeof(GameMain), "Begin")] internal static class GameBeginHookPatch { [HarmonyPostfix] private static void Postfix() { try { GroupStore.Clear(); SaveIO.TryLoad((GameMain.data != null) ? GameMain.data.gameName : null); } catch (Exception ex) { PowerGridIsolatorLog.Error("GameMain.Begin postfix threw: " + ex); } } } [HarmonyPatch(typeof(GameSave), "SaveCurrentGame")] internal static class GameSaveHookPatch { [HarmonyPostfix] private static void Postfix(bool __result) { try { if (__result) { SaveIO.Save((GameMain.data != null) ? GameMain.data.gameName : null); } } catch (Exception ex) { PowerGridIsolatorLog.Error("GameSave.SaveCurrentGame postfix threw: " + ex); } } } [HarmonyPatch(typeof(PlayerAction_Build), "Init")] internal static class TagToolInitPatch { internal static TagTool tool; [HarmonyPostfix] private static void Postfix(PlayerAction_Build __instance) { BuildTool[] tools = __instance.tools; if (tools != null) { BuildTool[] array = (BuildTool[])(object)new BuildTool[tools.Length + 1]; tools.CopyTo(array, 0); tool = new TagTool(); array[^1] = (BuildTool)(object)tool; __instance.tools = array; PowerGridIsolatorLog.Info("[tag] TagTool registered into PlayerAction_Build.tools. Total: " + array.Length); } } } [HarmonyPatch(typeof(PlayerAction_Build), "DetermineActive")] internal static class TagToolActivatePatch { private static bool toggleRequested; private static int hotkeyConsumedFrame = -1; public static void RequestToggle() { toggleRequested = true; } [HarmonyPostfix] private static void Postfix(PlayerAction_Build __instance, ref bool __result) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: 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) TagTool tool = TagToolInitPatch.tool; if (tool == null || !Plugin.Config.EnableIsolation.Value) { toggleRequested = false; return; } bool flag = toggleRequested; bool flag2 = false; KeyboardShortcut value = Plugin.Config.ToggleTagModeKey.Value; if (((KeyboardShortcut)(ref value)).IsDown() && Time.frameCount != hotkeyConsumedFrame) { flag2 = true; hotkeyConsumedFrame = Time.frameCount; } bool flag3 = flag || flag2; toggleRequested = false; if (flag3 && PowerGridIsolatorLog.IsDebugEnabled()) { PowerGridIsolatorLog.Info("[tag] toggle triggered via " + (flag ? "quick-bar button" : "hotkey")); } if (tool.IsEnable && (object)__instance.activeTool == tool) { if (flag3) { tool.IsEnable = false; } else { __result = true; } } else if (flag3 && (int)__instance.blueprintMode == 0 && VFInput.readyToBuild) { ((PlayerAction)__instance).player.SetHandItems(0, 0, 0); ((CommandState)(ref ((PlayerAction)__instance).player.controller.cmd)).SetNoneCommand(); tool.IsEnable = true; __result = true; } } } internal static class SaveIO { private static string SaveDir => Path.Combine(Paths.ConfigPath, "PowerGridIsolator", "saves"); public static void TryLoad(string gameName) { try { string path = PathFor(gameName); if (!File.Exists(path)) { PowerGridIsolatorLog.Info("[save] no sidecar for '" + gameName + "' - starting untagged."); return; } int num = 0; string[] array = File.ReadAllLines(path); foreach (string text in array) { if (!string.IsNullOrEmpty(text)) { string[] array2 = text.Split(','); if (array2.Length == 3 && int.TryParse(array2[0], out var result) && int.TryParse(array2[1], out var result2) && int.TryParse(array2[2], out var result3)) { GroupStore.SetGroup(result, result2, result3); num++; } } } PowerGridIsolatorLog.Info("[save] loaded " + num + " group tag(s) for '" + gameName + "'."); } catch (Exception ex) { PowerGridIsolatorLog.Error("[save] failed to load tags for '" + gameName + "': " + ex); } } public static void Save(string gameName) { try { Directory.CreateDirectory(SaveDir); StringBuilder stringBuilder = new StringBuilder(); int num = 0; foreach (var item in GroupStore.ExportAll()) { stringBuilder.Append(item.planetId).Append(',').Append(item.entityId) .Append(',') .Append(item.groupId) .Append('\n'); num++; } File.WriteAllText(PathFor(gameName), stringBuilder.ToString()); PowerGridIsolatorLog.Info("[save] wrote " + num + " group tag(s) for '" + gameName + "'."); } catch (Exception ex) { PowerGridIsolatorLog.Error("[save] failed to write tags for '" + gameName + "': " + ex); } } private static string PathFor(string gameName) { return Path.Combine(SaveDir, Sanitize(gameName) + ".txt"); } private static string Sanitize(string name) { if (string.IsNullOrEmpty(name)) { return "unnamed"; } char[] invalidFileNameChars = Path.GetInvalidFileNameChars(); StringBuilder stringBuilder = new StringBuilder(name.Length); foreach (char c in name) { stringBuilder.Append((Array.IndexOf(invalidFileNameChars, c) >= 0) ? '_' : c); } return stringBuilder.ToString(); } } [BepInPlugin("com.zicarius.PowerGridIsolator", "PowerGridIsolator", "1.0.0")] [BepInProcess("DSPGAME.exe")] public sealed class Plugin : BaseUnityPlugin { public const string GUID = "com.zicarius.PowerGridIsolator"; public const string NAME = "PowerGridIsolator"; public const string VERSION = "1.0.0"; internal static PluginConfig Config; private static Harmony _harmony; private void Awake() { //IL_0083: 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_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Expected O, but got Unknown Config = new PluginConfig(((BaseUnityPlugin)this).Config); PowerGridIsolatorLog.Init(((BaseUnityPlugin)this).Logger, Config.DebugLog); PowerGridIsolatorLog.Info("[config] Loaded with config: enableIsolation=" + Config.EnableIsolation.Value + ", maxGroups=" + Config.MaxGroups.Value + ", toggleTagModeKey=" + ((object)Config.ToggleTagModeKey.Value/*cast due to .constrained prefix*/).ToString() + ", debug=" + Config.DebugLog.Value); try { _harmony = new Harmony("com.zicarius.PowerGridIsolator"); _harmony.PatchAll(typeof(Plugin).Assembly); PowerGridIsolatorLog.Info("[patch] Applied Harmony patches: PowerNetworkPatch, GameBeginHookPatch, GameSaveHookPatch, TagToolInitPatch, TagToolActivatePatch, QuickBarButtonPatch."); } catch (Exception ex) { PowerGridIsolatorLog.Error("Harmony PatchAll failed: " + ex); } DumpTargetMethodSignatures(); } private static void DumpTargetMethodSignatures() { string[][] array = new string[6][] { new string[2] { "PowerSystem", "OnNodeAdded" }, new string[2] { "GameMain", "Begin" }, new string[2] { "GameSave", "SaveCurrentGame" }, new string[2] { "PlayerAction_Build", "Init" }, new string[2] { "PlayerAction_Build", "DetermineActive" }, new string[2] { "GameMain", "Start" } }; foreach (string[] array2 in array) { try { Type type = AccessTools.TypeByName(array2[0]); if (type == null) { PowerGridIsolatorLog.Warn("[diag] Type not found: " + array2[0]); continue; } MethodInfo methodInfo = AccessTools.Method(type, array2[1], (Type[])null, (Type[])null); if (methodInfo == null) { PowerGridIsolatorLog.Warn("[diag] Method not found: " + array2[0] + "." + array2[1]); continue; } ParameterInfo[] parameters = methodInfo.GetParameters(); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append("[diag] ").Append(array2[0]).Append(".") .Append(array2[1]) .Append("("); for (int j = 0; j < parameters.Length; j++) { if (j > 0) { stringBuilder.Append(", "); } stringBuilder.Append(parameters[j].ParameterType.Name).Append(" ").Append(parameters[j].Name); } stringBuilder.Append(")"); PowerGridIsolatorLog.Info(stringBuilder.ToString()); } catch (Exception ex) { PowerGridIsolatorLog.Error("[diag] Failed to inspect " + array2[0] + "." + array2[1] + ": " + ex.Message); } } } private void OnGUI() { TagWindow.OnGUI(); } private void OnDestroy() { Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } _harmony = null; } } internal static class GroupStore { private static readonly Dictionary> groupsByPlanet = new Dictionary>(); public static int GetGroup(int planetId, int entityId) { if (!groupsByPlanet.TryGetValue(planetId, out var value)) { return 0; } if (!value.TryGetValue(entityId, out var value2)) { return 0; } return value2; } public static void SetGroup(int planetId, int entityId, int groupId) { if (!groupsByPlanet.TryGetValue(planetId, out var value)) { if (groupId == 0) { return; } value = new Dictionary(); groupsByPlanet[planetId] = value; } if (groupId == 0) { value.Remove(entityId); } else { value[entityId] = groupId; } } public static void Clear() { groupsByPlanet.Clear(); } public static IEnumerable<(int planetId, int entityId, int groupId)> ExportAll() { foreach (KeyValuePair> planetEntry in groupsByPlanet) { foreach (KeyValuePair item in planetEntry.Value) { yield return (planetId: planetEntry.Key, entityId: item.Key, groupId: item.Value); } } } } internal sealed class TagTool : BuildTool { private int dragButton = -1; private Vector2 dragStartScreenPos; private bool isDragging; private const float DragThresholdPixels = 6f; private int liveCountThrottle; private const int LiveCountEveryNTicks = 6; private const int GroundLayerMask = 8720; public bool IsEnable { get; set; } public int CurrentGroup { get; private set; } = 1; public bool IsHoveringPole { get; private set; } public Vector3 DragStartGroundDir { get; private set; } public Vector4? DragGratBox { get; private set; } public int DragSelectionCount { get; private set; } public void SetCurrentGroup(int group) { int num = Mathf.Max(1, Plugin.Config.MaxGroups.Value); int num2 = Mathf.Clamp(group, 1, num); if (num2 != CurrentGroup) { CurrentGroup = num2; PowerGridIsolatorLog.Info("[tag] current group -> " + CurrentGroup); } } public override bool DetermineActive() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) if (IsEnable && (int)((BuildTool)this).actionBuild.blueprintMode == 0) { return ((BuildTool)this).controller.cmd.mode == 0; } return false; } protected override void _OnOpen() { IsHoveringPole = false; PowerGridIsolatorLog.Info("[tag] tag mode ON, current group=" + CurrentGroup); } protected override void _OnClose() { IsEnable = false; IsHoveringPole = false; PowerGridIsolatorLog.Info("[tag] tag mode OFF"); } protected unsafe override void _OnTick(long time) { //IL_0085: 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_0098: 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_009f: 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_00c5: 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_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00de: 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_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_013d: 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_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_026f: Unknown result type (might be due to invalid IL or missing references) if (VFInput.escape) { IsEnable = false; ((BuildTool)this)._Close(); return; } int num = ResolveHoveredPole(); IsHoveringPole = num > 0; if (TagWindow.MouseOverWindow) { DragGratBox = null; ((BuildTool)this).actionBuild.model.cursorText = ""; return; } if (dragButton == -1) { if (Input.GetMouseButtonDown(0)) { StartDrag(0); } else if (Input.GetMouseButtonDown(1)) { StartDrag(1); } } if (dragButton == -1) { return; } Vector2 val = Vector2.op_Implicit(Input.mousePosition); Vector2 val2; if (!isDragging) { val2 = val - dragStartScreenPos; if (((Vector2)(ref val2)).magnitude > 6f) { isDragging = true; } } if (isDragging) { Vector3 val3 = RaycastGroundDir(); if (DragStartGroundDir != Vector3.zero && val3 != Vector3.zero) { DragGratBox = BuildGratBox(DragStartGroundDir, val3); } if (DragGratBox.HasValue) { liveCountThrottle++; if (liveCountThrottle >= 6) { liveCountThrottle = 0; DragSelectionCount = ScanPolesInGratBox(DragGratBox.Value, -1); } ((BuildTool)this).actionBuild.model.cursorText = "PowerGridIsolator - " + DragSelectionCount + " pole(s) selected"; } if (liveCountThrottle == 0 && PowerGridIsolatorLog.IsDebugEnabled()) { string[] obj = new string[8] { "[tag] drag mousePos=", null, null, null, null, null, null, null }; val2 = val; obj[1] = ((object)(*(Vector2*)(&val2))/*cast due to .constrained prefix*/).ToString(); obj[2] = " screen="; obj[3] = Screen.width.ToString(); obj[4] = "x"; obj[5] = Screen.height.ToString(); obj[6] = " gratBox="; obj[7] = DragGratBox.ToString(); PowerGridIsolatorLog.Info(string.Concat(obj)); } } else { DragGratBox = null; } if ((dragButton == 0) ? Input.GetMouseButtonUp(0) : Input.GetMouseButtonUp(1)) { int num2 = ((dragButton == 0) ? CurrentGroup : 0); bool flag = false; if (isDragging && DragGratBox.HasValue) { PowerGridIsolatorLog.Info("[tag] drag-select: tagged " + ScanPolesInGratBox(DragGratBox.Value, num2) + " pole(s) to group " + num2); } else if (num > 0) { Tag(num, num2); } else if (dragButton == 1) { flag = true; } if (dragButton == 0) { VFInput.UseMouseLeft(); } else { VFInput.UseMouseRight(); } dragButton = -1; isDragging = false; DragGratBox = null; DragSelectionCount = 0; liveCountThrottle = 0; ((BuildTool)this).actionBuild.model.cursorText = ""; if (flag) { IsEnable = false; ((BuildTool)this)._Close(); } } } private void StartDrag(int button) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: 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) dragButton = button; dragStartScreenPos = Vector2.op_Implicit(Input.mousePosition); DragStartGroundDir = RaycastGroundDir(); isDragging = false; } private static Vector4 BuildGratBox(Vector3 startDir, Vector3 currentDir) { //IL_0000: 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_000e: 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_0038: Unknown result type (might be due to invalid IL or missing references) float longitudeRad = BlueprintUtils.GetLongitudeRad(startDir); float latitudeRad = BlueprintUtils.GetLatitudeRad(startDir); float longitudeRad2 = BlueprintUtils.GetLongitudeRad(currentDir); float latitudeRad2 = BlueprintUtils.GetLatitudeRad(currentDir); return new Vector4(Mathf.Min(longitudeRad, longitudeRad2), Mathf.Min(latitudeRad, latitudeRad2), Mathf.Max(longitudeRad, longitudeRad2), Mathf.Max(latitudeRad, latitudeRad2)); } internal static Vector3 RaycastGroundDir() { //IL_0018: 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_000d: Unknown result type (might be due to invalid IL or missing references) //IL_003e: 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_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Camera.main == (Object)null) { return Vector3.zero; } RaycastHit val = default(RaycastHit); if (!Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), ref val, 800f, 8720, (QueryTriggerInteraction)2)) { return Vector3.zero; } Vector3 point = ((RaycastHit)(ref val)).point; return ((Vector3)(ref point)).normalized; } private int ScanPolesInGratBox(Vector4 box, int groupIdOrCountOnly) { //IL_0017: 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_001d: 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 (base.factory == null || base.factory.entityPool == null) { return 0; } BPGratBox val = (BPGratBox)box; EntityData[] entityPool = base.factory.entityPool; int entityCursor = base.factory.entityCursor; int num = 0; for (int i = 1; i < entityCursor; i++) { if (entityPool[i].id == i && entityPool[i].powerNodeId > 0 && ((BPGratBox)(ref val)).InGratBox(entityPool[i].pos)) { if (groupIdOrCountOnly >= 0) { Tag(i, groupIdOrCountOnly); } num++; } } return num; } private int ResolveHoveredPole() { RaycastLogic raycast = ((BuildTool)this).controller.cmd.raycast; if (raycast == null) { return 0; } int id = raycast.castEntity.id; if (id <= 0) { return 0; } if (base.factory == null || base.factory.entityPool == null) { return 0; } if (id >= base.factory.entityPool.Length) { return 0; } if (base.factory.entityPool[id].powerNodeId <= 0) { return 0; } return id; } private void Tag(int entityId, int groupId) { if (base.factory == null || base.factory.entityPool == null || base.factory.powerSystem == null || entityId <= 0 || entityId >= base.factory.entityPool.Length) { return; } int powerNodeId = base.factory.entityPool[entityId].powerNodeId; if (powerNodeId <= 0) { return; } int planetId = ((base.factory.powerSystem.planet != null) ? base.factory.powerSystem.planet.id : 0); int num = GroupStore.GetGroup(planetId, entityId); if (num != groupId) { GroupStore.SetGroup(planetId, entityId, groupId); base.factory.powerSystem.OnNodeRemoving(powerNodeId); base.factory.powerSystem.OnNodeAdded(powerNodeId); if (base.planet != null && (Object)(object)base.planet.factoryModel != (Object)null) { base.planet.factoryModel.RefreshPowerNodes(); } PowerGridIsolatorLog.Info("[tag] pole entityId=" + entityId + " planet=" + planetId + " group " + num + " -> " + groupId); } } } internal static class TagWindow { private const int WindowId = 872341001; private static Rect windowRect = new Rect(140f, 140f, 260f, 0f); public static bool MouseOverWindow { get; private set; } public static void OnGUI() { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Expected O, but got Unknown //IL_004d: 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_0068: Unknown result type (might be due to invalid IL or missing references) MouseOverWindow = false; TagTool tool = TagToolInitPatch.tool; if (tool != null && ((BuildTool)tool).active) { windowRect = GUILayout.Window(872341001, windowRect, (WindowFunction)delegate { DrawWindow(tool); }, "PowerGridIsolator - Tag Mode", Array.Empty()); if (Event.current != null) { MouseOverWindow = ((Rect)(ref windowRect)).Contains(Event.current.mousePosition); } } } private static void DrawWindow(TagTool tool) { //IL_00f8: Unknown result type (might be due to invalid IL or missing references) GUILayout.Label(tool.IsHoveringPole ? "Pole under cursor" : "No pole under cursor", Array.Empty()); GUILayout.Space(6f); GUILayout.Label("Group (left-click/drag over poles to assign):", Array.Empty()); int num = Mathf.Max(1, Plugin.Config.MaxGroups.Value); GUILayout.BeginHorizontal(Array.Empty()); for (int i = 1; i <= num; i++) { if (GUILayout.Button((i == tool.CurrentGroup) ? ("[" + i + "]") : i.ToString(), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(28f) })) { tool.SetCurrentGroup(i); } if (i % 5 == 0 && i != num) { GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(Array.Empty()); } } GUILayout.EndHorizontal(); GUILayout.Space(6f); GUILayout.Label("Right-click/drag over poles to clear them back to group 0.\nRight-click empty ground to exit.", Array.Empty()); GUI.DragWindow(new Rect(0f, 0f, 10000f, 20f)); } }