 |
|

06.08.2019, 02:56
|
|
Участник форума
Регистрация: 19.01.2017
Сообщений: 130
С нами:
4901705
Репутация:
98
|
|
C++:
Код:
bool
IsPlayerInCar
(
int
PlayerID
)
{
if
(
g_Players
==
NULL
)
return
NULL
;
if
(
PlayerID
==
g_Players
->
sLocalPlayerID
)
return
NULL
;
if
(
g_Players
->
pRemotePlayer
==
NULL
)
return
NULL
;
if
(
g_Players
->
pRemotePlayer
[
PlayerID
]
->
pPlayerData
==
NULL
)
return
NULL
;
if
(
g_Players
->
pRemotePlayer
[
PlayerID
]
->
pPlayerData
->
pSAMP_Actor
==
NULL
)
return
NULL
;
return
g_Players
->
pRemotePlayer
[
PlayerID
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
->
pedFlags
.
bInVehicle
;
}
;
C++:
Код:
bool
IsOurPlayerInCar
(
)
{
if
(
g_Players
==
NULL
)
return
NULL
;
if
(
g_Players
->
pLocalPlayer
==
NULL
)
return
NULL
;
if
(
g_Players
->
pLocalPlayer
->
pSAMP_Actor
==
NULL
)
return
NULL
;
return
g_Players
->
pLocalPlayer
->
pSAMP_Actor
->
pGTA_Ped
->
pedFlags
.
bInVehicle
;
}
;
C++:
Код:
//usage "%u" getPlayerVehicleModelID_V2(id...)
uint16_t
getPlayerVehicleModelID_V2
(
int
iPlayerID
)
{
if
(
g_Players
==
NULL
||
iPlayerID
SAMP_MAX_PLAYERS
)
return
NULL
;
if
(
iPlayerID
==
g_Players
->
sLocalPlayerID
)
{
if
(
g_Players
->
pLocalPlayer
->
pSAMP_Actor
==
NULL
||
g_Players
->
pLocalPlayer
->
pSAMP_Actor
->
pGTA_Ped
->
vehicle
==
NULL
)
return
NULL
;
if
(
IsOurPlayerInCar
(
)
)
return
g_Players
->
pLocalPlayer
->
pSAMP_Actor
->
pGTA_Ped
->
vehicle
->
base
.
model_alt_id
;
}
if
(
g_Players
->
pRemotePlayer
[
iPlayerID
]
->
pPlayerData
==
NULL
)
return
NULL
;
if
(
g_Players
->
pRemotePlayer
[
iPlayerID
]
->
pPlayerData
->
pSAMP_Vehicle
==
NULL
)
return
NULL
;
if
(
g_Players
->
pRemotePlayer
[
iPlayerID
]
->
pPlayerData
->
pSAMP_Vehicle
->
pGTA_Vehicle
==
NULL
)
return
NULL
;
if
(
IsPlayerInCar
(
iPlayerID
)
)
return
g_Players
->
pRemotePlayer
[
iPlayerID
]
->
pPlayerData
->
pSAMP_Vehicle
->
pGTA_Vehicle
->
base
.
model_alt_id
;
return
NULL
;
}
C++:
Код:
// usage "%s" getPlayerVehicleName(id...);
const
char
*
getPlayerVehicleName
(
int
PlayerID
)
{
if
(
g_Players
==
NULL
||
PlayerID
SAMP_MAX_PLAYERS
)
return
NULL
;
const
struct
vehicle_entry
*
get_vehicles
;
if
(
PlayerID
==
g_Players
->
sLocalPlayerID
)
{
if
(
g_Players
->
pLocalPlayer
->
pSAMP_Actor
==
NULL
||
g_Players
->
pLocalPlayer
->
pSAMP_Actor
->
pGTA_Ped
->
vehicle
==
NULL
)
return
NULL
;
if
(
IsOurPlayerInCar
(
)
)
{
get_vehicles
=
gta_vehicle_get_by_id
(
getPlayerVehicleModelID_V2
(
PlayerID
)
)
;
return
get_vehicles
->
name
;
}
}
if
(
g_Players
->
pRemotePlayer
[
PlayerID
]
->
pPlayerData
==
NULL
)
return
NULL
;
if
(
g_Players
->
pRemotePlayer
[
PlayerID
]
->
pPlayerData
->
pSAMP_Vehicle
==
NULL
)
return
NULL
;
if
(
g_Players
->
pRemotePlayer
[
PlayerID
]
->
pPlayerData
->
pSAMP_Vehicle
->
pGTA_Vehicle
==
NULL
)
return
NULL
;
if
(
IsPlayerInCar
(
PlayerID
)
)
{
get_vehicles
=
gta_vehicle_get_by_id
(
getPlayerVehicleModelID_V2
(
PlayerID
)
)
;
return
get_vehicles
->
name
;
}
return
NULL
;
}
|
|
|

10.08.2019, 11:23
|
|
Участник форума
Регистрация: 04.04.2017
Сообщений: 263
С нами:
4793630
Репутация:
133
|
|
Конвертация utf8 в ansi
C++:
Код:
char
*
utf8_to_ansi
(
char
*
szU8
)
{
int
wcsLen
=
::
MultiByteToWideChar
(
CP_UTF8
,
NULL
,
szU8
,
strlen
(
szU8
)
,
NULL
,
0
)
;
wchar_t
*
wszString
=
new
wchar_t
[
wcsLen
+
1
]
;
::
MultiByteToWideChar
(
CP_UTF8
,
NULL
,
szU8
,
strlen
(
szU8
)
,
wszString
,
wcsLen
)
;
wszString
[
wcsLen
]
=
'\0'
;
int
ansiLen
=
::
WideCharToMultiByte
(
CP_ACP
,
NULL
,
wszString
,
wcslen
(
wszString
)
,
NULL
,
0
,
NULL
,
NULL
)
;
char
*
szAnsi
=
new
char
[
ansiLen
+
1
]
;
::
WideCharToMultiByte
(
CP_ACP
,
NULL
,
wszString
,
wcslen
(
wszString
)
,
szAnsi
,
ansiLen
,
NULL
,
NULL
)
;
szAnsi
[
ansiLen
]
=
'\0'
;
return
szAnsi
;
}
|
|
|

18.08.2019, 21:17
|
|
Участник форума
Регистрация: 19.01.2017
Сообщений: 130
С нами:
4901705
Репутация:
98
|
|
Сообщение от Спойлер
C++:
[CODE]
struct
Color2
{
int
r
;
int
g
;
int
b
;
int
a
;
Color2
(
)
{
this
->
r
=
0
;
this
->
g
=
0
;
this
->
b
=
0
;
this
->
a
=
255
;
}
Color2
(
int
r
,
int
g
,
int
b
)
{
this
->
r
=
r
;
this
->
g
=
g
;
this
->
b
=
b
;
this
->
a
=
255
;
}
Color2
(
int
r
,
int
g
,
int
b
,
int
a
)
{
this
->
r
=
r
;
this
->
g
=
g
;
this
->
b
=
b
;
this
->
a
=
a
;
}
Color2
operator
/
(
float
div
)
{
Color2 color
=
*
this
;
color
.
r
=
color
.
r
/
div
;
color
.
g
=
color
.
g
/
div
;
color
.
b
=
color
.
b
/
div
;
return
color
;
}
Color2
&
operator
/=
(
float
div
)
{
Color2
&
color
=
*
this
;
color
.
r
/=
div
;
color
.
g
/=
div
;
color
.
b
/=
div
;
return
color
;
}
Color2
&
operator
*=
(
float
coeff
)
{
Color2
&
color
=
*
this
;
color
.
r
*=
coeff
;
color
.
g
*=
coeff
;
color
.
b
*=
coeff
;
return
color
;
}
static
Color2
FromHSB
(
float
hue
,
float
saturation
,
float
brightness
)
{
float
h
=
hue
==
1.0f
?
0
:
hue
*
6.0f
;
float
f
=
h
-
(
int
)
h
;
float
p
=
brightness
*
(
1.0f
-
saturation
)
;
float
q
=
brightness
*
(
1.0f
-
saturation
*
f
)
;
float
t
=
brightness
*
(
1.0f
-
(
saturation
*
(
1.0f
-
f
)
)
)
;
if
(
h
C++:
Код:
ImVec4
TotalRainbow
(
int
speed
)
{
ImVec4 color
;
static
float
rainbow
;
float
misc
;
DWORD rainbow_x
;
rainbow
+=
misc
=
0.0001f
*
speed
;
rainbow_x
=
Color2
::
ToImColor
(
Color2
::
FromHSB
(
rainbow
,
1.0f
,
1.0f
)
)
;
if
(
rainbow
>
1.f
)
rainbow
=
0.0f
;
return
color
=
Color2
::
ToImColor
(
Color2
::
FromHSB
(
rainbow
,
1.0f
,
1.0f
)
)
;
}
example usage
ImGui::PushStyleColor(ImGuiCol_Text, TotalRainbow(20)); //or in your header file: extern ImVec4 TotalRainbow(int speed = 20)
ImGui::Text("vodka");
ImGui::PopStyleColor(1);
C++:
Код:
D3DCOLOR
CustomImVec4_D3DCOLOR
(
ImVec4 color
)
//use in ImGui::ColorEdit's
{
return
D3DCOLOR_RGBA
(
(
int
)
(
color
.
x
*
255
)
,
(
int
)
(
color
.
y
*
255
)
,
(
int
)
(
color
.
z
*
255
)
,
(
int
)
(
color
.
w
*
255
)
)
;
}
example use
ImVec4 color;
render->D3DBox(,,,CustomImVec4_D3DCOLOR(color));
ImGui::ColorEdit3("##BoxColor", (float*)&color);
|
|
|

04.10.2019, 00:06
|
|
Постоянный
Регистрация: 25.12.2018
Сообщений: 568
С нами:
3886298
Репутация:
113
|
|
Описание:находит ближайшего к вашему педу игрока, на определенном радиусе от прицела.
Код:
C++:
[CODE]
void
vect3_copy
(
const
float
in
[
3
]
,
float
out
[
3
]
)
{
memcpy
(
out
,
in
,
sizeof
(
float
)
*
3
)
;
}
float
GetDistance
(
D3DXVECTOR3 target_1
,
D3DXVECTOR3 target_2
)
{
return
sqrt
(
(
target_2
.
x
-
target_1
.
x
)
*
(
target_2
.
x
-
target_1
.
x
)
+
(
target_2
.
y
-
target_1
.
y
)
*
(
target_2
.
y
-
target_1
.
y
)
+
(
target_2
.
z
-
target_1
.
z
)
*
(
target_2
.
z
-
target_1
.
z
)
)
;
}
int
GetNearestPed
(
float
radius
)
{
int
nearestPED
=
-
1
;
float
maxRadius
=
20000.0f
,
currentRadius
;
D3DXVECTOR3 posPed
,
myPosPed
,
screenPos
;
actor_info
*
MyActorInfo
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
pSAMP_Actor
->
pGTA_Ped
;
vect3_copy
(
MyActorInfo
->
base
.
matrix
+
12
,
myPosPed
)
;
for
(
int
i
=
0
;
i
getSAMP
(
)
->
getPlayers
(
)
->
iIsListed
[
i
]
!=
1
||
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
==
NULL
||
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
==
NULL
||
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
==
NULL
||
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
==
NULL
)
continue
;
actor_info
*
ActorInfo
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
;
vect3_copy
(
ActorInfo
->
base
.
matrix
+
12
,
posPed
)
;
SF
->
getGame
(
)
->
convert3DCoordsToScreen
(
posPed
.
x
,
posPed
.
y
,
posPed
.
z
,
&
screenPos
.
x
,
&
screenPos
.
y
)
;
static
float
iX
=
GetSystemMetrics
(
SM_CXSCREEN
)
*
0.5299999714f
;
static
float
iY
=
GetSystemMetrics
(
SM_CYSCREEN
)
*
0.4f
;
if
(
(
(
abs
(
iX
-
screenPos
.
x
)
)
>
radius
)
||
(
(
abs
(
iY
-
screenPos
.
y
)
)
>
radius
)
)
continue
;
currentRadius
=
GetDistance
(
myPosPed
,
posPed
)
;
if
(
currentRadius
Пример:
C++:
[CODE]
int
id
=
GetNearestPed
(
100
)
;
if
(
id
|
|
|

11.10.2019, 20:15
|
|
Постоянный
Регистрация: 05.03.2014
Сообщений: 626
С нами:
6415078
Репутация:
163
|
|
поворачивает камеру на координаты
C++:
[CODE]
float
*
xCam
=
(
float
*
)
0xB6F258
;
DWORD
*
ptrActor
=
(
DWORD
*
)
0xB6F5F0
;
// global vars
void
rotateCamToXY
(
float
x
,
float
y
)
{
DWORD
*
pActorMtrx
=
(
DWORD
*
)
(
(
*
ptrActor
)
+
0x14
)
;
CVector2D
pPos
(
*
(
float
*
)
(
(
*
pActorMtrx
)
+
0x30
)
,
*
(
float
*
)
(
(
*
pActorMtrx
)
+
0x34
)
)
;
CVector2D
cPos
(
*
(
float
*
)
(
0xB6F9CC
)
,
*
(
float
*
)
(
0xB6F9D0
)
)
;
float
ac
=
sqrt
(
pow
(
fabs
(
cPos
.
fX
-
x
)
,
2
)
+
pow
(
fabs
(
cPos
.
fY
-
y
)
,
2
)
)
;
float
alpha
=
asin
(
fabs
(
cPos
.
fX
-
x
)
/
ac
)
;
float
beta
=
acos
(
fabs
(
cPos
.
fX
-
x
)
/
ac
)
;
if
(
(
pPos
.
fX
>
x
)
&&
(
pPos
.
fY
x
)
&&
(
pPos
.
fY
>
y
)
)
*
xCam
=
beta
;
if
(
(
pPos
.
fX
y
)
)
*
xCam
=
(
alpha
+
(
1.57
)
)
;
if
(
(
pPos
.
fX
|
|
|

11.10.2019, 21:31
|
|
Участник форума
Регистрация: 04.04.2017
Сообщений: 263
С нами:
4793630
Репутация:
133
|
|
[QUOTE="astap_"]
поворачивает камеру на координаты
C++:
[CODE]
float
*
xCam
=
(
float
*
)
0xB6F258
;
DWORD
*
ptrActor
=
(
DWORD
*
)
0xB6F5F0
;
// global vars
void
rotateCamToXY
(
float
x
,
float
y
)
{
DWORD
*
pActorMtrx
=
(
DWORD
*
)
(
(
*
ptrActor
)
+
0x14
)
;
CVector2D
pPos
(
*
(
float
*
)
(
(
*
pActorMtrx
)
+
0x30
)
,
*
(
float
*
)
(
(
*
pActorMtrx
)
+
0x34
)
)
;
CVector2D
cPos
(
*
(
float
*
)
(
0xB6F9CC
)
,
*
(
float
*
)
(
0xB6F9D0
)
)
;
float
ac
=
sqrt
(
pow
(
fabs
(
cPos
.
fX
-
x
)
,
2
)
+
pow
(
fabs
(
cPos
.
fY
-
y
)
,
2
)
)
;
float
alpha
=
asin
(
fabs
(
cPos
.
fX
-
x
)
/
ac
)
;
float
beta
=
acos
(
fabs
(
cPos
.
fX
-
x
)
/
ac
)
;
if
(
(
pPos
.
fX
>
x
)
&&
(
pPos
.
fY
x
)
&&
(
pPos
.
fY
>
y
)
)
*
xCam
=
beta
;
if
(
(
pPos
.
fX
y
)
)
*
xCam
=
(
alpha
+
(
1.57
)
)
;
if
(
(
pPos
.
fX
C++:
Код:
void
cameraset
(
float
X
,
float
Y
)
{
CVector mypos
;
CVector enpos
;
CVector vector
;
enpos
.
fX
=
X
;
enpos
.
fY
=
Y
;
CCamera
*
pCamera
=
GAME
->
GetCamera
(
)
;
mypos
=
*
pCamera
->
GetCam
(
pCamera
->
GetActiveCam
(
)
)
->
GetSource
(
)
;
vector
=
mypos
-
enpos
;
float
AngleX
=
atan2f
(
vector
.
fY
,
-
vector
.
fX
)
-
M_PI
/
2
;
*
(
float
*
)
0xB6F258
=
-
(
AngleX
-
M_PI
/
2
)
;
}
|
|
|

11.10.2019, 22:35
|
|
Постоянный
Регистрация: 25.12.2018
Сообщений: 568
С нами:
3886298
Репутация:
113
|
|
Описание: находит ближайшую кость противника к прицелу.
Код:
C++:
[CODE]
CVector
GetBonePos
(
INT ID
,
eBone eBone
,
BOOL isOnScreen
)
{
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
iIsListed
[
ID
]
!=
1
||
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
ID
]
==
NULL
||
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
ID
]
->
pPlayerData
==
NULL
||
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
ID
]
->
pPlayerData
->
pSAMP_Actor
==
NULL
||
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
ID
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
==
NULL
)
return
CVector
(
0.0F
,
0.0F
,
0.0F
)
;
if
(
isOnScreen
)
{
CVector BonePosition
;
CVector2D BonePositionOnScreen
;
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
ID
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
)
->
GetTransformedBonePosition
(
eBone
,
&
BonePosition
)
;
SF
->
getGame
(
)
->
convert3DCoordsToScreen
(
BonePosition
.
fX
,
BonePosition
.
fY
,
BonePosition
.
fZ
,
&
BonePositionOnScreen
.
fX
,
&
BonePositionOnScreen
.
fY
)
;
return
CVector
(
BonePositionOnScreen
.
fX
,
BonePositionOnScreen
.
fY
,
0.0F
)
;
}
else
{
CVector BonePosition
;
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
ID
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
)
->
GetTransformedBonePosition
(
eBone
,
&
BonePosition
)
;
return
CVector
(
BonePosition
.
fX
,
BonePosition
.
fY
,
BonePosition
.
fZ
)
;
}
}
eBone
GetNearestBone
(
int
iID
)
{
eBone
currentBone
[
]
=
{
BONE_RIGHTKNEE
,
BONE_LEFTKNEE
,
BONE_RIGHTELBOW
,
BONE_LEFTELBOW
,
BONE_SPINE1
,
BONE_RIGHTSHOULDER
,
BONE_LEFTSHOULDER
,
BONE_HEAD
}
,
nearestBone
;
float
currentRadius
,
maxRadius
=
20000
;
CVector posBone
;
for
(
int
i
=
0
;
i
Пример:
C++:
Код:
eBone nearestBone
=
GetNearestBone
(
playerID
)
;
|
|
|

31.10.2019, 21:54
|
|
Постоянный
Регистрация: 10.01.2016
Сообщений: 922
С нами:
5441999
Репутация:
133
|
|
Разработчики, только перешедшие с клео\луа на C++ негодуют из-за необходимости использовать разного рода таймеры и лапшу из GetTickCount'ов вместо полюбившихся функций wait. Но особо ярых фанатов клео это не устраивает, отчего они начинают использовать потоки ради функций вроде Sleep для того чтобы не блокировать цикл игры. Однако это не безопасно. Функции ни GTA ни SAMP'а абсолютно не предназначены для использования в разных потоках и их использование может привести к рандомным крашам.
Выход есть!
Example:
Код:
#include
#include
#include "Yet-another-hook-library/hook.h"
#include "sampapi/CChat.h"
#include "coro_wait/coro_wait.h"
using
namespace
sampapi
::
v037r1
;
void
foo
(
)
{
using
namespace
std
::
chrono_literals
;
CChat
*
&
pChat
=
RefChat
(
)
;
while
(
!
pChat
)
{
this_coro
::
wait
(
100
ms
)
;
}
unsigned
int
counter
=
0
;
while
(
true
)
{
pChat
->
AddMessage
(
-
1
,
(
std
::
string
(
"Hello "
)
+
std
::
to_string
(
counter
)
)
.
c_str
(
)
)
;
counter
++
;
this_coro
::
wait
(
1
s
)
;
}
}
void
CGame_Process_hk
(
)
{
static
coro_wait instance
{
foo
}
;
instance
.
process
(
)
;
}
class
coro_wait_example
{
public
:
coro_wait_example
(
)
{
using
CGame_Process_t
=
void
(
__cdecl
*
)
(
)
;
CGame_Process_t CGame_Process
=
reinterpret_cast
(
0x53BEE0
)
;
static
hook
CGame_Process_hook
(
CGame_Process
,
CGame_Process_hk
)
;
}
}
coro_wait_example
;
Выполнение функции foo приостанавливается на время, переданное функции this_coro::wait, и продолжается с того же места. Все это работает в одном потоке, благодаря чему можно не переживать за потокобезопасность вызываемых внутри функций.
В бесконечных или очень больших циклах требуется вызывать wait(0), все по канонам клео.
Функция coro_wait: rocess должна вызываться в потоке игры (перехваченном как в примере, либо в функции mainloop для SF API).
Требуется библиотека Boost.Context!
Исходный код:
GitHub - allwanttokissme/coro_wait: Suspending coroutines by time
Suspending coroutines by time. Contribute to allwanttokissme/coro_wait development by creating an account on GitHub.
github.com
хуки
sampapi
|
|
|

01.11.2019, 16:00
|
|
Флудер
Регистрация: 10.08.2017
Сообщений: 2,659
С нами:
4609424
Репутация:
183
|
|
Сообщение от BlackKnigga
вроде Sleep для того чтобы не блокировать цикл игры.
Как насчёт std::this_thread::wait_for(time)? Вроде нет проблем же, или я что-то не понимаю?
|
|
|

01.11.2019, 16:14
|
|
Постоянный
Регистрация: 10.01.2016
Сообщений: 922
С нами:
5441999
Репутация:
133
|
|
Сообщение от #Northn
Как насчёт std::this_thread::wait_for(time)? Вроде нет проблем же, или я что-то не понимаю?
Оно работает точно также как и Sleep
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|