в карте используется ht для сохранения данных по id юнита
call SaveInteger(ht,GetHandleId(u),1,999)
call LoadInteger(ht,GetHandleId(u),1)
но проблема в том, что варкрафт при создании и удалении юнитов им присваивает не уникальный GetHandleId
то есть при удалении старого юнита и создании нового есть вероятность назначения GetHandleId от старого удалённого юнита - новому юниту
от чего естественно летит вся ht, т.к. новым юнитам присвоены в ней уже какие-то значения
как это обходить?
1. как создавать новых юнитов с уникальным GetHandleId ? (конечно удаляя некоторых старых)
2.1. или надо заморачиваться с обнулением значения для GetHandleId(u) в ht перед удалением каждого юнита?
2.2. или надо заморачиваться с обнулением значения для GetHandleId(u) в ht после создания каждого юнита?
call FlushChildHashtable(ht,GetHandleId(u))
3. или надо периодически обнулять всю ht и заполнять заново? (разве нет команды очищения ht? только через пересоздание?)
call FlushParentHashtable(ht)
set ht=InitHashtable()
`
ОЖИДАНИЕ РЕКЛАМЫ...
30
но проблема в том, что варкрафт при создании и удалении юнитов им присваивает не уникальный GetHandleId
В каждый момент времени GetHandleId уникален, все вопросы к криворукой работе с хт.

Ну и не забыть про отсутствие события на окончание разложения. Посему, если в карте нет воскрешения, то можно просто юзать FlushChildHashtable.
18
от чего естественно летит вся ht,
При удалении юнита должны чистится все данные в ht которые с ним связаны, иначе это ведет к засорению памяти, лагам и крашу

или надо периодически обнулять всю ht и заполнять заново? (разве нет команды очищения ht? только через пересоздание?)
Инициировать хеш-таблицу (InitHashtable()) насколько мне известно можно только 255 раз. Чтобы работать с пересоздаваемыми хеш-таблицами на jass нужно писать свою систему, типа такой xgm.guru/p/wc3/hashtable8000
6
Если не хочешь чистить полностью родительский ключ, можно использовать функцию RemoveSavedHandle, при смерти юнита. Тут нужно хотя бы узнать что именно ты делаешь с юнитами, чтобы точно подсказать как лучше тебе поступить. Например, после конца способности, ты обязан чистить хештаблицу через FlushChildHashtable, тк эти данные тебе больше не нужны.
30
Например, после конца способности, ты обязан чистить хештаблицу через FlushChildHashtable, тк эти данные тебе больше не нужны.
Правда? Это к любой способности применимо?
4
я бы завел массив и привязал бы к GetHandleId а дальше очищать Хэш таблицу оперируя уже массивом, в любой момент можно очищать Индекс массива или перезаписать его не волнуясь что какой-то хэндл гдето сохранил под этот хэндл чтото
30
я бы завел массив и привязал бы к GetHandleId
Каким образом?
4
я бы завел массив и привязал бы к GetHandleId
Каким образом?
в массиве задал бы значения для проверки а по GetHandleId вычислял если оно нужное, а дальше другим массивом подгружал бы значения из GetHandleId
опять же с проверкой если оно нужное и так везде где это нужно потом смело можно освободить Хэндл
тоже столкнулся с таким, поэтому храню значения через StringHash и подгружаю там где мне нужно. Полет нормальный

вот пример
call SaveBoolean(H,StringHash((I2S((GetHandleId((O)))) )),StringHash(("Y")), (true))
if (LoadBoolean(H,StringHash((I2S((GetHandleId((O)))) )),StringHash(("Y")))) == GetHandleId((O)) then// если Хэндл юнита совпадает
set Mas[1] = 1 //массиву присваиваем значения и дальше оперируем непосредственно с массивом
endif

//StringHash((I2S((GetHandleId((O41904)))) )) сохраняется под значением StringHash и дополнительно под Хэндл
18
//StringHash((I2S((GetHandleId((O41904)))) )) сохраняется под значением StringHash и дополнительно под Хэндл
Почему просто не использовать GetHandleId(...) вместо StringHash(I2S(GetHandleId(...))) ?
Чтобы оставить комментарий, пожалуйста, войдите на сайт.