minecraft-pi-reborn/mods/src/options/options.c

138 lines
4.4 KiB
C
Raw Normal View History

2020-12-02 23:18:49 +00:00
#include <string.h>
2021-01-27 21:26:19 +00:00
#include <libreborn/libreborn.h>
2020-12-02 23:18:49 +00:00
#include "../feature/feature.h"
#include "../init/init.h"
2021-02-03 22:00:02 +00:00
#include <libreborn/minecraft.h>
2020-12-02 23:18:49 +00:00
static int mob_spawning = 0;
// Override Mob Spawning
static uint32_t LevelData_getSpawnMobs_injection(__attribute__((unused)) unsigned char *level_data) {
return mob_spawning;
}
2021-02-02 00:35:30 +00:00
// Get Custom Render Distance
static int get_render_distance() {
char *distance_str = getenv("MCPI_RENDER_DISTANCE");
if (distance_str == NULL) {
distance_str = "Short";
}
if (strcmp("Far", distance_str) == 0) {
return 0;
} else if (strcmp("Normal", distance_str) == 0) {
return 1;
} else if (strcmp("Short", distance_str) == 0) {
return 2;
} else if (strcmp("Tiny", distance_str) == 0) {
return 3;
} else {
ERR("Invalid Render Distance: %s", distance_str);
}
}
2020-12-02 23:18:49 +00:00
// Get Custom Username
static char *get_username() {
char *username = getenv("MCPI_USERNAME");
if (username == NULL) {
username = "StevePi";
}
return username;
}
static int fancy_graphics;
static int peaceful_mode;
static int anaglyph;
static int smooth_lighting;
2021-02-02 00:35:30 +00:00
static int render_distance;
2020-12-02 23:18:49 +00:00
// Configure Options
static void Minecraft_init_injection(unsigned char *this) {
// Call Original Method
(*Minecraft_init)(this);
2020-12-18 03:22:56 +00:00
unsigned char *options = this + Minecraft_options_property_offset;
2020-12-02 23:18:49 +00:00
// Enable Fancy Graphics
2020-12-18 03:22:56 +00:00
*(options + Options_fancy_graphics_property_offset) = fancy_graphics;
2020-12-02 23:18:49 +00:00
// Enable Crosshair In Touch GUI
2020-12-18 03:22:56 +00:00
*(options + Options_split_controls_property_offset) = 1;
2020-12-02 23:18:49 +00:00
// Peaceful Mode
2020-12-18 03:22:56 +00:00
*(int32_t *) (options + Options_split_controls_property_offset) = peaceful_mode ? 0 : 2;
2020-12-02 23:18:49 +00:00
// 3D Anaglyph
2020-12-18 03:22:56 +00:00
*(options + Options_3d_anaglyph_property_offset) = anaglyph;
2020-12-02 23:18:49 +00:00
// Smooth Lighting
2020-12-18 03:22:56 +00:00
*(options + Options_ambient_occlusion_property_offset) = smooth_lighting;
2021-02-02 00:35:30 +00:00
// Render Distance
*(int32_t *) (options + Options_render_distance_property_offset) = render_distance;
2020-12-02 23:18:49 +00:00
}
// Enable Touch GUI
static int32_t Minecraft_isTouchscreen_injection(__attribute__((unused)) unsigned char *minecraft) {
return 1;
}
void init_options() {
int is_server = feature_get_mode() == 2;
int touch_gui = feature_has("Touch GUI");
if (touch_gui) {
// Main UI
overwrite((void *) Minecraft_isTouchscreen, Minecraft_isTouchscreen_injection);
// Force Correct Toolbar Size
unsigned char toolbar_patch[4] = {0x01, 0x00, 0x50, 0xe3};
patch((void *) 0x257b0, toolbar_patch);
}
mob_spawning = feature_has("Mob Spawning");
// Set Mob Spawning
overwrite((void *) LevelData_getSpawnMobs, LevelData_getSpawnMobs_injection);
// Enable Fancy Graphics
fancy_graphics = feature_has("Fancy Graphics");
// Peaceful Mode
peaceful_mode = feature_has("Peaceful Mode");
// 3D Anaglyph
anaglyph = feature_has("3D Anaglyph");
2021-02-02 00:35:30 +00:00
// Render Distance
if (!is_server) {
render_distance = get_render_distance();
INFO("Setting Render Distance: %i", render_distance);
} else {
render_distance = 3;
}
2020-12-02 23:18:49 +00:00
// Set Options
overwrite_calls((void *) Minecraft_init, Minecraft_init_injection);
// Change Username
const char *username = get_username();
if (!is_server) {
INFO("Setting Username: %s", username);
}
if (strcmp(*default_username, "StevePi") != 0) {
ERR("%s", "Default Username Is Invalid");
}
patch_address((void *) default_username, (void *) username);
if (feature_has("Disable Autojump By Default")) {
// Disable Autojump By Default
unsigned char autojump_patch[4] = {0x00, 0x30, 0xa0, 0xe3};
patch((void *) 0x44b90, autojump_patch);
}
2021-02-04 01:58:43 +00:00
if (feature_has("Display Nametags By Default")) {
// Display Nametags By Default
unsigned char display_nametags_patch[4] = {0x1d, 0x60, 0xc0, 0xe5};
patch((void *) 0xa6628, display_nametags_patch);
}
2020-12-02 23:18:49 +00:00
// Show Block Outlines
int block_outlines = feature_has("Show Block Outlines");
unsigned char outline_patch[4] = {block_outlines ? !touch_gui : touch_gui, 0x00, 0x50, 0xe3};
patch((void *) 0x4a210, outline_patch);
smooth_lighting = feature_has("Smooth Lighting");
if (smooth_lighting) {
// Enable Smooth Lighting
unsigned char smooth_lighting_patch[4] = {0x01, 0x00, 0x53, 0xe3};
patch((void *) 0x59ea4, smooth_lighting_patch);
}
}