|
@@ -339,7 +339,7 @@ namespace LOTRO_DAT {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
- if (locale_status != 0 && locale_status != dat->GetIO().getHeaderHash()){
|
|
+ if (locale_status != 0 && locale_status != dat->GetIO().getHeaderHash()){
|
|
LOG(ERROR) << "CHCKLOCALECORRECT: Locale hash doesn't match!";
|
|
LOG(ERROR) << "CHCKLOCALECORRECT: Locale hash doesn't match!";
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
@@ -407,14 +407,21 @@ namespace LOTRO_DAT {
|
|
* ========================================
|
|
* ========================================
|
|
* Помимо этого:
|
|
* Помимо этого:
|
|
* 0x128-0x12C - 0, если выбрана локаль ORIGINAL и обновление клиентом игры не испортит .dat file
|
|
* 0x128-0x12C - 0, если выбрана локаль ORIGINAL и обновление клиентом игры не испортит .dat file
|
|
- * значение переменной-размера .dat файла (оффсет 0x148), в противном случае.
|
|
+ * хэш хедера файла в противном случае.
|
|
* Отличие значения в 0x128 от 0 и значения в 0x148 => файл ресурсов мог быть повреждён
|
|
* Отличие значения в 0x128 от 0 и значения в 0x148 => файл ресурсов мог быть повреждён
|
|
*
|
|
*
|
|
* 0x12C-0x130 - Офсет начала словаря локализации
|
|
* 0x12C-0x130 - Офсет начала словаря локализации
|
|
*/
|
|
*/
|
|
|
|
|
|
DatOperationResult<> DatLocaleManager::CommitLocales() {
|
|
DatOperationResult<> DatLocaleManager::CommitLocales() {
|
|
|
|
+ if (!dat->Initialized()) {
|
|
|
|
+ ClearData();
|
|
|
|
+ return DatOperationResult<>(SUCCESS);
|
|
|
|
+ }
|
|
|
|
+
|
|
if (patch_dict_.empty()) {
|
|
if (patch_dict_.empty()) {
|
|
|
|
+ ClearData();
|
|
|
|
+ dat->GetIO().WriteData(BinaryData::FromNumber<4>(0), 4, 296);
|
|
dat->GetIO().WriteData(BinaryData::FromNumber<4>(0), 4, 300);
|
|
dat->GetIO().WriteData(BinaryData::FromNumber<4>(0), 4, 300);
|
|
return DatOperationResult<>(SUCCESS);
|
|
return DatOperationResult<>(SUCCESS);
|
|
}
|
|
}
|
|
@@ -477,8 +484,10 @@ namespace LOTRO_DAT {
|
|
BinaryData::FromNumber<4>(dat->GetFileSystem().patched_file_end + binary_data.size() + 20 * 1024 * 1024), 8);
|
|
BinaryData::FromNumber<4>(dat->GetFileSystem().patched_file_end + binary_data.size() + 20 * 1024 * 1024), 8);
|
|
|
|
|
|
auto operation = dat->GetIO().WriteData(binary_data, binary_data.size(), new_dict_offset);
|
|
auto operation = dat->GetIO().WriteData(binary_data, binary_data.size(), new_dict_offset);
|
|
- if (operation.result != SUCCESS)
|
|
+ if (operation.result != SUCCESS) {
|
|
|
|
+ ClearData();
|
|
return DatOperationResult<>(ERROR, "LOCALEDEINIT: Cannot write locales");
|
|
return DatOperationResult<>(ERROR, "LOCALEDEINIT: Cannot write locales");
|
|
|
|
+ }
|
|
|
|
|
|
dat->GetIO().WriteData(BinaryData::FromNumber<4>(new_dict_offset), 4, 300);
|
|
dat->GetIO().WriteData(BinaryData::FromNumber<4>(new_dict_offset), 4, 300);
|
|
|
|
|
|
@@ -507,11 +516,22 @@ namespace LOTRO_DAT {
|
|
|
|
|
|
auto operation = dat->GetIO().WriteData(binary_data, binary_data.size(), dict_offset);
|
|
auto operation = dat->GetIO().WriteData(binary_data, binary_data.size(), dict_offset);
|
|
|
|
|
|
- if (operation.result != SUCCESS)
|
|
+ if (operation.result != SUCCESS) {
|
|
|
|
+ ClearData();
|
|
return DatOperationResult<>(ERROR, "LOCALEDEINIT: Cannot write locales. ERRMSG: " + operation.msg);
|
|
return DatOperationResult<>(ERROR, "LOCALEDEINIT: Cannot write locales. ERRMSG: " + operation.msg);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
LOG(INFO) << "Locales committed successfully";
|
|
LOG(INFO) << "Locales committed successfully";
|
|
|
|
+ ClearData();
|
|
return DatOperationResult<>(SUCCESS);
|
|
return DatOperationResult<>(SUCCESS);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ void DatLocaleManager::ClearData() {
|
|
|
|
+ orig_dict_.clear();
|
|
|
|
+ patch_dict_.clear();
|
|
|
|
+ inactive_categories.clear();
|
|
|
|
+ current_locale_ = LOCALE(-1);
|
|
|
|
+ }
|
|
}
|
|
}
|