32

» WarCraft 3 / Разные типы диспелла

Ну в доте там не сильно просто, а как получится. Если брать легиона и сларка - их диспел описан триггерно, массив заполненный баффами тех способностей, что можно рассеивать, их фрог по собственному хотению добавляет \ удаляет. Прочие диспелы - это стандартный пурж, или еул - там все одинакого.
32

» WarCraft 3 / Заклинание: Blink Strike

NazarPunk:
неужели это так плохо?
Лезть напрямую в движок без API плохой тон.
quq_CCCP:
но по мне ты усложнил его через чур.
Чего ж я такого черезчур наовэркодил, если не секрет?
Ну как по мне, уж много импортных библиотек которые бы если честно "не усрались", про твой личный код ничего говорить не буду, тут на вкус и цвет все фломастеры разные, а вот таймер утилс - мусор, драколич подтвердит. Таймер самый легкий хендл в игре, аттач и ресайкл работает медленне чем просто создание таймера + хештаблица. Потом ты делаешь спелл на показ, в своей карте хоть на gamecache + RB, тут на публику.
Лично я считаю дурным тоном пихать 100500 сторонних либ в спеллы на показ + еще и сомнительные наработки.
NazarPunk, Насчет мемхака:
1 - ты сам себе осмысленно собрался выстрелить в ногу?
2 - если бы хотели, вы бы уже сидели и смотрели на надпись на экране "Перевидите 100usd на кошлек xxxxxxxxxxxxxxxxx, иначе вашим фалам хана!" а так это никому не интересно, потом написать уж прям тру вирус - не так уж и просто, потом "ЗАЧЕМ" - ? Ради потроллить пару человек сидеть и кодить много кода? Ну те кто страдает такими вот шуточками, на это попросту неспособен, а тот кто способен подобным никогда заниматься не будет.
32

» WarCraft 3 / Как установить аглоязычный редактор на лицензию?

Принятый ответ
Вопрос зачем? Все что ты оставил стандартным будет на английском языке у зарубежных игроков, что за глупости?
32

» WarCraft 3 / Заклинание: Blink Strike

NazarPunk, как почему, есть идеи как это сделать еще? С тем функционалом что подарил нам лич можно без проблем делать абилки по всем правилам варкравта, всякие копии атаки, модификаторы, и так далее, все что есть в игре у стандартных абилок - есть и у вас, неужели это так плохо?
Если вам жмет кошелек то можно найти с++ программиста, который напишет вам ддл и у вас будет то чего до этого в игре даже близко не было. Не надо ни каких лаунчеров, хренаунчеров, все работает как есть.
Спел довольно прикольно выглядит, но по мне ты усложнил его через чур.
ClotPh, можно вручать ядовитые стрелы герою и через TrowSpell кидать на врагов, механика будет как у вивера в доте.
32

» WarCraft 3 / Ошибка при загрузке карты в World Edit

Принятый ответ
В мпк редакторе открой карту да удали модель, вот и все.
32

» WarCraft 3 / Хак на память Warcraft3

Хук на событие - Юнит успешно завершает атаку.
код
  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))
Вдруг кому то еще пригодится.
32

» WarCraft 3 / Как отследить убивающего юнита в таймере?

PT153, ну потому что события вешаются на обьект, к примеру на юнита, а не только на триггер. TriggerRegister*** возвращает triggerevent.
Ну подробнее DracoL1ch, поведает.
32

» WarCraft 3 / Как отследить убивающего юнита в таймере?

Clamp, ну я же говорю, плз пример в студию, то бывают не совсем примитивные задачи, мне нужно точно узнать что юнит умер EVENT_WINGED_DETAH, проверить на полученный урон в 0 ед, а так же проверить приказ без указания цели, таких юнитов может быть одновременно до 10.
DracoL1ch, боятся за производительность, триггер же тяжелее таймера + евенты не удаляются.
Хотя я когда проверял на карте где 30 юнитов херачили друг-друга, плодились и умирали на протяжении 15 минут, проблем чето не заметил, ни с памятью ни с числом хендлов...
32

» WarCraft 3 / Как отследить убивающего юнита в таймере?

