I'm trying to figure out how to do pathfinding over the network and I'm not having any luck so far. I found this nice thread and post where you could supposedly get the navmesh points. I threw together a project using it but my tests weren't too promising. The problem is that if the character is going fast enough, he'll miss points entirely, kind of acting like it's drunk, making all but the start and end points useless for network prediction/interpolation. Here's the video:
The red markers represent all the points that FindPath returns (10 points + beginning and end). Note that I'm only using GoToPoint once. I have a feeling that FindPath only works for the default speed (and perhaps acceleration). Here's the code:
#include "Leadwerks.h"
using namespace Leadwerks;
Entity* player = NULL;
Entity* navpointbox[100];
int main(int argc, const char *argv[])
{
int j=0;
Leadwerks::Window* window = Leadwerks::Window::Create("Navmesh Point Test", 0, 0, 1280, 720);
Context* context = Context::Create(window);
World* world = World::Create();
Camera* camera = Camera::Create();
camera->SetRotation(65, 0, 0);
camera->Move(0, -2, -12);
Light* light = DirectionalLight::Create();
light->SetRotation(35, 35, 0);
Map::Load("Maps/map.map");
NavMesh* navMesh = world->navmesh;
//Enable navmesh debugging
// camera->SetDebugNavigationMode(true);
// Start: -15.0, -2
// End: 9, 7
//Create a character
player = Pivot::Create();
Entity* visiblecapsule = Model::Cylinder(16, player);
visiblecapsule->SetScale(1, 2, 1);
visiblecapsule->SetPosition(0, 1, 0);
player->SetPosition(-15, 0, 2);
player->SetMass(1);
player->SetPhysicsMode(Entity::CharacterPhysics);
while(true)
{
if(window->Closed() || window->KeyDown(Key::Escape)) return false;
if(window->KeyHit(Key::Space))
{
player->GoToPoint(9, 0, 7, 10.0, 5);
// player->GoToPoint(9, 0, 7, 5.0, 5);
NavPath* path = new NavPath();
vector<Vec3> pathpoints;
path->navmesh = navMesh;
path->navmesh->FindPath(player->GetPosition(true), Vec3(9, 0, 7), pathpoints);
for(std::vector<Vec3>::iterator it = pathpoints.begin(); it != pathpoints.end(); ++it)
{
std::cout << "Point: " << it->x << ", " << it->z << endl;
navpointbox[j] = Model::Box();
navpointbox[j]->SetColor(1.0, 0.0, 0.0);
navpointbox[j]->SetScale(0.3, 1.0, 0.3);
navpointbox[j]->SetPosition(it->x, 0.5, it->z);
j++;
}
}
Leadwerks::Time::Update();
world->Update();
world->Render();
context->Sync();
}
return 0;
}
So, is there a way to get ALL the ACTUAL points the character will walk through (not just markers it might miss anyway)? Meaning, if a host lags for a second, I want the client to know exactly where the character should be at any given time.
If this can't be done for Leadwerks 4, maybe we could have a FindPathPoint in Leadwerks 5 that returns a Vec3 at a given time. I understand that a character could be pushed out of the way or whatever too so it won't be 100% reliable.