Key zone runtime collections on typed state keys
This commit is contained in:
parent
43655ca96d
commit
397f3aff5a
5 changed files with 164 additions and 93 deletions
Binary file not shown.
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue