8gabriel8, не бред, скорее всего из за локализации ошибки, интерпритация скрипта происходит при загрузке карты движком, поэтому дело тут не в близзардах а в кривых руках и ошибках в коде.
Тут сложный вопрос, не видя код карты и задумку, нельзя сказать наверняка.
Существуют карты с очень большим кол-вом обьектов, но они не лагают, далеко ходить не надо - Замок Скиби, там по 90 крипов за волну + мини игры, но никаких тормозов с лагами как в лтд нету даже близко.
Насколько помню баффы наносят 0 урона с особым флагом, который детектится мемхаком, проверяй не хочу.И да время действия из слк таблицы можно добыть мемхаком.
Ну вот готовый хук для детекта успешного завершения атаки.
Это не событие на 1 юнита, это событие сразу на весь клас widget, как только какой либо юнит совершит атаку по любому виджету, это событие сработает. В этом событии и вешаются модификаторы атаки (в движке). Можно сделать пассивки на атку для мили юнитов. Функции изменения атаки у юнита и прочее спрашивать у DracoL1ch.
код
library EventUnitAttackSuccess requires Memory, Utils
globals
integer pGlobalUnitArrayForDataPassing=0
trigger OnAttack = null
integer SimulatedAttackCounter = 0
integer pReservedMemoryForMeleeAttackHook = 0
integer pMeleeAttackCatcher = 0
integer DataArray1Address
integer DataArrayA
integer array l__DataArrayA
unit GlobalUnitArrayForDataPassing
unit array l__GlobalUnitArrayForDataPassing
endglobals
function PresetSomeArray takes nothing returns nothing
set l__GlobalUnitArrayForDataPassing[1]=null
set l__GlobalUnitArrayForDataPassing[1099]=null
set l__DataArrayA[1]=0
set l__DataArrayA[8191] = 0
return
endfunction
function GetDataFromDataArray1 takes integer i returns integer
return l__DataArrayA[i]
endfunction
function GetDataFromUnitArray takes integer i returns unit
return l__GlobalUnitArrayForDataPassing[i]
return null
endfunction
private function TypecastDataArrayA takes nothing returns nothing
local integer DataArrayA
endfunction
//# +nosemanticerror
function GetDataArrayAAddress takes nothing returns integer
return l__DataArrayA
endfunction
private function TypecastUnitArray takes nothing returns nothing
local integer GlobalUnitArrayForDataPassing
endfunction
//# +nosemanticerror
function GetUnitArrayAddress takes nothing returns integer
return l__GlobalUnitArrayForDataPassing
endfunction
function TimerExpires takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local unit attacker = LoadUnitHandle(ChargesIndicatorData, id, 0 )
local real damage = LoadReal(ChargesIndicatorData, id, 1)
call SetUnitGreenBonusDamage(attacker, R2I(damage) )
call FlushChildHashtable(ChargesIndicatorData, id)
call DestroyTimer(t)
set attacker = null
set t = null
endfunction
function OnAttackDamageCalculationHook takes nothing returns nothing
local integer isource=GetDataFromDataArray1(65)
local integer itarget=GetDataFromDataArray1(66)
local integer result=GetDataFromDataArray1(68)
local unit attacker
local unit attacked
local timer t
local integer id
if result == 1 then
set attacker = GetDataFromUnitArray(3)
set attacked = GetDataFromUnitArray(4)
call BJDebugMsg("Ура в жопе дыра!")
endif
set attacker = null
set attacked = null
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 l__udg_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
function InitMMEhack takes nothing returns nothing
call PresetSomeArray()
set pReservedMemoryForMeleeAttackHook = pCallFastCallWith1Args + 3500//+200
set pMeleeAttackCatcher=GameDLL+0xC6940
set pGlobalUnitArrayForDataPassing=RMem( GetUnitArrayAddress()+0xC)
set DataArray1Address = RMem(GetDataArrayAAddress( )+0xC)
set OnAttack=CreateTrigger()
call TriggerAddAction(OnAttack,function OnAttackDamageCalculationHook)
call InitAttackDamageCalculationHook(GetHandleId(OnAttack))
endfunction
endlibrary
Ну никак таймеры жизни не переделать, удаление баффа = смерть юнита, не снимаются и не паузятся никак кроме паузы...
Таймеры длительности еще бывают у морфов, там их можно бесконечно стартовать с начала, но останавливать все-равно никак нельзя.
WAGARAX, способности не сбивающие текущий приказ, их штук 7 на весь варкравт, все эти абилки без указания цели. Виндвалк, берсерк, божественный щит, иммолейшин, щит маны и все прочие щиты на вкл\выкл.
WAGARAX, Адресса и оффсеты, а так же инструкции. Все сугубо индивидуально. Потому что можно просто менять значения в структуре - тогда нужны оффсеты, а можно сделать "хук" - своего рода событие на выполнение кода в движке, которое запустит другой код, это уже инструкции.
Из доты, в пустой карте сделай такой же скилл с тем же ИД, после сохрани карту и пройдись по ней виджитайзером, открой слк таблицу и целиком скрипируй поля абилки. Вставить думаю будет не проблема...
Bergi_Bear, для реализации вещей которые ждут именно завершения атаки, у лича так сделаны промахи, после успешного завершения атаки он ставит урон в 0 и все, промах готов. Так же можно в этот момент до нанесения урон отрегулировать его, реализация аналога безумия.
Так же это событие глобально для всех виджетов на карте, помнится много кто бился с детектом урона по предметам, а тут все как на ладони. Над попросить весь код системы у лича, посмотреть как сделано, мб там рили сложные вещи с помощью мемхака сделаны очень просто.
WAGARAX, нужен расширенный редактор JNGP у которого стандартный pjass.exe заменен на тот что приложен вначале темы, тогда карты с мемхаком из этой темы ( лучше берите из детекта урона ссылка ) и улыбайтесь, у вас есть мемхак, ну а как использовать его функции описано либо тут либо вы спрашивайте, вам обязательно ответят.
» WarCraft 3 / Не начнет ли лагать карта?
» WarCraft 3 / Не начнет ли лагать карта?
Существуют карты с очень большим кол-вом обьектов, но они не лагают, далеко ходить не надо - Замок Скиби, там по 90 крипов за волну + мини игры, но никаких тормозов с лагами как в лтд нету даже близко.
» WarCraft 3 / отлов завершения wirlwind'a
» WarCraft 3 / Способность стаки от атак!
» WarCraft 3 / Респаун нейтралов как в доте
» WarCraft 3 / Хак на память Warcraft3
Это не событие на 1 юнита, это событие сразу на весь клас widget, как только какой либо юнит совершит атаку по любому виджету, это событие сработает. В этом событии и вешаются модификаторы атаки (в движке). Можно сделать пассивки на атку для мили юнитов. Функции изменения атаки у юнита и прочее спрашивать у DracoL1ch.
» WarCraft 3 / Смертоносный рельеф :D
» WarCraft 3 / WFE - Warcraft Feature Extender
» WarCraft 3 / WFE - Warcraft Feature Extender
Хотя хз, можно ли подгружать прям из архива...
» WarCraft 3 / Как отключить триггерно атаку?
» WarCraft 3 / Использование скрытого скилла
» WarCraft 3 / UnitApplyTimedLife без убийства юнита
Таймеры длительности еще бывают у морфов, там их можно бесконечно стартовать с начала, но останавливать все-равно никак нельзя.
» WarCraft 3 / Юниты тупят при передвижении
» 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