16

» WarCraft 3 / Максимальное количество хеш-таблиц

Нет никакой проблемы в том, чтобы работать сразу с 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
16

» WarCraft 3 / Максимальное количество хеш-таблиц

по крайней мере из globals инициализация InitHashtable идет до начала загрузки. Ну а лимит реализован просто - однажды у тебя будет 255 вызовов InitHashtable и после этого новые создаваться не будут.
16

» WarCraft 3 / Максимальное количество хеш-таблиц

Забавный факт - хештаблица генерируется в момент выделения карты в лобби, а не при загрузке или исполнении скрипта. Точнее, сперва при проверке синтаксиса, а затем - когда жмется "старт". А обычный скрипт выполняется примерно после середины полосы загрузки.
Но вообще да, в движке жестко указано 255 таблиц максимум, дальше InitHashtable просто не сработают.
16

» WarCraft 3 / Деформации земли и утечки.

создаешь объект, спрашиваешь, какой у него handle
если меньше 0x100000 - беспокоиться не о чем, он локальный и сам разрушится, если не помешаешь ссылками на него (да и то не факт, что это влияет для них). тем паче, что даже в нативке указывается, вечная или нет деформация
этот (terraindeform) - локальный, если что.
16

» WarCraft 3 / Фаталит карта

Игра имеет 32 слота под размещение данных вроде GetTriggerUnit()
Возможно, фатал случается, когда все 32 штуки заполняются из-за рекурсивного вызова, и идет попытка размещения поверх, ну либо какие-то еще внутренние структуры жестко ограничены сверху. Простой бесконечный цикл сам закрывается по истечению предоставленного лимита операций.
16

» WarCraft 3 / Не отображается текст подсказки.

Не указан текст в подсказке для автокаста или отключения, короче, пробелами заполни поля описания, которые пустые хочешь
16

» WarCraft 3 / Импорт моделей, архив .mix; насколько актуально

Не будут они качаться, разумеется, ведь у карты есть только один файл родной - сама карта. так что такие планы обречены
16

» WarCraft 3 / Отключение меню паузы и журнала

FrigatPlay
Я упрощенно объяснил, почему мало кто захочет подобным заморачиваться. Просто мимо проходил
16

» WarCraft 3 / Отключение меню паузы и журнала

Блокируя возможность ливнуть, ты никому не помогаешь. Реализовать офк возможно, но не советую.
16

» WarCraft 3 / Тыкни где менять описание способность через мемхак!!!

не используй это. за строками надо чистить отдельно, иначе будут фаталы после игры, в любое время
16

» WarCraft 3 / Триггеры и Нестандартные абилки

один триггер. потому что не надо будет 100 раз спрашивать, что за абилка
16

» WarCraft 3 / Определить, является ли применяемая способность предметной

получение текущего приказа не требует от тебя нихера, тебе нужно, чтобы там не было "useitem", и всё
16

» WarCraft 3 / Определить, является ли применяемая способность предметной

У абилок с предметов есть как минимум флаг в офсете 0x20 - 0x2000
Проверяй на него. Не знаю, может ли он появиться в других ситуациях. Вот и узнаешь :)
А еще GetUnitCurrentOrder, точно.
16

» WarCraft 3 / Передача данных в другую функцию для группы

Далеко не все GetTrigger() имеют нормальный стек. GetSpellTargetUnit ломается нахер, если кастануть во время срабатывания другой спелл. Но в данном примере всё работает норм, ибо действие мгновенное
16

» WarCraft 3 / Тип оружия - Нет

А нет у тебя альтернативной возможности. Нет ничего, чтобы отследить, закончил ли юнит махать руками, или прервал себе приказ каким-либо образом, в т.ч. неотслеживаемыми dropitem. А если подключать мемхак, то весь костыль становится, может, и удобным с какой-то точки зрения, но всё равно сомнительным.
16

» WarCraft 3 / Тип оружия - Нет

А че толку от этого? Мемхак и так дает контроль над моментом нанесения урона и точкой завершения атаки, манипулируй уроном и будет тебе счастье
16

» WarCraft 3 / Ловим урон с Мемхаком

а, ну возможно. для типа урона точно нужна степень, тип атаки мне проверять не надобно было. ничего неожиданного не вижу в переписи, пару глобалок у близзов забрал, чтобы локалки не создавать
16

» WarCraft 3 / Ловим урон с Мемхаком

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. просто вспомни, что там степени двойки должны быть, в типе атаки/урона, а не голые числа. ну а про отрицательные значения хз
16

» WarCraft 3 / Освобождение хендла

А еще можно просто не юзать ульт паладина. Ну а мусорка в хештаблице у ТС и так, и так