Keep behavior body targets on typed keys
This commit is contained in:
parent
0471cb690f
commit
65456f09cd
8 changed files with 116 additions and 45 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue