Добавлен , не публикуется
Раздел:
Триггеры и объекты
Вид: Демонстрация метода (не наработка)
Требования: Последний патч (1.31 на момент написания)
Метод исполнения: Lua

Принцип работы перезарядки

Кратко как работает
Добавляем в предмет абилку (амулета защиты) через функцию BlzItemAddAbility
Сбиваем линку вражеским даммиком и запускаем КД
Ждём отката КД и удаляем способность
Реально сделать и на 126 патче тоже самое, только придётся подменять предмет
Вот весь блок кода в принципе всё упрощено до 1 строчки в новой функции StartItemCD
function StartItemCD(it,c,idre)-- предмет, носитель предмета, ид способности по типу амулета защиты
BlzItemAddAbility(it, idre)
DummyCastOnUnit (nil,AbilityId('A001'),1,"creepthunderbolt",c)-- A001 пускатель перезарядки баша
cd=BlzGetAbilityCooldown(idre, 0)-- где 0 - первый уровень способности
TimerStart(CreateTimer(), cd, false, function()
BlzItemRemoveAbility(it, idre)   
end)
end
Полный код метода
--общие функции
function AbilityId(id)
    return id:byte(1) * 0x1000000 + id:byte(2) * 0x10000 + id:byte(3) * 0x100 + id:byte(4)
end

function DummyCastOnUnit ( u, id, level, order,targ ) -- DummyCastOnUnit (u,'',1,"entanglingroots",targ) 
    local ud
    if u==nil then
        ud = CreateUnit(Player(2),AbilityId('e000'),GetUnitX(targ),GetUnitY(targ),0)
    else
        ud = CreateUnit(GetOwningPlayer(u),AbilityId('e000'),GetUnitX(u),GetUnitY(u),0)
    end
    UnitAddAbility(ud,id)
    SetUnitAbilityLevel(ud,id,level)
    IssueTargetOrder(ud,order,targ)
    UnitApplyTimedLife( ud, AbilityId('BTLF'), 1 )
end


function StartItemCD(it,c,idre)-- предмет, носитель предмета, ид способности по типу амулета защиты
BlzItemAddAbility(it, idre)
DummyCastOnUnit (nil,AbilityId('A001'),1,"creepthunderbolt",c)-- A001 пускатель перезарядки
cd=BlzGetAbilityCooldown(idre, 0)-- где 0 - первый уровень способности
TimerStart(CreateTimer(), cd, false, function()
BlzItemRemoveAbility(it, idre)   
end)
end




do -- cистема урона с руки
gg_trg_DamageEvent = CreateTrigger(  )
for i = 0, bj_MAX_PLAYER_SLOTS - 1, 1 do
    TriggerRegisterPlayerUnitEvent(gg_trg_DamageEvent, Player(i), EVENT_PLAYER_UNIT_DAMAGING)
    TriggerAddCondition( gg_trg_DamageEvent, Condition( function () return GetEventDamage()>1   end))
end
TriggerAddAction( gg_trg_DamageEvent, function ()

-- код функции сюда пишем условия
local u=GetTriggerUnit() -- тот кто получил урон
local c=GetEventDamageSource() -- тот кто нанёс урон
local d=GetEventDamage() -- число урона


-- блок башера
if BlzGetEventDamageType( ) == DAMAGE_TYPE_NORMAL  and  UnitHasItemOfTypeBJ(c, AbilityId('I000')) and GetUnitAbilityLevel(c, AbilityId('A000'))==0 then --
it=GetItemOfTypeFromUnitBJ(c, AbilityId('I000'))
SetItemCharges(it, GetItemCharges(it)+1) --увеличиваем заряды предмета за удар

if GetItemCharges(it)>=5 then
SetItemCharges(it, 0)
--print("прок баша, перезапуск")
DummyCastOnUnit (c,AbilityId('A001'),1,"creepthunderbolt",u)-- само оглушение башем
BlzSetEventDamage(d*2)-- увеличиваем входщий урон в 2 раза
StartItemCD(it,c,AbilityId('A000'))
end    
end
--- блок щита
if UnitHasItemOfTypeBJ(u, AbilityId('I001')) and GetUnitAbilityLevel(u, AbilityId('A003'))==0 then
    print("лечение щита")
it=GetItemOfTypeFromUnitBJ(u, AbilityId('I001')) -- помещаем в переменную предмет 
StartItemCD(it,u,AbilityId('A003'))-- стартуем кд на предмете
UnitAddItem(u, CreateItem(AbilityId('I002'), 0, 0))-- добавлением эффект лечения через руну
end

end)
end --конец блок кода урона

Плюсы метода

-Не сбивает текущий приказ
-может сработать даже в стане
-не конфликтует с амулетом защиты и другими подобными способностями

Минусы метода

-нельзя запустить кд, когда юнит полностью неуязвим
-нельзя запустить кд если юнит иммунен к магии (нужна переделка сбиваемой способности на канальную)
-слишком мало тестов
-не могу назвать это наработкой ибо слишком плохо знаю lua, так что делюсь просто фактом метода

Графические материалы

