From 4d5b6cda222d3fcf4ee98f9307af6cb9f1c5d983 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 14 Jun 2026 07:41:32 +0100 Subject: [PATCH] Clone blueprint items from typed rows --- .voidbot/state/aetheria.cc | Bin 74015 -> 75317 bytes Assets/Scripts/ServerShared/ItemManager.cs | 97 +++++++++++---------- docs/aetheria-perfect-machine-map.md | 10 ++- 3 files changed, 56 insertions(+), 51 deletions(-) diff --git a/.voidbot/state/aetheria.cc b/.voidbot/state/aetheria.cc index 192ba8e75be8e09af84ece17fe2853182a404fe2..5d42001327f0b9822d8b84b0fff45a4839a6a67c 100644 GIT binary patch delta 1103 zcmZux&ui2`6ejH|mLBxbZHp9qNDr;JDWzNbLlC%l_Uu-|+0=6m1!US91NcE1(2 zH@kXfW+!LNsq)m?Q==Gv?Rt^{lM@O^px-zdN8M45PV2N&g>zlSqn**hrz7Jf9Y##kS@xe^7!^$|KrppqaL}ic+%VLDp6{7LLrP zSLFST>bg4VU(Pj6Z9ZexQaX%6NJN9f1~S#CPn&3)n*swar8#)MsEMJi%BB@N)D_fT zbR4tqGI&UsH2)m3$+VBP9`OGN~%p z%^v4lrMqe`H(s*TXN(x-g!UQdHAI1tfdN#w9Pm+vkFpbkEN;67Bbs3w3bWM+tVm!bBHrLqPV7h`d mBh(fXv+0gfjN;QzNi#M CreateSimpleCommodityInstance(typedItem, simple.Quantity), + CraftedItemInstance => CreateCraftedInstance(typedItem), + _ => null + }; + + if (instance != null) + instance.Rotation = item.Rotation; + + return instance; } - public CraftedItemInstance CreateInstance(CraftedItemData item, float quality) + public CraftedItemInstance CreateCraftedInstance(AetheriaRuntimeCatalogItem item, float quality) { - if (item is EquippableItemData equippableItemData) + if (IsEquippable(item)) + return CreateEquippableInstance(item, quality); + + var itemId = GetLegacyGuid(item); + if (itemId == Guid.Empty) { - return new EquippableItem + throw new NullReferenceException("Attempted to create crafted item instance using missing typed item data!"); + } + + if (string.Equals(item.Category, nameof(ConsumableItemData), StringComparison.Ordinal)) + { + return new ConsumableItem { - Data = CreateReference(item), Quality = quality, Durability = GetInitialDurability(equippableItemData) + Data = CreateReference(itemId), + Quality = quality }; } - var newCommodity = new CompoundCommodity + return new CompoundCommodity { - Data = CreateReference(item), + Data = CreateReference(itemId), Quality = quality }; - return newCommodity; + } + + public CraftedItemInstance CreateCraftedInstance(AetheriaRuntimeCatalogItem item) + { + return CreateCraftedInstance(item, SelectCraftedQuality()); } public EquippableItem CreateEquippableInstance(AetheriaRuntimeCatalogItem item, float quality) @@ -295,23 +307,6 @@ public class ItemManager return CreateEquippableInstance(item, SelectCraftedQuality()); } - private float GetInitialDurability(EquippableItemData item) - { - var typedItem = GetRuntimeItem(item.ID); - return typedItem?.Durability > 0 ? (float)typedItem.Durability : item.Durability; - } - - public CraftedItemInstance CreateInstance(CraftedItemData item) - { - if (item == null) - { - throw new NullReferenceException("Attempted to create crafted item instance using missing or incorrect item data!"); - return null; - } - - return CreateInstance(item, SelectCraftedQuality()); - } - private float SelectCraftedQuality() { var quality = Random.NextFloat(); @@ -332,6 +327,12 @@ public class ItemManager : Guid.Empty; } + private static bool IsEquippable(AetheriaRuntimeCatalogItem item) + { + return !string.IsNullOrWhiteSpace(item?.HardpointType) || + string.Equals(item?.Category, nameof(HullData), StringComparison.Ordinal); + } + public (RarityTier tier, int upgrades) GetTier(CraftedItemInstance item) { var tier = GameplaySettings.Tiers[0]; diff --git a/docs/aetheria-perfect-machine-map.md b/docs/aetheria-perfect-machine-map.md index 764d51ebb..527e03540 100644 --- a/docs/aetheria-perfect-machine-map.md +++ b/docs/aetheria-perfect-machine-map.md @@ -233,9 +233,9 @@ legacy catalog cache, and legacy UI paths should be migration-only or deleted. max durability only, with current runtime durability as the generic denominator for incomplete typed rows. `ItemManager.Evaluate` also uses typed runtime item max durability and item names when evaluating unequipped - performance stats. `ItemManager.CreateInstance(CraftedItemData, float)` - initializes new equippable runtime durability from the typed runtime item row; - `EquippableItemData.Durability` is only an incomplete-row fallback. + performance stats. `ItemManager` typed item instantiation primitives create + simple commodities, crafted items, and equippable items from runtime catalog + rows; old DTO-based item creation is gone from blueprint cloning. `EquippedItem` also takes conductivity, max durability, thermal bounds, and thermal performance curve keys from the typed runtime item row for heat conduction, durability performance, thermal performance, and wear scaling. @@ -768,6 +768,10 @@ First Aetheria surfaces to publish: - Done: move runtime blueprint price aggregation and conductivity restore geometry onto typed runtime item price and hull shape rows; legacy `ItemData.Price` and `HullData.Shape` no longer own those blueprint paths. + - Done: move runtime blueprint item cloning off `ItemData` hydration and onto + typed runtime item rows; `ItemManager.Instantiate` now clones simple + commodities, crafted items, consumables, and equippables from + `AetheriaRuntimeCatalogItem` identity and facets. - Done: move final `Entity.ItemFits`, `TryFindSpace`, `TryEquip`, and `TryUnequip` gear occupancy/mass deltas onto typed catalog rows for item shape, hull shape/interior, hardpoint masks, cargo/docking category, and