Monster projectiles lock ProjectileTarget at launch, but damage is applied to the monster's current AttackTarget. I.e. if the monster shoots a non-player (this behavior can happen with combat pet, other player, or creature) and retargets a player before collision, the projectile hits the creature then CalculateDamage uses that creature's armor and (if it was a non-player) never sets BodyPart. TakeDamage then subtracts that amount from the player. Survivors log bad damage location with body part 0 (instant kills skip this log)
Also means when missile mobs bounce targets between players, players may take eachothers calculated damage.
The flow of the logic:
- In Creature_Missile the projectile target is set in LaunchProjectile().
- In ProjectileCollisionHelper, OnCollideObject() targetPlayer is assigned in this collision method as the sourceCreature.AttackTarget in real time.
- DoCalculateDamage() is passed the correct values for the intended target (targetCreature) at time of launch.
- TakeDamage() is invoked on targetPlayer using the damageEvent from targetCreature.
2026-09-28 15:53:00,928 [World Manager] WARN (ACE.Server.WorldObjects.Player) +Frts.TakeDamage(Mu-miyah Huntress, Pierce, 379, 0, False): avoided crash for bad damage location
Monster projectiles lock ProjectileTarget at launch, but damage is applied to the monster's current AttackTarget. I.e. if the monster shoots a non-player (this behavior can happen with combat pet, other player, or creature) and retargets a player before collision, the projectile hits the creature then CalculateDamage uses that creature's armor and (if it was a non-player) never sets BodyPart. TakeDamage then subtracts that amount from the player. Survivors log bad damage location with body part 0 (instant kills skip this log)
Also means when missile mobs bounce targets between players, players may take eachothers calculated damage.
The flow of the logic:
2026-09-28 15:53:00,928 [World Manager] WARN (ACE.Server.WorldObjects.Player) +Frts.TakeDamage(Mu-miyah Huntress, Pierce, 379, 0, False): avoided crash for bad damage location