
11.08.2025, 20:00
|
|
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами:
2055431
Репутация:
3
|
|
Сообщение от daun.daunovich.01
Пытаюсь получить координаты локального игрока в мире, но почему-то они постоянно 0.
Что не так?
cpp:
Код:
Это R3
CVector* pos = samp->getPos();
printf("x: %f, y: %f, z: %f\n", pos->x, pos->y, pos->z);
uintptr_t* getPlayerEntity() {
uintptr_t player_pool = getPlayerPool();
uintptr_t local_info = player_pool + 0x2F14;
return reinterpret_cast(local_info + 0x2A4);
}
CVector* getPos() {
uintptr_t* gamePed = getPlayerEntity();
if (gamePed != nullptr) {
return reinterpret_cast(0x4043A0)(gamePed);
}
//return CVector(1.0, 5.0, 10.0);
}
// 0x4043A0
CSimpleTransform *__thiscall CEntity::GetPosition(CEntity *this) - функция в IDA PRO
Лучше используй псдк, получай CPed* локального игрока через FindPlayerPed() и из него доставай матрицу (вроде даже есть метод GetPosition)
|
|
|

11.08.2025, 20:12
|
|
Познающий
Регистрация: 03.08.2022
Сообщений: 57
С нами:
1990627
Репутация:
8
|
|
Сообщение от вайега52
Лучше используй псдк, получай CPed* локального игрока через FindPlayerPed() и из него доставай матрицу (вроде даже есть метод GetPosition)
Не могу, у меня проект создан отдельно от plugin-sdk, если я его добавлю в ручную - то он работать не будет
|
|
|

12.08.2025, 00:00
|
|
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами:
2055431
Репутация:
3
|
|
Сообщение от daun.daunovich.01
Не могу, у меня проект создан отдельно от plugin-sdk, если я его добавлю в ручную - то он работать не будет
Не совсем понял, как это. Ты можешь просто в свой проект подключить plugin-sdk как библиотеку
Сообщение от daun.daunovich.01
Пытаюсь получить координаты локального игрока в мире, но почему-то они постоянно 0.
Что не так?
cpp:
Код:
Это R3
CVector* pos = samp->getPos();
printf("x: %f, y: %f, z: %f\n", pos->x, pos->y, pos->z);
uintptr_t* getPlayerEntity() {
uintptr_t player_pool = getPlayerPool();
uintptr_t local_info = player_pool + 0x2F14;
return reinterpret_cast(local_info + 0x2A4);
}
CVector* getPos() {
uintptr_t* gamePed = getPlayerEntity();
if (gamePed != nullptr) {
return reinterpret_cast(0x4043A0)(gamePed);
}
//return CVector(1.0, 5.0, 10.0);
}
// 0x4043A0
CSimpleTransform *__thiscall CEntity::GetPosition(CEntity *this) - функция в IDA PRO
Если getPlayerPool возвращает указатель на пул, то +- такой код (хотя опять же, есть уже все готовое: sampapi):
C++:
Код:
Это R3
CVector
*
pos
=
samp
->
getPos
(
)
;
printf
(
"x: %f, y: %f, z: %f\n"
,
pos
->
x
,
pos
->
y
,
pos
->
z
)
;
uintptr_t
*
getPlayerEntity
(
)
{
uintptr_t player_pool
=
getPlayerPool
(
)
;
uintptr_t local_info
=
player_pool
+
0x2F14
;
uintptr_t
*
local_player
=
reinterpret_cast
(
local_info
+
0x26
)
;
uintptr_t samp_ped
=
*
local_player
;
// offset 0x0 CPed
uintptr_t game_ped
=
samp_ped
+
0x2A4
;
return
game_ped
;
}
CVector
*
getPos
(
)
{
uintptr_t
*
gamePed
=
getPlayerEntity
(
)
;
if
(
gamePed
!=
nullptr
)
{
return
reinterpret_cast
(
0x4043A0
)
(
gamePed
)
;
}
//return CVector(1.0, 5.0, 10.0);
}
// 0x4043A0
CSimpleTransform
*
__thiscall CEntity
::
GetPosition
(
CEntity
*
this
)
-
функция в IDA PRO
|
|
|

12.08.2025, 01:21
|
|
Познающий
Регистрация: 03.08.2022
Сообщений: 57
С нами:
1990627
Репутация:
8
|
|
Сообщение от вайега52
Не совсем понял, как это. Ты можешь просто в свой проект подключить plugin-sdk как библиотеку
Если getPlayerPool возвращает указатель на пул, то +- такой код (хотя опять же, есть уже все готовое: sampapi):
C++:
Код:
Это R3
CVector
*
pos
=
samp
->
getPos
(
)
;
printf
(
"x: %f, y: %f, z: %f\n"
,
pos
->
x
,
pos
->
y
,
pos
->
z
)
;
uintptr_t
*
getPlayerEntity
(
)
{
uintptr_t player_pool
=
getPlayerPool
(
)
;
uintptr_t local_info
=
player_pool
+
0x2F14
;
uintptr_t
*
local_player
=
reinterpret_cast
(
local_info
+
0x26
)
;
uintptr_t samp_ped
=
*
local_player
;
// offset 0x0 CPed
uintptr_t game_ped
=
samp_ped
+
0x2A4
;
return
game_ped
;
}
CVector
*
getPos
(
)
{
uintptr_t
*
gamePed
=
getPlayerEntity
(
)
;
if
(
gamePed
!=
nullptr
)
{
return
reinterpret_cast
(
0x4043A0
)
(
gamePed
)
;
}
//return CVector(1.0, 5.0, 10.0);
}
// 0x4043A0
CSimpleTransform
*
__thiscall CEntity
::
GetPosition
(
CEntity
*
this
)
-
функция в IDA PRO
Проект отдельно от plugin-sdk, это значит что проект у меня совсем в другой директории.
И если я добавлю plugin-sdk как библиотеку - то в проекте появятся какие-то ошибки...
Когда я инклуд plugin.h делаю
|
|
|

