ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Полезные функции (https://forum.antichat.xyz/showthread.php?t=1310970)

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

Цитата:

Сообщение от Gabriel__

Функция телепортирует игрока в определенную точку.

Код:





Код:

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
)
;


SR_team 01.02.2016 19:29

Цитата:

Сообщение от Спойлер


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++:





[CODE]
float
getSkill
(
int
weaponId
)
{
float
Skill
=
1000.0f
;
if
(
(
weaponId
>=
22
)
&&
(
weaponId




Цитата:

Сообщение от Спойлер


C++:





Код:

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

Цитата:

Сообщение от By_Surse

Телепортирует машину игрока

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
]
)
;
}
}
}
}


AWRage 07.03.2016 16:15

Я думаю, по названиям функций понятно.

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++:





[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
)
)
;
}
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++:





Код:

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
)
;



Цитата:

Сообщение от Спойлер


ЯedЯuM 24.10.2018 01:31

Эмулирует анимацию стана как при попадании пули в скин.

Полезно для разработчиков сайлент аимов

Цитата:

Сообщение от Спойлер


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
)
;
// Использовать в хуке онфут даты с блокировкой оригинальной синхры.


ЯedЯuM 24.10.2018 20:44

Рассчитывет вектор прицеливания камеры к скину указанного игрока, кроме обхода античита на сайлент аим это необходимо для прострела стен на 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

Цитата:

Сообщение от AWRage

Я думаю, по названиям функций понятно.

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;
}


f0Re3t 02.01.2019 20:26

Функция разбивает расстояние между 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
(
)


ЯedЯuM 06.02.2019 00:32

Цитата:

Сообщение от Stiopko

Работа с регистром (Подсмотрел с коллизи Фипа)

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")

Cake_ 15.05.2019 21:22

Преобразование 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



Cake_ 18.05.2019 12:54

Длина вектор

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
(
)
)
;
}
}





ALF 03.06.2019 22:11

удобная функция для установки таймеров

Цитата:

Сообщение от Спойлер


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++:





[CODE]
void
Foo
(
)
{
std
::
cout




чуть-чуть информации которая может пригодиться при использовании лямбда-выражений

Цитата:

Сообщение от Спойлер


Код:





Код:

[] - без захвата переменных
[=] - все переменные захватываются по значению
[&] - все переменные захватываются по ссылке





Cake_ 07.06.2019 12:12

Круглый слайдер для "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
;
}


Cake_ 10.08.2019 11:23

Конвертация 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


astap_ 11.10.2019 20:15

поворачивает камеру на координаты

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


Cake_ 11.10.2019 21:31

[QUOTE="astap_"]

поворачивает камеру на координаты

C++:





