]> git.lizzy.rs Git - minetest.git/blobdiff - src/client/client.h
Add minetest.get_player_window_information() (#12367)
[minetest.git] / src / client / client.h
index 10608ccf92d1888f333d498c30b3919e3f38a022..5ed5c6e9a28a2f77bd50c3429c0d160810ae4b52 100644 (file)
@@ -37,7 +37,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mesh_generator_thread.h"
 #include "network/address.h"
 #include "network/peerhandler.h"
+#include "gameparams.h"
+#include "clientdynamicinfo.h"
 #include <fstream>
+#include "util/numeric.h"
 
 #define CLIENT_CHAT_MESSAGE_LIMIT_PER_10S 10.0f
 
@@ -45,6 +48,7 @@ struct ClientEvent;
 struct MeshMakeData;
 struct ChatMessage;
 class MapBlockMesh;
+class RenderingEngine;
 class IWritableTextureSource;
 class IWritableShaderSource;
 class IWritableItemDefManager;
@@ -52,6 +56,7 @@ class ISoundManager;
 class NodeDefManager;
 //class IWritableCraftDefManager;
 class ClientMediaDownloader;
+class SingleMediaDownloader;
 struct MapDrawControl;
 class ModChannelMgr;
 class MtEventManager;
@@ -82,34 +87,24 @@ class PacketCounter
 
        void add(u16 command)
        {
-               std::map<u16, u16>::iterator n = m_packets.find(command);
-               if(n == m_packets.end())
-               {
+               auto n = m_packets.find(command);
+               if (n == m_packets.end())
                        m_packets[command] = 1;
-               }
                else
-               {
                        n->second++;
-               }
        }
 
        void clear()
        {
-               for (auto &m_packet : m_packets) {
-                       m_packet.second = 0;
-               }
+               m_packets.clear();
        }
 
-       void print(std::ostream &o)
-       {
-               for (const auto &m_packet : m_packets) {
-                       o << "cmd "<< m_packet.first <<" count "<< m_packet.second << std::endl;
-               }
-       }
+       u32 sum() const;
+       void print(std::ostream &o) const;
 
 private:
        // command, count
-       std::map<u16, u16> m_packets;
+       std::map<u16, u32> m_packets;
 };
 
 class ClientScripting;
@@ -133,8 +128,10 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
                        NodeDefManager *nodedef,
                        ISoundManager *sound,
                        MtEventManager *event,
+                       RenderingEngine *rendering_engine,
                        bool ipv6,
-                       GameUI *game_ui
+                       GameUI *game_ui,
+                       ELoginRegister allow_login_or_register
        );
 
        ~Client();
@@ -218,6 +215,9 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
        void handleCommand_HudSetFlags(NetworkPacket* pkt);
        void handleCommand_HudSetParam(NetworkPacket* pkt);
        void handleCommand_HudSetSky(NetworkPacket* pkt);
+       void handleCommand_HudSetSun(NetworkPacket* pkt);
+       void handleCommand_HudSetMoon(NetworkPacket* pkt);
+       void handleCommand_HudSetStars(NetworkPacket* pkt);
        void handleCommand_CloudParams(NetworkPacket* pkt);
        void handleCommand_OverrideDayNightRatio(NetworkPacket* pkt);
        void handleCommand_LocalPlayerAnimations(NetworkPacket* pkt);
@@ -229,6 +229,9 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
        void handleCommand_FormspecPrepend(NetworkPacket *pkt);
        void handleCommand_CSMRestrictionFlags(NetworkPacket *pkt);
        void handleCommand_PlayerSpeed(NetworkPacket *pkt);
+       void handleCommand_MediaPush(NetworkPacket *pkt);
+       void handleCommand_MinimapModes(NetworkPacket *pkt);
+       void handleCommand_SetLighting(NetworkPacket *pkt);
 
        void ProcessData(NetworkPacket *pkt);
 
@@ -248,6 +251,8 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
        void sendDamage(u16 damage);
        void sendRespawn();
        void sendReady();
