diff --git a/mods/src/atlas/atlas.cpp b/mods/src/atlas/atlas.cpp index ab5afd7..d4ce04c 100644 --- a/mods/src/atlas/atlas.cpp +++ b/mods/src/atlas/atlas.cpp @@ -7,7 +7,7 @@ #include "../init/init.h" // Fix Grass And Leaves Inventory Rendering When The gui_blocks Atlas Is Disabled -static float ItemRenderer_renderGuiItemCorrect_injection(unsigned char *font, unsigned char *textures, ItemInstance *item_instance, int32_t param_1, int32_t param_2) { +static void ItemRenderer_renderGuiItemCorrect_injection(unsigned char *font, unsigned char *textures, ItemInstance *item_instance, int32_t param_1, int32_t param_2) { int32_t leaves_id = *(int32_t *) (*Tile_leaves + Tile_id_property_offset); int32_t grass_id = *(int32_t *) (*Tile_grass + Tile_id_property_offset); // Replace Rendered Item With Carried Variant @@ -28,28 +28,39 @@ static float ItemRenderer_renderGuiItemCorrect_injection(unsigned char *font, un glDisable(GL_DEPTH_TEST); // Call Original Method - float ret = (*ItemRenderer_renderGuiItemCorrect)(font, textures, use_carried ? &carried_item_instance : item_instance, param_1, param_2); + (*ItemRenderer_renderGuiItemCorrect)(font, textures, use_carried ? &carried_item_instance : item_instance, param_1, param_2); // Revert GL State Changes if (depth_test_was_enabled) { glEnable(GL_DEPTH_TEST); } - - // Return - return ret; } // Fix Translucent Preview Items In Furnace UI Being Fully Opaque When The gui_blocks Atlas Is Disabled -static bool use_furnace_fix = false; +static int item_color_fix_mode = 0; #define FURNACE_ITEM_TRANSPARENCY 0x33 +#define INVALID_FURNACE_ITEM_VALUE 0x40 +#define FURNACE_ITEM_DEFAULT_COLOR 0x33ffffff +#define INVALID_FURNACE_ITEM_DEFAULT_COLOR 0xff404040 static void Tesselator_colorABGR_injection(unsigned char *tesselator, int32_t color) { // Fix Furnace UI - if (use_furnace_fix) { + if (item_color_fix_mode != 0) { + int32_t a; + int32_t b; + int32_t g; + int32_t r; // Force Translucent - int32_t a = FURNACE_ITEM_TRANSPARENCY; - int32_t b = (color & 0x00ff0000) >> 16; - int32_t g = (color & 0x0000ff00) >> 8; - int32_t r = (color & 0x000000ff) >> 0; + if (item_color_fix_mode == 1) { + a = FURNACE_ITEM_TRANSPARENCY; + b = (color & 0x00ff0000) >> 16; + g = (color & 0x0000ff00) >> 8; + r = (color & 0x000000ff) >> 0; + } else { + a = 0xff; + b = INVALID_FURNACE_ITEM_VALUE; + g = INVALID_FURNACE_ITEM_VALUE; + r = INVALID_FURNACE_ITEM_VALUE; + } // New Color color = r | (g << 8) | (b << 16) | (a << 24); } @@ -62,37 +73,55 @@ static void Tesselator_begin_injection(unsigned char *tesselator, int32_t mode) (*Tesselator_begin)(tesselator, mode); // Fix Furnace UI - if (use_furnace_fix) { + if (item_color_fix_mode != 0) { // Implict Translucent - (*Tesselator_colorABGR_injection)(tesselator, 0xffffffff); + (*Tesselator_colorABGR_injection)(tesselator, item_color_fix_mode == 1 ? FURNACE_ITEM_DEFAULT_COLOR : INVALID_FURNACE_ITEM_DEFAULT_COLOR); } } static void Tesselator_color_injection(unsigned char *tesselator, int32_t r, int32_t g, int32_t b, int32_t a) { // Fix Furnace UI - if (use_furnace_fix) { + if (item_color_fix_mode != 0) { // Force Translucent - a = FURNACE_ITEM_TRANSPARENCY; + if (item_color_fix_mode == 1) { + a = FURNACE_ITEM_TRANSPARENCY; + } else { + a = 0xff; + b = INVALID_FURNACE_ITEM_VALUE; + g = INVALID_FURNACE_ITEM_VALUE; + r = INVALID_FURNACE_ITEM_VALUE; + } } // Call Original Method (*Tesselator_color)(tesselator, r, g, b, a); } -static float FurnaceScreen_render_ItemRenderer_renderGuiItem_injection(unsigned char *font, unsigned char *textures, ItemInstance *item_instance, float param_1, float param_2, bool param_3) { - // Enable Furnace UI Fix - use_furnace_fix = true; +static void InventoryPane_renderBatch_Tesselator_color_injection(unsigned char *tesselator, int32_t r, int32_t g, int32_t b) { + // Call Original Method + (*Tesselator_color)(tesselator, r, g, b, 0xff); + + // Enable Item Color Fix + item_color_fix_mode = 2; +} +static void ItemRenderer_renderGuiItem_two_injection(unsigned char *font, unsigned char *textures, ItemInstance *item_instance, float param_1, float param_2, float param_3, float param_4, bool param_5) { + // Call Original Method + (*ItemRenderer_renderGuiItem_two)(font, textures, item_instance, param_1, param_2, param_3, param_4, param_5); + + // Disable Item Color Fix + item_color_fix_mode = 0; +} +static void FurnaceScreen_render_ItemRenderer_renderGuiItem_one_injection(unsigned char *font, unsigned char *textures, ItemInstance *item_instance, float param_1, float param_2, bool param_3) { + // Enable Item Color Fix + item_color_fix_mode = 1; // Call Original Method - float ret = (*ItemRenderer_renderGuiItem)(font, textures, item_instance, param_1, param_2, param_3); - - // Disable Furnace UI Fix - use_furnace_fix = false; - - // Return - return ret; + (*ItemRenderer_renderGuiItem_one)(font, textures, item_instance, param_1, param_2, param_3); } // Init void init_atlas() { + // Add Better NULL-Check (And More UI Fixes When The gui_blocks Atlas Is Disabled) + overwrite_calls((void *) ItemRenderer_renderGuiItem_two, (void *) ItemRenderer_renderGuiItem_two_injection); + // Disable The gui_blocks Atlas Which Contains Pre-Rendered Textures For Blocks In The Inventory if (feature_has("Disable \"gui_blocks\" Atlas", 0)) { unsigned char disable_gui_blocks_atlas_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop" @@ -103,6 +132,7 @@ void init_atlas() { overwrite_calls((void *) Tesselator_colorABGR, (void *) Tesselator_colorABGR_injection); overwrite_calls((void *) Tesselator_begin, (void *) Tesselator_begin_injection); overwrite_calls((void *) Tesselator_color, (void *) Tesselator_color_injection); - overwrite_call((void *) 0x32324, (void *) FurnaceScreen_render_ItemRenderer_renderGuiItem_injection); + overwrite_call((void *) 0x32324, (void *) FurnaceScreen_render_ItemRenderer_renderGuiItem_one_injection); + overwrite_call((void *) 0x1e21c, (void *) InventoryPane_renderBatch_Tesselator_color_injection); } } diff --git a/symbols/include/symbols/minecraft.h b/symbols/include/symbols/minecraft.h index c22b3bb..1661caf 100644 --- a/symbols/include/symbols/minecraft.h +++ b/symbols/include/symbols/minecraft.h @@ -567,10 +567,13 @@ static uint32_t TileEntity_id_property_offset = 0x18; // int32_t // ItemRenderer -typedef float (*ItemRenderer_renderGuiItem_t)(unsigned char *font, unsigned char *textures, ItemInstance *item_instance, float param_1, float param_2, bool param_3); -static ItemRenderer_renderGuiItem_t ItemRenderer_renderGuiItem = (ItemRenderer_renderGuiItem_t) 0x63e58; +typedef void (*ItemRenderer_renderGuiItem_one_t)(unsigned char *font, unsigned char *textures, ItemInstance *item_instance, float param_1, float param_2, bool param_3); +static ItemRenderer_renderGuiItem_one_t ItemRenderer_renderGuiItem_one = (ItemRenderer_renderGuiItem_one_t) 0x63e58; -typedef float (*ItemRenderer_renderGuiItemCorrect_t)(unsigned char *font, unsigned char *textures, ItemInstance *item_instance, int32_t param_1, int32_t param_2); +typedef void (*ItemRenderer_renderGuiItem_two_t)(unsigned char *font, unsigned char *textures, ItemInstance *item_instance, float param_1, float param_2, float param_3, float param_4, bool param_5); +static ItemRenderer_renderGuiItem_two_t ItemRenderer_renderGuiItem_two = (ItemRenderer_renderGuiItem_two_t) 0x63be0; + +typedef void (*ItemRenderer_renderGuiItemCorrect_t)(unsigned char *font, unsigned char *textures, ItemInstance *item_instance, int32_t param_1, int32_t param_2); static ItemRenderer_renderGuiItemCorrect_t ItemRenderer_renderGuiItemCorrect = (ItemRenderer_renderGuiItemCorrect_t) 0x639a0; // Tesselator