From 8ddaeed873548614bf237058dd71bb65c140f418 Mon Sep 17 00:00:00 2001 From: AnthonyFuller Date: Tue, 26 May 2026 19:40:37 +0100 Subject: [PATCH 1/8] [RushPKG] Comment out all usages of reference_table_dummy and surrounding code --- src/extract_hash_meta.cpp | 8 ++++---- src/generate_hash_meta_json.cpp | 2 +- src/generate_rpkg_from.cpp | 12 ++++++------ src/hash.h | 2 +- src/hash_meta_to_json.cpp | 10 +++++----- src/import_hash_meta.cpp | 6 +++--- src/import_hash_meta_json.cpp | 12 ++++++------ src/json_to_hash_meta.cpp | 24 ++++++++++++------------ src/lib/rpkg_dll.cpp | 12 ++++++------ src/mati.cpp | 6 +++--- src/sdef.cpp | 6 +++--- 11 files changed, 50 insertions(+), 50 deletions(-) diff --git a/src/extract_hash_meta.cpp b/src/extract_hash_meta.cpp index 6fbf44b..32a1aca 100644 --- a/src/extract_hash_meta.cpp +++ b/src/extract_hash_meta.cpp @@ -28,10 +28,10 @@ void rpkg_function::extract_hash_meta(const uint64_t i, const uint64_t j, std::s meta_data.push_back(*(reinterpret_cast(&rpkgs.at(i).hash.at(j).data.resource.reference_table_size) + k)); } - for (int k = 0; k < sizeof(hash::data.resource.reference_table_dummy); k++) { - meta_data.push_back( - *(reinterpret_cast(&rpkgs.at(i).hash.at(j).data.resource.reference_table_dummy) + k)); - } + //for (int k = 0; k < sizeof(hash::data.resource.reference_table_dummy); k++) { + // meta_data.push_back( + // *(reinterpret_cast(&rpkgs.at(i).hash.at(j).data.resource.reference_table_dummy) + k)); + //} for (int k = 0; k < sizeof(hash::data.resource.size_final); k++) { meta_data.push_back(*(reinterpret_cast(&rpkgs.at(i).hash.at(j).data.resource.size_final) + k)); diff --git a/src/generate_hash_meta_json.cpp b/src/generate_hash_meta_json.cpp index 3895d4a..6fc016c 100644 --- a/src/generate_hash_meta_json.cpp +++ b/src/generate_hash_meta_json.cpp @@ -19,7 +19,7 @@ std::string rpkg_function::generate_hash_meta_json(const uint64_t rpkg_index, co json["hash_size"] = rpkgs.at(rpkg_index).hash.at(hash_index).data.header.data_size; json["hash_resource_type"] = std::string(rpkgs.at(rpkg_index).hash.at(hash_index).hash_resource_type.data(), 4); json["hash_reference_table_size"] = rpkgs.at(rpkg_index).hash.at(hash_index).data.resource.reference_table_size; - json["hash_reference_table_dummy"] = rpkgs.at(rpkg_index).hash.at(hash_index).data.resource.reference_table_dummy; + //json["hash_reference_table_dummy"] = rpkgs.at(rpkg_index).hash.at(hash_index).data.resource.reference_table_dummy; json["hash_size_final"] = rpkgs.at(rpkg_index).hash.at(hash_index).data.resource.size_final; json["hash_size_in_memory"] = rpkgs.at(rpkg_index).hash.at(hash_index).data.resource.size_in_memory; json["hash_size_in_video_memory"] = rpkgs.at(rpkg_index).hash.at(hash_index).data.resource.size_in_video_memory; diff --git a/src/generate_rpkg_from.cpp b/src/generate_rpkg_from.cpp index 137b498..dad2920 100644 --- a/src/generate_rpkg_from.cpp +++ b/src/generate_rpkg_from.cpp @@ -303,7 +303,7 @@ void rpkg_function::generate_rpkg_from(std::string& input_path, std::string& out //temp_hash_data.hash_string = util::uint64_t_to_hex_string(meta_data.hash_value); temp_hash_data.hash_resource_type = meta_data.hash_resource_type; temp_hash_data.data.resource.reference_table_size = meta_data.data.resource.reference_table_size; - temp_hash_data.data.resource.reference_table_dummy = meta_data.data.resource.reference_table_dummy; + //temp_hash_data.data.resource.reference_table_dummy = meta_data.data.resource.reference_table_dummy; temp_hash_data.data.resource.size_final = static_cast(input_file_size); if (meta_data.data.resource.size_in_memory == 0xFFFFFFFF) { @@ -330,7 +330,7 @@ void rpkg_function::generate_rpkg_from(std::string& input_path, std::string& out //temp_hash_data.hash_string = hash_strings.at(files_index.at(i)); temp_hash_data.hash_resource_type = hash_resource_types.at(files_index.at(i)); temp_hash_data.data.resource.reference_table_size = 0x0; - temp_hash_data.data.resource.reference_table_dummy = 0x0; + //temp_hash_data.data.resource.reference_table_dummy = 0x0; temp_hash_data.data.resource.size_final = static_cast(input_file_size); temp_hash_data.data.resource.size_in_memory = static_cast(compressed_size_final); temp_hash_data.data.resource.size_in_video_memory = 0x0; @@ -359,7 +359,7 @@ void rpkg_function::generate_rpkg_from(std::string& input_path, std::string& out //temp_hash_data.hash_string = util::uint64_t_to_hex_string(meta_data.hash_value); temp_hash_data.hash_resource_type = meta_data.hash_resource_type; temp_hash_data.data.resource.reference_table_size = meta_data.data.resource.reference_table_size; - temp_hash_data.data.resource.reference_table_dummy = meta_data.data.resource.reference_table_dummy; + //temp_hash_data.data.resource.reference_table_dummy = meta_data.data.resource.reference_table_dummy; temp_hash_data.data.resource.size_final = static_cast(input_file_size); if (meta_data.data.resource.size_in_memory == 0xFFFFFFFF) { @@ -386,7 +386,7 @@ void rpkg_function::generate_rpkg_from(std::string& input_path, std::string& out //temp_hash_data.hash_string = hash_strings.at(files_index.at(i)); temp_hash_data.hash_resource_type = hash_resource_types.at(files_index.at(i)); temp_hash_data.data.resource.reference_table_size = 0x0; - temp_hash_data.data.resource.reference_table_dummy = 0x0; + //temp_hash_data.data.resource.reference_table_dummy = 0x0; temp_hash_data.data.resource.size_final = static_cast(input_file_size); temp_hash_data.data.resource.size_in_memory = static_cast(input_file_size); temp_hash_data.data.resource.size_in_video_memory = 0x0; @@ -565,8 +565,8 @@ void rpkg_function::generate_rpkg_from(std::string& input_path, std::string& out std::memcpy(&char4, &temp_rpkg_data.hash.at(i).data.resource.reference_table_size, sizeof(uint32_t)); file.write(char4, sizeof(uint32_t)); - std::memcpy(&char4, &temp_rpkg_data.hash.at(i).data.resource.reference_table_dummy, sizeof(uint32_t)); - file.write(char4, sizeof(uint32_t)); + //std::memcpy(&char4, &temp_rpkg_data.hash.at(i).data.resource.reference_table_dummy, sizeof(uint32_t)); + //file.write(char4, sizeof(uint32_t)); std::memcpy(&char4, &temp_rpkg_data.hash.at(i).data.resource.size_final, sizeof(uint32_t)); file.write(char4, sizeof(uint32_t)); std::memcpy(&char4, &temp_rpkg_data.hash.at(i).data.resource.size_in_memory, sizeof(uint32_t)); diff --git a/src/hash.h b/src/hash.h index d51a4e9..8f073ba 100644 --- a/src/hash.h +++ b/src/hash.h @@ -47,7 +47,7 @@ class hash { struct HashResource { char resource_type[4]; uint32_t reference_table_size = 0; - uint32_t reference_table_dummy = 0; + //uint32_t reference_table_dummy = 0; uint32_t size_final = 0; uint32_t size_in_memory = 0; uint32_t size_in_video_memory = 0; diff --git a/src/hash_meta_to_json.cpp b/src/hash_meta_to_json.cpp index 203840f..a06c5f4 100644 --- a/src/hash_meta_to_json.cpp +++ b/src/hash_meta_to_json.cpp @@ -86,11 +86,11 @@ void rpkg_function::hash_meta_to_json(std::string& input_path) { json_string += "\"hash_reference_table_size\":" + util::uint32_t_to_string(meta_data.data.resource.reference_table_size) + ","; - meta_file.read(input, sizeof(bytes4)); - std::memcpy(&bytes4, input, sizeof(bytes4)); - meta_data.data.resource.reference_table_dummy = bytes4; - json_string += "\"hash_reference_table_dummy\":" + - util::uint32_t_to_string(meta_data.data.resource.reference_table_dummy) + ","; + //meta_file.read(input, sizeof(bytes4)); + //std::memcpy(&bytes4, input, sizeof(bytes4)); + //meta_data.data.resource.reference_table_dummy = bytes4; + //json_string += "\"hash_reference_table_dummy\":" + + // util::uint32_t_to_string(meta_data.data.resource.reference_table_dummy) + ","; meta_file.read(input, sizeof(bytes4)); std::memcpy(&bytes4, input, sizeof(bytes4)); diff --git a/src/import_hash_meta.cpp b/src/import_hash_meta.cpp index 3d5dcc2..d11005e 100644 --- a/src/import_hash_meta.cpp +++ b/src/import_hash_meta.cpp @@ -52,9 +52,9 @@ void rpkg_function::import_hash_meta(hash& meta_data, const std::string& hash_me std::memcpy(&bytes4, input, sizeof(bytes4)); meta_data.data.resource.reference_table_size = bytes4; - meta_file.read(input, sizeof(bytes4)); - std::memcpy(&bytes4, input, sizeof(bytes4)); - meta_data.data.resource.reference_table_dummy = bytes4; + //meta_file.read(input, sizeof(bytes4)); + //std::memcpy(&bytes4, input, sizeof(bytes4)); + //meta_data.data.resource.reference_table_dummy = bytes4; meta_file.read(input, sizeof(bytes4)); std::memcpy(&bytes4, input, sizeof(bytes4)); diff --git a/src/import_hash_meta_json.cpp b/src/import_hash_meta_json.cpp index ec0b04d..d7e56d9 100644 --- a/src/import_hash_meta_json.cpp +++ b/src/import_hash_meta_json.cpp @@ -90,12 +90,12 @@ bool rpkg_function::import_hash_meta_json(hash& meta_data, const std::string& in } // hash_reference_table_dummy - const rapidjson::Value& hash_reference_table_dummy = document["hash_reference_table_dummy"]; - if (hash_reference_table_dummy.IsNull()) { - LOG("Error: hash_reference_table_dummy is missing from the JSON."); - return false; - } - meta_data.data.resource.reference_table_dummy = hash_reference_table_dummy.GetUint(); + //const rapidjson::Value& hash_reference_table_dummy = document["hash_reference_table_dummy"]; + //if (hash_reference_table_dummy.IsNull()) { + // LOG("Error: hash_reference_table_dummy is missing from the JSON."); + // return false; + //} + //meta_data.data.resource.reference_table_dummy = hash_reference_table_dummy.GetUint(); // hash_size_final const rapidjson::Value& hash_size_final = document["hash_size_final"]; diff --git a/src/json_to_hash_meta.cpp b/src/json_to_hash_meta.cpp index 2c86d96..35a4ad2 100644 --- a/src/json_to_hash_meta.cpp +++ b/src/json_to_hash_meta.cpp @@ -150,25 +150,25 @@ std::vector rpkg_function::json_to_hash_meta(std::string& json_string) { meta_data.push_back(j); } - const rapidjson::Value& hash_reference_table_dummy = document["hash_reference_table_dummy"]; + //const rapidjson::Value& hash_reference_table_dummy = document["hash_reference_table_dummy"]; - if (hash_reference_table_dummy.IsNull()) { - LOG("Error: hash_reference_table_dummy is missing from the JSON."); + //if (hash_reference_table_dummy.IsNull()) { + // LOG("Error: hash_reference_table_dummy is missing from the JSON."); - response_string = "Error: hash_reference_table_dummy is missing from the JSON."; + // response_string = "Error: hash_reference_table_dummy is missing from the JSON."; - return {}; - } + // return {}; + //} - std::cout << hash_reference_table_dummy.GetUint() << std::endl; + //std::cout << hash_reference_table_dummy.GetUint() << std::endl; - temp_uint32_t = hash_reference_table_dummy.GetUint(); + //temp_uint32_t = hash_reference_table_dummy.GetUint(); - std::memcpy(&char4, &temp_uint32_t, 0x4); + //std::memcpy(&char4, &temp_uint32_t, 0x4); - for (char& j : char4) { - meta_data.push_back(j); - } + //for (char& j : char4) { + // meta_data.push_back(j); + //} const rapidjson::Value& hash_size_final = document["hash_size_final"]; diff --git a/src/lib/rpkg_dll.cpp b/src/lib/rpkg_dll.cpp index bf40f18..c0cec72 100644 --- a/src/lib/rpkg_dll.cpp +++ b/src/lib/rpkg_dll.cpp @@ -1874,8 +1874,8 @@ int modify_hash_depends(char* rpkg_file, char* hash_string, char* hash_list, cha std::memcpy(&char4, &rpkg.hash.at(j).data.resource.reference_table_size, sizeof(uint32_t)); temp_file_output.write(char4, sizeof(uint32_t)); - std::memcpy(&char4, &rpkg.hash.at(j).data.resource.reference_table_dummy, sizeof(uint32_t)); - temp_file_output.write(char4, sizeof(uint32_t)); + //std::memcpy(&char4, &rpkg.hash.at(j).data.resource.reference_table_dummy, sizeof(uint32_t)); + //temp_file_output.write(char4, sizeof(uint32_t)); std::memcpy(&char4, &rpkg.hash.at(j).data.resource.size_final, sizeof(uint32_t)); temp_file_output.write(char4, sizeof(uint32_t)); std::memcpy(&char4, &rpkg.hash.at(j).data.resource.size_in_memory, sizeof(uint32_t)); @@ -1919,8 +1919,8 @@ int modify_hash_depends(char* rpkg_file, char* hash_string, char* hash_list, cha std::memcpy(&char4, &temp_hash_reference_table_size, sizeof(uint32_t)); temp_file_output.write(char4, sizeof(uint32_t)); - std::memcpy(&char4, &rpkg.hash.at(j).data.resource.reference_table_dummy, sizeof(uint32_t)); - temp_file_output.write(char4, sizeof(uint32_t)); + //std::memcpy(&char4, &rpkg.hash.at(j).data.resource.reference_table_dummy, sizeof(uint32_t)); + //temp_file_output.write(char4, sizeof(uint32_t)); std::memcpy(&char4, &rpkg.hash.at(j).data.resource.size_final, sizeof(uint32_t)); temp_file_output.write(char4, sizeof(uint32_t)); std::memcpy(&char4, &rpkg.hash.at(j).data.resource.size_in_memory, sizeof(uint32_t)); @@ -1961,8 +1961,8 @@ int modify_hash_depends(char* rpkg_file, char* hash_string, char* hash_list, cha std::memcpy(&char4, &rpkg.hash.at(j).data.resource.reference_table_size, sizeof(uint32_t)); temp_file_output.write(char4, sizeof(uint32_t)); - std::memcpy(&char4, &rpkg.hash.at(j).data.resource.reference_table_dummy, sizeof(uint32_t)); - temp_file_output.write(char4, sizeof(uint32_t)); + //std::memcpy(&char4, &rpkg.hash.at(j).data.resource.reference_table_dummy, sizeof(uint32_t)); + //temp_file_output.write(char4, sizeof(uint32_t)); std::memcpy(&char4, &rpkg.hash.at(j).data.resource.size_final, sizeof(uint32_t)); temp_file_output.write(char4, sizeof(uint32_t)); std::memcpy(&char4, &rpkg.hash.at(j).data.resource.size_in_memory, sizeof(uint32_t)); diff --git a/src/mati.cpp b/src/mati.cpp index 52d4510..e471866 100644 --- a/src/mati.cpp +++ b/src/mati.cpp @@ -759,9 +759,9 @@ mati::mati(std::string mati_path, std::string mati_meta_path, uint64_t hash_valu std::memcpy(&bytes4, input, sizeof(bytes4)); meta_data.data.resource.reference_table_size = bytes4; - mati_meta_file.read(input, sizeof(bytes4)); - std::memcpy(&bytes4, input, sizeof(bytes4)); - meta_data.data.resource.reference_table_dummy = bytes4; + //mati_meta_file.read(input, sizeof(bytes4)); + //std::memcpy(&bytes4, input, sizeof(bytes4)); + //meta_data.data.resource.reference_table_dummy = bytes4; mati_meta_file.read(input, sizeof(bytes4)); std::memcpy(&bytes4, input, sizeof(bytes4)); diff --git a/src/sdef.cpp b/src/sdef.cpp index fb0b5dd..4337aba 100644 --- a/src/sdef.cpp +++ b/src/sdef.cpp @@ -189,9 +189,9 @@ sdef::sdef(std::string sdef_path, std::string sdef_meta_path, uint64_t hash_valu std::memcpy(&bytes4, input, sizeof(bytes4)); meta_data.data.resource.reference_table_size = bytes4; - sdef_meta_file.read(input, sizeof(bytes4)); - std::memcpy(&bytes4, input, sizeof(bytes4)); - meta_data.data.resource.reference_table_dummy = bytes4; + //sdef_meta_file.read(input, sizeof(bytes4)); + //std::memcpy(&bytes4, input, sizeof(bytes4)); + //meta_data.data.resource.reference_table_dummy = bytes4; sdef_meta_file.read(input, sizeof(bytes4)); std::memcpy(&bytes4, input, sizeof(bytes4)); From 0a5b2d5057c88c00271bc989cf5c6a0f0e4c4aa2 Mon Sep 17 00:00:00 2001 From: AnthonyFuller Date: Tue, 26 May 2026 20:12:55 +0100 Subject: [PATCH 2/8] [GoneUI] Comment out audio player logic for WWEM/S and WWEV --- rpkg-gui/MainWindow.xaml.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpkg-gui/MainWindow.xaml.cs b/rpkg-gui/MainWindow.xaml.cs index 41e7cdc..70eac5b 100644 --- a/rpkg-gui/MainWindow.xaml.cs +++ b/rpkg-gui/MainWindow.xaml.cs @@ -851,7 +851,7 @@ private void MainTreeView_AfterSelect(object sender, System.Windows.Forms.TreeVi } } - if (resourceType == "WWEM" || resourceType == "WWES") + /*if (resourceType == "WWEM" || resourceType == "WWES") { if (OGGPlayerTimer != null) { @@ -1036,7 +1036,7 @@ private void MainTreeView_AfterSelect(object sender, System.Windows.Forms.TreeVi FirstTabRight.IsSelected = true; } - } + }*/ } //GC.Collect(); From 7c0dcf8e4b769e7807667b6bd2888f0a96942662 Mon Sep 17 00:00:00 2001 From: AnthonyFuller Date: Tue, 26 May 2026 20:41:43 +0100 Subject: [PATCH 3/8] [RushPKG] Update thumbs + l10n XTEA keys --- src/crypto.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/crypto.cpp b/src/crypto.cpp index 5266385..f85862f 100644 --- a/src/crypto.cpp +++ b/src/crypto.cpp @@ -1,8 +1,8 @@ #include "crypto.h" constexpr unsigned int num_rounds = 32; -constexpr uint32_t l10n_key[4] = {0x53527737, 0x7506499E, 0xBD39AEE3, 0xA59E7268}; -constexpr uint32_t thumbs_key[4] = {0x30F95282, 0x1F48C419, 0x295F8548, 0x2A78366D}; +constexpr uint32_t l10n_key[4] = {0x68AC3361, 0x562B4AA0, 0xB9F2771F, 0x28EB3CE7}; +constexpr uint32_t thumbs_key[4] = {0x71482CF0, 0x5FDC4B9F, 0x86CE569D, 0x0509FC1E}; constexpr uint32_t thumbs_delta = 0x61C88647; constexpr uint32_t l10n_delta = 0x9E3779B9; From d6bb6c884fd0564496c386be5b122e9f4eabdd3f Mon Sep 17 00:00:00 2001 From: Notex Date: Wed, 27 May 2026 10:08:42 +1000 Subject: [PATCH 4/8] Use 01 in hash calculator --- rpkg-gui/HashCalculator.xaml.cs | 2 +- src/compute_ioi_hash.cpp | 2 +- src/compute_ioi_hash_from_file.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rpkg-gui/HashCalculator.xaml.cs b/rpkg-gui/HashCalculator.xaml.cs index 694731e..54460d4 100644 --- a/rpkg-gui/HashCalculator.xaml.cs +++ b/rpkg-gui/HashCalculator.xaml.cs @@ -96,7 +96,7 @@ private string checkHashes(string inputtext, Canceller canceller) byte[] stringBytes = Encoding.UTF8.GetBytes(lineString); byte[] hashBytes = md5.ComputeHash(stringBytes); - StringBuilder ioiHashsb = new StringBuilder("00", 16); + StringBuilder ioiHashsb = new StringBuilder("01", 16); for (int i = 1; i < 8; i++) { ioiHashsb.Append(hashBytes[i].ToString("X2")); diff --git a/src/compute_ioi_hash.cpp b/src/compute_ioi_hash.cpp index fd751f3..21516cf 100644 --- a/src/compute_ioi_hash.cpp +++ b/src/compute_ioi_hash.cpp @@ -28,7 +28,7 @@ std::string generic_function::compute_ioi_hash(const std::string& input_to_ioi_h std::stringstream ss; - ss << "00"; + ss << "01"; for (uint64_t m = 1; m < 8; m++) { ss << std::hex << std::setw(2) << std::setfill('0') << std::uppercase << static_cast(signature[m]); diff --git a/src/compute_ioi_hash_from_file.cpp b/src/compute_ioi_hash_from_file.cpp index 961aee1..44036d1 100644 --- a/src/compute_ioi_hash_from_file.cpp +++ b/src/compute_ioi_hash_from_file.cpp @@ -61,7 +61,7 @@ void generic_function::compute_ioi_hash_from_file(std::string& input_path) { ss.str(std::string()); - ss << "00"; + ss << "01"; for (uint64_t m = 1; m < 8; m++) { ss << std::hex << std::setw(2) << std::setfill('0') << std::uppercase << static_cast(signature[m]); From 24f1b929c395ed5f4d83ac2e2dfa4189a34c37a5 Mon Sep 17 00:00:00 2001 From: AnthonyFuller Date: Wed, 27 May 2026 22:22:35 +0100 Subject: [PATCH 5/8] [RushPKG] Use Bond-Hashes instead of Hitman-Hashes --- .github/workflows/build.yml | 2 +- rpkg-gui/DownloadExtractionProgress.xaml.cs | 4 ++-- rpkg-gui/MainWindow.xaml.cs | 6 +++--- src/load_master_hash_list.cpp | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c0a2939..72e436e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -46,7 +46,7 @@ jobs: - name: Fetch hash lists run: | mkdir _rpkg - Invoke-WebRequest -Uri "https://github.com/glacier-modding/Hitman-Hashes/releases/latest/download/latest-hashes.7z" -OutFile "latest-hashes.7z" + Invoke-WebRequest -Uri "https://github.com/glacier-modding/Bond-Hashes/releases/latest/download/latest-hashes.7z" -OutFile "latest-hashes.7z" Invoke-WebRequest -Uri "https://github.com/glacier-modding/Hitman-l10n-Hashes/releases/latest/download/hash_list.hmla" -OutFile "_rpkg/hash_list.hmla" - name: Prepare build diff --git a/rpkg-gui/DownloadExtractionProgress.xaml.cs b/rpkg-gui/DownloadExtractionProgress.xaml.cs index 6c5c4b5..2a4c10c 100644 --- a/rpkg-gui/DownloadExtractionProgress.xaml.cs +++ b/rpkg-gui/DownloadExtractionProgress.xaml.cs @@ -57,7 +57,7 @@ private void Window_Loaded(object sender, RoutedEventArgs e) webClient.DownloadFileCompleted += WebClient_DownloadFileCompleted; - Uri uri = new Uri("https://github.com/glacier-modding/Hitman-Hashes/releases/latest/download/latest-hashes.7z"); + Uri uri = new Uri("https://github.com/glacier-modding/Bond-Hashes/releases/latest/download/latest-hashes.7z"); webClient.DownloadFileAsync(uri, "latest-hashes.7z"); } @@ -118,7 +118,7 @@ void worker_DoWork(object sender, DoWorkEventArgs e) { HttpClient http = new HttpClient() { Timeout = TimeSpan.FromSeconds(10) }; - int.TryParse(http.GetAsync("https://github.com/glacier-modding/Hitman-Hashes/releases/latest/download/version").Result.Content.ReadAsStringAsync().Result, out currentVersionAvailable); + int.TryParse(http.GetAsync("https://github.com/glacier-modding/Bond-Hashes/releases/latest/download/version").Result.Content.ReadAsStringAsync().Result, out currentVersionAvailable); } else if (operation == 4) { diff --git a/rpkg-gui/MainWindow.xaml.cs b/rpkg-gui/MainWindow.xaml.cs index 70eac5b..c7f733f 100644 --- a/rpkg-gui/MainWindow.xaml.cs +++ b/rpkg-gui/MainWindow.xaml.cs @@ -146,7 +146,7 @@ private void DownloadExtractHashList() { DownloadExtractionProgress downloadExtractionProgress1 = new DownloadExtractionProgress(); downloadExtractionProgress1.operation = 0; - downloadExtractionProgress1.message.Content = "Downloading https://github.com/glacier-modding/Hitman-Hashes/releases/latest/download/latest-hashes.7z..."; + downloadExtractionProgress1.message.Content = "Downloading https://github.com/glacier-modding/Bond-Hashes/releases/latest/download/latest-hashes.7z..."; downloadExtractionProgress1.ShowDialog(); DownloadExtractionProgress downloadExtractionProgress2 = new DownloadExtractionProgress(); @@ -201,7 +201,7 @@ private void Window_Loaded(object sender, RoutedEventArgs e) if (!File.Exists("hash_list.txt")) { MessageQuestion messageBox = new MessageQuestion(); - messageBox.message.Content = "Error: The hash list file (hash__list.txt) is missing.\n\nIt's necessary for several functions.\n\nClick OK to automatically download it.\n\nYou can also download it manually from https://github.com/glacier-modding/Hitman-Hashes/releases/latest/download/latest-hashes.7z and extract it to the same directory as this program."; + messageBox.message.Content = "Error: The hash list file (hash__list.txt) is missing.\n\nIt's necessary for several functions.\n\nClick OK to automatically download it.\n\nYou can also download it manually from https://github.com/glacier-modding/Bond-Hashes/releases/latest/download/latest-hashes.7z and extract it to the same directory as this program."; messageBox.ShowDialog(); if (messageBox.buttonPressed == "OKButton") @@ -232,7 +232,7 @@ private void Window_Loaded(object sender, RoutedEventArgs e) DownloadExtractionProgress downloadExtractionProgress = new DownloadExtractionProgress(); downloadExtractionProgress.operation = (int)Progress.Operation.MASS_EXTRACT; downloadExtractionProgress.ProgressBar.IsIndeterminate = true; - downloadExtractionProgress.message.Content = "Checking https://github.com/glacier-modding/Hitman-Hashes/releases/latest/download/version to see if a new hash list is available..."; + downloadExtractionProgress.message.Content = "Checking https://github.com/glacier-modding/Bond-Hashes/releases/latest/download/version to see if a new hash list is available..."; downloadExtractionProgress.ShowDialog(); if (currentVersion < downloadExtractionProgress.currentVersionAvailable) diff --git a/src/load_master_hash_list.cpp b/src/load_master_hash_list.cpp index 61cca1f..6bc6389 100644 --- a/src/load_master_hash_list.cpp +++ b/src/load_master_hash_list.cpp @@ -18,10 +18,10 @@ void generic_function::load_hash_list(bool exit_if_no_hash_list, const std::stri } else { if (exit_if_no_hash_list) { LOG_AND_EXIT( - "\nError: hash_list.txt not found. Download the lastest hash_list.txt from https://github.com/glacier-modding/Hitman-Hashes/releases/latest/download/latest-hashes.7z\n"); + "\nError: hash_list.txt not found. Download the lastest hash_list.txt from https://github.com/glacier-modding/Bond-Hashes/releases/latest/download/latest-hashes.7z\n"); } else { LOG_AND_RETURN( - "\nError: hash_list.txt not found. Download the lastest hash_list.txt from https://github.com/glacier-modding/Hitman-Hashes/releases/latest/download/latest-hashes.7z\n"); + "\nError: hash_list.txt not found. Download the lastest hash_list.txt from https://github.com/glacier-modding/Bond-Hashes/releases/latest/download/latest-hashes.7z\n"); } } From 5009ddba910ae6977f4caf686c55490749387b18 Mon Sep 17 00:00:00 2001 From: Notex Date: Thu, 28 May 2026 12:02:52 +1000 Subject: [PATCH 6/8] [RPKG] Change ORES hash to KNT --- src/extract_ores_from.cpp | 2 +- src/lib/rpkg_dll.cpp | 6 +++--- src/search_repo.cpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/extract_ores_from.cpp b/src/extract_ores_from.cpp index e3a47cd..7f9c833 100644 --- a/src/extract_ores_from.cpp +++ b/src/extract_ores_from.cpp @@ -62,7 +62,7 @@ void rpkg_function::extract_ores_from(std::string& input_path, std::string& filt log_output = false; - uint64_t temp_hash_value = 0x00858D45F5F9E3CA; + uint64_t temp_hash_value = 0x01FBE4097B698967; uint32_t rpkg_index = rpkg_function::get_latest_hash(temp_hash_value); diff --git a/src/lib/rpkg_dll.cpp b/src/lib/rpkg_dll.cpp index c0cec72..c7d3f9c 100644 --- a/src/lib/rpkg_dll.cpp +++ b/src/lib/rpkg_dll.cpp @@ -2249,7 +2249,7 @@ uint32_t is_repo_loaded() { } uint32_t is_ores_loaded() { - uint64_t repo_hash_value = 0x00858D45F5F9E3CA; + uint64_t repo_hash_value = 0x01FBE4097B698967; uint32_t rpkg_index = rpkg_function::get_latest_hash(repo_hash_value); @@ -2273,7 +2273,7 @@ int load_repo() { auto it = rpkgs.at(repo_rpkg_index).hash_map.find(repo_hash_value); if (it != rpkgs.at(repo_rpkg_index).hash_map.end()) { - uint64_t ores_hash_value = 0x00858D45F5F9E3CA; + uint64_t ores_hash_value = 0x01FBE4097B698967; uint32_t ores_rpkg_index = rpkg_function::get_latest_hash(ores_hash_value); @@ -2304,7 +2304,7 @@ int load_repo_from_file(char* repo_path) { repos.emplace_back(repo_path); - uint64_t ores_hash_value = 0x00858D45F5F9E3CA; + uint64_t ores_hash_value = 0x01FBE4097B698967; uint32_t ores_rpkg_index = rpkg_function::get_latest_hash(ores_hash_value); diff --git a/src/search_repo.cpp b/src/search_repo.cpp index d3aae99..e1ce57f 100644 --- a/src/search_repo.cpp +++ b/src/search_repo.cpp @@ -39,7 +39,7 @@ void rpkg_function::search_repo(std::string& input_path, std::string& search, in const auto it = rpkgs.at(repo_rpkg_index).hash_map.find(repo_hash_value); if (it != rpkgs.at(repo_rpkg_index).hash_map.end()) { - constexpr uint64_t ores_hash_value = 0x00858D45F5F9E3CA; + constexpr uint64_t ores_hash_value = 0x01FBE4097B698967; const uint32_t ores_rpkg_index = rpkg_function::get_latest_hash(ores_hash_value); @@ -76,7 +76,7 @@ void rpkg_function::search_repo(std::string& input_path, std::string& search, in std::cout << repo_response_data << std::endl; } } else { - LOG_AND_RETURN("ORES hash 00858D45F5F9E3CA does not exist in any loaded RPKG files."); + LOG_AND_RETURN("ORES hash 01FBE4097B698967 does not exist in any loaded RPKG files."); } } } else { From d819b38d0a851179b70d8dd70dff0bd591875ef0 Mon Sep 17 00:00:00 2001 From: Notex Date: Sun, 31 May 2026 19:21:59 +1000 Subject: [PATCH 7/8] [RPKG] Fix RPKG generation --- src/generate_rpkg_from.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/generate_rpkg_from.cpp b/src/generate_rpkg_from.cpp index dad2920..ff93570 100644 --- a/src/generate_rpkg_from.cpp +++ b/src/generate_rpkg_from.cpp @@ -427,7 +427,7 @@ void rpkg_function::generate_rpkg_from(std::string& input_path, std::string& out table_size = 0x0; for (auto& j : temp_rpkg_data.hash) { - table_size += 0x18; + table_size += 0x14; table_size += j.data.resource.reference_table_size; } From a7a3367640ab3304cf75b87fd9010025a161f137 Mon Sep 17 00:00:00 2001 From: Notex Date: Fri, 26 Jun 2026 18:49:07 +1000 Subject: [PATCH 8/8] [RPKG] Use Game-Hashes repo instead --- .github/workflows/build.yml | 2 +- rpkg-gui/DownloadExtractionProgress.xaml.cs | 4 ++-- rpkg-gui/MainWindow.xaml.cs | 6 +++--- src/load_master_hash_list.cpp | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 72e436e..9da2da8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -46,7 +46,7 @@ jobs: - name: Fetch hash lists run: | mkdir _rpkg - Invoke-WebRequest -Uri "https://github.com/glacier-modding/Bond-Hashes/releases/latest/download/latest-hashes.7z" -OutFile "latest-hashes.7z" + Invoke-WebRequest -Uri "https://github.com/glacier-modding/Game-Hashes/releases/latest/download/latest-hashes.7z" -OutFile "latest-hashes.7z" Invoke-WebRequest -Uri "https://github.com/glacier-modding/Hitman-l10n-Hashes/releases/latest/download/hash_list.hmla" -OutFile "_rpkg/hash_list.hmla" - name: Prepare build diff --git a/rpkg-gui/DownloadExtractionProgress.xaml.cs b/rpkg-gui/DownloadExtractionProgress.xaml.cs index 2a4c10c..db7a3d2 100644 --- a/rpkg-gui/DownloadExtractionProgress.xaml.cs +++ b/rpkg-gui/DownloadExtractionProgress.xaml.cs @@ -57,7 +57,7 @@ private void Window_Loaded(object sender, RoutedEventArgs e) webClient.DownloadFileCompleted += WebClient_DownloadFileCompleted; - Uri uri = new Uri("https://github.com/glacier-modding/Bond-Hashes/releases/latest/download/latest-hashes.7z"); + Uri uri = new Uri("https://github.com/glacier-modding/Game-Hashes/releases/latest/download/latest-hashes.7z"); webClient.DownloadFileAsync(uri, "latest-hashes.7z"); } @@ -118,7 +118,7 @@ void worker_DoWork(object sender, DoWorkEventArgs e) { HttpClient http = new HttpClient() { Timeout = TimeSpan.FromSeconds(10) }; - int.TryParse(http.GetAsync("https://github.com/glacier-modding/Bond-Hashes/releases/latest/download/version").Result.Content.ReadAsStringAsync().Result, out currentVersionAvailable); + int.TryParse(http.GetAsync("https://github.com/glacier-modding/Game-Hashes/releases/latest/download/version").Result.Content.ReadAsStringAsync().Result, out currentVersionAvailable); } else if (operation == 4) { diff --git a/rpkg-gui/MainWindow.xaml.cs b/rpkg-gui/MainWindow.xaml.cs index c7f733f..75fb490 100644 --- a/rpkg-gui/MainWindow.xaml.cs +++ b/rpkg-gui/MainWindow.xaml.cs @@ -146,7 +146,7 @@ private void DownloadExtractHashList() { DownloadExtractionProgress downloadExtractionProgress1 = new DownloadExtractionProgress(); downloadExtractionProgress1.operation = 0; - downloadExtractionProgress1.message.Content = "Downloading https://github.com/glacier-modding/Bond-Hashes/releases/latest/download/latest-hashes.7z..."; + downloadExtractionProgress1.message.Content = "Downloading https://github.com/glacier-modding/Game-Hashes/releases/latest/download/latest-hashes.7z..."; downloadExtractionProgress1.ShowDialog(); DownloadExtractionProgress downloadExtractionProgress2 = new DownloadExtractionProgress(); @@ -201,7 +201,7 @@ private void Window_Loaded(object sender, RoutedEventArgs e) if (!File.Exists("hash_list.txt")) { MessageQuestion messageBox = new MessageQuestion(); - messageBox.message.Content = "Error: The hash list file (hash__list.txt) is missing.\n\nIt's necessary for several functions.\n\nClick OK to automatically download it.\n\nYou can also download it manually from https://github.com/glacier-modding/Bond-Hashes/releases/latest/download/latest-hashes.7z and extract it to the same directory as this program."; + messageBox.message.Content = "Error: The hash list file (hash__list.txt) is missing.\n\nIt's necessary for several functions.\n\nClick OK to automatically download it.\n\nYou can also download it manually from https://github.com/glacier-modding/Game-Hashes/releases/latest/download/latest-hashes.7z and extract it to the same directory as this program."; messageBox.ShowDialog(); if (messageBox.buttonPressed == "OKButton") @@ -232,7 +232,7 @@ private void Window_Loaded(object sender, RoutedEventArgs e) DownloadExtractionProgress downloadExtractionProgress = new DownloadExtractionProgress(); downloadExtractionProgress.operation = (int)Progress.Operation.MASS_EXTRACT; downloadExtractionProgress.ProgressBar.IsIndeterminate = true; - downloadExtractionProgress.message.Content = "Checking https://github.com/glacier-modding/Bond-Hashes/releases/latest/download/version to see if a new hash list is available..."; + downloadExtractionProgress.message.Content = "Checking https://github.com/glacier-modding/Game-Hashes/releases/latest/download/version to see if a new hash list is available..."; downloadExtractionProgress.ShowDialog(); if (currentVersion < downloadExtractionProgress.currentVersionAvailable) diff --git a/src/load_master_hash_list.cpp b/src/load_master_hash_list.cpp index 6bc6389..e836615 100644 --- a/src/load_master_hash_list.cpp +++ b/src/load_master_hash_list.cpp @@ -18,10 +18,10 @@ void generic_function::load_hash_list(bool exit_if_no_hash_list, const std::stri } else { if (exit_if_no_hash_list) { LOG_AND_EXIT( - "\nError: hash_list.txt not found. Download the lastest hash_list.txt from https://github.com/glacier-modding/Bond-Hashes/releases/latest/download/latest-hashes.7z\n"); + "\nError: hash_list.txt not found. Download the lastest hash_list.txt from https://github.com/glacier-modding/Game-Hashes/releases/latest/download/latest-hashes.7z\n"); } else { LOG_AND_RETURN( - "\nError: hash_list.txt not found. Download the lastest hash_list.txt from https://github.com/glacier-modding/Bond-Hashes/releases/latest/download/latest-hashes.7z\n"); + "\nError: hash_list.txt not found. Download the lastest hash_list.txt from https://github.com/glacier-modding/Game-Hashes/releases/latest/download/latest-hashes.7z\n"); } }