Key zone runtime collections on typed state keys

This commit is contained in:
Meta Vens 2026-06-16 16:48:00 +01:00
commit 397f3aff5a
5 changed files with 164 additions and 93 deletions

Binary file not shown.

View file

@ -19,6 +19,7 @@ RequireTypedOrbitalEntityOrbitKeys(root);
RequireTypedOrbitConsumerKeys(root);
RequireKeyedOrbitRuntimeWrappers(root);
RequireNativeZoneKeyResolution(root);
RequireTypedZoneRuntimeCollections(root);
RequireTypedAsteroidZoneApi(root);
RequireTypedFactionShellLinks(root);
RequireFactionKeyIdentity(root);
@ -1151,8 +1152,8 @@ static void RequireKeyedOrbitRuntimeWrappers(string root)
{
"public Orbit Orbit;",
"public Orbit Orbit { get; }",
"var runtimeBelt = new AsteroidBelt(belt, Orbits[belt.Orbit]);",
"AsteroidBelts[belt.ID] = runtimeBelt;",
"var runtimeBelt = new AsteroidBelt(belt, Orbits[OrbitKey(belt.Orbit)]);",
"AsteroidBelts[runtimeBelt.BodyKey] = runtimeBelt;",
"belt.NewOrbitPosition = GetOrbitPosition(belt.Orbit.ParentOrbitKey);",
"public AsteroidBelt(AsteroidBeltConstructionData data, Orbit orbit)",
"Orbit = orbit;"
@ -1222,7 +1223,9 @@ static void RequireNativeZoneKeyResolution(string root)
"AsteroidBelts.TryGetValue(ParseBodyGuid(bodyKey), out belt)",
"Orbits.TryGetValue(ParseOrbitGuid(orbitKey), out orbit)",
"return GetOrbitPosition(ParseOrbitGuid(orbitKey));",
"return GetOrbitVelocity(ParseOrbitGuid(orbitKey));"
"return GetOrbitVelocity(ParseOrbitGuid(orbitKey));",
"public float2 GetOrbitPosition(Guid orbitID)",
"public float2 GetOrbitVelocity(Guid orbit)"
};
var hits = forbiddenSymbols
.Where(symbol => zoneSource.Contains(symbol, StringComparison.Ordinal))
@ -1237,20 +1240,28 @@ static void RequireNativeZoneKeyResolution(string root)
var requiredSymbols = new[]
{
"private readonly Dictionary<string, Planet> _planetsByBodyKey = new Dictionary<string, Planet>(StringComparer.Ordinal);",
"private readonly Dictionary<string, AsteroidBelt> _asteroidBeltsByBodyKey = new Dictionary<string, AsteroidBelt>(StringComparer.Ordinal);",
"private readonly Dictionary<string, Orbit> _orbitsByKey = new Dictionary<string, Orbit>(StringComparer.Ordinal);",
"_orbitsByKey[runtimeOrbit.OrbitKey] = runtimeOrbit;",
"_asteroidBeltsByBodyKey[runtimeBelt.BodyKey] = runtimeBelt;",
"_planetsByBodyKey[runtimeSun.BodyKey] = runtimeSun;",
"_planetsByBodyKey[runtimeGas.BodyKey] = runtimeGas;",
"_planetsByBodyKey[runtimePlanet.BodyKey] = runtimePlanet;",
"return _planetsByBodyKey.TryGetValue(bodyKey ?? \"\", out planet);",
"return _asteroidBeltsByBodyKey.TryGetValue(bodyKey ?? \"\", out belt);",
"return _orbitsByKey.TryGetValue(orbitKey ?? \"\", out orbit);",
"return TryGetOrbit(orbitKey, out var orbit)",
"? GetOrbitPosition(orbit.ID)",
"? GetOrbitVelocity(orbit.ID)"
"public Dictionary<string, Planet> PlanetInstances = new Dictionary<string, Planet>(StringComparer.Ordinal);",
"public Dictionary<string, Orbit> Orbits = new Dictionary<string, Orbit>(StringComparer.Ordinal);",
"public Dictionary<string, AsteroidBelt> AsteroidBelts = new Dictionary<string, AsteroidBelt>(StringComparer.Ordinal);",
"private readonly Dictionary<Guid, Planet> _planetsById = new Dictionary<Guid, Planet>();",
"private readonly Dictionary<Guid, AsteroidBelt> _asteroidBeltsById = new Dictionary<Guid, AsteroidBelt>();",
"PlanetInstances[runtimeSun.BodyKey] = runtimeSun;",
"_planetsById[runtimeSun.ID] = runtimeSun;",
"PlanetInstances[runtimeGas.BodyKey] = runtimeGas;",
"_planetsById[runtimeGas.ID] = runtimeGas;",
"PlanetInstances[runtimePlanet.BodyKey] = runtimePlanet;",
"_planetsById[runtimePlanet.ID] = runtimePlanet;",
"AsteroidBelts[runtimeBelt.BodyKey] = runtimeBelt;",
"_asteroidBeltsById[runtimeBelt.ID] = runtimeBelt;",
"Orbits[runtimeOrbit.OrbitKey] = runtimeOrbit;",
"return PlanetInstances.TryGetValue(bodyKey ?? \"\", out planet);",
"return AsteroidBelts.TryGetValue(bodyKey ?? \"\", out belt);",
"return Orbits.TryGetValue(orbitKey ?? \"\", out orbit);",
"if (_planetsById.TryGetValue(bodyId, out var planet))",
"if (_asteroidBeltsById.TryGetValue(bodyId, out var belt))",
"var parentPosition = string.IsNullOrWhiteSpace(orbit.ParentOrbitKey)",
": GetOrbitPosition(orbit.ParentOrbitKey);",
"return TryGetOrbit(orbitKey, out var orbit) ? orbit.Velocity : float2.zero;"
};
var missingSymbols = requiredSymbols
.Where(symbol => !zoneSource.Contains(symbol, StringComparison.Ordinal))
@ -1263,6 +1274,87 @@ static void RequireNativeZoneKeyResolution(string root)
}
}
static void RequireTypedZoneRuntimeCollections(string root)
{
var zoneSourcePath = Path.Combine(root, "Assets", "Scripts", "ServerShared", "Zone.cs");
var zoneRendererPath = Path.Combine(root, "Assets", "Scripts", "Zone Display", "ZoneRenderer.cs");
var zoneSource = File.Exists(zoneSourcePath)
? File.ReadAllText(zoneSourcePath)
: throw new InvalidOperationException("Cannot verify typed Zone runtime collections; Zone source is missing.");
var zoneRenderer = File.Exists(zoneRendererPath)
? File.ReadAllText(zoneRendererPath)
: throw new InvalidOperationException("Cannot verify typed Zone runtime collections; ZoneRenderer source is missing.");
var forbiddenZoneSymbols = new[]
{
"public Dictionary<Guid, Planet> PlanetInstances",
"public Dictionary<Guid, Orbit> Orbits",
"public Dictionary<Guid, AsteroidBelt> AsteroidBelts",
"private HashSet<Guid> _updatedOrbits",
"orbit.Value.Position = GetOrbitPosition(orbit.Key);"
};
var zoneHits = forbiddenZoneSymbols
.Where(symbol => zoneSource.Contains(symbol, StringComparison.Ordinal))
.Select(symbol => $"Assets/Scripts/ServerShared/Zone.cs: contains {symbol}");
var forbiddenRendererSymbols = new[]
{
"public Dictionary<Guid, PlanetObject> Planets",
"private Dictionary<Guid, AsteroidBeltUI> _beltObjects",
"private Dictionary<Guid, InstancedMesh[]> _beltMeshes",
"private Dictionary<Guid, Matrix4x4[][]> _beltMatrices",
"_beltMeshes[runtimeBelt.ID] =",
"_beltObjects[runtimeBelt.ID] =",
"Planets[planetInstance.ID] = planet;"
};
var rendererHits = forbiddenRendererSymbols
.Where(symbol => zoneRenderer.Contains(symbol, StringComparison.Ordinal))
.Select(symbol => $"Assets/Scripts/Zone Display/ZoneRenderer.cs: contains {symbol}");
var hits = zoneHits.Concat(rendererHits).ToArray();
if (hits.Length > 0)
{
throw new InvalidOperationException(
"Zone runtime collections and renderer caches must keep typed OrbitKey/BodyKey ownership rather than Guid dictionary keys: " +
string.Join("; ", hits));
}
var requiredZoneSymbols = new[]
{
"public Dictionary<string, Planet> PlanetInstances = new Dictionary<string, Planet>(StringComparer.Ordinal);",
"public Dictionary<string, Orbit> Orbits = new Dictionary<string, Orbit>(StringComparer.Ordinal);",
"public Dictionary<string, AsteroidBelt> AsteroidBelts = new Dictionary<string, AsteroidBelt>(StringComparer.Ordinal);",
"private HashSet<string> _updatedOrbits = new HashSet<string>(StringComparer.Ordinal);",
"foreach (var orbit in Orbits.Values)",
"orbit.Position = GetOrbitPosition(orbit.OrbitKey);"
};
var missingZoneSymbols = requiredZoneSymbols
.Where(symbol => !zoneSource.Contains(symbol, StringComparison.Ordinal))
.Select(symbol => $"Assets/Scripts/ServerShared/Zone.cs: missing {symbol}");
var requiredRendererSymbols = new[]
{
"public Dictionary<string, PlanetObject> Planets = new Dictionary<string, PlanetObject>(StringComparer.Ordinal);",
"private Dictionary<string, AsteroidBeltUI> _beltObjects = new Dictionary<string, AsteroidBeltUI>(StringComparer.Ordinal);",
"private Dictionary<string, InstancedMesh[]> _beltMeshes = new Dictionary<string, InstancedMesh[]>(StringComparer.Ordinal);",
"private Dictionary<string, Matrix4x4[][]> _beltMatrices = new Dictionary<string, Matrix4x4[][]>(StringComparer.Ordinal);",
"_beltMeshes[runtimeBelt.BodyKey] = meshes.ToArray();",
"_beltObjects[runtimeBelt.BodyKey] = belt;",
"Planets[planetInstance.BodyKey] = planet;"
};
var missingRendererSymbols = requiredRendererSymbols
.Where(symbol => !zoneRenderer.Contains(symbol, StringComparison.Ordinal))
.Select(symbol => $"Assets/Scripts/Zone Display/ZoneRenderer.cs: missing {symbol}");
var missing = missingZoneSymbols.Concat(missingRendererSymbols).ToArray();
if (missing.Length > 0)
{
throw new InvalidOperationException(
"Zone runtime collections and renderer caches must expose typed keyed ownership end to end: " +
string.Join("; ", missing));
}
}
static void RequireTypedAsteroidZoneApi(string root)
{
var zoneSourcePath = Path.Combine(root, "Assets", "Scripts", "ServerShared", "Zone.cs");

View file

@ -2902,15 +2902,15 @@ public class ActionGameManager : MonoBehaviour
ZoneRenderer.PerspectiveEntity = ship;
var entityPosition = ship.Position.xz;
var followOrbit = Zone.Orbits.Values.MinBy(orbit => lengthsq(Zone.GetOrbitPosition(orbit.OrbitKey) - entityPosition));
var followPlanetId = Zone.PlanetInstances.Values.First(planet => planet.OrbitKey == followOrbit.OrbitKey).ID;
var followPlanet = ZoneRenderer.Planets[followPlanetId];
var followPlanetBodyKey = Zone.PlanetInstances.Values.First(planet => planet.OrbitKey == followOrbit.OrbitKey).BodyKey;
var followPlanet = ZoneRenderer.Planets[followPlanetBodyKey];
DockCamera.Follow = followPlanet.Body.transform;
var rootOrbit = followOrbit;
while (!string.IsNullOrWhiteSpace(rootOrbit.ParentOrbitKey) &&
Zone.TryGetOrbit(rootOrbit.ParentOrbitKey, out var parentOrbit))
rootOrbit = parentOrbit;
var rootPlanetId = Zone.PlanetInstances.Values.First(planet => planet.OrbitKey == rootOrbit.OrbitKey).ID;
var rootPlanet = ZoneRenderer.Planets[rootPlanetId];
var rootPlanetBodyKey = Zone.PlanetInstances.Values.First(planet => planet.OrbitKey == rootOrbit.OrbitKey).BodyKey;
var rootPlanet = ZoneRenderer.Planets[rootPlanetBodyKey];
DockCamera.LookAt = rootPlanet.Body.transform;
var shipVelocity = ship.GetBehavior<VelocityLimit>().Limit;
@ -2964,9 +2964,9 @@ public class ActionGameManager : MonoBehaviour
var orbital = (OrbitalEntity) entity;
DockCamera.Follow = ZoneRenderer.EntityInstances[orbital].transform;
var parentOrbitKey = Zone.TryGetOrbit(orbital.OrbitKey, out var orbit) ? orbit.ParentOrbitKey : "";
var parentOrbitPlanet = Zone.PlanetInstances.Values.FirstOrDefault(planet => planet.OrbitKey == parentOrbitKey)?.ID ?? Guid.Empty;
if (ZoneRenderer.Planets.ContainsKey(parentOrbitPlanet))
DockCamera.LookAt = ZoneRenderer.Planets[parentOrbitPlanet].Body.transform;
var parentOrbitPlanetBodyKey = Zone.PlanetInstances.Values.FirstOrDefault(planet => planet.OrbitKey == parentOrbitKey)?.BodyKey ?? "";
if (ZoneRenderer.Planets.ContainsKey(parentOrbitPlanetBodyKey))
DockCamera.LookAt = ZoneRenderer.Planets[parentOrbitPlanetBodyKey].Body.transform;
else DockCamera.LookAt = ZoneRenderer.ZoneRoot;
if (entity is OrbitalEntity {CanTow: true})
TowingStation = entity;

View file

@ -21,17 +21,16 @@ public class Zone
public Action<string> Log;
public ReactiveCollection<Entity> Entities = new ReactiveCollection<Entity>();
public Dictionary<Guid, Planet> PlanetInstances = new Dictionary<Guid, Planet>();
public Dictionary<string, Planet> PlanetInstances = new Dictionary<string, Planet>(StringComparer.Ordinal);
public Dictionary<Guid, Orbit> Orbits = new Dictionary<Guid, Orbit>();
public Dictionary<Guid, AsteroidBelt> AsteroidBelts = new Dictionary<Guid, AsteroidBelt>();
public Dictionary<string, Orbit> Orbits = new Dictionary<string, Orbit>(StringComparer.Ordinal);
public Dictionary<string, AsteroidBelt> AsteroidBelts = new Dictionary<string, AsteroidBelt>(StringComparer.Ordinal);
public PlanetSettings Settings;
private readonly Dictionary<string, Planet> _planetsByBodyKey = new Dictionary<string, Planet>(StringComparer.Ordinal);
private readonly Dictionary<string, AsteroidBelt> _asteroidBeltsByBodyKey = new Dictionary<string, AsteroidBelt>(StringComparer.Ordinal);
private readonly Dictionary<string, Orbit> _orbitsByKey = new Dictionary<string, Orbit>(StringComparer.Ordinal);
private HashSet<Guid> _updatedOrbits = new HashSet<Guid>();
private readonly Dictionary<Guid, Planet> _planetsById = new Dictionary<Guid, Planet>();
private readonly Dictionary<Guid, AsteroidBelt> _asteroidBeltsById = new Dictionary<Guid, AsteroidBelt>();
private HashSet<string> _updatedOrbits = new HashSet<string>(StringComparer.Ordinal);
private ItemManager _itemManager;
private double _time;
@ -63,8 +62,7 @@ public class Zone
foreach (var orbit in blueprint.Orbits)
{
var runtimeOrbit = new Orbit(Settings, orbit);
Orbits.Add(orbit.ID, runtimeOrbit);
_orbitsByKey[runtimeOrbit.OrbitKey] = runtimeOrbit;
Orbits[runtimeOrbit.OrbitKey] = runtimeOrbit;
}
foreach (var planet in blueprint.Bodies)
@ -72,24 +70,24 @@ public class Zone
switch (planet)
{
case AsteroidBeltConstructionData belt:
var runtimeBelt = new AsteroidBelt(belt, Orbits[belt.Orbit]);
AsteroidBelts[belt.ID] = runtimeBelt;
_asteroidBeltsByBodyKey[runtimeBelt.BodyKey] = runtimeBelt;
var runtimeBelt = new AsteroidBelt(belt, Orbits[OrbitKey(belt.Orbit)]);
AsteroidBelts[runtimeBelt.BodyKey] = runtimeBelt;
_asteroidBeltsById[runtimeBelt.ID] = runtimeBelt;
break;
case SunConstructionData sun:
var runtimeSun = new Sun(settings, sun, Orbits[planet.Orbit]);
PlanetInstances.Add(sun.ID, runtimeSun);
_planetsByBodyKey[runtimeSun.BodyKey] = runtimeSun;
var runtimeSun = new Sun(settings, sun, Orbits[OrbitKey(planet.Orbit)]);
PlanetInstances[runtimeSun.BodyKey] = runtimeSun;
_planetsById[runtimeSun.ID] = runtimeSun;
break;
case GasGiantConstructionData gas:
var runtimeGas = new GasGiant(settings, gas, Orbits[planet.Orbit]);
PlanetInstances.Add(gas.ID, runtimeGas);
_planetsByBodyKey[runtimeGas.BodyKey] = runtimeGas;
var runtimeGas = new GasGiant(settings, gas, Orbits[OrbitKey(planet.Orbit)]);
PlanetInstances[runtimeGas.BodyKey] = runtimeGas;
_planetsById[runtimeGas.ID] = runtimeGas;
break;
default:
var runtimePlanet = new Planet(settings, planet, Orbits[planet.Orbit]);
PlanetInstances.Add(planet.ID, runtimePlanet);
_planetsByBodyKey[runtimePlanet.BodyKey] = runtimePlanet;
var runtimePlanet = new Planet(settings, planet, Orbits[OrbitKey(planet.Orbit)]);
PlanetInstances[runtimePlanet.BodyKey] = runtimePlanet;
_planetsById[runtimePlanet.ID] = runtimePlanet;
break;
}
}
@ -137,26 +135,26 @@ public class Zone
{
if (bodyId == Guid.Empty)
return "";
if (PlanetInstances.TryGetValue(bodyId, out var planet))
if (_planetsById.TryGetValue(bodyId, out var planet))
return planet.BodyKey;
if (AsteroidBelts.TryGetValue(bodyId, out var belt))
if (_asteroidBeltsById.TryGetValue(bodyId, out var belt))
return belt.BodyKey;
return BodyKey(bodyId);
}
public bool TryGetPlanet(string bodyKey, out Planet planet)
{
return _planetsByBodyKey.TryGetValue(bodyKey ?? "", out planet);
return PlanetInstances.TryGetValue(bodyKey ?? "", out planet);
}
public bool TryGetAsteroidBelt(string bodyKey, out AsteroidBelt belt)
{
return _asteroidBeltsByBodyKey.TryGetValue(bodyKey ?? "", out belt);
return AsteroidBelts.TryGetValue(bodyKey ?? "", out belt);
}
public bool TryGetOrbit(string orbitKey, out Orbit orbit)
{
return _orbitsByKey.TryGetValue(orbitKey ?? "", out orbit);
return Orbits.TryGetValue(orbitKey ?? "", out orbit);
}
public void Update(float deltaTime)
@ -166,11 +164,11 @@ public class Zone
foreach (var t in BeltUpdates)
t.Wait();
BeltUpdates.Clear();
foreach (var orbit in Orbits)
foreach (var orbit in Orbits.Values)
{
orbit.Value.PreviousPosition = orbit.Value.Position;
orbit.Value.Position = GetOrbitPosition(orbit.Key);
orbit.Value.Velocity = (orbit.Value.Position - orbit.Value.PreviousPosition) / deltaTime;
orbit.PreviousPosition = orbit.Position;
orbit.Position = GetOrbitPosition(orbit.OrbitKey);
orbit.Velocity = (orbit.Position - orbit.PreviousPosition) / deltaTime;
}
foreach (var belt in AsteroidBelts.Values)
@ -187,20 +185,19 @@ public class Zone
}
// Determine orbital position recursively, caching parent positions to avoid repeated calculations
public float2 GetOrbitPosition(Guid orbitID)
public float2 GetOrbitPosition(string orbitKey)
{
// Root orbit is fixed at origin
if(orbitID==Guid.Empty)
if (string.IsNullOrWhiteSpace(orbitKey))
return float2.zero;
if (!Orbits.ContainsKey(orbitID))
if (!Orbits.TryGetValue(orbitKey, out var orbit))
{
Log?.Invoke("Requested orbit is not part of this zone!");
return float2.zero;
}
if (!_updatedOrbits.Contains(orbitID))
if (!_updatedOrbits.Contains(orbitKey))
{
var orbit = Orbits[orbitID];
float2 pos = float2.zero;
if (orbit.Period > .01f)
{
@ -214,35 +211,19 @@ public class Zone
}
}
var parentPosition = orbit.Parent == Guid.Empty
var parentPosition = string.IsNullOrWhiteSpace(orbit.ParentOrbitKey)
? orbit.FixedPosition
: GetOrbitPosition(orbit.Parent);
Orbits[orbitID].Position = parentPosition + pos;
_updatedOrbits.Add(orbitID);
: GetOrbitPosition(orbit.ParentOrbitKey);
orbit.Position = parentPosition + pos;
_updatedOrbits.Add(orbitKey);
}
return Orbits[orbitID].Position;
}
public float2 GetOrbitPosition(string orbitKey)
{
return TryGetOrbit(orbitKey, out var orbit)
? GetOrbitPosition(orbit.ID)
: float2.zero;
}
public float2 GetOrbitVelocity(Guid orbit)
{
if (Orbits.ContainsKey(orbit))
return Orbits[orbit].Velocity;
return float2.zero;
return orbit.Position;
}
public float2 GetOrbitVelocity(string orbitKey)
{
return TryGetOrbit(orbitKey, out var orbit)
? GetOrbitVelocity(orbit.ID)
: float2.zero;
return TryGetOrbit(orbitKey, out var orbit) ? orbit.Velocity : float2.zero;
}
public int NearestAsteroid(string asteroidBeltKey, float2 position)
@ -597,7 +578,6 @@ public class Orbit
{
public Guid ID { get; }
public string OrbitKey { get; }
public Guid Parent { get; }
public string ParentOrbitKey { get; }
public float Distance { get; }
public float Phase { get; }
@ -617,7 +597,6 @@ public class Orbit
{
ID = data.ID;
OrbitKey = Zone.OrbitKey(data.ID);
Parent = data.Parent;
ParentOrbitKey = Zone.OrbitKey(data.Parent);
Distance = data.Distance;
Phase = data.Phase;

View file

@ -66,11 +66,11 @@ public class ZoneRenderer : MonoBehaviour
public Sprite WormholeIcon;
[HideInInspector] public Dictionary<Entity, EntityInstance> EntityInstances = new Dictionary<Entity, EntityInstance>();
[HideInInspector] public Dictionary<Guid, PlanetObject> Planets = new Dictionary<Guid, PlanetObject>();
[HideInInspector] public Dictionary<string, PlanetObject> Planets = new Dictionary<string, PlanetObject>(StringComparer.Ordinal);
private Dictionary<Guid, AsteroidBeltUI> _beltObjects = new Dictionary<Guid, AsteroidBeltUI>();
private Dictionary<Guid, InstancedMesh[]> _beltMeshes = new Dictionary<Guid, InstancedMesh[]>();
private Dictionary<Guid, Matrix4x4[][]> _beltMatrices = new Dictionary<Guid, Matrix4x4[][]>();
private Dictionary<string, AsteroidBeltUI> _beltObjects = new Dictionary<string, AsteroidBeltUI>(StringComparer.Ordinal);
private Dictionary<string, InstancedMesh[]> _beltMeshes = new Dictionary<string, InstancedMesh[]>(StringComparer.Ordinal);
private Dictionary<string, Matrix4x4[][]> _beltMatrices = new Dictionary<string, Matrix4x4[][]>(StringComparer.Ordinal);
private float _viewDistance;
//private float _maxDepth;
private float _minimapDistance;
@ -350,13 +350,13 @@ public class ZoneRenderer : MonoBehaviour
var meshes = AsteroidMeshes.ToList();
while (meshes.Count > Settings.AsteroidMeshCount)
meshes.RemoveAt(Random.Range(0, meshes.Count));
_beltMeshes[runtimeBelt.ID] = meshes.ToArray();
_beltMatrices[runtimeBelt.ID] = new Matrix4x4[meshes.Count][];
_beltMeshes[runtimeBelt.BodyKey] = meshes.ToArray();
_beltMatrices[runtimeBelt.BodyKey] = new Matrix4x4[meshes.Count][];
var count = runtimeBelt.AsteroidCount / meshes.Count;
var remainder = runtimeBelt.AsteroidCount - count * meshes.Count;
for (int i = 0; i < meshes.Count; i++)
{
_beltMatrices[runtimeBelt.ID][i] = new Matrix4x4[i < meshes.Count - 1 ? count : count + remainder];
_beltMatrices[runtimeBelt.BodyKey][i] = new Matrix4x4[i < meshes.Count - 1 ? count : count + remainder];
}
var beltObject = Instantiate(AsteroidBeltUI, ZoneRoot);
@ -368,7 +368,7 @@ public class ZoneRenderer : MonoBehaviour
AsteroidSpritesheetWidth,
AsteroidSpritesheetHeight,
Settings.MinimapAsteroidSize);
_beltObjects[runtimeBelt.ID] = belt;
_beltObjects[runtimeBelt.BodyKey] = belt;
LODHandler.FindPlanets();
}
@ -415,7 +415,7 @@ public class ZoneRenderer : MonoBehaviour
planet.Icon.transform.localScale = Settings.IconSize.Evaluate(planetInstance.Mass) * Vector3.one;
Planets[planetInstance.ID] = planet;
Planets[planetInstance.BodyKey] = planet;
if (!_rootFound)
{
_rootFound = true;