В общем, пытался сделать с векторами камеры - какая-то фигня получалась... Вот набросочек, доработать бы надо в идеале. Код должен показывать 3д-текст над игроком, в которого целишься.
Автор: OKStyle
P.S. Чтобы писался лейбл над игроком, который ещё не взят в таргет (повреждения наносятся ещё до появления таргета) или вообще никогда взят не будет в таргет (снайперка).
PHP:
#define PRESSED(%0) (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
#define RELEASED(%0) (((newkeys & (%0)) != (%0)) && ((oldkeys & (%0)) == (%0)))
//
if(!IsPlayerInAnyVehicle(playerid))
{
new PlayerText3D:snipertext[MAX_PLAYERS];
if(newkeys & KEY_HANDBRAKE || PRESSED(KEY_HANDBRAKE))
{
new Float:X, Float:Y, Float:Z, targetid = GetPlayerTargetPlayer(playerid), PlayerName[MAX_PLAYER_NAME];
if(targetid != INVALID_PLAYER_ID)
{
GetPlayerPos(targetid, X, Y, Z);
GetPlayerName(targetid, PlayerName, sizeof(PlayerName));
snipertext[targetid] = CreatePlayer3DTextLabel(playerid, PlayerName, 0xFF0000FF, X, Y, Z + 0.25, 300.0, targetid);
return 1;
}
else
{
new Float:TargetDistance[43] =
{8.5, 8.5, 8.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 35.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
55.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
for(new i = GetMaxPlayers() - 1; i != -1; i--)
{
if(!IsPlayerConnected(i) || !IsPlayerStreamedIn(playerid, i)) continue;
GetPlayerPos(i, X, Y, Z);
new Float:dist = GetPlayerDistanceFromPoint(playerid, X, Y, Z);
if(dist > TargetDistance[GetPlayerWeapon(playerid)])
{
new Float:Px, Float:Py, Float: Pa, Float:Sa;
GetPlayerPos(playerid, Px, Py, Pa);
Pa = floatabs(atan((Y-Py)/(X-Px)));
if(X <= Px && Y >= Py) Pa = floatsub(180, Pa);
else if(X < Px && Y < Py) Pa = floatadd(Pa, 180);
else if(X >= Px && Y <= Py) Pa = floatsub(360.0, Pa);
Pa = floatsub(Pa, 90.0);
if(Pa >= 360.0) Pa = floatsub(Pa, 360.0);
GetPlayerFacingAngle(playerid, Sa);
if(Sa + 2.0 > Pa && Pa > Sa - 2.0)
/*
new Float:fPX, Float:fPY, Float:fPZ;
GetPlayerCameraPos(playerid, fPX, fPY, fPZ);
new Float:fVX, Float:fVY, Float:fVZ;
GetPlayerCameraFrontVector(playerid, fVX, fVY, fVZ);
if(fPX + fVX == X && fPY + fVY == Y && fPZ + fVZ == Z)
{
GetPlayerName(i, PlayerName, sizeof(PlayerName));
snipertext[i] = CreatePlayer3DTextLabel(playerid, PlayerName, 0x00FF00FF, X, Y, Z + 0.25, 300.0, i);
}
*/
return 1;
}
}
}
}
else if((oldkeys & KEY_HANDBRAKE && newkeys != KEY_HANDBRAKE) || RELEASED(KEY_HANDBRAKE))
{
for(new i = GetMaxPlayers() - 1; i != -1; i--)
{
if(snipertext[i] != PlayerText3D:INVALID_3DTEXT_ID) DeletePlayer3DTextLabel(playerid, snipertext[i]);
}
return 1;
}
}
//
P.S. Чтобы писался лейбл над игроком, который ещё не взят в таргет (повреждения наносятся ещё до появления таргета) или вообще никогда взят не будет в таргет (снайперка).