Skip to content

Commit d650e28

Browse files
committed
Update
1 parent 6d15aa8 commit d650e28

File tree

4 files changed

+64
-33
lines changed

4 files changed

+64
-33
lines changed

.github/workflows/build.yml

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,29 +31,17 @@ jobs:
3131
run: ./build.sh ${{env.BUILD_TYPE}} ${{ matrix.abi }}
3232
env:
3333
ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}
34-
35-
- name: Upload Release Version
36-
uses: actions/upload-artifact@v3
37-
with:
38-
name: libmaterialbinloader-1.20.32.03-arm64.so
39-
path: ./build/libmaterialbinloader-1.20.32.03-arm64.so
4034

41-
- name: Upload Preview Version
42-
uses: actions/upload-artifact@v3
43-
with:
44-
name: libmaterialbinloader-1.20.50.20-arm64.so
45-
path: ./build/libmaterialbinloader-1.20.50.20-arm64.so
46-
4735
- name: Create Release and Upload Release Asset
4836
uses: softprops/action-gh-release@v1
4937
with:
5038
tag_name: ${{ github.run_number }}
5139
name: Release ${{ github.run_number }}
52-
body: Support arm64 1.20.32.03 and 1.20.50.20
40+
body: Support arm64 1.20.32.03 and 1.20.50.21
5341
draft: false
5442
prerelease: false
5543
files: |
5644
./build/libmaterialbinloader-1.20.32.03-arm64.so
57-
./build/libmaterialbinloader-1.20.50.20-arm64.so
45+
./build/libmaterialbinloader-1.20.50.21-arm64.so
5846
env:
5947
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

