]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/client.cpp
Use server's zoom fov for distant world loading.
[dragonfireclient.git] / src / client.cpp
index bca9f41d04b827da051fa3cf12485168eb817b3f..d2f585de7a11b60699c19466980f190bfb81959e 100644 (file)
@@ -28,7 +28,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "network/networkpacket.h"
 #include "threading/mutex_auto_lock.h"
 #include "client/clientevent.h"
+#include "client/gameui.h"
 #include "client/renderingengine.h"
+#include "client/sound.h"
+#include "client/tile.h"
 #include "util/auth.h"
 #include "util/directiontables.h"
 #include "util/pointedthing.h"
@@ -40,7 +43,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mapblock.h"
 #include "minimap.h"
 #include "modchannels.h"
-#include "mods.h"
+#include "content/mods.h"
 #include "profiler.h"
 #include "shader.h"
 #include "gettext.h"
@@ -69,11 +72,11 @@ Client::Client(
                IWritableTextureSource *tsrc,
                IWritableShaderSource *shsrc,
                IWritableItemDefManager *itemdef,
-               IWritableNodeDefManager *nodedef,
+               NodeDefManager *nodedef,
                ISoundManager *sound,
                MtEventManager *event,
                bool ipv6,
-               GameUIFlags *game_ui_flags
+               GameUI *game_ui
 ):
        m_tsrc(tsrc),
        m_shsrc(shsrc),
