From 397f3aff5a349ba02f488c541036ccf6d97c0bea Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Tue, 16 Jun 2026 16:48:00 +0100 Subject: [PATCH] Key zone runtime collections on typed state keys --- .voidbot/state/aetheria.cc | Bin 183368 -> 185404 bytes Aetheria.State.Verify/Program.cs | 126 ++++++++++++++++--- Assets/Scripts/Gameplay/ActionGameManager.cs | 14 +-- Assets/Scripts/ServerShared/Zone.cs | 99 ++++++--------- Assets/Scripts/Zone Display/ZoneRenderer.cs | 18 +-- 5 files changed, 164 insertions(+), 93 deletions(-) diff --git a/.voidbot/state/aetheria.cc b/.voidbot/state/aetheria.cc index 64a272164c5e18e7423c66249c204b9fb5721efd..1c61547d4b99f4009e2d58dcb6bf26dfe5c75a35 100644 GIT binary patch delta 1807 zcmZuy-D@0G6lcd!t(9sdDHauPo>bV`e3-AU5Wxm&RE#D;B`@~woijVv%*-9{$EH(| zMT&@2#dO6H`XKn377G2>loG&&=E*Z{qrIPUz$|&1bimq7?{Qi z%GY@YL2-7=Tkqc4#3WKC5wV?OmxyO17271{9Z*E1#O0G!+2Z;I$O%mY@~jAQ`y6mr zlS+=MfPZLVe;Q;X0+N|l%o#ajc;IhA4#A*NLNi6Egf3}g|2mQQ4M>oLQ5;s05YZxn zvP<2y6t+KRDiIqyhb^Y?of#yi195JlzKlgvT|sSp&0@-vgC8uK6wYbF1agBJB;jpI zb=THWKoi0hLE4Dr43ko&rE!x@@+3pPNlTbCpfazM7BFfQ5X;=@Lz&A|Q=&AFW1K=d zLhR(E!W|+(9Y8iCVcL;nmvk%Usll-1I=4V9`Hru~?pp@1q(~1wcn*UhwG7!3P>Oa5laMQ8DIc;)TCsslB1)7W-7>Z?z=)+l=$hJrMZipC%v)m=O~QksR7c; z2{Rg>+x^*`8j~%wFBx)9_5X`MP@Q0NG!AAV`w|ep6oFy3YH9LHNGG`;3$bO;;s`x3 z87=|UU?oL;0yqb%aTRGq!Pg*Ez25PspC~4O^zJJbPu0e|UAL0|Dtl;s?cVh5VTVJb zS`^hjT2d?b*U2{5(QrcsP8@8IQTE$^?o4m$@*};|k54!-tE+3(W@a%;s-0>rh*8%5 zrj}l{P$~=@^#+Q@4@o7jV+C#1^FLm4h1b_tEQhXKAlR10!DxaalZrdH=^bnA@@(iM zuzM=q237r(ks)QEiqV_i`0+*u-4W)^Kxo8U{PBi&qImuN+5^2$mri)EY!v&qYh%Sr zP4DjF?9bkj*Ju#f-ouS@%TuX2q@A=4l|kdemlDE*iL!@D(V%{dY8E9Tfac89%)CD} z?@!P7c9tG4{Vo^)+oMz-W$7req(yBS>745 zi<`yhE$`%u!}qT=ZL3eNNytRAI`D7y&oo?;rqXCQ-yIC!*@3ES;Ho>y?P09myK$+u zcjJ=R@sAG57Nh&#$?_JOo0_q=P_cE(`(+SXD6gs`#p=E%s_^ub%e=Giy;Fr|Txjp@ MU%maKgV@~W-)NSTkN^Mx delta 223 zcmdn9g8Re_?hVVBxQvag3=Q=xEDWM1GKx-*Kf%N{`7~22OxO}EJUO4a3NB&{QaG7| zMP7Cfck9~X`R!#+Ahx`9&omsYSW7nq647yRa}8^tG>;#khUNET%GD zPN-ex=94clOM(qF(lanJgxS0wCS(S)m2JB7Nv3?5u(>H%<;9asjW8h#u;%TBr zoneSource.Contains(symbol, StringComparison.Ordinal)) @@ -1237,20 +1240,28 @@ static void RequireNativeZoneKeyResolution(string root) var requiredSymbols = new[] { - "private readonly Dictionary _planetsByBodyKey = new Dictionary(StringComparer.Ordinal);", - "private readonly Dictionary _asteroidBeltsByBodyKey = new Dictionary(StringComparer.Ordinal);", - "private readonly Dictionary _orbitsByKey = new Dictionary(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 PlanetInstances = new Dictionary(StringComparer.Ordinal);", + "public Dictionary Orbits = new Dictionary(StringComparer.Ordinal);", + "public Dictionary AsteroidBelts = new Dictionary(StringComparer.Ordinal);", + "private readonly Dictionary _planetsById = new Dictionary();", + "private readonly Dictionary _asteroidBeltsById = new Dictionary();", + "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 PlanetInstances", + "public Dictionary Orbits", + "public Dictionary AsteroidBelts", + "private HashSet _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 Planets", + "private Dictionary _beltObjects", + "private Dictionary _beltMeshes", + "private Dictionary _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 PlanetInstances = new Dictionary(StringComparer.Ordinal);", + "public Dictionary Orbits = new Dictionary(StringComparer.Ordinal);", + "public Dictionary AsteroidBelts = new Dictionary(StringComparer.Ordinal);", + "private HashSet _updatedOrbits = new HashSet(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 Planets = new Dictionary(StringComparer.Ordinal);", + "private Dictionary _beltObjects = new Dictionary(StringComparer.Ordinal);", + "private Dictionary _beltMeshes = new Dictionary(StringComparer.Ordinal);", + "private Dictionary _beltMatrices = new Dictionary(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"); diff --git a/Assets/Scripts/Gameplay/ActionGameManager.cs b/Assets/Scripts/Gameplay/ActionGameManager.cs index 13a5f2dd7..0cf9629ac 100644 --- a/Assets/Scripts/Gameplay/ActionGameManager.cs +++ b/Assets/Scripts/Gameplay/ActionGameManager.cs @@ -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().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; diff --git a/Assets/Scripts/ServerShared/Zone.cs b/Assets/Scripts/ServerShared/Zone.cs index ee59cce19..1a65b9475 100644 --- a/Assets/Scripts/ServerShared/Zone.cs +++ b/Assets/Scripts/ServerShared/Zone.cs @@ -21,17 +21,16 @@ public class Zone public Action Log; public ReactiveCollection Entities = new ReactiveCollection(); - public Dictionary PlanetInstances = new Dictionary(); + public Dictionary PlanetInstances = new Dictionary(StringComparer.Ordinal); - public Dictionary Orbits = new Dictionary(); - public Dictionary AsteroidBelts = new Dictionary(); + public Dictionary Orbits = new Dictionary(StringComparer.Ordinal); + public Dictionary AsteroidBelts = new Dictionary(StringComparer.Ordinal); public PlanetSettings Settings; - private readonly Dictionary _planetsByBodyKey = new Dictionary(StringComparer.Ordinal); - private readonly Dictionary _asteroidBeltsByBodyKey = new Dictionary(StringComparer.Ordinal); - private readonly Dictionary _orbitsByKey = new Dictionary(StringComparer.Ordinal); - - private HashSet _updatedOrbits = new HashSet(); + private readonly Dictionary _planetsById = new Dictionary(); + private readonly Dictionary _asteroidBeltsById = new Dictionary(); + + private HashSet _updatedOrbits = new HashSet(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; diff --git a/Assets/Scripts/Zone Display/ZoneRenderer.cs b/Assets/Scripts/Zone Display/ZoneRenderer.cs index 8100928a4..d4cbc66e1 100644 --- a/Assets/Scripts/Zone Display/ZoneRenderer.cs +++ b/Assets/Scripts/Zone Display/ZoneRenderer.cs @@ -66,11 +66,11 @@ public class ZoneRenderer : MonoBehaviour public Sprite WormholeIcon; [HideInInspector] public Dictionary EntityInstances = new Dictionary(); - [HideInInspector] public Dictionary Planets = new Dictionary(); + [HideInInspector] public Dictionary Planets = new Dictionary(StringComparer.Ordinal); - private Dictionary _beltObjects = new Dictionary(); - private Dictionary _beltMeshes = new Dictionary(); - private Dictionary _beltMatrices = new Dictionary(); + private Dictionary _beltObjects = new Dictionary(StringComparer.Ordinal); + private Dictionary _beltMeshes = new Dictionary(StringComparer.Ordinal); + private Dictionary _beltMatrices = new Dictionary(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;