`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
1
24
5 лет назад
1
Bergi_Bear, удалять сразу после срабатывания, естественно, иначе как же он сработает.
0
37
5 лет назад
Отредактирован ScorpioT1000
0
Людоедский код, юзай хотябы онлайн бьютифай blackmiaool.com/lua-beautify
done
--общие функции
function AbilityId(id)
    return id:byte(1) * 0x1000000 + id:byte(2) * 0x10000 + id:byte(3) * 0x100 + id:byte(4)
end

function DummyCastOnUnit ( u, id, level, order,targ ) -- DummyCastOnUnit (u,'',1,"entanglingroots",targ)
    local ud
    if u==nil then
        ud = CreateUnit(Player(2),AbilityId('e000'),GetUnitX(targ),GetUnitY(targ),0)
    else
        ud = CreateUnit(GetOwningPlayer(u),AbilityId('e000'),GetUnitX(u),GetUnitY(u),0)
    end
    UnitAddAbility(ud,id)
    SetUnitAbilityLevel(ud,id,level)
    IssueTargetOrder(ud,order,targ)
    UnitApplyTimedLife( ud, AbilityId('BTLF'), 1 )
end


function StartItemCD(it,c,idre)-- предмет, носитель предмета, ид способности по типу амулета защиты
    BlzItemAddAbility(it, idre)
    DummyCastOnUnit (nil,AbilityId('A001'),1,"creepthunderbolt",c)-- A001 пускатель перезарядки
    cd=BlzGetAbilityCooldown(idre, 0)-- где 0 - первый уровень способности
    TimerStart(CreateTimer(), cd, false, function()
        BlzItemRemoveAbility(it, idre)
    end)
end




do -- cистема урона с руки
    gg_trg_DamageEvent = CreateTrigger(  )
    for i = 0, bj_MAX_PLAYER_SLOTS - 1, 1 do
        TriggerRegisterPlayerUnitEvent(gg_trg_DamageEvent, Player(i), EVENT_PLAYER_UNIT_DAMAGING)
        TriggerAddCondition( gg_trg_DamageEvent, Condition( function () return GetEventDamage()>1   end))
    end
    TriggerAddAction( gg_trg_DamageEvent, function ()

            -- код функции сюда пишем условия
            local u=GetTriggerUnit() -- тот кто получил урон
            local c=GetEventDamageSource() -- тот кто нанёс урон
            local d=GetEventDamage() -- число урона


            -- блок башера
            if BlzGetEventDamageType( ) == DAMAGE_TYPE_NORMAL  and  UnitHasItemOfTypeBJ(c, AbilityId('I000')) and GetUnitAbilityLevel(c, AbilityId('A000'))==0 then --
                it=GetItemOfTypeFromUnitBJ(c, AbilityId('I000'))
                SetItemCharges(it, GetItemCharges(it)+1) --увеличиваем заряды предмета за удар

                if GetItemCharges(it)>=5 then
                    SetItemCharges(it, 0)
                    --print("прок баша, перезапуск")
                    DummyCastOnUnit (c,AbilityId('A001'),1,"creepthunderbolt",u)-- само оглушение башем
                    BlzSetEventDamage(d*2)-- увеличиваем входщий урон в 2 раза
                    StartItemCD(it,c,AbilityId('A000'))
                end
            end
            --- блок щита
            if UnitHasItemOfTypeBJ(u, AbilityId('I001')) and GetUnitAbilityLevel(u, AbilityId('A003'))==0 then
                print("лечение щита")
                it=GetItemOfTypeFromUnitBJ(u, AbilityId('I001')) -- помещаем в переменную предмет
                StartItemCD(it,u,AbilityId('A003'))-- стартуем кд на предмете
                UnitAddItem(u, CreateItem(AbilityId('I002'), 0, 0))-- добавлением эффект лечения через руну
            end

    end)
end --конец блок кода урона
0
32
5 лет назад
0
Эмм, кстати никто не проверял на взаимодействие с инивзами? То я что то забыл упомянуть, но точно помню что эксгумация срабатывая сбивает все инвизы с владельца, что не комильфо, амулет защитый работает аналогичным образом, юнит получает приказ его каста.
Насчет 1.26+ и луа, а там еще не завезли StartAbilityCooldown?
0
29
5 лет назад
0
а там еще не завезли StartAbilityCooldown?
С кулдаунами таже печаль.
0
32
5 лет назад
0
quq_CCCP, нет инвиз не проверял, по кулдаунам функций, если раньше амулет выводил из инвиза? то и щас скоре всего та же беда
Хотя не могу представить себе ситуацию где бежит БХ в инвизе и с линкой, ему сбивают линку и он выходит из инвиза, неужели так в первой доте было?
0
32
5 лет назад
0
Bergi_Bear, ну там много чего сбивало инвиз, а учитывая кол-во багов, этот не самый страшный. Химик во время ульта уходит в инвиз от лотара, у него кончается ульт и он выходит из инвиза, т.к морф кастуется пассивным кастом, чтобы химик мог превратится обратно. В бложике лича читаем.
Эксгумацию я проверял лично - сбивает инвиз при каждом кд. По этому спеллнигейшин не надежный и баганый вариант.
1
29
5 лет назад
Отредактирован nazarpunk
1
Пора создавать полноценные статьи по Lua)
Начало положено))
0
7
4 года назад
Отредактирован Ельнур
0
есть еще метод через эксгумацию но чтобы она сработала нужно дать герою (когда надо дать и ремовать или навсегда)предмет пассажир труповозка..
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.