Aetheria/Assets/Scripts/ServerShared/Behaviors/MiningTool.cs
2026-06-15 17:54:59 +01:00

82 lines
2.4 KiB
C#

/* 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;
using System.Linq;
using Unity.Mathematics;
using static Unity.Mathematics.math;
[Inspectable, Order(10)]
public class MiningToolConfig : RuntimeBehaviorConfig
{
[Inspectable]
public PerformanceStat DamagePerSecond = new PerformanceStat();
[Inspectable]
public PerformanceStat Efficiency = new PerformanceStat();
[Inspectable]
public PerformanceStat Penetration = new PerformanceStat();
[Inspectable]
public PerformanceStat Range = new PerformanceStat();
public override Behavior CreateInstance(EquippedItem item)
{
return new MiningTool(this, item);
}
public override Behavior CreateInstance(ConsumableItemEffect item)
{
return new MiningTool(this, item);
}
}
public class MiningTool : Behavior
{
public Guid AsteroidBelt;
public int Asteroid;
private readonly PerformanceStat _damagePerSecond;
private readonly PerformanceStat _efficiency;
private readonly PerformanceStat _penetration;
private readonly PerformanceStat _range;
public float Range { get; private set; }
public MiningTool(MiningToolConfig data, EquippedItem item) : base(data, item)
{
_damagePerSecond = data.DamagePerSecond;
_efficiency = data.Efficiency;
_penetration = data.Penetration;
_range = data.Range;
}
public MiningTool(MiningToolConfig data, ConsumableItemEffect item) : base(data, item)
{
_damagePerSecond = data.DamagePerSecond;
_efficiency = data.Efficiency;
_penetration = data.Penetration;
_range = data.Range;
}
public override bool Execute(float dt)
{
Range = Evaluate(_range);
var belt = Entity.Zone.AsteroidBelts[AsteroidBelt];
if (AsteroidBelt != Guid.Empty &&
Entity.Zone.AsteroidExists(AsteroidBelt, Asteroid) &&
length(Entity.Position.xz - belt.Transforms[Asteroid].xy) - belt.Transforms[Asteroid].w < Range)
{
Entity.Zone.MineAsteroid(
Entity,
AsteroidBelt,
Asteroid,
Evaluate(_damagePerSecond) * dt,
Evaluate(_efficiency),
Evaluate(_penetration));
return true;
}
return false;
}
}