Hot potato on fire (#16017)
This commit is contained in:
33
Content.Shared/Damage/Components/DamageOnHoldingComponent.cs
Normal file
33
Content.Shared/Damage/Components/DamageOnHoldingComponent.cs
Normal 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;
|
||||
}
|
||||
53
Content.Shared/Damage/Systems/DamageOnHoldingSystem.cs
Normal file
53
Content.Shared/Damage/Systems/DamageOnHoldingSystem.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user