WaypointInterface* AIPluginInterface::CreateWaypointNoDuplicates(const osg::Vec3& pos, float radius, const dtDAL::ObjectType& type) { WaypointInterface* result = GetClosestWaypoint(pos, radius); if(result == NULL) { result = CreateWaypoint(pos, type); } return result; }
void NPC::CalculateNewWaypoint() { int old_wp = cur_wp; bool reached_end = false; bool reached_beginning = false; if (cur_wp == max_wp) reached_end = true; if (cur_wp == 0) reached_beginning = true; switch(wandertype) { case 0: //circle { if (reached_end) cur_wp = 0; else cur_wp = cur_wp + 1; break; } case 1: //10 closest { std::list<wplist> closest; GetClosestWaypoint(closest, 10, glm::vec3(GetPosition())); std::list<wplist>::iterator iter = closest.begin(); if(closest.size() != 0) { iter = closest.begin(); std::advance(iter, zone->random.Int(0, closest.size() - 1)); cur_wp = (*iter).index; } break; } case 2: //random { cur_wp = zone->random.Int(0, Waypoints.size() - 1); if(cur_wp == old_wp) { if(cur_wp == (Waypoints.size() - 1)) { if(cur_wp > 0) { cur_wp--; } } else if(cur_wp == 0) { if((Waypoints.size() - 1) > 0) { cur_wp++; } } } break; } case 3: //patrol { if(reached_end) patrol = 1; else if(reached_beginning) patrol = 0; if(patrol == 1) cur_wp = cur_wp - 1; else cur_wp = cur_wp + 1; break; } case 4: //goto the end and depop with spawn timer case 6: //goto the end and depop without spawn timer { cur_wp = cur_wp + 1; break; } case 5: //pick random closest 5 and pick one that's in sight { std::list<wplist> closest; GetClosestWaypoint(closest, 5, glm::vec3(GetPosition())); std::list<wplist>::iterator iter = closest.begin(); while(iter != closest.end()) { if(CheckLosFN((*iter).x, (*iter).y, (*iter).z, GetSize())) { ++iter; } else { iter = closest.erase(iter); } } if(closest.size() != 0) { iter = closest.begin(); std::advance(iter, zone->random.Int(0, closest.size() - 1)); cur_wp = (*iter).index; } break; } } tar_ndx = 52; // Preserve waypoint setting for quest controlled NPCs if (cur_wp < 0) cur_wp = old_wp; // Check to see if we need to update the waypoint. if (cur_wp != old_wp) UpdateWaypoint(cur_wp); }