Clamp, эмм - сударь, давайте я вам нарежу задач, а вы мне расскажите как сделать не сложнее статическим триггером? Я конечно понимаю что делать как у фрога ради анимации героя спустя 0.5 сек триггер с событием время истекло это глупость, но бывают случаи когда тебе нужно следить за конкретным юнитом особенно тщательно, события урона, смерти, получения приказов.
32

» WarCraft 3 / Что это за типы урона такие и чем они отличаются?

Принятый ответ
Тип урона, есть целая статья, ссылка
Ну большая часть - копии, особо ни на че не влияют, некоторые влияют, на взаимодействие с резистами.
Их все можно проверить мемхаком, но увы близзарды не доделали функции для jass и просто так сделать проверки на тип атаки, урона и оружия низя.
32

» WarCraft 3 / WFE - Warcraft Feature Extender

А какие там проблемы с инжектом? Вар3 процесс не удается найти? Или что антивири ругаются?
32

» WarCraft 3 / WFE - Warcraft Feature Extender

Tailer007, я ктому что нашлись люди и переделали карты на мемхак, подрубили античиты. Был бы не интересен - не старались бы, насчет не очень дружит - дружит не очень он только с сjass, но это всего то лишь несколько функций, ибо весь мемхак это typecast функции да сломанный массив, далее уже простые функции чтения \ записи которые ничего такого не используют, никак не багуют с софтом, работают в редакторе с надстройками.
Насчет 95 винды мб это о стиле окон, сколько воды то утекло с тех пор.... Игры тех лет то частенько не запускаются...
32

» WarCraft 3 / WFE - Warcraft Feature Extender

Tailer007, раскажие это 100500 версиям ах карт, доту фрога уже несколько версий ах с мемхаком, и не абы каким, а именно на запись в память.
32

» WarCraft 3 / WFE - Warcraft Feature Extender

Tailer007, не ну я это понимаю, я о другом, что можно сделать и как программу и как длл плагин для тех кто карты делает, мемхак потихоньку набирает популярность.
32

» WarCraft 3 / WFE - Warcraft Feature Extender

Tailer007, ну можно и седелать просто длл и подгружать его мемхаком или сторонним exe файлом, чтобы всем желающим было удобно. То мучатся, не могут выбрать хоткеи, хелперы, от античитов страдают, а тут зашел и сразу тебе есть все необходимое, надо будет попробовать, мб игрокам понравится?
32

» WarCraft 3 / Простые триггеры.

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

» WarCraft 3 / WFE - Warcraft Feature Extender

Tailer007, На ракапе есть один секрет, как запустить мемхак.
Кстати как у дота хелпера будет расширенная инфа в интерфейсе? хп, мп, реген, скорость, резисты, модификаторы?
32

» WarCraft 3 / Вывод в файл

Это preload exploit, а точнее функция PreloadGenEnd("путь к файлу") которая создает pld файл по указанному пути, в него попадает все что подгружал вар в этот момент.
32

» WarCraft 3 / WFE - Warcraft Feature Extender

Tailer007, ну собственно вот наработка - xgm.guru/p/wc3/memory-hack-with-natives
Так же я расколупал китайскую карту и выкполупал мемхак на 1.27+, оно реально работает. так что можно не боятся что как плейграунд перейдут все на 1.27 и все, хана, капец. Все евро PvPGN сидящие на 1.27b и 1.28a тоже доступны.
Конечно, это создает некоторые сложности. Но когда это останавливало модмейкеров Warcraft 3?
Ну а с загрузкой и выгрузкой длл большой вопрос, мне бы тоже хотелось несколько плюшек запилить, но как сделать так чтобы у игроков все это не висело в памяти после игры, да и вовсе на том же айкапе можно поиграть в карту с мемхаком, а потом пойти в айдотку и крашнутся, очень бы не хотелось делать такие подлянки игрокам.
32

» WarCraft 3 / WFE - Warcraft Feature Extender

Tailer007, Ну нативки можно добавить самим, IseFog же делал уже, так же нам нечего боятся старших патчей, есть мемхак на 1.27+, с записью и всем чем над. Правд на старшие патчи оффсетов маловато. Щяс пока думаю над выгрузкой dll при выходе из карты, то хотелось бы напихать улучшалок, но вот они будут висеть всю игру, прока юзер не закроет вар.
В дота хелпере кстати вроде есть восстановление памяти, полезная штука, если делать изменения вроде детекта урона или еще чего.