Make throwable star damage stamina (#23527)

* feat(star.yml): make throwable star damage stamina

* feat(Components): add new StaminaTresholdDamageOnEmbedComponent

* feat(SharedProjectileSystem): update system with new events to change
stamins treshold on embeed projectile remove / add

* feat(StaminaSystem): update system with new subscriptions

* feat(throwing_stars): update yml with new component

* feat(StaminaDamageOnEmbed): add stamina damage on embeed

* cleanup unused / ajust numbers

* fix(StaminaSystem / OnEmbedComponent ) apply requested changes

* Rest of the review

* another warning

---------

Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
This commit is contained in:
Dakamakat
2024-01-14 12:10:50 +03:00
committed by GitHub
parent d1d11d09c7
commit b80f7eed6e
6 changed files with 58 additions and 11 deletions

View File

@@ -0,0 +1,17 @@
using Content.Shared.Damage.Systems;
using Robust.Shared.GameStates;
namespace Content.Shared.Damage.Components;
/// <summary>
/// Applies stamina damage when embeds in an entity.
/// </summary>
[RegisterComponent]
[NetworkedComponent]
[AutoGenerateComponentState]
[Access(typeof(StaminaSystem))]
public sealed partial class StaminaDamageOnEmbedComponent : Component
{
[ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
public float Damage = 10f;
}

View File

@@ -55,8 +55,11 @@ public sealed partial class StaminaSystem : EntitySystem
SubscribeLocalEvent<StaminaComponent, DisarmedEvent>(OnDisarmed); SubscribeLocalEvent<StaminaComponent, DisarmedEvent>(OnDisarmed);
SubscribeLocalEvent<StaminaComponent, RejuvenateEvent>(OnRejuvenate); SubscribeLocalEvent<StaminaComponent, RejuvenateEvent>(OnRejuvenate);
SubscribeLocalEvent<StaminaDamageOnEmbedComponent, EmbedEvent>(OnProjectileEmbed);
SubscribeLocalEvent<StaminaDamageOnCollideComponent, ProjectileHitEvent>(OnProjectileHit); SubscribeLocalEvent<StaminaDamageOnCollideComponent, ProjectileHitEvent>(OnProjectileHit);
SubscribeLocalEvent<StaminaDamageOnCollideComponent, ThrowDoHitEvent>(OnThrowHit); SubscribeLocalEvent<StaminaDamageOnCollideComponent, ThrowDoHitEvent>(OnThrowHit);
SubscribeLocalEvent<StaminaDamageOnHitComponent, MeleeHitEvent>(OnMeleeHit); SubscribeLocalEvent<StaminaDamageOnHitComponent, MeleeHitEvent>(OnMeleeHit);
} }
@@ -114,7 +117,7 @@ public sealed partial class StaminaSystem : EntitySystem
component.StaminaDamage = 0; component.StaminaDamage = 0;
RemComp<ActiveStaminaComponent>(uid); RemComp<ActiveStaminaComponent>(uid);
SetStaminaAlert(uid, component); SetStaminaAlert(uid, component);
Dirty(component); Dirty(uid, component);
} }
private void OnDisarmed(EntityUid uid, StaminaComponent component, DisarmedEvent args) private void OnDisarmed(EntityUid uid, StaminaComponent component, DisarmedEvent args)
@@ -192,6 +195,14 @@ public sealed partial class StaminaSystem : EntitySystem
OnCollide(uid, component, args.Target); OnCollide(uid, component, args.Target);
} }
private void OnProjectileEmbed(EntityUid uid, StaminaDamageOnEmbedComponent component, ref EmbedEvent args)
{
if (!TryComp<StaminaComponent>(args.Embedded, out var stamina))
return;
TakeStaminaDamage(args.Embedded, component.Damage, stamina, source: uid);
}
private void OnThrowHit(EntityUid uid, StaminaDamageOnCollideComponent component, ThrowDoHitEvent args) private void OnThrowHit(EntityUid uid, StaminaDamageOnCollideComponent component, ThrowDoHitEvent args)
{ {
OnCollide(uid, component, args.Target); OnCollide(uid, component, args.Target);

View File

@@ -0,0 +1,15 @@
namespace Content.Shared.Projectiles;
/// <summary>
/// Raised directed on an entity when it embeds in another entity.
/// </summary>
[ByRefEvent]
public readonly record struct EmbedEvent(EntityUid? Shooter, EntityUid Embedded)
{
public readonly EntityUid? Shooter = Shooter;
/// <summary>
/// Entity that is embedded in.
/// </summary>
public readonly EntityUid Embedded = Embedded;
}

View File

@@ -4,4 +4,4 @@ namespace Content.Shared.Projectiles;
/// Raised directed on an entity when it embeds into something. /// Raised directed on an entity when it embeds into something.
/// </summary> /// </summary>
[ByRefEvent] [ByRefEvent]
public readonly record struct ProjectileEmbedEvent(EntityUid Shooter, EntityUid Weapon, EntityUid Embedded); public readonly record struct ProjectileEmbedEvent(EntityUid? Shooter, EntityUid Weapon, EntityUid Embedded);

View File

@@ -96,22 +96,22 @@ public abstract partial class SharedProjectileSystem : EntitySystem
if (!component.EmbedOnThrow) if (!component.EmbedOnThrow)
return; return;
Embed(uid, args.Target, component); Embed(uid, args.Target, null, component);
} }
private void OnEmbedProjectileHit(EntityUid uid, EmbeddableProjectileComponent component, ref ProjectileHitEvent args) private void OnEmbedProjectileHit(EntityUid uid, EmbeddableProjectileComponent component, ref ProjectileHitEvent args)
{ {
Embed(uid, args.Target, component); Embed(uid, args.Target, args.Shooter, component);
// Raise a specific event for projectiles. // Raise a specific event for projectiles.
if (TryComp<ProjectileComponent>(uid, out var projectile)) if (TryComp(uid, out ProjectileComponent? projectile))
{ {
var ev = new ProjectileEmbedEvent(projectile.Shooter!.Value, projectile.Weapon!.Value, args.Target); var ev = new ProjectileEmbedEvent(projectile.Shooter!.Value, projectile.Weapon!.Value, args.Target);
RaiseLocalEvent(uid, ref ev); RaiseLocalEvent(uid, ref ev);
} }
} }
private void Embed(EntityUid uid, EntityUid target, EmbeddableProjectileComponent component) private void Embed(EntityUid uid, EntityUid target, EntityUid? user, EmbeddableProjectileComponent component)
{ {
TryComp<PhysicsComponent>(uid, out var physics); TryComp<PhysicsComponent>(uid, out var physics);
_physics.SetLinearVelocity(uid, Vector2.Zero, body: physics); _physics.SetLinearVelocity(uid, Vector2.Zero, body: physics);
@@ -121,13 +121,13 @@ public abstract partial class SharedProjectileSystem : EntitySystem
if (component.Offset != Vector2.Zero) if (component.Offset != Vector2.Zero)
{ {
_transform.SetLocalPosition(xform, xform.LocalPosition + xform.LocalRotation.RotateVec(component.Offset)); _transform.SetLocalPosition(uid, xform.LocalPosition + xform.LocalRotation.RotateVec(component.Offset),
xform);
} }
if (component.Sound != null) _audio.PlayPredicted(component.Sound, uid, null);
{ var ev = new EmbedEvent(user, target);
_audio.PlayPredicted(component.Sound, uid, null); RaiseLocalEvent(uid, ref ev);
}
} }
private void PreventCollision(EntityUid uid, ProjectileComponent component, ref PreventCollideEvent args) private void PreventCollision(EntityUid uid, ProjectileComponent component, ref PreventCollideEvent args)

View File

@@ -36,6 +36,10 @@
types: types:
Slash: 8 Slash: 8
Piercing: 10 Piercing: 10
- type: StaminaDamageOnCollide
damage: 45
- type: StaminaDamageOnEmbed
damage: 10
- type: entity - type: entity
parent: ThrowingStar parent: ThrowingStar