Добавлен Alexander12,
опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Jass
Тип:
Наработка
**1. Требуется редактор jngp(который может работать с мемхаком), либо jasscraft, либо иной способ, чтобы наработки с мемхаком корректно компились
- Сломанный массив Memory (который позволяет читать и писать в память)**
- Зачем это нужно ? для смены параметров скила (кд, дальность применения, и других данных), для определенного скила, который имеется у конкретного юнита
Собственно код.
function SetAbilityDataAInteger takes integer add,integer lvl,integer newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 8 ] = newdata
endif
endfunction
function GetAbilityDataAInteger takes integer add,integer lvl returns integer
if Memory[add/4+0x54/4]>0 then
return Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 8 ]
endif
return 0
endfunction
function SetAbilityDataBInteger takes integer add,integer lvl,integer newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 9] = newdata
endif
endfunction
function GetAbilityDataBInteger takes integer add,integer lvl returns integer
if Memory[add/4+0x54/4]>0 then
return Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 9]
endif
return 0
endfunction
function SetAbilityDataCInteger takes integer add,integer lvl,integer newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 10 ] = newdata
endif
endfunction
function GetAbilityDataCInteger takes integer add,integer lvl returns integer
if Memory[add/4+0x54/4]>0 then
return Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 10 ]
endif
return 0
endfunction
function SetAbilityDataDInteger takes integer add,integer lvl,integer newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 11 ] = newdata
endif
endfunction
function GetAbilityDataDInteger takes integer add,integer lvl returns integer
if Memory[add/4+0x54/4]>0 then
return Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 11 ]
endif
return 0
endfunction
function SetAbilityDataEInteger takes integer add,integer lvl,integer newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 12 ] = newdata
endif
endfunction
function GetAbilityDataEInteger takes integer add,integer lvl,integer newdata returns integer
if Memory[add/4+0x54/4]>0 then
return Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 12 ]
endif
return 0
endfunction
function SetAbilityDataAReal takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 8 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataAReal takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal( Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 8] ))
endif
return .0
endfunction
function SetAbilityDataBReal takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 9] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataBReal takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal( Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 9] ))
endif
return .0
endfunction
function SetAbilityDataCReal takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 10 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataCReal takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal( Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 10] ))
endif
return .0
endfunction
function SetAbilityDataDReal takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 11 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataDReal takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal( Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 11] ))
endif
return .0
endfunction
function SetAbilityDataEReal takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 12 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataEReal takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal( Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 12] ))
endif
return .0
endfunction
function SetAbilityDataCast takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 1 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataCast takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal(Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 1 ] ))
endif
return .0
endfunction
function SetAbilityDataDur takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 2 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataDur takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal(Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 +2] ))
endif
return .0
endfunction
function SetAbilityDataHeroDur takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 3 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataHeroDur takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal(Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 +3] ))
endif
return .0
endfunction
function SetAbilityDataCooldown takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 5 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataCooldown takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal(Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 +5] ))
endif
return .0
endfunction
function SetAbilityDataHeroArea takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 6 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataHeroArea takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal(Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 +6] ))
endif
return .0
endfunction
function SetAbilityDataHeroRng takes integer add,integer lvl,real newdata returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 7 ] = cleanInt(realToIndex(newdata))
endif
endfunction
function GetAbilityDataHeroRng takes integer add,integer lvl returns real
if Memory[add/4+0x54/4]>0 then
return cleanReal(indexToReal(Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 +7] ))
endif
return .0
endfunction
function SetAbilityManaCostAddr2 takes integer add,integer lvl,integer mc returns nothing
if Memory[add/4+0x54/4]>0 then
set Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 +(lvl-1)*26 + 4 ] = mc
endif
endfunction
function GetAbilityManaCostAddr2 takes integer add,integer lvl returns integer
if Memory[add/4+0x54/4]>0 then
return Memory[ Memory[Memory[add/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 ]
endif
return 0
endfunction
function GetAbilityMaxLevel2 takes integer abil returns integer
return Memory[Memory[abil/4+0x54/4]/4+15]
endfunction
//Вспомогательные функции
function GetAbilityTableId takes integer a returns integer
return Memory[Memory[a/4+0x54/4]/4+0x54/4]
endfunction
function SetAbilityTableId takes integer a,integer TableId returns nothing
set Memory[Memory[a/4+0x54/4]/4+0x54/4] = TableId
endfunction
function GetAbilityDataId takes integer a returns integer
return Memory[a/4+0x54/4]
endfunction
function SetAbilityDataId takes integer a, integer DataId returns nothing
set Memory[a/4+0x54/4] = DataId
endfunction
// Копирование данных о скиле, и присвоению абилити новых данных.
function CloneAbilityData takes integer a returns nothing
local integer Address = malloc(23*4)
local integer AddressTabl = malloc(22*4+26*4*GetAbilityMaxLevel2(a) + 4 )
call CopyMemory(Address,GetAbilityDataId(a),22*4)
call CopyMemory(AddressTabl,GetAbilityTableId(a),26*4*GetAbilityMaxLevel2(a) + 4)
call SetAbilityTableId(a,AddressTabl)
call SetAbilityDataId(a,Address)
endfunction
чтобы можно было менять данные, нужно использовать функцию: function CloneAbilityData takes integer a returns nothing
для конкретного скила у конкретного юнита. после применения этой функции, можно модифицировать скил, рекомендовано, часто не использовать эту функцию.
для конкретного скила у конкретного юнита. после применения этой функции, можно модифицировать скил, рекомендовано, часто не использовать эту функцию.
Пример:
local integer a = GetUnitAbility(u,'A001')
call CloneAbilityData(a)
call SetAbilityDataHeroRng(a,1,5000)
call SetAbilityDataBReal(a,1,450)
call CloneAbilityData(a)
call SetAbilityDataHeroRng(a,1,5000)
call SetAbilityDataBReal(a,1,450)
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован ClotPh
local integer offset = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set Memory[a/4+0x54/4] = r
endif
endfunction
local integer offset = 0
local integer r = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set r = ReadMemory(offset+0x74+0x68*lvl)
endif
return r
endfunction
if (u6 != null) and UnitHasBuffBJ(u5,'B0H6') == true then
loop
exitwhen i > 10
set i = i+1
if GetSpellRange(a, i) < 99999 then
call SetSpellRange(a,i,99999)
call UnitRemoveAbilityBJ( 'A27A', u5 )
call UnitRemoveBuffBJ( 'B0H6', u5 )
endif
endloop
endif
ДЕЛАЕМ НЕОГРАНИЧЕННУЮ ДАЛЬНОСТЬ СПОСОБНОСТИ, ЕСЛИ ОНА УЖЕ НЕ НЕОГРАНИЧЕННАЯ - ЗАКРЫТО.
////////
set Memory[a/4+0x54/4]=SetRealIntoMemory(I2R(r)) фаталит при вызове
WMem(offset+0x74+0x68*lvl,SetRealIntoMemory(I2R(r))) не компилится
write(offset+0x74+0x68*lvl,SetRealIntoMemory(I2R(r))) не компилится
//////////////////
local integer offset = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set Memory[a/4+0x54/4]=SetRealIntoMemory(r)
endif
endfunction
///////////
Значит, принимать число оно принимает...
///////
конвертируй правильно
local integer offset = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set Memory[a/4+0x54/4]=SetRealIntoMemory(r)
endif
endfunction
/////////
////////////
И сразу готовую функцию офк хрен кто даст. Вот что значит НЕоплачиваемые помощники.
/////////////////
local integer offset = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set Memory[offset+0x74+0x68*lvl] = r
endif
endfunction
^ предыдущее = фатал, ща там попробую I2R(r)
///////////
Благополучно не компилится
////////
///////
Ну бред, с**а, а время летит...
////////////
///////////
local integer offset = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set Memory[offset+0x74+0x68*lvl] = r
endif
endfunction
//////////
local integer offset = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set Memory[a/4+0x54/4]=SetRealIntoMemory(r)
endif
endfunction
/////////////////
/////////
Попробую так подсократить пока.
local integer offset =ReadMemory(a+0x54)
set Memory[offset+0x74+0x68*lvl] = r
endfunction
/////////////
/////////////
Ну и сразу сфаталило, ппц.
////////
local integer offset = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set Memory[offset+0x74+0x68*lvl] = r
endif
endfunction
///////// А, нет, тьфу, так оно вообще фаталит! Вообще уже мозги болят...
local integer offset = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set Memory[a/4+0x54/4] = r
endif
endfunction
//////////
А вот так фаталит, что через R2I(r), что просто через r
/////////
local integer offset = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set Memory[offset+0x74+0x68*lvl] = R2I(r)
endif
endfunction
////////
ты мешаешь "чистые" и "грязные" офсеты - массив Memory[] работает ТОЛЬКО с деленнвыми на 4, Read/WriteMemory - глянь в функции, если нет деления - то тоже надо отправлять туда уже деленные. Если же в последниз есть деление, то моя функция верна.
Ну и от лвл надо отнимать 1, ибо уровни начинаются с 0, а не с 1.
Отредактирован ClotPh
Функция WriteMemory из либы? Вот
set Memory[address / 4] = value Inline - friendly
endfunction
/////////////
Отредактирован ClotPh
Я ведь ее пытаюсь заменить. Функция Алекса нормально действовала, но фаталила вар после игры.
/////////////////
ППЦ. ДУРДОМ.
Короче, после удаления в старой карте строчки со CloneAbility функции Алекса внезапно сохранили работоспособность (т. е. "проблема с malloc исчезла", а что на абилу будет вешаться глобально, меня это устраивает).
Полная уверенность, что раньше так не было... Видать, помолился здесь кто за меня, ну спасибо ему навеки.
В общем, пока сворачиваюсь, изучим последствия.
///////////