Files
Boutros Tawaifi 49464c56f6 Add an "On Ship Damage" script hook (#7894)
* Add an "On Ship Damage" script hook

Runs after resolved damage has been applied to a ship (lethal hits run before
the destruction callback). Hook variables: Target, Source, Attacker,
WeaponClass, WeaponSubtype, SourceKind (PROJECTILE, BEAM, SHOCKWAVE, COLLISION,
OTHER), DamageType, ShieldDamage, HullDamage, Quadrant, Ballistic, BeamWeapon
and LethalHit. Conditions can filter on the target ship. Nothing is computed
unless a script has registered the hook.

* Move the On Ship Damage hook call out of a lambda

ship_do_damage() now calls a file-level static function, ship_run_damage_hook(), that takes the values it needs as arguments instead of capturing the function state. Hook behaviour is unchanged.

* Report subsystem damage in the On Ship Damage hook

Adds SubsystemDamage, the total subsystem strength a damage application removed, so a hit absorbed by subsystems no longer looks like a small hull hit. The hook description now says it only runs where damage is applied, which excludes multiplayer clients.

* Address On Ship Damage review comments

- Remove WeaponClass, WeaponSubtype, Ballistic and BeamWeapon from the
  hook. Scripts read these from Source when it is a weapon.
- Add a "Weapon class" condition for the On Ship Damage hook. It matches
  only when the damage source is a weapon of that class; a weapon name
  that does not exist never matches.
- SubsystemDamage is now a table keyed by subsystem handle that lists only
  the subsystems that lost strength. The total is removed.
- Rename PROJECTILE to NON_BEAM_WEAPON.
- Classify SourceKind by damage source: COLLISION for ship, debris and
  asteroid collisions; EXPLOSION for ship-death and docked-ship blasts and
  asteroid blasts; WASH for engine wash; SELF for kills where the ship
  damages itself; OTHER for other ship-sourced damage.
- Reword the hook description.

* Key On Ship Damage SubsystemDamage by canonical name

Lua tables cannot use subsystem handles as keys in a usable way, so key
the SubsystemDamage table by each subsystem's CanonicalName instead.

* Tag ship-vs-prop damage as a collision and use in_bounds

The ship-vs-prop collision call didn't pass DamageSource::Collision, so
the On Ship Damage hook reported those hits as OTHER. Every other
collision path was already tagged.

Also use SCP_vector::in_bounds() for the Weapon_info and Damage_types
index checks in ship_run_damage_hook().
2026-11-06 18:41:29 -05:00
..
2026-04-30 00:35:19 -04:00
2026-11-05 20:56:36 +01:00
2026-11-05 20:56:36 +01:00
2026-11-02 22:40:54 -05:00
2026-07-23 15:52:27 +02:00
2018-07-15 19:37:24 +02:00
2026-11-05 20:56:36 +01:00
2026-07-23 15:52:27 +02:00
2025-08-18 11:59:22 -04:00
2026-09-12 03:57:27 +00:00
2026-05-12 11:31:20 -04:00
2026-11-05 20:56:36 +01:00
2026-05-28 14:43:48 +09:00
2026-11-05 20:56:36 +01:00
2026-04-30 00:35:19 -04:00
2026-11-02 22:40:54 -05:00
2026-09-08 10:48:13 -04:00
2026-07-20 23:04:56 -04:00
2026-11-05 20:56:36 +01:00
2026-07-23 15:52:27 +02:00
2026-11-04 01:16:41 -05:00
2026-11-04 01:16:41 -05:00
2026-11-05 20:56:36 +01:00
2016-07-22 12:07:19 +02:00