PDA

Просмотр полной версии : [Вопрос] Проверка расстояния между двумя игроками.



Skyline
14.07.2018, 10:54
Здравствуйте, есть ли стандартная функция которая проверяла бы расстояние между двумя игроками, нужна для команды /tazer.
Или же какая-то другая функция?

Нашел такой вариант:

forward Float:GetDistanceBetweenPlayers(u1, u2);
public Float:GetDistanceBetweenPlayers(u1, u2)
{
new Float:x1, Float:y1, Float:z1,
Float:x2, Float:y2, Float:z2;
if((0 == GetPlayerPos(u1, x1, y1, z1) || (0 == GetPlayerPos(u2, x2, y2, z2)))) return -1.00;
GetPlayerPos(u1, x1, y1, z1);
GetPlayerPos(u2, x2, y2, z2);
return VectorSize(x1-x2, y1-y2, z1-z2);
}

Как то оптимизировать или улучшить можно или есть другие варианты, например ProxDetectorS, подойдет ли?

VVWVV
14.07.2018, 11:42
Можно просто не вызывать GetPlayerPos повторно и вместо знаков '-' использовать floatsub. А зачем данная функция public? Может быть сделать её stock.

Skyline
14.07.2018, 11:48
Можно просто не вызывать GetPlayerPos повторно и вместо знаков '-' использовать floatsub. А зачем данная функция public? Может быть сделать её stock.

Сделал так, на работоспособность не проверял.

stock Float:GetDistanceBetweenPlayers(u1, u2)
{
new Float:x1, Float:y1, Float:z1,
Float:x2, Float:y2, Float:z2;
if((0 == GetPlayerPos(u1, x1, y1, z1) || (0 == GetPlayerPos(u2, x2, y2, z2)))) return -1.00;
return floatround(GetPlayerDistanceFromPoint(playerid, x2, y2, z2));
}

pawnoholic
14.07.2018, 12:40
stock IsPlayerNearPlayer(playerid, targetid, Float:radius)
{
new
Float:x,
Float:y,
Float:z
;
GetPlayerPos(playerid, x, y, z);

return (GetPlayerInterior(playerid) == GetPlayerInterior(targetid) && GetPlayerVirtualWorld(playerid) == GetPlayerVirtualWorld(targetid)) && IsPlayerInRangeOfPoint(targetid, radius, x, y, z);
}