Вот захотел перевести триггер в код. Получил следующее:
function Trig_TR_F01 takes nothing returns boolean
return ( IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetFilterUnit())) == true )
endfunction
function Trig_TR_Actions takes nothing returns nothing
set udg_Ot = GetUnitsInRangeOfLocMatching(350.00, GetUnitLoc(GetTriggerUnit()), Condition(function Trig_TR_F01))
endfunction
Суть в том, что конвертер создал специальную функцию "Trig_TR_F01" для реализации условия при формировании отряда. Естественно, хочется избавится от этой функции и просто записать условие там, где написано "Condition(function Trig_TR_F01)". Я пытался менять аргумент у функции Condition(), но выдавало ошибку, т.е. её аргументам может быть только функция... Потом пытался полностью заменить аргумент в функции GetUnitsInRangeOfLocMatching() и написать там само условие вместо Condition() - выдал ошибку о несоответствии типов. Вопрос: как сформулировать и записать условие, чтобы избавится от функции "Trig_TR_F01"?

через иф в действие записывать но это не кул
EnergyFrost, не угадал)
и чем тебе функция не нравится?
функция Condition берёт функцию и возвращает условие
native Condition takes code func returns conditionfunc
native TriggerAddCondition takes trigger whichTrigger, boolexpr condition returns triggercondition
а вобще это написано в статье
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
15
Вроде, такая штука есть в cJass. А в jass ее нету
28
через иф в действие записывать но это не кул
EnergyFrost, не угадал)
и чем тебе функция не нравится?
функция Condition берёт функцию и возвращает условие
native Condition takes code func returns conditionfunc
native TriggerAddCondition takes trigger whichTrigger, boolexpr condition returns triggercondition
а вобще это написано в статье
Принятый ответ
24
Если тебе обязательно нужно пользоваться фильтром, то никак, да и нет в этом ничего плохого. Наоборот можно оптимизировать использование boolexpr, создав фильтр один раз и используя его везде, где нужен такой-же фильтр.
Да, кстати, не утечку точки ли это я там вижу? Бороться нужно с тем, что действительно плохо (утечка точки), а не с тем что нужно и естественно ("лишняя" функция), разве что стоит осмысленно ее переименовать.
EnergyFrost, лямбды в cjass делают то-же самое - создают функцию, просто этого не видно в редакторе.
20
prog, вот так будет без утечки?
function Trig_TR_Actions takes nothing returns nothing
local point p
set p = GetUnitLoc(GetTriggerUnit())
set udg_Ot = GetUnitsInRangeOfLocMatching(350.00, p, Condition(function Trig_TR_F01))
call RemoveLocation(p)
set p = null
endfunction
А утечки, связанные с группой, в данном случае ведь не возникают?
28
CaptainFox, есть вариант покруче
юзать координаты и нативки
так быстрее будет работать
и утечек 0
вместо
function Trig_TR_F01 takes nothing returns boolean
return ( IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetFilterUnit())) == true )
endfunction
можно написать
bool Trig_TR_F01(){return IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetFilterUnit())}
20
nvc123, я думал, что речь идёт о том, что утечка вот тут:
function Trig_TR_Actions takes nothing returns nothing
set udg_Ot = GetUnitsInRangeOfLocMatching(350.00, GetUnitLoc(GetTriggerUnit()), Condition(function Trig_TR_F01))
endfunction
В функции, которая задаёт условие тоже утечки что ли? Какие?
27
  1. Не используй BJ нативки. функция GetUnitsInRangeOfLocMatching вызывает утечку, там не обнуляется группа
  2. точка
  3. в функции нету.
  4. Ну если бы ты использовал другую функцию, то тебе потребовалось бы удалить boolexpr
filter =Condition(function Trig_TR_F01)
call DestroyBoolExpr(filter)
а так тебе повезло
20
nvc123, prog, Steal nerves, вы меня хотите окончательно запутать? Один говорит про одно, другой - про другое, третий - про третье.
Steal nerves:
Не используй BJ нативки. функция GetUnitsInRangeOfLocMatching вызывает утечку, там не обнуляется группа
Я думал, что все БЖ-функции содержать в своём названии буквы "BJ". И думал, если функция не содержит букв "BJ", значит - это не бж-функция. Если это не так, то как тогда вообще отличить бж-функцию? Или когда делаешь "конвертировать триггер в код" он использует исключительно бж-функции?
28
в джнгп все бж красным выделены
удалять булексп это бред как и обнуление интов
27
CaptainFox, скачай JNGP., там есть библиотека функции. я так и не понял сам что ты хочешь. Так написано, что ничего не понял
вообще в функции условие (я про фильтр) не утекает, все правильно. nvc123 все написал.
Единственное, что я бы убрал это true, ведь от этого ничего не потеряешь.
И заменил бы GetOwningPlayer(GetTriggerUnit()) на GetTriggerPlayer(), а лучше на глобальную темповую переменную типа игрок.
function Trig_TR_F01 takes nothing returns boolean
return ( IsPlayerEnemy(GetTriggerPlayer(), GetOwningPlayer(GetFilterUnit())) )
endfunction
есть другая функция, более удобная, я больше этой пользуюсь, короче переделал на

function Trig_TR_F01 takes nothing returns boolean
return((IsUnitEnemy(GetFilterUnit(), GetTriggerPlayer()))
endfunction
теперь оптимизирует действие. Отказываемся от точки, и пользуется координатами
function Trig_TR_Actions takes nothing returns nothing
local group g = CreateGroup()
local boolexpr f=Condition(function Trig_TR_F01)
call GroupEnumUnitsInRange(g, GetUnitX(GetTriggerUnit()),GetUnitY(GetTriggerUnit()), 350.00, f)
call DestroyBoolExpr(f)
call DestroyGroup(g)
set g=null
set f=null
endfunction
можно даже отказаться от локалки, так как локалки не всегда хороши. берем варварскую переменную, которая вшита в варе. я взял переменную последняя созданная группа
function Trig_TR_Actions takes nothing returns nothing
local boolexpr f=Condition(function Trig_TR_F01)
set bj_groupLastCreatedDest= CreateGroup()
call GroupEnumUnitsInRange(bj_groupLastCreatedDest, GetUnitX(GetTriggerUnit()),GetUnitY(GetTriggerUnit()), 350.00, f)
call DestroyBoolExpr(f)
call DestroyGroup(bj_groupLastCreatedDest)
set f=null
endfunction
кстати можно и не пересоздавать каждый раз группу, а один раз создать. А просто чисти группу GroupClear(bj_groupLastCreatedDest)
насчет boolexpr говорят что унчтожать их не нужно, так как не утекают они. Я сам не в курсе
28
надо использовать 1 глобальный булексп
его ненадо пересоздавать
бж глобалки плохи тем что их могут переписать так что лучше юзать локальную группу(думаю временная трата 4 байтов оперативы не вызовет сильных лагов)
если подождёшь 3 часа то напишу код
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.