3D Chest Model
This commit is contained in:
parent
b0aac13057
commit
7969fb2127
@ -9,6 +9,14 @@ if(NOT MCPI_HEADLESS_MODE)
|
|||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Chest Model
|
||||||
|
if(NOT MCPI_HEADLESS_MODE)
|
||||||
|
install(
|
||||||
|
FILES "chest.png"
|
||||||
|
DESTINATION "${MCPI_INSTALL_DIR}/data/images/item"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Icon
|
# Icon
|
||||||
install(
|
install(
|
||||||
FILES "icon.png"
|
FILES "icon.png"
|
||||||
|
BIN
images/chest.png
Normal file
BIN
images/chest.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.8 KiB |
BIN
images/chest.png~
Normal file
BIN
images/chest.png~
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.9 KiB |
@ -49,3 +49,4 @@ TRUE Generate Caves
|
|||||||
FALSE Disable Block Tinting
|
FALSE Disable Block Tinting
|
||||||
TRUE Disable Hostile AI In Creative Mode
|
TRUE Disable Hostile AI In Creative Mode
|
||||||
TRUE Load Custom Skins
|
TRUE Load Custom Skins
|
||||||
|
TRUE 3D Chest Model
|
||||||
|
@ -415,6 +415,52 @@ static unsigned char *PathfinderMob_findAttackTarget_injection(unsigned char *mo
|
|||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 3D Chests
|
||||||
|
static int32_t Tile_getRenderShape_injection(unsigned char *tile) {
|
||||||
|
if (tile == *Tile_chest) {
|
||||||
|
// Don't Render "Simple" Chest Model
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
// Call Original Method
|
||||||
|
unsigned char *tile_vtable = *(unsigned char **) tile;
|
||||||
|
Tile_getRenderShape_t Tile_getRenderShape = *(Tile_getRenderShape_t *) (tile_vtable + Tile_getRenderShape_vtable_offset);
|
||||||
|
return (*Tile_getRenderShape)(tile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static unsigned char *ChestTileEntity_injection(unsigned char *tile_entity) {
|
||||||
|
// Call Original Method
|
||||||
|
(*ChestTileEntity)(tile_entity);
|
||||||
|
|
||||||
|
// Enable Renderer
|
||||||
|
*(int32_t *) (tile_entity + TileEntity_renderer_id_property_offset) = 1;
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return tile_entity;
|
||||||
|
}
|
||||||
|
static bool is_rendering_chest = 0;
|
||||||
|
static void ModelPart_render_injection(unsigned char *model_part, float scale) {
|
||||||
|
// Start
|
||||||
|
is_rendering_chest = 1;
|
||||||
|
|
||||||
|
// Call Original Method
|
||||||
|
(*ModelPart_render)(model_part, scale);
|
||||||
|
|
||||||
|
// Stop
|
||||||
|
is_rendering_chest = 0;
|
||||||
|
}
|
||||||
|
static void Tesselator_vertexUV_injection(unsigned char *tesselator, float x, float y, float z, float u, float v) {
|
||||||
|
// Fix Chest Texture
|
||||||
|
if (is_rendering_chest) {
|
||||||
|
v /= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call Original Method
|
||||||
|
(*Tesselator_vertexUV)(tesselator, x, y, z, u, v);
|
||||||
|
}
|
||||||
|
static bool ChestTileEntity_shouldSave_injection(__attribute__((unused)) unsigned char *tile_entity) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
// Init
|
// Init
|
||||||
static void nop() {
|
static void nop() {
|
||||||
}
|
}
|
||||||
@ -557,6 +603,21 @@ void init_misc() {
|
|||||||
overwrite_call((void *) 0x83b8c, (void *) PathfinderMob_findAttackTarget_injection);
|
overwrite_call((void *) 0x83b8c, (void *) PathfinderMob_findAttackTarget_injection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 3D Chests
|
||||||
|
if (feature_has("3D Chest Model", server_disabled)) {
|
||||||
|
overwrite_call((void *) 0x5e830, (void *) Tile_getRenderShape_injection);
|
||||||
|
overwrite_calls((void *) ChestTileEntity, (void *) ChestTileEntity_injection);
|
||||||
|
overwrite_call((void *) 0x6655c, (void *) ModelPart_render_injection);
|
||||||
|
overwrite_call((void *) 0x66568, (void *) ModelPart_render_injection);
|
||||||
|
overwrite_call((void *) 0x66574, (void *) ModelPart_render_injection);
|
||||||
|
overwrite_calls((void *) Tesselator_vertexUV, (void *) Tesselator_vertexUV_injection);
|
||||||
|
unsigned char chest_model_patch[4] = {0x13, 0x20, 0xa0, 0xe3}; // "mov r2, #0x13"
|
||||||
|
patch((void *) 0x66fc8, chest_model_patch);
|
||||||
|
unsigned char chest_color_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop"
|
||||||
|
patch((void *) 0x66404, chest_color_patch);
|
||||||
|
}
|
||||||
|
patch_address((void *) 0x115b48, (void *) ChestTileEntity_shouldSave_injection);
|
||||||
|
|
||||||
// Init C++ And Logging
|
// Init C++ And Logging
|
||||||
_init_misc_cpp();
|
_init_misc_cpp();
|
||||||
_init_misc_logging();
|
_init_misc_logging();
|
||||||
|
@ -45,6 +45,7 @@ static unsigned char **Item_egg = (unsigned char **) 0x17bbd0; // Item
|
|||||||
static unsigned char **Item_dye_powder = (unsigned char **) 0x17bbe0; // Item
|
static unsigned char **Item_dye_powder = (unsigned char **) 0x17bbe0; // Item
|
||||||
static unsigned char **Item_camera = (unsigned char **) 0x17bc14; // Item
|
static unsigned char **Item_camera = (unsigned char **) 0x17bc14; // Item
|
||||||
|
|
||||||
|
static unsigned char **Tile_chest = (unsigned char **) 0x181d60; // Tile
|
||||||
static unsigned char **Tile_water = (unsigned char **) 0x181b3c; // Tile
|
static unsigned char **Tile_water = (unsigned char **) 0x181b3c; // Tile
|
||||||
static unsigned char **Tile_lava = (unsigned char **) 0x181cc8; // Tile
|
static unsigned char **Tile_lava = (unsigned char **) 0x181cc8; // Tile
|
||||||
static unsigned char **Tile_calmWater = (unsigned char **) 0x181b40; // Tile
|
static unsigned char **Tile_calmWater = (unsigned char **) 0x181b40; // Tile
|
||||||
@ -132,6 +133,9 @@ static uint32_t Tile_use_vtable_offset = 0x98;
|
|||||||
typedef int32_t (*Tile_getColor_t)(unsigned char *tile, unsigned char *level_source, int32_t x, int32_t y, int32_t z);
|
typedef int32_t (*Tile_getColor_t)(unsigned char *tile, unsigned char *level_source, int32_t x, int32_t y, int32_t z);
|
||||||
static uint32_t Tile_getColor_vtable_offset = 0xb8;
|
static uint32_t Tile_getColor_vtable_offset = 0xb8;
|
||||||
|
|
||||||
|
typedef int32_t (*Tile_getRenderShape_t)(unsigned char *tile);
|
||||||
|
static uint32_t Tile_getRenderShape_vtable_offset = 0xc;
|
||||||
|
|
||||||
static uint32_t Tile_id_property_offset = 0x8; // int32_t
|
static uint32_t Tile_id_property_offset = 0x8; // int32_t
|
||||||
static uint32_t Tile_category_property_offset = 0x3c; // int32_t
|
static uint32_t Tile_category_property_offset = 0x3c; // int32_t
|
||||||
|
|
||||||
@ -830,6 +834,17 @@ static EntityRenderDispatcher_assign_t EntityRenderDispatcher_assign = (EntityRe
|
|||||||
// TileEntity
|
// TileEntity
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
|
// ChestTileEntity
|
||||||
|
|
||||||
|
typedef unsigned char *(*ChestTileEntity_t)(unsigned char *tile_entity);
|
||||||
|
static ChestTileEntity_t ChestTileEntity = (ChestTileEntity_t) 0xcfa78;
|
||||||
|
|
||||||
|
// ModelPart
|
||||||
|
|
||||||
|
typedef void (*ModelPart_render_t)(unsigned char *model_part, float scale);
|
||||||
|
static ModelPart_render_t ModelPart_render = (ModelPart_render_t) 0x416dc;
|
||||||
|
|
||||||
// ItemRenderer
|
// ItemRenderer
|
||||||
|
|
||||||
@ -853,6 +868,9 @@ static Tesselator_colorABGR_t Tesselator_colorABGR = (Tesselator_colorABGR_t) 0x
|
|||||||
typedef void (*Tesselator_color_t)(unsigned char *tesselator, int32_t r, int32_t g, int32_t b, int32_t a);
|
typedef void (*Tesselator_color_t)(unsigned char *tesselator, int32_t r, int32_t g, int32_t b, int32_t a);
|
||||||
static Tesselator_color_t Tesselator_color = (Tesselator_color_t) 0x52a48;
|
static Tesselator_color_t Tesselator_color = (Tesselator_color_t) 0x52a48;
|
||||||
|
|
||||||
|
typedef void (*Tesselator_vertexUV_t)(unsigned char *tesselator, float x, float y, float z, float u, float v);
|
||||||
|
static Tesselator_vertexUV_t Tesselator_vertexUV = (Tesselator_vertexUV_t) 0x52d40;
|
||||||
|
|
||||||
// SoundEngine
|
// SoundEngine
|
||||||
|
|
||||||
typedef void (*SoundEngine_init_t)(unsigned char *sound_engine, unsigned char *minecraft, unsigned char *options);
|
typedef void (*SoundEngine_init_t)(unsigned char *sound_engine, unsigned char *minecraft, unsigned char *options);
|
||||||
|
Loading…
Reference in New Issue
Block a user