17 Commits

7 changed files with 45 additions and 20 deletions

View File

@ -1,8 +1,8 @@
### Games and regions ### Games and regions
- **3rd**: glb/sea/cn/tw/kr/jp **v6.8.0+** - **3rd**: glb/sea/tw/kr/jp **v6.9.0+**, cn **v6.9.0+**
- **SR**: os/cn **v1.2.0** (potentially unsafe, but no bans were reported since v1.1.0) - **SR**: os/cn **v1.3.0** (potentially unsafe, but no bans were reported since v1.1.0)
**You can expect newer versions of 3rd to work immediately after release with the same jadeite binary.** However, that is not the case for SR: you will have to update your jadeite binary to run newer versions. You can expect newer versions to work immediately after release with the same jadeite binary if the version is specified with a + above (currently none).
### Information ### Information
The anticheat the games use is fundamentally incompatible with Wine in multiple ways. This tool launches the game without it (`injector`) and imitates it's behaviour (`game_payload`). The anticheat the games use is fundamentally incompatible with Wine in multiple ways. This tool launches the game without it (`injector`) and imitates it's behaviour (`game_payload`).
@ -18,7 +18,9 @@ The anticheat the games use is fundamentally incompatible with Wine in multiple
**Wine 8.0+ is recommended**, as lower versions leak "The Wine project" as the device identifier. Not critical, but taking a precaution never hurt anyone. **DXVK is strongly recommended.** **Wine 8.0+ is recommended**, as lower versions leak "The Wine project" as the device identifier. Not critical, but taking a precaution never hurt anyone. **DXVK is strongly recommended.**
**3rd-specific**: In some cases, and if you're not using Proton GE, **a fix for Media Foundation may be required to play videos. The Game may crash without it.** You can download it from [here](https://github.com/z0z0z/mf-install). You might need to [limit the number of cores available to the game](https://github.com/z0z0z/mf-install/issues/44) if your CPU has more than 8. **IMPORTANT: do not run the mfplat fix under Proton GE. Doing so may irreparably damage your game installation!** **3rd-specific**:
- ~~In some cases, and if you're not using Proton GE, a fix for Media Foundation may be required to play videos. The Game may crash without it. You can download it from [here](https://github.com/z0z0z/mf-install).~~ **Unfortunately, it appears like the fix is no longer available, please use [Wine-GE-Proton](https://github.com/GloriousEggroll/wine-ge-custom) instead.**
- You might need to [limit the number of cores available to the game](https://github.com/z0z0z/mf-install/issues/44) if your CPU has more than 8.
Manual usage instructions: Manual usage instructions:
- Download the game you want to run - Download the game you want to run

Binary file not shown.

View File

@ -1,18 +1,35 @@
#include <utils.h> #include <utils.h>
#include <msg.h> #include <msg.h>
#include <pe.h>
#include <main.h>
#include <game.h> #include <game.h>
const char *HI3_TXS_SECTION_NAME_OLD = ".bh3";
const char *HI3_TXS_SECTION_NAME_NEW = ".ace";
const char *HI3_BASE_MODULE_NAME = "BH3Base.dll"; const char *HI3_BASE_MODULE_NAME = "BH3Base.dll";
const char *HI3_ASSEMBLY_PATH = "BH3_Data\\Native\\UserAssembly.dll"; const char *HI3_ASSEMBLY_PATH = "BH3_Data\\Native\\UserAssembly.dll";
const char *HI3_TXS_SECTION_NAME = ".bh3";
const char *HI3_TVM_SECTION_NAME = ".tvm0"; const char *HI3_TVM_SECTION_NAME = ".tvm0";
void hi3_fill_data(struct game_data *buf) { void hi3_fill_data(struct game_data *buf) {
// !!! TEMPORARY WORKAROUND
// Name in exe matches name in base module
HMODULE exe = GetModuleHandleA(NULL);
if (pe_find_section(exe, HI3_TXS_SECTION_NAME_OLD)) {
// Old name
buf->txs_section_name = HI3_TXS_SECTION_NAME_OLD;
} else if (pe_find_section(exe, HI3_TXS_SECTION_NAME_NEW)) {
// New name
buf->txs_section_name = HI3_TXS_SECTION_NAME_NEW;
} else {
// This should not happen
msg_err_a("Could not determine region-specific section name. " ISSUE_SUFFIX);
}
buf->base_module_name = HI3_BASE_MODULE_NAME; buf->base_module_name = HI3_BASE_MODULE_NAME;
buf->assembly_path = HI3_ASSEMBLY_PATH; buf->assembly_path = HI3_ASSEMBLY_PATH;
buf->txs_section_name = HI3_TXS_SECTION_NAME;
buf->tvm_section_name = HI3_TVM_SECTION_NAME; buf->tvm_section_name = HI3_TVM_SECTION_NAME;
buf->unityplayer_callback = NULL; buf->unityplayer_callback = NULL;

View File

@ -9,6 +9,8 @@ const char *HSR_ASSEMBLY_PATH = "GameAssembly.dll";
const char *HSR_TXS_SECTION_NAME = ".ace"; const char *HSR_TXS_SECTION_NAME = ".ace";
const char *HSR_TVM_SECTION_NAME = ".tvm0"; const char *HSR_TVM_SECTION_NAME = ".tvm0";
#define HSR_VERSION "1.3.0"
enum hsr_region { enum hsr_region {
HSR_INVALID, HSR_INVALID,
HSR_OS, HSR_OS,
@ -21,14 +23,14 @@ struct crc_region_pair {
}; };
const struct crc_region_pair HSR_REGIONS[] = { const struct crc_region_pair HSR_REGIONS[] = {
{ 0x9eb3084e, HSR_OS }, // os v1.2.0 { 0x748c8f9c, HSR_OS }, // os v1.3.0
{ 0x14be07e9, HSR_CN } // cn v1.2.0 { 0x76e85a40, HSR_CN } // cn v1.3.0
}; };
#define JUMP_SIZE (6 + sizeof(void*)) #define JUMP_SIZE (6 + sizeof(void*))
// Temporarily hardcoded offset // Temporarily hardcoded offset
// v1.2.0, same for os and cn // v1.3.0, same for os and cn
#define WTSUD_PATCH_OFFSET 0x16430 #define WTSUD_PATCH_OFFSET 0x16430
char wtsud_original_bytes[JUMP_SIZE]; char wtsud_original_bytes[JUMP_SIZE];
@ -86,7 +88,7 @@ void hsr_fill_data(struct game_data *buf) {
} }
if (id == HSR_INVALID) { if (id == HSR_INVALID) {
msg_err_a("Invalid UnityPlayer.dll checksum: 0x%08x. This usually happens when the patch is outdated", crc); msg_err_a("Invalid UnityPlayer.dll checksum: 0x%08x. This patch is intended to be used with HSR v" HSR_VERSION, crc);
} }
buf->base_module_name = HSR_BASE_MODULE_NAME; buf->base_module_name = HSR_BASE_MODULE_NAME;

View File

@ -28,6 +28,10 @@ void tx_table_file(struct game_data *game, wchar_t *buf) {
// Checksum the TXS section // Checksum the TXS section
IMAGE_SECTION_HEADER *txsSection = pe_find_section(baseMap, game->txs_section_name); IMAGE_SECTION_HEADER *txsSection = pe_find_section(baseMap, game->txs_section_name);
if (!txsSection) {
msg_err_a("Could not find %s in %s. " ISSUE_SUFFIX, game->txs_section_name, game->base_module_name);
}
uint32_t txsChecksum = crc32c(0, baseMap + txsSection->PointerToRawData, txsSection->SizeOfRawData); uint32_t txsChecksum = crc32c(0, baseMap + txsSection->PointerToRawData, txsSection->SizeOfRawData);
// Format the path // Format the path

View File

@ -1,4 +1,4 @@
project('jadeite', 'c', version: '3.0.5') project('jadeite', 'c', version: '3.0.8')
nasm = find_program('nasm') nasm = find_program('nasm')
gen_res = find_program('gen_resources.sh') gen_res = find_program('gen_resources.sh')

View File

@ -1,42 +1,42 @@
{ {
"jadeite": { "jadeite": {
"version": "3.0.5" "version": "3.0.8"
}, },
"games": { "games": {
"hi3rd": { "hi3rd": {
"global": { "global": {
"status": "verified", "status": "verified",
"version": "6.8.0" "version": "6.9.0"
}, },
"sea": { "sea": {
"status": "verified", "status": "verified",
"version": "6.8.0" "version": "6.9.0"
}, },
"china": { "china": {
"status": "verified", "status": "verified",
"version": "6.8.0" "version": "6.9.0"
}, },
"taiwan": { "taiwan": {
"status": "verified", "status": "verified",
"version": "6.8.0" "version": "6.9.0"
}, },
"korea": { "korea": {
"status": "verified", "status": "verified",
"version": "6.8.0" "version": "6.9.0"
}, },
"japan": { "japan": {
"status": "verified", "status": "verified",
"version": "6.8.0" "version": "6.9.0"
} }
}, },
"hsr": { "hsr": {
"global": { "global": {
"status": "verified", "status": "verified",
"version": "1.2.0" "version": "1.3.0"
}, },
"china": { "china": {
"status": "verified", "status": "verified",
"version": "1.2.0" "version": "1.3.0"
} }
} }
} }