diff --git a/dependencies/symbol-processor/src b/dependencies/symbol-processor/src index 059e572..95e24d1 160000 --- a/dependencies/symbol-processor/src +++ b/dependencies/symbol-processor/src @@ -1 +1 @@ -Subproject commit 059e572256667f696f2f1ac9f5253859d54f50c4 +Subproject commit 95e24d13fa223ff524f8920314c4984686c73928 diff --git a/mods/include/mods/text-input-box/TextInputBox.h b/mods/include/mods/text-input-box/TextInputBox.h index a75f594..2f3410b 100644 --- a/mods/include/mods/text-input-box/TextInputBox.h +++ b/mods/include/mods/text-input-box/TextInputBox.h @@ -31,5 +31,5 @@ struct TextInputBox { void onClick(int x, int y); bool clicked(int x, int y); - static TextInputBox create(int id, const std::string &placeholder = "", const std::string &text = ""); + static TextInputBox *create(int id, const std::string &placeholder = "", const std::string &text = ""); }; diff --git a/mods/include/mods/text-input-box/TextInputScreen.h b/mods/include/mods/text-input-box/TextInputScreen.h index f076d30..c3c5ada 100644 --- a/mods/include/mods/text-input-box/TextInputScreen.h +++ b/mods/include/mods/text-input-box/TextInputScreen.h @@ -6,7 +6,7 @@ struct TextInputScreen { Screen super; - std::vector m_textInputs; + std::vector *m_textInputs; static void setup(Screen_vtable *vtable); }; diff --git a/mods/src/chat/ui.cpp b/mods/src/chat/ui.cpp index 5dd304c..c7d6000 100644 --- a/mods/src/chat/ui.cpp +++ b/mods/src/chat/ui.cpp @@ -12,23 +12,48 @@ // Structure struct ChatScreen { TextInputScreen super; - TextInputBox chat; + TextInputBox *chat; + Button *send; }; CUSTOM_VTABLE(chat_screen, Screen) { TextInputScreen::setup(vtable); // Init + static Screen_init_t original_init = vtable->init; vtable->init = [](Screen *super) { - Screen_init_non_virtual(super); + original_init(super); ChatScreen *self = (ChatScreen *) super; - self->super.m_textInputs.push_back(&self->chat); - self->chat.init(super->font); - self->chat.setFocused(true); + // Text Input + self->chat = TextInputBox::create(1); + self->super.m_textInputs->push_back(self->chat); + self->chat->init(super->font); + self->chat->setFocused(true); + // Send Button + if (Minecraft_isTouchscreen(super->minecraft)) { + self->send = (Button *) new Touch_TButton; + } else { + self->send = new Button; + } + ALLOC_CHECK(self->send); + int send_id = 2; + std::string send_text = "Send"; + if (Minecraft_isTouchscreen(super->minecraft)) { + Touch_TButton_constructor((Touch_TButton *) self->send, send_id, &send_text); + } else { + Button_constructor(self->send, send_id, &send_text); + } + super->rendered_buttons.push_back(self->send); + super->selectable_buttons.push_back(self->send); + // Hide Chat Messages is_in_chat = true; }; // Removal + static Screen_removed_t original_removed = vtable->removed; vtable->removed = [](Screen *super) { - Screen_removed_non_virtual(super); + original_removed(super); is_in_chat = false; + ChatScreen *self = (ChatScreen *) super; + delete self->chat; + self->send->vtable->destructor_deleting(self->send); }; // Rendering static Screen_render_t original_render = vtable->render; @@ -44,24 +69,41 @@ CUSTOM_VTABLE(chat_screen, Screen) { vtable->setupPositions = [](Screen *super) { Screen_setupPositions_non_virtual(super); ChatScreen *self = (ChatScreen *) super; - int height = 20; + self->send->height = 20; + self->send->width = 40; int x = 0; - int y = super->height - height; - int width = super->width; - self->chat.setSize(x, y, width, height); + int y = super->height - self->send->height; + int width = super->width - self->send->width; + self->chat->setSize(x, y, width, self->send->height); + self->send->y = super->height - self->send->height; + self->send->x = x + width; }; // Key Presses static Screen_keyPressed_t original_keyPressed = vtable->keyPressed; vtable->keyPressed = [](Screen *super, int key) { // Handle Enter ChatScreen *self = (ChatScreen *) super; - if (key == 0x0d) { - _chat_queue_message(self->chat.m_text.c_str()); + if (key == 0x0d && self->chat->m_bFocused) { + if (self->chat->m_text.length() > 0) { + _chat_queue_message(self->chat->m_text.c_str()); + } Minecraft_setScreen(super->minecraft, NULL); } // Call Original Method original_keyPressed(super, key); }; + // Button Click + vtable->buttonClicked = [](Screen *super, Button *button) { + ChatScreen *self = (ChatScreen *) super; + if (button == self->send) { + // Send + self->chat->setFocused(true); + super->vtable->keyPressed(super, 0x0d); + } else { + // Call Original Method + Screen_buttonClicked_non_virtual(super, button); + } + }; } static Screen *create_chat_screen() { // Construct @@ -72,9 +114,6 @@ static Screen *create_chat_screen() { // Set VTable screen->super.super.vtable = get_chat_screen_vtable(); - // Setup - screen->chat = TextInputBox::create(0); - // Return return (Screen *) screen; } diff --git a/mods/src/misc/misc.c b/mods/src/misc/misc.c index 3b5bba4..6163094 100644 --- a/mods/src/misc/misc.c +++ b/mods/src/misc/misc.c @@ -490,7 +490,7 @@ static ContainerMenu *ContainerMenu_injection(ContainerMenu *container_menu, Con // Return return container_menu; } -static unsigned char *ContainerMenu_destructor_injection(ContainerMenu *container_menu) { +static ContainerMenu *ContainerMenu_destructor_injection(ContainerMenu *container_menu) { // Play Animation Container *container = container_menu->container; ChestTileEntity *tile_entity = (ChestTileEntity *) (((unsigned char *) container) - offsetof(ChestTileEntity, container)); @@ -500,7 +500,7 @@ static unsigned char *ContainerMenu_destructor_injection(ContainerMenu *containe } // Call Original Method - return ContainerMenu_destructor_non_virtual(container_menu); + return ContainerMenu_destructor_complete_non_virtual(container_menu); } #ifndef MCPI_HEADLESS_MODE @@ -720,8 +720,8 @@ void init_misc() { // Animation overwrite_calls((void *) ContainerMenu_constructor, (void *) ContainerMenu_injection); - overwrite_calls((void *) ContainerMenu_destructor_non_virtual, (void *) ContainerMenu_destructor_injection); - patch_address(ContainerMenu_destructor_vtable_addr, (void *) ContainerMenu_destructor_injection); + overwrite_calls((void *) ContainerMenu_destructor_complete_non_virtual, (void *) ContainerMenu_destructor_injection); + patch_address(ContainerMenu_destructor_complete_vtable_addr, (void *) ContainerMenu_destructor_injection); } patch_address((void *) 0x115b48, (void *) ChestTileEntity_shouldSave_injection); diff --git a/mods/src/text-input-box/TextInputBox.cpp b/mods/src/text-input-box/TextInputBox.cpp index cf98d3b..e91ede1 100644 --- a/mods/src/text-input-box/TextInputBox.cpp +++ b/mods/src/text-input-box/TextInputBox.cpp @@ -2,26 +2,26 @@ #include -TextInputBox TextInputBox::create(int id, const std::string &placeholder, const std::string &text) { +TextInputBox *TextInputBox::create(int id, const std::string &placeholder, const std::string &text) { // Construct - TextInputBox self; - GuiComponent_constructor(&self.super); + TextInputBox *self = new TextInputBox; + GuiComponent_constructor(&self->super); // Setup - self.m_ID = id; - self.m_xPos = 0; - self.m_yPos = 0; - self.m_width = 0; - self.m_height = 0; - self.m_placeholder = placeholder; - self.m_text = text; - self.m_bFocused = false; - self.m_bEnabled = true; - self.m_bCursorOn = true; - self.m_insertHead = 0; - self.m_lastFlashed = 0; - self.m_pFont = nullptr; - self.m_maxLength = -1; + self->m_ID = id; + self->m_xPos = 0; + self->m_yPos = 0; + self->m_width = 0; + self->m_height = 0; + self->m_placeholder = placeholder; + self->m_text = text; + self->m_bFocused = false; + self->m_bEnabled = true; + self->m_bCursorOn = true; + self->m_insertHead = 0; + self->m_lastFlashed = 0; + self->m_pFont = nullptr; + self->m_maxLength = -1; // Return return self; diff --git a/mods/src/text-input-box/TextInputScreen.cpp b/mods/src/text-input-box/TextInputScreen.cpp index 2b5a3b4..9fc9e19 100644 --- a/mods/src/text-input-box/TextInputScreen.cpp +++ b/mods/src/text-input-box/TextInputScreen.cpp @@ -7,34 +7,44 @@ void TextInputScreen::setup(Screen_vtable *vtable) { vtable->keyPressed = [](Screen *super2, int key) { Screen_keyPressed_non_virtual(super2, key); TextInputScreen *self = (TextInputScreen *) super2; - for (int i = 0; i < int(self->m_textInputs.size()); i++) { - TextInputBox *textInput = self->m_textInputs[i]; + for (int i = 0; i < int(self->m_textInputs->size()); i++) { + TextInputBox *textInput = (*self->m_textInputs)[i]; textInput->keyPressed(key); } }; vtable->keyboardNewChar = [](Screen *super2, char key) { Screen_keyboardNewChar_non_virtual(super2, key); TextInputScreen *self = (TextInputScreen *) super2; - for (int i = 0; i < int(self->m_textInputs.size()); i++) { - TextInputBox *textInput = self->m_textInputs[i]; + for (int i = 0; i < int(self->m_textInputs->size()); i++) { + TextInputBox *textInput = (*self->m_textInputs)[i]; textInput->charPressed(key); } }; vtable->mouseClicked = [](Screen *super2, int x, int y, int param_1) { Screen_mouseClicked_non_virtual(super2, x, y, param_1); TextInputScreen *self = (TextInputScreen *) super2; - for (int i = 0; i < int(self->m_textInputs.size()); i++) { - TextInputBox *textInput = self->m_textInputs[i]; + for (int i = 0; i < int(self->m_textInputs->size()); i++) { + TextInputBox *textInput = (*self->m_textInputs)[i]; textInput->onClick(x, y); } }; vtable->render = [](Screen *super2, int x, int y, float param_1) { Screen_render_non_virtual(super2, x, y, param_1); TextInputScreen *self = (TextInputScreen *) super2; - for (int i = 0; i < int(self->m_textInputs.size()); i++) { - TextInputBox *textInput = self->m_textInputs[i]; + for (int i = 0; i < int(self->m_textInputs->size()); i++) { + TextInputBox *textInput = (*self->m_textInputs)[i]; textInput->tick(); textInput->render(); } }; + vtable->init = [](Screen *super2) { + Screen_init_non_virtual(super2); + TextInputScreen *self = (TextInputScreen *) super2; + self->m_textInputs = new std::vector; + }; + vtable->removed = [](Screen *super2) { + Screen_removed_non_virtual(super2); + TextInputScreen *self = (TextInputScreen *) super2; + delete self->m_textInputs; + }; } diff --git a/symbols/CMakeLists.txt b/symbols/CMakeLists.txt index 185b743..eb06b62 100644 --- a/symbols/CMakeLists.txt +++ b/symbols/CMakeLists.txt @@ -110,6 +110,7 @@ set(SRC src/gui/components/IntRectangle.def src/gui/components/RectangleArea.def src/gui/components/ScrollingPane.def + src/gui/components/Touch_TButton.def src/app-platform/AppPlatform.def src/app-platform/AppPlatform_linux.def src/app-platform/AppPlatform_readAssetFile_return_value.def diff --git a/symbols/src/gui/Gui.def b/symbols/src/gui/Gui.def index 4162907..fc7595a 100644 --- a/symbols/src/gui/Gui.def +++ b/symbols/src/gui/Gui.def @@ -1,7 +1,7 @@ -size 0xa74; - extends GuiComponent; +size 0xa74; + method void tick() = 0x27778; method void handleClick(int param_2, int param_3, int param_4) = 0x2599c; method void renderOnSelectItemNameText(int param_1, Font *font, int param_2) = 0x26aec; diff --git a/symbols/src/gui/components/Button.def b/symbols/src/gui/components/Button.def index 5ff1315..cf2bb7b 100644 --- a/symbols/src/gui/components/Button.def +++ b/symbols/src/gui/components/Button.def @@ -1,5 +1,6 @@ extends GuiComponent; +size 0x28; constructor (int param_1, std::string *text) = 0x1bc54; method int hovered(Minecraft *minecraft, int click_x, int click_y) = 0x1be2c; diff --git a/symbols/src/gui/components/GuiComponent.def b/symbols/src/gui/components/GuiComponent.def index 77a775b..93a801c 100644 --- a/symbols/src/gui/components/GuiComponent.def +++ b/symbols/src/gui/components/GuiComponent.def @@ -1,7 +1,8 @@ size 0x8; - constructor () = 0x28204; +vtable 0x1039b0; + method void blit(int x_dest, int y_dest, int x_src, int y_src, int width_dest, int height_dest, int width_src, int height_src) = 0x282a4; method void drawCenteredString(Font *font, std::string *text, int x, int y, int color) = 0x2821c; method void drawString(Font *font, std::string *text, int x, int y, int color) = 0x28284; diff --git a/symbols/src/gui/components/OptionButton.def b/symbols/src/gui/components/OptionButton.def index 750cfcd..abb60b2 100644 --- a/symbols/src/gui/components/OptionButton.def +++ b/symbols/src/gui/components/OptionButton.def @@ -3,3 +3,5 @@ extends ImageButton; constructor (Options_Option *option) = 0x1c968; method void updateImage(Options *options) = 0x1ca58; + +property Options_Option *option = 0x54; diff --git a/symbols/src/gui/components/Touch_TButton.def b/symbols/src/gui/components/Touch_TButton.def new file mode 100644 index 0000000..fc73c64 --- /dev/null +++ b/symbols/src/gui/components/Touch_TButton.def @@ -0,0 +1,4 @@ +extends Button; + +size 0x28; +constructor (int param_1, std::string *text) = 0x1c168; diff --git a/symbols/src/level/container/ContainerMenu.def b/symbols/src/level/container/ContainerMenu.def index 525d81f..0d951fe 100644 --- a/symbols/src/level/container/ContainerMenu.def +++ b/symbols/src/level/container/ContainerMenu.def @@ -1,6 +1,5 @@ vtable 0x10e1b8; constructor (Container *container, int param_1) = 0x919a8; -virtual-method uchar *destructor() = 0x0; property Container *container = 0x1c; diff --git a/symbols/src/level/container/FillingContainer.def b/symbols/src/level/container/FillingContainer.def index 79a69c6..6581905 100644 --- a/symbols/src/level/container/FillingContainer.def +++ b/symbols/src/level/container/FillingContainer.def @@ -10,8 +10,6 @@ method int getFreeSlot() = 0x91ffc; method int getSlot(int id) = 0x91ce0; method int linkSlot(int linked_slot, int unlinked_slot, bool push_aside) = 0x92188; -virtual-method ItemInstance *getItem(int pos) = 0x8; -virtual-method void setItem(int pos, ItemInstance *item) = 0xc; virtual-method bool add(ItemInstance *item_instance) = 0x30; property int *linked_slots = 0xc;