Добавлен 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
Отредактирован 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 исчезла", а что на абилу будет вешаться глобально, меня это устраивает).
Полная уверенность, что раньше так не было... Видать, помолился здесь кто за меня, ну спасибо ему навеки.
В общем, пока сворачиваюсь, изучим последствия.
///////////