В данном ресурсе представлена простенькая (но оттого не менее эффективная) система перезарядки способностей.
Для чего это нужно? Допустим, хочу как в доте реализовать систему уменьшения времени перезарядки способностей (он же Octarine Core). Как это выглядит на GUI:
Для чего это нужно? Допустим, хочу как в доте реализовать систему уменьшения времени перезарядки способностей (он же Octarine Core). Как это выглядит на GUI:
Придется создавать отдельный триггер для каждой способности, или пихать все в один через нагромождение If/Then/Else. Не особо удобно. С помощью данной системы можно сделать это все гораздо проще. Я не претендую на новаторство самой идеи, но в свое время искал что-то похожее, но так и не нашел ресурса или примера. И так, приступим к созданию системы Octarine Core.
Суть наработки заключается в том, что мы создаем таблицу, куда запишем все значения времени перезарядки всех способностей для каждого уровня.
SpellCooldown = {
[FourCC('AHtc')] = {10, 8, 6}, --Thunder Clap
[FourCC('AHtb')] = {8, 7, 6}, --Thunder Bolt
[FourCC('AHav')] = 40, --Avatar
}
Разберем на примере способностей Горного Короля. Так же необходимо в РО выставить время перезарядки у способностей на 0 сек. Raw-код способностей (то, что записано в FourCC('код способности')) можно узнать нажав Ctrl + D в РО
После этого создаем сам предмет Octarine Core и присвоим ему id 'IToc'
Далее создаем функцию условия наличия у юнита данного предмета
Далее создаем функцию условия наличия у юнита данного предмета
function OctarineCondition()
local caster = GetTriggerUnit()
local hasItem = UnitHasItemOfTypeBJ(caster, FourCC('IToc'))
return hasItem
end
Функция возвращает hasItem = true если у юнита есть октарин, и false - если его нет.
После этого создаем триггер при применении любого заклинания любым юнитом и добавляем ему вышеуказанное условие и действия:
function SpellCD_Actions()
local caster = GetTriggerUnit()
local ability = GetSpellAbilityId()
local abilityLevel = GetUnitAbilityLevel(caster, ability)
local cooldown = SpellCooldown[ability][abilityLevel]
if OctarineCondition(caster) then
cooldown = cooldown * 0.5
end
BlzStartUnitAbilityCooldown(caster, ability, cooldown)
end
function InitSpellCD()
local SpellCD = CreateTrigger()
TriggerRegisterAnyUnitEventBJ(SpellCD, EVENT_PLAYER_UNIT_SPELL_EFFECT)
TriggerAddAction(SpellCD, SpellCD_Actions)
end
Функция SpellCD_Actions() добавляет триггеру действие, переменная cooldown ссылается на созданную нами таблицу выше и берет оттуда значение перезарядки для нужного нам уровня способности. А следующая функция проверяет выполняется ли функция наличия у юнита октарина (OctarineCondition), т.е. возвращает ли она true, и в этом случае уменьшает перезарядку на 50%. После чего уже перезарядка способности вызывается принудительно на cooldown секунд.
И это все. Просто вставьте этот код в карту, далее только впишите способности своих юнитов в таблицу SpellCooldown. И не забудьте инициировать функцию InitSpellCD() в InitGlobals (подробнее об этом тут)
Ред. MACOH