X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fclientiface.h;h=cb3dae04b71355b95b0dd9996ac2a05a92cf32c6;hb=b97c9c65777b0389f4cc9a6e3257506f29761e03;hp=a2315b3bd96d0d88aad95bfcdf0672e58012fcc7;hpb=e258675eabc874d31bc9c6cf49e4bbc1f7f3f417;p=oweals%2Fminetest.git diff --git a/src/clientiface.h b/src/clientiface.h index a2315b3bd..cb3dae04b 100644 --- a/src/clientiface.h +++ b/src/clientiface.h @@ -34,30 +34,135 @@ class MapBlock; class ServerEnvironment; class EmergeManager; +/* + * State Transitions + + Start + (peer connect) + | + v + /-----------------\ + | | + | Created | + | | + \-----------------/ + | + | ++-----------------------------+ invalid playername, password +|IN: | or denied by mod +| TOSERVER_INIT |------------------------------ ++-----------------------------+ | + | | + | Auth ok | + | | ++-----------------------------+ | +|OUT: | | +| TOCLIENT_INIT | | ++-----------------------------+ | + | | + v | + /-----------------\ | + | | | + | InitSent | | + | | | + \-----------------/ +------------------ + | | | ++-----------------------------+ +-----------------------------+ | +|IN: | |OUT: | | +| TOSERVER_INIT2 | | TOCLIENT_ACCESS_DENIED | | ++-----------------------------+ +-----------------------------+ | + | | | + v v | + /-----------------\ /-----------------\ | + | | | | | + | InitDone | | Denied | | + | | | | | + \-----------------/ \-----------------/ | + | | ++-----------------------------+ | +|OUT: | | +| TOCLIENT_MOVEMENT | | +| TOCLIENT_ITEMDEF | | +| TOCLIENT_NODEDEF | | +| TOCLIENT_ANNOUNCE_MEDIA | | +| TOCLIENT_DETACHED_INVENTORY | | +| TOCLIENT_TIME_OF_DAY | | ++-----------------------------+ | + | | + | | + | ----------------------------------- | + v | | | + /-----------------\ v | + | | +-----------------------------+ | + | DefinitionsSent | |IN: | | + | | | TOSERVER_REQUEST_MEDIA | | + \-----------------/ | TOSERVER_RECEIVED_MEDIA | | + | +-----------------------------+ | + | ^ | | + | ----------------------------------- | + | | ++-----------------------------+ | +|IN: | | +| TOSERVER_CLIENT_READY | | ++-----------------------------+ | + | async | + v mod action | ++-----------------------------+ (ban,kick) | +|OUT: | | +| TOCLIENT_MOVE_PLAYER | | +| TOCLIENT_PRIVILEGES | | +| TOCLIENT_INVENTORY_FORMSPEC | | +| UpdateCrafting | | +| TOCLIENT_INVENTORY | | +| TOCLIENT_HP (opt) | | +| TOCLIENT_BREATH | | +| TOCLIENT_DEATHSCREEN | | ++-----------------------------+ | + | | + v | + /-----------------\ | + | |------------------------------------------------------ + | Active | + | |---------------------------------- + \-----------------/ timeout | + | +-----------------------------+ + | |OUT: | + | | TOCLIENT_DISCONNECT | + | +-----------------------------+ + | | + | v ++-----------------------------+ /-----------------\ +|IN: | | | +| TOSERVER_DISCONNECT |------------------->| Disconnecting | ++-----------------------------+ | | + \-----------------/ +*/ namespace con { class Connection; } +#define CI_ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0])) + enum ClientState { - Invalid, - Disconnecting, - Denied, - Created, - InitSent, - InitDone, - DefinitionsSent, - Active + CS_Invalid, + CS_Disconnecting, + CS_Denied, + CS_Created, + CS_InitSent, + CS_InitDone, + CS_DefinitionsSent, + CS_Active }; enum ClientStateEvent { - Init, - GotInit2, - SetDenied, - SetDefinitionsSent, - SetMediaSent, - Disconnect + CSE_Init, + CSE_GotInit2, + CSE_SetDenied, + CSE_SetDefinitionsSent, + CSE_SetClientReady, + CSE_Disconnect }; /* @@ -101,13 +206,17 @@ public: net_proto_version(0), m_time_from_building(9999), m_pending_serialization_version(SER_FMT_VER_INVALID), - m_state(Created), + m_state(CS_Created), m_nearest_unsent_d(0), m_nearest_unsent_reset_timer(0.0), m_excess_gotblocks(0), - m_nothing_to_send_counter(0), m_nothing_to_send_pause_timer(0.0), - m_name("") + m_name(""), + m_version_major(0), + m_version_minor(0), + m_version_patch(0), + m_full_version("unknown"), + m_connection_time(getTime(PRECISION_SECONDS)) { } ~RemoteClient() @@ -129,6 +238,14 @@ public: void SetBlockNotSent(v3s16 p); void SetBlocksNotSent(std::map &blocks); + /** + * tell client about this block being modified right now. + * this information is required to requeue the block in case it's "on wire" + * while modification is processed by server + * @param p position of modified block + */ + void ResendBlockIfOnWire(v3s16 p); + s32 SendingCount() { return m_blocks_sending.size(); @@ -178,6 +295,23 @@ public: void confirmSerializationVersion() { serialization_version = m_pending_serialization_version; } + /* get uptime */ + u32 uptime(); + + + /* set version information */ + void setVersionInfo(u8 major, u8 minor, u8 patch, std::string full) { + m_version_major = major; + m_version_minor = minor; + m_version_patch = patch; + m_full_version = full; + } + + /* read version information */ + u8 getMajor() { return m_version_major; } + u8 getMinor() { return m_version_minor; } + u8 getPatch() { return m_version_patch; } + std::string getVersion() { return m_full_version; } private: // Version is stored in here after INIT before INIT2 u8 m_pending_serialization_version; @@ -219,9 +353,26 @@ private: u32 m_excess_gotblocks; // CPU usage optimization - u32 m_nothing_to_send_counter; float m_nothing_to_send_pause_timer; + + /* + name of player using this client + */ std::string m_name; + + /* + client information + */ + u8 m_version_major; + u8 m_version_minor; + u8 m_version_patch; + + std::string m_full_version; + + /* + time this client was created + */ + const u32 m_connection_time; }; class ClientInterface { @@ -236,7 +387,7 @@ public: void step(float dtime); /* get list of active client id's */ - std::list getClientIDs(ClientState min_state=Active); + std::list getClientIDs(ClientState min_state=CS_Active); /* get list of client player names */ std::vector getPlayerNames(); @@ -254,10 +405,10 @@ public: void CreateClient(u16 peer_id); /* get a client by peer_id */ - RemoteClient* getClientNoEx(u16 peer_id, ClientState state_min=Active); + RemoteClient* getClientNoEx(u16 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=Active); + RemoteClient* lockedGetClientNoEx(u16 peer_id, ClientState state_min=CS_Active); /* get state of client by id*/ ClientState getClientState(u16 peer_id); @@ -268,6 +419,9 @@ public: /* get protocol version of client */ u16 getProtocolVersion(u16 peer_id); + /* set client version */ + void setClientVersion(u16 peer_id, u8 major, u8 minor, u8 patch, std::string full); + /* event to update client state */ void event(u16 peer_id, ClientStateEvent event); @@ -275,6 +429,8 @@ public: void setEnv(ServerEnvironment* env) { assert(m_env == 0); m_env = env; } + static std::string state2Name(ClientState state); + protected: //TODO find way to avoid this functions void Lock() @@ -301,6 +457,8 @@ private: JMutex m_env_mutex; float m_print_info_timer; + + static const char *statenames[]; }; #endif