summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/clientiface.cpp18
-rw-r--r--src/clientiface.h10
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,