Fix crashes when no navmesh
User should have no way to start with ai in battle mode, when the arena has no navmesh. Unless artist debug mode or more than 1 human players.
This commit is contained in:
@@ -136,7 +136,7 @@ void BattleAI::update(float dt)
|
||||
m_controls->m_nitro = false;
|
||||
|
||||
// Don't do anything if there is currently a kart animations shown.
|
||||
if(m_kart->getKartAnimation())
|
||||
if (m_kart->getKartAnimation())
|
||||
return;
|
||||
|
||||
if (m_world->isStartPhase())
|
||||
|
||||
@@ -294,8 +294,10 @@ void ThreeStrikesBattle::update(float dt)
|
||||
WorldWithRank::update(dt);
|
||||
WorldWithRank::updateTrack(dt);
|
||||
|
||||
updateKartNodes(); // insert blown away tire(s) now if was requested
|
||||
if (m_track->hasNavMesh())
|
||||
updateKartNodes();
|
||||
|
||||
// insert blown away tire(s) now if was requested
|
||||
while (m_insert_tire > 0)
|
||||
{
|
||||
std::string tire;
|
||||
|
||||
@@ -100,7 +100,9 @@ void ArenasScreen::beforeAddingWidget()
|
||||
}
|
||||
else
|
||||
{
|
||||
if(temp->isArena())
|
||||
if(temp->isArena() && (temp->hasNavMesh() ||
|
||||
race_manager->getNumLocalPlayers() > 1 ||
|
||||
UserConfigParams::m_artist_debug_mode))
|
||||
num_of_arenas++;
|
||||
}
|
||||
}
|
||||
@@ -215,6 +217,7 @@ void ArenasScreen::buildTrackList()
|
||||
const std::string curr_group_name = tabs->getSelectionIDString(0);
|
||||
|
||||
bool soccer_mode = race_manager->getMinorMode() == RaceManager::MINOR_MODE_SOCCER;
|
||||
bool arenas_have_navmesh = false;
|
||||
|
||||
if (curr_group_name == ALL_ARENA_GROUPS_ID)
|
||||
{
|
||||
@@ -229,7 +232,14 @@ void ArenasScreen::buildTrackList()
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!curr->isArena()) continue;
|
||||
if(curr->isArena() && curr->hasNavMesh() && !arenas_have_navmesh)
|
||||
arenas_have_navmesh = true;
|
||||
|
||||
if(!curr->isArena() ||
|
||||
(!(curr->hasNavMesh() ||
|
||||
race_manager->getNumLocalPlayers() > 1 ||
|
||||
UserConfigParams::m_artist_debug_mode)))
|
||||
continue;
|
||||
}
|
||||
|
||||
if (PlayerManager::getCurrentPlayer()->isLocked(curr->getIdent()))
|
||||
@@ -259,7 +269,14 @@ void ArenasScreen::buildTrackList()
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!curr->isArena()) continue;
|
||||
if(curr->isArena() && curr->hasNavMesh() && !arenas_have_navmesh)
|
||||
arenas_have_navmesh = true;
|
||||
|
||||
if(!curr->isArena() ||
|
||||
(!(curr->hasNavMesh() ||
|
||||
race_manager->getNumLocalPlayers() > 1 ||
|
||||
UserConfigParams::m_artist_debug_mode)))
|
||||
continue;
|
||||
}
|
||||
|
||||
if (PlayerManager::getCurrentPlayer()->isLocked(curr->getIdent()))
|
||||
@@ -274,7 +291,9 @@ void ArenasScreen::buildTrackList()
|
||||
}
|
||||
}
|
||||
}
|
||||
w->addItem(_("Random Arena"), "random_track", "/gui/track_random.png");
|
||||
if (arenas_have_navmesh || race_manager->getNumLocalPlayers() > 1 ||
|
||||
UserConfigParams::m_artist_debug_mode)
|
||||
w->addItem(_("Random Arena"), "random_track", "/gui/track_random.png");
|
||||
w->updateItemDisplay();
|
||||
|
||||
assert(w->getItems().size() > 0);
|
||||
|
||||
@@ -143,7 +143,9 @@ void TrackInfoScreen::init()
|
||||
|
||||
// Number of AIs
|
||||
// -------------
|
||||
const bool has_AI = race_manager->hasAI();
|
||||
const bool has_AI =
|
||||
(race_manager->getMinorMode() == RaceManager::MINOR_MODE_3_STRIKES ?
|
||||
m_track->hasNavMesh() : race_manager->hasAI());
|
||||
m_ai_kart_spinner->setVisible(has_AI);
|
||||
getWidget<LabelWidget>("ai-text")->setVisible(has_AI);
|
||||
if (has_AI)
|
||||
@@ -172,6 +174,8 @@ void TrackInfoScreen::init()
|
||||
m_ai_kart_spinner->setMin(0);
|
||||
|
||||
} // has_AI
|
||||
else
|
||||
race_manager->setNumKarts(race_manager->getNumLocalPlayers());
|
||||
|
||||
// Reverse track
|
||||
// -------------
|
||||
|
||||
@@ -41,11 +41,6 @@ NavMesh::NavMesh(const std::string &filename)
|
||||
m_n_polys=0;
|
||||
|
||||
XMLNode *xml = file_manager->createXMLTree(filename);
|
||||
if(!xml || xml->getName()!="navmesh")
|
||||
{
|
||||
Log::error("NavMesh", "NavMesh '%s' not found. \n", filename.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
// Assigning m_nav_mesh here because constructing NavPoly requires m_nav_mesh to be defined
|
||||
m_nav_mesh = this;
|
||||
|
||||
@@ -116,6 +116,7 @@ Track::Track(const std::string &filename)
|
||||
m_reverse_available = false;
|
||||
m_is_arena = false;
|
||||
m_has_easter_eggs = false;
|
||||
m_has_navmesh = false;
|
||||
m_is_soccer = false;
|
||||
m_is_cutscene = false;
|
||||
m_camera_far = 1000.0f;
|
||||
@@ -583,6 +584,18 @@ void Track::loadTrackInfo()
|
||||
}
|
||||
delete easter;
|
||||
}
|
||||
|
||||
XMLNode *navmesh = file_manager->createXMLTree(m_root+"navmesh.xml");
|
||||
|
||||
if(!navmesh || navmesh->getName()!="navmesh")
|
||||
{
|
||||
Log::warn("Track", "NavMesh is not found for this arena, "
|
||||
"disable AI for it.\n");
|
||||
}
|
||||
else
|
||||
m_has_navmesh = true;
|
||||
delete navmesh;
|
||||
|
||||
} // loadTrackInfo
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -715,7 +728,8 @@ void Track::loadQuadGraph(unsigned int mode_id, const bool reverse)
|
||||
*/
|
||||
void Track::loadBattleGraph()
|
||||
{
|
||||
BattleGraph::create(m_root+"navmesh.xml");
|
||||
if (m_has_navmesh)
|
||||
BattleGraph::create(m_root+"navmesh.xml");
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
@@ -1830,7 +1844,8 @@ void Track::loadTrackModel(bool reverse_track, unsigned int mode_id)
|
||||
// Battle Graph needs ItemManager to be created, and all items to be
|
||||
// added to ItemManager. Loading battle graph here is therefore a workaround
|
||||
// to the main problem.
|
||||
if (m_is_arena && !m_is_soccer && !m_is_cutscene) loadBattleGraph();
|
||||
if (m_is_arena && !m_is_soccer && !m_is_cutscene && m_has_navmesh)
|
||||
loadBattleGraph();
|
||||
|
||||
if (UserConfigParams::m_track_debug &&
|
||||
race_manager->getMinorMode()!=RaceManager::MINOR_MODE_3_STRIKES &&
|
||||
@@ -1839,7 +1854,7 @@ void Track::loadTrackModel(bool reverse_track, unsigned int mode_id)
|
||||
QuadGraph::get()->createDebugMesh();
|
||||
}
|
||||
|
||||
if (UserConfigParams::m_track_debug &&
|
||||
if (UserConfigParams::m_track_debug && m_has_navmesh &&
|
||||
race_manager->getMinorMode()==RaceManager::MINOR_MODE_3_STRIKES &&
|
||||
!m_is_cutscene)
|
||||
BattleGraph::get()->createDebugMesh();
|
||||
|
||||
@@ -206,6 +206,8 @@ private:
|
||||
bool m_is_arena;
|
||||
/** True if this track has easter eggs. */
|
||||
bool m_has_easter_eggs;
|
||||
/** True if this track has navmesh. */
|
||||
bool m_has_navmesh;
|
||||
/** True if this track is a soccer arena. */
|
||||
bool m_is_soccer;
|
||||
|
||||
@@ -442,6 +444,9 @@ public:
|
||||
/** Returns true if this track has easter eggs. */
|
||||
bool hasEasterEggs() const { return m_has_easter_eggs; }
|
||||
// ------------------------------------------------------------------------
|
||||
/** Returns true if this track navmesh. */
|
||||
bool hasNavMesh() const { return m_has_navmesh; }
|
||||
// ------------------------------------------------------------------------
|
||||
void loadObjects(const XMLNode* root, const std::string& path,
|
||||
ModelDefinitionLoader& lod_loader, bool create_lod_definitions,
|
||||
scene::ISceneNode* parent, TrackObject* parent_library);
|
||||
|
||||
Reference in New Issue
Block a user