瀏覽代碼

Minor code improvement and fixes for capability to work with extractor

Ivan Arkhipov 6 年之前
父節點
當前提交
1944fe58d4
共有 9 個文件被更改,包括 29 次插入22 次删除
  1. 1 0
      .gitignore
  2. 2 4
      CHANGELOG
  3. 1 1
      include/DatException.h
  4. 二進制
      lib/libLotroDat.dll.a
  5. 二進制
      lib/libLotroDat_static.a
  6. 14 6
      src/DatFile.cpp
  7. 1 1
      src/Examples/extractor_example.cpp
  8. 6 7
      src/SubDirectory.cpp
  9. 4 3
      src/Subfile.cpp

+ 1 - 0
.gitignore

@@ -20,3 +20,4 @@ debug_build
 release_build
 /bin
 /install
+!/bin/LotRO_dat_pat_tester.exe

+ 2 - 4
CHANGELOG

@@ -19,7 +19,5 @@ Version 3.0.0
 ----------------------------------------------------------------------
 Version 3.1.0
     * Fixed issue with incorrect applying patch to files with inactive category
-----------------------------------------------------------------------
-
-
-    
+    * Minor code improvement and fixes for capability to work with extractor
+----------------------------------------------------------------------

+ 1 - 1
include/DatException.h

@@ -49,7 +49,7 @@ namespace LOTRO_DAT
 
         ~DatException() override
         {
-            delete msg_;
+            delete[] msg_;
         }
 
         const char* what() const noexcept override

二進制
lib/libLotroDat.dll.a


二進制
lib/libLotroDat_static.a


+ 14 - 6
src/DatFile.cpp

@@ -13,6 +13,11 @@
 #include <locale>
 #include <algorithm>
 
