LocalPlayer::accelerateHorizontal: cleanups
[oweals/minetest.git] / src / client.h
index fc24160874d0a6914719aac0ccb62949f5d5f334..adac83e5cbf3f190ea10a033723e1be9cbb7c51b 100644 (file)
@@ -23,7 +23,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "network/connection.h"
 #include "clientenvironment.h"
 #include "irrlichttypes_extrabloated.h"
-#include "threading/mutex.h"
 #include <ostream>
 #include <map>
 #include <set>
@@ -38,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;
@@ -257,7 +259,6 @@ public:
        */
 
        Client(
-                       IrrlichtDevice *device,
                        const char *playername,
                        const std::string &password,
                        const std::string &address_name,
@@ -273,7 +274,18 @@ 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);
@@ -349,7 +362,9 @@ public:
        void handleCommand_OverrideDayNightRatio(NetworkPacket* pkt);
        void handleCommand_LocalPlayerAnimations(NetworkPacket* pkt);
        void handleCommand_EyeOffset(NetworkPacket* pkt);
+       void handleCommand_UpdatePlayerList(NetworkPacket* pkt);
        void handleCommand_SrpBytesSandB(NetworkPacket* pkt);
+       void handleCommand_CSMFlavourLimits(NetworkPacket *pkt);
 
        void ProcessData(NetworkPacket *pkt);
 
@@ -382,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);
 
@@ -417,6 +440,9 @@ public:
        bool checkPrivilege(const std::string &priv) const
        { return (m_privileges.count(priv) != 0); }
 
+       const std::unordered_set<std::string> &getPrivilegeList() const
+       { return m_privileges; }
+
        bool getChatMessage(std::wstring &message);
        void typeChatMessage(const std::wstring& message);
 
@@ -453,7 +479,7 @@ public:
        bool nodedefReceived()
        { return m_nodedef_received; }
        bool mediaReceived()
-       { return m_media_downloader == NULL; }
+       { return !m_media_downloader; }
 
        u8 getProtoVersion()
        { return m_proto_ver; }
@@ -463,7 +489,7 @@ public:
 
        float mediaReceiveProgress();
 
-       void afterContentReceived(IrrlichtDevice *device);
+       void afterContentReceived();
 
        float getRTT();
        float getCurRate();
@@ -482,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();
@@ -490,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);
@@ -503,11 +529,11 @@ public:
 
        LocalClientState getState() { return m_state; }
 
-       void makeScreenshot(IrrlichtDevice *device);
+       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; }
@@ -525,8 +551,6 @@ public:
        void showGameFog(const bool show = true);
        void showGameDebug(const bool show = true);
 
-       IrrlichtDevice *getDevice() const { return m_device; }
-
        const Address getServerAddress()
        {
                return m_con.GetPeerAddress(PEER_ID_SERVER);
@@ -537,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
@@ -571,11 +605,11 @@ private:
 
        bool canSendChatMessage() const;
 
-       float m_packetcounter_timer;
-       float m_connection_reinit_timer;
-       float m_avg_rtt_timer;
-       float m_playerpos_send_timer;
-       float m_ignore_damage_timer; // Used after server moves player
+       float m_packetcounter_timer = 0.0f;
+       float m_connection_reinit_timer = 0.1f;
+       float m_avg_rtt_timer = 0.0f;
+       float m_playerpos_send_timer = 0.0f;
+       float m_ignore_damage_timer = 0.0f; // Used after server moves player
        IntervalLimiter m_map_timer_and_unload_interval;
 
        IWritableTextureSource *m_tsrc;
@@ -591,10 +625,9 @@ private:
        ParticleManager m_particle_manager;
        con::Connection m_con;
        std::string m_address_name;
-       IrrlichtDevice *m_device;
-       Camera *m_camera;
-       Minimap *m_minimap;
-       bool m_minimap_disabled_by_server;
+       Camera *m_camera = nullptr;
+       Minimap *m_minimap = nullptr;
+       bool m_minimap_disabled_by_server = false;
        // Server serialization version
        u8 m_server_ser_ver;
 
@@ -603,30 +636,30 @@ private:
        // and aren't accurate. We simply just don't know, because
        // the server didn't send the version back then.
        // If 0, server init hasn't been received yet.
-       u8 m_proto_ver;
+       u8 m_proto_ver = 0;
 
-       u16 m_playeritem;
-       bool m_inventory_updated;
-       Inventory *m_inventory_from_server;
-       float m_inventory_from_server_age;
+       u16 m_playeritem = 0;
+       bool m_inventory_updated = false;
+       Inventory *m_inventory_from_server = nullptr;
+       float m_inventory_from_server_age = 0.0f;
        PacketCounter m_packetcounter;
        // Block mesh animation parameters
-       float m_animation_time;
-       int m_crack_level;
+       float m_animation_time = 0.0f;
+       int m_crack_level = -1;
        v3s16 m_crack_pos;
        // 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;
+       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;
 
        // The seed returned by the server in TOCLIENT_INIT is stored here
-       u64 m_map_seed;
+       u64 m_map_seed = 0;
 
        // Auth data
        std::string m_playername;
@@ -635,27 +668,27 @@ private:
        std::string m_new_password;
        // Usable by auth mechanisms.
        AuthMechanism m_chosen_auth_mech;
-       void * m_auth_data;
+       void *m_auth_data = nullptr;
 
 
-       bool m_access_denied;
-       bool m_access_denied_reconnect;
-       std::string m_access_denied_reason;
+       bool m_access_denied = false;
+       bool m_access_denied_reconnect = false;
+       std::string m_access_denied_reason = "";
        std::queue<ClientEvent> m_client_event_queue;
-       bool m_itemdef_received;
-       bool m_nodedef_received;
+       bool m_itemdef_received = false;
+       bool m_nodedef_received = false;
        ClientMediaDownloader *m_media_downloader;
 
        // time_of_day speed approximation for old protocol
-       bool m_time_of_day_set;
-       float m_last_time_of_day_f;
-       float m_time_of_day_update_timer;
+       bool m_time_of_day_set = false;
+       float m_last_time_of_day_f = -1.0f;
+       float m_time_of_day_update_timer = 0.0f;
 
        // An interval for generally sending object positions and stuff
-       float m_recommended_send_interval;
+       float m_recommended_send_interval = 0.1f;
 
        // Sounds
-       float m_removed_sounds_check_timer;
+       float m_removed_sounds_check_timer = 0.0f;
        // Mapping from server sound ids to our sound ids
        std::unordered_map<s32, int> m_sounds_server_to_client;
        // And the other way!
@@ -673,22 +706,28 @@ 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;
 
        // Used for saving server map to disk client-side
-       MapDatabase *m_localdb;
+       MapDatabase *m_localdb = nullptr;
        IntervalLimiter m_localdb_save_interval;
        u16 m_cache_save_interval;
 
-       ClientScripting *m_script;
+       ClientScripting *m_script = nullptr;
        bool m_modding_enabled;
        std::unordered_map<std::string, ModMetadata *> m_mod_storages;
-       float m_mod_storage_save_timer;
+       float m_mod_storage_save_timer = 10.0f;
+       std::vector<ModSpec> m_mods;
        GameUIFlags *m_game_ui_flags;
 
-       bool m_shutdown;
-       DISABLE_CLASS_COPY(Client);
+       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