Fix mapgen using unitialised height map values
[oweals/minetest.git] / src / clientiface.h
index 95f8bd30531241f25c80887b589ce98c216a3060..2f265b128f6010158a023b391a65c585d5325ddd 100644 (file)
@@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "constants.h"
 #include "serialization.h"             // for SER_FMT_VER_INVALID
 #include "jthread/jmutex.h"
+#include "network/networkpacket.h"
 
 #include <list>
 #include <vector>
@@ -141,37 +142,28 @@ namespace con {
        class Connection;
 }
 
+#define CI_ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))
+
 enum ClientState
 {
-       Invalid,
-       Disconnecting,
-       Denied,
-       Created,
-       InitSent,
-       InitDone,
-       DefinitionsSent,
-       Active
-};
-
-static const char* statenames[] = {
-       "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,
-       SetClientReady,
-       Disconnect
+       CSE_Init,
+       CSE_GotInit2,
+       CSE_SetDenied,
+       CSE_SetDefinitionsSent,
+       CSE_SetClientReady,
+       CSE_Disconnect
 };
 
 /*
@@ -215,11 +207,10 @@ 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_version_major(0),
@@ -248,6 +239,14 @@ public:
        void SetBlockNotSent(v3s16 p);
        void SetBlocksNotSent(std::map<v3s16, MapBlock*> &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();
@@ -355,7 +354,6 @@ private:
        u32 m_excess_gotblocks;
 
        // CPU usage optimization
-       u32 m_nothing_to_send_counter;
        float m_nothing_to_send_pause_timer;
 
        /*
@@ -390,16 +388,16 @@ public:
        void step(float dtime);
 
        /* get list of active client id's */
-       std::list<u16> getClientIDs(ClientState min_state=Active);
+       std::vector<u16> getClientIDs(ClientState min_state=CS_Active);
 
        /* get list of client player names */
        std::vector<std::string> getPlayerNames();
 
        /* send message to client */
-       void send(u16 peer_id, u8 channelnum, SharedBuffer<u8> data, bool reliable);
+       void send(u16 peer_id, u8 channelnum, NetworkPacket* pkt, bool reliable, bool deletepkt=true);
 
        /* send to all clients */
-       void sendToAll(u16 channelnum, SharedBuffer<u8> data, bool reliable);
+       void sendToAll(u16 channelnum, NetworkPacket* pkt, bool reliable);
 
        /* delete a client */
        void DeleteClient(u16 peer_id);
@@ -408,10 +406,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);
@@ -432,10 +430,7 @@ public:
        void setEnv(ServerEnvironment* env)
        { assert(m_env == 0); m_env = env; }
 
-       static std::string state2Name(ClientState state) {
-               assert(state < sizeof(statenames));
-               return statenames[state];
-       }
+       static std::string state2Name(ClientState state);
 
 protected:
        //TODO find way to avoid this functions
@@ -463,6 +458,8 @@ private:
        JMutex m_env_mutex;
 
        float m_print_info_timer;
+
+       static const char *statenames[];
 };
 
 #endif