#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 <list>
#include <vector>
#include <set>
+#include <memory>
#include <mutex>
class MapBlock;
{
CSE_Hello,
CSE_AuthAccept,
- CSE_InitLegacy,
CSE_GotInit2,
CSE_SetDenied,
CSE_SetDefinitionsSent,
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)
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; }
+ 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;
/* 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.
std::set<v3s16> 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;
std::map<v3s16, float> 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.
*/
There is an excess amount because the client sometimes
gets a block so late that the server sends it again,
and the client then sends two GOTBLOCKs.
- This is resetted by PrintInfo()
+ This is reset by PrintInfo()
*/
u32 m_excess_gotblocks = 0;
/*
client information
- */
+ */
u8 m_version_major = 0;
u8 m_version_minor = 0;
u8 m_version_patch = 0;
/* 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);
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; }