Add Fix Sign Placement
This commit is contained in:
parent
a2b2d6e7c4
commit
f3d6149405
2
debian/usr/bin/minecraft-pi
vendored
2
debian/usr/bin/minecraft-pi
vendored
@ -4,7 +4,7 @@ set -e
|
||||
|
||||
# Ensure Features Are Selected
|
||||
if [ -z "${MCPI_SUBSHELL}" ]; then
|
||||
MCPI_FEATURES="$(zenity --class minecraft-pi --list --checklist --column 'Enabled' --column 'Feature' FALSE 'Touch GUI' FALSE 'Survival Mode' FALSE 'Fix Bow & Arrow' FALSE 'Fix Attacking' FALSE 'Mob Spawning' FALSE 'Fancy Graphics' FALSE 'Disable Autojump By Default')"
|
||||
MCPI_FEATURES="$(zenity --class minecraft-pi --list --checklist --column 'Enabled' --column 'Feature' FALSE 'Touch GUI' FALSE 'Survival Mode' FALSE 'Fix Bow & Arrow' FALSE 'Fix Attacking' FALSE 'Mob Spawning' FALSE 'Fancy Graphics' FALSE 'Disable Autojump By Default' FALSE 'Fix Sign Placement')"
|
||||
MCPI_USERNAME="$(zenity --class minecraft-pi --entry --text 'Minecraft Username:' --entry-text 'StevePi')"
|
||||
fi
|
||||
export MCPI_FEATURES
|
||||
|
@ -11,13 +11,13 @@ include_directories(include)
|
||||
add_library(core SHARED src/core.c)
|
||||
target_link_libraries(core dl)
|
||||
|
||||
add_library(compat SHARED src/compat.c)
|
||||
target_link_libraries(compat core SDL EGL GLESv1_CM GLESv2 X11 dl)
|
||||
# Force GLESv1 Link
|
||||
target_link_options(compat PRIVATE "-Wl,--no-as-needed")
|
||||
|
||||
add_library(extra SHARED src/extra.c src/extra.cpp)
|
||||
target_link_libraries(extra core dl)
|
||||
|
||||
add_library(compat SHARED src/compat.c)
|
||||
target_link_libraries(compat core extra SDL EGL GLESv1_CM GLESv2 X11 dl)
|
||||
# Force GLESv1 Link
|
||||
target_link_options(compat PRIVATE "-Wl,--no-as-needed")
|
||||
|
||||
add_library(readdir SHARED src/readdir.c)
|
||||
target_link_libraries(readdir core)
|
||||
|
@ -27,15 +27,15 @@ extern "C" {
|
||||
\
|
||||
__attribute__((__used__)) return_type name args
|
||||
|
||||
void *_overwrite(char *file, int line, void *start, void *target);
|
||||
void *_overwrite(const char *file, int line, void *start, void *target);
|
||||
#define overwrite(start, target) _overwrite(__FILE__, __LINE__, start, target);
|
||||
|
||||
void revert_overwrite(void *start, void *original);
|
||||
|
||||
void _patch(char *file, int line, void *start, unsigned char patch[]);
|
||||
void _patch(const char *file, int line, void *start, unsigned char patch[]);
|
||||
#define patch(start, patch) _patch(__FILE__, __LINE__, start, patch);
|
||||
|
||||
void _patch_address(char *file, int line, void *start, void *target);
|
||||
void _patch_address(const char *file, int line, void *start, void *target);
|
||||
#define patch_address(start, target) _patch_address(__FILE__, __LINE__, start, target);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -8,6 +8,8 @@
|
||||
|
||||
#include <libcore/libcore.h>
|
||||
|
||||
#include "extra.h"
|
||||
|
||||
static Display *x11_display;
|
||||
static EGLDisplay egl_display;
|
||||
static Window x11_window;
|
||||
@ -106,6 +108,9 @@ EGLint const set_attrib_list[] = {
|
||||
|
||||
// Init EGL
|
||||
HOOK(SDL_WM_SetCaption, void, (const char *title, const char *icon)) {
|
||||
// Enable Unicode
|
||||
SDL_EnableUNICODE(SDL_ENABLE);
|
||||
|
||||
ensure_SDL_SetVideoMode();
|
||||
sdl_surface = (*real_SDL_SetVideoMode)(848, 480, 32, WINDOW_VIDEO_FLAGS);
|
||||
|
||||
@ -206,9 +211,13 @@ HOOK(SDL_PollEvent, int, (SDL_Event *event)) {
|
||||
if (event->type == SDL_VIDEORESIZE) {
|
||||
resize(event->resize.w, event->resize.h, is_fullscreen);
|
||||
handled = 1;
|
||||
} else if (event->type == SDL_KEYDOWN && event->key.keysym.sym == SDLK_F11) {
|
||||
toggle_fullscreen();
|
||||
handled = 1;
|
||||
} else if (event->type == SDL_KEYDOWN) {
|
||||
if (event->key.keysym.sym == SDLK_F11) {
|
||||
toggle_fullscreen();
|
||||
handled = 1;
|
||||
} else {
|
||||
key_press((char) event->key.keysym.unicode);
|
||||
}
|
||||
}
|
||||
|
||||
if (handled) {
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
#define ORIGINAL_SIZE 8
|
||||
|
||||
void *_overwrite(char *file, int line, void *start, void *target) {
|
||||
void *_overwrite(const char *file, int line, void *start, void *target) {
|
||||
void *original = malloc(ORIGINAL_SIZE);
|
||||
memcpy(original, start, ORIGINAL_SIZE);
|
||||
|
||||
@ -50,7 +50,7 @@ void revert_overwrite(void *start, void *original) {
|
||||
free(temp);
|
||||
}
|
||||
|
||||
void _patch(char *file, int line, void *start, unsigned char patch[]) {
|
||||
void _patch(const char *file, int line, void *start, unsigned char patch[]) {
|
||||
size_t page_size = sysconf(_SC_PAGESIZE);
|
||||
uintptr_t end = ((uintptr_t) start) + 4;
|
||||
uintptr_t page_start = ((uintptr_t) start) & -page_size;
|
||||
@ -72,7 +72,7 @@ void _patch(char *file, int line, void *start, unsigned char patch[]) {
|
||||
__clear_cache(start, (void *) end);
|
||||
}
|
||||
|
||||
void _patch_address(char *file, int line, void *start, void *target) {
|
||||
void _patch_address(const char *file, int line, void *start, void *target) {
|
||||
uint32_t addr = (uint32_t) target;
|
||||
unsigned char patch_data[4] = {addr & 0xff, (addr >> 8) & 0xff, (addr >> 16) & 0xff, (addr >> 24) & 0xff};
|
||||
_patch(file, line, start, patch_data);
|
||||
|
@ -1,14 +1,15 @@
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <SDL/SDL_mouse.h>
|
||||
|
||||
#include <libcore/libcore.h>
|
||||
|
||||
#include "extra.h"
|
||||
|
||||
static uint32_t getSpawnMobs_injection(__attribute__((unused)) int32_t obj) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
#include <SDL/SDL_mouse.h>
|
||||
|
||||
typedef void (*releaseUsingItem_t)(unsigned char *t, unsigned char *player);
|
||||
static releaseUsingItem_t survival_releaseUsingItem = (releaseUsingItem_t) 0x1a598;
|
||||
static releaseUsingItem_t creative_releaseUsingItem = (releaseUsingItem_t) 0x1b1a0;
|
||||
@ -35,6 +36,8 @@ static void handle_input_injection(unsigned char *param_1, unsigned char *param_
|
||||
(*(is_survival ? survival_releaseUsingItem : creative_releaseUsingItem))(game_mode, player);
|
||||
}
|
||||
}
|
||||
|
||||
clear_input();
|
||||
}
|
||||
|
||||
typedef void (*tickItemDrop_t)(unsigned char *);
|
||||
@ -63,7 +66,7 @@ static void handleClick_injection(unsigned char *this, unsigned char *param_2, u
|
||||
}
|
||||
}
|
||||
|
||||
static int has_feature(const char *name) {
|
||||
int has_feature(const char *name) {
|
||||
char *env = getenv("MCPI_FEATURES");
|
||||
char *features = strdup(env != NULL ? env : "");
|
||||
char *tok = strtok(features, "|");
|
||||
@ -80,9 +83,6 @@ static int has_feature(const char *name) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Defined In extra.cpp
|
||||
extern unsigned char *readAssetFile(unsigned char *app_platform, unsigned char *path);
|
||||
|
||||
// Patch Game Mode
|
||||
static void set_is_survival(int new_is_survival) {
|
||||
if (is_survival != new_is_survival) {
|
||||
@ -181,9 +181,6 @@ __attribute__((constructor)) static void init() {
|
||||
unsigned char patch_data_5[4] = {0x94, 0x0b, 0x00, 0x00};
|
||||
patch((void *) 0x17004, patch_data_5);
|
||||
|
||||
// Implement AppPlatform::readAssetFile So Translations Work
|
||||
overwrite((void *) 0x12b10, readAssetFile);
|
||||
|
||||
if (has_feature("Fancy Graphics")) {
|
||||
// Enable Fancy Graphics
|
||||
minecraft_init_original = overwrite((void *) minecraft_init, minecraft_init_injection);
|
||||
|
@ -1,15 +1,97 @@
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <streambuf>
|
||||
#include <vector>
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
#include <libcore/libcore.h>
|
||||
|
||||
#include "extra.h"
|
||||
|
||||
extern "C" {
|
||||
std::string readAssetFile(__attribute__((unused)) unsigned char *obj, const std::string& path) {
|
||||
static std::string readAssetFile(__attribute__((unused)) unsigned char *obj, const std::string& path) {
|
||||
std::string full_path("./data/");
|
||||
full_path.append(path.c_str());
|
||||
std::ifstream stream(full_path);
|
||||
std::string str((std::istreambuf_iterator<char>(stream)), std::istreambuf_iterator<char>());
|
||||
return str;
|
||||
}
|
||||
|
||||
typedef unsigned char *(*TextEditScreen_t)(unsigned char *, unsigned char *);
|
||||
static TextEditScreen_t TextEditScreen = (TextEditScreen_t) 0x3a840;
|
||||
|
||||
typedef void (*setScreen_t)(unsigned char *, unsigned char *);
|
||||
static setScreen_t setScreen = (setScreen_t) 0x15d6c;
|
||||
|
||||
static void openTextEdit(unsigned char *local_player, unsigned char *sign) {
|
||||
if (*(int *)(sign + 0x18) == 4) {
|
||||
unsigned char *minecraft = *(unsigned char **) (local_player + 0xc90);
|
||||
unsigned char *screen = (unsigned char *) ::operator new(0xd0);
|
||||
screen = (*TextEditScreen)(screen, sign);
|
||||
(*setScreen)(minecraft, screen);
|
||||
}
|
||||
}
|
||||
|
||||
#define BACKSPACE_KEY 8
|
||||
|
||||
static int is_valid_key(char key) {
|
||||
return (key >= 32 && key <= 126) || key == BACKSPACE_KEY;
|
||||
}
|
||||
|
||||
std::vector<char> input;
|
||||
int count = 0;
|
||||
void key_press(char key) {
|
||||
if (is_valid_key(key)) {
|
||||
// Keys Are Sent Twice
|
||||
if (count > 0) {
|
||||
count = 0;
|
||||
} else {
|
||||
input.push_back(key);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
void clear_input() {
|
||||
input.clear();
|
||||
}
|
||||
|
||||
typedef void (*updateEvents_t)(unsigned char *screen);
|
||||
static updateEvents_t updateEvents = (updateEvents_t) 0x28eb8;
|
||||
static void *updateEvents_original = NULL;
|
||||
|
||||
typedef void (*keyboardNewChar_t)(unsigned char *screen, char key);
|
||||
typedef void (*keyPressed_t)(unsigned char *screen, int32_t key);
|
||||
|
||||
static void updateEvents_injection(unsigned char *screen) {
|
||||
// Call Original
|
||||
revert_overwrite((void *) updateEvents, updateEvents_original);
|
||||
(*updateEvents)(screen);
|
||||
revert_overwrite((void *) updateEvents, updateEvents_original);
|
||||
|
||||
if (*(char *)(screen + 4) == '\0') {
|
||||
uint32_t vtable = *((uint32_t *) screen);
|
||||
for (char key : input) {
|
||||
if (key == BACKSPACE_KEY) {
|
||||
// Handle Backspace
|
||||
(*(keyPressed_t *) (vtable + 0x6c))(screen, BACKSPACE_KEY);
|
||||
} else {
|
||||
// Handle Nrmal Key
|
||||
(*(keyboardNewChar_t *) (vtable + 0x70))(screen, key);
|
||||
}
|
||||
}
|
||||
}
|
||||
clear_input();
|
||||
}
|
||||
|
||||
__attribute((constructor)) static void init() {
|
||||
// Implement AppPlatform::readAssetFile So Translations Work
|
||||
overwrite((void *) 0x12b10, (void *) readAssetFile);
|
||||
|
||||
if (has_feature("Fix Sign Placement")) {
|
||||
// Fix Signs
|
||||
patch_address((void *) 0x106460, (void *) openTextEdit);
|
||||
updateEvents_original = overwrite((void *) updateEvents, (void *) updateEvents_injection);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
18
mods/src/extra.h
Normal file
18
mods/src/extra.h
Normal file
@ -0,0 +1,18 @@
|
||||
#ifndef EXTRA_H
|
||||
|
||||
#define EXTRA_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
int has_feature(const char *name);
|
||||
|
||||
void key_press(char key);
|
||||
void clear_input();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user