Major Tesla tweaks (#23235)

* add ignore chance

* twekas

* add damaging and repairing

* grounding rod undestructable by tesla
This commit is contained in:
Ed
2024-01-01 10:33:48 +03:00
committed by GitHub
parent 2b01899d63
commit 5e1fcfc63e
14 changed files with 135 additions and 25 deletions

View File

@@ -1,5 +1,6 @@
using Content.Server.Tesla.EntitySystems;
using Content.Shared.Explosion;
using Content.Shared.FixedPoint;
using Robust.Shared.Prototypes;
namespace Content.Server.Lightning.Components;
@@ -11,6 +12,12 @@ namespace Content.Server.Lightning.Components;
[RegisterComponent, Access(typeof(LightningSystem), typeof(LightningTargetSystem))]
public sealed partial class LightningTargetComponent : Component
{
/// <summary>
/// The probability that this target will not be ignored by a lightning strike. This is necessary for Tesla's balance.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
public float HitProbability = 1f;
/// <summary>
/// Priority level for selecting a lightning target.
/// </summary>
@@ -56,4 +63,10 @@ public sealed partial class LightningTargetComponent : Component
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
public float MaxTileIntensity = 5f;
/// <summary>
/// how much structural damage the object takes from a lightning strike
/// </summary>
[DataField]
public FixedPoint2 DamageFromLightning = 1;
}

View File

@@ -75,16 +75,26 @@ public sealed class LightningSystem : SharedLightningSystem
var targets = _lookup.GetComponentsInRange<LightningTargetComponent>(Transform(user).MapPosition, range).ToList();
_random.Shuffle(targets);
targets.Sort((x, y) => y.Priority.CompareTo(x.Priority));
var realCount = Math.Min(targets.Count, boltCount);
if (realCount <= 0)
return;
for (int i = 0; i < realCount; i++)
//var realCount = Math.Min(targets.Count, boltCount);
int shootedCount = 0;
int count = -1;
while(shootedCount < boltCount)
{
ShootLightning(user, targets[i].Owner, lightningPrototype);
if (arcDepth > 0)
count++;
if (count >= targets.Count) { break; }
var curTarget = targets[count];
if (!_random.Prob(curTarget.HitProbability)) //Chance to ignore target
continue;
ShootLightning(user, targets[count].Owner, lightningPrototype);
if (arcDepth - targets[count].LightningResistance > 0)
{
ShootRandomLightnings(targets[i].Owner, range, 1, lightningPrototype, arcDepth - targets[i].LightningResistance);
ShootRandomLightnings(targets[count].Owner, range, 1, lightningPrototype, arcDepth - targets[count].LightningResistance);
}
shootedCount++;
}
}
}

View File

@@ -1,6 +1,7 @@
using Content.Server.Explosion.EntitySystems;
using Content.Server.Lightning;
using Content.Server.Lightning.Components;
using Content.Shared.Damage;
namespace Content.Server.Tesla.EntitySystems;
@@ -9,6 +10,7 @@ namespace Content.Server.Tesla.EntitySystems;
/// </summary>
public sealed class LightningTargetSystem : EntitySystem
{
[Dependency] private readonly DamageableSystem _damageable = default!;
[Dependency] private readonly ExplosionSystem _explosionSystem = default!;
public override void Initialize()
@@ -20,15 +22,18 @@ public sealed class LightningTargetSystem : EntitySystem
private void OnHitByLightning(Entity<LightningTargetComponent> uid, ref HitByLightningEvent args)
{
DamageSpecifier damage = new();
damage.DamageDict.Add("Structural", uid.Comp.DamageFromLightning);
_damageable.TryChangeDamage(uid, damage, true);
if (!uid.Comp.LightningExplode)
return;
_explosionSystem.QueueExplosion(
Transform(uid).MapPosition,
uid.Comp.ExplosionPrototype,
uid.Comp.TotalIntensity, uid.Comp.Dropoff,
uid.Comp.MaxTileIntensity,
canCreateVacuum: false);
if (uid.Comp.LightningExplode)
{
_explosionSystem.QueueExplosion(
Transform(uid).MapPosition,
uid.Comp.ExplosionPrototype,
uid.Comp.TotalIntensity, uid.Comp.Dropoff,
uid.Comp.MaxTileIntensity,
canCreateVacuum: false);
}
}
}

View File

@@ -1,6 +1,4 @@
using Content.Server.Tesla.EntitySystems;
using Robust.Shared.Audio;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
namespace Content.Server.Tesla.Components;

View File

@@ -1,9 +1,7 @@
using Content.Server.Popups;
using Content.Server.Power.Components;
using Content.Server.Power.EntitySystems;
using Content.Server.Tesla.Components;
using Content.Server.Lightning;
using Robust.Shared.Timing;
namespace Content.Server.Tesla.EntitySystems;
@@ -24,9 +22,9 @@ public sealed class TeslaCoilSystem : EntitySystem
//When struck by lightning, charge the internal battery
private void OnHitByLightning(Entity<TeslaCoilComponent> coil, ref HitByLightningEvent args)
{
if (!TryComp<BatteryComponent>(coil, out var batteryComponent))
return;
_battery.SetCharge(coil, batteryComponent.CurrentCharge + coil.Comp.ChargeFromLightning);
if (TryComp<BatteryComponent>(coil, out var batteryComponent))
{
_battery.SetCharge(coil, batteryComponent.CurrentCharge + coil.Comp.ChargeFromLightning);
}
}
}