X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fclientiface.h;h=bf95df4a8a126d079fbca266db2cf17dfd869159;hb=e8fd1ce62331146fae0e98ce4a94d3720f308abf;hp=4850b0c2aec5a3c74b5a8901aa21b03e7585e6cc;hpb=745a90dc84339774a37fddff480dd60c69f4cc2a;p=dragonfireclient.git diff --git a/src/clientiface.h b/src/clientiface.h index 4850b0c2a..bf95df4a8 100644 --- a/src/clientiface.h +++ b/src/clientiface.h @@ -49,30 +49,30 @@ class EmergeManager; | | \-----------------/ | depending of the incoming packet - +--------------------------------------- - v v -+-----------------------------+ +-----------------------------+ -|IN: | |IN: | -| TOSERVER_INIT_LEGACY |----- | TOSERVER_INIT | invalid playername, -+-----------------------------+ | +-----------------------------+ password (for _LEGACY), - | | | or denied by mod - | Auth ok -------------------+--------------------------------- - v v | -+-----------------------------+ +-----------------------------+ | -|OUT: | |OUT: | | -| TOCLIENT_INIT_LEGACY | | TOCLIENT_HELLO | | -+-----------------------------+ +-----------------------------+ | - | | | - | | | - v v | - /-----------------\ /-----------------\ | - | | | | | - | AwaitingInit2 |<--------- | HelloSent | | - | | | | | | - \-----------------/ | \-----------------/ | - | | | | -+-----------------------------+ | *-----------------------------* Auth fails | -|IN: | | |Authentication, depending on |-----------------+ + ---------------------------------------- + v + +-----------------------------+ + |IN: | + | TOSERVER_INIT | + +-----------------------------+ + | invalid playername + | or denied by mod + v + +-----------------------------+ + |OUT: | + | TOCLIENT_HELLO | + +-----------------------------+ + | + | + v + /-----------------\ /-----------------\ + | | | | + | AwaitingInit2 |<--------- | HelloSent | + | | | | | + \-----------------/ | \-----------------/ + | | | ++-----------------------------+ | *-----------------------------* Auth fails +|IN: | | |Authentication, depending on |------------------ | TOSERVER_INIT2 | | | packet sent by client | | +-----------------------------+ | *-----------------------------* | | | | | @@ -101,18 +101,18 @@ class EmergeManager; | | +-----------------------------+ | | DefinitionsSent | |IN: | | | | | TOSERVER_REQUEST_MEDIA | | - \-----------------/ | TOSERVER_RECEIVED_MEDIA | | + \-----------------/ | | | | +-----------------------------+ | | ^ | | | ----------------------------- | - v | + v v +-----------------------------+ --------------------------------+ -|IN: | | | +|IN: | | ^ | TOSERVER_CLIENT_READY | v | -+-----------------------------+ +-------------------------------+ | - | |OUT: | | - v | TOCLIENT_ACCESS_DENIED_LEGAGY | | -+-----------------------------+ +-------------------------------+ | ++-----------------------------+ +------------------------+ | + | |OUT: | | + v | TOCLIENT_ACCESS_DENIED | | ++-----------------------------+ +------------------------+ | |OUT: | | | | TOCLIENT_MOVE_PLAYER | v | | TOCLIENT_PRIVILEGES | /-----------------\ | @@ -205,7 +205,7 @@ enum ClientStateEvent */ struct PrioritySortedBlockTransfer { - PrioritySortedBlockTransfer(float a_priority, const v3s16 &a_pos, u16 a_peer_id) + PrioritySortedBlockTransfer(float a_priority, const v3s16 &a_pos, session_t a_peer_id) { priority = a_priority; pos = a_pos; @@ -217,7 +217,7 @@ struct PrioritySortedBlockTransfer } float priority; v3s16 pos; - u16 peer_id; + session_t peer_id; }; class RemoteClient @@ -227,7 +227,7 @@ class RemoteClient // NOTE: If client is made allowed to exist while peer doesn't, // this has to be set to 0 when there is no peer. // Also, the client must be moved to some other container. - u16 peer_id = PEER_ID_INEXISTENT; + session_t peer_id = PEER_ID_INEXISTENT; // The serialization version to use with the client u8 serialization_version = SER_FMT_VER_INVALID; // @@ -246,7 +246,7 @@ class RemoteClient bool isMechAllowed(AuthMechanism mech) { return allowed_auth_mechs & mech; } - RemoteClient() = default; + RemoteClient(); ~RemoteClient() = default; /* @@ -274,6 +274,11 @@ class RemoteClient u32 getSendingCount() const { return m_blocks_sending.size(); } + bool isBlockSent(v3s16 p) const + { + return m_blocks_sent.find(p) != m_blocks_sent.end(); + } + // Increments timeouts and removes timed-out blocks from list // NOTE: This doesn't fix the server-not-sending-block bug // because it is related to emerging, not sending. @@ -333,6 +338,7 @@ class RemoteClient u8 getMajor() const { return m_version_major; } u8 getMinor() const { return m_version_minor; } u8 getPatch() const { return m_version_patch; } + const std::string &getFull() const { return m_full_version; } private: // Version is stored in here after INIT before INIT2 u8 m_pending_serialization_version = SER_FMT_VER_INVALID; @@ -354,6 +360,13 @@ class RemoteClient v3s16 m_last_center; float m_nearest_unsent_reset_timer = 0.0f; + const u16 m_max_simul_sends; + const float m_min_time_from_building; + const s16 m_max_send_distance; + const s16 m_block_optimize_distance; + const s16 m_max_gen_distance; + const bool m_occ_cull; + /* Blocks that are currently on the line. This is used for throttling the sending of blocks. @@ -422,7 +435,10 @@ class ClientInterface { void step(float dtime); /* get list of active client id's */ - std::vector getClientIDs(ClientState min_state=CS_Active); + std::vector getClientIDs(ClientState min_state=CS_Active); + + /* mark block as not sent to active client sessions */ + void markBlockposAsNotSent(const v3s16 &pos); /* verify is server user limit was reached */ bool isUserLimitReached(); @@ -431,38 +447,39 @@ class ClientInterface { const std::vector &getPlayerNames() const { return m_clients_names; } /* send message to client */ - void send(u16 peer_id, u8 channelnum, NetworkPacket* pkt, bool reliable); + void send(session_t peer_id, u8 channelnum, NetworkPacket *pkt, bool reliable); /* send to all clients */ void sendToAll(NetworkPacket *pkt); void sendToAllCompat(NetworkPacket *pkt, NetworkPacket *legacypkt, u16 min_proto_ver); /* delete a client */ - void DeleteClient(u16 peer_id); + void DeleteClient(session_t peer_id); /* create client */ - void CreateClient(u16 peer_id); + void CreateClient(session_t peer_id); /* get a client by peer_id */ - RemoteClient* getClientNoEx(u16 peer_id, ClientState state_min=CS_Active); + RemoteClient *getClientNoEx(session_t peer_id, ClientState state_min = CS_Active); /* get client by peer_id (make sure you have list lock before!*/ - RemoteClient* lockedGetClientNoEx(u16 peer_id, ClientState state_min=CS_Active); + RemoteClient *lockedGetClientNoEx(session_t peer_id, ClientState state_min = CS_Active); /* get state of client by id*/ - ClientState getClientState(u16 peer_id); + ClientState getClientState(session_t peer_id); /* set client playername */ - void setPlayerName(u16 peer_id,std::string name); + void setPlayerName(session_t peer_id, const std::string &name); /* get protocol version of client */ - u16 getProtocolVersion(u16 peer_id); + u16 getProtocolVersion(session_t peer_id); /* set client version */ - void setClientVersion(u16 peer_id, u8 major, u8 minor, u8 patch, std::string full); + void setClientVersion(session_t peer_id, u8 major, u8 minor, u8 patch, + const std::string &full); /* event to update client state */ - void event(u16 peer_id, ClientStateEvent event); + void event(session_t peer_id, ClientStateEvent event); /* Set environment. Do not call this function if environment is already set */ void setEnv(ServerEnvironment *env) @@ -485,7 +502,7 @@ class ClientInterface { // Connection std::shared_ptr m_con; - std::mutex m_clients_mutex; + std::recursive_mutex m_clients_mutex; // Connected clients (behind the con mutex) RemoteClientMap m_clients; std::vector m_clients_names; //for announcing masterserver