Ну в доте там не сильно просто, а как получится. Если брать легиона и сларка - их диспел описан триггерно, массив заполненный баффами тех способностей, что можно рассеивать, их фрог по собственному хотению добавляет \ удаляет. Прочие диспелы - это стандартный пурж, или еул - там все одинакого.
Лезть напрямую в движок без 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 винды мб это о стиле окон, сколько воды то утекло с тех пор.... Игры тех лет то частенько не запускаются...
Tailer007, не ну я это понимаю, я о другом, что можно сделать и как программу и как длл плагин для тех кто карты делает, мемхак потихоньку набирает популярность.
Tailer007, ну можно и седелать просто длл и подгружать его мемхаком или сторонним exe файлом, чтобы всем желающим было удобно. То мучатся, не могут выбрать хоткеи, хелперы, от античитов страдают, а тут зашел и сразу тебе есть все необходимое, надо будет попробовать, мб игрокам понравится?
Tailer007, На ракапе есть один секрет, как запустить мемхак.
Кстати как у дота хелпера будет расширенная инфа в интерфейсе? хп, мп, реген, скорость, резисты, модификаторы?
Это preload exploit, а точнее функция PreloadGenEnd("путь к файлу") которая создает pld файл по указанному пути, в него попадает все что подгружал вар в этот момент.
Tailer007, ну собственно вот наработка - xgm.guru/p/wc3/memory-hack-with-natives
Так же я расколупал китайскую карту и выкполупал мемхак на 1.27+, оно реально работает. так что можно не боятся что как плейграунд перейдут все на 1.27 и все, хана, капец. Все евро PvPGN сидящие на 1.27b и 1.28a тоже доступны.
Конечно, это создает некоторые сложности. Но когда это останавливало модмейкеров Warcraft 3?
Ну а с загрузкой и выгрузкой длл большой вопрос, мне бы тоже хотелось несколько плюшек запилить, но как сделать так чтобы у игроков все это не висело в памяти после игры, да и вовсе на том же айкапе можно поиграть в карту с мемхаком, а потом пойти в айдотку и крашнутся, очень бы не хотелось делать такие подлянки игрокам.
Tailer007, Ну нативки можно добавить самим, IseFog же делал уже, так же нам нечего боятся старших патчей, есть мемхак на 1.27+, с записью и всем чем над. Правд на старшие патчи оффсетов маловато. Щяс пока думаю над выгрузкой dll при выходе из карты, то хотелось бы напихать улучшалок, но вот они будут висеть всю игру, прока юзер не закроет вар.
В дота хелпере кстати вроде есть восстановление памяти, полезная штука, если делать изменения вроде детекта урона или еще чего.
» 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 винды мб это о стиле окон, сколько воды то утекло с тех пор.... Игры тех лет то частенько не запускаются...
» WarCraft 3 / WFE - Warcraft Feature Extender
» WarCraft 3 / WFE - Warcraft Feature Extender
» WarCraft 3 / WFE - Warcraft Feature Extender
» WarCraft 3 / Простые триггеры.
» WarCraft 3 / Как сделать улучшение общим для определенных игроков.
» WarCraft 3 / Preload
» WarCraft 3 / Как сменить тип декорации
» WarCraft 3 / WFE - Warcraft Feature Extender
Кстати как у дота хелпера будет расширенная инфа в интерфейсе? хп, мп, реген, скорость, резисты, модификаторы?
» WarCraft 3 / Вопрос по способностям с превращениями.
» WarCraft 3 / Вывод в файл
» WarCraft 3 / WFE - Warcraft Feature Extender
Так же я расколупал китайскую карту и выкполупал мемхак на 1.27+, оно реально работает. так что можно не боятся что как плейграунд перейдут все на 1.27 и все, хана, капец. Все евро PvPGN сидящие на 1.27b и 1.28a тоже доступны.
Конечно, это создает некоторые сложности. Но когда это останавливало модмейкеров Warcraft 3?
Ну а с загрузкой и выгрузкой длл большой вопрос, мне бы тоже хотелось несколько плюшек запилить, но как сделать так чтобы у игроков все это не висело в памяти после игры, да и вовсе на том же айкапе можно поиграть в карту с мемхаком, а потом пойти в айдотку и крашнутся, очень бы не хотелось делать такие подлянки игрокам.
» WarCraft 3 / WFE - Warcraft Feature Extender
В дота хелпере кстати вроде есть восстановление памяти, полезная штука, если делать изменения вроде детекта урона или еще чего.