Added configurable selectionbox width. Min width = 1, Max = 5
[oweals/minetest.git] / src / client.h
index 9146941e8263dbb02f3906d3eaac52f5401671db..8bffbd1db9e1c0ada2ab5bb040c6dc95b90da706 100644 (file)
@@ -23,7 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "connection.h"
 #include "environment.h"
 #include "irrlichttypes_extrabloated.h"
-#include "jmutex.h"
+#include "jthread/jmutex.h"
 #include <ostream>
 #include <map>
 #include <set>
@@ -31,32 +31,21 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "clientobject.h"
 #include "gamedef.h"
 #include "inventorymanager.h"
-#include "filecache.h"
 #include "localplayer.h"
-#include "server.h"
+#include "hud.h"
 #include "particles.h"
-#include "util/pointedthing.h"
-#include <algorithm>
 
 struct MeshMakeData;
 class MapBlockMesh;
-class IGameDef;
 class IWritableTextureSource;
 class IWritableShaderSource;
 class IWritableItemDefManager;
 class IWritableNodeDefManager;
 //class IWritableCraftDefManager;
-class ClientEnvironment;
+class ClientMediaDownloader;
 struct MapDrawControl;
 class MtEventManager;
-
-class ClientNotReadyException : public BaseException
-{
-public:
-       ClientNotReadyException(const char *s):
-               BaseException(s)
-       {}
-};
+struct PointedThing;
 
 struct QueuedMeshUpdate
 {
@@ -68,6 +57,12 @@ struct QueuedMeshUpdate
        ~QueuedMeshUpdate();
 };
 
+enum LocalClientState {
+       LC_Created,
+       LC_Init,
+       LC_Ready
+};
+
 /*
        A thread-safe queue of mesh update tasks
 */
@@ -114,7 +109,7 @@ struct MeshUpdateResult
        }
 };
 
-class MeshUpdateThread : public SimpleThread
+class MeshUpdateThread : public JThread
 {
 public:
 
@@ -130,24 +125,8 @@ public:
        MutexedQueue<MeshUpdateResult> m_queue_out;
 
        IGameDef *m_gamedef;
-};
-
-class MediaFetchThread : public SimpleThread
-{
-public:
-
-       MediaFetchThread(IGameDef *gamedef):
-               m_gamedef(gamedef)
-       {
-       }
-
-       void * Thread();
-
-       std::list<MediaRequest> m_file_requests;
-       MutexedQueue<std::pair<std::string, std::string> > m_file_data;
-       std::list<MediaRequest> m_failed;
-       std::string m_remote_url;
-       IGameDef *m_gamedef;
+       
+       v3s16 m_camera_offset;
 };
 
 enum ClientEventType
@@ -156,14 +135,15 @@ enum ClientEventType
        CE_PLAYER_DAMAGE,
        CE_PLAYER_FORCE_MOVE,
        CE_DEATHSCREEN,
-       CE_TEXTURES_UPDATED,
        CE_SHOW_FORMSPEC,
        CE_SPAWN_PARTICLE,
        CE_ADD_PARTICLESPAWNER,
        CE_DELETE_PARTICLESPAWNER,
        CE_HUDADD,
        CE_HUDRM,
-       CE_HUDCHANGE
+       CE_HUDCHANGE,
+       CE_SET_SKY,
+       CE_OVERRIDE_DAY_NIGHT_RATIO,
 };
 
 struct ClientEvent
@@ -198,6 +178,7 @@ struct ClientEvent
                        f32 expirationtime;
                        f32 size;
                        bool collisiondetection;
+                       bool vertical;
                        std::string *texture;
                } spawn_particle;
                struct{
@@ -214,6 +195,7 @@ struct ClientEvent
                        f32 minsize;
                        f32 maxsize;
                        bool collisiondetection;
+                       bool vertical;
                        std::string *texture;
                        u32 id;
                } add_particlespawner;
@@ -232,6 +214,8 @@ struct ClientEvent
                        u32 dir;
                        v2f *align;
                        v2f *offset;
+                       v3f *world_pos;
+                       v2s32 * size;
                } hudadd;
                struct{
                        u32 id;
@@ -242,7 +226,18 @@ struct ClientEvent
                        v2f *v2fdata;
                        std::string *sdata;
                        u32 data;
+                       v3f *v3fdata;
+                       v2s32 * v2s32data;
                } hudchange;
+               struct{
+                       video::SColor *bgcolor;
+                       std::string *type;
+                       std::vector<std::string> *params;
+               } set_sky;
+               struct{
+                       bool do_override;
+                       float ratio_f;
+               } override_day_night_ratio;
        };
 };
 
@@ -319,19 +314,20 @@ public:
        );
        
        ~Client();
+
+       /*
+        request all threads managed by client to be stopped
+        */
+       void Stop();
+
+
+       bool isShutdown();
        /*
                The name of the local player should already be set when
                calling this, as it is sent in the initialization.
        */
        void connect(Address address);
