Суть вопроса
Юниты выпускают молнию в свою целевую точку создания способности. Сделал ограничения количества вызова молний одним юнитом поднятием уровня дополнительной способности до 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
А это черновой вариант как должно было бы быть
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Ред. EugeAl
Не понял, зачем периодик таймер?
Есть ошибки синтаксиса (отсутствует call)
Названия функций без комментариев.
чтобы привязать к юниту через хеш, можно сохранять в хеш и по handle id кастера )
и как выше написали, нужно видео принципа работы спелла