It Works!

This commit is contained in:
TheBrokenRail 2024-07-17 06:42:58 -04:00
parent 5f2923b789
commit 98c4ee306d
12 changed files with 63 additions and 36 deletions

@ -1 +1 @@
Subproject commit 6f792dfb167e48e2e80b8484ac51261ab976b22d Subproject commit 10026e9a0419ff1cea1ddb80f5ccddf6a53818d3

View File

@ -16,9 +16,9 @@ void overwrite_call(void *start, void *target);
void *overwrite_calls_manual(void *start, void *target, bool allow_no_callsites = false); void *overwrite_calls_manual(void *start, void *target, bool allow_no_callsites = false);
template <typename T> template <typename T>
void overwrite_calls(T *target, typename T::overwrite_type replacement) { void overwrite_calls(T *target, typename T::overwrite_type replacement) {
DEBUG("Overwriting Method: %s", target->get_name()); DEBUG("Overwriting Method: %s", target->name);
if (!target->overwrite(replacement)) { if (!target->overwrite(replacement)) {
ERR("Unable To Overwrite Method: %s", target->get_name()); ERR("Unable To Overwrite Method!");
} }
} }
@ -28,8 +28,8 @@ void *reborn_thunk_enabler(void *target, void *thunk);
// Replace All Calls To start With target Within [to, from) // Replace All Calls To start With target Within [to, from)
void overwrite_calls_within_manual(void *from, void *to, void *start, void *target); void overwrite_calls_within_manual(void *from, void *to, void *start, void *target);
template <typename T> template <typename T>
void _overwrite_calls_within(void *from, void *to, const T &start, typename T::ptr_type target) { void _overwrite_calls_within(void *from, void *to, T *start, typename T::ptr_type target) {
overwrite_calls_within_manual(from, to, (void *) start, (void *) target); overwrite_calls_within_manual(from, to, (void *) start->get(), (void *) target);
} }
// Get Target Address From BL Instruction // Get Target Address From BL Instruction
@ -45,7 +45,10 @@ void patch_address(void *start, void *target);
// This does not affect subclasses. // This does not affect subclasses.
template <typename T> template <typename T>
void patch_vtable(const T *start, typename T::ptr_type target) { void patch_vtable(const T *start, typename T::ptr_type target) {
DEBUG("Patching VTable: %s", start->get_name()); DEBUG("Patching VTable: %s", start->name);
if (start->enabled) {
WARN("Use overwrite_calls() Instead!");
}
patch_address((void *) start->get_vtable_addr(), (void *) target); patch_address((void *) start->get_vtable_addr(), (void *) target);
} }

View File

