09.03.2010, 11:54
Я тут немного потыкался, изобрел вот такую штуку. Может быть, не самое оптимизированное решение. Можно, например, прикрутить к Sniper Privilegy ![Smiley](images/smilies/smile.png)
ZMapCheckLOS(Float
1, Float:y1, Float:z1, Float
2, Float:y2, Float:z2) - функция вычисляет, просматривается ли путь от точки 1 к точке 2 или нет. x1,y1,z1 и x2,y2,z2 - координаты точек 1 и 2 соответственно.
У остальных функций объяснение в названии (я их приложил только потому что они используются).
![Smiley](images/smilies/smile.png)
ZMapCheckLOS(Float
![angry](images/smilies/mad.gif)
![angry](images/smilies/mad.gif)
У остальных функций объяснение в названии (я их приложил только потому что они используются).
Код:
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));