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:
Benau
2015-12-02 10:08:03 +08:00
parent c910c19827
commit 084a4ee844
7 changed files with 55 additions and 15 deletions

View File

@@ -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())

View File

@@ -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;

View File

@@ -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);

View File

@@ -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
// -------------

View File

@@ -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;

View File

@@ -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();

View File

@@ -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);