X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fclient.h;h=8585f6d4a6a7c8514a4bc0a1df2de175785b3a38;hb=64fa59e24f7b3e046b7dfeba930e44c86e32668e;hp=a1b1c66b4a0d7381217b76b5533caf3354d9e6e0;hpb=9d09103e481c4979ebb0130a9dee6265d0d6223b;p=minetest.git diff --git a/src/client.h b/src/client.h index a1b1c66b4..8585f6d4a 100644 --- a/src/client.h +++ b/src/client.h @@ -28,6 +28,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "jmutex.h" #include #include "clientobject.h" +#include "utility.h" // For IntervalLimiter + +struct MeshMakeData; class ClientNotReadyException : public BaseException { @@ -43,18 +46,8 @@ struct QueuedMeshUpdate MeshMakeData *data; bool ack_block_to_server; - QueuedMeshUpdate(): - p(-1337,-1337,-1337), - data(NULL), - ack_block_to_server(false) - { - } - - ~QueuedMeshUpdate() - { - if(data) - delete data; - } + QueuedMeshUpdate(); + ~QueuedMeshUpdate(); }; /* @@ -63,76 +56,18 @@ struct QueuedMeshUpdate class MeshUpdateQueue { public: - MeshUpdateQueue() - { - m_mutex.Init(); - } + MeshUpdateQueue(); - ~MeshUpdateQueue() - { - JMutexAutoLock lock(m_mutex); - - core::list::Iterator i; - for(i=m_queue.begin(); i!=m_queue.end(); i++) - { - QueuedMeshUpdate *q = *i; - delete q; - } - } + ~MeshUpdateQueue(); /* peer_id=0 adds with nobody to send to */ - void addBlock(v3s16 p, MeshMakeData *data, bool ack_block_to_server) - { - DSTACK(__FUNCTION_NAME); - - assert(data); - - JMutexAutoLock lock(m_mutex); - - /* - Find if block is already in queue. - If it is, update the data and quit. - */ - core::list::Iterator i; - for(i=m_queue.begin(); i!=m_queue.end(); i++) - { - QueuedMeshUpdate *q = *i; - if(q->p == p) - { - if(q->data) - delete q->data; - q->data = data; - if(ack_block_to_server) - q->ack_block_to_server = true; - return; - } - } - - /* - Add the block - */ - QueuedMeshUpdate *q = new QueuedMeshUpdate; - q->p = p; - q->data = data; - q->ack_block_to_server = ack_block_to_server; - m_queue.push_back(q); - } + void addBlock(v3s16 p, MeshMakeData *data, bool ack_block_to_server); // Returned pointer must be deleted // Returns NULL if queue is empty - QueuedMeshUpdate * pop() - { - JMutexAutoLock lock(m_mutex); - - core::list::Iterator i = m_queue.begin(); - if(i == m_queue.end()) - return NULL; - QueuedMeshUpdate *q = *i; - m_queue.erase(i); - return q; - } + QueuedMeshUpdate * pop(); u32 size() { @@ -178,7 +113,8 @@ enum ClientEventType { CE_NONE, CE_PLAYER_DAMAGE, - CE_PLAYER_FORCE_MOVE + CE_PLAYER_FORCE_MOVE, + CE_DEATHSCREEN, }; struct ClientEvent @@ -194,6 +130,12 @@ struct ClientEvent f32 pitch; f32 yaw; } player_force_move; + struct{ + bool set_camera_point_target; + f32 camera_point_target_x; + f32 camera_point_target_y; + f32 camera_point_target_z; + } deathscreen; }; }; @@ -248,33 +190,36 @@ class Client : public con::PeerHandler, public InventoryManager void groundAction(u8 action, v3s16 nodepos_undersurface, v3s16 nodepos_oversurface, u16 item); - void clickObject(u8 button, v3s16 blockpos, s16 id, u16 item); - void clickActiveObject(u8 button, u16 id, u16 item); + void clickActiveObject(u8 button, u16 id, u16 item_i); - void sendSignText(v3s16 blockpos, s16 id, std::string text); void sendSignNodeText(v3s16 p, std::string text); void sendInventoryAction(InventoryAction *a); void sendChatMessage(const std::wstring &message); void sendChangePassword(const std::wstring oldpassword, const std::wstring newpassword); void sendDamage(u8 damage); + void sendRespawn(); // locks envlock void removeNode(v3s16 p); // locks envlock void addNode(v3s16 p, MapNode n); - void updateCamera(v3f pos, v3f dir); + void updateCamera(v3f pos, v3f dir, f32 fov); + + void renderPostFx(); // Returns InvalidPositionException if not found MapNode getNode(v3s16 p); // Wrapper to Map NodeMetadata* getNodeMetadata(v3s16 p); - v3f getPlayerPosition(); + LocalPlayer* getLocalPlayer(); void setPlayerControl(PlayerControl &control); - + + void selectPlayerItem(u16 item); + // Returns true if the inventory of the local player has been // updated from the server. If it is true, it is set to false. bool getLocalInventoryUpdated(); @@ -286,14 +231,6 @@ class Client : public con::PeerHandler, public InventoryManager Inventory* getInventory(InventoryContext *c, std::string id); void inventoryAction(InventoryAction *a); - // Gets closest object pointed by the shootline - // Returns NULL if not found - MapBlockObject * getSelectedObject( - f32 max_d, - v3f from_pos_f_on_map, - core::line3d shootline_on_map - ); - // Gets closest object pointed by the shootline // Returns NULL if not found ClientActiveObject * getSelectedActiveObject( @@ -309,48 +246,16 @@ class Client : public con::PeerHandler, public InventoryManager u16 getHP(); - //void updateSomeExpiredMeshes(); - - void setTempMod(v3s16 p, NodeMod mod) - { - //JMutexAutoLock envlock(m_env_mutex); //bulk comment-out - assert(m_env.getMap().mapType() == MAPTYPE_CLIENT); - - core::map affected_blocks; - ((ClientMap&)m_env.getMap()).setTempMod(p, mod, - &affected_blocks); - - for(core::map::Iterator - i = affected_blocks.getIterator(); - i.atEnd() == false; i++) - { - i.getNode()->getValue()->updateMesh(m_env.getDayNightRatio()); - } - } - void clearTempMod(v3s16 p) - { - //JMutexAutoLock envlock(m_env_mutex); //bulk comment-out - assert(m_env.getMap().mapType() == MAPTYPE_CLIENT); - - core::map affected_blocks; - ((ClientMap&)m_env.getMap()).clearTempMod(p, - &affected_blocks); - - for(core::map::Iterator - i = affected_blocks.getIterator(); - i.atEnd() == false; i++) - { - i.getNode()->getValue()->updateMesh(m_env.getDayNightRatio()); - } - } + void setTempMod(v3s16 p, NodeMod mod); + void clearTempMod(v3s16 p); float getAvgRtt() { - //JMutexAutoLock lock(m_con_mutex); //bulk comment-out - con::Peer *peer = m_con.GetPeerNoEx(PEER_ID_SERVER); - if(peer == NULL) - return 0.0; - return peer->avg_rtt; + try{ + return m_con.GetPeerAvgRTT(PEER_ID_SERVER); + } catch(con::PeerNotFoundException){ + return 1337; + } } bool getChatMessage(std::wstring &message) @@ -363,6 +268,12 @@ class Client : public con::PeerHandler, public InventoryManager void addChatMessage(const std::wstring &message) { + if (message[0] == L'/') { + m_chat_queue.push_back( + (std::wstring)L"issued command: "+message); + return; + } + //JMutexAutoLock envlock(m_env_mutex); //bulk comment-out LocalPlayer *player = m_env.getLocalPlayer(); assert(player != NULL); @@ -390,6 +301,8 @@ class Client : public con::PeerHandler, public InventoryManager return m_access_denied_reason; } + float getRTT(void); + private: // Virtual methods from con::PeerHandler @@ -402,13 +315,15 @@ class Client : public con::PeerHandler, public InventoryManager 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); float m_packetcounter_timer; - float m_delete_unused_sectors_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 + IntervalLimiter m_map_timer_and_unload_interval; MeshUpdateThread m_mesh_update_thread; @@ -418,9 +333,6 @@ class Client : public con::PeerHandler, public InventoryManager IrrlichtDevice *m_device; - v3f camera_position; - v3f camera_direction; - // Server serialization version u8 m_server_ser_ver;