소스 검색

Fixed (maybe) rare bug with patching files

Ivan Arkhipov 7 년 전
부모
커밋
738b56fb92
6개의 변경된 파일12개의 추가작업 그리고 1개의 파일을 삭제
  1. BIN
      bin/LotRO_dat_extractor.exe
  2. BIN
      bin/LotRO_dat_patcher.exe
  3. BIN
      lib/libLotroDat.dll.a
  4. BIN
      lib/libLotroDat_static.a
  5. 1 1
      src/DatFile.cpp
  6. 11 0
      src/SubDirectory.cpp

BIN
bin/LotRO_dat_extractor.exe


BIN
bin/LotRO_dat_patcher.exe


BIN
lib/libLotroDat.dll.a


BIN
lib/libLotroDat_static.a


+ 1 - 1
src/DatFile.cpp

@@ -645,7 +645,7 @@ namespace LOTRO_DAT {
 
         file->file_size_ = data.size() - 8;
 
-        if ((patch_dict_.count(file_id) == 0 && !rewrite_original) || data.size() > file->block_size()) {
+        if ((patch_dict_.count(file_id) == 0 && !rewrite_original) || data.size() + 8 > file->block_size()) {
             if (journal[0].second != file_size_) {
                 journal[0].second = file_size_;
             }

+ 11 - 0
src/SubDirectory.cpp

@@ -133,6 +133,12 @@ namespace LOTRO_DAT {
     void SubDirectory::UpdateDirectories(std::unordered_set<long long> &patched_files, std::unordered_map<long long, Subfile*> &dict) {
         for (auto subfile : subfiles_) {
             long long file_id = subfile->file_id();
+            if (!dat_->CorrectSubfile(subfile)) {
+                LOG(ERROR) << "While updating directories encountered incorrect subfile with id = "
+                           << file_id << " (offset = " << subfile->file_offset() << ").";
+                //dat_->WriteData(BinaryData::FromNumber<4>(62079999), 4, subfile->dictionary_offset() + 8);
+                continue;
+            }
 
             if (patched_files.count(file_id) != 0) {
                 BinaryData data(32);
@@ -140,8 +146,13 @@ namespace LOTRO_DAT {
 
                 auto new_subfile = dict[file_id];
 
+                //dat_->WriteData(BinaryData::FromNumber<4>(new_subfile->fragments_count()), 4, subfile->dictionary_offset());
+                //dat_->WriteData(BinaryData::FromNumber<4>(new_subfile->unknown1()), 4, subfile->dictionary_offset() + 4);
+                //dat_->WriteData(BinaryData::FromNumber<4>(new_subfile->file_id()), 4, subfile->dictionary_offset() + 8);
                 dat_->WriteData(BinaryData::FromNumber<4>(new_subfile->file_offset()), 4, subfile->dictionary_offset() + 12);
                 dat_->WriteData(BinaryData::FromNumber<4>(new_subfile->file_size()), 4, subfile->dictionary_offset() + 16);
+                //dat_->WriteData(BinaryData::FromNumber<4>(new_subfile->timestamp()), 4, subfile->dictionary_offset() + 20);
+                //dat_->WriteData(BinaryData::FromNumber<4>(new_subfile->version()), 4, subfile->dictionary_offset() + 24);
                 dat_->WriteData(BinaryData::FromNumber<4>(new_subfile ->block_size()), 4, subfile->dictionary_offset() + 28);
             }
         }