Способность то у меня получилось сделать (наверняка кто-то скажет, что там дофига утечек xd), но если поставить перезарядку на ноль и кидать этот "бумеранг", то следующий полетит, а предыдущий останется на одном месте..
Знаю, что эту проблему можно решить с помощью джасса, но я вообще не шарю в нём.. Читал статьи, читал.. А вот как сделать, чтобы бумеранги нормально летали так и не понял)
Думаю, что нужно локализировать применяющего юнита и сам бумеранг, но как с ними взаимодействовать в других триггерах я без понятия
(Если будет ответ, то пожалуйста, объясните - что, как, зачем и почему)
(Да-да, я зачем-то конвертировал триггеры в текст.. Думал, что мне так легче разобраться будет... Какой же я идиот)

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

Потому что бумеранги записываются в одни и те же глобальные переменные, и при касте нового эти переменные перезаписываются, и старый уже никак не управляется. Нужно использовать хеш таблицы.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
2
28
5 лет назад
Отредактирован PT153
2
Потому что бумеранги записываются в одни и те же глобальные переменные, и при касте нового эти переменные перезаписываются, и старый уже никак не управляется. Нужно использовать хеш таблицы.
Принятый ответ
0
26
5 лет назад
0
Насколько помню из прошлой версии карты, твой бумеранг скакал по нескольким врагам, но не возвращался обратно. Этот тоже отскакивает по врагам или атакует лишь одну цель?
Посмотрел триггеры, это не автоатака, а способность оказывается.
0
27
5 лет назад
Отредактирован rsfghd
0
8gabriel8, в смысле отскакивает?)
Просто наносит урон вокруг себя при движении
Автоатака сделана через РО (снаряд (рикошет)), я не столь крутой jass'ep, чтобы делать рикошеты с автоатаки)
PT153, помог, спасибо)
Теперь я знаю, что мне нужна хеш таблица, загадка скилла решена, ура)))
Уот_)
С этими скринами яснее.
Кстати, set l = null, или call removelocation(l)?
Загруженные файлы
2
28
5 лет назад
Отредактирован PT153
2
Кстати, set l = null, или call removelocation(l)?
Сначала call RemoveLocation(l), потом первое.
0
30
5 лет назад
0
Вот тут у героя есть способность бумеранг, реализовано не самым лучшим способом, но без утечек и MUI.
Загруженные файлы
0
27
5 лет назад
Отредактирован rsfghd
0
Clamp, фаталку кидает, низя запустить
PT153, учту)
Прочитал статью Hashtable - работаем с хеш-таблицей, повторил..
Что неправильного в этом коде?
function SpellDamageCond takes nothing returns boolean
    
    local unit pr = LoadUnitHandle(udg_hash,h,3)
    return ( IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(pr)) == true )
    set pr = null
    
endfunction


function SpellDamage1 takes nothing returns nothing

    local unit p = LoadUnitHandle(udg_hash,h,2)
    call ForGroupBJ( GetUnitsInRangeOfLocMatching(100.00, GetUnitLoc(p), Condition(function SpellDamageCond)), function SpellDamage )
    set p = null
    
endfunction


function SpellDamage takes nothing returns nothing

    local timer t = GetExpiredTimer()
    local integer h = GetHandleId(t)
    local location l = LoadLocationHandle(udg_hash,h,1)
    local unit p = LoadUnitHandle(udg_hash,h,2)
    local unit pr = LoadUnitHandle(udg_hash,h,3)
    local integer counter = LoadInteger(udg_hash,h,4)
    
        if counter>0 then

    call UnitDamageTarget( pr, GetEnumUnit(), ( 0.10 + ( I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, pr, true)) * 0.05 ) ), ATTACK_TYPE_MELEE, DAMAGE_TYPE_NORMAL )
    call SaveInteger(udg_hash,h,4,counter-1)
    
        else 
        
    call DestroyTimer(t)
    call FlushChildHashtable(udg_hash,h)
    
        endif
    
    set p = null
    set pr = null
    set t = null
    call RemoveLocation(l)
    set l = null
    
endfunction


function spellAct takes nothing returns nothing
    local unit p
    local unit pr = GetSpellAbilityUnit()
    local location l
    local timer t = CreateTimer()
    local integer h = GetHandleId(t)
    
    call CreateNUnitsAtLocFacingLocBJ( 1, 'u000', GetOwningPlayer(pr), GetUnitLoc(pr), GetSpellTargetLoc() )
    
    set p = GetLastCreatedUnit()
    set l = PolarProjectionBJ(GetUnitLoc(p), 8.00, GetUnitFacing(p))
    
    call SaveLocationHandle(udg_hash,h,1,l)
    call SaveUnitHandle(udg_hash,h,2,p)
    call SaveUnitHandle(udg_hash,h,3,pr)
    call SaveInteger(udg_hash,h,4,100)
    
    call TimerStart(t,0.04,true,function SpellDamage1)
    
    set p = null
    set pr = null
    set t = null
    call RemoveLocation(l)
    set l = null

endfunction

function spellCond takes nothing returns boolean
    return GetSpellAbilityId() == 'A001'
endfunction

//===========================================================================
function InitTrig_spell takes nothing returns nothing
    set gg_trg_spell = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( gg_trg_spell, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_spell, Condition( function spellCond ) )
    call TriggerAddAction( gg_trg_spell, function spellAct )
    
    set udg_hash = InitHashtable()
endfunction
0
30
5 лет назад
0
rsfghd, попробуй открыть в редакторе
0
27
5 лет назад
0
Clamp, я через редактор и открыл ту карту)
0
30
5 лет назад
0
rsfghd, нет JNGP?
0
27
5 лет назад
Отредактирован rsfghd
0
Clamp, я им и открыл карту
А, получилось, вот только никакого бумеранга там нет)
1
28
5 лет назад
Отредактирован PT153
1
Что неправильного в этом коде?
Это уже новый вопрос)
set udg_hash = InitHashtable()
Я бы вынес в более очевидное место, где происходит инициализация.
Использую нативки. CreateNUnitsAtLocFacingLocBJ плохая функция для создания одного юнита, да ещё и утечна.
И не используй локации.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.