в карте используется 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()
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
29
5 месяцев назад
Отредактирован nazarpunk
1
но проблема в том, что варкрафт при создании и удалении юнитов им присваивает не уникальный GetHandleId
В каждый момент времени GetHandleId уникален, все вопросы к криворукой работе с хт.

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

или надо периодически обнулять всю ht и заполнять заново? (разве нет команды очищения ht? только через пересоздание?)
Инициировать хеш-таблицу (InitHashtable()) насколько мне известно можно только 255 раз. Чтобы работать с пересоздаваемыми хеш-таблицами на jass нужно писать свою систему, типа такой xgm.guru/p/wc3/hashtable8000
2
6
5 месяцев назад
2
Если не хочешь чистить полностью родительский ключ, можно использовать функцию RemoveSavedHandle, при смерти юнита. Тут нужно хотя бы узнать что именно ты делаешь с юнитами, чтобы точно подсказать как лучше тебе поступить. Например, после конца способности, ты обязан чистить хештаблицу через FlushChildHashtable, тк эти данные тебе больше не нужны.
1
29
5 месяцев назад
1
Например, после конца способности, ты обязан чистить хештаблицу через FlushChildHashtable, тк эти данные тебе больше не нужны.
Правда? Это к любой способности применимо?
1
2
5 месяцев назад
1
я бы завел массив и привязал бы к GetHandleId а дальше очищать Хэш таблицу оперируя уже массивом, в любой момент можно очищать Индекс массива или перезаписать его не волнуясь что какой-то хэндл гдето сохранил под этот хэндл чтото
1
29
5 месяцев назад
1
я бы завел массив и привязал бы к GetHandleId
Каким образом?
1
2
5 месяцев назад
Отредактирован Emafusail
1
я бы завел массив и привязал бы к 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 и дополнительно под Хэндл
1
18
4 месяца назад
1
//StringHash((I2S((GetHandleId((O41904)))) )) сохраняется под значением StringHash и дополнительно под Хэндл
Почему просто не использовать GetHandleId(...) вместо StringHash(I2S(GetHandleId(...))) ?
Чтобы оставить комментарий, пожалуйста, войдите на сайт.