Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Lua
Тип:
Способность
Версия Warcraft:
Reforged
» MUI: да
» Импорт: иконка
» Утечки: нет
» Требования: нет
Длань Господня, способность, которую могли освоить лишь Истинные Паладины. В их руках, эта сила не только излечивала любые раны и болезни. Но и искореняла любое зло, ставшее на пути Паладина.
Божественная вспышка, не знающая пощады для врагов, и дарующая Благодать союзникам.
И самое главное теперь, Паладин может восстановить себе утерянную жизнь, в ровном размере излеченного здоровья или нанесенного урона.
  • Лечит живых или наносит урон андедам в размере "Базовый урон героя * уровень способности".
  • Восстанавливает здоровье кастеру в количестве восстановленного здоровья или нанесённого урона.

Скриншот

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

Перенос в свою карту
Триггеры
  • HolyFist
Способности
  • Длань Господня 'SHoF'
Импорт
  • ReplaceableTextures\CommandButtons\BTNSpellHolyFist.blp
  • ReplaceableTextures\CommandButtonsDisabled\DISBTNSpellHolyFist.blp
Настройка
local ABILITY_ID = AbilityId('SHoF')
local EFFECT = "Abilities\\Spells\\Human\\HolyBolt\\HolyBoltSpecialArt.mdl"
local EFFECT_ATTACH = "origin"
Код
//! 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('SHoF')
    local EFFECT = "Abilities\\Spells\\Human\\HolyBolt\\HolyBoltSpecialArt.mdl"
    local EFFECT_ATTACH = "origin"
    
    -- Заклинание
    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
        local hp_caster = 0

        DestroyEffect(AddSpecialEffectTarget(EFFECT, target, EFFECT_ATTACH))

        if IsUnitType(target, UNIT_TYPE_UNDEAD)
        then
            hp_caster = math.min(damage, GetUnitState(target, UNIT_STATE_LIFE))
            UnitDamageTarget(caster, target, damage, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS);
        else
            local hp = GetWidgetLife(target)
            SetWidgetLife(target, hp + damage)
            hp_caster = math.min(damage, GetUnitState(target, UNIT_STATE_MAX_LIFE) - hp)
        end
        
        if hp_caster > 0
        then
            SetWidgetLife(caster, GetWidgetLife(caster) + hp_caster)
            DestroyEffect(AddSpecialEffectTarget(EFFECT, caster, EFFECT_ATTACH))
        end
    end)
end
//! endusercode
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
28
5 лет назад
Отредактирован PT153
0
BJDebugMsg
Не надо эту функцию использовать, внутри её цикл, есть куда более эффективная функция, которая асинхронна.
function DebugMsg takes string s returns nothing
    debug call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 5., s)
endfunction
ScopteRectuS, если так написать, то карта вылетит ещё при нажатии на неё, как мне кажется.
NazarPunk:
Только это jass триггер, луа раньше срабатывает.
Там нет триггера, там просто вызов функции из main.

Я верно понял, что союзная нежить будет получать урон?

Я думаю, что блок do...end выполняется во время клика на карту карты (создания лобби для неё), вот и всё. Если это так, то тогда не стоит использовать GetLocalPlayer(), карта вылетит ещё при клике на неё.

Во время создания карты используется функция config, которая также есть и в Lua, насколько помню. Также создаются все глобалки.
0
29
5 лет назад
0
Я думаю, что блок do...end выполняется во время клика на карту карты
do...end создаёт область видимости и выполняется там, где объявлен.
PT153:
если так написать, то карта вылетит ещё при нажатии на неё, как мне кажется
скорей всего юнит не создатся. хотя тестить нужно
PT153:
Не надо эту функцию использовать
я уже на lua перешёл, а функция для теста приводилась.
PT153:
((цитата
Я верно понял, что союзная нежить будет получать урон?
))
да
PT153:
Во время создания карты используется функция config
Может package.config()? И скорее всего близы её прикрыли.
0
23
5 лет назад
0
NazarPunk, вреш!
Станартный луа
как видим его создает внутри функции и обазначают
Загруженные файлы
0
29
5 лет назад
0
Станартный луа
Как я сразу не догадался в этот файл заглянуть, теперь всё понятно.
function InitGlobals()
end

--> Пользовательский код

function main()
end

function config()
end
0
28
5 лет назад
0
скорей всего юнит не создатся. хотя тестить нужно
Обычно карта просто вылетает. Это как создать регион или выполнить GetLocalPlayer().
NazarPunk:
выполняется там, где объявлен.
Ну так об этом же. Объявил, он и выполнился во время клика на карту (создание лобби с картой).
2
24
5 лет назад
2
во время клика на карту
Откуда дровишки о том что на этом этапе вобще что-то выполняется из юзер-кода? И почему я уверен что код начинает выполняться где-то в процессе загрузки карты, уже после перехода из лобби?
0
21
5 лет назад
Отредактирован scopterectus
0
Есть ли в Lua нечто похожее на / /! inject main из vJass?
0
29
5 лет назад
0
ScopteRectuS, зачем вам эти древние костыли?
0
21
5 лет назад
0
NazarPunk, хочу полностью управлять тем, как инициализируется карта.
3
29
5 лет назад
3
хочу полностью управлять тем, как инициализируется карта.
Правьте war3map.lua))
0
28
5 лет назад
Отредактирован PT153
0
prog, это лишь мои догадки, скорее всего ты прав. Но глобалки точно инициализируются при клике на карту, потому что если дать неверное значение глобалке, то при клике на карту игра крашнется.
NazarPunk, это не костыли, а весьма удобный способ править функции config и main. Без инжекта тебе после каждого нового сохранения придётся править war3map.lua или war3map.j заново, потому что редактор эти файлы перезаписывает.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.