21.08.2025, 03:58
|
|
Новичок
Регистрация: 16.01.2022
Сообщений: 28
С нами:
2276608
Репутация:
8
|
|
При запуске предлагает выбрать монитор и разрешение, как можно перехватить это окно выбора и изменить, картинку там добавить или текст какой то?
Через IDA смотрел не нашёл по strings ничего подобного.
Сообщение от daun.daunovich.01
Пытаюсь получить координаты локального игрока в мире, но почему-то они постоянно 0.
Что не так?
cpp:
Код:
Это R3
CVector* pos = samp->getPos();
printf("x: %f, y: %f, z: %f\n", pos->x, pos->y, pos->z);
uintptr_t* getPlayerEntity() {
uintptr_t player_pool = getPlayerPool();
uintptr_t local_info = player_pool + 0x2F14;
return reinterpret_cast(local_info + 0x2A4);
}
CVector* getPos() {
uintptr_t* gamePed = getPlayerEntity();
if (gamePed != nullptr) {
return reinterpret_cast(0x4043A0)(gamePed);
}
//return CVector(1.0, 5.0, 10.0);
}
// 0x4043A0
CSimpleTransform *__thiscall CEntity::GetPosition(CEntity *this) - функция в IDA PRO
с++:
Код:
float
*
GetPlayerPositionPtr
(
)
{
DWORD playerPtr
=
*
(
DWORD
*
)
0xB6F5F0
;
if
(
!
playerPtr
)
return
nullptr
;
DWORD pedPtr
=
*
(
DWORD
*
)
(
playerPtr
+
0x14
)
;
if
(
!
pedPtr
)
return
nullptr
;
return
(
float
*
)
(
pedPtr
+
0x30
)
;
}
void
DrawCoordinates
(
)
{
float
*
position
=
GetPlayerPositionPtr
(
)
;
if
(
!
position
)
return
;
char
buffer
[
128
]
;
sprintf_s
(
buffer
,
"%.3f %.3f %.3f"
,
position
[
0
]
,
position
[
1
]
,
position
[
2
]
)
;
RECT textRect
=
{
0
}
;
pFontNormal
->
DrawTextA
(
NULL
,
buffer
,
-
1
,
&
textRect
,
DT_CALCRECT
|
DT_LEFT
,
0
)
;
int
xPos
=
viewport
.
Width
-
(
textRect
.
right
-
textRect
.
left
)
-
1
;
int
yPos
=
viewport
.
Height
-
(
textRect
.
bottom
-
textRect
.
top
)
-
1
;
RECT drawRect
=
{
xPos
,
yPos
,
xPos
+
(
textRect
.
right
-
textRect
.
left
)
,
yPos
+
(
textRect
.
bottom
-
textRect
.
top
)
}
;
DrawTextOutlined
(
pFontNormal
,
buffer
,
drawRect
,
COORDS_COLOR
,
SHADOW_COLOR
,
/*thickness=*/
1
)
;
}
Вырвал из клиента, мб чего то не будет хватать.
Но реализация рабочая.

|
|
|

