diff options
-rw-r--r-- | src/clientiface.cpp | 18 | ||||
-rw-r--r-- | src/clientiface.h | 10 |
2 files changed, 22 insertions, 6 deletions
diff --git a/src/clientiface.cpp b/src/clientiface.cpp index 8a1a62694..a3a17d435 100644 --- a/src/clientiface.cpp +++ b/src/clientiface.cpp @@ -370,17 +370,21 @@ queue_full_break: void RemoteClient::GotBlock(v3s16 p) { - if(m_blocks_sending.find(p) != m_blocks_sending.end()) - m_blocks_sending.erase(p); - else - { - m_excess_gotblocks++; + if (m_blocks_modified.find(p) == m_blocks_modified.end()) { + if (m_blocks_sending.find(p) != m_blocks_sending.end()) + m_blocks_sending.erase(p); + else + m_excess_gotblocks++; + + m_blocks_sent.insert(p); } - m_blocks_sent.insert(p); } void RemoteClient::SentBlock(v3s16 p) { + if (m_blocks_modified.find(p) != m_blocks_modified.end()) + m_blocks_modified.erase(p); + if(m_blocks_sending.find(p) == m_blocks_sending.end()) m_blocks_sending[p] = 0.0; else @@ -397,6 +401,7 @@ void RemoteClient::SetBlockNotSent(v3s16 p) m_blocks_sending.erase(p); if(m_blocks_sent.find(p) != m_blocks_sent.end()) m_blocks_sent.erase(p); + m_blocks_modified.insert(p); } void RemoteClient::SetBlocksNotSent(std::map<v3s16, MapBlock*> &blocks) @@ -409,6 +414,7 @@ void RemoteClient::SetBlocksNotSent(std::map<v3s16, MapBlock*> &blocks) i != blocks.end(); ++i) { v3s16 p = i->first; + m_blocks_modified.insert(p); if(m_blocks_sending.find(p) != m_blocks_sending.end()) m_blocks_sending.erase(p); diff --git a/src/clientiface.h b/src/clientiface.h index d7622cad3..c09942909 100644 --- a/src/clientiface.h +++ b/src/clientiface.h @@ -395,6 +395,16 @@ private: 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. + + List of block positions. + */ + std::set<v3s16> m_blocks_modified; + + /* Count of excess GotBlocks(). There is an excess amount because the client sometimes gets a block so late that the server sends it again, |