[CODE]
float
*
xCam
=
(
float
*
)
0xB6F258
;
DWORD
*
ptrActor
=
(
DWORD
*
)
0xB6F5F0
;
// global vars
void
rotateCamToXY
(
float
x
,
float
y
)
{
DWORD
*
pActorMtrx
=
(
DWORD
*
)
(
(
*
ptrActor
)
+
0x14
)
;
CVector2D
pPos
(
*
(
float
*
)
(
(
*
pActorMtrx
)
+
0x30
)
,
*
(
float
*
)
(
(
*
pActorMtrx
)
+
0x34
)
)
;
CVector2D
cPos
(
*
(
float
*
)
(
0xB6F9CC
)
,
*
(
float
*
)
(
0xB6F9D0
)
)
;
float
ac
=
sqrt
(
pow
(
fabs
(
cPos
.
fX
-
x
)
,
2
)
+
pow
(
fabs
(
cPos
.
fY
-
y
)
,
2
)
)
;
float
alpha
=
asin
(
fabs
(
cPos
.
fX
-
x
)
/
ac
)
;
float
beta
=
acos
(
fabs
(
cPos
.
fX
-
x
)
/
ac
)
;
if
(
(
pPos
.
fX
>
x
)
&&
(
pPos
.
fY

x
)
&&
(
pPos
.
fY
>
y
)
)
*
xCam
=
beta
;
if
(
(
pPos
.
fX

y
)
)
*
xCam
=
(
alpha
+
(
1.57
)
)
;
if
(
(
pPos
.
fX

C++:





Код:

void
cameraset
(
float
X
,
float
Y
)
{
CVector mypos
;
CVector enpos
;
CVector vector
;
enpos
.
fX
=
X
;
enpos
.
fY
=
Y
;
CCamera
*
pCamera
=
GAME
->
GetCamera
(
)
;
mypos
=
*
pCamera
->
GetCam
(
pCamera
->
GetActiveCam
(
)
)
->
GetSource
(
)
;
vector
=
mypos
-
enpos
;
float
AngleX
=
atan2f
(
vector
.
fY
,
-
vector
.
fX
)
-
M_PI
/
2
;
*
(
float
*
)
0xB6F258
=
-
(
AngleX
-
M_PI
/
2
)
;
}


Carrentine 11.10.2019 22:35

Описание: находит ближайшую кость противника к прицелу.

Код:

C++:





[CODE]
CVector
GetBonePos
(
INT ID
,
eBone eBone
,
BOOL isOnScreen
)
{
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
iIsListed
[
ID
]
!=
1
||
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
ID
]
==
NULL
||
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
ID
]
->
pPlayerData
==
NULL
||
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
ID
]
->
pPlayerData
->
pSAMP_Actor
==
NULL
||
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
ID
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
==
NULL
)
return
CVector
(
0.0F
,
0.0F
,
0.0F
)
;
if
(
isOnScreen
)
{
CVector BonePosition
;
CVector2D BonePositionOnScreen
;
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
ID
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
)
->
GetTransformedBonePosition
(
eBone
,
&
BonePosition
)
;
SF
->
getGame
(
)
->
convert3DCoordsToScreen
(
BonePosition
.
fX
,
BonePosition
.
fY
,
BonePosition
.
fZ
,
&
BonePositionOnScreen
.
fX
,
&
BonePositionOnScreen
.
fY
)
;
return
CVector
(
BonePositionOnScreen
.
fX
,
BonePositionOnScreen
.
fY
,
0.0F
)
;
}
else
{
CVector BonePosition
;
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
ID
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
)
->
GetTransformedBonePosition
(
eBone
,
&
BonePosition
)
;
return
CVector
(
BonePosition
.
fX
,
BonePosition
.
fY
,
BonePosition
.
fZ
)
;
}
}
eBone
GetNearestBone
(
int
iID
)
{
eBone
currentBone
[
]
=
{
BONE_RIGHTKNEE
,
BONE_LEFTKNEE
,
BONE_RIGHTELBOW
,
BONE_LEFTELBOW
,
BONE_SPINE1
,
BONE_RIGHTSHOULDER
,
BONE_LEFTSHOULDER
,
BONE_HEAD
}
,
nearestBone
;
float
currentRadius
,
maxRadius
=
20000
;
CVector posBone
;
for
(
int
i
=
0
;
i



Пример:

C++:





Код:

eBone nearestBone
=
GetNearestBone
(
playerID
)
;


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

Suspending coroutines by time. Contribute to allwanttokissme/coro_wait development by creating an account on GitHub.

github.com


хуки

sampapi

#Northn 01.11.2019 16:00

Цитата:

Сообщение от BlackKnigga

вроде Sleep для того чтобы не блокировать цикл игры.

Как насчёт std::this_thread::wait_for(time)? Вроде нет проблем же, или я что-то не понимаю?

BlackKnigga 01.11.2019 16:14

Цитата:

Сообщение от #Northn

Как насчёт std::this_thread::wait_for(time)? Вроде нет проблем же, или я что-то не понимаю?

Оно работает точно также как и Sleep


Время: 06:03