@ -7,7 +7,7 @@
#include <mods/init/init.h> #include <mods/init/init.h>
// Fix Grass And Leaves Inventory Rendering When The gui_blocks Atlas Is Disabled // Fix Grass And Leaves Inventory Rendering When The gui_blocks Atlas Is Disabled
static void ItemRenderer_renderGuiItemCorrect_injection(ItemRenderer_renderGuiItemCorrect_t original, Font *font, Textures *textures, const ItemInstance *item_instance, int32_t param_1, int32_t param_2) { static void ItemRenderer_renderGuiItemCorrect_injection_one(ItemRenderer_renderGuiItemCorrect_t original, Font *font, Textures *textures, const ItemInstance *item_instance, int32_t param_1, int32_t param_2) {
int32_t leaves_id = Tile::leaves->id; int32_t leaves_id = Tile::leaves->id;
int32_t grass_id = Tile::grass->id; int32_t grass_id = Tile::grass->id;
// Replace Rendered Item With Carried Variant // Replace Rendered Item With Carried Variant
@ -63,7 +63,7 @@ static void Tesselator_begin_injection(Tesselator_begin_t original, Tesselator *
// Fix Furnace UI // Fix Furnace UI
if (item_color_fix_mode != 0) { if (item_color_fix_mode != 0) {
// Implict Translucent // Implicit Translucent
tesselator->color(0xff, 0xff, 0xff, 0xff); tesselator->color(0xff, 0xff, 0xff, 0xff);
} }
} }
@ -74,7 +74,7 @@ static void InventoryPane_renderBatch_Tesselator_color_injection(Tesselator *tes
// Enable Item Color Fix // Enable Item Color Fix
item_color_fix_mode = 2; item_color_fix_mode = 2;
} }
static void ItemRenderer_renderGuiItem_two_injection(ItemRenderer_renderGuiItem_two_t original, Font *font, Textures *textures, const ItemInstance *item_instance, float param_1, float param_2, float param_3, float param_4, bool param_5) { static void ItemRenderer_renderGuiItem_two_injection_one(ItemRenderer_renderGuiItem_two_t original, Font *font, Textures *textures, const ItemInstance *item_instance, float param_1, float param_2, float param_3, float param_4, bool param_5) {
// Call Original Method // Call Original Method
original(font, textures, item_instance, param_1, param_2, param_3, param_4, param_5); original(font, textures, item_instance, param_1, param_2, param_3, param_4, param_5);
@ -89,6 +89,21 @@ static void FurnaceScreen_render_ItemRenderer_renderGuiItem_one_injection(Font *
ItemRenderer::renderGuiItem_one(font, textures, item_instance, param_1, param_2, param_3); ItemRenderer::renderGuiItem_one(font, textures, item_instance, param_1, param_2, param_3);
} }
// Smooth Scrolling
static float target_x;
static float target_y;
static void ItemRenderer_renderGuiItem_two_injection_two(ItemRenderer_renderGuiItem_two_t original, Font *font, Textures *textures, const ItemInstance *item_instance, float x, float y, float w, float h, bool param_5) {
target_x = x;
target_y = y;
original(font, textures, item_instance, x, y, w, h, param_5);
}
static void ItemRenderer_renderGuiItemCorrect_injection_two(ItemRenderer_renderGuiItemCorrect_t original, Font *font, Textures *textures, const ItemInstance *item_instance, __attribute__((unused)) int x, __attribute__((unused)) int y) {
glPushMatrix();
glTranslatef(target_x, target_y, 0);
original(font, textures, item_instance, 0, 0);
glPopMatrix();;
}
// Init // Init
void init_atlas() { void init_atlas() {
// Disable The gui_blocks Atlas Which Contains Pre-Rendered Textures For Blocks In The Inventory // Disable The gui_blocks Atlas Which Contains Pre-Rendered Textures For Blocks In The Inventory
@ -96,12 +111,15 @@ void init_atlas() {
unsigned char disable_gui_blocks_atlas_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop" unsigned char disable_gui_blocks_atlas_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
patch((void *) 0x63c2c, disable_gui_blocks_atlas_patch); patch((void *) 0x63c2c, disable_gui_blocks_atlas_patch);
// Fix Grass And Leaves Inventory Rendering When The gui_blocks Atlas Is Disabled // Fix Grass And Leaves Inventory Rendering When The gui_blocks Atlas Is Disabled
overwrite_calls(ItemRenderer_renderGuiItemCorrect, ItemRenderer_renderGuiItemCorrect_injection); overwrite_calls(ItemRenderer_renderGuiItemCorrect, ItemRenderer_renderGuiItemCorrect_injection_one);
// Fix Furnace UI // Fix Furnace UI
overwrite_calls(Tesselator_begin, Tesselator_begin_injection); overwrite_calls(Tesselator_begin, Tesselator_begin_injection);
overwrite_calls(Tesselator_color, Tesselator_color_injection); overwrite_calls(Tesselator_color, Tesselator_color_injection);
overwrite_call((void *) 0x32324, (void *) FurnaceScreen_render_ItemRenderer_renderGuiItem_one_injection); overwrite_call((void *) 0x32324, (void *) FurnaceScreen_render_ItemRenderer_renderGuiItem_one_injection);
overwrite_call((void *) 0x1e21c, (void *) InventoryPane_renderBatch_Tesselator_color_injection); overwrite_call((void *) 0x1e21c, (void *) InventoryPane_renderBatch_Tesselator_color_injection);
overwrite_calls(ItemRenderer_renderGuiItem_two, ItemRenderer_renderGuiItem_two_injection); overwrite_calls(ItemRenderer_renderGuiItem_two, ItemRenderer_renderGuiItem_two_injection_one);
// Fix Inventory Scrolling
overwrite_calls(ItemRenderer_renderGuiItem_two, ItemRenderer_renderGuiItem_two_injection_two);
overwrite_calls(ItemRenderer_renderGuiItemCorrect, ItemRenderer_renderGuiItemCorrect_injection_two);
} }
} }

View File

