, Гильдия «Черамор»

Заклинание: Благословение

» опубликован
» Способ реализации: Lua
» Тип: Способность
» 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


Просмотров: 754

» Лучшие комментарии


Proshel_Doty #1 - 5 месяцев назад 0
Лучницы не хилятся)
Посмотрел как всё устроено и понял в чём прикол, там способность Аура восстановления, в Область воздействия на 1 лвле стоит 500, а дальше 0
А зачем надо было делать через стандартную эту ауру? ЧТоб сложнее было отследить кол-во восстановленного здоровья?)
NazarPunk #2 - 5 месяцев назад (отредактировано ) 0
Лучницы не хилятся)
Исправлено.
А зачем надо было делать через стандартную эту ауру?
Чтобы те, кто скопируют в свою карту могли через РО настраивать.
Bergi_Bear #3 - 5 месяцев назад 0
Так всё хорошо, вроде бы понятно, но весьма интересно, что на луа всместо хештаблиц (часто говорили,что луа это уже таблицы), так что хочу увидеть какое-нить заклинание которое выглядело на Jass как Хештаблица + таймер, как это всё будет теперь на луа?
NazarPunk #4 - 5 месяцев назад 1
Bergi_Bear, зачем хэштаблицы, если переменные в замыкании?
local unit = GetTriggerUnit()
TimerStart(CreateTimer(), 10, false, function()
	KillUnit(unit) --> переменная доступна отсюда, не нужно перебрасывать через таблицы
	DestroyTimer(GetExpiredTimer())
end)
так что хочу увидеть какое-нить заклинание
Можете написать ТЗ, в соавторстве опубликуем)
Bergi_Bear #5 - 5 месяцев назад 0
тут то да, тот они не нужны в этом заклинании
NazarPunk, ну например вот:
Простейшее триггерное лечение от интеллекта
Каст: Герой указывает способность на себя или любую другую союзную единицу (10 секунд или пока цель не вылечиться)
Действие:
  • Создаётся таймер периодический каждые 0,5 сек идёт
  • На хендл таймера вешаем кастера (1) и целькастера(2)
  • крутим функцию лечения извлекая данные на тик таймера
Со своими текущими знаниями я бы это сделал так. а как на луа?

заклинание и МУИ и возможно двойное накладывание на юнита, могу набросать полностью jass аналог, если не понятно описал
NazarPunk #6 - 5 месяцев назад 0
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)
Bergi_Bear #7 - 5 месяцев назад -1
TimerStart(CreateTimer(), 0.5, true, function() - имя функции надо передать, которая ничего не принимает, в неё нельзя будет передать какие либо аргументы и просто так вызвать HealUnit(caster, target)
Proshel_Doty #8 - 5 месяцев назад (отредактировано ) 0
Чтобы те, кто скопируют в свою карту могли через РО настраивать.
Опять же зачем, если можно и в джасе поменять одну-две циферки. Особенно, если Комментарием указано что надо поменять и где, даже нуб разберётся)
Мб запилишь через триггерное лечение? Кто ещё за?)
NazarPunk #9 - 5 месяцев назад 0
Bergi_Bear, зачем что-то передавать в безымянную функцию? Если функция не видит переменных в своей области видимости то она ищет их на уровень выше вплоть до глобального контекста.
Proshel_Doty:
Мб запилишь через триггерное лечение? Кто ещё за?)
Дайте эффекты и красивое описание, запилю)
Proshel_Doty:
Опять же зачем, если можно и в джасе поменять одну-две циферки. Особенно, если Комментарием указано что надо поменять и где, даже нуб разберётся)
Можно, но через ауру проще, а ели нужно отслеживать хил, то нужно свою систему писать.
Bergi_Bear #10 - 5 месяцев назад -1
NazarPunk, а ты проверял вот этот код? это вот так вот на луа будем работать? не уж то так всё удобно
NazarPunk #11 - 5 месяцев назад 1
а ты проверял вот этот код?
Проверял, мануал читал и даже молнии таким образом написал)
Bergi_Bear:
не уж то так всё удобно
Ну да)) Нужно только побольше наработок опубликовать, чтоб люди не боялись переходить.
Феникс #12 - 5 месяцев назад 1
NazarPunk, Кажется сейчас полезнее начать писать статьи по работе с lua, наработки - это хорошо, но всё же без базы тяжело понимать всё методом осмотра.
NazarPunk #13 - 5 месяцев назад 0
Кажется сейчас полезнее начать писать статьи по работе с lua
Которые никто не прочитает и будет спамить в Q\A.
Феникс #14 - 5 месяцев назад 2
NazarPunk, Ну в приоритете не хомяки, я думаю.
Например можно в форме: Jass (было) / Lua (стало)
Bergi_Bear #15 - 5 месяцев назад 3
Например можно в форме: Jass (было) / Lua (стало)
ну да, чтобы было понятно для таких как я, а что тут вообще происходит?
NazarPunk #16 - 5 месяцев назад 0
Например можно в форме: Jass (было) / Lua (стало)
Мне с заклинаниями удобней. Кому нужно, тот вопрос задаст. Кто у меня ошибку найдёт, тот в комментах отпишет.

