Cut ambient runtime catalog lookup
This commit is contained in:
parent
e7d33e5e43
commit
b3e91999be
14 changed files with 79 additions and 46 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue