В общем искал я в инете и не нашел конкретно мой случай, может плохо искал..
Допустим есть глобалка/локалка не важно: GROUP={}
Далее я задаю на id юнита таблицу в таблице(наверное) GROUP[GetHandleId(unit)]={}
По нужде проверяю, если GROUP[GetHandleId(unit)][0]==nil значит создать группу GROUP[GetHandleId(unit)][0]=CreateGroup()
мне нужна еще группа по нужде и так же по нужде удалять таймером пример кода:
local caster_uid=GetHandleId(caster)
local group_index
if GROUP[caster_uid]==nil then
	GROUP[caster_uid]={}
end
if GROUP[caster_uid][0]==nil then
	GROUP[caster_uid]={[0]=CreateGroup()}
	group_index=0
else
	GROUP[caster_uid]={[1]=CreateGroup()}
	group_index=1
end

if BlzGroupGetSize(GROUP[caster_uid][group_index])>0 then
	TimerStart(CreateTimer(),4,false,function()
		DestroyGroup(GROUP[caster_uid][group_index])
		GROUP[caster_uid][group_index]=nil
		DestroyTimer(GetExpiredTimer())
	end)
end
Но когда проверяю другим таймером то , чего то она странно себя ведет, одна группа перебивается другой...Одну из групп показывает как nil
Правильно ли я делаю или тут огромная ошибка ?

Принятый ответ

Я полагаю, надо сравнивать вот так, ибо индексация идёт с 1.
GROUP[GetHandleId(unit)][1] == nil
Ну и нужно вот так присваивать.
GROUP[caster_uid][1] = CreateGroup()
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
5 лет назад
0
Похожие вопросы:

ответ
Хэштаблицы это костыльнй пережиток jass.
На lua можно же и так
a = {
	b = {
		c = {
			d = function()
				print('work')
			end
		}
	}
}
a.b.c.d()
ответ
ScopteRectuS:
Предполагаю, что делается через какой-то цикл перебором всех элементов таблицы, если элемент является функцией, то запустить.
Правильно предполагаете, но мануалы же никому неинтересны, проже же вопрос задать.
test   = { }
test.a = 123
test.b = true
function test.func0()
	print(0)
end
function test.func1()
	print(1)
end
function test.qab()
	print(2)
end

for k, v in pairs(test) do
	if type(v) == 'function' then
		print(k, ':')
		v()
	end
end
ответ
Документацию то для кого пишут?
DATA = {
	Heroes = {}
}
do
	local PickAHero = CreateTrigger()
	for i = 0, 9 do
		TriggerRegisterPlayerUnitEvent(PickAHero, Player(i), EVENT_PLAYER_UNIT_SELECTED)
	end
	TriggerAddAction(PickAHero, function()
		local hero    = GetTriggerUnit()
		local owner   = GetTriggerPlayer()
		local ownerID = GetPlayerId(owner)
		
		if IsUnitType(hero, UNIT_TYPE_HERO) then
			local x = GetPlayerTeam(owner) == 1 and -7271 or 7271
			local y = GetPlayerTeam(owner) == 1 and -55 or 55
			
			PanCameraToTimedForPlayer(owner, x, x, 0)
			SetUnitX(hero, x)
			SetUnitY(hero, y)
			
			SetUnitOwner(hero, owner, true)
			DATA.Heroes[ownerID] = hero
		end
	end)
end

1
28
5 лет назад
Отредактирован PT153
1
Я полагаю, надо сравнивать вот так, ибо индексация идёт с 1.
GROUP[GetHandleId(unit)][1] == nil
Ну и нужно вот так присваивать.
GROUP[caster_uid][1] = CreateGroup()
Принятый ответ
0
8
5 лет назад
0
PT153:
GROUP[caster_uid][1] = CreateGroup()
Спс бро вот это правильно
2
24
5 лет назад
2
PT153, индексация идет с 1 только с точки зрения стандартных функций работы с таблицей-массивом, а при прямом обращении к элементам можно хоть с розового слоника нумерацию начинать. Тут проблема в другом - полностью перезаписывалась таблица когда не было одной из записей в ней.
0
21
5 лет назад
0
А почему все в качестве индекса массива юзают цифры, можно же самого юнита поставить. Или так не стоит делать?
GROUP[unit][0]=CreateGroup()
1
28
5 лет назад
1
ScopteRectuS, я думаю, что можно, ибо сам подобное буду использовать, но нужно помнить об этом и при удалении юнита убирать его из таблицы.
1
24
5 лет назад
Отредактирован prog
1
А почему все в качестве индекса массива юзают цифры
Лично я юзаю хендлы вместо юнитов чтобы не связываться лишний раз со сборщиком мусора и мнением вара о том, когда пора удалять юнита из памяти. Кроме того, это не точно, но вроде числовые ключи работают чуть быстрее объектных, даже если таблица не в режиме массива, а в режиме массива, когда записи идут подряд, без пропусков, числовые ключи гарантированно быстрее строковых и обьектных.
В мультиплеере разногласия со сборщиком мусора могут быть чреваты потенциальным десинком, поэтому перестраховуюсь. А вот в одиночных картах можно не просто юнита в качестве ключа использовать, а еще и перевести таблицу в режим слабых ссылок, чтобы запись полностью удалилась автоматически когда вар решит удалить юнита из памяти. Правда это не факт что произойдет при вашей жизни или при жизни текущей сессии карты, но это уже нюансы.
0
28
5 лет назад
0
prog, если юнит есть, то вар не будет кикать из памяти его. Надо просто чистить удалённых юнитов.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.