summaryrefslogtreecommitdiff
path: root/src/client/client.cpp
diff options
context:
space:
mode:
authorSmallJoker <mk939@ymail.com>2019-06-25 21:18:08 +0200
committerSmallJoker <mk939@ymail.com>2019-09-14 19:42:25 +0200
commit23677be951b4dc2b9cc174ceb92f0e0b8e8eb867 (patch)
tree87e8a9bee105bbe77d964e109d0cefd1102f07e7 /src/client/client.cpp
parent720aedb46740ba203b4a0f3e049e368abc4932b3 (diff)
downloadminetest-23677be951b4dc2b9cc174ceb92f0e0b8e8eb867.tar.gz
minetest-23677be951b4dc2b9cc174ceb92f0e0b8e8eb867.tar.bz2
minetest-23677be951b4dc2b9cc174ceb92f0e0b8e8eb867.zip
Load CSM environment after the restrictions are known
Safety-guards for CSM callbacks to abort on a bad implementation Only run callbacks when the mods are loaded (and with it: builtin) Duplication checks inside constructors
Diffstat (limited to 'src/client/client.cpp')
-rw-r--r--src/client/client.cpp35
1 files changed, 16 insertions, 19 deletions
diff --git a/src/client/client.cpp b/src/client/client.cpp
index 4c5485325..9535acc8e 100644
--- a/src/client/client.cpp
+++ b/src/client/client.cpp
@@ -108,15 +108,6 @@ Client::Client(
m_minimap = new Minimap(this);
}
m_cache_save_interval = g_settings->getU16("server_map_save_interval");
-
- m_modding_enabled = g_settings->getBool("enable_client_modding");
- // Only create the client script environment if client scripting is enabled by the
- // client.
- if (m_modding_enabled) {
- m_script = new ClientScripting(this);
- m_env.setScript(m_script);
- m_script->setEnv(&m_env);
- }
}
void Client::loadMods()
@@ -124,9 +115,8 @@ void Client::loadMods()
// Don't load mods twice.
// If client scripting is disabled by the client, don't load builtin or
// client-provided mods.
- if (m_mods_loaded || !m_modding_enabled) {
+ if (m_mods_loaded || !g_settings->getBool("enable_client_modding"))
return;
- }
// If client scripting is disabled by the server, don't load builtin or
// client-provided mods.
@@ -135,11 +125,13 @@ void Client::loadMods()
if (checkCSMRestrictionFlag(CSMRestrictionFlags::CSM_RF_LOAD_CLIENT_MODS)) {
warningstream << "Client-provided mod loading is disabled by server." <<
std::endl;
- // This line is needed because builtin is not loaded
- m_modding_enabled = false;
return;
}
+ m_script = new ClientScripting(this);
+ m_env.setScript(m_script);
+ m_script->setEnv(&m_env);
+
// Load builtin
scanModIntoMemory(BUILTIN_MOD_NAME, getBuiltinLuaPath());
m_script->loadModFromMemory(BUILTIN_MOD_NAME);
@@ -185,9 +177,15 @@ void Client::loadMods()
for (const ModSpec &mod : m_mods)
m_script->loadModFromMemory(mod.name);
+ // Mods are done loading. Unlock callbacks
+ m_mods_loaded = true;
+
// Run a callback when mods are loaded
m_script->on_mods_loaded();
- m_mods_loaded = true;
+ if (m_state == LC_Ready)
+ m_script->on_client_ready(m_env.getLocalPlayer());
+ if (m_camera)
+ m_script->on_camera_ready(m_camera);
}
bool Client::checkBuiltinIntegrity()
@@ -239,7 +237,7 @@ const ModSpec* Client::getModSpec(const std::string &modname) const
void Client::Stop()
{
m_shutdown = true;
- if (m_modding_enabled)
+ if (m_mods_loaded)
m_script->on_shutdown();
//request all client managed threads to stop
m_mesh_update_thread.stop();
@@ -249,7 +247,7 @@ void Client::Stop()
m_localdb->endSave();
}
- if (m_modding_enabled)
+ if (m_mods_loaded)
delete m_script;
}
@@ -1497,7 +1495,7 @@ void Client::typeChatMessage(const std::wstring &message)
return;
// If message was consumed by script API, don't send it to server
- if (m_modding_enabled && m_script->on_sending_message(wide_to_utf8(message)))
+ if (m_mods_loaded && m_script->on_sending_message(wide_to_utf8(message)))
return;
// Send to others
@@ -1693,9 +1691,8 @@ void Client::afterContentReceived()
m_state = LC_Ready;
sendReady();
- if (g_settings->getBool("enable_client_modding")) {
+ if (m_mods_loaded)
m_script->on_client_ready(m_env.getLocalPlayer());
- }
text = wgettext("Done!");
RenderingEngine::draw_load_screen(text, guienv, m_tsrc, 0, 100);