Name | Type | is_array | initial_value |
AfterDamageEvent | real | No | |
AOEDamageEvent | real | No | |
AOEDamageSource | unit | No | |
ARMOR_TYPE_ETHEREAL | integer | No | |
ARMOR_TYPE_FLESH | integer | No | |
ARMOR_TYPE_METAL | integer | No | |
ARMOR_TYPE_NONE | integer | No | |
ARMOR_TYPE_STONE | integer | No | |
ARMOR_TYPE_WOOD | integer | No | |
ArmorDamageEvent | real | No | |
ArmorTypeDebugStr | string | Yes | |
ATTACK_TYPE_CHAOS | integer | No | |
ATTACK_TYPE_HERO | integer | No | |
ATTACK_TYPE_MAGIC | integer | No | |
ATTACK_TYPE_NORMAL | integer | No | |
ATTACK_TYPE_PIERCE | integer | No | |
ATTACK_TYPE_SIEGE | integer | No | |
ATTACK_TYPE_SPELLS | integer | No | |
AttackTypeDebugStr | string | Yes | |
ChoosePoint_Pnt | location | No | |
CONVERTED_ATTACK_TYPE | attacktype | Yes | |
CONVERTED_DAMAGE_TYPE | damagetype | Yes | |
DAMAGE_TYPE_ACID | integer | No | |
DAMAGE_TYPE_COLD | integer | No | |
DAMAGE_TYPE_DEATH | integer | No | |
DAMAGE_TYPE_DEFENSIVE | integer | No | |
DAMAGE_TYPE_DEMOLITION | integer | No | |
DAMAGE_TYPE_DISEASE | integer | No | |
DAMAGE_TYPE_DIVINE | integer | No | |
DAMAGE_TYPE_ENHANCED | integer | No | |
DAMAGE_TYPE_FIRE | integer | No | |
DAMAGE_TYPE_FORCE | integer | No | |
DAMAGE_TYPE_LIGHTNING | integer | No | |
DAMAGE_TYPE_MAGIC | integer | No | |
DAMAGE_TYPE_MIND | integer | No | |
DAMAGE_TYPE_NORMAL | integer | No | |
DAMAGE_TYPE_PLANT | integer | No | |
DAMAGE_TYPE_POISON | integer | No | |
DAMAGE_TYPE_SHADOW_STRIKE | integer | No | |
DAMAGE_TYPE_SLOW_POISON | integer | No | |
DAMAGE_TYPE_SONIC | integer | No | |
DAMAGE_TYPE_SPIRIT_LINK | integer | No | |
DAMAGE_TYPE_UNIVERSAL | integer | No | |
DAMAGE_TYPE_UNKNOWN | integer | No | |
DamageEngineEnabled | boolean | No | |
DamageEvent | real | No | |
DamageEventAmount | real | No | |
DamageEventAOE | integer | No | |
DamageEventAOEGroup | group | No | |
DamageEventArmorPierced | real | No | |
DamageEventArmorT | integer | No | |
DamageEventAttackT | integer | No | |
DamageEventDamageT | integer | No | |
DamageEventDefenseT | integer | No | |
DamageEventLevel | integer | No | |
DamageEventOverride | boolean | No | |
DamageEventPrevAmt | real | No | |
DamageEventSource | unit | No | |
DamageEventTarget | unit | No | |
DamageEventTrigger | trigger | No | |
DamageEventType | integer | No | |
DamageEventUserAmt | real | No | |
DamageEventWeaponT | integer | No | |
DamageFilterAttackT | integer | No | |
DamageFilterConfigured | boolean | No | |
DamageFilterDamageT | integer | No | |
DamageFilterFailChance | real | No | |
DamageFilterMinAmount | real | No | |
DamageFilterRunChance | real | No | |
DamageFilterSource | unit | No | |
DamageFilterSourceA | abilcode | No | |
DamageFilterSourceB | buffcode | No | |
DamageFilterSourceC | integer | No | |
DamageFilterSourceI | itemcode | No | |
DamageFilterSourceT | unitcode | No | |
DamageFilterTarget | unit | No | |
DamageFilterTargetA | abilcode | No | |
DamageFilterTargetB | buffcode | No | |
DamageFilterTargetC | integer | No | |
DamageFilterTargetI | itemcode | No | |
DamageFilterTargetT | unitcode | No | |
DamageFilterType | integer | No | |
DamageModifierEvent | real | No | |
DamageScalingUser | real | No | |
DamageScalingWC3 | real | No | |
DamageTypeBlocked | integer | No | |
DamageTypeCode | integer | No | |
DamageTypeCriticalStrike | integer | No | |
DamageTypeDebugStr | string | Yes | |
DamageTypeExplosive | integer | No | |
DamageTypeHeal | integer | No | |
DamageTypePure | integer | No | |
DamageTypePureExplosive | integer | No | |
DamageTypeReduced | integer | No | |
DEFENSE_TYPE_DIVINE | integer | No | |
DEFENSE_TYPE_FORTIFIED | integer | No | |
DEFENSE_TYPE_HEAVY | integer | No | |
DEFENSE_TYPE_HERO | integer | No | |
DEFENSE_TYPE_LIGHT | integer | No | |
DEFENSE_TYPE_MEDIUM | integer | No | |
DEFENSE_TYPE_NORMAL | integer | No | |
DEFENSE_TYPE_UNARMORED | integer | No | |
DefenseTypeDebugStr | string | Yes | |
DmgStr | string | No | |
EnhancedDamageTarget | unit | No | |
HHAbility_Point | location | No | |
Image_Array_EasterEggImages | image | Yes | |
Integer_AntiBuild | integer | No | 300 |
Integer_Array_AuraGoldCost | integer | Yes | |
Integer_Array_AutoCamera | integer | Yes | |
Integer_Array_AutoClearOnOff | integer | Yes | |
Integer_Array_BloodTrapChance | integer | Yes | |
Integer_Array_DarkTrapChance | integer | Yes | |
Integer_Array_EarthTrapChance | integer | Yes | |
Integer_Array_Firetrap5050 | integer | Yes | |
Integer_Array_FireTrapChance | integer | Yes | |
Integer_Array_FoodBonus | integer | Yes | |
Integer_Array_FrostTrapChance | integer | Yes | |
Integer_Array_Gamble | integer | Yes | |
Integer_Array_GamUsageAmount | integer | Yes | 50 |
Integer_Array_GoblinBotChance | integer | Yes | |
Integer_Array_Gold | integer | Yes | |
Integer_Array_GoldAuraChance | integer | Yes | |
Integer_Array_GoldLostGambling | integer | Yes | |
Integer_Array_GoldWonGambling | integer | Yes | |
Integer_Array_HellfireChance | integer | Yes | |
Integer_Array_HeroCritLevel | integer | Yes | |
Integer_Array_IncomeLevel | integer | Yes | |
Integer_Array_JackpotsWon | integer | Yes | |
Integer_Array_Kills | integer | Yes | |
Integer_Array_MineDamageLevel | integer | Yes | |
Integer_Array_PoisTrapChance | integer | Yes | |
Integer_Array_RandomGameModes | integer | Yes | |
Integer_Array_RandomTowers | integer | Yes | |
Integer_Array_RWBounty | integer | Yes | |
Integer_Array_RWUnitType | integer | Yes | |
Integer_Array_TowerOption | integer | Yes | 11 |
Integer_Array_TrapGoldCost | integer | Yes | |
Integer_Array_VoidCBlastChance | integer | Yes | |
Integer_Array_VoidContChance | integer | Yes | |
Integer_Array_WaveSpawnMax | integer | Yes | |
Integer_Array_WaveTimer | integer | Yes | 120 |
Integer_AuraTowerSell | integer | Yes | |
Integer_BlitzMode | integer | No | |
Integer_BloodTrapPlyNum | integer | No | |
Integer_ChaosMode | integer | No | |
Integer_ChaosModeOn | integer | No | |
Integer_CritAuraPlayerNum | integer | No | |
Integer_CritSystemPlayerNum | integer | No | |
Integer_DarknessTrapPlyNum | integer | No | |
Integer_DarkTrapDoomPlyNum | integer | No | |
Integer_DebugWave | integer | No | |
Integer_DefeatTimer | integer | No | |
Integer_Difficulty | integer | No | 2 |
Integer_DisTowerIncomeBonus | integer | No | 5 |
Integer_EarthTrapPlyNum | integer | No | |
Integer_EarthTrapStormPlyNum | integer | No | |
Integer_EndlessMode | integer | No | |
Integer_FireTrapPlyNum | integer | No | |
Integer_FlakTowerPlyNum | integer | No | |
Integer_FrostTrapBreathPlyNum | integer | No | |
Integer_FrostTrapCagePlyNum | integer | No | |
Integer_GambleBonus | integer | No | 0 |
Integer_GambleBonusLvl | integer | No | |
Integer_Gamemode | integer | No | |
Integer_GlaiveTowerPlyNum | integer | No | |
Integer_GoldAfterWave | integer | No | 200 |
Integer_GoldAuraAmount | integer | No | |
Integer_GoldAuraPlayerNumber | integer | No | |
Integer_GoldBonus | integer | No | 100 |
Integer_GoldRush | integer | No | |
Integer_HellfirePlyNum | integer | No | |
Integer_HHActivated | integer | No | |
Integer_HHActiveChance | integer | No | |
Integer_HHActives | integer | No | |
Integer_HHCastChance | integer | No | |
Integer_HHCost | integer | No | 2500 |
Integer_HHPassives | integer | No | |
Integer_HHSpawnedAmount | integer | No | 0 |
Integer_HHUnitType | integer | No | |
Integer_IncomeGold | integer | No | |
Integer_IsRandomModes | integer | No | |
Integer_Jackpot | integer | No | 3000 |
Integer_Lives | integer | No | 60 |
Integer_LoseLifeEffectNumber | integer | No | 4 |
Integer_Player1SpawnDivider | integer | No | |
Integer_PlayerLeaveGold | integer | No | |
Integer_Players | integer | No | |
Integer_PoisonCascadeNum | integer | No | |
Integer_PoisonTrapCasadePlyNum | integer | No | |
Integer_PoisonTrapPlyNum | integer | No | |
Integer_RandomDifficulty | integer | No | |
Integer_RandomNumber | integer | No | |
Integer_RandomTowerAmount | integer | No | |
Integer_RWActivated | integer | No | |
Integer_RWBossChance | integer | No | |
Integer_SellPercent | integer | No | |
Integer_ShardTowerPlyNum | integer | No | |
Integer_ShrapTowerPlyNum | integer | No | |
Integer_SoulTowerPlyNum | integer | No | |
Integer_SpawnCount | integer | No | |
Integer_SpawnMax | integer | No | 31 |
Integer_SpeedMode | integer | No | |
Integer_SpiritTowerPlyNum | integer | No | |
Integer_SwarmMode | integer | No | |
Integer_TotalBloodTrapsBuilt | integer | No | |
Integer_TotalDarkTrapsBuilt | integer | No | |
Integer_TotalFireTrapsBuilt | integer | No | |
Integer_TotalFrostTrapsBuilt | integer | No | |
Integer_TotalIronTrapsBuilt | integer | No | |
Integer_TotalPlayerKills | integer | No | |
Integer_TotalPoisonTrapsBuilt | integer | No | |
Integer_TotalSlamTrapsBuilt | integer | No | |
Integer_TotalVoidTrapsBuilt | integer | No | |
Integer_TowerLimit | integer | No | |
Integer_VenomPoisonPlyNum | integer | No | |
Integer_VoidTrapConBPlyNum | integer | No | |
Integer_VoidTrapConPlyNum | integer | No | |
Integer_VoidTrapPlyNum | integer | No | |
Integer_WaveAmount | integer | No | 60 |
Integer_WaveNumber | integer | No | 0 |
IsDamageAttack | boolean | No | |
IsDamageCode | boolean | No | |
IsDamageMelee | boolean | No | |
IsDamageRanged | boolean | No | |
IsDamageSpell | boolean | No | |
LethalDamageEvent | real | No | |
LethalDamageHP | real | No | |
NameLoop | integervar | No | |
NextDamageIsAttack | boolean | No | |
NextDamageIsMelee | boolean | No | |
NextDamageIsRanged | boolean | No | |
NextDamageType | integer | No | |
NextDamageWeaponT | integer | No | |
OnDamageEvent | real | No | |
Player_Array_AntiBuild | player | Yes | |
Player_GoldAuraPlayer | player | No | |
Player_Inactive | player | No | |
PlayerGroup_Permanent | force | Yes | |
PlayerGroup_StartMsg | force | No | |
PlayerName | string | Yes | |
PlyGroup_Array_HeroAbilities | force | Yes | |
Point_Array_Blink | location | Yes | |
Point_Array_DarknessTrap | location | Yes | |
Point_Array_DarkTrapDoom | location | Yes | |
Point_Array_DebuggerBlue | location | Yes | |
Point_Array_DebuggerGray | location | Yes | |
Point_Array_DebuggerGreen | location | Yes | |
Point_Array_DebuggerOrange | location | Yes | |
Point_Array_DebuggerPink | location | Yes | |
Point_Array_DebuggerPurple | location | Yes | |
Point_Array_DebuggerRed | location | Yes | |
Point_Array_DebuggerTeal | location | Yes | |
Point_Array_DebuggerYellow | location | Yes | |
Point_Array_DestroyTower | location | Yes | |
Point_Array_DummyPoint | location | Yes | |
Point_Array_EarthTrap | location | Yes | |
Point_Array_EarthTrapStorm | location | Yes | |
Point_Array_FireTrap | location | Yes | |
Point_Array_FireTrapBreath | location | Yes | |
Point_Array_FrostTrapBreath | location | Yes | |
Point_Array_FrostTrapBreathTar | location | Yes | |
Point_Array_FrostTrapCage | location | Yes | |
Point_Array_GlaiveTower | location | Yes | |
Point_Array_GlaiveTowerTarget | location | Yes | |
Point_Array_HellfireTower | location | Yes | |
Point_Array_HeroPoint | location | Yes | |
Point_Array_HHSpawnPoint | location | Yes | |
Point_Array_IronTrap | location | Yes | |
Point_Array_PoisonTrap | location | Yes | |
Point_Array_PoisonTrapCascade | location | Yes | |
Point_Array_PoisonTrapTarget | location | Yes | |
Point_Array_ShardTower | location | Yes | |
Point_Array_ShrapTower | location | Yes | |
Point_Array_SoulTower | location | Yes | |
Point_Array_SpiritTower | location | Yes | |
Point_Array_VenomTower | location | Yes | |
Point_Array_VoidTrap | location | Yes | |
Point_Array_VoidTrapConB | location | Yes | |
Point_EasterEgg | location | No | |
Point_Goldrush | location | No | |
Point_LoseLifeAnim | location | No | |
Point_SellTower | location | No | |
Point_Tabaho | location | No | |
PointArray_Waypoints | location | Yes | |
PreDamageEvent | real | No | |
Real_Array_BonusCritChance | real | Yes | |
Real_Array_BonusCritDamage | real | Yes | |
Real_Array_BrainfreezeChance | real | Yes | |
Real_Array_CameraDistance | real | Yes | 2500.00 |
Real_Array_ChaosHealthPerHigh | real | Yes | |
Real_Array_ChaosHealthPerLow | real | Yes | |
Real_Array_CreepHealthWaves | real | Yes | |
Real_Array_CritAuraChances | real | Yes | |
Real_Array_CritAuraDamage | real | Yes | |
Real_Array_CritChance | real | Yes | |
Real_Array_EnchantGlaiveChance | real | Yes | |
Real_Array_GlaiveDistance | real | Yes | |
Real_Array_Handicap | real | Yes | |
Real_Array_HPMultiplierWaves | real | Yes | 1.00 |
Real_Array_MeleeCritDamage | real | Yes | 100.00 |
Real_Array_MessageTime | real | Yes | |
Real_Array_RandomWaveBounty | real | Yes | |
Real_Array_RangedCritDamage | real | Yes | 1.50 |
Real_Array_RWArmour | real | Yes | 30.00 |
Real_Array_RWArmourTotal | real | Yes | |
Real_Array_RWHealth | real | Yes | |
Real_Array_ShardTowerChance | real | Yes | |
Real_Array_ShrapBlastChance | real | Yes | |
Real_Array_SkillCritChance | real | Yes | |
Real_Array_SkillCritDamage | real | Yes | |
Real_Array_SoulTowerChance | real | Yes | |
Real_Array_SoulTowerDamage | real | Yes | |
Real_Array_SpellCritDamage | real | Yes | 3.00 |
Real_CreepHealth | real | No | 100.00 |
Real_CreepHealthMultiplier | real | No | 1.00 |
Real_CreepHealthTotal | real | No | |
Real_DefaultGamemode | real | No | |
Real_HealthToLives | real | No | |
Real_Lives | real | No | 100.00 |
Real_OrkColour | real | No | 100.00 |
Real_OrkSize | real | No | 130.00 |
Real_RestartRedAfk | real | No | |
Real_ShrapTowerUnitArm | real | No | |
Real_SpawnTime | real | No | 15.00 |
Region_Array_RandomWaves | rect | Yes | |
RemoveDamageEvent | boolean | No | |
ReportLife | real | No | |
SourceDamageEvent | real | No | |
SpawnPoints_PntArray | location | Yes | |
String_AirWavesText | string | No | |
String_Array_Alpharius | string | Yes | |
String_Array_AuraLevel | string | Yes | |
String_Array_ChaosMultiplier | string | Yes | |
String_Array_ImageFile | string | Yes | |
String_Array_MBStatWavUniIcons | string | Yes | |
String_Array_MBWaveModifier | string | Yes | |
String_Array_MultiBoardColours | string | Yes | |
String_Array_PlayerNames | string | Yes | |
String_Array_TowerEnabled | string | Yes | |
String_Array_WaveType | string | Yes | |
String_DivineWavesText | string | No | |
String_EmptyString | string | No | |
String_HeroWavesText | string | No | |
String_JackpotWinner | string | No | |
String_RWBossWaveText | string | No | |
TempPlayer | player | No | |
TempString | string | Yes | |
Timestamp | timer | No | |
Unit_Array_Heroes | unit | Yes | |
Unit_Array_IronTraps | unit | Yes | |
Unit_Array_NextUnits | unit | Yes | |
Unit_AuraTower | unit | Yes | |
UNIT_CLASS_ANCIENT | integer | No | |
UNIT_CLASS_ATTACKS_FLYING | integer | No | |
UNIT_CLASS_ATTACKS_GROUND | integer | No | |
UNIT_CLASS_DEAD | integer | No | |
UNIT_CLASS_ETHEREAL | integer | No | |
UNIT_CLASS_FLYING | integer | No | |
UNIT_CLASS_GIANT | integer | No | |
UNIT_CLASS_GROUND | integer | No | |
UNIT_CLASS_HERO | integer | No | |
UNIT_CLASS_MAGIC_IMMUNE | integer | No | |
UNIT_CLASS_MECHANICAL | integer | No | |
UNIT_CLASS_MELEE | integer | No | |
UNIT_CLASS_PEON | integer | No | |
UNIT_CLASS_PLAGUED | integer | No | |
UNIT_CLASS_POISONED | integer | No | |
UNIT_CLASS_POLYMORPHED | integer | No | |
UNIT_CLASS_RANGED | integer | No | |
UNIT_CLASS_RESISTANT | integer | No | |
UNIT_CLASS_SAPPER | integer | No | |
UNIT_CLASS_SLEEPING | integer | No | |
UNIT_CLASS_SNARED | integer | No | |
UNIT_CLASS_STRUCTURE | integer | No | |
UNIT_CLASS_STUNNED | integer | No | |
UNIT_CLASS_SUMMONED | integer | No | |
UNIT_CLASS_TAUREN | integer | No | |
UNIT_CLASS_TOWNHALL | integer | No | |
UNIT_CLASS_UNDEAD | integer | No | |
Unit_Mine | unit | No | |
Unit_RandomBoss | unit | No | |
UnitGroup_Array_CascadePreG | group | Yes | |
UnitGroup_Array_PoisCasGroup | group | Yes | |
UnitGroup_Array_SoulTowerUnits | group | Yes | |
UnitGroup_GoldRushGrp | group | No | |
UnitGroup_LoseLifeNoGoldRW | group | No | |
UnitGroup_PoisonTrapRandomUnit | group | No | |
UnitGroup_VenomRandomUnit | group | No | |
UnitType_Array_EndWaveArmor | unitcode | Yes | |
UnitType_Array_RWAir | unitcode | Yes | |
UnitType_Array_RWFortified | unitcode | Yes | |
UnitType_Array_RWHeavy | unitcode | Yes | |
UnitType_Array_RWHero | unitcode | Yes | |
UnitType_Array_RWImmune | unitcode | Yes | |
UnitType_Array_RWLight | unitcode | Yes | |
UnitType_Array_RWMedium | unitcode | Yes | |
UnitType_Array_RWSpawnUnit | unitcode | Yes | |
UnitType_Array_SoulTowerUnits | unitcode | Yes | |
UnitType_Array_UnitsTypes | unitcode | Yes | UnitTypeNull |
UnitType_HHUnit | unitcode | No | |
WEAPON_TYPE_AM_CHOP | integer | No | |
WEAPON_TYPE_CH_SLICE | integer | No | |
WEAPON_TYPE_CL_SLICE | integer | No | |
WEAPON_TYPE_CM_SLICE | integer | No | |
WEAPON_TYPE_MH_BASH | integer | No | |
WEAPON_TYPE_MH_CHOP | integer | No | |
WEAPON_TYPE_MH_SLICE | integer | No | |
WEAPON_TYPE_MH_STAB | integer | No | |
WEAPON_TYPE_ML_CHOP | integer | No | |
WEAPON_TYPE_ML_SLICE | integer | No | |
WEAPON_TYPE_MM_BASH | integer | No | |
WEAPON_TYPE_MM_CHOP | integer | No | |
WEAPON_TYPE_MM_SLICE | integer | No | |
WEAPON_TYPE_MM_STAB | integer | No | |
WEAPON_TYPE_NONE | integer | No | |
WEAPON_TYPE_RH_BASH | integer | No | |
WEAPON_TYPE_WH_BASH | integer | No | |
WEAPON_TYPE_WH_SLICE | integer | No | |
WEAPON_TYPE_WL_BASH | integer | No | |
WEAPON_TYPE_WL_SLICE | integer | No | |
WEAPON_TYPE_WL_STAB | integer | No | |
WEAPON_TYPE_WM_BASH | integer | No | |
WEAPON_TYPE_WM_SLICE | integer | No | |
WEAPON_TYPE_WM_STAB | integer | No | |
WeaponTypeDebugStr | string | Yes | |
ZeroDamageEvent | real | No |
--Global Initialization 1.1 also hooks the InitCustomTriggers and RunInitializationTriggers functions
do
local iFuncs = {}
function onInitialization(func) -- Runs once all Map Initialization triggers are executed
iFuncs[func] = func
end
local function runInitialization()
for k, f in pairs(iFuncs) do f() end
iFuncs = nil
end
local tFuncs = {}
function onTriggerInit(func) -- Runs once all InitTrig_ functions are called
tFuncs[func] = func
end
local function runTriggerInit()
for k, f in pairs(tFuncs) do f() end
tFuncs = nil
local old = RunInitializationTriggers
if old then
function RunInitializationTriggers()
old()
runInitialization()
end
else
runInitialization()
end
end
local gFuncs = {}
function onGlobalInit(func) --Runs once all udg_ globals are set.
gFuncs[func] = func --Simplification thanks to TheReviewer and Zed on Hive Discord
end
local function runGlobalInit()
for k, f in pairs(gFuncs) do f() end
gFuncs = nil
local old = InitCustomTriggers
if old then
function InitCustomTriggers()
old()
runTriggerInit()
end
else
runTriggerInit()
end
end
local oldBliz = InitBlizzard
function InitBlizzard()
oldBliz()
local old = InitGlobals
if old then
function InitGlobals()
old()
runGlobalInit()
end
else
runGlobalInit()
end
end
end
-- TriggerRegisterVariableEvent hook to convert these old school events into something more useful.
do
events = {}
function onRegisterVar(func)
events[func] = func
end
local oldEvent = TriggerRegisterVariableEvent
function TriggerRegisterVariableEvent(trig, var, op, val)
for k, func in pairs(events) do
if func(trig, var, val) then return end
end
oldEvent(trig, var, op, val)
end
end
--[[
===========================================================================
Lua Version
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 (after it was dealt to the unit): use the event "DamageEvent Equal to 1.00"
- To change damage before it is dealt: use the event "DamageModifierEvent 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"
You can specify the DamageEventType before dealing triggered damage:
- Set NextDamageType = DamageTypeWhatever
- Unit - Cause...
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".
GUI Vars:
Retained from 3.8 and prior:
----------------------------
unit udg_DamageEventSource
unit udg_DamageEventTarget
unit udg_EnhancedDamageTarget
group udg_DamageEventAOEGroup
integer udg_DamageEventAOE
integer udg_DamageEventLevel
real udg_DamageModifierEvent
real udg_DamageEvent
real udg_AfterDamageEvent
real udg_DamageEventAmount
real udg_DamageEventPrevAmt
real udg_AOEDamageEvent
boolean udg_DamageEventOverride
boolean udg_NextDamageType
boolean udg_DamageEventType
boolean udg_IsDamageSpell
Added in 5.0:
boolean udg_IsDamageMelee
boolean udg_IsDamageRanged
unit udg_AOEDamageSource
real udg_LethalDamageEvent
real udg_LethalDamageHP
real udg_DamageScalingWC3
integer udg_DamageEventAttackT
integer udg_DamageEventDamageT
integer udg_DamageEventWeaponT
Added in 5.1:
boolean udg_IsDamageCode
Added in 5.2:
integer udg_DamageEventArmorT
integer udg_DamageEventDefenseT
Addded in 5.3:
real DamageEventArmorPierced
real udg_DamageScalingUser
Added in 5.4.2 to allow GUI users to re-issue the exact same attack and damage type at the attacker.
attacktype array udg_CONVERTED_ATTACK_TYPE
damagetype array udg_CONVERTED_DAMAGE_TYPE
=============================================================================
--]]
do
local alarm = CreateTimer()
local alarmSet = false
--Values to track the original pre-spirit Link/defensive damage values
local canKick = true
local totem = false
local armorType = 0
local defenseType = 0
local prev = {}
--Stuff to track recursive UnitDamageTarget calls.
local eventsRun = false
local kicking = false
local stack = {}
--Added in 5.4 to silently eliminate infinite recursion.
local userTrigs = 9
local eventTrig = 0
local nextTrig = {}
local userTrig = {}
local trigFrozen = {}
--Added/re-tooled in 5.4.1 to allow forced recursion (for advanced users only).
local levelsDeep = {} --How deep the user recursion currently is.
local LIMBO = 16 --Recursion will never go deeper than LIMBO.
DamageEngine_inception= false --You must set DamageEngine_inception = true before dealing damage to utlize this.
--When true, it allows your trigger to potentially go recursive up to LIMBO.
local dreaming = false
local fischerMorrow = {} --track targets of recursion
local inceptionTrig = {} --Added in 5.4.2 to simplify the inception variable for very complex DamageEvent trigger.
local proclusGlobal = {} --track sources of recursion
local sleepLevel = 0
--Improves readability in the code to have these as named constants.
local event = {
mod = 1,
shield = 4,
damage = 5,
zero = 6,
after = 7,
lethal = 8,
aoe = 9
}
local function runTrigs(i)
local cat = i
dreaming = true
--print("Running " .. cat)
while (true) do
i = nextTrig[i]
if (i == 0)
or (cat == event.mod and (udg_DamageEventOverride or udg_DamageEventType*udg_DamageEventType == 4))
or (cat == event.shield and udg_DamageEventAmount <= 0.00)
or (cat == event.lethal and udg_LethalDamageHP > 0.405) then
break
end
if not trigFrozen[i] then
eventTrig = i
if RunTrigger then --Added 10 July 2019 to enable FastTriggers mode.
RunTrigger(userTrig[i])
elseif IsTriggerEnabled(userTrig[i])
and TriggerEvaluate(userTrig[i]) then
TriggerExecute(userTrig[i])
end
--print("Ran " .. i)
end
end
--print("Ran")
dreaming = false
end
local function onAOEEnd()
if udg_DamageEventAOE > 1 then
runTrigs(event.aoe)
udg_DamageEventAOE = 1
end
udg_DamageEventLevel = 1
udg_EnhancedDamageTarget= nil
udg_AOEDamageSource = nil
GroupClear(udg_DamageEventAOEGroup)
end
local function afterDamage()
if udg_DamageEventPrevAmt ~= 0.00 and udg_DamageEventDamageT ~= udg_DAMAGE_TYPE_UNKNOWN then
runTrigs(event.after)
end
end
local oldUDT = UnitDamageTarget
local function finish()
if eventsRun then
--print "events ran"
eventsRun = false
afterDamage()
end
if canKick and not kicking then
local n = #stack
if n > 0 then
kicking = true
--print("Clearing Recursion: " .. n)
local i = 0
local open
repeat
sleepLevel = sleepLevel + 1
repeat
i = i + 1 --Need to loop bottom to top to make sure damage order is preserved.
open = stack[i]
udg_NextDamageType = open.type
--print("Stacking on " .. open.amount)
oldUDT(open.source, open.target, open.amount, true, false, open.attack, open.damage, open.weapon)
afterDamage()
until (i == n)
--print("Exit at: " .. i)
n = #stack
until (i == n)
--print("Terminate at: " .. i)
sleepLevel = 0
repeat
open = stack[i].trig
stack[i] = nil
proclusGlobal[open] = nil
fischerMorrow[open] = nil
trigFrozen[open] = false -- Only re-enable recursive triggers AFTER all damage is dealt.
levelsDeep[open] = 0 --Reset this stuff if the user tried some nonsense
--print("unfreezing " .. open)
i = i - 1
until (i == 0)
kicking = false
end
end
end
function UnitDamageTarget(src, tgt, amt, a, r, at, dt, wt)
if udg_NextDamageType == 0 then
udg_NextDamageType = udg_DamageTypeCode
end
local b = false
if dreaming then
if amt ~= 0.00 then
-- Store triggered, recursive damage into a stack.
-- This damage will be fired after the current damage instance has wrapped up its events.
stack[#stack + 1] = {
type = udg_NextDamageType,
source = src,
target = tgt,
amount = amt,
attack = at,
damage = dt,
weapon = wt,
trig = eventTrig
}
--print("increasing damage stack: " .. #stack)
-- Next block added in 5.4.1 to allow *some* control over whether recursion should kick
-- in. Also it's important to track whether the source and target were both involved at
-- some earlier point, so this is a more accurate and lenient method than before.
DamageEngine_inception = DamageEngine_inception or inceptionTrig[eventTrig]
local sg = proclusGlobal[eventTrig]
if not sg then
sg = {}
proclusGlobal[eventTrig] = sg
end
sg[udg_DamageEventSource] = true
local tg = fischerMorrow[eventTrig]
if not tg then
tg = {}
fischerMorrow[eventTrig] = tg
end
tg[udg_DamageEventTarget] = true
if kicking and sg[src] and tg[tgt] then
if DamageEngine_inception and not trigFrozen[eventTrig] then
inceptionTrig[eventTrig] = true
if levelsDeep[eventTrig] < sleepLevel then
levelsDeep[eventTrig] = levelsDeep[eventTrig] + 1
if levelsDeep[eventTrig] >= LIMBO then
--print("freezing inception trig: " .. eventTrig)
trigFrozen[eventTrig] = true
end
end
else
--print("freezing standard trig: " .. eventTrig)
trigFrozen[eventTrig] = true
end
end
end
else
b = oldUDT(src, tgt, amt, a, r, at, dt, wt)
end
--print("setting inception to false")
DamageEngine_inception = false
udg_NextDamageType = 0
if b and not dreaming then
finish() -- Wrap up the outstanding damage instance right away.
end
return b
end
local function resetArmor()
if udg_DamageEventArmorPierced ~= 0.00 then
BlzSetUnitArmor(udg_DamageEventTarget, BlzGetUnitArmor(udg_DamageEventTarget) + udg_DamageEventArmorPierced)
end
if armorType ~= udg_DamageEventArmorT then
BlzSetUnitIntegerField(udg_DamageEventTarget, UNIT_IF_ARMOR_TYPE, armorType) --revert changes made to the damage instance
end
if defenseType ~= udg_DamageEventDefenseT then
BlzSetUnitIntegerField(udg_DamageEventTarget, UNIT_IF_DEFENSE_TYPE, defenseType)
end
end
local function failsafeClear()
--print("Damage from " .. GetUnitName(udg_DamageEventSource) .. " to " .. GetUnitName(udg_DamageEventTarget) .. " has been messing up Damage Engine.")
--print(udg_DamageEventAmount .. " " .. " " .. udg_DamageEventPrevAmt .. " " .. udg_AttackTypeDebugStr[udg_DamageEventAttackT] .. " " .. udg_DamageTypeDebugStr[udg_DamageEventDamageT])
resetArmor()
canKick = true
totem = false
udg_DamageEventAmount = 0.00
udg_DamageScalingWC3 = 0.00
if udg_DamageEventDamageT ~= udg_DAMAGE_TYPE_UNKNOWN then
runTrigs(event.damage) --Run the normal on-damage event based on this failure.
eventsRun = true --Run the normal after-damage event based on this failure.
end
finish()
end
local function calibrateMR()
udg_IsDamageMelee = false
udg_IsDamageRanged = false
udg_IsDamageSpell = udg_DamageEventAttackT == 0 --In Patch 1.31, one can just check the attack type to find out if it's a spell.
if udg_DamageEventDamageT == udg_DAMAGE_TYPE_NORMAL and not udg_IsDamageSpell then --This damage type is the only one that can get reduced by armor.
udg_IsDamageMelee = IsUnitType(udg_DamageEventSource, UNIT_TYPE_MELEE_ATTACKER)
udg_IsDamageRanged = IsUnitType(udg_DamageEventSource, UNIT_TYPE_RANGED_ATTACKER)
if udg_IsDamageMelee and udg_IsDamageRanged then
udg_IsDamageMelee = udg_DamageEventWeaponT > 0-- Melee units play a sound when damaging
udg_IsDamageRanged = not udg_IsDamageMelee -- In the case where a unit is both ranged and melee, the ranged attack plays no sound.
end -- The Huntress has a melee sound for her ranged projectile, however it is only an issue
end --if she also had a melee attack, because by default she is only UNIT_TYPE_RANGED_ATTACKER.
end
local t1 = CreateTrigger()
TriggerRegisterAnyUnitEventBJ(t1, EVENT_PLAYER_UNIT_DAMAGING)
TriggerAddCondition(t1, Filter(function()
local src = GetEventDamageSource()
local tgt = BlzGetEventDamageTarget()
local amt = GetEventDamage()
local at = BlzGetEventAttackType()
local dt = BlzGetEventDamageType()
local wt = BlzGetEventWeaponType()
--print "First damage event running"
if not kicking then
if alarmSet then
if totem then
if dt ~= DAMAGE_TYPE_SPIRIT_LINK and dt ~= DAMAGE_TYPE_DEFENSIVE and dt ~= DAMAGE_TYPE_PLANT then
-- if 'totem' is still set and it's not due to spirit link distribution or defense retaliation,
-- the next function must be called as a debug. This reverts an issue I created in patch 5.1.3.
failsafeClear()
else
totem = false
canKick = false
prev.type = udg_DamageEventType -- also store the damage type.
prev.amount = udg_DamageEventAmount
prev.preAmt = udg_DamageEventPrevAmt -- Store the actual pre-armor value.
prev.pierce = udg_DamageEventArmorPierced
prev.armor = udg_DamageEventArmorT
prev.preArm = armorType
prev.defense= udg_DamageEventDefenseT
prev.preDef = defenseType
prev.code = udg_IsDamageCode -- store this as well.
end
end
if src ~= udg_AOEDamageSource then -- Source has damaged more than once
onAOEEnd() -- New damage source - unflag everything
udg_AOEDamageSource = src
elseif tgt == udg_EnhancedDamageTarget then
udg_DamageEventLevel= udg_DamageEventLevel + 1 -- The number of times the same unit was hit.
elseif not IsUnitInGroup(tgt, udg_DamageEventAOEGroup) then
udg_DamageEventAOE = udg_DamageEventAOE + 1 -- Multiple targets hit by this source - flag as AOE
end
else
TimerStart(alarm, 0.00, false, function()
alarmSet = false --The timer has expired. Flag off to allow it to be restarted when needed.
finish() --Wrap up any outstanding damage instance
onAOEEnd() --Reset things so they don't perpetuate for AoE/Level target detection
end)
alarmSet = true
udg_AOEDamageSource = src
udg_EnhancedDamageTarget= tgt
end
GroupAddUnit(udg_DamageEventAOEGroup, tgt)
end
udg_DamageEventType = udg_NextDamageType
udg_IsDamageCode = udg_NextDamageType ~= 0
udg_DamageEventOverride = dt == nil -- Got rid of NextDamageOverride in 5.1 for simplicity
udg_DamageEventPrevAmt = amt
udg_DamageEventSource = src
udg_DamageEventTarget = tgt
udg_DamageEventAmount = amt
udg_DamageEventAttackT = GetHandleId(at)
udg_DamageEventDamageT = GetHandleId(dt)
udg_DamageEventWeaponT = GetHandleId(wt)
calibrateMR() -- Set Melee and Ranged settings.
udg_DamageEventArmorT = BlzGetUnitIntegerField(udg_DamageEventTarget, UNIT_IF_ARMOR_TYPE) -- Introduced in Damage Engine 5.2.0.0
udg_DamageEventDefenseT = BlzGetUnitIntegerField(udg_DamageEventTarget, UNIT_IF_DEFENSE_TYPE)
armorType = udg_DamageEventArmorT
defenseType = udg_DamageEventDefenseT
udg_DamageEventArmorPierced = 0.00
udg_DamageScalingUser = 1.00
udg_DamageScalingWC3 = 1.00
if amt ~= 0.00 then
if not udg_DamageEventOverride then
runTrigs(event.mod)
-- All events have run and the pre-damage amount is finalized.
BlzSetEventAttackType(ConvertAttackType(udg_DamageEventAttackT))
BlzSetEventDamageType(ConvertDamageType(udg_DamageEventDamageT))
BlzSetEventWeaponType(ConvertWeaponType(udg_DamageEventWeaponT))
if udg_DamageEventArmorPierced ~= 0.00 then
BlzSetUnitArmor(udg_DamageEventTarget, BlzGetUnitArmor(udg_DamageEventTarget) - udg_DamageEventArmorPierced)
end
if armorType ~= udg_DamageEventArmorT then
BlzSetUnitIntegerField(udg_DamageEventTarget, UNIT_IF_ARMOR_TYPE, udg_DamageEventArmorT) -- Introduced in Damage Engine 5.2.0.0
end
if defenseType ~= udg_DamageEventDefenseT then
BlzSetUnitIntegerField(udg_DamageEventTarget, UNIT_IF_DEFENSE_TYPE, udg_DamageEventDefenseT) -- Introduced in Damage Engine 5.2.0.0
end
BlzSetEventDamage(udg_DamageEventAmount)
end
totem = true
-- print("Ready to deal " .. udg_DamageEventAmount)
else
runTrigs(event.zero)
canKick = true
finish()
end
return false
end))
local t2 = CreateTrigger()
TriggerRegisterAnyUnitEventBJ(t2, EVENT_PLAYER_UNIT_DAMAGED)
TriggerAddCondition(t2, Filter(function()
if udg_DamageEventPrevAmt == 0.00 then
return false
end
--print "Second event running"
if totem then
totem = false --This should be the case in almost all circumstances
else
afterDamage() --Wrap up the outstanding damage instance
canKick = true
--Unfortunately, Spirit Link and Thorns Aura/Spiked Carapace fire the DAMAGED event out of sequence with the DAMAGING event,
--so I have to re-generate a buncha stuff here.
udg_DamageEventSource = GetEventDamageSource()
udg_DamageEventTarget = GetTriggerUnit()
udg_DamageEventAmount = prev.amount
udg_DamageEventPrevAmt = prev.preAmt
udg_DamageEventAttackT = GetHandleId(BlzGetEventAttackType())
udg_DamageEventDamageT = GetHandleId(BlzGetEventDamageType())
udg_DamageEventWeaponT = GetHandleId(BlzGetEventWeaponType())
udg_DamageEventType = prev.type
udg_IsDamageCode = prev.code
udg_DamageEventArmorT = prev.armor
udg_DamageEventDefenseT = prev.defense
udg_DamageEventArmorPierced= prev.pierce
armorType = prev.preArm
defenseType = prev.preDef
calibrateMR() --Apply melee/ranged settings once again.
end
resetArmor()
local r = GetEventDamage()
if udg_DamageEventAmount ~= 0.00 and r ~= 0.00 then
udg_DamageScalingWC3 = r/udg_DamageEventAmount
else
if udg_DamageEventAmount > 0.00 then
udg_DamageScalingWC3 = 0.00
else
udg_DamageScalingWC3 = 1.00
end
udg_DamageScalingUser = udg_DamageEventAmount/udg_DamageEventPrevAmt
end
udg_DamageEventAmount = udg_DamageEventAmount*udg_DamageScalingWC3
if udg_DamageEventAmount > 0.00 then
--This event is used for custom shields which have a limited hit point value
--The shield here kicks in after armor, so it acts like extra hit points.
runTrigs(event.shield)
udg_LethalDamageHP = GetWidgetLife(udg_DamageEventTarget) - udg_DamageEventAmount
if udg_LethalDamageHP <= 0.405 then
runTrigs(event.lethal) -- added 10 May 2019 to detect and potentially prevent lethal damage. Instead of
-- modifying the damage, you need to modify LethalDamageHP instead (the final HP of the unit).
udg_DamageEventAmount = GetWidgetLife(udg_DamageEventTarget) - udg_LethalDamageHP
if udg_DamageEventType < 0 and udg_LethalDamageHP <= 0.405 then
SetUnitExploded(udg_DamageEventTarget, true) --Explosive damage types should blow up the target.
end
end
udg_DamageScalingUser = udg_DamageEventAmount/udg_DamageEventPrevAmt/udg_DamageScalingWC3
end
BlzSetEventDamage(udg_DamageEventAmount) --Apply the final damage amount.
if udg_DamageEventDamageT ~= udg_DAMAGE_TYPE_UNKNOWN then
runTrigs(event.damage)
end
eventsRun = true
--print(canKick)
if udg_DamageEventAmount == 0.00 then
finish()
end
return false
end))
onGlobalInit(function()
local i
for i = 0, 6 do udg_CONVERTED_ATTACK_TYPE[i] = ConvertAttackType(i) end
for i = 0, 26 do udg_CONVERTED_DAMAGE_TYPE[i] = ConvertDamageType(i) end
udg_AttackTypeDebugStr[0] = "SPELLS" -- ATTACK_TYPE_NORMAL in JASS
udg_AttackTypeDebugStr[1] = "NORMAL" -- ATTACK_TYPE_MELEE in JASS
udg_AttackTypeDebugStr[2] = "PIERCE"
udg_AttackTypeDebugStr[3] = "SIEGE"
udg_AttackTypeDebugStr[4] = "MAGIC"
udg_AttackTypeDebugStr[5] = "CHAOS"
udg_AttackTypeDebugStr[6] = "HERO"
udg_DamageTypeDebugStr[0] = "UNKNOWN"
udg_DamageTypeDebugStr[4] = "NORMAL"
udg_DamageTypeDebugStr[5] = "ENHANCED"
udg_DamageTypeDebugStr[8] = "FIRE"
udg_DamageTypeDebugStr[9] = "COLD"
udg_DamageTypeDebugStr[10] = "LIGHTNING"
udg_DamageTypeDebugStr[11] = "POISON"
udg_DamageTypeDebugStr[12] = "DISEASE"
udg_DamageTypeDebugStr[13] = "DIVINE"
udg_DamageTypeDebugStr[14] = "MAGIC"
udg_DamageTypeDebugStr[15] = "SONIC"
udg_DamageTypeDebugStr[16] = "ACID"
udg_DamageTypeDebugStr[17] = "FORCE"
udg_DamageTypeDebugStr[18] = "DEATH"
udg_DamageTypeDebugStr[19] = "MIND"
udg_DamageTypeDebugStr[20] = "PLANT"
udg_DamageTypeDebugStr[21] = "DEFENSIVE"
udg_DamageTypeDebugStr[22] = "DEMOLITION"
udg_DamageTypeDebugStr[23] = "SLOW_POISON"
udg_DamageTypeDebugStr[24] = "SPIRIT_LINK"
udg_DamageTypeDebugStr[25] = "SHADOW_STRIKE"
udg_DamageTypeDebugStr[26] = "UNIVERSAL"
udg_WeaponTypeDebugStr[0] = "NONE" -- WEAPON_TYPE_WHOKNOWS in JASS
udg_WeaponTypeDebugStr[1] = "METAL_LIGHT_CHOP"
udg_WeaponTypeDebugStr[2] = "METAL_MEDIUM_CHOP"
udg_WeaponTypeDebugStr[3] = "METAL_HEAVY_CHOP"
udg_WeaponTypeDebugStr[4] = "METAL_LIGHT_SLICE"
udg_WeaponTypeDebugStr[5] = "METAL_MEDIUM_SLICE"
udg_WeaponTypeDebugStr[6] = "METAL_HEAVY_SLICE"
udg_WeaponTypeDebugStr[7] = "METAL_MEDIUM_BASH"
udg_WeaponTypeDebugStr[8] = "METAL_HEAVY_BASH"
udg_WeaponTypeDebugStr[9] = "METAL_MEDIUM_STAB"
udg_WeaponTypeDebugStr[10] = "METAL_HEAVY_STAB"
udg_WeaponTypeDebugStr[11] = "WOOD_LIGHT_SLICE"
udg_WeaponTypeDebugStr[12] = "WOOD_MEDIUM_SLICE"
udg_WeaponTypeDebugStr[13] = "WOOD_HEAVY_SLICE"
udg_WeaponTypeDebugStr[14] = "WOOD_LIGHT_BASH"
udg_WeaponTypeDebugStr[15] = "WOOD_MEDIUM_BASH"
udg_WeaponTypeDebugStr[16] = "WOOD_HEAVY_BASH"
udg_WeaponTypeDebugStr[17] = "WOOD_LIGHT_STAB"
udg_WeaponTypeDebugStr[18] = "WOOD_MEDIUM_STAB"
udg_WeaponTypeDebugStr[19] = "CLAW_LIGHT_SLICE"
udg_WeaponTypeDebugStr[20] = "CLAW_MEDIUM_SLICE"
udg_WeaponTypeDebugStr[21] = "CLAW_HEAVY_SLICE"
udg_WeaponTypeDebugStr[22] = "AXE_MEDIUM_CHOP"
udg_WeaponTypeDebugStr[23] = "ROCK_HEAVY_BASH"
udg_DefenseTypeDebugStr[0] = "LIGHT"
udg_DefenseTypeDebugStr[1] = "MEDIUM"
udg_DefenseTypeDebugStr[2] = "HEAVY"
udg_DefenseTypeDebugStr[3] = "FORTIFIED"
udg_DefenseTypeDebugStr[4] = "NORMAL"
udg_DefenseTypeDebugStr[5] = "HERO"
udg_DefenseTypeDebugStr[6] = "DIVINE"
udg_DefenseTypeDebugStr[7] = "UNARMORED"
udg_ArmorTypeDebugStr[0] = "NONE"
udg_ArmorTypeDebugStr[1] = "FLESH"
udg_ArmorTypeDebugStr[2] = "METAL"
udg_ArmorTypeDebugStr[3] = "WOOD"
udg_ArmorTypeDebugStr[4] = "ETHEREAL"
udg_ArmorTypeDebugStr[5] = "STONE"
end)
function DamageEngine_SetupEvent(whichTrig, var, val)
--print("Setup event: " .. var)
local mx = 1
local off = 0
local ex = 0
if var == "udg_DamageModifierEvent" then --event.mod 1-4 -> Events 1-4
if (val < 3) then
ex = val + 1
end
mx = 4
elseif var == "udg_DamageEvent" then --event.damage 1,2 -> Events 5,6
mx = 2
off = 4
elseif var == "udg_AfterDamageEvent" then --event.after -> Event 7
off = 6
elseif var == "udg_LethalDamageEvent" then --event.lethal -> Event 8
off = 7
elseif var == "udg_AOEDamageEvent" then --event.aoe -> Event 9
off = 8
else
return false
end
local i
if userTrigs == 9 then
nextTrig[1] = 2
nextTrig[2] = 3
trigFrozen[2] = true
trigFrozen[3] = true
for i = 3, 9 do nextTrig[i] = 0 end
end
i = math.max(math.min(val, mx), 1) + off
--print("Root index: " .. i .. " nextTrig: " .. nextTrig[i] .. " exit: " .. ex)
repeat
val = i
i = nextTrig[i]
until (i == ex)
userTrigs = userTrigs + 1 --User list runs from index 10 and up
nextTrig[val] = userTrigs
nextTrig[userTrigs] = ex
userTrig[userTrigs] = whichTrig
levelsDeep[userTrigs] = 0
trigFrozen[userTrigs] = false
inceptionTrig[userTrigs] = false
--print("Registered " .. userTrigs .. " to " .. val)
return true
end
onRegisterVar(function(trig, var, val)
DamageEngine_SetupEvent(trig, var, math.floor(val))
end)
end
-- Arcing Text Tag v1.0.0.3 by Maker encoded to Lua
DEFINITION = 1.0/60.0
SIZE_MIN = 0.024 -- Minimum size of text
SIZE_BONUS = 0.00 -- Text size increase
TIME_LIFE = 1.0 -- How long the text lasts
TIME_FADE = 0.8 -- When does the text start to fade
Z_OFFSET = 70 -- Height above unit
Z_OFFSET_BON = 50 -- How much extra height the text gains
VELOCITY = 4.0 -- How fast the text move in x/y plane
TMR = CreateTimer()
ANGLE_RND = true -- Is the angle random or fixed
if not ANGLE_RND then
ANGLE = bj_PI/1.0 -- If fixed, specify the Movement angle of the text.
end
tt = {}
as = {} -- angle, sin component
ac = {} -- angle, cos component
ah = {} -- arc height
t = {} -- time
x = {} -- origin x
y = {} -- origin y
str = {} -- text
ic = 0 -- Instance count
rn = {} ; rn[0] = 0
next = {} ; next[0] = 0
prev = {} ; prev[0] = 0 --Needed due to Lua not initializing them.
function ArcingTextTag(s, u)
local this = rn[0]
if this == 0 then
ic = ic + 1
this = ic
else
rn[0] = rn[this]
end
next[this] = 0
prev[this] = prev[0]
next[prev[0]] = this
prev[0] = this
str[this] = s
x[this] = GetUnitX(u)
y[this] = GetUnitY(u)
t[this] = TIME_LIFE
local a
if ANGLE_RND then
a = GetRandomReal(0, 2*bj_PI)
else
a = ANGLE
end
as[this] = Sin(a)*VELOCITY
ac[this] = Cos(a)*VELOCITY
ah[this] = 0.
if IsUnitVisible(u, GetLocalPlayer()) then
tt[this] = CreateTextTag()
SetTextTagPermanent(tt[this], false)
SetTextTagLifespan(tt[this], TIME_LIFE)
SetTextTagFadepoint(tt[this], TIME_FADE)
SetTextTagText(tt[this], s, SIZE_MIN)
SetTextTagPos(tt[this], x[this], y[this], Z_OFFSET)
end
if prev[this] == 0 then
TimerStart(TMR, DEFINITION, true, function()
local this = next[0]
local p
while (this ~= 0) do
p = Sin(bj_PI*t[this])
t[this] = t[this] - DEFINITION
x[this] = x[this] + ac[this]
y[this] = y[this] + as[this]
SetTextTagPos(tt[this], x[this], y[this], Z_OFFSET + Z_OFFSET_BON * p)
SetTextTagText(tt[this], str[this], SIZE_MIN + SIZE_BONUS * p)
if t[this] <= 0.0 then
tt[this] = null
next[prev[this]] = next[this]
prev[next[this]] = prev[this]
rn[this] = rn[0]
rn[0] = this
if next[0] == 0 then
PauseTimer(TMR)
end
end
this = next[this]
end
end)
end
return this
end