Добавлен N1ghtSiren
Сделал скилл на лучку
Посмотрите на предмет утечек =3
Можете брать, если понадобится
Посмотрите на предмет утечек =3
Можете брать, если понадобится
раскрыть
scope RedArcher initializer InitRedArcher
globals
trigger RedArcher
endglobals
function Q takes nothing returns nothing
endfunction
function WWW takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer h1 = GetHandleId(t)
call PureDamageWithCrit(LoadUnitHandle(udg_GHT,h1,1),LoadUnitHandle(udg_GHT,h1,2),LoadReal(udg_GHT,h1,3), LoadReal(udg_GHT,h1,4),LoadReal(udg_GHT,h1,5), LoadReal(udg_GHT,h1,6), "|cFF8F42B2")
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\ManaFlare\\ManaFlareTarget.mdl",LoadUnitHandle(udg_GHT,h1,2),"overhead"))
call FlushChildHashtable(udg_GHT,h1)
call DestroyTimer(t)
set t = null
endfunction
function WW takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local group G = LoadGroupHandle(udg_GHT,h,10)
call BJDebugMsg("Units: "+I2S(CountUnitsInGroup(G)))
local timer t1 = CreateTimer()
local integer h1 = GetHandleId(t1)
local unit c = LoadUnitHandle(udg_GHT,h,1)
local unit u
local real agi = I2R(GetHeroAgi(c,true))
local real sd = GetSpellDamage(c)
local real cc = GetCritChance(c)
local unit dummy = CreateDummy(c)
local real dist
if CountUnitsInGroup(G) > 0 then
set u=FirstOfGroup(G)
call GroupRemoveUnit(G,u)
set dist = DistanceBetweenWidgets(c,u)
call BJDebugMsg("Dist: "+R2S(dist))
call SetUnitFacingToFaceUnitTimed(c,u,0)
call SetUnitAnimation(c,"Attack - 2")
if MissCalculator(u,0)==false then
else
call UnitAddAbility(dummy,'A037')
call IssueTargetOrder(dummy,"thunderbolt",u)
call TimerStart(t1,dist/2000,false,function WWW)
call SaveUnitHandle(udg_GHT,h1,1,c)
call SaveUnitHandle(udg_GHT,h1,2,u)
call SaveReal(udg_GHT,h1,3,agi*10)
call SaveReal(udg_GHT,h1,4,sd)
call SaveReal(udg_GHT,h1,5,cc)
call SaveReal(udg_GHT,h1,6,2)
endif
set u = null
set c = null
set t1 = null
set dummy = null
else
call FlushChildHashtable(udg_GHT,h)
call DestroyGroup(G)
set G = null
call DestroyTimer(t)
call PauseUnit(c,false)
set dummy = null
set t1 = null
set u = null
set c = null
set t = null
endif
endfunction
//===========================================================================
function W takes nothing returns nothing
call BJDebugMsg("SearchStart")
local integer h = GetHandleId(GetExpiredTimer())
local unit c = LoadUnitHandle(udg_GHT,h,1)
local timer t = CreateTimer()
local integer h1 = GetHandleId(t)
local integer range = 0
local unit u
local group g = CreateGroup()
local group G = CreateGroup()
call FlushChildHashtable(udg_GHT,h)
call SaveUnitHandle(udg_GHT,h1,1,c)
loop
set range = range + 50
exitwhen range >= 1000
call GroupEnumUnitsInRange(g,GetUnitX(c),GetUnitY(c),range+75,null)
endloop
loop
set u = FirstOfGroup(g)
call GroupRemoveUnit(g,u)
exitwhen u == null
if not IsUnitAliveAndAlly(c,u) then
call GroupAddUnit(G,u)
endif
endloop
call DestroyGroup(g)
set g = null
call SaveGroupHandle(udg_GHT,h1,10,G)
call GroupRemoveUnit(G,c)
call PauseUnit(c,true)
set G = null
call TimerStart(t,0.50,true,function WW)
endfunction
function RedArcherActions takes nothing returns nothing
local unit c = GetSpellAbilityUnit()
local timer t = CreateTimer()
local integer h = GetHandleId(t)
call SaveUnitHandle(udg_GHT,h,1,c)
if GetAbilityName(GetSpellAbilityId()) == "Скоп" then
call TimerStart(t,0.05,false,function W)
set t = null
call SetUnitAnimation(c, "Stand Channel")
call BJDebugMsg("Скоп")
endif
set c = null
endfunction
private function InitRedArcher takes nothing returns nothing
set RedArcher = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( RedArcher, EVENT_PLAYER_UNIT_SPELL_FINISH)
call TriggerAddAction( RedArcher, function RedArcherActions )
endfunction
endscope
//===========================================================================
function InitTrig_ArcherRed takes nothing returns nothing
endfunction
Принятый ответ
Если коротко: имена функций - жуть, не вижу определения PureDamageWithCrit, некоторые вызовы будут чуть медленнее из-за экономии места, ну и без хештаблицы можно, обойтись структурами + TimerExploit.
Блин, два раза кодировка сбивается в комменте, теперь вообще текста не видно, что за...
Блин, два раза кодировка сбивается в комменте, теперь вообще текста не видно, что за...
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
а тогда, может, и в текстовом сообщении прямо с имени и считывать? и не в каждом скилле, а где-то отдельно в системе?
я про call BJDebugMsg("Скоп") - мб вместо "Скоп" делать гетабилитинейм и где-нибудь глобально, а не в каждом скилле
Поле Tip - использующееся в игре как название способности - остаётся нетронутым.
Так что в теории можно просто именовать абилки как Q,W,E,R и так далее (по хоткею например), а доп проверкой делать имя юнита.
Отредактирован uranus
Блин, два раза кодировка сбивается в комменте, теперь вообще текста не видно, что за...
Сама карта и есть полигон со всеми системами, но делиться ими я пока не готов
Отредактирован PT153
Кроме бага с ResumeTimer().
Отредактирован uranus
Из статьи про оптимизацию:
Отредактирован PT153
В цитате говорится, что периодический таймер лучше, чем периодический триггер, но не говорится, что периодический таймер хуже, чем непериодический.
Из всех проблем с периодическими таймерами я знаю только баг с ResumeTimer(). А ещё вроде бы периодический таймер будет точнее, чем перезапуск непериодического.