Name | Type | is_array | initial_value |
_loading | integer | No | |
_Miltiboard_i | integer | No | |
_Quest_Player_i | integer | No | |
_timer | timer | No | |
_Visible_mod | fogmodifier | No | |
_Visible_mod_i | fogmodifier | Yes | |
AfterDamageEvent | real | No | |
Animals_count | integer | Yes | |
Animals_group | group | Yes | |
Animals_tempRnd | integer | No | |
Animals_type | unitcode | Yes | |
AOEDamageEvent | real | No | |
AOEDamageSource | unit | No | |
ArcticBlast | abilcode | No | |
ArcticBlastAttackType | attacktype | No | |
ArcticBlastCaster | unit | Yes | |
ArcticBlastDamage | real | Yes | |
ArcticBlastDamageAttach | string | No | |
ArcticBlastDamagedGroup | group | Yes | |
ArcticBlastDamagedUnit | unit | No | |
ArcticBlastDamageEffect | string | No | |
ArcticBlastDamageRadius | real | Yes | |
ArcticBlastDamageType | damagetype | No | |
ArcticBlastDistance | real | Yes | |
ArcticBlastDummy | unitcode | No | |
ArcticBlastDummyGroup | group | Yes | |
ArcticBlastDummySlowUnit | unit | Yes | |
ArcticBlastDummyUnit | unit | No | |
ArcticBlastEffectAmount | integer | Yes | |
ArcticBlastGroup | group | No | |
ArcticBlastIndex | integer | No | |
ArcticBlastInteger | integervar | No | |
ArcticBlastLevel | integer | Yes | |
ArcticBlastLevel_Copy | integer | No | |
ArcticBlastLoopIndex | integer | No | |
ArcticBlastMaxAoE | real | Yes | |
ArcticBlastOffset | location | No | |
ArcticBlastPickedPoint | location | No | |
ArcticBlastPoint | location | No | |
ArcticBlastReal | real | No | |
ArcticBlastSlow | abilcode | No | |
ArcticBlastSpeed | real | Yes | |
ArcticBlastSpreadOutSpeed | real | Yes | |
ArcticBlastTriggerPlayer | player | Yes | |
ArcticBlastUberSplat | ubersplattype | No | |
ArcticBlastVisualDummy | unitcode | No | |
ArcticBlastVisualDummyUnit | 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 | |
ArmorTypeDebugStr | string | Yes | |
AS | integer | No | |
AS_Angle | real | Yes | |
AS_Animation | real | No | |
AS_Defense_fake | integer | Yes | |
AS_Distance | real | Yes | |
AS_DMG | real | No | |
AS_Equation | real | Yes | |
AS_FLY | real | Yes | |
AS_Formula | real | Yes | |
AS_Group | group | Yes | |
AS_Hero | unit | Yes | |
AS_Max_Height | real | Yes | |
AS_Off | boolean | Yes | |
AS_Point | location | Yes | |
AS_Skip | integer | No | |
AS_Special | effect | Yes | |
AS_Speed | real | Yes | |
AS_Stable_Distance | real | Yes | |
AS_Times | integer | No | |
AS_X_Special | effect | 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 | |
B_Caster | unit | No | |
B_Caster_Dmg_Bonus | real | No | |
B_Destructible_Location | location | No | |
B_Dummy_Loop_Location | location | No | |
B_Location | location | No | |
B_Location2 | location | No | |
B_Loop_Location | location | No | |
Boss_1lvl | unitcode | Yes | |
Boss_2lvl | unitcode | Yes | |
Boss_3lvl | unitcode | Yes | |
Boss_cast_targets | integer | No | |
Boss_cast_time | integer | No | |
Boss_creep | unit | No | |
Boss_group_unstk | group | No | |
Boss_max_targets | integer | No | |
Boss_order | ordercode | No | |
Boss_wait | integer | No | |
BS_Ability | abilcode | No | |
BS_AoE | real | Yes | |
BS_Boulders | integer | Yes | |
BS_BoulderSpeed | real | Yes | |
BS_DPS | real | Yes | |
BS_DPS_AoE | real | Yes | |
BS_Dummy | unitcode | Yes | |
BS_Group | group | No | |
BS_HA | hashtable | No | |
BS_ImpactDamage | real | Yes | |
BS_Instances | integer | No | |
BS_item | item | No | |
BS_Knockback_Distance | real | Yes | |
BS_KnockbackSpeed | real | Yes | |
BS_LandingTime | real | Yes | |
Camera_Distance | integer | No | |
CBar_Abilities | abilcode | Yes | |
CBar_Abilities_c | integer | No | |
CBar_Ability | abilcode | No | |
CBar_Bar_c | unit | Yes | |
CBar_Loop | integer | No | |
CBar_Point_A | location | No | |
CBar_Rnd | integer | No | |
CBar_Temp_i | integer | No | |
CBar_Time | real | Yes | |
CE_Ability_Level | integer | No | |
CE_Area_of_Effect | real | No | |
CE_Base_Damage | real | No | |
CE_Caster | unit | No | |
CE_Damage_Group | group | No | |
CE_Destroy_Trees | boolean | No | |
CE_Knock_Angle | real | No | |
CE_Knock_Distance | real | No | |
CE_Knock_Group | group | No | |
CE_Knock_Loc1 | location | No | |
CE_Knock_Loc2 | location | No | |
CE_Knock_Speed | real | No | |
CE_Knocktable | hashtable | No | |
CE_Location | location | No | |
CE_Location2 | location | No | |
CE_Pathing_On | boolean | No | |
CE_Special_Effect | effect | No | |
CE_Special_Effect1 | effect | No | |
CE_Total_Damage | real | No | |
CE_TurnOff | boolean | No | |
CenterPoint | location | No | |
CH_Ability | abilcode | No | |
CH_Ability_Spin | abilcode | No | |
CH_Allow_Text | boolean | No | |
CH_Allow_Tree | boolean | No | |
CH_AoE | real | Yes | |
CH_Buff | buffcode | No | |
CH_Caster | unit | No | |
CH_Chance | integer | Yes | |
CH_Damage | real | Yes | |
CH_Dummy | unit | No | |
CH_Group | group | Yes | |
CH_Handle | handle | No | |
CH_Hash | hashtable | No | |
CH_Level | integer | No | |
CH_Model | string | No | |
CH_Point | location | No | |
CH_Spin_Current | real | No | |
CH_Spin_Max | real | No | |
CH_Target | unit | No | |
CH_Text_Angle | real | No | |
CH_Text_FadingAge | real | No | |
CH_Text_LifeSpan | real | No | |
CH_Text_Player | force | No | |
CH_Text_Size | real | No | |
CH_Type_Attack | attacktype | No | |
CH_Type_Damage | damagetype | No | |
CH_Type_Dummy | unitcode | No | |
CLAnimation | string | No | |
CLAnimationIndex | integer | No | |
CLAnimationSpeed | real | No | |
CLAttach | string | No | |
CLAttachment | string | No | |
CLDamage | real | Yes | |
CLDamageAgi | real | No | |
CLDamageAOE | real | Yes | |
CLDuration | real | No | |
CleanedItem | item | Yes | |
CLEffect | string | No | |
CLMaxSlashes | integer | Yes | |
CLMinimumDistance | real | No | |
CLSFX | string | No | |
CLSlashInterval | integer | No | |
CLSpeed | real | No | |
CLSpellLevel | integer | Yes | |
CLTransparency | real | No | |
Code | string | No | |
CONVERTED_ATTACK_TYPE | attacktype | Yes | |
CONVERTED_DAMAGE_TYPE | damagetype | Yes | |
CountCapturedRects | integer | No | |
CountTowersRect | integer | Yes | |
CP_HiddenItems | item | Yes | |
CP_HiddenItems_Copy | item | Yes | |
CP_HiddenItemsIndex | integer | No | |
CP_HiddenItemsIndex_Copy | integer | No | |
CP_Item | item | No | |
CP_Item_Copy | item | No | |
CP_Point | location | No | |
CP_Point_Copy | location | No | |
CP_PointIsWalkable | boolean | No | |
CP_PointIsWalkable_Copy | boolean | No | |
CP_Rect | rect | No | |
CP_Rect_Copy | rect | No | |
Creep_Point_Copy | location | Yes | |
Creeps_Boss_Lvl | integer | No | |
Creeps_boss_n | real | No | |
Creeps_boss_on | boolean | No | |
Creeps_boss_on2 | boolean | No | |
Creeps_boss_skip | boolean | No | |
Creeps_C_Waves_Per_Player | integer | No | |
Creeps_Count | integer | No | |
Creeps_Count_Bosses | integer | No | |
Creeps_Count_Loop | integer | No | |
Creeps_Count_Timer | real | No | |
Creeps_CP | location | Yes | |
Creeps_Current_Level | integer | No | 0 |
Creeps_Current_Wave | integer | No | |
Creeps_Current_Wave_Temp | integer | No | |
Creeps_dmg | real | No | |
Creeps_hp | real | No | |
Creeps_Knights | group | No | |
Creeps_LastWave | integer | No | |
Creeps_off | boolean | No | |
Creeps_Per_Lvl | integer | No | |
Creeps_Prev_Lvl | integer | No | |
Creeps_Random_Temp | unitcode | No | |
Creeps_Rect_lvl | rect | Yes | |
Creeps_rnd_i | integer | No | |
Creeps_Rnd_type | integer | No | |
Creeps_temp_i | integer | No | |
Creeps_Temp_unit | unitcode | No | |
Creeps_Type_i | unitcode | Yes | |
Creeps_Type_Spawn1 | unitcode | Yes | |
Creeps_Type_Spawn2 | unitcode | Yes | |
Creeps_Type_Spawn3 | unitcode | Yes | |
Creeps_Type_Spawn4 | unitcode | Yes | |
Creeps_Type_Spawn5 | unitcode | Yes | |
Creeps_Type_Temp | integer | No | |
Creeps_Type_temp2 | unitcode | Yes | |
Creeps_wait | integer | No | |
Creeps_Waves_AfterUp | integer | No | |
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 | |
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 | |
DamageEventWeaponT | 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 | |
Def_group | group | Yes | |
Def_loop_off | boolean | 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 | |
Dipper_Angle | real | No | |
Dipper_StarCount | integer | No | |
Dipper_StarFX | effect | Yes | |
DS_Caster | unit | No | |
DS_Extra_Dmg | real | No | |
DS_Location | location | No | |
DS_Target_Point | location | No | |
DSB_Ability_ID | abilcode | No | |
DSB_Ability_Level | integer | Yes | |
DSB_Angle | real | Yes | |
DSB_Animation | string | No | |
DSB_Animation_Speed | real | No | |
DSB_AoE | real | No | |
DSB_Caster | unit | Yes | |
DSB_Conditions | boolean | Yes | |
DSB_Current_Index | integer | No | |
DSB_Damage | real | Yes | |
DSB_Damage_base | real | Yes | |
DSB_Damage_Group | group | No | |
DSB_Destroy_Tree | boolean | No | |
DSB_Destroyer | unit | No | |
DSB_Distance | real | No | |
DSB_Dummy | unit | Yes | |
DSB_Dummy2 | unit | Yes | |
DSB_Dummy2_Animation | string | No | |
DSB_Dummy2_BLUE | real | No | |
DSB_Dummy2_GREEN | real | No | |
DSB_Dummy2_Lifetime | real | No | |
DSB_Dummy2_RED | real | No | |
DSB_Dummy2_Transparency | real | No | |
DSB_Dummy_Type | unitcode | No | |
DSB_Dummy_Type2 | unitcode | No | |
DSB_Max_Index | integer | No | |
DSB_Owner | player | Yes | |
DSB_Shadow | boolean | No | |
DSB_Shdow | boolean | Yes | |
DSB_SoundEffect | sound | No | |
DSB_Special_Effect | string | No | |
DSB_Special_Effect_Location | string | No | |
DSB_Stage | integer | Yes | |
DSB_Start_Range | real | No | |
DSB_TempDest | destructable | No | |
DSB_TempPoint1 | location | No | |
DSB_TempPoint2 | location | No | |
DSB_TempPoint3 | location | No | |
DSB_TempUnit | unit | No | |
DSB_UnDamage_Group | group | Yes | |
DT_Rnd | integer | No | |
DT_temp_Loc | location | No | |
EmS_Animation_Type | string | No | |
EmS_Attachment | string | Yes | |
EmS_Attack_Type | attacktype | No | |
EmS_Caster | unit | Yes | |
EmS_Caster_Point | location | No | |
EmS_Colour | real | Yes | |
EmS_Condition_Config | boolean | Yes | |
EmS_Current_Index | integer | No | |
EmS_Damage | real | Yes | |
EmS_Duration | real | Yes | |
EmS_Effect_Model | string | Yes | |
EmS_Group | group | Yes | |
EmS_Index_Container | integer | Yes | |
EmS_Index_Listener | integer | No | |
EmS_Index_Size | integer | No | |
EmS_Interval | real | No | |
EmS_Level | integer | Yes | |
EmS_Loop | integer | No | |
EmS_Move | location | No | |
EmS_Pick_Range | real | Yes | |
EmS_Picked_Move_Distance | real | No | |
EmS_Picked_Point | location | No | |
EmS_Picked_Unit | unit | No | |
EmS_Random_Group | group | Yes | |
EmS_Recycle_Container | integer | Yes | |
EmS_Recycle_Size | integer | No | |
EmS_SE_1 | effect | Yes | |
EmS_Spell | abilcode | No | |
EmS_TargetPoint | location | Yes | |
EmS_Timer | real | Yes | |
EmS_Transparency | real | No | |
EnhancedDamageTarget | unit | No | |
ER_Caster_Dmg_Bonus | real | No | |
ES_Angle | real | No | |
ES_Caster | unit | No | |
ES_Extra_Dmg | real | No | |
ES_Group | group | No | |
ES_Integer | integer | No | |
ES_Point | location | Yes | |
ES_Target | unit | No | |
ETG_Angle | real | No | |
ETG_BuffAbilityBurn | abilcode | No | |
ETG_BuffAbilityPoison | abilcode | No | |
ETG_BurnDamageBase | real | No | |
ETG_BurnDamagePerLevel | real | No | |
ETG_BurnDurationBase | real | No | |
ETG_BurnDurationPerLevel | real | No | |
ETG_DissapateModel | string | No | |
ETG_Dummy | unitcode | No | |
ETG_Explodeables | group | No | |
ETG_ExplosionDamageBase | real | No | |
ETG_ExplosionDamagePerLevel | real | No | |
ETG_ExplosionModel | string | No | |
ETG_FireModel | string | No | |
ETG_GasCloudAOE | real | No | |
ETG_GasCloudDurationBase | real | No | |
ETG_GasCloudDurationPerLevel | real | No | |
ETG_GasHeadsBase | integer | No | |
ETG_GasHeadsPerLevel | integer | No | |
ETG_GasModel | string | No | |
ETG_GasProjectileFlyHeight | real | No | |
ETG_GasProjectileModel | string | No | |
ETG_GasProjectileScale | real | No | |
ETG_GasSpeed | real | No | |
ETG_GasSpreadBase | real | No | |
ETG_GasSpreadPerLevel | real | No | |
ETG_GasSpreadSpeed | integer | No | |
ETG_Group | group | No | |
ETG_Hash | hashtable | No | |
ETG_HeightMultiplyer | real | No | |
ETG_i | integer | No | |
ETG_MinRange | real | No | |
ETG_PoisonDamageBase | real | No | |
ETG_PoisonDamagePerLevel | real | No | |
ETG_PoisonDurationBase | real | No | |
ETG_PoisonDurationPerLevel | real | No | |
ETG_PoisonModel | string | No | |
ETG_RealCache | real | Yes | |
ETG_RockModel | string | No | |
ETG_Spell | abilcode | No | |
ETG_Spell2 | abilcode | No | |
ETG_SpreadRandomiser | real | No | |
ETG_TempGroup | group | No | |
ETG_TempInteger | integer | No | |
ETG_TempPoint | location | No | |
ETG_TempPoint2 | location | No | |
ETG_TempPoint3 | location | No | |
ETG_TempReal | real | No | |
ETG_TempU | unit | No | |
ETG_TempU2 | unit | No | |
ETG_TempX | real | No | |
ETG_TempY | real | No | |
ETG_U | unit | No | |
ETG_UHandle | integer | No | |
ETG_UHandleC | integer | No | |
ETG_VolcanicProjectileScale | real | No | |
ETG_VolcanicRockAoeBase | real | No | |
ETG_VolcanicRockAoePerLevel | real | No | |
EW_Ability_2 | abilcode | No | |
EW_Angle | real | Yes | |
EW_Animation | string | No | |
EW_Animation_Speed | real | No | |
EW_AoE | real | Yes | |
EW_BaseRange | real | Yes | |
EW_Current_Index | integer | No | |
EW_DestroyTree | boolean | No | |
EW_Dummy | unit | Yes | |
EW_DummyType | unitcode | No | |
EW_Level | integer | Yes | |
EW_Max_Index | integer | No | |
EW_Owner | player | Yes | |
EW_Range | real | Yes | |
EW_SFX | string | Yes | |
EW_Speed | real | Yes | |
EW_Speed_Copy | real | Yes | |
EW_StartRange | real | No | |
EW_TreeDestroyer | unit | No | |
Fire_Wall_Ability_Level | integer | No | |
Fire_Wall_Caster | unit | No | |
Fire_Wall_Distance | real | No | |
Fire_Wall_Dummy_Ability | abilcode | No | |
Fire_Wall_Duration | real | No | |
Fire_Wall_Extra_Dmg | real | No | |
Fire_Wall_Location | location | No | |
Fire_Wall_Loop_Location | location | No | |
Fire_Wall_Loop_Location_2 | location | No | |
Fire_Wall_Owner | player | No | |
FoK_Ability_Damage | abilcode | No | |
FoK_Ability_Invisibility | abilcode | No | |
FoK_Base_Chance | integer | No | |
FoK_Caster | unit | No | |
FoK_Extra_Dmg | real | No | |
FoK_Level | integer | No | |
FoK_Owner | player | No | |
FoK_Position | location | No | |
FoK_Target_Point | location | No | |
Game_Stage | integer | No | |
Gates_Avaliable_Bool | boolean | Yes | |
Gates_Avaliable_Region | rect | Yes | |
Gates_Count | integer | No | |
Hero_Has_Ability | boolean | Yes | |
Hero_Has_Ability_Code | abilcode | Yes | |
Hero_Has_HS_player | boolean | Yes | |
Hero_Has_Orb | unit | Yes | |
Hero_Has_SB_player | boolean | Yes | |
Hero_Has_SpellBook | unit | Yes | |
Hero_Has_Staff | unit | Yes | |
HL_AttackType | attacktype | No | |
HL_Damage | real | No | |
HL_DamageType | damagetype | No | |
HL_DestroyTrees | boolean | No | |
HL_Heal | real | No | |
HL_Level | integer | No | |
HL_Loop | integer | No | |
HL_Range | real | No | |
HL_TargetPoint | location | No | |
HL_TempGroup | group | No | |
HL_TempPoint | location | No | |
InfiniteSlashesAngle | real | Yes | |
InfiniteSlashesBol1 | boolean | Yes | |
InfiniteSlashesBol2 | boolean | Yes | |
InfiniteSlashesCaster | unit | Yes | |
InfiniteSlashesCasterLoc | location | No | |
InfiniteSlashesCasterLoc2 | location | No | |
InfiniteSlashesCount1 | integer | Yes | |
InfiniteSlashesCount2 | integer | Yes | |
InfiniteSlashesDamage | real | Yes | |
InfiniteSlashesDistance | real | Yes | |
InfiniteSlashesIndex | integer | No | |
InfiniteSlashesLocAoe | location | No | |
InfiniteSlashesLoop | integer | No | |
InfiniteSlashesMui | integer | No | |
InfiniteSlashesPERCENT | real | Yes | |
InfiniteSlashesSFX | effect | Yes | |
InfiniteSlashesTarget | unit | Yes | |
InfiniteSlashesTargetLoc | location | No | |
IsDamageAttack | boolean | No | |
IsDamageCode | boolean | No | |
IsDamageMelee | boolean | No | |
IsDamageRanged | boolean | No | |
IsDamageSpell | boolean | No | |
IsUnitBeingKnockedBack | boolean | Yes | |
Item_Forge | itemcode | No | |
Item_Forge_Bool | boolean | No | |
Item_Forge_i_Prevent | integer | No | |
Item_Forge_Loop | integer | No | 0 |
Item_Forge_Result | itemcode | Yes | |
Item_Price | integer | No | |
Item_Price_Forge | integer | Yes | |
Item_Temp_Loc | location | No | |
Item_Type | itemcode | Yes | |
Item_Type1 | itemcode | Yes | |
Item_Type1_Charges | integer | Yes | 0 |
Item_Type1_Charges_Forge | integer | Yes | 0 |
Item_Type1_Forge | itemcode | Yes | |
Item_Type2 | itemcode | Yes | |
Item_Type2_Charges | integer | Yes | 0 |
Item_Type2_Charges_Forge | integer | Yes | 0 |
Item_Type2_Forge | itemcode | Yes | |
Item_Type3 | itemcode | Yes | |
Item_Type3_Charges | integer | Yes | 0 |
Item_Type3_Charges_Forge | integer | Yes | 0 |
Item_Type3_Forge | itemcode | Yes | |
Item_Type_Charges | integer | Yes | 0 |
Item_Type_Empty | itemcode | No | |
Item_Type_Forge | itemcode | Yes | |
Item_Type_Loop | integer | No | |
Item_Type_Result | itemcode | Yes | |
Item_Type_Tmp_bool | boolean | No | |
Item_Type_Tmp_i | integer | No | |
Item_Type_Tmp_i2 | integer | No | |
ItemC_Loop | integer | No | |
ItemC_Point | location | No | |
ItemCleanupFlag | boolean | No | |
ItemCleanupTimer | timer | No | |
ItemsToClean | integer | No | |
K2DAmphibious | boolean | Yes | |
K2DAngle | real | Yes | |
K2DBounce | boolean | Yes | |
K2DCollision | real | Yes | |
K2DCos | real | Yes | |
K2DCosD1 | real | Yes | |
K2DCosD2 | real | Yes | |
K2DCosH | real | Yes | |
K2DDebrisKiller | unit | No | |
K2DDestRadius | real | Yes | |
K2DDistanceLeft | real | Yes | |
K2DElapsedTime | real | No | |
K2DFreeze | boolean | Yes | |
K2DFriction | real | Yes | |
K2DFXModel | string | Yes | |
K2DFXRate | real | Yes | |
K2DFXTimeLeft | real | Yes | |
K2DHash | hashtable | No | |
K2DHeight | real | Yes | |
K2DHeightThreshold | real | Yes | |
K2DImpact | trigger | Yes | |
K2DInRange | trigger | Yes | |
K2DItem | item | No | |
K2DItemOffset | boolean | No | |
K2DItemsFound | boolean | No | |
K2DKillTrees | boolean | Yes | |
K2DLastX | real | Yes | |
K2DLastY | real | Yes | |
K2DMaxDestRadius | real | No | |
K2DMaxX | real | No | |
K2DMaxY | real | No | |
K2DMinX | real | No | |
K2DMinY | real | No | |
K2DNext | integer | Yes | |
K2DOnDestroy | trigger | Yes | |
K2DOverride | boolean | Yes | |
K2DPause | boolean | Yes | |
K2DPrev | integer | Yes | |
K2DRadius | integer | Yes | |
K2DRegion | rect | No | |
K2DSimple | boolean | Yes | |
K2DSin | real | Yes | |
K2DSinD1 | real | Yes | |
K2DSinD2 | real | Yes | |
K2DSinH | real | Yes | |
K2DSource | unit | Yes | |
K2DTempTrig | trigger | No | |
K2DTimeLeft | real | Yes | |
K2DTimeout | real | No | |
K2DTimer | timer | No | |
K2DUnbiasedCollision | boolean | Yes | |
K2DVelocity | real | Yes | |
K2DX | real | No | |
K2DY | real | No | |
KB3D_Accel | real | No | |
KB3D_AllowOutSiding | boolean | No | |
KB3D_Angle | real | No | |
KB3D_AoE | real | No | |
KB3D_AoEDamage | real | No | |
KB3D_AoEEndDamage | real | No | |
KB3D_AoEEndFx | string | No | |
KB3D_AoEKB | boolean | No | |
KB3D_AoEKB_Power | real | No | |
KB3D_Arc | real | No | |
KB3D_Attach | string | No | |
KB3D_AttackType | attacktype | No | |
KB3D_B | boolean | No | |
KB3D_Bounce_Fx | string | No | |
KB3D_Bounce_Power | real | No | |
KB3D_Bounce_Target | boolean | No | |
KB3D_Bounce_Unit | boolean | No | |
KB3D_Counter | integer | No | |
KB3D_D_ALLY | boolean | No | |
KB3D_D_ENEMY | boolean | No | |
KB3D_D_FLYING | boolean | No | |
KB3D_D_MAGIC_IMMINUE | boolean | No | |
KB3D_D_MECHANICAL | boolean | No | |
KB3D_D_RESISTANT | boolean | No | |
KB3D_D_STRUCTURE | boolean | No | |
KB3D_Damager | unit | No | |
KB3D_DamageType | damagetype | No | |
KB3D_DestroyDestructables | boolean | No | |
KB3D_DestroyTree | boolean | No | |
KB3D_DisableUnit | boolean | No | |
KB3D_EndFx | string | No | |
KB3D_EndOnObstacle | boolean | No | |
KB3D_EndOnTargetBounce | boolean | No | |
KB3D_EndTrigger | trigger | No | |
KB3D_EndwhenDead | boolean | No | |
KB3D_EndWhenHit | boolean | No | |
KB3D_FaceAngle | boolean | No | |
KB3D_Fx | string | No | |
KB3D_Fx_Attach | string | No | |
KB3D_g | group | No | |
KB3D_GroundDamage | boolean | No | |
KB3D_HA | hashtable | No | |
KB3D_Harvester | unit | No | |
KB3D_HomingMissile | boolean | No | |
KB3D_iKB | boolean | No | |
KB3D_ImpactDamage | real | No | |
KB3D_Instances | integer | No | |
KB3D_JumpOverCliff | boolean | No | |
KB3D_KBTarget | boolean | No | |
KB3D_KillatEnd | boolean | No | |
KB3D_KillatTime | real | No | |
KB3D_KillifOutSider | boolean | No | |
KB3D_KillWhenHit | boolean | No | |
KB3D_Line_Fx | string | No | |
KB3D_LineDamage | real | No | |
KB3D_LoopDamage | real | No | |
KB3D_Range | real | No | |
KB3D_Reals | real | Yes | |
KB3D_Registration | trigger | No | |
KB3D_Speed | real | No | |
KB3D_Speed_Changer | boolean | No | |
KB3D_StopTime | real | No | |
KB3D_TargetDamage | real | No | |
KB3D_Targeted_Unit | unit | No | |
KB3D_Time | real | No | |
KB3D_Timer | timer | No | |
KB3D_TrailFx | string | No | |
KB3D_Unit | unit | No | |
KB3D_UnpathableStop | boolean | No | |
KB3D_Zoffset | real | No | |
KB_GeneralIntegers_Copy | integervar | Yes | |
Key | integer | No | |
Knockback2DAmphibious | boolean | No | |
Knockback2DAngle | real | No | |
Knockback2DBounces | boolean | No | |
Knockback2DCollision | real | No | |
Knockback2DDefaultBounce | boolean | No | |
Knockback2DDefaultDestRadius | real | No | |
Knockback2DDefaultFriction | real | No | |
Knockback2DDefaultFX | string | No | |
Knockback2DDefaultFXRate | real | No | |
Knockback2DDefaultGravity | real | No | |
Knockback2DDefaultKillTrees | boolean | No | |
Knockback2DDefaultPause | boolean | No | |
Knockback2DDestRadius | real | No | |
Knockback2DDistance | real | No | |
Knockback2DFriction | real | No | |
Knockback2DFXRate | real | No | |
Knockback2DGravity | real | No | |
Knockback2DHeight | real | No | |
Knockback2DInRange | trigger | No | |
Knockback2DKillTrees | boolean | No | |
Knockback2DLoopFX | string | No | |
Knockback2DOnDestroy | trigger | No | |
Knockback2DOnImpact | trigger | No | |
Knockback2DOverride | boolean | No | |
Knockback2DPause | boolean | No | |
Knockback2DRobustPathing | integer | No | |
Knockback2DSimple | boolean | No | |
Knockback2DSource | unit | No | |
Knockback2DTime | real | No | |
Knockback2DTreeOrDebris | string | No | |
Knockback2DUnbiasedCollision | boolean | No | |
Knockback2DUnit | unit | No | |
Knockback2DUnitsInRange | group | Yes | |
LethalDamageEvent | real | No | |
LethalDamageHP | real | No | |
LF_Caster | unit | Yes | |
LF_CastingDummy | unitcode | No | |
LF_DummyAbility | abilcode | No | |
LF_Flare | unit | Yes | |
LF_FlareType | unitcode | Yes | |
LF_GroupAoE | real | No | |
LF_GroupInteger | integer | No | |
LF_Index | integer | No | |
LF_Interval | real | Yes | |
LF_Level | integer | Yes | |
LF_MainAbility | abilcode | No | |
LF_MaxNumberofStrikes | integer | No | |
LF_NumberOfRandomUnits | integer | No | |
LF_NumberOfStrikes | integer | Yes | |
LF_OwnerOfCaster | player | Yes | |
LF_StrikeTime | real | No | |
LF_tempGroup | group | No | |
LF_tempGroup2 | group | No | |
LF_tempInt | integer | No | |
LF_tempPoint | location | No | |
LF_tempUnit | unit | No | |
LF_tempUnit2 | unit | No | |
Load | integer | Yes | |
LoadCount | integer | No | |
LW_Duration | real | No | |
LW_Integer | integer | No | |
LW_Level | integer | No | |
LW_Loop_Number | integer | No | |
LW_Spawn_Point | location | No | |
LW_Target_Point | location | No | |
LW_Target_Position | location | No | |
LW_Target_Unit | unit | No | |
Map_Group | group | No | |
Map_Point | location | No | |
Map_Point2 | location | No | |
Map_Point3 | location | No | |
MDG_2ndDamage | real | Yes | |
MDG_Ability | abilcode | No | |
MDG_Angle | real | Yes | |
MDG_Angle2 | real | Yes | |
MDG_AoE | real | Yes | |
MDG_BaseSpeed | real | Yes | |
MDG_Caster | unit | Yes | |
MDG_CDummy | unitcode | No | |
MDG_Counter | real | Yes | |
MDG_CurDistance | real | Yes | |
MDG_CurIndex | integer | No | |
MDG_DAbility | abilcode | No | |
MDG_Damage | real | Yes | |
MDG_Damage_Multi | real | No | |
MDG_Damage_Temp | real | No | |
MDG_DamagedGroup | group | Yes | |
MDG_DamagedGroup2 | group | Yes | |
MDG_DummyCast | unit | No | |
MDG_Duration | real | Yes | |
MDG_Effect | effect | Yes | |
MDG_Effect2 | effect | Yes | |
MDG_Gap | real | Yes | |
MDG_Level | integer | Yes | |
MDG_Loc | location | Yes | |
MDG_MaxDistance | real | Yes | |
MDG_MaxIndex | integer | No | |
MDG_MDummy | unitcode | No | |
MDG_Missile | unit | Yes | |
MDG_Missile2 | unit | Yes | |
MDG_Numbers | integer | Yes | |
MDG_Player | player | Yes | |
MDG_SDummy | unitcode | No | |
MDG_SFX | string | Yes | |
MDG_SFXDummy | unit | Yes | |
MDG_Speed | real | Yes | |
MDG_Stage | integer | Yes | |
MDG_StartAngle | real | No | |
MDG_StartOffset | real | Yes | |
MDG_TempAngle | real | No | |
MDG_TempCaster | unit | No | |
MDG_TempInteger | integer | No | |
MDG_TempLevel | integer | No | |
MDG_TempPlayer | player | No | |
MDG_TempSpeed | real | No | |
MDG_TempUnit | unit | No | |
MDG_UndamagedGroup | group | Yes | |
MDG_UndamagedGroup2 | group | Yes | |
Miltiboard | multiboard | No | |
Miltiboard_Kills | integer | Yes | |
Miltiboard_Player_i | integer | No | |
Miltiboard_Player_n | integer | Yes | |
Miltiboard_Temp_i | integer | No | |
Miltiboard_Time | integer | Yes | |
Mission_Complite | boolean | Yes | |
Mission_Hashtable | hashtable | No | |
Mission_i | integer | No | |
Mission_Quests_bring | integer | Yes | |
Mission_Quests_kill | integer | Yes | |
Mission_temp_s | string | No | |
Mission_Title_i | string | Yes | |
Multi_Shot_Ability_Level | integer | No | |
Multi_Shot_Base_Arrow_Count | integer | No | |
Multi_Shot_Caster | unit | No | |
Multi_Shot_Dummy_Ability | abilcode | No | |
Multi_Shot_Facing | real | No | |
Multi_Shot_Location | location | No | |
Multi_Shot_Location_2 | location | No | |
Multi_Shot_Loop_Location | location | No | |
Multi_Shot_Loop_Location2 | location | No | |
Multi_Shot_Owner | player | No | |
Multi_Shot_Total_Arrow_Count | integer | No | |
Napalm_Strike_Ability_Level | integer | No | |
Napalm_Strike_Area_of_Effect | real | No | |
Napalm_Strike_Base_Damage | real | No | |
Napalm_Strike_Caster | unit | No | |
Napalm_Strike_Damage_Group | group | No | |
Napalm_Strike_Dummy_Ability | abilcode | No | |
Napalm_Strike_Extra_Dmg | real | No | |
Napalm_Strike_Location | location | No | |
Napalm_Strike_Owner | player | No | |
Napalm_Strike_Total_Damage | real | No | |
NextDamageType | integer | No | |
P__Ability | abilcode | No | |
P__Activate | boolean | Yes | |
P__Angle | real | Yes | |
P__ATK | attacktype | No | |
P__Attachment | string | No | |
P__Caster | unit | Yes | |
P__Cos | real | Yes | |
P__Damage | real | Yes | |
P__Distance | real | Yes | |
P__DMG | damagetype | No | |
P__DmgPerLevel | real | No | |
P__Dummy | unit | No | |
P__Dummy_Ability | integer | No | |
P__DumRaw | integer | No | |
P__F_Alive | boolean | No | |
P__F_Enemy | boolean | No | |
P__F_Flying | boolean | No | |
P__F_Magic_Immune | boolean | No | |
P__F_Mechanical | boolean | No | |
P__F_Structure | boolean | No | |
P__Group | group | Yes | |
P__Illusion | unit | Yes | |
P__Illusion_Count | integer | Yes | |
P__Illusion_Duration | real | No | |
P__IlluX | real | No | |
P__IlluY | real | No | |
P__Level | integer | No | |
P__Max_Speed | real | Yes | |
P__Neutral_Passive | player | No | |
P__Owner | player | Yes | |
P__Radius | real | Yes | |
P__SFX | string | Yes | |
P__Sin | real | Yes | |
P__Speed | real | No | |
P__Target | real | No | |
P__TargetX | real | Yes | |
P__TargetY | real | Yes | |
P__TimeOut | real | No | |
P__TrashGroup | group | Yes | |
P__TurnOff | boolean | No | |
P__Units | unit | Yes | |
P__X | real | Yes | |
P__Y | real | Yes | |
P_Index | integer | Yes | |
P_Index_MaxSize | integer | No | |
P_Index_Size | integer | No | |
P_Loop | integer | No | |
P_TempInt | integer | No | |
Peasant_died | unit | No | |
Peasants_count | integer | No | |
Peasants_group | group | Yes | |
Peasants_tempLoc | location | No | |
Peasants_type | unitcode | Yes | |
Player_Attack | player | No | |
Player_Camera_Preload | location | No | |
Player_Defence | player | No | |
Player_Visible_Preload | fogmodifier | No | |
Players_Hero | unit | Yes | |
Players_Hero_Main_Attr | integer | Yes | |
Players_In_Game_Count | integer | No | |
Players_Rank | integer | Yes | |
Players_users | force | No | |
PS_Caster | unit | No | |
PS_Caster_Dmg_Bonus | real | No | |
PS_Location | location | No | |
PS_Loop_Location | location | No | |
Quest_Creep_Loop | integer | No | |
Quest_Creep_Lvl | integer | Yes | |
Quest_Creep_OneRect | boolean | Yes | |
Quest_Creep_Region1 | rect | Yes | |
Quest_Creep_Region2 | rect | Yes | |
Quest_Creep_Region3 | rect | Yes | |
Quest_End_Bool | boolean | No | |
Quest_HeroLvL | integer | Yes | |
Quest_inOneRect | boolean | No | |
Quest_isBoss | boolean | No | |
Quest_isBoss_i | boolean | Yes | |
Quest_isCreeps | boolean | Yes | |
Quest_isItem | boolean | Yes | |
Quest_Item | itemcode | Yes | |
Quest_Item1 | itemcode | Yes | |
Quest_Item1_Charges | integer | Yes | |
Quest_Item2 | itemcode | Yes | |
Quest_Item2_Charges | integer | Yes | |
Quest_Item_Charges | integer | Yes | |
Quest_Item_Create | boolean | Yes | |
Quest_Item_Create1 | boolean | Yes | |
Quest_Item_Create2 | boolean | Yes | |
Quest_Item_Desc | string | No | |
Quest_Item_Desc1 | string | Yes | |
Quest_Item_Loop | integer | No | |
Quest_Item_Lvl | integer | Yes | |
Quest_Item_OneRect | boolean | Yes | |
Quest_Item_Rnd | integer | No | |
Quest_Item_Rnd_Rect | integer | No | |
Quest_Item_Title | string | No | |
Quest_Item_Title1 | string | Yes | |
Quest_Item_Title_i | string | Yes | |
Quest_Max_Lvl | integer | No | |
Quest_Null_Rect | rect | No | RectNull |
Quest_Num | integer | Yes | |
Quest_PingNoLoc | location | No | |
Quest_PingPoint1 | location | Yes | |
Quest_PingPoint2 | location | Yes | |
Quest_PingPoint3 | location | Yes | |
Quest_Player_Bool | boolean | Yes | |
Quest_Region | rect | Yes | |
Quest_Region1 | rect | Yes | |
Quest_Region2 | rect | Yes | |
Quest_Region3 | rect | Yes | |
Quest_Reward_Gold | integer | No | |
Quest_Reward_Gold_Core | integer | Yes | |
Quest_Reward_Gold_Core_C | integer | Yes | |
Quest_Timer | integer | Yes | |
Quest_Tmp_Rect | rect | Yes | |
Quest_Unit | unitcode | Yes | |
Quest_Unit1 | unitcode | Yes | |
Quest_Unit1_Count | integer | Yes | |
Quest_Unit2 | unitcode | Yes | |
Quest_Unit2_Count | integer | Yes | |
Quest_Unit3 | unitcode | Yes | |
Quest_Unit3_Count | integer | Yes | |
Quest_Unit_Boss | unit | Yes | |
Quest_Unit_Count | integer | Yes | |
Quest_Unit_Group | group | Yes | |
Quest_UnitLvl | integer | No | |
Quests | quest | Yes | |
Quests_Temp_loc | location | No | |
Radians_QuarterPi | real | No | |
Radians_QuarterTurn | real | No | |
Radians_Turn | real | No | |
Rank_X | real | No | |
Razor_Edge_Ability_Level | integer | No | |
Razor_Edge_Area_of_Effect | real | No | |
Razor_Edge_Base_Damage | real | No | |
Razor_Edge_Caster | unit | No | |
Razor_Edge_Damage_Group | group | No | |
Razor_Edge_Effect | effect | No | |
Razor_Edge_Location | location | No | |
Razor_Edge_Location2 | location | No | |
Razor_Edge_Total_Damage | real | No | |
RE_Knock_Angle | real | No | |
RE_Knock_Distance | real | No | |
RE_Knock_Group | group | No | |
RE_Knock_Loc1 | location | No | |
RE_Knock_Loc2 | location | No | |
RE_Knock_Speed | real | No | |
RE_Knocktable | hashtable | No | |
RE_TurnOff | boolean | No | |
Region_avaliable | boolean | Yes | false |
Regions | rect | Yes | |
RF_Ability | abilcode | No | |
RF_Angle | real | Yes | |
RF_AoE | real | Yes | |
RF_AttackType | attacktype | No | |
RF_Caster | unit | Yes | |
RF_CasterPosition | location | Yes | |
RF_Damage | real | Yes | |
RF_DamageRadius | real | Yes | |
RF_DamageType | damagetype | No | |
RF_DestroyTrees | boolean | No | |
RF_Distance | real | Yes | |
RF_ExplosionEffect | string | Yes | |
RF_ExplosionEffectNumber | integer | No | |
RF_Firebolt | unit | Yes | |
RF_FireboltCount | integer | Yes | |
RF_FireboltMissile | unitcode | No | |
RF_FireboltNumber | integer | Yes | |
RF_FireboltSpawnHeight | real | Yes | |
RF_FireboltSpawnInterval | real | Yes | |
RF_FireboltTravelSpeed | real | Yes | |
RF_FireboltTravelTime | real | Yes | |
RF_Harvester | unit | No | |
RF_HarvestOrderId | ordercode | No | |
RF_HSpeed | real | Yes | |
RF_Index | integer | No | |
RF_Level | integer | Yes | |
RF_Loop | integer | No | |
RF_MaxIndex | integer | No | |
RF_OrderId | ordercode | No | |
RF_Owner | player | No | |
RF_PickedDest | destructable | No | |
RF_PickedUnit | unit | No | |
RF_rTimer | real | Yes | |
RF_StageId | integer | Yes | |
RF_TargetPoint | location | Yes | |
RF_TempGroup | group | No | |
RF_TempLoc | location | No | |
RF_TravelBySpeed | boolean | No | |
RF_VSpeed | real | Yes | |
RF_X | real | No | |
RF_Y | real | No | |
S_AA_Player | player | No | |
S_AA_TempLoc | location | No | |
S_AG_Player | player | No | |
S_AG_Unit | unit | No | |
S_AoF_Lvl | integer | No | |
S_AoF_Rand | integer | No | |
S_AoF_Unit | unit | No | |
S_AS_Hero | unit | No | |
S_AS_Lvl | integer | No | |
S_AS_Player | player | No | |
S_BB_Lvl | integer | No | |
S_BB_Multi | integer | No | |
S_BS_Dmg | real | No | |
S_BS_Dmg_Bounce | real | No | |
S_BS_HarvestDummy | unit | No | |
S_BS_Key | integer | No | |
S_BS_Key1 | integer | No | |
S_BS_loc | location | No | |
S_BS_loc1 | location | No | |
S_BS_temp_int | integer | No | |
S_BS_temp_int1 | integer | No | |
S_BS_temp_real | real | No | |
S_BS_temp_real1 | real | No | |
S_BS_UGroup | group | No | |
S_BS_Unit | unit | No | |
S_BS_Unit1 | unit | No | |
S_CC_Angle | real | No | |
S_CC_PointA | location | No | |
S_CC_PointB | location | No | |
S_CF_ChainFrost | abilcode | No | |
S_CF_iChainFrostIndex | integer | No | |
S_CF_iChainFrostJumps | integer | Yes | |
S_CF_iJumps | integer | No | |
S_CF_iLevelJumps | integer | No | |
S_CF_iLvlJumps | integer | No | |
S_CF_rDamage | real | No | |
S_CF_rFinalDamage | real | Yes | |
S_CF_rLvlDamage | real | No | |
S_CF_rSpeed | real | No | |
S_CF_sChainFrostE | string | No | |
S_CF_Temp_Group | group | No | |
S_CF_Temp_Int | integer | No | |
S_CF_Temp_Point | location | No | |
S_CF_Temp_Point2 | location | No | |
S_CF_Temp_Point3 | location | No | |
S_CF_Temp_unit | unit | No | |
S_CF_uChainFrostC | unit | Yes | |
S_CF_uChainFrostD | unit | Yes | |
S_CF_uChainFrostT | unit | Yes | |
S_DoE_life | real | No | |
S_DoE_miss_lvl | integer | No | |
S_DoE_miss_lvl_real | real | No | 0.00 |
S_DoE_multi | real | No | |
S_DoE_skill_lvl | integer | No | 0 |
S_EoF_timer | timer | No | |
S_EoF_unit | unit | No | |
S_EW2_Ability | abilcode | No | |
S_EW2_AbilityLevel | integer | Yes | |
S_EW2_AType | attacktype | No | |
S_EW2_Ball | unit | Yes | |
S_EW2_BallCount | integer | No | |
S_EW2_BallDeathSpecialEf | string | No | |
S_EW2_BallDegree | real | Yes | |
S_EW2_Caster | unit | Yes | |
S_EW2_CDuration | real | Yes | |
S_EW2_Damage | real | Yes | |
S_EW2_DamageAoE | real | Yes | |
S_EW2_DamageAT | attacktype | No | |
S_EW2_DamageDT | damagetype | No | |
S_EW2_DamageInterval | real | No | |
S_EW2_DamageSFX | string | No | |
S_EW2_DeathAoE | real | Yes | |
S_EW2_DeathDamage | real | Yes | |
S_EW2_DType | damagetype | No | |
S_EW2_Duration | real | Yes | |
S_EW2_Formation | real | No | |
S_EW2_Lightning | lightning | Yes | |
S_EW2_LightningColor | real | Yes | |
S_EW2_LightningEffect | lightningtype | No | |
S_EW2_MaxIndex | integer | No | |
S_EW2_Model | unitcode | No | |
S_EW2_OffsetDistance | real | Yes | |
S_EW2_PickedUnits | unit | No | |
S_EW2_Player | player | Yes | |
S_EW2_RandomUnit | unit | No | |
S_EW2_SecondDuration | real | Yes | |
S_EW2_Speed | real | Yes | |
S_EW2_TempGroup | group | No | |
S_EW2_TempIndex | integer | No | |
S_EW2_TempPoint | location | No | |
S_EW2_TempPoint2 | location | No | |
S_EW2_TempReal | real | No | |
S_EW_Caster | unit | Yes | |
S_EW_Damage | real | Yes | |
S_EW_DamageGroup | group | Yes | |
S_EW_TempPoint | location | No | |
S_EW_TempPoint2 | location | No | |
S_EW_TempPoint3 | location | No | |
S_EW_TempUnit | unit | No | |
S_EW_UndamageGroup | group | Yes | |
S_FW_Dmg | real | No | |
S_GR_Point | location | No | |
S_HoD_dmg | real | No | |
S_HoD_rnd | integer | No | |
S_HoD_timer | timer | No | |
S_HolyP_Caster | unit | No | |
S_HolyP_Hero | unit | No | |
S_HolyP_Lvl | integer | No | |
S_HolyP_Lvl_skill | integer | No | |
S_HolyP_Point | location | No | |
S_HoS_Caster | unit | No | |
S_HP_Dummy | unit | No | |
S_HP_life | real | No | |
S_HP_Lvl | integer | No | |
S_HP_Lvl_real | real | No | 0.00 |
S_HP_Lvl_skill_lvl | integer | No | 0 |
S_HP_multi | real | No | |
S_MS_Angle | real | Yes | |
S_MS_AoE | integer | Yes | |
S_MS_Caster | unit | Yes | |
S_MS_Cur_D | real | Yes | |
S_MS_Dummy | unit | Yes | |
S_MS_Dummy2 | unit | Yes | |
S_MS_Group | group | No | |
S_MS_Level | integer | Yes | |
S_MS_Loc | location | No | |
S_MS_Loc1 | location | No | |
S_MS_Loc2 | location | No | |
S_MS_Loc3 | location | No | |
S_MS_Loc4 | location | No | |
S_MS_Max_D | real | Yes | |
S_MS_Max_H | real | Yes | |
S_MS_Max_Index | integer | No | |
S_MS_MUI_1 | integer | No | |
S_MS_MUI_2 | integer | Yes | |
S_MS_MUI_3 | integer | No | |
S_MS_Real | real | Yes | |
S_MS_Speed | real | Yes | |
S_MS_Temp | integer | No | |
S_PS_TempLoc | location | No | |
S_PS_Timer | timer | No | |
S_PShell_Dmg | real | No | |
S_PShell_Range | real | No | |
S_PShell_Targets | integer | No | |
S_PShell_Targets_Max | integer | No | |
S_PShell_Unit | unit | No | |
S_PW_Dmg | real | No | |
S_SC_Caster | unit | No | |
S_SC_Target | unit | No | |
S_SC_TempGroup | group | No | |
S_SC_TempInt | integer | No | |
S_SC_TempInt2 | integer | No | |
S_SC_TempLoc | location | No | |
S_SC_TempLoc2 | location | No | |
S_SC_TempReal | real | No | |
S_SC_TempUnit | unit | No | |
S_SD_Charges | integer | No | |
S_SH_Count | integer | No | |
S_SH_Extra_Dmg | real | No | |
S_SH_Point | location | No | |
S_SS_Lvl | integer | No | |
S_SS_TempLoc | location | No | |
S_SU_dmg_heal | real | No | |
S_SU_group | group | No | |
S_SU_multi | real | No | |
S_SU_point | location | No | |
S_Throw_Stone_str | integer | No | |
S_Tree_Grab_count | integer | Yes | |
S_UC_Counter | integer | Yes | |
S_UC_Creep_Point | location | Yes | |
S_UC_Deal_Dmg | real | No | |
S_UC_F_Integers | integer | Yes | |
S_UC_F_ReachedFading | real | Yes | |
S_UC_F_Time | real | Yes | |
S_UC_F_Unit | unit | Yes | |
S_UC_FA_Time | real | No | |
S_UC_FA_Unit | unit | No | |
S_UC_Groups | group | Yes | |
S_UC_Inv | boolean | Yes | |
S_UC_KB_GeneralIntegers | integervar | Yes | |
S_UC_PD_Angle | real | Yes | |
S_UC_PD_Distances | real | Yes | |
S_UC_PD_Integers | integer | Yes | |
S_UC_PD_ReachedDistance | real | Yes | |
S_UC_PD_RealTimer | real | Yes | |
S_UC_PD_SpeedUnits | real | Yes | |
S_UC_PD_TempPoint | location | Yes | |
S_UC_PD_TestGroup | group | No | |
S_UC_PD_TreesDestroy | boolean | Yes | |
S_UC_PD_Unit | unit | Yes | |
S_UC_SETTINGS_AreaOfEffect | real | Yes | |
S_UC_SETTINGS_Collosion | boolean | No | |
S_UC_SETTINGS_Invulnerable | boolean | No | |
S_UC_SETTINGS_Speed | real | No | |
S_UC_Target | unit | No | |
S_UC_Temp_Integer | integer | No | |
S_UC_TempPoint | location | Yes | |
S_UC_TK_SpecialEffect | modelfile | No | |
Save | integer | Yes | |
SaveCount | integer | No | |
SaveLoad_Alphabet | string | No | |
SaveLoad_Base | integer | No | |
SaveLoad_Char | string | Yes | |
SaveLoad_CheckName | boolean | No | |
SaveLoad_Directory | string | No | |
SaveLoad_Error | string | No | |
SaveLoad_Filename | string | No | |
SaveLoad_Full | string | No | |
SaveLoad_HyphenSpace | integer | No | |
SaveLoad_Lower | string | No | |
SaveLoad_MaxValue | integer | No | |
SaveLoad_Number | string | No | |
SaveLoad_Rank | integer | No | |
SaveLoad_SaveToDisk | boolean | No | |
SaveLoad_Security | boolean | No | |
SaveLoad_SeperationChar | string | No | |
SaveLoad_timer | timer | No | |
SaveLoad_tmp | integer | Yes | |
SaveLoad_Upper | string | No | |
SaveLoad_Valid | boolean | No | |
SB_Angle | real | Yes | |
SB_AOE | real | Yes | |
SB_Caster | unit | No | |
SB_Casters | unit | Yes | |
SB_ConvertedDamage | real | Yes | |
SB_CountIntegers | integer | Yes | |
SB_Damage | real | No | |
SB_DestroyTrees | boolean | No | |
SB_Distances | real | Yes | |
SB_DmgAOE | real | No | |
SB_Group | group | No | |
SB_HighSettings | real | Yes | |
SB_Integers | integer | Yes | |
SB_JumpHigh | real | Yes | |
SB_Points | location | Yes | |
SB_ReachedDistance | real | Yes | |
SB_Reals | real | No | |
SB_RealTimer | real | Yes | |
SB_SpeedIncreasement | real | No | |
SB_SpeedUnits | real | Yes | |
SB_TempPoint | location | Yes | |
SB_TotalUnitGroup | group | No | |
SB_TreesDestroy | boolean | Yes | |
SB_Unit | unit | Yes | |
SBA_Integers | integer | No | |
SBA_JumpHigh_Distance | real | No | |
SBA_Speed | real | No | |
SBA_TargetPoint | location | No | |
SBA_Unit | unit | No | |
Shadowstep_Ability_Level | integer | No | |
Shadowstep_Base_Damage | real | No | |
Shadowstep_Calculation | real | No | |
Shadowstep_Caster | unit | No | |
Shadowstep_Count_Strikes | integer | No | |
Shadowstep_Damage_Multiplier | real | No | |
Shadowstep_isPicked | boolean | No | |
Shadowstep_Location | location | No | |
Shadowstep_Location_2 | location | No | |
Shadowstep_Loop_Location | location | No | |
Shadowstep_Loop_Number | integer | No | |
Shadowstep_Target | unit | No | |
Shadowstep_Targets_g | group | No | |
Shadowstep_Total_Damage | real | No | |
Spell_Casters | group | No | |
Spell_Dummy | unit | No | |
Spell_Targets | group | No | |
ST_Caster_Dmg_Bonus | real | No | |
SU_Caster | unit | Yes | |
SU_Explosion | integer | Yes | |
SU_Extra_Dmg | real | No | |
SU_Fall | real | Yes | |
SU_Indexsize | integer | No | |
SU_Integer | integer | Yes | |
SU_Loop | integer | No | |
SU_Maxsize | integer | No | |
SU_Meteor | unit | Yes | |
SU_Point | location | Yes | |
SU_Real | real | Yes | |
SU_Temp | integer | No | |
Surging_Pulse_Caster | unit | No | |
Surging_Pulse_Caster_Loc | location | No | |
Surging_Pulse_Formula | real | No | |
Surging_Pulse_Location | location | No | |
Surging_Pulse_Loop | integer | No | |
Surging_Pulse_Loop_Location | location | No | |
Surging_Pulse_Owner | player | No | |
SW_Ability | abilcode | No | |
SW_AffectAir | boolean | Yes | |
SW_AffectAlly | boolean | Yes | |
SW_AffectEnemy | boolean | Yes | |
SW_AffectGround | boolean | Yes | |
SW_AffectStructure | boolean | Yes | |
SW_Angle | real | No | |
SW_AreaCurrent | real | Yes | |
SW_AreaFinal | real | Yes | |
SW_AreaGrowth | real | Yes | |
SW_AreaInitial | real | Yes | |
SW_Attachment | string | No | |
SW_AttackType | attacktype | Yes | |
SW_Caster | unit | Yes | |
SW_Damage | real | Yes | |
SW_DamageType | damagetype | Yes | |
SW_DamageX | real | Yes | |
SW_Distance | real | Yes | |
SW_DistanceX | real | Yes | |
SW_Dummy | unit | Yes | |
SW_ExtraEffect | trigger | Yes | |
SW_ExtraEffectCheck | boolean | Yes | |
SW_ExtraEffectTarget | trigger | Yes | |
SW_ExtraEffectTargetCheck | boolean | Yes | |
SW_Group | group | No | |
SW_GroupDone | group | Yes | |
SW_Loop | integer | No | |
SW_LoopingSfx | boolean | Yes | |
SW_Lvl | integer | Yes | |
SW_Max | integer | No | |
SW_NextPoint | location | Yes | |
SW_OneInstance | boolean | Yes | |
SW_Point | location | Yes | |
SW_Speed | real | Yes | |
SW_SpeedX | real | Yes | |
SW_TempPoint | location | Yes | |
SW_TempUnit | unit | No | |
SW_Wave | effect | Yes | |
SW_WaveEffect | string | Yes | |
SW_WaveEffectEnd | string | Yes | |
SW_WaveEffectLoop | string | Yes | |
T_loc | location | No | |
T_offset | real | No | |
T_rgb | real | Yes | |
T_size | real | No | |
T_str | string | No | |
T_transp | real | No | |
Temp_areaA | rect | No | |
Temp_Creep_Spawn | unit | Yes | |
Temp_Integer_Copy | integer | No | |
Temp_loc_Preload | location | No | |
Temp_locA | location | No | |
Temp_locA_Spawn | location | No | |
Temp_locB | location | No | |
Temp_locB_Spawn | location | No | |
Temp_locC | location | No | |
Temp_locD | location | No | |
Temp_rect | rect | No | |
Temp_sfxA | effect | Yes | |
TempPoint | location | No | |
Tips_Players | boolean | Yes | |
Tips_rnd | integer | No | |
TK_SpecialEffect_Copy | modelfile | No | |
TRdummyh | unit | No | |
TRhash | hashtable | No | |
TRindexD | integer | No | |
TRindexN | integer | No | |
TRisEnabled | boolean | No | |
TRtimers | timer | Yes | |
TRtrig | trigger | No | |
TS | integer | No | |
TS_Angle | real | Yes | |
TS_Damage | real | Yes | |
TS_Distance | real | Yes | |
TS_Group | group | Yes | |
TS_Height | real | Yes | |
TS_Hero | unit | Yes | |
TS_Int_Multi | integer | No | |
TS_MaxDistance | real | Yes | |
TS_Off | boolean | Yes | |
TS_Parabola | real | Yes | |
TS_Point | location | Yes | |
TS_Radius | real | Yes | |
TS_Skip | integer | No | |
TS_Slams | integer | Yes | |
TS_Speed | real | Yes | |
TS_Spell_Lvl | integer | No | |
TS_Target | unit | Yes | |
TS_Times | integer | No | |
UC_SETTINGS_DestroyTrees_Dash | boolean | No | |
UDex | integer | No | |
UDexGen | integer | No | |
UDexNext | integer | Yes | |
UDexPrev | integer | Yes | |
UDexRecycle | integer | No | |
UDexUnits | unit | Yes | |
UDexWasted | integer | No | |
Unit_add_dmg | unit | No | |
Unit_TempGroup | group | No | |
UnitIndexerEnabled | boolean | No | |
UnitIndexEvent | real | 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 | |
Wings_Has | boolean | Yes | |
Wings_Has_2 | boolean | Yes | |
Wings_sf | effect | Yes |
function CreateTextTagLocBJ1 takes string s, location loc, real zOffset, real size, real red, real green, real blue, real transparency returns texttag
set bj_lastCreatedTextTag = CreateTextTag()
call SetTextTagTextBJ(bj_lastCreatedTextTag, s, size)
call SetTextTagPosBJ(bj_lastCreatedTextTag, loc, zOffset)
call SetTextTagColorBJ(bj_lastCreatedTextTag, red, green, blue, transparency)
return bj_lastCreatedTextTag
endfunction
//TESH.scrollpos=90
//TESH.alwaysfold=0
function CodeGen_SaveToDisk takes string loadcode, string filename returns nothing
call PreloadGenClear()
call PreloadGenStart()
call Preload( "-load " + loadcode)
call PreloadGenEnd(filename)
call ClearSelection()
endfunction
function CodeGen_Init takes nothing returns nothing
local integer i = 1
local integer b = udg_SaveLoad_Base
local integer m = udg_SaveLoad_MaxValue
loop
exitwhen i >= udg_SaveLoad_MaxValue
set udg_SaveLoad_Char[i] = SubString(udg_SaveLoad_Alphabet, i, i+1)
set i = i + 1
endloop
set udg_SaveLoad_Alphabet = SubString(udg_SaveLoad_Alphabet, 0, 1) + SubString(udg_SaveLoad_Alphabet, m + 1, b)
set udg_SaveLoad_Base = b - m
endfunction
function CodeGen_Encode takes integer i returns string
local integer b
local string s = ""
if i <= udg_SaveLoad_Base then
return SubString(udg_SaveLoad_Alphabet, i, i + 1)
endif
loop
exitwhen i <= 0
set b = i - (i / udg_SaveLoad_Base) * udg_SaveLoad_Base
set s = SubString(udg_SaveLoad_Alphabet, b, b + 1) + s
set i = i / udg_SaveLoad_Base
endloop
return s
endfunction
function CodeGen_StrPos takes string s returns integer
local integer i = 0
loop
exitwhen i > udg_SaveLoad_Base
if s == SubString(udg_SaveLoad_Alphabet, i, i + 1) then
return i
endif
set i = i + 1
endloop
return -1
endfunction
function CodeGen_Decode takes string s returns integer
local integer a = 0
loop
exitwhen StringLength(s) == 1
set a = a * udg_SaveLoad_Base + udg_SaveLoad_Base * CodeGen_StrPos(SubString(s, 0, 1))
set s = SubString(s, 1, 99)
endloop
return a+CodeGen_StrPos(s)
endfunction
function CodeGen_StringChecksum takes string in returns integer
local integer i = 0
local integer l = StringLength(in)
local integer t = 0
local integer o = 0
loop
exitwhen i >= l
set t = CodeGen_Decode(SubString(in, i, i + 1))
set o = o + t
set i = i + 1
endloop
return o
endfunction
function CodeGen_Color takes string char returns string
local integer i = 0
local integer l = StringLength(udg_SaveLoad_Full)
local string x = ""
loop
exitwhen i >= l
set x = SubString(udg_SaveLoad_Full, i, i + 1)
if char == x then
if (x=="0" or S2I(x) > 0) then
return udg_SaveLoad_Number + char + "|r"
elseif StringCase(x, false) == x then
return udg_SaveLoad_Lower + char + "|r"
elseif StringCase(x, true) == x then
return udg_SaveLoad_Upper + char + "|r"
endif
endif
set i = i + 1
endloop
return char
endfunction
function CodeGen_Format takes string s returns string
local integer i = 0
local integer x = StringLength(s)
local integer j = 1
local string s2 = ""
loop
exitwhen i >= x
set s2 = s2 + CodeGen_Color(SubString(s, i, i + 1))
if (j >= udg_SaveLoad_HyphenSpace and i != (x-1)) then
set j = 0
set s2 = s2 + udg_SaveLoad_SeperationChar
endif
set j = j + 1
set i = i + 1
endloop
return s2
endfunction
function CodeGen_Strip takes string s returns string
local integer i = 0
local integer x = StringLength(s)
local string out = ""
local string a = ""
loop
exitwhen i >= x
set a = SubString(s, i, i + 1)
if (a != udg_SaveLoad_SeperationChar) then
set out = out + a
endif
set i = i + 1
endloop
return out
endfunction
// yeeahh descriptive variables
function CodeGen_Load takes string s returns nothing
local string str = CodeGen_Strip(s)
local string tmp = ""
local string c = ""
local integer x = 0
local integer i = 1
local integer l = 0
local integer j = 1
local integer f = 0
local boolean b = true
set udg_SaveLoad_Valid = false
if (udg_SaveLoad_Security) then
loop
exitwhen i > 3
if (CodeGen_Decode(SubString(str, 0, i)) == CodeGen_StringChecksum(SubString(str, i, 999))) then
set udg_SaveLoad_Valid = true
set str = SubString(str, i, 999)
set i = 4
endif
set i = i + 1
endloop
endif
if (not udg_SaveLoad_Valid) then
set udg_SaveLoad_Error = "Invalid Code"
return
endif
set i = 0
set l = StringLength(str)
if (udg_SaveLoad_CheckName) then
set c = CodeGen_Encode(CodeGen_StringChecksum(GetPlayerName(GetTriggerPlayer())))
set i = StringLength(c)
if (c != SubString(str, l - i, i)) then
set udg_SaveLoad_Valid = false
set udg_SaveLoad_Error = "Wrong username"
return
endif
set l = l - i
endif
set i = 0
loop
exitwhen i >= l
set tmp = SubString(str, i, i + 1)
set b = true
set f = 0
set j = 1
loop
exitwhen f >= (udg_SaveLoad_MaxValue)
if (tmp == udg_SaveLoad_Char[f]) then
set j = f + 2
set udg_Load[x] = CodeGen_Decode(SubString(str, i + 1, i + (j)))
set b = false
set f = udg_SaveLoad_MaxValue
endif
set f = f + 1
endloop
if (b) then
set udg_Load[x] = CodeGen_Decode(tmp)
endif
set i = i + j
set x = x + 1
endloop
set udg_SaveLoad_Valid = true
endfunction
function CodeGen_Compile takes nothing returns string
local integer i = 0
local integer j = 0
local string out = ""
local string ln = ""
local string x = ""
loop
exitwhen i > udg_SaveCount
set x = CodeGen_Encode(udg_Save[i])
set j = StringLength(x)
if (j > 1) then
set out = out + udg_SaveLoad_Char[j-1]
endif
set out = out + x
set i = i + 1
endloop
if (udg_SaveLoad_CheckName) then
set out = out + CodeGen_Encode(CodeGen_StringChecksum(GetPlayerName(GetTriggerPlayer())))
endif
if (udg_SaveLoad_Security) then
set out = CodeGen_Encode(CodeGen_StringChecksum(out)) + out
endif
if udg_SaveLoad_SaveToDisk and GetLocalPlayer() == GetTriggerPlayer() then
call CodeGen_SaveToDisk(out, udg_SaveLoad_Directory + "\\" + udg_SaveLoad_Filename)
endif
return CodeGen_Format(out)
endfunction
//===========================================================================
//
// Damage Engine 5.5.0.0 - update requires copying of the Damage Engine folder.
//
//===========================================================================
library DamageEngine initializer Init
globals
private timer alarm = CreateTimer()
private boolean alarmSet = false
//Values to track the original pre-spirit Link/defensive damage values
private boolean canKick = true
private boolean totem = false
private real lastAmount = 0.00
private real lastPrevAmt = 0.00
private integer lastType = 0
private boolean lastCode = false
private real lastPierced = 0.00
private integer armorType = 0
private integer lastArmor = 0
private boolean lastAttack = false
private integer lastPrevArmor = 0
private integer defenseType = 0
private integer lastDefense = 0
private integer lastPrevDefense = 0
//Stuff to track recursive UnitDamageTarget calls.
private boolean eventsRun = false
private boolean kicking = false
private integer damageStack = 0
private unit array sourceStack
private unit array targetStack
private real array amountStack
private attacktype array attackTStack
private damagetype array damageTStack
private weapontype array weaponTStack
private integer array userTrigStack
private integer array typeStack
//Added in 5.4 to silently eliminate infinite recursion.
private integer userTrigs = 9
private integer eventTrig = 0
private integer array nextTrig
private trigger array userTrig
private boolean array trigFrozen
//Added/re-tooled in 5.4.1 to allow forced recursion (for advanced users only).
private constant integer LIMBO = 16 //Recursion will never go deeper than LIMBO.
private integer array levelsDeep //How deep the user recursion currently is.
public boolean 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.
private boolean dreaming = false
private boolean array inceptionTrig //Added in 5.4.2 to simplify the inception variable for very complex DamageEvent trigger.
private integer sleepLevel = 0
private group proclusGlobal = CreateGroup() //track sources of recursion
private group fischerMorrow = CreateGroup() //track targets of recursion
//Improves readability in the code to have these as named constants.
private constant integer MOD_EVENT = 1
private constant integer SHIELD_EVENT = 4
private constant integer DAMAGE_EVENT = 5
private constant integer ZERO_EVENT = 6
private constant integer AFTER_EVENT = 7
private constant integer LETHAL_EVENT = 8
private constant integer AOE_EVENT = 9
//private string crashStr = ""
endglobals
//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
//Added after Reforged introduced the new native BlzGetDamageIsAttack
boolean udg_IsDamageAttack
*/
private function RunTrigs takes integer i returns nothing
local integer cat = i
if dreaming then
//call BJDebugMsg("Tried to run triggers while triggers were already running.")
return
endif
set dreaming = true
//call BJDebugMsg("Start of event running")
loop
set i = nextTrig[i]
exitwhen i == 0
exitwhen cat == MOD_EVENT and (udg_DamageEventOverride or udg_DamageEventType*udg_DamageEventType == 4)
exitwhen cat == SHIELD_EVENT and udg_DamageEventAmount <= 0.00
exitwhen cat == LETHAL_EVENT and udg_LethalDamageHP > 0.405
//set crashStr = "Bout to inspect " + I2S(i)
if not trigFrozen[i] and IsTriggerEnabled(userTrig[i]) then
set eventTrig = i
//set crashStr = "Bout to evaluate " + I2S(i)
if TriggerEvaluate(userTrig[i]) then
//set crashStr = "Bout to execute " + I2S(i)
call TriggerExecute(userTrig[i])
endif
//set crashStr = "Ran " + I2S(i)
//call BJDebugMsg("Ran " + I2S(i))
//if not (udg_DamageEventPrevAmt == 0.00 or udg_DamageScalingWC3 == 0.00 or udg_DamageEventAmount == 0.00) then
// if cat == MOD_EVENT then
// set udg_DamageScalingUser = udg_DamageEventAmount/udg_DamageEventPrevAmt
// elseif cat == SHIELD_EVENT then
// set udg_DamageScalingUser = udg_DamageEventAmount/udg_DamageEventPrevAmt/udg_DamageScalingWC3
// endif
//elseif udg_DamageEventPrevAmt == 0.00 then
// call BJDebugMsg("Prev amount 0.00 and User Amount " + R2S(udg_DamageEventAmount))
//elseif udg_DamageEventAmount == 0.00 then
// call BJDebugMsg("User amount 0.00 and Prev Amount " + R2S(udg_DamageEventPrevAmt))
//elseif udg_DamageScalingWC3 == 0.00 then
// call BJDebugMsg("WC3 amount somehow 0.00")
//endif
//set crashStr = "Filtered " + I2S(i)
//elseif i > 9 then
// if trigFrozen[i] then
// call BJDebugMsg("User Trigger is frozen")
// else
// call BJDebugMsg("User Trigger is off")
// endif
endif
endloop
//call BJDebugMsg("End of event running")
set dreaming = false
endfunction
private function OnAOEEnd takes nothing returns nothing
if udg_DamageEventAOE > 1 then
call RunTrigs(AOE_EVENT)
set udg_DamageEventAOE = 1
endif
set udg_DamageEventLevel = 1
set udg_EnhancedDamageTarget = null
set udg_AOEDamageSource = null
call GroupClear(udg_DamageEventAOEGroup)
endfunction
private function AfterDamage takes nothing returns nothing
if udg_DamageEventPrevAmt != 0.00 and udg_DamageEventDamageT != udg_DAMAGE_TYPE_UNKNOWN then
call RunTrigs(AFTER_EVENT)
endif
endfunction
private function Finish takes nothing returns nothing
local integer i = 0
local integer exit
if eventsRun then
//call BJDebugMsg("events ran")
set eventsRun = false
call AfterDamage()
endif
if canKick and not kicking then
//call BJDebugMsg("can kick")
if damageStack > 0 then
set kicking = true
//call BJDebugMsg("Clearing queued damage instances: " + I2S(damageStack))
loop
set exit = damageStack
set sleepLevel = sleepLevel + 1
loop
set udg_NextDamageType = typeStack[i]
//call BJDebugMsg("Stacking on " + R2S(amountStack[i]))
call UnitDamageTarget(sourceStack[i], targetStack[i], amountStack[i], true, false, attackTStack[i], damageTStack[i], weaponTStack[i])
call AfterDamage()
set i = i + 1 //Need to loop bottom to top to make sure damage order is preserved.
exitwhen i == exit
endloop
//call BJDebugMsg("Exit at: " + I2S(i))
exitwhen i == damageStack
endloop
//call BJDebugMsg("Terminate at at: " + I2S(i))
set sleepLevel = 0
loop
set i = i - 1
set trigFrozen[userTrigStack[i]] = false //Only re-enable recursive triggers AFTER all damage is dealt.
set levelsDeep[userTrigStack[i]] = 0 //Reset this stuff if the user tried some nonsense
exitwhen i == 0
endloop
//call BJDebugMsg("Cleared queued damage instances: " + I2S(damageStack))
set damageStack = 0 //Can only be set after all the damage has successfully ended.
set kicking = false
endif
call GroupClear(proclusGlobal)
call GroupClear(fischerMorrow)
//elseif kicking then
// call BJDebugMsg("Somehow still kicking")
//else
// call BJDebugMsg("Cannot kick")
endif
endfunction
private function ResetArmor takes nothing returns nothing
if udg_DamageEventArmorPierced != 0.00 then
call BlzSetUnitArmor(udg_DamageEventTarget, BlzGetUnitArmor(udg_DamageEventTarget) + udg_DamageEventArmorPierced)
endif
if armorType != udg_DamageEventArmorT then
call BlzSetUnitIntegerField(udg_DamageEventTarget, UNIT_IF_ARMOR_TYPE, armorType) //revert changes made to the damage instance
endif
if defenseType != udg_DamageEventDefenseT then
call BlzSetUnitIntegerField(udg_DamageEventTarget, UNIT_IF_DEFENSE_TYPE, defenseType)
endif
endfunction
private function FailsafeClear takes nothing returns nothing
//call BJDebugMsg("Damage from " + GetUnitName(udg_DamageEventSource) + " to " + GetUnitName(udg_DamageEventTarget) + " has been messing up Damage Engine.")
//call BJDebugMsg(R2S(udg_DamageEventAmount) + " " + " " + R2S(udg_DamageEventPrevAmt) + " " + udg_AttackTypeDebugStr[udg_DamageEventAttackT] + " " + udg_DamageTypeDebugStr[udg_DamageEventDamageT])
call ResetArmor()
set canKick = true
set totem = false
set udg_DamageEventAmount = 0.00
set udg_DamageScalingWC3 = 0.00
if udg_DamageEventDamageT != udg_DAMAGE_TYPE_UNKNOWN then
call RunTrigs(DAMAGE_EVENT) //Run the normal on-damage event based on this failure.
set eventsRun = true //Run the normal after-damage event based on this failure.
endif
call Finish()
endfunction
private function WakeUp takes nothing returns nothing
set alarmSet = false //The timer has expired. Flag off to allow it to be restarted when needed.
//if dreaming then
// set dreaming= false
// call BJDebugMsg("Timer set dreaming to False")
// call BJDebugMsg(crashStr)
//endif
if totem then
//Something went wrong somewhere; the WarCraft 3 engine didn't run the DAMAGED event despite running the DAMAGING event.
call FailsafeClear()
else
if not canKick and damageStack > 0 then
//call BJDebugMsg("Damage Engine recursion deployment was failing with application of: " + R2S(udg_DamageEventAmount))
set canKick = true
endif
call Finish() //Wrap up any outstanding damage instance
endif
call OnAOEEnd() //Reset things so they don't perpetuate for AoE/Level target detection
set udg_DamageEventPrevAmt = 0.00 //Added in 5.4.2.1 to try to squash the Cold Arrows glitch (failed to do it)
endfunction
private function CalibrateMR takes nothing returns nothing
set udg_IsDamageMelee = false
set udg_IsDamageRanged = false
set udg_IsDamageSpell = udg_DamageEventAttackT == 0 and not udg_IsDamageAttack
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.
set udg_IsDamageMelee = IsUnitType(udg_DamageEventSource, UNIT_TYPE_MELEE_ATTACKER)
set udg_IsDamageRanged = IsUnitType(udg_DamageEventSource, UNIT_TYPE_RANGED_ATTACKER)
if udg_IsDamageMelee and udg_IsDamageRanged then
set udg_IsDamageMelee = udg_DamageEventWeaponT > 0// Melee units play a sound when damaging
set udg_IsDamageRanged = not udg_IsDamageMelee // In the case where a unit is both ranged and melee, the ranged attack plays no sound.
endif // The Huntress has a melee sound for her ranged projectile, however it is only an issue
endif //if she also had a melee attack, because by default she is only UNIT_TYPE_RANGED_ATTACKER.
endfunction
private function OnPreDamage takes nothing returns boolean
local unit src = GetEventDamageSource()
local unit tgt = GetTriggerUnit()
local real amt = GetEventDamage()
local attacktype at = BlzGetEventAttackType()
local damagetype dt = BlzGetEventDamageType()
local weapontype wt = BlzGetEventWeaponType()
//call BJDebugMsg("First damage event running")
if dreaming then
//call BJDebugMsg("Dreaming")
if amt != 0.00 then
//Store recursive damage into a queue from index "damageStack" (0-15)
//This damage will be fired after the current damage instance has wrapped up its events.
//This damage can only be caused by triggers.
set amountStack[damageStack] = amt
set sourceStack[damageStack] = src
set targetStack[damageStack] = tgt
set attackTStack[damageStack] = at
set damageTStack[damageStack] = dt
set weaponTStack[damageStack] = wt
set userTrigStack[damageStack] = eventTrig
if udg_NextDamageType == 0 then
set typeStack[damageStack] = udg_DamageTypeCode
else
set typeStack[damageStack] = udg_NextDamageType
endif
//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.
set inception = inception or inceptionTrig[eventTrig]
call GroupAddUnit(proclusGlobal, udg_DamageEventSource)
call GroupAddUnit(fischerMorrow, udg_DamageEventTarget)
if kicking and IsUnitInGroup(src, proclusGlobal) and IsUnitInGroup(tgt, fischerMorrow) then
if inception and not trigFrozen[eventTrig] then
set inceptionTrig[eventTrig] = true
if levelsDeep[eventTrig] < sleepLevel then
set levelsDeep[eventTrig] = levelsDeep[eventTrig] + 1
if levelsDeep[eventTrig] >= LIMBO then
set trigFrozen[eventTrig] = true
endif
endif
else
set trigFrozen[eventTrig] = true
endif
endif
set damageStack = damageStack + 1
//call BJDebugMsg("damageStack: " + I2S(damageStack) + " levelsDeep: " + I2S(levelsDeep[eventTrig]) + " sleepLevel: " + I2S(sleepLevel))
call BlzSetEventDamage(0.00) //queue the damage instance instead of letting it run recursively
endif
else
if not kicking then
//Added 25 July 2017 to detect AOE damage or multiple single-target damage
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.
call FailsafeClear()
else
set totem = false
set lastAmount = udg_DamageEventAmount
set lastPrevAmt = udg_DamageEventPrevAmt //Store the actual pre-armor value.
set lastType = udg_DamageEventType //also store the damage type.
set lastCode = udg_IsDamageCode //store this as well.
set lastAttack = udg_IsDamageAttack //Added after this new Reforged native.
set lastArmor = udg_DamageEventArmorT
set lastPrevArmor = armorType
set lastDefense = udg_DamageEventDefenseT
set lastPrevDefense = defenseType
set lastPierced = udg_DamageEventArmorPierced
set canKick = false
endif
else
call Finish()
endif
if src != udg_AOEDamageSource then //Source has damaged more than once
call OnAOEEnd() //New damage source - unflag everything
set udg_AOEDamageSource = src
elseif tgt == udg_EnhancedDamageTarget then
set udg_DamageEventLevel= udg_DamageEventLevel + 1 //The number of times the same unit was hit.
elseif not IsUnitInGroup(tgt, udg_DamageEventAOEGroup) then
set udg_DamageEventAOE = udg_DamageEventAOE + 1 //Multiple targets hit by this source - flag as AOE
endif
else
call TimerStart(alarm, 0.00, false, function WakeUp)
set alarmSet = true
set udg_AOEDamageSource = src
set udg_EnhancedDamageTarget= tgt
endif
call GroupAddUnit(udg_DamageEventAOEGroup, tgt)
endif
set udg_DamageEventType = udg_NextDamageType
set udg_IsDamageCode = udg_NextDamageType != 0
set udg_IsDamageAttack = BlzGetEventIsAttack()
set udg_DamageEventOverride = dt == null //Got rid of NextDamageOverride in 5.1 for simplicity
set udg_DamageEventPrevAmt = amt
set udg_DamageEventSource = src
set udg_DamageEventTarget = tgt
set udg_DamageEventAmount = amt
set udg_DamageEventAttackT = GetHandleId(at)
set udg_DamageEventDamageT = GetHandleId(dt)
set udg_DamageEventWeaponT = GetHandleId(wt)
call CalibrateMR() //Set Melee and Ranged settings.
set udg_DamageEventArmorT = BlzGetUnitIntegerField(udg_DamageEventTarget, UNIT_IF_ARMOR_TYPE) //Introduced in Damage Engine 5.2.0.0
set udg_DamageEventDefenseT = BlzGetUnitIntegerField(udg_DamageEventTarget, UNIT_IF_DEFENSE_TYPE)
set armorType = udg_DamageEventArmorT
set defenseType = udg_DamageEventDefenseT
set udg_DamageEventArmorPierced = 0.00
set udg_DamageScalingUser = 1.00
set udg_DamageScalingWC3 = 1.00
if amt != 0.00 then
if not udg_DamageEventOverride then
call RunTrigs(MOD_EVENT)
//All events have run and the pre-damage amount is finalized.
call BlzSetEventAttackType(ConvertAttackType(udg_DamageEventAttackT))
call BlzSetEventDamageType(ConvertDamageType(udg_DamageEventDamageT))
call BlzSetEventWeaponType(ConvertWeaponType(udg_DamageEventWeaponT))
if udg_DamageEventArmorPierced != 0.00 then
call BlzSetUnitArmor(udg_DamageEventTarget, BlzGetUnitArmor(udg_DamageEventTarget) - udg_DamageEventArmorPierced)
endif
if armorType != udg_DamageEventArmorT then
call BlzSetUnitIntegerField(udg_DamageEventTarget, UNIT_IF_ARMOR_TYPE, udg_DamageEventArmorT) //Introduced in Damage Engine 5.2.0.0
endif
if defenseType != udg_DamageEventDefenseT then
call BlzSetUnitIntegerField(udg_DamageEventTarget, UNIT_IF_DEFENSE_TYPE, udg_DamageEventDefenseT) //Introduced in Damage Engine 5.2.0.0
endif
call BlzSetEventDamage(udg_DamageEventAmount)
endif
//call BJDebugMsg("Ready to deal " + R2S(udg_DamageEventAmount))
set totem = true
else
call RunTrigs(ZERO_EVENT)
set canKick = true
call Finish()
endif
endif
set src = null
set tgt = null
set inception = false
set udg_NextDamageType = 0
return false
endfunction
//The traditional on-damage response, where armor reduction has already been factored in.
private function OnDamage takes nothing returns boolean
local real r = GetEventDamage()
//call BJDebugMsg("Second damage event running")
if dreaming or udg_DamageEventPrevAmt == 0.00 then
//if dreaming then
// call BJDebugMsg("Dreaming")
//else
// call BJDebugMsg("Prev amount is zero")
//endif
return false
endif
if totem then
set totem = false //This should be the case in almost all circumstances
else
call AfterDamage() //Wrap up the outstanding damage instance
set 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.
set udg_DamageEventSource = GetEventDamageSource()
set udg_DamageEventTarget = GetTriggerUnit()
set udg_DamageEventAmount = lastAmount
set udg_DamageEventPrevAmt = lastPrevAmt
set udg_DamageEventAttackT = GetHandleId(BlzGetEventAttackType())
set udg_DamageEventDamageT = GetHandleId(BlzGetEventDamageType())
set udg_DamageEventWeaponT = GetHandleId(BlzGetEventWeaponType())
set udg_DamageEventType = lastType
set udg_IsDamageAttack = lastAttack
set udg_IsDamageCode = lastCode
set udg_DamageEventArmorT = lastArmor
set udg_DamageEventDefenseT = lastDefense
set udg_DamageEventArmorPierced = lastPierced
set armorType = lastPrevArmor
set defenseType = lastPrevDefense
call CalibrateMR() //Apply melee/ranged settings once again.
endif
call ResetArmor()
if udg_DamageEventAmount != 0.00 and r != 0.00 then
set udg_DamageScalingWC3 = r / udg_DamageEventAmount
elseif udg_DamageEventAmount > 0.00 then
set udg_DamageScalingWC3 = 0.00
else
set udg_DamageScalingWC3 = 1.00
set udg_DamageScalingUser = udg_DamageEventAmount / udg_DamageEventPrevAmt
endif
set 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.
call RunTrigs(SHIELD_EVENT)
set udg_LethalDamageHP = GetWidgetLife(udg_DamageEventTarget) - udg_DamageEventAmount
if udg_LethalDamageHP <= 0.405 then
call RunTrigs(LETHAL_EVENT) //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).
set udg_DamageEventAmount = GetWidgetLife(udg_DamageEventTarget) - udg_LethalDamageHP
if udg_DamageEventType < 0 and udg_LethalDamageHP <= 0.405 then
call SetUnitExploded(udg_DamageEventTarget, true) //Explosive damage types should blow up the target.
endif
endif
set udg_DamageScalingUser = udg_DamageEventAmount/udg_DamageEventPrevAmt/udg_DamageScalingWC3
endif
call BlzSetEventDamage(udg_DamageEventAmount) //Apply the final damage amount.
if udg_DamageEventDamageT != udg_DAMAGE_TYPE_UNKNOWN then
call RunTrigs(DAMAGE_EVENT)
endif
set eventsRun = true
if udg_DamageEventAmount == 0.00 then
call Finish()
endif
return false
endfunction
//===========================================================================
private function Init takes nothing returns nothing
local trigger trig = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(trig, EVENT_PLAYER_UNIT_DAMAGED) //Thanks to this I no longer have to create an event for every unit in the map.
call TriggerAddCondition(trig, Filter(function OnDamage))
set trig = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(trig, EVENT_PLAYER_UNIT_DAMAGING) //The new 1.31 event which fires before damage.
call TriggerAddCondition(trig, Filter(function OnPreDamage))
set trig = null
endfunction
public function DebugStr takes nothing returns nothing
local integer i = 0
loop
set udg_CONVERTED_ATTACK_TYPE[i] = ConvertAttackType(i)
exitwhen i == 6
set i = i + 1
endloop
set i = 0
loop
set udg_CONVERTED_DAMAGE_TYPE[i] = ConvertDamageType(i)
exitwhen i == 26
set i = i + 1
endloop
set udg_AttackTypeDebugStr[0] = "SPELLS" //ATTACK_TYPE_NORMAL in JASS
set udg_AttackTypeDebugStr[1] = "NORMAL" //ATTACK_TYPE_MELEE in JASS
set udg_AttackTypeDebugStr[2] = "PIERCE"
set udg_AttackTypeDebugStr[3] = "SIEGE"
set udg_AttackTypeDebugStr[4] = "MAGIC"
set udg_AttackTypeDebugStr[5] = "CHAOS"
set udg_AttackTypeDebugStr[6] = "HERO"
set udg_DamageTypeDebugStr[0] = "UNKNOWN"
set udg_DamageTypeDebugStr[4] = "NORMAL"
set udg_DamageTypeDebugStr[5] = "ENHANCED"
set udg_DamageTypeDebugStr[8] = "FIRE"
set udg_DamageTypeDebugStr[9] = "COLD"
set udg_DamageTypeDebugStr[10] = "LIGHTNING"
set udg_DamageTypeDebugStr[11] = "POISON"
set udg_DamageTypeDebugStr[12] = "DISEASE"
set udg_DamageTypeDebugStr[13] = "DIVINE"
set udg_DamageTypeDebugStr[14] = "MAGIC"
set udg_DamageTypeDebugStr[15] = "SONIC"
set udg_DamageTypeDebugStr[16] = "ACID"
set udg_DamageTypeDebugStr[17] = "FORCE"
set udg_DamageTypeDebugStr[18] = "DEATH"
set udg_DamageTypeDebugStr[19] = "MIND"
set udg_DamageTypeDebugStr[20] = "PLANT"
set udg_DamageTypeDebugStr[21] = "DEFENSIVE"
set udg_DamageTypeDebugStr[22] = "DEMOLITION"
set udg_DamageTypeDebugStr[23] = "SLOW_POISON"
set udg_DamageTypeDebugStr[24] = "SPIRIT_LINK"
set udg_DamageTypeDebugStr[25] = "SHADOW_STRIKE"
set udg_DamageTypeDebugStr[26] = "UNIVERSAL"
set udg_WeaponTypeDebugStr[0] = "NONE" //WEAPON_TYPE_WHOKNOWS in JASS
set udg_WeaponTypeDebugStr[1] = "METAL_LIGHT_CHOP"
set udg_WeaponTypeDebugStr[2] = "METAL_MEDIUM_CHOP"
set udg_WeaponTypeDebugStr[3] = "METAL_HEAVY_CHOP"
set udg_WeaponTypeDebugStr[4] = "METAL_LIGHT_SLICE"
set udg_WeaponTypeDebugStr[5] = "METAL_MEDIUM_SLICE"
set udg_WeaponTypeDebugStr[6] = "METAL_HEAVY_SLICE"
set udg_WeaponTypeDebugStr[7] = "METAL_MEDIUM_BASH"
set udg_WeaponTypeDebugStr[8] = "METAL_HEAVY_BASH"
set udg_WeaponTypeDebugStr[9] = "METAL_MEDIUM_STAB"
set udg_WeaponTypeDebugStr[10] = "METAL_HEAVY_STAB"
set udg_WeaponTypeDebugStr[11] = "WOOD_LIGHT_SLICE"
set udg_WeaponTypeDebugStr[12] = "WOOD_MEDIUM_SLICE"
set udg_WeaponTypeDebugStr[13] = "WOOD_HEAVY_SLICE"
set udg_WeaponTypeDebugStr[14] = "WOOD_LIGHT_BASH"
set udg_WeaponTypeDebugStr[15] = "WOOD_MEDIUM_BASH"
set udg_WeaponTypeDebugStr[16] = "WOOD_HEAVY_BASH"
set udg_WeaponTypeDebugStr[17] = "WOOD_LIGHT_STAB"
set udg_WeaponTypeDebugStr[18] = "WOOD_MEDIUM_STAB"
set udg_WeaponTypeDebugStr[19] = "CLAW_LIGHT_SLICE"
set udg_WeaponTypeDebugStr[20] = "CLAW_MEDIUM_SLICE"
set udg_WeaponTypeDebugStr[21] = "CLAW_HEAVY_SLICE"
set udg_WeaponTypeDebugStr[22] = "AXE_MEDIUM_CHOP"
set udg_WeaponTypeDebugStr[23] = "ROCK_HEAVY_BASH"
set udg_DefenseTypeDebugStr[0] = "LIGHT"
set udg_DefenseTypeDebugStr[1] = "MEDIUM"
set udg_DefenseTypeDebugStr[2] = "HEAVY"
set udg_DefenseTypeDebugStr[3] = "FORTIFIED"
set udg_DefenseTypeDebugStr[4] = "NORMAL" //Typically deals flat damage to all armor types
set udg_DefenseTypeDebugStr[5] = "HERO"
set udg_DefenseTypeDebugStr[6] = "DIVINE"
set udg_DefenseTypeDebugStr[7] = "UNARMORED"
set udg_ArmorTypeDebugStr[0] = "NONE" //ARMOR_TYPE_WHOKNOWS in JASS, added in 1.31
set udg_ArmorTypeDebugStr[1] = "FLESH"
set udg_ArmorTypeDebugStr[2] = "METAL"
set udg_ArmorTypeDebugStr[3] = "WOOD"
set udg_ArmorTypeDebugStr[4] = "ETHEREAL"
set udg_ArmorTypeDebugStr[5] = "STONE"
endfunction
//This function exists mainly to make it easier to switch from another DDS, like PDD.
function UnitDamageTargetEx takes unit src, unit tgt, real amt, boolean a, boolean r, attacktype at, damagetype dt, weapontype wt returns boolean
if udg_NextDamageType == 0 then
set udg_NextDamageType = udg_DamageTypeCode
endif
call UnitDamageTarget(src, tgt, amt, a, r, at, dt, wt)
return dreaming
endfunction
public function SetupEvent takes trigger whichTrig, string var, integer index returns nothing
local integer max = 1
local integer off = 0
local integer exit = 0
local integer i
if var == "udg_DamageModifierEvent" then //MOD_EVENT 1-4 -> Events 1-4
if index < 3 then
set exit = index + 1
endif
if nextTrig[1] == 0 then
set nextTrig[1] = 2
set nextTrig[2] = 3
set trigFrozen[2] = true
set trigFrozen[3] = true
endif
set max = 4
elseif var == "udg_DamageEvent" then //DAMAGE_EVENT 1,2 -> Events 5,6
set max = 2
set off = 4
elseif var == "udg_AfterDamageEvent" then //AFTER_EVENT -> Event 7
set off = 6
elseif var == "udg_LethalDamageEvent" then //LETHAL_EVENT -> Event 8
set off = 7
elseif var == "udg_AOEDamageEvent" then //AOE_EVENT -> Event 9
set off = 8
else
return
endif
set i = IMaxBJ(IMinBJ(index, max), 1) + off
//call BJDebugMsg("Root index: " + I2S(i))
loop
set index = i
set i = nextTrig[i]
exitwhen i == exit
endloop
set userTrigs = userTrigs + 1 //User list runs from index 10 and up
set nextTrig[index] = userTrigs
set nextTrig[userTrigs] = exit
set userTrig[userTrigs] = whichTrig
//call BJDebugMsg("Registered " + I2S(userTrigs) + " to " + I2S(index))
endfunction
private function PreSetup takes trigger whichTrig, string var, limitop op, real value returns nothing
call SetupEvent(whichTrig, var, R2I(value))
endfunction
hook TriggerRegisterVariableEvent PreSetup
endlibrary
//TESH.scrollpos=0
//TESH.alwaysfold=1
/////////////////////////////////////////////////////////////////////////////
// //
// Knock-Back 3D [JASS - GUI] //
// Multi-Movement System 3D //
// by Jad aka DotCa //
// //
/////////////////////////////////////////////////////////////////////////////
// //
// System's Hidden Features: //
// //
// 1. To know if a unit is being KBed by the System, Use: //
// - LoadBoolean(udg_KB3D_HA, GetHandleId(Unit), GetHandleId(Unit)) //
// True means that the unit is being KBed, also works in GUI //
// 2. Use udg_KB3D_Time variable after registring the KB to actually //
// know how much the KB will last, NOTE that this the time may //
// varry if you have a Homing KB (using KB3D_Targeted_Unit) //
// 3. Some Variables in the System has default values, but useful; //
// in Example, "udg_KB3D_Attach" is "origin" even without setting //
// it, so you won't need to change it before Registering a KB //
// //
/////////////////////////////////////////////////////////////////////////////
// //
// System Informations: //
// //
// The System is a well performing, ultra-purpose knockback (see uses //
// below ) Coded in JASS making it possible for all users to take //
// advantage of it, and GUI friendly to use, see Examples in the triggers //
// above //
// Configurations that have default values: //
// //
// - KB3D_EndWhenDead ==> TRUE by default //
// - KB3D_UnpathableStop ==> TRUE by default //
// - KB3D_iKB ==> TRUE by default //
// - KB3D_D_ENEMY ==> TRUE by default //
// - KB3D_DestroyTree ==> TRUE by default //
// - KB3D_AttackType ==> ATTACK_TYPE_NORMAL by default //
// - KB3D_DamageType ==> DAMAGE_TYPE_MAGIC by default //
// - KB3D_AoEKB_Power ==> 1.00 by default //
// - KB3D_Attach ==> "origin" by default //
// - Other Booleans ==> FALSE by default //
// //
// The System also uses Always positive values for some configurations //
// to not make the knockback go wrong, those configurations are: //
// //
// "KB3D_Range" - "KB3D_Speed" - "KB3D_ZOffset" - "KB3D_AoE" //
// //
/////////////////////////////////////////////////////////////////////////////
// //
// HomingMissile, Accessibility feature //
// //
// When true, there will be no need to set the range and some other //
// features, since they will be automatically set to fit a homing //
// missile: //
// - KB3D_Zoffset - KB3D_Range - KB3D_KillatEnd - KB3D_EndWhenHit - //
// - KB3D_FaceAngle - KB3D_UnpathableStop - KB3D_KillWhenHit - //
// //
// This feature allows to skip the configurations of some features //
// needed for a homing missile, Note that Targeted_Unit needs to be set //
// //
/////////////////////////////////////////////////////////////////////////////
// //
// iKB, intelligent KB informations: //
// //
// iKB, makes some features in KB3D act intelligently, those features: //
// //
// -Range: usually always positive, it will be available in negative //
// values, it will, if negative, flip the Angle (+180 d) //
// -Speed: usually always positive, it will be available in negative //
// values, it will act normally, just the KBed unit will //
// move backward if the current speed is negative //
// -Height: usually always positive, it will be available in negative//
// values, it will, if negative, make the unit go down //
// instead of up //
// -Damages: //
// AoEEndDamage, AoEDamage, LineDamage, ImpactDamage, TargetDamage //
// //
// All those values ^ will turn intelligent, by this, it means //
// that if the Target of the Damage is not in approximated //
// height (Z) of the KBed Unit, the damage won't occur //
// -AoEKB, usually KBs all units in the AoE, it will choose only //
// Units that are close to it by the height, Z offset //
// //
/////////////////////////////////////////////////////////////////////////////
// //
// System Requirements: Basic WE - (NONE) //
// //
// The System uses implemented CheckWalkability System by PurgeandFire //
// You "can" remove the initialization trigger of PnF's System since //
// it is directly implemented in the System, all will work fine with or //
// without removing your Initializer trigger //
// //
/////////////////////////////////////////////////////////////////////////////
// //
// Credits: //
// //
// *WEHZ & TS Helpers Group for helping in Script Fixes //
// *Barry the Moose for helping in main codes and fixes //
// *PurgeandFire for his CheckWalkability System //
// *Vexorian / Nestharus for the GetCollision function //
// //
/////////////////////////////////////////////////////////////////////////////
// //
// How to Import? //
// //
// 1. Check that Create Unknown Variables is ticked in your WE Settings //
// 2. Copy the Paste the Knock-Back 3D Folder //
// 3. Delete the Variable Creator Trigger and learn how to use the System //
// by reading the documentation in the 2 Features Triggers (GUI - JASS)//
// Congratulations, the System is now implemented in your map //
// //
/////////////////////////////////////////////////////////////////////////////
// //
// How to Use? //
// //
// 1. There are many Examples of use in the KB3D Example Folder //
// 2. Documentations are there in the Features Triggers to help you //
// 3. The KB3D System is an Ultra-Purpose System where you can use it for://
// -Projectiles, the system supports homing so a projectile is easy //
// -Jump, the System's smoothness in the fly is useful for a jump spell//
// -And of course, a 2D Knock-Back //
// -And More depending on your imagination //
// //
/////////////////////////////////////////////////////////////////////////////
// //
// Bug Reports - Feedbacks //
// //
// * We count on you to report bugs in the system, also telling the source//
// * Feedbacks about the system are much appreciated //
// * We mostly hope suggestions about enhancements for the System //
// //
/////////////////////////////////////////////////////////////////////////////
function KB3D_AlwaysNeg takes real R returns real
if R > 0 then
return -R
endif
return R
endfunction
function KB3D_InBetween takes real Min, real R, real Max returns real
return RMaxBJ(RMinBJ(R, Max), Min)
endfunction
function KB3D_IsInBetween takes real Min, real R, real Max returns boolean
return R > Min and R < Max
endfunction
function KB3D_CW_Loop takes nothing returns nothing
if IsItemVisible(GetEnumItem()) then
set udg_CP_HiddenItems[udg_CP_HiddenItemsIndex] = GetEnumItem()
call SetItemVisible(udg_CP_HiddenItems[udg_CP_HiddenItemsIndex], false)
set udg_CP_HiddenItemsIndex = ( udg_CP_HiddenItemsIndex + 1 )
endif
endfunction
function KB3D_CW takes real x, real y returns boolean
local real x2 = 0
local real y2 = 0
//---------------------------
call MoveRectTo(udg_CP_Rect, x, y)
call EnumItemsInRect(udg_CP_Rect, null, function KB3D_CW_Loop )
call SetItemPosition(udg_CP_Item, x, y)
set x2 = GetItemX(udg_CP_Item)
set y2 = GetItemY(udg_CP_Item)
call SetItemVisible(udg_CP_Item, false)
//---------------------------
loop
exitwhen udg_CP_HiddenItemsIndex == 0
set udg_CP_HiddenItemsIndex = udg_CP_HiddenItemsIndex - 1
call SetItemVisible(udg_CP_HiddenItems[udg_CP_HiddenItemsIndex], true)
set udg_CP_HiddenItems[udg_CP_HiddenItemsIndex] = null
endloop
//---------------------------
return (((x2-x)*(x2-x) + (y2-y)*(y2-y) <= 75) and (not IsTerrainPathable(x, y, PATHING_TYPE_WALKABILITY)))
endfunction
function KB3D_GetCoordinatesZ takes real x, real y returns real
local location L = Location(x,y)
local real r = 0
call RemoveLocation(L)
set L = null
return r
endfunction
function KB3D_Approx takes unit U, unit U2, integer Loop returns boolean
local real r = KB3D_InBetween(50, LoadReal(udg_KB3D_HA, 29, Loop) / 2, 1000)
local real r1 = GetUnitFlyHeight(U2)
//---------------------------
return KB3D_IsInBetween(r1-r, GetUnitFlyHeight(U), r1+r)
endfunction
function KB3D_Filter takes unit U, unit U1, integer Loop returns boolean
if not IsUnitType(U, UNIT_TYPE_DEAD) then
//---------------------------
if not(LoadBoolean(udg_KB3D_HA, 48, Loop)) and ( IsUnitType(U, UNIT_TYPE_STRUCTURE)) then
return false
elseif not((LoadBoolean(udg_KB3D_HA, 48, Loop)) and ( IsUnitType(U, UNIT_TYPE_STRUCTURE))) then
if not(LoadBoolean(udg_KB3D_HA, 49, Loop)) and ( IsUnitType(U, UNIT_TYPE_MECHANICAL)) then
return false
endif
endif
//---------------------------
if not(LoadBoolean(udg_KB3D_HA, 50, Loop)) and ( IsUnitType(U, UNIT_TYPE_MAGIC_IMMUNE)) then
return false
endif
//---------------------------
if not(LoadBoolean(udg_KB3D_HA, 51, Loop)) and ( IsUnitAlly(U, GetOwningPlayer(U1))) then
return false
endif
//---------------------------
if not(LoadBoolean(udg_KB3D_HA, 63, Loop)) and ( IsUnitEnemy(U, GetOwningPlayer(U1))) then
return false
endif
//---------------------------
if not(LoadBoolean(udg_KB3D_HA, 64, Loop)) and ( IsUnitType(U, UNIT_TYPE_RESISTANT)) then
return false
endif
//---------------------------
if not(LoadBoolean(udg_KB3D_HA, 65, Loop)) and ( IsUnitType(U, UNIT_TYPE_FLYING)) then
return false
endif
//---------------------------
return true
endif
//---------------------------
return false
endfunction
function KB3D_RegisterUnitCollision takes unit u, real x, real y, integer i returns real
local real l = 0
local real h = 300
local real m = 150
local real nm
//---------------------------
loop
if (IsUnitInRangeXY(u, x+m, y, 0)) then
set l = m
else
set h = m
endif
set nm = (l+h)/2
exitwhen nm+.001 > m and nm-.001 < m
set m = nm
endloop
//---------------------------
set m = R2I(m*10)/10.
call SaveReal( udg_KB3D_HA, 16, GetUnitTypeId(u), m )
//---------------------------
return m
endfunction
function KB3D_GetUnitCollision takes unit u returns real
local integer i = GetUnitTypeId(u)
//---------------------------
if HaveSavedReal( udg_KB3D_HA, 16, i) then
return LoadReal(udg_KB3D_HA, 16, i)
endif
//---------------------------
return KB3D_RegisterUnitCollision(u, GetUnitX(u), GetUnitY(u), i)
endfunction
function KB3D_Tree_Check takes destructable D returns boolean
return IssueTargetOrderById( udg_KB3D_Harvester, 852018, D ) and IssueImmediateOrderById(udg_KB3D_Harvester, 851972)
endfunction
function KB3D_KillEnumDest takes nothing returns nothing
local destructable D = GetEnumDestructable()
//---------------------------
if GetDestructableLife(D)>0 and ( KB3D_Tree_Check(D) ) and (GetUnitFlyHeight(LoadUnitHandle(udg_KB3D_HA, 0, R2I(udg_KB3D_Reals[0]))) < GetDestructableOccluderHeight(D)) and LoadBoolean(udg_KB3D_HA, 8, R2I(udg_KB3D_Reals[0])) then
call KillDestructable(D)
elseif not(KB3D_CW(GetDestructableX(D),GetDestructableY(D))) and GetDestructableLife(D)>0 and IssueImmediateOrderById(udg_KB3D_Harvester, 851972) and LoadBoolean(udg_KB3D_HA, 56, R2I(udg_KB3D_Reals[0])) then
call KillDestructable(D)
endif
set D = null
endfunction
function KB3D_CircleTreeKill takes real radius, real x, real y returns nothing
local rect r = Rect(x-radius, y-radius, x+radius, y+radius)
//---------------------------
call EnumDestructablesInRect(r, null, function KB3D_KillEnumDest)
//---------------------------
call RemoveRect(r)
set r = null
endfunction
function KB3D_BounceOnUnit takes unit u, unit U, integer Loop returns nothing
set udg_KB3D_Angle = (Atan2(GetUnitY(u) - GetUnitY(U), GetUnitX(u) - GetUnitX(U)) *57.29578) + GetRandomReal(-15,15)
set udg_KB3D_Speed = LoadReal(udg_KB3D_HA, 2, Loop)/.03125*.25*udg_KB3D_Bounce_Power
set udg_KB3D_DestroyTree = LoadBoolean(udg_KB3D_HA, 8, Loop)
set udg_KB3D_Fx = LoadStr(udg_KB3D_HA, 9, Loop)
set udg_KB3D_Attach = LoadStr(udg_KB3D_HA, 10, Loop)
set udg_KB3D_Range = 1.5*udg_KB3D_Speed*udg_KB3D_Bounce_Power
set udg_KB3D_Unit = u
set udg_KB3D_Bounce_Fx = LoadStr(udg_KB3D_HA, 62, Loop)
set udg_KB3D_Accel = -udg_KB3D_Speed*.6
set udg_KB3D_Bounce_Unit = true
call TriggerEvaluate(udg_KB3D_Registration)
call SaveEffectHandle(udg_KB3D_HA, 14, udg_KB3D_Counter, LoadEffectHandle(udg_KB3D_HA, 14, Loop))
endfunction
function KB3D_Bounce_Filter takes nothing returns boolean
local boolean b = not(IsUnitInGroup(GetFilterUnit(), LoadGroupHandle(udg_KB3D_HA, 68, R2I(udg_KB3D_Reals[0])))) or KB3D_Filter(LoadUnitHandle(udg_KB3D_HA, 0, R2I(udg_KB3D_Reals[0])),LoadUnitHandle(udg_KB3D_HA, 0, R2I(udg_KB3D_Reals[0])),R2I(udg_KB3D_Reals[0]))
if b then
call GroupAddUnit(LoadGroupHandle(udg_KB3D_HA, 68, R2I(udg_KB3D_Reals[0])), GetFilterUnit())
endif
return b
endfunction
function KB3D_FilterGrp takes nothing returns boolean
return KB3D_Filter(GetFilterUnit(), LoadUnitHandle(udg_KB3D_HA, 0, R2I(udg_KB3D_Reals[0])),R2I(udg_KB3D_Reals[0]))
endfunction
function KB3D_ClearInstance takes integer i returns nothing
local integer x = 0
//---------------------------
call DestroyGroup(LoadGroupHandle(udg_KB3D_HA, 27, i))
call DestroyGroup(LoadGroupHandle(udg_KB3D_HA, 67, i))
//---------------------------
loop
exitwhen x > 100
call RemoveSavedHandle(udg_KB3D_HA, x, i)
call SaveReal(udg_KB3D_HA, x, i, 0)
set x = x +1
endloop
endfunction
function KB3D_isPossiblePathability takes real x, real y, real RADangle, real MaxDist returns boolean
local real X = x
local real Y = y
local real max = RAbsBJ(MaxDist)
local real dist = max
//---------------------------
loop
exitwhen (dist <= 0)
set dist = dist - max/300
set X = x + ( dist * Cos(RADangle) )
set Y = y + ( dist * Sin(RADangle) )
if KB3D_CW(X,Y) then
return true
endif
endloop
//---------------------------
return false
endfunction
function MoveUnit_3D takes unit U, real x, real y, real z, real MaxZ, boolean P, boolean OS, boolean KiOS, real Angle, real S, real time, integer Loop returns boolean
local boolean B = false
local boolean b = true
local real tz
// This is a creepy place for those who doesn't anylize the system wisely
if LoadBoolean(udg_KB3D_HA, 57, Loop) then
if LoadBoolean(udg_KB3D_HA, 44, Loop) then
set tz = KB3D_GetCoordinatesZ(x,y) - LoadReal(udg_KB3D_HA, 68, Loop)
set z = z - tz
call SaveReal(udg_KB3D_HA, 68, Loop, KB3D_GetCoordinatesZ(x,y))
if LoadReal(udg_KB3D_HA, 3, Loop)<0 and GetUnitDefaultFlyHeight(U)<z then
call SetUnitFlyHeight(U, KB3D_InBetween(-999,z,GetUnitDefaultFlyHeight(U)), 0)
else
call SetUnitFlyHeight(U, z, 0)
endif
else
call SetUnitFlyHeight(U, KB3D_InBetween(GetUnitDefaultFlyHeight(U), z, 9999), 0)
endif
endif
//---------------------------
if ( not(P) or ( KB3D_CW(x, y) ) ) then
set B = true
if (OS) then
call SetUnitX(U, KB3D_InBetween(udg_KB3D_Reals[6], x, udg_KB3D_Reals[5]))
call SetUnitY(U, KB3D_InBetween(udg_KB3D_Reals[8], y, udg_KB3D_Reals[7]))
set b = false
if (KiOS) and (not(KB3D_IsInBetween(udg_KB3D_Reals[2], x, udg_KB3D_Reals[1])) or not(KB3D_IsInBetween(udg_KB3D_Reals[4], x, udg_KB3D_Reals[3]))) then
call KillUnit(U)
endif
else
call SetUnitX(U, KB3D_InBetween(udg_KB3D_Reals[2], x, udg_KB3D_Reals[1]))
call SetUnitY(U, KB3D_InBetween(udg_KB3D_Reals[4], y, udg_KB3D_Reals[3]))
set b = false
endif
elseif LoadBoolean(udg_KB3D_HA, 52, Loop) and P and not(KB3D_CW(x, y)) then
if GetUnitFlyHeight(U) != 0 then
if KB3D_isPossiblePathability(GetUnitX(U),GetUnitY(U), Angle, S*time/0.03125) and LoadBoolean(udg_KB3D_HA, 44, Loop) then
set B = true
call SaveBoolean(udg_KB3D_HA, 53, Loop, true)
if (OS) then
call SetUnitX(U, KB3D_InBetween(udg_KB3D_Reals[6], x, udg_KB3D_Reals[5]))
call SetUnitY(U, KB3D_InBetween(udg_KB3D_Reals[8], y, udg_KB3D_Reals[7]))
set b = false
if (KiOS) and (not(KB3D_IsInBetween(udg_KB3D_Reals[2], x, udg_KB3D_Reals[1])) or not(KB3D_IsInBetween(udg_KB3D_Reals[4], x, udg_KB3D_Reals[3]))) then
call KillUnit(U)
endif
else
call SetUnitX(U, KB3D_InBetween(udg_KB3D_Reals[2], x, udg_KB3D_Reals[1]))
call SetUnitY(U, KB3D_InBetween(udg_KB3D_Reals[4], y, udg_KB3D_Reals[3]))
set b = false
endif
else
call SaveBoolean(udg_KB3D_HA, 52, Loop, false)
endif
endif
endif
if b then
set udg_KB3D_B = true
if LoadBoolean(udg_KB3D_HA, 66, Loop) then
return true
endif
endif
return false
endfunction
function KB3D_LineDamageLoop takes unit U, group g returns nothing
local integer Loop = R2I(udg_KB3D_Reals[0])
local unit Damager = LoadUnitHandle(udg_KB3D_HA, 22, Loop)
local attacktype AType = ConvertAttackType(LoadInteger(udg_KB3D_HA, 20, Loop))
local damagetype DType = ConvertDamageType(LoadInteger(udg_KB3D_HA, 21, Loop))
local real LineD = LoadReal(udg_KB3D_HA, 28, Loop)
local unit U1 = LoadUnitHandle(udg_KB3D_HA, 0, Loop)
local group G = LoadGroupHandle(udg_KB3D_HA, 27, Loop)
//---------------------------
if KB3D_Filter(U, U1, Loop) and not ( IsUnitInGroup(U, G) ) then
call GroupAddUnit(G, U)
if not(LoadBoolean(udg_KB3D_HA, 44, Loop)) then
call UnitDamageTarget(Damager, U, LineD, true, false, AType, DType, null)
call DestroyEffect(AddSpecialEffectTarget(LoadStr(udg_KB3D_HA, 58, Loop), U, LoadStr(udg_KB3D_HA, 10, Loop)))
elseif KB3D_Approx(U, U1, Loop) then
call UnitDamageTarget(Damager, U, LineD, true, false, AType, DType, null)
call DestroyEffect(AddSpecialEffectTarget(LoadStr(udg_KB3D_HA, 58, Loop), U, LoadStr(udg_KB3D_HA, 10, Loop)))
endif
endif
//---------------------------
set G = null
set U1 = null
set Damager = null
set AType = null
set DType = null
endfunction
function KB3D_AoEDamageLoop takes unit U, group g returns nothing
local integer Loop = R2I(udg_KB3D_Reals[0])
local unit Damager = LoadUnitHandle(udg_KB3D_HA, 22, Loop)
local attacktype AType = ConvertAttackType(LoadInteger(udg_KB3D_HA, 20, Loop))
local damagetype DType = ConvertDamageType(LoadInteger(udg_KB3D_HA, 21, Loop))
local real AoED = LoadReal(udg_KB3D_HA, 32, Loop)
local unit U1 = LoadUnitHandle(udg_KB3D_HA, 0, Loop)
//---------------------------
if KB3D_Filter(U, U1, Loop) then
if not(LoadBoolean(udg_KB3D_HA, 44, Loop)) then
call UnitDamageTarget(Damager, U, AoED * 0.031250000, true, false, AType, DType, null)
elseif KB3D_Approx(U, U1, Loop) then
call UnitDamageTarget(Damager, U, AoED * 0.031250000, true, false, AType, DType, null)
endif
endif
//---------------------------
set U1 = null
set Damager = null
set AType = null
set DType = null
endfunction
function KB3D_AoEEndDamage takes unit U, group g returns nothing
local integer Loop = R2I(udg_KB3D_Reals[0])
local unit Damager = LoadUnitHandle(udg_KB3D_HA, 22, Loop)
local attacktype AType = ConvertAttackType(LoadInteger(udg_KB3D_HA, 20, Loop))
local damagetype DType = ConvertDamageType(LoadInteger(udg_KB3D_HA, 21, Loop))
local real D = LoadReal(udg_KB3D_HA, 38, Loop)
local unit U1 = LoadUnitHandle(udg_KB3D_HA, 0, Loop)
//---------------------------
if KB3D_Filter(U, U1, Loop) then
if not(LoadBoolean(udg_KB3D_HA, 44, Loop)) then
call UnitDamageTarget(Damager, U, D, true, false, AType, DType, null)
elseif KB3D_Approx(U, U1, Loop) then
call UnitDamageTarget(Damager, U, D, true, false, AType, DType, null)
endif
endif
//---------------------------
call GroupRemoveUnit(g, U)
//---------------------------
set U1 = null
set Damager = null
set AType = null
set DType = null
endfunction
function KB3D_GiveKBto takes unit U1, unit U2, integer Loop returns nothing
set udg_KB3D_AoEEndDamage = LoadReal(udg_KB3D_HA, 38, Loop)
set udg_KB3D_EndwhenDead = LoadBoolean(udg_KB3D_HA, 35, Loop)
set udg_KB3D_Speed = LoadReal(udg_KB3D_HA, 2, Loop)/0.031250000*.5
set udg_KB3D_Accel = -udg_KB3D_Speed
set udg_KB3D_AllowOutSiding = LoadBoolean(udg_KB3D_HA, 34, Loop)
set udg_KB3D_Angle = (LoadReal(udg_KB3D_HA, 5, Loop)*180/3.14159)
set udg_KB3D_AoE = LoadReal(udg_KB3D_HA, 29, Loop)
set udg_KB3D_AoEDamage = LoadReal(udg_KB3D_HA, 32, Loop)
set udg_KB3D_AttackType = ConvertAttackType(LoadInteger(udg_KB3D_HA, 20, Loop))
set udg_KB3D_DamageType = ConvertDamageType(LoadInteger(udg_KB3D_HA, 21, Loop))
set udg_KB3D_Damager = LoadUnitHandle(udg_KB3D_HA, 22, Loop)
set udg_KB3D_DestroyTree = LoadBoolean(udg_KB3D_HA, 8, Loop)
set udg_KB3D_DisableUnit = LoadBoolean(udg_KB3D_HA, 6, Loop)
set udg_KB3D_FaceAngle = LoadBoolean(udg_KB3D_HA, 31, Loop)
set udg_KB3D_Fx = LoadStr(udg_KB3D_HA, 9, Loop)
set udg_KB3D_Attach = LoadStr(udg_KB3D_HA, 10, Loop)
set udg_KB3D_ImpactDamage = LoadReal(udg_KB3D_HA, 17, Loop)
set udg_KB3D_LineDamage = LoadReal(udg_KB3D_HA, 28, Loop)
set udg_KB3D_LoopDamage = LoadReal(udg_KB3D_HA, 18, Loop)/0.031250000
set udg_KB3D_Range = 99999
set udg_KB3D_Unit = U1
if LoadBoolean(udg_KB3D_HA, 57, Loop) then
set udg_KB3D_Zoffset = LoadReal(udg_KB3D_HA, 3, Loop)/1.85 - GetUnitDefaultFlyHeight(U2)
endif
//---------------------------
call TriggerEvaluate( udg_KB3D_Registration )
endfunction
function KB3D_AoEGiveKBto takes unit U1, unit U2, integer Loop returns nothing
local real x1 = GetUnitX(U1)
local real y1 = GetUnitY(U1)
local real x2 = GetUnitX(U2)
local real y2 = GetUnitY(U2)
local real P = LoadReal(udg_KB3D_HA, 43, Loop)
//---------------------------
set udg_KB3D_AoE = LoadReal(udg_KB3D_HA, 29, Loop)
set udg_KB3D_EndwhenDead = LoadBoolean(udg_KB3D_HA, 35, Loop)
set udg_KB3D_Accel = -550*P
set udg_KB3D_AllowOutSiding = LoadBoolean(udg_KB3D_HA, 34, Loop)
set udg_KB3D_Angle = Atan2(y1 - y2, x1 - x2)*180/3.14159
set udg_KB3D_AoEDamage = LoadReal(udg_KB3D_HA, 32, Loop)
set udg_KB3D_AttackType = ConvertAttackType(LoadInteger(udg_KB3D_HA, 20, Loop))
set udg_KB3D_DamageType = ConvertDamageType(LoadInteger(udg_KB3D_HA, 21, Loop))
set udg_KB3D_Damager = LoadUnitHandle(udg_KB3D_HA, 22, Loop)
set udg_KB3D_DestroyTree = LoadBoolean(udg_KB3D_HA, 8, Loop)
set udg_KB3D_DisableUnit = LoadBoolean(udg_KB3D_HA, 6, Loop)
set udg_KB3D_FaceAngle = LoadBoolean(udg_KB3D_HA, 31, Loop)
set udg_KB3D_Fx = LoadStr(udg_KB3D_HA, 9, Loop)
set udg_KB3D_Attach = LoadStr(udg_KB3D_HA, 10, Loop)
set udg_KB3D_ImpactDamage = LoadReal(udg_KB3D_HA, 17, Loop)
set udg_KB3D_LineDamage = LoadReal(udg_KB3D_HA, 28, Loop)
set udg_KB3D_LoopDamage = LoadReal(udg_KB3D_HA, 18, Loop)/0.031250000
set udg_KB3D_Speed = udg_KB3D_AoE*2*P
set udg_KB3D_Range = udg_KB3D_Speed*2
set udg_KB3D_Unit = U1
if LoadBoolean(udg_KB3D_HA, 57, Loop) then
set udg_KB3D_Zoffset = (udg_KB3D_AoE - SquareRoot(x2 * x1 + y2 * y1)*3.14159/180)*P
endif
//---------------------------
call TriggerEvaluate( udg_KB3D_Registration )
endfunction
function KB3D_AoEKB takes unit U, group g returns nothing
local integer Loop = R2I(udg_KB3D_Reals[0])
local unit U1 = LoadUnitHandle(udg_KB3D_HA, 0, Loop)
local real r
//---------------------------
if KB3D_Filter(U, U1, Loop) then
if not(LoadBoolean(udg_KB3D_HA, 44, Loop)) then
call KB3D_AoEGiveKBto(U, U1, Loop)
elseif KB3D_Approx(U, U1, Loop) then
call KB3D_AoEGiveKBto(U, U1, Loop)
endif
endif
//---------------------------
call GroupRemoveUnit(g, U)
//---------------------------
set U1 = null
endfunction
function KB3D_AoEEndFx takes unit U, string A, string F, group g returns nothing
local integer Loop = R2I(udg_KB3D_Reals[0])
local unit U1 = LoadUnitHandle(udg_KB3D_HA, 0, Loop)
local real x
local real y
//---------------------------
if KB3D_Filter(U, U1, Loop) and (U != null) then
if not(LoadBoolean(udg_KB3D_HA, 44, Loop)) then
if ( GetUnitFlyHeight(U) > 20 ) then
call DestroyEffect(AddSpecialEffectTarget(F, U, A))
else
set x = GetUnitX(U)
set y = GetUnitY(U)
call DestroyEffect(AddSpecialEffect(F, x, y))
endif
elseif KB3D_Approx(U, U1, Loop) then
if ( GetUnitFlyHeight(U) > 20 ) then
call DestroyEffect(AddSpecialEffectTarget(F, U, A))
else
set x = GetUnitX(U)
set y = GetUnitY(U)
call DestroyEffect(AddSpecialEffect(F, x, y))
endif
endif
endif
//---------------------------
call GroupRemoveUnit(g, U)
//---------------------------
set U1 = null
endfunction
function KB3D_Grpto takes nothing returns nothing
call GroupAddUnit(udg_KB3D_g, GetEnumUnit())
endfunction
function KB3D_Loop takes integer Loop returns nothing
//Create all the nessesary locals
local unit U = LoadUnitHandle(udg_KB3D_HA, 0, Loop)
local real X = GetUnitX(U)
local real Y = GetUnitY(U)
local real Z = GetUnitFlyHeight(U)
local real x = X
local real y = Y
local real z = Z
local real Range = LoadReal(udg_KB3D_HA, 1, Loop)
local real Speed = LoadReal(udg_KB3D_HA, 2, Loop)
local real Zoffset = LoadReal(udg_KB3D_HA, 3, Loop)
local real Accel = LoadReal(udg_KB3D_HA, 4, Loop)
local real Angle
local real ZSpeed = LoadReal(udg_KB3D_HA, 12, Loop)
local real ZAccel = LoadReal(udg_KB3D_HA, 13, Loop)
local real ImpactD = LoadReal(udg_KB3D_HA, 17, Loop)
local real LoopD = LoadReal(udg_KB3D_HA, 18, Loop)
local real TargetD = LoadReal(udg_KB3D_HA, 19, Loop)
local real LineD = LoadReal(udg_KB3D_HA, 28, Loop)
local real AoE = LoadReal(udg_KB3D_HA, 29, Loop)
local real ZT = LoadReal(udg_KB3D_HA, 26, Loop)
local real AoED = LoadReal(udg_KB3D_HA, 32, Loop)
local real Time = LoadReal(udg_KB3D_HA, 41, Loop) + 0.031250000
local real KillatTime = LoadReal(udg_KB3D_HA, 36, Loop)
local real StopTime = LoadReal(udg_KB3D_HA, 37, Loop)
local real AoEEndDamage = LoadReal(udg_KB3D_HA, 38, Loop)
local unit Target = LoadUnitHandle(udg_KB3D_HA, 5, Loop)
local unit Damager = LoadUnitHandle(udg_KB3D_HA, 22, Loop)
local unit u
local boolean DisableUnit = LoadBoolean(udg_KB3D_HA, 6, Loop)
local boolean UnpathableStop = LoadBoolean(udg_KB3D_HA, 7, Loop)
local boolean DestroyTree = LoadBoolean(udg_KB3D_HA, 8, Loop)
local boolean KillWhenHit = LoadBoolean(udg_KB3D_HA, 24, Loop)
local boolean EndWhenHit = LoadBoolean(udg_KB3D_HA, 25, Loop)
local boolean KiOS = LoadBoolean(udg_KB3D_HA, 33, Loop)
local boolean OS = LoadBoolean(udg_KB3D_HA, 34, Loop)
local boolean b = true
local boolean EndwhenDead = LoadBoolean(udg_KB3D_HA, 35, Loop)
local boolean KBTarget = LoadBoolean(udg_KB3D_HA, 39, Loop)
local boolean AoEKB = LoadBoolean(udg_KB3D_HA, 40, Loop)
local boolean KillatEnd = LoadBoolean(udg_KB3D_HA, 46, Loop)
local boolean GroundDamage = LoadBoolean(udg_KB3D_HA, 47, Loop)
local boolean EndB = false
local boolean EndOnObstacle = false
local string Fx = LoadStr(udg_KB3D_HA, 9, Loop)
local string Attach = LoadStr(udg_KB3D_HA, 10, Loop)
local string EndFx = LoadStr(udg_KB3D_HA, 42, Loop)
local string AoEEndFx = LoadStr(udg_KB3D_HA, 54, Loop)
local attacktype AType = ConvertAttackType(LoadInteger(udg_KB3D_HA, 20, Loop))
local damagetype DType = ConvertDamageType(LoadInteger(udg_KB3D_HA, 21, Loop))
local trigger EndT = LoadTriggerHandle(udg_KB3D_HA, 55, Loop)
//end of locals
//Loop Damage Execution
if LoopD != 0 and Damager != null then
call UnitDamageTarget(Damager, U, LoopD, true, false, AType, DType, null)
endif
//Calculate the Angle
if ( Target == null ) then
set Angle = LoadReal(udg_KB3D_HA, 5, Loop) + LoadReal(udg_KB3D_HA, 30, Loop)//if there is no unit target
else
set Angle = Atan2(GetUnitY(Target) - Y, GetUnitX(Target) - X)//if there is a unit target
endif
//
if LoadBoolean(udg_KB3D_HA, 16, Loop) then
set Angle = GetUnitFacing(U)*0.0174533
if LoadBoolean(udg_KB3D_HA, 44, Loop) then
if GetUnitCurrentOrder(U) != 851986 and GetUnitCurrentOrder(U) != 851971 then
set b = false
endif
else
set b = false
endif
endif
//Make Unit Face Angle
if LoadBoolean(udg_KB3D_HA, 31, Loop) then
call SetUnitFacing(U, Angle * 3.141592)
endif
//Calculate 3D coordinates
if b then
set Speed = Speed + ( Accel )//Increase the KB speed depending on the Acceleration
set Range = Range - ( RAbsBJ(Speed) )//Decrease distance traveled
set x = X + ( Speed * Cos(Angle) )//new X location of the KBed unit
set y = Y + ( Speed * Sin(Angle) )//new Y location of the KBed unit
set ZSpeed = ZSpeed + ( ZAccel )//change the fly changing rate //Acceleration is for smoothness
set z = Z + ( ZSpeed * 0.031250000 )//new Z Offset of the KBed unit
set ZT = ZT + ( ZSpeed * 0.031250000 )//Total Height Changings
endif
set b = false
if z >= Zoffset then
call SaveReal(udg_KB3D_HA, 12, Loop, -ZSpeed)
endif
//Destroy Trees around the Unit depending on the unit's Collision Size
if (DestroyTree) or (LoadBoolean(udg_KB3D_HA, 56, Loop)) then
set udg_KB3D_Reals[0] = I2R(Loop)
call KB3D_CircleTreeKill( KB3D_InBetween(150, 4.5 * KB3D_GetUnitCollision(U), 500), x, y )
endif
//Move the unit according to the X, Y, Z
set EndOnObstacle = MoveUnit_3D(U, x, y, z, Zoffset, UnpathableStop, OS, KiOS, Angle, Speed, LoadReal(udg_KB3D_HA, 11, Loop)-Time, Loop)
//Bounce on Point
if udg_KB3D_B and LoadBoolean(udg_KB3D_HA, 60, Loop) then
set udg_KB3D_B = false
set Speed=Speed*.85
set Angle=Angle+Deg2Rad(GetRandomReal(-15,15)+180)
call DestroyEffect(AddSpecialEffect(LoadStr(udg_KB3D_HA, 62, Loop), GetUnitX(U), GetUnitY(U)))
endif
//Create the Effect on the unit
if (Fx != "") then
if ( z > 20 ) then
if (Attach != "") then
call DestroyEffect(AddSpecialEffectTarget(Fx, U, Attach))//attach the effect on the unit if he is flying
endif
else
call DestroyEffect(AddSpecialEffect(Fx, x, y))//create the effect on his location if he is not flying
endif
endif
//Initiate Impact Damage
if ( (UnpathableStop) and not ( KB3D_CW(x, y) ) ) and ( (ImpactD != 0) and (Damager != null ) ) then//if the terrain is unpathable or if unpathable stop is disabled then..
if ( KB3D_CW(x, y) ) then
call SaveBoolean(udg_KB3D_HA, 23, Loop, true)
endif
if ( LoadBoolean(udg_KB3D_HA, 23, Loop) ) then
call UnitDamageTarget(Damager, U, ImpactD, true, false, AType, DType, null)//Apply Impact Damage to the unit
call SaveBoolean(udg_KB3D_HA, 23, Loop, false)
endif
endif
//Create AoE Grp
if (AoE != 0) and ((LineD != 0) or (AoED != 0) or LoadBoolean(udg_KB3D_HA, 61, Loop) or LoadBoolean(udg_KB3D_HA, 60, Loop)) then
set udg_KB3D_g = CreateGroup()
set udg_KB3D_Reals[0] = I2R(Loop)
call GroupEnumUnitsInRange(udg_KB3D_g, x, y, RAbsBJ(AoE), Filter(function KB3D_FilterGrp))
//----------------------------------
loop
set u = FirstOfGroup(udg_KB3D_g)
exitwhen (u == null)
if (Damager != null) then
if (LineD != 0) then
call KB3D_LineDamageLoop(u, udg_KB3D_g)
endif
if (AoED != 0) then
call KB3D_AoEDamageLoop(u, udg_KB3D_g)
endif
endif
if not IsUnitInGroup(u, LoadGroupHandle(udg_KB3D_HA, 67, Loop)) and 125>SquareRoot((GetUnitX(u) - GetUnitX(U)) * (GetUnitX(u) - GetUnitX(U)) + (GetUnitY(u) - GetUnitY(U)) * (GetUnitY(u) - GetUnitY(U))) then
if LoadBoolean(udg_KB3D_HA, 61, Loop) then
call KB3D_BounceOnUnit(u, U, Loop)
call GroupAddUnit(LoadGroupHandle(udg_KB3D_HA, 67, Loop),u)
call DestroyEffect(AddSpecialEffect(LoadStr(udg_KB3D_HA, 62, Loop), GetUnitX(u), GetUnitY(u)))
set b = LoadBoolean(udg_KB3D_HA, 70, Loop)
endif
if LoadBoolean(udg_KB3D_HA, 60, Loop) then
set Angle = (Atan2(GetUnitY(u) - GetUnitY(U), GetUnitX(u) - GetUnitX(U))) + Deg2Rad(GetRandomReal(-15,15) + 180)
set Speed = Speed*.85
call DestroyEffect(AddSpecialEffect(LoadStr(udg_KB3D_HA, 62, Loop), GetUnitX(U), GetUnitY(U)))
endif
endif
call GroupRemoveUnit(udg_KB3D_g,u)
endloop
//----------------------------------
call DestroyGroup(udg_KB3D_g)
set udg_KB3D_g = null
endif
//Disable the unit partially
if ( DisableUnit ) then
call SetUnitPropWindow(U, 0)
call SetUnitTurnSpeed(U, 0)
endif
//Initiate Target-Related Actions
if (Target != null) then
if (SquareRoot ( ( GetUnitX(Target) - x ) * ( GetUnitX(Target) - x ) + ( GetUnitY(Target) - y ) * ( GetUnitY(Target) - y ) ) < Speed+2) then//when the target and the unit are close
if not (TargetD == 0) and not(Damager == null) then//Damage the Target
call UnitDamageTarget(Damager, Target, TargetD, true, false, AType, DType, null)
call SaveReal(udg_KB3D_HA, 19, Loop, 0)
endif
if KBTarget then//KB the Target
call KB3D_GiveKBto(Target, U, Loop)
call SaveBoolean( udg_KB3D_HA, 39, udg_KB3D_Counter, false )
endif
if (KillWhenHit) then//Kill the Unit
call KillUnit(U)
endif
if (EndWhenHit) then//End the KB
call SaveReal(udg_KB3D_HA, 4, Loop, KB3D_AlwaysNeg(Speed))
call SaveReal(udg_KB3D_HA, 3, Loop, GetUnitFlyHeight(U) - ZT)
endif
endif
endif
//Kill the Unit at the time
if (KillatTime != 0) and ( Time > KillatTime ) then
call KillUnit(U)
endif
//Save Changes in the Hashtable
call SaveReal(udg_KB3D_HA, 1, Loop, Range)
call SaveReal(udg_KB3D_HA, 2, Loop, Speed)
call SaveReal(udg_KB3D_HA, 5, Loop, Angle)
call SaveReal(udg_KB3D_HA, 12, Loop, ZSpeed)
call SaveReal(udg_KB3D_HA, 26, Loop, ZT)
call SaveReal(udg_KB3D_HA, 41, Loop, Time)
//Inititate End of the KB
if ( b or (LoadBoolean(udg_KB3D_HA, 45, Loop) and (Speed <= 2.34)) or ( Range <= 0 ) or ( (StopTime != 0) and ( Time > StopTime ) ) or EndOnObstacle ) then
call SaveBoolean(udg_KB3D_HA, 100, Loop, false)
set udg_KB3D_Instances = udg_KB3D_Instances - 1
if IsUnitType(U, UNIT_TYPE_DEAD) then
call SetUnitFlyHeight(U, GetUnitDefaultFlyHeight(U), 750 )
endif
call SetUnitPropWindow(U, LoadReal(udg_KB3D_HA, 15, Loop)*3.14159/180)
call SetUnitTurnSpeed(U, GetUnitDefaultTurnSpeed(U))
if HaveSavedHandle(udg_KB3D_HA, 14, Loop) and not EndB then
call DestroyEffect(LoadEffectHandle(udg_KB3D_HA, 14, Loop))
endif
set b = true
elseif IsUnitType(U, UNIT_TYPE_DEAD) and (EndwhenDead) then
call SaveBoolean(udg_KB3D_HA, 100, Loop, false)
set udg_KB3D_Instances = udg_KB3D_Instances - 1
if IsUnitType(U, UNIT_TYPE_DEAD) then
call SetUnitFlyHeight(U, GetUnitDefaultFlyHeight(U), 750 )
endif
call SetUnitPropWindow(U, LoadReal(udg_KB3D_HA, 15, Loop)*3.14159/180)
call SetUnitTurnSpeed(U, GetUnitDefaultTurnSpeed(U))
if HaveSavedHandle(udg_KB3D_HA, 14, Loop) and not EndB then
call DestroyEffect(LoadEffectHandle(udg_KB3D_HA, 14, Loop))
endif
set b = true
endif
//variable b refers to if the KB has ended
if b then
call SetUnitFlyHeight(U, GetUnitFlyHeight(U)-KB3D_InBetween(0,ZT-LoadReal(udg_KB3D_HA, 71, Loop),999), 500)
if LoadBoolean(udg_KB3D_HA, 44, Loop) then
call SetUnitFlyHeight(U, GetUnitFlyHeight(U)-KB3D_InBetween(0,(LoadReal(udg_KB3D_HA, 69, Loop)-KB3D_GetCoordinatesZ(x,y)),9999), RAbsBJ(ZSpeed))
endif
//----------
call SaveInteger(udg_KB3D_HA, -5, GetHandleId(U), LoadInteger(udg_KB3D_HA, -5, GetHandleId(U))-1)
if LoadInteger(udg_KB3D_HA, -5, GetHandleId(udg_KB3D_Unit)) == 0 then
call SaveBoolean(udg_KB3D_HA, GetHandleId(U), GetHandleId(U), false)
endif
//----------
if (AoEEndDamage != 0) and (Damager != null) and (AoE != 0) then
set udg_KB3D_g = CreateGroup()
set udg_KB3D_Reals[0] = I2R(Loop)
call GroupEnumUnitsInRange(udg_KB3D_g, x, y, RAbsBJ(AoE), null)
loop
set u = FirstOfGroup(udg_KB3D_g)
call KB3D_AoEEndDamage(u, udg_KB3D_g)
exitwhen (u == null)
endloop
call DestroyGroup(udg_KB3D_g)
set udg_KB3D_g = null
endif
//----------
if (AoEKB) and (AoE != 0) then
set udg_KB3D_g = CreateGroup()
set udg_KB3D_Reals[0] = I2R(Loop)
call GroupEnumUnitsInRange(udg_KB3D_g, x, y, RAbsBJ(AoE), null)
loop
set u = FirstOfGroup(udg_KB3D_g)
call KB3D_AoEKB(u, udg_KB3D_g)
exitwhen (u == null)
endloop
call DestroyGroup(udg_KB3D_g)
set udg_KB3D_g = null
endif
//----------
if (EndFx != "") then
if ( z > 20 ) and (Attach != "") then
call DestroyEffect(AddSpecialEffectTarget(EndFx, U, Attach))//attach the effect on the unit if he is flying
else
call DestroyEffect(AddSpecialEffect(EndFx, x, y))//create the effect on his location if he is not flying
endif
endif
//----------
if (AoEEndFx != "") and (Attach != "") and (AoE > 0) then
set udg_KB3D_g = CreateGroup()
set udg_KB3D_Reals[0] = I2R(Loop)
call GroupEnumUnitsInRange(udg_KB3D_g, x, y, RAbsBJ(AoE), null)
loop
set u = FirstOfGroup(udg_KB3D_g)
call KB3D_AoEEndFx(u, Attach, AoEEndFx, udg_KB3D_g)
exitwhen (u == null)
endloop
call DestroyGroup(udg_KB3D_g)
set udg_KB3D_g = null
endif
//----------
if (AoEEndFx != "") and (Attach != "") and (AoE > 0) then
set udg_KB3D_g = CreateGroup()
set udg_KB3D_Reals[0] = I2R(Loop)
call GroupEnumUnitsInRange(udg_KB3D_g, x, y, RAbsBJ(AoE), null)
loop
set u = FirstOfGroup(udg_KB3D_g)
call KB3D_AoEEndFx(u, Attach, AoEEndFx, udg_KB3D_g)
exitwhen (u == null)
endloop
call DestroyGroup(udg_KB3D_g)
set udg_KB3D_g = null
endif
//----------
if GroundDamage and (ImpactD != 0) and z < 75 and (Damager != null) then
call UnitDamageTarget(Damager, U, ImpactD, true, false, AType, DType, null)
endif
//----------
if (KillatEnd) and not EndB then
call KillUnit(U)
endif
//----------
if (EndT != null) then
set udg_KB3D_Unit = U
set udg_KB3D_Targeted_Unit = Target
call ConditionalTriggerExecute(EndT)
set udg_KB3D_Unit = null
set udg_KB3D_Targeted_Unit = null
endif
endif
//Function to know if the unit is being KBed by the system
call SaveInteger(udg_KB3D_HA, -2, GetHandleId(udg_KB3D_Unit), LoadInteger(udg_KB3D_HA, -2, GetHandleId(udg_KB3D_Unit))-1)
call SaveBoolean(udg_KB3D_HA, -1, GetHandleId(udg_KB3D_Unit), LoadInteger(udg_KB3D_HA, -2, GetHandleId(udg_KB3D_Unit))!=0)
//Clear Instance
if b then
call KB3D_ClearInstance(Loop)
endif
//Clear locals
set udg_KB3D_B = false
set U = null
set Target = null
set Damager = null
endfunction
function KB3D_Loop_Actions takes nothing returns nothing
local integer x = 0
loop
exitwhen x >= udg_KB3D_Counter
set x = x + 1
if ( LoadBoolean(udg_KB3D_HA, 100, x) ) then
call KB3D_Loop(x)
endif
endloop
if ( udg_KB3D_Instances == 0 ) then
set udg_KB3D_Counter = 0
call PauseTimer(udg_KB3D_Timer)
endif
endfunction
function KB3D_ClearVar takes nothing returns nothing
set udg_KB3D_HomingMissile = false
set udg_KB3D_EndOnTargetBounce = false
set udg_KB3D_Speed_Changer = false
set udg_KB3D_AoEEndFx = ""
set udg_KB3D_D_STRUCTURE = false
set udg_KB3D_D_MECHANICAL = false
set udg_KB3D_D_ALLY = false
set udg_KB3D_D_MAGIC_IMMINUE = false
set udg_KB3D_D_ENEMY = true
set udg_KB3D_D_RESISTANT = false
set udg_KB3D_D_FLYING = false
set udg_KB3D_Accel = 0.00
set udg_KB3D_AllowOutSiding = false
set udg_KB3D_Angle = 0.00
set udg_KB3D_AoE = 0.00
set udg_KB3D_Arc = 0.00
set udg_KB3D_AoEDamage = 0.00
set udg_KB3D_AttackType = ATTACK_TYPE_NORMAL
set udg_KB3D_DamageType = DAMAGE_TYPE_MAGIC
set udg_KB3D_Damager = null
set udg_KB3D_DestroyTree = true
set udg_KB3D_DisableUnit = false
set udg_KB3D_EndWhenHit = false
set udg_KB3D_Fx = ""
set udg_KB3D_Fx_Attach = ""
set udg_KB3D_EndFx = ""
set udg_KB3D_Attach = "origin"
set udg_KB3D_ImpactDamage = 0.00
set udg_KB3D_KillWhenHit = false
set udg_KB3D_FaceAngle = false
set udg_KB3D_KillifOutSider = false
set udg_KB3D_LineDamage = 0.00
set udg_KB3D_LoopDamage = 0.00
set udg_KB3D_Range = 0.00
set udg_KB3D_Speed = 0.00
set udg_KB3D_TargetDamage = 0.00
set udg_KB3D_Targeted_Unit = null
set udg_KB3D_TrailFx = ""
set udg_KB3D_Unit = null
set udg_KB3D_UnpathableStop = true
set udg_KB3D_Zoffset = 0.00
set udg_KB3D_AoEEndDamage = 0.00
set udg_KB3D_AoEKB = false
set udg_KB3D_EndwhenDead = true
set udg_KB3D_KBTarget = false
set udg_KB3D_StopTime = 0.00
set udg_KB3D_KillatTime = 0.00
set udg_KB3D_AoEKB_Power = 1.00
set udg_KB3D_iKB = true
set udg_KB3D_KillatEnd = false
set udg_KB3D_GroundDamage = false
set udg_KB3D_EndTrigger = null
set udg_KB3D_JumpOverCliff = false
set udg_KB3D_DestroyDestructables = false
set udg_KB3D_Line_Fx = ""
set udg_KB3D_Bounce_Target = false
set udg_KB3D_Bounce_Unit = false
set udg_KB3D_Bounce_Power = 1.00
set udg_KB3D_Bounce_Fx = ""
set udg_KB3D_EndOnObstacle = false
endfunction
function KB3D_Registration takes nothing returns boolean
local real Time
local real R
local real R1
local real dx
local real dy
//------------------------
if udg_KB3D_Unit == null then
return false
endif
//------------------------
if udg_KB3D_Fx_Attach != "" then
set udg_KB3D_Fx = udg_KB3D_Fx_Attach
endif
//------------------------
if udg_KB3D_Targeted_Unit != null and udg_KB3D_HomingMissile then
set udg_KB3D_Zoffset = GetUnitFlyHeight(udg_KB3D_Targeted_Unit)
set dx = GetUnitX(udg_KB3D_Unit)-GetUnitX(udg_KB3D_Targeted_Unit)
set dy = GetUnitY(udg_KB3D_Unit)-GetUnitY(udg_KB3D_Targeted_Unit)
if udg_KB3D_Zoffset == 0 then
set udg_KB3D_Zoffset = 100
set udg_KB3D_Range = SquareRoot( dx * dx + dy * dy)*1.25
else
set udg_KB3D_Range = SquareRoot( dx * dx + dy * dy)*2
endif
set udg_KB3D_KillatEnd = true
set udg_KB3D_KillWhenHit = true
set udg_KB3D_EndWhenHit = true
set udg_KB3D_FaceAngle = true
set udg_KB3D_UnpathableStop = false
endif
//------------------------
set udg_KB3D_Arc = KB3D_InBetween(-10, udg_KB3D_Arc, 10)
set udg_KB3D_AoEKB_Power = KB3D_InBetween(0.01, udg_KB3D_AoEKB_Power, 3)
//------------------------
if IsUnitType(udg_KB3D_Unit, UNIT_TYPE_FLYING) then
set udg_KB3D_UnpathableStop = false
endif
//------------------------
if (udg_KB3D_iKB) and udg_KB3D_Range < 0 then
if ( udg_KB3D_Targeted_Unit == null ) then
set udg_KB3D_Angle = udg_KB3D_Angle + 180
else
set udg_KB3D_Speed = -1*(udg_KB3D_Speed)
endif
endif
//------------------------
set udg_KB3D_Range = KB3D_InBetween(0.0000001, RAbsBJ(udg_KB3D_Range), RAbsBJ(udg_KB3D_Range))
//------------------------
if (udg_KB3D_iKB) and udg_KB3D_Speed < 0 then
set udg_KB3D_Speed = KB3D_InBetween(udg_KB3D_Speed, udg_KB3D_Speed, -0.01)
else
set udg_KB3D_Speed = KB3D_InBetween(0.01, RAbsBJ(udg_KB3D_Speed), RAbsBJ(udg_KB3D_Speed))
endif
//------------------------
set udg_KB3D_Counter = udg_KB3D_Counter + 1
set udg_KB3D_Instances = udg_KB3D_Instances + 1
call SaveBoolean(udg_KB3D_HA, -1, GetHandleId(udg_KB3D_Unit), true)
call SaveBoolean(udg_KB3D_HA, 57, udg_KB3D_Counter, (udg_KB3D_Zoffset != 0))
//------------------------
if not udg_KB3D_iKB then
set udg_KB3D_Zoffset = RAbsBJ(udg_KB3D_Zoffset)
elseif GetUnitFlyHeight(udg_KB3D_Unit)+udg_KB3D_Zoffset < 0 then
set udg_KB3D_Zoffset = -GetUnitFlyHeight(udg_KB3D_Unit)
endif
//------------------------
set udg_KB3D_StopTime = RAbsBJ(udg_KB3D_StopTime)
set udg_KB3D_KillatTime = RAbsBJ(udg_KB3D_KillatTime)
set udg_KB3D_AoE = RAbsBJ(udg_KB3D_AoE)
//------------------------
//------------------------
call SaveUnitHandle( udg_KB3D_HA, 0, udg_KB3D_Counter, udg_KB3D_Unit )
call SaveReal( udg_KB3D_HA, 1, udg_KB3D_Counter, udg_KB3D_Range )
call SaveReal( udg_KB3D_HA, 2, udg_KB3D_Counter, udg_KB3D_Speed * 0.031250000 )
call SaveReal( udg_KB3D_HA, 4, udg_KB3D_Counter, udg_KB3D_Accel * 0.031250000 * 0.031250000 )
//------------------------
if ( udg_KB3D_Targeted_Unit == null ) then
call SaveReal( udg_KB3D_HA, 5, udg_KB3D_Counter, udg_KB3D_Angle * 3.14159 / 180 )
else
call SaveUnitHandle( udg_KB3D_HA, 5, udg_KB3D_Counter, udg_KB3D_Targeted_Unit )
set udg_KB3D_JumpOverCliff = false
endif
//------------------------
call SaveBoolean( udg_KB3D_HA, 6, udg_KB3D_Counter, udg_KB3D_DisableUnit )
call SaveBoolean( udg_KB3D_HA, 7, udg_KB3D_Counter, udg_KB3D_UnpathableStop )
call SaveBoolean( udg_KB3D_HA, 8, udg_KB3D_Counter, udg_KB3D_DestroyTree )
call SaveStr( udg_KB3D_HA, 9, udg_KB3D_Counter, udg_KB3D_Fx )
call SaveStr( udg_KB3D_HA, 10, udg_KB3D_Counter, udg_KB3D_Attach )
call SaveBoolean( udg_KB3D_HA, 45, udg_KB3D_Counter, udg_KB3D_Speed>0 )
//------------------------
//------------------------
set udg_KB3D_Speed = KB3D_InBetween(0.01, RAbsBJ(udg_KB3D_Speed), RAbsBJ(udg_KB3D_Speed))
//------------------------
if ( udg_KB3D_Accel == 0.00 ) then
set Time = udg_KB3D_Range / (udg_KB3D_Speed)//calculating time for the knockback if Acceleration = 0
else
if ( udg_KB3D_Accel > 0 ) then
set Time = (-udg_KB3D_Speed-SquareRoot(udg_KB3D_Speed*udg_KB3D_Speed + 2*udg_KB3D_Accel*udg_KB3D_Range))/-udg_KB3D_Accel//calculating time for the knockback if Acceleration > 0*/
endif
if ( udg_KB3D_Accel < 0 ) then
set Time = (-udg_KB3D_Speed+SquareRoot(udg_KB3D_Speed*udg_KB3D_Speed + 2*udg_KB3D_Accel*udg_KB3D_Range))/udg_KB3D_Accel
endif
endif
//------------------------
call SaveReal( udg_KB3D_HA, 11, udg_KB3D_Counter, Time )
call SaveBoolean( udg_KB3D_HA, 100, udg_KB3D_Counter, true )
//------------------------
if UnitAddAbility(udg_KB3D_Unit, 'Amrf') then
call UnitRemoveAbility(udg_KB3D_Unit, 'Amrf')
endif
//------------------------
call SaveReal( udg_KB3D_HA, 3, udg_KB3D_Counter, udg_KB3D_Zoffset )
call SaveReal( udg_KB3D_HA, 12, udg_KB3D_Counter, (2*udg_KB3D_Zoffset / ( Time / 2)) )
call SaveReal( udg_KB3D_HA, 13, udg_KB3D_Counter, ( -2 * udg_KB3D_Zoffset / ( Time / 2) ) / ( Time / 2) * 0.031250000 )
//------------------------
if not (udg_KB3D_TrailFx == "") and not (udg_KB3D_Attach == "") then
call SaveEffectHandle(udg_KB3D_HA, 14, udg_KB3D_Counter, AddSpecialEffectTarget(udg_KB3D_TrailFx, udg_KB3D_Unit, udg_KB3D_Attach))
endif
//------------------------
call SaveReal( udg_KB3D_HA, 15, udg_KB3D_Counter, GetUnitDefaultPropWindow(udg_KB3D_Unit) )
call SaveBoolean(udg_KB3D_HA, 16, udg_KB3D_Counter, udg_KB3D_Speed_Changer)
call SaveReal( udg_KB3D_HA, 17, udg_KB3D_Counter, udg_KB3D_ImpactDamage )
call SaveReal( udg_KB3D_HA, 18, udg_KB3D_Counter, udg_KB3D_LoopDamage * 0.031250000 )
call SaveReal( udg_KB3D_HA, 19, udg_KB3D_Counter, udg_KB3D_TargetDamage )
call SaveInteger( udg_KB3D_HA, 20, udg_KB3D_Counter, GetHandleId(udg_KB3D_AttackType))
call SaveInteger( udg_KB3D_HA, 21, udg_KB3D_Counter, GetHandleId(udg_KB3D_DamageType))
call SaveUnitHandle( udg_KB3D_HA, 22, udg_KB3D_Counter, udg_KB3D_Damager )
call SaveBoolean( udg_KB3D_HA, 23, udg_KB3D_Counter, true )
call SaveBoolean( udg_KB3D_HA, 24, udg_KB3D_Counter, udg_KB3D_KillWhenHit )
call SaveBoolean( udg_KB3D_HA, 25, udg_KB3D_Counter, udg_KB3D_EndWhenHit )
// 26 used
call SaveGroupHandle(udg_KB3D_HA, 27, udg_KB3D_Counter, CreateGroup() )
call SaveReal( udg_KB3D_HA, 28, udg_KB3D_Counter, udg_KB3D_LineDamage )
call SaveReal( udg_KB3D_HA, 29, udg_KB3D_Counter, RAbsBJ(udg_KB3D_AoE) )
call SaveReal( udg_KB3D_HA, 30, udg_KB3D_Counter, udg_KB3D_Arc * (3.14159/180) )
call SaveBoolean( udg_KB3D_HA, 31, udg_KB3D_Counter, udg_KB3D_FaceAngle )
call SaveReal( udg_KB3D_HA, 32, udg_KB3D_Counter, udg_KB3D_AoEDamage )
call SaveBoolean( udg_KB3D_HA, 33, udg_KB3D_Counter, udg_KB3D_KillifOutSider )
//------------------------
set udg_KB3D_AllowOutSiding = udg_KB3D_KillifOutSider
//------------------------
call SaveBoolean( udg_KB3D_HA, 34, udg_KB3D_Counter, udg_KB3D_AllowOutSiding )
//------------------------
set udg_KB3D_EndwhenDead = udg_KB3D_KillatTime > udg_KB3D_StopTime
//------------------------
call SaveBoolean( udg_KB3D_HA, 35, udg_KB3D_Counter, udg_KB3D_EndwhenDead )
call SaveReal( udg_KB3D_HA, 36, udg_KB3D_Counter, udg_KB3D_KillatTime )
call SaveReal( udg_KB3D_HA, 37, udg_KB3D_Counter, udg_KB3D_StopTime )
call SaveReal( udg_KB3D_HA, 38, udg_KB3D_Counter, udg_KB3D_AoEEndDamage )
call SaveBoolean( udg_KB3D_HA, 39, udg_KB3D_Counter, udg_KB3D_KBTarget )
call SaveBoolean( udg_KB3D_HA, 40, udg_KB3D_Counter, udg_KB3D_AoEKB )
//41 used
call SaveStr(udg_KB3D_HA, 42, udg_KB3D_Counter, udg_KB3D_EndFx )
call SaveReal( udg_KB3D_HA, 43, udg_KB3D_Counter, udg_KB3D_AoEKB_Power )
call SaveBoolean( udg_KB3D_HA, 44, udg_KB3D_Counter, udg_KB3D_iKB )
call SaveBoolean( udg_KB3D_HA, 46, udg_KB3D_Counter, udg_KB3D_KillatEnd )
call SaveBoolean( udg_KB3D_HA, 47, udg_KB3D_Counter, udg_KB3D_GroundDamage )
call SaveBoolean( udg_KB3D_HA, 48, udg_KB3D_Counter, udg_KB3D_D_STRUCTURE )
call SaveBoolean( udg_KB3D_HA, 49, udg_KB3D_Counter, udg_KB3D_D_MECHANICAL )
call SaveBoolean( udg_KB3D_HA, 50, udg_KB3D_Counter, udg_KB3D_D_MAGIC_IMMINUE )
call SaveBoolean( udg_KB3D_HA, 51, udg_KB3D_Counter, udg_KB3D_D_ALLY )
call SaveBoolean( udg_KB3D_HA, 52, udg_KB3D_Counter, udg_KB3D_JumpOverCliff )
call SaveBoolean( udg_KB3D_HA, 53, udg_KB3D_Counter, false )
call SaveStr( udg_KB3D_HA, 54, udg_KB3D_Counter, udg_KB3D_AoEEndFx )
call SaveTriggerHandle( udg_KB3D_HA, 55, udg_KB3D_Counter, udg_KB3D_EndTrigger )
call SaveBoolean( udg_KB3D_HA, 56, udg_KB3D_Counter, udg_KB3D_DestroyDestructables )
//57 used
call SaveStr( udg_KB3D_HA, 58, udg_KB3D_Counter, udg_KB3D_Line_Fx )
call SaveReal( udg_KB3D_HA, 59, udg_KB3D_Counter, udg_KB3D_Bounce_Power )
call SaveBoolean( udg_KB3D_HA, 60, udg_KB3D_Counter, udg_KB3D_Bounce_Unit )
call SaveBoolean( udg_KB3D_HA, 61, udg_KB3D_Counter, udg_KB3D_Bounce_Target )
call SaveStr( udg_KB3D_HA, 62, udg_KB3D_Counter, udg_KB3D_Bounce_Fx )
call SaveBoolean( udg_KB3D_HA, 63, udg_KB3D_Counter, udg_KB3D_D_ENEMY )
call SaveBoolean( udg_KB3D_HA, 64, udg_KB3D_Counter, udg_KB3D_D_RESISTANT )
call SaveBoolean( udg_KB3D_HA, 65, udg_KB3D_Counter, udg_KB3D_D_FLYING )
call SaveBoolean( udg_KB3D_HA, 66, udg_KB3D_Counter, udg_KB3D_EndOnObstacle )
//------------------------
if udg_KB3D_Bounce_Target then
call SaveGroupHandle(udg_KB3D_HA, 67, udg_KB3D_Counter, CreateGroup())
endif
//------------------------
call SaveReal( udg_KB3D_HA, 68, udg_KB3D_Counter, KB3D_GetCoordinatesZ(GetUnitX(udg_KB3D_Unit), GetUnitY(udg_KB3D_Unit)) )
call SaveReal( udg_KB3D_HA, 69, udg_KB3D_Counter, KB3D_GetCoordinatesZ(GetUnitX(udg_KB3D_Unit), GetUnitY(udg_KB3D_Unit)) )
call SaveBoolean( udg_KB3D_HA, 70, udg_KB3D_Counter, udg_KB3D_EndOnTargetBounce )
call SaveReal(udg_KB3D_HA, 71, udg_KB3D_Counter, GetUnitFlyHeight(udg_KB3D_Unit))
//------------------------
if ( udg_KB3D_Counter == 1 ) then
call TimerStart(udg_KB3D_Timer, 0.031250000, true, function KB3D_Loop_Actions )
endif
//------------------------
set udg_KB3D_Time = Time
//------------------------
//------------------------
call SaveInteger(udg_KB3D_HA, -5, GetHandleId(udg_KB3D_Unit), LoadInteger(udg_KB3D_HA, -5, GetHandleId(udg_KB3D_Unit))+1)
call SaveBoolean(udg_KB3D_HA, GetHandleId(udg_KB3D_Unit), GetHandleId(udg_KB3D_Unit), true)
//------------------------
//------------------------
//------------------------
call KB3D_ClearVar()
return false
endfunction
//===========================================================================
function InitTrig_KB3D takes nothing returns nothing
////////REGISTRATION
set udg_KB3D_Registration = CreateTrigger( )
call TriggerAddCondition( udg_KB3D_Registration, Condition(function KB3D_Registration) )
set udg_KB3D_Harvester = CreateUnit(Player(15), 'hpea', 0, 0, 0)
call ShowUnit(udg_KB3D_Harvester, false)
call UnitAddAbility(udg_KB3D_Harvester, 'Aloc')
call UnitAddAbility(udg_KB3D_Harvester, 'Ahar')
call UnitRemoveAbility(udg_KB3D_Harvester, 'Amov')
set udg_KB3D_HA = InitHashtable()
////////Check Walkability System by PnF
set udg_CP_Rect = Rect(0, 0, 128.00, 128.00)
set udg_CP_Item = CreateItem('wtlg', 0, 0)
call SetItemVisible( udg_CP_Item, false )
////////InitReals
set udg_KB3D_Reals[1] = GetRectMaxX(bj_mapInitialPlayableArea)
set udg_KB3D_Reals[2] = GetRectMinX(bj_mapInitialPlayableArea)
set udg_KB3D_Reals[3] = GetRectMaxY(bj_mapInitialPlayableArea)
set udg_KB3D_Reals[4] = GetRectMinY(bj_mapInitialPlayableArea)
set udg_KB3D_Reals[5] = GetRectMaxX(GetWorldBounds())
set udg_KB3D_Reals[6] = GetRectMinX(GetWorldBounds())
set udg_KB3D_Reals[7] = GetRectMaxY(GetWorldBounds())
set udg_KB3D_Reals[8] = GetRectMinY(GetWorldBounds())
//Initiate Default Values
call KB3D_ClearVar()
endfunction