More Feature Flags!
All checks were successful
CI / Build (AMD64) (push) Successful in 20m43s
CI / Build (ARM64) (push) Successful in 22m49s
CI / Build (ARMHF) (push) Successful in 13m5s
CI / Test (AMD64, Server) (push) Successful in 2m12s
CI / Build Example Mods (push) Successful in 1m40s
CI / Test (ARM64, Client) (push) Successful in 4m1s
CI / Test (ARM64, Server) (push) Successful in 59s
CI / Test (AMD64, Client) (push) Successful in 6m9s
CI / Test (ARMHF, Client) (push) Successful in 4m13s
CI / Test (ARMHF, Server) (push) Successful in 1m12s
CI / Release (push) Has been skipped
All checks were successful
CI / Build (AMD64) (push) Successful in 20m43s
CI / Build (ARM64) (push) Successful in 22m49s
CI / Build (ARMHF) (push) Successful in 13m5s
CI / Test (AMD64, Server) (push) Successful in 2m12s
CI / Build Example Mods (push) Successful in 1m40s
CI / Test (ARM64, Client) (push) Successful in 4m1s
CI / Test (ARM64, Server) (push) Successful in 59s
CI / Test (AMD64, Client) (push) Successful in 6m9s
CI / Test (ARMHF, Client) (push) Successful in 4m13s
CI / Test (ARMHF, Server) (push) Successful in 1m12s
CI / Release (push) Has been skipped
This commit is contained in:
parent
8ef6e0885a
commit
f1fe1c140c
@ -53,6 +53,11 @@
|
||||
* `Always Save Chest Tile Entities`
|
||||
* `Fix Transferring Durability When Using Items`
|
||||
* `Fix Switching Perspective While Sneaking`
|
||||
* `Log Chat Messages`
|
||||
* `Log Game Status`
|
||||
* `Screenshot Support`
|
||||
* `Fix Camera Functionality`
|
||||
* `Property Scale Animated Textures`
|
||||
* Split Up `Remove Creative Mode Restrictions` Feature Flag
|
||||
* `Remove Creative Mode Restrictions` (Disabled By Default)
|
||||
* `Display Slot Count In Creative Mode` (Disabled By Default)
|
||||
|
@ -97,4 +97,9 @@ TRUE Fix Text Wrapping
|
||||
TRUE Fullscreen Support
|
||||
TRUE Always Save Chest Tile Entities
|
||||
TRUE Fix Transferring Durability When Using Items
|
||||
TRUE Fix Switching Perspective While Sneaking
|
||||
TRUE Fix Switching Perspective While Sneaking
|
||||
TRUE Log Chat Messages
|
||||
TRUE Log Game Status
|
||||
TRUE Screenshot Support
|
||||
TRUE Fix Camera Functionality
|
||||
TRUE Property Scale Animated Textures
|
@ -16,10 +16,10 @@ struct TextInputBox {
|
||||
void tick();
|
||||
void setFocused(bool b);
|
||||
void onClick(int x, int y);
|
||||
bool clicked(int x, int y);
|
||||
std::string getText();
|
||||
[[nodiscard]] bool clicked(int x, int y) const;
|
||||
[[nodiscard]] std::string getText() const;
|
||||
void setText(std::string text);
|
||||
bool isFocused();
|
||||
[[nodiscard]] bool isFocused() const;
|
||||
void setMaxLength(int max_length);
|
||||
|
||||
private:
|
||||
|
@ -50,7 +50,9 @@ static void TripodCameraRenderer_render_TileRenderer_tesselateCrossTexture_injec
|
||||
// Init
|
||||
void init_camera() {
|
||||
// Implement AppPlatform_linux::saveScreenshot So Cameras Work
|
||||
overwrite_calls(AppPlatform_saveScreenshot, AppPlatform_saveScreenshot_injection);
|
||||
if (feature_has("Fix Camera Functionality", server_disabled)) {
|
||||
overwrite_calls(AppPlatform_saveScreenshot, AppPlatform_saveScreenshot_injection);
|
||||
}
|
||||
|
||||
// Fix Camera Rendering
|
||||
if (feature_has("Fix Camera Rendering", server_disabled)) {
|
||||
|
@ -13,9 +13,9 @@ std::string get_death_message(Player *player, Entity *cause, const bool was_shot
|
||||
std::string message = player->username;
|
||||
if (cause) {
|
||||
// Entity cause
|
||||
int type_id = cause->getEntityTypeId();
|
||||
const int type_id = cause->getEntityTypeId();
|
||||
int aux = cause->getAuxData();
|
||||
bool is_player = cause->isPlayer();
|
||||
const bool is_player = cause->isPlayer();
|
||||
if (cause->getCreatureBaseType() != 0 || is_player) {
|
||||
// Killed by a creature
|
||||
if (was_shot) {
|
||||
@ -134,12 +134,12 @@ void init_death() {
|
||||
overwrite_calls(LocalPlayer_actuallyHurt, LocalPlayer_actuallyHurt_injection);
|
||||
patch_vtable(ServerPlayer_actuallyHurt, ServerPlayer_actuallyHurt_injection);
|
||||
overwrite_calls(Mob_hurt, Mob_hurt_injection);
|
||||
}
|
||||
|
||||
// Fix TNT
|
||||
// This changes PrimedTnt_explode from Level::explode(nullptr, x, y, z, 3.1f) to Level::explode(this, x, y, z, 3.1f)
|
||||
unsigned char cpy_r1_r0_patch[4] = {0x00, 0x10, 0xa0, 0xe1}; // "cpy r1, r0"
|
||||
patch((void *) 0x87998, cpy_r1_r0_patch);
|
||||
unsigned char ldr_r0_24_patch[4] = {0x24, 0x00, 0x90, 0xe5}; // "ldr r0, [r0, #0x24]"
|
||||
patch((void *) 0x8799c, ldr_r0_24_patch);
|
||||
// Fix TNT
|
||||
// This changes PrimedTnt_explode from Level::explode(nullptr, x, y, z, 3.1f) to Level::explode(this, x, y, z, 3.1f)
|
||||
unsigned char cpy_r1_r0_patch[4] = {0x00, 0x10, 0xa0, 0xe1}; // "cpy r1, r0"
|
||||
patch((void *) 0x87998, cpy_r1_r0_patch);
|
||||
unsigned char ldr_r0_24_patch[4] = {0x24, 0x00, 0x90, 0xe5}; // "ldr r0, [r0, #0x24]"
|
||||
patch((void *) 0x8799c, ldr_r0_24_patch);
|
||||
}
|
||||
}
|
||||
|
@ -57,7 +57,7 @@ void init_game_mode() {
|
||||
overwrite_call((void *) 0x16f84, (void *) ServerLevel_constructor->get(true));
|
||||
|
||||
// Allocate Correct Size For ServerLevel
|
||||
uint32_t level_size = sizeof(ServerLevel);
|
||||
constexpr uint32_t level_size = sizeof(ServerLevel);
|
||||
patch_address((void *) 0x17004, (void *) level_size);
|
||||
|
||||
// Disable CreatorMode-Specific API Features (Polling Block Hits) In SurvivalMode, This Is Preferable To Crashing
|
||||
|
@ -12,9 +12,8 @@ __attribute__((constructor)) static void init() {
|
||||
init_compat();
|
||||
if (reborn_is_server()) {
|
||||
init_server();
|
||||
} else {
|
||||
init_multiplayer();
|
||||
}
|
||||
init_multiplayer();
|
||||
if (!reborn_is_headless()) {
|
||||
init_sound();
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ static bool MouseBuildInput_tickBuild_injection(MouseBuildInput_tickBuild_t orig
|
||||
const bool ret = original(mouse_build_input, local_player, build_action_intention_return);
|
||||
// Convert Remove/Attack Into Attack If A Tile Is Not Selected
|
||||
if (ret && *build_action_intention_return == REMOVE_ATTACK_BAI) {
|
||||
Minecraft *minecraft = ((LocalPlayer *) local_player)->minecraft;
|
||||
const Minecraft *minecraft = ((LocalPlayer *) local_player)->minecraft;
|
||||
if (minecraft->hit_result.type != 0) {
|
||||
*build_action_intention_return = ATTACK_BAI;
|
||||
}
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
// Store Right-Click Status
|
||||
static int is_right_click = 0;
|
||||
void input_set_is_right_click(int val) {
|
||||
void input_set_is_right_click(const int val) {
|
||||
is_right_click = val;
|
||||
}
|
||||
|
||||
|
@ -38,7 +38,7 @@ static void _handle_drop(Minecraft *minecraft) {
|
||||
inventory_item->count = 0;
|
||||
} else {
|
||||
// Drop Item
|
||||
const int drop_count = 1;
|
||||
constexpr int drop_count = 1;
|
||||
dropped_item->count = drop_count;
|
||||
inventory_item->count -= drop_count;
|
||||
}
|
||||
@ -59,7 +59,7 @@ static void _handle_drop(Minecraft *minecraft) {
|
||||
// Init
|
||||
void _init_drop() {
|
||||
if (feature_has("Bind \"Q\" Key To Item Dropping", server_disabled)) {
|
||||
misc_run_on_game_key_press([](Minecraft *mc, int key) {
|
||||
misc_run_on_game_key_press([](Minecraft *mc, const int key) {
|
||||
if (key == MC_KEY_q) {
|
||||
_handle_drop(mc);
|
||||
return true;
|
||||
|
@ -32,7 +32,7 @@ static bool OptionsScreen_handleBackEvent_injection(OptionsScreen *screen, bool
|
||||
}
|
||||
|
||||
// Fix "Sleeping Beauty" Bug
|
||||
static bool InBedScreen_handleBackEvent_injection(InBedScreen *screen, bool do_nothing) {
|
||||
static bool InBedScreen_handleBackEvent_injection(InBedScreen *screen, const bool do_nothing) {
|
||||
if (!do_nothing) {
|
||||
// Close Screen
|
||||
Minecraft *minecraft = screen->minecraft;
|
||||
@ -48,7 +48,7 @@ static bool InBedScreen_handleBackEvent_injection(InBedScreen *screen, bool do_n
|
||||
|
||||
// Block UI Interaction When Mouse Is Locked
|
||||
static bool Gui_tickItemDrop_Minecraft_isCreativeMode_call_injection(Minecraft *minecraft) {
|
||||
bool is_in_game = minecraft->screen == nullptr || minecraft->screen->vtable == (Screen_vtable *) Touch_IngameBlockSelectionScreen_vtable_base;
|
||||
const bool is_in_game = minecraft->screen == nullptr || minecraft->screen->vtable == (Screen_vtable *) Touch_IngameBlockSelectionScreen_vtable_base;
|
||||
if (!enable_misc || (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_OFF && is_in_game)) {
|
||||
// Call Original Method
|
||||
return creative_is_restricted() && minecraft->isCreativeMode();
|
||||
|
@ -5,6 +5,7 @@
|
||||
|
||||
#include "misc-internal.h"
|
||||
#include <mods/misc/misc.h>
|
||||
#include <mods/feature/feature.h>
|
||||
|
||||
// Print Chat To Log
|
||||
static bool Gui_addMessage_recursing = false;
|
||||
@ -13,7 +14,7 @@ static void Gui_addMessage_injection(Gui_addMessage_t original, Gui *gui, const
|
||||
char *new_message = strdup(text.c_str());
|
||||
ALLOC_CHECK(new_message);
|
||||
sanitize_string(new_message, -1, 1);
|
||||
std::string cpp_str = new_message;
|
||||
const std::string cpp_str = new_message;
|
||||
|
||||
// Process Message
|
||||
if (!Gui_addMessage_recursing) {
|
||||
@ -50,8 +51,8 @@ static void print_progress(Minecraft *minecraft) {
|
||||
progress = -1;
|
||||
}
|
||||
if (message != nullptr) {
|
||||
bool message_different = message != last_message;
|
||||
bool progress_significant = is_progress_difference_significant(progress, last_progress);
|
||||
const bool message_different = message != last_message;
|
||||
const bool progress_significant = is_progress_difference_significant(progress, last_progress);
|
||||
if (message_different || progress_significant) {
|
||||
if (progress != -1) {
|
||||
INFO("Status: %s: %i%%", message, progress);
|
||||
@ -86,13 +87,18 @@ static void Level_saveLevelData_injection(Level_saveLevelData_t original, Level
|
||||
// Init
|
||||
void _init_misc_logging() {
|
||||
// Print Chat To Log
|
||||
overwrite_calls(Gui_addMessage, Gui_addMessage_injection);
|
||||
if (feature_has("Log Chat Messages", server_enabled)) {
|
||||
overwrite_calls(Gui_addMessage, Gui_addMessage_injection);
|
||||
}
|
||||
|
||||
// Print Progress Reports
|
||||
misc_run_on_update(Minecraft_update_injection);
|
||||
// Game Status
|
||||
if (feature_has("Log Game Status", server_enabled)) {
|
||||
// Print Progress Reports
|
||||
misc_run_on_update(Minecraft_update_injection);
|
||||
|
||||
// Print Log On Game Save
|
||||
overwrite_calls(Level_saveLevelData, Level_saveLevelData_injection);
|
||||
// Print Log On Game Save
|
||||
overwrite_calls(Level_saveLevelData, Level_saveLevelData_injection);
|
||||
}
|
||||
|
||||
// Disable stdout Buffering
|
||||
setvbuf(stdout, nullptr, _IONBF, 0);
|
||||
|
@ -81,16 +81,6 @@ static RakNet_StartupResult RakNetInstance_host_RakNet_RakPeer_Startup_injection
|
||||
return result;
|
||||
}
|
||||
|
||||
// Fix Bug Where RakNetInstance Starts Pinging Potential Servers Before The "Join Game" Screen Is Opened
|
||||
static RakNetInstance *RakNetInstance_injection(RakNetInstance_constructor_t original, RakNetInstance *rak_net_instance) {
|
||||
// Call Original Method
|
||||
RakNetInstance *result = original(rak_net_instance);
|
||||
// Fix
|
||||
rak_net_instance->pinging_for_hosts = 0;
|
||||
// Return
|
||||
return result;
|
||||
}
|
||||
|
||||
// Fix Furnace Not Checking Item Auxiliary When Inserting New Item
|
||||
static int32_t FurnaceScreen_handleAddItem_injection(FurnaceScreen_handleAddItem_t original, FurnaceScreen *furnace_screen, int32_t slot, const ItemInstance *item) {
|
||||
// Get Existing Item
|
||||
@ -461,11 +451,6 @@ void init_misc() {
|
||||
overwrite_call((void *) 0x73778, (void *) RakNetInstance_host_RakNet_RakPeer_Startup_injection);
|
||||
}
|
||||
|
||||
// Fix Bug Where RakNetInstance Starts Pinging Potential Servers Before The "Join Game" Screen Is Opened
|
||||
if (feature_has("Prevent Unnecessary Server Pinging", server_enabled)) {
|
||||
overwrite_calls(RakNetInstance_constructor, RakNetInstance_injection);
|
||||
}
|
||||
|
||||
// Fix Furnace Not Checking Item Auxiliary When Inserting New Item
|
||||
if (feature_has("Fix Furnace Not Checking Item Auxiliary", server_disabled)) {
|
||||
overwrite_calls(FurnaceScreen_handleAddItem, FurnaceScreen_handleAddItem_injection);
|
||||
|
@ -113,10 +113,25 @@ static void RakNetInstance_pingForHosts_injection(RakNetInstance_pingForHosts_t
|
||||
});
|
||||
}
|
||||
|
||||
// Fix Bug Where RakNetInstance Starts Pinging Potential Servers Before The "Join Game" Screen Is Opened
|
||||
static RakNetInstance *RakNetInstance_injection(RakNetInstance_constructor_t original, RakNetInstance *rak_net_instance) {
|
||||
// Call Original Method
|
||||
RakNetInstance *result = original(rak_net_instance);
|
||||
// Fix
|
||||
rak_net_instance->pinging_for_hosts = false;
|
||||
// Return
|
||||
return result;
|
||||
}
|
||||
|
||||
// Init
|
||||
void init_multiplayer() {
|
||||
// Inject Code
|
||||
if (feature_has("External Server Support", server_disabled)) {
|
||||
overwrite_calls(RakNetInstance_pingForHosts, RakNetInstance_pingForHosts_injection);
|
||||
}
|
||||
|
||||
// Fix Bug Where RakNetInstance Starts Pinging Potential Servers Before The "Join Game" Screen Is Opened
|
||||
if (feature_has("Prevent Unnecessary Server Pinging", server_enabled)) {
|
||||
overwrite_calls(RakNetInstance_constructor, RakNetInstance_injection);
|
||||
}
|
||||
}
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include <mods/misc/misc.h>
|
||||
#include <mods/input/input.h>
|
||||
#include <mods/init/init.h>
|
||||
#include <mods/feature/feature.h>
|
||||
|
||||
// Ensure Screenshots Folder Exists
|
||||
static std::string get_screenshot_dir() {
|
||||
@ -46,7 +47,7 @@ void screenshot_take(Gui *gui) {
|
||||
// Get Timestamp
|
||||
time_t raw_time;
|
||||
time(&raw_time);
|
||||
tm *time_info = localtime(&raw_time);
|
||||
const tm *time_info = localtime(&raw_time);
|
||||
char time[512];
|
||||
strftime(time, 512, "%Y-%m-%d_%H.%M.%S", time_info);
|
||||
|
||||
@ -66,10 +67,10 @@ void screenshot_take(Gui *gui) {
|
||||
// Get Image Size
|
||||
GLint viewport[4];
|
||||
glGetIntegerv(GL_VIEWPORT, viewport);
|
||||
int x = viewport[0];
|
||||
int y = viewport[1];
|
||||
int width = viewport[2];
|
||||
int height = viewport[3];
|
||||
const int x = viewport[0];
|
||||
const int y = viewport[1];
|
||||
const int width = viewport[2];
|
||||
const int height = viewport[3];
|
||||
|
||||
// Get Line Size
|
||||
int line_size = width * 4;
|
||||
@ -80,7 +81,7 @@ void screenshot_take(Gui *gui) {
|
||||
// Round
|
||||
line_size = ALIGN_UP(line_size, alignment);
|
||||
}
|
||||
int size = height * line_size;
|
||||
const int size = height * line_size;
|
||||
|
||||
// Read Pixels
|
||||
unsigned char *pixels = (unsigned char *) malloc(size);
|
||||
@ -105,15 +106,17 @@ void screenshot_take(Gui *gui) {
|
||||
|
||||
// Init
|
||||
void init_screenshot() {
|
||||
// Create Directory
|
||||
get_screenshot_dir();
|
||||
// Take Screenshot On F2
|
||||
misc_run_on_key_press([](Minecraft *mc, int key) {
|
||||
if (key == MC_KEY_F2) {
|
||||
screenshot_take(&mc->gui);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
if (feature_has("Screenshot Support", server_disabled)) {
|
||||
// Create Directory
|
||||
get_screenshot_dir();
|
||||
// Take Screenshot On F2
|
||||
misc_run_on_key_press([](Minecraft *mc, int key) {
|
||||
if (key == MC_KEY_F2) {
|
||||
screenshot_take(&mc->gui);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -69,7 +69,7 @@ static int32_t Textures_loadAndBindTexture_injection(Textures *textures, __attri
|
||||
// Change Texture
|
||||
static std::string new_texture;
|
||||
if (new_texture.length() == 0) {
|
||||
std::string username = base64_encode(Strings::default_username);
|
||||
const std::string username = base64_encode(Strings::default_username);
|
||||
new_texture = '$' + username;
|
||||
}
|
||||
|
||||
|
@ -59,9 +59,9 @@ std::string _sound_get_source_file() {
|
||||
|
||||
// Play Sound
|
||||
// The pitch value is unsued because it causes glitchy sounds, it is seemingly unused in MCPE as well.
|
||||
static void play(std::string name, float x, float y, float z, float volume, float pitch, bool is_ui) {
|
||||
std::string source = _sound_get_source_file();
|
||||
std::string resolved_name = _sound_pick(name);
|
||||
static void play(const std::string &name, const float x, const float y, const float z, const float volume, float pitch, const bool is_ui) {
|
||||
const std::string source = _sound_get_source_file();
|
||||
const std::string resolved_name = _sound_pick(name);
|
||||
if (pitch < 0.01f) {
|
||||
pitch = 1;
|
||||
}
|
||||
@ -69,10 +69,10 @@ static void play(std::string name, float x, float y, float z, float volume, floa
|
||||
media_audio_play(source.c_str(), resolved_name.c_str(), x, y, z, pitch, volume, is_ui);
|
||||
}
|
||||
}
|
||||
static void SoundEngine_playUI_injection(__attribute__((unused)) SoundEngine_playUI_t original, __attribute__((unused)) SoundEngine *sound_engine, const std::string &name, float volume, float pitch) {
|
||||
static void SoundEngine_playUI_injection(__attribute__((unused)) SoundEngine_playUI_t original, __attribute__((unused)) SoundEngine *sound_engine, const std::string &name, const float volume, const float pitch) {
|
||||
play(name, 0, 0, 0, volume, pitch, true);
|
||||
}
|
||||
static void SoundEngine_play_injection(__attribute__((unused)) SoundEngine_play_t original, __attribute__((unused)) SoundEngine *sound_engine, const std::string &name, float x, float y, float z, float volume, float pitch) {
|
||||
static void SoundEngine_play_injection(__attribute__((unused)) SoundEngine_play_t original, __attribute__((unused)) SoundEngine *sound_engine, const std::string &name, const float x, const float y, const float z, const float volume, const float pitch) {
|
||||
play(name, x, y, z, volume, pitch, false);
|
||||
}
|
||||
|
||||
@ -89,7 +89,7 @@ static void SoundEngine_update_injection(__attribute__((unused)) SoundEngine_upd
|
||||
Options *options = sound_engine->options;
|
||||
|
||||
// Volume
|
||||
int32_t sound_enabled = options->sound;
|
||||
const int32_t sound_enabled = options->sound;
|
||||
volume = sound_enabled ? 1 : 0;
|
||||
|
||||
// Position And Rotation
|
||||
|
@ -28,7 +28,7 @@ TextInputBox *TextInputBox::create(const std::string &placeholder, const std::st
|
||||
return self;
|
||||
}
|
||||
|
||||
void TextInputBox::setSize(int x, int y, int width, int height) {
|
||||
void TextInputBox::setSize(const int x, const int y, const int width, const int height) {
|
||||
m_xPos = x;
|
||||
m_yPos = y;
|
||||
m_width = width;
|
||||
@ -40,11 +40,11 @@ void TextInputBox::init(Font *pFont) {
|
||||
m_pFont = pFont;
|
||||
}
|
||||
|
||||
void TextInputBox::setEnabled(bool bEnabled) {
|
||||
void TextInputBox::setEnabled(const bool bEnabled) {
|
||||
m_bEnabled = bEnabled;
|
||||
}
|
||||
|
||||
void TextInputBox::keyPressed(int key) {
|
||||
void TextInputBox::keyPressed(const int key) {
|
||||
if (!m_bFocused) {
|
||||
return;
|
||||
}
|
||||
@ -125,7 +125,7 @@ void TextInputBox::tick() {
|
||||
}
|
||||
}
|
||||
|
||||
void TextInputBox::setFocused(bool b) {
|
||||
void TextInputBox::setFocused(const bool b) {
|
||||
if (m_bFocused == b) {
|
||||
return;
|
||||
}
|
||||
@ -144,7 +144,7 @@ void TextInputBox::onClick(int x, int y) {
|
||||
}
|
||||
|
||||
static int PADDING = 5;
|
||||
void TextInputBox::charPressed(int k) {
|
||||
void TextInputBox::charPressed(const int k) {
|
||||
if (!m_bFocused) {
|
||||
return;
|
||||
}
|
||||
@ -165,9 +165,9 @@ void TextInputBox::charPressed(int k) {
|
||||
recalculateScroll();
|
||||
}
|
||||
|
||||
static std::string get_rendered_text(Font *font, int width, int scroll_pos, std::string text) {
|
||||
static std::string get_rendered_text(Font *font, const int width, const int scroll_pos, std::string text) {
|
||||
std::string rendered_text = text.substr(scroll_pos);
|
||||
int max_width = width - (PADDING * 2);
|
||||
const int max_width = width - (PADDING * 2);
|
||||
while (font->width(rendered_text) > max_width) {
|
||||
rendered_text.pop_back();
|
||||
}
|
||||
@ -194,14 +194,14 @@ void TextInputBox::render() {
|
||||
}
|
||||
rendered_text = get_rendered_text(m_pFont, m_width, scroll_pos, rendered_text);
|
||||
|
||||
int textYPos = (m_height - 8) / 2;
|
||||
const int textYPos = (m_height - 8) / 2;
|
||||
super.drawString(m_pFont, rendered_text, m_xPos + PADDING, m_yPos + textYPos, text_color);
|
||||
|
||||
if (m_bCursorOn) {
|
||||
int cursor_pos = m_insertHead - m_scrollPos;
|
||||
const int cursor_pos = m_insertHead - m_scrollPos;
|
||||
if (cursor_pos >= 0 && cursor_pos <= int(rendered_text.length())) {
|
||||
std::string substr = rendered_text.substr(0, cursor_pos);
|
||||
int xPos = PADDING + m_pFont->width(substr);
|
||||
const int xPos = PADDING + m_pFont->width(substr);
|
||||
|
||||
std::string str;
|
||||
str += CURSOR_CHAR;
|
||||
@ -210,7 +210,7 @@ void TextInputBox::render() {
|
||||
}
|
||||
}
|
||||
|
||||
bool TextInputBox::clicked(int xPos, int yPos) {
|
||||
bool TextInputBox::clicked(const int xPos, const int yPos) const {
|
||||
if (!m_bEnabled) {
|
||||
return false;
|
||||
}
|
||||
@ -237,18 +237,18 @@ void TextInputBox::recalculateScroll() {
|
||||
return;
|
||||
}
|
||||
// Ensure Cursor Is Visible
|
||||
bool is_cursor_at_end = m_insertHead == int(m_text.length());
|
||||
const bool is_cursor_at_end = m_insertHead == int(m_text.length());
|
||||
if (m_scrollPos >= m_insertHead && m_scrollPos > 0) {
|
||||
// Cursor Is At Scroll Position
|
||||
// Move Back Scroll As Far As Possible
|
||||
while (true) {
|
||||
int test_scroll_pos = m_scrollPos - 1;
|
||||
const int test_scroll_pos = m_scrollPos - 1;
|
||||
std::string rendered_text = m_text;
|
||||
if (is_cursor_at_end) {
|
||||
rendered_text += CURSOR_CHAR;
|
||||
}
|
||||
rendered_text = get_rendered_text(m_pFont, m_width, test_scroll_pos, rendered_text);
|
||||
int cursor_pos = m_insertHead - test_scroll_pos;
|
||||
const int cursor_pos = m_insertHead - test_scroll_pos;
|
||||
if (cursor_pos >= int(rendered_text.length())) {
|
||||
break;
|
||||
} else {
|
||||
@ -267,7 +267,7 @@ void TextInputBox::recalculateScroll() {
|
||||
rendered_text += CURSOR_CHAR;
|
||||
}
|
||||
rendered_text = get_rendered_text(m_pFont, m_width, m_scrollPos, rendered_text);
|
||||
int cursor_pos = m_insertHead - m_scrollPos;
|
||||
const int cursor_pos = m_insertHead - m_scrollPos;
|
||||
if (cursor_pos < int(rendered_text.length())) {
|
||||
break;
|
||||
} else {
|
||||
@ -282,7 +282,7 @@ void TextInputBox::recalculateScroll() {
|
||||
}
|
||||
}
|
||||
|
||||
std::string TextInputBox::getText() {
|
||||
std::string TextInputBox::getText() const {
|
||||
return m_text;
|
||||
}
|
||||
|
||||
@ -291,10 +291,10 @@ void TextInputBox::setText(std::string str) {
|
||||
m_insertHead = int(m_text.size());
|
||||
}
|
||||
|
||||
bool TextInputBox::isFocused() {
|
||||
bool TextInputBox::isFocused() const {
|
||||
return m_bFocused;
|
||||
}
|
||||
|
||||
void TextInputBox::setMaxLength(int max_length) {
|
||||
void TextInputBox::setMaxLength(const int max_length) {
|
||||
m_maxLength = max_length;
|
||||
}
|
||||
|
@ -1,11 +1,9 @@
|
||||
#include <libreborn/libreborn.h>
|
||||
|
||||
#include <mods/text-input-box/TextInputScreen.h>
|
||||
|
||||
// VTable
|
||||
void TextInputScreen::setup(Screen_vtable *vtable) {
|
||||
static Screen_keyPressed_t original_keyPressed = vtable->keyPressed;
|
||||
vtable->keyPressed = [](Screen *super2, int key) {
|
||||
vtable->keyPressed = [](Screen *super2, const int key) {
|
||||
original_keyPressed(super2, key);
|
||||
TextInputScreen *self = (TextInputScreen *) super2;
|
||||
for (int i = 0; i < int(self->m_textInputs->size()); i++) {
|
||||
@ -14,7 +12,7 @@ void TextInputScreen::setup(Screen_vtable *vtable) {
|
||||
}
|
||||
};
|
||||
static Screen_keyboardNewChar_t original_keyboardNewChar = vtable->keyboardNewChar;
|
||||
vtable->keyboardNewChar = [](Screen *super2, char key) {
|
||||
vtable->keyboardNewChar = [](Screen *super2, const char key) {
|
||||
original_keyboardNewChar(super2, key);
|
||||
TextInputScreen *self = (TextInputScreen *) super2;
|
||||
for (int i = 0; i < int(self->m_textInputs->size()); i++) {
|
||||
@ -23,7 +21,7 @@ void TextInputScreen::setup(Screen_vtable *vtable) {
|
||||
}
|
||||
};
|
||||
static Screen_mouseClicked_t original_mouseClicked = vtable->mouseClicked;
|
||||
vtable->mouseClicked = [](Screen *super2, int x, int y, int param_1) {
|
||||
vtable->mouseClicked = [](Screen *super2, const int x, const int y, const int param_1) {
|
||||
original_mouseClicked(super2, x, y, param_1);
|
||||
TextInputScreen *self = (TextInputScreen *) super2;
|
||||
for (int i = 0; i < int(self->m_textInputs->size()); i++) {
|
||||
@ -32,7 +30,7 @@ void TextInputScreen::setup(Screen_vtable *vtable) {
|
||||
}
|
||||
};
|
||||
static Screen_render_t original_render = vtable->render;
|
||||
vtable->render = [](Screen *super2, int x, int y, float param_1) {
|
||||
vtable->render = [](Screen *super2, const int x, const int y, const float param_1) {
|
||||
original_render(super2, x, y, param_1);
|
||||
TextInputScreen *self = (TextInputScreen *) super2;
|
||||
for (int i = 0; i < int(self->m_textInputs->size()); i++) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include <vector>
|
||||
#include <assert.h>
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
|
||||
#include <GLES/gl.h>
|
||||
@ -49,7 +49,7 @@ HOOK(glTexImage2D, void, (GLenum target, GLint level, GLint internalformat, GLsi
|
||||
HOOK(glDeleteTextures, void, (GLsizei n, const GLuint *textures)) {
|
||||
// Remove Old Data
|
||||
for (int i = 0; i < n; i++) {
|
||||
GLint id = textures[i];
|
||||
const GLint id = textures[i];
|
||||
std::vector<texture_data>::iterator it = get_texture_data().begin();
|
||||
while (it != get_texture_data().end()) {
|
||||
texture_data data = *it;
|
||||
@ -65,7 +65,7 @@ HOOK(glDeleteTextures, void, (GLsizei n, const GLuint *textures)) {
|
||||
ensure_glDeleteTextures();
|
||||
real_glDeleteTextures(n, textures);
|
||||
}
|
||||
static void get_texture_size(GLint id, GLsizei *width, GLsizei *height) {
|
||||
static void get_texture_size(const GLint id, GLsizei *width, GLsizei *height) {
|
||||
// Iterate
|
||||
std::vector<texture_data>::iterator it = get_texture_data().begin();
|
||||
while (it != get_texture_data().end()) {
|
||||
@ -85,7 +85,7 @@ static void get_texture_size(GLint id, GLsizei *width, GLsizei *height) {
|
||||
|
||||
// Scale Texture (Remember To Free)
|
||||
#define PIXEL_SIZE 4
|
||||
static int get_line_size(int width) {
|
||||
static int get_line_size(const int width) {
|
||||
int line_size = width * PIXEL_SIZE;
|
||||
{
|
||||
// Handle Alignment
|
||||
@ -96,9 +96,9 @@ static int get_line_size(int width) {
|
||||
}
|
||||
return line_size;
|
||||
}
|
||||
static void *scale_texture(const unsigned char *src, GLsizei old_width, GLsizei old_height, GLsizei new_width, GLsizei new_height) {
|
||||
int old_line_size = get_line_size(old_width);
|
||||
int new_line_size = get_line_size(new_width);
|
||||
static void *scale_texture(const unsigned char *src, const GLsizei old_width, const GLsizei old_height, const GLsizei new_width, const GLsizei new_height) {
|
||||
const int old_line_size = get_line_size(old_width);
|
||||
const int new_line_size = get_line_size(new_width);
|
||||
|
||||
// Allocate
|
||||
unsigned char *dst = (unsigned char *) malloc(new_height * new_line_size);
|
||||
@ -106,13 +106,13 @@ static void *scale_texture(const unsigned char *src, GLsizei old_width, GLsizei
|
||||
|
||||
// Scale
|
||||
for (int new_x = 0; new_x < new_width; new_x++) {
|
||||
int old_x = (int) (((float) new_x / (float) new_width) * (float) old_width);
|
||||
const int old_x = (int) (((float) new_x / (float) new_width) * (float) old_width);
|
||||
for (int new_y = 0; new_y < new_height; new_y++) {
|
||||
int old_y = (int) (((float) new_y / (float) new_height) * (float) old_height);
|
||||
const int old_y = (int) (((float) new_y / (float) new_height) * (float) old_height);
|
||||
|
||||
// Find Position
|
||||
int new_position = (new_y * new_line_size) + (new_x * PIXEL_SIZE);
|
||||
int old_position = (old_y * old_line_size) + (old_x * PIXEL_SIZE);
|
||||
const int new_position = (new_y * new_line_size) + (new_x * PIXEL_SIZE);
|
||||
const int old_position = (old_y * old_line_size) + (old_x * PIXEL_SIZE);
|
||||
|
||||
// Copy
|
||||
static_assert(sizeof (int32_t) == PIXEL_SIZE, "Pixel Size Doesn't Match 32-Bit Integer Size");
|
||||
@ -125,7 +125,7 @@ static void *scale_texture(const unsigned char *src, GLsizei old_width, GLsizei
|
||||
}
|
||||
|
||||
// Scale Animated Textures
|
||||
void glTexSubImage2D_with_scaling(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLsizei normal_texture_width, GLsizei normal_texture_height, GLenum format, GLenum type, const void *pixels) {
|
||||
void glTexSubImage2D_with_scaling(const GLenum target, const GLint level, const GLint xoffset, const GLint yoffset, const GLsizei width, const GLsizei height, const GLsizei normal_texture_width, const GLsizei normal_texture_height, const GLenum format, const GLenum type, const void *pixels) {
|
||||
// Get Current Texture Size
|
||||
GLint current_texture;
|
||||
glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t_texture);
|
||||
@ -134,8 +134,8 @@ void glTexSubImage2D_with_scaling(GLenum target, GLint level, GLint xoffset, GLi
|
||||
get_texture_size(current_texture, &texture_width, &texture_height);
|
||||
|
||||
// Calculate Factor
|
||||
float width_factor = ((float) texture_width) / ((float) normal_texture_width);
|
||||
float height_factor = ((float) texture_height) / ((float) normal_texture_height);
|
||||
const float width_factor = ((float) texture_width) / ((float) normal_texture_width);
|
||||
const float height_factor = ((float) texture_height) / ((float) normal_texture_height);
|
||||
|
||||
// Only Scale If Needed
|
||||
if (width_factor == 1.0f && height_factor == 1.0f) {
|
||||
@ -149,25 +149,25 @@ void glTexSubImage2D_with_scaling(GLenum target, GLint level, GLint xoffset, GLi
|
||||
}
|
||||
|
||||
// Scale
|
||||
GLsizei new_width = width * width_factor;
|
||||
GLsizei new_height = height * height_factor;
|
||||
const GLsizei new_width = width * width_factor;
|
||||
const GLsizei new_height = height * height_factor;
|
||||
void *new_pixels = scale_texture((const unsigned char *) pixels, width, height, new_width, new_height);
|
||||
|
||||
// Call Original Method
|
||||
GLint new_xoffset = xoffset * width_factor;
|
||||
GLint new_yoffset = yoffset * height_factor;
|
||||
const GLint new_xoffset = xoffset * width_factor;
|
||||
const GLint new_yoffset = yoffset * height_factor;
|
||||
glTexSubImage2D(target, level, new_xoffset, new_yoffset, new_width, new_height, format, type, new_pixels);
|
||||
|
||||
// Free
|
||||
free(new_pixels);
|
||||
}
|
||||
}
|
||||
static void Textures_tick_glTexSubImage2D_injection(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) {
|
||||
static void Textures_tick_glTexSubImage2D_injection(const GLenum target, const GLint level, const GLint xoffset, const GLint yoffset, const GLsizei width, const GLsizei height, const GLenum format, const GLenum type, const void *pixels) {
|
||||
glTexSubImage2D_with_scaling(target, level, xoffset, yoffset, width, height, 256, 256, format, type, pixels);
|
||||
}
|
||||
|
||||
// Load Textures
|
||||
static Texture AppPlatform_linux_loadTexture_injection(__attribute__((unused)) AppPlatform_linux_loadTexture_t original, __attribute__((unused)) AppPlatform_linux *app_platform, const std::string &path, bool b) {
|
||||
static Texture AppPlatform_linux_loadTexture_injection(__attribute__((unused)) AppPlatform_linux_loadTexture_t original, __attribute__((unused)) AppPlatform_linux *app_platform, const std::string &path, const bool b) {
|
||||
Texture out;
|
||||
std::string real_path = path;
|
||||
if (b) {
|
||||
@ -217,9 +217,9 @@ void init_textures() {
|
||||
}
|
||||
|
||||
// Tick Dynamic Textures (Animated Water)
|
||||
bool animated_water = feature_has("Animated Water", server_disabled);
|
||||
bool animated_lava = feature_has("Animated Lava", server_disabled);
|
||||
bool animated_fire = feature_has("Animated Fire", server_disabled);
|
||||
const bool animated_water = feature_has("Animated Water", server_disabled);
|
||||
const bool animated_lava = feature_has("Animated Lava", server_disabled);
|
||||
const bool animated_fire = feature_has("Animated Fire", server_disabled);
|
||||
if (animated_water || animated_lava || animated_fire) {
|
||||
// Tick Dynamic Textures
|
||||
misc_run_on_tick(Minecraft_tick_injection);
|
||||
@ -234,7 +234,9 @@ void init_textures() {
|
||||
}
|
||||
|
||||
// Scale Animated Textures
|
||||
overwrite_call((void *) 0x53274, (void *) Textures_tick_glTexSubImage2D_injection);
|
||||
if (feature_has("Property Scale Animated Textures", server_disabled)) {
|
||||
overwrite_call((void *) 0x53274, (void *) Textures_tick_glTexSubImage2D_injection);
|
||||
}
|
||||
|
||||
// Load Textures
|
||||
overwrite_calls(AppPlatform_linux_loadTexture, AppPlatform_linux_loadTexture_injection);
|
||||
|
@ -19,14 +19,14 @@ static unsigned char *operator_new_IngameBlockSelectionScreen_injection(__attrib
|
||||
// Improved Button Hover Behavior
|
||||
static int32_t Button_hovered_injection(__attribute__((unused)) Button_hovered_t original, __attribute__((unused)) Button *button, __attribute__((unused)) Minecraft *minecraft, __attribute__((unused)) int32_t click_x, __attribute__((unused)) int32_t click_y) {
|
||||
// Get Mouse Position
|
||||
int32_t x = Mouse::getX() * Gui::InvGuiScale;
|
||||
int32_t y = Mouse::getY() * Gui::InvGuiScale;
|
||||
const int32_t x = Mouse::getX() * Gui::InvGuiScale;
|
||||
const int32_t y = Mouse::getY() * Gui::InvGuiScale;
|
||||
|
||||
// Get Button Position
|
||||
int32_t button_x1 = button->x;
|
||||
int32_t button_y1 = button->y;
|
||||
int32_t button_x2 = button_x1 + button->width;
|
||||
int32_t button_y2 = button_y1 + button->height;
|
||||
const int32_t button_x1 = button->x;
|
||||
const int32_t button_y1 = button->y;
|
||||
const int32_t button_x2 = button_x1 + button->width;
|
||||
const int32_t button_y2 = button_y1 + button->height;
|
||||
|
||||
// Check
|
||||
return x >= button_x1 && x < button_x2 && y >= button_y1 && y < button_y2;
|
||||
@ -50,7 +50,7 @@ static Button *create_button(int id, std::string text) {
|
||||
button->constructor(id, text);
|
||||
return (Button *) button;
|
||||
}
|
||||
Button *touch_create_button(int id, std::string text) {
|
||||
Button *touch_create_button(const int id, std::string text) {
|
||||
if (touch_gui) {
|
||||
return create_button<Touch_TButton>(id, text);
|
||||
} else {
|
||||
@ -102,7 +102,7 @@ void init_touch() {
|
||||
}
|
||||
|
||||
// Show Block Outlines
|
||||
int block_outlines = feature_has("Show Block Outlines", server_disabled);
|
||||
const bool block_outlines = feature_has("Show Block Outlines", server_disabled);
|
||||
unsigned char outline_patch[4] = {(unsigned char) (block_outlines ? !touch_gui : touch_gui), 0x00, 0x50, 0xe3}; // "cmp r0, #0x1" or "cmp r0, #0x0"
|
||||
patch((void *) 0x4a210, outline_patch);
|
||||
}
|
||||
|
@ -8,4 +8,4 @@ virtual-method uint isServer() = 0x48;
|
||||
virtual-method void pingForHosts(int base_port) = 0x14;
|
||||
|
||||
property RakNet_RakPeer *peer = 0x4;
|
||||
property uchar pinging_for_hosts = 0x24;
|
||||
property bool pinging_for_hosts = 0x24;
|
||||
|
Loading…
Reference in New Issue
Block a user