Improve HOOK()
This commit is contained in:
parent
6388663b6c
commit
0c92551e8a
@ -20,16 +20,14 @@ HOOK(chat_handle_packet_send, void, (const Minecraft *minecraft, ChatPacket *pac
|
|||||||
gui->addMessage(out);
|
gui->addMessage(out);
|
||||||
} else {
|
} else {
|
||||||
// Call Original Method
|
// Call Original Method
|
||||||
ensure_chat_handle_packet_send();
|
real_chat_handle_packet_send()(minecraft, packet);
|
||||||
real_chat_handle_packet_send(minecraft, packet);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add Server Command
|
// Add Server Command
|
||||||
HOOK(server_get_commands, std::vector<ServerCommand> *, (Minecraft *minecraft, ServerSideNetworkHandler *server_side_network_handler)) {
|
HOOK(server_get_commands, std::vector<ServerCommand> *, (Minecraft *minecraft, ServerSideNetworkHandler *server_side_network_handler)) {
|
||||||
// Call Original Method
|
// Call Original Method
|
||||||
ensure_server_get_commands();
|
std::vector<ServerCommand> *commands = real_server_get_commands()(minecraft, server_side_network_handler);
|
||||||
std::vector<ServerCommand> *commands = real_server_get_commands(minecraft, server_side_network_handler);
|
|
||||||
// Add Command
|
// Add Command
|
||||||
commands->push_back({
|
commands->push_back({
|
||||||
.name = "greet",
|
.name = "greet",
|
||||||
|
@ -34,19 +34,18 @@
|
|||||||
#define hooked_function_setup
|
#define hooked_function_setup
|
||||||
#endif
|
#endif
|
||||||
#define HOOK(name, return_type, args) \
|
#define HOOK(name, return_type, args) \
|
||||||
typedef return_type (*name##_t)args; \
|
typedef return_type (*real_##name##_t)args; \
|
||||||
static name##_t real_##name = NULL; \
|
__attribute__((__unused__)) static real_##name##_t real_##name() { \
|
||||||
\
|
static real_##name##_t func = NULL; \
|
||||||
__attribute__((__unused__)) static void ensure_##name() { \
|
if (!func) { \
|
||||||
if (!real_##name) { \
|
|
||||||
dlerror(); \
|
dlerror(); \
|
||||||
real_##name = (name##_t) dlsym(RTLD_NEXT, #name); \
|
func = (real_##name##_t) dlsym(RTLD_NEXT, #name); \
|
||||||
if (!real_##name) { \
|
if (!func) { \
|
||||||
ERR("Error Resolving Symbol: " #name ": %s", dlerror()); \
|
ERR("Error Resolving Symbol: " #name ": %s", dlerror()); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
|
return func; \
|
||||||
} \
|
} \
|
||||||
\
|
|
||||||
hooked_function_setup __attribute__((__used__)) return_type name args
|
hooked_function_setup __attribute__((__used__)) return_type name args
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -7,8 +7,7 @@
|
|||||||
// Load GL Function
|
// Load GL Function
|
||||||
#define GL_FUNC(name, return_type, args) \
|
#define GL_FUNC(name, return_type, args) \
|
||||||
typedef return_type (*real_##name##_t)args; \
|
typedef return_type (*real_##name##_t)args; \
|
||||||
\
|
static real_##name##_t real_##name() { \
|
||||||
real_##name##_t real_##name() { \
|
|
||||||
static real_##name##_t func = nullptr; \
|
static real_##name##_t func = nullptr; \
|
||||||
if (!func) { \
|
if (!func) { \
|
||||||
func = (real_##name##_t) glfwGetProcAddress(#name); \
|
func = (real_##name##_t) glfwGetProcAddress(#name); \
|
||||||
|
@ -17,15 +17,13 @@
|
|||||||
|
|
||||||
// Custom Title
|
// Custom Title
|
||||||
HOOK(SDL_WM_SetCaption, void, (__attribute__((unused)) const char *title, const char *icon)) {
|
HOOK(SDL_WM_SetCaption, void, (__attribute__((unused)) const char *title, const char *icon)) {
|
||||||
ensure_SDL_WM_SetCaption();
|
real_SDL_WM_SetCaption()(MCPI_APP_TITLE, icon);
|
||||||
real_SDL_WM_SetCaption(MCPI_APP_TITLE, icon);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mouse Cursor Is Always Invisible In Vanilla MCPI
|
// Mouse Cursor Is Always Invisible In Vanilla MCPI
|
||||||
// Because In Vanilla MCPI, The GPU Overlay Covered The Normal Mouse Cursor
|
// Because In Vanilla MCPI, The GPU Overlay Covered The Normal Mouse Cursor
|
||||||
HOOK(SDL_ShowCursor, int, (int toggle)) {
|
HOOK(SDL_ShowCursor, int, (int toggle)) {
|
||||||
ensure_SDL_ShowCursor();
|
return real_SDL_ShowCursor()(toggle == SDL_QUERY ? SDL_QUERY : SDL_DISABLE);
|
||||||
return real_SDL_ShowCursor(toggle == SDL_QUERY ? SDL_QUERY : SDL_DISABLE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Intercept SDL Events
|
// Intercept SDL Events
|
||||||
@ -40,8 +38,7 @@ HOOK(SDL_PollEvent, int, (SDL_Event *event)) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Poll Events
|
// Poll Events
|
||||||
ensure_SDL_PollEvent();
|
int ret = real_SDL_PollEvent()(event);
|
||||||
int ret = real_SDL_PollEvent(event);
|
|
||||||
|
|
||||||
// Handle Events
|
// Handle Events
|
||||||
if (ret == 1 && event != nullptr) {
|
if (ret == 1 && event != nullptr) {
|
||||||
|
@ -43,8 +43,7 @@ static void Inventory_setupDefault_FillingContainer_addItem_call_injection(Filli
|
|||||||
SETUP_CALLBACK(swap_buffers);
|
SETUP_CALLBACK(swap_buffers);
|
||||||
HOOK(media_swap_buffers, void, ()) {
|
HOOK(media_swap_buffers, void, ()) {
|
||||||
get_misc_swap_buffers_functions().run();
|
get_misc_swap_buffers_functions().run();
|
||||||
ensure_media_swap_buffers();
|
real_media_swap_buffers()();
|
||||||
real_media_swap_buffers();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// API
|
// API
|
||||||
|
@ -145,8 +145,7 @@ HOOK(bind, int, (int sockfd, const struct sockaddr *addr, socklen_t addrlen)) {
|
|||||||
}
|
}
|
||||||
new_addr = (const sockaddr *) &in_addr;
|
new_addr = (const sockaddr *) &in_addr;
|
||||||
}
|
}
|
||||||
ensure_bind();
|
return real_bind()(sockfd, new_addr, addrlen);
|
||||||
return real_bind(sockfd, new_addr, addrlen);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate Caves
|
// Generate Caves
|
||||||
|
@ -26,8 +26,7 @@ HOOK(glDeleteBuffers, void, (GLsizei n, const GLuint *buffers)) {
|
|||||||
if (buffers[0] >= MULTIDRAW_BASE) {
|
if (buffers[0] >= MULTIDRAW_BASE) {
|
||||||
delete storage;
|
delete storage;
|
||||||
} else {
|
} else {
|
||||||
ensure_glDeleteBuffers();
|
real_glDeleteBuffers()(n, buffers);
|
||||||
real_glDeleteBuffers(n, buffers);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,15 +39,13 @@ HOOK(glBindBuffer, void, (const GLenum target, GLuint buffer)) {
|
|||||||
} else {
|
} else {
|
||||||
current_chunk = -1;
|
current_chunk = -1;
|
||||||
}
|
}
|
||||||
ensure_glBindBuffer();
|
real_glBindBuffer()(target, buffer);
|
||||||
real_glBindBuffer(target, buffer);
|
|
||||||
}
|
}
|
||||||
HOOK(glBufferData, void, (GLenum target, GLsizeiptr size, const void *data, GLenum usage)) {
|
HOOK(glBufferData, void, (GLenum target, GLsizeiptr size, const void *data, GLenum usage)) {
|
||||||
if (target == GL_ARRAY_BUFFER && current_chunk >= 0 && storage != nullptr) {
|
if (target == GL_ARRAY_BUFFER && current_chunk >= 0 && storage != nullptr) {
|
||||||
storage->upload(current_chunk, size, data);
|
storage->upload(current_chunk, size, data);
|
||||||
} else {
|
} else {
|
||||||
ensure_glBufferData();
|
real_glBufferData()(target, size, data, usage);
|
||||||
real_glBufferData(target, size, data, usage);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,8 +16,7 @@
|
|||||||
HOOK(access, int, (const char *pathname, int mode)) {
|
HOOK(access, int, (const char *pathname, int mode)) {
|
||||||
char *new_path = override_get_path(pathname);
|
char *new_path = override_get_path(pathname);
|
||||||
// Open File
|
// Open File
|
||||||
ensure_access();
|
const int ret = real_access()(new_path != nullptr ? new_path : pathname, mode);
|
||||||
const int ret = real_access(new_path != nullptr ? new_path : pathname, mode);
|
|
||||||
// Free Data
|
// Free Data
|
||||||
if (new_path != nullptr) {
|
if (new_path != nullptr) {
|
||||||
free(new_path);
|
free(new_path);
|
||||||
@ -61,8 +60,7 @@ char *override_get_path(const char *filename) {
|
|||||||
// Test Asset Folders
|
// Test Asset Folders
|
||||||
for (int i = 0; !asset_folders[i].empty(); i++) {
|
for (int i = 0; !asset_folders[i].empty(); i++) {
|
||||||
new_path = asset_folders[i] + '/' + &filename[data_prefix_length];
|
new_path = asset_folders[i] + '/' + &filename[data_prefix_length];
|
||||||
ensure_access();
|
if (real_access()(new_path.c_str(), F_OK) == -1) {
|
||||||
if (real_access(new_path.c_str(), F_OK) == -1) {
|
|
||||||
// Not Found In Asset Folder
|
// Not Found In Asset Folder
|
||||||
new_path = "";
|
new_path = "";
|
||||||
continue;
|
continue;
|
||||||
@ -87,8 +85,7 @@ char *override_get_path(const char *filename) {
|
|||||||
HOOK(fopen, FILE *, (const char *filename, const char *mode)) {
|
HOOK(fopen, FILE *, (const char *filename, const char *mode)) {
|
||||||
char *new_path = override_get_path(filename);
|
char *new_path = override_get_path(filename);
|
||||||
// Open File
|
// Open File
|
||||||
ensure_fopen();
|
FILE *file = real_fopen()(new_path != nullptr ? new_path : filename, mode);
|
||||||
FILE *file = real_fopen(new_path != nullptr ? new_path : filename, mode);
|
|
||||||
// Free Data
|
// Free Data
|
||||||
if (new_path != nullptr) {
|
if (new_path != nullptr) {
|
||||||
free(new_path);
|
free(new_path);
|
||||||
@ -101,8 +98,7 @@ HOOK(fopen, FILE *, (const char *filename, const char *mode)) {
|
|||||||
HOOK(fopen64, FILE *, (const char *filename, const char *mode)) {
|
HOOK(fopen64, FILE *, (const char *filename, const char *mode)) {
|
||||||
char *new_path = override_get_path(filename);
|
char *new_path = override_get_path(filename);
|
||||||
// Open File
|
// Open File
|
||||||
ensure_fopen64();
|
FILE *file = real_fopen64()(new_path != nullptr ? new_path : filename, mode);
|
||||||
FILE *file = real_fopen64(new_path != nullptr ? new_path : filename, mode);
|
|
||||||
// Free Data
|
// Free Data
|
||||||
if (new_path != nullptr) {
|
if (new_path != nullptr) {
|
||||||
free(new_path);
|
free(new_path);
|
||||||
|
@ -43,8 +43,7 @@ HOOK(glTexImage2D, void, (GLenum target, GLint level, GLint internalformat, GLsi
|
|||||||
get_texture_data().push_back(data);
|
get_texture_data().push_back(data);
|
||||||
|
|
||||||
// Call Original Method
|
// Call Original Method
|
||||||
ensure_glTexImage2D();
|
real_glTexImage2D()(target, level, internalformat, width, height, border, format, type, pixels);
|
||||||
real_glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
|
|
||||||
}
|
}
|
||||||
HOOK(glDeleteTextures, void, (GLsizei n, const GLuint *textures)) {
|
HOOK(glDeleteTextures, void, (GLsizei n, const GLuint *textures)) {
|
||||||
// Remove Old Data
|
// Remove Old Data
|
||||||
@ -62,8 +61,7 @@ HOOK(glDeleteTextures, void, (GLsizei n, const GLuint *textures)) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Call Original Method
|
// Call Original Method
|
||||||
ensure_glDeleteTextures();
|
real_glDeleteTextures()(n, textures);
|
||||||
real_glDeleteTextures(n, textures);
|
|
||||||
}
|
}
|
||||||
static void get_texture_size(const GLint id, GLsizei *width, GLsizei *height) {
|
static void get_texture_size(const GLint id, GLsizei *width, GLsizei *height) {
|
||||||
// Iterate
|
// Iterate
|
||||||
|
Loading…
Reference in New Issue
Block a user