09.03.2010, 11:54
Я тут немного потыкался, изобрел вот такую штуку. Может быть, не самое оптимизированное решение. Можно, например, прикрутить к Sniper Privilegy 
ZMapCheckLOS(Float
1, Float:y1, Float:z1, Float
2, Float:y2, Float:z2) - функция вычисляет, просматривается ли путь от точки 1 к точке 2 или нет. x1,y1,z1 и x2,y2,z2 - координаты точек 1 и 2 соответственно.
У остальных функций объяснение в названии (я их приложил только потому что они используются).

ZMapCheckLOS(Float
1, Float:y1, Float:z1, Float
2, Float:y2, Float:z2) - функция вычисляет, просматривается ли путь от точки 1 к точке 2 или нет. x1,y1,z1 и x2,y2,z2 - координаты точек 1 и 2 соответственно.У остальных функций объяснение в названии (я их приложил только потому что они используются).
Код:
stock ZMapCheckLOS(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2)
{
new Float: distance = GetDistanceBetweenPoints(x1, y1, z1, x2, y2, z1); // вычислить расстояние между точками в 2D
new Float: rotation = GetRotationBetweenPoints(x1, y1, x2, y2); // вычислить арктангенс между точками
new Float: z_per_meter = (z2 - z1) / distance; // это число = на сколько изменяется Z на каждый метр расстояния
new Float: sin = floatsin(-rotation, degrees);
new Float: cos = floatcos(-rotation, degrees);
new Float: check_dist = 0.0; // текущее расстояние пути проверки от точки 1 к точке 2
while(check_dist < distance)
{
check_dist += 1.0;
new Float:z_zmap;
ZMapFindZ(x1 + (check_dist * sin), y1 + (check_dist * cos), z_zmap);
// чтобы отследить визуально, где кончается "видимая" дистанция :)
// CreateObject(1559, x1 + (check_dist * sin), y1 + (check_dist * cos), z1 + (check_dist * z_per_meter), 0, 0, 0);
if(z1 + (check_dist * z_per_meter) < z_zmap)
{
return 0;
}
}
return 1;
}
stock Float:GetDistanceBetweenPoints(Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2)
{
x1 -= x2;
y1 -= y2;
z1 -= z2;
return floatsqroot((x1 * x1) + (y1 * y1) + (z1 * z1));
}
stock Float:GetRotationBetweenPoints(Float:x1, Float:y1, Float:x2, Float:y2)
return Float:(180-atan2(x1-x2,y1-y2));

