DracoL1ch, я правильно понимаю, что можно сделать 1 ауру (self) на основе торнадо и меняя ее поле через мемхак, добавлять нужный баф?
Поковыряюсь на досуге, должно сильно ускорить прелоад моей системки бафов на основе торнадо. Не знаешь, в поле абилки хранится ссылка на список бафов или сложнее?
А если потом захочется сделать не 4сек а 5?
Как-то нагляднее код становится на мой взгляд, и балансить удобнее если все параметры сразу вынести из функций
а по поводу нескольких уровней, все равно нужно несколько, хотя и намного меньше
Предположим игрок использовал этот навык, в способность пишется число, но через 1 сек другой персонаж тоже использовал ту же способность, при одном лвле получим что у всех юнитов попавших под первое применение будет замедление по цифрам как у 2го
Я бы сделал так если для рпг:
Аура 16 уровней, цель - self
Выбираем всех юнитов в группу, считаю коэф-т замедления от брони использовавшего, раздал всей группе ауру с лвлом равным номеру использовавшего способность игрока, через фунцию мемхака редактирую соответствующее (по уровню) поле ауры, по прошествию таймера (TimerEx) с группы записанной в структуру удается аура и ее эффект (так удаление иконки баффа мгновенно)
Есть фукции на редактирование полей абилок, но сейчас не смогу выложить
Here
function SetAbilityRealParam takes unit u, integer id, integer off, real newVal, integer lvl returns nothing
local integer k=GetUnitAbility(u,id)
if Memory[k/4+0x54/4]>0 then
call WMem(RMem(RMem(k+0x54)+0x54)+(lvl-1)*26*4+(8+off)*4,cleanInt(realToIndex(newVal)))
endif
endfunction
function GetAbilityRealParam takes unit u, integer id, integer off, integer lvl returns real
local integer k=GetUnitAbility(u,id)
if RMem(k+0x54)>0 then
return cleanReal(mI2R(RMem(RMem(RMem(k+0x54)+0x54)+(lvl-1)*26*4 + (8+off)*4)))
endif
return .0
endfunction
до 0x700 не нашел, кроме первого десятка адресов - одни нули
искал так
set j = GetAbilityDataDefById('A006')
set i = 0
loop
exitwhen i>=400
call BJDebugMsg(R2S(cleanReal(mI2R(RMem(j+4*i))))+" "+I2S(i))
set i = i+1
endloop
function GetAbilityDataDefById takes integer id returns integer
local integer a=CallThisCallWith1Args(pGetAbilityDataDefAddr,id)
if a>0 then
return a
endif
return 0
endfunction
может имеет значение кол-во лвлов?
Складывается впечатление что там нужна многоуровневая ссылка, если у канала отличная от осальных абилок структура
Да, однозначно идет перемещение данных. При 1 уровне все нормально работало (0x6c - 0x88 примерно)
Попробовал поискать по ссылкам, ничего дельного не нашел
Возможно "канал" так же имеет отличную от остальных абилок структуру
Рабочий вариант
function StartAbilityCD takes unit whichUnit, integer abilityId returns boolean
local integer pAbility = 0
local real cd = GetAbilityCD(abilityId, GetPlayerId(GetOwningPlayer(whichUnit))+1)
if whichUnit == null or GetUnitAbilityLevel( whichUnit, abilityId ) < 1 or cd == 0.00 then
return false
endif
set pAbility = GetUnitAbility(whichUnit, abilityId)
if pAbility < 1 then
return false
else
if RMem(pAbility+0x134)==-1 and RMem(pAbility+0x138)==-1 then
call WMem(pAbility+0x134,0)
call WMem(pAbility+0x138,0)
endif
set Memory[pReserverdIntArg1 / 4] = mR2I(cd)
call CallThisCallWith2Args( pStartAbilityCD, pAbility, pReserverdIntArg1 )
return IsAbilityOnCooldown( pAbility )
endif
return false
endfunction
Вот для сокращения времени синхронизации и спрашиваю, нужно передавать массив в примерно 30integer + 200 real
От КАЖДОГО игрока
И это если брать по минимуму
Статью читал
Идея в отправке локально сохраненного сейва пакетом всем игрокам для избежания рассинхрона
При каждой синхронизации будет лаг не меньше половины секунды. Сейв сетевой игры помнит имена и позиции игроков, это может привести к неопределённому поведению игры при его загрузке. Ты учитывал эти моменты?
Имел ввиду сейв код в текстовом файле, пролаг - не проблема
Чтобы в орпг при загрузке карты загружать героя без участия игрока
function SetUnitUIIcon takes integer id, string s returns nothing
local integer a=GetUnitUIDefByIdCaching(id)
if a>0 then
set a=RMem(a+0x248)
if a>0 then
call WMem(a,GetStringAddress(s))
endif
endif
endfunction
Менять параметры способностей, например, DataA
Проверил деление на 4, сделал через WMem/RMem - заработало как надо, хотел шанс уворота задавать
UnitUbertip и UnitTip так же работает, теперь бы с полями "Description" и "Name" разобраться
Ага инициализацию пофиксил
Вернулся к этой проблеме xgm.guru/p/100/189998
Как это сделать адекватно? SetAbilityRealParam не дает эффекта
Вот
function SetAbilityReal takes unit u, integer id, integer off, real newVal, integer lvl returns nothing
local integer k=GetUnitAbility(u,id)
if Memory[k/4+0x54/4]>0 then
set Memory[ Memory[Memory[k/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 8 + off] = cleanInt(realToIndex(newVal))
endif
endfunction
function GetAbilityReal takes unit u, integer id, integer off, integer lvl returns real
local integer k=GetUnitAbility(u,id)
if Memory[k/4+0x54/4]>0 then
return cleanReal(indexToReal( Memory[ Memory[Memory[k/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 8+off] ))
endif
return .0
endfunction
Set нормально работает с Evasion, а Get выдает фатал
Только Set высталяет что-то не то
Да, сижу, обновляю версию
Потом отпишусь о результатах
Как ни странно, перестал работать всё. Даже базовый урон на атаках не могу сменить
Скопировал все из карты, добавил нужные функции и ничего, теперь где-то в зкромах мемхака поток прерывается
Попробуемс)
Переписал GetAbilityStringParam, заменив GetAbilityUIDefAddr на GetUnitUIDefAddr, получил фатал
GetUnitUIDefAddr дает не 0
Перебором выяснит что некоторые оффсеты дают фатал, пробую искать дальше
Ред. Nelloy
» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III
Ред. Nelloy
» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III
Ред. Nelloy
» WarCraft 3 / [Мемхак] прошу простую готовую функцию
Поковыряюсь на досуге, должно сильно ускорить прелоад моей системки бафов на основе торнадо. Не знаешь, в поле абилки хранится ссылка на список бафов или сложнее?
Ред. Nelloy
» WarCraft 3 / [Мемхак] прошу простую готовую функцию
Как-то нагляднее код становится на мой взгляд, и балансить удобнее если все параметры сразу вынести из функций
а по поводу нескольких уровней, все равно нужно несколько, хотя и намного меньше
Предположим игрок использовал этот навык, в способность пишется число, но через 1 сек другой персонаж тоже использовал ту же способность, при одном лвле получим что у всех юнитов попавших под первое применение будет замедление по цифрам как у 2го
Ред. Nelloy
» WarCraft 3 / [Мемхак] прошу простую готовую функцию
Аура 16 уровней, цель - self
Выбираем всех юнитов в группу, считаю коэф-т замедления от брони использовавшего, раздал всей группе ауру с лвлом равным номеру использовавшего способность игрока, через фунцию мемхака редактирую соответствующее (по уровню) поле ауры, по прошествию таймера (TimerEx) с группы записанной в структуру удается аура и ее эффект (так удаление иконки баффа мгновенно)
Есть фукции на редактирование полей абилок, но сейчас не смогу выложить
local integer k=GetUnitAbility(u,id)
if Memory[k/4+0x54/4]>0 then
call WMem(RMem(RMem(k+0x54)+0x54)+(lvl-1)*26*4+(8+off)*4,cleanInt(realToIndex(newVal)))
endif
endfunction
local integer k=GetUnitAbility(u,id)
if RMem(k+0x54)>0 then
return cleanReal(mI2R(RMem(RMem(RMem(k+0x54)+0x54)+(lvl-1)*26*4 + (8+off)*4)))
endif
return .0
endfunction
Ред. Nelloy
» WarCraft 3 / Канал
У меня с многоуровневым каналом работает
local integer k = RMem(GetAbilityDataDefById(id) + 4*21)
return mI2R(RMem(k + 4*26*(lvl-1) + 4*6))
endfunction
local integer k = RMem(GetAbilityDataDefById(id) + 4*21)
call WMem(k + 4*26*(lvl-1) + 4*6, cleanInt(realToIndex(NewValue)))
endfunction
local integer k = RMem(GetAbilityDataDefById(id) + 4*21)
return mI2R(RMem(k + 4*26*(lvl-1) + 4*7))
endfunction
local integer k = RMem(GetAbilityDataDefById(id) + 4*21)
call WMem(k + 4*26*(lvl-1) + 4*7, cleanInt(realToIndex(NewValue)))
endfunction
Ред. Nelloy
» WarCraft 3 / Канал
set i = 0
loop
exitwhen i>=400
call BJDebugMsg(R2S(cleanReal(mI2R(RMem(j+4*i))))+" "+I2S(i))
set i = i+1
endloop
Складывается впечатление что там нужна многоуровневая ссылка, если у канала отличная от осальных абилок структура
Да, однозначно идет перемещение данных. При 1 уровне все нормально работало (0x6c - 0x88 примерно)
Попробовал поискать по ссылкам, ничего дельного не нашел
» WarCraft 3 / StartAbilityCD (MemHack)
local integer pAbility = 0
local real cd = GetAbilityCD(abilityId, GetPlayerId(GetOwningPlayer(whichUnit))+1)
if whichUnit == null or GetUnitAbilityLevel( whichUnit, abilityId ) < 1 or cd == 0.00 then
return false
endif
set pAbility = GetUnitAbility(whichUnit, abilityId)
if pAbility < 1 then
return false
else
if RMem(pAbility+0x134)==-1 and RMem(pAbility+0x138)==-1 then
call WMem(pAbility+0x134,0)
call WMem(pAbility+0x138,0)
endif
set Memory[pReserverdIntArg1 / 4] = mR2I(cd)
call CallThisCallWith2Args( pStartAbilityCD, pAbility, pReserverdIntArg1 )
return IsAbilityOnCooldown( pAbility )
endif
return false
endfunction
» WarCraft 3 / Text File (Memhack)
» WarCraft 3 / Text File (Memhack)
чтобы все работало в стандартом комплекте
Ред. Nelloy
» WarCraft 3 / Text File (Memhack)
» WarCraft 3 / Формирование пакетов с мемхаком
» WarCraft 3 / Формирование пакетов с мемхаком
От КАЖДОГО игрока
И это если брать по минимуму
Статью читал
» WarCraft 3 / Формирование пакетов с мемхаком
» WarCraft 3 / Формирование пакетов с мемхаком
Чтобы в орпг при загрузке карты загружать героя без участия игрока
Ред. Nelloy
» WarCraft 3 / Смена атаки через Мемхак
Ред. Nelloy
» WarCraft 3 / Баловство с мемхаком
local integer a=GetUnitUIDefByIdCaching(id)
if a>0 then
set a=RMem(a+0x248)
if a>0 then
call WMem(a,GetStringAddress(s))
endif
endif
endfunction
» WarCraft 3 / Memory Hack
» WarCraft 3 / Memory Hack
Это то описание что отображается вне инвентаря, не критично, но хотелось бы)
» WarCraft 3 / Memory Hack
Проверил деление на 4, сделал через WMem/RMem - заработало как надо, хотел шанс уворота задавать
UnitUbertip и UnitTip так же работает, теперь бы с полями "Description" и "Name" разобраться
Ред. Nelloy
» WarCraft 3 / Memory Hack
Вернулся к этой проблеме xgm.guru/p/100/189998
Как это сделать адекватно? SetAbilityRealParam не дает эффекта
local integer k=GetUnitAbility(u,id)
if Memory[k/4+0x54/4]>0 then
set Memory[ Memory[Memory[k/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 8 + off] = cleanInt(realToIndex(newVal))
endif
endfunction
local integer k=GetUnitAbility(u,id)
if Memory[k/4+0x54/4]>0 then
return cleanReal(indexToReal( Memory[ Memory[Memory[k/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 8+off] ))
endif
return .0
endfunction
Только Set высталяет что-то не то
» WarCraft 3 / Memory Hack
Потом отпишусь о результатах
Как ни странно, перестал работать всё. Даже базовый урон на атаках не могу сменить
Скопировал все из карты, добавил нужные функции и ничего, теперь где-то в зкромах мемхака поток прерывается
» WarCraft 3 / Memory Hack
GetUnitUbertip - фатал
на юнита тоже...
» WarCraft 3 / Memory Hack
Ред. Nelloy
» WarCraft 3 / Memory Hack
Переписал GetAbilityStringParam, заменив GetAbilityUIDefAddr на GetUnitUIDefAddr, получил фатал
GetUnitUIDefAddr дает не 0
Перебором выяснит что некоторые оффсеты дают фатал, пробую искать дальше