From 5f2923b789e390ccca0af15d31752b6885bd4e2e Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Wed, 17 Jul 2024 03:44:41 -0400 Subject: [PATCH] Merge PR + WIP Refactor Co-authored-by: Bigjango13 --- launcher/src/client/available-feature-flags | 8 +- libreborn/src/patch/code-block.cpp | 5 +- mods/src/camera/camera.cpp | 22 +++++ mods/src/init/init.cpp | 2 +- mods/src/input/toggle.cpp | 12 ++- mods/src/misc/misc.cpp | 84 +++++++++++++++++-- symbols/CMakeLists.txt | 1 + symbols/src/item/Item.def | 4 +- symbols/src/item/ItemInstance.def | 2 +- .../src/level/container/FillingContainer.def | 2 +- symbols/src/misc/CompoundTag.def | 2 +- symbols/src/misc/Tag.def | 2 +- symbols/src/tile/CarriedTile.def | 3 + symbols/src/tile/Tile.def | 2 +- 14 files changed, 131 insertions(+), 20 deletions(-) create mode 100644 symbols/src/tile/CarriedTile.def diff --git a/launcher/src/client/available-feature-flags b/launcher/src/client/available-feature-flags index 51faee33..8ec6128b 100644 --- a/launcher/src/client/available-feature-flags +++ b/launcher/src/client/available-feature-flags @@ -69,4 +69,10 @@ TRUE Add Reborn Info To Options FALSE Log FPS TRUE Add Welcome Screen TRUE F3 Debug Information -TRUE Multidraw Rendering \ No newline at end of file +TRUE Multidraw Rendering +TRUE Add Missing Language Strings +TRUE Fix Pigmen Burning In The Sun +TRUE Fix Carried Grass's Bottom Texture +TRUE Hide Crosshair In Third-Person +TRUE Fix Camera Legs +TRUE Implement Crafting Remainders \ No newline at end of file diff --git a/libreborn/src/patch/code-block.cpp b/libreborn/src/patch/code-block.cpp index 578f5324..20d2ef1d 100644 --- a/libreborn/src/patch/code-block.cpp +++ b/libreborn/src/patch/code-block.cpp @@ -3,10 +3,11 @@ #include #include "patch-internal.h" -// Limit To 512 overwrite_calls() Uses -#define CODE_BLOCK_SIZE 4096 +// Limit Amount Of overwrite_calls() Calls +#define MAX_OVERWRITE_CALLS 4096 static unsigned char *code_block = nullptr; #define CODE_SIZE 8 +#define CODE_BLOCK_SIZE (MAX_OVERWRITE_CALLS * CODE_SIZE) static int code_block_remaining = CODE_BLOCK_SIZE; // Create Long Overwrite At Current Position diff --git a/mods/src/camera/camera.cpp b/mods/src/camera/camera.cpp index 211a052e..76507eac 100644 --- a/mods/src/camera/camera.cpp +++ b/mods/src/camera/camera.cpp @@ -30,6 +30,23 @@ static void TripodCamera_tick_Level_addParticle_call_injection(Level *level, con level->addParticle(particle, x, y + 0.5, z, deltaX, deltaY, deltaZ, count); } +// Fix Camera Legs +static void TripodCameraRenderer_render_EntityRenderer_bindTexture_injection(EntityRenderer *self, __attribute__((unused)) const std::string &file) { + self->bindTexture("item/camera.png"); +} +static void TripodCameraRenderer_render_TileRenderer_tesselateCrossTexture_injection() { + Tesselator *t = &Tesselator::instance; + for (const float a : {-1.f, 1.f}) { + for (const float b : {-1.f, 1.f}) { + constexpr float size = 0.45f; + t->vertexUV(size * a, 0.5, size * b, 0.75, 0.5); + t->vertexUV(size * a, -0.5, size * b, 0.75, 1); + t->vertexUV(size * -a, -0.5, size * -b, 1, 1); + t->vertexUV(size * -a, 0.5, size * -b, 1, 0.5); + } + } +} + // Init void init_camera() { // Implement AppPlatform_linux::saveScreenshot So Cameras Work @@ -42,4 +59,9 @@ void init_camera() { // Display Smoke From TripodCamera Higher overwrite_call((void *) 0x87dc4, (void *) TripodCamera_tick_Level_addParticle_call_injection); } + // Camera Legs + if (feature_has("Fix Camera Legs", server_disabled)) { + overwrite_call((void *) 0x659dc, (void *) TripodCameraRenderer_render_EntityRenderer_bindTexture_injection); + overwrite_call((void *) 0x65a08, (void *) TripodCameraRenderer_render_TileRenderer_tesselateCrossTexture_injection); + } } diff --git a/mods/src/init/init.cpp b/mods/src/init/init.cpp index b53cafb1..ff3280a6 100644 --- a/mods/src/init/init.cpp +++ b/mods/src/init/init.cpp @@ -4,9 +4,9 @@ #include __attribute__((constructor)) static void init() { - thunk_enabler = reborn_thunk_enabler; media_ensure_loaded(); reborn_init_patch(); + enable_all_thunks(reborn_thunk_enabler); run_tests(); init_version(); init_compat(); diff --git a/mods/src/input/toggle.cpp b/mods/src/input/toggle.cpp index 1b88ed40..bd80019f 100644 --- a/mods/src/input/toggle.cpp +++ b/mods/src/input/toggle.cpp @@ -47,7 +47,7 @@ static void revert_rotation(Entity *entity) { entity->old_pitch = -entity->old_pitch; } } -static int is_front_facing = 0; +static bool is_front_facing = false; static LocalPlayer *stored_player = nullptr; static void GameRenderer_setupCamera_injection(GameRenderer_setupCamera_t original, GameRenderer *game_renderer, float param_1, int param_2) { // Get Objects @@ -86,6 +86,13 @@ static void ParticleEngine_render_injection(ParticleEngine_render_t original, Pa } } +// Hide Crosshair +static void Gui_renderProgressIndicator_GuiComponent_blit_injection(GuiComponent *self, int x1, int y1, int x2, int y2, int w1, int h1, int w2, int h2) { + if (((Gui *) self)->minecraft->options.third_person == 0) { + self->blit(x1, y1, x2, y2, w1, h1, w2, h2); + } +} + // Init void _init_toggle() { if (feature_has("Bind Common Toggleable Options To Function Keys", server_disabled)) { @@ -96,4 +103,7 @@ void _init_toggle() { overwrite_calls(GameRenderer_setupCamera, GameRenderer_setupCamera_injection); overwrite_calls(ParticleEngine_render, ParticleEngine_render_injection); } + if (feature_has("Hide Crosshair In Third-Person", server_disabled)) { + overwrite_call((void *) 0x261b8, (void *) Gui_renderProgressIndicator_GuiComponent_blit_injection); + } } diff --git a/mods/src/misc/misc.cpp b/mods/src/misc/misc.cpp index ed1527af..c505730a 100644 --- a/mods/src/misc/misc.cpp +++ b/mods/src/misc/misc.cpp @@ -659,7 +659,7 @@ static void PauseScreen_init_injection(PauseScreen_init_t original, PauseScreen } // Implement crafting remainders -void PaneCraftingScreen_craftSelectedItem_PaneCraftingScreen_recheckRecipes_injection(PaneCraftingScreen *self) { +static void PaneCraftingScreen_craftSelectedItem_PaneCraftingScreen_recheckRecipes_injection(PaneCraftingScreen *self) { // Check for crafting remainders CItem *item = self->item; for (size_t i = 0; i < item->ingredients.size(); i++) { @@ -678,8 +678,7 @@ void PaneCraftingScreen_craftSelectedItem_PaneCraftingScreen_recheckRecipes_inje // Call Original Method self->recheckRecipes(); } - -ItemInstance *Item_getCraftingRemainingItem_injection(__attribute__((unused)) Item_getCraftingRemainingItem_t original, Item *self, ItemInstance *item_instance) { +static ItemInstance *Item_getCraftingRemainingItem_injection(__attribute__((unused)) Item_getCraftingRemainingItem_t original, Item *self, ItemInstance *item_instance) { if (self->craftingRemainingItem != nullptr) { ItemInstance *ret = new ItemInstance; ret->id = self->craftingRemainingItem->id; @@ -699,7 +698,7 @@ struct chunk_data { static chunk_data data[MAX_CHUNKS_SIZE]; static void sort_chunks(Chunk **chunks_begin, Chunk **chunks_end, DistanceChunkSorter sorter) { // Calculate Distances - int chunks_size = chunks_end - chunks_begin; + const int chunks_size = chunks_end - chunks_begin; if (chunks_size > MAX_CHUNKS_SIZE) { IMPOSSIBLE(); } @@ -733,6 +732,50 @@ static std::string AppPlatform_linux_getDateString_injection(__attribute__((unus return std::string(buf); } +// Missing Strings +static void add_missing_string(const std::string &key, const std::string &value) { + if (!I18n::_strings.contains(key)) { + I18n::_strings[key] = value; + } +} +static void Language_injection() { + // Fix Language Strings + add_missing_string("tile.waterStill.name", "Still Water"); + add_missing_string("tile.lavaStill.name", "Still Lava"); + add_missing_string("tile.grassCarried.name", "Carried Grass"); + add_missing_string("tile.leavesCarried.name", "Carried Leaves"); + add_missing_string("tile.invBedrock.name", "Invisible Bedrock"); + // Missing Language Strings + add_missing_string("item.camera.name", "Camera"); + add_missing_string("item.seedsMelon.name", "Melon Seeds"); + add_missing_string("tile.pumpkinStem.name", "Pumpkin Stem"); + add_missing_string("tile.stoneSlab.name", "Double Stone Slab"); +} +// Invisible Bedrock +static Tile *Tile_initTiles_Tile_init_invBedrock_injection(Tile *t) { + Tile *ret = t->init(); + t->setDescriptionId("invBedrock"); + return ret; +} +// Append "Still" Suffix To Liquid Description Keys +static std::string *Tile_initTiles_std_string_constructor(std::string *self, const char *from, const std::string::allocator_type &alloc) { + new (self) std::string(from, alloc); + self->append("Still"); + return self; +} + +// Fix Pigmen Burning In The Sun +static float Zombie_aiStep_getBrightness_injection(Entity *self, float param_1) { + if (self->getEntityTypeId() == 36) return 0; + return self->getBrightness(param_1); +} + +// Fix grass_carried's Bottom Texture +static int CarriedTile_getTexture2_injection(CarriedTile_getTexture2_t original, CarriedTile *self, int face, int metadata) { + if (face == 0) return 2; + return original(self, face, metadata); +} + // Init template static void nop(__attribute__((unused)) Args... args) { @@ -867,7 +910,7 @@ void init_misc() { unsigned char nop_patch[4] = {0x00, 0xf0, 0x20, 0xe3}; // "nop" patch((void *) 0x173e8, nop_patch); patch((void *) 0x173f0, nop_patch); - float gui_scale = strtof(gui_scale_str, nullptr); + const float gui_scale = strtof(gui_scale_str, nullptr); uint32_t gui_scale_raw; memcpy(&gui_scale_raw, &gui_scale, sizeof (gui_scale_raw)); patch_address((void *) 0x17520, (void *) gui_scale_raw); @@ -949,8 +992,10 @@ void init_misc() { } // Implement Crafting Remainders - overwrite_call((void *) 0x2e230, (void *) PaneCraftingScreen_craftSelectedItem_PaneCraftingScreen_recheckRecipes_injection); - overwrite_calls(Item_getCraftingRemainingItem, Item_getCraftingRemainingItem_injection); + if (feature_has("Implement Crafting Remainders", server_enabled)) { + overwrite_call((void *) 0x2e230, (void *) PaneCraftingScreen_craftSelectedItem_PaneCraftingScreen_recheckRecipes_injection); + overwrite_calls(Item_getCraftingRemainingItem, Item_getCraftingRemainingItem_injection); + } // Replace 2011 std::sort With Optimized(TM) Code if (feature_has("Optimized Chunk Sorting", server_enabled)) { @@ -962,7 +1007,7 @@ void init_misc() { patch_vtable(AppPlatform_linux_getDateString, AppPlatform_linux_getDateString_injection); } - // Don't Wrap Text On '\r' Or '\t' Because THey Are Actual Characters In MCPI + // Don't Wrap Text On '\r' Or '\t' Because They Are Actual Characters In MCPI patch_address(&Strings::text_wrapping_delimiter, (void *) " \n"); // Fullscreen @@ -975,6 +1020,29 @@ void init_misc() { } }); + // Fix/Update Language Strings + if (feature_has("Add Missing Language Strings", server_disabled)) { + misc_run_on_language_setup(Language_injection); + // Water/Lava Language Strings + overwrite_call((void *) 0xc3b54, (void *) Tile_initTiles_std_string_constructor); + overwrite_call((void *) 0xc3c7c, (void *) Tile_initTiles_std_string_constructor); + // Carried Tile Language Strings + patch_address((void *) 0xc6674, (void *) "grassCarried"); + patch_address((void *) 0xc6684, (void *) "leavesCarried"); + // Invisible Bedrock Language String + overwrite_call((void *) 0xc5f04, (void *) Tile_initTiles_Tile_init_invBedrock_injection); + } + + // Fix pigmen from burning in the sun + if (feature_has("Fix Pigmen Burning In The Sun", server_enabled)) { + overwrite_call((void *) 0x89a1c, (void *) Zombie_aiStep_getBrightness_injection); + } + + // Fix grass_carried's bottom texture + if (feature_has("Fix Grass's Bottom Texture", server_disabled)) { + overwrite_calls(CarriedTile_getTexture2, CarriedTile_getTexture2_injection); + } + // Init Logging _init_misc_logging(); _init_misc_api(); diff --git a/symbols/CMakeLists.txt b/symbols/CMakeLists.txt index 926003c5..36c3e4f2 100644 --- a/symbols/CMakeLists.txt +++ b/symbols/CMakeLists.txt @@ -151,6 +151,7 @@ set(SRC src/tile/StemTile.def src/tile/Tile_SoundType.def src/tile/TileRenderer.def + src/tile/CarriedTile.def src/tile/GrassTile.def src/tile/HeavyTile.def src/tile/EntityTile.def diff --git a/symbols/src/item/Item.def b/symbols/src/item/Item.def index 58ff9ed9..ce350128 100644 --- a/symbols/src/item/Item.def +++ b/symbols/src/item/Item.def @@ -7,7 +7,7 @@ size 0x24; constructor (int id) = 0x99488; virtual-method int getIcon(int auxiliary) = 0x14; -virtual-method void setIcon(int texture_x, int texture_y) = 0x18; +virtual-method Item *setIcon(int texture_x, int texture_y) = 0x18; virtual-method int useOn(ItemInstance *item_instance, Player *player, Level *level, int x, int y, int z, int hit_side, float hit_x, float hit_y, float hit_z) = 0x20; // Normally returns 0 virtual-method int getUseDuration(ItemInstance *item_instance) = 0x24; @@ -20,7 +20,7 @@ virtual-method bool mineBlock(ItemInstance *instance, int tile_id, int x, int y, virtual-method void interactEnemy(ItemInstance *item_instance, Mob *mob) = 0x54; virtual-method bool isFood() = 0x64; virtual-method bool isArmor() = 0x68; -virtual-method void setDescriptionId(const std::string &name) = 0x6c; +virtual-method Item *setDescriptionId(const std::string &name) = 0x6c; virtual-method std::string getDescriptionId(const ItemInstance *item_instance) = 0x7c; // This returns an Item*, but it's never called normally so it doesn't matter if we invent a better system over top of it virtual-method ItemInstance *getCraftingRemainingItem(ItemInstance *item_instance) = 0x84; diff --git a/symbols/src/item/ItemInstance.def b/symbols/src/item/ItemInstance.def index ca4f554e..e2d805dc 100644 --- a/symbols/src/item/ItemInstance.def +++ b/symbols/src/item/ItemInstance.def @@ -7,7 +7,7 @@ constructor item_extra(const Item *item, int count, int auxiliary) = 0x99960; static-method ItemInstance *fromTag(CompoundTag *tag) = 0x9a124; -method void save(CompoundTag *tag) = 0x9a31c; +method CompoundTag *save(CompoundTag *tag) = 0x9a31c; method int getMaxStackSize() = 0x99ac8; method bool isNull() = 0x999b0; diff --git a/symbols/src/level/container/FillingContainer.def b/symbols/src/level/container/FillingContainer.def index 7607a6ff..84c785b1 100644 --- a/symbols/src/level/container/FillingContainer.def +++ b/symbols/src/level/container/FillingContainer.def @@ -2,7 +2,7 @@ extends Container; vtable 0x10e250; -method void addItem(ItemInstance *item_instance) = 0x92aa0; +method int addItem(ItemInstance *item_instance) = 0x92aa0; method void clearSlot(int slot) = 0x922f8; method void release(int slot) = 0x92058; method void compressLinkedSlotList(int slot) = 0x92280; diff --git a/symbols/src/misc/CompoundTag.def b/symbols/src/misc/CompoundTag.def index 73efc476..427997e2 100644 --- a/symbols/src/misc/CompoundTag.def +++ b/symbols/src/misc/CompoundTag.def @@ -2,7 +2,7 @@ extends Tag; vtable-size 0x34; size 0x24; -constructor (std::string name) = 0x69740; +constructor (const std::string &name) = 0x69740; method bool getBoolean(const std::string &name) = 0xd1b28; method char getByte(const std::string &name) = 0x7f00c; diff --git a/symbols/src/misc/Tag.def b/symbols/src/misc/Tag.def index e12be663..7548d18f 100644 --- a/symbols/src/misc/Tag.def +++ b/symbols/src/misc/Tag.def @@ -1 +1 @@ -constructor () = 0x684e0; +constructor (const std::string &name) = 0x684e0; \ No newline at end of file diff --git a/symbols/src/tile/CarriedTile.def b/symbols/src/tile/CarriedTile.def new file mode 100644 index 00000000..7bad22fd --- /dev/null +++ b/symbols/src/tile/CarriedTile.def @@ -0,0 +1,3 @@ +extends Tile; + +vtable 0x114798; \ No newline at end of file diff --git a/symbols/src/tile/Tile.def b/symbols/src/tile/Tile.def index 0fb586d3..d514b82e 100644 --- a/symbols/src/tile/Tile.def +++ b/symbols/src/tile/Tile.def @@ -23,7 +23,7 @@ virtual-method void addAABBs(Level *level, int x, int y, int z, const AABB *inte virtual-method bool isSolidRender() = 0x40; virtual-method bool mayPlace(Level *level, int x, int y, int z, uchar face) = 0x4c; virtual-method bool mayPlace2(Level *level, int x, int y, int z) = 0x50; -virtual-method void tick(Level *level, int x, int y, int z) = 0x58; +virtual-method void tick(Level *level, int x, int y, int z, Random *random) = 0x58; virtual-method void neighborChanged(Level *level, int x, int y, int z, int neighborId) = 0x64; virtual-method void onPlace(Level *level, int x, int y, int z) = 0x68; virtual-method void onRemove(Level *level, int x, int y, int z) = 0x6c;