Hot potato on fire (#16017)

This commit is contained in:
Slava0135
2023-05-06 13:30:16 +03:00
committed by GitHub
parent 5980197546
commit 1e56271d39
5 changed files with 104 additions and 2 deletions

View File

@@ -0,0 +1,33 @@
using Content.Shared.Damage.Systems;
using Robust.Shared.GameStates;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
namespace Content.Shared.Damage.Components;
[RegisterComponent, NetworkedComponent]
[AutoGenerateComponentState]
[Access(typeof(DamageOnHoldingSystem))]
public sealed partial class DamageOnHoldingComponent : Component
{
[DataField("enabled"), ViewVariables(VVAccess.ReadWrite)]
[AutoNetworkedField]
public bool Enabled = true;
/// <summary>
/// Damage per interval dealt to entity holding the entity with this component
/// </summary>
[DataField("damage"), ViewVariables(VVAccess.ReadWrite)]
public DamageSpecifier Damage = new();
// TODO: make it networked
/// <summary>
/// Delay between damage events in seconds
/// </summary>
[DataField("interval"), ViewVariables(VVAccess.ReadWrite)]
[AutoNetworkedField]
public float Interval = 1f;
[DataField("nextDamage", customTypeSerializer: typeof(TimeOffsetSerializer)), ViewVariables(VVAccess.ReadWrite)]
[AutoNetworkedField]
public TimeSpan NextDamage = TimeSpan.Zero;
}

View File

@@ -0,0 +1,53 @@
using Content.Shared.Damage.Components;
using Robust.Shared.Containers;
using Robust.Shared.Timing;
namespace Content.Shared.Damage.Systems;
public sealed class DamageOnHoldingSystem : EntitySystem
{
[Dependency] private readonly SharedContainerSystem _container = default!;
[Dependency] private readonly DamageableSystem _damageableSystem = default!;
[Dependency] private readonly IGameTiming _timing = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<DamageOnHoldingComponent, EntityUnpausedEvent>(OnUnpaused);
SubscribeLocalEvent<DamageOnHoldingComponent, MapInitEvent>(OnMapInit);
}
public void SetEnabled(EntityUid uid, bool enabled, DamageOnHoldingComponent? component = null)
{
if (Resolve(uid, ref component))
{
component.Enabled = enabled;
component.NextDamage = _timing.CurTime;
}
}
private void OnUnpaused(EntityUid uid, DamageOnHoldingComponent component, ref EntityUnpausedEvent args)
{
component.NextDamage += args.PausedTime;
}
private void OnMapInit(EntityUid uid, DamageOnHoldingComponent component, MapInitEvent args)
{
component.NextDamage = _timing.CurTime;
}
public override void Update(float frameTime)
{
var query = EntityQueryEnumerator<DamageOnHoldingComponent>();
while (query.MoveNext(out var uid, out var component))
{
if (!component.Enabled || component.NextDamage > _timing.CurTime)
continue;
if (_container.TryGetContainingContainer(uid, out var container))
{
_damageableSystem.TryChangeDamage(container.Owner, component.Damage, origin: uid);
}
component.NextDamage = _timing.CurTime + TimeSpan.FromSeconds(component.Interval);
}
}
}

View File

@@ -3,7 +3,7 @@ using Robust.Shared.GameStates;
namespace Content.Shared.HotPotato;
/// <summary>
/// Similar to <see cref="Content.Shared.Interaction.Components.UnremoveableComponent"/>
/// Similar to <see cref="Interaction.Components.UnremoveableComponent"/>
/// except entities with this component can be removed in specific case: <see cref="CanTransfer"/>
/// </summary>
[RegisterComponent, NetworkedComponent]