/** * Determine the source Player and Ship associated with a damage event. * Returns false if the event was environmental, or no player/ship can be determined. */ public static bool GetSource( this MyDamageInformation info, out IMyPlayer damagePlayer, out IMyFaction damageFaction, out IMyCubeGrid damageShip) { damagePlayer = null; damageFaction = null; damageShip = null; IMyEntity entity = MyAPIGateway.Entities.GetEntityById(info.AttackerId); if (entity == null) { return false; } if (entity is IMyMeteor) { return false; } if (entity is IMyThrust) { return false; } if (entity is IMyWarhead) { return GetPlayerByWarhead( entity as IMyWarhead, out damagePlayer, out damageFaction); } entity = entity.GetTopMostParent(); if (entity == null) { return false; } if (entity is IMyCubeGrid) { damageShip = entity as IMyCubeGrid; damagePlayer = damageShip.GetControllingPlayer(); if (damagePlayer == null) { damagePlayer = damageShip.GetOwningPlayer(); } damageFaction = damageShip.GetOwningFaction(); } else { if (entity is IMyEngineerToolBase) { return GetPlayerByTool( entity as IMyEngineerToolBase, out damagePlayer, out damageFaction); } if (entity is IMyGunBaseUser) { return GetPlayerByWeapon( entity as IMyGunBaseUser, out damagePlayer, out damageFaction); } } return damageShip != null || damageFaction != null || damagePlayer != null; }