18.06.2013, 10:06
pawn Код:
#define ACCURACY 0.5 // lower the number more accurate the result
stock IsThereLOS(Float:point1[3], Float:point2[3])
{
new Float: vector[3];
new Float: dpoint[3];
dpoint[0] = point2[0];
dpoint[1] = point2[1];
dpoint[2] = point2[2];
new Float:konst;
do
{
vector[0] = point1[0]-dpoint[0];
vector[1] = point1[1]-dpoint[1];
vector[2] = point1[2]-dpoint[2];
konst = ACCURACY/floatsqroot(vector[0]*vector[0]+vector[1]*vector[1]+vector[2]*vector[2]);
vector[0] = konst*vector[0];
vector[1] = konst*vector[1];
vector[2] = konst*vector[2];
dpoint[0] = dpoint[0]+vector[0];
dpoint[1] = dpoint[1]+vector[1];
dpoint[2] = dpoint[2]+vector[2];
new Float:zpoint;
GetPointZPos(dpoint[0],dpoint[1], zpoint);
//CreateObject(19130,dpoint[0],dpoint[1],zpoint+0.5,0.0,0.0,0.0);
//CreateObject(19130,dpoint[0],dpoint[1],dpoint[2]+0.5,0.0,0.0,0.0);
//printf("%.2f | %.2f",dpoint[2], zpoint);
if(dpoint[2] < zpoint) return 0;
}while(konst<1);
return 1;
}
How does it work?
For every x,y,z that is on vector going from point1 to point2 it checks for real Z coordinate. If the real Z coordinate is bigger than Z coordinate of x,y on than vector it means that there is an obstacle between the two points.
NOTE
Since this uses MapAndreas it has the same drawbacks.