Добавлен CaptainFox
Вот захотел перевести триггер в код. Получил следующее:
function Trig_TR_F01 takes nothing returns boolean
return ( IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetFilterUnit())) == true )
endfunctionfunction 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 берёт функцию и возвращает условие
EnergyFrost, не угадал)
и чем тебе функция не нравится?
функция Condition берёт функцию и возвращает условие
native Condition takes code func returns conditionfunc
native TriggerAddCondition takes trigger whichTrigger, boolexpr condition returns triggercondition
а вобще это написано в статье
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован nvc123
EnergyFrost, не угадал)
и чем тебе функция не нравится?
функция Condition берёт функцию и возвращает условие
Отредактирован prog
Отредактирован CaptainFox
юзать координаты и нативки
так быстрее будет работать
и утечек 0
вместо
call DestroyBoolExpr(filter)
Steal nerves:
удалять булексп это бред как и обнуление интов
Отредактирован MpW
Единственное, что я бы убрал это true, ведь от этого ничего не потеряешь.
И заменил бы GetOwningPlayer(GetTriggerUnit()) на GetTriggerPlayer(), а лучше на глобальную темповую переменную типа игрок.
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
можно даже отказаться от локалки, так как локалки не всегда хороши. берем варварскую переменную, которая вшита в варе. я взял переменную последняя созданная группа
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
его ненадо пересоздавать
бж глобалки плохи тем что их могут переписать так что лучше юзать локальную группу(думаю временная трата 4 байтов оперативы не вызовет сильных лагов)
если подождёшь 3 часа то напишу код
Отредактирован MpW
короче я такие глобалки использую обычно для мгновенных операции, как сейчас.
Отредактирован nvc123
так что лучше подстраховаться
CaptainFox,