X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fclient.h;h=8bffbd1db9e1c0ada2ab5bb040c6dc95b90da706;hb=58e6d25e033c76dc91aaac18fdeda92ac23fe0e1;hp=67ba6c5659f3172bdac1d47817688ad127fc3dce;hpb=97cddd1b960e3b60ce74ff9ad16307b39676144e;p=oweals%2Fminetest.git diff --git a/src/client.h b/src/client.h index 67ba6c565..8bffbd1db 100644 --- a/src/client.h +++ b/src/client.h @@ -23,40 +23,29 @@ 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 +#include #include #include #include "clientobject.h" #include "gamedef.h" #include "inventorymanager.h" -#include "filesys.h" -#include "filecache.h" #include "localplayer.h" -#include "server.h" +#include "hud.h" #include "particles.h" -#include "util/pointedthing.h" -#include 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 m_queue_out; IGameDef *m_gamedef; -}; - -class MediaFetchThread : public SimpleThread -{ -public: - - MediaFetchThread(IGameDef *gamedef): - m_gamedef(gamedef) - { - } - - void * Thread(); - - std::list m_file_requests; - MutexedQueue > m_file_data; - std::list 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,10 +226,72 @@ struct ClientEvent v2f *v2fdata; std::string *sdata; u32 data; + v3f *v3fdata; + v2s32 * v2s32data; } hudchange; + struct{ + video::SColor *bgcolor; + std::string *type; + std::vector *params; + } set_sky; + struct{ + bool do_override; + float ratio_f; + } override_day_night_ratio; }; }; +/* + Packet counter +*/ + +class PacketCounter +{ +public: + PacketCounter() + { + } + + void add(u16 command) + { + std::map::iterator n = m_packets.find(command); + if(n == m_packets.end()) + { + m_packets[command] = 1; + } + else + { + n->second++; + } + } + + void clear() + { + for(std::map::iterator + i = m_packets.begin(); + i != m_packets.end(); ++i) + { + i->second = 0; + } + } + + void print(std::ostream &o) + { + for(std::map::iterator + i = m_packets.begin(); + i != m_packets.end(); ++i) + { + o<<"cmd "<first + <<" count "<second + < m_packets; +}; + class Client : public con::PeerHandler, public InventoryManager, public IGameDef { public: @@ -263,23 +309,25 @@ public: IWritableItemDefManager *itemdef, IWritableNodeDefManager *nodedef, ISoundManager *sound, - MtEventManager *event + MtEventManager *event, + bool ipv6 ); ~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) @@ -302,17 +350,19 @@ public: const std::map &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); @@ -338,9 +388,6 @@ public: core::line3d shootline_on_map ); - // Prints a line or two of info - void printDebugInfo(std::ostream &os); - std::list getConnectedPlayerNames(); float getAnimationTime(); @@ -348,7 +395,11 @@ 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(); bool checkPrivilege(const std::string &priv) { return (m_privileges.count(priv) != 0); } @@ -362,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(); @@ -372,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; } - - void afterContentReceived(); + 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(); @@ -400,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 &file_requests); + // Send a notification that no conventional media transfer is needed + void received_media(); - void request_media(const std::list &file_requests); + LocalClientState getState() { return m_state; } + +private: // Virtual methods from con::PeerHandler void peerAdded(con::Peer *peer); @@ -416,8 +474,6 @@ private: void Receive(); void sendPlayerPos(); - // This sends the player's current name etc to the server - void sendPlayerInfo(); // Send the item number 'item' as player item to the server void sendPlayerItem(u16 item); @@ -436,7 +492,6 @@ private: MtEventManager *m_event; MeshUpdateThread m_mesh_update_thread; - std::list m_media_fetch_threads; ClientEnvironment m_env; con::Connection m_con; IrrlichtDevice *m_device; @@ -448,10 +503,12 @@ private: float m_inventory_from_server_age; std::set 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; @@ -462,15 +519,9 @@ private: bool m_access_denied; std::wstring m_access_denied_reason; Queue m_client_event_queue; - FileCache m_media_cache; - // Mapping from media file name to SHA1 checksum - std::map 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; - friend class FarMesh; + ClientMediaDownloader *m_media_downloader; // time_of_day speed approximation for old protocol bool m_time_of_day_set; @@ -495,6 +546,12 @@ private: // Detached inventories // key = name std::map m_detached_inventories; + + // Storage for mesh data for creating multiple instances of the same mesh + std::map m_mesh_data; + + // own state + LocalClientState m_state; }; #endif // !CLIENT_HEADER