-       /*
-               returns true when
-                       m_con.Connected() == true
-                       AND m_server_ser_ver != SER_FMT_VER_INVALID
-               throws con::PeerNotFoundException if connection has been deleted,
-               eg. timed out.
-       */
-       bool connectedAndInitialized();
+
        /*
                Stuff that references the environment is valid only as
                long as this is not called. (eg. Players)
@@ -354,18 +350,19 @@ public:
                        const std::map<std::string, std::string> &fields);
        void sendInventoryAction(InventoryAction *a);
        void sendChatMessage(const std::wstring &message);
-       void sendChangePassword(const std::wstring oldpassword,
-                       const std::wstring newpassword);
+       void sendChangePassword(const std::wstring &oldpassword,
+                               const std::wstring &newpassword);
        void sendDamage(u8 damage);
        void sendBreath(u16 breath);
        void sendRespawn();
+       void sendReady();
 
        ClientEnvironment& getEnv()
        { return m_env; }
        
        // Causes urgent mesh updates (unlike Map::add/removeNodeWithEvent)
        void removeNode(v3s16 p);
-       void addNode(v3s16 p, MapNode n);
+       void addNode(v3s16 p, MapNode n, bool remove_metadata = true);
        
        void setPlayerControl(PlayerControl &control);
 
@@ -391,9 +388,6 @@ public:
                        core::line3d<f32> shootline_on_map
        );
 
-       // Prints a line or two of info
-       void printDebugInfo(std::ostream &os);
-
        std::list<std::string> getConnectedPlayerNames();
 
        float getAnimationTime();
@@ -401,6 +395,9 @@ public:
        int getCrackLevel();
        void setCrack(int level, v3s16 pos);
 
+       void setHighlighted(v3s16 pos, bool show_hud);
+       v3s16 getHighlighted(){ return m_highlighted_pos; }
+
        u16 getHP();
        u16 getBreath();
 
@@ -416,6 +413,9 @@ public:
        // Including blocks at appropriate edges
        void addUpdateMeshTaskWithEdge(v3s16 blockpos, bool ack_to_server=false, bool urgent=false);
        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; }
 
        // Get event from queue. CE_NONE is returned if queue is empty.
        ClientEvent getClientEvent();
@@ -426,22 +426,20 @@ public:
        std::wstring accessDeniedReason()
        { return m_access_denied_reason; }
 
-       float mediaReceiveProgress()
-       {
-               if (!m_media_receive_started) return 0;
-               return 1.0 * m_media_received_count / m_media_count;
-       }
-
-       bool texturesReceived()
-       { return m_media_receive_started && m_media_received_count == m_media_count; }
        bool itemdefReceived()
        { return m_itemdef_received; }
        bool nodedefReceived()
        { return m_nodedef_received; }
-       
+       bool mediaReceived()
+       { return m_media_downloader == NULL; }
+
+       float mediaReceiveProgress();
+
        void afterContentReceived(IrrlichtDevice *device, gui::IGUIFont* font);
 
        float getRTT(void);
+       float getCurRate(void);
+       float getAvgRate(void);
 
        // IGameDef interface
        virtual IItemDefManager* getItemDefManager();
@@ -454,13 +452,19 @@ public:
        virtual MtEventManager* getEventManager();
        virtual bool checkLocalPrivilege(const std::string &priv)
        { return checkPrivilege(priv); }
+       virtual scene::IAnimatedMesh* getMesh(const std::string &filename);
 
-private:
-       
+       // 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);
+       // Send a request for conventional media transfer
+       void request_media(const std::list<std::string> &file_requests);
+       // Send a notification that no conventional media transfer is needed
+       void received_media();
+
+       LocalClientState getState() { return m_state; }
 
-       void request_media(const std::list<MediaRequest> &file_requests);
+private:
 
        // Virtual methods from con::PeerHandler
        void peerAdded(con::Peer *peer);
@@ -488,7 +492,6 @@ private:
        MtEventManager *m_event;
 
        MeshUpdateThread m_mesh_update_thread;
-       std::list<MediaFetchThread*> m_media_fetch_threads;
        ClientEnvironment m_env;
        con::Connection m_con;
        IrrlichtDevice *m_device;
@@ -500,10 +503,12 @@ private:
        float m_inventory_from_server_age;
        std::set<v3s16> m_active_blocks;
        PacketCounter m_packetcounter;
+       bool m_show_hud;
        // Block mesh animation parameters
        float m_animation_time;
        int m_crack_level;
        v3s16 m_crack_pos;
+       v3s16 m_highlighted_pos;
        // 0 <= m_daynight_i < DAYNIGHT_CACHE_COUNT
        //s32 m_daynight_i;
        //u32 m_daynight_ratio;
@@ -514,14 +519,9 @@ private:
        bool m_access_denied;
        std::wstring m_access_denied_reason;
        Queue<ClientEvent> m_client_event_queue;
-       FileCache m_media_cache;
-       // Mapping from media file name to SHA1 checksum
-       std::map<std::string, std::string> m_media_name_sha1_map;
-       bool m_media_receive_started;
-       u32 m_media_count;
-       u32 m_media_received_count;
        bool m_itemdef_received;
        bool m_nodedef_received;
+       ClientMediaDownloader *m_media_downloader;
 
        // time_of_day speed approximation for old protocol
        bool m_time_of_day_set;
@@ -546,6 +546,12 @@ private:
        // Detached inventories
        // key = name
        std::map<std::string, Inventory*> m_detached_inventories;
+
+       // Storage for mesh data for creating multiple instances of the same mesh
+       std::map<std::string, std::string> m_mesh_data;
+
+       // own state
+       LocalClientState m_state;
 };
 
 #endif // !CLIENT_HEADER