Name | Type | is_array | initial_value |
AfterDamageEvent | real | No | |
ALLPLAYERS | force | No | |
AoELeapers | group | No | |
ARAbility | abilcode | No | |
ArcherIllusion1 | group | No | |
ArcherIllusion2 | group | No | |
ArcherIllusionShoot | unit | No | |
ArcherIllusionShootPoint | location | No | |
ARDummy | unit | No | |
ARDummy2 | unit | No | |
ARPoint | location | No | |
ARPoint2 | location | No | |
Assists | integer | Yes | |
AttackCooldownTimer | timer | Yes | |
BasicArrowBoolean | boolean | Yes | |
BeamBotCaster | unit | No | |
BeamBotCharge | integer | No | |
BeamBotCounter | real | No | |
BeamBotGroup | group | No | |
BeamBotGroup1 | group | No | |
BeamBotGroup2 | group | No | |
BeamBotRunes | unit | Yes | |
BeamBotUnit1 | unit | No | |
BeamBotUnit2 | unit | No | |
BeamBurnUnit2Top | unit | No | |
BeamBurnUnit3Top | unit | No | |
BeamBurnUnitBot | unit | No | |
BeamBurnUnitBot2 | unit | No | |
BeamBurnUnitBot3 | unit | No | |
BeamBurnUnitTop | unit | No | |
BeamDistBot | real | No | |
BeamDistTop | real | No | |
BeamDummy | unit | No | |
BeamDummy2 | unit | No | |
BeamGroup1 | group | No | |
BeamPoint1 | location | No | |
BeamPoint2 | location | No | |
BeamPoint3 | location | No | |
BeamPoint4 | location | No | |
BeamPoint5 | location | No | |
BeamPoint6 | location | No | |
BeamPoint7 | location | No | |
BeamPoint8 | location | No | |
BeamPos | location | No | |
BeamPos1 | location | No | |
BeamRealDis4 | real | No | |
BeamRealDis5 | real | No | |
BeamRealDis6 | real | No | |
BeamRealDist1 | real | No | |
BeamRealDist2 | real | No | |
BeamRealDist3 | real | No | |
BeamTimerBot | timer | No | |
BeamTimerTop | timer | No | |
BeamTopCaster | unit | No | |
BeamTopCharge | integer | No | |
BeamTopCounter | real | No | |
BeamTopGroup | group | No | |
BeamTopGroup3 | group | No | |
BeamTopRunes | unit | Yes | |
BeamTopTimerFirst | timer | No | |
BeamTopUnit1 | unit | No | |
BeamTopUnit2 | unit | No | |
BeamTPGroup1 | group | No | |
BeamTPGroup2 | group | No | |
BeamTPGroup3 | group | No | |
BeamTPGroup4 | group | No | |
BF_DefautInterval | integer | No | |
BlessingSpirit | boolean | Yes | |
BlessingSpiritDUmmy | unit | No | |
BlessingSpiritGroup | group | No | |
BlessingSpiritGroup2 | group | No | |
BloodFeatherHeart | boolean | Yes | |
BlueBuff1EffectTimer | timer | No | |
BlueBuff1EffectUnit | unit | No | |
BlueBuff1Timer | timer | No | |
BlueBuff2EffectTimer | timer | No | |
BlueBuff2EffectUnit | unit | No | |
BlueBuff2Timer | timer | No | |
BlueBuffBoolean1 | boolean | No | |
BlueBuffBoolean2 | boolean | No | |
BlueBuffEffect1 | effect | No | |
BlueBuffEffect2 | effect | No | |
BlueBuffPoint1 | location | No | |
BlueBuffPoint2 | location | No | |
BlueBuffUnit1 | unit | No | |
BlueBuffUnit2 | unit | No | |
BotSpawnPoint1 | location | No | |
BotSpawnPoint2 | location | No | |
BotSpawnPoint3 | location | No | |
BottomPlayerGroup | force | No | |
BowSmackDummy | unit | No | |
BowSmackPoint | location | No | |
BuffCreep | unit | Yes | |
BuffCreepTimer | timer | Yes | |
CameraPoint1 | location | No | |
CameraPoint2 | location | No | |
CKReturnPoint | location | Yes | |
ClearDamageEvent | trigger | No | |
CreepDenies | integer | Yes | |
CreepKills | integer | Yes | |
CripplingShroud | boolean | Yes | false |
CripplingShroudUnit | unit | No | |
CripplingShroudUnit2 | unit | No | |
CrownOfProtection | boolean | Yes | |
CrownSFX | effect | Yes | |
CrownTimer | timer | Yes | |
CWAttackGroup | group | No | |
CWPoint | location | No | |
DAMAGE_FACTOR_BRACERS | real | No | |
DAMAGE_FACTOR_ELUNES | real | No | |
DAMAGE_FACTOR_ETHEREAL | real | No | |
DamageBlockingAbility | abilcode | No | |
DamageEvent | real | No | |
DamageEventAmount | real | No | |
DamageEventOverride | boolean | No | |
DamageEventPrevAmt | real | No | |
DamageEventSource | unit | No | |
DamageEventsWasted | integer | No | |
DamageEventTarget | unit | No | |
DamageEventTrigger | trigger | No | |
DamageEventType | integer | No | |
DamageModifierEvent | real | No | |
DamageTypeBlocked | integer | No | |
DamageTypeCriticalStrike | integer | No | |
DamageTypeExplosive | integer | No | |
DamageTypeHeal | integer | No | |
DamageTypeReduced | integer | No | |
DamageTypeReflect | integer | No | |
DashCaster | unit | Yes | |
DashCounter | integer | Yes | |
DashCounter2 | integer | Yes | |
DashDamage | real | Yes | |
DashDistance | integer | Yes | |
DashDistCount | integer | No | |
DashGroup1 | group | No | |
DashGroup2 | group | No | |
DashGroup3 | group | No | |
DashGroup4 | group | No | |
DashIllusion | unit | Yes | |
DashInteger | integer | Yes | |
DashMax | integer | Yes | |
DashPoint | location | No | |
DashPoint3 | location | Yes | |
DashPoint4 | location | Yes | |
DashPoint5 | location | Yes | |
DashReal1 | real | Yes | |
DashReal2 | real | Yes | |
DashSpeed | real | Yes | |
DeathPoint | location | No | |
Deaths | integer | Yes | |
DGInteger | integer | No | |
DmgEvBracers | itemcode | No | |
DmgEvRecursionN | integer | No | |
DmgEvRunning | boolean | No | |
DmgEvStarted | boolean | No | |
DmgEvTimer | timer | No | |
DmgEvTrig | trigger | No | |
DoomGuardDeathPoint | location | No | |
DoomguardPoint1 | location | No | |
DoomguardPoint2 | location | No | |
EasyItem__ERRORSOUND | string | No | |
EasyItem__SPLIT | boolean | No | |
EasyItem__SPLITDROP | boolean | No | |
EasyItem__SPLITSIZE | integer | No | |
EasyItem__SPLITSTACK | boolean | No | |
EasyItem__SPLITSTACKDELAY | real | No | |
EasyItem__USEITEMLEVEL | boolean | No | |
EasyItem_integer | integervar | Yes | |
EasyItem_item | item | No | |
EasyItem_items | item | Yes | |
EasyItem_point | location | Yes | |
EasyItem_sound | sound | No | |
EasyItem_string | string | Yes | |
EasyItem_timer | timer | No | |
EasyItem_unit | unit | No | |
EasyItem_units | unit | Yes | |
EnchantedRod | boolean | Yes | |
EvilRobe | boolean | Yes | |
EvilRobePoint | location | No | |
EvilRobeTimer | timer | Yes | |
FeralImpactCharge | integer | No | |
fi | integer | No | |
FI_Angle | real | Yes | |
FI_AnimSpeed | real | Yes | |
FI_DefaultHeight | real | No | |
FI_EffectA | modelfile | No | |
FI_EffectB | modelfile | No | |
FI_FallHeight | real | No | |
FI_Height | real | Yes | |
FI_Hero | unit | Yes | |
FI_Max | integer | No | |
FI_Sound | string | No | |
FI_Vp | real | Yes | |
FI_Vz | real | Yes | |
FI_z | real | Yes | |
FirstbloodBoolean | boolean | No | |
FL_PlayerNumber | integer | No | |
FL_Revert | unit | Yes | |
FloatingTextGroup | group | No | |
FloatingTextPoint | location | No | |
FLOriginalPoint | location | No | |
FLPlayernumber2 | integer | No | |
FW_Counter | integer | Yes | |
FW_TImer | timer | No | |
FWBoolean | boolean | Yes | |
FWGroup1 | group | No | |
FWReturnPoint | location | No | |
FWReturnPoint2 | location | No | |
FWReturnPoint3 | location | No | |
FWReturnPoint4 | location | No | |
g | real | No | |
group | group | No | |
GuinsooStaffLevel1 | boolean | Yes | |
GuinsooStaffLevel2 | boolean | Yes | |
HealingPotionCaster | unit | Yes | |
HealingPotionCounter | integer | Yes | |
HealingPotionCurrentIndex | integer | No | |
HealingPotionMaxIndex | integer | No | |
HealingRodInteger | integer | Yes | |
HealingStoneGroup | group | No | |
HealingStoneHeal | real | No | |
HealingStonePoint | location | No | |
HealPoint | location | No | |
HealPoint2 | location | No | |
HealPoint3 | location | No | |
HealReal | real | No | |
HealUnit | unit | Yes | |
Hero | unit | Yes | |
HeroDeathTimer | timer | Yes | |
HeroDeathTimerWindow | timerdialog | Yes | |
HeroIcon | string | Yes | |
HeroItem1 | itemcode | Yes | |
HeroItem2 | itemcode | Yes | |
HeroItem3 | itemcode | Yes | |
HeroItem4 | itemcode | Yes | |
HeroItem5 | itemcode | Yes | |
HeroItem6 | itemcode | Yes | |
HeroMove1 | location | No | |
HeroMove2 | location | No | |
HideDamageFrom | boolean | Yes | |
Horn | boolean | No | |
HPPotSFX | effect | Yes | |
ImprovedArrow | boolean | Yes | |
IsDamageSpell | boolean | No | |
Item_Check | integer | No | |
Item_Count | integer | No | |
Item_CustomValue | integer | No | |
Item_Effect | string | No | |
Item_EnableOS | boolean | No | |
Item_Fake | itemcode | Yes | |
Item_LoopA | integervar | No | |
Item_LoopB | integervar | No | |
Item_LoopC | integervar | No | |
Item_Mat1 | itemcode | Yes | |
Item_Mat1Amount | integer | Yes | |
Item_Mat2 | itemcode | Yes | |
Item_Mat2Amount | integer | Yes | |
Item_Mat3 | itemcode | Yes | |
Item_Mat3Amount | integer | Yes | |
Item_Mat4 | itemcode | Yes | |
Item_Mat4Amount | integer | Yes | |
Item_Mat5 | itemcode | Yes | |
Item_Mat5Amount | integer | Yes | |
Item_MatMax | integer | Yes | |
Item_Max | integer | No | |
Item_Owner | player | Yes | |
Item_OwneredItem | item | Yes | |
Item_OwnershipException | group | No | |
Item_Point | location | Yes | |
Item_Real | itemcode | Yes | |
Item_RecipeMax | integer | No | |
Item_Result | itemcode | Yes | |
kb | integer | No | |
KB_Angle | real | Yes | |
KB_Dist | real | Yes | |
KB_Max | integer | No | |
KB_MaxDist | real | Yes | |
KB_Speed | real | Yes | |
KB_Unit | unit | Yes | |
KillGold | integer | No | |
Kills | integer | Yes | |
KillSpree | integer | Yes | |
KnockbackAngle | real | No | |
KnockBackCaster | unit | No | |
KnockbackDistance | real | No | |
KnockBackedUnit | unit | Yes | |
KnockBackInteger | integer | No | |
KnockBackPoint | location | No | |
knockbackTable | hashtable | No | |
KnockbackUnits | group | No | |
LastDamageHP | real | No | |
LastDmgPrevAmount | real | Yes | |
LastDmgPrevType | integer | Yes | |
LastDmgSource | unit | Yes | |
LastDmgTarget | unit | Yes | |
LastDmgValue | real | Yes | |
LastDmgWasSpell | boolean | Yes | |
LastRevivedHero | unit | Yes | |
LastRightsGroup | group | No | |
LastRightsPlayerBot | player | No | |
LastRightsPlayerTop | player | No | |
LastRightsPoint | location | No | |
LastRightsPoint2 | location | No | |
LastRightsSoul | unit | No | |
LastRightsTimer | timer | Yes | |
LastRightUnitBot | unit | No | |
LastRightUnitTop | unit | No | |
LeapCaster | unit | No | |
LeapHashtable | hashtable | No | |
LeapPoints | location | Yes | |
LeapStormTimer | timer | Yes | |
List | integer | No | |
MagicStaffBoolean | boolean | Yes | |
ManaBuffPoints | location | Yes | |
MaskOfDeathLevel1 | boolean | Yes | |
MaskOfDeathLevel2 | boolean | Yes | |
MaskOfDeathLevel3 | boolean | Yes | |
MaxHeroes | integer | No | |
MB_Spots | integer | Yes | |
MultiBoard | multiboard | No | |
NextDamageOverride | boolean | No | |
NextDamageType | integer | No | |
NullTalisman | boolean | Yes | |
PA_Arrow | unit | Yes | |
PACaster | unit | Yes | |
PACounter | real | Yes | |
PACounter2 | real | Yes | |
PACounter3 | real | Yes | |
PACurrentIndex | integer | No | |
PAGroup | group | Yes | |
PAGroup2 | group | Yes | |
PAGroup3 | group | No | |
PAGroup4 | group | No | |
PAGroup5 | group | Yes | |
PAGroupNew | group | No | |
PAGroupNew2 | group | No | |
PAMaxIndex | integer | No | |
PAPoint | location | Yes | |
PAPoint1 | location | Yes | |
PAPoint2 | location | Yes | |
PAPoint3 | location | Yes | |
PASFX | effect | Yes | |
PASFX2 | effect | Yes | |
PiercingArrowDeflect | boolean | Yes | |
Player_Colors | string | Yes | |
Playercolors | string | Yes | |
PlayerHero | unit | Yes | |
PlayersCount | integer | Yes | |
PlayersForce | force | Yes | |
point | location | No | |
point2 | location | No | |
PurifyCaster | unit | No | |
PurifyDummy | unit | Yes | |
PurifyDummy2 | unit | No | |
PurifyGroup | group | No | |
PurifyPoint | location | No | |
PurifyPoint2 | location | No | |
QJ_AoE | boolean | No | |
QJ_AoERadius | real | No | |
QJ_AoESFX | string | No | |
QJ_attackTypeID | integer | No | |
QJ_Caster | unit | No | |
QJ_Collision | boolean | No | |
QJ_Damage | real | No | |
QJ_damageTypeID | integer | No | |
QJ_Dummy | unit | No | |
QJ_Homing | boolean | No | |
QJ_Integer | integer | No | |
QJ_Model | unitcode | No | |
QJ_Pierce | boolean | No | |
QJ_Size | real | No | |
QJ_Speed | real | No | |
QJ_StopAtFirstTarget | boolean | No | |
QJ_Stun | boolean | No | false |
QJ_TargetPoint | location | No | |
QJ_TargetUnit | unit | No | |
QJGroup1 | group | No | |
QJLifeSteal | real | No | |
QJLifeStealBoolean | boolean | No | |
QJS_Angle | real | No | |
QJS_arrowGroup | group | No | |
QJS_arrowPos | location | No | |
QJS_arrowTable | hashtable | No | |
QJS_atkTypePreset | attacktype | Yes | |
QJS_AttackType | attacktype | No | |
QJS_DamagedGroup | group | No | |
QJS_DamageType | damagetype | No | |
QJS_Distance | real | No | |
QJS_dmgTypePreset | damagetype | Yes | |
QJS_movePos | location | No | |
QJS_tempPos | location | No | |
QJS_tempPos_Target | location | No | |
QJS_victimGroup | group | No | |
QJS_victimPos | location | No | |
QuickThreads | boolean | Yes | |
QuickThreads2 | boolean | Yes | |
QuickThreadsItem | item | Yes | |
QuickThreadTimer | timer | Yes | |
real | real | No | |
Real | real | Yes | |
real2 | real | No | |
RedBuffBoolean | boolean | No | |
RedBuffEffect | effect | No | |
RedBuffEffectTimer | timer | No | |
RedBuffEffectUnit | unit | No | |
RedBuffPoint | location | No | |
RedBuffPoints | location | Yes | |
RedBuffSFX | effect | No | |
RedBuffTimer | timer | No | |
RedBuffUnit | unit | No | |
ReflectBoolean | boolean | Yes | |
ReflectCaster | unit | Yes | |
ReflectCounter | integer | Yes | |
ReflectCurrentIndex | integer | No | |
ReflectGroup | group | No | |
ReflectMaxIndex | integer | No | |
ReflectSFX | effect | Yes | |
RegenAmount | real | Yes | |
RegenCaster | unit | Yes | |
RegenCounter | real | Yes | |
RegenCurrentIndex | integer | No | |
RegenMaxIndex | integer | No | |
RegenSFX1 | effect | Yes | |
ReliableGold | integer | Yes | |
RemainingTime | real | No | |
RespawnTime | integer | No | 15 |
RevivableHeroes | group | No | |
RevivePoint | location | No | |
RevivePoint2 | location | No | |
SatPoint | location | Yes | |
SBEDummy | unit | No | |
SBEGroup | group | No | |
SBEGroup2 | group | No | |
SBEPoint | location | No | |
SFXTimer | timer | Yes | |
Shake | real | No | |
ShakeTimer | timer | No | |
Skill_FeralImpact | abilcode | No | |
SmartAttackPoint | location | No | |
SmartAttackPoint2 | location | No | |
SOG_Boolean | boolean | Yes | |
SOGCharge | integer | Yes | |
SparkAbility | abilcode | Yes | |
SparkAngel | unit | Yes | |
SparkCaster | unit | Yes | |
SparkCounter | real | Yes | |
SparkCurrentIndex | integer | No | |
SparkDummy | unit | No | |
SparkDummy2 | unit | Yes | |
SparkGroup | group | No | |
SparkGroup2 | group | Yes | |
SparkMaxIndex | integer | No | |
SparkPoint | location | No | |
SparkPoint2 | location | No | |
SparkPoint3 | location | Yes | |
SparkPoint4 | location | Yes | |
SparkPoint5 | location | Yes | |
SparkTarget | unit | Yes | |
SparkUnit1 | unit | No | |
SparkUnit2 | unit | No | |
Sparkwand1 | boolean | Yes | |
Sparkwand2 | boolean | Yes | |
Sparkwand3 | boolean | Yes | |
SpellDamageAbility | abilcode | No | |
Stag | unit | Yes | |
StagGroup | group | Yes | |
StagPoint3 | location | No | |
StagPoints | location | Yes | |
StagPoints2 | location | Yes | |
TauntCaster | unit | Yes | |
TauntCounter2 | real | Yes | |
TauntCurrentIndex | integer | No | |
TauntMaxIndex | integer | No | |
TauntSFX | effect | Yes | |
TauntTarget | unit | Yes | |
TeleportBoolean | boolean | Yes | |
TeleportCaster | unit | Yes | |
TeleportCounter | integer | Yes | |
TeleportCurrentIndex | integer | No | |
TeleportMaxIndex | integer | No | |
TeleportPoint | location | Yes | |
TeleportPoint2 | location | No | |
TeleportSFX | effect | Yes | |
TeleportTimer | timer | Yes | |
TEMP_REAL | real | No | |
TEMP_STRING | string | No | |
TempInt | integer | No | |
TempItem | item | No | |
TempUnit | unit | No | |
TempX | real | No | |
TempY | real | No | |
TipsMessage1 | string | Yes | |
tmpCasterZ | real | No | |
tmpDiffHeight | real | No | |
tmpDistance | real | No | |
tmpHeight | real | No | |
tmpSound | sound | No | |
tmpTargetZ | real | No | |
tmpTime | real | No | |
TopPlayerGroup | force | No | |
TopSpawnPoint1 | location | No | |
TopSpawnPoint2 | location | No | |
TopSpawnPoint3 | location | No | |
TPPoint | location | No | |
TPSFX | effect | No | |
TpUnit | unit | Yes | |
UDex | integer | No | |
UDexGen | integer | No | |
UDexNext | integer | Yes | |
UDexPrev | integer | Yes | |
UDexRecycle | integer | No | |
UDexUnits | unit | Yes | |
UDexWasted | integer | No | |
UMovNext | integer | Yes | |
UMovPrev | integer | Yes | |
UnitDamageRegistered | boolean | Yes | |
UnitIndexerEnabled | boolean | No | |
UnitIndexEvent | real | No | |
UnitIndexLock | integer | Yes | |
UnitMoving | boolean | Yes | |
UnitMovingEvent | real | No | |
UnitMovingX | real | Yes | |
UnitMovingY | real | Yes | |
UrsaAttackPoint | location | No | |
UrsaRange1 | location | No | |
UrsaRange2 | location | No | |
UrsaRange3 | location | No | |
UrsaRange4 | location | No | |
UrsaRegenTimer | timer | No | |
UrsaTimer1 | timer | No | |
UrsaTimer2 | timer | No | |
UrsaTimer3 | timer | No | |
UrsaTimer4 | timer | No | |
UrsaWarrior | unit | No | |
WACaster | unit | Yes | |
WACounter | real | Yes | |
WACounter2 | integer | Yes | |
WACrippleGroup | group | No | |
WACurrentInteger | integer | No | |
WADummy | unit | No | |
WAMaxIndex | integer | No | |
WAPoint | location | Yes | |
WAPoint2 | location | Yes | |
WAPoint3 | location | Yes | |
WASFX | effect | Yes | |
WASFX2 | effect | Yes | |
WASFX3 | effect | Yes | |
WAWolf | unit | Yes | |
XARCaster | unit | Yes | |
XARCounter | real | Yes | |
XARCurrentIndex | integer | No | |
XARDummy | unit | Yes | |
XARGroup | group | Yes | |
XARMaxIndex | integer | No | |
XARPoint | location | Yes | |
XARPointTarget | location | Yes | |
XARPointTarget2 | location | Yes | |
XHealingHero | real | Yes |
//TESH.scrollpos=148
//TESH.alwaysfold=0
//===========================================================================
// Damage Engine lets you detect, amplify, block or nullify damage. It even
// lets you detect if the damage was physical or from a spell. Just reference
// DamageEventAmount/Source/Target or the boolean IsDamageSpell, to get the
// necessary damage event data.
//
// - Detect damage: use the event "DamageEvent Equal to 1.00"
// - To change damage before it's dealt: use the event "DamageModifierEvent Equal to 1.00"
// - Detect damage after it was applied, use the event "AfterDamageEvent Equal to 1.00"
// - Detect spell damage: use the condition "IsDamageSpell Equal to True"
// - Detect zero-damage: use the event "DamageEvent Equal to 2.00" (an AfterDamageEvent will not fire for this)
//
// You can specify the DamageEventType before dealing triggered damage. To prevent an already-improbable error, I recommend running the trigger "ClearDamageEvent (Checking Conditions)" after dealing triggered damage from within a damage event:
// - Set NextDamageType = DamageTypeWhatever
// - Unit - Cause...
// - Trigger - Run ClearDamageEvent (Checking Conditions)
//
// You can modify the DamageEventAmount and the DamageEventType from a "DamageModifierEvent Equal to 1.00" trigger.
// - If the amount is modified to negative, it will count as a heal.
// - If the amount is set to 0, no damage will be dealt.
//
// If you need to reference the original in-game damage, use the variable "DamageEventPrevAmt".
//
//===========================================================================
// Programming note about "integer i" and "udg_DmgEvRecursionN": integer i
// ranges from -1 upwards. "udg_DmgEvRecursionN" ranges from 0 upwards.
// "integer i" is always 1 less than "udg_DmgEvRecursionN"
//
function DmgEvResetVars takes nothing returns nothing
local integer i = udg_DmgEvRecursionN - 2
set udg_DmgEvRecursionN = i + 1
if i >= 0 then
set udg_DamageEventPrevAmt = udg_LastDmgPrevAmount[i]
set udg_DamageEventAmount = udg_LastDmgValue[i]
set udg_DamageEventSource = udg_LastDmgSource[i]
set udg_DamageEventTarget = udg_LastDmgTarget[i]
set udg_IsDamageSpell = udg_LastDmgWasSpell[i]
set udg_DamageEventType = udg_LastDmgPrevType[i]
endif
endfunction
function CheckDamagedLifeEvent takes boolean clear returns nothing
if clear then
set udg_NextDamageOverride = false
set udg_NextDamageType = 0
endif
if udg_DmgEvTrig != null then
call DestroyTrigger(udg_DmgEvTrig)
set udg_DmgEvTrig = null
if udg_IsDamageSpell then
call SetWidgetLife(udg_DamageEventTarget, RMaxBJ(udg_LastDamageHP, 0.41))
if udg_LastDamageHP <= 0.405 then
if udg_DamageEventType < 0 then
call SetUnitExploded(udg_DamageEventTarget, true)
endif
//Kill the unit
call DisableTrigger(udg_DamageEventTrigger)
call UnitDamageTarget(udg_DamageEventSource, udg_DamageEventTarget, -999, false, false, null, DAMAGE_TYPE_UNIVERSAL, null)
call EnableTrigger(udg_DamageEventTrigger)
endif
elseif GetUnitAbilityLevel(udg_DamageEventTarget, udg_DamageBlockingAbility) > 0 then
call UnitRemoveAbility(udg_DamageEventTarget, udg_DamageBlockingAbility)
call SetWidgetLife(udg_DamageEventTarget, udg_LastDamageHP)
endif
if udg_DamageEventAmount != 0.00 and not udg_HideDamageFrom[GetUnitUserData(udg_DamageEventSource)] then
set udg_AfterDamageEvent = 0.00
set udg_AfterDamageEvent = 1.00
set udg_AfterDamageEvent = 0.00
endif
call DmgEvResetVars()
endif
endfunction
function DmgEvOnExpire takes nothing returns nothing
set udg_DmgEvStarted = false
call CheckDamagedLifeEvent(true)
endfunction
function PreCheckDamagedLifeEvent takes nothing returns boolean
call CheckDamagedLifeEvent(true)
return false
endfunction
function OnUnitDamage takes nothing returns boolean
local boolean override = udg_DamageEventOverride
local integer i = udg_DmgEvRecursionN - 1
local string s
local real prevAmount
local real life
local real prevLife
local unit u
call CheckDamagedLifeEvent(false) //in case the unit state event failed and the 0.00 second timer hasn't yet expired
if i >= 0 then
if i < 16 then
set udg_LastDmgPrevAmount[i]= udg_DamageEventPrevAmt
set udg_LastDmgValue[i] = udg_DamageEventAmount
set udg_LastDmgSource[i] = udg_DamageEventSource
set udg_LastDmgTarget[i] = udg_DamageEventTarget
set udg_LastDmgWasSpell[i] = udg_IsDamageSpell
set udg_LastDmgPrevType[i] = udg_DamageEventType
else
set s = "WARNING: Recursion error when dealing damage! Make sure when you deal damage from within a DamageEvent trigger, do it like this:\n\n"
set s = s + "Trigger - Turn off (This Trigger)\n"
set s = s + "Unit - Cause...\n"
set s = s + "Trigger - Turn on (This Trigger)"
//Delete the next couple of lines to disable the in-game recursion crash warnings
call ClearTextMessages()
call DisplayTimedTextToPlayer(GetLocalPlayer(), 0.00, 0.00, 999.00, s)
return false
endif
endif
set udg_DmgEvRecursionN = i + 2
set u = GetTriggerUnit()
set prevAmount = GetEventDamage()
set udg_DamageEventSource = GetEventDamageSource()
set udg_DamageEventAmount = prevAmount
set udg_DamageEventTarget = u
set udg_DamageEventType = udg_NextDamageType
set udg_NextDamageType = 0
set udg_DamageEventOverride = udg_NextDamageOverride
set udg_NextDamageOverride = false
if prevAmount == 0.00 then
if not udg_HideDamageFrom[GetUnitUserData(udg_DamageEventSource)] then
set udg_DamageEventPrevAmt = 0.00
set udg_DamageEvent = 0.00
set udg_DamageEvent = 2.00
set udg_DamageEvent = 0.00
endif
call DmgEvResetVars()
else
if not udg_DmgEvStarted then
set udg_DmgEvStarted = true
call TimerStart(udg_DmgEvTimer, 0.00, false, function DmgEvOnExpire)
endif
set udg_IsDamageSpell = prevAmount < 0.00
if udg_IsDamageSpell then
set prevAmount = -udg_DamageEventAmount
set life = 1.00
if IsUnitType(u, UNIT_TYPE_ETHEREAL) and not IsUnitType(u, UNIT_TYPE_HERO) then
set life = life*udg_DAMAGE_FACTOR_ETHEREAL //1.67
endif
if GetUnitAbilityLevel(u, 'Aegr') > 0 then
set life = life*udg_DAMAGE_FACTOR_ELUNES //0.80
endif
if udg_DmgEvBracers != 0 and IsUnitType(u, UNIT_TYPE_HERO) then
//Inline of UnitHasItemOfTypeBJ without the potential handle ID leak.
set i = 6
loop
set i = i - 1
if GetItemTypeId(UnitItemInSlot(u, i)) == udg_DmgEvBracers then
set life = life*udg_DAMAGE_FACTOR_BRACERS //0.67
exitwhen true
endif
exitwhen i == 0
endloop
endif
set udg_DamageEventAmount = prevAmount*life
endif
set udg_DamageEventPrevAmt = prevAmount
set udg_DamageModifierEvent = 0.00
if not udg_DamageEventOverride then
set udg_DamageModifierEvent = 1.00
if not udg_DamageEventOverride then
set udg_DamageModifierEvent = 2.00
set udg_DamageModifierEvent = 3.00
endif
endif
set udg_DamageEventOverride = override
if udg_DamageEventAmount > 0.00 then
set udg_DamageModifierEvent = 4.00
endif
set udg_DamageModifierEvent = 0.00
if not udg_HideDamageFrom[GetUnitUserData(udg_DamageEventSource)] then
set udg_DamageEvent = 0.00
set udg_DamageEvent = 1.00
set udg_DamageEvent = 0.00
endif
call CheckDamagedLifeEvent(true) //in case the unit state event failed from a recursive damage event
//All events have run and the damage amount is finalized.
set life = GetWidgetLife(u)
set udg_DmgEvTrig = CreateTrigger()
call TriggerAddCondition(udg_DmgEvTrig, Filter(function PreCheckDamagedLifeEvent))
if not udg_IsDamageSpell then
if udg_DamageEventAmount != prevAmount then
set life = life + prevAmount - udg_DamageEventAmount
if GetUnitState(u, UNIT_STATE_MAX_LIFE) < life then
set udg_LastDamageHP = life - prevAmount
call UnitAddAbility(u, udg_DamageBlockingAbility)
endif
call SetWidgetLife(u, RMaxBJ(life, 0.42))
endif
call TriggerRegisterUnitStateEvent(udg_DmgEvTrig, u, UNIT_STATE_LIFE, LESS_THAN, RMaxBJ(0.41, life - prevAmount/2.00))
else
set udg_LastDamageHP = GetUnitState(u, UNIT_STATE_MAX_LIFE)
set prevLife = life
if life + prevAmount*0.75 > udg_LastDamageHP then
set life = RMaxBJ(udg_LastDamageHP - prevAmount/2.00, 1.00)
call SetWidgetLife(u, life)
set life = (life + udg_LastDamageHP)/2.00
else
set life = life + prevAmount*0.50
endif
set udg_LastDamageHP = prevLife - (prevAmount - (prevAmount - udg_DamageEventAmount))
call TriggerRegisterUnitStateEvent(udg_DmgEvTrig, u, UNIT_STATE_LIFE, GREATER_THAN, life)
endif
set u = null
endif
return false
endfunction
function CreateDmgEvTrg takes nothing returns nothing
set udg_DamageEventTrigger = CreateTrigger()
call TriggerAddCondition(udg_DamageEventTrigger, Filter(function OnUnitDamage))
endfunction
function SetupDmgEv takes nothing returns boolean
local integer i = udg_UDex
local unit u
if udg_UnitIndexEvent == 1.00 then
set u = udg_UDexUnits[i]
if GetUnitAbilityLevel(u, 'Aloc') == 0 and TriggerEvaluate(gg_trg_Damage_Engine_Config) then
set udg_UnitDamageRegistered[i] = true
call TriggerRegisterUnitEvent(udg_DamageEventTrigger, u, EVENT_UNIT_DAMAGED)
call UnitAddAbility(u, udg_SpellDamageAbility)
call UnitMakeAbilityPermanent(u, true, udg_SpellDamageAbility)
endif
set u = null
else
set udg_HideDamageFrom[i] = false
if udg_UnitDamageRegistered[i] then
set udg_UnitDamageRegistered[i] = false
set udg_DamageEventsWasted = udg_DamageEventsWasted + 1
if udg_DamageEventsWasted == 32 then //After 32 registered units have been removed...
set udg_DamageEventsWasted = 0
//Rebuild the mass EVENT_UNIT_DAMAGED trigger:
call DestroyTrigger(udg_DamageEventTrigger)
call CreateDmgEvTrg()
set i = udg_UDexNext[0]
loop
exitwhen i == 0
if udg_UnitDamageRegistered[i] then
call TriggerRegisterUnitEvent(udg_DamageEventTrigger, udg_UDexUnits[i], EVENT_UNIT_DAMAGED)
endif
set i = udg_UDexNext[i]
endloop
endif
endif
endif
return false
endfunction
//===========================================================================
function InitTrig_Damage_Engine takes nothing returns nothing
local unit u = CreateUnit(Player(15), 'uloc', 0, 0, 0)
local integer i = 16
//Create this trigger with UnitIndexEvents in order add and remove units
//as they are created or removed.
local trigger t = CreateTrigger()
call TriggerRegisterVariableEvent(t, "udg_UnitIndexEvent", EQUAL, 1.00)
call TriggerRegisterVariableEvent(t, "udg_UnitIndexEvent", EQUAL, 2.00)
call TriggerAddCondition(t, Filter(function SetupDmgEv))
set t = null
//Run the configuration trigger to set all configurables:
if gg_trg_Damage_Engine_Config == null then
//It's possible this InitTrig_ function ran first, in which case use ExecuteFunc.
call ExecuteFunc("Trig_Damage_Engine_Config_Actions")
else
call TriggerExecute(gg_trg_Damage_Engine_Config)
endif
//Create trigger for storing all EVENT_UNIT_DAMAGED events.
call CreateDmgEvTrg()
//Create GUI-friendly trigger for cleaning up after UnitDamageTarget.
set udg_ClearDamageEvent = CreateTrigger()
call TriggerAddCondition(udg_ClearDamageEvent, Filter(function PreCheckDamagedLifeEvent))
//Disable SpellDamageAbility for every player.
loop
set i = i - 1
call SetPlayerAbilityAvailable(Player(i), udg_SpellDamageAbility, false)
exitwhen i == 0
endloop
//Preload abilities.
call UnitAddAbility(u, udg_DamageBlockingAbility)
call UnitAddAbility(u, udg_SpellDamageAbility)
call RemoveUnit(u)
set u = null
endfunction