А когда заклинаний насобирается героев так на 10 может и карту пилить начну)
Proshel_Doty #17 - 5 месяцев назад (отредактировано ) 0
Дайте эффекты и красивое описание, запилю)
Предлагаю вот так вообще сделать, так сказать немного переделать и улучшить:
Паладин в течение N сек окружает священный барьер, который поглощает весь получаемый Паладином урон, при этом испуская святую энергию, которая при каждом поглощении урона равномерно восстанавливает здоровье всех союзников в радиусе 900 от Паладина в 80% от нанесённого урона. Паладину же восстанавливается 20% от поглощённого урона.
NazarPunk #18 - 5 месяцев назад 0
ну да, чтобы было понятно для таких как я
Я уже пытался. Правда тогда у меня общей идеи небыло, сумбурно получилось. Хотя если сделать проще и сначала придумать и описать заклинание, а потом пошагово его реализовать, будет лучше.
Bergi_Bear #19 - 5 месяцев назад 0
может и карту пилить начну)
в кой-то веке =)
NazarPunk #20 - 5 месяцев назад 0
Proshel_Doty, я так изначально и хотел, но если паладина часто атакуют, то эффекты спамятся.
Proshel_Doty #21 - 5 месяцев назад (отредактировано ) 0
NazarPunk:
Proshel_Doty, я так изначально и хотел, но если паладина часто атакуют, то эффекты спамятся.
Значит надо это урегулировать, а что делать)
Например, сделать чтобы эффекты не появлялись, если не прошло 0.5 сек с прошлого получения урона
NazarPunk #22 - 5 месяцев назад 0
в кой-то веке =)
Заклинаний пока мало. А то вы на стандарт ругаться будете)
Феникс #23 - 5 месяцев назад 0
NazarPunk, Если нужны идеи, готов помочь)
Bergi_Bear #24 - 5 месяцев назад 0
кто сказал
что у него проблемы с идеями?
прикреплены файлы
NazarPunk #25 - 5 месяцев назад 0
Если нужны идеи, готов помочь)
Если идеи по заклинаниям для публиации. То с удовольствием. В идеале если будет
  • нестандартная иконка
  • нестандартные эффекты
  • красивое описание
то я с радостью на lua наклепаю и в соавторстве опубликуем)
Proshel_Doty #26 - 5 месяцев назад 0
Если идеи по заклинаниям для публиации. То с удовольствием. В идеале если будет
нестандартная иконка
нестандартные эффекты
красивое описание
то я с радостью на lua наклепаю и в соавторстве опубликуем)
Норм, я тогда тоже подкину идей
Proshel_Doty #27 - 5 месяцев назад 0
NazarPunk:
ну что способность переделывать будешь?)
NazarPunk #28 - 5 месяцев назад 0
Proshel_Doty, эта способность пускай остаётся как есть, пусть новички поучатся. Я лучше ещё одну сделаю. Посложнее и покрасивее.
Proshel_Doty #29 - 5 месяцев назад 0
NazarPunk:
Proshel_Doty, эта способность пускай остаётся как есть, пусть новички поучатся. Я лучше ещё одну сделаю. Посложнее и покрасивее.
Хорош)