Animated Chests
This commit is contained in:
parent
168b825bf4
commit
71b11b314b
@ -307,6 +307,7 @@ void bootstrap(int argc, char *argv[]) {
|
|||||||
|
|
||||||
// Get Binary Directory
|
// Get Binary Directory
|
||||||
char *binary_directory = get_binary_directory();
|
char *binary_directory = get_binary_directory();
|
||||||
|
DEBUG("Binary Directory: %s", binary_directory);
|
||||||
|
|
||||||
// Copy SDK
|
// Copy SDK
|
||||||
copy_sdk(binary_directory);
|
copy_sdk(binary_directory);
|
||||||
|
@ -461,6 +461,38 @@ static bool ChestTileEntity_shouldSave_injection(__attribute__((unused)) unsigne
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Animated 3D Chest
|
||||||
|
static unsigned char *ContainerMenu_injection(unsigned char *container_menu, unsigned char *container, int32_t param_1) {
|
||||||
|
// Call Original Method
|
||||||
|
(*ContainerMenu)(container_menu, container, param_1);
|
||||||
|
|
||||||
|
// Play Animation
|
||||||
|
unsigned char *tile_entity = container - ChestTileEntity_container_property_offset;
|
||||||
|
bool is_client = *(bool *) (tile_entity + TileEntity_is_client_property_offset);
|
||||||
|
if (!is_client) {
|
||||||
|
unsigned char *container_vtable = *(unsigned char **) container;
|
||||||
|
Container_startOpen_t Container_startOpen = *(Container_startOpen_t *) (container_vtable + Container_startOpen_vtable_offset);
|
||||||
|
(*Container_startOpen)(container);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return container_menu;
|
||||||
|
}
|
||||||
|
static unsigned char *ContainerMenu_destructor_injection(unsigned char *container_menu) {
|
||||||
|
// Play Animation
|
||||||
|
unsigned char *container = *(unsigned char **) (container_menu + ContainerMenu_container_property_offset);
|
||||||
|
unsigned char *tile_entity = container - ChestTileEntity_container_property_offset;
|
||||||
|
bool is_client = *(bool *) (tile_entity + TileEntity_is_client_property_offset);
|
||||||
|
if (!is_client) {
|
||||||
|
unsigned char *container_vtable = *(unsigned char **) container;
|
||||||
|
Container_stopOpen_t Container_stopOpen = *(Container_stopOpen_t *) (container_vtable + Container_stopOpen_vtable_offset);
|
||||||
|
(*Container_stopOpen)(container);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call Original Method
|
||||||
|
return (*ContainerMenu_destructor)(container_menu);
|
||||||
|
}
|
||||||
|
|
||||||
// Init
|
// Init
|
||||||
static void nop() {
|
static void nop() {
|
||||||
}
|
}
|
||||||
@ -615,6 +647,11 @@ void init_misc() {
|
|||||||
patch((void *) 0x66fc8, chest_model_patch);
|
patch((void *) 0x66fc8, chest_model_patch);
|
||||||
unsigned char chest_color_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
|
unsigned char chest_color_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
|
||||||
patch((void *) 0x66404, chest_color_patch);
|
patch((void *) 0x66404, chest_color_patch);
|
||||||
|
|
||||||
|
// Animation
|
||||||
|
overwrite_calls((void *) ContainerMenu, (void *) ContainerMenu_injection);
|
||||||
|
overwrite_calls((void *) ContainerMenu_destructor, (void *) ContainerMenu_destructor_injection);
|
||||||
|
patch_address(ContainerMenu_destructor_vtable_addr, (void *) ContainerMenu_destructor_injection);
|
||||||
}
|
}
|
||||||
patch_address((void *) 0x115b48, (void *) ChestTileEntity_shouldSave_injection);
|
patch_address((void *) 0x115b48, (void *) ChestTileEntity_shouldSave_injection);
|
||||||
|
|
||||||
|
@ -835,17 +835,39 @@ static EntityRenderDispatcher_assign_t EntityRenderDispatcher_assign = (EntityRe
|
|||||||
|
|
||||||
static uint32_t TileEntity_id_property_offset = 0x18; // int32_t
|
static uint32_t TileEntity_id_property_offset = 0x18; // int32_t
|
||||||
static uint32_t TileEntity_renderer_id_property_offset = 0x24; // int32_t
|
static uint32_t TileEntity_renderer_id_property_offset = 0x24; // int32_t
|
||||||
|
static uint32_t TileEntity_is_client_property_offset = 0x20; // bool
|
||||||
|
|
||||||
// ChestTileEntity
|
// ChestTileEntity
|
||||||
|
|
||||||
typedef unsigned char *(*ChestTileEntity_t)(unsigned char *tile_entity);
|
typedef unsigned char *(*ChestTileEntity_t)(unsigned char *tile_entity);
|
||||||
static ChestTileEntity_t ChestTileEntity = (ChestTileEntity_t) 0xcfa78;
|
static ChestTileEntity_t ChestTileEntity = (ChestTileEntity_t) 0xcfa78;
|
||||||
|
|
||||||
|
static uint32_t ChestTileEntity_container_property_offset = 0x30; // Container
|
||||||
|
|
||||||
// ModelPart
|
// ModelPart
|
||||||
|
|
||||||
typedef void (*ModelPart_render_t)(unsigned char *model_part, float scale);
|
typedef void (*ModelPart_render_t)(unsigned char *model_part, float scale);
|
||||||
static ModelPart_render_t ModelPart_render = (ModelPart_render_t) 0x416dc;
|
static ModelPart_render_t ModelPart_render = (ModelPart_render_t) 0x416dc;
|
||||||
|
|
||||||
|
// Container
|
||||||
|
|
||||||
|
typedef void (*Container_startOpen_t)(unsigned char *container);
|
||||||
|
static uint32_t Container_startOpen_vtable_offset = 0x24;
|
||||||
|
|
||||||
|
typedef Container_startOpen_t Container_stopOpen_t;
|
||||||
|
static uint32_t Container_stopOpen_vtable_offset = 0x28;
|
||||||
|
|
||||||
|
// ContainerMenu
|
||||||
|
|
||||||
|
typedef unsigned char *(*ContainerMenu_t)(unsigned char *container_menu, unsigned char *container, int32_t param_1);
|
||||||
|
static ContainerMenu_t ContainerMenu = (ContainerMenu_t) 0x919a8;
|
||||||
|
|
||||||
|
typedef unsigned char *(*ContainerMenu_destructor_t)(unsigned char *container_menu);
|
||||||
|
static ContainerMenu_destructor_t ContainerMenu_destructor = (ContainerMenu_destructor_t) 0x91a74;
|
||||||
|
static void *ContainerMenu_destructor_vtable_addr = (void *) 0x10e1b8;
|
||||||
|
|
||||||
|
static uint32_t ContainerMenu_container_property_offset = 0x1c; // Container *
|
||||||
|
|
||||||
// ItemRenderer
|
// ItemRenderer
|
||||||
|
|
||||||
typedef void (*ItemRenderer_renderGuiItem_one_t)(unsigned char *font, unsigned char *textures, ItemInstance *item_instance, float param_1, float param_2, bool param_3);
|
typedef void (*ItemRenderer_renderGuiItem_one_t)(unsigned char *font, unsigned char *textures, ItemInstance *item_instance, float param_1, float param_2, bool param_3);
|
||||||
|
Loading…
Reference in New Issue
Block a user