#if defined  _skilldetect_included_
        #endinput
#endif
#define _skilldetect_included_


/**
 *  CarAlarmTriggerReason: the 'reason' parameter in OnCarAlarmTriggered() forward
 */
enum CarAlarmTriggerReason {
    CarAlarmTrigger_Unknown,
    CarAlarmTrigger_Hit,
    CarAlarmTrigger_Touched,
    CarAlarmTrigger_Explosion,
    CarAlarmTrigger_Boomer
};


/**
 *  Called whenever a true skeet with shotgun is done.
 *
 *  @param  int     survivor    the survivor client that performed the feat
 *  @param  int     hunter      the infected client that underwent it
 */
forward void OnSkeet( int survivor, int hunter );

/**
 *  Called whenever a true melee-skeet is done.
 *
 *  @param  int     survivor    the survivor client that performed the feat
 *  @param  int     hunter      the infected client that underwent it
 */
forward void OnSkeetMelee( int survivor, int hunter );

/**
 *  Called whenever a direct grenade launcher hit on a hunter connects.
 *
 *  @param  int     survivor    the survivor client that performed the feat
 *  @param  int     hunter      the infected client that underwent it
 */
forward void OnSkeetGL( int survivor, int hunter );
  
/**
 *  Called whenever a true skeeting sniper headshot landed.
 *
 *  @param  int     survivor    the survivor client that performed the feat
 *  @param  int     hunter      the infected client that underwent it
 */
forward void OnSkeetSniper( int survivor, int hunter );

/**
 *  Called whenever a pouncing hunter got killed with shotgun
 *  when it wasn't a true skeet (chipped hunter).
 *
 *  @param  int     survivor    the survivor client that performed the feat
 *  @param  int     hunter      the infected client that underwent it
 *  @param  int     damage      damage done in the killing hit
 *  @param  bool    isOverKill  true if it would've been a skeet if the hunter hadn't been chipped
 */
forward void OnSkeetHurt( int survivor, int hunter, int damage, bool isOverkill );

/**
 *  Called whenever a pouncing hunter got killed with melee
 *  when it wasn't a true skeet (chipped hunter).
 *
 *  @param  int     survivor    the survivor client that performed the feat
 *  @param  int     hunter      the infected client that underwent it
 *  @param  int     damage      damage done in the killing hit
 *  @param  bool    isOverKill  true if it would've been a skeet if the hunter hadn't been chipped
 */  
forward void OnSkeetMeleeHurt( int survivor, int hunter, int damage, bool isOverkill );

/**
 *  Called whenever a pouncing hunter got killed with a sniper headshot
 *  when it wasn't a true skeet (chipped hunter).
 *
 *  @param  int     survivor    the survivor client that performed the feat
 *  @param  int     hunter      the infected client that underwent it
 *  @param  int     damage      damage done in the killing hit
 *  @param  bool    isOverKill  true if it would've been a skeet if the hunter hadn't been chipped
 */  
forward void OnSkeetSniperHurt( int survivor, int hunter, int damage, bool isOverkill );

/**
 *  Called whenever a hunter is deadstopped (pouncing => m2'd).
 *
 *  @param  int     survivor    the survivor client that performed the feat
 *  @param  int     hunter      the infected client that underwent it
 */  
forward void OnHunterDeadstop( int survivor, int hunter );

/**
 *  Called whenever a boomer is killed that didn't land on anyone,
 *  and didn't explode on anyone either.
 *
 *  @param  int     survivor    the survivor client that killed the boomer
 *  @param  int     boomer      the infected client that got popped
 *  @param  int     shoveCount  the amount of times the boomer got shoved, if any
 *  @param  Float   timeAlive   the time, in seconds, that the boomer lived
 */  
forward void OnBoomerPop( int survivor, int oomer, int hoveCount, float timeAlive );
  
/**
 *  Called whenever a charger is fully melee-leveled (no chip).
 *  This is also called when the melee hit would've leveled if not chipped!
 *
 *  @param  int     survivor    the survivor client that performed the feat
 *  @param  int     charger     the infected client that underwent it
 */
