Prevent server from starting if there's bad world linkage
This commit is contained in:
parent
cb28aaface
commit
d8861da599
15
src/Root.cpp
15
src/Root.cpp
@ -327,6 +327,17 @@ void cRoot::Start(std::unique_ptr<cSettingsRepositoryInterface> a_OverridesRepo)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cRoot::StopServer()
|
||||||
|
{
|
||||||
|
m_TerminateEventRaised = true;
|
||||||
|
m_StopEvent.Set();
|
||||||
|
m_InputThreadRunFlag.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cRoot::LoadGlobalSettings()
|
void cRoot::LoadGlobalSettings()
|
||||||
{
|
{
|
||||||
// Nothing needed yet
|
// Nothing needed yet
|
||||||
@ -597,9 +608,7 @@ void cRoot::ExecuteConsoleCommand(const AString & a_Cmd, cCommandOutputCallback
|
|||||||
// Some commands are built-in:
|
// Some commands are built-in:
|
||||||
if (a_Cmd == "stop")
|
if (a_Cmd == "stop")
|
||||||
{
|
{
|
||||||
m_TerminateEventRaised = true;
|
StopServer();
|
||||||
m_StopEvent.Set();
|
|
||||||
m_InputThreadRunFlag.clear();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (a_Cmd == "restart")
|
else if (a_Cmd == "restart")
|
||||||
|
@ -57,6 +57,9 @@ public:
|
|||||||
|
|
||||||
void Start(std::unique_ptr<cSettingsRepositoryInterface> a_OverridesRepo);
|
void Start(std::unique_ptr<cSettingsRepositoryInterface> a_OverridesRepo);
|
||||||
|
|
||||||
|
/** Stops the server, as if "/stop" was typed in the console. */
|
||||||
|
void StopServer();
|
||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
cServer * GetServer(void) { return m_Server; }
|
cServer * GetServer(void) { return m_Server; }
|
||||||
cWorld * GetDefaultWorld(void);
|
cWorld * GetDefaultWorld(void);
|
||||||
@ -66,6 +69,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
cWorld * GetWorld(const AString & a_WorldName, bool a_SearchForFolder = false);
|
cWorld * GetWorld(const AString & a_WorldName, bool a_SearchForFolder = false);
|
||||||
|
|
||||||
|
|
||||||
/** Returns a pointer to a world of specified name - will search loaded worlds first, then create anew if not found
|
/** Returns a pointer to a world of specified name - will search loaded worlds first, then create anew if not found
|
||||||
The dimension parameter is used to create a world with a specific dimension
|
The dimension parameter is used to create a world with a specific dimension
|
||||||
a_OverworldName should be set for non-overworld dimensions if one wishes that world to link back to an overworld via portals
|
a_OverworldName should be set for non-overworld dimensions if one wishes that world to link back to an overworld via portals
|
||||||
|
@ -520,6 +520,40 @@ void cWorld::Start(void)
|
|||||||
m_LinkedOverworldName = IniFile.GetValueSet("LinkedWorlds", "OverworldName", GetLinkedOverworldName());
|
m_LinkedOverworldName = IniFile.GetValueSet("LinkedWorlds", "OverworldName", GetLinkedOverworldName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we are linked to one or more worlds that do not exist, ask the server to stop.
|
||||||
|
AString BadWorlds = "";
|
||||||
|
cRoot * Root = cRoot::Get();
|
||||||
|
if (GetDimension() == dimOverworld)
|
||||||
|
{
|
||||||
|
if ((!m_LinkedNetherWorldName.empty()) && (Root->GetWorld(m_LinkedNetherWorldName) == nullptr))
|
||||||
|
{
|
||||||
|
BadWorlds = m_LinkedNetherWorldName;
|
||||||
|
}
|
||||||
|
if ((!m_LinkedEndWorldName.empty()) && (Root->GetWorld(m_LinkedEndWorldName) == nullptr))
|
||||||
|
{
|
||||||
|
if (!(BadWorlds.empty()))
|
||||||
|
{
|
||||||
|
BadWorlds += ", ";
|
||||||
|
}
|
||||||
|
BadWorlds += m_LinkedEndWorldName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((!m_LinkedOverworldName.empty()) && (Root->GetWorld(m_LinkedOverworldName) == nullptr))
|
||||||
|
{
|
||||||
|
BadWorlds = m_LinkedOverworldName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!BadWorlds.empty())
|
||||||
|
{
|
||||||
|
const char * WorldName = m_WorldName.c_str();
|
||||||
|
LOGERROR("\n######\nERROR: %s is linked to one or more invalid worlds: %s\nPlease edit %s/world.ini and fix this.\n######\n",
|
||||||
|
WorldName, BadWorlds.c_str(), WorldName);
|
||||||
|
cRoot::Get()->StopServer();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Adjust the enum-backed variables into their respective bounds:
|
// Adjust the enum-backed variables into their respective bounds:
|
||||||
m_GameMode = static_cast<eGameMode> (Clamp<int>(GameMode, gmSurvival, gmSpectator));
|
m_GameMode = static_cast<eGameMode> (Clamp<int>(GameMode, gmSurvival, gmSpectator));
|
||||||
m_TNTShrapnelLevel = static_cast<eShrapnelLevel>(Clamp<int>(TNTShrapnelLevel, slNone, slAll));
|
m_TNTShrapnelLevel = static_cast<eShrapnelLevel>(Clamp<int>(TNTShrapnelLevel, slNone, slAll));
|
||||||
|
Loading…
Reference in New Issue
Block a user