@ -136,7 +136,7 @@ static int BucketItem_getUseDuration(__attribute__((unused)) FoodItem *item, Ite
static ItemInstance BucketItem_useTimeDepleted(FoodItem *item, ItemInstance *item_instance, Level *level, Player *player) { static ItemInstance BucketItem_useTimeDepleted(FoodItem *item, ItemInstance *item_instance, Level *level, Player *player) {
if (item_instance->auxiliary == 1) { if (item_instance->auxiliary == 1) {
*item_instance = FoodItem_useTimeDepleted->get()(item, item_instance, level, player); *item_instance = FoodItem_useTimeDepleted->get(false)(item, item_instance, level, player);
// Set it to a empty bucket // Set it to a empty bucket
item_instance->auxiliary = 0; item_instance->auxiliary = 0;
item_instance->count = 1; item_instance->count = 1;
@ -154,7 +154,7 @@ static bool BucketItem_isFood(__attribute__((unused)) FoodItem *item) {
static ItemInstance *BucketItem_use(FoodItem *item, ItemInstance *item_instance, __attribute__((unused)) Level *level, Player *player) { static ItemInstance *BucketItem_use(FoodItem *item, ItemInstance *item_instance, __attribute__((unused)) Level *level, Player *player) {
if (item_instance->auxiliary == 1) { if (item_instance->auxiliary == 1) {
return FoodItem_use->get()(item, item_instance, level, player); return FoodItem_use->get(false)(item, item_instance, level, player);
} }
return item_instance; return item_instance;
} }
@ -188,7 +188,7 @@ static FoodItem *create_bucket(int32_t id, int32_t texture_x, int32_t texture_y,
// Construct // Construct
FoodItem *item = new FoodItem; FoodItem *item = new FoodItem;
ALLOC_CHECK(item); ALLOC_CHECK(item);
Item_constructor->get()((Item *) item, id); // FoodItem's Constructor Was Inlined Item_constructor->get(false)((Item *) item, id); // FoodItem's Constructor Was Inlined
// Set VTable // Set VTable
item->vtable = get_bucket_vtable(); item->vtable = get_bucket_vtable();

View File

@ -8,7 +8,7 @@
// Death Messages // Death Messages
static const char *monster_names[] = {"Zombie", "Creeper", "Skeleton", "Spider", "Zombie Pigman"}; static const char *monster_names[] = {"Zombie", "Creeper", "Skeleton", "Spider", "Zombie Pigman"};
std::string get_death_message(Player *player, Entity *cause, bool was_shot = false) { std::string get_death_message(Player *player, Entity *cause, const bool was_shot = false) {
// Prepare Death Message // Prepare Death Message
std::string message = player->username; std::string message = player->username;
if (cause) { if (cause) {
@ -62,9 +62,9 @@ std::string get_death_message(Player *player, Entity *cause, bool was_shot = fal
} }
static bool is_hurt = false; static bool is_hurt = false;
static bool Mob_hurt_injection(Mob_hurt_t original, Mob *mob, Entity *source, int dmg) { static bool Mob_hurt_injection(Mob_hurt_t original, Mob *mob, Entity *source, const int dmg) {
is_hurt = true; is_hurt = true;
bool ret = original(mob, source, dmg); const bool ret = original(mob, source, dmg);
is_hurt = false; is_hurt = false;
return ret; return ret;
} }
@ -87,19 +87,19 @@ static void Player_die_injection(std::function<void(ParentSelf *, Entity *)> ori
server_side_network_handler->displayGameMessage(message); server_side_network_handler->displayGameMessage(message);
} }
} }
template <typename Self> template <typename OriginalSelf, typename Self>
static void Player_actuallyHurt_injection(Self *player, int32_t damage) { static void Player_actuallyHurt_injection(std::function<void(OriginalSelf *, int)> original, Self *player, int32_t damage) {
// Store Old Health // Store Old Health
int32_t old_health = player->health; int32_t old_health = player->health;
// Call Original Method // Call Original Method
Mob_actuallyHurt->get()((Mob *) player, damage); original((OriginalSelf *) player, damage);
if (is_hurt) { if (is_hurt) {
return; return;
} }
// Store New Health // Store New Health
int32_t new_health = player->health; const int32_t new_health = player->health;
// Get Variables // Get Variables
RakNetInstance *rak_net_instance = player->minecraft->rak_net_instance; RakNetInstance *rak_net_instance = player->minecraft->rak_net_instance;
@ -116,17 +116,23 @@ static void Player_actuallyHurt_injection(Self *player, int32_t damage) {
} }
} }
} }
static void ServerPlayer_actuallyHurt_injection(ServerPlayer *player, const int32_t damage) {
Player_actuallyHurt_injection<Mob, ServerPlayer>(Mob_actuallyHurt->get(false), player, damage);
}
static void LocalPlayer_actuallyHurt_injection(LocalPlayer_actuallyHurt_t original, LocalPlayer *player, const int32_t damage) {
Player_actuallyHurt_injection(std::move(original), player, damage);
}
// Init // Init
void init_death() { void init_death() {
// Death Messages // Death Messages
if (feature_has("Implement Death Messages", server_auto)) { if (feature_has("Implement Death Messages", server_auto)) {
patch_vtable(ServerPlayer_die, [](ServerPlayer *player, Entity *cause) { patch_vtable(ServerPlayer_die, [](ServerPlayer *player, Entity *cause) {
Player_die_injection<ServerPlayer, Player>(Player_die->get(), player, cause); Player_die_injection<ServerPlayer, Player>(Player_die->get(false), player, cause);
}); });
overwrite_calls(LocalPlayer_die, Player_die_injection<LocalPlayer, LocalPlayer>); overwrite_calls(LocalPlayer_die, Player_die_injection<LocalPlayer, LocalPlayer>);
patch_vtable(LocalPlayer_actuallyHurt, Player_actuallyHurt_injection); overwrite_calls(LocalPlayer_actuallyHurt, LocalPlayer_actuallyHurt_injection);
patch_vtable(ServerPlayer_actuallyHurt, Player_actuallyHurt_injection); patch_vtable(ServerPlayer_actuallyHurt, ServerPlayer_actuallyHurt_injection);
overwrite_calls(Mob_hurt, Mob_hurt_injection); overwrite_calls(Mob_hurt, Mob_hurt_injection);
} }

View File

@ -6,7 +6,7 @@
#include <mods/feature/feature.h> #include <mods/feature/feature.h>
// Check For Feature // Check For Feature
bool _feature_has(const char *name, int server_default) { bool _feature_has(const char *name, const int server_default) {
// Server Handling // Server Handling
if (reborn_is_server() && server_default != -1) { if (reborn_is_server() && server_default != -1) {
return server_default > 0; return server_default > 0;

View File

@ -21,7 +21,7 @@ static void set_is_survival(bool new_is_survival) {
patch((void *) 0x16ee4, size_patch); patch((void *) 0x16ee4, size_patch);
// Replace Default CreatorMode Constructor With CreatorMode Or SurvivalMode Constructor // Replace Default CreatorMode Constructor With CreatorMode Or SurvivalMode Constructor
overwrite_call((void *) 0x16ef4, new_is_survival ? (void *) SurvivalMode_constructor->get() : (void *) CreatorMode_constructor->get()); overwrite_call((void *) 0x16ef4, new_is_survival ? (void *) SurvivalMode_constructor->get(true) : (void *) CreatorMode_constructor->get(true));
is_survival = new_is_survival; is_survival = new_is_survival;
} }
@ -54,7 +54,7 @@ void init_game_mode() {
overwrite_calls(Minecraft_setIsCreativeMode, Minecraft_setIsCreativeMode_injection); overwrite_calls(Minecraft_setIsCreativeMode, Minecraft_setIsCreativeMode_injection);
// Replace CreatorLevel With ServerLevel (This Fixes Beds And Mob Spawning) // Replace CreatorLevel With ServerLevel (This Fixes Beds And Mob Spawning)
overwrite_call((void *) 0x16f84, (void *) ServerLevel_constructor->get()); overwrite_call((void *) 0x16f84, (void *) ServerLevel_constructor->get(true));
// Allocate Correct Size For ServerLevel // Allocate Correct Size For ServerLevel
uint32_t level_size = sizeof(ServerLevel); uint32_t level_size = sizeof(ServerLevel);

View File

@ -6,7 +6,7 @@
__attribute__((constructor)) static void init() { __attribute__((constructor)) static void init() {
media_ensure_loaded(); media_ensure_loaded();
reborn_init_patch(); reborn_init_patch();
enable_all_thunks(reborn_thunk_enabler); thunk_enabler = reborn_thunk_enabler;
run_tests(); run_tests();
init_version(); init_version();
init_compat(); init_compat();

View File

@ -90,7 +90,7 @@ static void Gui_renderHearts_injection(Gui_renderHearts_t original, Gui *gui) {
original(gui); original(gui);
} }
static GuiComponent_blit_t get_blit_with_classic_hud_offset() { static GuiComponent_blit_t get_blit_with_classic_hud_offset() {
return use_classic_hud ? Gui_renderHearts_GuiComponent_blit_hearts_injection : GuiComponent_blit->get(); return use_classic_hud ? Gui_renderHearts_GuiComponent_blit_hearts_injection : GuiComponent_blit->get(false);
} }
#define PINK_HEART_FULL 70 #define PINK_HEART_FULL 70
#define PINK_HEART_HALF 79 #define PINK_HEART_HALF 79
@ -1039,7 +1039,7 @@ void init_misc() {
} }
// Fix grass_carried's bottom texture // Fix grass_carried's bottom texture
if (feature_has("Fix Grass's Bottom Texture", server_disabled)) { if (feature_has("Fix Carried Grass's Bottom Texture", server_disabled)) {
overwrite_calls(CarriedTile_getTexture2, CarriedTile_getTexture2_injection); overwrite_calls(CarriedTile_getTexture2, CarriedTile_getTexture2_injection);
} }

View File

@ -8,7 +8,7 @@
#include <mods/sign/sign.h> #include <mods/sign/sign.h>
// Open Sign Screen // Open Sign Screen
static void LocalPlayer_openTextEdit_injection(LocalPlayer *local_player, TileEntity *sign) { static void LocalPlayer_openTextEdit_injection(__attribute__((unused)) LocalPlayer_openTextEdit_t original, LocalPlayer *local_player, TileEntity *sign) {
if (sign->type == 4) { if (sign->type == 4) {
Minecraft *minecraft = local_player->minecraft; Minecraft *minecraft = local_player->minecraft;
TextEditScreen *screen = new TextEditScreen; TextEditScreen *screen = new TextEditScreen;
@ -27,6 +27,6 @@ void sign_key_press(const char key) {
void init_sign() { void init_sign() {
if (feature_has("Fix Sign Placement", server_disabled)) { if (feature_has("Fix Sign Placement", server_disabled)) {
// Fix Signs // Fix Signs
patch_vtable(LocalPlayer_openTextEdit, LocalPlayer_openTextEdit_injection); overwrite_calls(LocalPlayer_openTextEdit, LocalPlayer_openTextEdit_injection);
} }
} }

View File

@ -70,7 +70,7 @@ static Screen *last_screen = nullptr;
static std::string current_splash; static std::string current_splash;
static void StartMenuScreen_render_Screen_render_injection(Screen *screen, int x, int y, float param_1) { static void StartMenuScreen_render_Screen_render_injection(Screen *screen, int x, int y, float param_1) {
// Call Original Method // Call Original Method
Screen_render->get()(screen, x, y, param_1); Screen_render->get(false)(screen, x, y, param_1);
// Load Splashes // Load Splashes
static std::vector<std::string> splashes; static std::vector<std::string> splashes;

View File

@ -73,10 +73,10 @@ void init_touch() {
// Force Touch Inventory // Force Touch Inventory
if (feature_has("Force Touch GUI Inventory", server_disabled)) { if (feature_has("Force Touch GUI Inventory", server_disabled)) {
overwrite_call((void *) 0x2943c, (void *) operator_new_IngameBlockSelectionScreen_injection); overwrite_call((void *) 0x2943c, (void *) operator_new_IngameBlockSelectionScreen_injection);
overwrite_call((void *) 0x29444, (void *) Touch_IngameBlockSelectionScreen_constructor->get()); overwrite_call((void *) 0x29444, (void *) Touch_IngameBlockSelectionScreen_constructor->get(true));
// Make "Craft" And "Armor" Buttons Use Classic GUI Style (Button And TButton Have The Same Size) // Make "Craft" And "Armor" Buttons Use Classic GUI Style (Button And TButton Have The Same Size)
overwrite_call((void *) 0x3b060, (void *) Button_constructor->get()); overwrite_call((void *) 0x3b060, (void *) Button_constructor->get(true));
overwrite_call((void *) 0x3b08c, (void *) Button_constructor->get()); overwrite_call((void *) 0x3b08c, (void *) Button_constructor->get(true));
} }
// Force Touch Button Behavior // Force Touch Button Behavior