about summary refs log tree commit diff
path: root/src/engine
diff options
context:
space:
mode:
authoroy <Tom_Adams@web.de>2011-02-16 12:07:54 +0100
committeroy <Tom_Adams@web.de>2011-02-16 12:07:54 +0100
commitb63dbfede548bb9eb0ad7a5b7a83a8a3fac1e1f1 (patch)
treeaeb3b858a3768e580868f2877e3fcc92822eb9e9 /src/engine
parent927954a53bd4d1322e5474fd054d3241212394c4 (diff)
downloadzcatch-b63dbfede548bb9eb0ad7a5b7a83a8a3fac1e1f1.tar.gz
zcatch-b63dbfede548bb9eb0ad7a5b7a83a8a3fac1e1f1.zip
fixed problems with map downloading if the map changes during download. Closes #236
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/client/client.cpp12
-rw-r--r--src/engine/server/server.cpp4
2 files changed, 11 insertions, 5 deletions
diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp
index a8e446ac..13e59ac5 100644
--- a/src/engine/client/client.cpp
+++ b/src/engine/client/client.cpp
@@ -1137,6 +1137,7 @@ void CClient::ProcessPacket(CNetChunk *pPacket)
 			{
 				const char *pMap = Unpacker.GetString(CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
 				int MapCrc = Unpacker.GetInt();
+				int MapSize = Unpacker.GetInt();
 				const char *pError = 0;
 
 				if(Unpacker.Error())
@@ -1148,6 +1149,9 @@ void CClient::ProcessPacket(CNetChunk *pPacket)
 						pError = "strange character in map name";
 				}
 
+				if(MapSize < 0)
+					pError = "invalid map size";
+
 				if(pError)
 					DisconnectWithReason(pError);
 				else
@@ -1174,7 +1178,7 @@ void CClient::ProcessPacket(CNetChunk *pPacket)
 							io_close(m_MapdownloadFile);
 						m_MapdownloadFile = Storage()->OpenFile(m_aMapdownloadFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE);
 						m_MapdownloadCrc = MapCrc;
-						m_MapdownloadTotalsize = -1;
+						m_MapdownloadTotalsize = MapSize;
 						m_MapdownloadAmount = 0;
 
 						CMsgPacker Msg(NETMSG_REQUEST_MAP_DATA);
@@ -1192,17 +1196,17 @@ void CClient::ProcessPacket(CNetChunk *pPacket)
 			else if(Msg == NETMSG_MAP_DATA)
 			{
 				int Last = Unpacker.GetInt();
-				int TotalSize = Unpacker.GetInt();
+				int MapCRC = Unpacker.GetInt();
+				int Chunk = Unpacker.GetInt();
 				int Size = Unpacker.GetInt();
 				const unsigned char *pData = Unpacker.GetRaw(Size);
 
 				// check fior errors
-				if(Unpacker.Error() || Size <= 0 || TotalSize <= 0 || !m_MapdownloadFile)
+				if(Unpacker.Error() || Size <= 0 || MapCRC != m_MapdownloadCrc || Chunk != m_MapdownloadChunk || !m_MapdownloadFile)
 					return;
 
 				io_write(m_MapdownloadFile, pData, Size);
 
-				m_MapdownloadTotalsize = TotalSize;
 				m_MapdownloadAmount += Size;
 
 				if(Last)
diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp
index 30cdf259..b6d465ac 100644
--- a/src/engine/server/server.cpp
+++ b/src/engine/server/server.cpp
@@ -585,6 +585,7 @@ void CServer::SendMap(int ClientID)
 	CMsgPacker Msg(NETMSG_MAP_CHANGE);
 	Msg.AddString(GetMapName(), 0);
 	Msg.AddInt(m_CurrentMapCrc);
+	Msg.AddInt(m_CurrentMapSize);
 	SendMsgEx(&Msg, MSGFLAG_VITAL|MSGFLAG_FLUSH, ClientID, true);
 }
 
@@ -685,7 +686,8 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
 				
 				CMsgPacker Msg(NETMSG_MAP_DATA);
 				Msg.AddInt(Last);
-				Msg.AddInt(m_CurrentMapSize);
+				Msg.AddInt(m_CurrentMapCrc);
+				Msg.AddInt(Chunk);
 				Msg.AddInt(ChunkSize);
 				Msg.AddRaw(&m_pCurrentMapData[Offset], ChunkSize);
 				SendMsgEx(&Msg, MSGFLAG_VITAL|MSGFLAG_FLUSH, ClientID, true);