+       void sendHaveMedia(const std::vector<u32> &tokens);
+       void sendUpdateClientInfo(const ClientDynamicInfo &info);
 
        ClientEnvironment& getEnv() { return m_env; }
        ITextureSource *tsrc() { return getTextureSource(); }
@@ -311,7 +316,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
        void addUpdateMeshTaskForNode(v3s16 nodepos, bool ack_to_server=false, bool urgent=false);
 
        void updateCameraOffset(v3s16 camera_offset)
-       { m_mesh_update_thread.m_camera_offset = camera_offset; }
+       { m_mesh_update_manager.m_camera_offset = camera_offset; }
 
        bool hasClientEvents() const { return !m_client_event_queue.empty(); }
        // Get event from queue. If queue is empty, it triggers an assertion failure.
@@ -326,31 +331,33 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
                m_access_denied = true;
                m_access_denied_reason = reason;
        }
+       inline void setFatalError(const LuaError &e)
+       {
+               setFatalError(std::string("Lua: ") + e.what());
+       }
 
        // Renaming accessDeniedReason to better name could be good as it's used to
        // disconnect client when CSM failed.
        const std::string &accessDeniedReason() const { return m_access_denied_reason; }
 
-       const bool itemdefReceived() const
+       bool itemdefReceived() const
        { return m_itemdef_received; }
-       const bool nodedefReceived() const
+       bool nodedefReceived() const
        { return m_nodedef_received; }
-       const bool mediaReceived() const
+       bool mediaReceived() const
        { return !m_media_downloader; }
-       const bool activeObjectsReceived() const
+       bool activeObjectsReceived() const
        { return m_activeobjects_received; }
 
        u16 getProtoVersion()
        { return m_proto_ver; }
 
-       bool connectedToServer();
-       void confirmRegistration();
-       bool m_is_registration_confirmation_state = false;
        bool m_simple_singleplayer_mode;
 
        float mediaReceiveProgress();
 
        void afterContentReceived();
+       void showUpdateProgressTexture(void *args, u32 progress, u32 max_progress);
 
        float getRTT();
        float getCurRate();
@@ -359,6 +366,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
        void setCamera(Camera* camera) { m_camera = camera; }
 
        Camera* getCamera () { return m_camera; }
+       scene::ISceneManager *getSceneManager();
 
        bool shouldShowMinimap() const;
 
@@ -367,7 +375,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
        const NodeDefManager* getNodeDefManager() override;
        ICraftDefManager* getCraftDefManager() override;
        ITextureSource* getTextureSource();
-       virtual IShaderSource* getShaderSource();
+       virtual IWritableShaderSource* getShaderSource();
        u16 allocateUnknownNodeId(const std::string &name) override;
        virtual ISoundManager* getSoundManager();
        MtEventManager* getEventManager();
@@ -376,14 +384,16 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
        { return checkPrivilege(priv); }
        virtual scene::IAnimatedMesh* getMesh(const std::string &filename, bool cache = false);
        const std::string* getModFile(std::string filename);
+       ModStorageDatabase *getModStorageDatabase() override { return m_mod_storage_database; }
 
-       std::string getModStoragePath() const override;
-       bool registerModStorage(ModMetadata *meta) override;
-       void unregisterModStorage(const std::string &name) override;
+       // Migrates away old files-based mod storage if necessary
+       void migrateModStorage();
 
        // The following set of functions is used by ClientMediaDownloader
        // Insert a media file appropriately into the appropriate manager
-       bool loadMedia(const std::string &data, const std::string &filename);
+       bool loadMedia(const std::string &data, const std::string &filename,
+               bool from_media_push = false);
+
        // Send a request for conventional media transfer
        void request_media(const std::vector<std::string> &file_requests);
 
@@ -397,7 +407,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
        }
 
        ClientScripting *getScript() { return m_script; }
-       const bool modsLoaded() const { return m_mods_loaded; }
+       bool modsLoaded() const { return m_mods_loaded; }
 
        void pushToEventQueue(ClientEvent *event);
 
@@ -420,16 +430,6 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
                return m_csm_restriction_flags & flag;
        }
 
