Суть вопроса

Юниты выпускают молнию в свою целевую точку создания способности. Сделал ограничения количества вызова молний одним юнитом поднятием уровня дополнительной способности до 2 :Если уровень способности 2 то основной способностью перемещать юнита в целевую точку создания способности.Но молния только только одна перемещается в указанную точку рандомного юнита. Как сделать чтоб юнит выпустивший молнию двигал только свою молнию , а не ссылался на другого юнита.

Скриншоты

На 1 фото выпускаются молнии у каждого своя. На 2 фото двигается только одна молния како-гото юнита.

Код заклинания

Изменил код что-то ненужное убрал, получилось вот что __
__ () .
//Требование к вызову молнии
function Trig_One_Unit takes nothing returns boolean
    if ( not ( GetUnitAbilityLevel(GetSpellAbilityUnit(), 'A032') == 1 ) ) then
        return false
    endif
    return true
endfunction

//Действие 2
function Trig_Molna_Actions2 takes nothing returns nothing
  //Выгрузка процесса
    local timer timerLig1 = GetExpiredTimer()
    local integer id = GetHandleId(timerLig1)
    local unit caster = LoadUnitHandle(Hash, id, StringHash("caster"))
    local unit ligUnit = LoadUnitHandle(Hash, id, StringHash("ligUnit"))
    local lightning Lig = LoadLightningHandle(Hash, id, StringHash("Lig"))
    local real process = LoadReal(Hash, id, StringHash("process")) + LoadReal(Hash, id, StringHash("speed"))
    
    if process > LoadReal(Hash, id, StringHash("maxDist")) then
        MoveLightningEx(Lig, true, GetLocationX(GetUnitLoc(caster)), GetLocationY(GetUnitLoc(caster)), (GetLocationZ(GetUnitLoc(caster))+100), GetLocationX(GetUnitLoc(ligUnit)), GetLocationY(GetUnitLoc(ligUnit)), GetLocationZ(GetUnitLoc(ligUnit))+30)
    else
        call SaveReal(Hash, id, StringHash("process"), process)
        MoveLightningEx(Lig, true, GetLocationX(GetUnitLoc(caster)), GetLocationY(GetUnitLoc(caster)), (GetLocationZ(GetUnitLoc(caster))+100), GetLocationX(GetUnitLoc(ligUnit)), GetLocationY(GetUnitLoc(ligUnit)), GetLocationZ(GetUnitLoc(ligUnit))+30)
        call SetUnitX(ligUnit, GetUnitX(ligUnit) + LoadReal(Hash, id, StringHash("speed")) * Cos(LoadReal(Hash, id, StringHash("angle")) * bj_DEGTORAD))
        call SetUnitY(ligUnit, GetUnitY(ligUnit) + LoadReal(Hash, id, StringHash("speed")) * Sin(LoadReal(Hash, id, StringHash("angle")) * bj_DEGTORAD))
     endif
     
endfunction

//Действие 1
function Trig_Molna_Actions takes nothing returns nothing
    local unit caster = GetSpellAbilityUnit()
    local location target = GetSpellTargetLoc()
    local real xTarget = GetSpellTargetX()
    local real yTarget = GetSpellTargetY()
    if ( Trig_One_Unit() ) then
     //Если юнит не создан
        //Увеличение уровня второй способности сделав лимит вызова молнии
        call IncUnitAbilityLevel(caster, 'A032')
        //Создание дамми юнита (молния)
        local unit ligUnit = CreateUnitAtLoc(GetOwningPlayer(caster),'h00N', GetUnitLoc(caster), 270 )
        local location CL = GetUnitLoc(caster)
        local location UL = GetUnitLoc(ligUnit)
      //Создание молнии
        local lightning lig = AddLightningEx("CLPB", true, GetLocationX(CL), GetLocationY(CL), GetLocationZ(CL)+100, GetLocationX(UL), GetLocationY(UL), GetLocationZ(UL)+100)
      //Создание таймера при первом появлении
        local timer timerLig1 = CreateTimer()
        local integer id = GetHandleId(timerLig1)
      //Числовые переменные
        local real xcaster = GetUnitX(caster)
        local real ycaster = GetUnitY(caster)
        local real xligUnit = GetUnitX(ligUnit)
        local real yligUnit = GetUnitY(ligUnit)
        local real dx = xligUnit - xcaster
        local real dy = yligUnit - ycaster
        local real angle = bj_RADTODEG * Atan2(yTarget - yligUnit,xTarget - xligUnit)
        local real maxDist = 1000//SquareRoot(dx * dx + dy * dy)
        local real speed = 700
      //Сохранения процесса
        call SaveUnitHandle(Hash, id, StringHash("caster"), caster)
        call SaveUnitHandle(Hash, id, StringHash("ligUnit"), ligUnit)
        call SaveLightningHandle(Hash, id, StringHash("lig"), lig)
        call SaveLocationHandle(Hash, id, StringHash("target"), target)
        call SaveReal(Hash, id, StringHash("angle"), angle)
        call SaveReal(Hash, id, StringHash("maxDist"), maxDist)
        call SaveReal(Hash, id, StringHash("speed"), speed  * 0.02)
        call SaveReal(Hash, id, StringHash("process"), 0)
      //Включение таймера
        call TimerStart(timerLig1, 0.03, true, function Trig_Molna_Actions2)
    else
      //Если юнит уже создан двигать его
        
    endif
endfunction

//Применяемая способность
function Trig_Molna_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A030'
endfunction

//Событие
function InitTrig_Molna takes nothing returns nothing
    set gg_trg_Molna = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Molna, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Molna, Condition( function Trig_Molna_Conditions ) )
    call TriggerAddAction( gg_trg_Molna, function Trig_Molna_Actions )
endfunction
А это черновой вариант как должно было бы быть
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
35
Улучшил описание.
23
Код явно нуждается в оптимизации. Всякие х у не обязательно сохранять, их можно извлечь из юнитов уже в каллбеке таймера.
Не понял, зачем периодик таймер?
Есть ошибки синтаксиса (отсутствует call)
Названия функций без комментариев.
чтобы привязать к юниту через хеш, можно сохранять в хеш и по handle id кастера )
и как выше написали, нужно видео принципа работы спелла
Ответы (4)
4
EugeAl, Загрузил видео изменил код , но так и не понял что я типо должен из 2 действия выгрузить в 1 и вставить в после Else. Во 2 действии оно сохраняется но не выгружается в 1 ошибка выходит.
23
MadDemon, в общем, надо тестить. Но мне лень)
28
MadDemon, почему нельзя было загрузить прямо на сайт видос? Я не хочу скачивать что-то, чтобы помочь тебе
28
MadDemon, делается твой спелл просто. Молнию с даммиком нужно сохранять в кастера. Если при выгрузке нет молнии, значит создать её
32
На сайте уже были готовые наработки для движения молний, в чем проблема?
Ответы (1)
4
quq_CCCP, В том то и проблема везде говорится взять что-нибудь закинуть куда нибудь подальше и через N секунд оно исчезнет. А как вернутся к этому объекту я не находил инфы.
Этот комментарий удален
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.