build.bat

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,6 @@ clang.exe %CLANG_OPTIONS% -DV1_20_32_03 ./src/*.c -o ./build/libmaterialbinloade
6363
::1.20.40.24 arm64-v8a
6464
clang.exe %CLANG_OPTIONS% -DV1_20_40_24 ./src/*.c -o ./build/libmaterialbinloader-1.20.40.24-arm64.so
6565
::1.20.50.20 arm64-v8a
66-
clang.exe %CLANG_OPTIONS% -DV1_20_50_20 ./src/*.c -o ./build/libmaterialbinloader-1.20.50.20-arm64.so
66+
clang.exe %CLANG_OPTIONS% -DV1_20_50_20 ./src/*.c -o ./build/libmaterialbinloader-1.20.50.20-arm64.so
67+
::1.20.50.21 arm64-v8a
68+
clang.exe %CLANG_OPTIONS% -DV1_20_50_21 ./src/*.c -o ./build/libmaterialbinloader-1.20.50.21-arm64.so

build.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,6 @@ $ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/clang $Flags -DV1_20
6363
# 1.20.40.24 arm64-v8a
6464
$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/clang $Flags -DV1_20_40_24 ./src/*.c -o ./build/libmaterialbinloader-1.20.40.24-arm64.so
6565
# 1.20.50.20 arm64-v8a
66-
$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/clang $Flags -DV1_20_50_20 ./src/*.c -o ./build/libmaterialbinloader-1.20.50.20-arm64.so
66+
$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/clang $Flags -DV1_20_50_20 ./src/*.c -o ./build/libmaterialbinloader-1.20.50.20-arm64.so
67+
# 1.20.50.21 arm64-v8a
68+
$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/clang $Flags -DV1_20_50_21 ./src/*.c -o ./build/libmaterialbinloader-1.20.50.21-arm64.so

src/Loader.c

Lines changed: 56 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,12 @@ G_DEFINE_TYPE_EXTENDED(LoaderInvocationListener,
180180
#define READ_ASSET_FILE_ADDRESS (minecraftpeBaseAddr + 0xC8E3CC4)
181181
#define RESOURCE_LOCATION_ADDRESS (gum_module_find_export_by_name("libminecraftpe.so", "_ZN16ResourceLocationC2ERKN4Core4PathE"))
182182
#endif
183+
#ifdef V1_20_50_21
184+
#define RESOURCE_PACK_MANAGER_ADDRESS (minecraftpeBaseAddr + 0x9929E20)
185+
#define READ_ASSET_FILE_ADDRESS (minecraftpeBaseAddr + 0x6ABDC6C)
186+
#define RESOURCE_LOCATION_ADDRESS (gum_module_find_export_by_name("libminecraftpe.so", "_ZN16ResourceLocationC2ERKN4Core4PathE"))
187+
#endif
188+
183189
typedef enum _HookId HookId;
184190
enum _HookId {
185191
RESOURCE_PACK_MANAGER,
@@ -247,6 +253,12 @@ void __attribute__((destructor)) dispose() {
247253
gum_deinit();
248254
}
249255

256+
typedef struct _std_string {
257+
size_t cap;
258+
size_t size;
259+
char* data;
260+
} std_string;
261+
250262
bool std_string_is_short(void* str) {
251263
return (*(char*)str & 1) == 0;
252264
}
@@ -271,6 +283,30 @@ bool std_string_is_empty(void* str) {
271283
return std_string_size(str) == 0;
272284
}
273285

286+
void std_string_constructor(std_string* str, const char* data) {
287+
size_t dataLen = strlen(data);
288+
str->cap = dataLen + 1;
289+
if ((str->cap & 1) == 0) {
290+
str->cap++;
291+
}
292+
str->size = dataLen;
293+
str->data = (char*)malloc(str->cap);
294+
strcpy(str->data, data);
295+
}
296+
297+
void std_string_destructor(void* str) {
298+
if (!std_string_is_short(str) && std_string_data(str) != NULL) {
299+
free(std_string_data(str));
300+
}
301+
}
302+
303+
typedef struct _ResourceLocation {
304+
int32_t mFileSystem;
305+
std_string mPath;
306+
uint64_t mPathHash;
307+
uint64_t mFullHash;
308+
} ResourceLocation;
309+
274310
//==========================================================================================================================================
275311

276312
static void loader_invocation_listener_class_init(LoaderInvocationListenerClass* klass) {
@@ -293,6 +329,7 @@ static void loader_invocation_listener_on_enter(GumInvocationListener* listener,
293329
HookId hookId = GUM_IC_GET_FUNC_DATA(ic, HookId);
294330

295331
switch (hookId) {
332+
//ResourcePackManager::ResourcePackManager
296333
case RESOURCE_PACK_MANAGER: {
297334
gpointer needsToInitialize = gum_invocation_context_get_nth_argument(ic, 3);
298335

@@ -316,7 +353,7 @@ static void loader_invocation_listener_on_enter(GumInvocationListener* listener,
316353
return;
317354
}
318355

319-
if (strncmp(data, "renderer/materials/", 19) == 0 && strncmp(data + size - 13, ".material.bin", 13) == 0) {
356+
if ((strncmp(data, "renderer/materials/", 19) == 0 || strncmp(data, "assets/renderer/materials/", 26) == 0) && strncmp(data + size - 13, ".material.bin", 13) == 0) {
320357
#ifdef DEBUG
321358
printf("filename=%s\n", data);
322359
#endif
@@ -355,26 +392,31 @@ static void loader_invocation_listener_on_leave(GumInvocationListener* listener,
355392
bool (*load)(void*, void*, void*) = (bool (*)(void*, void*, void*))*(vptr + 2);
356393

357394
//void ResourceLocation::ResourceLocation(ResourceLocation* this, Core::Path* path)
358-
void (*ResourceLocation)(void*, void*) = (void (*)(void*, void*))ResourceLocation_ResourceLocation;
395+
void (*ResourceLocationConstructor)(void*, void*) = (void (*)(void*, void*))ResourceLocation_ResourceLocation;
396+
397+
ResourceLocation location = {0};
398+
const char* data = std_string_data(state->filename);
399+
if (strncmp(data, "assets/", 7) != 0) {
400+
ResourceLocationConstructor(&location, state->filename);
401+
} else {
402+
std_string fileName = {0};
403+
std_string_constructor(&fileName, data + 7);
404+
ResourceLocationConstructor(&location, &fileName);
405+
std_string_destructor(&fileName);
406+
}
359407

360-
void* location = malloc(0x50);
361-
memset(location, 0, 0x50);
362-
ResourceLocation(location, state->filename);
408+
std_string resourceStream = {0};
409+
bool result = load(resourcePackManager, &location, &resourceStream);
363410

364-
void* resourceStream = malloc(3 * sizeof(size_t));
365-
memset(resourceStream, 0, 3 * sizeof(size_t));
366-
bool result = load(resourcePackManager, location, resourceStream);
411+
std_string_destructor(&location.mPath);
367412

368413
if (result) {
369414
#ifdef DEBUG
370415
printf("ResourcePackManager::load returned true\n");
371416
#endif
372-
if (!std_string_is_empty(resourceStream)) {
373-
if (!std_string_is_short(state->retstr) && std_string_data(state->retstr) != NULL) {
374-
free(std_string_data(state->retstr));
375-
}
376-
377-
memcpy(state->retstr, resourceStream, 3 * sizeof(size_t));
417+
if (!std_string_is_empty(&resourceStream)) {
418+
std_string_destructor(state->retstr);
419+
memcpy(state->retstr, &resourceStream, sizeof(resourceStream));
378420
}
379421
} else {
380422
#ifdef DEBUG
@@ -385,9 +427,6 @@ static void loader_invocation_listener_on_leave(GumInvocationListener* listener,
385427
#ifdef DEBUG
386428
printf("\n");
387429
#endif
388-
389-
free(resourceStream);
390-
free(location);
391430
}
392431
}
393432
break;

0 commit comments

Comments
 (0)