Скрипт делает что-то вроде щитов протосов в старкрафте: юниты с маной при получении урона сначала теряют ману, а не здоровье. Но беда в том, что событие перестает срабатывать (проверял print'ами) примерно после того, как у первого юнита иссекает мана.
do
    -- модель щита при полном поглощении урона
    local MODEL_BLOCK_DAMAGE_FULL = "Abilities\\Spells\\Items\\AIre\\AIreTarget.mdl"
    -- модель щита при частичном поглощении урона
    local MODEL_BLOCK_DAMAGE_HALF = "Abilities\\Spells\\Human\\Defend\\DefendCaster.mdl"

    local function GetDamageAfterSheild(whichUnit, damage)
        local mp = GetUnitState(whichUnit, UNIT_STATE_MANA)
        if mp >= damage then
            SetUnitState(whichUnit, UNIT_STATE_MANA, mp - damage)
            DestroyEffect(AddSpecialEffect(MODEL_BLOCK_DAMAGE_FULL, GetUnitX(whichUnit), GetUnitY(whichUnit)))
            return 0
        elseif mp < dmg then
            SetUnitState(whichUnit, UNIT_STATE_MANA, 0)
            DestroyEffect(AddSpecialEffect(MODEL_BLOCK_DAMAGE_HALF, GetUnitX(whichUnit), GetUnitY(whichUnit)))
            return damage - mp
        end
    end

    local trg = CreateTrigger()
    for i=1,bj_MAX_PLAYERS,1 do 
        TriggerRegisterPlayerUnitEvent(trg, Player(i-1), EVENT_PLAYER_UNIT_DAMAGING, null)
    end
    TriggerRegisterPlayerUnitEvent(trg, Player(PLAYER_NEUTRAL_AGGRESSIVE), EVENT_PLAYER_UNIT_DAMAGING, null)
    TriggerAddAction(trg, function()
        local target = GetTriggerUnit()
        local damager = GetEventDamageSource()
        local dmg = GetEventDamage()
        if dmg > 0 and BlzGetUnitMaxMana(target) > 0 then
            local realDmg = GetDamageAfterSheild(target, dmg)
            BlzSetEventDamage(realDmg)
        end
        target = nil
        damager = nil
    end)
end

Принятый ответ

PornoMishka, ознакомься
где у тебя точка входа?
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
1
26
4 года назад
Отредактирован Hate
1
попробуй
SetUnitState(whichUnit, UNIT_STATE_MANA, 0.)
бтв, в луа нет null, nil правильно
1
32
4 года назад
Отредактирован Берги
1
PornoMishka, ознакомься
где у тебя точка входа?
Принятый ответ
0
7
4 года назад
0
бтв, в луа нет null, nil правильно
Действительно, ох уж эта привычка
Bergi_Bear:
А это что-то новенькое, не знал. То есть мне нужно так в каждом "независимом" скрипте вида do\end так делать?
1
32
4 года назад
1
PornoMishka, я сам особо это не понимаю, но делаю так всякий раз, когда внутри функции фигурирует такое понятие как триггер или таймер
1
7
4 года назад
1
Bergi_Bear, спасибо!
0
32
4 года назад
0
PornoMishka, это prog, тот ресурс с этой целью и создавался, не мы первые не мы последние кто будет получать это ошибку...
Но некоторые ругаются на этот способ, типо он кривой и костыльный, однако я других пока что не знаю
1
10
4 года назад
1
Можешь еще это чекнуть.
Вот
0
7
4 года назад
0
вначале каждого триггера пиши do
local f = InitGlobals -- записываем InitGlobals в переменную
function InitGlobals() -- заменяем оригинальную InitGlobals своей
f() -- вызываем оригинальную InitGlobals из переменной
InitMyTrigger()
end
end
function InitMyTrigger()
тут твой триггер
end
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.