Добавлен , опубликован
Способ реализации:
Lua
Версия Warcraft:
» MUI: да
» Импорт: иконка, эффект
» Утечки: нет
» Требования: нет
Герой становится невосприимчив к урону и восстанавливает здоровье ближайшим союзникам.

Скриншот

Технические подробности

Перенос в свою карту
Триггеры
  • Bless
Способности
  • Благословение 'SBls'
  • Благословение (бафф) 'ABls'
  • Благословение (аура) 'PBls'
Заклинания
  • Благословение 'BBls'
Импорт
  • Effect\Spell\Bless_Caster.mdx
  • ReplaceableTextures\CommandButtons\BTNSpellBless.blp
  • ReplaceableTextures\CommandButtonsDisabled\DISBTNSpellBless.blp
  • ReplaceableTextures\PassiveButtons\PASSpellBless.blp
  • ReplaceableTextures\CommandButtonsDisabled\DISPASSpellBless.blp
Настройка
local ABILITY_ID = AbilityId('SBls')
local BUFF_ABILITY_ID = AbilityId('ABls')
local BUFF_ID = AbilityId('BBls')
local AURA_ID = AbilityId('PBls')
local DURATION = {10, 15, 20}
Код
//! beginusercode
do
    -- На момент патча 1.31 эта функция всегда возвращает 0. Поэтому создадим её локальный аналог.
    local function AbilityId(id)
        return id:byte(1) * 0x1000000 + id:byte(2) * 0x10000 + id:byte(3) * 0x100 + id:byte(4)
    end

    -- Настройки
    local ABILITY_ID = AbilityId('SBls')
    local BUFF_ABILITY_ID = AbilityId('ABls')
    local BUFF_ID = AbilityId('BBls')
    local AURA_ID = AbilityId('PBls')
    local DURATION = {10, 15, 20}
    
    -- Заклинание
    local DAMAGE_TRIGGER = CreateTrigger()
    local DAMAGE_GROUP = CreateGroup()

    TriggerAddAction(DAMAGE_TRIGGER, function()
        if GetUnitAbilityLevel(GetTriggerUnit(), BUFF_ID) == 0 then return end
        BlzSetEventDamage(0)
    end)

    local t = CreateTrigger()
    for i = 0, bj_MAX_PLAYER_SLOTS - 1, 1 do
        TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT)
    end
    TriggerAddCondition(t, Condition(function()
        return GetSpellAbilityId() == ABILITY_ID
    end))
    TriggerAddAction(t, function()
        local caster = GetTriggerUnit()
        local target = GetSpellTargetUnit()
        local level = GetUnitAbilityLevel(caster, ABILITY_ID)
        local damage = BlzGetUnitBaseDamage(caster, 1) * level
        UnitAddAbility(caster, BUFF_ABILITY_ID)
        if not IsUnitInGroup(caster, DAMAGE_GROUP) then
            TriggerRegisterUnitEvent(DAMAGE_TRIGGER, caster, EVENT_UNIT_DAMAGING)
            GroupAddUnit(DAMAGE_GROUP, caster)
        end

        UnitAddAbility(caster, AURA_ID)
        SetUnitAbilityLevel(caster, AURA_ID, level)

        TimerStart(CreateTimer(), DURATION[level], false, function()
            UnitRemoveAbility(caster, BUFF_ID)
            UnitRemoveAbility(caster, BUFF_ABILITY_ID)
            UnitRemoveAbility(caster, AURA_ID)
            DestroyTimer(GetExpiredTimer())
        end)
    end)
