Привязываю к юниту что-то через хеш-таблицу, например:
	call SaveInteger( hashtable, GetHandleId( whichUnit ), 0, integer )
Но привязываю, только, если ранее к этому юниту не привязывалось, то есть:
	if not HaveSavedInteger( hashtable, GetHandleId( whichUnit ), 0 ) then
		call SaveInteger( hashtable, GetHandleId( whichUnit ), 0, integer )
	endif
Так вот, проблема вот в чем: на карте создаётся огромное количество юнитов и к ним крепятся данные, как написано выше. Эти юниты удаляются после смерти и их хендл освобождается, для другого нового созданного юнита. И в итоге, я к юниту не могу что-либо крепить, потому что проверка выдаёт, что в хеш-таблице по данному ключу уже что-то сохранено, потому что новый юнит занял хендл старого юнита. Как это обойти?

вариант №1 - не нулить переменные, оставляя утечки номеров хендлов. это безопасно, да, если знаешь, что делаешь.
№2 - ловить UNIT_DEATH и чистить за ним
`
ОЖИДАНИЕ РЕКЛАМЫ...
21
Ige, а как же (unit == null) ?
pro100master, я думаю, это не сработает. Т.к. юнит покинет игровую карту только тогда, когда он плоностью разложится (а если труп разлагается полностью - игра его удаляет). Соответственно когда заюзаешь функцию получения юнита, покунувшего регион, игра вернет null.
28
есть ещё 1 способ
атачить через юзер дату и не юзать хэндлы
21
nvc123, тут в примере я просто указал тип интегер, на самом деле используются другие типы.
29
Делаешь структуру со своими данными и пихаешь структуру в юзердату.
28
nvc123, а какая разница какой тип?
всеравно, как доц сказал, через структуру атачишь
иначе могут быть конфликты
а так одна система атача и через неё работает всё остальное
22
я делаю так всегда если юнит вошел в регион карта, то увеличивает индификатор +1 и присвоит массив юнит, каждый созданый 128 раз юнитов, начинаю делать цикл на проверку массива если был удален то номер юнита через структур данные так как можно обрашать структуру как DataUnit(индификатор юнит)
21
Doc, не это не подходит. Я же сказал , что создаётся огромное количество юнитов, а в структуре 8192 по-моему только юнитов можно будет сохранить. если я правильно понял реализацию.
22
ScopteRectuS, 8000 это много зачем вам столько, макс в сражении во всех картах видел максимум 1к а ты хочеш 8к
21
pro100master, у меня юниты создаются каждые 0.16 секунд, и примерно с такой же скоростью дохнут...
22
ScopteRectuS, ты пойми тем больше юнитов то невозможно контрить игру и все ливнут в 1 очередь
21
pro100master, сил противодействующей стороны достаточно, чтобы сдержать такой натиск противников. Да и карту я делаю только для себя. Просто нравится копашится в редакторе карт.
28
ScopteRectuS, 8192 одновременно
если они дохнут то структуру нужно удалять
8192 юнитов одновременно игра всеравно не потянет
а чем тебе кстати не нравится вариант с очисткой хэша?
вызывай FlushChildHashtable(hashtable, GetHandleId( whichUnit )) при создании юнита
а потом пиши туда данные
всеравно если раньше там чтото и хранилось то новые данные это перезапишут
21
ScopteRectuS:
biridius, нашел еще такую функцию:
	native RemoveSavedInteger takes hashtable table, integer parentKey, integer childKey returns nothing
думаю, она идеально сюда подходит.
nvc123, здесь я уже нашел решение. Но так как здесь продолжили отвечать, я читал, и думал, что могут подсказать решение по-лучше. И действительно, годных ответов было много.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.