@@ -95,7 +98,7 @@ Client::Client(
        m_chosen_auth_mech(AUTH_MECHANISM_NONE),
        m_media_downloader(new ClientMediaDownloader()),
        m_state(LC_Created),
-       m_game_ui_flags(game_ui_flags),
+       m_game_ui(game_ui),
        m_modchannel_mgr(new ModChannelMgr())
 {
        // Add local player
@@ -112,18 +115,38 @@ Client::Client(
        m_script->setEnv(&m_env);
 }
 
-void Client::loadMods()
+void Client::loadBuiltin()
 {
        // Load builtin
        scanModIntoMemory(BUILTIN_MOD_NAME, getBuiltinLuaPath());
 
-       // If modding is not enabled, don't load mods, just builtin
+       m_script->loadModFromMemory(BUILTIN_MOD_NAME);
+}
+
+void Client::loadMods()
+{
+       // Don't permit to load mods twice
+       if (m_mods_loaded) {
+               return;
+       }
+
+       // If modding is not enabled or flavour disable it, don't load mods, just builtin
        if (!m_modding_enabled) {
+               warningstream << "Client side mods are disabled by configuration." << std::endl;
+               return;
+       }
+
+       if (checkCSMFlavourLimit(CSMFlavourLimit::CSM_FL_LOAD_CLIENT_MODS)) {
+               warningstream << "Client side mods are disabled by server." << std::endl;
+               // If mods loading is disabled and builtin integrity is wrong, disconnect user.
+               if (!checkBuiltinIntegrity()) {
+                       // @TODO disconnect user
+               }
                return;
        }
+
        ClientModConfiguration modconf(getClientModsLuaPath());
        m_mods = modconf.getMods();
-       std::vector<ModSpec> unsatisfied_mods = modconf.getUnsatisfiedMods();
        // complain about mods with unsatisfied dependencies
        if (!modconf.isConsistent()) {
                modconf.printUnsatisfiedModsError();
@@ -144,6 +167,18 @@ void Client::loadMods()
                }
                scanModIntoMemory(mod.name, mod.path);
        }
+
+       // Load and run "mod" scripts
+       for (const ModSpec &mod : m_mods)
+               m_script->loadModFromMemory(mod.name);
+
+       m_mods_loaded = true;
+}
+
+bool Client::checkBuiltinIntegrity()
+{
+       // @TODO
+       return true;
 }
 
 void Client::scanModSubfolder(const std::string &mod_name, const std::string &mod_path,
@@ -163,20 +198,6 @@ void Client::scanModSubfolder(const std::string &mod_name, const std::string &mo
        }
 }
 
-void Client::initMods()
-{
-       m_script->loadModFromMemory(BUILTIN_MOD_NAME);
-
-       // If modding is not enabled, don't load mods, just builtin
-       if (!m_modding_enabled) {
-               return;
-       }
-
-       // Load and run "mod" scripts
-       for (const ModSpec &mod : m_mods)
-               m_script->loadModFromMemory(mod.name);
-}
-
 const std::string &Client::getBuiltinLuaPath()
 {
        static const std::string builtin_dir = porting::path_share + DIR_DELIM + "builtin";
@@ -263,14 +284,9 @@ void Client::connect(Address address, bool is_local_server)
 void Client::step(float dtime)
 {
        // Limit a bit
-       if(dtime > 2.0)
+       if (dtime > 2.0)
                dtime = 2.0;
 
-       if(m_ignore_damage_timer > dtime)
-               m_ignore_damage_timer -= dtime;
-       else
-               m_ignore_damage_timer = 0.0;
-
        m_animation_time += dtime;
        if(m_animation_time > 60.0)
                m_animation_time -= 60.0;
@@ -303,6 +319,10 @@ void Client::step(float dtime)
                initial_step = false;
        }
        else if(m_state == LC_Created) {
+               if (m_is_registration_confirmation_state) {
+                       // Waiting confirmation
+                       return;
+               }
                float &counter = m_connection_reinit_timer;
                counter -= dtime;
                if(counter <= 0.0) {
@@ -393,18 +413,16 @@ void Client::step(float dtime)
                ClientEnvEvent envEvent = m_env.getClientEnvEvent();
 
                if (envEvent.type == CEE_PLAYER_DAMAGE) {
-                       if (m_ignore_damage_timer <= 0) {
-                               u8 damage = envEvent.player_damage.amount;
+                       u8 damage = envEvent.player_damage.amount;
 
-                               if (envEvent.player_damage.send_to_server)
-                                       sendDamage(damage);
+                       if (envEvent.player_damage.send_to_server)
+                               sendDamage(damage);
 
-                               // Add to ClientEvent queue
-                               ClientEvent *event = new ClientEvent();
-                               event->type = CE_PLAYER_DAMAGE;
-                               event->player_damage.amount = damage;
-                               m_client_event_queue.push(event);
-                       }
+                       // Add to ClientEvent queue
+                       ClientEvent *event = new ClientEvent();
+                       event->type = CE_PLAYER_DAMAGE;
+                       event->player_damage.amount = damage;
+                       m_client_event_queue.push(event);
                }
        }
 
@@ -505,21 +523,18 @@ void Client::step(float dtime)
                the local inventory (so the player notices the lag problem
                and knows something is wrong).
        */
-       if(m_inventory_from_server)
-       {
-               float interval = 10.0;
-               float count_before = floor(m_inventory_from_server_age / interval);
+       if (m_inventory_from_server) {
+               float interval = 10.0f;
+               float count_before = std::floor(m_inventory_from_server_age / interval);
 
                m_inventory_from_server_age += dtime;
 
-               float count_after = floor(m_inventory_from_server_age / interval);
+               float count_after = std::floor(m_inventory_from_server_age / interval);
 
-               if(count_after != count_before)
-               {
+               if (count_after != count_before) {
                        // Do this every <interval> seconds after TOCLIENT_INVENTORY
                        // Reset the locally changed inventory to the authoritative inventory
-                       LocalPlayer *player = m_env.getLocalPlayer();
-                       player->inventory = *m_inventory_from_server;
+                       m_env.getLocalPlayer()->inventory = *m_inventory_from_server;
                        m_inventory_updated = true;
                }
        }
@@ -961,6 +976,18 @@ void Client::sendInit(const std::string &playerName)
        Send(&pkt);
 }
 
+void Client::promptConfirmRegistration(AuthMechanism chosen_auth_mechanism)
+{
+       m_chosen_auth_mech = chosen_auth_mechanism;
+       m_is_registration_confirmation_state = true;
+}
+
+void Client::confirmRegistration()
+{
+       m_is_registration_confirmation_state = false;
+       startAuth(m_chosen_auth_mech);
+}
+
 void Client::startAuth(AuthMechanism chosen_auth_mechanism)
 {
        m_chosen_auth_mech = chosen_auth_mechanism;
@@ -1643,9 +1670,8 @@ void Client::afterContentReceived()
        text = wgettext("Initializing nodes...");
        RenderingEngine::draw_load_screen(text, guienv, m_tsrc, 0, 72);
        m_nodedef->updateAliases(m_itemdef);
-       std::string texture_path = g_settings->get("texture_path");
-       if (!texture_path.empty() && fs::IsDir(texture_path))
-               m_nodedef->applyTextureOverrides(texture_path + DIR_DELIM + "override.txt");
+       for (const auto &path : getTextureDirs())
+               m_nodedef->applyTextureOverrides(path + DIR_DELIM + "override.txt");
        m_nodedef->setNodeRegistrationStatus(true);
        m_nodedef->runNodeResolveCallbacks();
        delete[] text;
@@ -1670,7 +1696,6 @@ void Client::afterContentReceived()
 
        if (g_settings->getBool("enable_client_modding")) {
                m_script->on_client_ready(m_env.getLocalPlayer());
-               m_script->on_connect();
        }
 
        text = wgettext("Done!");
@@ -1760,34 +1785,9 @@ void Client::pushToEventQueue(ClientEvent *event)
        m_client_event_queue.push(event);
 }
 
-void Client::showGameChat(const bool show)
-{
-       m_game_ui_flags->show_chat = show;
-}
-
-void Client::showGameHud(const bool show)
-{
-       m_game_ui_flags->show_hud = show;
-}
-
 void Client::showMinimap(const bool show)
 {
-       m_game_ui_flags->show_minimap = show;
-}
-
-void Client::showProfiler(const bool show)
-{
-       m_game_ui_flags->show_profiler_graph = show;
-}
-
-void Client::showGameFog(const bool show)
-{
-       m_game_ui_flags->force_fog_off = !show;
-}
-
-void Client::showGameDebug(const bool show)
-{
-       m_game_ui_flags->show_debug = show;
+       m_game_ui->showMinimap(show);
 }
 
 // IGameDef interface
@@ -1796,7 +1796,7 @@ IItemDefManager* Client::getItemDefManager()
 {
        return m_itemdef;
 }
-INodeDefManager* Client::getNodeDefManager()
+const NodeDefManager* Client::getNodeDefManager()
 {
        return m_nodedef;
 }
@@ -1836,7 +1836,7 @@ ParticleManager* Client::getParticleManager()
        return &m_particle_manager;
 }
 
-scene::IAnimatedMesh* Client::getMesh(const std::string &filename)
+scene::IAnimatedMesh* Client::getMesh(const std::string &filename, bool cache)
 {
        StringMap::const_iterator it = m_mesh_data.find(filename);
        if (it == m_mesh_data.end()) {
@@ -1855,10 +1855,9 @@ scene::IAnimatedMesh* Client::getMesh(const std::string &filename)
 
        scene::IAnimatedMesh *mesh = RenderingEngine::get_scene_manager()->getMesh(rfile);
        rfile->drop();
-       // NOTE: By playing with Irrlicht refcounts, maybe we could cache a bunch
-       // of uniquely named instances and re-use them
        mesh->grab();
-       RenderingEngine::get_mesh_cache()->removeMesh(mesh);
+       if (!cache)
+               RenderingEngine::get_mesh_cache()->removeMesh(mesh);
        return mesh;
 }