**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)
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
6
ClotPh:
Ну код станет оптимальнее, ок, но не в этом же дело сейчас.
Все-таки мне кажется, что это из-за виджетайзера. Потому что он мне так уже уничтожал москитных даммиков, считая их "неиспользуемыми объектами", а мне потом разбираться, почему вместо файерболлов пустота летала.
Он, наверное, что-то там корежит в данных способностей при сжатии.
Потому что коды ведь одинаковые в тест-карте и в основной? (Если нет - пальцем на различия). А в тест-карте не фаталит, а в основной фаталит. А основная отличается:
  • Тем, что в ней дохрена всего;
  • Тем, что сжималась виджетайзером и оптимайзером.
Влияет ли первая причина? Вряд ли. Вывод...
***
Нде. Чушь какая-то. Дошло сейчас прогнать тест-карту через виджик и оптимайзер (т. е. протестировать так же, как основную) - нет фатала.
Оптимизация одинаковая. Код спелла одинаковый.
Одна карта фаталит вар после выхода из него, если спелл юзается, другая нет. Втф?
А что вообще будет, кстати, если клонабилити не писать?
Функция не подействует, код не скомпилируется или?...
все из-за malloc, варик не может очистить память из данного диапазона. На днях выложу код, делал через абилу с 1кк лвл, туда и писал данные, фаталов после этого небыло (главное не создавать такую абилу в редакторе)
function CloneAbilityData takes integer a returns nothing 
local integer Address = malloc(23*4)
local integer AddressTabl = malloc(22*4+26*4*GetAbilityMaxLevel2(a) + 4 ) //Вот сдесь надо отказаться от malloc, и проблема решится.
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
21
Ну т. е. функцию CloneAbilityData надо переписанную потом будет просто вставить?
Ок, жду, спасибо.
21
Есть еще смысл ждать? Потому что самостоятельно вообще не представляю, как заменить эти 2 строчки.
16
алекс, закинь обновленную функицю, там же не высшая математика, легко принцип пересказать
21
И тишина
Блин, серьезно, я лучше тут заплачу, не жалко, если определим способ анонимно перекинуть деньги
16
у меня такого функционала не реализовано за ненадобностью, велосипед есть только у автора
21
А автора месяц как нет. С велосипеда упал, наверное. =/
16
ну ты можешь напрямую со скиллом работать, не клонируя его, тогда он изменится у всех юнитов, кто с ним будет бегать. вопрос в том, ЧТО ты хочешь сделать. без клона вполне жить можно, я, например, меняю каст ренж только в моент приказа и до самого каста, в остальное время - сбрасываю на дефолт
21
DracoL1ch, "не клонируя его, тогда он изменится у всех юнитов" - ну то есть как GetAbilityCD и SetAbilityCD из основного мемхака вешают изменение перезарядок на абилу, а не на юнита с ней.
Так в принципе вполне подойдет, только описания изменить ну и при вешании на "дагоны" всякие предметные, конечно, в обоюдоострые мечи превращается, но нормально. А на геройские абилы сохранит мощность, если, конечно, не -duplicate играется.

Если есть такая готовая функция, очень хотелось бы.
Потому что вышенаписанные SetAbilityDataHeroRng и GetAbilityDataHeroRng без предварительного использования CloneAbilityData (опять же как помню и вижу по сообщениям выше, сейчас уже перепроверять трудно, героя в отдельной карте просто не существует) просто не давали запустить карту.
16
с описаниями проблема. Почему-то редактирование строк может привести к спонтанным фаталам, и я не могу понять, в чем проблема. Даже создавая новые, игра будто кэширует длину старой, и в случае чего это может вылиться в вылет. Так что пока динамические описания я не использую, только по крайней необходимости.
изменение перезарядки ты можешь применять таймером через 0 после spell_effect, вручную регулируя конкретное время, нет нужды для этого данные менять, если не хочешь глобального эффекта
21
DracoL1ch, что-то мы вообще уже кто в лес, кто по дрова, хз, я не меняю сейчас описания и у меня нет вопросов по перезарядкам.
Меня интересует функция изменения дальности спелла, не требующая для своего действия клонабилити. Что нужно, чтобы ее увидеть?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.