// 1 4 16 32 8192 16384 32768 65536 (122933 with ASSIST, 57397 without); 131072 for instaclears + 524288 for car alarm
// 1 4 16 32 8192 16384 32768 65536 (122933 with ASSIST, 57397 without); 131072 for instaclears + 524288 for car alarm
// trie values: weapon type
// trie values: weapon type
enum strWeaponType
enum strWeaponType
{
{
WPTYPE_SNIPER,
WPTYPE_SNIPER,
WPTYPE_MAGNUM,
WPTYPE_MAGNUM,
WPTYPE_GL
WPTYPE_GL
};
};
// trie values: OnEntityCreated classname
// trie values: OnEntityCreated classname
enum strOEC
enum strOEC
{
{
OEC_WITCH,
OEC_WITCH,
OEC_TANKROCK,
OEC_TANKROCK,
OEC_TRIGGER,
OEC_TRIGGER,
OEC_CARALARM,
OEC_CARALARM,
OEC_CARGLASS
OEC_CARGLASS
};
};
// trie values: special abilities
// trie values: special abilities
enum strAbility
enum strAbility
{
{
ABL_HUNTERLUNGE,
ABL_HUNTERLUNGE,
ABL_ROCKTHROW
ABL_ROCKTHROW
};
};
enum _:strRockData
enum strRockData
{
{
rckDamage,
rckDamage,
rckTank,
rckTank,
rckSkeeter
rckSkeeter
};
};
// witch array entries (maxplayers+index)
// witch array entries (maxplayers+index)
enum _:strWitchArray
enum strWitchArray
{
{
WTCH_NONE,
WTCH_NONE,
WTCH_HEALTH,
WTCH_HEALTH,
WTCH_GOTSLASH,
WTCH_GOTSLASH,
WTCH_STARTLED,
WTCH_STARTLED,
WTCH_CROWNER,
WTCH_CROWNER,
WTCH_CROWNSHOT,
WTCH_CROWNSHOT,
WTCH_CROWNTYPE
WTCH_CROWNTYPE
};
};
enum _:enAlarmReasons
enum enAlarmReasons
{
{
CALARM_UNKNOWN,
CALARM_UNKNOWN,
CALARM_HIT,
CALARM_HIT,
CALARM_TOUCHED,
CALARM_TOUCHED,
CALARM_EXPLOSION,
CALARM_EXPLOSION,
CALARM_BOOMER
CALARM_BOOMER
};
};
new const String: g_csSIClassName[][] =
new const String: g_csSIClassName[][] =
{
{
"",
"",
"smoker",
"smoker",
"boomer",
"boomer",
"hunter",
"hunter",
"spitter",
"spitter",
"jockey",
"jockey",
"charger",
"charger",
"witch",
"witch",
"tank"
"tank"
};
};
new bool: g_bLateLoad = false;
new bool: g_bLateLoad = false;
new Handle: g_hForwardSkeet = INVALID_HANDLE;
new Handle: g_hForwardSkeet = INVALID_HANDLE;
new Handle: g_hForwardSkeetHurt = INVALID_HANDLE;
new Handle: g_hForwardSkeetHurt = INVALID_HANDLE;
new Handle: g_hForwardSkeetMelee = INVALID_HANDLE;
new Handle: g_hForwardSkeetMelee = INVALID_HANDLE;
new Handle: g_hForwardSkeetMeleeHurt = INVALID_HANDLE;
new Handle: g_hForwardSkeetMeleeHurt = INVALID_HANDLE;
new Handle: g_hForwardSkeetSniper = INVALID_HANDLE;
new Handle: g_hForwardSkeetSniper = INVALID_HANDLE;
new Handle: g_hForwardSkeetSniperHurt = INVALID_HANDLE;
new Handle: g_hForwardSkeetSniperHurt = INVALID_HANDLE;
new Handle: g_hForwardSkeetGL = INVALID_HANDLE;
new Handle: g_hForwardSkeetGL = INVALID_HANDLE;
new Handle: g_hForwardHunterDeadstop = INVALID_HANDLE;
new Handle: g_hForwardHunterDeadstop = INVALID_HANDLE;
new Handle: g_hForwardSIShove = INVALID_HANDLE;
new Handle: g_hForwardSIShove = INVALID_HANDLE;
new Handle: g_hForwardBoomerPop = INVALID_HANDLE;
new Handle: g_hForwardBoomerPop = INVALID_HANDLE;
new Handle: g_hForwardLevel = INVALID_HANDLE;
new Handle: g_hForwardLevel = INVALID_HANDLE;
new Handle: g_hForwardLevelHurt = INVALID_HANDLE;
new Handle: g_hForwardLevelHurt = INVALID_HANDLE;
new Handle: g_hForwardCrown = INVALID_HANDLE;
new Handle: g_hForwardCrown = INVALID_HANDLE;
new Handle: g_hForwardDrawCrown = INVALID_HANDLE;
new Handle: g_hForwardDrawCrown = INVALID_HANDLE;
new Handle: g_hForwardTongueCut = INVALID_HANDLE;
new Handle: g_hForwardTongueCut = INVALID_HANDLE;
new Handle: g_hForwardSmokerSelfClear = INVALID_HANDLE;
new Handle: g_hForwardSmokerSelfClear = INVALID_HANDLE;
new Handle: g_hForwardRockSkeeted = INVALID_HANDLE;
new Handle: g_hForwardRockSkeeted = INVALID_HANDLE;
new Handle: g_hForwardRockEaten = INVALID_HANDLE;
new Handle: g_hForwardRockEaten = INVALID_HANDLE;
new Handle: g_hForwardHunterDP = INVALID_HANDLE;
new Handle: g_hForwardHunterDP = INVALID_HANDLE;
new Handle: g_hForwardJockeyDP = INVALID_HANDLE;
new Handle: g_hForwardJockeyDP = INVALID_HANDLE;
new Handle: g_hForwardDeathCharge = INVALID_HANDLE;
new Handle: g_hForwardDeathCharge = INVALID_HANDLE;
new Handle: g_hForwardClear = INVALID_HANDLE;
new Handle: g_hForwardClear = INVALID_HANDLE;
new Handle: g_hForwardVomitLanded = INVALID_HANDLE;
new Handle: g_hForwardVomitLanded = INVALID_HANDLE;
new Handle: g_hForwardBHopStreak = INVALID_HANDLE;
new Handle: g_hForwardBHopStreak = INVALID_HANDLE;
new Handle: g_hForwardAlarmTriggered = INVALID_HANDLE;
new Handle: g_hForwardAlarmTriggered = INVALID_HANDLE;
new Handle: g_hTrieWeapons = INVALID_HANDLE; // weapon check
new Handle: g_hTrieWeapons = INVALID_HANDLE; // weapon check
new Handle: g_hTrieEntityCreated = INVALID_HANDLE; // getting classname of entity created
new Handle: g_hTrieEntityCreated = INVALID_HANDLE; // getting classname of entity created
new Handle: g_hTrieAbility = INVALID_HANDLE; // ability check
new Handle: g_hTrieAbility = INVALID_HANDLE; // ability check
new Handle: g_hWitchTrie = INVALID_HANDLE; // witch tracking (Crox)
new Handle: g_hWitchTrie = INVALID_HANDLE; // witch tracking (Crox)
new Handle: g_hRockTrie = INVALID_HANDLE; // tank rock tracking
new Handle: g_hRockTrie = INVALID_HANDLE; // tank rock tracking
new Handle: g_hCarTrie = INVALID_HANDLE; // car alarm tracking
new Handle: g_hCarTrie = INVALID_HANDLE; // car alarm tracking
// all SI / pinners
// all SI / pinners
new Float: g_fSpawnTime [MAXPLAYERS + 1]; // time the SI spawned up
new Float: g_fSpawnTime [MAXPLAYERS + 1]; // time the SI spawned up
new Float: g_fPinTime [MAXPLAYERS + 1][2]; // time the SI pinned a target: 0 = start of pin (tongue pull, charger carry); 1 = carry end / tongue reigned in
new Float: g_fPinTime [MAXPLAYERS + 1][2]; // time the SI pinned a target: 0 = start of pin (tongue pull, charger carry); 1 = carry end / tongue reigned in
new g_iSpecialVictim [MAXPLAYERS + 1]; // current victim (set in traceattack, so we can check on death)
new g_iSpecialVictim [MAXPLAYERS + 1]; // current victim (set in traceattack, so we can check on death)
// hunters: skeets/pounces
// hunters: skeets/pounces
new g_iHunterShotDmgTeam [MAXPLAYERS + 1]; // counting shotgun blast damage for hunter, counting entire survivor team's damage
new g_iHunterShotDmgTeam [MAXPLAYERS + 1]; // counting shotgun blast damage for hunter, counting entire survivor team's damage
new g_iHunterShotDmg [MAXPLAYERS + 1][MAXPLAYERS + 1]; // counting shotgun blast damage for hunter / skeeter combo
new g_iHunterShotDmg [MAXPLAYERS + 1][MAXPLAYERS + 1]; // counting shotgun blast damage for hunter / skeeter combo
new Float: g_fHunterShotStart [MAXPLAYERS + 1][MAXPLAYERS + 1]; // when the last shotgun blast on hunter started (if at any time) by an attacker
new Float: g_fHunterShotStart [MAXPLAYERS + 1][MAXPLAYERS + 1]; // when the last shotgun blast on hunter started (if at any time) by an attacker
new Float: g_fHunterTracePouncing [MAXPLAYERS + 1]; // time when the hunter was still pouncing (in traceattack) -- used to detect pouncing status
new Float: g_fHunterTracePouncing [MAXPLAYERS + 1]; // time when the hunter was still pouncing (in traceattack) -- used to detect pouncing status
new Float: g_fHunterLastShot [MAXPLAYERS + 1]; // when the last shotgun damage was done (by anyone) on a hunter
new Float: g_fHunterLastShot [MAXPLAYERS + 1]; // when the last shotgun damage was done (by anyone) on a hunter
new g_iHunterLastHealth [MAXPLAYERS + 1]; // last time hunter took any damage, how much health did it have left?
new g_iHunterLastHealth [MAXPLAYERS + 1]; // last time hunter took any damage, how much health did it have left?
new g_iHunterOverkill [MAXPLAYERS + 1]; // how much more damage a hunter would've taken if it wasn't already dead
new g_iHunterOverkill [MAXPLAYERS + 1]; // how much more damage a hunter would've taken if it wasn't already dead
new bool: g_bHunterKilledPouncing [MAXPLAYERS + 1]; // whether the hunter was killed when actually pouncing
new bool: g_bHunterKilledPouncing [MAXPLAYERS + 1]; // whether the hunter was killed when actually pouncing
new g_iPounceDamage [MAXPLAYERS + 1]; // how much damage on last 'highpounce' done
new g_iPounceDamage [MAXPLAYERS + 1]; // how much damage on last 'highpounce' done
new Float: g_fPouncePosition [MAXPLAYERS + 1][3]; // position that a hunter (jockey?) pounced from (or charger started his carry)
new Float: g_fPouncePosition [MAXPLAYERS + 1][3]; // position that a hunter (jockey?) pounced from (or charger started his carry)
// deadstops
// deadstops
new Float: g_fVictimLastShove [MAXPLAYERS + 1][MAXPLAYERS + 1]; // when was the player shoved last by attacker? (to prevent doubles)
new Float: g_fVictimLastShove [MAXPLAYERS + 1][MAXPLAYERS + 1]; // when was the player shoved last by attacker? (to prevent doubles)
// levels / charges
// levels / charges
new g_iChargerHealth [MAXPLAYERS + 1]; // how much health the charger had the last time it was seen taking damage
new g_iChargerHealth [MAXPLAYERS + 1]; // how much health the charger had the last time it was seen taking damage
new Float: g_fChargeTime [MAXPLAYERS + 1]; // time the charger's charge last started, or if victim, when impact started
new Float: g_fChargeTime [MAXPLAYERS + 1]; // time the charger's charge last started, or if victim, when impact started
new g_iChargeVictim [MAXPLAYERS + 1]; // who got charged
new g_iChargeVictim [MAXPLAYERS + 1]; // who got charged
new Float: g_fChargeVictimPos [MAXPLAYERS + 1][3]; // location of each survivor when it got hit by the charger
new Float: g_fChargeVictimPos [MAXPLAYERS + 1][3]; // location of each survivor when it got hit by the charger
new g_iVictimCharger [MAXPLAYERS + 1]; // for a victim, by whom they got charge(impacted)
new g_iVictimCharger [MAXPLAYERS + 1]; // for a victim, by whom they got charge(impacted)
new g_iVictimFlags [MAXPLAYERS + 1]; // flags stored per charge victim: VICFLAGS_
new g_iVictimFlags [MAXPLAYERS + 1]; // flags stored per charge victim: VICFLAGS_
new g_iVictimMapDmg [MAXPLAYERS + 1]; // for a victim, how much the cumulative map damage is so far (trigger hurt / drowning)
new g_iVictimMapDmg [MAXPLAYERS + 1]; // for a victim, how much the cumulative map damage is so far (trigger hurt / drowning)
// pops
// pops
new bool: g_bBoomerHitSomebody [MAXPLAYERS + 1]; // false if boomer didn't puke/exploded on anybody
new bool: g_bBoomerHitSomebody [MAXPLAYERS + 1]; // false if boomer didn't puke/exploded on anybody
new g_iBoomerGotShoved [MAXPLAYERS + 1]; // count boomer was shoved at any point
new g_iBoomerGotShoved [MAXPLAYERS + 1]; // count boomer was shoved at any point
new g_iBoomerVomitHits [MAXPLAYERS + 1]; // how many booms in one vomit so far
new g_iBoomerVomitHits [MAXPLAYERS + 1]; // how many booms in one vomit so far
// crowns
// crowns
new Float: g_fWitchShotStart [MAXPLAYERS + 1]; // when the last shotgun blast from a survivor started (on any witch)
new Float: g_fWitchShotStart [MAXPLAYERS + 1]; // when the last shotgun blast from a survivor started (on any witch)
// smoker clears
// smoker clears
new bool: g_bSmokerClearCheck [MAXPLAYERS + 1]; // [smoker] smoker dies and this is set, it's a self-clear if g_iSmokerVictim is the killer
new bool: g_bSmokerClearCheck [MAXPLAYERS + 1]; // [smoker] smoker dies and this is set, it's a self-clear if g_iSmokerVictim is the killer
new g_iSmokerVictim [MAXPLAYERS + 1]; // [smoker] the one that's being pulled
new g_iSmokerVictim [MAXPLAYERS + 1]; // [smoker] the one that's being pulled
new g_iSmokerVictimDamage [MAXPLAYERS + 1]; // [smoker] amount of damage done to a smoker by the one he pulled
new g_iSmokerVictimDamage [MAXPLAYERS + 1]; // [smoker] amount of damage done to a smoker by the one he pulled
new bool: g_bSmokerShoved [MAXPLAYERS + 1]; // [smoker] set if the victim of a pull manages to shove the smoker
new bool: g_bSmokerShoved [MAXPLAYERS + 1]; // [smoker] set if the victim of a pull manages to shove the smoker
// rocks
// rocks
new g_iTankRock [MAXPLAYERS + 1]; // rock entity per tank
new g_iTankRock [MAXPLAYERS + 1]; // rock entity per tank
new g_iRocksBeingThrown [10]; // 10 tanks max simultanously throwing rocks should be ok (this stores the tank client)
new g_iRocksBeingThrown [10]; // 10 tanks max simultanously throwing rocks should be ok (this stores the tank client)
new g_iRocksBeingThrownCount = 0; // so we can do a push/pop type check for who is throwing a created rock
new g_iRocksBeingThrownCount = 0; // so we can do a push/pop type check for who is throwing a created rock
// hops
// hops
new bool: g_bIsHopping [MAXPLAYERS + 1]; // currently in a hop streak
new bool: g_bIsHopping [MAXPLAYERS + 1]; // currently in a hop streak
new bool: g_bHopCheck [MAXPLAYERS + 1]; // flag to check whether a hopstreak has ended (if on ground for too long.. ends)
new bool: g_bHopCheck [MAXPLAYERS + 1]; // flag to check whether a hopstreak has ended (if on ground for too long.. ends)
new g_iHops [MAXPLAYERS + 1]; // amount of hops in streak
new g_iHops [MAXPLAYERS + 1]; // amount of hops in streak
new Float: g_fLastHop [MAXPLAYERS + 1][3]; // velocity vector of last jump
new Float: g_fLastHop [MAXPLAYERS + 1][3]; // velocity vector of last jump
new Float: g_fHopTopVelocity [MAXPLAYERS + 1]; // maximum velocity in hopping streak
new Float: g_fHopTopVelocity [MAXPLAYERS + 1]; // maximum velocity in hopping streak
// alarms
// alarms
new Float: g_fLastCarAlarm = 0.0; // time when last car alarm went off
new Float: g_fLastCarAlarm = 0.0; // time when last car alarm went off
new g_iLastCarAlarmReason [MAXPLAYERS + 1]; // what this survivor did to set the last alarm off
new g_iLastCarAlarmReason [MAXPLAYERS + 1]; // what this survivor did to set the last alarm off
new g_iLastCarAlarmBoomer; // if a boomer triggered an alarm, remember it
new g_iLastCarAlarmBoomer; // if a boomer triggered an alarm, remember it
// cvars
// cvars
new Handle: g_hCvarReport = INVALID_HANDLE; // cvar whether to report at all
new Handle: g_hCvarReport = INVALID_HANDLE; // cvar whether to report at all
new Handle: g_hCvarReportFlags = INVALID_HANDLE; // cvar what to report
new Handle: g_hCvarReportFlags = INVALID_HANDLE; // cvar what to report
new Handle: g_hCvarAllowMelee = INVALID_HANDLE; // cvar whether to count melee skeets
new Handle: g_hCvarAllowMelee = INVALID_HANDLE; // cvar whether to count melee skeets
new Handle: g_hCvarAllowSniper = INVALID_HANDLE; // cvar whether to count sniper headshot skeets
new Handle: g_hCvarAllowSniper = INVALID_HANDLE; // cvar whether to count sniper headshot skeets
new Handle: g_hCvarAllowGLSkeet = INVALID_HANDLE; // cvar whether to count direct hit GL skeets
new Handle: g_hCvarAllowGLSkeet = INVALID_HANDLE; // cvar whether to count direct hit GL skeets
new Handle: g_hCvarDrawCrownThresh = INVALID_HANDLE; // cvar damage in final shot for drawcrown-req.
new Handle: g_hCvarDrawCrownThresh = INVALID_HANDLE; // cvar damage in final shot for drawcrown-req.
new Handle: g_hCvarSelfClearThresh = INVALID_HANDLE; // cvar damage while self-clearing from smokers
new Handle: g_hCvarSelfClearThresh = INVALID_HANDLE; // cvar damage while self-clearing from smokers
new Handle: g_hCvarHunterDPThresh = INVALID_HANDLE; // cvar damage for hunter highpounce
new Handle: g_hCvarHunterDPThresh = INVALID_HANDLE; // cvar damage for hunter highpounce
new Handle: g_hCvarJockeyDPThresh = INVALID_HANDLE; // cvar distance for jockey highpounce
new Handle: g_hCvarJockeyDPThresh = INVALID_HANDLE; // cvar distance for jockey highpounce
new Handle: g_hCvarHideFakeDamage = INVALID_HANDLE; // cvar damage while self-clearing from smokers
new Handle: g_hCvarHideFakeDamage = INVALID_HANDLE; // cvar damage while self-clearing from smokers
new Handle: g_hCvarDeathChargeHeight = INVALID_HANDLE; // cvar how high a charger must have come in order for a DC to count
new Handle: g_hCvarDeathChargeHeight = INVALID_HANDLE; // cvar how high a charger must have come in order for a DC to count
new Handle: g_hCvarInstaTime = INVALID_HANDLE; // cvar clear within this time or lower for instaclear
new Handle: g_hCvarInstaTime = INVALID_HANDLE; // cvar clear within this time or lower for instaclear
new Handle: g_hCvarBHopMinStreak = INVALID_HANDLE; // cvar this many hops in a row+ = streak
new Handle: g_hCvarBHopMinStreak = INVALID_HANDLE; // cvar this many hops in a row+ = streak
new Handle: g_hCvarBHopMinInitSpeed = INVALID_HANDLE; // cvar lower than this and the first jump won't be seen as the start of a streak
new Handle: g_hCvarBHopMinInitSpeed = INVALID_HANDLE; // cvar lower than this and the first jump won't be seen as the start of a streak
new Handle: g_hCvarBHopContSpeed = INVALID_HANDLE; // cvar
new Handle: g_hCvarBHopContSpeed = INVALID_HANDLE; // cvar
new Handle: g_hCvarPounceInterrupt = INVALID_HANDLE; // z_pounce_damage_interrupt
new Handle: g_hCvarPounceInterrupt = INVALID_HANDLE; // z_pounce_damage_interrupt
new g_iPounceInterrupt = 150;
new g_iPounceInterrupt = 150;
new Handle: g_hCvarChargerHealth = INVALID_HANDLE; // z_charger_health
new Handle: g_hCvarChargerHealth = INVALID_HANDLE; // z_charger_health
new Handle: g_hCvarWitchHealth = INVALID_HANDLE; // z_witch_health
new Handle: g_hCvarWitchHealth = INVALID_HANDLE; // z_witch_health
new Handle: g_hCvarMaxPounceDistance = INVALID_HANDLE; // z_pounce_damage_range_max
new Handle: g_hCvarMaxPounceDistance = INVALID_HANDLE; // z_pounce_damage_range_max
new Handle: g_hCvarMinPounceDistance = INVALID_HANDLE; // z_pounce_damage_range_min
new Handle: g_hCvarMinPounceDistance = INVALID_HANDLE; // z_pounce_damage_range_min
new Handle: g_hCvarMaxPounceDamage = INVALID_HANDLE; // z_hunter_max_pounce_bonus_damage;
new Handle: g_hCvarMaxPounceDamage = INVALID_HANDLE; // z_hunter_max_pounce_bonus_damage;
/*
/*
Reports:
Reports:
--------
--------
Damage shown is damage done in the last shot/slash. So for crowns, this means
Damage shown is damage done in the last shot/slash. So for crowns, this means
that the 'damage' value is one shotgun blast
that the 'damage' value is one shotgun blast
Quirks:
Quirks:
-------
-------
Does not report people cutting smoker tongues that target players other
Does not report people cutting smoker tongues that target players other
than themselves. Could be done, but would require (too much) tracking.
than themselves. Could be done, but would require (too much) tracking.
Actual damage done, on Hunter DPs, is low when the survivor gets incapped
Actual damage done, on Hunter DPs, is low when the survivor gets incapped
by (a fraction of) the total pounce damage.
by (a fraction of) the total pounce damage.
Fake Damage
Fake Damage
-----------
-----------
Hiding of fake damage has the following consequences:
Hiding of fake damage has the following consequences:
- Drawcrowns are less likely to be registered: if a witch takes too
- Drawcrowns are less likely to be registered: if a witch takes too
much chip before the crowning shot, the final shot will be considered
much chip before the crowning shot, the final shot will be considered
as doing too little damage for a crown (even if it would have been a crown
as doing too little damage for a crown (even if it would have been a crown
had the witch had more health).
had the witch had more health).
- Charger levels are harder to get on chipped chargers. Any charger that
- Charger levels are harder to get on chipped chargers. Any charger that
has taken (600 - 390 =) 210 damage or more cannot be leveled (even if
has taken (600 - 390 =) 210 damage or more cannot be leveled (even if
the melee swing would've killed the charger (1559 damage) if it'd have
the melee swing would've killed the charger (1559 damage) if it'd have
had full health).
had full health).
I strongly recommend leaving fakedamage visible: it will offer more feedback on
I strongly recommend leaving fakedamage visible: it will offer more feedback on
the survivor's action and reward survivors doing (what would be) full crowns and
the survivor's action and reward survivors doing (what would be) full crowns and
levels on chipped targets.
levels on chipped targets.
To Do
To Do
-----
-----
- fix: tank rock owner is not reliable for the RockEaten forward
- fix: tank rock owner is not reliable for the RockEaten forward
- fix: tank rock skeets still unreliable detection (often triggers a 'skeet' when actually landed on someone)
- fix: tank rock skeets still unreliable detection (often triggers a 'skeet' when actually landed on someone)
- fix: apparently some HR4 cars generate car alarm messages when shot, even when no alarm goes off
- fix: apparently some HR4 cars generate car alarm messages when shot, even when no alarm goes off
(combination with car equalize plugin?)
(combination with car equalize plugin?)
- see below: the single hook might also fix this.. -- if not, hook for sound
- see below: the single hook might also fix this.. -- if not, hook for sound
- do a hookoutput on prop_car_alarm's and use that to track the actual alarm
- do a hookoutput on prop_car_alarm's and use that to track the actual alarm
going off (might help in the case 2 alarms go off exactly at the same time?)
going off (might help in the case 2 alarms go off exactly at the same time?)
- fix: double prints on car alarms (sometimes? epi + m60)
- fix: double prints on car alarms (sometimes? epi + m60)
- fix: sometimes instaclear reports double for single clear (0.16s / 0.19s) epi saw this, was for hunter
- fix: sometimes instaclear reports double for single clear (0.16s / 0.19s) epi saw this, was for hunter
- fix: deadstops and m2s don't always register .. no idea why..
- fix: deadstops and m2s don't always register .. no idea why..
- fix: sometimes a (first?) round doesn't work for skeet detection.. no hurt/full skeets are reported or counted
- fix: sometimes a (first?) round doesn't work for skeet detection.. no hurt/full skeets are reported or counted
- make forwards fire for every potential action,
- make forwards fire for every potential action,
- include the relevant values, so other plugins can decide for themselves what to consider it
- include the relevant values, so other plugins can decide for themselves what to consider it
- test chargers getting dislodged with boomer pops?
- test chargers getting dislodged with boomer pops?
- add commonhop check
- add commonhop check
- add deathcharge assist check
- add deathcharge assist check
- smoker
- smoker
- jockey
- jockey
- add deathcharge coordinates for some areas
- add deathcharge coordinates for some areas
- DT4 next to saferoom
- DT4 next to saferoom
- DA1 near the lower roof, on sidewalk next to fence (no hurttrigger there)
- DA1 near the lower roof, on sidewalk next to fence (no hurttrigger there)
- DA2 next to crane roof to the right of window
- DA2 next to crane roof to the right of window
DA2 charge down into start area, after everyone's jumped the fence
DA2 charge down into start area, after everyone's jumped the fence
- count rock hits even if they do no damage [epi request]
- count rock hits even if they do no damage [epi request]
- sir
- sir
- make separate teamskeet forward, with (for now, up to) 4 skeeters + the damage each did
- make separate teamskeet forward, with (for now, up to) 4 skeeters + the damage each did
- xan
- xan
- add detection/display of unsuccesful witch crowns (witch death + info)
- add detection/display of unsuccesful witch crowns (witch death + info)