CSM: Don't create the client script environment if CSM is disabled (#7874)

Use the CSM death formspec when CSM is enabled and use the engine death formspec when CSM is disabled.
Move the CSM death formspec code to a dedicated file.
This commit is contained in:
Paramat 2018-11-24 10:41:11 +00:00 committed by GitHub
parent a969635322
commit 2e37ee9565
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 87 additions and 51 deletions

@ -0,0 +1,16 @@
-- CSM death formspec. Only used when clientside modding is enabled, otherwise
-- handled by the engine.
core.register_on_death(function()
core.display_chat_message("You died.")
local formspec = "size[11,5.5]bgcolor[#320000b4;true]" ..
"label[4.85,1.35;" .. fgettext("You died") ..
"]button_exit[4,3;3,0.5;btn_respawn;".. fgettext("Respawn") .."]"
core.show_formspec("bultin:death", formspec)
end)
core.register_on_formspec_input(function(formname, fields)
if formname == "bultin:death" then
core.send_respawn()
end
end)

@ -8,16 +8,4 @@ dofile(commonpath .. "after.lua")
dofile(commonpath .. "chatcommands.lua") dofile(commonpath .. "chatcommands.lua")
dofile(clientpath .. "chatcommands.lua") dofile(clientpath .. "chatcommands.lua")
dofile(commonpath .. "vector.lua") dofile(commonpath .. "vector.lua")
dofile(clientpath .. "death_formspec.lua")
core.register_on_death(function()
core.display_chat_message("You died.")
local formspec = "size[11,5.5]bgcolor[#320000b4;true]" ..
"label[4.85,1.35;" .. fgettext("You died.") .. "]button_exit[4,3;3,0.5;btn_respawn;".. fgettext("Respawn") .."]"
core.show_formspec("bultin:death", formspec)
end)
core.register_on_formspec_input(function(formname, fields)
if formname == "bultin:death" then
core.send_respawn()
end
end)