-       u32 getCSMNodeRangeLimit() const
-       {
-               return m_csm_restriction_noderange;
-       }
-
-       inline std::unordered_map<u32, u32> &getHUDTranslationMap()
-       {
-               return m_hud_server_to_client;
-       }
-
        bool joinModChannel(const std::string &channel) override;
        bool leaveModChannel(const std::string &channel) override;
        bool sendModChannelMessage(const std::string &channel,
@@ -440,9 +440,13 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
        {
                return m_env.getLocalPlayer()->formspec_prepend;
        }
+       inline MeshGrid getMeshGrid()
+       {
+               return m_mesh_grid;
+       }
+
 private:
        void loadMods();
-       bool checkBuiltinIntegrity();
 
        // Virtual methods from con::PeerHandler
        void peerAdded(con::Peer *peer) override;
@@ -461,7 +465,6 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
        static AuthMechanism choseAuthMech(const u32 mechs);
 
        void sendInit(const std::string &playerName);
-       void promptConfirmRegistration(AuthMechanism chosen_auth_mechanism);
        void startAuth(AuthMechanism chosen_auth_mechanism);
        void sendDeletedBlocks(std::vector<v3s16> &blocks);
        void sendGotBlocks(const std::vector<v3s16> &blocks);
@@ -485,16 +488,19 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
        NodeDefManager *m_nodedef;
        ISoundManager *m_sound;
        MtEventManager *m_event;
+       RenderingEngine *m_rendering_engine;
 
 
-       MeshUpdateThread m_mesh_update_thread;
+       MeshUpdateManager m_mesh_update_manager;
        ClientEnvironment m_env;
        ParticleManager m_particle_manager;
        std::unique_ptr<con::Connection> m_con;
        std::string m_address_name;
+       ELoginRegister m_allow_login_or_register = ELoginRegister::Any;
        Camera *m_camera = nullptr;
        Minimap *m_minimap = nullptr;
        bool m_minimap_disabled_by_server = false;
+
        // Server serialization version
        u8 m_server_ser_ver;
 
@@ -536,7 +542,6 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
        AuthMechanism m_chosen_auth_mech;
        void *m_auth_data = nullptr;
 
-
        bool m_access_denied = false;
        bool m_access_denied_reconnect = false;
        std::string m_access_denied_reason = "";
@@ -545,7 +550,12 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
        bool m_nodedef_received = false;
        bool m_activeobjects_received = false;
        bool m_mods_loaded = false;
+
+       std::vector<std::string> m_remote_media_servers;
+       // Media downloader, only exists during init
        ClientMediaDownloader *m_media_downloader;
+       // Pending downloads of dynamic media (key: token)
+       std::vector<std::pair<u32, std::shared_ptr<SingleMediaDownloader>>> m_pending_media_downloads;
 
        // time_of_day speed approximation for old protocol
        bool m_time_of_day_set = false;
@@ -561,12 +571,9 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
        std::unordered_map<s32, int> m_sounds_server_to_client;
        // And the other way!
        std::unordered_map<int, s32> m_sounds_client_to_server;
-       // And relations to objects
+       // Relation of client id to object id
        std::unordered_map<int, u16> m_sounds_to_objects;
 
-       // Map server hud ids to client hud ids
-       std::unordered_map<u32, u32> m_hud_server_to_client;
-
        // Privileges
        std::unordered_set<std::string> m_privileges;
 
@@ -589,8 +596,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
 
        // Client modding
        ClientScripting *m_script = nullptr;
-       bool m_modding_enabled;
-       std::unordered_map<std::string, ModMetadata *> m_mod_storages;
+       ModStorageDatabase *m_mod_storage_database = nullptr;
        float m_mod_storage_save_timer = 10.0f;
        std::vector<ModSpec> m_mods;
        StringMap m_mod_vfs;
@@ -602,4 +608,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
        u32 m_csm_restriction_noderange = 8;
 
        std::unique_ptr<ModChannelMgr> m_modchannel_mgr;
+
+       // The number of blocks the client will combine for mesh generation.
+       MeshGrid m_mesh_grid;
 };