Добавлен
как работают эти функции в мемхаке 1.5?
    function GetFramePointX takes integer pFrame, integer point returns real
        local integer pFramePoint = GetFramePoint( pFrame, point )

        if pFramePoint > 0 then
            return GetRealFromMemory( ReadRealMemory( GetFramePoint( pFrame, point ) + 0xC ) )
        endif

        return 0.
    endfunction

    function GetFramePointY takes integer pFrame, integer point returns real
        local integer pFramePoint = GetFramePoint( pFrame, point )

        if pFramePoint > 0 then
            return GetRealFromMemory( ReadRealMemory( GetFramePoint( pFrame, point ) + 0x10 ) )
        endif

        return 0.
    endfunction
я думал что возвращает x, y точки фрейма в декартовой системе координат экрана но там какие-то 9999999+ цифры, можно ли получить вообще x y одной из 9 точек фрейма?

Принятый ответ

Загляни в триггер MemHackUIAPI, там много примеров использования фреймов.
По делу - конкретный пример использования GetFramePointX
call BJDebugMsg(R2S(GetFramePointX(GetUIHeroBar(), 0)))
Первым аргументом в GetFramePointX суем айди самого фрейма, его можно получить двумя способами:
  1. по названию
function GetFrameByName takes string name,integer id returns integer
Названия всех фреймов удобно показаны здесь: www.hiveworkshop.com/threads/default-names-for-blzgetframebyname... (под катом images)
  1. по уже готовым функциям мемхака, они в триггере APIMemoryGameUI, что я и использовал в примере.
Второй аргумент это точка на фрейме (центр, левая нижняя, правая верхняя, т.п.), константы к ним объявлены в MemHackUIAPI.
Важно еще сказать, что для многих фреймов GetFramePointX|Y может возвращать 0.000, ибо возвращает она не абсолютную позицию фрейма, а относительно родителя. За деталями советую по ссылке выше, там целая серия статей эту тему.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
27
2 года назад
0
ofeerist, то что возвращает не абсолютную позицию точки фрейма мне уже хватило, получается работает не так как хотелось бы
3
12
2 года назад
Отредактирован Daro
3
Даро передает вам послание от владыки Анрайза

call BJDebugMsg( "GetCFrameByName( GoldText, 0 ) = " + IntToHex( GetCFrameByName( "GoldText", 0 ) ) )
GetFrameByName в МемХаке сделан для получения именно фреймов типа CFrame, он не был сделан как в рефорджеде на все фреймы, ибо на момент написания МемХакАПИ оно было банально не нужно.
GetFramePointX/Y принимают значение point не просто так, а подробнее:
TopLeft = 0
TopCenter = 1
TopRight = 2
Left = 3
Center = 4
Right = 5
BottomLeft = 6
BottomCenter = 7
BottomRight = 8
Потому, если фрейм не имеет крепления к TopLeft, а допустим к Center, то нужно вызывать GetFramePointX( frame, 4 ) а не 0. И так далее.
Багов в МемХаке кроме GetTerrainAxisZ не наблюдается, потому не совсем понятно о каких багах речь.
Оффсет для получения CSimpleFrame по имени на 1.26а = 0x61C770
Оффсет для получения CSimpleTexture по имени на 1.26а = 0x61C790
Оффсет для получения CSimpleFontString по имени на 1.26а = 0x61C7B0
Собственно для них есть функции:
function GetCSimpleFrameByName takes string name, integer id returns integer
if pGetCSimpleFrameByName > 0 then
if name != "" then
return fast_call_2( pGetCSimpleFrameByName, GetStringAddress( name ), id )
endif
endif

return 0
endfunction

function GetCSimpleFontByName takes string name, integer id returns integer
if pGetCSimpleFontByName > 0 then
if name != "" then
return fast_call_2( pGetCSimpleFontByName, GetStringAddress( name ), id )
endif
endif

return 0
endfunction

function GetCSimpleTextureByName takes string name, integer id returns integer
if pGetCSimpleTextureByName > 0 then
if name != "" then
return fast_call_2( pGetCSimpleTextureByName, GetStringAddress( name ), id )
endif
endif

