WAGARAX, способности не сбивающие текущий приказ, их штук 7 на весь варкравт, все эти абилки без указания цели. Виндвалк, берсерк, божественный щит, иммолейшин, щит маны и все прочие щиты на вкл\выкл.
WAGARAX, Адресса и оффсеты, а так же инструкции. Все сугубо индивидуально. Потому что можно просто менять значения в структуре - тогда нужны оффсеты, а можно сделать "хук" - своего рода событие на выполнение кода в движке, которое запустит другой код, это уже инструкции.
Из доты, в пустой карте сделай такой же скилл с тем же ИД, после сохрани карту и пройдись по ней виджитайзером, открой слк таблицу и целиком скрипируй поля абилки. Вставить думаю будет не проблема...
Bergi_Bear, для реализации вещей которые ждут именно завершения атаки, у лича так сделаны промахи, после успешного завершения атаки он ставит урон в 0 и все, промах готов. Так же можно в этот момент до нанесения урон отрегулировать его, реализация аналога безумия.
Так же это событие глобально для всех виджетов на карте, помнится много кто бился с детектом урона по предметам, а тут все как на ладони. Над попросить весь код системы у лича, посмотреть как сделано, мб там рили сложные вещи с помощью мемхака сделаны очень просто.
WAGARAX, нужен расширенный редактор JNGP у которого стандартный pjass.exe заменен на тот что приложен вначале темы, тогда карты с мемхаком из этой темы ( лучше берите из детекта урона ссылка ) и улыбайтесь, у вас есть мемхак, ну а как использовать его функции описано либо тут либо вы спрашивайте, вам обязательно ответят.
Ну в доте там не сильно просто, а как получится. Если брать легиона и сларка - их диспел описан триггерно, массив заполненный баффами тех способностей, что можно рассеивать, их фрог по собственному хотению добавляет \ удаляет. Прочие диспелы - это стандартный пурж, или еул - там все одинакого.
Лезть напрямую в движок без API плохой тон. quq_CCCP:
но по мне ты усложнил его через чур.
Чего ж я такого черезчур наовэркодил, если не секрет?
Ну как по мне, уж много импортных библиотек которые бы если честно "не усрались", про твой личный код ничего говорить не буду, тут на вкус и цвет все фломастеры разные, а вот таймер утилс - мусор, драколич подтвердит. Таймер самый легкий хендл в игре, аттач и ресайкл работает медленне чем просто создание таймера + хештаблица. Потом ты делаешь спелл на показ, в своей карте хоть на gamecache + RB, тут на публику.
Лично я считаю дурным тоном пихать 100500 сторонних либ в спеллы на показ + еще и сомнительные наработки. NazarPunk, Насчет мемхака:
1 - ты сам себе осмысленно собрался выстрелить в ногу?
2 - если бы хотели, вы бы уже сидели и смотрели на надпись на экране "Перевидите 100usd на кошлек xxxxxxxxxxxxxxxxx, иначе вашим фалам хана!" а так это никому не интересно, потом написать уж прям тру вирус - не так уж и просто, потом "ЗАЧЕМ" - ? Ради потроллить пару человек сидеть и кодить много кода? Ну те кто страдает такими вот шуточками, на это попросту неспособен, а тот кто способен подобным никогда заниматься не будет.
NazarPunk, как почему, есть идеи как это сделать еще? С тем функционалом что подарил нам лич можно без проблем делать абилки по всем правилам варкравта, всякие копии атаки, модификаторы, и так далее, все что есть в игре у стандартных абилок - есть и у вас, неужели это так плохо?
Если вам жмет кошелек то можно найти с++ программиста, который напишет вам ддл и у вас будет то чего до этого в игре даже близко не было. Не надо ни каких лаунчеров, хренаунчеров, все работает как есть.
Спел довольно прикольно выглядит, но по мне ты усложнил его через чур. ClotPh, можно вручать ядовитые стрелы герою и через TrowSpell кидать на врагов, механика будет как у вивера в доте.
unit array GlobalUnitArrayForDataPassing
integer pGlobalUnitArrayForDataPassing=0
function PresetSomeArray takes nothing returns nothing
set GlobalUnitArrayForDataPassing[1]=null
set GlobalUnitArrayForDataPassing[1099]=null
return
endfunction
function TypecastUnitArray takes nothing returns nothing
local integer GlobalUnitArrayForDataPassing
endfunction
//# +nosemanticerror
function GetUnitArrayAddress takes nothing returns integer
return GlobalUnitArrayForDataPassing
endfunction
function OnAttackDamageCalculationHook takes nothing returns nothing
local integer isource=GetDataFromDataArray1(65)
local integer itarget=GetDataFromDataArray1(66)
local integer result=GetDataFromDataArray1(68)
if result==1 or SimulatedAttackCounter>0 then
// in case if result==0 we forced this attack via trigger, but have to push the target manually then
set tt_unit1=GetDataFromUnitArray(3)//source
set tt_unit2=GetDataFromUnitArray(4)//target
if HaveSavedHandle(MHT,GetHandleId(tt_unit1),GetHandleId(tt_unit2)) then
call ExecuteFunc("AttackReadyToGoInit")
else
if GetDataFromDataArray1(67)=='item' then//targettype
set tt_widget1=tt_unit2
call ExecuteFunc("ItemAttackReadyToGoInit")
endif
endif
endif
endfunction
function InitAttackDamageCalculationHook takes integer pTriggerHandle returns nothing
local integer old1=RMem(pMeleeAttackCatcher)
local integer old2=RMem(pMeleeAttackCatcher+4)
local integer oldprotection = ChangeOffsetProtection(pMeleeAttackCatcher,8,0x40)
//call echo("jook "+Int2Hex(pReservedMemoryForMeleeAttackHook))
set Memory[pReservedMemoryForMeleeAttackHook/4+0]=0x30498B60
set Memory[pReservedMemoryForMeleeAttackHook/4+1]=0x000000BB
set Memory[pReservedMemoryForMeleeAttackHook/4+2]=0xE80B8900
call WMem(pReservedMemoryForMeleeAttackHook+5,DataArray1Address+260)// source address
set Memory[pReservedMemoryForMeleeAttackHook/4+3]=(GameDLL+0x2DCC40)-(pReservedMemoryForMeleeAttackHook+12)-4
set Memory[pReservedMemoryForMeleeAttackHook/4+4]=0x000000BB
set Memory[pReservedMemoryForMeleeAttackHook/4+5]=0x61038900
call WMem(pReservedMemoryForMeleeAttackHook+17,pGlobalUnitArrayForDataPassing+12)// source GlobalUnitArrayForDataPassing[3]
set Memory[pReservedMemoryForMeleeAttackHook/4+6]=0x6C798160
set Memory[pReservedMemoryForMeleeAttackHook/4+7]=0xFFFFFFFF
set Memory[pReservedMemoryForMeleeAttackHook/4+8]=0xC1833a74
set Memory[pReservedMemoryForMeleeAttackHook/4+9]=0x0000E86C
set Memory[pReservedMemoryForMeleeAttackHook/4+10]=0xC88B0000
call WMem(pReservedMemoryForMeleeAttackHook+38,(GameDLL+0x4786B0)-(pReservedMemoryForMeleeAttackHook+38)-4)
set Memory[pReservedMemoryForMeleeAttackHook/4+11]=0x000000B8
set Memory[pReservedMemoryForMeleeAttackHook/4+12]=0x8B088900
call WMem(pReservedMemoryForMeleeAttackHook+45,DataArray1Address+264)//66 target address
set Memory[pReservedMemoryForMeleeAttackHook/4+13]=0x1C5B8B19
set Memory[pReservedMemoryForMeleeAttackHook/4+14]=0x00BBD3FF
set Memory[pReservedMemoryForMeleeAttackHook/4+15]=0x89000000
call WMem(pReservedMemoryForMeleeAttackHook+59,DataArray1Address+268)//67 target type
set Memory[pReservedMemoryForMeleeAttackHook/4+16]=0x00E89003
set Memory[pReservedMemoryForMeleeAttackHook/4+17]=0xBB000000
call WMem(pReservedMemoryForMeleeAttackHook+67,(GameDLL+0x2DCC40)-(pReservedMemoryForMeleeAttackHook+67)-4)
set Memory[pReservedMemoryForMeleeAttackHook/4+18]=pGlobalUnitArrayForDataPassing+16//4 target handle
set Memory[pReservedMemoryForMeleeAttackHook/4+19]=0x00BB0389
set Memory[pReservedMemoryForMeleeAttackHook/4+20]=0xC7000000
call WMem(pReservedMemoryForMeleeAttackHook+79,DataArray1Address+272)//68 result
set Memory[pReservedMemoryForMeleeAttackHook/4+21]=0x00000103
set Memory[pReservedMemoryForMeleeAttackHook/4+22]=0x0BEB9000
set Memory[pReservedMemoryForMeleeAttackHook/4+23]=0x000000BB
set Memory[pReservedMemoryForMeleeAttackHook/4+24]=0x0003C700
call WMem(pReservedMemoryForMeleeAttackHook+93,DataArray1Address+272)//68 result
set Memory[pReservedMemoryForMeleeAttackHook/4+25]=0x61000000
set Memory[pReservedMemoryForMeleeAttackHook/4+26]=0x90909060
set Memory[pReservedMemoryForMeleeAttackHook/4+27]=0x00000068
set Memory[pReservedMemoryForMeleeAttackHook/4+28]=0x0000B800
call WMem(pReservedMemoryForMeleeAttackHook+27*4+1,pTriggerHandle)
set Memory[pReservedMemoryForMeleeAttackHook/4+29]=0xD0FF0000
call WMem(pReservedMemoryForMeleeAttackHook+28*4+2,pTriggerExecute)
set Memory[pReservedMemoryForMeleeAttackHook/4+30]=0x6104C483
set Memory[pReservedMemoryForMeleeAttackHook/4+31]=0x8B575651
set Memory[pReservedMemoryForMeleeAttackHook/4+32]=0xB8BE8BF1
set Memory[pReservedMemoryForMeleeAttackHook/4+33]=0x8B000002
set Memory[pReservedMemoryForMeleeAttackHook/4+34]=0x00ACBE84
set Memory[pReservedMemoryForMeleeAttackHook/4+35]=0x84030000
set Memory[pReservedMemoryForMeleeAttackHook/4+36]=0x0000A0BE
set Memory[pReservedMemoryForMeleeAttackHook/4+37]=0x8C860300
set Memory[pReservedMemoryForMeleeAttackHook/4+38]=0x8B000000
set Memory[pReservedMemoryForMeleeAttackHook/4+39]=0x00008C8E
set Memory[pReservedMemoryForMeleeAttackHook/4+40]=0x988E8900
set Memory[pReservedMemoryForMeleeAttackHook/4+41]=0xC7000000
set Memory[pReservedMemoryForMeleeAttackHook/4+42]=0x00008C86
set Memory[pReservedMemoryForMeleeAttackHook/4+43]=0x00000000
set Memory[pReservedMemoryForMeleeAttackHook/4+44]=0xBE8C8B00
set Memory[pReservedMemoryForMeleeAttackHook/4+45]=0x00000094
set Memory[pReservedMemoryForMeleeAttackHook/4+46]=0x88BE948B
set Memory[pReservedMemoryForMeleeAttackHook/4+47]=0xE9000000
set Memory[pReservedMemoryForMeleeAttackHook/4+48]=GameDLL + 0xC697E - (pReservedMemoryForMeleeAttackHook/4+48)*4 - 4
set Memory[pMeleeAttackCatcher/4]=0xE9E9E9E9
set Memory[pMeleeAttackCatcher/4+1]=0x90909090
call WMem(pMeleeAttackCatcher + 1, pReservedMemoryForMeleeAttackHook - pMeleeAttackCatcher - 5 )
call ChangeOffsetProtection(pMeleeAttackCatcher,8,oldprotection)
// pushad
//mov ecx,[ecx+30]
//mov ebx,13455E1C
//mov [ebx],ecx
//call Game.dll+2DCC40
//mov ebx,1824008C
//mov [ebx],eax
//popad
//pushad
//cmp [ecx+6C],FFFFFFFF
//je 177F8918
//add ecx,6C
//call Game.dll+4786B0
//mov ecx,eax
//mov eax,13455E20
//mov [eax],ecx
//mov ebx,[ecx]
//mov ebx,[ebx+1C]
//call ebx
//mov ebx,13455E24
//mov [ebx],eax
//nop
//call Game.dll+2DCC40
//mov ebx,18240090
//mov [ebx],eax
//mov ebx,13455E28
//mov [ebx],00000001
//nop
//jmp 177F8923
//mov ebx,13455E28
//mov [ebx],00000000
//popad
//pushad
//nop
//nop
//nop
//push 00101D61
//mov eax,Game.dll+3C3F40
//call eax
//add esp,04
//popad
//push ecx
//push esi
//push edi
//mov esi,ecx
//mov edi,[esi+000002B8]
//mov eax,[esi+edi*4+000000AC]
//add eax,[esi+edi*4+000000A0]
//add eax,[esi+000000B0]
//mov ecx,[esi+b0]
//mov [esi+bc],ecx
//mov [esi+b0],0
//
//mov ecx,[esi+edi*4+00000094]
//mov edx,[esi+edi*4+00000088]
//jmp Game.dll+C697E
endfunction
//mmehack init
set pReservedMemoryForMeleeAttackHook = pCallFastCallWith1Args + 35000//+200
//main
set pGlobalUnitArrayForDataPassing=RMem(GetUnitArrayAddress() +0xC)
set t=CreateTrigger()
call TriggerAddAction(t,function OnAttackDamageCalculationHook)
call InitAttackDamageCalculationHook(GetHandleId(t))
PT153, ну потому что события вешаются на обьект, к примеру на юнита, а не только на триггер. TriggerRegister*** возвращает triggerevent.
Ну подробнее DracoL1ch, поведает.
Clamp, ну я же говорю, плз пример в студию, то бывают не совсем примитивные задачи, мне нужно точно узнать что юнит умер EVENT_WINGED_DETAH, проверить на полученный урон в 0 ед, а так же проверить приказ без указания цели, таких юнитов может быть одновременно до 10. DracoL1ch, боятся за производительность, триггер же тяжелее таймера + евенты не удаляются. Хотя я когда проверял на карте где 30 юнитов херачили друг-друга, плодились и умирали на протяжении 15 минут, проблем чето не заметил, ни с памятью ни с числом хендлов...
Clamp, эмм - сударь, давайте я вам нарежу задач, а вы мне расскажите как сделать не сложнее статическим триггером? Я конечно понимаю что делать как у фрога ради анимации героя спустя 0.5 сек триггер с событием время истекло это глупость, но бывают случаи когда тебе нужно следить за конкретным юнитом особенно тщательно, события урона, смерти, получения приказов.
Тип урона, есть целая статья, ссылка
Ну большая часть - копии, особо ни на че не влияют, некоторые влияют, на взаимодействие с резистами.
Их все можно проверить мемхаком, но увы близзарды не доделали функции для jass и просто так сделать проверки на тип атаки, урона и оружия низя.
Tailer007, я ктому что нашлись люди и переделали карты на мемхак, подрубили античиты. Был бы не интересен - не старались бы, насчет не очень дружит - дружит не очень он только с сjass, но это всего то лишь несколько функций, ибо весь мемхак это typecast функции да сломанный массив, далее уже простые функции чтения \ записи которые ничего такого не используют, никак не багуют с софтом, работают в редакторе с надстройками.
Насчет 95 винды мб это о стиле окон, сколько воды то утекло с тех пор.... Игры тех лет то частенько не запускаются...
» WarCraft 3 / Отлов приказа в стане
» WarCraft 3 / Отлов приказа в стане
» WarCraft 3 / Хак на память Warcraft3
» WarCraft 3 / Хак на память Warcraft3
» WarCraft 3 / Изменение характеристик через SLK таблицы
» WarCraft 3 / Хак на память Warcraft3
» WarCraft 3 / Хак на память Warcraft3
» WarCraft 3 / Хак на память Warcraft3
Так же это событие глобально для всех виджетов на карте, помнится много кто бился с детектом урона по предметам, а тут все как на ладони. Над попросить весь код системы у лича, посмотреть как сделано, мб там рили сложные вещи с помощью мемхака сделаны очень просто.
» WarCraft 3 / Хак на память Warcraft3
» WarCraft 3 / Хак на память Warcraft3
» WarCraft 3 / Fatal error в процессе игры...
» WarCraft 3 / Хак на память Warcraft3
» WarCraft 3 / Разные типы диспелла
» WarCraft 3 / Заклинание: Blink Strike
Лично я считаю дурным тоном пихать 100500 сторонних либ в спеллы на показ + еще и сомнительные наработки.
NazarPunk, Насчет мемхака:
1 - ты сам себе осмысленно собрался выстрелить в ногу?
2 - если бы хотели, вы бы уже сидели и смотрели на надпись на экране "Перевидите 100usd на кошлек xxxxxxxxxxxxxxxxx, иначе вашим фалам хана!" а так это никому не интересно, потом написать уж прям тру вирус - не так уж и просто, потом "ЗАЧЕМ" - ? Ради потроллить пару человек сидеть и кодить много кода? Ну те кто страдает такими вот шуточками, на это попросту неспособен, а тот кто способен подобным никогда заниматься не будет.
» WarCraft 3 / Как установить аглоязычный редактор на лицензию?
Ред. quq_CCCP
» WarCraft 3 / Заклинание: Blink Strike
Если вам жмет кошелек то можно найти с++ программиста, который напишет вам ддл и у вас будет то чего до этого в игре даже близко не было. Не надо ни каких лаунчеров, хренаунчеров, все работает как есть.
Спел довольно прикольно выглядит, но по мне ты усложнил его через чур.
ClotPh, можно вручать ядовитые стрелы герою и через TrowSpell кидать на врагов, механика будет как у вивера в доте.
» WarCraft 3 / Ошибка при загрузке карты в World Edit
Ред. quq_CCCP
» WarCraft 3 / Хак на память Warcraft3
» WarCraft 3 / Полноценный Антимапхак.
» WarCraft 3 / Как отследить убивающего юнита в таймере?
Ну подробнее DracoL1ch, поведает.
Ред. quq_CCCP
» WarCraft 3 / Как отследить убивающего юнита в таймере?
DracoL1ch, боятся за производительность, триггер же тяжелее таймера + евенты не удаляются.
Хотя я когда проверял на карте где 30 юнитов херачили друг-друга, плодились и умирали на протяжении 15 минут, проблем чето не заметил, ни с памятью ни с числом хендлов...
» WarCraft 3 / Как отследить убивающего юнита в таймере?
» WarCraft 3 / Что это за типы урона такие и чем они отличаются?
Ну большая часть - копии, особо ни на че не влияют, некоторые влияют, на взаимодействие с резистами.
Их все можно проверить мемхаком, но увы близзарды не доделали функции для jass и просто так сделать проверки на тип атаки, урона и оружия низя.
» WarCraft 3 / WFE - Warcraft Feature Extender
» WarCraft 3 / WFE - Warcraft Feature Extender
Насчет 95 винды мб это о стиле окон, сколько воды то утекло с тех пор.... Игры тех лет то частенько не запускаются...