Код должен работать следующим образом. Есть таблица, куда занесены все перезарядки способности и есть функция, которая проверяет наличие у юнита предмета (если он есть - уменьшает перезарядку вдвое). Далее создается триггер начала перезарядки способности после ее каста (при этом в РО кд способностей выставлен в 0). Сама карта не крашится, но при этом сам код не работает. В чем тут дело?

Kalvin273, во-первых, функция SetAbilityCooldown(caster, ability) в этом коде вообще никогда не вызывается.
Во-вторых, даже если бы она вызывалась, то скорее всего она бы не работала, так как я не вижу, где тут функция GetAbilityId, возможно имелось ввиду BlzGetAbilityId(whichAbility).
В-третьих, даже если бы она работала, то она бы ничего не делала, так как она просто берёт число и умножает на 0.5, никуда его не возвращая.
Интуитивно кажется, что нужно переделать так, хотя я не могу утверждать, что отлов каста сделан правильно, никогда таким не занимался.
function SetAbilityCooldown(ability)
    local cooldown = AbilitiesCooldown[BlzGetAbilityId(ability)] or 0

    if CheckHaveOctarine() then
        return cooldown * 0.5
    end
    return cooldown
end

-- ...

TriggerAddAction(abilityCastTrigger, function()
    local caster = GetTriggerUnit()
    local ability = BlzGetUnitAbility(caster, GetSpellAbilityId())
    BlzStartUnitAbilityCooldown(caster, ability, SetAbilityCooldown(ability))
end)
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
декорация то сцществует? обычно что бы такие переменные оставались существовать, нужно иметь гуи триггер где хоть как то будет упоминаться юнит/декорация, хоть без ивентов или действий

25
Не вижу в экшоне триггера вызова SetAbilityCooldown(), а аргумент cooldown там взялся из ниоткуда.
Загруженные файлы
Ответы (3)
9
Можно пожалуйста подробнее. Изучаю этот чудо-язык, в интернете не то чтобы много информации, а из помощников только нейронка gpt, которая косячит в коде еще чаще чем я :D
25
Kalvin273, во-первых, функция SetAbilityCooldown(caster, ability) в этом коде вообще никогда не вызывается.
Во-вторых, даже если бы она вызывалась, то скорее всего она бы не работала, так как я не вижу, где тут функция GetAbilityId, возможно имелось ввиду BlzGetAbilityId(whichAbility).
В-третьих, даже если бы она работала, то она бы ничего не делала, так как она просто берёт число и умножает на 0.5, никуда его не возвращая.
Интуитивно кажется, что нужно переделать так, хотя я не могу утверждать, что отлов каста сделан правильно, никогда таким не занимался.
function SetAbilityCooldown(ability)
    local cooldown = AbilitiesCooldown[BlzGetAbilityId(ability)] or 0

    if CheckHaveOctarine() then
        return cooldown * 0.5
    end
    return cooldown
end

-- ...

TriggerAddAction(abilityCastTrigger, function()
    local caster = GetTriggerUnit()
    local ability = BlzGetUnitAbility(caster, GetSpellAbilityId())
    BlzStartUnitAbilityCooldown(caster, ability, SetAbilityCooldown(ability))
end)
Принятый ответ
25
Kalvin273, а, ну и в lua эти 'A000' работать не будут, нужно делать через FourCC(raw) или сразу забивать данные в таблицу абилок через целые числа
Чтобы оставить комментарий, пожалуйста, войдите на сайт.