Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
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
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 заново, потому что редактор эти файлы перезаписывает.
0
15
5 лет назад
Отредактирован DarkLigthing
0
Зачем Set/GetWidgetLife, если он всё равно преобразуется в Set/GetUnitLife... (:
3
29
5 лет назад
3
DarkLigthing:
Зачем Set/GetWidgetLife, если он всё равно преобразуется в Set/GetUnitLife... (:
Высмысле преобразуется? Это же нативка.
2
24
5 лет назад
2
PT153, к сожалению кастом код весь инжектится при сохранении в код карты раньше функций инициализации - переопределить их напрямую не выйдет. Можно попробовать по играться с метатаблицами или хуками, но скорее всего не выйдет или выйдет но через подлежащий обрезке функционал.
Главный вопрос - зачем править руками конфиг и мейн? Какие задачи решаются правкой этих двух функций и не могут быть решены другими способами?
0
28
5 лет назад
0
сожалению кастом код весь инжектится
Это ты про Lua?
Главный вопрос - зачем править руками конфиг и мейн?
Например.
config
//! textmacro InitPlayerWithTeam takes i, team
    set p = Player($i$)
    call DefineStartLocation($i$, CENTER_X, CENTER_Y)
    call SetPlayerStartLocation(p, $i$)
    call SetPlayerColor(p, ConvertPlayerColor($i$))
    static if TestingEnabled then
    call SetPlayerRacePreference(p, RACE_PREF_HUMAN)
    else
    call SetPlayerRacePreference(p, RACE_PREF_RANDOM)
    endif
    call SetPlayerRaceSelectable(p, true)
    call SetPlayerController(p, MAP_CONTROL_USER)
    call SetPlayerTeam(p, $team$)
//! endtextmacro

//! textmacro InitPlayer takes i
    set p = Player($i$)
    call DefineStartLocation($i$, CENTER_X, CENTER_Y)
    call SetPlayerStartLocation(p, $i$)
    call SetPlayerColor(p, ConvertPlayerColor($i$))
    static if TestingEnabled then
    call SetPlayerRacePreference(p, RACE_PREF_HUMAN)
    else
    call SetPlayerRacePreference(p, RACE_PREF_RANDOM)
    endif
    call SetPlayerRaceSelectable(p, true)
    call SetPlayerController(p, MAP_CONTROL_USER)
    call SetPlayerTeam(p, $i$)
//! endtextmacro

//! inject config
    local player p
    call SetMapName("TRIGSTR_001")
    call SetMapDescription("TRIGSTR_024")
    call SetPlayers(MaxUserPlayers)
    static if TestingEnabled then
        call SetTeams(2)
    //! runtextmacro InitPlayerWithTeam("0", "0")
    //! runtextmacro InitPlayerWithTeam("1", "1")
    //! runtextmacro InitPlayerWithTeam("2", "1")
    //! runtextmacro InitPlayerWithTeam("3", "1")
    //! runtextmacro InitPlayerWithTeam("4", "1")
    //! runtextmacro InitPlayerWithTeam("5", "1")
    //! runtextmacro InitPlayerWithTeam("6", "1")
    //! runtextmacro InitPlayerWithTeam("7", "1")
    //! runtextmacro InitPlayerWithTeam("8", "1")
    //! runtextmacro InitPlayerWithTeam("9", "1")
    else
        call SetTeams(MaxUserPlayers)
    //! runtextmacro InitPlayer("0")
    //! runtextmacro InitPlayer("1")
    //! runtextmacro InitPlayer("2")
    //! runtextmacro InitPlayer("3")
    //! runtextmacro InitPlayer("4")
    //! runtextmacro InitPlayer("5")
    //! runtextmacro InitPlayer("6")
    //! runtextmacro InitPlayer("7")
    //! runtextmacro InitPlayer("8")
    //! runtextmacro InitPlayer("9")
    endif
    set p = null
//! endinject
А main для того, чтобы всякие бесполезные надстройки для моей карты не настраивались, которые нужны для остальных карт.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.