//TESH.scrollpos=0
//TESH.alwaysfold=0
Name | Type | is_array | initial_value |
//TESH.scrollpos=0
//TESH.alwaysfold=0
define
HERO_ATRIBUTE_STR = 0
HERO_ATRIBUTE_AGI = 1
HERO_ATRIBUTE_INT = 2
HASH_UNIT_HERO_MAIN_ATTRIBUTE = 4000
HASH_UNIT_REACTIVE_ARMOR_COUNT = 4001
DAMAGE_TYPE_NORMAL_FIRE = 0
DAMAGE_TYPE_HERO_NORMAL = 1
DAMAGE_TYPE_HERO_MAGIC = 2
DAMAGE_TYPE_PIERCE_NORMAL = 3
DAMAGE_TYPE_NORMAL_NORMAL = 4
enddefine
globals
hashtable hash = InitHashtable()
integer sys_integer
integer temp_integer
unit temp_unit
group temp_group
endglobals
function SaveHeroMainAttribute takes integer uTId, integer main_attribute returns nothing
call SaveInteger(hash, uTId, HASH_UNIT_HERO_MAIN_ATTRIBUTE, main_attribute)
endfunction
function PreloadAbility takes integer abId returns nothing
local unit u = CreateUnit(Player(15), 'ushd', 0., 0., 270.)
call UnitAddAbility(u, abId)
call UnitRemoveAbility(u, abId)
call RemoveUnit(u)
set u = null
endfunction
function InitTrig_Init takes nothing returns nothing
call SaveHeroMainAttribute('Hmkg', HERO_ATRIBUTE_STR)
call SaveHeroMainAttribute('Ekee', HERO_ATRIBUTE_INT)
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
define
<AngleBetweenPoints>(x1, y1, x2, y2) = AngleBetweenPointsXY(x1, y1, x2, y2)
<DistanceBetweenPoints>(x1, y1, x2, y2) = DistanceBetweenPointsXY(x1, y1, x2, y2)
IsWidgetAlive(w) = (GetWidgetLife(w)>=.405)
IsWidgetDead(w) = (GetWidgetLife(w)<.405)
enddefine
function AngleBetweenPointsXY takes real x1, real y1, real x2, real y2 returns real
return Atan2(y2-y1, x2-x1)
endfunction
function DistanceBetweenPointsXY takes real x1, real y1, real x2, real y2 returns real
local real dx = x2 - x1
local real dy = y2 - y1
return SquareRoot(dx * dx + dy * dy)
endfunction
function DistanceBetweenUnits takes unit u1, unit u2 returns real
local real dx = GetUnitX(u2) - GetUnitX(u1)
local real dy = GetUnitY(u2) - GetUnitY(u1)
return SquareRoot(dx * dx + dy * dy)
endfunction
function Is_Tree takes destructable d returns boolean
return GetDestructableTypeId(d) == 'ATtr' or GetDestructableTypeId(d) == 1314157687
endfunction
function KillTrees_Enum takes nothing returns nothing
if Is_Tree(GetEnumDestructable()) and IsWidgetAlive(GetEnumDestructable()) then
set sys_integer = sys_integer + 1
call KillDestructable(GetEnumDestructable())
endif
endfunction
function KillTreesInRange takes real x, real y, real d returns integer
local rect rct = Rect(x-d, y-d, x+d, y+d)
set sys_integer = 0
call EnumDestructablesInRect(rct, null, function KillTrees_Enum)
call RemoveRect(rct)
set rct = null
return sys_integer
endfunction
function UnitDamageUnit takes unit u, unit ut, integer damage_type, real damage returns nothing
if damage_type == DAMAGE_TYPE_NORMAL_FIRE then
call UnitDamageTarget(u, ut, damage, true, true, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE, WEAPON_TYPE_WHOKNOWS)
elseif damage_type == DAMAGE_TYPE_HERO_NORMAL then
call UnitDamageTarget(u, ut, damage, true, true, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
elseif damage_type == DAMAGE_TYPE_HERO_MAGIC then
call UnitDamageTarget(u, ut, damage, true, true, ATTACK_TYPE_HERO, DAMAGE_TYPE_MAGIC, WEAPON_TYPE_WHOKNOWS)
elseif damage_type == DAMAGE_TYPE_PIERCE_NORMAL then
call UnitDamageTarget(u, ut, damage, true, true, ATTACK_TYPE_PIERCE, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
elseif damage_type == DAMAGE_TYPE_NORMAL_NORMAL then
call UnitDamageTarget(u, ut, damage, true, true, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
endif
endfunction
function AddUnitPermanentAbility takes unit u, integer abId returns nothing
call UnitAddAbility(u, abId)
call UnitMakeAbilityPermanent(u, true, abId)
endfunction
function Filter_EnemyOrganic takes nothing returns boolean
return IsUnitEnemy(temp_unit, GetOwningPlayer(GetFilterUnit())) and not IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) and not IsUnitType(GetFilterUnit(), UNIT_TYPE_ANCIENT) and IsWidgetAlive(GetFilterUnit())
endfunction
function GetHeroMainAttribute takes unit u returns integer
return LoadInteger(hash, GetUnitTypeId(u), HASH_UNIT_HERO_MAIN_ATTRIBUTE)
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Enter_Command takes nothing returns boolean
local string command = StringCase(GetEventPlayerChatString(), false)
if command == "-refresh" then
call SetWidgetLife(gg_unit_H000_0000, 9999.)
call SetUnitState(gg_unit_H000_0000, UNIT_STATE_MANA, 9999.)
call UnitResetCooldown(gg_unit_H000_0000)
elseif SubString(command, 0, 6) == "-lvlup" then
call SetHeroLevel(gg_unit_H000_0000, GetHeroLevel(gg_unit_H000_0000)+S2I(SubString(command, 6, StringLength(command))), true)
elseif command == "-fog" then
call FogEnable(false)
call FogMaskEnable(false)
endif
return true
endfunction
function Command_ShowTip takes nothing returns nothing
call DestroyTimer(GetExpiredTimer())
call DisplayTimedTextToPlayer(Player(0), 0., 0., 120., "Команды: -lvlup #, -fog, -refresh")
endfunction
function InitTrig_commands takes nothing returns nothing
local trigger trg = CreateTrigger()
call TriggerRegisterPlayerChatEvent(trg, Player(0), "-", false)
call TriggerAddCondition(trg, Condition(function Enter_Command))
call TimerStart(CreateTimer(), 0., false, function Command_ShowTip)
set trg = null
endfunction
//TESH.scrollpos=94
//TESH.alwaysfold=0
function Whirling_Death_Return_Attribute takes nothing returns boolean
local trigger trg = GetTriggeringTrigger()
local integer trgId = GetHandleId(trg)
local unit u = LoadUnitHandle(hash, trgId, 0)
local integer add_str = LoadInteger(hash, trgId, 1)
local integer add_agi = LoadInteger(hash, trgId, 2)
local integer add_int = LoadInteger(hash, trgId, 3)
call SetHeroStr(u, GetHeroStr(u, false) + add_str, true)
call SetHeroAgi(u, GetHeroAgi(u, false) + add_agi, true)
call SetHeroInt(u, GetHeroInt(u, false) + add_int, true)
if GetTriggerEventId() != EVENT_GAME_TIMER_EXPIRED then
call SetWidgetLife(u, 0.)
endif
call FlushChildHashtable(hash, trgId)
call DestroyTrigger(trg)
set u = null
set trg = null
return false
endfunction
function Whirling_Death_Damage takes nothing returns nothing
local unit uc = GetTriggerUnit()
local unit ue = GetEnumUnit()
local integer ablvl = GetUnitAbilityLevel(uc, 'A000')
local trigger trg
local integer trgId
local integer main_attribute
local integer dec_str
local integer dec_agi
local integer dec_int
local real dec_attribute
if IsUnitType(ue,UNIT_TYPE_HERO) == true then
set main_attribute = GetHeroMainAttribute(ue)
set dec_attribute = .15
if main_attribute == HERO_ATRIBUTE_STR then
set dec_str = R2I(dec_attribute * GetHeroStr(ue, false)) - 1
set dec_agi = 0
set dec_int = 0
elseif main_attribute == HERO_ATRIBUTE_AGI then
set dec_str = 0
set dec_agi = R2I(dec_attribute * GetHeroAgi(ue, false)) - 1
set dec_int = 0
elseif main_attribute == HERO_ATRIBUTE_INT then
set dec_str = 0
set dec_agi = 0
set dec_int = R2I(dec_attribute * GetHeroInt(ue, false)) - 1
endif
call SetHeroStr(ue, GetHeroStr(ue, false) - dec_str, true)
call SetHeroAgi(ue, GetHeroAgi(ue, false) - dec_agi, true)
call SetHeroInt(ue, GetHeroInt(ue, false) - dec_int, true)
set trg = CreateTrigger()
set trgId = GetHandleId(trg)
call SaveUnitHandle(hash, trgId, 0, ue)
call SaveInteger(hash, trgId, 1, dec_str)
call SaveInteger(hash, trgId, 2, dec_agi)
call SaveInteger(hash, trgId, 3, dec_int)
call TriggerRegisterTimerEvent(trg, 7., false)
call TriggerRegisterDeathEvent(trg, ue)
call TriggerAddCondition(trg, Condition(function Whirling_Death_Return_Attribute))
set trg = null
endif
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\Stampede\\StampedeMissileDeath.mdl", ue, "chest"))
call UnitDamageUnit(uc, ue, temp_integer, 50. + 50.*ablvl)
set ue = null
set uc = null
endfunction
function Whirling_Death_Actions takes nothing returns nothing
local unit uc = GetTriggerUnit()
local group gr = CreateGroup()
local real x = GetSpellTargetX()
local real y = GetSpellTargetY()
local real angle = AngleBetweenPoints(GetUnitX(uc), GetUnitY(uc), x, y)
set x = GetUnitX(uc)
set y = GetUnitY(uc)
if KillTreesInRange(x, y, 300.) > 0 then
set temp_integer = DAMAGE_TYPE_HERO_MAGIC
else
set temp_integer = DAMAGE_TYPE_NORMAL_FIRE
endif
set temp_unit = uc
call GroupEnumUnitsInRange(gr, x, y, 300.+25., Condition(function Filter_EnemyOrganic))
call ForGroup(gr, function Whirling_Death_Damage)
call DestroyGroup(gr)
call DestroyEffect(AddSpecialEffectTarget("war3mapImported\\WhirlingDeath_01.mdx", uc, "origin"))
set gr = null
set uc = null
endfunction
function Whirling_Death_Condition takes nothing returns boolean
if GetSpellAbilityId() == 'A000' then
call Whirling_Death_Actions()
endif
return false
endfunction
function InitTrig_Whirling_Death takes nothing returns nothing
local trigger trg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(trg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(trg, Condition(function Whirling_Death_Condition))
set trg = null
endfunction
//TESH.scrollpos=138
//TESH.alwaysfold=0
function Timber_Chain_Damage takes nothing returns nothing
local unit ue = GetEnumUnit()
if not IsUnitInGroup(ue, temp_group) then
call UnitDamageUnit(temp_unit, ue, DAMAGE_TYPE_HERO_MAGIC, 60. + 40.*temp_integer)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\Stampede\\StampedeMissileDeath.mdl", ue, "origin"))
call GroupAddUnit(temp_group, ue)
endif
set ue = null
endfunction
function Timber_Chain_MoveBackward takes nothing returns boolean
local trigger trg = GetTriggeringTrigger()
local integer trgId = GetHandleId(trg)
local unit uc = LoadUnitHandle(hash, trgId, 0)
local integer amount_link = LoadInteger(hash, trgId, 1)
local integer count = GetTriggerEvalCount(trg)
local boolean target_tree = LoadBoolean(hash, trgId, 2)
local group gr_damaged = LoadGroupHandle(hash, trgId, 3)
local group gr
local unit ud
if not target_tree then
set ud = LoadUnitHandle(hash, trgId, 700+amount_link+1-count)
call RemoveUnit(ud)
else
set ud = LoadUnitHandle(hash, trgId, 700+count)
call SetUnitX(uc, GetUnitX(ud))
call SetUnitY(uc, GetUnitY(ud))
call RemoveUnit(ud)
set gr = CreateGroup()
set temp_unit = uc
set temp_integer = GetUnitAbilityLevel(uc, 'A001')
set temp_group = gr_damaged
call GroupEnumUnitsInRange(gr, GetUnitX(uc), GetUnitY(uc), 250., Condition(function Filter_EnemyOrganic))
call ForGroup(gr, function Timber_Chain_Damage)
call DestroyGroup(gr)
endif
if count == amount_link then
call KillTreesInRange(GetUnitX(uc), GetUnitY(uc), 90.)
call DestroyGroup(gr_damaged)
call FlushChildHashtable(hash, trgId)
call DestroyTrigger(trg)
endif
set ud = null
set gr = null
set gr_damaged = null
set uc = null
set trg = null
return false
endfunction
function Timber_Chain_FindTree takes nothing returns nothing
if Is_Tree(GetEnumDestructable()) and IsWidgetAlive(GetEnumDestructable()) then
set temp_integer = temp_integer+1
endif
endfunction
function Timber_Chain_MoveForward takes nothing returns boolean
local trigger trg = GetTriggeringTrigger()
local integer trgId = GetHandleId(trg)
local integer count = GetTriggerEvalCount(trg)
local unit uc = LoadUnitHandle(hash, trgId, 0)
local integer amount_link = LoadInteger(hash, trgId, 1)
local real angle = LoadReal(hash, trgId, 2)
local real x = LoadReal(hash, trgId, 3) + I2R(count)*50.*Cos(angle)
local real y = LoadReal(hash, trgId, 4) + I2R(count)*50.*Sin(angle)
local trigger trg2 = LoadTriggerHandle(hash, trgId, 5)
local integer trg2Id = GetHandleId(trg2)
local unit ud
local integer udTId = 'u000'
local real d = 90.
local rect rct = Rect(x-d, y-d, x+d, y+d)
set temp_integer = 0
call EnumDestructablesInRect(rct, null, function Timber_Chain_FindTree)
if temp_integer>0 or count==amount_link or count==(amount_link-1) or count==(amount_link-2) then
set udTId = 'u001'
endif
set ud = CreateUnit(GetOwningPlayer(uc), udTId, x, y, angle*bj_RADTODEG)
call SaveUnitHandle(hash, trg2Id, 700+count, ud)
if temp_integer > 0 then
call FlushChildHashtable(hash, trgId)
call DestroyTrigger(trg)
call SaveUnitHandle(hash, trg2Id, 0, uc)
call SaveInteger(hash, trg2Id, 1, count)
call SaveBoolean(hash, trg2Id, 2, true)
call SaveGroupHandle(hash, trg2Id, 3, CreateGroup())
call TriggerRegisterTimerEvent(trg2, .5/amount_link, true)
call TriggerAddCondition(trg2, Condition(function Timber_Chain_MoveBackward))
elseif count > amount_link then
call FlushChildHashtable(hash, trgId)
call DestroyTrigger(trg)
call SaveUnitHandle(hash, trg2Id, 0, uc)
call SaveInteger(hash, trg2Id, 1, count)
call SaveBoolean(hash, trg2Id, 2, false)
call SaveGroupHandle(hash, trg2Id, 3, CreateGroup())
call TriggerRegisterTimerEvent(trg2, .5/amount_link, true)
call TriggerAddCondition(trg2, Condition(function Timber_Chain_MoveBackward))
endif
call RemoveRect(rct)
set rct = null
set trg2 = null
set ud = null
set uc = null
set trg = null
return false
endfunction
function Timber_Chain_Actions takes nothing returns nothing
local unit uc = GetTriggerUnit()
local integer ablvl = GetUnitAbilityLevel(uc, 'A001')
local real angle = AngleBetweenPoints(GetUnitX(uc), GetUnitY(uc), GetSpellTargetX(), GetSpellTargetY())
local trigger trg = CreateTrigger()
local integer trgId = GetHandleId(trg)
local integer range
local integer amount_link
set range = 600 + 200*ablvl
set amount_link = range/50
call SaveUnitHandle(hash, trgId, 0, uc)
call SaveInteger(hash, trgId, 1, amount_link)
call SaveReal(hash, trgId, 2, angle)
call SaveReal(hash, trgId, 3, GetUnitX(uc))
call SaveReal(hash, trgId, 4, GetUnitY(uc))
call SaveTriggerHandle(hash, trgId, 5, CreateTrigger())
call TriggerRegisterTimerEvent(trg, .5/I2R(amount_link), true)
call TriggerAddCondition(trg, Condition(function Timber_Chain_MoveForward))
set uc = null
set trg = null
endfunction
function Timber_Chain_Condition takes nothing returns boolean
if GetSpellAbilityId() == 'A001' then
call Timber_Chain_Actions()
endif
return false
endfunction
function InitTrig_Timber_Chain takes nothing returns nothing
local trigger trg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(trg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(trg, Condition(function Timber_Chain_Condition))
set trg = null
endfunction
//TESH.scrollpos=38
//TESH.alwaysfold=0
globals
integer array reactive_armor_abilityId
endglobals
function Reactive_Armor_ChangeAbility takes unit u, integer count returns nothing
local integer ablvl = GetUnitAbilityLevel(u, 'A002')
local integer i = 1
set count = IMinBJ(count, 4*ablvl)
loop
exitwhen i > 16
if i == count then
call AddUnitPermanentAbility(u, reactive_armor_abilityId[i])
call SetPlayerAbilityAvailable(GetOwningPlayer(u), reactive_armor_abilityId[i], false)
else
call UnitRemoveAbility(u, reactive_armor_abilityId[i])
endif
set i = i + 1
endloop
endfunction
function Reactive_Armor_RemoveAbility takes nothing returns boolean
local trigger trg = GetTriggeringTrigger()
local unit u = LoadUnitHandle(hash, GetHandleId(trg), 0)
local integer count = LoadInteger(hash, GetHandleId(u), HASH_UNIT_REACTIVE_ARMOR_COUNT)-1
call SaveInteger(hash, GetHandleId(u), HASH_UNIT_REACTIVE_ARMOR_COUNT, count)
call Reactive_Armor_ChangeAbility(u, count)
call FlushChildHashtable(hash, GetHandleId(trg))
call DestroyTrigger(trg)
set u = null
set trg = null
return false
endfunction
function Reactive_Armor_HeroAttacked takes nothing returns boolean
local trigger trg = GetTriggeringTrigger()
local unit u = LoadUnitHandle(hash, GetHandleId(trg), 0)
local integer count = LoadInteger(hash, GetHandleId(u), HASH_UNIT_REACTIVE_ARMOR_COUNT)+1
if IsUnitEnemy(GetAttacker(), GetOwningPlayer(u)) then
call SaveInteger(hash, GetHandleId(u), HASH_UNIT_REACTIVE_ARMOR_COUNT, count)
call Reactive_Armor_ChangeAbility(u, count)
set trg = CreateTrigger()
call SaveUnitHandle(hash, GetHandleId(trg), 0, u)
call TriggerRegisterTimerEvent(trg, 16., false)
call TriggerRegisterDeathEvent(trg, u)
call TriggerAddCondition(trg, Condition(function Reactive_Armor_RemoveAbility))
endif
set u = null
set trg = null
return false
endfunction
function Reactive_Armor_Learn takes nothing returns nothing
local unit u = GetTriggerUnit()
local trigger trg = CreateTrigger()
call SaveUnitHandle(hash, GetHandleId(trg), 0, u)
call SaveInteger(hash, GetHandleId(u), HASH_UNIT_REACTIVE_ARMOR_COUNT, 0)
call TriggerRegisterUnitEvent(trg, u, EVENT_UNIT_ATTACKED)
call TriggerAddCondition(trg, Condition(function Reactive_Armor_HeroAttacked))
set trg = null
set u = null
endfunction
function Reactive_Armor_Condition takes nothing returns boolean
if GetLearnedSkill() == 'A002' and GetUnitAbilityLevel(GetTriggerUnit(), 'A002') == 1 and not IsUnitIllusion(GetTriggerUnit()) then
call Reactive_Armor_Learn()
endif
return false
endfunction
function InitTrig_Reactive_Armor takes nothing returns nothing
local trigger trg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(trg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(trg, Condition(function Reactive_Armor_Condition))
set reactive_armor_abilityId[1] = 'A005'
set reactive_armor_abilityId[2] = 'A007'
set reactive_armor_abilityId[3] = 'A008'
set reactive_armor_abilityId[4] = 'A009'
set reactive_armor_abilityId[5] = 'A00D'
set reactive_armor_abilityId[6] = 'A00E'
set reactive_armor_abilityId[7] = 'A00F'
set reactive_armor_abilityId[8] = 'A00G'
set reactive_armor_abilityId[9] = 'A00H'
set reactive_armor_abilityId[10] = 'A00I'
set reactive_armor_abilityId[11] = 'A00J'
set reactive_armor_abilityId[12] = 'A00K'
set reactive_armor_abilityId[13] = 'A00L'
set reactive_armor_abilityId[14] = 'A00M'
set reactive_armor_abilityId[15] = 'A00N'
set reactive_armor_abilityId[16] = 'A00O'
set trg = null
endfunction
//TESH.scrollpos=9
//TESH.alwaysfold=0
function Chakram_Slow takes unit uc, unit ut returns nothing
local unit ud_caster = CreateUnit(GetOwningPlayer(uc), 'e000', GetUnitX(ut), GetUnitY(ut), 0)
local integer ablvl = R2I((1.-GetUnitState(ut, UNIT_STATE_LIFE)/GetUnitState(ut, UNIT_STATE_MAX_LIFE))/.05)
call UnitAddAbility(ud_caster, 'A00Q')
call SetUnitAbilityLevel(ud_caster, 'A00Q', ablvl)
call IssueTargetOrder(ud_caster, "slow", ut)
set ud_caster = null
endfunction
function Chakram_DamageOnSite takes nothing returns nothing
call UnitDamageUnit(temp_unit, GetEnumUnit(), DAMAGE_TYPE_HERO_MAGIC, (25. + 25.*I2R(temp_integer))*.5)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\Stampede\\StampedeMissileDeath.mdl", GetEnumUnit(), "origin"))
call Chakram_Slow(temp_unit, GetEnumUnit())
endfunction
function Chakram_DamageOnTheRun takes nothing returns nothing
if not IsUnitInGroup(GetEnumUnit(), temp_group) then
call GroupAddUnit(temp_group, GetEnumUnit())
call UnitDamageUnit(temp_unit, GetEnumUnit(), DAMAGE_TYPE_HERO_MAGIC, 60. + 40.*I2R(temp_integer))
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\Stampede\\StampedeMissileDeath.mdl", GetEnumUnit(), "origin"))
call Chakram_Slow(temp_unit, GetEnumUnit())
endif
endfunction
function Chakram_Return takes nothing returns boolean
local trigger trg = GetTriggeringTrigger()
local unit u = LoadUnitHandle(hash, GetHandleId(trg), 0)
call UnitRemoveAbility(u, 'Bpig')
call UnitRemoveAbility(u, 'BEia')
call UnitRemoveAbility(u, 'A00P')
call FlushChildHashtable(hash, GetHandleId(trg))
call DestroyTrigger(trg)
set u = null
set trg = null
return false
endfunction
function Chakram_Timer takes nothing returns boolean
local trigger trg = GetTriggeringTrigger()
local integer trgId = GetHandleId(trg)
local unit uc = LoadUnitHandle(hash, trgId, 0)
local unit ud_saw = LoadUnitHandle(hash, trgId, 1)
local real xt = LoadReal(hash, trgId, 2)
local real yt = LoadReal(hash, trgId, 3)
local real x
local real y
local real angle
local integer move_type = LoadInteger(hash, trgId, 4)
local group gr_damaged = LoadGroupHandle(hash, trgId, 5)
local group gr
local integer damage_delay_count = LoadInteger(hash, trgId, 6)
local real MPperS
call AddUnitPermanentAbility(uc, 'Abun')
if GetTriggerEventId() == EVENT_UNIT_SPELL_EFFECT then
if GetSpellAbilityId() == 'A00P' then
call SaveInteger(hash, trgId, 4, 2)
call GroupClear(gr_damaged)
call SetPlayerAbilityAvailable(GetOwningPlayer(uc), 'A00P', false)
set trg = CreateTrigger()
set trgId = GetHandleId(trg)
call SaveUnitHandle(hash, trgId, 0, uc)
call TriggerRegisterTimerEvent(trg, 0., false)
call TriggerAddCondition(trg, Condition(function Chakram_Return))
endif
elseif GetTriggerEventId() == EVENT_WIDGET_DEATH then
call UnitRemoveAbility(uc, 'Abun')
call SetPlayerAbilityAvailable(GetOwningPlayer(uc), 'A003', true)
call SetPlayerAbilityAvailable(GetOwningPlayer(uc), 'A00P', false)
call UnitRemoveAbility(uc, 'A00P')
call UnitRemoveAbility(uc, 'Bpig')
call UnitRemoveAbility(uc, 'BEia')
call KillUnit(ud_saw)
call DestroyGroup(gr_damaged)
call FlushChildHashtable(hash, trgId)
call DestroyTrigger(trg)
elseif move_type == 0 then
set angle = AngleBetweenPoints(GetUnitX(ud_saw), GetUnitY(ud_saw), xt, yt)
set x = GetUnitX(ud_saw) + 20.*Cos(angle)
set y = GetUnitY(ud_saw) + 20.*Sin(angle)
call KillTreesInRange(x, y, 175.)
if DistanceBetweenPoints(x, y, xt, yt) < 40. then
set x = xt
set y = yt
endif
call SetUnitX(ud_saw, x)
call SetUnitY(ud_saw, y)
set temp_unit = uc
set temp_integer = GetUnitAbilityLevel(uc, 'A003')
set temp_group = gr_damaged
set gr = CreateGroup()
call GroupEnumUnitsInRange(gr, x, y, 200.+25., Condition(function Filter_EnemyOrganic))
call ForGroup(gr, function Chakram_DamageOnTheRun)
call DestroyGroup(gr)
if x == xt and y == yt then
call SaveInteger(hash, trgId, 4, 1)
call GroupClear(gr_damaged)
endif
elseif move_type == 1 then
set damage_delay_count = damage_delay_count + 1
if damage_delay_count == 25 then
set x = GetUnitX(ud_saw)
set y = GetUnitY(ud_saw)
call KillTreesInRange(x, y, 175.)
set damage_delay_count = 0
set temp_unit = uc
set temp_integer = GetUnitAbilityLevel(uc, 'A003')
set gr = CreateGroup()
call GroupEnumUnitsInRange(gr, x, y, 200.+25., Condition(function Filter_EnemyOrganic))
call ForGroup(gr, function Chakram_DamageOnSite)
call DestroyGroup(gr)
set MPperS = (15. + 5.*temp_integer) / 2.
if GetUnitState(uc, UNIT_STATE_MANA) < MPperS or DistanceBetweenUnits(uc, ud_saw) > 2000. then
call SaveInteger(hash, trgId, 4, 2)
call GroupClear(gr_damaged)
call UnitRemoveAbility(uc, 'A00P')
call UnitRemoveAbility(uc, 'Bpig')
call UnitRemoveAbility(uc, 'BEia')
else
call SetUnitState(uc, UNIT_STATE_MANA, GetUnitState(uc, UNIT_STATE_MANA)-MPperS)
endif
endif
call SaveInteger(hash, trgId, 6, damage_delay_count)
elseif move_type == 2 then
set angle = AngleBetweenPoints(GetUnitX(ud_saw), GetUnitY(ud_saw), GetUnitX(uc), GetUnitY(uc))
set x = GetUnitX(ud_saw) + 20.*Cos(angle)
set y = GetUnitY(ud_saw) + 20.*Sin(angle)
call KillTreesInRange(x, y, 175.)
call SetUnitX(ud_saw, x)
call SetUnitY(ud_saw, y)
set temp_unit = uc
set temp_integer = GetUnitAbilityLevel(uc, 'A003')
set temp_group = gr_damaged
set gr = CreateGroup()
call GroupEnumUnitsInRange(gr, x, y, 200.+25., Condition(function Filter_EnemyOrganic))
call ForGroup(gr, function Chakram_DamageOnTheRun)
call DestroyGroup(gr)
if DistanceBetweenPoints(x, y, GetUnitX(uc), GetUnitY(uc)) < 40. then
call UnitRemoveAbility(uc, 'Abun')
call KillUnit(ud_saw)
call DestroyGroup(gr_damaged)
call FlushChildHashtable(hash, trgId)
call DestroyTrigger(trg)
call SetPlayerAbilityAvailable(GetOwningPlayer(uc), 'A003', true)
call SetPlayerAbilityAvailable(GetOwningPlayer(uc), 'A00P', false)
endif
endif
set gr = null
set gr_damaged = null
set ud_saw = null
set uc = null
set trg = null
return false
endfunction
function Chakram_Actions takes nothing returns nothing
local unit uc = GetTriggerUnit()
local real xt = GetSpellTargetX()
local real yt = GetSpellTargetY()
local real angle = AngleBetweenPoints(GetUnitX(uc), GetUnitY(uc), xt, yt)
local unit ud_saw = CreateUnit(GetOwningPlayer(uc), 'h001', GetUnitX(uc), GetUnitY(uc), angle*bj_RADTODEG)
local trigger trg = CreateTrigger()
local integer trgId = GetHandleId(trg)
call SaveUnitHandle(hash, trgId, 0, uc)
call SaveUnitHandle(hash, trgId, 1, ud_saw)
call SaveReal(hash, trgId, 2, xt)
call SaveReal(hash, trgId, 3, yt)
call SaveInteger(hash, trgId, 4, 0)
call SaveGroupHandle(hash, trgId, 5, CreateGroup())
call SaveInteger(hash, trgId, 6, 0)
call TriggerRegisterTimerEvent(trg, .02, true)
call TriggerRegisterDeathEvent(trg, uc)
call TriggerRegisterUnitEvent(trg, uc, EVENT_UNIT_SPELL_EFFECT)
call TriggerAddCondition(trg, Condition(function Chakram_Timer))
call AddUnitPermanentAbility(uc, 'Abun')
call AddUnitPermanentAbility(uc, 'A00P')
call SetPlayerAbilityAvailable(GetOwningPlayer(uc), 'A003', false)
call SetPlayerAbilityAvailable(GetOwningPlayer(uc), 'A00P', true)
set ud_saw = null
set trg = null
set uc = null
endfunction
function Chakram_Condition takes nothing returns boolean
if GetSpellAbilityId() == 'A003' then
call Chakram_Actions()
endif
return false
endfunction
function InitTrig_Chakram takes nothing returns nothing
local trigger trg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(trg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(trg, Condition(function Chakram_Condition))
call PreloadAbility('A003')
set trg = null
endfunction