Cut ambient runtime catalog lookup

This commit is contained in:
Meta Vens 2026-06-13 17:38:05 +01:00
commit b3e91999be
14 changed files with 79 additions and 46 deletions

View file

@ -1089,7 +1089,7 @@ public class ConsumableItemEffect
{
Item = item;
Entity = entity;
Data = (ConsumableItemData) item.Data.Value;
Data = entity.ItemManager.GetData(item) as ConsumableItemData;
RemainingDuration = Data.Duration;
Behaviors = Data.Behaviors
@ -1399,7 +1399,7 @@ public class EquippedCargoBay : EquippedItem
// Check whether the given item will fit when its origin is placed at the given coordinate
public bool ItemFits(ItemInstance item, int2 cargoCoord)
{
var itemData = item.Data.Value;
var itemData = ItemManager.GetData(item);
// Check every cell of the item's shape
foreach (var i in itemData.Shape.Coordinates)
{
@ -1707,4 +1707,4 @@ public class BehaviorGroup
}
//public IAnalogBehavior Axis;
}
}

View file

@ -209,7 +209,7 @@ public abstract class EntityPack
{
foreach (var (_, item) in t)
{
var itemData = item.Data.Value;
var itemData = itemManager.GetData(item);
if (item is SimpleCommodity s)
_price += itemData.Price * s.Quantity;
else
@ -221,7 +221,7 @@ public abstract class EntityPack
{
foreach (var (_, item) in t)
{
var itemData = item.Data.Value;
var itemData = itemManager.GetData(item);
if (item is SimpleCommodity s)
_price += itemData.Price * s.Quantity;
else

View file

@ -58,6 +58,34 @@ public class ItemManager
return _itemData.Get<T>(id);
}
public RuntimeCatalogLink<ItemData> CreateLink(ItemData item)
{
return new RuntimeCatalogLink<ItemData>(item);
}
public ItemData GetData(ItemInstance item)
{
Hydrate(item);
return item?.Data?.Value;
}
public void Hydrate(ItemInstance item)
{
if (item?.Data == null || item.Data.Value != null)
{
return;
}
var data = _itemData.Get(item.Data.LinkID);
if (data == null)
{
_logger($"Attempted to hydrate missing item id {item.Data.LinkID}");
return;
}
item.Data.SetValue(data);
}
public void Log(string s)
{
_logger(s);
@ -65,32 +93,32 @@ public class ItemManager
public SimpleCommodityData GetData(SimpleCommodity item)
{
return item.Data.Value as SimpleCommodityData;
return GetData((ItemInstance)item) as SimpleCommodityData;
}
public CraftedItemData GetData(CraftedItemInstance item)
{
return item.Data.Value as CraftedItemData;
return GetData((ItemInstance)item) as CraftedItemData;
}
public EquippableItemData GetData(EquippableItem item)
{
return item.Data.Value as EquippableItemData;
return GetData((ItemInstance)item) as EquippableItemData;
}
public float GetMass(ItemInstance item)
{
return item switch
{
CraftedItemInstance _ => item.Data.Value.Mass,
SimpleCommodity commodity => item.Data.Value.Mass * commodity.Quantity,
CraftedItemInstance _ => GetData(item).Mass,
SimpleCommodity commodity => GetData(item).Mass * commodity.Quantity,
_ => 0
};
}
public float GetThermalMass(ItemInstance item)
{
var data = item.Data.Value;
var data = GetData(item);
return item switch
{
CraftedItemInstance _ => data.Mass * data.SpecificHeat,
@ -128,7 +156,7 @@ public class ItemManager
{
var newItem = new SimpleCommodity
{
Data = new RuntimeCatalogLink<ItemData>{LinkID = item.ID},
Data = CreateLink(item),
Quantity = count
};
//ItemData.Add(newItem);
@ -141,7 +169,7 @@ public class ItemManager
public ItemInstance Instantiate(ItemInstance item)
{
var data = item.Data.Value;
var data = GetData(item);
if(data is CraftedItemData c)
{
var i = CreateInstance(c);
@ -163,13 +191,13 @@ public class ItemManager
{
return new EquippableItem
{
Data = new RuntimeCatalogLink<ItemData> {LinkID = item.ID}, Quality = quality, Durability = equippableItemData.Durability
Data = CreateLink(item), Quality = quality, Durability = equippableItemData.Durability
};
}
var newCommodity = new CompoundCommodity
{
Data = new RuntimeCatalogLink<ItemData>{LinkID = item.ID},
Data = CreateLink(item),
Quality = quality
};
return newCommodity;

View file

@ -28,29 +28,27 @@ public abstract class RuntimeCatalogEntry
public class RuntimeCatalogLink<T> : RuntimeCatalogLinkBase where T : ItemData
{
public T Value => ResolveRuntimeItemCatalog<T>(LinkID);
public T Value { get; private set; }
public RuntimeCatalogLink()
{
}
public RuntimeCatalogLink(T value)
{
SetValue(value);
}
public void SetValue(T value)
{
Value = value;
LinkID = value?.ID ?? Guid.Empty;
}
}
public class RuntimeCatalogLinkBase
{
public Guid LinkID;
private static IRuntimeItemCatalogReader Catalog { get; set; }
protected static T ResolveRuntimeItemCatalog<T>(Guid linkId) where T : ItemData
{
if (Catalog == null)
throw new InvalidOperationException("Runtime item catalog resolution is not bound. Open typed Aetheria runtime state before reading item object graphs.");
return Catalog.Get<T>(linkId);
}
public static void BindRuntimeItemCatalog(IRuntimeItemCatalogReader catalog)
{
if (catalog == null) throw new ArgumentNullException(nameof(catalog));
Catalog = catalog;
}
}
public interface ITintInspector