 |
|

24.07.2023, 19:57
|
|
Познавший АНТИЧАТ
Регистрация: 27.11.2020
Сообщений: 1,431
С нами:
2874035
Репутация:
183
|
|
sampfuncs 5.5.1
Я забадался, не знаю как проверить, находится ли игрок на экране, или нет, подскажите пожалуйста
Ошибок в этом коде компилятор не находит, но при запуске функции - крашит игру, не знаю как правильно найти педа
проблема в строчках 11-14
C++:
[CODE]
for
(
int
i
=
0
;
i
getSAMP
(
)
->
getPlayers
(
)
->
maxPlayerID
;
i
++
)
{
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
IsPlayerDefined
(
i
,
true
)
)
{
D3DCOLOR player_color
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
GetPlayerColor
(
i
)
;
OnFootData
*
foot
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
GetOnFootData
(
i
)
;
CVector player_original
=
{
foot
->
position
[
0
]
,
foot
->
position
[
1
]
,
foot
->
position
[
2
]
}
;
CVector my_pos
=
*
PEDSELF
->
GetPosition
(
)
;
CVector player_converted
;
CVector my_converted
;
SF
->
getGame
(
)
->
convert3DCoordsToScreen
(
player_original
.
fX
,
player_original
.
fY
,
player_original
.
fZ
,
&
player_converted
.
fX
,
&
player_converted
.
fY
)
;
SF
->
getGame
(
)
->
convert3DCoordsToScreen
(
my_pos
.
fX
,
my_pos
.
fY
,
my_pos
.
fZ
,
&
my_converted
.
fX
,
&
my_converted
.
fY
)
;
actor_info
*
actor
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
remotePlayersInfo
.
remotePlayer
[
i
]
->
data
->
sampActor
->
gtaPed
;
if
(
actor
!=
nullptr
)
{
CPed
*
Ped
=
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
actor
)
;
if
(
Ped
->
IsOnScreen
(
)
)
SF
->
getRender
(
)
->
DrawLine
(
my_converted
.
fX
,
my_converted
.
fY
,
player_converted
.
fX
,
player_converted
.
fY
,
1
,
(
player_color
&
0x00FFFFFF
)
|
(
255
|
|
|

24.07.2023, 20:16
|
|
Познающий
Регистрация: 20.07.2023
Сообщений: 77
С нами:
1485102
Репутация:
13
|
|
попробуй убрать пробел 11 и 13 строчка
чтоб было так
CPed*Ped = GAME->GetPools()->GetPed((DWORD*)actor);
actor_info*actor = SF->getSAMP()->getPlayers()->remotePlayersInfo.remotePlayer->data->sampActor->gtaPed;
if (actor != nullptr) {
|
|
|

24.07.2023, 20:18
|
|
Познавший АНТИЧАТ
Регистрация: 27.11.2020
Сообщений: 1,431
С нами:
2874035
Репутация:
183
|
|
Сообщение от vio???
попробуй убрать пробел 11 и 13 строчка
чтоб было так
CPed*Ped = GAME->GetPools()->GetPed((DWORD*)actor);
actor_info*actor = SF->getSAMP()->getPlayers()->remotePlayersInfo.remotePlayer->data->sampActor->gtaPed;
if (actor != nullptr) {
не знаю чем оно должно было помочь, но я попробовал - 0 разницы
@MISTER_GONWIK
|
|
|

25.07.2023, 04:46
|
|
Познавший АНТИЧАТ
Регистрация: 29.09.2018
Сообщений: 1,292
С нами:
4012500
Репутация:
138
|
|
Ну так ты проверь не выходят ли screen координаты за рамки размера окна гта
а вообще подключи дебаггер и посмотри в чем именно проблема
|
|
|

25.07.2023, 15:56
|
|
Познавший АНТИЧАТ
Регистрация: 27.11.2020
Сообщений: 1,431
С нами:
2874035
Репутация:
183
|
|
Сообщение от F0RQU1N and
Ну так ты проверь не выходят ли screen координаты за рамки размера окна гта
а вообще подключи дебаггер и посмотри в чем именно проблема
Я уже это делал, оно не работает, рисует тех, кого нет
В этом коде pointX, pointY это экранные координаты игроков
C++:
[CODE]
if
(
pointX
>=
0
&&
pointX
=
0
&&
pointY
|
|
|

25.07.2023, 16:30
|
|
Участник форума
Регистрация: 20.12.2021
Сообщений: 290
С нами:
2315345
Репутация:
48
|
|
работает со всем (игроки, тачки, объекты и подобное)
C++:
Код:
if
(
npcScreenPosition
.
z
>
1.f
)
// на экране
else
// за пределами экрана
UPD а крашит скорее всего из за того что ты пытаешся получить пед не существуещего игрока, вроде как то так надо "SF->getSAMP()->getPlayers()->remotePlayersInfo.remotePlayer(тут должны быть квадратные скобочки с i, но они пропадают) != nullptr", непомню уже и наверно лучше делать проверку как я написал, вместо SF->getSAMP()->getPlayers()->IsPlayerDefined(i, true), потому что лично у меня крашило из за того что это проверка не работает
|
|
|

25.07.2023, 16:43
|
|
Познавший АНТИЧАТ
Регистрация: 27.11.2020
Сообщений: 1,431
С нами:
2874035
Репутация:
183
|
|
Сообщение от Z3roKwq
работает со всем (игроки, тачки, объекты и подобное)
C++:
Код:
if
(
npcScreenPosition
.
z
>
1.f
)
// на экране
else
// за пределами экрана
UPD а крашит скорее всего из за того что ты пытаешся получить пед не существуещего игрока, вроде как то так надо "SF->getSAMP()->getPlayers()->remotePlayersInfo.remotePlayer(тут должны быть квадратные скобочки с i, но они пропадают) != nullptr", непомню уже и наверно лучше делать проверку как я написал, вместо SF->getSAMP()->getPlayers()->IsPlayerDefined(i, true), потому что лично у меня крашило из за того что это проверка не работает
screen position с координатой Z???
UPD сделал как ты сказал, проверку на ремот поставил, по итогу у меня ни к одному педу линия не проводится
C++:
[CODE]
RemotePlayer
*
actor
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
remotePlayersInfo
.
remotePlayer
[
i
]
;
if
(
actor
!=
nullptr
)
{
actor_info
*
new_actor
=
actor
->
data
->
sampActor
->
gtaPed
;
if
(
new_actor
!=
nullptr
)
{
CPed
*
Ped
=
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
new_actor
)
;
if
(
Ped
!=
nullptr
&&
Ped
->
IsOnScreen
(
)
)
SF
->
getRender
(
)
->
DrawLine
(
my_converted
.
fX
,
my_converted
.
fY
,
player_converted
.
fX
,
player_converted
.
fY
,
1
,
(
player_color
&
0x00FFFFFF
)
|
(
255
|
|
|

25.07.2023, 17:44
|
|
Участник форума
Регистрация: 20.12.2021
Сообщений: 290
С нами:
2315345
Репутация:
48
|
|
Сообщение от Smeruxa
screen position с координатой Z???
давно с сф не работал, получилось, что получилось
C++:
Код:
void
renderPlayers
(
)
{
for
(
int
i
=
0
;
i
getSAMP
(
)
->
getPlayers
(
)
->
isListed
[
i
]
&&
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
remotePlayerInfo
[
i
]
!=
nullptr
&&
i
!=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
localPlayerInfo
.
id
)
{
CVector myPedPositionWorld
=
*
PEDSELF
->
GetPosition
(
)
;
CVector pedPositionWorld
=
*
reinterpret_cast
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
remotePlayerInfo
[
i
]
->
data
->
onFootPos
)
;
CVector myPedPositionScreen
=
ConvertGametoScreen
(
myPedPositionWorld
)
;
CVector pedPositionScreen
=
ConvertGametoScreen
(
pedPositionWorld
)
;
if
(
pedPositionScreen
.
fZ
>
1.f
)
{
ImGui
::
GetBackgroundDrawList
(
)
->
AddLine
(
{
myPedPositionScreen
.
fX
,
myPedPositionScreen
.
fY
}
,
{
pedPositionScreen
.
fX
,
pedPositionScreen
.
fY
}
,
-
1
)
;
}
}
}
}
|
|
|

25.07.2023, 17:57
|
|
Познавший АНТИЧАТ
Регистрация: 27.11.2020
Сообщений: 1,431
С нами:
2874035
Репутация:
183
|
|
Сообщение от Z3roKwq
давно с сф не работал, получилось, что получилось
C++:
Код:
void
renderPlayers
(
)
{
for
(
int
i
=
0
;
i
getSAMP
(
)
->
getPlayers
(
)
->
isListed
[
i
]
&&
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
remotePlayerInfo
[
i
]
!=
nullptr
&&
i
!=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
localPlayerInfo
.
id
)
{
CVector myPedPositionWorld
=
*
PEDSELF
->
GetPosition
(
)
;
CVector pedPositionWorld
=
*
reinterpret_cast
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
remotePlayerInfo
[
i
]
->
data
->
onFootPos
)
;
CVector myPedPositionScreen
=
ConvertGametoScreen
(
myPedPositionWorld
)
;
CVector pedPositionScreen
=
ConvertGametoScreen
(
pedPositionWorld
)
;
if
(
pedPositionScreen
.
fZ
>
1.f
)
{
ImGui
::
GetBackgroundDrawList
(
)
->
AddLine
(
{
myPedPositionScreen
.
fX
,
myPedPositionScreen
.
fY
}
,
{
pedPositionScreen
.
fX
,
pedPositionScreen
.
fY
}
,
-
1
)
;
}
}
}
}
фунции такой нет ConvertGameToScreen, немного переписал твой код на мой sampfuncs, внимание на 10 строку
C++:
Код:
for
(
int
i
=
0
;
i
getSAMP
(
)
->
getPlayers
(
)
->
remotePlayersInfo
.
isListed
[
i
]
&&
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
remotePlayersInfo
.
remotePlayer
[
i
]
!=
nullptr
&&
i
!=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
localPlayerInfo
.
id
)
{
CVector myPedPositionWorld
=
*
PEDSELF
->
GetPosition
(
)
;
CVector pedPositionWorld
=
*
reinterpret_cast
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
remotePlayersInfo
.
remotePlayer
[
i
]
->
data
->
onFootPos
)
;
CVector2D my
;
CVector2D ped
;
SF
->
getGame
(
)
->
convert3DCoordsToScreen
(
myPedPositionWorld
.
fX
,
myPedPositionWorld
.
fY
,
myPedPositionWorld
.
fZ
,
&
my
.
fX
,
&
my
.
fY
)
;
SF
->
getGame
(
)
->
convert3DCoordsToScreen
(
pedPositionWorld
.
fX
,
pedPositionWorld
.
fY
,
pedPositionWorld
.
fZ
,
&
my
.
fX
,
&
my
.
fY
)
;
if
(
pedPositionScreen
.
fZ
>
1.f
)
{
// что делать тут?
ImGui
::
GetBackgroundDrawList
(
)
->
AddLine
(
{
my
.
fX
,
my
.
fY
}
,
{
ped
.
fX
,
ped
.
fY
}
,
-
1
)
;
}
}
}
|
|
|

25.07.2023, 18:02
|
|
Участник форума
Регистрация: 20.12.2021
Сообщений: 290
С нами:
2315345
Репутация:
48
|
|
Сообщение от Smeruxa
фунции такой нет ConvertGameToScreen, немного переписал твой код на мой sampfuncs, внимание на 10 строку
конвертирование это "кастом" функция была. и вопрос что не так с 10 строкой, а и имгуи рендер можеш заменить сф версию, я так сделал потому что мне удобнее было
UPD: я понял о чем ты, вот функция
C++:
Код:
CVector
ConvertGametoScreen
(
CVector WorldPosition
)
{
CVector ScreenPosition
;
D3DXMATRIX
m
(
(
float
*
)
(
0xB6FA2C
)
)
;
DWORD
*
dwLenfX
=
(
DWORD
*
)
(
0xC17044
)
;
DWORD
*
dwLenfY
=
(
DWORD
*
)
(
0xC17048
)
;
ScreenPosition
.
fX
=
(
WorldPosition
.
fZ
*
m
.
_31
)
+
(
WorldPosition
.
fY
*
m
.
_21
)
+
(
WorldPosition
.
fX
*
m
.
_11
)
+
m
.
_41
;
ScreenPosition
.
fY
=
(
WorldPosition
.
fZ
*
m
.
_32
)
+
(
WorldPosition
.
fY
*
m
.
_22
)
+
(
WorldPosition
.
fX
*
m
.
_12
)
+
m
.
_42
;
ScreenPosition
.
fZ
=
(
WorldPosition
.
fZ
*
m
.
_33
)
+
(
WorldPosition
.
fY
*
m
.
_23
)
+
(
WorldPosition
.
fX
*
m
.
_13
)
+
m
.
_43
;
double
fRecip
=
(
double
)
1.0
/
ScreenPosition
.
fZ
;
ScreenPosition
.
fX
*=
(
float
)
(
fRecip
*
(
*
dwLenfX
)
)
;
ScreenPosition
.
fY
*=
(
float
)
(
fRecip
*
(
*
dwLenfY
)
)
;
return
ScreenPosition
;
}
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|