15.07.2012, 04:23
(
Последний раз редактировалось ipsBruno; 15.07.2012 в 05:55.
)
Quote:
why not if(n_mapAndreas > n_Z) ? |
Quote:
Problems with this pawn Code: MapAndreas_FindZ_For2DCoord(p_X, p_Y, p_mapAndreas); that is called pretty early in the movie... (should be called after the height check) |
![Tongue](images/smilies/razz.gif)
pawn Код:
enum info { Float:nX, Float:nY, Float:nZ };
new pathFind[MAX_ZUMBIS][info];
OnUpdate(playerid, npcid);
public OnUpdate(playerid, npcid) {
static
Float:p_X,
Float:p_Y,
Float:p_Z,
Float:n_X,
Float:n_Y,
Float:n_Z,
Float:n_A,
Float:b_A,
Float:p_mapAndreas,
Float:n_mapAndreas;
GetPlayerPos(playerid, p_X, p_Y, p_Z);
GetPlayerPos(npcid, n_X, n_Y, n_Z);
GetPlayerFacingAngle(npcid, n_A);
b_A = atan2(n_Y - p_Y, n_X - p_X);
if(pathFind[npcid][nX] == 0.0 && pathFind[npcid][nY] == 0.0) {
MoveRNPC(npcid, p_X, p_Y, p_Z, 0.0065);
n_X += (5.0 * floatsin(-n_A, degrees)),
n_Y += (5.0 * floatcos(-n_A, degrees));
MapAndreas_FindZ_For2DCoord(n_X, n_Y, n_mapAndreas);
if(n_mapAndreas - n_Z > 2.5) {
MapAndreas_FindZ_For2DCoord(p_X, p_Y, p_mapAndreas);
// possibility of have building on front off npcid
if( (p_Z != n_mapAndreas) && (n_mapAndreas != p_mapAndreas ) ) {
SendClientMessageToAll(-1, "I FIND BUILDING OF FRONT NPC"); //debug
// have building in front off player ..
static
Float:n_Deg, Float:b_X, Float:b_Y, Float:b_Z;
n_Deg = 0;
// round for find alternative path (right side) (made you left side :mrgreen:)
n_X -= (5.0 * floatsin(-n_A, degrees)),
n_Y -= (5.0 * floatcos(-n_A, degrees));
while(n_Deg < 90.0) {
n_Deg += 4.5;
// here right, left side.
// need fix (working +- haha :p)
if(b_A > 180.0) {
b_X = n_X + (10.0 * floatsin(-n_A-n_Deg, degrees)),
b_Y = n_Y + (10.0 * floatcos(-n_A-n_Deg, degrees));
}
else {
b_X = n_X + (10.0 * floatsin(-n_A+n_Deg, degrees)),
b_Y = n_Y + (10.0 * floatcos(-n_A+n_Deg, degrees));
}
MapAndreas_FindZ_For2DCoord(b_X, b_Y, b_Z);
if(p_mapAndreas != b_Z) {
SendClientMessageToAll(-1, "I FIND ALTERNATIVE PATH");
MoveRNPC(npcid, b_X, b_Y, p_mapAndreas, 0.0065);
pathFind[npcid][nX] = b_X;
pathFind[npcid][nY] = b_Y;
pathFind[npcid][nZ] = b_Z;
}
}
}
}
}
else {
if(IsPlayerInRangeOfPoint(npcid, 1.0, pathFind[npcid][nX], pathFind[npcid][nY], pathFind[npcid][nZ])) {
pathFind[npcid][nX] = 0.0;
pathFind[npcid][nY] = 0.0;
pathFind[npcid][nZ] = 0.0;
MoveRNPC(npcid, p_X, p_Y, p_Z, 0.0115);
}
}
return true;
}
![](/imageshack/Himg88/scaled.php?server=88&filename=12066985.png&res=landing)
I'm thinking of something interesting. On putting +90-90 it create a triangle:
The invalid path is hypotenuse and the "adjacent" side will always be the new path (interestingly, it is this part, is the size of the construction ..
![Tongue](images/smilies/razz.gif)
I tested a lot, it works with buildings. The problem is that if the NPC is under one roof and the player not. The NPC BUG, or stairs for example
![undecided](images/smilies/neutral.gif)
The algorithm is correct, but there are exceptions in San Andreas. I think one way to deal with these exceptions, is to check a given area is a building.
For checking a point is a building. I think we do four points and check MapAndreas Z POS, if the same Z POS in four points. Yes, is a building
Example:
PHP код:
static
Float:4points,
i,
Float:zPoint;
for(i = 0; i != 4; i++) {
pontoX = edificioX + (5.0 * floatsin(-90.0 * i, degrees)),
pontoY = edificioY +(5.0 * floatcos(-90.0 * i, degrees));
MapAndreas_FindZ_For2DCoord(pontoX, pontoY, zPoint);
4points += zPoint;
}
if(floatround(4points) % 90 == 0) {
// 4 points have the same MapAndreas Z Pos
// x
// x x
// x
// 5 * 4 = 20 metters
}