хотя я посмотрел, всё равно заготовку нужно переделывать, ибо локальный триггер то не очищается от событий)
я тупой кусок бездарного говна и лучше бы сдох, как же я ненавижу свою, на локальном триггере лишь одно событие - входа юнита на карту, а регистрация события получения урона приходится на тот же триггер, что и очищается
голова совсем замучена, почему ты меня не поправил?)
function TriggerRegisterEnterRectSimple takes trigger trig, rect r returns event
local region rectRegion = CreateRegion()
call RegionAddRect(rectRegion, r)
return TriggerRegisterEnterRegion(trig, rectRegion, null)
endfunction
EugeAl, ивенты удаляются вместе с триггером, акшона нет, а кондишн в кэше висит. Периодическое удаление сделано с целью очищать триггер от ивентов не существующих юнитов
Случайно наткнулся на заготовку, понравилась. Примерно понимаю , как на jass её переписать.
Но есть вопрос - в функции Regist_3 для убитых юнитов используется удаление их триггеров. Ок, а как быть с утечками event при регистрации событий в функции regist? Event нельзя удалить, к сожалению, а если будет куча юнитов, накопится куча утечек
Простите за некропост, выражаю автору благодарочку за скилл. Переписал через хэш без триггерслипа, прилепил урон и вывел в одну функцию, заменил юнита на эффект (для 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
заготовка
кусок бездарного говна и лучше бы сдох, как же я ненавижу свою, на локальном триггере лишь одно событие - входа юнита на карту, а регистрация события получения урона приходится на тот же триггер, что и очищаетсяголова совсем замучена, почему ты меня не поправил?)
а еще вопрос - зачем сделано создание region вместо просто bj initial playable map rect? Ведь есть событие enter rect, вроде как
Но есть вопрос - в функции Regist_3 для убитых юнитов используется удаление их триггеров. Ок, а как быть с утечками event при регистрации событий в функции regist? Event нельзя удалить, к сожалению, а если будет куча юнитов, накопится куча утечек
движение по безье
Ред. ScorpioT1000
Пример использования: call RocketStrike(caster, x, y, "Abilities\\Weapons\\BansheeMissile\\BansheeMissile.mdl", ammout, dmg, 50., 200., DAMAGE_TYPE_FIRE)
какая-то фигня х4
Confetti