Добавлен
Собственно такой вопрос. Если сделать
GroupEnumUnitsInRange(group,500,500,500,Condition(function() )
то Condition удаляется или создает утечку ? или все таки лучше делать
b=Condition(function() )
GroupEnumUnitsInRange(group,500,500,500,b)
DestroyBoolexpr(b)
просто заметил, что внутри condition можно из первого примера использовать все локалки в триггере и это очень круто, что не скажешь про второй вариант, пытался давать функции обьекты и они не передавались а сама функция работала
b=Condition(function(object) )
GroupEnumUnitsInRange(group,500,500,500,b(object))
Или все таки лучше использовать глобалки и без них никак ? Просто волнует вопрос по поводу, что если одну глобалку использовать на группу для множества игроков, То не будет ли глобалка перебиваться вечно разными игроками и в конце концов будет ссылаться на других игроков, или там какая то шляпа, что такого не будет ? Вот что то типа этого. Просто хотелось бы создать кондишн 1 раз занести его в глобалку и использовать постоянно, но не будет ли вечено перебивать игроков ? Просто если даже создать локально то уже все локалки не могут быть использованы в групенум....
B=Condition(function())
	P=GetFilter()
	if P==PLAYER then
	
	end 
end)

function()
	PLAYER=GetTriggerPlayer()
	GroupEnumUnitsInRange(group,500,500,500,B)
end
Надеюсь понятно.

Чтоб не мучиться, обойдитесь вообще без фильтров:
GROUP = CreateGroup() -- Глобальная группа, чтоб не создавать каждый раз.

-- в самом триггере
GroupEnumUnitsInRange(GROUP, x, y, range, nil)
local target ---@type unit
while true do
	target = FirstOfGroup(GROUP)
	if target == nil then break end -- выходим из цикла при пустой группе
	
	if UnitAlive(target) then -- условия для перебора
		KillUnit(target) -- действия для перебора
	end
	
	GroupRemoveUnit(GROUP, target)
end
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
30
К сожалению, на данный момент на нативное кеширование фильтров и кондишнов при использовании луа полагаться нельзя
Тогда нужно отказываться от фильтров и не гадать, что там близы намудрили.
24
NazarPunk, отказываться есть смысл тольо от использования анонимных функций в фильтрах - один раз записать фильтр в переменную и использовать никто не мешает.
32
NazarPunk, нужно отказыватся от луа и 1.31 до рефорджа и устранения всех проблем, то завтра близзарды сделают патч на котором будет утекать все и фаталить мили карты через 15 минут игры, будем как в том анекдоте, плакать, колоться и есть кактус?
28
фильтры не текут
В Lua текут, в JASS нет, выясняли уже.
И лучше заносить фильтры в глобалки, тогда они доступны везде, даже до место определения фильтра. А вместо Condition советую использовать Filter, букв меньше.
8
PT153:
фильтры не текут
В Lua текут, в JASS нет, выясняли уже.
И лучше заносить фильтры в глобалки, тогда они доступны везде, даже до место определения фильтра. А вместо Condition советую использовать Filter, букв меньше.
Все конечно хорошо, но если Filter(function()) будет занесена глобалку,вне триггера, то использовать локалки триггера в фильтре уже не возможно и нужно нужное заносить в глобалки. А если допустим таймер каждые 0.05 сек вызывает группу, то если все локалки будут заменены глобалками и использованы в глобальном фильтре, не будет ли фарша, когда глобалка перебивается другим игроком вызвавшим таймер, вот к примеру
P=nil

F=Filter(function())
	local f=GetFilterUnit()
	if IsUnitAlly(f,P) then
		какой то код
	end
end)

function TRG()
	local ab=GetSpellAbilityId()
	local u=GetTriggerUnit()

	if ab==A000 then
		local t=CreateTimer()
		SavePlayerHandle(hash,GetHandleId(t),0,GetOwningPlayer(u))
		TimerStart(,0.05,true,function()
			local t=GetExpiredTimer()
			local p=LoadPH(hash,GetHandleId(t),0)
			local g=CreateGroup()
			P=p
			GroupEnumUnitsInRange(group,500,500,500,F)
			DestroyGroup(g)
			if какое то условие then
				DestroyTimer(t)
				Flush....
			end
	end)
	
end
28
не будет ли фарша, когда глобалка перебивается другим игроком вызвавшим таймер, вот к примеру
Не будет, на этом построен vJass.
А так да, при занесении в глобалку фильтр пне может быть кложуром.
Можно так, но тут снова каждый раз будет создаваться новый объект.
function u (p, id)
    B = Condition(function()
	    if p == GetOwningPlayer(GetFilterUnit()) and id == GetUnitId(GetFilterUnit()) then

	    end
    end)

	GroupEnumUnitsInRange(group, 500, 500, 500, B)
end
А ещё в фильтрах групп работает всякие GetTriggerUnit и так далее, их даже передавать не надо.
24
Castiel, выбор стоит или глобалки или утечки. Если грамотно все сделать - проблем с передачей данных через глобалки не будет, пример выше в комментариях... И, кстати, варовские хештаблицы не нужны в Lua.
8
кложуром
Я так понял единственный по ходу способ это через цикл...Что же лучше и быстрее перебирать через фильтр или через цикл ?
Просто мне очень понравилось, что GroupEnumUnitsInRange(group,500,500,500,Condition(function() ) может использовать все локалки триггера, это очень круто и удобно, другими способами заносить лишь в глобалки игроков и другие нужные данные, которые будут использоваться на группе...
prog:
Castiel, выбор стоит или глобалки или утечки. Если грамотно все сделать - проблем с передачей данных через глобалки не будет, пример выше в комментариях... И, кстати, варовские хештаблицы не нужны в Lua.
По подробней про ненадобность хеш таблицы ? Можно глобалку сделать GLOBAL[GetHanldeId(T)] ? А если там номер ключ 5782857? ничего страшного ?
28
Castiel, как я уже сказал, можно даже ничего не передавать, а использовать GetTriggerUnit и прочее в самом фильтре. Можно передавать глобалками (или через таблицы Lua), тоже будет верно.
Циклом будет быстрее, удобнее и порой надёжнее, если операции внутри цикла короткие. Лично я фильтр использую там, где операции долгие, так как фильтр создаёт поток на каждого юнита.
8
PT153:
Castiel, как я уже сказал, можно даже ничего не передавать, а использовать GetTriggerUnit и прочее в самом фильтре. Можно передавать глобалками (или через таблицы Lua), тоже будет верно.
Циклом будет быстрее, удобнее и порой надёжнее, если операции внутри цикла короткие. Лично я фильтр использую там, где операции долгие, так как фильтр создаёт поток на каждого юнита.
Спасибо бро!
28
или утечки
По идее, уничтожение булэкспры должно помогать.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.