Суть вопроса
Юниты выпускают молнию в свою целевую точку создания способности. Сделал ограничения количества вызова молний одним юнитом поднятием уровня дополнительной способности до 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 кастера )
и как выше написали, нужно видео принципа работы спелла
Библиотека
real GetUnitZ(unit u){
return GetLocationZ(GetUnitLoc(u))+GetUnitFlyHeight(u)
}
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 CL2 = GetUnitY(caster)
local real CL3 = GetUnitZ(caster)
local real UL2 = GetUnitY(ligUnit)
local real UL3 = GetUnitZ(ligUnit)
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
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 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