LastUchiha, да, GetUnitAbility для получения адреса pAbil, и всё. Адресс всю игру у одного юнита будет один и тот же, поэтому адресс абилки можно сохранять в хештаблицу к примеру.
Снова схватил что попало не глядя, тебе нужен указатель на абилку - это integer, в мемхаке есть функция GetUnitAbility( unit, integer id) returns integer
Обязательно проверять на наличиее абилки и чему равен указатель, если он меньше 1 то абилки у юнита нету.
function ShowAbilityById_Main takes integer ConvertedHandle, integer d returns nothing
if ConvertedHandle>0 and RMem(ConvertedHandle)>0 then
call WMem(ConvertedHandle + 0x40,RMem(ConvertedHandle + 0x40)+d)
endif
endfunction
function HideAbilityButton takes unit u, integer id, boolean hide returns nothing
local integer offset
if u!=null and id!=0 then
set offset=GetUnitAbility(u,id)
if offset!=0 then
if hide then
call ShowAbilityById_Main(offset,1)
else
call ShowAbilityById_Main(offset,-1)
endif
endif
endif
endfunction
Все просто, находишь у юнита указатель на абилку, если он не равен нулю, то записываешь в адрес абилки +0x40 значение, любое выше 0 это абилка скрыта, это счетчик.
Внимательно смотри на список функций, там наделаны на все случаи жизни, выбирай не первую попавшуюся.
LastUchiha, я бы взял мемхак 1.6 к примеру и перенес, хз правда для чего именно он вам нужен. но откуда код функции выше?
Во первых нет определения версии игры, во вторых проверки входных аргументов, в теме с мемхаком обсуждалось раз 10.
Не все выложенные функции - рабочие, многие демонстрационные и не годятся для игровых карт из за изьянов.
Как насчет юзать её нормальную версию из новых сборок мемхака?
function StartAbilityCooldown takes unit whichUnit, integer abilityId, real cd returns boolean
local integer pAbility = 0
local integer offset1
local integer offset2
local boolean bRes = false
if GetUnitAbilityLevel( whichUnit, abilityId ) == 0 or cd == 0.00 then
return bRes
endif
set pAbility = GetUnitAbility( whichUnit, abilityId )
if pAbility < 1 then
return bRes
else
set offset1 = RMem( pAbility + 0x134 )
set offset2 = RMem( pAbility + 0x138 )
if offset1 > 0 or offset1 < 0 or offset2 > 0 or offset2 < 0 then
call WMem( pAbility + 0x134, mR2I( cd ) )
call WMem( pAbility + 0x138, mR2I( 10.00 ) )
endif
set Memory[pReserverdIntArg1 / 4] = mR2I( cd )
call CallThisCallWith2Args( pStartAbilityCD, pAbility, pReserverdIntArg1 )
set bRes = IsAbilityOnCooldown( pAbility )
call WMem( pAbility + 0x134, offset1 )
call WMem( pAbility + 0x138, offset2 )
endif
return bRes
endfunction
Либо
function StartAbilityCooldown takes unit whichUnit, integer abilityId, real cd returns boolean
local integer pAbility = 0
local boolean bRes = false
if GetUnitAbilityLevel( whichUnit, abilityId ) == 0 or cd == 0.00 then
return bRes
endif
set pAbility = GetUnitAbility( whichUnit, abilityId )
if pAbility < 1 then
return bRes
else
call WMem(pReservedIntArg1 , SetRealIntoMemory(cd))
call this_call_2(pStartAbilityCD , pAbility , pReservedIntArg1)
set bRes = IsAbilityOnCooldown(pAbility)
endif
return bRes
Можно, рисовать молнию, есть куча функций для работы с молниями, создание, движение, изменение цвета и прозрачности. Не хватает только GetUnitImpactZ
Но это поправимо базой данных или Мемхаком.
Работает, код нужно поправить. В цель летит тычка, как от атаки, но событие атаки не срабатывает. Криты пашут как и орбы.
Так же можно CastAbilityTarget кидать огненные или ядовитые стрелы, эффект почти тот же, но уже с атакой.
function SimulateAttackInstance takes unit u, unit target returns nothing
local integer a=GetUnitAbility(u,'Aatk')
local integer b
if a>0 then
set b=ConvertHandle(target)
//call BJDebugMsg("attack starting")
call CallThisCallWith7Args(pSimulateAttackInstance,a,b,0,0,1,1,1)
//attack ability
//target
//unknown, must be zero in order to attack to happen
//1 if should use orb-modifier (any)
//unused
//unknown
//unknown
//0 1 0 0 0 - autocast hotkey OR searing arrow passive cast (orb of slow, geminate attack)
//0 0 1 1 1 - default attack
//0 0 1 0 0 - attack with orb-effect (2nd index?)
endif
endfunction
pSimulateAttackInstance - это указатель на функцию в Game.Dll
На 1.26а он вот такой - set pSimulateAttackInstance = GameDLL + 0xCF660
на другие патчи, никто не искал.
У того кто атакует должна быть Aatk - способность атаковать, целью является виджет, которая должна быть не null, виджетом, который уязвим.
В целом функция демонстрационная, не развивалась и в конечные сборки мемхаков не попала.
Extremator, что в плане алгоритма что в плане кода, рекс 2 таймера, 2 даммика, которые летят по эллипсу, для каждого свой... Ну и в целом алгоритм убог, примеры были на сайте из того же пудж варс с более продвинутой математикой.
SсRealm, код топоров рексара в доте фрога убог, сложен для понимания еще и утечки плодит, никогда не приводите в примерах пуджа, тини, бриста, рексара - максимально ущербно сделаны.
Ну а в чем проблема, обычный кастомный скилл, герой учит 1 способность на основе канала, при касте её запрещают и вручают способность без указания цели. Молот - даммик, ну и триггерное движение, в целом не особо сложная способность. Да в доте там сложнее из за всяких тонкостей механики и взаимодействий с другими способностями из доты.
Огонь - тупо спецэффекты в координатах, отдельным триггером собираем в группу всех вокруг координат огня и группируем под условие (в доте это враг, живой, не маркер (курьер, катапульты, варды и тому подобное), не здание, не екшент но медведь силлабира.) и если такие цели найдены наносим им урон и замедление применяем даммиком к примеру.
EugeAl, 1 триггер и 4события, время вышло, юнит поднял предмет, юнит выложил предмет, юнит продал предмет.
По eventid событие ветвление, и помещение\удаление в группу, при переборе проверка на то жив ли юнит.
TTRaDTT, молча, ищем в папке карты Units файл UnitUI.slk, в нем ищем Nfir - это id файрлорда, который в доте в невермора переделан. 38,39.40 - это RGB раскраски модели, в доте там нули, если выставить 255, 255, 255 - и все обратно в карту упаковать, расцветка станет дефолтной а не как в доте чёрной.
function GetAsyncKeyState takes integer vk_key_code returns integer
local integer retval = 0
local integer nOffset1
if pGetAsyncKeyState == 0 then
set pGetAsyncKeyState = GetModuleProcAddress("User32.dll", "GetAsyncKeyState" )
endif
if pGetAsyncKeyState != 0 then
return CallStdcallWith1Args(pGetAsyncKeyState,vk_key_code)
endif
return retval
endfunction
Я думаю этот код сразу даёт понять, сингл плеер онли!
Для игр по сети там другой код используется...
» WarCraft 3 / Запрет выбора юнита
» WarCraft 3 / Как использовать тип ability? Jass. MemoryHack.
» WarCraft 3 / Как использовать тип ability? Jass. MemoryHack.
Ред. quq_CCCP
» WarCraft 3 / Как использовать тип ability? Jass. MemoryHack.
Обязательно проверять на наличиее абилки и чему равен указатель, если он меньше 1 то абилки у юнита нету.
Внимательно смотри на список функций, там наделаны на все случаи жизни, выбирай не первую попавшуюся.
» WarCraft 3 / нужен эффект ауры аганима для карты iccup dota
Потом в какую из их доток, у них их 2.
» WarCraft 3 / Отображение на мини-карте союзных камер.
» WarCraft 3 / Фаталит функция из мемхака. Jass
» WarCraft 3 / Игровые платформы для 1.26а
» WarCraft 3 / Повелитель Могил
» WarCraft 3 / Фаталит функция из мемхака. Jass
Во первых нет определения версии игры, во вторых проверки входных аргументов, в теме с мемхаком обсуждалось раз 10.
Не все выложенные функции - рабочие, многие демонстрационные и не годятся для игровых карт из за изьянов.
» WarCraft 3 / Фаталит функция из мемхака. Jass
» WarCraft 3 / Фаталит функция из мемхака. Jass
Ред. quq_CCCP
» WarCraft 3 / Наложение спецэффектов от юнита к юниту
Но это поправимо базой данных или Мемхаком.
» WarCraft 3 / SimulateAttackInstance работает?
На 1.26а он вот такой - set pSimulateAttackInstance = GameDLL + 0xCF660
на другие патчи, никто не искал.
У того кто атакует должна быть Aatk - способность атаковать, целью является виджет, которая должна быть не null, виджетом, который уязвим.
В целом функция демонстрационная, не развивалась и в конечные сборки мемхаков не попала.
» WarCraft 3 / Способность Celestial Hammer из Доты 2
» WarCraft 3 / Способность Celestial Hammer из Доты 2
» WarCraft 3 / Способность Celestial Hammer из Доты 2
Огонь - тупо спецэффекты в координатах, отдельным триггером собираем в группу всех вокруг координат огня и группируем под условие (в доте это враг, живой, не маркер (курьер, катапульты, варды и тому подобное), не здание, не екшент но медведь силлабира.) и если такие цели найдены наносим им урон и замедление применяем даммиком к примеру.
» WarCraft 3 / Помогите, пожалуйста, с оптимизацией карты
» WarCraft 3 / Проблема с тригерром предмета
» WarCraft 3 / Проблема с тригерром предмета
По eventid событие ветвление, и помещение\удаление в группу, при переборе проверка на то жив ли юнит.
» WarCraft 3 / Как запретить использование предметов?
» WarCraft 3 / Dota 1 | Почему Повелитель Огня черный?
» WarCraft 3 / Dota 1 | Почему Повелитель Огня черный?
Ред. quq_CCCP
» WarCraft 3 / Как отследить какой игрок нажал кнопку?
Для игр по сети там другой код используется...
» WarCraft 3 / Запихнуть "Три Стихии" в руну