This fixes the issues my patch has caused...

1) if I start without existing user config files, it crashes (current
player is NULL)
2) the m_remember_me variable is not used
3) if I understand the code correctly, it sets the current player to a
guest player to indicate that there is no current player atm (which is
then used to start the login window). If this correct, then it would be
better to indicate this by setting the current player to NULL. Reason is
that this way we can easily detect incorrect usage elsewhere (since we
will get a crash, instead of storing data in the guest player, and we
will only later detect that something was not saved as expected).
This commit is contained in:
Dimitrije Jankov
2014-02-28 10:23:09 +01:00
parent d0f93d3b98
commit 9fc0d5be77
5 changed files with 9 additions and 36 deletions

View File

@@ -86,18 +86,11 @@ void PlayerManager::load()
const XMLNode *player_xml = players->getNode(i);
PlayerProfile *player = new PlayerProfile(player_xml);
m_all_players.push_back(player);
if(player->isDefault()){
if(player->isDefault())
m_current_player = player;
}
}
m_all_players.insertionSort(/*start*/0, /*desc*/true);
if(!m_current_player) // if there is no default player assigned set the current player to guest
{
m_current_player = getGuestPlayer();
m_current_player->setDefault(true);
}
delete players;
} // load
@@ -192,24 +185,6 @@ const PlayerProfile *PlayerManager::getPlayerById(unsigned int id)
return NULL;
} // getPlayerById
PlayerProfile* PlayerManager::getGuestPlayer(){
PlayerProfile *player;
for_in(player, m_all_players)
{
if(player->isGuestAccount())
{
return player;
}
}
player = new PlayerProfile(_LTR("Guest"), /*guest*/true);
m_all_players.push_back( player );
return player;
}
// ----------------------------------------------------------------------------
PlayerProfile *PlayerManager::getPlayer(const irr::core::stringw &name)
{
@@ -228,9 +203,11 @@ void PlayerManager::setCurrentPlayer(PlayerProfile *player, bool remember_me)
if(m_current_player)
m_current_player->setDefault(false);
m_current_player = player;
m_current_player->setDefault(remember_me);
m_current_player->computeActive();
m_remember_me = false;
if(m_current_player)
{
m_current_player->setDefault(remember_me);
m_current_player->computeActive();
}
} // setCurrentPlayer
// ----------------------------------------------------------------------------

View File

@@ -47,7 +47,6 @@ private:
/** A pointer to the current player. */
PlayerProfile* m_current_player;
bool m_remember_me;
void load();
PlayerManager();
@@ -78,15 +77,11 @@ public:
void addNewPlayer(const irr::core::stringw& name);
void deletePlayer(PlayerProfile *player);
void setCurrentPlayer(PlayerProfile *player, bool remember_me);
void rememberCurrentPlayer(bool value) { m_remember_me = value; }
const PlayerProfile *getPlayerById(unsigned int id);
// ------------------------------------------------------------------------
/** Returns the current player. */
PlayerProfile* getCurrentPlayer() { return m_current_player; }
// ------------------------------------------------------------------------
/** Returns the guest player. */
PlayerProfile* getGuestPlayer();
// ------------------------------------------------------------------------
PlayerProfile *getPlayer(const irr::core::stringw &name);
// ------------------------------------------------------------------------
/** Returns the number of players in the config file.*/

View File

@@ -43,6 +43,7 @@ PlayerProfile::PlayerProfile(const core::stringw& name, bool is_guest)
m_use_frequency = is_guest ? -1 : 0;
m_unique_id = PlayerManager::get()->getUniqueId();
m_story_mode_status = unlock_manager->createStoryModeStatus();
m_is_default = false;
m_achievements_status =
AchievementsManager::get()->createAchievementsStatus();
} // PlayerProfile

View File

@@ -185,7 +185,7 @@ void OptionsScreenPlayers::eventCallback(Widget* widget, const std::string& name
else if (name == "playername")
{
race_manager->clearKartLastPositionOnOverworld();
PlayerManager::get()->setCurrentPlayer(PlayerManager::get()->getGuestPlayer(),false);
PlayerManager::get()->setCurrentPlayer(NULL,false);
StateManager::get()->pushScreen(StoryModeLobbyScreen::getInstance());
}

View File

@@ -56,7 +56,7 @@ void StoryModeLobbyScreen::init()
list->clear();
PlayerProfile *player = PlayerManager::get()->getCurrentPlayer();
if(!player->isGuestAccount())
if(player)
{
StateManager::get()->resetAndGoToScreen(MainMenuScreen::getInstance());
return;