diff --git a/.voidbot/state/aetheria.cc b/.voidbot/state/aetheria.cc index bc18e1cc8..2fbad78ae 100644 Binary files a/.voidbot/state/aetheria.cc and b/.voidbot/state/aetheria.cc differ diff --git a/Assets/Scripts/Gameplay/ShipInstance.cs b/Assets/Scripts/Gameplay/ShipInstance.cs index 5d0f57e3b..778b8b69d 100644 --- a/Assets/Scripts/Gameplay/ShipInstance.cs +++ b/Assets/Scripts/Gameplay/ShipInstance.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Linq; +using GameCult.Aetheria.State.Unity; using UnityEngine; using Unity.Mathematics; using static Unity.Mathematics.math; @@ -129,11 +130,27 @@ public class ShipInstance : EntityInstance { var emissionModule = thrusterInstance.System.emission; var item = thrusterInstance.Thruster.Item.EquippableItem; - var data = Entity.ItemManager.GetData(item); thrusterInstance.MaxParticleCount = thrusterInstance.System.particleCount; - emissionModule.rateOverTimeMultiplier = thrusterInstance.BaseEmission * thrusterInstance.Thruster.Axis * (item.Durability / data.Durability); + emissionModule.rateOverTimeMultiplier = thrusterInstance.BaseEmission * thrusterInstance.Thruster.Axis * (item.Durability / GetMaxDurability(item)); } transform.rotation = Ship.Rotation; } -} \ No newline at end of file + + private float GetMaxDurability(ItemInstance item) + { + var typedItem = FindTypedItem(item); + if (typedItem != null && typedItem.Durability > 0) + return (float)typedItem.Durability; + + return Entity.ItemManager.GetData(item).Durability; + } + + private static AetheriaRuntimeCatalogItem FindTypedItem(ItemInstance item) + { + var itemId = item?.Data?.ItemId ?? Guid.Empty; + return itemId == Guid.Empty + ? null + : ActionGameManager.RuntimeCatalog?.FindItemByLegacyId(itemId.ToString("D")); + } +} diff --git a/docs/aetheria-perfect-machine-map.md b/docs/aetheria-perfect-machine-map.md index 8a518e2b6..965dc5e2d 100644 --- a/docs/aetheria-perfect-machine-map.md +++ b/docs/aetheria-perfect-machine-map.md @@ -93,6 +93,8 @@ legacy catalog cache, and legacy UI paths should be migration-only or deleted. legacy `WeaponItemData`. Hull and item durability percentages use typed max durability before falling back to legacy `ItemData.Durability`. + Ship thruster VFX emission scaling also uses typed max durability before + falling back to legacy `ItemData.Durability`. Runtime weapon behavior still owns ammo counts, active range, cooldowns, temperature, and durability display until those session facts have typed runtime surfaces.