X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fclientiface.h;h=3e7ba4793a77352554cca45c1240f23bee554baa;hb=71a56c355223aa45a980c16329c88ba9ec8b3354;hp=6ba9ec73461999420593698499ad3dd7f2d6f289;hpb=ad7daf7b52348e1b71aa803be10de5b2134cba11;p=dragonfireclient.git diff --git a/src/clientiface.h b/src/clientiface.h index 6ba9ec734..3e7ba4793 100644 --- a/src/clientiface.h +++ b/src/clientiface.h @@ -25,11 +25,14 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "serialization.h" // for SER_FMT_VER_INVALID #include "network/networkpacket.h" #include "network/networkprotocol.h" +#include "network/address.h" #include "porting.h" +#include "threading/mutex_auto_lock.h" #include #include #include +#include #include class MapBlock; @@ -188,7 +191,6 @@ enum ClientStateEvent { CSE_Hello, CSE_AuthAccept, - CSE_InitLegacy, CSE_GotInit2, CSE_SetDenied, CSE_SetDefinitionsSent, @@ -241,12 +243,14 @@ class RemoteClient u32 allowed_auth_mechs = 0; u32 allowed_sudo_mechs = 0; + void resetChosenMech(); + bool isSudoMechAllowed(AuthMechanism mech) { return allowed_sudo_mechs & mech; } bool isMechAllowed(AuthMechanism mech) { return allowed_auth_mechs & mech; } - RemoteClient() = default; + RemoteClient(); ~RemoteClient() = default; /* @@ -274,6 +278,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 +342,14 @@ 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 &getFullVer() const { return m_full_version; } + + void setLangCode(const std::string &code) { m_lang_code = code; } + const std::string &getLangCode() const { return m_lang_code; } + + void setCachedAddress(const Address &addr) { m_addr = addr; } + const Address &getAddress() const { return m_addr; } + private: // Version is stored in here after INIT before INIT2 u8 m_pending_serialization_version = SER_FMT_VER_INVALID; @@ -340,6 +357,12 @@ class RemoteClient /* current state of client */ ClientState m_state = CS_Created; + // Cached here so retrieval doesn't have to go to connection API + Address m_addr; + + // Client sent language code + std::string m_lang_code; + /* Blocks that have been sent to client. - These don't have to be sent again. @@ -352,7 +375,14 @@ class RemoteClient std::set m_blocks_sent; s16 m_nearest_unsent_d = 0; v3s16 m_last_center; - float m_nearest_unsent_reset_timer = 0.0f; + v3f m_last_camera_dir; + + 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. @@ -365,10 +395,10 @@ class RemoteClient std::map m_blocks_sending; /* - Blocks that have been modified since last sending them. - These blocks will not be marked as sent, even if the - client reports it has received them to account for blocks - that are being modified while on the line. + Blocks that have been modified since blocks were + sent to the client last (getNextBlocks()). + This is used to reset the unsent distance, so that + modified blocks are resent to the client. List of block positions. */ @@ -393,7 +423,7 @@ class RemoteClient /* client information - */ + */ u8 m_version_major = 0; u8 m_version_minor = 0; u8 m_version_patch = 0; @@ -422,7 +452,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(); @@ -435,7 +468,6 @@ class ClientInterface { /* send to all clients */ void sendToAll(NetworkPacket *pkt); - void sendToAllCompat(NetworkPacket *pkt, NetworkPacket *legacypkt, u16 min_proto_ver); /* delete a client */ void DeleteClient(session_t peer_id); @@ -474,9 +506,13 @@ class ClientInterface { static std::string state2Name(ClientState state); protected: - //TODO find way to avoid this functions - void lock() { m_clients_mutex.lock(); } - void unlock() { m_clients_mutex.unlock(); } + class AutoLock { + public: + AutoLock(ClientInterface &iface): m_lock(iface.m_clients_mutex) {} + + private: + RecursiveMutexAutoLock m_lock; + }; RemoteClientMap& getClientList() { return m_clients; } @@ -486,7 +522,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