forward void OnChargerLevel( int survivor, int charger );

/**
 *  Called whenever a charger is melee-leveled after being chipped.
 *  Only called when the melee wouldn't have killed an unchipped charger.
 *
 *  @param  int     survivor    the survivor client that performed the feat
 *  @param  int     charger     the infected client that underwent it
 *  @param  int     damage      damage done in the killing hit
 */
forward void OnChargerLevelHurt( int survivor, int charger, int damage );

/**
 *  Called whenever a witch was crowned without her being angered first.
 *
 *  @param  int     survivor    the survivor client that performed the feat
 *  @param  int     damage      damage done in the killing hit
 */
forward void OnWitchCrown( int survivor, int damage );

/**
 *  Called whenever a witch gets crowned after she got angered/triggered.
 *  This is referred to (depending on the community) as a 'draw crown' or 'remote'.
 *
 *  @param  int     survivor    the survivor client that performed the feat
 *  @param  int     damage      damage done in the killing hit
 *  @param  int     chipdamage  damage done to the witch before she got crowned
 */
forward void OnWitchCrownHurt( int survivor, int damage, int chipdamage );

/**
 *  Called whenever a survivor melee-cuts a smoker tongue that was aimed for them.
 *
 *  @param  int     survivor    the survivor client that performed the feat
 *  @param  int     smoker      the infected client that underwent it
 */
forward void OnTongueCut( int survivor, int smoker );

/**
 *  Called whenever a survivor frees himself from a smoker that grabbed them,
 *  either by killing it or by shoving.
 *
 *  @param  int     survivor    the survivor client that performed the feat
 *  @param  int     smoker      the infected client that underwent it
 *  @param  bool    withShove   true if the self-clear was by a shove/m2
 */
forward void OnSmokerSelfClear( int survivor, int smoker, bool withShove );
  
/**
 *  Called whenever a survivor shoots/melees a tank rock out of the air.
 *
 *  Note: the tank param might be unreliable due to the nature of the
 *  tracking. Don't do anything srs bsns with it.
 *
 *  @param  int     survivor    the survivor client that performed the feat
 *  @param  int     tank        the infected client that underwent it
 */
forward void OnTankRockSkeeted( int survivor, int tank );

/**
 *  Called whenever a tank lands a rock on a survivor.
 *
 *  Note: the tank param might be unreliable due to the nature of the
 *  tracking. Don't do anything srs bsns with it.
 *
 *  @param  int     tank        the infected client that performed the feat
 *  @param  int     survivor    the survivor client that underwent it
 */
forward void OnTankRockEaten( int tank, int survivor );

/**
 *  Called whenever a hunter lands a high-pounce on a survivor.
 *
 *  @param  int     hunter              the infected client that performed the feat
 *  @param  int     survivor            the survivor client that underwent it
 *  @param  int     actualDamage        the actual damage the pounce did to the survivor
 *  @param  Float   calculatedDamage    how much damage (going by pounceannounce parameters) the pounce would be expected to do
 *  @param  Float   height              the vertical distance between the pounce origin and its landing
 *  @param  bool    reportedHigh        whether skill_detect considers it a high pounce for reporting purposes
 */
forward void OnHunterHighPounce( int hunter, int survivor, int actualDamage, float calculatedDamage, float height, bool reportedHigh );

/**
 *  Called whenever a jockey lands a high-pounce on a survivor.
 * 
 *  Note: due to the nature of the tracking, it only gets the height right if a jockey actually
 *  jumped or pounced from his perch. If they simple walk off and land, it may be incorrect.
 *
 *  @param  int     jockey          the infected client that performed the feat
 *  @param  int     survivor        the survivor client that underwent it
 *  @param  Float   height          the vertical distance between the pounce origin and its landing
 *  @param  bool    reportedHigh    whether skill_detect considers it a high pounce for reporting purposes
 */
forward void OnJockeyHighPounce( int jockey, int victim, float height, bool reportedHigh );

