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

function Trig_TR_Actions takes nothing returns nothing
GroupClear(udg_Ot)
GroupEnumUnitsInRange(udg_Ot,GetUnitX(GetTriggerUnit()),GetUnitY(GetTriggerUnit()),350.00,abc)
endfunction
Steal nerves, кстати necris будешь доделывать?
Чтобы оставить комментарий, пожалуйста, войдите на сайт.