Fix Furnace Not Checking Item Auxiliary
This commit is contained in:
parent
0fcda17120
commit
e0ebc7fc32
@ -30,3 +30,4 @@ TRUE Load Language Files
|
|||||||
TRUE Implement Sound Engine
|
TRUE Implement Sound Engine
|
||||||
TRUE Close Current Screen On Death
|
TRUE Close Current Screen On Death
|
||||||
FALSE Disable Raw Mouse Motion (Not Recommended)
|
FALSE Disable Raw Mouse Motion (Not Recommended)
|
||||||
|
TRUE Fix Furnace Not Checking Item Auxiliary
|
||||||
|
@ -145,6 +145,40 @@ static void LocalPlayer_die_injection(unsigned char *entity, unsigned char *caus
|
|||||||
(*LocalPlayer_die)(entity, cause);
|
(*LocalPlayer_die)(entity, cause);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fix Furnace Not Checking Item Auxiliary When Inserting New Item
|
||||||
|
static int32_t FurnaceScreen_handleAddItem_injection(unsigned char *furnace_screen, int32_t slot, ItemInstance const *item) {
|
||||||
|
// Get Existing Item
|
||||||
|
unsigned char *tile_entity = *(unsigned char **) (furnace_screen + FurnaceScreen_tile_entity_property_offset);
|
||||||
|
unsigned char *tile_entity_vtable = *(unsigned char **) tile_entity;
|
||||||
|
FurnaceTileEntity_getItem_t FurnaceTileEntity_getItem = *(FurnaceTileEntity_getItem_t *) (tile_entity_vtable + FurnaceTileEntity_getItem_vtable_offset);
|
||||||
|
ItemInstance *existing_item = (*FurnaceTileEntity_getItem)(tile_entity, slot);
|
||||||
|
|
||||||
|
// Check Item
|
||||||
|
int valid;
|
||||||
|
if (item->id == existing_item->id && item->auxiliary == existing_item->auxiliary) {
|
||||||
|
// Item Matches, Is Valid
|
||||||
|
valid = 1;
|
||||||
|
} else {
|
||||||
|
// Item Doesn't Match, Check If Existing Item Is Empty
|
||||||
|
if ((existing_item->id | existing_item->count | existing_item->auxiliary) == 0) {
|
||||||
|
// Existing Item Is Empty, Is Valid
|
||||||
|
valid = 1;
|
||||||
|
} else {
|
||||||
|
// Existing Item Isn't Empty, Isn't Valid
|
||||||
|
valid = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call Original Method
|
||||||
|
if (valid) {
|
||||||
|
// Valid
|
||||||
|
return (*FurnaceScreen_handleAddItem)(furnace_screen, slot, item);
|
||||||
|
} else {
|
||||||
|
// Invalid
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Init
|
// Init
|
||||||
void init_misc() {
|
void init_misc() {
|
||||||
// Remove Invalid Item Background (A Red Background That Appears For Items That Are Not Included In The gui_blocks Atlas)
|
// Remove Invalid Item Background (A Red Background That Appears For Items That Are Not Included In The gui_blocks Atlas)
|
||||||
@ -177,6 +211,11 @@ void init_misc() {
|
|||||||
patch_address(LocalPlayer_die_vtable_addr, (void *) LocalPlayer_die_injection);
|
patch_address(LocalPlayer_die_vtable_addr, (void *) LocalPlayer_die_injection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fix Furnace Not Checking Item Auxiliary When Inserting New Item
|
||||||
|
if (feature_has("Fix Furnace Not Checking Item Auxiliary", 1)) {
|
||||||
|
overwrite_calls((void *) FurnaceScreen_handleAddItem, (void *) FurnaceScreen_handleAddItem_injection);
|
||||||
|
}
|
||||||
|
|
||||||
// Init C++ And Logging
|
// Init C++ And Logging
|
||||||
_init_misc_cpp();
|
_init_misc_cpp();
|
||||||
_init_misc_logging();
|
_init_misc_logging();
|
||||||
|
@ -401,6 +401,18 @@ static ProgressScreen_t ProgressScreen = (ProgressScreen_t) 0x37044;
|
|||||||
|
|
||||||
static void *OptionsScreen_handleBackEvent_vtable_addr = (void *) 0x10499c;
|
static void *OptionsScreen_handleBackEvent_vtable_addr = (void *) 0x10499c;
|
||||||
|
|
||||||
|
// FurnaceScreen
|
||||||
|
|
||||||
|
typedef int32_t (*FurnaceScreen_handleAddItem_t)(unsigned char *furnace_screen, int32_t slot, ItemInstance const *item);
|
||||||
|
static FurnaceScreen_handleAddItem_t FurnaceScreen_handleAddItem = (FurnaceScreen_handleAddItem_t) 0x327a0;
|
||||||
|
|
||||||
|
static uint32_t FurnaceScreen_tile_entity_property_offset = 0x1d0; // FurnaceTileEntity *
|
||||||
|
|
||||||
|
// FurnaceTileEntity
|
||||||
|
|
||||||
|
typedef ItemInstance *(*FurnaceTileEntity_getItem_t)(unsigned char *furnace_tile_entity, int32_t slot);
|
||||||
|
static uint32_t FurnaceTileEntity_getItem_vtable_offset = 0x2c;
|
||||||
|
|
||||||
// Screen
|
// Screen
|
||||||
|
|
||||||
typedef void (*Screen_updateEvents_t)(unsigned char *screen);
|
typedef void (*Screen_updateEvents_t)(unsigned char *screen);
|
||||||
|
Loading…
Reference in New Issue
Block a user