globals
hashtable miHash = InitHashtable()//哈希表
boolean bSyncSkill = false //通用英雄同步技能触发
boolean bExtraSkill= false //通用英雄派生技能触发
endglobals function mitFlashSkill takes nothing returns nothing
local integer k = GetHandleId(GetExpiredTimer())
local unit u = LoadUnitHandle(miHash,k,1)
local integer si = LoadInteger(miHash,k,2)
local integer n = LoadInteger(miHash,k,3)
call UnitRemoveAbility(u,si)
call UnitAddAbility(u,si)
call SetUnitAbilityLevel(u,si,n)
call DestroyTimer(GetExpiredTimer())
endfunction function miFlashSkill2 takes unit u,integer si returns nothing
local timer t = CreateTimer()
local integer k = GetHandleId(t)
call SaveUnitHandle(miHash,k,1,u)
call SaveInteger(miHash,k,2,si)
call SaveInteger(miHash,k,3,GetUnitAbilityLevel(u,si))
call TimerStart(t,0,false,function mitFlashSkill)
set t = null
endfunction
function miFlashSkill takes unit u,integer si returns nothing
local integer i = GetUnitAbilityLevel(u,si)
call UnitRemoveAbility(u,si)
call UnitAddAbility(u,si)
call SetUnitAbilityLevel(u,si,i)
endfunction function miSS takes unit u,integer si1,integer si2 returns nothing
if GetUnitAbilityLevel(u,si1)==1 then
call UnitAddAbility(u,si2)
else
call SetUnitAbilityLevel(u,si2,GetUnitAbilityLevel(u,si1))
endif
endfunction function mitExtraSkill takes nothing returns nothing
local integer k = GetHandleId(GetExpiredTimer())
local unit u = LoadUnitHandle(miHash,k,1)
local player p = GetOwningPlayer(u)
local integer si1 = LoadInteger(miHash,k,2)
local integer si2 = LoadInteger(miHash,k,3)
call SaveInteger(miHash,si1,2,0)
call SetPlayerAbilityAvailable( p, si2, false )
call SetPlayerAbilityAvailable( p, si1, true )
set u = null
set p = null
call DestroyTimer(GetExpiredTimer())
endfunction function micExtraSkill2 takes unit u,integer si1,integer si2 returns nothing
local timer t = CreateTimer()
local integer k = GetHandleId(t)
call SaveUnitHandle(miHash,k,1,u)
call SaveInteger(miHash,k,2,si1)
call SaveInteger(miHash,k,3,si2)
call TimerStart(t,LoadReal(miHash,si1,5),false,function mitExtraSkill)
set t = null
endfunction function micExtraSkill takes nothing returns nothing
local unit u = GetTriggerUnit()
local integer si1 = GetSpellAbilityId()
local integer si2 = LoadInteger(miHash,si1,1)
local integer n
if si2!= 0 then
if LoadBoolean(miHash,si1,4) == true then
call miFlashSkill(u,si2)
call SetUnitAbilityLevel(u,si2,GetUnitAbilityLevel(u,si1))
call SetPlayerAbilityAvailable( GetOwningPlayer(u), si1, false )
call SetPlayerAbilityAvailable( GetOwningPlayer(u), si2, true )
call micExtraSkill2(u,si1,si2)
else
set n = LoadInteger(miHash,si2,2)+1
if n >= LoadInteger(miHash,si2,3) then
call SetPlayerAbilityAvailable( GetOwningPlayer(u), si1, false )
call SetPlayerAbilityAvailable( GetOwningPlayer(u), si2, true )
call SaveInteger(miHash,si2,2,0)
else
call miFlashSkill2(u,si1)
call SaveInteger(miHash,si2,2,n)
endif
endif
endif
set u =null
endfunction
function mitrExtraSkill takes nothing returns nothing
local trigger tr = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( tr, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition(tr, Condition(function micExtraSkill))
set tr = null
endfunction
function miExtraSkill takes integer si1,integer si2,integer qex,real time returns nothing
if bExtraSkill==false then
set bExtraSkill = true
call mitrExtraSkill()
endif
call SaveInteger(miHash,si1,1,si2)
call SaveInteger(miHash,si2,1,si1)
call SaveBoolean(miHash,si1,4,true)
call SaveReal(miHash,si1,5,time)
call SaveInteger(miHash,si1,3,qex)
endfunction
function micSyncSkill takes nothing returns nothing
local unit u = GetTriggerUnit()
local integer si1 = GetLearnedSkill()
local integer si2
local integer i = LoadInteger(miHash,si1,9)
loop
exitwhen i < 1
set si2 = LoadInteger(miHash,si1,10+i)
call miSS(u,si1,si2)
call UnitAddAbility(u,'AIs1')
call UnitRemoveAbility(u,'AIs1')
set i = i - 1
endloop
set u = null
endfunction
function mitrSyncSkill2 takes nothing returns nothing
local trigger tr = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( tr, EVENT_PLAYER_HERO_SKILL )
call TriggerAddCondition( tr, Condition(function micSyncSkill))
set tr = null
endfunction
function miSyncSkill takes integer si1,integer si2 returns nothing
local integer n = LoadInteger(miHash,si1,9)+1
if bSyncSkill==false then
set bSyncSkill = true
call mitrSyncSkill2()
endif
call SaveInteger(miHash,si1,9 ,n)
call SaveInteger(miHash,si1,10+n,si2)
endfunction