GunSystem.Battery.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using Content.Server.Power.Components;
  2. using Content.Shared.Damage;
  3. using Content.Shared.Damage.Events;
  4. using Content.Shared.FixedPoint;
  5. using Content.Shared.Projectiles;
  6. using Content.Shared.Weapons.Ranged;
  7. using Content.Shared.Weapons.Ranged.Components;
  8. using Robust.Shared.Prototypes;
  9. namespace Content.Server.Weapons.Ranged.Systems;
  10. public sealed partial class GunSystem
  11. {
  12. protected override void InitializeBattery()
  13. {
  14. base.InitializeBattery();
  15. // Hitscan
  16. SubscribeLocalEvent<HitscanBatteryAmmoProviderComponent, ComponentStartup>(OnBatteryStartup);
  17. SubscribeLocalEvent<HitscanBatteryAmmoProviderComponent, ChargeChangedEvent>(OnBatteryChargeChange);
  18. SubscribeLocalEvent<HitscanBatteryAmmoProviderComponent, DamageExamineEvent>(OnBatteryDamageExamine);
  19. // Projectile
  20. SubscribeLocalEvent<ProjectileBatteryAmmoProviderComponent, ComponentStartup>(OnBatteryStartup);
  21. SubscribeLocalEvent<ProjectileBatteryAmmoProviderComponent, ChargeChangedEvent>(OnBatteryChargeChange);
  22. SubscribeLocalEvent<ProjectileBatteryAmmoProviderComponent, DamageExamineEvent>(OnBatteryDamageExamine);
  23. }
  24. private void OnBatteryStartup(EntityUid uid, BatteryAmmoProviderComponent component, ComponentStartup args)
  25. {
  26. UpdateShots(uid, component);
  27. }
  28. private void OnBatteryChargeChange(EntityUid uid, BatteryAmmoProviderComponent component, ref ChargeChangedEvent args)
  29. {
  30. UpdateShots(uid, component, args.Charge, args.MaxCharge);
  31. }
  32. private void UpdateShots(EntityUid uid, BatteryAmmoProviderComponent component)
  33. {
  34. if (!TryComp<BatteryComponent>(uid, out var battery))
  35. return;
  36. UpdateShots(uid, component, battery.CurrentCharge, battery.MaxCharge);
  37. }
  38. private void UpdateShots(EntityUid uid, BatteryAmmoProviderComponent component, float charge, float maxCharge)
  39. {
  40. var shots = (int) (charge / component.FireCost);
  41. var maxShots = (int) (maxCharge / component.FireCost);
  42. if (component.Shots != shots || component.Capacity != maxShots)
  43. {
  44. Dirty(uid, component);
  45. }
  46. component.Shots = shots;
  47. component.Capacity = maxShots;
  48. UpdateBatteryAppearance(uid, component);
  49. }
  50. private void OnBatteryDamageExamine(EntityUid uid, BatteryAmmoProviderComponent component, ref DamageExamineEvent args)
  51. {
  52. var damageSpec = GetDamage(component);
  53. if (damageSpec == null)
  54. return;
  55. var damageType = component switch
  56. {
  57. HitscanBatteryAmmoProviderComponent => Loc.GetString("damage-hitscan"),
  58. ProjectileBatteryAmmoProviderComponent => Loc.GetString("damage-projectile"),
  59. _ => throw new ArgumentOutOfRangeException(),
  60. };
  61. _damageExamine.AddDamageExamine(args.Message, Damageable.ApplyUniversalAllModifiers(damageSpec), damageType);
  62. }
  63. private DamageSpecifier? GetDamage(BatteryAmmoProviderComponent component)
  64. {
  65. if (component is ProjectileBatteryAmmoProviderComponent battery)
  66. {
  67. if (ProtoManager.Index<EntityPrototype>(battery.Prototype).Components
  68. .TryGetValue(_factory.GetComponentName(typeof(ProjectileComponent)), out var projectile))
  69. {
  70. var p = (ProjectileComponent) projectile.Component;
  71. if (!p.Damage.Empty)
  72. {
  73. return p.Damage * Damageable.UniversalProjectileDamageModifier;
  74. }
  75. }
  76. return null;
  77. }
  78. if (component is HitscanBatteryAmmoProviderComponent hitscan)
  79. {
  80. var dmg = ProtoManager.Index<HitscanPrototype>(hitscan.Prototype).Damage;
  81. return dmg == null ? dmg : dmg * Damageable.UniversalHitscanDamageModifier;
  82. }
  83. return null;
  84. }
  85. protected override void TakeCharge(EntityUid uid, BatteryAmmoProviderComponent component)
  86. {
  87. // Will raise ChargeChangedEvent
  88. _battery.UseCharge(uid, component.FireCost);
  89. }
  90. }