Small Rename
This commit is contained in:
parent
dd25805af9
commit
eeace9cf14
@ -37,27 +37,27 @@ T *extend_get_vtable() {
|
||||
static void setup_##name##_vtable(parent##_vtable *vtable)
|
||||
|
||||
// Extend MCPI Classes
|
||||
template <typename Super, typename Self>
|
||||
Self *extend_get_data(Super *super) {
|
||||
return (Self *) (super + 1);
|
||||
template <typename Self, typename Data>
|
||||
Data *extend_get_data(Self *self) {
|
||||
return (Data *) (self + 1);
|
||||
}
|
||||
template <typename Super, typename Self>
|
||||
auto extend_struct(auto&&... args) -> decltype(Super::allocate()) {
|
||||
constexpr size_t size = sizeof(Super) + sizeof(Self);
|
||||
Super *super = (Super *) ::operator new(size);
|
||||
Self *self = extend_get_data<Super, Self>(super);
|
||||
new (self) Self(std::forward<decltype(args)>(args)...);
|
||||
return super;
|
||||
template <typename Self, typename Data>
|
||||
auto extend_struct(auto&&... args) -> decltype(Self::allocate()) {
|
||||
constexpr size_t size = sizeof(Self) + sizeof(Data);
|
||||
Self *out = (Self *) ::operator new(size);
|
||||
Data *data = extend_get_data<Self, Data>(out);
|
||||
new (data) Data(std::forward<decltype(args)>(args)...);
|
||||
return out;
|
||||
}
|
||||
|
||||
// Helpers
|
||||
#define CREATE_HELPER(name) \
|
||||
struct Custom##name { \
|
||||
explicit Custom##name(auto&&... args): super(((name *) this) - 1) { \
|
||||
super->constructor(std::forward<decltype(args)>(args)...); \
|
||||
super->vtable = get_vtable(); \
|
||||
explicit Custom##name(auto&&... args): self(((name *) this) - 1) { \
|
||||
self->constructor(std::forward<decltype(args)>(args)...); \
|
||||
self->vtable = get_vtable(); \
|
||||
} \
|
||||
name *const super; \
|
||||
name *const self; \
|
||||
static name##_vtable *get_vtable(); \
|
||||
private: \
|
||||
static void setup_vtable(name##_vtable *vtable); \
|
||||
|
@ -26,7 +26,7 @@ struct ChatScreen final : TextInputScreen {
|
||||
// Text Input
|
||||
chat = new TextInputBox;
|
||||
m_textInputs->push_back(chat);
|
||||
chat->init(super->font);
|
||||
chat->init(self->font);
|
||||
chat->setFocused(true);
|
||||
history_pos = get_history().size();
|
||||
local_history = get_history();
|
||||
@ -37,8 +37,8 @@ struct ChatScreen final : TextInputScreen {
|
||||
chat->setMaxLength(max_length);
|
||||
// Send Button
|
||||
send = touch_create_button(1, "Send");
|
||||
super->rendered_buttons.push_back(send);
|
||||
super->selectable_buttons.push_back(send);
|
||||
self->rendered_buttons.push_back(send);
|
||||
self->selectable_buttons.push_back(send);
|
||||
// Hide Chat Messages
|
||||
is_in_chat = true;
|
||||
}
|
||||
@ -51,9 +51,9 @@ struct ChatScreen final : TextInputScreen {
|
||||
// Rendering
|
||||
void render(const int x, const int y, const float param_1) override {
|
||||
// Background
|
||||
super->renderBackground();
|
||||
self->renderBackground();
|
||||
// Render Chat
|
||||
super->minecraft->gui.renderChatMessages(super->height, 20, true, super->font);
|
||||
self->minecraft->gui.renderChatMessages(self->height, 20, true, self->font);
|
||||
// Call Original Method
|
||||
TextInputScreen::render(x, y, param_1);
|
||||
}
|
||||
@ -63,10 +63,10 @@ struct ChatScreen final : TextInputScreen {
|
||||
send->height = 24;
|
||||
send->width = 40;
|
||||
constexpr int x = 0;
|
||||
const int y = super->height - send->height;
|
||||
const int width = super->width - send->width;
|
||||
const int y = self->height - send->height;
|
||||
const int width = self->width - send->width;
|
||||
chat->setSize(x, y, width, send->height);
|
||||
send->y = super->height - send->height;
|
||||
send->y = self->height - send->height;
|
||||
send->x = x + width;
|
||||
}
|
||||
// Key Presses
|
||||
@ -78,9 +78,9 @@ struct ChatScreen final : TextInputScreen {
|
||||
if (get_history().size() == 0 || text != get_history().back()) {
|
||||
get_history().push_back(text);
|
||||
}
|
||||
_chat_send_message_to_server(super->minecraft, text.c_str());
|
||||
_chat_send_message_to_server(self->minecraft, text.c_str());
|
||||
}
|
||||
super->minecraft->setScreen(nullptr);
|
||||
self->minecraft->setScreen(nullptr);
|
||||
} else if (key == MC_KEY_UP) {
|
||||
// Up
|
||||
local_history.at(history_pos) = chat->getText();
|
||||
@ -107,7 +107,7 @@ struct ChatScreen final : TextInputScreen {
|
||||
if (button == send) {
|
||||
// Send
|
||||
chat->setFocused(true);
|
||||
super->keyPressed(0x0d);
|
||||
self->keyPressed(0x0d);
|
||||
} else {
|
||||
// Call Original Method
|
||||
TextInputScreen::buttonClicked(button);
|
||||
|
@ -2,34 +2,34 @@
|
||||
|
||||
// Easily Create Custom Screens
|
||||
void CustomScreen::init() {
|
||||
Screen_vtable::base->init(super);
|
||||
Screen_vtable::base->init(self);
|
||||
}
|
||||
void CustomScreen::render(const int x, const int y, const float param_1) {
|
||||
Screen_vtable::base->render(super, x, y, param_1);
|
||||
Screen_vtable::base->render(self, x, y, param_1);
|
||||
}
|
||||
void CustomScreen::setupPositions() {
|
||||
Screen_vtable::base->setupPositions(super);
|
||||
Screen_vtable::base->setupPositions(self);
|
||||
}
|
||||
bool CustomScreen::handleBackEvent(const bool do_nothing) {
|
||||
return Screen_vtable::base->handleBackEvent(super, do_nothing);
|
||||
return Screen_vtable::base->handleBackEvent(self, do_nothing);
|
||||
}
|
||||
void CustomScreen::tick() {
|
||||
Screen_vtable::base->tick(super);
|
||||
Screen_vtable::base->tick(self);
|
||||
}
|
||||
void CustomScreen::buttonClicked(Button *button) {
|
||||
Screen_vtable::base->buttonClicked(super, button);
|
||||
Screen_vtable::base->buttonClicked(self, button);
|
||||
}
|
||||
void CustomScreen::mouseClicked(const int x, const int y, const int param_1) {
|
||||
Screen_vtable::base->mouseClicked(super, x, y, param_1);
|
||||
Screen_vtable::base->mouseClicked(self, x, y, param_1);
|
||||
}
|
||||
void CustomScreen::mouseReleased(const int x, const int y, const int param_1) {
|
||||
Screen_vtable::base->mouseReleased(super, x, y, param_1);
|
||||
Screen_vtable::base->mouseReleased(self, x, y, param_1);
|
||||
}
|
||||
void CustomScreen::keyPressed(const int key) {
|
||||
Screen_vtable::base->keyPressed(super, key);
|
||||
Screen_vtable::base->keyPressed(self, key);
|
||||
}
|
||||
void CustomScreen::keyboardNewChar(const char key) {
|
||||
Screen_vtable::base->keyboardNewChar(super, key);
|
||||
Screen_vtable::base->keyboardNewChar(self, key);
|
||||
}
|
||||
|
||||
// VTable
|
||||
|
@ -4,13 +4,13 @@
|
||||
|
||||
// VTable Patching
|
||||
#define PATCH_VTABLE(name) \
|
||||
vtable->name = [](_Super *super, auto... args) { \
|
||||
return extend_get_data<_Super, _Self>(super)->name(std::forward<decltype(args)>(args)...); \
|
||||
vtable->name = [](_Self *self, auto... args) { \
|
||||
return extend_get_data<_Self, _Data>(self)->name(std::forward<decltype(args)>(args)...); \
|
||||
}
|
||||
#define _PATCH_VTABLE_DESTRUCTOR(name, type) \
|
||||
vtable->type = [](_Super *super) { \
|
||||
extend_get_data<_Super, _Self>(super)->~_Self(); \
|
||||
return name##_vtable::base->type(super); \
|
||||
vtable->type = [](_Self *self) { \
|
||||
extend_get_data<_Self, _Data>(self)->~_Data(); \
|
||||
return name##_vtable::base->type(self); \
|
||||
}
|
||||
#define _PATCH_VTABLE_DESTRUCTORS(name) \
|
||||
_PATCH_VTABLE_DESTRUCTOR(name, destructor_complete); \
|
||||
@ -19,7 +19,7 @@
|
||||
name##_vtable *Custom##name::get_vtable() { \
|
||||
return extend_get_vtable<name##_vtable, setup_vtable>(); \
|
||||
} \
|
||||
typedef name _Super; \
|
||||
typedef Custom##name _Self; \
|
||||
typedef name _Self; \
|
||||
typedef Custom##name _Data; \
|
||||
void Custom##name::setup_vtable(name##_vtable *vtable) { \
|
||||
_PATCH_VTABLE_DESTRUCTORS(name);
|
||||
|
@ -39,25 +39,25 @@ struct CreateWorldScreen final : TextInputScreen {
|
||||
// Name
|
||||
name = new TextInputBox("World Name", "Unnamed world");
|
||||
m_textInputs->push_back(name);
|
||||
name->init(super->font);
|
||||
name->init(self->font);
|
||||
name->setFocused(true);
|
||||
// Seed
|
||||
seed = new TextInputBox("Seed");
|
||||
m_textInputs->push_back(seed);
|
||||
seed->init(super->font);
|
||||
seed->init(self->font);
|
||||
seed->setFocused(false);
|
||||
// Game Mode
|
||||
game_mode = touch_create_button(1, CREATIVE_STR);
|
||||
super->rendered_buttons.push_back(game_mode);
|
||||
super->selectable_buttons.push_back(game_mode);
|
||||
self->rendered_buttons.push_back(game_mode);
|
||||
self->selectable_buttons.push_back(game_mode);
|
||||
// Create
|
||||
create = touch_create_button(2, "Create");
|
||||
super->rendered_buttons.push_back(create);
|
||||
super->selectable_buttons.push_back(create);
|
||||
self->rendered_buttons.push_back(create);
|
||||
self->selectable_buttons.push_back(create);
|
||||
// Back
|
||||
back = touch_create_button(3, "Back");
|
||||
super->rendered_buttons.push_back(back);
|
||||
super->selectable_buttons.push_back(back);
|
||||
self->rendered_buttons.push_back(back);
|
||||
self->selectable_buttons.push_back(back);
|
||||
}
|
||||
// Removal
|
||||
~CreateWorldScreen() override {
|
||||
@ -70,17 +70,17 @@ struct CreateWorldScreen final : TextInputScreen {
|
||||
// Rendering
|
||||
void render(const int x, const int y, const float param_1) override {
|
||||
// Background
|
||||
misc_render_background(80, super->minecraft, 0, 0, super->width, super->height);
|
||||
misc_render_background(32, super->minecraft, 0, content_y_offset_top, super->width, super->height - content_y_offset_top - content_y_offset_bottom);
|
||||
misc_render_background(80, self->minecraft, 0, 0, self->width, self->height);
|
||||
misc_render_background(32, self->minecraft, 0, content_y_offset_top, self->width, self->height - content_y_offset_top - content_y_offset_bottom);
|
||||
// Call Original Method
|
||||
TextInputScreen::render(x, y, param_1);
|
||||
// Title
|
||||
std::string title = "Create world";
|
||||
super->drawCenteredString(super->font, title, super->width / 2, title_padding, 0xffffffff);
|
||||
self->drawCenteredString(self->font, title, self->width / 2, title_padding, 0xffffffff);
|
||||
// Game Mode Description
|
||||
const bool is_creative = game_mode->text == CREATIVE_STR;
|
||||
std::string description = is_creative ? Strings::creative_mode_description : Strings::survival_mode_description;
|
||||
super->drawString(super->font, description, game_mode->x, game_mode->y + game_mode->height + description_padding, 0xa0a0a0);
|
||||
self->drawString(self->font, description, game_mode->x, game_mode->y + game_mode->height + description_padding, 0xa0a0a0);
|
||||
}
|
||||
// Positioning
|
||||
void setupPositions() override {
|
||||
@ -95,15 +95,15 @@ struct CreateWorldScreen final : TextInputScreen {
|
||||
const int text_box_height = game_mode->height;
|
||||
// Find Center Y
|
||||
constexpr int top = content_y_offset_top;
|
||||
const int bottom = super->height - content_y_offset_bottom;
|
||||
const int bottom = self->height - content_y_offset_bottom;
|
||||
int center_y = ((bottom - top) / 2) + top;
|
||||
center_y -= (description_padding + line_height) / 2;
|
||||
// X/Y
|
||||
create->y = back->y = super->height - bottom_padding - height;
|
||||
create->x = game_mode->x = (super->width / 2) - inner_padding - width;
|
||||
back->x = (super->width / 2) + inner_padding;
|
||||
create->y = back->y = self->height - bottom_padding - height;
|
||||
create->x = game_mode->x = (self->width / 2) - inner_padding - width;
|
||||
back->x = (self->width / 2) + inner_padding;
|
||||
const int seed_x = back->x;
|
||||
const int name_x = (super->width / 2) - (name_width / 2);
|
||||
const int name_x = (self->width / 2) - (name_width / 2);
|
||||
const int name_y = center_y - inner_padding - height;
|
||||
game_mode->y = center_y + inner_padding;
|
||||
const int seed_y = game_mode->y;
|
||||
@ -114,7 +114,7 @@ struct CreateWorldScreen final : TextInputScreen {
|
||||
// ESC
|
||||
bool handleBackEvent(const bool do_nothing) override {
|
||||
if (!do_nothing) {
|
||||
super->minecraft->screen_chooser.setScreen(5);
|
||||
self->minecraft->screen_chooser.setScreen(5);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -126,10 +126,10 @@ struct CreateWorldScreen final : TextInputScreen {
|
||||
game_mode->text = is_creative ? SURVIVAL_STR : CREATIVE_STR;
|
||||
} else if (button == back) {
|
||||
// Back
|
||||
super->handleBackEvent(false);
|
||||
self->handleBackEvent(false);
|
||||
} else if (button == create) {
|
||||
// Create
|
||||
create_world(super->minecraft, name->getText(), is_creative, seed->getText());
|
||||
create_world(self->minecraft, name->getText(), is_creative, seed->getText());
|
||||
} else {
|
||||
TextInputScreen::buttonClicked(button);
|
||||
}
|
||||
|
@ -182,42 +182,42 @@ struct InfoScreen final : CustomScreen {
|
||||
// Info
|
||||
for (int i = 0; i < info_size; i++) {
|
||||
Button *button = touch_create_button(INFO_ID_START + i, info[i].button_text);
|
||||
super->rendered_buttons.push_back(button);
|
||||
super->selectable_buttons.push_back(button);
|
||||
self->rendered_buttons.push_back(button);
|
||||
self->selectable_buttons.push_back(button);
|
||||
info_buttons[i] = button;
|
||||
}
|
||||
// Discord Button
|
||||
discord = touch_create_button(DISCORD_ID, "Discord");
|
||||
super->rendered_buttons.push_back(discord);
|
||||
super->selectable_buttons.push_back(discord);
|
||||
self->rendered_buttons.push_back(discord);
|
||||
self->selectable_buttons.push_back(discord);
|
||||
// Back Button
|
||||
back = touch_create_button(BACK_ID, "Back");
|
||||
super->rendered_buttons.push_back(back);
|
||||
super->selectable_buttons.push_back(back);
|
||||
self->rendered_buttons.push_back(back);
|
||||
self->selectable_buttons.push_back(back);
|
||||
}
|
||||
// Handle Back
|
||||
bool handleBackEvent(const bool do_nothing) override {
|
||||
if (!do_nothing) {
|
||||
OptionsScreen *screen = OptionsScreen::allocate();
|
||||
screen->constructor();
|
||||
super->minecraft->setScreen((Screen *) screen);
|
||||
self->minecraft->setScreen((Screen *) screen);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
// Rendering
|
||||
void render(const int x, const int y, const float param_1) override {
|
||||
// Background
|
||||
misc_render_background(80, super->minecraft, 0, 0, super->width, super->height);
|
||||
misc_render_background(32, super->minecraft, 0, content_y_offset_top, super->width, content_height);
|
||||
misc_render_background(80, self->minecraft, 0, 0, self->width, self->height);
|
||||
misc_render_background(32, self->minecraft, 0, content_y_offset_top, self->width, content_height);
|
||||
// Call Original Method
|
||||
CustomScreen::render(x, y, param_1);
|
||||
// Title
|
||||
std::string title = "Reborn Information";
|
||||
super->drawCenteredString(super->font, title, super->width / 2, title_padding, 0xffffffff);
|
||||
self->drawCenteredString(self->font, title, self->width / 2, title_padding, 0xffffffff);
|
||||
// Info Text
|
||||
for (int i = 0; i < info_size; i++) {
|
||||
std::string text = info[i].get_text();
|
||||
super->drawString(super->font, text, positioned_info[i].text.x, positioned_info[i].text.y, 0xffffffff);
|
||||
self->drawString(self->font, text, positioned_info[i].text.x, positioned_info[i].text.y, 0xffffffff);
|
||||
}
|
||||
}
|
||||
// Positioning
|
||||
@ -228,11 +228,11 @@ struct InfoScreen final : CustomScreen {
|
||||
discord->width = back->width = width;
|
||||
discord->height = back->height = line_button_height;
|
||||
// X/Y
|
||||
discord->y = back->y = super->height - bottom_padding - line_button_height;
|
||||
discord->x = (super->width / 2) - inner_padding - width;
|
||||
back->x = (super->width / 2) + inner_padding;
|
||||
discord->y = back->y = self->height - bottom_padding - line_button_height;
|
||||
discord->x = (self->width / 2) - inner_padding - width;
|
||||
back->x = (self->width / 2) + inner_padding;
|
||||
// Info
|
||||
position_info(super->font, super->width, super->height);
|
||||
position_info(self->font, self->width, self->height);
|
||||
for (int i = 0; i < info_size; i++) {
|
||||
Button *button = info_buttons[i];
|
||||
button->width = line_button_width;
|
||||
@ -243,7 +243,7 @@ struct InfoScreen final : CustomScreen {
|
||||
}
|
||||
// Cleanup
|
||||
~InfoScreen() override {
|
||||
for (Button *button : super->rendered_buttons) {
|
||||
for (Button *button : self->rendered_buttons) {
|
||||
button->destructor_deleting();
|
||||
}
|
||||
}
|
||||
@ -251,7 +251,7 @@ struct InfoScreen final : CustomScreen {
|
||||
void buttonClicked(Button *button) override {
|
||||
if (button->id == BACK_ID) {
|
||||
// Back
|
||||
super->handleBackEvent(false);
|
||||
self->handleBackEvent(false);
|
||||
} else if (button->id == DISCORD_ID) {
|
||||
// Open Discord Invite
|
||||
open_url(MCPI_DISCORD_INVITE);
|
||||
|
@ -60,10 +60,10 @@ struct LavaTexture final : CustomDynamicTexture {
|
||||
if (x1 < 0.0f) {
|
||||
x1 = 0.0f;
|
||||
}
|
||||
super->pixels[i * 4 + 0] = int(155.0f + 100.0f * x1);
|
||||
super->pixels[i * 4 + 1] = int(255.0f * x1 * x1);
|
||||
super->pixels[i * 4 + 2] = int(128.0f * x1 * x1 * x1 * x1);
|
||||
super->pixels[i * 4 + 3] = 255;
|
||||
self->pixels[i * 4 + 0] = int(155.0f + 100.0f * x1);
|
||||
self->pixels[i * 4 + 1] = int(255.0f * x1 * x1);
|
||||
self->pixels[i * 4 + 2] = int(128.0f * x1 * x1 * x1 * x1);
|
||||
self->pixels[i * 4 + 3] = 255;
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -84,7 +84,7 @@ struct LavaSideTexture final : CustomDynamicTexture {
|
||||
field_14 = 0;
|
||||
field_18 = 0;
|
||||
field_1C = 0;
|
||||
super->texture_size = 2;
|
||||
self->texture_size = 2;
|
||||
for (int i = 0; i < 256; i++) {
|
||||
m_data1[i] = 0.0f;
|
||||
m_data2[i] = 0.0f;
|
||||
@ -126,10 +126,10 @@ struct LavaSideTexture final : CustomDynamicTexture {
|
||||
if (x1 < 0.0f) {
|
||||
x1 = 0.0f;
|
||||
}
|
||||
super->pixels[i * 4 + 0] = int(155.0f + 100.0f * x1);
|
||||
super->pixels[i * 4 + 1] = int(255.0f * x1 * x1);
|
||||
super->pixels[i * 4 + 2] = int(128.0f * x1 * x1 * x1 * x1);
|
||||
super->pixels[i * 4 + 3] = 255;
|
||||
self->pixels[i * 4 + 0] = int(155.0f + 100.0f * x1);
|
||||
self->pixels[i * 4 + 1] = int(255.0f * x1 * x1);
|
||||
self->pixels[i * 4 + 2] = int(128.0f * x1 * x1 * x1 * x1);
|
||||
self->pixels[i * 4 + 3] = 255;
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -186,10 +186,10 @@ struct FireTexture final : CustomDynamicTexture {
|
||||
if (x < 0.0f) {
|
||||
x = 0.0f;
|
||||
}
|
||||
super->pixels[4 * i + 0] = int(x * 155.0f + 100.0f);
|
||||
super->pixels[4 * i + 1] = int(x * x * 255.0f);
|
||||
super->pixels[4 * i + 2] = int(x * x * x * x * x * x * x * x * x * x * 255.0f);
|
||||
super->pixels[4 * i + 3] = x >= 0.5f ? 255 : 0;
|
||||
self->pixels[4 * i + 0] = int(x * 155.0f + 100.0f);
|
||||
self->pixels[4 * i + 1] = int(x * x * 255.0f);
|
||||
self->pixels[4 * i + 2] = int(x * x * x * x * x * x * x * x * x * x * 255.0f);
|
||||
self->pixels[4 * i + 3] = x >= 0.5f ? 255 : 0;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -85,27 +85,27 @@ struct WelcomeScreen final : CustomScreen {
|
||||
changelog = touch_create_button(1, "Changelog");
|
||||
proceed = touch_create_button(2, "Proceed");
|
||||
for (Button *button : {getting_started, changelog, proceed}) {
|
||||
super->rendered_buttons.push_back(button);
|
||||
super->selectable_buttons.push_back(button);
|
||||
self->rendered_buttons.push_back(button);
|
||||
self->selectable_buttons.push_back(button);
|
||||
}
|
||||
}
|
||||
// Rendering
|
||||
void render(const int x, const int y, const float param_1) override {
|
||||
// Background
|
||||
super->renderBackground();
|
||||
self->renderBackground();
|
||||
// Call Original Method
|
||||
CustomScreen::render(x, y, param_1);
|
||||
// Text
|
||||
super->drawCenteredString(super->font, line1, super->width / 2, text_y, 0xFFFFFFFF);
|
||||
self->drawCenteredString(self->font, line1, self->width / 2, text_y, 0xFFFFFFFF);
|
||||
}
|
||||
// Positioning
|
||||
void setupPositions() override {
|
||||
CustomScreen::setupPositions();
|
||||
position_screen(super->width, super->height);
|
||||
position_screen(self->width, self->height);
|
||||
}
|
||||
// Cleanup
|
||||
~WelcomeScreen() override {
|
||||
for (Button *button : super->rendered_buttons) {
|
||||
for (Button *button : self->rendered_buttons) {
|
||||
button->destructor_deleting();
|
||||
}
|
||||
}
|
||||
@ -117,7 +117,7 @@ struct WelcomeScreen final : CustomScreen {
|
||||
open_url(MCPI_DOCUMENTATION CHANGELOG_FILE);
|
||||
} else if (button == proceed) {
|
||||
mark_welcome_as_shown();
|
||||
super->minecraft->screen_chooser.setScreen(1);
|
||||
self->minecraft->screen_chooser.setScreen(1);
|
||||
} else {
|
||||
CustomScreen::buttonClicked(button);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user