@ -110,36 +110,37 @@ Client::Client(
m_cache_save_interval = g_settings->getU16("server_map_save_interval"); m_cache_save_interval = g_settings->getU16("server_map_save_interval");
m_modding_enabled = g_settings->getBool("enable_client_modding"); m_modding_enabled = g_settings->getBool("enable_client_modding");
// Only create the client script environment if client modding is enabled
if (m_modding_enabled) {
m_script = new ClientScripting(this); m_script = new ClientScripting(this);
m_env.setScript(m_script); m_env.setScript(m_script);
m_script->setEnv(&m_env); m_script->setEnv(&m_env);
} }
void Client::loadBuiltin()
{
// Load builtin
scanModIntoMemory(BUILTIN_MOD_NAME, getBuiltinLuaPath());
m_script->loadModFromMemory(BUILTIN_MOD_NAME);
} }
void Client::loadMods() void Client::loadMods()
{ {
// Don't permit to load mods twice // Don't load mods twice
if (m_mods_loaded) { if (m_mods_loaded) {
return; return;
} }
// If modding is not enabled or CSM restrictions disable it // If client modding is not enabled, don't load client-provided CSM mods or
// don't load CSM mods, only builtin // builtin.
if (!m_modding_enabled) { if (!m_modding_enabled) {
warningstream << "Client side mods are disabled by configuration." << std::endl; warningstream << "Client side mods are disabled by configuration." << std::endl;
return; return;
} }
// Load builtin
scanModIntoMemory(BUILTIN_MOD_NAME, getBuiltinLuaPath());
m_script->loadModFromMemory(BUILTIN_MOD_NAME);
// If the server has disabled client-provided CSM mod loading, don't load
// client-provided CSM mods. Builtin is loaded so needs verfying.
if (checkCSMRestrictionFlag(CSMRestrictionFlags::CSM_RF_LOAD_CLIENT_MODS)) { if (checkCSMRestrictionFlag(CSMRestrictionFlags::CSM_RF_LOAD_CLIENT_MODS)) {
warningstream << "Client side mods are disabled by server." << std::endl; warningstream << "Client side mods are disabled by server." << std::endl;
// If mods loading is disabled and builtin integrity is wrong, disconnect user. // If builtin integrity is wrong, disconnect user
if (!checkBuiltinIntegrity()) { if (!checkBuiltinIntegrity()) {
// @TODO disconnect user // @TODO disconnect user
} }
@ -227,7 +228,7 @@ const ModSpec* Client::getModSpec(const std::string &modname) const
void Client::Stop() void Client::Stop()
{ {
m_shutdown = true; m_shutdown = true;
// Don't disable this part when modding is disabled, it's used in builtin if (m_modding_enabled)
m_script->on_shutdown(); m_script->on_shutdown();
//request all client managed threads to stop //request all client managed threads to stop
m_mesh_update_thread.stop(); m_mesh_update_thread.stop();
@ -237,6 +238,7 @@ void Client::Stop()
m_localdb->endSave(); m_localdb->endSave();
} }
if (m_modding_enabled)
delete m_script; delete m_script;
} }
@ -1491,10 +1493,9 @@ void Client::typeChatMessage(const std::wstring &message)
if (message.empty()) if (message.empty())
return; return;
// If message was ate by script API, don't send it to server // If message was consumed by script API, don't send it to server
if (m_script->on_sending_message(wide_to_utf8(message))) { if (m_modding_enabled && m_script->on_sending_message(wide_to_utf8(message)))
return; return;
}
// Send to others // Send to others
sendChatMessage(message); sendChatMessage(message);

@ -141,7 +141,6 @@ public:
DISABLE_CLASS_COPY(Client); DISABLE_CLASS_COPY(Client);
// Load local mods into memory // Load local mods into memory
void loadBuiltin();
void scanModSubfolder(const std::string &mod_name, const std::string &mod_path, void scanModSubfolder(const std::string &mod_name, const std::string &mod_path,
std::string mod_subpath); std::string mod_subpath);
inline void scanModIntoMemory(const std::string &mod_name, const std::string &mod_path) inline void scanModIntoMemory(const std::string &mod_name, const std::string &mod_path)
@ -400,6 +399,7 @@ public:
ClientScripting *getScript() { return m_script; } ClientScripting *getScript() { return m_script; }
const bool moddingEnabled() const { return m_modding_enabled; } const bool moddingEnabled() const { return m_modding_enabled; }
const bool modsLoaded() const { return m_mods_loaded; }
void pushToEventQueue(ClientEvent *event); void pushToEventQueue(ClientEvent *event);

@ -233,14 +233,14 @@ void ClientEnvironment::step(float dtime)
u8 damage = (u8)MYMIN(damage_f + 0.5, 255); u8 damage = (u8)MYMIN(damage_f + 0.5, 255);
if (damage != 0) { if (damage != 0) {
damageLocalPlayer(damage, true); damageLocalPlayer(damage, true);
m_client->getEventManager()->put(new SimpleTriggerEvent(MtEvent::PLAYER_FALLING_DAMAGE)); m_client->getEventManager()->put(
new SimpleTriggerEvent(MtEvent::PLAYER_FALLING_DAMAGE));
} }
} }
} }
if (m_client->moddingEnabled()) { if (m_client->modsLoaded())
m_script->environment_step(dtime); m_script->environment_step(dtime);
}
// Update lighting on local player (used for wield item) // Update lighting on local player (used for wield item)
u32 day_night_ratio = getDayNightRatio(); u32 day_night_ratio = getDayNightRatio();