/**
 *  Called whenever a charger lands a death-charge on a survivor.
 *  This is called for killing the grabbed survivor, but also the ones that get impact-bumped
 *  and fall to their deaths.
 * 
 *  Note: due to the nature of the tracking, there may be places that are technically death-
 *  charge spots, but not detected by the plugin. Example: the sidewalk next to the fence near
 *  the lower roof on Dead Air 1; the Death Toll 4 out-of-map deathcharge near the start
 *  saferoom.
 *
 *  @param  int     charger     the infected client that performed the feat
 *  @param  int     survivor    the survivor client that underwent it
 *  @param  Float   height      the vertical distance between the grab and the survivor's death spot
 *  @param  Float   distance    the full vector distance between the grab and the survivor's death spot
 *  @param  bool    wasCarried  true if the survivor was the one that the charger grabbed
 */
forward void OnDeathCharge( int charger, int survivor, float height, float distance, bool wasCarried );
  
/**
 *  Called whenever a survivor clears a teammate from a special infected pin.
 * 
 *  Note: timeB is only appliccable for smokers and chargers. For smokers it shows the
 *  time from the tongue connecting to the clear. For chargers from the charge-grab to
 *  the clear. For jockeys and hunters, timeB will always be -1.0.
 *
 *  timeA is the time, for charger, from start of pummeling till clear (-1.0 if they 
 *  never started pummeling). For smokers, this is the time from the survivor being
 *  fully reigned in to the smoker (-1.0 if the tongue was broken before that).
 *
 *  @param  int     clearer     the survivor client that performed the clear
 *  @param  int     pinner      the pinning infected client that got cleared (shoved off or killed)
 *  @param  int     pinvictim   the pinned survivor that was saved
 *  @param  int     zombieClass the class (ZC_SMOKER - ZC_CHARGER) of the pinner
 *  @param  Float   timeA       time from pin till clear in seconds, -1 if never
 *  @param  Float   timeB       for charger/smoker: time from grab/tongue connect to clear
 *  @param  bool    withShove   true if the clear was done by shove/m2
 */
forward void OnSpecialClear( int clearer, int pinner, int pinvictim, int zombieClass, float timeA, float timeB, bool withShove );

/**
 *  Called whenever a boomer is done vomiting, and landed his vomit on one
 *  or more survivors.
 *
 *  Note: this does not include or fire for boomers exploding, only vomits.
 *
 *  @param  int     boomer      the infected client that performed the feat
 *  @param  int     amount      the amount of survivors vomited on
 */
forward void OnBoomerVomitLanded( int boomer, int amount );

/**
 *  Called whenever a survivor shoves a special infected (any kind).
 *
 *  @param  int     survivor      the survivor client that performed the feat
 *  @param  int     infected      the infected client that underwent it
 *  @param  int     zombieClass   the class type of the infected shoved
 */
forward void OnSpecialShoved( int survivor, int infected, int zombieClass );

/**
 *  Called whenever a survivor lands any number of bunnyhops in a row. Called
 *  afterwards.
 *
 *  @param  int     survivor      the survivor client that performed the feat
 *  @param  int     streak        the amount of hops in a row
 *  @param  Float   maxVelocity   the highest speed during any jump or jump apex
 */
forward void OnBunnyHopStreak( int survivor, int streak, float maxVelocity );

/**
 *  Called whenever a car alarm is triggered (by a survivor).
 *
 *  @param  int     survivor      the survivor client that triggered the alarm (-1 or 0 if unknown)
 *  @param  int     infected      if > 0: the infected client that assisted in triggering it (boomer, smoker, jockey or charger)
 *  @param  int     reason        the reason for triggering (see CarAlarmTriggerType)
 */
forward void OnCarAlarmTriggered( int survivor, int infected, CarAlarmTriggerReason reason );


public SharedPlugin __pl_skilldetect =
{
	name = "skill_detect",
	file = "l4d2_skill_detect.smx",
#if defined REQUIRE_PLUGIN
    required = 1,
#else
    required = 0,
#endif
};

