ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   ped on screen (https://forum.antichat.xyz/showthread.php?t=1484046)

Smeruxa 24.07.2023 19:57

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


vio??? 24.07.2023 20:16

попробуй убрать пробел 11 и 13 строчка

чтоб было так

CPed*Ped = GAME->GetPools()->GetPed((DWORD*)actor);

actor_info*actor = SF->getSAMP()->getPlayers()->remotePlayersInfo.remotePlayer->data->sampActor->gtaPed;

if (actor != nullptr) {

Smeruxa 24.07.2023 20:18

Цитата:

Сообщение от 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

F0RQU1N and 25.07.2023 04:46

Ну так ты проверь не выходят ли screen координаты за рамки размера окна гта

а вообще подключи дебаггер и посмотри в чем именно проблема

Smeruxa 25.07.2023 15:56

Цитата:

Сообщение от F0RQU1N and

Ну так ты проверь не выходят ли screen координаты за рамки размера окна гта
а вообще подключи дебаггер и посмотри в чем именно проблема

Я уже это делал, оно не работает, рисует тех, кого нет

В этом коде pointX, pointY это экранные координаты игроков







C++:





[CODE]
if
(
pointX
>=
0
&&
pointX
=
0
&&
pointY


Z3roKwq 25.07.2023 16:30

работает со всем (игроки, тачки, объекты и подобное)

C++:





Код:

if
(
npcScreenPosition
.
z
>
1.f
)
// на экране
else
// за пределами экрана



UPD а крашит скорее всего из за того что ты пытаешся получить пед не существуещего игрока, вроде как то так надо "SF->getSAMP()->getPlayers()->remotePlayersInfo.remotePlayer(тут должны быть квадратные скобочки с i, но они пропадают)!= nullptr", непомню уже и наверно лучше делать проверку как я написал, вместо SF->getSAMP()->getPlayers()->IsPlayerDefined(i, true), потому что лично у меня крашило из за того что это проверка не работает

Smeruxa 25.07.2023 16:43

Цитата:

Сообщение от 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


Z3roKwq 25.07.2023 17:44

Цитата:

Сообщение от 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
)
;
}
}
}
}


Smeruxa 25.07.2023 17:57

Цитата:

Сообщение от 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
)
;
}
}
}


Z3roKwq 25.07.2023 18:02

Цитата:

Сообщение от 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
;
}



Время: 02:15