Aetheria/Assets/Scripts/ServerShared/Behaviors/ResourceScanner.cs

110 lines
3.8 KiB
C#
Raw Normal View History

2026-06-13 04:56:50 +01:00
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
using System;
2026-06-21 09:37:54 +01:00
using static CultMath.math;
public class ResourceScanner : Behavior, IAlwaysUpdatedBehavior
{
public int Asteroid = -1;
2026-06-13 04:56:50 +01:00
private readonly PerformanceStat _range;
private readonly PerformanceStat _minimumDensity;
private readonly PerformanceStat _scanDuration;
private float _scanTime;
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 string ScanTargetBodyKey
{
get => _scanTargetBodyKey;
set
{
value ??= "";
if (!string.Equals(value, _scanTargetBodyKey, StringComparison.Ordinal))
{
_scanTargetBodyKey = value;
_scanTime = 0;
}
}
}
2026-06-15 19:20:06 +01:00
public ResourceScanner(RuntimeBehaviorDefinition definition, EquippedItem item) : base(definition, item)
{
2026-06-15 19:20:06 +01:00
_range = definition.PerformanceStat(1, new PerformanceStat());
_minimumDensity = definition.PerformanceStat(2, new PerformanceStat());
_scanDuration = definition.PerformanceStat(3, new PerformanceStat());
RegisterPerformanceStat(nameof(Range), _range);
RegisterPerformanceStat(nameof(MinimumDensity), _minimumDensity);
RegisterPerformanceStat(nameof(ScanDuration), _scanDuration);
}
2026-06-15 19:20:06 +01:00
public ResourceScanner(RuntimeBehaviorDefinition definition, ConsumableItemEffect item) : base(definition, item)
{
2026-06-15 19:20:06 +01:00
_range = definition.PerformanceStat(1, new PerformanceStat());
_minimumDensity = definition.PerformanceStat(2, new PerformanceStat());
_scanDuration = definition.PerformanceStat(3, new PerformanceStat());
RegisterPerformanceStat(nameof(Range), _range);
RegisterPerformanceStat(nameof(MinimumDensity), _minimumDensity);
RegisterPerformanceStat(nameof(ScanDuration), _scanDuration);
}
public override bool Execute(float dt)
{
if (Entity.Zone.TryGetAsteroidBelt(ScanTargetBodyKey, out var belt))
{
2026-06-21 09:37:54 +01:00
if (Entity.Zone.TryGetCultAsteroidTransform(ScanTargetBodyKey, Asteroid, out var asteroidPosition, out _) &&
length(Entity.CultPositionXZ - asteroidPosition) < Range)
{
2026-06-14 19:05:23 +01:00
_scanTime += dt;
if (_scanTime > ScanDuration)
{
2026-06-14 19:05:23 +01:00
// TODO: Implement Scanning!
_scanTime = 0;
}
2026-06-14 19:05:23 +01:00
return true;
}
2026-06-14 19:05:23 +01:00
}
else if (Entity.Zone.TryGetPlanet(ScanTargetBodyKey, out var planet))
2026-06-14 19:05:23 +01:00
{
2026-06-21 09:37:54 +01:00
if(length(Entity.CultPositionXZ - AetheriaMath.ToCult(Entity.Zone.GetOrbitPosition(planet.OrbitKey))) < Range)
{
2026-06-14 19:05:23 +01:00
_scanTime += dt;
if (_scanTime > ScanDuration)
{
2026-06-14 19:05:23 +01:00
_scanTime = 0;
}
2026-06-14 19:05:23 +01:00
return true;
}
}
return false;
}
public void Update(float delta)
{
Range = Evaluate(_range);
MinimumDensity = Evaluate(_minimumDensity);
ScanDuration = Evaluate(_scanDuration);
}
public void RestoreRuntimeState(
string scanTargetBodyKey,
int asteroid,
float scanTime,
float range,
float minimumDensity,
float scanDuration)
{
_scanTargetBodyKey = scanTargetBodyKey ?? "";
Asteroid = asteroid;
_scanTime = scanTime;
Range = range;
MinimumDensity = minimumDensity;
ScanDuration = scanDuration;
}
}