24.08.2025, 00:36
|
|
Познающий
Регистрация: 03.08.2022
Сообщений: 57
С нами:
1990627
Репутация:
8
|
|
Сообщение от writeline
При запуске предлагает выбрать монитор и разрешение, как можно перехватить это окно выбора и изменить, картинку там добавить или текст какой то?
Через IDA смотрел не нашёл по strings ничего подобного.
с++:
Код:
float
*
GetPlayerPositionPtr
(
)
{
DWORD playerPtr
=
*
(
DWORD
*
)
0xB6F5F0
;
if
(
!
playerPtr
)
return
nullptr
;
DWORD pedPtr
=
*
(
DWORD
*
)
(
playerPtr
+
0x14
)
;
if
(
!
pedPtr
)
return
nullptr
;
return
(
float
*
)
(
pedPtr
+
0x30
)
;
}
void
DrawCoordinates
(
)
{
float
*
position
=
GetPlayerPositionPtr
(
)
;
if
(
!
position
)
return
;
char
buffer
[
128
]
;
sprintf_s
(
buffer
,
"%.3f %.3f %.3f"
,
position
[
0
]
,
position
[
1
]
,
position
[
2
]
)
;
RECT textRect
=
{
0
}
;
pFontNormal
->
DrawTextA
(
NULL
,
buffer
,
-
1
,
&
textRect
,
DT_CALCRECT
|
DT_LEFT
,
0
)
;
int
xPos
=
viewport
.
Width
-
(
textRect
.
right
-
textRect
.
left
)
-
1
;
int
yPos
=
viewport
.
Height
-
(
textRect
.
bottom
-
textRect
.
top
)
-
1
;
RECT drawRect
=
{
xPos
,
yPos
,
xPos
+
(
textRect
.
right
-
textRect
.
left
)
,
yPos
+
(
textRect
.
bottom
-
textRect
.
top
)
}
;
DrawTextOutlined
(
pFontNormal
,
buffer
,
drawRect
,
COORDS_COLOR
,
SHADOW_COLOR
,
/*thickness=*/
1
)
;
}
Вырвал из клиента, мб чего то не будет хватать.
Но реализация рабочая.
Да я уже давно справился с этой задачей. Но всё равно спасибо.
Всем привет. Вопрос следующего характера. Не могу понять, почему при Render`е обычного 3D текста через графическую библиотеку ImGui при ALT + ENTER (смене разрешения) всё нормально, но, стоит мне сделать ALT + ENTER, то ники мои вообще не вижу (собсна, которые рендерю через ImGui)
А если я сделаю ALT + ENTER в момент когда рендерится ник над головой, то игра вообще не развернётся и всё.
В чём трабл?
Единственное что удивляет, с HP/Armour барами такого нету.
Может дело в шрифте?
cpp:
Код:
void
__fastcall
CPlayerTags_DrawHealthBar_Hook
(
void
*
thisptr
,
void
*
edx
,
CVectorSamp
*
position
,
float
fHealth
,
float
fArmour
,
float
fDistanceToCamera
)
{
if
(
!
deviceReset
)
return
cPlayerTags_DrawHealthBar
(
thisptr
,
position
,
fHealth
,
fArmour
,
fDistanceToCamera
)
;
Main
::
RenderBars
(
position
,
fDistanceToCamera
,
fHealth
,
fArmour
)
;
}
void
__fastcall
CPlayerTags_DrawLabel_Hook
(
void
*
thisptr
,
void
*
edx
,
CVectorSamp
*
position
,
const
char
*
szText
,
unsigned
long
color
,
float
fDistanceCamera
,
bool
bDrawStatus
,
int
nStatus
)
{
/*if (true) {
return;
}*/
if
(
!
deviceReset
)
return
cPlayerTags_DrawLabel
(
thisptr
,
position
,
szText
,
color
,
fDistanceCamera
,
bDrawStatus
,
nStatus
)
;
Main
::
RenderText
(
szText
,
position
,
color
,
fDistanceCamera
)
;
}
Инициализация ImGui
.
Events
::
initGameEvent
+=
[
]
(
)
{
CHooks
::
InitMinHook
(
)
;
ImGui
::
CreateContext
(
)
;
ImGuiIO
&
io
=
ImGui
::
GetIO
(
)
;
(
void
)
io
;
io
.
ConfigFlags
|=
ImGuiConfigFlags_NoMouseCursorChange
;
myFont
=
io
.
Fonts
->
AddFontFromFileTTF
(
std
::
string
(
CUtils
::
GetPath
(
)
+
"font.ttf"
)
.
c_str
(
)
,
18.0f
,
NULL
,
io
.
Fonts
->
GetGlyphRangesCyrillic
(
)
)
;
if
(
myFont
==
nullptr
)
{
printf
(
"font not found\n"
)
;
myFont
=
io
.
Fonts
->
AddFontDefault
(
)
;
}
ImGui
::
StyleColorsDark
(
)
;
ImGui_ImplWin32_Init
(
GetActiveWindow
(
)
)
;
ImGui_ImplDX9_Init
(
*
reinterpret_cast
(
0xC97C28
)
)
;
CHooks
::
GameLoop_HookInstall
(
)
;
CHooks
::
CLabel__DrawHookInstall
(
)
;
CHooks
::
CPlayerTags__DrawLabelHookInstall
(
)
;
CHooks
::
CPlayerTags__DrawHealthBarHookInstall
(
)
;
return
true
;
}
;
Events
::
d3dResetEvent
+=
[
]
(
)
{
deviceReset
=
true
;
ImGui_ImplWin32_Init
(
GetActiveWindow
(
)
)
;
ImGui_ImplDX9_Init
(
*
reinterpret_cast
(
0xC97C28
)
)
;
ImGui_ImplDX9_CreateDeviceObjects
(
)
;
ImGuiIO
&
io
=
ImGui
::
GetIO
(
)
;
io
.
Fonts
->
AddFontFromFileTTF
(
std
::
string
(
CUtils
::
GetPath
(
)
+
"font.ttf"
)
.
c_str
(
)
,
18.0f
,
NULL
,
io
.
Fonts
->
GetGlyphRangesCyrillic
(
)
)
;
io
.
Fonts
->
Build
(
)
;
return
true
;
}
;
Events
::
d3dLostEvent
+=
[
]
(
)
{
if
(
!
deviceReset
)
return
true
;
deviceReset
=
false
;
ImGui_ImplWin32_Shutdown
(
)
;
ImGui_ImplDX9_Shutdown
(
)
;
ImGui_ImplDX9_InvalidateDeviceObjects
(
)
;
ImGuiIO
&
io
=
ImGui
::
GetIO
(
)
;
io
.
Fonts
->
Clear
(
)
;
// Очистить текущие шрифты
return
true
;
}
;
extern
"C"
__declspec
(
dllexport
)
void
Ext_RenderText
(
const
char
*
szText
,
CVectorSamp
*
position
,
unsigned
long
color
,
float
fDistanceToCamera
,
bool
isBot
=
false
)
{
if
(
!
deviceReset
)
return
;
ImGui_ImplDX9_NewFrame
(
)
;
ImGui_ImplWin32_NewFrame
(
)
;
ImGui
::
NewFrame
(
)
;
position
->
z
=
fDistanceToCamera
*
0.047499999
+
position
->
z
+
0.2
;
RwV3d pos
{
position
->
x
,
position
->
y
,
position
->
z
}
;
RwV3d out
;
float
width
,
height
;
uint8_t
r
,
g
,
b
,
a
;
CUtils
::
explode_argb
(
(
uint32_t
)
color
,
a
,
r
,
g
,
b
)
;
CVector cameraPos
=
TheCamera
.
GetPosition
(
)
;
CEntity
*
entity
=
FindPlayerPed
(
)
;
CColPoint colPoint
;
bool
isLineOfSight
=
!
CWorld
::
ProcessLineOfSight
(
cameraPos
,
pos
,
colPoint
,
entity
,
true
,
false
,
false
,
true
,
false
,
true
,
false
,
false
)
;
if
(
!
isLineOfSight
)
return
;
if
(
CSprite
::
CalcScreenCoors
(
pos
,
&
out
,
&
width
,
&
height
,
true
,
true
)
)
{
ImVec2
screenPos
(
out
.
x
,
out
.
y
+
4.0f
)
;
ImDrawList
*
drawList
=
ImGui
::
GetForegroundDrawList
(
)
;
std
::
string utf8Text
=
CUtils
::
ConvertAnsiToUtf8
(
szText
)
;
auto
RemoveColorCodes
=
[
]
(
const
std
::
string
&
text
)
->
std
::
string
{
std
::
string result
=
text
;
size_t pos
=
0
;
while
(
(
pos
=
result
.
find
(
'{'
,
pos
)
)
!=
std
::
string
::
npos
)
{
size_t endPos
=
result
.
find
(
'}'
,
pos
)
;
if
(
endPos
!=
std
::
string
::
npos
)
{
result
.
erase
(
pos
,
endPos
-
pos
+
1
)
;
}
else
{
break
;
}
}
return
result
;
}
;
std
::
string nickname
;
int
playerID
=
-
1
;
size_t openBracket
=
utf8Text
.
find
(
'('
)
;
if
(
openBracket
!=
std
::
string
::
npos
)
{
size_t closeBracket
=
utf8Text
.
find
(
')'
,
openBracket
)
;
if
(
closeBracket
!=
std
::
string
::
npos
)
{
nickname
=
utf8Text
.
substr
(
0
,
openBracket
)
;
std
::
string idString
=
utf8Text
.
substr
(
openBracket
+
1
,
closeBracket
-
openBracket
-
1
)
;
try
{
playerID
=
std
::
stoi
(
idString
)
;
}
catch
(
const
std
::
exception
&
)
{
playerID
=
-
1
;
}
if
(
!
nickname
.
empty
(
)
&&
nickname
.
back
(
)
==
' '
)
{
nickname
.
pop_back
(
)
;
}
}
}
else
{
nickname
=
utf8Text
;
playerID
=
-
1
;
}
UINT32 characterId
=
0
;
if
(
CHooks
::
playersCharacterId
.
contains
(
playerID
)
)
{
characterId
=
CHooks
::
playersCharacterId
[
playerID
]
;
}
if
(
!
characterId
&&
!
isBot
)
return
;
if
(
isBot
)
characterId
=
playerID
;
nickname
=
RemoveColorCodes
(
nickname
)
;
std
::
string characterIdPart
=
" #"
+
std
::
to_string
(
characterId
)
;
ImVec2 nicknameSize
=
ImGui
::
CalcTextSize
(
nickname
.
c_str
(
)
)
;
ImVec2 characterIdSize
=
ImGui
::
CalcTextSize
(
characterIdPart
.
c_str
(
)
)
;
ImVec2 totalSize
=
ImVec2
(
nicknameSize
.
x
+
characterIdSize
.
x
,
std
::
max
(
nicknameSize
.
y
,
characterIdSize
.
y
)
)
;
ImVec2 centeredPos
=
screenPos
;
centeredPos
.
x
-=
totalSize
.
x
/
2.0f
;
centeredPos
.
y
-=
totalSize
.
y
/
2.0f
;
auto
DrawTextOutline
=
[
&
]
(
const
ImVec2
&
pos
,
const
std
::
string
&
text
,
ImU32 textColor
,
ImU32 outlineColor
=
IM_COL32
(
0
,
0
,
0
,
255
)
)
{
float
outlineThickness
=
1.0f
;
ImVec2 offsets
[
]
=
{
ImVec2
(
-
outlineThickness
,
-
outlineThickness
)
,
// лево-верх
ImVec2
(
0
,
-
outlineThickness
)
,
// верх
ImVec2
(
outlineThickness
,
-
outlineThickness
)
,
// право-верх
ImVec2
(
-
outlineThickness
,
0
)
,
// лево
ImVec2
(
outlineThickness
,
0
)
,
// право
ImVec2
(
-
outlineThickness
,
outlineThickness
)
,
// лево-низ
ImVec2
(
0
,
outlineThickness
)
,
// низ
ImVec2
(
outlineThickness
,
outlineThickness
)
// право-низ
}
;
for
(
int
layer
=
0
;
layer
AddText
(
myFont
,
ImGui
::
GetFontSize
(
)
,
outlinePos
,
outlineColor
,
text
.
c_str
(
)
)
;
}
}
drawList
->
AddText
(
myFont
,
ImGui
::
GetFontSize
(
)
,
pos
,
textColor
,
text
.
c_str
(
)
)
;
}
;
if
(
!
nickname
.
empty
(
)
)
{
ImU32 nicknameColor
=
IM_COL32
(
r
,
g
,
b
,
255
)
;
DrawTextOutline
(
centeredPos
,
nickname
,
nicknameColor
)
;
}
ImVec2 characterIdPos
=
ImVec2
(
centeredPos
.
x
+
nicknameSize
.
x
,
centeredPos
.
y
)
;
ImU32 whiteColor
=
IM_COL32
(
255
,
255
,
255
,
255
)
;
DrawTextOutline
(
characterIdPos
,
characterIdPart
,
whiteColor
)
;
}
ImGui
::
EndFrame
(
)
;
ImGui
::
Render
(
)
;
ImGui_ImplDX9_RenderDrawData
(
ImGui
::
GetDrawData
(
)
)
;
}
|
|
|

24.08.2025, 00:57
|
|
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами:
2055431
Репутация:
3
|
|
Сообщение от daun.daunovich.01
ImGuiIO& io = ImGui::GetIO(); io.Fonts->Clear(); // Очистить текущие шрифты
как будто бы это лишнее. никогда не чистил шрифты при лосте
|
|
|

24.08.2025, 01:25
|
|
Новичок
Регистрация: 16.01.2022
Сообщений: 28
С нами:
2276608
Репутация:
8
|
|
Сообщение от daun.daunovich.01
Да я уже давно справился с этой задачей. Но всё равно спасибо.
Всем привет. Вопрос следующего характера. Не могу понять, почему при Render`е обычного 3D текста через графическую библиотеку ImGui при ALT + ENTER (смене разрешения) всё нормально, но, стоит мне сделать ALT + ENTER, то ники мои вообще не вижу (собсна, которые рендерю через ImGui)
А если я сделаю ALT + ENTER в момент когда рендерится ник над головой, то игра вообще не развернётся и всё.
В чём трабл?
Единственное что удивляет, с HP/Armour барами такого нету.
Может дело в шрифте?
cpp:
Код:
void
__fastcall
CPlayerTags_DrawHealthBar_Hook
(
void
*
thisptr
,
void
*
edx
,
CVectorSamp
*
position
,
float
fHealth
,
float
fArmour
,
float
fDistanceToCamera
)
{
if
(
!
deviceReset
)
return
cPlayerTags_DrawHealthBar
(
thisptr
,
position
,
fHealth
,
fArmour
,
fDistanceToCamera
)
;
Main
::
RenderBars
(
position
,
fDistanceToCamera
,
fHealth
,
fArmour
)
;
}
void
__fastcall
CPlayerTags_DrawLabel_Hook
(
void
*
thisptr
,
void
*
edx
,
CVectorSamp
*
position
,
const
char
*
szText
,
unsigned
long
color
,
float
fDistanceCamera
,
bool
bDrawStatus
,
int
nStatus
)
{
/*if (true) {
return;
}*/
if
(
!
deviceReset
)
return
cPlayerTags_DrawLabel
(
thisptr
,
position
,
szText
,
color
,
fDistanceCamera
,
bDrawStatus
,
nStatus
)
;
Main
::
RenderText
(
szText
,
position
,
color
,
fDistanceCamera
)
;
}
Инициализация ImGui
.
Events
::
initGameEvent
+=
[
]
(
)
{
CHooks
::
InitMinHook
(
)
;
ImGui
::
CreateContext
(
)
;
ImGuiIO
&
io
=
ImGui
::
GetIO
(
)
;
(
void
)
io
;
io
.
ConfigFlags
|=
ImGuiConfigFlags_NoMouseCursorChange
;
myFont
=
io
.
Fonts
->
AddFontFromFileTTF
(
std
::
string
(
CUtils
::
GetPath
(
)
+
"font.ttf"
)
.
c_str
(
)
,
18.0f
,
NULL
,
io
.
Fonts
->
GetGlyphRangesCyrillic
(
)
)
;
if
(
myFont
==
nullptr
)
{
printf
(
"font not found\n"
)
;
myFont
=
io
.
Fonts
->
AddFontDefault
(
)
;
}
ImGui
::
StyleColorsDark
(
)
;
ImGui_ImplWin32_Init
(
GetActiveWindow
(
)
)
;
ImGui_ImplDX9_Init
(
*
reinterpret_cast
(
0xC97C28
)
)
;
CHooks
::
GameLoop_HookInstall
(
)
;
CHooks
::
CLabel__DrawHookInstall
(
)
;
CHooks
::
CPlayerTags__DrawLabelHookInstall
(
)
;
CHooks
::
CPlayerTags__DrawHealthBarHookInstall
(
)
;
return
true
;
}
;
Events
::
d3dResetEvent
+=
[
]
(
)
{
deviceReset
=
true
;
ImGui_ImplWin32_Init
(
GetActiveWindow
(
)
)
;
ImGui_ImplDX9_Init
(
*
reinterpret_cast
(
0xC97C28
)
)
;
ImGui_ImplDX9_CreateDeviceObjects
(
)
;
ImGuiIO
&
io
=
ImGui
::
GetIO
(
)
;
io
.
Fonts
->
AddFontFromFileTTF
(
std
::
string
(
CUtils
::
GetPath
(
)
+
"font.ttf"
)
.
c_str
(
)
,
18.0f
,
NULL
,
io
.
Fonts
->
GetGlyphRangesCyrillic
(
)
)
;
io
.
Fonts
->
Build
(
)
;
return
true
;
}
;
Events
::
d3dLostEvent
+=
[
]
(
)
{
if
(
!
deviceReset
)
return
true
;
deviceReset
=
false
;
ImGui_ImplWin32_Shutdown
(
)
;
ImGui_ImplDX9_Shutdown
(
)
;
ImGui_ImplDX9_InvalidateDeviceObjects
(
)
;
ImGuiIO
&
io
=
ImGui
::
GetIO
(
)
;
io
.
Fonts
->
Clear
(
)
;
// Очистить текущие шрифты
return
true
;
}
;
extern
"C"
__declspec
(
dllexport
)
void
Ext_RenderText
(
const
char
*
szText
,
CVectorSamp
*
position
,
unsigned
long
color
,
float
fDistanceToCamera
,
bool
isBot
=
false
)
{
if
(
!
deviceReset
)
return
;
ImGui_ImplDX9_NewFrame
(
)
;
ImGui_ImplWin32_NewFrame
(
)
;
ImGui
::
NewFrame
(
)
;
position
->
z
=
fDistanceToCamera
*
0.047499999
+
position
->
z
+
0.2
;
RwV3d pos
{
position
->
x
,
position
->
y
,
position
->
z
}
;
RwV3d out
;
float
width
,
height
;
uint8_t
r
,
g
,
b
,
a
;
CUtils
::
explode_argb
(
(
uint32_t
)
color
,
a
,
r
,
g
,
b
)
;
CVector cameraPos
=
TheCamera
.
GetPosition
(
)
;
CEntity
*
entity
=
FindPlayerPed
(
)
;
CColPoint colPoint
;
bool
isLineOfSight
=
!
CWorld
::
ProcessLineOfSight
(
cameraPos
,
pos
,
colPoint
,
entity
,
true
,
false
,
false
,
true
,
false
,
true
,
false
,
false
)
;
if
(
!
isLineOfSight
)
return
;
if
(
CSprite
::
CalcScreenCoors
(
pos
,
&
out
,
&
width
,
&
height
,
true
,
true
)
)
{
ImVec2
screenPos
(
out
.
x
,
out
.
y
+
4.0f
)
;
ImDrawList
*
drawList
=
ImGui
::
GetForegroundDrawList
(
)
;
std
::
string utf8Text
=
CUtils
::
ConvertAnsiToUtf8
(
szText
)
;
auto
RemoveColorCodes
=
[
]
(
const
std
::
string
&
text
)
->
std
::
string
{
std
::
string result
=
text
;
size_t pos
=
0
;
while
(
(
pos
=
result
.
find
(
'{'
,
pos
)
)
!=
std
::
string
::
npos
)
{
size_t endPos
=
result
.
find
(
'}'
,
pos
)
;
if
(
endPos
!=
std
::
string
::
npos
)
{
result
.
erase
(
pos
,
endPos
-
pos
+
1
)
;
}
else
{
break
;
}
}
return
result
;
}
;
std
::
string nickname
;
int
playerID
=
-
1
;
size_t openBracket
=
utf8Text
.
find
(
'('
)
;
if
(
openBracket
!=
std
::
string
::
npos
)
{
size_t closeBracket
=
utf8Text
.
find
(
')'
,
openBracket
)
;
if
(
closeBracket
!=
std
::
string
::
npos
)
{
nickname
=
utf8Text
.
substr
(
0
,
openBracket
)
;
std
::
string idString
=
utf8Text
.
substr
(
openBracket
+
1
,
closeBracket
-
openBracket
-
1
)
;
try
{
playerID
=
std
::
stoi
(
idString
)
;
}
catch
(
const
std
::
exception
&
)
{
playerID
=
-
1
;
}
if
(
!
nickname
.
empty
(
)
&&
nickname
.
back
(
)
==
' '
)
{
nickname
.
pop_back
(
)
;
}
}
}
else
{
nickname
=
utf8Text
;
playerID
=
-
1
;
}
UINT32 characterId
=
0
;
if
(
CHooks
::
playersCharacterId
.
contains
(
playerID
)
)
{
characterId
=
CHooks
::
playersCharacterId
[
playerID
]
;
}
if
(
!
characterId
&&
!
isBot
)
return
;
if
(
isBot
)
characterId
=
playerID
;
nickname
=
RemoveColorCodes
(
nickname
)
;
std
::
string characterIdPart
=
" #"
+
std
::
to_string
(
characterId
)
;
ImVec2 nicknameSize
=
ImGui
::
CalcTextSize
(
nickname
.
c_str
(
)
)
;
ImVec2 characterIdSize
=
ImGui
::
CalcTextSize
(
characterIdPart
.
c_str
(
)
)
;
ImVec2 totalSize
=
ImVec2
(
nicknameSize
.
x
+
characterIdSize
.
x
,
std
::
max
(
nicknameSize
.
y
,
characterIdSize
.
y
)
)
;
ImVec2 centeredPos
=
screenPos
;
centeredPos
.
x
-=
totalSize
.
x
/
2.0f
;
centeredPos
.
y
-=
totalSize
.
y
/
2.0f
;
auto
DrawTextOutline
=
[
&
]
(
const
ImVec2
&
pos
,
const
std
::
string
&
text
,
ImU32 textColor
,
ImU32 outlineColor
=
IM_COL32
(
0
,
0
,
0
,
255
)
)
{
float
outlineThickness
=
1.0f
;
ImVec2 offsets
[
]
=
{
ImVec2
(
-
outlineThickness
,
-
outlineThickness
)
,
// лево-верх
ImVec2
(
0
,
-
outlineThickness
)
,
// верх
ImVec2
(
outlineThickness
,
-
outlineThickness
)
,
// право-верх
ImVec2
(
-
outlineThickness
,
0
)
,
// лево
ImVec2
(
outlineThickness
,
0
)
,
// право
ImVec2
(
-
outlineThickness
,
outlineThickness
)
,
// лево-низ
ImVec2
(
0
,
outlineThickness
)
,
// низ
ImVec2
(
outlineThickness
,
outlineThickness
)
// право-низ
}
;
for
(
int
layer
=
0
;
layer
AddText
(
myFont
,
ImGui
::
GetFontSize
(
)
,
outlinePos
,
outlineColor
,
text
.
c_str
(
)
)
;
}
}
drawList
->
AddText
(
myFont
,
ImGui
::
GetFontSize
(
)
,
pos
,
textColor
,
text
.
c_str
(
)
)
;
}
;
if
(
!
nickname
.
empty
(
)
)
{
ImU32 nicknameColor
=
IM_COL32
(
r
,
g
,
b
,
255
)
;
DrawTextOutline
(
centeredPos
,
nickname
,
nicknameColor
)
;
}
ImVec2 characterIdPos
=
ImVec2
(
centeredPos
.
x
+
nicknameSize
.
x
,
centeredPos
.
y
)
;
ImU32 whiteColor
=
IM_COL32
(
255
,
255
,
255
,
255
)
;
DrawTextOutline
(
characterIdPos
,
characterIdPart
,
whiteColor
)
;
}
ImGui
::
EndFrame
(
)
;
ImGui
::
Render
(
)
;
ImGui_ImplDX9_RenderDrawData
(
ImGui
::
GetDrawData
(
)
)
;
}
У меня подобное было при рендере текста через DirectX, попробуй восстанавливать состояние, я обошёл это обычным перезапуском рендера
|
|
|

