mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-03-24 22:43:47 +00:00
Add warning when loading a savegame that depends on non-existing content files (Fixes #2261)
This commit is contained in:
parent
579f5d232f
commit
f9227beedd
@ -146,10 +146,11 @@ namespace MWGui
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int MessageBoxManager::readPressedButton ()
|
int MessageBoxManager::readPressedButton (bool reset)
|
||||||
{
|
{
|
||||||
int pressed = mLastButtonPressed;
|
int pressed = mLastButtonPressed;
|
||||||
mLastButtonPressed = -1;
|
if (reset)
|
||||||
|
mLastButtonPressed = -1;
|
||||||
return pressed;
|
return pressed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,7 +33,8 @@ namespace MWGui
|
|||||||
|
|
||||||
bool removeMessageBox (MessageBox *msgbox);
|
bool removeMessageBox (MessageBox *msgbox);
|
||||||
|
|
||||||
int readPressedButton ();
|
/// @param reset Reset the pressed button to -1 after reading it.
|
||||||
|
int readPressedButton (bool reset=true);
|
||||||
|
|
||||||
typedef MyGUI::delegates::CMultiDelegate1<int> EventHandle_Int;
|
typedef MyGUI::delegates::CMultiDelegate1<int> EventHandle_Int;
|
||||||
|
|
||||||
|
@ -607,7 +607,7 @@ namespace MWGui
|
|||||||
// GM_Loading uses a texture of the last rendered frame so everything previously visible will be rendered.
|
// GM_Loading uses a texture of the last rendered frame so everything previously visible will be rendered.
|
||||||
mHud->setVisible(false);
|
mHud->setVisible(false);
|
||||||
mToolTips->setVisible(false);
|
mToolTips->setVisible(false);
|
||||||
setCursorVisible(false);
|
setCursorVisible(mMessageBoxManager && mMessageBoxManager->isInteractiveMessageBox());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// Unsupported mode, switch back to game
|
// Unsupported mode, switch back to game
|
||||||
@ -813,9 +813,10 @@ namespace MWGui
|
|||||||
|
|
||||||
if (block)
|
if (block)
|
||||||
{
|
{
|
||||||
while (mMessageBoxManager->readPressedButton() == -1
|
while (mMessageBoxManager->readPressedButton(false) == -1
|
||||||
&& !MWBase::Environment::get().getStateManager()->hasQuitRequest())
|
&& !MWBase::Environment::get().getStateManager()->hasQuitRequest())
|
||||||
{
|
{
|
||||||
|
mMessageBoxManager->onFrame(0.f);
|
||||||
MWBase::Environment::get().getInputManager()->update(0, true, false);
|
MWBase::Environment::get().getInputManager()->update(0, true, false);
|
||||||
|
|
||||||
mRendering->getWindow()->update();
|
mRendering->getWindow()->update();
|
||||||
|
@ -353,6 +353,12 @@ void MWState::StateManager::loadGame (const Character *character, const std::str
|
|||||||
{
|
{
|
||||||
ESM::SavedGame profile;
|
ESM::SavedGame profile;
|
||||||
profile.load(reader);
|
profile.load(reader);
|
||||||
|
if (!verifyProfile(profile))
|
||||||
|
{
|
||||||
|
cleanup (true);
|
||||||
|
MWBase::Environment::get().getWindowManager()->pushGuiMode (MWGui::GM_MainMenu);
|
||||||
|
return;
|
||||||
|
}
|
||||||
mTimePlayed = profile.mTimePlayed;
|
mTimePlayed = profile.mTimePlayed;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -517,3 +523,30 @@ void MWState::StateManager::update (float duration)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MWState::StateManager::verifyProfile(const ESM::SavedGame& profile) const
|
||||||
|
{
|
||||||
|
const std::vector<std::string>& selectedContentFiles = MWBase::Environment::get().getWorld()->getContentFiles();
|
||||||
|
bool notFound = false;
|
||||||
|
for (std::vector<std::string>::const_iterator it = profile.mContentFiles.begin();
|
||||||
|
it != profile.mContentFiles.end(); ++it)
|
||||||
|
{
|
||||||
|
if (std::find(selectedContentFiles.begin(), selectedContentFiles.end(), *it)
|
||||||
|
== selectedContentFiles.end())
|
||||||
|
{
|
||||||
|
notFound = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (notFound)
|
||||||
|
{
|
||||||
|
std::vector<std::string> buttons;
|
||||||
|
buttons.push_back("#{sYes}");
|
||||||
|
buttons.push_back("#{sNo}");
|
||||||
|
MWBase::Environment::get().getWindowManager()->interactiveMessageBox("#{sMissingMastersMsg}", buttons, true);
|
||||||
|
int selectedButton = MWBase::Environment::get().getWindowManager()->readPressedButton();
|
||||||
|
if (selectedButton == 1 || selectedButton == -1)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
@ -23,6 +23,8 @@ namespace MWState
|
|||||||
|
|
||||||
void cleanup (bool force = false);
|
void cleanup (bool force = false);
|
||||||
|
|
||||||
|
bool verifyProfile (const ESM::SavedGame& profile) const;
|
||||||
|
|
||||||
std::map<int, int> buildContentFileIndexMap (const ESM::ESMReader& reader) const;
|
std::map<int, int> buildContentFileIndexMap (const ESM::ESMReader& reader) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
<MyGUI type="Layout">
|
<MyGUI type="Layout">
|
||||||
<Widget type="Window" skin="MW_Dialog" layer="Windows" position="0 0 500 400" name="_Main">
|
<Widget type="Window" skin="MW_Dialog" layer="MessageBox" position="0 0 500 400" name="_Main">
|
||||||
<Widget type="EditBox" skin="MW_TextEditClient" position="10 10 490 20" align="Left Top Stretch" name="message">
|
<Widget type="EditBox" skin="MW_TextEditClient" position="10 10 490 20" align="Left Top Stretch" name="message">
|
||||||
<Property key="FontName" value="Default"/>
|
<Property key="FontName" value="Default"/>
|
||||||
<Property key="TextAlign" value="Center"/>
|
<Property key="TextAlign" value="Center"/>
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
<Layer name="Popup" overlapped="true" peek="true"/>
|
<Layer name="Popup" overlapped="true" peek="true"/>
|
||||||
<Layer name="DragAndDrop" overlapped="false" peek="false"/>
|
<Layer name="DragAndDrop" overlapped="false" peek="false"/>
|
||||||
<Layer name="LoadingScreen" overlapped="false" peek="true"/>
|
<Layer name="LoadingScreen" overlapped="false" peek="true"/>
|
||||||
|
<Layer name="MessageBox" overlapped="false" peek="true"/>
|
||||||
<Layer name="Overlay" overlapped="false" peek="true"/>
|
<Layer name="Overlay" overlapped="false" peek="true"/>
|
||||||
<Layer name="Pointer" overlapped="false" peek="false"/>
|
<Layer name="Pointer" overlapped="false" peek="false"/>
|
||||||
</MyGUI>
|
</MyGUI>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user