 |
|

07.03.2016, 16:15
|
|
Постоянный
Регистрация: 10.07.2015
Сообщений: 642
С нами:
5706781
Репутация:
43
|
|
Я думаю, по названиям функций понятно.
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
;
}
|
|
|

07.03.2016, 22:44
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
int GetWantedLevel()
{
return *(DWORD*)0x58DB60;
}
Там байт храниться.
Так же это всё можно найти в пЛокалПлеер.
|
|
|

08.03.2016, 21:24
|
|
Постоянный
Регистрация: 06.07.2015
Сообщений: 310
С нами:
5712968
Репутация:
63
|
|
Получает разрешение экрана.
Вызов: POINT Screen = get_screen_resolution();
C++:
Код:
POINT
get_screen_resolution
(
)
{
POINT pos
;
pos
.
x
=
*
(
int
*
)
0xC9C040
;
pos
.
y
=
*
(
int
*
)
0xC9C044
;
return
pos
;
}
|
|
|

13.03.2016, 10:34
|
|
Постоянный
Регистрация: 06.07.2015
Сообщений: 310
С нами:
5712968
Репутация:
63
|
|
Выдача оружия через эмуляцию 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
)
;
}
|
|
|

27.09.2016, 19:09
|
|
Постоянный
Регистрация: 17.02.2014
Сообщений: 611
С нами:
6438231
Репутация:
133
|
|
Возвращает 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
)
|
|
|

13.04.2018, 22:33
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
Сообщение от Муззи
Обработчик событий 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
|
|
|

23.10.2018, 21:29
|
|
Постоянный
Регистрация: 28.03.2013
Сообщений: 495
С нами:
6908018
Репутация:
213
|
|
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
)
;
|
|
|

24.10.2018, 01:31
|
|
Участник форума
Регистрация: 13.03.2016
Сообщений: 242
С нами:
5351007
Репутация:
0
|
|
Эмулирует анимацию стана как при попадании пули в скин.
Полезно для разработчиков сайлент аимов
Сообщение от Спойлер
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
)
;
// Использовать в хуке онфут даты с блокировкой оригинальной синхры.
|
|
|

24.10.2018, 20:44
|
|
Участник форума
Регистрация: 13.03.2016
Сообщений: 242
С нами:
5351007
Репутация:
0
|
|
Рассчитывет вектор прицеливания камеры к скину указанного игрока, кроме обхода античита на сайлент аим это необходимо для прострела стен на 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
|
|
Постоянный
Регистрация: 02.06.2018
Сообщений: 342
С нами:
4183567
Репутация:
133
|
|
Сообщение от 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;
}
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|