PDA

Просмотр полной версии : [Вопрос] PathFinder



Long-
30.12.2016, 21:03
Всем здравствуйте, сегодня начал изучение PathFinder , PathFinder использую для точного пути ботов FCNPC , но вот беда пришла ни одна.
Раньше использовал MapAndreas там у меня работало все, но все равно через малый угол/малый объект проходил, мне подсказали лучше для этого дела использовать PathFinder для более точного пути.

Я сразу начал изучение, все сделал, но вот беда, он бежит через объект, не могу понять почему, через любой объект.
Хотя я еще сделал построение пикапов по пути, они правильно располагаются, а вот бот бежит через объект, почему?
Прикреплю скиншот.

https://pp.vk.me/c836232/v836232635/24e17/PSxTKUv7fVQ.jpg

Как видно пикапы построились отлично, а вот бот как видно на мини-карте побежал сквозь объект :\

Несколько кодов:


CMD:smbot(playerid, params[])
{
new
name[MAX_PLAYER_NAME],
Float:player_pos_x,
Float:player_pos_y,
Float:player_pos_z;

GetPlayerPos(playerid, x, y, z);

static result = 1;

format(name, sizeof name, "Test_%d", ++result);

new npc = FCNPC_Create(name);
FCNPC_Spawn(npc, 53, x, y, z);
FCNPC_SetAngle(npc, 180);
NPC_TEST_BOT = npc;

return 1;
}


CMD:pathtest(playerid, params[])
{
new
Float:bot_pos_x,
Float:bot_pos_y,
Float:bot_pos_z;

FCNPC_GetPosition(NPC_TEST_BOT, bot_pos_x, bot_pos_y, bot_pos_z);

PathFinder_FindWay(0, bot_pos_x, bot_pos_y, point[playerid][0], point[playerid][1], 0.9);
return 1;
}


public OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)
{
point[playerid][0] = fX;
point[playerid][1] = fY;
point[playerid][2] = fZ;
format(text, sizeof(text), "%f %f %f", point[playerid][0], point[playerid][1], point[playerid][2]);
SendClientMessageToAll(-1, text);
return 1;
}


public OnPathCalculated(routeid, success, Float:nodesX[], Float:nodesY[], Float:nodesZ[], nodesSize)
{
format(text, sizeof(text), "PATH: route: %d success: %d nodesSize: %d", routeid, success, nodesSize);
SendClientMessageToAll(-1, text);
if(success)
{
for(new i; i < nodesSize; i++)
{
FCNPC_GoTo(NPC_TEST_BOT, nodesX[i], nodesY[i], nodesZ[i] + 1, MOVE_TYPE_SPRINT, 30, 1);
CreateDynamicObject(19130, nodesX[i], nodesY[i], nodesZ[i] + 1, 0, 0, 0);
}
Streamer_Update(0);
}
return 1;
}

ziggi
30.12.2016, 21:26
Потому что ты выполняешь FCNPC_GoTo сразу для всех найденных точек, поэтому бот идёт к последней.

Можно сделать так:

public OnPathCalculated(routeid, success, Float:nodesX[], Float:nodesY[], Float:nodesZ[], nodesSize)
{
format(text, sizeof(text), "PATH: route: %d success: %d nodesSize: %d", routeid, success, nodesSize);
SendClientMessageToAll(-1, text);
if(success)
{
new move_path = FCNPC_CreateMovePath();
for(new i; i < nodesSize; i++)
{
FCNPC_AddPointToPath(move_path, nodesX[i], nodesY[i], nodesZ[i] + 1);
CreateDynamicObject(19130, nodesX[i], nodesY[i], nodesZ[i] + 1, 0, 0, 0);
}
Streamer_Update(0);
FCNPC_GoByMovePath(NPC_TEST_BOT, move_path, MOVE_TYPE_SPRINT, 30.0, true);
FCNPC_DestroyMovePath(move_path);
}
return 1;
}

Long-
30.12.2016, 21:30
Потому что ты выполняешь FCNPC_GoTo сразу для всех найденных точек, поэтому бот идёт к последней.

Можно сделать так:

public OnPathCalculated(routeid, success, Float:nodesX[], Float:nodesY[], Float:nodesZ[], nodesSize)
{
format(text, sizeof(text), "PATH: route: %d success: %d nodesSize: %d", routeid, success, nodesSize);
SendClientMessageToAll(-1, text);
if(success)
{
new move_path = FCNPC_CreateMovePath();
for(new i; i < nodesSize; i++)
{
FCNPC_AddPointToPath(move_path, nodesX[i], nodesY[i], nodesZ[i] + 1);
CreateDynamicObject(19130, nodesX[i], nodesY[i], nodesZ[i] + 1, 0, 0, 0);
}
Streamer_Update(0);
FCNPC_GoByMovePath(NPC_TEST_BOT, move_path, MOVE_TYPE_SPRINT, 30.0, true);
FCNPC_DestroyMovePath(move_path);
}
return 1;
}

Тю, блин точно, код был не обязателен, сам бы сделал, но спасибо сократил мне время)
Точно, пикапы же ставились с каждой итерацией на определенную точку, а бот пойдет к последней, блин как я сам то не додумался, спасибо)

Закрыто.
А как тут закрыть тему?)):blush2:

P.S а где ты взял такие функции(FCNPC_CreateMovePath)!?
В обычном плагине такой функции нет.

Osetin
30.12.2016, 21:40
Тю, блин точно, код был не обязателен, сам бы сделал, но спасибо сократил мне время)
Точно, пикапы же ставились с каждой итерацией на определенную точку, а бот пойдет к последней, блин как я сам то не додумался, спасибо)

Закрыто.
А как тут закрыть тему?)):blush2:

P.S а где ты взял такие функции(FCNPC_CreateMovePath)!?
В обычном плагине такой функции нет.

Над первым постом - Управление > Закрыть тему.

Закрыто.