Алгоритмы, Наработки и Способности
Способ реализации:
Jass
Тип:
Наработка
**1. Требуется редактор jngp(который может работать с мемхаком), либо jasscraft, либо иной способ, чтобы наработки с мемхаком корректно компились
  1. Сломанный массив Memory (который позволяет читать и писать в память)**
  2. Зачем это нужно ? для смены параметров скила (кд, дальность применения, и других данных), для определенного скила, который имеется у конкретного юнита
Собственно код.
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)
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
15
7 лет назад
0
Если я буду использовать либу из твоего анти мапхака, то это все будет работать?
0
6
7 лет назад
0
да
0
3
7 лет назад
0
Сломанный массив Memory, можна подробно про ето
1
32
7 лет назад
1
Vitalik8:
Сломанный массив Memory, можна подробно про ето
Тему про мемхак читаем... ссылка
Этот комментарий удален
0
21
7 лет назад
Отредактирован ClotPh
0
Короче, было лишних многобукаф, основная суть следующая:
  • Если в игре заюзать изменение ренджа абилки (во всяком случае, до 99999), то после выхода из вара за просмотром реплея такой игры или участием в ней будет сообщение про фатал еррор. Не смертельно и даже не то чтобы неприятно, но просто факт.
  • Такая абилка становится какой-то особенной, "отделенной" - не подвергается по крайней мере некоторым изменениям, которые должны глобально влиять на все такие абилки всех таких юнитов.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.