| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- using Content.Shared.Damage;
- using Content.Shared.Projectiles;
- using Content.Shared.Weapons.Melee.Events;
- using Content.Shared.Whitelist;
- using Robust.Shared.Audio;
- using Robust.Shared.Audio.Systems;
- using Robust.Shared.Network;
- using Robust.Shared.Physics.Events;
- using Robust.Shared.Timing;
- namespace Content.Shared.Weapons.Marker;
- public abstract class SharedDamageMarkerSystem : EntitySystem
- {
- [Dependency] private readonly IGameTiming _timing = default!;
- [Dependency] private readonly INetManager _netManager = default!;
- [Dependency] private readonly SharedAudioSystem _audio = default!;
- [Dependency] private readonly DamageableSystem _damageable = default!;
- [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!;
- public override void Initialize()
- {
- base.Initialize();
- SubscribeLocalEvent<DamageMarkerOnCollideComponent, StartCollideEvent>(OnMarkerCollide);
- SubscribeLocalEvent<DamageMarkerComponent, AttackedEvent>(OnMarkerAttacked);
- }
- private void OnMarkerAttacked(EntityUid uid, DamageMarkerComponent component, AttackedEvent args)
- {
- if (component.Marker != args.Used)
- return;
- args.BonusDamage += component.Damage;
- RemCompDeferred<DamageMarkerComponent>(uid);
- _audio.PlayPredicted(component.Sound, uid, args.User);
- if (TryComp<LeechOnMarkerComponent>(args.Used, out var leech))
- {
- _damageable.TryChangeDamage(args.User, leech.Leech, true, false, origin: args.Used);
- }
- }
- public override void Update(float frameTime)
- {
- base.Update(frameTime);
- var query = EntityQueryEnumerator<DamageMarkerComponent>();
- while (query.MoveNext(out var uid, out var comp))
- {
- if (comp.EndTime > _timing.CurTime)
- continue;
- RemCompDeferred<DamageMarkerComponent>(uid);
- }
- }
- private void OnMarkerCollide(EntityUid uid, DamageMarkerOnCollideComponent component, ref StartCollideEvent args)
- {
- if (!args.OtherFixture.Hard ||
- args.OurFixtureId != SharedProjectileSystem.ProjectileFixture ||
- component.Amount <= 0 ||
- _whitelistSystem.IsWhitelistFail(component.Whitelist, args.OtherEntity) ||
- !TryComp<ProjectileComponent>(uid, out var projectile) ||
- projectile.Weapon == null)
- {
- return;
- }
- // Markers are exclusive, deal with it.
- var marker = EnsureComp<DamageMarkerComponent>(args.OtherEntity);
- marker.Damage = new DamageSpecifier(component.Damage);
- marker.Marker = projectile.Weapon.Value;
- marker.EndTime = _timing.CurTime + component.Duration;
- component.Amount--;
- Dirty(args.OtherEntity, marker);
- if (_netManager.IsServer)
- {
- if (component.Amount <= 0)
- {
- QueueDel(uid);
- }
- else
- {
- Dirty(uid, component);
- }
- }
- }
- }
|