end
//! endusercode
`
ОЖИДАНИЕ РЕКЛАМЫ...
21
Лучницы не хилятся)
Посмотрел как всё устроено и понял в чём прикол, там способность Аура восстановления, в Область воздействия на 1 лвле стоит 500, а дальше 0
А зачем надо было делать через стандартную эту ауру? ЧТоб сложнее было отследить кол-во восстановленного здоровья?)
30
Лучницы не хилятся)
Исправлено.
А зачем надо было делать через стандартную эту ауру?
Чтобы те, кто скопируют в свою карту могли через РО настраивать.
33
Так всё хорошо, вроде бы понятно, но весьма интересно, что на луа всместо хештаблиц (часто говорили,что луа это уже таблицы), так что хочу увидеть какое-нить заклинание которое выглядело на Jass как Хештаблица + таймер, как это всё будет теперь на луа?
30
Bergi_Bear, зачем хэштаблицы, если переменные в замыкании?
local unit = GetTriggerUnit()
TimerStart(CreateTimer(), 10, false, function()
	KillUnit(unit) --> переменная доступна отсюда, не нужно перебрасывать через таблицы
	DestroyTimer(GetExpiredTimer())
end)
так что хочу увидеть какое-нить заклинание
Можете написать ТЗ, в соавторстве опубликуем)
33
тут то да, тот они не нужны в этом заклинании
NazarPunk, ну например вот:
Простейшее триггерное лечение от интеллекта
Каст: Герой указывает способность на себя или любую другую союзную единицу (10 секунд или пока цель не вылечиться)
Действие:
  • Создаётся таймер периодический каждые 0,5 сек идёт
  • На хендл таймера вешаем кастера (1) и целькастера(2)
  • крутим функцию лечения извлекая данные на тик таймера
Со своими текущими знаниями я бы это сделал так. а как на луа?

заклинание и МУИ и возможно двойное накладывание на юнита, могу набросать полностью jass аналог, если не понятно описал
30
Bergi_Bear, также только без таблицы))
local caster = GetTriggerUnit()
local target = GetSpellTargetUnit()
local count = 0
TimerStart(CreateTimer(), 0.5, true, function()
	HealUnit(caster, target) --> функция лечения объявленая где-то
	count = count + 1
	if count >= 20 then
		DestroyTimer(GetExpiredTimer())
	end
end)
33
TimerStart(CreateTimer(), 0.5, true, function() - имя функции надо передать, которая ничего не принимает, в неё нельзя будет передать какие либо аргументы и просто так вызвать HealUnit(caster, target)
21
Чтобы те, кто скопируют в свою карту могли через РО настраивать.
Опять же зачем, если можно и в джасе поменять одну-две циферки. Особенно, если Комментарием указано что надо поменять и где, даже нуб разберётся)
Мб запилишь через триггерное лечение? Кто ещё за?)
30
Bergi_Bear, зачем что-то передавать в безымянную функцию? Если функция не видит переменных в своей области видимости то она ищет их на уровень выше вплоть до глобального контекста.
Proshel_Doty:
Мб запилишь через триггерное лечение? Кто ещё за?)
Дайте эффекты и красивое описание, запилю)
Proshel_Doty:
Опять же зачем, если можно и в джасе поменять одну-две циферки. Особенно, если Комментарием указано что надо поменять и где, даже нуб разберётся)
Можно, но через ауру проще, а ели нужно отслеживать хил, то нужно свою систему писать.
33
NazarPunk, а ты проверял вот этот код? это вот так вот на луа будем работать? не уж то так всё удобно
30
а ты проверял вот этот код?
Проверял, мануал читал и даже молнии таким образом написал)
Bergi_Bear:
не уж то так всё удобно
Ну да)) Нужно только побольше наработок опубликовать, чтоб люди не боялись переходить.
29
NazarPunk, Кажется сейчас полезнее начать писать статьи по работе с lua, наработки - это хорошо, но всё же без базы тяжело понимать всё методом осмотра.
30
Кажется сейчас полезнее начать писать статьи по работе с lua
Которые никто не прочитает и будет спамить в Q\A.
29
NazarPunk, Ну в приоритете не хомяки, я думаю.
Например можно в форме: Jass (было) / Lua (стало)
33
Например можно в форме: Jass (было) / Lua (стало)
ну да, чтобы было понятно для таких как я, а что тут вообще происходит?
30
Например можно в форме: Jass (было) / Lua (стало)
Мне с заклинаниями удобней. Кому нужно, тот вопрос задаст. Кто у меня ошибку найдёт, тот в комментах отпишет.

А когда заклинаний насобирается героев так на 10 может и карту пилить начну)
21
Дайте эффекты и красивое описание, запилю)
Предлагаю вот так вообще сделать, так сказать немного переделать и улучшить:
Паладин в течение N сек окружает священный барьер, который поглощает весь получаемый Паладином урон, при этом испуская святую энергию, которая при каждом поглощении урона равномерно восстанавливает здоровье всех союзников в радиусе 900 от Паладина в 80% от нанесённого урона. Паладину же восстанавливается 20% от поглощённого урона.
30
ну да, чтобы было понятно для таких как я
Я уже пытался. Правда тогда у меня общей идеи небыло, сумбурно получилось. Хотя если сделать проще и сначала придумать и описать заклинание, а потом пошагово его реализовать, будет лучше.
30
Proshel_Doty, я так изначально и хотел, но если паладина часто атакуют, то эффекты спамятся.
21
NazarPunk:
Proshel_Doty, я так изначально и хотел, но если паладина часто атакуют, то эффекты спамятся.
Значит надо это урегулировать, а что делать)
Например, сделать чтобы эффекты не появлялись, если не прошло 0.5 сек с прошлого получения урона
30
в кой-то веке =)
Заклинаний пока мало. А то вы на стандарт ругаться будете)
33
кто сказал
что у него проблемы с идеями?
Загруженные файлы
30
Если нужны идеи, готов помочь)
Если идеи по заклинаниям для публиации. То с удовольствием. В идеале если будет
  • нестандартная иконка
  • нестандартные эффекты
  • красивое описание
то я с радостью на lua наклепаю и в соавторстве опубликуем)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.