Простите за некропост, выражаю автору благодарочку за скилл. Переписал через хэш без триггерслипа, прилепил урон и вывел в одну функцию, заменил юнита на эффект (для UjPI)
Пример использования: call RocketStrike(caster, x, y, "Abilities\\Weapons\\BansheeMissile\\BansheeMissile.mdl", ammout, dmg, 50., 200., DAMAGE_TYPE_FIRE)
код
// проверка способности
function Trig_MilionGhost_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A026'
endfunction
//движение
function MilionGhostMove takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local unit GT = LoadUnitHandle(hash, h, 1)
local effect eff = LoadEffectHandle(hash, h, 2)
local real startx = LoadReal(hash, h, 3)
local real starty = LoadReal(hash, h, 4)
local real startz = LoadReal(hash, h, 5)
local real midx = LoadReal(hash, h, 6)
local real midy = LoadReal(hash, h, 7)
local real midz = LoadReal(hash, h, 8)
local real endx = LoadReal(hash, h, 9)
local real endy = LoadReal(hash, h, 10)
local real endz = LoadReal(hash, h, 11)
local real time = LoadReal(hash, h, 12)
local real maxTime = LoadReal(hash, h, 13)
local real x
local real y
local real z
local real dmg = LoadReal(hash, h, 14)
local real rng = LoadReal(hash, h, 15)
local group g
local unit un
local damagetype dmgtype = LoadDamageTypeHandle(hash, h, 16)
//-------------
set x = startx + ( ( 2.00 * ( midx - startx ) ) + ( startx - 2.00 * midx + endx ) * time ) * time
set y = starty + ( ( 2.00 * ( midy - starty ) ) + ( starty - 2.00 * midy + endy ) * time ) * time
set z = startz + ( ( 2.00 * ( midz - startz ) ) + ( startz - 2.00 * midz + endz ) * time ) * time
//-------------
call SetSpecialEffectX(eff, x)
call SetSpecialEffectY(eff, y)
call SetSpecialEffectZ(eff, z - GetAxisZ(x, y))
set time = time + 0.025 / maxTime
//-------------
if time >= 1.00 then
call DestroyEffect(eff)
call FlushChildHashtable(hash, h)
call DestroyTimer(t)
// наносим урон
//---------------------------
set g = CreateGroup()
call GroupEnumUnitsInRange(g, x, y, rng, null)
loop
set un = FirstOfGroup(g)
exitwhen un == null
if IsUnitEnemy(un, GetOwningPlayer(GT)) and not IsUnitType(un, UNIT_TYPE_DEAD) and not IsUnitType(un, UNIT_TYPE_STRUCTURE) then
call UnitDamageTarget(GT, un, dmg, true, false, ATTACK_TYPE_NORMAL, dmgtype, WEAPON_TYPE_WHOKNOWS)
//call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\ManaFlare\\ManaFlareBoltImpact.mdl", un , "orign"))
endif
call GroupRemoveUnit(g, un)
endloop
call DestroyGroup(g)
//----------------------------
else
call SaveReal(hash, h, 12, time)
endif
//-------------
set g = null
set un = null
set eff = null
set GT = null
set t = null
set dmgtype = null
endfunction
// создание эффектов
function MilionGhostCreate takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local unit GT = LoadUnitHandle(hash, h, 1)
local integer AmountRocket = LoadInteger(hash, h, 2)
local real x = LoadReal(hash, h, 3) // центр конечной области
local real y = LoadReal(hash, h, 4)// центр конечной области
local timer t1
local integer h1
local effect eff
local real xstart = GetUnitX(GT)
local real ystart = GetUnitY(GT)
local real zstart = GetAxisZ(xstart, ystart) + 50
local real xend //конечная точка способности
local real yend //конечная точка способности
local real zend //конечная точка способности
local real angle
local real distance
local real midx // средняя точка способности
local real midy // средняя точка способности
local real midz // средняя точка способности
local real time
local real maxtime
local real Scatter = LoadReal(hash, h, 8)
local damagetype dmgtype = LoadDamageTypeHandle(hash, h, 9)
//-------------
if AmountRocket > 0 then
call SaveInteger(hash, h, 2, AmountRocket-1)
set t1 = CreateTimer()
set h1 = GetHandleId(t1)
//---------
set eff = AddSpecialEffect(LoadStr(hash, h, 5), xstart, ystart)
call SetSpecialEffectZ(eff, zstart)
//высчитываем начало и конец
set xend = x + GetRandomReal( -Scatter, Scatter ) * Cos( GetRandomReal( 0.00, 360.00 ) * bj_DEGTORAD )
set yend = y + GetRandomReal( -Scatter, Scatter ) * Sin( GetRandomReal( 0.00, 360.00 ) * bj_DEGTORAD )
set zend = GetAxisZ(xend, yend)
set angle = Atan2( yend - ystart, xend - xstart )
set distance = SquareRoot( ( xend - xstart ) * ( xend - xstart ) + ( yend - ystart ) * ( yend - ystart ) )
//высчитываем середину
set midx = xstart + ( distance / 2 ) * Cos( angle + GetRandomReal( -90.00, 90.00 ) * bj_DEGTORAD )
set midy = ystart + ( distance / 2 ) * Sin( angle + GetRandomReal( -90.00, 90.00 ) * bj_DEGTORAD )
set midz = GetAxisZ( midx, midy )
// проверка на высоты
if zstart < zend then
set midz = midz + zend
else
set midz = midz + zstart
endif
set midz = midz + distance
// время
set time = 0
set maxtime = distance * ( 0.025 / 10.00 )
// всё сохраняем
call SaveUnitHandle(hash, h1, 1, GT)
call SaveEffectHandle(hash, h1, 2, eff)
call SaveReal(hash, h1, 3, xstart)
call SaveReal(hash, h1, 4, ystart)
call SaveReal(hash, h1, 5, zstart)
call SaveReal(hash, h1, 6, midx)
call SaveReal(hash, h1, 7, midy)
call SaveReal(hash, h1, 8, midz)
call SaveReal(hash, h1, 9, xend)
call SaveReal(hash, h1, 10, yend)
call SaveReal(hash, h1, 11, zend)
call SaveReal(hash, h1, 12, time)
call SaveReal(hash, h1, 13, maxtime)
call SaveReal(hash, h1, 14, LoadReal(hash, h, 6))
call SaveReal(hash, h1, 15, LoadReal(hash, h, 7))
call SaveDamageTypeHandle(hash, h1, 16, dmgtype)
//стартуем
call TimerStart( t1, 0.025, true, function MilionGhostMove )
//---------
else
call FlushChildHashtable(hash, h)
call DestroyTimer(t)
endif
//-------------
set eff = null
set t1 = null
set GT = null
set t = null
set dmgtype = null
endfunction
// функция ракетной атаки
function RocketStrike takes unit GT, real x, real y, string RocketEff, integer AmountRocket, real RocketDmg, real RocketScatter1, real RocketScatterMax, damagetype dmgtype returns nothing
local timer t = CreateTimer()
local integer h = GetHandleId(t)
//-------------------
call SaveUnitHandle(hash, h, 1,GT)
call SaveInteger(hash, h, 2, AmountRocket)
call SaveReal(hash, h, 3, x)
call SaveReal(hash, h, 4, y)
call SaveStr(hash, h, 5, RocketEff)
call SaveReal(hash, h, 6, RocketDmg)
call SaveReal(hash, h, 7, RocketScatter1)
call SaveReal(hash, h, 8, RocketScatterMax)
call SaveDamageTypeHandle(hash, h, 9, dmgtype)
call TimerStart(t, 0.1, true, function MilionGhostCreate)
//-------------------
set t = null
endfunction
// основная функция
function Trig_MilionGhost_Actions takes nothing returns nothing
local unit GT = GetTriggerUnit()
local real x = GetSpellTargetX( )
local real y = GetSpellTargetY( )
local real dmg = 50.
local integer kol = 10
//-------------
call RocketStrike(GT, x, y, "Abilities\\Weapons\\BansheeMissile\\BansheeMissile.mdl", kol, dmg, 50., 200., DAMAGE_TYPE_FIRE)
//-------------
set GT = null
endfunction
//===========================================================================
function InitTrig_MilionGhost takes nothing returns nothing
set gg_trg_MilionGhost = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_MilionGhost, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_MilionGhost, Condition( function Trig_MilionGhost_Conditions ) )
call TriggerAddAction( gg_trg_MilionGhost, function Trig_MilionGhost_Actions )
endfunction
МрачныйВорон, это навоз, такое говно только я могу высрать)
я и искал алгоритм, это можно по комментариям в коде видеть)
вот основные ссылки которыми я пользовался
Комментарии проекта Блог им. rsfghd
движение по безье
Пример использования: call RocketStrike(caster, x, y, "Abilities\\Weapons\\BansheeMissile\\BansheeMissile.mdl", ammout, dmg, 50., 200., DAMAGE_TYPE_FIRE)
какая-то фигня х4
Confetti
навоз
Ред. Градоначальник
я и искал алгоритм, это можно по комментариям в коде видеть)
вот основные ссылки которыми я пользовался
Ред. MpW