Способ реализации:
Lua
Версия Warcraft:
В данном ресурсе представлена простенькая (но оттого не менее эффективная) система перезарядки способностей.
Для чего это нужно? Допустим, хочу как в доте реализовать систему уменьшения времени перезарядки способностей (он же 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 (подробнее об этом тут)
`
ОЖИДАНИЕ РЕКЛАМЫ...
3
Не думаю, честно говоря, что создание БД + настройка скиллов в ПО сильно быстрее варианта с гуями, но в любом случае с упорядоченной системой легче работать в перспективе
Ответы (1)
9
Ты прав, но с той же БД проще работать в том плане, что параметр cooldown можно изменять в несколько этапов (если есть несколько стакающихся предметов с уменьшением кд или помимо него есть баф на увеличение/уменьшение кд способностей). Проще написать на это все 1-2 функции, чем сотни gui триггеров
Чтобы оставить комментарий, пожалуйста, войдите на сайт.