diff --git a/Client/mods/deathmatch/logic/CResource.cpp b/Client/mods/deathmatch/logic/CResource.cpp index dcf119ce46..3fd85ced89 100644 --- a/Client/mods/deathmatch/logic/CResource.cpp +++ b/Client/mods/deathmatch/logic/CResource.cpp @@ -317,10 +317,7 @@ void CResource::Load() else if (pResourceFile->IsAutoDownload()) { // Check the file contents - if (CChecksum::GenerateChecksumFromFileUnsafe(pResourceFile->GetName()) == pResourceFile->GetServerChecksum()) - { - } - else + if (CChecksum::GenerateChecksumFromFileUnsafe(pResourceFile->GetName()) != pResourceFile->GetServerChecksum()) { HandleDownloadedFileTrouble(pResourceFile, false); } diff --git a/Server/mods/deathmatch/logic/CResource.cpp b/Server/mods/deathmatch/logic/CResource.cpp index 279f1937a7..e22d2bdbaa 100644 --- a/Server/mods/deathmatch/logic/CResource.cpp +++ b/Server/mods/deathmatch/logic/CResource.cpp @@ -510,13 +510,14 @@ std::future CResource::GenerateChecksumForFile(CResourceFile* pResource if (!GetFilePath(pResourceFile->GetName(), strPath)) return SString(); - std::vector buffer; - FileLoad(strPath, buffer); - uint uiFileSize = buffer.size(); - const char* pFileContents = uiFileSize ? buffer.data() : ""; - CChecksum Checksum = CChecksum::GenerateChecksumFromBuffer(pFileContents, uiFileSize); - pResourceFile->SetLastChecksum(Checksum); - pResourceFile->SetLastFileSize(uiFileSize); + auto checksumOrError = CChecksum::GenerateChecksumFromFile(strPath); + if (std::holds_alternative(checksumOrError)) + { + return SString(std::get(checksumOrError)); + } + + pResourceFile->SetLastChecksum(std::get(checksumOrError)); + pResourceFile->SetLastFileSizeHint(FileSize(strPath)); // Check if file is blocked char szHashResult[33]; @@ -547,7 +548,7 @@ std::future CResource::GenerateChecksumForFile(CResourceFile* pResource if (pResourceFile->GetLastChecksum() != cachedChecksum) { - if (!FileSave(strCachedFilePath, pFileContents, uiFileSize)) + if (!FileCopy(strPath, strCachedFilePath)) { return SString("Could not copy '%s' to '%s'\n", *strPath, *strCachedFilePath); } diff --git a/Server/mods/deathmatch/logic/CResourceFile.h b/Server/mods/deathmatch/logic/CResourceFile.h index b61f332f36..2a4a6a2f2c 100644 --- a/Server/mods/deathmatch/logic/CResourceFile.h +++ b/Server/mods/deathmatch/logic/CResourceFile.h @@ -45,7 +45,7 @@ class CResourceFile eResourceType m_type; class CLuaMain* m_pVM; CChecksum m_checksum; // Checksum last time this was loaded, generated by GenerateChecksum() - uint m_uiFileSize; + uint m_uiFileSizeHint; map m_attributeMap; // Map of attributes from the meta.xml file public: @@ -65,9 +65,9 @@ class CResourceFile CChecksum GetLastChecksum() { return m_checksum; } void SetLastChecksum(CChecksum checksum) { m_checksum = checksum; } - void SetLastFileSize(uint uiFileSize) { m_uiFileSize = uiFileSize; } + void SetLastFileSizeHint(uint uiFileSizeHint) { m_uiFileSizeHint = uiFileSizeHint; } - double GetApproxSize() { return m_uiFileSize; } // Only used by download counters + uint GetSizeHint() { return m_uiFileSizeHint; } // Only used by download counters string GetMetaFileAttribute(const string& key) { return m_attributeMap[key]; } SString GetCachedPathFilename(bool bForceClientCachePath = false); }; diff --git a/Server/mods/deathmatch/logic/packets/CResourceStartPacket.cpp b/Server/mods/deathmatch/logic/packets/CResourceStartPacket.cpp index 2b6062ae9a..c27dbeb3c4 100644 --- a/Server/mods/deathmatch/logic/packets/CResourceStartPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CResourceStartPacket.cpp @@ -115,7 +115,7 @@ bool CResourceStartPacket::Write(NetBitStreamInterface& BitStream) const CChecksum checksum = (*iter)->GetLastChecksum(); BitStream.Write(checksum.ulCRC); BitStream.Write((const char*)checksum.md5.data, sizeof(checksum.md5.data)); - BitStream.Write((*iter)->GetApproxSize()); + BitStream.Write((double)(*iter)->GetSizeHint()); // Has to be double for bitstream format compatibility if ((*iter)->GetType() == CResourceScriptItem::RESOURCE_FILE_TYPE_CLIENT_FILE) { CResourceClientFileItem* pRCFItem = reinterpret_cast(*iter);