Суть вопроса

Юниты выпускают молнию в свою целевую точку создания способности. Сделал ограничения количества вызова молний одним юнитом поднятием уровня дополнительной способности до 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 секунд оно исчезнет. А как вернутся к этому объекту я не находил инфы.
Этот комментарий удален
4
Получилось двигать каждому своей молнией но координата Z почему-то утекающая . Да и надо подумать над уничтожением молнии при малом количестве маны и нажатой способностью отмены.
Библиотека
real GetUnitZ(unit u){
return GetLocationZ(GetUnitLoc(u))+GetUnitFlyHeight(u)
}
nothing MyFunc(){
unit u1 = GetSpellAbilityUnit() первый юнит
unit u2 = GetSpellTargetUnit() второй юнит

real x1 = GetUnitX(u1)
real y1 = GetUnitY(u1)
real z1 = GetUnitZ(u1)

real x2 = GetUnitX(u2)
real y2 = GetUnitY(u2)
real z2 = GetUnitZ(u2)

real x = x2 - x1
real y = y2 - y1
real z = z2 - z1

real angle_xy = Atan2(y, x) угол в XY
real dist_xy = SquareRoot(x*x + y*y) длина XY

получем угол Z
real angle_z = Atan2(z, dist_xy)
}
Код
2 Действие
function Trig_WaveLight_Actions2 takes nothing returns nothing
local timer timerAct = GetExpiredTimer()
local integer id = GetHandleId(timerAct)
local unit caster = LoadUnitHandle(Hash, id, StringHash("caster"))
local integer id2 = GetHandleId(caster)
local unit ligUnit = LoadUnitHandle(Hash, id2, StringHash("ligUnit"))
local lightning lig = LoadLightningHandle(Hash, id2, StringHash("lig"))
local real process = LoadReal(Hash, id, StringHash("process")) + LoadReal(Hash, id, StringHash("speed"))
local group groupAct
local real M = GetUnitState(caster, UNIT_STATE_MANA)
local unit u = null

if process > LoadReal(Hash, id, StringHash("maxDist")) or M < 2 then
call DestroyGroup(LoadGroupHandle(Hash, id, StringHash("group")))
call KillUnit(ligUnit)
call DestroyLightning(lig)
call FlushChildHashtable(Hash, id)
call PauseTimer(timerAct)
call DestroyTimer(timerAct)
else
call SaveReal(Hash, id, StringHash("process"), process)
call SetUnitState(caster, UNIT_STATE_MANA, GetUnitState(caster, UNIT_STATE_MANA)-2)
local real CL1 = GetUnitX(caster)
local real CL2 = GetUnitY(caster)
local real CL3 = GetUnitZ(caster)
local real UL1 = GetUnitX(ligUnit)
local real UL2 = GetUnitY(ligUnit)
local real UL3 = GetUnitZ(ligUnit)
call MoveLightningEx(lig, true, CL1, CL2, CL3+110, UL1, UL2, UL3)
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))