return 0
endfunction
Итого, всё что нужно сделать свой враппер и вызвать каждую из функций, пока какая-либо не вернёт адрес отличный от 0.
И получился:
function GetFrameByName takes string name, integer id returns integer
local integer addr = GetCFrameByName( name, id )

if addr == 0 then
set addr = GetCSimpleFrameByName( name, id )
endif

if addr == 0 then
set addr = GetCSimpleTextureByName( name, id )
endif

if addr == 0 then
set addr = GetCSimpleFontByName( name, id )
endif

return addr
endfunction 
Загруженные файлы
0
27
2 года назад
0
Daro, я уже понял, у меня был рассчет получить абсолютную точку фрейма в декартовой системе координат, это просто не то
3
12
2 года назад
Отредактирован Daro
3
rsfghd,
Фреймы не работают на декартовой системе координат, но имеют понятие Абсолютной позиции, но они все транслируются на координатах от -1 до 1, ибо они рисуются на ЭКРАН, а не на МИР, где есть XYZ. У экрана лишь X/Y в пикселях. Очень нелогично делать декартовую систему координат, ибо тогда придётся на каждое разрешение делать свои координаты и т.д.
Для Абсолютной позиции есть GetFrameAbsolutePoint и SetFrameAbsolutePoint, но и она как и описано выше не использует декартовую систему координат, не стоит в общем путать то, что рисуется на CWorldFrameWar3, а что идёт на CGameUI (интерфейс/экран).
0
27
2 года назад
0
Daro, функция GetFrameAbsolutePoint в старом мемхаке находится? или это только у анрайза?
2
12
2 года назад
2
function GetFramePoint takes integer pFrame, integer point returns integer
local integer fid = GetFrameType( pFrame )

if fid > 0 then
return ReadRealMemory( pFrame + 0x4 * point + 0x8 )
endif

return 0
endfunction

// Frame Absolute Point API
function GetFrameAbsolutePoint takes integer pFrame, integer point returns integer
return GetFramePoint( pFrame, point )
endfunction

function GetFrameAbsolutePointX takes integer pFrame, integer point returns real
local integer pFramePoint = GetFramePoint( pFrame, point )

if pFramePoint > 0 then
return GetRealFromMemory( ReadRealMemory( pFramePoint + 0x4 ) )
endif

return 0.
endfunction

function GetFrameAbsolutePointY takes integer pFrame, integer point returns real
local integer pFramePoint = GetFramePoint( pFrame, point )

if pFramePoint > 0 then
return GetRealFromMemory( ReadRealMemory( pFramePoint + 0x8 ) )
endif

return 0.
endfunction
//===========================================

// Frame Relative Point API
function GetFrameRelativePoint takes integer pFrame, integer point returns integer
return GetFramePoint( pFrame, point )
endfunction

function GetFrameRelativePointParent takes integer pFrame, integer point returns integer
local integer pFramePoint = GetFramePoint( pFrame, point )

if pFramePoint > 0 then
return ReadRealMemory( pFramePoint + 0x4 )
endif

return 0
endfunction

function GetFramePointRelativePoint takes integer pFrame, integer point returns integer
local integer pFramePoint = GetFramePoint( pFrame, point )

if pFramePoint > 0 then
return ReadRealMemory( pFramePoint + 0x8 )
endif

return 0
endfunction

function GetFrameRelativePointX takes integer pFrame, integer point returns real
local integer pFramePoint = GetFramePoint( pFrame, point )

if pFramePoint > 0 then
return GetRealFromMemory( ReadRealMemory( pFramePoint + 0xC ) )
endif

return 0.
endfunction

function GetFrameRelativePointY takes integer pFrame, integer point returns real
local integer pFramePoint = GetFramePoint( pFrame, point )

if pFramePoint > 0 then
return GetRealFromMemory( ReadRealMemory( pFramePoint + 0x10 ) )
endif

return 0.
endfunction
//===========================================
И да, в некоторых случаях, если же фрейм уже привязан по той или иной точке, нужно в начале вызвать

function ClearFrameAllPoints takes integer pFrame returns integer
return ClearCLayoutFrameAllPoints( pFrame )
endfunction
И потом уже проводить изменения, так как установка новых креплений не уничтожает старые.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.