Просмотр полной версии : Полезные функции
By_Surse
01.01.2016, 09:31
Пишем сюда полезные функции !
By_Surse
01.01.2016, 14:50
Функция телепортирует игрока в машине
Использование: InCarDataSync(i,x,y,z); [I - Ид игрока, x,y,z - Координаты для телепортирования]
C++:
void
InCarDataSync
(
int
i
,
float
x1
,
float
y1
,
float
z1
)
{
int
icar
;
stRemotePlayer
*
pPlayer
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
;
if
(
!
pPlayer
)
return
;
icar
=
pPlayer
->
pPlayerData
->
sVehicleID
;
if
(
!
icar
)
return
;
CVehicle
*
veh
=
PEDSELF
->
GetVehicle
(
)
;
if
(
!
veh
)
return
;
stInCarData sync
;
memset
(
&
sync
,
0
,
sizeof
(
stInCarData
)
)
;
sync
=
pPlayer
->
pPlayerData
->
inCarData
;
sync
.
fPosition
[
0
]
=
x1
;
sync
.
fPosition
[
1
]
=
y1
;
sync
.
fPosition
[
2
]
=
z1
;
BitStream CarSync
;
CarSync
.
Write
(
(
BYTE
)
ID_VEHICLE_SYNC
)
;
CarSync
.
Write
(
(
PCHAR
)
&
sync
,
sizeof
(
stInCarData
)
)
;
SF
->
getRakNet
(
)
->
SendPacket
(
&
CarSync
)
;
}
P.S. Функция сама проверяет существует игрок или нет
By_Surse
01.01.2016, 14:52
Функция отправляет пулю в указанного игрока
Использование: BulletData(i); [I - Ид игрока]
C++:
void
BulletData
(
int
i
)
{
stRemotePlayer
*
pPlayer
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
;
if
(
!
pPlayer
)
return
;
stBulletData sync
;
ZeroMemory
(
&
sync
,
sizeof
(
stBulletData
)
)
;
sync
.
sTargetID
=
i
;
sync
.
fOrigin
[
0
]
=
PEDSELF
->
GetPosition
(
)
->
fX
;
sync
.
fOrigin
[
1
]
=
PEDSELF
->
GetPosition
(
)
->
fY
;
sync
.
fOrigin
[
2
]
=
PEDSELF
->
GetPosition
(
)
->
fZ
;
sync
.
fTarget
[
0
]
=
pPlayer
->
pPlayerData
->
fOnFootPos
[
0
]
;
sync
.
fTarget
[
1
]
=
pPlayer
->
pPlayerData
->
fOnFootPos
[
1
]
;
sync
.
fTarget
[
2
]
=
pPlayer
->
pPlayerData
->
fOnFootPos
[
2
]
;
sync
.
fCenter
[
0
]
=
0.0
;
sync
.
fCenter
[
1
]
=
0.0
;
sync
.
fCenter
[
2
]
=
0.5
;
sync
.
byteWeaponID
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
byteCurrentWeapon
;
sync
.
byteType
=
1
;
BitStream BulletSync
;
BulletSync
.
Write
(
(
BYTE
)
PacketEnumeration
::
ID_BULLET_SYNC
)
;
BulletSync
.
Write
(
(
PCHAR
)
&
sync
,
sizeof
(
stBulletData
)
)
;
SF
->
getRakNet
(
)
->
SendPacket
(
&
BulletSync
)
;
}
P.S. Функция сама проверяет существует игрок или нет
By_Surse
08.01.2016, 19:21
Функция отправляет фейк позицию игрока с помощью синхры
Использование: OnFootSync(X,Y,Z); [X,Y,Z - Координаты для отправки]
C++:
void
OnFootSync
(
float
CX
,
float
CY
,
float
CZ
)
{
stOnFootData OF
;
memset
(
&
OF
,
0
,
sizeof
(
stOnFootData
)
)
;
OF
.
fPosition
[
0
]
=
CX
;
OF
.
fPosition
[
1
]
=
CY
;
OF
.
fPosition
[
2
]
=
CZ
;
BitStream OFsync
;
OFsync
.
Write
(
(
BYTE
)
ID_PLAYER_SYNC
)
;
OFsync
.
Write
(
(
PCHAR
)
&
OF
,
sizeof
(
stOnFootData
)
)
;
SF
->
getRakNet
(
)
->
SendPacket
(
&
OFsync
)
;
}
Gabriel__
09.01.2016, 15:13
Функция телепортирует игрока в определенную точку.
Код:
void actor_teleport(float x, float y, float z)
{
actor_info *self = SF->getGame()->actorInfoGet(ACTOR_SELF, ACTOR_ALIVE);
self->base.matrix[4 * 3] = x;
self->base.matrix[4 * 3 + 1] = y;
self->base.matrix[4 * 3 + 2] = z;
}
itsLegend
10.01.2016, 00:39
Функция телепортирует игрока в определенную точку.
Код:
void actor_teleport(float x, float y, float z)
{
actor_info *self = SF->getGame()->actorInfoGet(ACTOR_SELF, ACTOR_ALIVE);
self->base.matrix[4 * 3] = x;
self->base.matrix[4 * 3 + 1] = y;
self->base.matrix[4 * 3 + 2] = z;
}
C++:
#include "game_api\game_api.h"
PEDSELF
->
Teleport
(
x
,
y
,
z
)
;
C++:
bool
Driving
(
int
PlayerID
)
{
if
(
PlayerID
==
ACTOR_SELF
)
PlayerID
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
sLocalPlayerID
;
int
state
;
if
(
PlayerID
==
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
sLocalPlayerID
)
state
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
pSAMP_Actor
->
pGTA_Ped
->
state
;
else
state
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
PlayerID
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
->
state
;
if
(
state
==
50
)
return
true
;
else
return
false
;
}
;
C++:
bool
isDriver
(
int
PlayerID
)
{
if
(
PlayerID
==
ACTOR_SELF
)
PlayerID
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
sLocalPlayerID
;
if
(
PlayerID
==
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
sLocalPlayerID
)
{
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
pSAMP_Actor
->
pGTA_Ped
->
state
==
50
)
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
pSAMP_Actor
->
pGTA_Ped
->
vehicle
->
passengers
[
0
]
==
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
pSAMP_Actor
->
pGTA_Ped
)
return
true
;
}
else
{
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
PlayerID
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
->
state
==
50
)
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
PlayerID
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
->
vehicle
->
passengers
[
0
]
==
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
PlayerID
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
)
return
true
;
}
return
false
;
}
;
C++:
float
getSkill
(
int
weaponId
)
{
float
Skill
=
1000.0f
;
if
(
(
weaponId
>=
22
)
&&
(
weaponId
C++:
[CODE]
bool
IsOnScreen
(
DWORD OBJECT
)
{
DWORD dwFunc
=
FUNC_IsVisible
;
DWORD dwThis
=
(
DWORD
)
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pObject
->
object
[
OBJECT
]
->
pGTAEntity
;
bool
bReturn
=
false
;
_asm
{
mov ecx
,
dwThis
call dwFunc
mov bReturn
,
al
}
return
bReturn
;
}
By_Surse
06.02.2016, 15:11
Телепортирует машину игрока
C++:
void
VehTP
(
float
x
,
float
y
,
float
z
)
{
actor_info
*
self
=
SF
->
getGame
(
)
->
actorInfoGet
(
VEHICLE_SELF
,
VEHICLE_ALIVE
)
;
self
->
vehicle
->
base
.
matrix
[
4
*
3
]
=
x
;
self
->
vehicle
->
base
.
matrix
[
4
*
3
+
1
]
=
y
;
self
->
vehicle
->
base
.
matrix
[
4
*
3
+
2
]
=
z
;
}
itsLegend
06.02.2016, 15:26
Телепортирует машину игрока
C++:
void
VehTP
(
float
x
,
float
y
,
float
z
)
{
actor_info
*
self
=
SF
->
getGame
(
)
->
actorInfoGet
(
VEHICLE_SELF
,
VEHICLE_ALIVE
)
;
self
->
vehicle
->
base
.
matrix
[
4
*
3
]
=
x
;
self
->
vehicle
->
base
.
matrix
[
4
*
3
+
1
]
=
y
;
self
->
vehicle
->
base
.
matrix
[
4
*
3
+
2
]
=
z
;
}
PEDSELF->GetVehicle()->SetPosition(&CVector(0.0f, 0.0f, 0.0f));
PEDSELF->GetVehicle()->Teleport(0.0f, 0.0f, 0.0f);
By_Surse
29.02.2016, 13:19
Телепорт по метке!
C++:
void
mapMenuTeleport
(
void
)
{
if
(
(
*
(
int
*
)
0xBA6774
!=
0
)
)
{
// ty to Racer_S for this
float
mapPos
[
3
]
;
for
(
int
i
=
0
;
i
GetWorld
(
)
->
FindGroundZForPosition
(
pos
[
0
]
,
pos
[
1
]
)
+
2.0f
;
PEDSELF
->
Teleport
(
mapPos
[
0
]
,
mapPos
[
1
]
,
mapPos
[
2
]
)
;
}
}
}
}
Я думаю, по названиям функций понятно.
C++:
int
GetWeaponID
(
)
{
return
PEDSELF
->
GetWeapon
(
PEDSELF
->
GetCurrentWeaponSlot
(
)
)
->
GetType
(
)
;
}
eWeaponState
GetWeaponState
(
)
{
return
PEDSELF
->
GetWeapon
(
PEDSELF
->
GetCurrentWeaponSlot
(
)
)
->
GetState
(
)
;
}
int
GetAmmoInClip
(
)
{
return
PEDSELF
->
GetWeapon
(
PEDSELF
->
GetCurrentWeaponSlot
(
)
)
->
GetAmmoInClip
(
)
;
}
int
GetAmmoTotal
(
)
{
return
PEDSELF
->
GetWeapon
(
PEDSELF
->
GetCurrentWeaponSlot
(
)
)
->
GetAmmoTotal
(
)
;
}
int
GetWantedLevel
(
)
{
return
*
(
DWORD
*
)
0x58DB60
;
}
Dark_Knight
07.03.2016, 22:44
int GetWantedLevel()
{
return *(DWORD*)0x58DB60;
}
Там байт храниться.
Так же это всё можно найти в пЛокалПлеер.
By_Surse
08.03.2016, 21:24
Получает разрешение экрана.
Вызов: POINT Screen = get_screen_resolution();
C++:
POINT
get_screen_resolution
(
)
{
POINT pos
;
pos
.
x
=
*
(
int
*
)
0xC9C040
;
pos
.
y
=
*
(
int
*
)
0xC9C044
;
return
pos
;
}
By_Surse
13.03.2016, 10:34
Выдача оружия через эмуляцию RPC
C++:
void
emulateRPC_giveweapon
(
uint32_t
weapon_id
,
uint32_t
ammo
)
{
BitStream bsClass
;
bsClass
.
Write
(
uint32_t
(
weapon_id
)
)
;
// WeaponID
bsClass
.
Write
(
uint32_t
(
ammo
)
)
;
// Ammo
SF
->
getRakNet
(
)
->
emulateRecvRPC
(
22
,
&
bsClass
)
;
}
Смена скина через эмуляцию RPC
C++:
void
emulateRPC_setskin
(
uint32_t
player_id
,
uint32_t
skin_id
)
{
BitStream bsClass
;
bsClass
.
Write
(
uint32_t
(
player_id
)
)
;
bsClass
.
Write
(
uint32_t
(
skin_id
)
)
;
SF
->
getRakNet
(
)
->
emulateRecvRPC
(
153
,
&
bsClass
)
;
}
Отправка фейковой позиции...
C++:
void
send_onfootdata
(
float
x
,
float
y
,
float
z
)
{
if
(
BS
->
getPlugin
(
)
->
actor_driving
(
-
1
)
)
return
;
BitStream bsOnfootSync
;
stOnFootData ofSync
;
memset
(
&
ofSync
,
0
,
sizeof
(
stOnFootData
)
)
;
ofSync
.
byteArmor
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
byteArmor
;
ofSync
.
byteCurrentWeapon
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
byteCurrentWeapon
;
ofSync
.
byteHealth
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
byteHealth
;
ofSync
.
byteSpecialAction
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
byteSpecialAction
;
ofSync
.
fMoveSpeed
[
0
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fMoveSpeed
[
0
]
;
ofSync
.
fMoveSpeed
[
1
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fMoveSpeed
[
1
]
;
ofSync
.
fMoveSpeed
[
2
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fMoveSpeed
[
2
]
;
ofSync
.
fPosition
[
0
]
=
x
;
ofSync
.
fPosition
[
1
]
=
y
;
ofSync
.
fPosition
[
2
]
=
z
;
ofSync
.
fQuaternion
[
0
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fQuaternion
[
0
]
;
ofSync
.
fQuaternion
[
1
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fQuaternion
[
1
]
;
ofSync
.
fQuaternion
[
2
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fQuaternion
[
2
]
;
ofSync
.
fQuaternion
[
3
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fQuaternion
[
3
]
;
ofSync
.
fSurfingOffsets
[
0
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fSurfingOffsets
[
0
]
;
ofSync
.
fSurfingOffsets
[
1
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fSurfingOffsets
[
1
]
;
ofSync
.
fSurfingOffsets
[
2
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fSurfingOffsets
[
2
]
;
ofSync
.
sAnimFlags
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
sAnimFlags
;
ofSync
.
sCurrentAnimationID
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
sCurrentAnimationID
;
ofSync
.
sKeys
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
sKeys
;
ofSync
.
sLeftRightKeys
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
sLeftRightKeys
;
ofSync
.
sSurfingVehicleID
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
sSurfingVehicleID
;
ofSync
.
stSampKeys
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
stSampKeys
;
ofSync
.
sUpDownKeys
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
sUpDownKeys
;
bsOnfootSync
.
Write
(
(
BYTE
)
ID_PLAYER_SYNC
)
;
bsOnfootSync
.
Write
(
(
PCHAR
)
&
ofSync
,
sizeof
(
stOnFootData
)
)
;
SF
->
getRakNet
(
)
->
SendPacket
(
&
bsOnfootSync
)
;
}
Фейк смерть от игрока
C++:
void
send_death
(
uint16_t
player_id
,
uint8_t
weapon
)
{
BitStream bsDeath
;
bsDeath
.
Write
(
weapon
)
;
bsDeath
.
Write
(
player_id
)
;
SF
->
getRakNet
(
)
->
SendRPC
(
RPC_Death
,
&
bsDeath
)
;
}
iAmerican
27.09.2016, 19:09
Возвращает ID игрока , на заданном радиусе от прицела.
C++:
void
CalcScreenCoors
(
D3DXVECTOR3
*
vecWorld
,
D3DXVECTOR3
*
vecScreen
)
{
D3DXMATRIX
m
(
(
float
*
)
(
0xB6FA2C
)
)
;
DWORD
*
dwLenX
=
(
DWORD
*
)
(
0xC17044
)
;
DWORD
*
dwLenY
=
(
DWORD
*
)
(
0xC17048
)
;
vecScreen
->
x
=
(
vecWorld
->
z
*
m
.
_31
)
+
(
vecWorld
->
y
*
m
.
_21
)
+
(
vecWorld
->
x
*
m
.
_11
)
+
m
.
_41
;
vecScreen
->
y
=
(
vecWorld
->
z
*
m
.
_32
)
+
(
vecWorld
->
y
*
m
.
_22
)
+
(
vecWorld
->
x
*
m
.
_12
)
+
m
.
_42
;
vecScreen
->
z
=
(
vecWorld
->
z
*
m
.
_33
)
+
(
vecWorld
->
y
*
m
.
_23
)
+
(
vecWorld
->
x
*
m
.
_13
)
+
m
.
_43
;
double
fRecip
=
(
double
)
1.0
/
vecScreen
->
z
;
vecScreen
->
x
*=
(
float
)
(
fRecip
*
(
*
dwLenX
)
)
;
vecScreen
->
y
*=
(
float
)
(
fRecip
*
(
*
dwLenY
)
)
;
}
int
GetPlayerTarget
(
int
radius
)
{
static
int
iX
;
static
int
iY
;
for
(
int
i
=
0
;
i
getSAMP
(
)
->
getPlayers
(
)
->
iIsListed
[
i
]
!=
1
)
continue
;
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
==
NULL
)
continue
;
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
==
NULL
||
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
==
NULL
)
continue
;
D3DXVECTOR3 vecPos
;
vecPos
.
x
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
->
base
.
matrix
[
12
]
;
vecPos
.
y
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
->
base
.
matrix
[
13
]
;
vecPos
.
z
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
->
base
.
matrix
[
14
]
;
D3DXVECTOR3 screenPos
;
CalcScreenCoors
(
&
vecPos
,
&
screenPos
)
;
if
(
screenPos
.
z
iX
+
(
radius
)
)
||
(
screenPos
.
y
>
iY
+
(
radius
)
)
||
(
screenPos
.
x
Использование :
C++:
[CODE]
static
int
iID
=
-
1
;
iID
=
GetPlayerTarget
(
50
)
Dark_Knight
13.04.2018, 22:33
Обработчик событий OnClickMouse.
Ты идиот.
C++:
[CODE]
bool
OnMouseHover
(
float
x
,
float
y
,
float
w
,
float
h
)
{
POINT MousePosition
=
SF
->
getGame
(
)
->
getCursorPos
(
)
;
return
(
MousePosition
.
x
>=
x
&&
MousePosition
.
x
=
y
&&
MousePosition
.
y
CleanLegend
23.10.2018, 21:29
3D круг с этой темы - https://blast.hk/threads/25508/
C++:
void
krug3d
(
float
x
,
float
y
,
float
z
,
float
radius
,
D3DCOLOR Color
)
{
float
enpos
[
3
]
;
float
screen
[
2
]
,
screen2
[
2
]
;
float
step
=
M_PI
*
2.0
/
2047
;
for
(
float
rot
=
0
;
rot
getGame
(
)
->
convert3DCoordsToScreen
(
enpos
[
0
]
,
enpos
[
1
]
,
enpos
[
2
]
,
&
screen
[
0
]
,
&
screen
[
1
]
)
;
if
(
screen
[
0
]
!=
NULL
&&
screen2
[
0
]
!=
NULL
)
SF
->
getRender
(
)
->
DrawLine
(
screen
[
0
]
,
screen
[
1
]
,
screen2
[
0
]
,
screen2
[
1
]
,
2
,
Color
)
;
screen2
[
0
]
=
screen
[
0
]
;
screen2
[
1
]
=
screen
[
1
]
;
}
}
пример использования:
C++:
krug3d
(
X
,
Y
,
Z
,
3
,
0xFF00FF00
)
;
https://i.imgur.com/YD2nQwC.png
https://i.imgur.com/qwGQACq.png
Эмулирует анимацию стана как при попадании пули в скин.
Полезно для разработчиков сайлент аимов
C++:
int
GetWeaponFlag
(
int
weaponID
)
{
if
(
weaponID
==
24
||
weaponID
==
25
||
weaponID
==
27
)
return
140
;
else
if
(
weaponID
==
34
||
weaponID
==
33
)
return
75
;
return
-
1
;
}
void
EmulateStunShot
(
WORD playerId
,
int
weapon_id
,
int
damage_per_hit
)
{
int
stun_weapon
=
GetWeaponFlag
(
weapon_id
)
;
if
(
stun_weapon
!=
-
1
)
{
actor_info
*
actorInfo
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
playerId
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
;
if
(
actorInfo
==
nullptr
)
return
;
CPed
*
Ped
=
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
actorInfo
)
;
if
(
Ped
==
nullptr
)
return
;
CEntity
*
Entity
=
Ped
->
GetDamageEntity
(
)
;
CWeapon
*
Wep
=
PEDSELF
->
GetWeapon
(
(
eWeaponType
)
weapon_id
)
;
if
(
Entity
==
nullptr
||
Wep
==
nullptr
)
return
;
Wep
->
GenerateDamageEvent
(
Ped
,
Entity
,
(
eWeaponType
)
weapon_id
,
damage_per_hit
,
PED_PIECE_RIGHT_ARM
,
GetWeaponFlag
(
weapon_id
)
)
;
}
}
Пример:
C++:
EmulateStunShot
(
228
,
24
,
42
)
;
Рассчитывает кватернион поворота к указанному игроку.
C++:
void
RotateQuaternion
(
float
angle_radian
,
float
*
quat_w
,
float
*
quat_x
)
{
*
quat_x
=
-
1
*
sinf
(
angle_radian
/
2.0f
)
;
*
quat_w
=
cosf
(
angle_radian
/
2.0f
)
;
}
void
RotateMeToPlayer
(
WORD player
)
{
stOnFootData ft
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
;
BitStream bs
;
actor_info
*
actorInfo
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
player
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
;
if
(
actor_info
==
nullptr
)
return
;
CPed
*
Ped
=
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
actorInfo
)
;
CVector pers
;
if
(
Ped
==
nullptr
)
return
;
Ped
->
GetTransformedBonePosition
(
BONE_RIGHTWRIST
,
&
pers
)
;
float
angle
=
-
1
*
atan2
(
pers
.
fX
-
PEDSELF
->
GetPosition
(
)
->
fX
,
pers
.
fY
-
PEDSELF
->
GetPosition
(
)
->
fY
)
;
RotateQuaternion
(
angle
,
&
ft
.
fQuaternion
[
0
]
,
&
ft
.
fQuaternion
[
3
]
)
;
bs
.
Write
(
(
BYTE
)
ID_PLAYER_SYNC
)
;
bs
.
Write
(
(
PCHAR
)
&
ft
,
sizeof
(
stOnFootData
)
)
;
SF
->
getRakNet
(
)
->
SendPacket
(
&
bs
)
;
}
Пример:
C++:
RotateMeToPlayer
(
228
)
;
// Использовать в хуке онфут даты с блокировкой оригинальной синхры.
Рассчитывет вектор прицеливания камеры к скину указанного игрока, кроме обхода античита на сайлент аим это необходимо для прострела стен на 0.3.7.
Это потому что далеко не на всех серверах система урона синхрит дамаг обязательно через RPC_GiveTakeDamage
C++:
inline
float
vect3_length
(
const
float
in
[
3
]
)
{
return
sqrtf
(
in
[
0
]
*
in
[
0
]
+
in
[
1
]
*
in
[
1
]
+
in
[
2
]
*
in
[
2
]
)
;
}
inline
void
vect3_copy
(
const
float
in
[
3
]
,
float
out
[
3
]
)
{
memcpy
(
out
,
in
,
sizeof
(
float
)
*
3
)
;
}
void
AimVectorToPlayer
(
WORD player
)
{
stAimData aim
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
aimData
;
actor_info
*
actorInfo
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
player
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
;
float
matched_pos
[
3
]
,
AimVector
[
3
]
;
vect3_copy
(
actorInfo
->
base
.
matrix
+
12
,
matched_pos
)
;
float
*
fPos
=
actorInfo
->
base
.
matrix
+
12
;
for
(
int
i
=
0
;
i
getRakNet
(
)
->
SendPacket
(
&
bs
)
;
}
Пример:
C++:
AimVectorToPlayer
(
228
)
;
// Использовать в хуке ID_AIM_SYNC с блокировкой оригинального пакета.
Кастомная функция расчёта урона для текущего оружия в руках.
Та что с мта классов выдаёт почему-то не валидные значения, моя функция умеет выдавать рандомно валидный урон дробовиков с которых любят палить сайлент аим всякие античиты по типу веапон конфига.
C++:
int
GetRandom
(
int
*
operand
)
{
LARGE_INTEGER start
,
end
,
freq
;
QueryPerformanceFrequency
(
&
freq
)
;
QueryPerformanceCounter
(
&
start
)
;
int
diff
=
operand
[
1
]
-
operand
[
0
]
;
QueryPerformanceCounter
(
&
end
)
;
srand
(
(
end
.
QuadPart
-
start
.
QuadPart
)
*
1000000
/
freq
.
QuadPart
)
;
int
random
=
(
rand
(
)
)
/
RAND_MAX
;
int
r
=
random
*
diff
;
return
operand
[
0
]
+
r
;
}
float
CalculateDamage
(
void
)
{
WORD gun
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
byteCurrentWeapon
;
float
dmg
=
0.0f
;
if
(
gun
==
24
||
gun
==
38
)
dmg
=
46.200000762939453125f
;
if
(
gun
==
22
||
gun
==
29
)
dmg
=
8.25f
;
if
(
gun
==
23
)
dmg
=
13.200000762939453125f
;
if
(
gun
==
28
||
gun
==
32
)
dmg
=
6.6000003814697265625f
;
if
(
gun
==
30
||
gun
==
31
)
dmg
=
9.90000057220458984375f
;
if
(
gun
==
33
)
dmg
=
24.7500019073486328125f
;
if
(
gun
==
34
)
dmg
=
41.25f
;
if
(
gun
==
25
||
gun
==
26
)
{
int
shotrandom
[
2
]
=
{
8
,
15
}
;
switch
(
GetRandom
(
shotrandom
)
)
{
case
8
:
dmg
=
26.4000015258789f
;
break
;
case
9
:
dmg
=
29.70000171661377f
;
break
;
case
10
:
dmg
=
33.00000190734863f
;
break
;
case
11
:
dmg
=
36.30000209808349f
;
break
;
case
12
:
dmg
=
39.60000228881836f
;
break
;
case
13
:
dmg
=
42.90000247955322f
;
break
;
case
14
:
dmg
=
46.20000267028808f
;
break
;
case
15
:
dmg
=
49.50000286102295f
;
break
;
}
}
if
(
gun
==
27
)
{
int
shotrandom
[
2
]
=
{
5
,
8
}
;
switch
(
GetRandom
(
shotrandom
)
)
{
case
5
:
dmg
=
24.75000143051147f
;
break
;
case
6
:
dmg
=
29.70000171661376f
;
break
;
case
7
:
dmg
=
34.65000200271606f
;
break
;
case
8
:
dmg
=
39.60000228881835f
;
break
;
}
}
return
dmg
;
}
Пример:
C++:
float
WeaponDamage
=
GetDamage
(
)
;
Рассчитывает валидный разброс к рандомной части тела и выдаёт валидный бодипарт для RPC_GiveDamage
Можно использовать для поражения целей внутри транспортных средств почти не трогая сам транспорт либо для раздачи хэдшотов.
C++:
byte
CalculateSpreadOffset
(
WORD targetID
,
float
*
target_pos
,
float
*
out_spread
)
{
actor_info
*
actorInfo
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
targetID
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
;
if
(
actorInfo
==
nullptr
)
return
255
;
CPed
*
Ped
=
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
actorInfo
)
;
if
(
Ped
==
nullptr
)
return
255
;
int
random_bone
;
byte player_state
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
targetID
]
->
pPlayerData
->
bytePlayerState
;
if
(
player_state
==
PLAYER_STATE_ONFOOT
)
{
CVector rbody
;
byte bodyIDs
[
10
]
=
{
1
,
2
,
3
,
4
,
5
,
8
,
21
,
31
,
41
,
51
}
;
random_bone
=
bodyIDs
[
rand
(
)
%
9
]
;
Ped
->
GetTransformedBonePosition
(
(
eBone
)
random_bone
,
&
rbody
)
;
out_spread
[
0
]
=
rbody
.
fX
-
target_pos
[
0
]
;
out_spread
[
1
]
=
rbody
.
fY
-
target_pos
[
1
]
;
out_spread
[
2
]
=
rbody
.
fZ
-
target_pos
[
2
]
;
}
else
if
(
player_state
==
PLAYER_STATE_DRIVER
||
player_state
==
PLAYER_STATE_PASSENGER
)
{
byte bodyIDs
[
3
]
=
{
8
,
7
,
6
}
;
CVector head
;
random_bone
=
bodyIDs
[
rand
(
)
%
2
]
;
Ped
->
GetTransformedBonePosition
(
(
eBone
)
random_bone
,
&
head
)
;
out_spread
[
0
]
=
head
.
fX
-
target_pos
[
0
]
;
out_spread
[
1
]
=
head
.
fY
-
target_pos
[
1
]
;
out_spread
[
2
]
=
head
.
fZ
-
target_pos
[
2
]
;
return
9
;
}
if
(
random_bone
==
5
||
random_bone
==
8
||
random_bone
==
7
||
random_bone
==
6
)
return
9
;
if
(
random_bone
==
4
||
random_bone
==
21
||
random_bone
==
3
||
random_bone
==
31
)
return
3
;
if
(
random_bone
==
2
||
random_bone
==
1
)
return
4
;
if
(
random_bone
==
34
||
random_bone
==
33
||
random_bone
==
35
||
random_bone
==
32
||
random_bone
==
36
)
return
5
;
if
(
random_bone
==
24
||
random_bone
==
23
||
random_bone
==
25
||
random_bone
==
22
||
random_bone
==
26
)
return
6
;
if
(
random_bone
==
43
||
random_bone
==
44
||
random_bone
==
42
||
random_bone
==
41
)
return
7
;
if
(
random_bone
==
53
||
random_bone
==
54
||
random_bone
==
52
||
random_bone
==
51
)
return
8
;
return
255
;
}
Пример:
C++:
WORD targetID
=
ид игрока
;
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
iIsListed
[
targetID
]
&&
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
IsPlayerDefined
(
targetID
,
true
)
)
{
float
TargetPos
[
3
]
,
Spread
[
3
]
;
// В Spread будет записан рассчитаный разброс
switch
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
targetID
]
->
pPlayerData
->
bytePlayerState
)
{
case
PLAYER_STATE_ONFOOT
:
for
(
short
x
=
0
;
x
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
targetID
]
->
pPlayerData
->
fOnFootPos
[
x
]
;
break
;
case
PLAYER_STATE_DRIVER
:
for
(
short
x
=
0
;
x
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
targetID
]
->
pPlayerData
->
inCarData
.
fPosition
[
x
]
;
break
;
case
PLAYER_STATE_PASSENGER
:
for
(
short
x
=
0
;
x
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
targetID
]
->
pPlayerData
->
passengerData
.
fPosition
[
x
]
;
break
;
}
byte BodyPart
=
CalculateSpreadOffset
(
targetID
,
TargetPos
,
Spread
)
;
SF
->
getSAMP
(
)
->
sendGiveDamage
(
targetID
,
урон
,
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
byteCurrentWeapon
,
BodyPart
)
;
// Шлём Bullet Sync с нашим Spread
}
Подмена цели с зелёного треугольника над головой
C++:
struct
stWeaponData
{
WORD index
;
WORD iTargetID
;
BYTE slot
;
BYTE weapon
;
WORD ammo
;
}
;
bool
SendFakeWeaponData
(
WORD targetID
)
{
byte cam
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
aimData
.
byteCamMode
;
if
(
cam
!=
53
&&
cam
!=
46
)
return
false
;
if
(
!
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
iIsListed
[
targetID
]
||
!
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
IsPlayerDefined
(
targetID
,
true
)
)
return
false
;
byte state
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
CS
->
cfg
.
LastTargetID
]
->
pPlayerData
->
bytePlayerState
;
if
(
state
!=
PLAYER_STATE_PASSENGER
&&
state
!=
PLAYER_STATE_DRIVER
)
{
BitStream bs
;
stWeaponData wdata
;
ZeroMemory
(
&
wdata
,
sizeof
(
stWeaponData
)
)
;
wdata
.
index
=
targetID
;
wdata
.
iTargetID
=
targetID
;
wdata
.
slot
=
PEDSELF
->
GetCurrentWeaponSlot
(
)
;
wdata
.
weapon
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
byteCurrentWeapon
;
wdata
.
ammo
=
PEDSELF
->
GetWeapon
(
PEDSELF
->
GetCurrentWeaponSlot
(
)
)
->
GetAmmoTotal
(
)
;
bs
.
Write
(
(
BYTE
)
ID_WEAPONS_UPDATE
)
;
bs
.
Write
(
(
PCHAR
)
&
wdata
,
sizeof
(
stWeaponData
)
)
;
SF
->
getRakNet
(
)
->
SendPacket
(
&
bs
)
;
}
return
false
;
}
Пример:
C++:
SendFakeWeaponData
(
228
)
;
// Использовать в хуке ID_WEAPONS_UPDATE с блокировкой оригинального пакета
Перезаписывает трассеры пуль в скин указанного игрока, полезно для сайлент аимов чтобы не палится на видеозаписях попадая в стенку.
C++:
CPed
*
LastPed
=
nullptr
;
CPed
*
TargetPed
=
nullptr
;
void
DeleteGameHooks
(
bool
FindPlayerPed
,
bool
AddTrace
)
{
if
(
FindPlayerPed
)
{
byte Prologue
[
6
]
=
{
0x8B
,
0x44
,
0x24
,
0x04
,
0x85
,
0xC0
}
;
DWORD old_prot
;
VirtualProtect
(
(
void
*
)
0x56E210
,
6
,
PAGE_EXECUTE_READWRITE
,
&
old_prot
)
;
memcpy
(
(
void
*
)
0x56E210
,
Prologue
,
6
)
;
VirtualProtect
(
(
void
*
)
0x56E210
,
6
,
old_prot
,
&
old_prot
)
;
}
if
(
AddTrace
)
{
byte Prologue
[
5
]
=
{
0x83
,
0xEC
,
0x1C
,
0x33
,
0xC9
}
;
DWORD old_prot
;
VirtualProtect
(
(
void
*
)
0x723750
,
5
,
PAGE_EXECUTE_READWRITE
,
&
old_prot
)
;
memcpy
(
(
void
*
)
0x723750
,
Prologue
,
5
)
;
VirtualProtect
(
(
void
*
)
0x723750
,
5
,
old_prot
,
&
old_prot
)
;
}
}
bool
GetTargetPos
(
CVector
*
vec
)
{
if
(
TargetPed
==
nullptr
)
return
false
;
else
{
vec
=
TargetPed
->
GetPosition
(
)
;
return
true
;
}
return
false
;
}
bool
SetTargetPed
(
WORD playerId
)
{
if
(
!
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
iIsListed
[
playerId
]
||
!
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
IsPlayerDefined
(
playerId
,
true
)
)
return
false
;
else
{
actor_info
*
actorInfo
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
playerId
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
;
if
(
actorInfo
==
nullptr
)
return
false
;
CPed
*
Ped
=
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
actorInfo
)
;
if
(
Ped
==
nullptr
)
return
false
;
TargetPed
=
Ped
;
return
true
;
}
return
false
;
}
CPed
*
__cdecl
FindPlayerPed
(
int
number
)
{
DeleteGameHooks
(
true
,
false
)
;
LastPed
=
(
(
CPed
*
(
__cdecl
*
)
(
int
)
)
0x56E210
)
(
number
)
;
SF
->
getGame
(
)
->
createHook
(
(
void
*
)
0x56E210
,
&
FindPlayerPed
,
DETOUR_TYPE_JMP
,
6
)
;
return
LastPed
;
}
void
__cdecl
AddTrace
(
CVector
*
start
,
CVector
*
end
,
float
radius
,
unsigned
int
time
,
unsigned
char
transparency
)
{
if
(
(
TargetPed
!=
nullptr
&&
LastedPed
!=
nullptr
)
&&
LastPed
==
TargetPed
)
{
CVector NewDirection
;
if
(
GetTargetPos
(
&
NewDirection
)
)
{
end
->
fX
=
NewDirection
.
fX
;
end
->
fY
=
NewDirection
.
fY
;
end
->
fZ
=
NewDirection
.
fZ
;
}
}
DeleteGameHooks
(
false
,
true
)
;
(
(
void
(
__cdecl
*
)
(
CVector
*
,
CVector
*
,
float
,
unsigned
int
,
unsigned
char
)
)
0x723750
)
(
start
,
end
,
radius
,
time
,
transparency
)
;
SF
->
getGame
(
)
->
createHook
(
(
void
*
)
0x723750
,
&
AddTrace
,
DETOUR_TYPE_JMP
,
5
)
;
}
void
__stdcall
Destructor
(
)
{
DeleteGameHooks
(
true
,
true
)
;
}
Пример использования:
C++:
SetTargetPed
(
bullet
.
sTargetID
)
;
// Вызываем в хуке ID_BULLET_SYNC перед отправкой пули
void
__stdcall
mainloop
(
void
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
)
return
;
if
(
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
SF
->
getGame
(
)
->
registerGameDestructorCallback
(
Destructor
)
;
SF
->
getGame
(
)
->
createHook
(
(
void
*
)
0x56E210
,
&
FindPlayerPed
,
DETOUR_TYPE_JMP
,
6
)
;
SF
->
getGame
(
)
->
createHook
(
(
void
*
)
0x723750
,
&
AddTrace
,
DETOUR_TYPE_JMP
,
5
)
;
init
=
true
;
}
}
Неадекватная сова
11.12.2018, 13:51
Я думаю, по названиям функций понятно.
C++:
int
GetWeaponID
(
)
{
return
PEDSELF
->
GetWeapon
(
PEDSELF
->
GetCurrentWeaponSlot
(
)
)
->
GetType
(
)
;
}
eWeaponState
GetWeaponState
(
)
{
return
PEDSELF
->
GetWeapon
(
PEDSELF
->
GetCurrentWeaponSlot
(
)
)
->
GetState
(
)
;
}
int
GetAmmoInClip
(
)
{
return
PEDSELF
->
GetWeapon
(
PEDSELF
->
GetCurrentWeaponSlot
(
)
)
->
GetAmmoInClip
(
)
;
}
int
GetAmmoTotal
(
)
{
return
PEDSELF
->
GetWeapon
(
PEDSELF
->
GetCurrentWeaponSlot
(
)
)
->
GetAmmoTotal
(
)
;
}
int
GetWantedLevel
(
)
{
return
*
(
DWORD
*
)
0x58DB60
;
}
В дополнение. Получение уровня усталости
Код:
int GetSprintLevel()
{
float sprintLocalPlayer = *(float*)0xB7CDB4;
return (sprintLocalPlayer / 31.47000244 + 4.78) / 1.040;
}
Функция разбивает расстояние между 2 векторами на кучу векторов с некоторым шагом.
Использование: split(float x0, float y0, float z0, float x1, float y1, float z1, float step)
x0, y0, z0 - начальные координаты (первый вектор)
x1, y1, z1 - конечные координаты (второй вектор)
step - шаг, с которым будет поделено расстояние между векторами.
Возвращает вектор с разбитым расстоянием.
C++:
[CODE]
std
::
vector
split
(
float
x0
,
float
y0
,
float
z0
,
float
x1
,
float
y1
,
float
z1
,
float
step
)
{
CVector direction
=
{
x1
-
x0
,
y1
-
y0
,
z1
-
z0
}
;
float
distance
=
direction
.
Normalize
(
)
;
std
::
vector
path
;
CVector begin
=
{
x0
,
y0
,
z0
}
;
CVector cursor
=
{
x0
,
y0
,
z0
}
;
path
.
push_back
(
cursor
)
;
while
(
(
cursor
-
begin
)
.
Length
(
)
Работа с регистром (Подсмотрел с коллизи Фипа)
C++:
#pragma once
#include
#pragma comment(lib, "advapi32.lib")
namespace
Register
{
namespace
Write
{
bool
Bool
(
HKEY
&
key
,
const
char
*
name
,
const
bool
&
value
)
{
static
DWORD val
;
val
=
value
;
return
RegSetValueExA
(
key
,
name
,
0
,
REG_DWORD
,
(
BYTE
*
)
&
val
,
1
)
==
ERROR_SUCCESS
;
}
bool
Int
(
HKEY
&
key
,
const
char
*
name
,
const
int
&
value
)
{
static
DWORD val
;
val
=
value
;
return
RegSetValueExA
(
key
,
name
,
0
,
REG_DWORD
,
(
BYTE
*
)
&
val
,
4
)
==
ERROR_SUCCESS
;
}
bool
String
(
HKEY
&
key
,
const
char
*
name
,
const
char
*
value
,
int
dwBufLen
)
{
return
RegSetValueExA
(
key
,
name
,
0
,
REG_SZ
,
(
BYTE
*
)
value
,
dwBufLen
)
==
ERROR_SUCCESS
;
}
}
namespace
Read
{
bool
Bool
(
HKEY
&
key
,
const
char
*
name
,
bool
&
value
)
{
static
DWORD val
=
0
,
type
=
REG_DWORD
,
size
=
4
;
bool
result
=
RegQueryValueExA
(
key
,
name
,
NULL
,
&
type
,
(
BYTE
*
)
&
val
,
&
size
)
==
ERROR_SUCCESS
;
value
=
val
!=
0
;
return
result
;
}
bool
Int
(
HKEY
&
key
,
const
char
*
name
,
int
&
value
)
{
static
DWORD val
=
0
,
type
=
REG_DWORD
,
size
=
4
;
bool
result
=
RegQueryValueExA
(
key
,
name
,
NULL
,
&
type
,
(
BYTE
*
)
&
val
,
&
size
)
==
ERROR_SUCCESS
;
value
=
val
;
return
result
;
}
bool
String
(
HKEY
&
key
,
char
*
name
,
char
*
to
,
DWORD dwBufLen
)
{
static
DWORD dwType
=
REG_SZ
;
return
RegQueryValueExA
(
key
,
name
,
NULL
,
&
dwType
,
(
BYTE
*
)
to
,
&
dwBufLen
)
==
ERROR_SUCCESS
;
}
}
}
Намного удобнее и больше функционала https://blast.hk/threads/13855/
CleanLegend
28.03.2019, 20:13
Полезные функции для работы с памятью:
C++:
void
WriteMemory
(
void
*
address
,
void
*
bytes
,
int
byteSize
)
{
DWORD NewProtection
;
VirtualProtect
(
address
,
byteSize
,
PAGE_EXECUTE_READWRITE
,
&
NewProtection
)
;
memcpy
(
address
,
bytes
,
byteSize
)
;
VirtualProtect
(
address
,
byteSize
,
NewProtection
,
&
NewProtection
)
;
}
C++:
void
nop_
(
PVOID address
,
int
bytes
)
{
DWORD NewProtection
;
VirtualProtect
(
address
,
bytes
,
PAGE_EXECUTE_READWRITE
,
&
NewProtection
)
;
memset
(
address
,
0x90
,
bytes
)
;
VirtualProtect
(
address
,
bytes
,
NewProtection
,
&
NewProtection
)
;
}
пример:
C++:
WriteMemory
(
(
void
*
)
0x004BA3B9
,
(
uint8_t
*
)
"\xE9\xA7\x03\x00\x00"
,
5
)
;
// адрес в котором будем изменять память, какие байты пойдут туда, размер(количество байт)
nop_
(
(
void
*
)
(
0x004BA3B9
)
,
1
)
;
адрес
,
количество нопов
iAmerican
16.04.2019, 23:21
C++:
std
::
string
formatString
(
const
char
*
fmt
,
.
.
.
)
{
va_list args
;
va_start
(
args
,
fmt
)
;
std
::
vector
v
(
1024
)
;
while
(
true
)
{
va_list args2
;
va_copy
(
args2
,
args
)
;
int
res
=
vsnprintf
(
v
.
data
(
)
,
v
.
size
(
)
,
fmt
,
args2
)
;
if
(
(
res
>=
0
)
&&
(
res
(
v
.
size
(
)
)
)
)
{
va_end
(
args
)
;
va_end
(
args2
)
;
return
std
::
string
(
v
.
data
(
)
)
;
}
size_t size
;
if
(
res
(
res
)
+
1
;
v
.
clear
(
)
;
v
.
resize
(
size
)
;
va_end
(
args2
)
;
}
}
Не совсем для SF , но может кому и пригодиться.
Для тех кому не нравится форматировать строки через массив чар.
Автор вроде как : 5nw .
Пример :
C++:
int
iA
=
1
;
float
fA
=
2.0
;
std
::
string sA
=
"privet"
;
std
::
string myVar
=
formatString
(
"int : %i , float : %f , string : %s"
,
iA
,
fA
,
sA
)
;
Неадекватная сова
25.04.2019, 10:30
Включение/выключение рендера чата и клавиш "T", "F6":
C++:
static
bool
state
=
true
;
static
bool
vp
=
false
;
void
sampChatVisible
(
)
{
state
^=
true
;
DWORD sampBase
=
SF
->
getSAMP
(
)
->
getSAMPAddr
(
)
;
DWORD temp
;
DWORD chatKeyT
=
sampBase
+
0x5DAF4
+
0x11
;
DWORD chatKeyF6
=
sampBase
+
0x5D891
;
DWORD chatRender
=
sampBase
+
0x63D70
;
if
(
!
vp
)
{
VirtualProtect
(
(
void
*
)
chatKeyT
,
0x1
,
PAGE_EXECUTE_READWRITE
,
&
temp
)
;
VirtualProtect
(
(
void
*
)
chatKeyF6
,
0x1
,
PAGE_EXECUTE_READWRITE
,
&
temp
)
;
VirtualProtect
(
(
void
*
)
chatRender
,
0x1
,
PAGE_EXECUTE_READWRITE
,
&
temp
)
;
vp
=
true
;
}
*
(
byte
*
)
chatKeyT
=
state
?
0x75
:
0xEB
;
*
(
byte
*
)
chatKeyF6
=
state
?
0x8B
:
0xC3
;
*
(
byte
*
)
chatRender
=
state
?
0x55
:
0xC3
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
m_nPrevScrollBarPosition
=
1
;
}
Поддержка русских букв ImGui для VS2013 и прочих, где нету литералов по типу u8:
C++:
#pragma execution_character_set("utf-8")
Преобразование RGBA в ImVec4
C++:
const
ImVec4
&
RGBAToImVec4
(
const
uint8
&
r
,
const
uint8
&
g
,
const
uint8
&
b
,
const
uint8
&
a
)
{
static
float
it
=
1.
/
255
;
return
ImVec4
(
r
*
it
,
g
*
it
,
b
*
it
,
a
*
it
)
;
}
Преобразование RGBA в float
C++:
#define RGBA_TO_FLOAT(r,g,b,a) (float)r/255.0f, (float)g/255.0f, (float)b/255.0f, (float)a/255.0f
Длина вектор
C++:
float
VectorLength
(
const
Vector4D
&
v
)
{
return
sqrt
(
v
.
x
*
v
.
x
+
v
.
y
*
v
.
y
+
v
.
z
*
v
.
z
+
v
.
w
*
v
.
w
)
;
}
_=Gigant=_
22.05.2019, 02:13
C++:
uint8_t
getPlayerWeaponModelID
(
int
iPlayerID
)
{
if
(
g_Players
==
NULL
||
iPlayerID
SAMP_MAX_PLAYERS
)
return
NULL
;
if
(
iPlayerID
==
g_Players
->
sLocalPlayerID
)
{
if
(
g_Players
->
pLocalPlayer
->
pSAMP_Actor
==
NULL
)
return
NULL
;
return
g_Players
->
pLocalPlayer
->
onFootData
.
byteCurrentWeapon
;
}
if
(
g_Players
->
pRemotePlayer
[
iPlayerID
]
->
pPlayerData
==
NULL
)
return
NULL
;
return
g_Players
->
pRemotePlayer
[
iPlayerID
]
->
pPlayerData
->
onFootData
.
byteCurrentWeapon
;
}
const
char
*
getPlayerWeapon
(
int
iPlayerID
)
{
if
(
g_Players
==
NULL
||
iPlayerID
SAMP_MAX_PLAYERS
)
return
NULL
;
if
(
iPlayerID
==
g_Players
->
sLocalPlayerID
)
{
for
(
int
wep
=
0
;
weapon_list
[
wep
]
.
name
!=
nullptr
;
wep
++
)
{
const
struct
weapon_entry
*
weapon
=
&
weapon_list
[
wep
]
;
if
(
weapon
->
id
==
getPlayerWeaponModelID
(
iPlayerID
)
)
return
weapon
->
name
;
}
}
if
(
g_Players
->
pRemotePlayer
[
iPlayerID
]
==
NULL
)
return
NULL
;
if
(
g_Players
->
pRemotePlayer
[
iPlayerID
]
->
pPlayerData
==
NULL
)
return
NULL
;
for
(
int
wep
=
0
;
weapon_list
[
wep
]
.
name
!=
nullptr
;
wep
++
)
{
const
struct
weapon_entry
*
weapon
=
&
weapon_list
[
wep
]
;
if
(
weapon
->
id
==
getPlayerWeaponModelID
(
iPlayerID
)
)
return
weapon
->
name
;
}
return
NULL
;
}
here if someone need to get current player weapon name
usage: ("%s", getPlayerWeapon(playerid));
Target Selector with multiple options for samp
C++:
void
renderTargetSelector
(
int
PlayerID
,
byte BONE_ID_BOX
,
byte BONE_ID_TARGET
,
byte BONE_ID_MY
,
byte HP_BAR_BONE
,
float
box_width
,
float
box_add_x_pos
,
float
box_height
,
float
box_add_y_pos
,
bool
DrawLine
,
bool
DrawBox
,
bool
bShowTargetPos
,
int
pos_text_add_x
,
int
pos_text_add_y
,
bool
AddHealthBar
,
bool
bShowHPValue
,
float
hp_bar_width
,
float
hp_bar_height
,
bool
bCopyTargetRotation
,
bool
bFollowTarget
,
D3DCOLOR COLOR_HP_BAR
,
D3DCOLOR COLOR_POS_TEXT
,
D3DCOLOR COLOR_SAME
,
D3DCOLOR COLOR_BOX
,
D3DCOLOR COLOR_LINE
,
bool
bUseSameColors
,
bool
bUseTargetColor
,
bool
bUseCustomColors
)
{
traceLastFunc
(
"renderTargetSelector()"
)
;
if
(
cheat_state
->
_generic
.
cheat_panic_enabled
)
return
;
if
(
!
pGameInterface
)
return
;
if
(
!
g_dwSAMP_Addr
||
!
g_SAMP
||
!
g_Players
)
return
;
if
(
gta_menu_active
(
)
)
return
;
actor_info
*
me
=
actor_info_get
(
ACTOR_SELF
,
NULL
)
;
actor_info
*
target
=
getGTAPedFromSAMPPlayerID
(
PlayerID
)
;
if
(
!
me
)
return
;
if
(
!
target
)
return
;
CPed
*
pPedTarget
=
pGameInterface
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
target
)
;
CPed
*
pPedSelf
=
pGameInterface
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
me
)
;
D3DXVECTOR3 box_get_vec
,
target_vec_box_set
,
target_pos_get
,
render_pos
,
hp_bar_check
,
hp_bar_render
;
CVector target_bone_for_box_vec
=
GetBonePosition
(
PlayerID
,
BONE_ID_BOX
)
;
CVector target_mainbone_vec
=
GetBonePosition
(
PlayerID
,
BONE_ID_TARGET
)
;
CVector target_hpbar_bone_vec
=
GetBonePosition
(
PlayerID
,
HP_BAR_BONE
)
;
// hp bar set
CVector my_bone_vec
=
GetBonePosition
(
ACTOR_SELF
,
BONE_ID_MY
)
;
float
*
f_pos
=
&
target
->
base
.
matrix
[
4
*
3
]
;
box_get_vec
.
x
=
CVecToD3DXVEC
(
target_bone_for_box_vec
)
.
x
;
box_get_vec
.
y
=
CVecToD3DXVEC
(
target_bone_for_box_vec
)
.
y
;
box_get_vec
.
z
=
CVecToD3DXVEC
(
target_bone_for_box_vec
)
.
z
;
CalcScreenCoors
(
&
box_get_vec
,
&
target_vec_box_set
)
;
D3DCOLOR color_target
=
samp_color_get
(
PlayerID
)
;
if
(
render
)
{
if
(
bShowTargetPos
)
{
char
print_pos
[
128
]
;
target_pos_get
.
x
=
f_pos
[
0
]
;
target_pos_get
.
y
=
f_pos
[
1
]
;
target_pos_get
.
z
=
f_pos
[
2
]
;
CalcScreenCoors
(
&
target_pos_get
,
&
render_pos
)
;
if
(
render_pos
.
z
PrintShadow
(
render_pos
.
x
+
pos_text_add_x
,
render_pos
.
y
+
pos_text_add_y
,
COLOR_SAME
,
print_pos
)
;
}
else
if
(
bUseTargetColor
)
{
pD3DFont_3DInformer
->
PrintShadow
(
render_pos
.
x
+
pos_text_add_x
,
render_pos
.
y
+
pos_text_add_y
,
color_target
,
print_pos
)
;
}
else
if
(
bUseCustomColors
)
{
pD3DFont_3DInformer
->
PrintShadow
(
render_pos
.
x
+
pos_text_add_x
,
render_pos
.
y
+
pos_text_add_y
,
COLOR_POS_TEXT
,
print_pos
)
;
}
}
}
if
(
bUseSameColors
)
{
if
(
DrawBox
)
render
->
D3DBox
(
target_vec_box_set
.
x
+
box_add_x_pos
,
target_vec_box_set
.
y
+
box_add_y_pos
,
box_width
,
box_height
,
COLOR_SAME
)
;
if
(
DrawLine
)
render
->
DrawLine
(
CVecToD3DXVEC
(
target_mainbone_vec
)
,
CVecToD3DXVEC
(
my_bone_vec
)
,
COLOR_SAME
)
;
}
else
if
(
bUseTargetColor
)
{
if
(
DrawBox
)
render
->
D3DBox
(
target_vec_box_set
.
x
+
box_add_x_pos
,
target_vec_box_set
.
y
+
box_add_y_pos
,
box_width
,
box_height
,
color_target
)
;
if
(
DrawLine
)
render
->
DrawLine
(
CVecToD3DXVEC
(
target_mainbone_vec
)
,
CVecToD3DXVEC
(
my_bone_vec
)
,
color_target
)
;
}
else
if
(
bUseCustomColors
)
{
if
(
DrawBox
)
render
->
D3DBox
(
target_vec_box_set
.
x
+
box_add_x_pos
,
target_vec_box_set
.
y
+
box_add_y_pos
,
box_width
,
box_height
,
COLOR_BOX
)
;
if
(
DrawLine
)
render
->
DrawLine
(
CVecToD3DXVEC
(
target_mainbone_vec
)
,
CVecToD3DXVEC
(
my_bone_vec
)
,
COLOR_LINE
)
;
}
if
(
AddHealthBar
)
{
hp_bar_check
.
x
=
CVecToD3DXVEC
(
target_hpbar_bone_vec
)
.
x
;
hp_bar_check
.
y
=
CVecToD3DXVEC
(
target_hpbar_bone_vec
)
.
y
;
hp_bar_check
.
z
=
CVecToD3DXVEC
(
target_hpbar_bone_vec
)
.
z
;
CalcScreenCoors
(
&
hp_bar_check
,
&
hp_bar_render
)
;
char
hp_bar
[
128
]
;
float
hp_bar_lenght
=
g_Players
->
pRemotePlayer
[
PlayerID
]
->
pPlayerData
->
fActorHealth
+
hp_bar_width
;
if
(
bShowHPValue
)
_snprintf_s
(
hp_bar
,
sizeof
(
hp_bar
)
-
1
,
"%u"
,
g_Players
->
pRemotePlayer
[
PlayerID
]
->
pPlayerData
->
onFootData
.
byteHealth
)
;
if
(
bUseCustomColors
)
{
render
->
D3DBox
(
hp_bar_render
.
x
,
hp_bar_render
.
y
,
hp_bar_lenght
,
hp_bar_height
,
COLOR_HP_BAR
)
;
if
(
bShowHPValue
)
pD3DFont_Nametags
->
PrintShadow
(
hp_bar_render
.
x
+
hp_bar_lenght
,
hp_bar_render
.
y
,
COLOR_HP_BAR
,
hp_bar
)
;
}
else
if
(
bUseTargetColor
)
{
render
->
D3DBox
(
hp_bar_render
.
x
,
hp_bar_render
.
y
,
hp_bar_lenght
,
hp_bar_height
,
color_target
)
;
if
(
bShowHPValue
)
pD3DFont_Nametags
->
PrintShadow
(
hp_bar_render
.
x
+
hp_bar_lenght
,
hp_bar_render
.
y
,
color_target
,
hp_bar
)
;
}
else
if
(
bUseSameColors
)
{
render
->
D3DBox
(
hp_bar_render
.
x
,
hp_bar_render
.
y
,
hp_bar_lenght
,
hp_bar_height
,
COLOR_SAME
)
;
if
(
bShowHPValue
)
pD3DFont_Nametags
->
PrintShadow
(
hp_bar_render
.
x
+
hp_bar_lenght
,
hp_bar_render
.
y
,
COLOR_SAME
,
hp_bar
)
;
}
}
}
if
(
bCopyTargetRotation
)
{
vect3_copy
(
&
target
->
fCurrentRotation
,
&
me
->
fCurrentRotation
)
;
}
if
(
bFollowTarget
)
{
float
follow_pos_copy
[
3
]
;
vect3_copy
(
&
target
->
base
.
matrix
[
4
*
3
]
,
follow_pos_copy
)
;
follow_pos_copy
[
2
]
-=
1.0f
;
cheat_actor_teleport
(
me
,
follow_pos_copy
,
gta_interior_id_get
(
)
)
;
}
}
удобная функция для установки таймеров
C++:
#include
// если не хотите тащить chrono, можно использовать GetTickCount() или другую аналогичную функцию
template
void
addTimer
(
T Func
,
int64_t
Wait
)
{
using
std
::
chrono
::
duration_cast
;
using
std
::
chrono
::
milliseconds
;
using
std
::
chrono
::
steady_clock
;
static
int64_t
iTime
=
0
;
if
(
duration_cast
(
steady_clock
::
now
(
)
.
time_since_epoch
(
)
)
.
count
(
)
-
iTime
>
Wait
)
{
Func
(
)
;
iTime
=
duration_cast
(
steady_clock
::
now
(
)
.
time_since_epoch
(
)
)
.
count
(
)
;
}
}
C++:
void
Foo
(
)
{
std
::
cout
чуть-чуть информации которая может пригодиться при использовании лямбда-выражений
Код:
[CODE]
[] - без захвата переменных
[=] - все переменные захватываются по значению
[&] - все переменные захватываются по ссылке
Круглый слайдер для "ImGui"
C++:
static
bool
MyKnob
(
const
char
*
label
,
float
*
p_value
,
float
v_min
,
float
v_max
)
{
ImGuiIO
&
io
=
ImGui
::
GetIO
(
)
;
ImGuiStyle
&
style
=
ImGui
::
GetStyle
(
)
;
float
radius_outer
=
20.0f
;
ImVec2 pos
=
ImGui
::
GetCursorScreenPos
(
)
;
ImVec2 center
=
ImVec2
(
pos
.
x
+
radius_outer
,
pos
.
y
+
radius_outer
)
;
float
line_height
=
ImGui
::
GetTextLineHeight
(
)
;
ImDrawList
*
draw_list
=
ImGui
::
GetWindowDrawList
(
)
;
float
ANGLE_MIN
=
3.141592f
*
0.75f
;
float
ANGLE_MAX
=
3.141592f
*
2.25f
;
ImGui
::
InvisibleButton
(
label
,
ImVec2
(
radius_outer
*
2
,
radius_outer
*
2
+
line_height
+
style
.
ItemInnerSpacing
.
y
)
)
;
bool
value_changed
=
false
;
bool
is_active
=
ImGui
::
IsItemActive
(
)
;
bool
is_hovered
=
ImGui
::
IsItemActive
(
)
;
if
(
is_active
&&
io
.
MouseDelta
.
x
!=
0.0f
)
{
float
step
=
(
v_max
-
v_min
)
/
200.0f
;
*
p_value
+=
io
.
MouseDelta
.
x
*
step
;
if
(
*
p_value
v_max
)
*
p_value
=
v_max
;
value_changed
=
true
;
}
float
t
=
(
*
p_value
-
v_min
)
/
(
v_max
-
v_min
)
;
float
angle
=
ANGLE_MIN
+
(
ANGLE_MAX
-
ANGLE_MIN
)
*
t
;
float
angle_cos
=
cosf
(
angle
)
,
angle_sin
=
sinf
(
angle
)
;
float
radius_inner
=
radius_outer
*
0.40f
;
draw_list
->
AddCircleFilled
(
center
,
radius_outer
,
ImGui
::
GetColorU32
(
ImGuiCol_FrameBg
)
,
16
)
;
draw_list
->
AddLine
(
ImVec2
(
center
.
x
+
angle_cos
*
radius_inner
,
center
.
y
+
angle_sin
*
radius_inner
)
,
ImVec2
(
center
.
x
+
angle_cos
*
(
radius_outer
-
2
)
,
center
.
y
+
angle_sin
*
(
radius_outer
-
2
)
)
,
ImGui
::
GetColorU32
(
ImGuiCol_SliderGrabActive
)
,
2.0f
)
;
draw_list
->
AddCircleFilled
(
center
,
radius_inner
,
ImGui
::
GetColorU32
(
is_active
?
ImGuiCol_FrameBgActive
:
is_hovered
?
ImGuiCol_FrameBgHovered
:
ImGuiCol_FrameBg
)
,
16
)
;
draw_list
->
AddText
(
ImVec2
(
pos
.
x
,
pos
.
y
+
radius_outer
*
2
+
style
.
ItemInnerSpacing
.
y
)
,
ImGui
::
GetColorU32
(
ImGuiCol_Text
)
,
label
)
;
if
(
is_active
||
is_hovered
)
{
ImGui
::
SetNextWindowPos
(
ImVec2
(
pos
.
x
-
style
.
WindowPadding
.
x
,
pos
.
y
-
line_height
-
style
.
ItemInnerSpacing
.
y
-
style
.
WindowPadding
.
y
)
)
;
ImGui
::
BeginTooltip
(
)
;
ImGui
::
Text
(
"%.3f"
,
*
p_value
)
;
ImGui
::
EndTooltip
(
)
;
}
return
value_changed
;
}
https://imgur.com/a/c0B3A9s
_=Gigant=_
06.08.2019, 02:56
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
;
}
Конвертация 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
;
}
_=Gigant=_
18.08.2019, 21:17
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);
Carrentine
04.10.2019, 00:06
Описание:находит ближайшего к вашему педу игрока, на определенном радиусе от прицела.
Код:
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
поворачивает камеру на координаты
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
[QUOTE="astap_"]
поворачивает камеру на координаты
C++:
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++:
[CODE]
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
)
;
}
Carrentine
11.10.2019, 22:35
Описание: находит ближайшую кость противника к прицелу.
Код:
C++:
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++:
[CODE]
eBone nearestBone
=
GetNearestBone
(
playerID
)
;
BlackKnigga
31.10.2019, 21:54
Разработчики, только перешедшие с клео\луа на 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::process должна вызываться в потоке игры (перехваченном как в примере, либо в функции mainloop для SF API).
Требуется библиотека Boost.Context!
Исходный код:
GitHub - allwanttokissme/coro_wait: Suspending coroutines by time (https://github.com/allwanttokissme/coro_wait)
Suspending coroutines by time. Contribute to allwanttokissme/coro_wait development by creating an account on GitHub.
github.com
хуки (https://github.com/allwanttokissme/Yet-another-hook-library)
sampapi (https://github.com/BlastHackNet/SAMP-API)
вроде Sleep для того чтобы не блокировать цикл игры.
Как насчёт std::this_thread::wait_for(time)? Вроде нет проблем же, или я что-то не понимаю?
BlackKnigga
01.11.2019, 16:14
Как насчёт std::this_thread::wait_for(time)? Вроде нет проблем же, или я что-то не понимаю?
Оно работает точно также как и Sleep
Простенькая функция, которая позволяет рисовать поле для ввода в ImGUI с текстовой подсказкой на нём. Подсказка пропадает, если пользователь выделяет поле для ввода нажатием на него, либо вводит какую-либо информацию. Может быть проблема с Y-смещением, рекомендуется использовать стандартный стиль ImGUI.
C++:
static
bool
InputTextWithPH
(
const
char
*
placeholder
,
const
char
*
text
,
char
*
buf
,
size_t buf_size
,
ImGuiInputTextFlags flags
=
0
,
ImGuiInputTextCallback callback
=
(
ImGuiInputTextCallback
)
0
,
void
*
user_data
=
(
void
*
)
0
)
{
ImVec2 cursor
[
2
]
;
cursor
[
0
]
=
ImGui
::
GetCursorPos
(
)
;
bool
result
=
ImGui
::
InputText
(
text
,
buf
,
buf_size
,
flags
,
callback
,
user_data
)
;
if
(
placeholder
!=
NULL
&&
strlen
(
placeholder
)
>
0
)
{
if
(
!
ImGui
::
IsItemActive
(
)
&&
strlen
(
buf
)
==
0
)
{
cursor
[
1
]
=
ImGui
::
GetCursorPos
(
)
;
ImGui
::
SetCursorPos
(
ImVec2
(
cursor
[
0
]
.
x
+
5
,
cursor
[
0
]
.
y
+
2
)
)
;
ImGui
::
Text
(
placeholder
)
;
ImGui
::
SetCursorPos
(
cursor
[
1
]
)
;
}
}
return
result
;
}
// Пример использования
InputTextWithPH
(
u8
"Любой текст"
,
"##t1"
,
testText
,
sizeof
testText
)
;
В новых версиях ImGUI есть стандартная функция InputTextWithHint, использовать лучше её!
loganhackerdff
21.04.2020, 19:09
Получает название клавиши по id
C++:
[CODE]
GetKeyNameTextA
(
(
MapVirtualKeyA
(
KEYID
,
MAPVK_VK_TO_VSC
)
DarkP1xel
10.05.2020, 02:00
WallHack для оружия.:
auto
weaponWallHack
(
const
bool
bStatus
)
const
->
void
{
void
*
pRenderWeapon
{
reinterpret_cast
(
0x732F3F
+
0x1
)
}
;
if
(
bStatus
)
{
std
::
memset
(
pRenderWeapon
,
0x0
,
0x1
)
;
}
else
{
std
::
memcpy
(
pRenderWeapon
,
"\x01"
,
0x1
)
;
}
return
;
}
https://forum.antichat.xyz/attachments/27493677/
WallHack для оружия.:
auto
weaponWallHack
(
const
bool
bStatus
)
const
->
void
{
void
*
pRenderWeapon
{
reinterpret_cast
(
0x732F3F
+
0x1
)
}
;
if
(
bStatus
)
{
std
::
memset
(
pRenderWeapon
,
0x0
,
0x1
)
;
}
else
{
std
::
memcpy
(
pRenderWeapon
,
"\x01"
,
0x1
)
;
}
return
;
}
C++:
inline
void
weaponWallHack
(
bool
bStatus
)
{
*
reinterpret_cast
(
0x732F3F
+
0x1
)
=
!
bStatus
;
}
и та функа точно работает? ибо я пробовал - не работает.
Dark_Knight
10.05.2020, 12:33
WallHack для оружия.:
auto
weaponWallHack
(
const
bool
bStatus
)
const
->
void
{
void
*
pRenderWeapon
{
reinterpret_cast
(
0x732F3F
+
0x1
)
}
;
if
(
bStatus
)
{
std
::
memset
(
pRenderWeapon
,
0x0
,
0x1
)
;
}
else
{
std
::
memcpy
(
pRenderWeapon
,
"\x01"
,
0x1
)
;
}
return
;
}
Краши вызывает.
DarkP1xel
10.05.2020, 13:29
Ну так это пример, можешь в cheat engine заюзать, а в коде надо будет снять защиту с памяти
чо за нубы
Dark_Knight
10.05.2020, 14:03
Так коль уже вылаживаешь код, то со всеми махинациями давай, а не только его часть)
Gets actor struct by handle externally (can be optimized).
(this is actually an analogue of 0A96: $ActorStruct = actor $PLAYER_ACTOR struct cleo opcode)
C++:
uintptr_t
getPedStructByActorHandle
(
uintptr_t handle
)
{
/*
0054FF90 | 8B4C24 04 | mov ecx,dword ptr ss:[esp+4] |mov ecx, handle
0054FF94 | 8B15 9044B700 | mov edx,dword ptr ds:[B74490] |mov edx, *0xB74490
0054FF9A | 53 | push ebx |push 0
0054FF9B | 56 | push esi |push 04600026
0054FF9C | 8B72 04 | mov esi,dword ptr ds:[edx+4] |mov esi, *(edx+4)
0054FF9F | 8BC1 | mov eax,ecx |mov eax, handle
0054FFA1 | C1F8 08 | sar eax,8 |sar handle, 8
0054FFA4 | 8A1C30 | mov bl,byte ptr ds:[eax+esi] |mov bl, (eax + esi
0054FFA7 | 5E | pop esi |
0054FFA8 | 3AD9 | cmp bl,cl |
0054FFAA | 5B | pop ebx |
0054FFAB | 75 0B | jne gta_sa.54FFB8 |
0054FFAD | 8B0A | mov ecx,dword ptr ds:[edx] |mov ecx, **0xB74490
0054FFAF | 69C0 C4070000 | imul eax,eax,7C4 |handle *= 0x7c4
0054FFB5 | 03C1 | add eax,ecx |eax += ecx
0054FFB7 | C3 | ret |
0054FFB8 | 33C0 | xor eax,eax |
0054FFBA | C3 | ret |
*/
uintptr_t ecx
=
handle
;
uintptr_t edx
;
ReadProcessMemory
(
hProcess
,
(
LPVOID
)
0xB74490
,
&
edx
,
sizeof
(
uintptr_t
)
,
0
)
;
uintptr_t esi
;
ReadProcessMemory
(
hProcess
,
(
LPVOID
)
(
edx
+
4
)
,
&
esi
,
sizeof
(
uintptr_t
)
,
0
)
;
uintptr_t eax
=
ecx
;
eax
=
eax
>>
8
;
unsigned
char
bl
;
ReadProcessMemory
(
hProcess
,
(
LPVOID
)
(
eax
+
esi
)
,
&
bl
,
sizeof
(
unsigned
char
)
,
0
)
;
if
(
bl
==
(
ecx
&
0x000000FF
)
)
{
ReadProcessMemory
(
hProcess
,
(
LPVOID
)
(
edx
)
,
&
ecx
,
sizeof
(
uintptr_t
)
,
0
)
;
eax
*=
0x7c4
;
eax
+=
ecx
;
return
eax
;
}
else
{
return
0
;
}
}
Returns a vector of streamed ped's structures externally:
C++:
std
::
vector
getStreamedPeds
(
)
{
std
::
vector
peds
;
uintptr_t v1
;
ReadProcessMemory
(
hProcess
(
LPVOID
)
0xB74490
,
&
v1
,
sizeof
(
uintptr_t
)
,
0
)
;
v1
+=
0x4
;
ReadProcessMemory
(
hProcess
,
(
LPVOID
)
v1
,
&
v1
,
sizeof
(
uintptr_t
)
,
0
)
;
for
(
uintptr_t v2
=
0
;
v2
=
0
&&
handle
Gets ped bone position externally
A working vartant, but it can and should be optimized.
PS this-> read () is ReadProcessMemory()
C++:
[CODE]
#pragma once
static
DWORD CRUTCH_LOCAL_VARIABLE
=
0
;
RpHAnimHierarchy
*
GtaSA
::
RpSkinAtomicGetHAnimHierarchy
(
const
RpAtomic
*
atomic
)
// 0x7C7540
{
/*
007C7540 | 8B4424 04 | mov eax,dword ptr ss:[esp+4] |
007C7544 | 8B0D A478C900 | mov ecx,dword ptr ds:[C978A4] |
007C754A | 8B0401 | mov eax,dword ptr ds:[ecx+eax] |
007C754D | C3 | ret |
*/
uintptr_t eax
=
(
uintptr_t
)
atomic
;
uintptr_t ecx
=
this
->
read
(
0xC978A4
)
;
eax
=
this
->
read
(
eax
+
ecx
)
;
return
(
RpHAnimHierarchy
*
)
eax
;
}
void
GtaSA
::
RpClumpForAllAtomics
(
RpClump
*
clump
,
void
*
callback
,
void
*
data
)
{
/*
00749B70 | 8B4424 04 | mov eax,dword ptr ss:[esp+4] |
00749B74 | 53 | push ebx |
00749B75 | 55 | push ebp |
00749B76 | 56 | push esi |
00749B77 | 57 | push edi |
00749B78 | 8D78 08 | lea edi,dword ptr ds:[eax+8] |
00749B7B | 8B40 08 | mov eax,dword ptr ds:[eax+8] |
00749B7E | 3BC7 | cmp eax,edi |
00749B80 | 74 1E | je gta_sa.749BA0 |
00749B82 | 8B5C24 1C | mov ebx,dword ptr ss:[esp+1C] |
00749B86 | 8B6C24 18 | mov ebp,dword ptr ss:[esp+18] |
00749B8A | 8B30 | mov esi,dword ptr ds:[eax] |
00749B8C | 83C0 C0 | add eax,FFFFFFC0 |
00749B8F | 53 | push ebx |
00749B90 | 50 | push eax |
00749B91 | FFD5 | call ebp |
00749B93 | 83C4 08 | add esp,8 |
00749B96 | 85C0 | test eax,eax |
00749B98 | 74 06 | je gta_sa.749BA0 |
00749B9A | 3BF7 | cmp esi,edi |
00749B9C | 8BC6 | mov eax,esi |
00749B9E | 75 EA | jne gta_sa.749B8A |
00749BA0 | 8B4424 14 | mov eax,dword ptr ss:[esp+14] |
00749BA4 | 5F | pop edi |
00749BA5 | 5E | pop esi |
00749BA6 | 5D | pop ebp |
00749BA7 | 5B | pop ebx |
00749BA8 | C3 | ret |
*/
uintptr_t eax
=
(
uintptr_t
)
clump
;
uintptr_t edi
=
eax
+
8
;
eax
=
this
->
read
(
eax
+
8
)
;
if
(
eax
==
edi
)
{
eax
=
(
uintptr_t
)
clump
;
// 00749BA0 | 8B4424 14 | mov eax,dword ptr ss:[esp+14] |
}
else
{
uintptr_t ebx
=
(
uintptr_t
)
data
;
// ???? // 00749B82 | 8B5C24 1C | mov ebx, dword ptr ss: [esp+1C]
uintptr_t ebp
=
(
uintptr_t
)
callback
;
// 00749B86 | 8B6C24 18 | mov ebp, dword ptr ss: [esp + 18]
uintptr_t esi
=
this
->
read
(
eax
)
;
// 00749B8A | 8B30 | mov esi, dword ptr ds: [eax]
eax
+=
0xFFFFFFC0
;
// actually its a minus
/* callback start */
/*
00734A20 | 8B4424 04 | mov eax,dword ptr ss:[esp+4] |
00734A24 | 50 | push eax |
00734A25 | E8 162B0900 | call gta_sa.7C7540 |
00734A2A | 8B4C24 0C | mov ecx,dword ptr ss:[esp+C] |
00734A2E | 8901 | mov dword ptr ds:[ecx],eax |
00734A30 | 83C4 04 | add esp,4 |
00734A33 | 33C0 | xor eax,eax |
00734A35 | C3 | ret |
*/
eax
=
(
uintptr_t
)
RpSkinAtomicGetHAnimHierarchy
(
(
const
RpAtomic
*
)
eax
)
;
// 00734A25 | E8 162B0900 | call gta_sa.7C7540 |
CRUTCH_LOCAL_VARIABLE
=
eax
;
// the next code - instead of 00734A2A...00734A2E instructions
eax
^=
eax
;
/* callback end */
if
(
eax
==
0
)
{
eax
=
(
uintptr_t
)
clump
;
}
else
{
std
::
cout
read
(
edx
+
0x10
)
;
edx
=
this
->
read
(
edx
+
0x4
)
;
uintptr_t ecx
=
0
;
if
(
edx
==
0
)
{
// just return
std
::
cout
read
(
esi
)
)
{
ecx
++
;
esi
+=
0x10
;
}
else
{
eax
=
ecx
;
break
;
}
}
while
(
ecx
!=
edx
)
;
}
return
eax
;
}
RwMatrix
*
GtaSA
::
RpHAnimHierarchyGetMatrixArray
(
RpHAnimHierarchy
*
hierarchy
)
{
/*
007C5120 | 8B4424 04 | mov eax,dword ptr ss:[esp+4] |
007C5124 | 8B40 08 | mov eax,dword ptr ds:[eax+8] |
007C5127 | C3 | ret |
*/
uintptr_t eax
=
(
uintptr_t
)
hierarchy
;
eax
=
this
->
read
(
eax
+
8
)
;
return
(
RwMatrix
*
)
eax
;
}
void
GtaSA
::
vectorMult
(
uintptr_t edx
,
uintptr_t esi
,
uintptr_t ecx
)
{
float
ecxReaded
[
3
]
;
this
->
readBuf
(
ecx
,
4
*
3
,
(
void
*
)
ecxReaded
)
;
uintptr_t eax
=
(
uintptr_t
)
esi
;
// ecx = ecx;
float
st0
=
this
->
read
(
eax
+
0x20
)
;
st0
*=
ecxReaded
[
2
]
;
float
st1
=
st0
;
st0
=
this
->
read
(
eax
+
0x10
)
;
st0
*=
ecxReaded
[
1
]
;
st1
+=
st0
;
// ? 0059C8A7 | DEC1 | faddp st(1),st(0) |
st0
=
this
->
read
(
eax
)
;
st0
*=
ecxReaded
[
0
]
;
st1
+=
st0
;
// ? 0059C8AD | DEC1 | faddp st(1),st(0) |
st0
=
st1
;
st0
+=
this
->
read
(
eax
+
0x30
)
;
// ? 0059C8AF | D840 30 | fadd st(0),dword ptr ds:[eax+30] |
(
(
float
*
)
(
edx
)
)
[
0
]
=
st0
;
st0
=
this
->
read
(
eax
+
0x24
)
;
st0
*=
ecxReaded
[
2
]
;
st1
=
st0
;
st0
=
this
->
read
(
eax
+
0x4
)
;
st0
*=
ecxReaded
[
0
]
;
st1
+=
st0
;
// 0059C8C5 | DEC1 | faddp st(1),st(0) |
//st0 = st1; // 0059C8C5 | DEC1 | faddp st(1),st(0) |
st0
=
this
->
read
(
eax
+
0x14
)
;
st0
*=
ecxReaded
[
1
]
;
st1
+=
st0
;
st0
=
st1
;
st0
+=
this
->
read
(
eax
+
0x34
)
;
(
(
float
*
)
(
edx
)
)
[
1
]
=
st0
;
st0
=
this
->
read
(
eax
+
0x28
)
;
st0
*=
ecxReaded
[
2
]
;
st1
=
st0
;
st0
=
this
->
read
(
eax
+
0x8
)
;
st0
*=
ecxReaded
[
0
]
;
st1
+=
st0
;
// 0059C8E1 | DEC1 | faddp st(1),st(0) |
st0
=
this
->
read
(
eax
+
0x18
)
;
st0
*=
ecxReaded
[
1
]
;
st1
+=
st0
;
st0
=
st1
;
st0
+=
this
->
read
(
eax
+
0x38
)
;
// ? 0059C8AF | D840 30 | fadd st(0),dword ptr ds:[eax+30] |
//ecx = eax;
//this->write(ecx, edx); // 0059C8F4 | 8911 | mov dword ptr ds:[ecx],edx |
//edx =
(
(
float
*
)
(
edx
)
)
[
2
]
=
st0
;
}
//-------------------------------------------------------------------
void
GtaSA
::
getBonePosition
(
uintptr_t pedStruct
,
Vector3
*
buf
,
unsigned
int
boneId
,
bool
updateSkinBones
)
{
uintptr_t esi
=
pedStruct
;
uintptr_t eax
=
0
;
eax
=
this
->
read
(
esi
+
0x474
)
;
if
(
updateSkinBones
)
{
std
::
cout
read
(
esi
+
0x18
)
;
// 005E42A9 | 8B4E 18 | mov ecx,dword ptr ds:[esi+18] |
eax
=
(
uintptr_t
)
GetAnimHierarchyFromSkinClump
(
(
RpClump
*
)
ecx
)
;
// 0x734A40
uintptr_t edi
=
eax
;
// 005E42B2 | 8BF8 | mov edi,eax |
if
(
edi
==
0
)
{
// 005E42BF | 8B46 14 | mov eax,dword ptr ds:[esi+14] |
std
::
cout
x
=
this
->
read
(
eax
)
;
buf
->
y
=
this
->
read
(
eax
+
4
)
;
buf
->
z
=
this
->
read
(
eax
+
8
)
;
}
}
else
{
std
::
cout
read
(
esi
+
0x14
)
;
// ped struct
eax
=
eax
+
eax
*
2
;
uintptr_t ecx
=
eax
*
4
+
0x8D13A8
;
// IM STOPPED HERE
float
res
[
3
]
;
//uintptr_t edx = (uintptr_t)(res);
// push ecx
// push esi
// push edx
// call func 0x0059C890(edx, esi, ecx)
vectorMult
(
(
uintptr_t
)
res
,
esi
,
ecx
)
;
buf
->
x
=
res
[
0
]
;
// *(float*)(edx);
buf
->
y
=
res
[
1
]
;
//*(float*)(edx + 4);
buf
->
z
=
res
[
2
]
;
//*(float*)(edx + 8);
//float* firstMatrix = (float*)this->readBuf(16, edx);
//edx = LOCAL_VAR_ADDR
// push esi
// push edx
// call matrix multiply // 005E4303 | E8 8885FBFF | call gta_sa.59C890 |
/*float res[16];
float arg1[16];
this->readBuf(ecx, 4 * 4 * 4, arg1);
ecx = (uintptr_t)arg1;
float arg2[16];
this->readBuf(esi, 16*4, arg2);
::vec3mx(arg1, arg1, res);
uintptr_t edx = (uintptr_t)res;
/*
buf->x = *(float*)(edx);
buf->y = *(float*)(edx + 4);
buf->z = *(float*)(edx + 8);*/
}
}
}
loganhackerdff
15.07.2020, 11:55
Проверяет на экране ли объект / пикап / 3dтекст
Без проверки на то что этот объект / пикап / 3dтекст существует
C++:
[CODE]
void
CalcScreenCoors
(
D3DXVECTOR3
*
vecWorld
,
D3DXVECTOR3
*
vecScreen
)
{
D3DXMATRIX
m
(
(
float
*
)
(
0xB6FA2C
)
)
;
DWORD
*
dwLenX
=
(
DWORD
*
)
(
0xC17044
)
;
DWORD
*
dwLenY
=
(
DWORD
*
)
(
0xC17048
)
;
vecScreen
->
x
=
(
vecWorld
->
z
*
m
.
_31
)
+
(
vecWorld
->
y
*
m
.
_21
)
+
(
vecWorld
->
x
*
m
.
_11
)
+
m
.
_41
;
vecScreen
->
y
=
(
vecWorld
->
z
*
m
.
_32
)
+
(
vecWorld
->
y
*
m
.
_22
)
+
(
vecWorld
->
x
*
m
.
_12
)
+
m
.
_42
;
vecScreen
->
z
=
(
vecWorld
->
z
*
m
.
_33
)
+
(
vecWorld
->
y
*
m
.
_23
)
+
(
vecWorld
->
x
*
m
.
_13
)
+
m
.
_43
;
double
fRecip
=
(
double
)
1.0
/
vecScreen
->
z
;
vecScreen
->
x
*=
(
float
)
(
fRecip
*
(
*
dwLenX
)
)
;
vecScreen
->
y
*=
(
float
)
(
fRecip
*
(
*
dwLenY
)
)
;
}
bool
IsPickOnScreen
(
int
p
)
{
D3DXVECTOR3 vecPos
;
vecPos
.
x
=
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pPickup
->
pickup
[
p
]
.
fPosition
[
0
]
;
vecPos
.
y
=
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pPickup
->
pickup
[
p
]
.
fPosition
[
1
]
;
vecPos
.
z
=
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pPickup
->
pickup
[
p
]
.
fPosition
[
2
]
;
D3DXVECTOR3 screenPos
;
CalcScreenCoors
(
&
vecPos
,
&
screenPos
)
;
if
(
screenPos
.
z
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pObject
->
object
[
p
]
->
pGTAEntity
->
base
.
matrix
[
4
*
3
]
;
vecPos
.
y
=
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pObject
->
object
[
p
]
->
pGTAEntity
->
base
.
matrix
[
4
*
3
+
1
]
;
vecPos
.
z
=
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pObject
->
object
[
p
]
->
pGTAEntity
->
base
.
matrix
[
4
*
3
+
2
]
;
D3DXVECTOR3 screenPos
;
CalcScreenCoors
(
&
vecPos
,
&
screenPos
)
;
if
(
screenPos
.
z
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pText3D
->
textLabel
[
p
]
.
fPosition
[
0
]
;
vecPos
.
y
=
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pText3D
->
textLabel
[
p
]
.
fPosition
[
1
]
;
vecPos
.
z
=
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pText3D
->
textLabel
[
p
]
.
fPosition
[
2
]
;
D3DXVECTOR3 screenPos
;
CalcScreenCoors
(
&
vecPos
,
&
screenPos
)
;
if
(
screenPos
.
z
Устанавливает процент разброса пули:
void
SetSpreadMultiplier
(
float
fltMultiplier
)
{
*
reinterpret_cast
(
0x008D6114
)
=
fltMultiplier
/
20.00F
;
}
Примеры:
SetSpreadMultiplier
(
0.00F
)
;
// Установит процент разброса пули на 0 (разброса не будет).
SetSpreadMultiplier
(
50.00F
)
;
// Установит процент разброса пули на 50 (разброс будет в 2 раза меньше обычного).
SetSpreadMultiplier
(
100.00F
)
;
// Установит процент разброса пули на 100 (разброс останется неизмененным).
loganhackerdff
24.07.2020, 12:21
Функция копирование текста в буффер
C++:
void
SetClipboardText
(
char
*
txt
)
{
if
(
OpenClipboard
(
NULL
)
)
{
HGLOBAL clipbuffer
;
char
*
buffer
;
EmptyClipboard
(
)
;
clipbuffer
=
GlobalAlloc
(
GMEM_DDESHARE
,
strlen
(
txt
)
+
1
)
;
buffer
=
(
char
*
)
GlobalLock
(
clipbuffer
)
;
strcpy
(
buffer
,
txt
)
;
GlobalUnlock
(
clipbuffer
)
;
SetClipboardData
(
CF_TEXT
,
clipbuffer
)
;
CloseClipboard
(
)
;
}
}
Получает путь к корневой папке gta_sa.exe
C++:
void
GetPath
(
char
*
OutPutBuffer
)
{
GetModuleFileNameA
(
GetModuleHandleA
(
NULL
)
,
OutPutBuffer
,
260
)
;
memset
(
OutPutBuffer
+
(
strlen
(
OutPutBuffer
)
-
strlen
(
"/gta_sa.exe"
)
)
,
0
,
1
)
;
}
Устанавливает позицию ImGui окна посередине экрана (Только для самп)
C++:
void
setNextWindowPositionCenter
(
)
{
ImGui
::
SetNextWindowPos
(
ImVec2
(
*
(
int
*
)
0xC9C040
/
2
,
*
(
int
*
)
0xC9C044
/
2
)
,
ImGuiCond_Once
,
ImVec2
(
0.5F
,
0.5F
)
)
;
}
MISTER_GONWIK
24.07.2020, 12:47
Функция копирование текста в буффер
C++:
void
SetClipboardText
(
char
*
txt
)
{
if
(
OpenClipboard
(
NULL
)
)
{
HGLOBAL clipbuffer
;
char
*
buffer
;
EmptyClipboard
(
)
;
clipbuffer
=
GlobalAlloc
(
GMEM_DDESHARE
,
strlen
(
txt
)
+
1
)
;
buffer
=
(
char
*
)
GlobalLock
(
clipbuffer
)
;
strcpy
(
buffer
,
txt
)
;
GlobalUnlock
(
clipbuffer
)
;
SetClipboardData
(
CF_TEXT
,
clipbuffer
)
;
CloseClipboard
(
)
;
}
}
Получает путь к корневой папке gta_sa.exe
C++:
void
GetPath
(
char
*
OutPutBuffer
)
{
GetModuleFileNameA
(
GetModuleHandleA
(
NULL
)
,
OutPutBuffer
,
260
)
;
memset
(
OutPutBuffer
+
(
strlen
(
OutPutBuffer
)
-
strlen
(
"/gta_sa.exe"
)
)
,
0
,
1
)
;
}
Устанавливает позицию ImGui окна посередине экрана (Только для самп)
C++:
void
setNextWindowPositionCenter
(
)
{
ImGui
::
SetNextWindowPos
(
ImVec2
(
*
(
int
*
)
0xC9C040
/
2
,
*
(
int
*
)
0xC9C044
/
2
)
,
ImGuiCond_Once
,
ImVec2
(
0.5F
,
0.5F
)
)
;
}
Выводит крутой череп в sf консоль (Только для самп)
C++:
void
PrintCHEREP
(
)
{
char
*
XXX
;
XXX
=
(
char
*
)
malloc
(
1980
)
;
XXX
=
"___________________0000000000000000000____________ ________\n"
"_________________000000_____________0000000_______ _________\n"
"______________0000_______________________0000_____ _________\n"
"_____________000_____________________________00___ _________\n"
"____________00________________________________00__ _________\n"
"___________00_________________________________00__ _________\n"
"__________00___________________________________00_ _________\n"
"__________00_00_____________________________00_00_ _________\n"
"__________00_00_____________________________00__0_ _________\n"
"__________00_00_____________________________00__0_ _________\n"
"__________00__00____________________________00_00_ _________\n"
"__________00__00___________________________00__00_ _________\n"
"___________00_00___00000000_____00000000___00_00__ _________\n"
"____________0000_0000000000_____0000000000_00000__ _________\n"
"_____________000_0000000000_____0000000000_000____ _________\n"
"____000_______00__00000000_______000000000__00____ __0000___\n"
"___00000_____00___0000000___000___0000000___00____ _000000__\n"
"__00___00____00_____000____00000____000_____00____ 00___00__\n"
"_000____0000__00__________0000000__________00__000 0____000_\n"
"00_________00000000_______0000000_______000000000_ _______00\n"
"000000000_____00000000____0000000____00000000_____ _00000000\n"
"__0000_00000______00000______________000_00_____00 0000_000_\n"
"__________000000__000__00___________00__000__00000 0________\n"
"______________000000_00_00000000000_00_000000_____ _________\n"
"__________________00_00_0_0_0_0_0_0_0_0_00________ _________\n"
"________________0000__0_0_0_0_0_0_0_0___00000_____ _________\n"
"____________00000_00___0000000000000___00_00000___ _________\n"
"____0000000000_____00_________________00______0000 00000____\n"
"___00___________0000000_____________00000000______ ____00___\n"
"____000_____00000_____000000000000000_____00000___ __000____\n"
"______00___000___________000000000___________000__ _00______\n"
"______00__00___________________________________00_ _00______\n"
"_______0000_____________________________________00 00_______\n"
;
SF
->
LogConsole
(
XXX
)
;
free
(
XXX
)
;
}
ужасно.
Dark_Knight
25.07.2020, 16:43
C++:
#include
#include
std
::
string
getFileDirectoryPath
(
std
::
string filename
)
;
{
}
C++:
namespace
fs
=
std
::
experimental
::
::
system
;
std
::
string path
=
fs
::
current_path
(
)
.
string
(
)
;
Разве так не проще?
FPS Unlock:
uint32_t
dwSAMPHandle
=
reinterpret_cast
(
LoadLibrary
(
"SAMP.dll"
)
)
;
// Instead of this use your variable.
if
(
!
dwSAMPHandle
)
return
;
// Maybe, samp in this time didn't initialized.
auto
PatchFrameLimiter
=
[
&
]
(
)
{
/* Set frame sleep to NULL */
*
reinterpret_cast
(
0x00BAB318
)
=
0x00
;
*
reinterpret_cast
(
0x0053E94C
)
=
0x00
;
DWORD dwProtection
=
PAGE_EXECUTE_READWRITE
;
VirtualProtect
(
reinterpret_cast
(
dwSAMPHandle
+
0x9D183
)
,
6UL
,
dwProtection
,
&
dwProtection
)
;
memset
(
reinterpret_cast
(
dwSAMPHandle
+
0x9D183
)
,
0x90
,
6UL
)
;
// Nop all instructions (size of jne 6 bytes, not 5, like default jmp).
memcpy
(
reinterpret_cast
(
dwSAMPHandle
+
0x9D183
)
,
"\x0F\x85"
,
2UL
)
;
// First two bytes it's opcode in jne.
*
reinterpret_cast
(
dwSAMPHandle
+
0x9D183
+
2
)
=
(
dwSAMPHandle
+
0x9D2F9
)
-
(
dwSAMPHandle
+
0x9D183
)
-
6UL
;
// Fill another 4 bytes by relative address on epilogue.
VirtualProtect
(
reinterpret_cast
(
dwSAMPHandle
+
0x9D183
)
,
6UL
,
dwProtection
,
&
dwProtection
)
;
}
;
auto
RestorePatch
=
[
&
]
(
)
{
/* Restore frame sleep */
*
reinterpret_cast
(
0x00BAB318
)
=
0x01
;
*
reinterpret_cast
(
0x0053E94C
)
=
0x02
;
DWORD dwProtection
=
PAGE_EXECUTE_READWRITE
;
VirtualProtect
(
reinterpret_cast
(
dwSAMPHandle
+
0x9D183
)
,
6UL
,
dwProtection
,
&
dwProtection
)
;
memcpy
(
reinterpret_cast
(
dwSAMPHandle
+
0x9D183
)
,
"\x75\x2C\xB8\x00\x80"
,
6UL
)
;
// Restore original instruction.
VirtualProtect
(
reinterpret_cast
(
dwSAMPHandle
+
0x9D183
)
,
6UL
,
dwProtection
,
&
dwProtection
)
;
}
;
_=Gigant=_
03.08.2020, 14:17
drawing imgui on players
sa-mp-010.png_=Gigant=_ · 3 Авг 2020 в 13:17' data-fancybox="lb-post-539661" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/64235/" style="cursor: pointer;" title="sa-mp-010.png">
https://forum.antichat.xyz/attachments/27539661/
C++:
[CODE]
for
(
int
iplayers
=
0
;
iplayers
iIsListed
[
iplayers
]
!=
1
)
continue
;
actor_info
*
info
=
getGTAPedFromSAMPPlayerID
(
iplayers
)
;
if
(
!
info
)
continue
;
float
*
pPos
=
&
info
->
base
.
matrix
[
12
]
;
if
(
vect3_dist
(
pPos
,
&
g_Players
->
pLocalPlayer
->
pSAMP_Actor
->
pGTA_Ped
->
base
.
matrix
[
4
*
3
]
)
>
100.0
)
continue
;
D3DXVECTOR3 draw_getvec
,
info_toscreen
;
draw_getvec
.
x
=
pPos
[
0
]
;
draw_getvec
.
y
=
pPos
[
1
]
;
draw_getvec
.
z
=
pPos
[
2
]
;
CalcScreenCoors
(
&
draw_getvec
,
&
info_toscreen
)
;
if
(
info_toscreen
.
z
включает курсор (нужен plugin-sdk)
C++:
#ifdef IMGUI_VERSION
void
show_cursor
(
bool
show
,
bool
is_imgui
=
false
)
#else
void
show_cursor
(
bool
show
)
#endif
{
if
(
show
)
{
patch
::
Nop
(
0x541DF5
,
5
)
;
// don't call CControllerConfigManager::AffectPadFromKeyBoard
patch
::
Nop
(
0x53F417
,
5
)
;
// don't call CPad__getMouseState
patch
::
SetRaw
(
0x53F41F
,
"\x33\xC0\x0F\x84"
,
4
)
;
// test eax, eax -> xor eax, eax
// jl loc_53F526 -> jz loc_53F526
patch
::
PutRetn
(
0x6194A0
)
;
// disable RsMouseSetPos (ret)
#ifdef IMGUI_VERSION
if
(
is_imgui
)
ImGui
::
GetIO
(
)
.
MouseDrawCursor
=
true
;
else
#endif
static_cast
(
RwD3D9GetCurrentD3DDevice
(
)
)
->
ShowCursor
(
TRUE
)
;
}
else
{
patch
::
SetRaw
(
0x541DF5
,
"\xE8\x46\xF3\xFE\xFF"
,
5
)
;
// call CControllerConfigManager::AffectPadFromKeyBoard
patch
::
SetRaw
(
0x53F417
,
"\xE8\xB4\x7A\x20\x00"
,
5
)
;
// call CPad__getMouseState
patch
::
SetRaw
(
0x53F41F
,
"\x85\xC0\x0F\x8C"
,
4
)
;
// xor eax, eax -> test eax, eax
// jz loc_53F526 -> jl loc_53F526
patch
::
SetUChar
(
0x6194A0
,
0xE9
)
;
// jmp setup
static_cast
(
RwD3D9GetCurrentD3DDevice
(
)
)
->
ShowCursor
(
FALSE
)
;
#ifdef IMGUI_VERSION
ImGui
::
GetIO
(
)
.
MouseDrawCursor
=
false
;
#endif
}
CPad
::
NewMouseControllerState
.
X
=
0
;
CPad
::
NewMouseControllerState
.
Y
=
0
;
Call
(
)
;
// CPad::ClearMouseHistory
Call
(
)
;
// CPad::UpdatePads
}
AdCKuY_DpO4uLa
06.10.2020, 20:06
отключает и включает возможность открывать и закрывать таб (0.3.7-R1)
C++:
memcpy
(
(
void
*
)
(
GetModuleHandleA
(
"samp.dll"
)
+
0x6AD33
)
,
(
BYTE
*
)
"\x83\x3E\x01"
,
3
)
;
//отключить таб
memcpy
(
(
void
*
)
(
GetModuleHandleA
(
"samp.dll"
)
+
0x6AD33
)
,
(
BYTE
*
)
"\x83\x3E\x00"
,
3
)
;
//включить таб
kin4stat
06.10.2020, 21:07
отключает и включает возможность открывать и закрывать таб (0.3.7-R1)
C++:
memcpy
(
(
void
*
)
(
GetModuleHandleA
(
"samp.dll"
)
+
0x6AD33
)
,
(
BYTE
*
)
"\x83\x3E\x01"
,
3
)
;
//отключить таб
memcpy
(
(
void
*
)
(
GetModuleHandleA
(
"samp.dll"
)
+
0x6AD33
)
,
(
BYTE
*
)
"\x83\x3E\x00"
,
3
)
;
//включить таб
Крашнет, т.к. протекцию памяти не снял. И вообще, с такой мелочью лучше в луа сниппеты
Gunborg Johansson
05.01.2021, 06:01
включает курсор (нужен plugin-sdk)
C++:
#ifdef IMGUI_VERSION
void
show_cursor
(
bool
show
,
bool
is_imgui
=
false
)
#else
void
show_cursor
(
bool
show
)
#endif
{
if
(
show
)
{
patch
::
Nop
(
0x541DF5
,
5
)
;
// don't call CControllerConfigManager::AffectPadFromKeyBoard
patch
::
Nop
(
0x53F417
,
5
)
;
// don't call CPad__getMouseState
patch
::
SetRaw
(
0x53F41F
,
"\x33\xC0\x0F\x84"
,
4
)
;
// test eax, eax -> xor eax, eax
// jl loc_53F526 -> jz loc_53F526
patch
::
PutRetn
(
0x6194A0
)
;
// disable RsMouseSetPos (ret)
#ifdef IMGUI_VERSION
if
(
is_imgui
)
ImGui
::
GetIO
(
)
.
MouseDrawCursor
=
true
;
else
#endif
static_cast
(
RwD3D9GetCurrentD3DDevice
(
)
)
->
ShowCursor
(
TRUE
)
;
}
else
{
patch
::
SetRaw
(
0x541DF5
,
"\xE8\x46\xF3\xFE\xFF"
,
5
)
;
// call CControllerConfigManager::AffectPadFromKeyBoard
patch
::
SetRaw
(
0x53F417
,
"\xE8\xB4\x7A\x20\x00"
,
5
)
;
// call CPad__getMouseState
patch
::
SetRaw
(
0x53F41F
,
"\x85\xC0\x0F\x8C"
,
4
)
;
// xor eax, eax -> test eax, eax
// jz loc_53F526 -> jl loc_53F526
patch
::
SetUChar
(
0x6194A0
,
0xE9
)
;
// jmp setup
static_cast
(
RwD3D9GetCurrentD3DDevice
(
)
)
->
ShowCursor
(
FALSE
)
;
#ifdef IMGUI_VERSION
ImGui
::
GetIO
(
)
.
MouseDrawCursor
=
false
;
#endif
}
CPad
::
NewMouseControllerState
.
X
=
0
;
CPad
::
NewMouseControllerState
.
Y
=
0
;
Call
(
)
;
// CPad::ClearMouseHistory
Call
(
)
;
// CPad::UpdatePads
}
Alternative realization (w/o plugin sdk):
C++:
void
showCursor
(
bool
state
)
{
using
RwD3D9GetCurrentD3DDevice_t
=
LPDIRECT3DDEVICE9
(
__cdecl
*
)
(
)
;
auto
rwCurrentD3dDevice
{
reinterpret_cast
(
0x7F9D50U
)
(
)
}
;
if
(
nullptr
==
rwCurrentD3dDevice
)
{
return
;
}
static
DWORD
updateMouseProtection
,
rsMouseSetPosProtFirst
,
rsMouseSetPosProtSecond
;
if
(
state
)
{
::
VirtualProtect
(
reinterpret_cast
(
0x53F3C6U
)
,
5U
,
PAGE_EXECUTE_READWRITE
,
&
updateMouseProtection
)
;
::
VirtualProtect
(
reinterpret_cast
(
0x53E9F1U
)
,
5U
,
PAGE_EXECUTE_READWRITE
,
&
rsMouseSetPosProtFirst
)
;
::
VirtualProtect
(
reinterpret_cast
(
0x748A1BU
)
,
5U
,
PAGE_EXECUTE_READWRITE
,
&
rsMouseSetPosProtSecond
)
;
// NOP: CPad::UpdateMouse
*
reinterpret_cast
(
0x53F3C6U
)
=
0xE9U
;
*
reinterpret_cast
(
0x53F3C6U
+
1U
)
=
0x15BU
;
// NOP: RsMouseSetPos
memset
(
reinterpret_cast
(
0x53E9F1U
)
,
0x90
,
5U
)
;
memset
(
reinterpret_cast
(
0x748A1BU
)
,
0x90
,
5U
)
;
rwCurrentD3dDevice
->
ShowCursor
(
TRUE
)
;
}
else
{
// Original: CPad::UpdateMouse
memcpy
(
reinterpret_cast
(
0x53F3C6U
)
,
"\xE8\x95\x6C\x20\x00"
,
5U
)
;
// Original: RsMouseSetPos
memcpy
(
reinterpret_cast
(
0x53E9F1U
)
,
"\xE8\xAA\xAA\x0D\x00"
,
5U
)
;
memcpy
(
reinterpret_cast
(
0x748A1BU
)
,
"\xE8\x80\x0A\xED\xFF"
,
5U
)
;
using
CPad_ClearMouseHistory_t
=
void
(
__cdecl
*
)
(
)
;
using
CPad_UpdatePads_t
=
void
(
__cdecl
*
)
(
)
;
reinterpret_cast
(
0x541BD0U
)
(
)
;
reinterpret_cast
(
0x541DD0U
)
(
)
;
::
VirtualProtect
(
reinterpret_cast
(
0x53F3C6U
)
,
5U
,
updateMouseProtection
,
&
updateMouseProtection
)
;
::
VirtualProtect
(
reinterpret_cast
(
0x53E9F1U
)
,
5U
,
rsMouseSetPosProtFirst
,
&
rsMouseSetPosProtFirst
)
;
::
VirtualProtect
(
reinterpret_cast
(
0x748A1BU
)
,
5U
,
rsMouseSetPosProtSecond
,
&
rsMouseSetPosProtSecond
)
;
rwCurrentD3dDevice
->
ShowCursor
(
FALSE
)
;
}
}
Gunborg Johansson
08.01.2021, 07:36
Function for converting game 3D coordinates to screen coordinates (noticed that some use the self-written CalcScreenCoors function, lol)
C++:
namespace
Game
{
struct
Vector
{
float
x
,
y
,
z
;
Vector
(
float
_x
,
float
_y
,
float
_z
)
:
x
(
_x
)
,
y
(
_y
)
,
z
(
_z
)
{
}
Vector
(
)
{
x
=
y
=
z
=
0
;
}
}
;
}
Game
::
Vector
convertGameCoordsToScreen
(
Game
::
Vector worldCoords
)
{
using
CalcScreenCoors_t
=
bool
(
__cdecl
*
)
(
Game
::
Vector
*
,
Game
::
Vector
*
,
float
*
,
float
*
)
;
Game
::
Vector screenCoords
;
auto
gameFunction
{
reinterpret_cast
(
0x71DA00U
)
}
;
float
unusedParams
[
2U
]
{
0
}
;
gameFunction
(
&
worldCoords
,
&
screenCoords
,
&
unusedParams
[
0U
]
,
&
unusedParams
[
1U
]
)
;
return
screenCoords
;
}
Отключает/Включает воиспроизвидение звука в гта (лишь не дает воиспрозвести новый звук, старые звуки не отключает).
C++:
void
toggle_sound
(
bool
toggle
)
{
DWORD Protect
=
PAGE_EXECUTE_READWRITE
;
VirtualProtect
(
reinterpret_cast
(
0x4D86B0
)
,
8
,
Protect
,
&
Protect
)
;
memcpy
(
reinterpret_cast
(
0x4D86B0
)
,
(
toggle
?
"\xB8\x00\x00\x00\x00\xC2\x1C\x00"
:
"\x51\x56\x57\x8B\x7C\x24\x10\x66"
)
,
8
)
;
VirtualProtect
(
reinterpret_cast
(
0x4D86B0
)
,
8
,
Protect
,
&
Protect
)
;
}
Gunborg Johansson
21.02.2021, 09:31
Отключает/Включает воиспроизвидение звука в гта (лишь не дает воиспрозвести новый звук, старые звуки не отключает).
C++:
void
toggle_sound
(
bool
toggle
)
{
DWORD Protect
=
PAGE_EXECUTE_READWRITE
;
VirtualProtect
(
reinterpret_cast
(
0x4D86B0
)
,
8
,
Protect
,
&
Protect
)
;
memcpy
(
reinterpret_cast
(
0x4D86B0
)
,
(
toggle
?
"\xB8\x00\x00\x00\x00\xC2\x1C\x00"
:
"\x51\x56\x57\x8B\x7C\x24\x10\x66"
)
,
8
)
;
VirtualProtect
(
reinterpret_cast
(
0x4D86B0
)
,
8
,
Protect
,
&
Protect
)
;
}
Unsafe code, VirtualProtect function returns BOOL (using BOOL = int), u should check it out
kin4stat
21.02.2021, 10:57
Unsafe code, VirtualProtect function returns BOOL (using BOOL = int), u should check it out
ok.
Alternative realization (w/o plugin sdk):
C++:
void
showCursor
(
bool
state
)
{
using
RwD3D9GetCurrentD3DDevice_t
=
LPDIRECT3DDEVICE9
(
__cdecl
*
)
(
)
;
auto
rwCurrentD3dDevice
{
reinterpret_cast
(
0x7F9D50U
)
(
)
}
;
if
(
nullptr
==
rwCurrentD3dDevice
)
{
return
;
}
static
DWORD
updateMouseProtection
,
rsMouseSetPosProtFirst
,
rsMouseSetPosProtSecond
;
if
(
state
)
{
::
VirtualProtect
(
reinterpret_cast
(
0x53F3C6U
)
,
5U
,
PAGE_EXECUTE_READWRITE
,
&
updateMouseProtection
)
;
::
VirtualProtect
(
reinterpret_cast
(
0x53E9F1U
)
,
5U
,
PAGE_EXECUTE_READWRITE
,
&
rsMouseSetPosProtFirst
)
;
::
VirtualProtect
(
reinterpret_cast
(
0x748A1BU
)
,
5U
,
PAGE_EXECUTE_READWRITE
,
&
rsMouseSetPosProtSecond
)
;
// NOP: CPad::UpdateMouse
*
reinterpret_cast
(
0x53F3C6U
)
=
0xE9U
;
*
reinterpret_cast
(
0x53F3C6U
+
1U
)
=
0x15BU
;
// NOP: RsMouseSetPos
memset
(
reinterpret_cast
(
0x53E9F1U
)
,
0x90
,
5U
)
;
memset
(
reinterpret_cast
(
0x748A1BU
)
,
0x90
,
5U
)
;
rwCurrentD3dDevice
->
ShowCursor
(
TRUE
)
;
}
else
{
// Original: CPad::UpdateMouse
memcpy
(
reinterpret_cast
(
0x53F3C6U
)
,
"\xE8\x95\x6C\x20\x00"
,
5U
)
;
// Original: RsMouseSetPos
memcpy
(
reinterpret_cast
(
0x53E9F1U
)
,
"\xE8\xAA\xAA\x0D\x00"
,
5U
)
;
memcpy
(
reinterpret_cast
(
0x748A1BU
)
,
"\xE8\x80\x0A\xED\xFF"
,
5U
)
;
using
CPad_ClearMouseHistory_t
=
void
(
__cdecl
*
)
(
)
;
using
CPad_UpdatePads_t
=
void
(
__cdecl
*
)
(
)
;
reinterpret_cast
(
0x541BD0U
)
(
)
;
reinterpret_cast
(
0x541DD0U
)
(
)
;
::
VirtualProtect
(
reinterpret_cast
(
0x53F3C6U
)
,
5U
,
updateMouseProtection
,
&
updateMouseProtection
)
;
::
VirtualProtect
(
reinterpret_cast
(
0x53E9F1U
)
,
5U
,
rsMouseSetPosProtFirst
,
&
rsMouseSetPosProtFirst
)
;
::
VirtualProtect
(
reinterpret_cast
(
0x748A1BU
)
,
5U
,
rsMouseSetPosProtSecond
,
&
rsMouseSetPosProtSecond
)
;
rwCurrentD3dDevice
->
ShowCursor
(
FALSE
)
;
}
}
Возвращает координаты прицела на экране (подходит для всех разрешений).
C++:
void
getCrossHairPos
(
int
&
crosshairPosX
,
int
&
crosshairPosY
)
{
int
iHeight
,
iWidth
;
SF
->
getGame
(
)
->
getScreenResolution
(
&
iWidth
,
&
iHeight
)
;
float
chOff1
=
*
(
float
*
)
0xB6EC10
,
chOff2
=
*
(
float
*
)
0xB6EC14
;
crosshairPosX
=
iWidth
*
chOff2
;
// Координаты прицела по оси Z
crosshairPosY
=
iHeight
*
chOff1
;
// Координаты прицела по оси Y
}
Использование:
С++:
int
crosshairPosX
,
int
crosshairPosY
getCrossHairPos
(
crosshairPosX
,
crosshairPosY
)
;
bottom_text
09.07.2021, 11:57
0.3.7 R-1
Проверяет, открыт ли чат
C++:
bool
isChatOpen
(
)
{
return
*
reinterpret_cast
(
*
reinterpret_cast
(
sampAddress
+
0x12E350
)
+
0x3C
)
;
}
Проверяет, открыт ли ScoreBoard(Tab)
C++:
bool
isScoreBoardOpen
(
)
{
return
*
reinterpret_cast
(
*
reinterpret_cast
(
sampAddress
+
0x21A0B4
)
)
;
}
кусок говнокода позволяющий получать название кнопки по ее айди и наоброт.
keys.h:
#include
#include
#include
static
const
std
::
unordered_map
g_keysIdToName
{
// letters
{
65
,
"A"
}
,
{
66
,
"B"
}
,
{
67
,
"C"
}
,
{
68
,
"D"
}
,
{
69
,
"E"
}
,
{
70
,
"F"
}
,
{
71
,
"G"
}
,
{
72
,
"H"
}
,
{
73
,
"I"
}
,
{
74
,
"J"
}
,
{
75
,
"K"
}
,
{
76
,
"L"
}
,
{
77
,
"M"
}
,
{
78
,
"N"
}
,
{
79
,
"O"
}
,
{
80
,
"P"
}
,
{
81
,
"Q"
}
,
{
82
,
"R"
}
,
{
83
,
"S"
}
,
{
84
,
"T"
}
,
{
85
,
"U"
}
,
{
86
,
"V"
}
,
{
87
,
"W"
}
,
{
88
,
"X"
}
,
{
89
,
"Y"
}
,
{
90
,
"Z"
}
,
// numbers
{
48
,
"0"
}
,
{
49
,
"1"
}
,
{
50
,
"2"
}
,
{
51
,
"3"
}
,
{
52
,
"4"
}
,
{
53
,
"5"
}
,
{
54
,
"6"
}
,
{
55
,
"7"
}
,
{
56
,
"8"
}
,
{
57
,
"9"
}
,
// f-keys
{
112
,
"F1"
}
,
{
113
,
"F2"
}
,
{
114
,
"F3"
}
,
{
115
,
"F4"
}
,
{
116
,
"F5"
}
,
{
117
,
"F6"
}
,
{
118
,
"F7"
}
,
{
119
,
"F8"
}
,
{
120
,
"F9"
}
,
{
121
,
"F10"
}
,
{
122
,
"F11"
}
,
{
123
,
"F12"
}
,
// numpad
{
96
,
"NUM0"
}
,
{
97
,
"NUM1"
}
,
{
98
,
"NUM2"
}
,
{
99
,
"NUM3"
}
,
{
100
,
"NUM4"
}
,
{
101
,
"NUM5"
}
,
{
102
,
"NUM6"
}
,
{
103
,
"NUM7"
}
,
{
104
,
"NUM8"
}
,
{
105
,
"NUM9"
}
,
// math opers
{
106
,
"*"
}
,
{
107
,
"+"
}
,
{
108
,
"|"
}
,
{
109
,
"-"
}
,
{
110
,
"."
}
,
{
111
,
"/"
}
,
// other
{
19
,
"PAUSE"
}
,
{
35
,
"END"
}
,
{
36
,
"HOME"
}
,
{
45
,
"INSERT"
}
,
{
46
,
"DELETE"
}
,
{
160
,
"LSHIFT"
}
,
{
161
,
"RSHIFT"
}
,
{
162
,
"LCTRL"
}
,
{
163
,
"RCTRL"
}
,
{
164
,
"LALT"
}
,
{
165
,
"RALT"
}
}
;
static
const
std
::
unordered_map
g_keysNameToId
{
// letters
{
"A"
,
65
}
,
{
"B"
,
66
}
,
{
"C"
,
67
}
,
{
"D"
,
68
}
,
{
"E"
,
69
}
,
{
"F"
,
70
}
,
{
"G"
,
71
}
,
{
"H"
,
72
}
,
{
"I"
,
73
}
,
{
"J"
,
74
}
,
{
"K"
,
75
}
,
{
"L"
,
76
}
,
{
"M"
,
77
}
,
{
"N"
,
78
}
,
{
"O"
,
79
}
,
{
"P"
,
80
}
,
{
"Q"
,
81
}
,
{
"R"
,
82
}
,
{
"S"
,
83
}
,
{
"T"
,
84
}
,
{
"U"
,
85
}
,
{
"V"
,
86
}
,
{
"W"
,
87
}
,
{
"X"
,
88
}
,
{
"Y"
,
89
}
,
{
"Z"
,
90
}
,
// numbers
{
"0"
,
48
}
,
{
"1"
,
49
}
,
{
"2"
,
50
}
,
{
"3"
,
51
}
,
{
"4"
,
52
}
,
{
"5"
,
53
}
,
{
"6"
,
54
}
,
{
"7"
,
55
}
,
{
"8"
,
56
}
,
{
"9"
,
57
}
,
// f-keys
{
"F1"
,
112
}
,
{
"F2"
,
113
}
,
{
"F3"
,
114
}
,
{
"F4"
,
115
}
,
{
"F5"
,
116
}
,
{
"F6"
,
117
}
,
{
"F7"
,
118
}
,
{
"F8"
,
119
}
,
{
"F9"
,
120
}
,
{
"F10"
,
121
}
,
{
"F11"
,
122
}
,
{
"F12"
,
123
}
,
// numpad
{
"NUM0"
,
96
}
,
{
"NUM1"
,
97
}
,
{
"NUM2"
,
98
}
,
{
"NUM3"
,
99
}
,
{
"NUM4"
,
100
}
,
{
"NUM5"
,
101
}
,
{
"NUM6"
,
102
}
,
{
"NUM7"
,
103
}
,
{
"NUM8"
,
104
}
,
{
"NUM9"
,
105
}
,
// math opers
{
"*"
,
106
}
,
{
"+"
,
107
}
,
{
"|"
,
108
}
,
{
"-"
,
109
}
,
{
"."
,
110
}
,
{
"/"
,
111
}
,
// other
{
"PAUSE"
,
19
}
,
{
"END"
,
35
}
,
{
"HOME"
,
36
}
,
{
"INSERT"
,
45
}
,
{
"DELETE"
,
46
}
,
{
"LSHIFT"
,
160
}
,
{
"RSHIFT"
,
161
}
,
{
"LCTRL"
,
162
}
,
{
"RCTRL"
,
163
}
,
{
"LALT"
,
164
}
,
{
"RALT"
,
165
}
}
;
Проверяет активность текст дравов ( sf api crmp )
C++:
bool
check_textdraw_active
(
)
{
bool
text_draw_active
=
false
;
for
(
int
i
=
0
;
i
getSAMP
(
)
->
getNetGame
(
)
->
pools
->
textdrawPool
->
IsExists
(
i
)
)
text_draw_active
=
true
;
}
return
text_draw_active
;
}
kin4stat
22.08.2021, 05:06
Проверяет активность текст дравов ( sf api crmp )
C++:
bool
check_textdraw_active
(
)
{
bool
text_draw_active
=
false
;
for
(
int
i
=
0
;
i
getSAMP
(
)
->
getNetGame
(
)
->
pools
->
textdrawPool
->
IsExists
(
i
)
)
text_draw_active
=
true
;
}
return
text_draw_active
;
}
C++:
bool
check_textdraw_active
(
)
{
for
(
int
i
=
0
;
i
getSAMP
(
)
->
getNetGame
(
)
->
pools
->
textdrawPool
->
IsExists
(
i
)
)
return
true
;
}
return
false
;
}
Приведение строки к нижнему регистру, работает как с латиницей так и с кирилицей
C++:
[CODE]
string
LowerString
(
string str
)
{
for
(
int
i
=
0
;
i
=
'A'
&&
str
[
i
]
=
'А'
&&
str
[
i
]
[QUOTE="vegas~"]
Приведение строки к нижнему регистру, работает как с латиницей так и с кирилицей
C++:
[CODE]
string
LowerString
(
string str
)
{
for
(
int
i
=
0
;
i
=
'A'
&&
str
[
i
]
=
'А'
&&
str
[
i
]
ужасно
Сделай лучше и выложи сюда
kin4stat
18.02.2022, 21:24
Сделай лучше и выложи сюда
Работает с любой однобайтовой ***ней которую ты в нее запихнешь(при условии что у тебя такая же локаль стоит)
C++:
auto
tolower
=
[
]
(
char
*
string
,
std
::
size_t str_size
)
->
void
{
std
::
use_facet
>
(
std
::
locale
(
)
)
.
tolower
(
string
,
string
+
str_size
)
;
}
Или например вот так:
C++:
auto
tolower
=
[
]
(
std
::
string
&
str
)
->
void
{
std
::
transform
(
str
.
begin
(
)
,
str
.
end
(
)
,
[
]
(
unsigned
char
c
)
{
return
std
::
tolower
(
c
)
;
}
)
;
}
возвращает z координаты на определенных координатах
C++:
float
FindGroundZForPosition
(
float
fX
,
float
fY
)
{
DWORD dwFunc
=
0x569660
;
FLOAT fReturn
=
0
;
_asm
{
push fY
push fX
call dwFunc
fstp fReturn
add esp
,
8
}
return
fReturn
;
}
kin4stat
05.04.2022, 22:29
возвращает z координаты на определенных координатах
C++:
float
FindGroundZForPosition
(
float
fX
,
float
fY
)
{
DWORD dwFunc
=
0x569660
;
FLOAT fReturn
=
0
;
_asm
{
push fY
push fX
call dwFunc
fstp fReturn
add esp
,
8
}
return
fReturn
;
}
Спасибо мы тоже умеем смотреть в сорсы МТА и любим обмазываться ассемблером.
C++:
float
fZ
=
(
(
float
(
__cdecl
*
)
(
float
,
float
)
)
0x569660
)
(
fX
,
fY
)
;
Savchik Blazer
25.07.2022, 22:27
функция воспроизводит аудио из URL через эмуляцию rpc
C++:
void
playAudioStreamFromUrl
(
char
url
[
]
)
{
BitStream audio
;
audio
.
Write
(
(
UINT8
)
strlen
(
url
)
)
;
audio
.
Write
(
url
,
strlen
(
url
)
)
;
audio
.
Write
(
(
UINT8
)
0
)
;
SF
->
getRakNet
(
)
->
emulateRecvRPC
(
41
,
&
audio
)
;
}
пример использования
пример:
playAudioStreamFromUrl
(
ссылка
)
;
Savchik Blazer
01.09.2022, 11:35
меняет ссылку, на которую отправляется информация о краше
C++:
void
SetCrashReportLink
(
const
char
*
link
)
{
DWORD protect
;
VirtualProtect
(
reinterpret_cast
(
reinterpret_cast
(
GetModuleHandleA
(
"samp.dll"
)
)
+
0xD7374
)
,
strlen
(
link
)
,
PAGE_EXECUTE_READWRITE
,
&
protect
)
;
std
::
strcpy
(
reinterpret_cast
(
reinterpret_cast
(
GetModuleHandleA
(
"samp.dll"
)
)
+
0xD7374
)
,
link
)
;
//R2 - 0xD7384, R3 - 0xE9654, R4 - 0xE9674, 03DL - 0xB6E4
VirtualProtect
(
reinterpret_cast
(
reinterpret_cast
(
GetModuleHandleA
(
"samp.dll"
)
)
+
0xD7374
)
,
strlen
(
link
)
,
protect
,
&
protect
)
;
}
функция возвращает ссылку на текущий аудиострим
C++:
reinterpret_cast
(
reinterpret_cast
(
GetModuleHandleA
(
"samp.dll"
)
)
+
0x11A2F8
)
;
//R2 - 0x11A2F8, R3 - 0x12E378, R4- 0x12E4A0, 03DL - 0x16C4B8
F0RQU1N and
13.09.2022, 09:03
меняет ссылку, на которую отправляется информация о краше
C++:
void
SetCrashReportLink
(
const
char
*
link
)
{
DWORD protect
;
VirtualProtect
(
reinterpret_cast
(
reinterpret_cast
(
GetModuleHandleA
(
"samp.dll"
)
)
+
0xD7374
)
,
strlen
(
link
)
,
PAGE_EXECUTE_READWRITE
,
&
protect
)
;
std
::
strcpy
(
reinterpret_cast
(
reinterpret_cast
(
GetModuleHandleA
(
"samp.dll"
)
)
+
0xD7374
)
,
link
)
;
//R2 - 0xD7384, R3 - 0xE9654, R4 - 0xE9674, 03DL - 0xB6E4
VirtualProtect
(
reinterpret_cast
(
reinterpret_cast
(
GetModuleHandleA
(
"samp.dll"
)
)
+
0xD7374
)
,
strlen
(
link
)
,
protect
,
&
protect
)
;
}
функция возвращает ссылку на текущий аудиострим
C++:
reinterpret_cast
(
reinterpret_cast
(
GetModuleHandleA
(
"samp.dll"
)
)
+
0x11A2F8
)
;
//R2 - 0x11A2F8, R3 - 0x12E378, R4- 0x12E4A0, 03DL - 0x16C4B8
какой в этом смысл?
да и вообще вроде до вызова этой функции не доходит
https://forum.antichat.xyz/attachments/28144992/
MeG@LaDo[N] ^_^
22.10.2022, 17:30
Генерация рандомной строки без массива с буквами и рандомного выбора из его, аргумент len это длина строки а str это строка(указывать не обязательно)
но если хотите сделать что то типа : RandomString -> ... то впишите в аргумент "RandomString -> "
piska:
[CODE]
std
::
string
random_string
(
std
::
uint32_t
len
,
std
::
string str
=
""
)
noexcept
{
srand
(
GetTickCount
(
)
)
;
//можете юзать time(0), но у меня подключен Windows.h так шо мне пох
for
(
std
::
uint32_t
iter
=
0
;
iter
Read text from showdialog and other compressed strings on 03dl, reading textlen was corrupting the text
чтение текста из showdialog и других сжатых строк в 03dl, чтение textlen разрывает текст
C++:
case
RPC_ShowDialog
:
{
traceLastFunc
(
"RPC_ShowDialog"
)
;
//UINT16 wDialogID, UINT8 bDialogStyle, UINT8 bTitleLength, char[] szTitle, UINT8 bButton1Len, char[] szButton1, UINT8 bButton2Len, char[] szButton2, CSTRING szInfo
BitStream
bsData
(
rpcParams
->
input
,
rpcParams
->
numberOfBitsOfData
/
8
,
false
)
;
WORD dialogId
;
uint8_t
style
,
titleLen
,
button1Len
,
button2Len
;
char
title
[
257
]
,
button1
[
257
]
,
button2
[
257
]
,
text
[
4096
]
;
bsData
.
Read
(
dialogId
)
;
bsData
.
Read
(
style
)
;
bsData
.
Read
(
titleLen
)
;
bsData
.
Read
(
title
,
titleLen
)
;
title
[
titleLen
]
=
'\0'
;
bsData
.
Read
(
button1Len
)
;
bsData
.
Read
(
button1
,
button1Len
)
;
button1
[
button1Len
]
=
'\0'
;
bsData
.
Read
(
button2Len
)
;
bsData
.
Read
(
button2
,
button2Len
)
;
button2
[
button2Len
]
=
'\0'
;
bsData
.
Write
(
0
)
;
bsData
.
Read
(
text
)
;
text
[
0
]
=
'\0'
;
stringCompressor
->
DecodeString
(
text
,
4096
,
&
bsData
)
;
addMessageToChatWindow
(
"Decoded: %s "
,
text
)
;
}
_=Gigant=_
18.02.2023, 23:54
Simple samp query using imgui server address and socket api
ImGui::Begin("Server Info");
// Create a socket to communicate with the server
int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
// Specify the server's address and port
sockaddr_in addr = { 0 };
addr.sin_family = AF_INET;
addr.sin_port = htons(7777);
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
// Send a SAMP Query packet to the server
char query[] = { 'S', 'A', 'M', 'P', ' ', '0', 'x', '54', '4F', '4D', '50', '\0' };
sendto(sock, query, sizeof(query), 0, (sockaddr*)&addr, sizeof(addr));
// Wait for a response from the server
char buffer[2048] = { 0 };
int len = sizeof(sockaddr_in);
recvfrom(sock, buffer, sizeof(buffer), 0, (sockaddr*)&addr, &len);
// Parse the response and display the server info
ImGui::Text("Server Name: %s", buffer + 11);
ImGui::Text("Players Online: %d", *(int*)(buffer + 19));
ImGui::Text("Game Mode: %s", buffer + 23);
ImGui::Text("Language: %s", buffer + 39);
ImGui::Text("Weather: %d", *(int*)(buffer + 43));
ImGui::Text("Time: %d:%02d", *(int*)(buffer + 47), *(int*)(buffer + 51));
ImGui::Text("Ping: %d", *(int*)(buffer + 83));
ImGui::End();
AdCKuY_DpO4uLa
19.02.2023, 00:28
Simple samp query using imgui server address and socket api
ImGui::Begin("Server Info");
// Create a socket to communicate with the server
int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
// Specify the server's address and port
sockaddr_in addr = { 0 };
addr.sin_family = AF_INET;
addr.sin_port = htons(7777);
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
// Send a SAMP Query packet to the server
char query[] = { 'S', 'A', 'M', 'P', ' ', '0', 'x', '54', '4F', '4D', '50', '\0' };
sendto(sock, query, sizeof(query), 0, (sockaddr*)&addr, sizeof(addr));
// Wait for a response from the server
char buffer[2048] = { 0 };
int len = sizeof(sockaddr_in);
recvfrom(sock, buffer, sizeof(buffer), 0, (sockaddr*)&addr, &len);
// Parse the response and display the server info
ImGui::Text("Server Name: %s", buffer + 11);
ImGui::Text("Players Online: %d", *(int*)(buffer + 19));
ImGui::Text("Game Mode: %s", buffer + 23);
ImGui::Text("Language: %s", buffer + 39);
ImGui::Text("Weather: %d", *(int*)(buffer + 43));
ImGui::Text("Time: %d:%02d", *(int*)(buffer + 47), *(int*)(buffer + 51));
ImGui::Text("Ping: %d", *(int*)(buffer + 83));
ImGui::End();
Query Mechanism - SA-MP Wiki (https://sampwiki.blast.hk/wiki/Query_Mechanism)
sampwiki.blast.hk
_=Gigant=_
19.02.2023, 07:33
inline float ByteToFloat(unsigned char value)
{
return static_cast(value) / 255.0f;
}
ImVec4 D3DColorToImVec4(DWORD color)
{
float red = ByteToFloat((color >> 16) & 0xFF);
float green = ByteToFloat((color >> 8) & 0xFF);
float blue = ByteToFloat(color & 0xFF);
float alpha = ByteToFloat(color >> 24);
return ImVec4(red, green, blue, alpha);
}
Usage
DWORD d3dcolor = 0x00FF00FF; // Example color
ImVec4 imvec4 = D3DColorToImVec4(d3dcolor);
2# D3DCOLOR TO IMVEC4
unsigned char FloatToByte(float value)
{
return static_cast(value * 255.0f);
}
DWORD ImVec4ToD3DColor(const ImVec4& color)
{
unsigned char red = FloatToByte(color.x);
unsigned char green = FloatToByte(color.y);
unsigned char blue = FloatToByte(color.z);
unsigned char alpha = FloatToByte(color.w);
return D3DCOLOR_ARGB(alpha, red, green, blue);
}
ImVec4 imvec4(1.0f, 0.0f, 1.0f, 0.5f); //usage
DWORD d3dcolor = ImVec4ToD3DColor(imvec4);
Отправка фейковой позиции...
C++:
void
send_onfootdata
(
float
x
,
float
y
,
float
z
)
{
if
(
BS
->
getPlugin
(
)
->
actor_driving
(
-
1
)
)
return
;
BitStream bsOnfootSync
;
stOnFootData ofSync
;
memset
(
&
ofSync
,
0
,
sizeof
(
stOnFootData
)
)
;
ofSync
.
byteArmor
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
byteArmor
;
ofSync
.
byteCurrentWeapon
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
byteCurrentWeapon
;
ofSync
.
byteHealth
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
byteHealth
;
ofSync
.
byteSpecialAction
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
byteSpecialAction
;
ofSync
.
fMoveSpeed
[
0
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fMoveSpeed
[
0
]
;
ofSync
.
fMoveSpeed
[
1
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fMoveSpeed
[
1
]
;
ofSync
.
fMoveSpeed
[
2
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fMoveSpeed
[
2
]
;
ofSync
.
fPosition
[
0
]
=
x
;
ofSync
.
fPosition
[
1
]
=
y
;
ofSync
.
fPosition
[
2
]
=
z
;
ofSync
.
fQuaternion
[
0
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fQuaternion
[
0
]
;
ofSync
.
fQuaternion
[
1
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fQuaternion
[
1
]
;
ofSync
.
fQuaternion
[
2
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fQuaternion
[
2
]
;
ofSync
.
fQuaternion
[
3
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fQuaternion
[
3
]
;
ofSync
.
fSurfingOffsets
[
0
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fSurfingOffsets
[
0
]
;
ofSync
.
fSurfingOffsets
[
1
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fSurfingOffsets
[
1
]
;
ofSync
.
fSurfingOffsets
[
2
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fSurfingOffsets
[
2
]
;
ofSync
.
sAnimFlags
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
sAnimFlags
;
ofSync
.
sCurrentAnimationID
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
sCurrentAnimationID
;
ofSync
.
sKeys
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
sKeys
;
ofSync
.
sLeftRightKeys
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
sLeftRightKeys
;
ofSync
.
sSurfingVehicleID
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
sSurfingVehicleID
;
ofSync
.
stSampKeys
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
stSampKeys
;
ofSync
.
sUpDownKeys
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
sUpDownKeys
;
bsOnfootSync
.
Write
(
(
BYTE
)
ID_PLAYER_SYNC
)
;
bsOnfootSync
.
Write
(
(
PCHAR
)
&
ofSync
,
sizeof
(
stOnFootData
)
)
;
SF
->
getRakNet
(
)
->
SendPacket
(
&
bsOnfootSync
)
;
}
C++:
void
sendCoordination
(
float
x
,
float
y
,
float
z
)
{
BitStream bs
;
stOnFootData sync
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
;
sync
.
fPosition
[
0
]
=
x
;
sync
.
fPosition
[
1
]
=
y
;
sync
.
fPosition
[
2
]
=
z
;
bs
.
Write
(
(
BYTE
)
ID_PLAYER_SYNC
)
;
bs
.
Write
(
(
PCHAR
)
&
sync
,
sizeof
(
stOnFootData
)
)
;
SF
->
getRakNet
(
)
->
SendPacket
(
&
bs
)
;
}
AdCKuY_DpO4uLa
24.04.2023, 18:58
Данный класс позволяет скрыть модуль из списка загруженных модулей путем замены указателей на "скрываемый модуль" в структуре PEB_LDR_DATA процесса.
C++:
#include
#include
class
ModuleHider
{
private
:
//only x86 structs
typedef
struct
_PEB_LDR_DATA
{
ULONG Length
;
BOOLEAN Initialized
;
HANDLE SsHandle
;
LIST_ENTRY InLoadOrderModuleList
;
LIST_ENTRY InMemoryOrderModuleList
;
LIST_ENTRY InInitializationOrderModuleList
;
PVOID EntryInProgress
;
}
PEB_LDR_DATA
,
*
PPEB_LDR_DATA
;
typedef
struct
_LDR_DATA_ENTRY
{
//PVOID Reserved1[0];
LIST_ENTRY InLoadOrderModuleList
;
LIST_ENTRY InInitializationOrderModuleList
;
LIST_ENTRY InMemoryOrderModuleList
;
//PVOID Reserved2[2];
PVOID DllBase
;
PVOID Reserved3
[
2
]
;
UNICODE_STRING FullDllName
;
BYTE Reserved4
[
8
]
;
PVOID Reserved5
[
3
]
;
#pragma warning(push)
#pragma warning(disable: 4201)
// we'll always use the Microsoft compiler
union
{
ULONG CheckSum
;
PVOID Reserved6
;
}
DUMMYUNIONNAME
;
#pragma warning(pop)
ULONG TimeDateStamp
;
}
LDR_DATA_ENTRY
,
*
PLDR_DATA_ENTRY
;
PPEB_LDR_DATA _m_pPEB_LDR
;
PLDR_DATA_ENTRY _m_pEntry
;
HINSTANCE _m_DllHandle
;
PLDR_DATA_ENTRY _m_pDoEntry
,
_m_pAfterEntry
;
LIST_ENTRY _m_origAddrs
;
bool
_m_bIsHided
;
public
:
ModuleHider
(
const
HINSTANCE hModule
)
:
_m_DllHandle
(
hModule
)
,
_m_bIsHided
(
false
)
{
_m_pPEB_LDR
=
(
PPEB_LDR_DATA
)
NtCurrentTeb
(
)
->
ProcessEnvironmentBlock
->
Ldr
;
_m_pEntry
=
(
PLDR_DATA_ENTRY
)
_m_pPEB_LDR
->
InLoadOrderModuleList
.
Flink
;
}
;
~
ModuleHider
(
)
{
Show
(
)
;
}
;
auto
Hide
(
void
)
->
bool
{
if
(
_m_bIsHided
==
true
)
return
false
;
while
(
_m_pEntry
->
DllBase
)
{
if
(
_m_pEntry
->
DllBase
==
_m_DllHandle
)
{
_m_pDoEntry
=
(
PLDR_DATA_ENTRY
)
_m_pEntry
->
InLoadOrderModuleList
.
Blink
;
_m_pAfterEntry
=
(
PLDR_DATA_ENTRY
)
_m_pEntry
->
InLoadOrderModuleList
.
Flink
;
_m_origAddrs
.
Flink
=
_m_pAfterEntry
->
InLoadOrderModuleList
.
Blink
;
_m_origAddrs
.
Blink
=
_m_pDoEntry
->
InLoadOrderModuleList
.
Flink
;
_m_pDoEntry
->
InLoadOrderModuleList
.
Flink
=
_m_pEntry
->
InLoadOrderModuleList
.
Flink
;
_m_pAfterEntry
->
InLoadOrderModuleList
.
Blink
=
_m_pEntry
->
InLoadOrderModuleList
.
Blink
;
_m_bIsHided
=
true
;
return
true
;
}
_m_pEntry
=
(
PLDR_DATA_ENTRY
)
_m_pEntry
->
InLoadOrderModuleList
.
Flink
;
}
return
false
;
}
;
auto
Show
(
void
)
->
bool
{
if
(
_m_bIsHided
==
true
)
{
_m_pDoEntry
->
InLoadOrderModuleList
.
Flink
=
_m_origAddrs
.
Flink
;
_m_pAfterEntry
->
InLoadOrderModuleList
.
Blink
=
_m_origAddrs
.
Blink
;
_m_bIsHided
=
false
;
return
true
;
}
return
false
;
}
;
auto
IsModuleHided
(
void
)
->
bool
{
return
_m_bIsHided
;
}
;
}
;
Пример использования:
C++:
HINSTANCE hModule
{
}
;
//предположим, что это валидный хендл нашего модуля
//создадим экзепляр класса, передавая в конструктор хендл модуля
std
::
unique_ptr
pModuleHider
=
std
::
make_unique
(
hModule
)
;
//метод для скрытия модуля
if
(
pModuleHider
->
Hide
(
)
)
std
::
cout
Show
(
)
)
std
::
cout
IsModuleHided
(
)
;
Функцию позволяющая установить позицию камеры на 3д координаты
C++:
void
SFrotateCameraAt3D
(
CVector coords
)
{
CVector camera_orig
=
*
GAME
->
GetCamera
(
)
->
GetCam
(
GAME
->
GetCamera
(
)
->
GetActiveCam
(
)
)
->
GetSource
(
)
;
;
int
camera_mode
=
GAME
->
GetCamera
(
)
->
GetCam
(
GAME
->
GetCamera
(
)
->
GetActiveCam
(
)
)
->
GetMode
(
)
;
CVector2D crosshair_offset
;
float
aspect_ratio
;
CVector vector
;
vector
=
{
(
camera_orig
.
fX
-
coords
.
fX
)
,
(
camera_orig
.
fY
-
coords
.
fY
)
,
(
camera_orig
.
fZ
-
coords
.
fZ
)
}
;
crosshair_offset
=
{
*
reinterpret_cast
(
0xB6EC10
)
,
*
reinterpret_cast
(
0xB6EC14
)
}
;
aspect_ratio
=
*
reinterpret_cast
(
0xC3EFA4
)
;
float
mult
;
float
idk_fX
,
idk_fZ
;
float
idk_afX
,
idk_afZ
;
mult
=
tan
(
GAME
->
GetCamera
(
)
->
GetCam
(
GAME
->
GetCamera
(
)
->
GetActiveCam
(
)
)
->
GetFOV
(
)
*
0.5
*
0.01745
)
;
idk_fZ
=
(
3.14
-
atan2
(
1.0
,
mult
*
(
(
0.5
-
crosshair_offset
.
fX
)
*
(
2
/
aspect_ratio
)
)
)
)
;
idk_fX
=
(
3.14
-
atan2
(
1.0
,
mult
*
2
*
(
crosshair_offset
.
fY
-
0.5
)
)
)
;
if
(
!
(
camera_mode
==
53
||
camera_mode
==
55
)
)
{
idk_fX
=
3.14
/
2
;
idk_fZ
=
3.14
/
2
;
}
idk_afX
=
atan2
(
vector
.
fY
,
-
vector
.
fX
)
-
3.14
/
2
;
idk_afZ
=
atan2
(
sqrt
(
vector
.
fX
*
vector
.
fX
+
vector
.
fY
*
vector
.
fY
)
,
vector
.
fZ
)
;
GAME
->
GetCamera
(
)
->
GetCam
(
GAME
->
GetCamera
(
)
->
GetActiveCam
(
)
)
->
SetDirection
(
(
idk_afZ
-
idk_fZ
)
,
(
idk_fX
-
idk_afX
)
)
;
//SF->getCLEO()->callOpcode("0A25: %f %f", (idk_afZ - idk_fZ), (idk_fX - idk_afX));
}
C++:
void
rotateCameraAt3D
(
CVector coords
)
{
CVector camera_orig
=
TheCamera
.
GetPosition
(
)
;
int
camera_mode
=
TheCamera
.
m_aCams
[
0
]
.
m_nMode
;
CVector2D crosshair_offset
;
float
aspect_ratio
;
CVector vector
;
vector
=
{
(
camera_orig
.
x
-
coords
.
x
)
,
(
camera_orig
.
y
-
coords
.
y
)
,
(
camera_orig
.
z
-
coords
.
z
)
}
;
crosshair_offset
=
{
*
reinterpret_cast
(
0xB6EC10
)
,
*
reinterpret_cast
(
0xB6EC14
)
}
;
aspect_ratio
=
*
reinterpret_cast
(
0xC3EFA4
)
;
float
mult
;
float
idk_fX
,
idk_fZ
;
float
idk_afX
,
idk_afZ
;
mult
=
tan
(
TheCamera
.
FindCamFOV
(
)
*
0.5
*
0.01745
)
;
idk_fZ
=
(
3.14
-
atan2
(
1.0
,
mult
*
(
(
0.5
-
crosshair_offset
.
x
)
*
(
2
/
aspect_ratio
)
)
)
)
;
idk_fX
=
(
3.14
-
atan2
(
1.0
,
mult
*
2
*
(
crosshair_offset
.
y
-
0.5
)
)
)
;
if
(
!
(
camera_mode
==
53
||
camera_mode
==
55
)
)
{
idk_fX
=
3.14
/
2
;
idk_fZ
=
3.14
/
2
;
}
idk_afX
=
atan2
(
vector
.
y
,
-
vector
.
x
)
-
3.14
/
2
;
idk_afZ
=
atan2
(
sqrt
(
vector
.
x
*
vector
.
x
+
vector
.
y
*
vector
.
y
)
,
vector
.
z
)
;
TheCamera
.
m_aCams
[
0
]
.
m_fHorizontalAngle
=
(
idk_fX
-
idk_afX
)
;
TheCamera
.
m_aCams
[
0
]
.
m_fVerticalAngle
=
(
idk_afZ
-
idk_fZ
)
;
}
Converts 2d screen coordinates (.z is depth) to world 3d coordinates. Actually, this is implementation of the SF opcode:
CLEO:
0B8F:
convert_screen_coords
1@
2@
depth
3@
to_world_3d
4@
5@
6@
C:
#if defined(_MSC_VER)
#define CC_STDCALL __stdcall
#elif defined(__GNUC__) || defined(__clang__)
#define CC_STDCALL __attribute__((stdcall))
#endif
typedef
struct
D3DMATRIX
{
union
{
struct
{
float
_11
;
float
_12
;
float
_13
;
float
_14
;
float
_21
;
float
_22
;
float
_23
;
float
_24
;
float
_31
;
float
_32
;
float
_33
;
float
_34
;
float
_41
;
float
_42
;
float
_43
;
float
_44
;
}
;
float
m
[
4
]
[
4
]
;
}
;
}
D3DMATRIX
;
typedef
struct
CVector
{
float
x
;
float
y
;
float
z
;
}
CVector
;
typedef
char
(
CC_STDCALL
*
D3DXMatrixInverse_t
)
(
void
*
a1
,
float
*
a2
,
const
void
*
a3
)
;
D3DXMatrixInverse_t D3DXMatrixInverse
=
(
D3DXMatrixInverse_t
)
0x76795B
;
void
convert_screen_coords_to_world_3d
(
const
CVector
*
screen_coors
,
CVector
*
world_coors
)
{
D3DMATRIX worldMatrix
;
/* Get the combined view-projection matrix and invert it */
memcpy
(
&
worldMatrix
,
(
const
void
*
)
0xB6FA2C
,
sizeof
(
worldMatrix
)
)
;
worldMatrix
.
m
[
3
]
[
3
]
=
1.0f
;
D3DMATRIX inverseMatrix
;
// TODO: Check is it possible to reuse the same matrix
D3DXMatrixInverse
(
&
inverseMatrix
,
NULL
,
&
worldMatrix
)
;
/* Apply the inverse view-projection matrix to the screen coordinates */
float
invZ
=
1.0f
/
screen_coors
->
z
;
float
screenX
=
screen_coors
->
x
/
(
*
(
int
*
)
0xC17044
*
invZ
)
;
float
screenY
=
screen_coors
->
y
/
(
*
(
int
*
)
0xC17048
*
invZ
)
;
/* Transform the screen coordinates into world coordinates */
world_coors
->
x
=
screenX
*
inverseMatrix
.
_11
+
screenY
*
inverseMatrix
.
_21
+
screen_coors
->
z
*
inverseMatrix
.
_31
+
inverseMatrix
.
_41
;
world_coors
->
y
=
screenX
*
inverseMatrix
.
_12
+
screenY
*
inverseMatrix
.
_22
+
screen_coors
->
z
*
inverseMatrix
.
_32
+
inverseMatrix
.
_42
;
world_coors
->
z
=
screenX
*
inverseMatrix
.
_13
+
screenY
*
inverseMatrix
.
_23
+
screen_coors
->
z
*
inverseMatrix
.
_33
+
inverseMatrix
.
_43
;
}
Tested on 1.0 US
Добавляет пробелы между целыми тысячами, десятью тысячами, и так далее...
C++:
std
::
string
separate_number
(
auto
number
,
char
separator
=
' '
)
{
static_assert
(
std
::
is_integral_v
,
"only integral values are supported"
)
;
std
::
string ret_number
;
auto
number_str
=
std
::
to_string
(
number
)
;
auto
i
=
0
;
for
(
auto
str_iter
=
number_str
.
rbegin
(
)
;
str_iter
!=
number_str
.
rend
(
)
;
++
str_iter
)
{
auto
next_str_iter
=
str_iter
+
1
;
ret_number
+=
*
str_iter
;
if
(
next_str_iter
!=
number_str
.
rend
(
)
&&
*
next_str_iter
!=
'-'
&&
++
i
==
3
)
{
ret_number
+=
separator
;
i
=
0
;
}
}
std
::
reverse
(
ret_number
.
begin
(
)
,
ret_number
.
end
(
)
)
;
return
ret_number
;
}
Использование:
C++:
[CODE]
std
::
cout
_=Gigant=_
20.07.2024, 17:03
Functions to add names to the file, could be useful for friends list etc... not just names other text in general:
void
WriteNamesToFile
(
const
std
::
string
&
filename
,
const
std
::
set
&
names
)
{
std
::
ofstream
outfile
(
filename
)
;
for
(
const
auto
&
name
:
names
)
{
if
(
!
name
.
empty
(
)
)
{
outfile
names
=
ReadNamesFromFile
(
filename
)
;
if
(
new_name
.
empty
(
)
||
names
.
find
(
new_name
)
!=
names
.
end
(
)
)
return
;
names
.
insert
(
new_name
)
;
WriteNamesToFile
(
filename
,
names
)
;
}
//name_to_remove or in general any text
void
RemoveNameFromFile
(
const
std
::
string
&
filename
,
const
std
::
string
&
name_to_remove
)
{
std
::
set
names
=
ReadNamesFromFile
(
filename
)
;
if
(
names
.
erase
(
name_to_remove
)
>
0
)
WriteNamesToFile
(
filename
,
names
)
;
}
bool
NameExistsInFile
(
const
std
::
string
&
filename
,
const
std
::
string
&
name_to_check
)
{
std
::
set
names
=
ReadNamesFromFile
(
filename
)
;
return
names
.
find
(
name_to_check
)
!=
names
.
end
(
)
;
}
std
::
set
ReadNamesFromFile
(
const
std
::
string
&
filename
)
{
std
::
set
names
;
std
::
ifstream
infile
(
filename
)
;
std
::
string name
;
while
(
std
::
getline
(
infile
,
name
)
)
{
if
(
!
name
.
empty
(
)
)
names
.
insert
(
name
)
;
}
return
names
;
}
walkerdev
21.08.2024, 16:19
SAMPFuncs - управление выносливостью игрока
Функции get/set:
float
getFloatFromMemory
(
unsigned
char
*
memoryAddress
)
{
float
*
floatPtr
=
reinterpret_cast
(
memoryAddress
)
;
return
*
floatPtr
;
}
void
setFloatToMemory
(
unsigned
char
*
memoryAddress
,
float
value
)
{
float
*
floatPtr
=
reinterpret_cast
(
memoryAddress
)
;
*
floatPtr
=
value
*
31.47000244
;
}
Пример использования:
[CODE]
unsigned
char
*
memoryAddress
=
reinterpret_cast
(
0xB7CDB4
)
;
float
value
=
0.0f
;
if
(
type
>=
20
)
value
=
100.0f
;
else
if
(
type
>=
10
&&
type
=
4
&&
type
type - в моем случае переменная, которая передается из pawn-кода, отвечающая за выносливость игрока.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot