From 3a2821a2c1c5b64996cfaced0cd92e280f50c0e6 Mon Sep 17 00:00:00 2001 From: Soar Qin Date: Mon, 2 Sep 2024 21:30:15 +0800 Subject: [PATCH] WIP --- UXAssist/LogisticsPatch.cs | 502 ++++++++++++++++++++++++++++++++-- UXAssist/UXAssist.cs | 7 + UXAssist/UXAssist.csproj | 3 + UXAssist/assets/icon/in.png | Bin 0 -> 2193 bytes UXAssist/assets/icon/keep.png | Bin 0 -> 925 bytes UXAssist/assets/icon/out.png | Bin 0 -> 2179 bytes 6 files changed, 492 insertions(+), 20 deletions(-) create mode 100644 UXAssist/assets/icon/in.png create mode 100644 UXAssist/assets/icon/keep.png create mode 100644 UXAssist/assets/icon/out.png diff --git a/UXAssist/LogisticsPatch.cs b/UXAssist/LogisticsPatch.cs index 4e28333..d8b64f3 100644 --- a/UXAssist/LogisticsPatch.cs +++ b/UXAssist/LogisticsPatch.cs @@ -1,10 +1,14 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Reflection.Emit; using BepInEx.Configuration; using HarmonyLib; using UnityEngine; using UnityEngine.EventSystems; +using UnityEngine.Serialization; +using UnityEngine.UI; +using UXAssist.Common; namespace UXAssist; @@ -31,6 +35,16 @@ public static class LogisticsPatch LogisticsConstrolPanelImprovement.Enable(false); } + public static void Start() + { + LogisticsInfoWindow.InitGUI(); + } + + public static void OnUpdate() + { + LogisticsInfoWindow.StationInfoWindowUpdate(); + } + public static class LogisticsCapacityTweaks { private static Harmony _patch; @@ -403,7 +417,7 @@ public static class LogisticsPatch ); return matcher.InstructionEnumeration(); } - + private static void OnStationEntryItemIconRightClick(UIControlPanelStationEntry stationEntry, int slot) { var storage = stationEntry.station?.storage; @@ -418,37 +432,485 @@ public static class LogisticsPatch controlPanelWindow.DetermineFilterResults(); } - private static Action[] _onStationEntryItemIconRightClickActions = new Action[5]; - + private static readonly Action[] OnStationEntryItemIconRightClickActions = new Action[5]; + [HarmonyPostfix] [HarmonyPatch(typeof(UIControlPanelStationEntry), nameof(UIControlPanelStationEntry._OnRegEvent))] private static void UIControlPanelStationEntry__OnRegEvent_Postfix(UIControlPanelStationEntry __instance) { - _onStationEntryItemIconRightClickActions[0] = _ => OnStationEntryItemIconRightClick(__instance, 0); - _onStationEntryItemIconRightClickActions[1] = _ => OnStationEntryItemIconRightClick(__instance, 1); - _onStationEntryItemIconRightClickActions[2] = _ => OnStationEntryItemIconRightClick(__instance, 2); - _onStationEntryItemIconRightClickActions[3] = _ => OnStationEntryItemIconRightClick(__instance, 3); - _onStationEntryItemIconRightClickActions[4] = _ => OnStationEntryItemIconRightClick(__instance, 4); - __instance.storageItem0.itemButton.onRightClick += _onStationEntryItemIconRightClickActions[0]; - __instance.storageItem1.itemButton.onRightClick += _onStationEntryItemIconRightClickActions[1]; - __instance.storageItem2.itemButton.onRightClick += _onStationEntryItemIconRightClickActions[2]; - __instance.storageItem3.itemButton.onRightClick += _onStationEntryItemIconRightClickActions[3]; - __instance.storageItem4.itemButton.onRightClick += _onStationEntryItemIconRightClickActions[4]; + OnStationEntryItemIconRightClickActions[0] = _ => OnStationEntryItemIconRightClick(__instance, 0); + OnStationEntryItemIconRightClickActions[1] = _ => OnStationEntryItemIconRightClick(__instance, 1); + OnStationEntryItemIconRightClickActions[2] = _ => OnStationEntryItemIconRightClick(__instance, 2); + OnStationEntryItemIconRightClickActions[3] = _ => OnStationEntryItemIconRightClick(__instance, 3); + OnStationEntryItemIconRightClickActions[4] = _ => OnStationEntryItemIconRightClick(__instance, 4); + __instance.storageItem0.itemButton.onRightClick += OnStationEntryItemIconRightClickActions[0]; + __instance.storageItem1.itemButton.onRightClick += OnStationEntryItemIconRightClickActions[1]; + __instance.storageItem2.itemButton.onRightClick += OnStationEntryItemIconRightClickActions[2]; + __instance.storageItem3.itemButton.onRightClick += OnStationEntryItemIconRightClickActions[3]; + __instance.storageItem4.itemButton.onRightClick += OnStationEntryItemIconRightClickActions[4]; } - + [HarmonyPostfix] [HarmonyPatch(typeof(UIControlPanelStationEntry), nameof(UIControlPanelStationEntry._OnUnregEvent))] private static void UIControlPanelStationEntry__OnUnregEvent_Postfix(UIControlPanelStationEntry __instance) { - __instance.storageItem0.itemButton.onRightClick -= _onStationEntryItemIconRightClickActions[0]; - __instance.storageItem1.itemButton.onRightClick -= _onStationEntryItemIconRightClickActions[1]; - __instance.storageItem2.itemButton.onRightClick -= _onStationEntryItemIconRightClickActions[2]; - __instance.storageItem3.itemButton.onRightClick -= _onStationEntryItemIconRightClickActions[3]; - __instance.storageItem4.itemButton.onRightClick -= _onStationEntryItemIconRightClickActions[4]; + __instance.storageItem0.itemButton.onRightClick -= OnStationEntryItemIconRightClickActions[0]; + __instance.storageItem1.itemButton.onRightClick -= OnStationEntryItemIconRightClickActions[1]; + __instance.storageItem2.itemButton.onRightClick -= OnStationEntryItemIconRightClickActions[2]; + __instance.storageItem3.itemButton.onRightClick -= OnStationEntryItemIconRightClickActions[3]; + __instance.storageItem4.itemButton.onRightClick -= OnStationEntryItemIconRightClickActions[4]; for (var i = 0; i < 5; i++) { - _onStationEntryItemIconRightClickActions[i] = null; + OnStationEntryItemIconRightClickActions[i] = null; } } } + + private static class LogisticsInfoWindow + { + private static int _maxCount; + private static StationTip[] _stationtips = new StationTip[_maxCount]; + private static GameObject _stationTipRoot; + private static GameObject _tipPrefab; + private static readonly Color OrangeColor = new(224f / 255, 139f / 255, 93f / 255); + private static readonly Color BlueColor = new(75f / 255, 172f / 255, 205f / 255); + private static Sprite _leftsprite; + private static Sprite _rightsprite; + private static Sprite _flatsprite; + + public static void InitGUI() + { + _leftsprite = Util.LoadEmbeddedSprite("assets/icon/in.png"); + _rightsprite = Util.LoadEmbeddedSprite("assets/icon/out.png"); + _flatsprite = Util.LoadEmbeddedSprite("assets/icon/keep.png"); + _stationTipRoot = UnityEngine.Object.Instantiate(GameObject.Find("UI Root/Overlay Canvas/In Game/Scene UIs/Vein Marks"), GameObject.Find("UI Root/Overlay Canvas/In Game/Scene UIs").transform); + _stationTipRoot.name = "stationTip"; + UnityEngine.Object.Destroy(_stationTipRoot.GetComponent()); + _tipPrefab = UnityEngine.Object.Instantiate(GameObject.Find("UI Root/Overlay Canvas/In Game/Scene UIs/Vein Marks/vein-tip-prefab"), _stationTipRoot.transform); + _tipPrefab.name = "tipPrefab"; + _tipPrefab.GetComponent().sprite = GameObject.Find("UI Root/Overlay Canvas/In Game/Windows/Key Tips/tip-prefab").GetComponent().sprite; + _tipPrefab.GetComponent().color = new Color(0, 0, 0, 0.8f); + _tipPrefab.GetComponent().sizeDelta = new Vector2(150, 160f); + _tipPrefab.GetComponent().enabled = true; + _tipPrefab.transform.localPosition = new Vector3(200f, 800f, 0); + _tipPrefab.GetComponent().pivot = new Vector2(0.5f, 0.5f); + UnityEngine.Object.Destroy(_tipPrefab.GetComponent()); + var infoText = _tipPrefab.transform.Find("info-text").gameObject; + for (var index = 0; index < 13; ++index) + { + var countText = UnityEngine.Object.Instantiate(infoText, Vector3.zero, Quaternion.identity, _tipPrefab.transform); + countText.name = "countText" + index; + float y = (-5 - 35 * index); + countText.GetComponent().fontSize = index == 5 ? 15 : 19; + countText.GetComponent().text = "99999"; + countText.GetComponent().alignment = TextAnchor.MiddleRight; + countText.GetComponent().sizeDelta = new Vector2(95, 30); + countText.GetComponent().anchorMax = new Vector2(0, 1); + countText.GetComponent().anchorMin = new Vector2(0, 1); + countText.GetComponent().pivot = new Vector2(0, 1); + countText.GetComponent().anchoredPosition3D = new Vector3(70, y, 0); + UnityEngine.Object.Destroy(countText.GetComponent()); + var itemIcon = UnityEngine.Object.Instantiate(_tipPrefab.transform.Find("icon").gameObject, new Vector3(0, 0, 0), Quaternion.identity, _tipPrefab.transform); + itemIcon.name = "icon" + index; + countText.GetComponent().sizeDelta = new Vector2(30, 30); + itemIcon.GetComponent().anchorMax = new Vector2(0, 1); + itemIcon.GetComponent().anchorMin = new Vector2(0, 1); + itemIcon.GetComponent().pivot = new Vector2(0, 1); + itemIcon.GetComponent().anchoredPosition3D = new Vector3(0, y, 0); + var stateLocal = UnityEngine.Object.Instantiate(_tipPrefab.transform.Find("icon").gameObject, new Vector3(0, 0, 0), Quaternion.identity, _tipPrefab.transform); + stateLocal.name = "iconLocal" + index; + stateLocal.GetComponent().material = null; + stateLocal.GetComponent().sizeDelta = new Vector2(20, 20); + stateLocal.GetComponent().anchorMax = new Vector2(0, 1); + stateLocal.GetComponent().anchorMin = new Vector2(0, 1); + stateLocal.GetComponent().pivot = new Vector2(0, 1); + stateLocal.GetComponent().anchoredPosition3D = new Vector3(105, y, 0); + var stateRemote = UnityEngine.Object.Instantiate(_tipPrefab.transform.Find("icon").gameObject, new Vector3(0, 0, 0), Quaternion.identity, _tipPrefab.transform); + stateRemote.name = "iconRemote" + index; + stateRemote.GetComponent().material = null; + stateRemote.GetComponent().sizeDelta = new Vector2(20, 20); + stateRemote.GetComponent().anchorMax = new Vector2(0, 1); + stateRemote.GetComponent().anchorMin = new Vector2(0, 1); + stateRemote.GetComponent().pivot = new Vector2(0, 1); + stateRemote.GetComponent().anchoredPosition3D = new Vector3(105, y - 15, 0); + } + for (var i = 0; i < 3; i++) + { + var iconText = UnityEngine.Object.Instantiate(GameObject.Find("UI Root/Overlay Canvas/In Game/Top Tips/Entity Briefs/brief-info-top/brief-info/content/icons/icon"), new Vector3(0, 0, 0), Quaternion.identity, _tipPrefab.transform); + UnityEngine.Object.Destroy(iconText.transform.Find("count-text").gameObject); + UnityEngine.Object.Destroy(iconText.transform.Find("bg").gameObject); + UnityEngine.Object.Destroy(iconText.transform.Find("inc").gameObject); + UnityEngine.Object.Destroy(iconText.GetComponent()); + + iconText.name = "iconText" + i; + iconText.GetComponent().localScale = new Vector3(0.7f, 0.7f, 1); + iconText.GetComponent().anchorMax = new Vector2(0, 1); + iconText.GetComponent().anchorMin = new Vector2(0, 1); + iconText.GetComponent().pivot = new Vector2(0, 1); + iconText.GetComponent().anchoredPosition3D = new Vector3(i * 30, -180, 0); + var countText = UnityEngine.Object.Instantiate(infoText, Vector3.zero, Quaternion.identity, iconText.transform); + UnityEngine.Object.Destroy(countText.GetComponent()); + + countText.name = "countText"; + countText.GetComponent().fontSize = 22; + countText.GetComponent().text = "100"; + countText.GetComponent().alignment = TextAnchor.MiddleRight; + countText.GetComponent().sizeDelta = new Vector2(95, 30); + countText.GetComponent().anchorMax = new Vector2(0, 1); + countText.GetComponent().anchorMin = new Vector2(0, 1); + countText.GetComponent().pivot = new Vector2(0, 1); + countText.GetComponent().localPosition = new Vector3(-50, -20, 0); + + if (i == 2) continue; + + countText = UnityEngine.Object.Instantiate(infoText, Vector3.zero, Quaternion.identity, iconText.transform); + UnityEngine.Object.Destroy(countText.GetComponent()); + + countText.name = "countText2"; + countText.GetComponent().fontSize = 22; + countText.GetComponent().text = "100"; + countText.GetComponent().alignment = TextAnchor.MiddleRight; + countText.GetComponent().sizeDelta = new Vector2(95, 30); + countText.GetComponent().anchorMax = new Vector2(0, 1); + countText.GetComponent().anchorMin = new Vector2(0, 1); + countText.GetComponent().pivot = new Vector2(0, 1); + countText.GetComponent().localPosition = new Vector3(-50, 10, 0); + } + _tipPrefab.transform.Find("icon").gameObject.SetActive(false); + _tipPrefab.SetActive(false); + for (var i = 0; i < _maxCount; ++i) + { + var temptip = UnityEngine.Object.Instantiate(_tipPrefab, _stationTipRoot.transform); + var tempstationtip = temptip.AddComponent(); + _stationtips[i] = tempstationtip; + } + } + + public class StationTip : MonoBehaviour + { + [FormerlySerializedAs("RectTransform")] public RectTransform rectTransform; + private Transform[] _icons; + private RectTransform[] _iconRectTransforms; + private Transform[] _iconLocals; + private Transform[] _iconRemotes; + private Transform[] _countTexts; + + private Transform[] _iconTexts; + private Text[] _countText; + private Text[] _countText2; + + private GameObject _infoText; + + public void InitStationTip() + { + rectTransform = GetComponent(); + _icons = new Transform[13]; + _iconLocals = new Transform[13]; + _iconRemotes = new Transform[13]; + _countTexts = new Transform[13]; + _iconTexts = new Transform[3]; + + + _countText = new Text[3]; + _countText2 = new Text[3]; + + _iconRectTransforms = new RectTransform[13]; + _infoText = transform.Find("info-text").gameObject; + for (var i = 0; i < 3; i++) + { + _iconTexts[i] = transform.Find("iconText" + i); + _countText[i] = _iconTexts[i].Find("countText").GetComponent(); + if (i != 2) + { + _countText2[i] = _iconTexts[i].Find("countText2").GetComponent(); + } + } + + for (var i = 0; i < 13; i++) + { + _icons[i] = transform.Find("icon" + i); + _iconLocals[i] = transform.Find("iconLocal" + i); + _iconRemotes[i] = transform.Find("iconRemote" + i); + _countTexts[i] = transform.Find("countText" + i); + _iconRectTransforms[i] = _icons[i].GetComponent(); + + _iconLocals[i].gameObject.SetActive(false); + _iconRemotes[i].gameObject.SetActive(false); + } + + _infoText.SetActive(false); + } + + public void SetStationName(string stationName, int index) + { + var lastIcon = _icons[index]; + var lastCountText = _countTexts[index]; + lastIcon.gameObject.SetActive(false); + for (var i = index; i < 13; ++i) + { + _iconLocals[i].gameObject.SetActive(false); + _iconRemotes[i].gameObject.SetActive(false); + _icons[i].gameObject.SetActive(false); + _countTexts[i].gameObject.SetActive(false); + } + + if (!string.IsNullOrEmpty(stationName)) + { + var lastCountTextPosition = lastCountText.GetComponent().anchoredPosition3D; + lastCountText.GetComponent().anchoredPosition3D = new Vector3(90, lastCountTextPosition.y, 0); + lastCountText.GetComponent().fontSize = 18; + lastCountText.GetComponent().text = stationName; + lastCountText.GetComponent().color = Color.white; + lastCountText.gameObject.SetActive(true); + } + else + { + lastIcon.gameObject.SetActive(false); + lastCountText.gameObject.SetActive(false); + } + } + + public void SetItem(int itemId, int itemCount, int i, ELogisticStorage localLogic, ELogisticStorage remoteLogic, bool isStellarorCollector) + { + var icon = _icons[i]; + var iconPos = _iconRectTransforms[i].anchoredPosition3D; + var iconLocal = _iconLocals[i]; + var iconRemote = _iconRemotes[i]; + var iconLocalImage = iconLocal.GetComponent(); + var iconRemoteImage = iconRemote.GetComponent(); + var countText = _countTexts[i]; + var countUIText = countText.GetComponent(); + if (itemId > 0) + { + switch (localLogic) + { + case ELogisticStorage.Supply: + iconLocalImage.sprite = _rightsprite; + iconLocalImage.color = BlueColor; + countUIText.color = BlueColor; + break; + case ELogisticStorage.Demand: + iconLocalImage.sprite = _leftsprite; + iconLocalImage.color = OrangeColor; + countUIText.color = OrangeColor; + break; + case ELogisticStorage.None: + iconLocalImage.sprite = _flatsprite; + iconLocalImage.color = Color.gray; + countUIText.color = Color.gray; + break; + } + + if (isStellarorCollector) + { + switch (remoteLogic) + { + case ELogisticStorage.Supply: + iconRemoteImage.sprite = _rightsprite; + iconRemoteImage.color = BlueColor; + break; + case ELogisticStorage.Demand: + iconRemoteImage.sprite = _leftsprite; + iconRemoteImage.color = OrangeColor; + break; + case ELogisticStorage.None: + iconRemoteImage.sprite = _flatsprite; + iconRemoteImage.color = Color.gray; + break; + } + + iconRemote.gameObject.SetActive(true); + } + + iconLocal.gameObject.SetActive(true); + countText.GetComponent().anchoredPosition3D = new Vector3(70, iconPos.y, 0); + if (isStellarorCollector) + { + iconLocal.GetComponent().sizeDelta = new Vector2(20, 20); + iconRemote.GetComponent().sizeDelta = new Vector2(20, 20); + iconLocal.GetComponent().anchoredPosition3D = new Vector3(105, iconPos.y, 0); + iconRemote.GetComponent().anchoredPosition3D = new Vector3(105, iconPos.y - 15, 0); + } + else + { + iconRemote.gameObject.SetActive(false); + iconLocal.GetComponent().anchoredPosition3D = new Vector3(100, iconPos.y, 0); + iconLocal.GetComponent().sizeDelta = new Vector2(30, 30); + } + + icon.GetComponent().sprite = LDB.items.Select(itemId)?.iconSprite; + icon.gameObject.SetActive(true); + countUIText.text = itemCount.ToString("#,##0"); + } + else + { + iconLocal.gameObject.SetActive(false); + iconRemote.gameObject.SetActive(false); + icon.gameObject.SetActive(false); + countUIText.color = Color.white; + countUIText.text = "无"; + var anchoredX = showStationInfoMode ? isStellarorCollector ? 70 : 90 : 70; + + countUIText.GetComponent().anchoredPosition3D = new Vector3(anchoredX, iconPos.y, 0); + } + + countText.gameObject.SetActive(true); + } + + public void SetDroneShipWarp(int index, int itemId, int totalCount, int currentCount, int lastLine) + { + if (itemId == 0) + { + _iconTexts[index].gameObject.SetActive(false); + return; + } + + if (index < 2) + { + _countText2[index].color = Color.white; + _countText2[index].text = currentCount.ToString(); + } + + _iconTexts[index].gameObject.GetComponent().anchoredPosition3D = new Vector3(index * 30, -30 - 30 * lastLine, 0); + _iconTexts[index].GetComponent().sprite = LDB.items.Select(itemId).iconSprite; + _countText[index].color = Color.white; + _countText[index].text = totalCount.ToString(); + _iconTexts[index].gameObject.SetActive(true); + } + } + + public static void StationInfoWindowUpdate() + { + var pd = GameMain.localPlanet; + var transport = pd?.factory?.transport; + if (transport == null || transport.stationCursor == 0 || (UIGame.viewMode != EViewMode.Normal && UIGame.viewMode != EViewMode.Globe)) + { + if (_stationTipRoot.activeSelf) + { + _stationTipRoot.SetActive(false); + } + + return; + } + + _stationTipRoot.SetActive(true); + var tipIndex = 0; + var localPosition = GameCamera.main.transform.localPosition; + var forward = GameCamera.main.transform.forward; + var realRadius = pd.realRadius; + + foreach (var stationComponent in transport.stationPool) + { + if (stationComponent?.storage == null) continue; + if (tipIndex == _maxCount) + { + _maxCount++; + var temptip = UnityEngine.Object.Instantiate(_tipPrefab, _stationTipRoot.transform); + var tempstationtip = temptip.AddComponent(); + tempstationtip.InitStationTip(); + Array.Resize(ref _stationtips, _maxCount); + _stationtips[_maxCount - 1] = tempstationtip; + } + + var isStellarorCollector = stationComponent.isStellar || stationComponent.isCollector; + var position = pd.factory.entityPool[stationComponent.entityId].pos.normalized; + var storageNum = Math.Min(stationComponent.storage.Length, 5); + float tipWindowHeight = 40 * storageNum + 20; + if (stationComponent.isCollector) + { + storageNum = 2; + position *= realRadius + 35; + tipWindowHeight -= 20; + } + else if (stationComponent.isStellar) + { + position *= realRadius + 20; + } + else if (stationComponent.isVeinCollector) + tipWindowHeight -= 20; + else + { + position *= realRadius + 15; + } + + var stationtip = _stationtips[tipIndex]; + var vec = position - localPosition; + var magnitude = vec.magnitude; + if (magnitude < 1.0 || Vector3.Dot(forward, vec) < 1.0) + continue; + if (!UIRoot.ScreenPointIntoRect(GameCamera.main.WorldToScreenPoint(position), _stationTipRoot.GetComponent(), out var rectPoint)) + continue; + if (rectPoint.x is < -4096f or > 4096f || rectPoint.y is < -4096f or > 4096f) + continue; + if (Phys.RayCastSphere(localPosition, vec / magnitude, magnitude, Vector3.zero, realRadius, out _)) + continue; + if (stationComponent.storage.Select(x => x.itemId).All(x => x == 0)) + continue; + tipIndex++; + stationtip.gameObject.SetActive(true); + rectPoint.x = Mathf.Round(rectPoint.x); + rectPoint.y = Mathf.Round(rectPoint.y); + stationtip.rectTransform.anchoredPosition = rectPoint; + for (var i = 0; i < storageNum; ++i) + { + var storage = stationComponent.storage[i]; + stationtip.SetItem(storage.itemId, storage.count, i, storage.localLogic, storage.remoteLogic, /*ShowStationInfoMode.Value*/isStellarorCollector); + } + + var lastLine = storageNum; + var stationComponentName = pd.factory.ReadExtraInfoOnEntity(stationComponent.entityId); + stationtip.SetStationName(stationComponentName, lastLine); + if (!string.IsNullOrEmpty(stationComponentName)) + { + tipWindowHeight += 27; + lastLine++; + } + + for (var i = 0; i < 3; ++i) + { + if (stationComponent.isCollector || stationComponent.isVeinCollector || (i >= 1 && !stationComponent.isStellar)) + { + stationtip.SetDroneShipWarp(i, 0, 0, 0, lastLine); + continue; + } + + int itemId; + int totalCount; + var currentCount = 0; + if (i == 0) + { + itemId = 5001; + totalCount = stationComponent.idleDroneCount + stationComponent.workDroneCount; + currentCount = stationComponent.idleDroneCount; + } + else if (i == 1) + { + itemId = 5002; + totalCount = stationComponent.idleShipCount + stationComponent.workShipCount; + currentCount = stationComponent.idleShipCount; + } + else + { + itemId = 1210; + totalCount = stationComponent.warperCount; + } + + stationtip.SetDroneShipWarp(i, itemId, totalCount, currentCount, lastLine); + } + + float localScaleMultiple; + if (magnitude < 50.0) + localScaleMultiple = 1.5f; + else if (magnitude < 250.0) + localScaleMultiple = (float)(1.75 - magnitude * 0.005); + else + localScaleMultiple = 0.5f; + stationtip.transform.localScale = Vector3.one * localScaleMultiple; + stationtip.rectTransform.sizeDelta = new Vector2(125f, tipWindowHeight); + } + + for (var i = tipIndex; i < _maxCount; ++i) + _stationtips[i].gameObject.SetActive(false); + } + } } \ No newline at end of file diff --git a/UXAssist/UXAssist.cs b/UXAssist/UXAssist.cs index dd04a0c..b6119a1 100644 --- a/UXAssist/UXAssist.cs +++ b/UXAssist/UXAssist.cs @@ -161,12 +161,18 @@ public class UXAssist : BaseUnityPlugin, IModCanSave I18N.OnInitialized += RecreateConfigWindow; } + private void Start() + { + LogisticsPatch.Start(); + } + private void OnDestroy() { DysonSpherePatch.Uninit(); TechPatch.Uninit(); PlayerPatch.Uninit(); PlanetPatch.Uninit(); + LogisticsPatch.Uninit(); FactoryPatch.Uninit(); GamePatch.Uninit(); MyWindowManager.Uninit(); @@ -191,6 +197,7 @@ public class UXAssist : BaseUnityPlugin, IModCanSave } FactoryPatch.OnUpdate(); PlayerPatch.OnUpdate(); + LogisticsPatch.OnUpdate(); } private void LateUpdate() diff --git a/UXAssist/UXAssist.csproj b/UXAssist/UXAssist.csproj index bb03dea..1c456d1 100644 --- a/UXAssist/UXAssist.csproj +++ b/UXAssist/UXAssist.csproj @@ -27,6 +27,9 @@ + + + diff --git a/UXAssist/assets/icon/in.png b/UXAssist/assets/icon/in.png new file mode 100644 index 0000000000000000000000000000000000000000..01ff5a1801a4fa6357a4421e0b139aa6a7cb0277 GIT binary patch literal 2193 zcmeHH=UbD99(}VQL>yR#fJzKj0T~vA3y2sr5F#r<5K%CU7OWsdmMnP#6evhV92L0; zXv&sZwvoJmkg&>lgb0p=f~-qr$p{(mrGG&Gf_u-GbDrPtd^*p0PCC_@yc?&10{~z* z#h&B}0Eiul0I;YX3VM0jZHLf-HcmDGP@A<&;*0tF8}3Rz2UPuWaDGRxQXSoF$qYyM z|M*`@pta4gdZ!9S5w6Y`feykuC1`(~dx7?IzGA!Nn*$4M@tBmVZa@CVT;;sqk(J2{ zEV67Me53i99Y)3NmseJKFCt%;wd|(hui3`ys5Rn>C>Gg;oyJ7V&(}>7O3Bp8w9XTJTd_&YjcV z2aA!M9>*|En_0D#G)kZjzdC;ob-;Gs-bwsU~8 z6`uB=G%@bnQ^(>NVw3LIq!V}q?2S`2R(ErE>3DzJlDLfzJN6GhO!oG6j5H~m-)s}3 zw)5hiKQC{sxPsjY;U8dDXs|I5=U=wbA|Lelm>6PA1SQj6yl)%xPJ!o0!5se3Z<3CCpxtem{JtmE&MAtch%B6)c`f zt4^RKh)Ui%fkjWaxa;RC3)nSp&e0=G^`y5K_d8-wNc)1Cw@ND9WL&%Et-CIdIdDv{ zq|0+OgRZLu=PZa^WEY364Qh5}Ip+!?RzrOk$CS6S;Ya1q&(ijWUaA>x|fF zGMCIcGjNQd7S&4|<|RNz86)W-$KC?vR)-tNm3!1UA7n&HEK{M8#h@;Vrb(h0FO3*0XT0}?#zR2owJI#qxf>sF6 z>;}cV6lahcu!MZTF%7k}WI|k)N-=oh(g^?qo<-PiiLt~^K^#Dk<)f%8n;Oha4i|`! zyvE?Cmvn(|K_i5{C=N^P6IcP?fm6U+i4*Gn+P@Tug93fP24n#m@G1u_1vEhQkWarF zj|ZiB7;-7Xu(OP7c_|btGWh85}Zq*LHtGw97b|8?7DZsGP-Fg~HuEHFNBnZal7*hn6-)Vhh^ zrwi2+pbMEa=1>uQt2)-%wQS-=!(AHlPI&|SkZC;fx2awOymma!QBSR26d!xFzqH`T zWzkkE!vcS7qV~;Ei2c6vly1~SXvdsYgQ1GD#e@- xp-2|%eMnb>;r0=?xJi^;fF1fDwsGg&xTP5?M@y+MD)0W=M6q=yRh{!m`Y(&+6FUF^ literal 0 HcmV?d00001 diff --git a/UXAssist/assets/icon/keep.png b/UXAssist/assets/icon/keep.png new file mode 100644 index 0000000000000000000000000000000000000000..e020c414e0495e700b1c7cfbb185e6370bfd1200 GIT binary patch literal 925 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fo{p?&#~tz_78O`%fY(NVYi0 z-HBn{IhmJ0PDOxEh^u>n&;Nk{&5Cx*fo@PQ3GxeOVEX>&jS%;$P+`&2kLn(AH5^l7WF~f~SjPNX4zUcTP@Pcq|J%O_U3mN53zd0-&+8bTSSxyN`uNasl8PrX+NF6rZ&vDpS!c~==lu!|z4BQx z;`6Q*VUv62e}Ao*@!HPc{{Kf4mUksSw*UVbw7lEkZ}Y#BC%);ctgyuc%l5U;mytVeTuNfV+260=Ky?xK&iRd54yuL*d?|>t-LdntguP-O^Im zMW5?y=l&OZ|M^Lg=!(lV;yK4Z|6kPoqw!j=|G}EsPuOM$?wI4sGGppvCUeic3q9BK zlj|05f6O#n<$CzaNu^W~rT#J3~zs)n;{Qr~98n=}Ka(C{CjG4-juvPBeqOV$4->=!v z-(YvMdD{GUiT{G<<*l}qdvw0uV%eRX@6TU+p8q{F-u(B2{f&q1zH)z;sFJsky)19} z$?nbVg1gTr&)F3g8hCy&ul@S&EYrIujbTZqdID-~z^!v=O+4~bl}#gk1vK^Hr}bJv4T}sU zrG@GKkAKqy?sYf`^s8`#LnB83otu6$6R*pP;@e#vHkN42aeub246Rbv2aohgZ%%(} zJ3k(Jjil{m|J7Czgv3Uky}!G>`o{yd549V+<2Sf(E=dOfWNrvCAoA$znTia0Bneko zIPtXL%NWMUjT2mp0Dmt;Ua)!K`AvpNZWrrZhHyI{BxhDTTz)&1^}(J*G5sh%GHdNU zoAqJUhdEX`6+cUG&6q9HpUgkuP(aN4@&CO$_1Ez&?LJl|cGl5vq>h3Vrx#aLnK}FN zaujEu?(s5FPL&VqoNxo{rTDZMQ4>8?lISF(EXr;QKQ`vZ5k5+okWgBunT9dB_WH$#JrJOiwq!s#T|PQWPmW5qS*g`_XqKAUN?pqiokwchXJZ*mt=eu_ z11(NLQx^_sXD_G}0m2@lGFE>6qujBRo9;xVdl#y-H;toOa1iz86Y;9FC zA?P6FYS~??hTAn*5zSL;Hn6}q_0*>Ha^P|^i?Nfo;sP6Ju=G!B^F_q|)}1v5b)}2o zNn8-Pmj{y{B+v8xoE*fGSFO#zPJMxN4$D9D#c~5Ng&P_UzK(!%5_P}qMBim?pDSa1 zcHLlC@zNWXdfPz8np{dB;uB z=VpL2+n=Ere02Mr6LfH8U_4R5z&2ZRqru}qJBo^ki{jb?wJ_ zbMUw1hJc;GZWPrZE}ZKI6vA3SoP~|4Ka=YP`~)h1S4b%wV;P6x-T?}M>qrKI3YGpB zJNNmRYN=*sq}rjb9(B~Dzu!-As+$F-g0b0A=Da~zC9FKRDrDNkY>l-4k-Wyl*{sI2 z$|@Kx-=Z8I-U^r3SFNRb6LB`ZJ%j1>cE--#VkX@VV1e02p;`~s_UT=5`MEZ3WN(WO zo9wNPWD!LMm1Yu%yEpb3IWsWHKU~UqIr^N(kWfZq)_LDL)6IWUozznNluzRRzA-`j zC5)y48C4d*8is3ZDCx?+(DBm%w^WpoYrJ_lpNU*K$CD zYARSI%-*cy9`OULplTpnlMHiKY%vl);co&QA^jjVMzMTR_tVi#?(>zOmSfh=S-L{L zSL!g!w?~3%Pj>Trf`H@2(V$kjGI|j2POlw_h3cB_-D3qG_Sb;uiF3bU zpzhP-WfdeL4@NW=oWNhS@YjULJbpOD
?k}~a)WiANDSwj@2En#cF?X(>=*$~6R zT8P_d4{isMxe3oAs}4t!k2$=fwU%GIJJ`4!pI`oPI7%S&Z#xhj%+2Re4$-snii`$y zNw!~$I8kEx(M^@(UA^q@x=NNJ^3P4H)B3yE!coP-Hd*SHg$gvrVPVOAwkxB;(OI5) zF7Nb09~L*S3{qBrQz-lrJ?@bZxSGraecQ(OACtN;kp+LOFja*D*gn&r4XQnTVfzms zCgK$H`;HFu2F#~Fe|OCFXENF;3vXVKdf&?h754Z6LdAaZhj2XfOd-JX^TY3Wn}U|C zHVH6tlgEVRjLIWWvHkKB^$m_z`5~e40`mJz^#;ewe6>l4Twb(}7?Ut6c}dKYm>VRL gu>bT70U%NXcZm(p&+9n!=2KHhAeq?oRowBv0YXFa4gdfE literal 0 HcmV?d00001