set groupAct = CreateGroup()
call GroupEnumUnitsInRange(groupAct, GetUnitX(ligUnit), GetUnitY(ligUnit), LoadReal(Hash, id2, StringHash("aoe")), null)
loop
set u = FirstOfGroup(groupAct)
exitwhen u == null
if GetWidgetLife(u) > 0.405 then
if not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) then
if IsUnitEnemy(u, GetOwningPlayer(caster)) then
call UnitDamageTarget(caster, u, LoadReal(Hash, id2, StringHash("damage")), false, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
call DestroyEffect(AddSpecialEffectTarget(LoadStr(Hash, id, StringHash("damageEffect")), u, "origin"))
call GroupAddUnit(LoadGroupHandle(Hash, id2, StringHash("group")), u)
else
endif
endif
endif
call GroupRemoveUnit(groupAct, u)
endloop
call DestroyGroup(groupAct)
endif

set caster = null
set ligUnit = null
set timerAct = null
set groupAct = null
endfunction
1 Действие
function Trig_WaveLight_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local integer id2 = GetHandleId(caster)
Создание молнии
if ( GetUnitAbilityLevel(caster , 'A032') == 1 ) then
local unit ligUnit = CreateUnitAtLoc(GetOwningPlayer(caster),'h00N', GetUnitLoc(caster), 270 )
local real xCaster = GetUnitX(ligUnit)
local real yCaster = GetUnitY(ligUnit)
local real xLigUnit = GetUnitX(ligUnit)
local real yLigUnit = GetUnitY(ligUnit)

local real xTarget = GetSpellTargetX()
local real yTarget = GetSpellTargetY()
local real angle = bj_RADTODEG * Atan2(yTarget - yCaster, xTarget - xCaster)
local real dx = xTarget - xCaster
local real dy = yTarget - yCaster

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 integer level = GetUnitAbilityLevel(caster, 'A000')
local real maxDist = SquareRoot(dx * dx + dy * dy)
local real damage = 5 GetHeroStr(caster, true) * 3
local real speed = 1700
local real aoe = 300

local string damageEffect = "Abilities\\Weapons\\Bolt\\BoltImpact.mdl"

local timer timerAct = CreateTimer()
local integer id = GetHandleId(timerAct)
local timer timerAct3 = CreateTimer()
local integer id3 = GetHandleId(timerAct3)

call SaveUnitHandle(Hash, id, StringHash("caster"), caster)
call SaveUnitHandle(Hash, id2, StringHash("ligUnit"), ligUnit)
call SaveLightningHandle(Hash, id2, StringHash("lig"), lig)
call SaveLocationHandle(Hash, id2, StringHash("CL"), CL)
call SaveLocationHandle(Hash, id2, StringHash("UL"), UL)

call SaveReal(Hash, id2, StringHash("aoe"), aoe)
call SaveReal(Hash, id2, StringHash("damage"), damage)
call SaveReal(Hash, id, StringHash("maxDist"), maxDist)
call SaveReal(Hash, id, StringHash("angle"), angle)
call SaveReal(Hash, id, StringHash("speed"), speed * 0.03)
call SaveStr(Hash, id, StringHash("damageEffect"), damageEffect)

call SaveReal(Hash, id, StringHash("process"), 0)
call SaveGroupHandle(Hash, id, StringHash("group"), CreateGroup())

call IncUnitAbilityLevel(caster, 'A032')

call TimerStart(timerAct, 0.03, true, function Trig_WaveLight_Actions2)
set caster = null
set ligUnit = null
set timerAct = null
Передвижение молнии
else
local unit ligUnit = LoadUnitHandle(Hash, id2, StringHash("ligUnit"))
local real xCaster = GetUnitX(ligUnit)
local real yCaster = GetUnitY(ligUnit)

local real xTarget = GetSpellTargetX()
local real yTarget = GetSpellTargetY()
local real angle = bj_RADTODEG * Atan2(yTarget - yCaster, xTarget - xCaster)
local real dx = xTarget - xCaster
local real dy = yTarget - yCaster

local lightning Lig = LoadLightningHandle(Hash, id2, StringHash("Lig"))

local integer level = GetUnitAbilityLevel(caster, 'A030')
local real maxDist = SquareRoot(dx * dx + dy * dy)
local real damage = 50 + GetHeroStr(caster, true) * 3
local real speed = 700

local string damageEffect = "Abilities\\Weapons\\Bolt\\BoltImpact.mdl"

local timer timerAct = CreateTimer()
local integer id = GetHandleId(timerAct)

call SaveUnitHandle(Hash, id, StringHash("caster"), caster)

call SaveReal(Hash, id, StringHash("damage"), damage)
call SaveReal(Hash, id, StringHash("maxDist"), maxDist)
call SaveReal(Hash, id, StringHash("angle"), angle)
call SaveReal(Hash, id, StringHash("speed"), speed * 0.03)

call SaveStr(Hash, id, StringHash("damageEffect"), damageEffect)

call SaveReal(Hash, id, StringHash("process"), 0)
call SaveGroupHandle(Hash, id, StringHash("group"), CreateGroup())

call TimerStart(timerAct, 0.03, true, function Trig_WaveLight_Actions2)
set caster = null
set ligUnit = null
set timerAct = null
endif


endfunction
Применяемая способность
function Trig_WaveLight_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A030'
endfunction
Событие
function InitTrig_WaveLight takes nothing returns nothing
set gg_trg_WaveLight = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_WaveLight, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_WaveLight, Condition( function Trig_WaveLight_Conditions ) )
call TriggerAddAction( gg_trg_WaveLight, function Trig_WaveLight_Actions )
endfunction
Чтобы оставить комментарий, пожалуйста, войдите на сайт.