Добавлен N1ghtSiren
Чем можно заменить GetFilterUnit() в функции TZZ, чтобы она работала с периодическим таймером?
раскрыть
function Trig_CW_Cast_Conditions takes nothing returns boolean
return ( GetSpellAbilityId() == 'A000' )
endfunction
//Площадь треугольника по координатам
function TriS takes real x1, real y1, real x2, real y2, real x3, real y3 returns real
return RAbsBJ(x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2))/2
endfunction
//Принадлежность точки (x;y) треугольнику (x1;y1);(x2;y2);(x3;y3).
function IsCoordsInTriangle takes real x, real y, real x1, real y1, real x2, real y2, real x3, real y3 returns boolean
return R2I(TriS(x1, y1, x2, y2, x3, y3))==R2I(TriS(x1, y1, x2, y2, x, y)+TriS(x2, y2, x3, y3, x, y)+TriS(x1, y1, x3, y3, x, y))
endfunction
function AddLightningEx2 takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local lightning lg = LoadLightningHandle(udg_Hash,id,1)
call DestroyLightning(lg)
call FlushChildHashtable(udg_Hash,id)
call DestroyTimer(t)
set t = null
set lg = null
endfunction
function AddLightningEx1 takes lightning lg returns nothing
local timer t = CreateTimer()
local integer id = GetHandleId(t)
call SaveLightningHandle(udg_Hash,id,1, lg)
call TimerStart(t,5,false, function AddLightningEx2)
set lg=null
set t =null
endfunction
function TZZ takes nothing returns boolean
local real x1 = GetUnitX(udg_Caster) //координаты кастера, будет одной из точек треугольника
local real y1 = GetUnitY(udg_Caster)
local real from = 1000//точнее отклонение от позиции кастера, нужна для точки взгляда.
local real a = GetUnitFacing(udg_Caster) //угол поворота юнита
local real width = 36 // угол обзора героя будет равен width градусам. Примерно расставляем какой угол будет в градусах
local real angle = width/2 //Половина ширины обзора, от середины, точнее от угла поворота героя.
//диапазон обзора героя от Amin до Amax
local real Amin = a - angle
local real Amax = a + angle
//определяем две оставшиеся крайние точки тругольника
local real x2 = x1 + from * Cos(Amin * bj_DEGTORAD)
local real y2 = y1 + from * Sin(Amin * bj_DEGTORAD)
local real x3 = x1 + from * Cos(Amax * bj_DEGTORAD)
local real y3 = y1 + from * Sin(Amax * bj_DEGTORAD)
// тут и далее -- GetFilterUnit()
local real x = GetUnitX(GetFilterUnit()) //координаты выбранного юнита
local real y = GetUnitY(GetFilterUnit())
//это молнии нужны для видимости границ треугольника, типа попала ли в треугольник. Так они вообще не нужны
set bj_lastCreatedLightning = AddLightningEx("CLPB", true, x1, y1, 0., x2, y2, 0.)
call AddLightningEx1(bj_lastCreatedLightning)
set bj_lastCreatedLightning = AddLightningEx("CLPB", true, x1, y1, 0., x3, y3, 0.)
call AddLightningEx1(bj_lastCreatedLightning)
if IsCoordsInTriangle(x,y,x1,y1,x2,y2,x3,y3) and udg_Caster!= GetFilterUnit() then
call BJDebugMsg(GetUnitName(GetFilterUnit()))
endif
return false
endfunction
function Trig_CW_Cast_Actions takes nothing returns nothing
local unit u = GetTriggerUnit()
local real x1 = GetUnitX(u) //координаты кастера
local real y1 = GetUnitY(u)
local real from = 800
local real a = GetUnitFacing(u) //угол поворота юнита
//local real S = 90 //Ширина угла
//local real angle = S/2 //Половина ширины угла
set udg_Angle = a
set udg_Caster = u
//set udg_X = angle
call BJDebugMsg("Угол поворота при касте: "+ R2S(a))
call GroupEnumUnitsInRange(bj_lastCreatedGroup,x1,y1,from, Condition(function TZZ))
//call ForGroup( bj_lastCreatedGroup, function TZZ )
call GroupClear(bj_lastCreatedGroup)
endfunction
//===========================================================================
function InitTrig_Cast takes nothing returns nothing
set gg_trg_Cast = CreateTrigger( )
set bj_lastCreatedGroup = CreateGroup()
call TriggerRegisterAnyUnitEventBJ( gg_trg_Cast, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Cast, Condition( function Trig_CW_Cast_Conditions ) )
call TriggerAddAction( gg_trg_Cast, function Trig_CW_Cast_Actions )
endfunction
Принятый ответ
Примерно так получилось
function Trig_CW_Cast_Actions takes nothing returns nothing
local unit u = LoadUnitHandle( какая_нибудь_хештаблица, GetHandleId(GetExpiredTimer()), 0 )
local real x1 = GetUnitX( u ) //координаты кастера
local real y1 = GetUnitY( u )
local real from = 800
local real a = GetUnitFacing( u ) //угол поворота юнита
//local real S = 90 //Ширина угла
//local real angle = S/2 //Половина ширины угла
set udg_Angle = a
set udg_Caster = u
//set udg_X = angle
call BJDebugMsg("Угол поворота при касте: "+ R2S(a))
call GroupEnumUnitsInRange(bj_lastCreatedGroup,x1,y1,from, Condition(function TZZ))
//call ForGroup( bj_lastCreatedGroup, function TZZ )
call GroupClear(bj_lastCreatedGroup)
set u = null
endfunction
function TimerOff takes nothing returns nothing
local timer t = GetExpiredTimer()
local timer t2 = LoadTimerHandle( какая_нибудь_хештаблица, GetHandleId(t), 0 )
call FlushChildHashtable( какая_нибудь_хештаблица, GetHandleId(t) )
call FlushChildHashtable( какая_нибудь_хештаблица, GetHandleId(t2) )
call DestroyTimer( t )
call DestroyTimer( t2 )
set t = null
set t2 = null
endfunction
function Timer takes nothing returns nothing
local timer t = CreateTimer()
local timer t2 = CreateTimer()
local unit u = GetTriggerUnit()
call SaveUnitHandle( какая_нибудь_хештаблица, GetHandleId( t ), 0, u )
call TimerStart( t, /*Периодичность*/0.04, true, Trig_CW_Cast_Actions )
call SaveTimerHandle( какая_нибудь_хештаблица, GetHandleId(t2), 0, t )
call TimerStart( t2, /*Время которое будет работать таймер*/36, false, TimerOff )
set t = null
set t2 = null
set u = null
endfunction
//===========================================================================
function InitTrig_Cast takes nothing returns nothing
set gg_trg_Cast = CreateTrigger( )
set bj_lastCreatedGroup = CreateGroup()
call TriggerRegisterAnyUnitEventBJ( gg_trg_Cast, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Cast, Condition( function Trig_CW_Cast_Conditions ) )
call TriggerAddAction( gg_trg_Cast, function Timer )
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован N1ghtSiren
upd:Однако неполучилось, попытался переделать в 2 функции, передавая integer таймера напрямую в функцию.
Где будет периодический таймер и что он должен будет делать?
Отредактирован N1ghtSiren
То - исходник, откуда брал это всё
Отредактирован Hodor
Отредактирован N1ghtSiren
Нет, в FilterUnit должны попадать те, кто попадёт в область взгляда кастера.
Дополнение: не учёл множество юнитов:
UrsaBoss, Кажется я понял...
Озарениеееее....
Отредактирован Hodor
Так мне доделывать или нет?
Отредактирован N1ghtSiren
Доделывать или нет - на ваше усмотрение :d
Отредактирован Hodor