Aetheria/Assets/Scripts/UI/Menu/InventoryMenu.cs

740 lines
27 KiB
C#
Raw Normal View History

2026-06-21 09:37:54 +01:00
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
2026-06-21 09:37:54 +01:00
using GameCult.Aetheria.EveRuntime;
2026-06-21 09:54:15 +01:00
using GameCult.Aetheria.State.Verse;
using GameCult.Eve.Surface;
2026-06-30 19:14:49 +01:00
using GameCult.Mesh;
using UnityEngine;
using UniRx;
using UniRx.Triggers;
using Unity.Mathematics;
using UnityEngine.UIElements;
public class InventoryMenu : MonoBehaviour
{
public InventoryPanel[] InventoryPanels;
public ConfirmationDialog Dialog;
// public ClickCatcher Background;
private EquippedItem _selectedEquippedItem;
2026-06-25 18:09:33 +01:00
private AetheriaRuntimeCurrentEntityDocument _shipSettingsCurrentEntity;
private UIDocument _shipSettingsSurfaceDocument;
private UIDocument _cargoItemDetailsSurfaceDocument;
private UIDocument _equippedItemDetailsSurfaceDocument;
2026-06-25 18:09:33 +01:00
private AetheriaUnityActionBarPresentation _actionBarPresentation;
2026-06-30 19:14:49 +01:00
private AetheriaUnityPresentationEntityIndex _presentationEntityIndex;
private AetheriaClientState _runtimeState;
2026-06-21 09:37:54 +01:00
private readonly AetheriaEveUnitySurfaceChrome _shipSettingsSurfaceChrome = PanelChrome(360f, 420f);
private readonly AetheriaEveUnitySurfaceChrome _cargoItemDetailsSurfaceChrome = PanelChrome(420f, 520f);
private readonly AetheriaEveUnitySurfaceChrome _equippedItemDetailsSurfaceChrome = PanelChrome(460f, 560f);
// private List<IDisposable> _backgroundSubscriptions;
// private ItemInstance _dragItem;
// private Transform[] _dragCells;
// private Vector2[] _dragOffsets;
2026-06-25 18:09:33 +01:00
public void SetDragSession(AetheriaUnityDragSession dragSession)
{
if (InventoryPanels == null)
return;
foreach (var panel in InventoryPanels)
panel?.SetDragSession(dragSession);
}
public void SetActionBarPresentation(AetheriaUnityActionBarPresentation actionBarPresentation)
{
_actionBarPresentation = actionBarPresentation;
}
2026-06-30 19:14:49 +01:00
public void SetPresentationEntityIndex(AetheriaUnityPresentationEntityIndex presentationEntityIndex)
2026-06-25 18:09:33 +01:00
{
2026-06-30 19:14:49 +01:00
_presentationEntityIndex = presentationEntityIndex;
2026-06-25 18:09:33 +01:00
}
2026-06-30 19:14:49 +01:00
private AetheriaClientState RuntimeState => _runtimeState ??= AetheriaUnityRuntimeClientProvider.RuntimeState("unity-inventory-menu");
// private int2 _dragCellOffset;
// private ItemRotation _originalRotation;
// //private Shape _previousFakeOccupancy;
// private Shape _originalOccupancy;
// private EquippedItem _originalEquippedItem;
// private InventoryPanel _originalPanel;
//
// private InventoryPanel _dragTargetPanel;
// private int2 _dragTargetPosition;
// private int2 _lastDragPosition;
// private bool _dragTargetValid;
// private bool _destroyItem;
private void OnEnable()
{
// Background.gameObject.SetActive(true);
// Background.OnEnter.Subscribe(enter =>
// {
// _destroyItem = true;
// });
// BackgroundExited.OnPointerExitAsObservable().Subscribe(enter =>
// {
// _destroyItem = false;
// });
var hasCurrentEntity = TryResolveCurrentEntity(out var currentEntity);
var cargo = TryResolveCurrentDockingBay(out var dockingBay)
? dockingBay
: currentEntity?.CargoBays.FirstOrDefault();
if (cargo!=null)
InventoryPanels[0].Display(cargo);
else InventoryPanels[0].Clear();
if(hasCurrentEntity)
InventoryPanels[1].Display(currentEntity);
else InventoryPanels[1].Clear();
}
private void OnDisable()
{
HideCurrentShipSettingsSurface();
HideCargoItemDetailsSurface();
HideEquippedItemDetailsSurface();
// Background.gameObject.SetActive(false);
}
void Start()
{
foreach (var panel in InventoryPanels)
{
panel.OnBackgroundClick.Subscribe(data =>
{
2026-06-29 09:21:29 +01:00
if (!TryReadCurrentEntity(out var currentEntity)) return;
RenderCurrentShipSettingsSurface(currentEntity);
});
}
}
2026-06-25 18:09:33 +01:00
private void RenderCurrentShipSettingsSurface(AetheriaRuntimeCurrentEntityDocument currentEntity)
{
2026-06-25 18:09:33 +01:00
if (currentEntity == null || string.IsNullOrWhiteSpace(currentEntity.EntityKey))
return;
HideCargoItemDetailsSurface();
HideEquippedItemDetailsSurface();
ClearSelectedItemSelection();
2026-06-25 18:09:33 +01:00
_shipSettingsCurrentEntity = currentEntity;
2026-06-21 09:37:54 +01:00
_shipSettingsSurfaceDocument = AetheriaEveUnitySurfaceHost.RenderRuntime(
transform,
_shipSettingsSurfaceDocument,
"Aetheria Inventory Ship Settings Surface",
2026-06-29 05:33:45 +01:00
AetheriaRuntimeShipSettingsSurfaceBuilder.Build(
currentEntity?.Entity?.DisplayName ?? "",
(float)(currentEntity?.ShutdownPerformance ?? 0),
FormatValue),
2026-06-21 09:37:54 +01:00
HandleCurrentShipSettingsSurfaceCommand,
_shipSettingsSurfaceChrome);
}
private void HandleCurrentShipSettingsSurfaceCommand(EveSurfaceCommandRequest request)
{
2026-06-25 18:09:33 +01:00
var currentEntity = _shipSettingsCurrentEntity;
if (currentEntity == null ||
string.IsNullOrWhiteSpace(currentEntity.EntityKey) ||
2026-06-29 09:21:29 +01:00
!TryReadCurrentEntity(out var latestCurrentEntity) ||
2026-06-25 18:09:33 +01:00
!string.Equals(latestCurrentEntity.EntityKey, currentEntity.EntityKey, StringComparison.Ordinal))
{
HideCurrentShipSettingsSurface();
return;
}
2026-06-25 18:09:33 +01:00
_shipSettingsCurrentEntity = latestCurrentEntity;
2026-06-21 09:37:54 +01:00
if (!AetheriaRuntimeShipSettingsSurfaceCommands.TryRead(request, out var command))
{
2026-06-21 09:37:54 +01:00
Debug.LogWarning($"Unknown inventory ship settings command: {request?.Command}");
return;
}
switch (command.Kind)
{
case AetheriaRuntimeShipSettingsCommandKind.DecrementShutdownThreshold:
case AetheriaRuntimeShipSettingsCommandKind.IncrementShutdownThreshold:
case AetheriaRuntimeShipSettingsCommandKind.ResetShutdownThreshold:
2026-06-25 18:09:33 +01:00
RequestEntityShutdownPerformance(
latestCurrentEntity.EntityKey,
AetheriaRuntimeShipSettingsSurfaceCommands.ResolveShutdownPerformance(
command.Kind,
2026-06-25 18:09:33 +01:00
(float)latestCurrentEntity.ShutdownPerformance,
ResolveDefaultShutdownPerformance()));
return;
2026-06-21 09:37:54 +01:00
case AetheriaRuntimeShipSettingsCommandKind.Close:
HideCurrentShipSettingsSurface();
return;
default:
2026-06-21 09:37:54 +01:00
Debug.LogWarning($"Unknown inventory ship settings command: {request?.Command}");
return;
}
}
private void HideCurrentShipSettingsSurface()
{
2026-06-25 18:09:33 +01:00
_shipSettingsCurrentEntity = null;
if (_shipSettingsSurfaceDocument == null)
return;
2026-06-21 09:37:54 +01:00
AetheriaEveUnitySurfaceHost.Hide(_shipSettingsSurfaceDocument);
}
private void RenderCargoItemDetailsSurface(ItemInstance item)
{
var typedItem = FindTypedInventoryItem(item);
if (item == null || typedItem == null)
return;
HideEquippedItemDetailsSurface();
2026-06-21 09:37:54 +01:00
_cargoItemDetailsSurfaceDocument = AetheriaEveUnitySurfaceHost.RenderRuntime(
transform,
_cargoItemDetailsSurfaceDocument,
"Aetheria Inventory Cargo Item Details Surface",
2026-06-29 05:35:20 +01:00
AetheriaRuntimeCargoItemDetailsSurfaceBuilder.Build(
typedItem,
ComposeCargoItemObservation(item),
ResolveManufacturerName(typedItem),
item is EquippableItem equippableItem ? FormatItemTier(typedItem, equippableItem) : "",
FormatValue,
FormatTemperature),
2026-06-21 09:37:54 +01:00
HandleCargoItemDetailsSurfaceCommand,
_cargoItemDetailsSurfaceChrome,
sortingOrder: 1001);
}
private void HandleCargoItemDetailsSurfaceCommand(EveSurfaceCommandRequest request)
{
2026-06-21 09:37:54 +01:00
if (!AetheriaRuntimeCargoItemDetailsSurfaceCommands.TryRead(request, out var command))
{
Debug.LogWarning($"Unknown inventory cargo item details command: {request?.Command}");
return;
}
if (command.Kind == AetheriaRuntimeCargoItemDetailsCommandKind.Close)
{
HideCargoItemDetailsSurface();
ClearSelectedItemSelection();
return;
}
2026-06-21 09:37:54 +01:00
Debug.LogWarning($"Unknown inventory cargo item details command: {request?.Command}");
}
private void HideCargoItemDetailsSurface()
{
if (_cargoItemDetailsSurfaceDocument == null)
return;
2026-06-21 09:37:54 +01:00
AetheriaEveUnitySurfaceHost.Hide(_cargoItemDetailsSurfaceDocument);
}
private void RenderEquippedItemDetailsSurface(EquippedItem item)
{
var typedItem = FindTypedInventoryItem(item?.EquippableItem);
if (item?.EquippableItem == null || typedItem == null)
return;
2026-06-21 09:37:54 +01:00
_equippedItemDetailsSurfaceDocument = AetheriaEveUnitySurfaceHost.RenderRuntime(
transform,
_equippedItemDetailsSurfaceDocument,
"Aetheria Inventory Equipped Item Details Surface",
2026-06-29 05:38:44 +01:00
AetheriaRuntimeEquippedItemDetailsSurfaceBuilder.Build(
typedItem,
ComposeEquippedItemObservation(item),
BuildEquippedItemTitle(item, typedItem),
ResolveManufacturerName(typedItem),
FormatValue,
FormatTemperature,
ComposeEquippedItemTemperatureControls(item).ToArray(),
item.GetBehavior<Weapon>() != null
? ComposeEquippedItemWeaponGroupControls(item).ToArray()
: Array.Empty<AetheriaRuntimeEquippedItemControl>()),
2026-06-21 09:37:54 +01:00
HandleEquippedItemDetailsSurfaceCommand,
_equippedItemDetailsSurfaceChrome,
sortingOrder: 1002);
}
private void HandleEquippedItemDetailsSurfaceCommand(EveSurfaceCommandRequest request)
{
var item = _selectedEquippedItem;
if (item?.EquippableItem == null)
{
HideEquippedItemDetailsSurface();
ClearSelectedItemSelection();
return;
}
2026-06-21 09:37:54 +01:00
if (!AetheriaRuntimeEquippedItemDetailsSurfaceCommands.TryRead(request, out var command))
{
2026-06-21 09:37:54 +01:00
Debug.LogWarning($"Unknown inventory equipped item details command: {request?.Command}");
return;
}
switch (command.Kind)
{
case AetheriaRuntimeEquippedItemDetailsCommandKind.Close:
HideEquippedItemDetailsSurface();
ClearSelectedItemSelection();
return;
2026-06-21 09:37:54 +01:00
case AetheriaRuntimeEquippedItemDetailsCommandKind.ToggleOverrideShutdown:
2026-06-25 18:09:33 +01:00
RequestEquippedItemOverrideShutdown(item, !item.EquippableItem.OverrideShutdown);
return;
2026-06-21 09:37:54 +01:00
case AetheriaRuntimeEquippedItemDetailsCommandKind.SetTargetTemperature:
if (command.BehaviorIndex >= 0 &&
command.BehaviorIndex < (item.Behaviors?.Length ?? 0) &&
item.Behaviors[command.BehaviorIndex] is Thermotoggle thermotoggle &&
2026-06-25 18:09:33 +01:00
thermotoggle.Adjustable)
{
2026-06-25 18:09:33 +01:00
RequestThermotoggleTargetTemperature(item, command.BehaviorIndex, command.TargetTemperature);
return;
}
Debug.LogWarning("Unable to apply equipped-item target temperature command.");
RenderEquippedItemDetailsSurface(item);
return;
2026-06-21 09:37:54 +01:00
case AetheriaRuntimeEquippedItemDetailsCommandKind.ToggleWeaponGroup:
if (command.GroupIndex >= 0)
{
2026-06-21 09:37:54 +01:00
var assigned = !IsWeaponGroupAssigned(item, command.GroupIndex);
2026-06-25 18:09:33 +01:00
RequestWeaponGroupMembership(item, command.GroupIndex, assigned);
2026-06-21 13:33:24 +01:00
return;
}
2026-06-21 13:33:24 +01:00
Debug.LogWarning("Unable to submit equipped-item weapon group membership request.");
return;
default:
2026-06-21 09:37:54 +01:00
Debug.LogWarning($"Unknown inventory equipped item details command: {request?.Command}");
return;
}
}
private void HideEquippedItemDetailsSurface()
{
if (_equippedItemDetailsSurfaceDocument == null)
return;
2026-06-21 09:37:54 +01:00
AetheriaEveUnitySurfaceHost.Hide(_equippedItemDetailsSurfaceDocument);
}
2026-06-21 09:37:54 +01:00
private static AetheriaEveUnitySurfaceChrome PanelChrome(float width, float maxWidth)
{
2026-06-21 09:37:54 +01:00
return new AetheriaEveUnitySurfaceChrome
{
2026-06-21 09:37:54 +01:00
RootAlignItems = Align.FlexStart,
RootJustifyContent = Justify.FlexStart,
RootPaddingTop = 0f,
Width = width,
MinWidth = 0f,
MaxWidth = maxWidth,
PaddingLeft = 18f,
PaddingRight = 18f,
PaddingTop = 18f,
PaddingBottom = 18f
};
2026-06-21 09:37:54 +01:00
}
private static AetheriaRuntimeEquippedItemObservation ComposeEquippedItemObservation(EquippedItem item)
{
var equippableItem = item?.EquippableItem;
return new AetheriaRuntimeEquippedItemObservation(
equippableItem?.ItemKey ?? "",
equippableItem?.Quality ?? 1,
equippableItem?.Durability ?? 1,
item?.Temperature ?? 0,
equippableItem != null && equippableItem.OverrideShutdown);
}
private IEnumerable<AetheriaRuntimeEquippedItemTemperatureControl> ComposeEquippedItemTemperatureControls(
2026-06-21 09:37:54 +01:00
EquippedItem item)
{
for (var i = 0; i < (item.Behaviors?.Length ?? 0); i++)
{
if (item.Behaviors[i] is not Thermotoggle thermotoggle || !thermotoggle.Adjustable)
continue;
2026-06-21 09:37:54 +01:00
yield return new AetheriaRuntimeEquippedItemTemperatureControl(
$"{AetheriaRuntimeEquippedItemDetailsSurfaceBuilder.SurfaceId}.controls.thermotoggle.{i}.input",
$"Target Temperature {i + 1}",
thermotoggle.TargetTemperature.ToString(CultureInfo.InvariantCulture),
2026-06-21 09:37:54 +01:00
AetheriaRuntimeEquippedItemDetailsSurfaceBuilder.Payload(
("behaviorIndex", i.ToString(CultureInfo.InvariantCulture))));
}
}
private IEnumerable<AetheriaRuntimeEquippedItemControl> ComposeEquippedItemWeaponGroupControls(
2026-06-21 09:37:54 +01:00
EquippedItem item)
{
2026-06-21 09:37:54 +01:00
return Enumerable.Range(0, item.Entity?.WeaponGroups?.Length ?? 0)
.Select(groupIndex => new AetheriaRuntimeEquippedItemControl(
$"{AetheriaRuntimeEquippedItemDetailsSurfaceBuilder.SurfaceId}.weapon_groups.{groupIndex}",
IsWeaponGroupAssigned(item, groupIndex) ? $"G{groupIndex + 1} On" : $"G{groupIndex + 1} Off",
2026-06-21 09:37:54 +01:00
AetheriaRuntimeEquippedItemDetailsSurfaceBuilder.ToggleWeaponGroup,
AetheriaRuntimeEquippedItemDetailsSurfaceBuilder.Payload(
("group", groupIndex.ToString(CultureInfo.InvariantCulture)))));
}
private static AetheriaRuntimeCargoItemObservation ComposeCargoItemObservation(ItemInstance item)
{
var equippableItem = item as EquippableItem;
return new AetheriaRuntimeCargoItemObservation(
item?.ItemKey ?? "",
item is SimpleCommodity simpleCommodity ? simpleCommodity.Quantity : 0,
equippableItem != null,
equippableItem?.Quality ?? 1,
equippableItem?.Durability ?? 1,
2026-06-25 18:09:33 +01:00
0,
equippableItem != null && equippableItem.OverrideShutdown);
}
private string BuildEquippedItemTitle(EquippedItem item, AetheriaRuntimeCatalogItem typedItem)
{
return $"{typedItem?.Name ?? "Unknown Item"} ({FormatItemTier(typedItem, item.EquippableItem)})";
}
private string FormatItemTier(AetheriaRuntimeCatalogItem typedItem, EquippableItem item)
{
2026-06-29 04:50:04 +01:00
var tradeValue = AetheriaRuntimeDaemonTradeItemQueries.TradeItemValue(
typedItem,
ToRuntimeLoadoutItem(item),
2026-06-29 09:21:29 +01:00
CatalogSnapshot()?.TradeValueSettings);
2026-06-29 04:50:04 +01:00
return tradeValue.HasTier
? $"{tradeValue.TierName}{new string('+', tradeValue.Upgrades)}"
: "";
}
2026-06-21 19:59:30 +01:00
private static AetheriaRuntimeLoadoutItemCommit ToRuntimeLoadoutItem(EquippableItem item)
{
return AetheriaRuntimeDaemonItemStatQueries.ItemCommit(
item?.ItemKey ?? "",
item?.Quality ?? 1,
item?.Durability ?? 1,
enabled: true,
overrideShutdown: item != null && item.OverrideShutdown);
}
private static bool IsWeaponGroupAssigned(EquippedItem item, int groupIndex)
{
return item?.Entity?.WeaponGroups != null &&
groupIndex >= 0 &&
groupIndex < item.Entity.WeaponGroups.Length &&
item.Entity.WeaponGroups[groupIndex].items.Contains(item);
}
private void ClearSelectedItemSelection()
{
_selectedEquippedItem = null;
2026-06-25 18:09:33 +01:00
}
private void RequestEntityShutdownPerformance(string targetEntityKey, float shutdownPerformance)
{
if (string.IsNullOrWhiteSpace(targetEntityKey))
return;
TrySubmitOperation(
operations => operations.SetShutdownPerformance(targetEntityKey, shutdownPerformance),
"entity shutdown-performance");
}
private void RequestEquippedItemOverrideShutdown(EquippedItem item, bool enabled)
{
if (!TryResolveEquippedItem(item, out var targetEntityKey, out var equipmentIndex) ||
item?.EquippableItem == null)
{
return;
}
TrySubmitOperation(
operations => operations.SetItemOverrideShutdown(targetEntityKey, equipmentIndex, enabled),
"equipped-item override-shutdown");
}
private void RequestThermotoggleTargetTemperature(
EquippedItem item,
int behaviorIndex,
float targetTemperature)
{
if (!TryResolveEquippedItem(item, out var targetEntityKey, out var equipmentIndex) ||
behaviorIndex < 0 ||
behaviorIndex >= (item?.Behaviors?.Length ?? 0))
{
return;
}
TrySubmitOperation(
operations => operations.SetThermotoggleTargetTemperature(
targetEntityKey,
equipmentIndex,
behaviorIndex,
targetTemperature),
"thermotoggle target-temperature");
}
private void RequestWeaponGroupMembership(EquippedItem item, int groupIndex, bool assigned)
{
if (!TryResolveEquippedItem(item, out var targetEntityKey, out var equipmentIndex) ||
groupIndex < 0)
{
return;
}
TrySubmitOperation(
operations => operations.SetWeaponGroupMembership(
targetEntityKey,
equipmentIndex,
groupIndex,
assigned),
"weapon-group membership");
}
2026-06-30 19:14:49 +01:00
private bool TryGetRecordKeyForPresentationEntity(Entity entity, out string recordKey)
2026-06-25 18:09:33 +01:00
{
recordKey = "";
2026-06-30 19:14:49 +01:00
return _presentationEntityIndex != null &&
_presentationEntityIndex.TryGetRecordKeyForPresentationEntity(entity, out recordKey);
2026-06-25 18:09:33 +01:00
}
private bool IsCurrentEntity(Entity entity)
{
if (entity == null ||
2026-06-30 19:14:49 +01:00
!TryGetRecordKeyForPresentationEntity(entity, out var entityKey) ||
2026-06-25 18:09:33 +01:00
string.IsNullOrWhiteSpace(entityKey) ||
!TryResolveCurrentEntityKey(out var currentEntityKey))
{
return false;
}
return string.Equals(entityKey, currentEntityKey, StringComparison.Ordinal);
}
private bool TryResolveCurrentDockingBayRow(out AetheriaRuntimeStationDockingBayRow dockingBay)
{
dockingBay = null;
2026-06-29 09:21:29 +01:00
var refit = StationRefitSnapshot();
2026-06-28 15:12:19 +01:00
if (refit?.IsDocked != true || refit.DockingBayIndex < 0)
return false;
dockingBay = (refit.DockingBays ?? Array.Empty<AetheriaRuntimeStationDockingBayRow>())
.FirstOrDefault(row => row != null && row.DockingBayIndex == refit.DockingBayIndex);
return dockingBay != null;
2026-06-25 18:09:33 +01:00
}
private bool TryResolveCurrentEntityKey(out string currentEntityKey)
{
2026-06-29 09:21:29 +01:00
currentEntityKey = CurrentEntitySnapshot()?.EntityKey ?? "";
2026-06-28 15:12:19 +01:00
return !string.IsNullOrWhiteSpace(currentEntityKey);
2026-06-25 18:09:33 +01:00
}
2026-06-29 09:21:29 +01:00
private bool TryReadCurrentEntity(out AetheriaRuntimeCurrentEntityDocument currentEntity)
2026-06-25 18:09:33 +01:00
{
2026-06-29 09:21:29 +01:00
currentEntity = CurrentEntitySnapshot();
2026-06-28 15:12:19 +01:00
if (currentEntity == null)
{
Debug.LogWarning("Failed to read Aetheria current entity for inventory ship settings.");
return false;
}
return true;
2026-06-25 18:09:33 +01:00
}
private bool TryResolveCurrentEntity(out Entity currentEntity)
2026-06-25 18:09:33 +01:00
{
currentEntity = null;
2026-06-29 11:41:32 +01:00
var currentEntityKey = CurrentEntitySnapshot()?.EntityKey ?? "";
2026-06-30 19:14:49 +01:00
return _presentationEntityIndex != null &&
2026-06-29 11:41:32 +01:00
!string.IsNullOrWhiteSpace(currentEntityKey) &&
2026-06-30 19:14:49 +01:00
_presentationEntityIndex.TryGetPresentationEntityByRecordKey(currentEntityKey, out currentEntity);
}
2026-06-25 18:09:33 +01:00
2026-06-29 13:07:24 +01:00
private bool TryResolveCurrentDockingBay(out EquippedDockingBay dockingBay)
{
dockingBay = null;
2026-06-29 11:41:32 +01:00
var refit = StationRefitSnapshot();
if (refit?.IsDocked != true ||
refit.DockingBayIndex < 0 ||
string.IsNullOrWhiteSpace(refit.DockParentEntityKey) ||
2026-06-30 19:14:49 +01:00
_presentationEntityIndex == null ||
!_presentationEntityIndex.TryGetPresentationDockingBayByRecordKey(
2026-06-29 11:41:32 +01:00
refit.DockParentEntityKey,
refit.DockingBayIndex,
out dockingBay))
{
return false;
}
return dockingBay != null;
}
2026-06-25 18:09:33 +01:00
private bool TryResolveEquippedItem(EquippedItem item, out string entityKey, out int equipmentIndex)
{
entityKey = "";
equipmentIndex = -1;
var entity = item?.Entity;
if (entity?.Equipment == null ||
2026-06-30 19:14:49 +01:00
!TryGetRecordKeyForPresentationEntity(entity, out entityKey))
2026-06-25 18:09:33 +01:00
{
return false;
}
equipmentIndex = entity.Equipment.IndexOf(item);
return equipmentIndex >= 0;
}
private bool TrySubmitOperation(
Action<AetheriaControl> submit,
string label)
{
if (submit == null)
return false;
try
{
submit(AetheriaUnityRuntimeClientProvider.Control("unity-inventory-menu"));
2026-06-25 18:09:33 +01:00
return true;
}
catch (Exception ex)
{
Debug.LogWarning($"Failed to send Aetheria daemon inventory menu {label} operation; operation not submitted: {ex.Message}");
return false;
}
}
2026-06-29 09:21:29 +01:00
private AetheriaRuntimeCurrentEntityDocument CurrentEntitySnapshot()
{
try
{
2026-06-30 19:14:49 +01:00
return RuntimeState.CurrentEntity.Latest();
}
catch (Exception ex)
{
Debug.LogWarning($"Failed to read Aetheria current entity for inventory menu: {ex.Message}");
return null;
}
}
2026-06-29 09:21:29 +01:00
private AetheriaRuntimeStationRefitDocument StationRefitSnapshot()
{
try
{
2026-06-30 19:14:49 +01:00
return RuntimeState.StationRefit.Latest();
}
catch (Exception ex)
{
Debug.LogWarning($"Failed to read Aetheria station refit for inventory menu: {ex.Message}");
return null;
}
}
void Update()
{
// if (Keyboard.current.qKey.wasPressedThisFrame && _dragItem != null)
// {
// _dragItem.Rotation = (ItemRotation) (((int) _dragItem.Rotation + 1) % 4);
// }
// if (Keyboard.current.eKey.wasPressedThisFrame && _dragItem != null)
// {
// _dragItem.Rotation = (ItemRotation) (((int) _dragItem.Rotation + 3) % 4);
// }
}
2026-06-25 18:09:33 +01:00
private AetheriaRuntimeCatalogItem FindTypedInventoryItem(ItemInstance item)
{
2026-06-29 09:21:29 +01:00
return CatalogSnapshot()?.FindItem(item, x => x.ItemKey);
2026-06-25 18:09:33 +01:00
}
2026-06-29 09:21:29 +01:00
private AetheriaRuntimeCatalogSnapshot CatalogSnapshot()
2026-06-25 18:09:33 +01:00
{
try
{
2026-06-30 19:14:49 +01:00
return RuntimeState.Catalog.Latest();
2026-06-25 18:09:33 +01:00
}
catch (Exception ex)
{
Debug.LogWarning($"Failed to read Aetheria runtime catalog for inventory menu: {ex.Message}");
return null;
2026-06-25 18:09:33 +01:00
}
}
private AetheriaRuntimePlayerSettingsDocument PlayerSettingsSnapshot()
2026-06-25 18:09:33 +01:00
{
try
{
2026-06-30 19:14:49 +01:00
return RuntimeState.PlayerSettings.Latest();
2026-06-25 18:09:33 +01:00
}
catch (Exception ex)
{
Debug.LogWarning($"Failed to read Aetheria player settings for inventory menu: {ex.Message}");
return null;
2026-06-25 18:09:33 +01:00
}
}
private float ResolveDefaultShutdownPerformance()
{
var value = PlayerSettingsSnapshot()?.DefaultShutdownPerformance ?? 0.25;
2026-06-25 18:09:33 +01:00
return (float)(value <= 0 ? 0.25 : value);
}
private string ResolveManufacturerName(AetheriaRuntimeCatalogItem item)
{
2026-06-29 09:21:29 +01:00
return CatalogSnapshot()?.GetManufacturer(item)?.Name ?? "GameCult";
2026-06-25 18:09:33 +01:00
}
private string FormatValue(float value)
{
var settings = PlayerSettingsSnapshot();
2026-06-25 18:09:33 +01:00
var significantDigits = settings?.SignificantDigits ?? 3;
var magnitude = value == 0.0f ? 0 : (int)Math.Floor(Math.Log10(Math.Abs(value))) + 1;
var digits = significantDigits - magnitude;
if (digits < 0)
digits = 0;
var formatted = value.ToString($"N{digits}", CultureInfo.CurrentCulture);
var separator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
var decimalSeparator = Convert.ToChar(separator);
return formatted.Contains(separator)
? formatted.TrimEnd('0').TrimEnd(decimalSeparator)
: formatted;
}
private string FormatTemperature(float value)
{
var unit = PlayerSettingsSnapshot()?.TemperatureUnit ?? nameof(TemperatureUnit.Celsius);
2026-06-25 18:09:33 +01:00
if (string.Equals(unit, nameof(TemperatureUnit.Kelvin), StringComparison.OrdinalIgnoreCase))
return $"{FormatValue(value)} K";
if (string.Equals(unit, nameof(TemperatureUnit.Fahrenheit), StringComparison.OrdinalIgnoreCase))
return $"{FormatValue(value * (9f / 5) - 459.67f)} F";
return $"{FormatValue(value - 273.15f)} C";
}
private void OnDestroy()
{
if (_shipSettingsSurfaceDocument != null)
{
2026-06-21 09:37:54 +01:00
AetheriaEveUnitySurfaceHost.DestroyDocument(_shipSettingsSurfaceDocument);
_shipSettingsSurfaceDocument = null;
}
if (_cargoItemDetailsSurfaceDocument != null)
{
2026-06-21 09:37:54 +01:00
AetheriaEveUnitySurfaceHost.DestroyDocument(_cargoItemDetailsSurfaceDocument);
_cargoItemDetailsSurfaceDocument = null;
}
if (_equippedItemDetailsSurfaceDocument != null)
{
2026-06-21 09:37:54 +01:00
AetheriaEveUnitySurfaceHost.DestroyDocument(_equippedItemDetailsSurfaceDocument);
_equippedItemDetailsSurfaceDocument = null;
}
}
}