Думаю все в курсе что GetUnitAbilityForAddresss довольно медленная функция ( по тестам лича в 15 раз медленее чем GetUnitAbilityLevel )
По этому стоит проверять наличие аблики у цели по GetUnitAbilityLevel а так же заносить результаты в хештаблицу или массив для более быстрой работы.
Поэтому вот 1 из вариантов оптимизации:
код
function GetUnitAbilityForAddresss takes integer pConvertedHandle, integer abilid returns integer
local integer pAddr1 = pConvertedHandle + 476
local integer pAddr2 = pConvertedHandle + 480
local integer pOff1 = LoadInteger( gg_htb_HashData, abilid, pConvertedHandle )
if pOff1 > 1 then
call BJDebugMsg("Значение уже записано!")
return pOff1
endif
set pAddr1 = Memory[pAddr1 / 4]
set pAddr2 = Memory[pAddr2 / 4]
if pAddr1 == 0 or pAddr2 == 0 or BitwiseAnd( pAddr1, pAddr2 ) == -1 then
return 0
endif
set pOff1 = GetSomeAddressForAbility( pAddr1, pAddr2 )
if pOff1 == 0 then
return 0
endif
loop
exitwhen pOff1 == 0
if Memory[pOff1 / 4 + 52 / 4] == abilid then
call SaveInteger( gg_htb_HashData, abilid, pConvertedHandle, pOff1 )
return pOff1
endif
set pOff1 = GetSomeAddressForAbility( Memory[pOff1 / 4 + 36 / 4], Memory[pOff1 / 4 + 40 / 4] )
endloop
return pOff1
endfunction
Ии небудет никогда юзать негативные заклинание ( по его мнению) в союзников, а в противников не может из за установленных целей в настройках способности. Цепь молний с отрец уроном будет лечить здоровье, самый простой вариант без кода.
Канал кстати какой ему ид приказа не укажи Ии тоже не юзает.
16GB, не проверял но лучше синкать строки ибо может быть десинх если ты будешь брать инфу у абилок.
В теории локальное изменение строк прокатит, ибо это все лишь ссылка на разное содержимое.
Нужно будет протестить.
quq_CCCP, дык я имел в виду динамическое описание у предметов, а не блокировку.
А он не блокиурет а меняет один предмет другим, правда перетаскивая способности от другого. Сделай N одинаковых предметов с разными описаниями и меняй их этой функцией.
Я проверял на талисмане жизни и предмету с активкой добавляющим броню, в результате описание и иконка сменились а нажимать низя, бонус хп остялся и добавилась защита.
Кастом стун увы кривой, нужно переписывать функцию.
Нужно обязательно следить за смертью юнита, даже если у него есть крест перерождения - стоит затунить мертвого и на него не будет действовать ни 1 стун. Кет:
Она уже есть!
Для предметов вроде нет. Эх =(
Зато есть:
function ChangeItemId takes item it, integer targetID returns nothing
local integer cid=ConvertHandle(it)/4
local integer curID
if cid == 0 then
return
endif
set curID=Memory[cid+0x30/4]
set Memory[cid+0x30/4]=targetID
endfunction
Назначает одному предмету описание и иконку другого, кликабельность и все бонусы нет, просто добавляет в бонусы первого бонусы от второго, если они влезут (4 способности лимит так и остался), тоже неплохо для реализации блокировки предметов.
l_Avenger_l, копировать - это сам хак и пару функций для теста, остальные копируем с гитхаба и вносим в свою карту, функций очень много я не вносил их все + дебаги лича, копируй самостоятельно или пиши функции сам лич уже выложил гайд про устройство структуры юнитов.
А как выяснить тип нанесенного урона(с руки или спелл)?
Нужно триггер на событие получения урона и смотреть тип атаки и урона, и гадать.
вот код
// WARNING!! IT CAN BE USED ONLY IN FIRST CONDITION AT FIRST POSITION
function GJ_GetRealDmg126a takes nothing returns real
return cleanReal(indexToReal(ReadEBP_offset(0x380)))
endfunction
// WARNING!! IT CAN BE USED ONLY IN FIRST CONDITION AT FIRST POSITION
function GJ_GetRealDmg127a takes nothing returns real
return cleanReal(indexToReal(ReadEBP_offset(0x400)))
endfunction
function GJ_SaveLastDmg126a takes nothing returns boolean
if GetTriggerEventId()!=EVENT_UNIT_DAMAGED then
return true
endif
set GJ_LastDmg = GJ_GetRealDmg126a( )
set GJ_LastAttackType=ReadEBP_offset(0x37C)
if ReadEBP_offset(0x368)!=0 or ReadEBP_offset(0x378)==0x3F800000 then
set GJ_LastDamageType=0
else
set GJ_LastDamageType=ReadEBP_offset(0x378)
endif
// call BJDebugMsg("rewrote with "+R2S(GJ_LastDmg))
return true
endfunction
function GJ_SaveLastDmg127a takes nothing returns boolean
if GetTriggerEventId()!=EVENT_UNIT_DAMAGED then
return true
endif
set GJ_LastDmg = GJ_GetRealDmg127a( )
set GJ_LastAttackType=ReadEBP_offset(0x3B0)
if ReadEBP_offset(0x3CC)!=0 then
set GJ_LastDamageType=0
else
set GJ_LastDamageType=ReadEBP_offset(0x3F0)
endif
return true
endfunction
нужно еще 3 глобалки, эту функцию в условие триггера и все.
Далее смотрим на тип урона.
Иконки у способностей на основе "Сфера замедления" можно разблокировать, сделав кликабельным, а так же возможность кастовать спелл в ручную, но эффект автокаста при ударе останется.
Пригодится для автокаста способностей у которых его нету а ИИ писать не охото.
Кстати наконец то решен извечный вопрос - кулдаун на пассивке!
Можно ставить кд перерождению, а чтобы оно ни сработало когда это ненужно вешаем на юнита событие TriggerRegisterDeathEvent ( EVENT_WINDGET_DEARH) и запускать способность в кд той же функцией. Увы но только это событие срабатывает при смерти юнита с крестом перерождения.
l_Avenger_l, Не тестировалось в широких массах, ошибки в некоторых функциях приводят к фатальным ошибкам.
А примеру функция которая запускает способность в кулдаун фаталит если:
юнита нет, способности нет, способность является пассивкой (тестировалось только с змеиной ловкостью и демонической силой, у перерождения кулдаун работает исправно)
Так что нужно правильно организовать код чтобы не пускать кулдауны у дохлых или несуществующих юнитов. А так же всегда проверять их на наличие способности.
А реально создать такую функцию изменения данных, которая меняет описание чисел способностей и предметов на переменные в игре?
Она уже есть!
function SetAbilityUbertip takes integer id, integer lvl, string s returns boolean
function GetAbilityUbertip takes integer id, integer lvl returns string
В доте лича меняются описания скиилов у инвокера (конкретное кол-во урона, прочие эффекты которые зависят от уровня сфер).
Копируем код с гитхаба (на хайве неудобно) и вставляем в тхт файл, открываем жасскрафтом и Citr+F (название интересующей функции) и копируем себе в карту все что требуется.
ENAleksey, да тут всё дело в том что я делал для простого we, а вы все в jngp редактируете. Но думаю это все уже не важно с картой разобрались всё у всех заработало.
Тока в библиотеке на vjass пишешь тоже самое беда...
Теперь новая беда, копирую код к себе в карту и карта вылетает в главное меню...
Походу дело в кривом pjass.
одно охрененное НО!
Чтобы typecast работал в JNGP нужно создать аж 3 переменных! (народ кто пишет в обычном редакторе или в блокнотике обходятся двумя, хз как?)
library Некая библиотека
globals
некий тип array l__A
некий тип A
endglobals
private function typecastarray takes nothing returns nothing
local некий тип A
endfunction
//# +nosemanticerror
function GetArrayAddress takes nothing returns integer //not really needed
loop
return l__A
endloop
return 0
endfunction
endlibrary
Вот только так это работает! Тоже самое с байткодом, нужно три переменные 1 массив, вторую того же типа но не массив и третью локалку и посредством vjass все будут с 1 именем и все будет работать, инача вылет карты в главное меню ибо фатал...
Ещё 1 проблема...
native MergeUnits takes integer qty, integer a, integer b, integer make returns boolean
// reserved native for call 2 integer function and return BOOLEAN value (can be converted to int!)
native ConvertUnits takes integer qty, integer id returns boolean
// reserved native for call 1 integer function and return integer value
native IgnoredUnits takes integer unitid returns integer
Стоит добавить их в war3map.j и моя карта фаталит, прошу всех кому не лень протестировать это дело!
Ну Kodo tag team или Infection attack, там какой ни какой ИИ, остальные без ИИ. Увы ИИ дело не простое, особенно в TAG картах, я тоже долго думал запилить в своей карте ИИ для обучения, но получилось уныло...
Ред. quq_CCCP
» WarCraft 3 / Хак на память Warcraft3
По этому стоит проверять наличие аблики у цели по GetUnitAbilityLevel а так же заносить результаты в хештаблицу или массив для более быстрой работы.
Поэтому вот 1 из вариантов оптимизации:
Ред. nvc123
» WarCraft 3 / Аналог способности канал
Канал кстати какой ему ид приказа не укажи Ии тоже не юзает.
» WarCraft 3 / Хак на память Warcraft3
В теории локальное изменение строк прокатит, ибо это все лишь ссылка на разное содержимое.
Нужно будет протестить.
» WarCraft 3 / Аналог способности канал
» WarCraft 3 / Хак на память Warcraft3
» WarCraft 3 / Хак на память Warcraft3
Я проверял на талисмане жизни и предмету с активкой добавляющим броню, в результате описание и иконка сменились а нажимать низя, бонус хп остялся и добавилась защита.
» WarCraft 3 / Хак на память Warcraft3
Нужно обязательно следить за смертью юнита, даже если у него есть крест перерождения - стоит затунить мертвого и на него не будет действовать ни 1 стун.
Кет: Зато есть:
Ред. quq_CCCP
» WarCraft 3 / Хак на память Warcraft3
» WarCraft 3 / Хак на память Warcraft3
» WarCraft 3 / Хак на память Warcraft3
вот код
Далее смотрим на тип урона.
» WarCraft 3 / нестандартный AI
ИИ, особенно крутое ИИ не простая задача.
» WarCraft 3 / Какая строка приказа у скилла "Выбрать героя"?
» WarCraft 3 / Хак на память Warcraft3
Пригодится для автокаста способностей у которых его нету а ИИ писать не охото.
Кстати наконец то решен извечный вопрос - кулдаун на пассивке!
Можно ставить кд перерождению, а чтобы оно ни сработало когда это ненужно вешаем на юнита событие TriggerRegisterDeathEvent ( EVENT_WINDGET_DEARH) и запускать способность в кд той же функцией. Увы но только это событие срабатывает при смерти юнита с крестом перерождения.
» WarCraft 3 / Хак на память Warcraft3
» WarCraft 3 / Хак на память Warcraft3
» WarCraft 3 / Хак на память Warcraft3
» WarCraft 3 / Хак на память Warcraft3
Очень понравилась функция которая накладывает сайленс на указанную способность юнита.
» WarCraft 3 / Хак на память Warcraft3
А примеру функция которая запускает способность в кулдаун фаталит если:
юнита нет, способности нет, способность является пассивкой (тестировалось только с змеиной ловкостью и демонической силой, у перерождения кулдаун работает исправно)
Так что нужно правильно организовать код чтобы не пускать кулдауны у дохлых или несуществующих юнитов. А так же всегда проверять их на наличие способности.
» WarCraft 3 / Хак на память Warcraft3
Копируем код с гитхаба (на хайве неудобно) и вставляем в тхт файл, открываем жасскрафтом и Citr+F (название интересующей функции) и копируем себе в карту все что требуется.
» WarCraft 3 / Проблемы с новым Retrun Bug
» WarCraft 3 / Проблемы с новым Retrun Bug
Вот готовая версия для копипаста.
Ред. quq_CCCP
» WarCraft 3 / Проблемы с новым Retrun Bug
Теперь новая беда, копирую код к себе в карту и карта вылетает в главное меню...
Походу дело в кривом pjass.
одно охрененное НО!
Чтобы typecast работал в JNGP нужно создать аж 3 переменных!
(народ кто пишет в обычном редакторе или в блокнотике обходятся двумя, хз как?)
Ещё 1 проблема...
» WarCraft 3 / Не сохраняется скилл при переносе в другую карту
» WarCraft 3 / Не сохраняется скилл при переносе в другую карту
» WarCraft 3 / Карты похожие на Петры баланс