+#ifdef WIN32
+#define fseek _fseeki64
+#define ftell _ftelli64
+#endif
+
 extern "C++"
 {
 namespace LOTRO_DAT {
@@ -332,9 +337,9 @@ namespace LOTRO_DAT {
     /// Returns BinaryData, which contains of subfile data, made from parts of file in DatFile
 
     BinaryData DatFile::GetFileData(const Subfile *file, long long int offset) {
-        BinaryData mfile_id(4);
-        ReadData(mfile_id, 4, file->file_offset() + 8);
-        if (file->file_id() != mfile_id.ToNumber<4>(0))
+        BinaryData mfile_id(20);
+        ReadData(mfile_id, 20, file->file_offset() + 8);
+        if (!mfile_id.CheckCompression() && file->file_id() != mfile_id.ToNumber<4>(0))
             throw DatException("Bad DatFile::GetFileData() - file_id in Subfile doesn't match to file_id in DatFile.", READ_EXCEPTION);
 
         BinaryData data((unsigned)(file->file_size() + (8 - offset)));
@@ -463,7 +468,7 @@ namespace LOTRO_DAT {
             throw DatException(err.c_str(), READ_EXCEPTION);
         }
 
-        _fseeki64(file_handler_, offset, SEEK_SET);
+        fseek(file_handler_, offset, SEEK_SET);
         fread(data.data() + data_offset, unsigned(size), 1, file_handler_);
         data.CheckCompression();
     }
@@ -472,7 +477,7 @@ namespace LOTRO_DAT {
         if (dat_state_ < READY)
             throw DatException("Bad DatFile::WriteData() - DatFile isn't in valid state!", WRITE_EXCEPTION);
 
-       _fseeki64(file_handler_, offset, SEEK_SET);
+       fseek(file_handler_, offset, SEEK_SET);
         if (data_offset + size > data.size())
             throw DatException("Bad DatFile::WriteData - trying to write more than BinaryData size", WRITE_EXCEPTION);
 
@@ -657,7 +662,10 @@ namespace LOTRO_DAT {
 
     void DatFile::InitLocales() {
         std::cout << "Initialising locales..." << std::endl;
-        BinaryData dicts_data = GetFileData(dictionary_[2013266257]);
+        BinaryData dicts_data;
+
+        if (dictionary_.count(2013266257) != 0)
+            dicts_data = GetFileData(dictionary_[2013266257]);
 
         if (dicts_data.size() < 29) {
             fprintf(stderr, "WARNING: DatFile::InitLocales() - locales file is empty.. Initialising locale dicts as empty\n");

+ 1 - 1
src/Examples/extractor_example.cpp

@@ -36,7 +36,7 @@ const bool exportUnknownToDb = false;
 // There is no need to change anything else
 
 int main() {
-    std::cout << "Gi1dor's LotRO .dat extractor ver. 2.1.0" << std::endl;
+    std::cout << "Gi1dor's LotRO .dat extractor ver. 3.1.0" << std::endl;
     const clock_t begin_time = clock();
 
     mkdir("Extracted data", 744);

+ 6 - 7
src/SubDirectory.cpp

@@ -71,27 +71,26 @@ namespace LOTRO_DAT {
                 SubDirectory *subdir = new SubDirectory(data.ToNumber<4>(i + 4), dat_);
                 subdirs_.push_back(subdir);
             } catch (std::exception &e) {
-                fprintf(stderr, "Caught %s exception.", e.what());
-            
+                fprintf(stderr, "Caught %s exception.\n", e.what());
                 fprintf(stderr, "Making SubDirectory at offset %lld failed, continuing\n", data.ToNumber<4>(i + 4));
             }
         }
     }
 
     void SubDirectory::MakeSubFiles() {
-        BinaryData data(64 * 32);
+        BinaryData data(2048);
         dat_->ReadData(data, 64 * 32, offset_ + 63 * 8);
 
         for (unsigned int i = 0; i < 61 * 32; i += 32) {
             if (data.ToNumber<4>(i + 8) < 0x32 || data.ToNumber<4>(i + 12) < 0x32)
                 continue;
 
-            BinaryData mfile_id(4);
-            dat_->ReadData(mfile_id, 4, data.ToNumber<4>(i + 12) + 8);
-
-            if (data.ToNumber<4>(i + 8) != mfile_id.ToNumber<4>(0)) {
+            BinaryData mfile_id(20);
+            dat_->ReadData(mfile_id, 20, data.ToNumber<4>(i + 12) + 8);
+            if (!mfile_id.CheckCompression() && data.ToNumber<4>(i + 8) != mfile_id.ToNumber<4>(0)) {
                 continue;
             }
+
             subfiles_.push_back(
                     MakeSubfile(
                             offset_ + 63 * 8 + i,

+ 4 - 3
src/Subfile.cpp

@@ -19,6 +19,8 @@ namespace LOTRO_DAT {
     Subfile::Subfile() = default;
 
     Subfile::Subfile(DatFile *dat, const BinaryData &header) {
+        category = 0;
+
         dat_ = dat;
 
         fragments_count_ = header.ToNumber<4>(0); // fragments_count
@@ -29,15 +31,14 @@ namespace LOTRO_DAT {
         timestamp_ = header.ToNumber<4>(20); // timestamp
         version_ = header.ToNumber<4>(24); // version
         block_size_ = header.ToNumber<4>(28); // block_size
-        category = 0;
     }
 
     Subfile::Subfile(DatFile *dat, long long dictionary_offset, long long fragments_count, long long unknown1, long long file_id,
                                 long long file_offset,
                                 long long file_size, long long timestamp, long long version, long long block_size) :
-            dat_(dat), dictionary_offset_(dictionary_offset), fragments_count_(fragments_count), unknown1_(unknown1), file_id_(file_id),
+            category(0), dat_(dat), dictionary_offset_(dictionary_offset), fragments_count_(fragments_count), unknown1_(unknown1), file_id_(file_id),
             file_offset_(file_offset),
-            file_size_(file_size), timestamp_(timestamp), version_(version), block_size_(block_size), category(0) {
+            file_size_(file_size), timestamp_(timestamp), version_(version), block_size_(block_size) {
 
         if (file_size_ > MAXSIZE)
             throw DatException("Bad Subfile::Subfile() - File size is too much... Maybe it's incorrect..?",