コード例 #1
0
    /**
     * 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;
    }