@ -177,8 +177,13 @@ struct LocalFormspecHandler : public TextDest
} }
} }
// Don't disable this part when modding is disabled, it's used in builtin if (m_formname == "MT_DEATH_SCREEN") {
if (m_client && m_client->getScript()) assert(m_client != 0);
m_client->sendRespawn();
return;
}
if (m_client && m_client->moddingEnabled())
m_client->getScript()->on_formspec_input(m_formname, fields); m_client->getScript()->on_formspec_input(m_formname, fields);
} }
@ -775,6 +780,7 @@ private:
bool disable_camera_update = false; bool disable_camera_update = false;
}; };
void showDeathFormspec();
void showPauseMenu(); void showPauseMenu();
// ClientEvent handlers // ClientEvent handlers
@ -1496,8 +1502,6 @@ bool Game::connectToServer(const std::string &playername,
fps_control.last_time = RenderingEngine::get_timer_time(); fps_control.last_time = RenderingEngine::get_timer_time();
client->loadBuiltin();
while (RenderingEngine::run()) { while (RenderingEngine::run()) {
limitFps(&fps_control, &dtime); limitFps(&fps_control, &dtime);
@ -1882,7 +1886,10 @@ void Game::processKeyInput()
} else if (wasKeyDown(KeyType::CMD)) { } else if (wasKeyDown(KeyType::CMD)) {
openConsole(0.2, L"/"); openConsole(0.2, L"/");
} else if (wasKeyDown(KeyType::CMD_LOCAL)) { } else if (wasKeyDown(KeyType::CMD_LOCAL)) {
if (client->moddingEnabled())
openConsole(0.2, L"."); openConsole(0.2, L".");
else
m_game_ui->showStatusText(wgettext("CSM is disabled"));
} else if (wasKeyDown(KeyType::CONSOLE)) { } else if (wasKeyDown(KeyType::CONSOLE)) {
openConsole(core::clamp(g_settings->getFloat("console_height"), 0.1f, 1.0f)); openConsole(core::clamp(g_settings->getFloat("console_height"), 0.1f, 1.0f));
} else if (wasKeyDown(KeyType::FREEMOVE)) { } else if (wasKeyDown(KeyType::FREEMOVE)) {
@ -2532,12 +2539,15 @@ void Game::handleClientEvent_PlayerForceMove(ClientEvent *event, CameraOrientati
void Game::handleClientEvent_Deathscreen(ClientEvent *event, CameraOrientation *cam) void Game::handleClientEvent_Deathscreen(ClientEvent *event, CameraOrientation *cam)
{ {
// This should be enabled for death formspec in builtin // If CSM enabled, deathscreen is handled by CSM code in
// builtin/client/init.lua
if (client->moddingEnabled())
client->getScript()->on_death(); client->getScript()->on_death();
else
LocalPlayer *player = client->getEnv().getLocalPlayer(); showDeathFormspec();
/* Handle visualization */ /* Handle visualization */
LocalPlayer *player = client->getEnv().getLocalPlayer();
runData.damage_flash = 0; runData.damage_flash = 0;
player->hurt_tilt_timer = 0; player->hurt_tilt_timer = 0;
player->hurt_tilt_strength = 0; player->hurt_tilt_strength = 0;
@ -4006,6 +4016,27 @@ void Game::extendedResourceCleanup()
<< " (note: irrlicht doesn't support removing renderers)" << std::endl; << " (note: irrlicht doesn't support removing renderers)" << std::endl;
} }
void Game::showDeathFormspec()
{
static std::string formspec =
std::string(FORMSPEC_VERSION_STRING) +
SIZE_TAG
"bgcolor[#320000b4;true]"
"label[4.85,1.35;" + gettext("You died") + "]"
"button_exit[4,3;3,0.5;btn_respawn;" + gettext("Respawn") + "]"
;
/* Create menu */
/* Note: FormspecFormSource and LocalFormspecHandler *
* are deleted by guiFormSpecMenu */
FormspecFormSource *fs_src = new FormspecFormSource(formspec);
LocalFormspecHandler *txt_dst = new LocalFormspecHandler("MT_DEATH_SCREEN", client);
GUIFormSpecMenu::create(current_formspec, client, &input->joystick, fs_src,
txt_dst, client->getFormspecPrepend());
current_formspec->setFocus("btn_respawn");
}
#define GET_KEY_NAME(KEY) gettext(getKeySetting(#KEY).name()) #define GET_KEY_NAME(KEY) gettext(getKeySetting(#KEY).name())
void Game::showPauseMenu() void Game::showPauseMenu()
{ {

@ -384,12 +384,12 @@ void Client::handleCommand_ChatMessage(NetworkPacket *pkt)
chatMessage->type = (ChatMessageType) message_type; chatMessage->type = (ChatMessageType) message_type;
// @TODO send this to CSM using ChatMessage object // @TODO send this to CSM using ChatMessage object
if (!moddingEnabled() || !m_script->on_receiving_message( if (moddingEnabled() && m_script->on_receiving_message(
wide_to_utf8(chatMessage->message))) { wide_to_utf8(chatMessage->message))) {
pushToChatQueue(chatMessage); // Message was consumed by CSM and should not be handled by client
} else {
// Message was consumed by CSM and should not handled by client, destroying
delete chatMessage; delete chatMessage;
} else {
pushToChatQueue(chatMessage);
} }
} }