24.08.2025, 01:30
|
|
Познающий
Регистрация: 03.08.2022
Сообщений: 57
С нами:
1990627
Репутация:
8
|
|
Сообщение от writeline
У меня подобное было при рендере текста через DirectX, попробуй восстанавливать состояние, я обошёл это обычным перезапуском рендера
Ты имеешь ввиду вот это?
cpp:
Код:
ImGui_ImplWin32_Init
(
GetActiveWindow
(
)
)
;
ImGui_ImplDX9_Init
(
*
reinterpret_cast
(
0xC97C28
)
)
;
Восстанавливать состояние? Не особо понял, что ты имел ввиду.
Сообщение от daun.daunovich.01
Ты имеешь ввиду вот это?
cpp:
Код:
ImGui_ImplWin32_Init
(
GetActiveWindow
(
)
)
;
ImGui_ImplDX9_Init
(
*
reinterpret_cast
(
0xC97C28
)
)
;
Восстанавливать состояние? Не особо понял, что ты имел ввиду.
P.S. Всё исправил. Проблема была в моей невнимательности.
Сообщение от daun.daunovich.01
Ты имеешь ввиду вот это?
cpp:
Код:
ImGui_ImplWin32_Init
(
GetActiveWindow
(
)
)
;
ImGui_ImplDX9_Init
(
*
reinterpret_cast
(
0xC97C28
)
)
;
Восстанавливать состояние? Не особо понял, что ты имел ввиду.
P.S. Всё исправил. Проблема была в моей невнимательности.
Моим нервам *****, нихуя не исправилось, как исправить эту ебаную ***ню?
С WindowedMode всё заебись и ALT + ENTER нормально работает, но как я удалю этот ебучий WindowedMode всё летит к хуям собачим, а именно текст ломается на*** "появляются квадратики какие-то"
cpp:
Код:
Events
::
initGameEvent
+=
[
]
(
)
{
CHooks
::
InitMinHook
(
)
;
ImGui
::
CreateContext
(
)
;
ImGuiIO
&
io
=
ImGui
::
GetIO
(
)
;
(
void
)
io
;
io
.
ConfigFlags
|=
ImGuiConfigFlags_NoMouseCursorChange
;
myFont
=
io
.
Fonts
->
AddFontFromFileTTF
(
std
::
string
(
CUtils
::
GetPath
(
)
+
"font.ttf"
)
.
c_str
(
)
,
18.0f
,
NULL
,
io
.
Fonts
->
GetGlyphRangesCyrillic
(
)
)
;
if
(
myFont
==
nullptr
)
{
printf
(
"font not found\n"
)
;
myFont
=
io
.
Fonts
->
AddFontDefault
(
)
;
}
ImGui
::
StyleColorsDark
(
)
;
ImGui_ImplWin32_Init
(
GetActiveWindow
(
)
)
;
ImGui_ImplDX9_Init
(
*
reinterpret_cast
(
0xC97C28
)
)
;
CHooks
::
GameLoop_HookInstall
(
)
;
CHooks
::
CLabel__DrawHookInstall
(
)
;
CHooks
::
CPlayerTags__DrawLabelHookInstall
(
)
;
CHooks
::
CPlayerTags__DrawHealthBarHookInstall
(
)
;
return
true
;
}
;
Events
::
d3dResetEvent
+=
[
]
(
)
{
if
(
!
deviceReset
)
return
false
;
deviceReset
=
false
;
//ImGui::CreateContext();
//ImGui_ImplWin32_Init(GetActiveWindow());
//ImGui_ImplDX9_Init(*reinterpret_cast(0xC97C28));
ImGui_ImplDX9_CreateDeviceObjects
(
)
;
ImGuiIO
&
io
=
ImGui
::
GetIO
(
)
;
io
.
Fonts
->
AddFontFromFileTTF
(
std
::
string
(
CUtils
::
GetPath
(
)
+
"font.ttf"
)
.
c_str
(
)
,
18.0f
,
NULL
,
io
.
Fonts
->
GetGlyphRangesCyrillic
(
)
)
;
io
.
Fonts
->
Build
(
)
;
return
true
;
}
;
Events
::
d3dLostEvent
+=
[
]
(
)
{
deviceReset
=
true
;
//ImGui_ImplWin32_Shutdown();
//ImGui_ImplDX9_Shutdown();
ImGui_ImplDX9_InvalidateDeviceObjects
(
)
;
//ImGuiIO& io = ImGui::GetIO();
//io.Fonts->Clear(); // Очистить текущие шрифты
return
true
;
}
;
Events
::
pedDtorEvent
+=
[
]
(
CPed
*
ped
)
{
int
playerId
=
CMultiplayer
::
GetPlayerID
(
ped
)
;
if
(
playerId
!=
65535
)
{
CHooks
::
playersCharacterId
.
erase
(
playerId
)
;
}
}
;
}
;
}
grade_tags
;
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD fdwReason
,
LPVOID lpReserved
)
{
if
(
fdwReason
==
DLL_PROCESS_ATTACH
)
{
}
//gChat.initialize();
else
if
(
fdwReason
==
DLL_PROCESS_DETACH
)
{
ImGui_ImplDX9_Shutdown
(
)
;
ImGui_ImplWin32_Shutdown
(
)
;
ImGui
::
DestroyContext
(
)
;
}
return
TRUE
;
}
extern
"C"
__declspec
(
dllexport
)
void
Ext_RenderText
(
const
char
*
szText
,
CVectorSamp
*
position
,
unsigned
long
color
,
float
fDistanceToCamera
,
bool
isBot
=
false
)
{
if
(
deviceReset
)
return
;
ImGui_ImplDX9_NewFrame
(
)
;
ImGui_ImplWin32_NewFrame
(
)
;
ImGui
::
NewFrame
(
)
;
position
->
z
=
fDistanceToCamera
*
0.047499999
+
position
->
z
+
0.2
;
RwV3d pos
{
position
->
x
,
position
->
y
,
position
->
z
}
;
RwV3d out
;
float
width
,
height
;
uint8_t
r
,
g
,
b
,
a
;
CUtils
::
explode_argb
(
(
uint32_t
)
color
,
a
,
r
,
g
,
b
)
;
CVector cameraPos
=
TheCamera
.
GetPosition
(
)
;
CEntity
*
entity
=
FindPlayerPed
(
)
;
CColPoint colPoint
;
bool
isLineOfSight
=
!
CWorld
::
ProcessLineOfSight
(
cameraPos
,
pos
,
colPoint
,
entity
,
true
,
false
,
false
,
true
,
false
,
true
,
false
,
false
)
;
if
(
!
isLineOfSight
)
return
;
if
(
CSprite
::
CalcScreenCoors
(
pos
,
&
out
,
&
width
,
&
height
,
true
,
true
)
)
{
ImVec2
screenPos
(
out
.
x
,
out
.
y
+
4.0f
)
;
ImDrawList
*
drawList
=
ImGui
::
GetForegroundDrawList
(
)
;
std
::
string utf8Text
=
CUtils
::
ConvertAnsiToUtf8
(
szText
)
;
auto
RemoveColorCodes
=
[
]
(
const
std
::
string
&
text
)
->
std
::
string
{
std
::
string result
=
text
;
size_t pos
=
0
;
while
(
(
pos
=
result
.
find
(
'{'
,
pos
)
)
!=
std
::
string
::
npos
)
{
size_t endPos
=
result
.
find
(
'}'
,
pos
)
;
if
(
endPos
!=
std
::
string
::
npos
)
{
result
.
erase
(
pos
,
endPos
-
pos
+
1
)
;
}
else
{
break
;
}
}
return
result
;
}
;
std
::
string nickname
;
int
playerID
=
-
1
;
size_t openBracket
=
utf8Text
.
find
(
'('
)
;
if
(
openBracket
!=
std
::
string
::
npos
)
{
size_t closeBracket
=
utf8Text
.
find
(
')'
,
openBracket
)
;
if
(
closeBracket
!=
std
::
string
::
npos
)
{
nickname
=
utf8Text
.
substr
(
0
,
openBracket
)
;
std
::
string idString
=
utf8Text
.
substr
(
openBracket
+
1
,
closeBracket
-
openBracket
-
1
)
;
try
{
playerID
=
std
::
stoi
(
idString
)
;
}
catch
(
const
std
::
exception
&
)
{
playerID
=
-
1
;
}
if
(
!
nickname
.
empty
(
)
&&
nickname
.
back
(
)
==
' '
)
{
nickname
.
pop_back
(
)
;
}
}
}
else
{
nickname
=
utf8Text
;
playerID
=
-
1
;
}
UINT32 characterId
=
0
;
if
(
CHooks
::
playersCharacterId
.
contains
(
playerID
)
)
{
characterId
=
CHooks
::
playersCharacterId
[
playerID
]
;
}
if
(
!
characterId
&&
!
isBot
)
return
;
if
(
isBot
)
characterId
=
playerID
;
nickname
=
RemoveColorCodes
(
nickname
)
;
std
::
string characterIdPart
=
" #"
+
std
::
to_string
(
characterId
)
;
ImVec2 nicknameSize
=
ImGui
::
CalcTextSize
(
nickname
.
c_str
(
)
)
;
ImVec2 characterIdSize
=
ImGui
::
CalcTextSize
(
characterIdPart
.
c_str
(
)
)
;
ImVec2 totalSize
=
ImVec2
(
nicknameSize
.
x
+
characterIdSize
.
x
,
std
::
max
(
nicknameSize
.
y
,
characterIdSize
.
y
)
)
;
ImVec2 centeredPos
=
screenPos
;
centeredPos
.
x
-=
totalSize
.
x
/
2.0f
;
centeredPos
.
y
-=
totalSize
.
y
/
2.0f
;
auto
DrawTextOutline
=
[
&
]
(
const
ImVec2
&
pos
,
const
std
::
string
&
text
,
ImU32 textColor
,
ImU32 outlineColor
=
IM_COL32
(
0
,
0
,
0
,
255
)
)
{
float
outlineThickness
=
1.0f
;
ImVec2 offsets
[
]
=
{
ImVec2
(
-
outlineThickness
,
-
outlineThickness
)
,
// лево-верх
ImVec2
(
0
,
-
outlineThickness
)
,
// верх
ImVec2
(
outlineThickness
,
-
outlineThickness
)
,
// право-верх
ImVec2
(
-
outlineThickness
,
0
)
,
// лево
ImVec2
(
outlineThickness
,
0
)
,
// право
ImVec2
(
-
outlineThickness
,
outlineThickness
)
,
// лево-низ
ImVec2
(
0
,
outlineThickness
)
,
// низ
ImVec2
(
outlineThickness
,
outlineThickness
)
// право-низ
}
;
for
(
int
layer
=
0
;
layer
AddText
(
myFont
,
ImGui
::
GetFontSize
(
)
,
outlinePos
,
outlineColor
,
text
.
c_str
(
)
)
;
}
}
drawList
->
AddText
(
myFont
,
ImGui
::
GetFontSize
(
)
,
pos
,
textColor
,
text
.
c_str
(
)
)
;
}
;
if
(
!
nickname
.
empty
(
)
)
{
ImU32 nicknameColor
=
IM_COL32
(
r
,
g
,
b
,
255
)
;
DrawTextOutline
(
centeredPos
,
nickname
,
nicknameColor
)
;
}
ImVec2 characterIdPos
=
ImVec2
(
centeredPos
.
x
+
nicknameSize
.
x
,
centeredPos
.
y
)
;
ImU32 whiteColor
=
IM_COL32
(
255
,
255
,
255
,
255
)
;
DrawTextOutline
(
characterIdPos
,
characterIdPart
,
whiteColor
)
;
}
ImGui
::
EndFrame
(
)
;
ImGui
::
Render
(
)
;
ImGui_ImplDX9_RenderDrawData
(
ImGui
::
GetDrawData
(
)
)
;
}
Всякие хуки
void
__fastcall
CPlayerTags_DrawHealthBar_Hook
(
void
*
thisptr
,
void
*
edx
,
CVectorSamp
*
position
,
float
fHealth
,
float
fArmour
,
float
fDistanceToCamera
)
{
if
(
deviceReset
)
return
cPlayerTags_DrawHealthBar
(
thisptr
,
position
,
fHealth
,
fArmour
,
fDistanceToCamera
)
;
Main
::
RenderBars
(
position
,
fDistanceToCamera
,
fHealth
,
fArmour
)
;
}
void
__fastcall
CPlayerTags_DrawLabel_Hook
(
void
*
thisptr
,
void
*
edx
,
CVectorSamp
*
position
,
const
char
*
szText
,
unsigned
long
color
,
float
fDistanceCamera
,
bool
bDrawStatus
,
int
nStatus
)
{
/*if (true) {
return;
}*/
if
(
deviceReset
)
return
cPlayerTags_DrawLabel
(
thisptr
,
position
,
szText
,
color
,
fDistanceCamera
,
bDrawStatus
,
nStatus
)
;
Main
::
RenderText
(
szText
,
position
,
color
,
fDistanceCamera
)
;
}
|
|
|

