6
2026-01-24 12:49:55 +03:00

94 lines
3.3 KiB
C#

// SPDX-FileCopyrightText: 2025 ark1368
//
// SPDX-License-Identifier: AGPL-3.0-or-later
using Content.Server.Emp;
using Content.Server.Explosion.EntitySystems;
using Content.Server.Power.Components;
using Content.Server.Station.Systems;
using Content.Shared._Crescent.ShipShields;
using Content.Shared.Examine;
using Content.Shared.Explosion.Components;
using Content.Shared.Projectiles;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Physics.Components;
namespace Content.Server._Crescent.ShipShields;
public partial class ShipShieldsSystem
{
private const float MAX_EMP_DAMAGE = 10000f;
[Dependency] private readonly TriggerSystem _trigger = default!;
[Dependency] private readonly StationSystem _station = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
public void InitializeEmitters()
{
SubscribeLocalEvent<ShipShieldEmitterComponent, ShieldDeflectedEvent>(OnShieldDeflected);
SubscribeLocalEvent<ShipShieldEmitterComponent, ExaminedEvent>(OnExamined);
SubscribeLocalEvent<ShipShieldEmitterComponent, ComponentRemove>(OnRemoved);
}
private void OnRemoved(Entity<ShipShieldEmitterComponent> owner,ref ComponentRemove remove)
{
var parent = Transform(owner.Owner).GridUid;
if (parent is null)
return;
UnshieldEntity(parent.Value, null);
}
private void OnShieldDeflected(EntityUid uid, ShipShieldEmitterComponent component, ShieldDeflectedEvent args)
{
if (TryComp<EmpOnTriggerComponent>(args.Deflected, out var emp))
{
component.Damage += Math.Clamp(emp.EnergyConsumption, 0f, MAX_EMP_DAMAGE);
_trigger.Trigger(args.Deflected);
}
if (TryComp<ExplosiveComponent>(args.Deflected, out var exp))
{
component.Damage += exp.TotalIntensity;
}
if (TryComp<ProjectileComponent>(args.Deflected, out var proj))
{
component.Damage += (float) proj.Damage.GetTotal();
proj.ProjectileSpent = true;
}
else if (TryComp<PhysicsComponent>(args.Deflected, out var phys))
{
component.Damage += phys.FixturesMass;
}
QueueDel(args.Deflected);
}
private void OnExamined(EntityUid uid, ShipShieldEmitterComponent component, ExaminedEvent args)
{
if (!args.IsInDetailsRange)
return;
if (component.Damage == 0f)
{
args.PushMarkup(Loc.GetString("shield-emitter-examine-undamaged"));
return;
}
var additionalLoad = (float) Math.Clamp(Math.Pow(component.Damage, component.DamageExp), 0f, component.MaxDraw);
var ratio = additionalLoad / component.BaseDraw;
ratio = (float) Math.Ceiling(ratio * 100);
args.PushMarkup(Loc.GetString("shield-emitter-examine-damaged", ("percent", ratio)));
}
private void AdjustEmitterLoad(EntityUid uid, ShipShieldEmitterComponent? emitter = null, ApcPowerReceiverComponent? receiver = null)
{
if (!Resolve(uid, ref emitter, ref receiver))
return;
/// Raise damage to the power of the growth exponent
var additionalLoad = (float) Math.Clamp(Math.Pow(emitter.Damage, emitter.DamageExp), 0f, emitter.MaxDraw);
receiver.Load = emitter.BaseDraw + additionalLoad;
}
}