Добавлен 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)
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Блин, серьезно, я лучше тут заплачу, не жалко, если определим способ анонимно перекинуть деньги
Если есть такая готовая функция, очень хотелось бы.
адреса НЕ деленные на 4, можешь сам разделить, если нужно
дальность лежит в offset+0x74+0x68*lvl и это real, поэтому нужно конвертить туда-сюда, если нужно складывать или что-то еще
range = желаемывй ренж
Отредактирован ClotPh
Мне кажется, НЕ должно действовать, но уж на уровне текущего понимания
local integer a=GetUnitAbility(u,id)
local integer offset = 0
local integer lvl = 0
if a>0 then
set offset=RMem(a+0x54)
set lvl=RMem(a+0x50)
WMem(offset+0x74+0x68*lvl,SetRealIntoMemory(r))
endif
return r
endfunction
local integer a=GetUnitAbility(u,id)
local integer offset = 0
local integer lvl = 0
local integer r = 0
if a>0 then
set offset=RMem(a+0x54)
set lvl=RMem(a+0x50)
set r = RMem(offset+0x74+0x68*lvl)
endif
return r
endfunction