12.08.2025, 01:50
|
|
Познающий
Регистрация: 03.08.2022
Сообщений: 57
С нами:
1990627
Репутация:
8
|
|
game_ped почему-то nullptr
cpp:
Код:
uintptr_t getPlayerEntity() {
uintptr_t player_pool = getPlayerPool();
uintptr_t local_info = player_pool + 0x2F14;
uintptr_t* local_player = reinterpret_cast(local_info + 0x26);
uintptr_t samp_ped = *local_player;
uintptr_t game_ped = samp_ped + 0x2A4;
return game_ped;
}
CVector* getPos() {
uintptr_t gamePed = getPlayerEntity();
if (!gamePed) {
return reinterpret_cast(0x4043A0)(gamePed);
}
return new CVector{ 1.0, 0.0, 10.0 };
}
Получилось, получил координаты.
Правильный вариант оказался таким:
cpp:
Код:
uintptr_t getPlayerEntity() {
uintptr_t player_pool = getPlayerPool();
uintptr_t local = player_pool + 0x2F14;
uintptr_t local_info = *reinterpret_cast(local + 0x26);
if (!local_info) return 0;
uintptr_t samp_ped = *reinterpret_cast(local_info + 0x0);
uintptr_t game_ped = *reinterpret_cast(samp_ped + 0x2A4);
return game_ped;
}
CVector* getPos() {
uintptr_t gamePed = getPlayerEntity();
if (gamePed) {
return reinterpret_cast(0x4043A0)(gamePed);
}
return new CVector{ 1.0, 0.0, 10.0 };
}
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|