Нет никакой проблемы в том, чтобы работать сразу с 255 таблицами, почему бы и нет. Сам принцип хранения ключей подразумевает возможность того, что данные смешаются, а также чем жирнее таблица, тем больше время доступа (не проверял, чисто на слово верю кому-то из далекого прошлого). У меня 21 хт используется, не жалуюсь.
Данные смешаются == хеш ключа совпадет.
Leo: Jass hashtables don't hash anything at all hahaha. Well, they are hashtables, but a hashtable is supposed to have a hash function, which will return a unique value for each key you pass it, to avoid collisions. For example, object data is stored in hashtables as well, and the hash function is that IntegerHash function from my code.
Me - heh you mean their naming is misleading, I see
Leo - I wouldn't say misleading, usually a hashtable is an array of linked lists, which is exactly what the jass hashtable does. But the difference is that it doesn't use any hashing function, it just takes the value directly, extracts the last 3 or 4 bits, and uses that as an array index. Make a search on how hashtables work and you will understand. It's pretty much a standard c++ hashtable, an array of linked lists. It takes the key value, extracts the last bits, and uses that as the array index, and then starts iterating the linked list at that key.
Me - ok got it, I thought at first there are collisions between a keys with similar bytes
Leo - there are, but a hashtable usually has a hashing function associated to return unique values for every different key, thus avoiding collisions. But JASS hashtables don't have any hash function
Me - so we have collisions much more often than supposed to?
Leo - yes
по крайней мере из globals инициализация InitHashtable идет до начала загрузки. Ну а лимит реализован просто - однажды у тебя будет 255 вызовов InitHashtable и после этого новые создаваться не будут.
Забавный факт - хештаблица генерируется в момент выделения карты в лобби, а не при загрузке или исполнении скрипта. Точнее, сперва при проверке синтаксиса, а затем - когда жмется "старт". А обычный скрипт выполняется примерно после середины полосы загрузки.
Но вообще да, в движке жестко указано 255 таблиц максимум, дальше InitHashtable просто не сработают.
создаешь объект, спрашиваешь, какой у него handle
если меньше 0x100000 - беспокоиться не о чем, он локальный и сам разрушится, если не помешаешь ссылками на него (да и то не факт, что это влияет для них). тем паче, что даже в нативке указывается, вечная или нет деформация
этот (terraindeform) - локальный, если что.
Игра имеет 32 слота под размещение данных вроде GetTriggerUnit()
Возможно, фатал случается, когда все 32 штуки заполняются из-за рекурсивного вызова, и идет попытка размещения поверх, ну либо какие-то еще внутренние структуры жестко ограничены сверху. Простой бесконечный цикл сам закрывается по истечению предоставленного лимита операций.
У абилок с предметов есть как минимум флаг в офсете 0x20 - 0x2000
Проверяй на него. Не знаю, может ли он появиться в других ситуациях. Вот и узнаешь :)
Далеко не все GetTrigger() имеют нормальный стек. GetSpellTargetUnit ломается нахер, если кастануть во время срабатывания другой спелл. Но в данном примере всё работает норм, ибо действие мгновенное
А нет у тебя альтернативной возможности. Нет ничего, чтобы отследить, закончил ли юнит махать руками, или прервал себе приказ каким-либо образом, в т.ч. неотслеживаемыми dropitem. А если подключать мемхак, то весь костыль становится, может, и удобным с какой-то точки зрения, но всё равно сомнительным.
а, ну возможно. для типа урона точно нужна степень, тип атаки мне проверять не надобно было. ничего неожиданного не вижу в переписи, пару глобалок у близзов забрал, чтобы локалки не создавать
function OnDamageReceivedHookWorker takes nothing returns nothing
local integer offset=Memory[pDamageEspData/4]
local integer target=Memory[pDamageTarget/4]
local integer hu
local real bonusdmg
local real flatbonusdmg
if offset>0 then
set offset=Memory[offset/4+2]//RMem(offset+0x8)
endif
if DamageIncrementer>8000 then
set DamageIncrementer=10
endif
set DamageIncrementer=DamageIncrementer+1
set RaindropBeenActivated=false
if offset>0 then
set DamageAttackTypes[DamageIncrementer]=Memory[offset/4+0x20/4]//RMem(offset+0x20)
set DamageDamageTypes[DamageIncrementer]=Memory[offset/4+0x14/4]//RMem(offset+0x14)
set DamageValues[DamageIncrementer]=mI2R(Memory[offset/4+0x10/4])//RMem(offset+0x10))
set tt_unit2=I2Unit(target)//tt_unit2 = target
if DamageValues[DamageIncrementer]>0.1 then
set tt_unit1=I2Unit(RMem(offset))//tt_unit1 == source
// call echo(GetUnitName(tt_unit1)+" damages "+GetUnitName(tt_unit2)+" for "+R2S(DamageValues[DamageIncrementer]))
endif
if true then
set bj_meleeNearestMineDist=RMaxBJ(DamageValues[DamageIncrementer] - 120.,1.)
set bj_randomSubGroupChance=DamageValues[DamageIncrementer]-bj_meleeNearestMineDist
call WMem(offset+0x10,mR2I(bj_meleeNearestMineDist))
set DamageValues[DamageIncrementer]=bj_meleeNearestMineDist
endif
endif
endfunction
Элементарно, ватсон. По аналогии тому, как здесь я меняю урон, меняешь и тип урона, переписывая через WMem. просто вспомни, что там степени двойки должны быть, в типе атаки/урона, а не голые числа. ну а про отрицательные значения хз
Ред. DracoL1ch
» WarCraft 3 / Максимальное количество хеш-таблиц
Данные смешаются == хеш ключа совпадет.
Me - heh you mean their naming is misleading, I see
Leo - I wouldn't say misleading, usually a hashtable is an array of linked lists, which is exactly what the jass hashtable does. But the difference is that it doesn't use any hashing function, it just takes the value directly, extracts the last 3 or 4 bits, and uses that as an array index. Make a search on how hashtables work and you will understand. It's pretty much a standard c++ hashtable, an array of linked lists. It takes the key value, extracts the last bits, and uses that as the array index, and then starts iterating the linked list at that key.
Me - ok got it, I thought at first there are collisions between a keys with similar bytes
Leo - there are, but a hashtable usually has a hashing function associated to return unique values for every different key, thus avoiding collisions. But JASS hashtables don't have any hash function
Me - so we have collisions much more often than supposed to?
Leo - yes
Ред. DracoL1ch
» WarCraft 3 / Максимальное количество хеш-таблиц
» WarCraft 3 / Максимальное количество хеш-таблиц
Но вообще да, в движке жестко указано 255 таблиц максимум, дальше InitHashtable просто не сработают.
Ред. DracoL1ch
» WarCraft 3 / Деформации земли и утечки.
если меньше 0x100000 - беспокоиться не о чем, он локальный и сам разрушится, если не помешаешь ссылками на него (да и то не факт, что это влияет для них). тем паче, что даже в нативке указывается, вечная или нет деформация
этот (terraindeform) - локальный, если что.
» WarCraft 3 / Hashtable или array
» WarCraft 3 / Можно ли добавить больше 4-х способностей на предмет?
» WarCraft 3 / Фаталит карта
Возможно, фатал случается, когда все 32 штуки заполняются из-за рекурсивного вызова, и идет попытка размещения поверх, ну либо какие-то еще внутренние структуры жестко ограничены сверху. Простой бесконечный цикл сам закрывается по истечению предоставленного лимита операций.
» WarCraft 3 / Фаталит карта
» WarCraft 3 / Не отображается текст подсказки.
» WarCraft 3 / Импорт моделей, архив .mix; насколько актуально
» WarCraft 3 / Бафф Аура
» WarCraft 3 / Отключение меню паузы и журнала
Я упрощенно объяснил, почему мало кто захочет подобным заморачиваться. Просто мимо проходил
» WarCraft 3 / Отключение меню паузы и журнала
» WarCraft 3 / Тыкни где менять описание способность через мемхак!!!
» WarCraft 3 / Даммик не может кастить флеймстрайк
» WarCraft 3 / Тыкни где менять описание способность через мемхак!!!
» WarCraft 3 / Триггеры и Нестандартные абилки
» WarCraft 3 / Определить, является ли применяемая способность предметной
» WarCraft 3 / Определить, является ли применяемая способность предметной
Проверяй на него. Не знаю, может ли он появиться в других ситуациях. Вот и узнаешь :)
» WarCraft 3 / Передача данных в другую функцию для группы
» WarCraft 3 / Тип оружия - Нет
» WarCraft 3 / Тип оружия - Нет
» WarCraft 3 / Ловим урон с Мемхаком
» WarCraft 3 / Ловим урон с Мемхаком
» WarCraft 3 / Освобождение хендла