Keep behavior body targets on typed keys

This commit is contained in:
Meta Vens 2026-06-16 15:08:00 +01:00
commit 65456f09cd
8 changed files with 116 additions and 45 deletions

View file

@ -9,7 +9,7 @@ using static Unity.Mathematics.math;
public class MiningTool : Behavior
{
public Guid AsteroidBelt;
public string AsteroidBeltBodyKey = "";
public int Asteroid;
private readonly PerformanceStat _damagePerSecond;
@ -45,14 +45,14 @@ public class MiningTool : Behavior
public override bool Execute(float dt)
{
Range = Evaluate(_range);
var belt = Entity.Zone.AsteroidBelts[AsteroidBelt];
if (AsteroidBelt != Guid.Empty &&
Entity.Zone.AsteroidExists(AsteroidBelt, Asteroid) &&
if (Entity.Zone.TryGetAsteroidBelt(AsteroidBeltBodyKey, out var belt) &&
!string.IsNullOrWhiteSpace(AsteroidBeltBodyKey) &&
Entity.Zone.AsteroidExists(AsteroidBeltBodyKey, Asteroid) &&
length(Entity.Position.xz - belt.Transforms[Asteroid].xy) - belt.Transforms[Asteroid].w < Range)
{
Entity.Zone.MineAsteroid(
Entity,
AsteroidBelt,
AsteroidBeltBodyKey,
Asteroid,
Evaluate(_damagePerSecond) * dt,
Evaluate(_efficiency),
@ -63,9 +63,9 @@ public class MiningTool : Behavior
return false;
}
public void RestoreRuntimeState(Guid asteroidBelt, int asteroid, float range)
public void RestoreRuntimeState(string asteroidBeltBodyKey, int asteroid, float range)
{
AsteroidBelt = asteroidBelt;
AsteroidBeltBodyKey = asteroidBeltBodyKey ?? "";
Asteroid = asteroid;
Range = range;
}

View file

@ -15,21 +15,22 @@ public class ResourceScanner : Behavior, IAlwaysUpdatedBehavior
private readonly PerformanceStat _minimumDensity;
private readonly PerformanceStat _scanDuration;
private float _scanTime;
private Guid _scanTarget;
private string _scanTargetBodyKey = "";
public float Range { get; private set; }
public float MinimumDensity { get; private set; }
public float ScanDuration { get; private set; }
public float ScanTime => _scanTime;
public Guid ScanTarget
public string ScanTargetBodyKey
{
get => _scanTarget;
get => _scanTargetBodyKey;
set
{
if (value != _scanTarget)
value ??= "";
if (!string.Equals(value, _scanTargetBodyKey, StringComparison.Ordinal))
{
_scanTarget = value;
_scanTargetBodyKey = value;
_scanTime = 0;
}
}
@ -57,7 +58,7 @@ public class ResourceScanner : Behavior, IAlwaysUpdatedBehavior
public override bool Execute(float dt)
{
if (Entity.Zone.AsteroidBelts.TryGetValue(ScanTarget, out var belt))
if (Entity.Zone.TryGetAsteroidBelt(ScanTargetBodyKey, out var belt))
{
if (Asteroid > -1 &&
belt.ContainsAsteroid(Asteroid) &&
@ -72,7 +73,7 @@ public class ResourceScanner : Behavior, IAlwaysUpdatedBehavior
return true;
}
}
else if (Entity.Zone.PlanetInstances.TryGetValue(ScanTarget, out var planet))
else if (Entity.Zone.TryGetPlanet(ScanTargetBodyKey, out var planet))
{
if(length(Entity.Position.xz - Entity.Zone.GetOrbitPosition(planet.OrbitId)) < Range)
{
@ -95,14 +96,14 @@ public class ResourceScanner : Behavior, IAlwaysUpdatedBehavior
}
public void RestoreRuntimeState(
Guid scanTarget,
string scanTargetBodyKey,
int asteroid,
float scanTime,
float range,
float minimumDensity,
float scanDuration)
{
_scanTarget = scanTarget;
_scanTargetBodyKey = scanTargetBodyKey ?? "";
Asteroid = asteroid;
_scanTime = scanTime;
Range = range;

View file

@ -126,6 +126,27 @@ public class Zone
return BodyKey(bodyId);
}
public static Guid ParseBodyGuid(string bodyKey)
{
if (string.IsNullOrWhiteSpace(bodyKey))
return Guid.Empty;
var runtimeBodyId = bodyKey.StartsWith(BodyKeyPrefix, StringComparison.OrdinalIgnoreCase)
? bodyKey.Substring(BodyKeyPrefix.Length)
: bodyKey;
return Guid.TryParse(runtimeBodyId, out var id) ? id : Guid.Empty;
}
public bool TryGetPlanet(string bodyKey, out Planet planet)
{
return PlanetInstances.TryGetValue(ParseBodyGuid(bodyKey), out planet);
}
public bool TryGetAsteroidBelt(string bodyKey, out AsteroidBelt belt)
{
return AsteroidBelts.TryGetValue(ParseBodyGuid(bodyKey), out belt);
}
public void Update(float deltaTime)
{
_time += deltaTime;
@ -220,6 +241,11 @@ public class Zone
public bool AsteroidExists(Guid planetDataID, int asteroid) => AsteroidBelts[planetDataID].ContainsAsteroid(asteroid);
public bool AsteroidExists(string asteroidBeltKey, int asteroid)
{
return TryGetAsteroidBelt(asteroidBeltKey, out var belt) && belt.ContainsAsteroid(asteroid);
}
private void UpdateAsteroidTransforms(Guid planetDataID)
{
var belt = AsteroidBelts[planetDataID];
@ -286,6 +312,12 @@ public class Zone
}
}
public void MineAsteroid(Entity miner, string asteroidBeltKey, int asteroid, float damage, float efficiency, float penetration)
{
if (TryGetAsteroidBelt(asteroidBeltKey, out var belt))
MineAsteroid(miner, belt.ID, asteroid, damage, efficiency, penetration);
}
public SecurityLevel GetSecurityLevel(float2 pos)
{
if (GalaxyZone.Owner==null) return SecurityLevel.Open;