Remove legacy catalog enumeration bridges

This commit is contained in:
Meta Vens 2026-06-13 13:49:16 +01:00
commit 06f32937b6
5 changed files with 17 additions and 134 deletions

Binary file not shown.

View file

@ -5,8 +5,6 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using MessagePack;
using UniRx;
@ -14,7 +12,6 @@ public interface ILegacyCatalogReader
{
DatabaseEntry Get(Guid guid);
T Get<T>(Guid guid) where T : DatabaseEntry;
IEnumerable<T> GetAll<T>() where T : DatabaseEntry;
}
public class LegacyCatalogCache : ILegacyCatalogReader
@ -24,36 +21,15 @@ public class LegacyCatalogCache : ILegacyCatalogReader
private List<CacheBackingStore> _backingStores = new List<CacheBackingStore>();
private readonly Dictionary<Type, CacheBackingStore> _typeStores = new Dictionary<Type, CacheBackingStore>();
private readonly Dictionary<CacheBackingStore, Type[]> _storeTypes = new Dictionary<CacheBackingStore, Type[]>();
private readonly Dictionary<Guid, DatabaseEntry> _entries = new Dictionary<Guid, DatabaseEntry>();
private readonly Dictionary<Type, DatabaseEntry> _globals = new Dictionary<Type, DatabaseEntry>();
private readonly Dictionary<Type, HashSet<DatabaseEntry>> _types = new Dictionary<Type, HashSet<DatabaseEntry>>();
public IEnumerable<DatabaseEntry> AllEntries => _entries.Values;
public LegacyCatalogCache()
{
foreach (var type in typeof(DatabaseEntry).GetAllChildClasses())
{
_types[type] = new HashSet<DatabaseEntry>();
if (type.GetCustomAttribute<GlobalSettingsAttribute>() != null)
{
_globals[type] = null;
AddInternal(Activator.CreateInstance(type) as DatabaseEntry);
}
}
}
public void AddBackingStore(CacheBackingStore store, params Type[] domain)
{
if (domain.Length > 0)
{
_storeTypes[store] = domain;
foreach (var t in domain) _typeStores[t] = store;
}
else
{
@ -77,34 +53,11 @@ public class LegacyCatalogCache : ILegacyCatalogReader
{
if (entry != null)
{
var exists = _entries.ContainsKey(entry.ID);
var type = entry.GetType();
if (_globals.ContainsKey(type))
{
if(_globals[type]!=null)
{
RemoveInternal(_globals[type]);
exists = true;
}
_globals[type] = entry;
}
_entries[entry.ID] = entry;
_types[type].Add(entry);
foreach (var parentType in type.GetParentTypes())
{
if(_types.ContainsKey(parentType))
_types[parentType].Add(entry);
}
}
}
}
public bool IsGlobal(DatabaseEntry entry) => _globals.ContainsKey(entry.GetType());
public DatabaseEntry Get(Guid guid)
{
DatabaseEntry entry;
@ -116,39 +69,6 @@ public class LegacyCatalogCache : ILegacyCatalogReader
{
return Get(guid) as T;
}
public DatabaseEntry GetGlobal(Type type)
{
if (_globals.ContainsKey(type)) return _globals[type];
return null;
}
public T GetGlobal<T>() where T : DatabaseEntry
{
return GetGlobal(typeof(T)) as T;
}
public IEnumerable<DatabaseEntry> GetAll(Type type)
{
return !_types.ContainsKey(type) ? Enumerable.Empty<DatabaseEntry>() : _types[type];
}
public IEnumerable<T> GetAll<T>() where T : DatabaseEntry
{
var type = typeof(T);
return !_types.ContainsKey(type) ? Enumerable.Empty<T>() : _types[type].Cast<T>();
}
private void RemoveInternal(DatabaseEntry entry)
{
_entries.Remove(entry.ID);
var type = entry.GetType();
foreach (var parentType in type.GetParentTypes())
{
if(_types.ContainsKey(parentType))
_types[parentType].Remove(entry);
}
}
}
public abstract class CacheBackingStore

View file

@ -30,7 +30,6 @@ public class ItemManager
// private Guid _forceLoadZone;
// public GlobalData GlobalData => _globalData ?? (_globalData = GetCatalogEntries<GlobalData>().FirstOrDefault());
private readonly ILegacyCatalogReader _itemData;
public GameplaySettings GameplaySettings { get; }
@ -59,55 +58,11 @@ public class ItemManager
return _itemData.Get<T>(id);
}
public IEnumerable<T> GetCatalogEntries<T>() where T : DatabaseEntry
{
return _itemData.GetAll<T>();
}
public void Log(string s)
{
_logger(s);
}
// public void Update()
// {
// foreach(var zone in _zones.Values)
// zone.Update((float) Time, _deltaTime);
//
// foreach (var corporation in Cache.GetAll<Corporation>())
// {
// foreach (var tasks in corporation.Tasks
// .Select(id => Cache.Get<AgentTask>(id)) // Fetch the tasks from the database cache
// .Where(task => !task.Reserved) // Filter out tasks that have already been reserved
// .GroupBy(task => task.Type)) // Group tasks by type
// {
// // Create a list of available controllers for this task type
// var availableControllers = CorporationControllers[corporation.ID]
// .Where(controller => controller.Available && controller.TaskType == tasks.Key).ToList();
//
// // Iterate over the highest priority tasks for which controllers are available
// foreach (var task in tasks.OrderByDescending(task => task.Priority).Take(availableControllers.Count))
// {
// // Find the nearest controller for this task
// IController nearestController = availableControllers[0];
// List<ZoneDefinition> nearestControllerPath = FindPath(GalaxyZones[availableControllers.First().Zone.Data.ID], GalaxyZones[task.Zone], true);
// foreach (var controller in availableControllers.Skip(1))
// {
// var path = FindPath(GalaxyZones[controller.Zone.Data.ID], GalaxyZones[task.Zone], true);
// if (path.Count < nearestControllerPath.Count)
// {
// nearestControllerPath = path;
// nearestController = controller;
// }
// }
// task.Reserved = true;
// nearestController.AssignTask(task.ID);
// }
// }
// }
//
// }
// public int ItemTier(CraftedItemData itemData)
// {
// if (Tier.ContainsKey(itemData)) return Tier[itemData];

View file

@ -167,12 +167,12 @@ public class LoadoutGenerator
if (requestedType == typeof(GearData))
{
return item.Category is "GearData" or "WeaponItemData";
return item.Category == "GearData" || item.Category == "WeaponItemData";
}
if (requestedType == typeof(CargoBayData))
{
return item.Category is "CargoBayData" or "DockingBayData";
return item.Category == "CargoBayData" || item.Category == "DockingBayData";
}
return string.Equals(item.Category, requestedType.Name, StringComparison.Ordinal);

View file

@ -79,14 +79,16 @@ legacy catalog cache, and legacy UI paths should be migration-only or deleted.
`ILegacyCatalogReader`, so old MessagePack backing stores may hydrate
in-memory domain objects for the current Unity runtime, but this path cannot
push or delete legacy files. The legacy backing-store
write/realtime APIs and public cache mutation methods have been deleted; only
backing-store pull hydration can populate it. The backing-store serializer
methods are also deleted, so the legacy cache implementation exposes
deserialization only. UI code no longer reaches into
write/realtime APIs, public cache mutation methods, enumeration methods, and
global-setting lookup methods have been deleted; only backing-store pull
hydration can populate it, and only single-ID reads can consume it. The
backing-store serializer methods are also deleted, so the legacy cache
implementation exposes deserialization only. UI code no longer reaches into
`LegacyCatalogBoundary.GetCatalog` directly.
- `ItemManager` no longer exposes the raw `ILegacyCatalogReader` as public
gameplay/UI API. Temporary item instantiation bridges now go through narrow
`ItemManager.GetCatalogEntry<T>` methods. This does not remove the legacy reader under
gameplay/UI API. Temporary item instantiation bridges now go through the
narrow `ItemManager.GetCatalogEntry<T>` method. `ItemManager` no longer
exposes a legacy catalog enumeration API. This does not remove the legacy reader under
the hood; it prevents old catalog authority from leaking into every caller
that only needs a domain lookup. The item properties UI no longer uses
`ItemManager` for manufacturer display; it resolves the manufacturer through
@ -267,7 +269,8 @@ legacy catalog cache, and legacy UI paths should be migration-only or deleted.
it still materializes `ItemManager`. Item properties manufacturer display is
a typed snapshot consumer; the give console command, loadout generation, and
trade debug are typed-selection consumers with temporary legacy item
instantiation or UI callback hydration.
instantiation or UI callback hydration. No live caller can enumerate legacy
catalog entries through `ItemManager` or `ILegacyCatalogReader`.
- Inputs: Unity gameplay code, legacy catalog files, typed state documents, and
CultMesh server state.
- Outputs: `Aetheria.State` emits `.cc` state and CultMesh documents. Legacy
@ -427,6 +430,11 @@ First Aetheria surfaces to publish:
checks and behavior construction.
- Done: move `TradeMenuDebug` row selection to the typed trade catalog;
legacy item DTO hydration remains only for old inspect/buy callbacks.
- Done: delete `ItemManager.GetCatalogEntries<T>` after all live callers
moved to typed catalog selection.
- Done: delete `ILegacyCatalogReader.GetAll<T>` and the type/global indexes
inside `LegacyCatalogCache`; the legacy cache is now only a pull-fed GUID
lookup bridge.
- Replace `ActionGameManager` cache bootstrap with the new state runtime.
- Convert domain references from GUID/base-class patterns to typed record
refs.