X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fclient.cpp;h=d2f585de7a11b60699c19466980f190bfb81959e;hb=a1868e8f6ca191edc03da342fd7c3088732e1b00;hp=bca9f41d04b827da051fa3cf12485168eb817b3f;hpb=20a85d76d94c9c5c7fbe198c3d0e1fbee97a485f;p=dragonfireclient.git diff --git a/src/client.cpp b/src/client.cpp index bca9f41d0..d2f585de7 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -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 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 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; }