LocalPlayer::accelerateHorizontal: cleanups
[oweals/minetest.git] / src / client.h
index ab47cfa44b3cf9a048f0fe051b17276485b9c6e1..adac83e5cbf3f190ea10a033723e1be9cbb7c51b 100644 (file)
@@ -37,10 +37,13 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mapnode.h"
 #include "tileanimation.h"
 #include "mesh_generator_thread.h"
+#include <fstream>
+#include "filesys.h"
 
 #define CLIENT_CHAT_MESSAGE_LIMIT_PER_10S 10.0f
 
 struct MeshMakeData;
+struct ChatMessage;
 class MapBlockMesh;
 class IWritableTextureSource;
 class IWritableShaderSource;
@@ -256,7 +259,6 @@ public:
        */
 
        Client(
-                       IrrlichtDevice *device,
                        const char *playername,
                        const std::string &password,
                        const std::string &address_name,
@@ -274,6 +276,16 @@ public:
        ~Client();
        DISABLE_CLASS_COPY(Client);
 
+       // Load local mods into memory
+       void loadMods();
+       void scanModSubfolder(const std::string &mod_name, const std::string &mod_path,
+                               std::string mod_subpath);
+       inline void scanModIntoMemory(const std::string &mod_name, const std::string &mod_path)
+       {
+               scanModSubfolder(mod_name, mod_path, "");
+       }
+
+       // Initizle the mods
        void initMods();
 
        /*
@@ -317,7 +329,8 @@ public:
        void handleCommand_BlockData(NetworkPacket* pkt);
        void handleCommand_Inventory(NetworkPacket* pkt);
        void handleCommand_TimeOfDay(NetworkPacket* pkt);
-       void handleCommand_ChatMessage(NetworkPacket* pkt);
+       void handleCommand_ChatMessageOld(NetworkPacket *pkt);
+       void handleCommand_ChatMessage(NetworkPacket *pkt);
        void handleCommand_ActiveObjectRemoveAdd(NetworkPacket* pkt);
        void handleCommand_ActiveObjectMessages(NetworkPacket* pkt);
        void handleCommand_Movement(NetworkPacket* pkt);
@@ -351,6 +364,7 @@ public:
        void handleCommand_EyeOffset(NetworkPacket* pkt);
        void handleCommand_UpdatePlayerList(NetworkPacket* pkt);
        void handleCommand_SrpBytesSandB(NetworkPacket* pkt);
+       void handleCommand_CSMFlavourLimits(NetworkPacket *pkt);
 
        void ProcessData(NetworkPacket *pkt);
 
@@ -383,6 +397,14 @@ public:
 
        // Causes urgent mesh updates (unlike Map::add/removeNodeWithEvent)
        void removeNode(v3s16 p);
+
+       /**
+        * Helper function for Client Side Modding
+        * Flavour is applied there, this should not be used for core engine
+        * @param p
+        * @param is_valid_position
+        * @return
+        */
        MapNode getNode(v3s16 p, bool *is_valid_position);
        void addNode(v3s16 p, MapNode n, bool remove_metadata = true);
 
@@ -467,7 +489,7 @@ public:
 
        float mediaReceiveProgress();
 
-       void afterContentReceived(IrrlichtDevice *device);
+       void afterContentReceived();
 
        float getRTT();
        float getCurRate();
@@ -486,7 +508,6 @@ public:
        ITextureSource* getTextureSource();
        virtual IShaderSource* getShaderSource();
        IShaderSource *shsrc() { return getShaderSource(); }
-       scene::ISceneManager* getSceneManager();
        virtual u16 allocateUnknownNodeId(const std::string &name);
        virtual ISoundManager* getSoundManager();
        virtual MtEventManager* getEventManager();
@@ -494,6 +515,7 @@ public:
        bool checkLocalPrivilege(const std::string &priv)
        { return checkPrivilege(priv); }
        virtual scene::IAnimatedMesh* getMesh(const std::string &filename);
+       const std::string* getModFile(const std::string &filename);
 
        virtual std::string getModStoragePath() const;
        virtual bool registerModStorage(ModMetadata *meta);
@@ -509,9 +531,9 @@ public:
 
        void makeScreenshot();
 
-       inline void pushToChatQueue(const std::wstring &input)
+       inline void pushToChatQueue(ChatMessage *cec)
        {
-               m_chat_queue.push(input);
+               m_chat_queue.push(cec);
        }
 
        ClientScripting *getScript() { return m_script; }
@@ -539,6 +561,16 @@ public:
                return m_address_name;
        }
 
+       inline bool checkCSMFlavourLimit(CSMFlavourLimit flag) const
+       {
+               return m_csm_flavour_limits & flag;
+       }
+
+       u32 getCSMNodeRangeLimit() const
+       {
+               return m_csm_noderange_limit;
+       }
+
 private:
 
        // Virtual methods from con::PeerHandler
@@ -593,7 +625,6 @@ private:
        ParticleManager m_particle_manager;
        con::Connection m_con;
        std::string m_address_name;
-       IrrlichtDevice *m_device;
        Camera *m_camera = nullptr;
        Minimap *m_minimap = nullptr;
        bool m_minimap_disabled_by_server = false;
@@ -619,10 +650,10 @@ private:
        // 0 <= m_daynight_i < DAYNIGHT_CACHE_COUNT
        //s32 m_daynight_i;
        //u32 m_daynight_ratio;
-       std::queue<std::wstring> m_chat_queue;
        std::queue<std::wstring> m_out_chat_queue;
        u32 m_last_chat_message_sent;
        float m_chat_message_allowance = 5.0f;
+       std::queue<ChatMessage *> m_chat_queue;
 
        // The authentication methods we can use to enter sudo mode (=change password)
        u32 m_sudo_auth_methods;
@@ -675,6 +706,8 @@ private:
        // Storage for mesh data for creating multiple instances of the same mesh
        StringMap m_mesh_data;
 
+       StringMap m_mod_files;
+
        // own state
        LocalClientState m_state;
 
@@ -687,9 +720,14 @@ private:
        bool m_modding_enabled;
        std::unordered_map<std::string, ModMetadata *> m_mod_storages;
        float m_mod_storage_save_timer = 10.0f;
+       std::vector<ModSpec> m_mods;
        GameUIFlags *m_game_ui_flags;
 
        bool m_shutdown = false;
+
+       // CSM flavour limits byteflag
+       u64 m_csm_flavour_limits = CSMFlavourLimit::CSM_FL_NONE;
+       u32 m_csm_noderange_limit = 8;
 };
 
 #endif // !CLIENT_HEADER