Чем можно заменить 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
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
6 лет назад
0
Похожие вопросы:

ответ
Ige, да о чем вы говорите. ИМХО, самое оптимальное предложение содержится в 3 комментарии.
И еще тут много лишних функций. Да и просто первый признак jass - отсутствие бж за исключением дебага( хоть мои слова кажется трепом и выпендрежем, но без чистого скрипта на нативах.... )
ответ
Dota_2015, с какого перепугу ATTACK_TYPE_MAGIC урон от заклинаний? у заклинаний тип атаки ATTACK_TYPE_NORMAL, а у тебя это магическая атака волшебниц да прочей шушеры из кампании, наносит 75% урона про героям и доп урон по тяжёлой броне, маг. резистами не режится ибо физический урон от атаки.
У всех заклинаний, да блин даже у долбаных мин гоблина - тип атаки ATTACK_TYPE_NORMAL.
ответ
Про области хз, вот именно их разве не через БД лучше, я же не знаю, как в создаваемой карте они называются - Пещера Тысячи Всхлипов или Пляж Огненных Уток...
Тут просто при входе в область писать ее при событии unit входит в область такую-то, легко же вроде даже на гуи...
А так атака ловится через GetUnitBaseDamage сложить с GetUnitGreenBonusDamage.
Скорость атаки через GetUnitAttackSpeed.
Броня через GetUnitArmor (я, правда, пока не мемхаковской пользуюсь, а другой, влом искать, но опытные мапмейкеры знают, если надо - спросить можно).
хпрег через GetUnitHPRegen + мб БД свое.
Мпрег через GetUnitMPRegen + мб БД свое.
Функции эти все тут github.com/DracoL1ch/WC3Memory/blob/master/war3map.j
По импорту мемхака все тут
Не так уж сложно.
Кому надо, в того мемхак в конце концов входит.

0
17
6 лет назад
Отредактирован N1ghtSiren
0
Появилась одна идея, пойду попробую реализовать
upd:Однако неполучилось, попытался переделать в 2 функции, передавая integer таймера напрямую в функцию.
0
18
6 лет назад
0
Не совсем понял вопрос
Где будет периодический таймер и что он должен будет делать?
0
17
6 лет назад
Отредактирован N1ghtSiren
0
UrsaBoss, Переодический таймер будет смещать взгляд юнита на 10, и выделять попавшие туда цели.
То - исходник, откуда брал это всё
раскрыть
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

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 W2 takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local real degrees = LoadReal(udg_GHT,h,0)
local unit c = LoadUnitHandle(udg_GHT,h,1)
call BJDebugMsg(R2S(degrees))
if degrees <=360 then
call SetUnitFacing(c,degrees)
call SaveReal(udg_GHT,h,0,degrees-10)
local real x1 = GetUnitX(c) //координаты кастера, будет одной из точек треугольника
local real y1 = GetUnitY(c)
local real from = 1000//точнее отклонение от позиции кастера, нужна для точки взгляда.

local real a = degrees //угол поворота юнита
local real width = 10 // угол обзора героя будет равен 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)
call SetRect(rt,x1,t1,x2,y2)
local real x = GetUnitX(GetFilterUnit()) //координаты выбранного юнита
local real y = GetUnitY(GetFilterUnit())
call BJDebugMsg(GetUnitName(GetFilterUnit()))

//это молнии нужны для видимости границ треугольника, типа попала ли в треугольник. Так они вообще не нужны
set bj_lastCreatedLightning = AddLightningEx("CLPB", true, x1, y1, 0., x2, y2, 0.)
call DL(bj_lastCreatedLightning, 0.09)
set bj_lastCreatedLightning = AddLightningEx("CLPB", true, x1, y1, 0., x3, y3, 0.)
call DL(bj_lastCreatedLightning, 0.09)


if IsCoordsInTriangle(x,y,x1,y1,x2,y2,x3,y3) and c!= GetFilterUnit() then
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\Unsummon\\UnsummonTarget.mdl",GetFilterUnit(),"origin"))
call BJDebugMsg(GetUnitName(GetFilterUnit()))
endif

endif

if degrees >=361 then
call FlushChildHashtable(udg_GHT,h)
call DestroyTimer(t)
set t = null
call PauseUnit(c,false)
set c = null
endfunction

function W1 takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer h = GetHandleId(t)
    local unit c = LoadUnitHandle(udg_GHT,h,1)
    call SaveReal(udg_GHT,h,0,360)
    call TimerStart(t,0.1,true,function W2)
    call PauseUnit(c,true)
    set t = null
    set c = null
endfunction
0
18
6 лет назад
Отредактирован Hodor
0
PyCCKuu_4eJl т.е нужно просто вызывать TZZ периодическим таймером, а вместо FilterUnit - юнита которого ты укажешь перед запуском таймера?
0
17
6 лет назад
Отредактирован N1ghtSiren
0
UrsaBoss,
Нет, в FilterUnit должны попадать те, кто попадёт в область взгляда кастера.
Дополнение: не учёл множество юнитов:
раскрыть
...
function W2 takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local real degrees = LoadReal(udg_GHT,h,0)
local unit c = LoadUnitHandle(udg_GHT,h,1)
call BJDebugMsg(R2S(degrees))
if degrees <=360 then
call SetUnitFacing(c,degrees)
call SaveReal(udg_GHT,h,0,degrees-10)
local real x1 = GetUnitX(c) //координаты кастера, будет одной из точек треугольника
local real y1 = GetUnitY(c)
local real from = 1000//точнее отклонение от позиции кастера, нужна для точки взгляда.

local real a = degrees //угол поворота юнита
local real width = 10 // угол обзора героя будет равен 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)
call SetRect(rt,x1,t1,x2,y2)
// тут создаётся группа, и перебираются юниты, что попали в зону видимости
...
1
18
6 лет назад
1
PyCCKuu_4eJl т.е тебе нужно чтобы постоянно работало это, а не при срабатывании EVENT_PLAYER_UNIT_SPELL_EFFECT?
0
17
6 лет назад
0
UrsaBoss, Т.е. мы делаем EVENT_PLAYER_UNIT_SPELL_EFFECT, оно срабатывает несколько раз(36), и после этого выключается
UrsaBoss, Кажется я понял...
Озарениеееее....
1
18
6 лет назад
Отредактирован Hodor
1
PyCCKuu_4eJl:
UrsaBoss, Т.е. мы делаем EVENT_PLAYER_UNIT_SPELL_EFFECT, оно срабатывает несколько раз(36), и после этого выключается
UrsaBoss, Кажется я понял...
Озарениеееее....
блин, а я тут дописываю штуку чтобы в течении 36 секунд с любой периодичность вызывалось Trig_CW_Cast_Actions и юзало того самого кастера
Так мне доделывать или нет?
0
17
6 лет назад
Отредактирован N1ghtSiren
0
UrsaBoss:
блин, а я тут дописываю штуку чтобы в течении 36 секунд с любой периодичность вызывалось Trig_CW_Cast_Actions и юзало того самого кастера
Так мне доделывать или нет?
Прощу прощения за убитое вами время :c
Доделывать или нет - на ваше усмотрение :d
1
18
6 лет назад
Отредактирован Hodor
1
Примерно так получилось
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
Принятый ответ
0
17
6 лет назад
0
UrsaBoss:
Примерно так получилось
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 Trig_CW_Cast_Actions )
endfunction
Благодарю за помощь :3
0
18
6 лет назад
0
PyCCKuu_4eJl ой, я там забыл в действиях триггера указать на функцию с таймерами, уже исправил
Чтобы оставить комментарий, пожалуйста, войдите на сайт.