Fix Some Camera API Bugs
This commit is contained in:
parent
5d1bbabd77
commit
8e64bb9136
@ -62,6 +62,8 @@
|
||||
* `Fix Furnace Screen Visual Bug` (Enabled By Default)
|
||||
* `Fix Held Item Poking Through Screen Overlay` (Enabled By Default)
|
||||
* `Implement RaspberryJuice API` (Enabled By Default)
|
||||
* `Fix HUD When Spectating Other Players` (Enabled By Default)
|
||||
* `Fix Crash When Spectated Entity Is Removed` (Enabled By Default)
|
||||
* Existing Functionality (All Enabled By Default)
|
||||
* `Fix Screen Rendering When Hiding HUD`
|
||||
* `Sanitize Usernames`
|
||||
|
@ -135,6 +135,9 @@ CATEGORY Bug Fixes
|
||||
TRUE Fix Crash When Generating Certain Seeds
|
||||
TRUE Close Editor When Sign Is Destroyed
|
||||
TRUE Close Current Screen On Death
|
||||
CATEGORY API
|
||||
TRUE Fix HUD When Spectating Other Players
|
||||
TRUE Fix Crash When Spectated Entity Is Removed
|
||||
TRUE Fix Reloading Textures On Resize
|
||||
TRUE Fix options.txt Loading/Saving
|
||||
TRUE Fix Hanging When No Valid Spawn Point Exists
|
||||
|
@ -292,7 +292,7 @@ std::string CommandServer_parse_injection(CommandServer_parse_t old, CommandServ
|
||||
std::string args_str = command.substr(arg_start + 1, cmd_end - arg_start - 1);
|
||||
|
||||
// Redirect Player Namespace To The Entity One
|
||||
if (server->minecraft->player != nullptr && cmd.starts_with(player_namespace) && cmd != "player.setting") {
|
||||
if (server->minecraft->player != nullptr && cmd.starts_with(player_namespace) && cmd != (player_namespace + "setting")) {
|
||||
cmd = "entity." + cmd.substr(player_namespace.size());
|
||||
args_str = std::to_string(server->minecraft->player->id) + arg_separator + args_str;
|
||||
}
|
||||
@ -617,6 +617,33 @@ sign->lines[i] = get_input(line_##i); \
|
||||
}
|
||||
}
|
||||
|
||||
// Fix HUD Spectating Other Players
|
||||
template <typename... Args>
|
||||
static void ItemInHandRenderer_render_injection(const std::function<void(ItemInHandRenderer *, Args...)> &original, ItemInHandRenderer *self, Args... args) {
|
||||
// "Fix" Current Player
|
||||
LocalPlayer *&player = self->minecraft->player;
|
||||
LocalPlayer *old_player = player;
|
||||
Mob *camera = self->minecraft->camera;
|
||||
if (camera && camera->isPlayer()) {
|
||||
player = (LocalPlayer *) camera;
|
||||
}
|
||||
// Call Original Method
|
||||
original(self, std::forward<Args>(args)...);
|
||||
// Revert "Fix"
|
||||
player = old_player;
|
||||
}
|
||||
|
||||
// Fix Crash When Camera Entity Is Removed
|
||||
static void LevelRenderer_entityRemoved_injection(LevelRenderer *self, Entity *entity) {
|
||||
// Call Original Method
|
||||
LevelListener_entityRemoved->get(false)((LevelListener *) self, entity);
|
||||
// Fix Camera
|
||||
Minecraft *minecraft = self->minecraft;
|
||||
if ((Entity *) minecraft->camera == entity) {
|
||||
minecraft->camera = (Mob *) minecraft->player;
|
||||
}
|
||||
}
|
||||
|
||||
// Init
|
||||
void init_api() {
|
||||
if (feature_has("Implement RaspberryJuice API", server_enabled)) {
|
||||
@ -626,4 +653,13 @@ void init_api() {
|
||||
overwrite_calls(ClientSideNetworkHandler_handle_MovePlayerPacket, ClientSideNetworkHandler_handle_MovePlayerPacket_injection);
|
||||
overwrite_call((void *) 0x6b6e8, Entity_moveTo, Entity_moveTo_injection);
|
||||
}
|
||||
// Bug Fixes
|
||||
if (feature_has("Fix HUD When Spectating Other Players", server_enabled)) {
|
||||
overwrite_calls(ItemInHandRenderer_render, ItemInHandRenderer_render_injection<float>);
|
||||
overwrite_calls(ItemInHandRenderer_renderScreenEffect, ItemInHandRenderer_render_injection<float>);
|
||||
overwrite_calls(ItemInHandRenderer_tick, ItemInHandRenderer_render_injection<>);
|
||||
}
|
||||
if (feature_has("Fix Crash When Spectated Entity Is Removed", server_enabled)) {
|
||||
patch_vtable(LevelRenderer_entityRemoved, LevelRenderer_entityRemoved_injection);
|
||||
}
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ void chat_send_message_to_clients(ServerSideNetworkHandler *server_side_network_
|
||||
server_side_network_handler->displayGameMessage(full_message);
|
||||
is_sending = false;
|
||||
}
|
||||
// Handle Chat packet Send
|
||||
// Handle Chat Packet Send
|
||||
void chat_handle_packet_send(const Minecraft *minecraft, ChatPacket *packet) {
|
||||
// Convert To CP-437
|
||||
packet->message = to_cp437(packet->message);
|
||||
|
@ -49,11 +49,11 @@ static void revert_rotation(Entity *entity) {
|
||||
}
|
||||
}
|
||||
static bool is_front_facing = false;
|
||||
static LocalPlayer *stored_player = nullptr;
|
||||
static Entity *stored_player = nullptr;
|
||||
static void GameRenderer_setupCamera_injection(GameRenderer_setupCamera_t original, GameRenderer *game_renderer, const float param_1, const int param_2) {
|
||||
// Get Objects
|
||||
Minecraft *minecraft = game_renderer->minecraft;
|
||||
stored_player = minecraft->player;
|
||||
const Minecraft *minecraft = game_renderer->minecraft;
|
||||
stored_player = (Entity *) minecraft->camera;
|
||||
|
||||
// Check If In Third-Person
|
||||
const Options *options = &minecraft->options;
|
||||
@ -61,7 +61,7 @@ static void GameRenderer_setupCamera_injection(GameRenderer_setupCamera_t origin
|
||||
|
||||
// Invert Rotation
|
||||
if (is_front_facing) {
|
||||
invert_rotation((Entity *) stored_player);
|
||||
invert_rotation(stored_player);
|
||||
}
|
||||
|
||||
// Call Original Method
|
||||
@ -69,21 +69,21 @@ static void GameRenderer_setupCamera_injection(GameRenderer_setupCamera_t origin
|
||||
|
||||
// Revert
|
||||
if (is_front_facing) {
|
||||
revert_rotation((Entity *) stored_player);
|
||||
revert_rotation(stored_player);
|
||||
}
|
||||
}
|
||||
static void ParticleEngine_render_injection(ParticleEngine_render_t original, ParticleEngine *particle_engine, Entity *entity, const float param_2) {
|
||||
// Invert Rotation
|
||||
if (is_front_facing && (Entity *) stored_player == entity) {
|
||||
invert_rotation((Entity *) stored_player);
|
||||
if (is_front_facing && stored_player == entity) {
|
||||
invert_rotation(stored_player);
|
||||
}
|
||||
|
||||
// Call Original Method
|
||||
original(particle_engine, entity, param_2);
|
||||
|
||||
// Revert
|
||||
if (is_front_facing && (Entity *) stored_player == entity) {
|
||||
revert_rotation((Entity *) stored_player);
|
||||
if (is_front_facing && stored_player == entity) {
|
||||
revert_rotation(stored_player);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,7 @@ struct Callbacks {
|
||||
std::vector<std::function<void(Args...)>> functions;
|
||||
void run(Args... args) {
|
||||
for (const std::function<void(Args...)> &func : functions) {
|
||||
func(args...);
|
||||
func(std::forward<Args>(args)...);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -481,7 +481,7 @@ static void Gui_renderProgressIndicator_injection(Gui_renderProgressIndicator_t
|
||||
// Render
|
||||
media_glEnable(GL_BLEND);
|
||||
self->minecraft->textures->blur = true;
|
||||
self->renderVignette(self->minecraft->player->getBrightness(a), width, height);
|
||||
self->renderVignette(self->minecraft->camera->getBrightness(a), width, height);
|
||||
self->minecraft->textures->blur = false;
|
||||
media_glDisable(GL_BLEND);
|
||||
// Call Original Method
|
||||
|
@ -300,22 +300,24 @@ static void Font_draw_injection(const std::function<void(Font *, Args...)> &orig
|
||||
static void ItemInHandRenderer_renderScreenEffect_injection(__attribute__((unused)) ItemInHandRenderer_renderScreenEffect_t original, ItemInHandRenderer *self, float param_1) {
|
||||
media_glDisable(GL_ALPHA_TEST);
|
||||
const Minecraft *mc = self->minecraft;
|
||||
LocalPlayer *player = mc->player;
|
||||
mc->textures->loadAndBindTexture("terrain.png");
|
||||
if (player->isInWall()) {
|
||||
int x = Mth::floor(player->x);
|
||||
int y = Mth::floor(player->y);
|
||||
int z = Mth::floor(player->z);
|
||||
const int id = mc->level->getTile(x, y, z);
|
||||
Tile *tile = Tile::tiles[id];
|
||||
if (tile != nullptr) {
|
||||
media_glClear(GL_DEPTH_BUFFER_BIT);
|
||||
self->renderTex(param_1, tile->getTexture1(2));
|
||||
Mob *player = mc->camera;
|
||||
if (player->isPlayer()) {
|
||||
mc->textures->loadAndBindTexture("terrain.png");
|
||||
if (player->isInWall()) {
|
||||
int x = Mth::floor(player->x);
|
||||
int y = Mth::floor(player->y);
|
||||
int z = Mth::floor(player->z);
|
||||
const int id = mc->level->getTile(x, y, z);
|
||||
Tile *tile = Tile::tiles[id];
|
||||
if (tile != nullptr) {
|
||||
media_glClear(GL_DEPTH_BUFFER_BIT);
|
||||
self->renderTex(param_1, tile->getTexture1(2));
|
||||
}
|
||||
}
|
||||
if (player->isOnFire()) {
|
||||
media_glClear(GL_DEPTH_BUFFER_BIT);
|
||||
self->renderFire(param_1);
|
||||
}
|
||||
}
|
||||
if (player->isOnFire()) {
|
||||
media_glClear(GL_DEPTH_BUFFER_BIT);
|
||||
self->renderFire(param_1);
|
||||
}
|
||||
media_glEnable(GL_ALPHA_TEST);
|
||||
}
|
||||
|
@ -30,11 +30,12 @@ static void Player_username_assign_injection_2(std::string *target, const char *
|
||||
}
|
||||
|
||||
// Change Texture For HUD
|
||||
static uint32_t ItemInHandRenderer_render_Textures_loadAndBindTexture_injection(Textures *textures, __attribute__((unused)) std::string const& name) {
|
||||
static uint32_t ItemInHandRenderer_render_Textures_loadAndBindTexture_injection(Textures *textures, const std::string &name) {
|
||||
// Change Texture
|
||||
static std::string new_texture;
|
||||
if (new_texture.length() == 0) {
|
||||
new_texture = get_skin_texture_path(Strings::default_username);
|
||||
std::string new_texture = name;
|
||||
Mob *camera = textures->options->minecraft->camera;
|
||||
if (camera && camera->isPlayer()) {
|
||||
new_texture = camera->texture;
|
||||
}
|
||||
|
||||
// Call Original Method
|
||||
|
@ -91,6 +91,7 @@ set(SRC
|
||||
src/level/ChunkStorage.def
|
||||
src/level/LightLayer.def
|
||||
src/level/Level.def
|
||||
src/level/LevelListener.def
|
||||
src/level/renderer/LevelRenderer.def
|
||||
src/level/LevelStorageSource.def
|
||||
src/level/renderer/ParticleEngine.def
|
||||
|
@ -23,4 +23,5 @@ property bool debug = 0xee;
|
||||
property bool server_visible = 0x104;
|
||||
property std::string username = 0x100;
|
||||
property bool invert_mouse = 0xc;
|
||||
property bool lefty = 0x1a;
|
||||
property bool lefty = 0x1a;
|
||||
property Minecraft *minecraft = 0xe4;
|
@ -7,4 +7,5 @@ method void renderItem(Mob *mob, ItemInstance *item) = 0x4b824;
|
||||
method void render(float param_1) = 0x4bfcc;
|
||||
method void renderFire(float param_1) = 0x4ca84;
|
||||
method void renderTex(float param_1, int param_2) = 0x4c7d4;
|
||||
method void renderScreenEffect(float param_1) = 0x4cc40;
|
||||
method void renderScreenEffect(float param_1) = 0x4cc40;
|
||||
method void tick() = 0x4b78c;
|
3
symbols/src/level/LevelListener.def
Normal file
3
symbols/src/level/LevelListener.def
Normal file
@ -0,0 +1,3 @@
|
||||
vtable 0x1068e0;
|
||||
|
||||
virtual-method void entityRemoved(Entity *entity) = 0x38;
|
@ -1,3 +1,5 @@
|
||||
extends LevelListener;
|
||||
|
||||
vtable 0x107438;
|
||||
|
||||
constructor (Minecraft *minecraft) = 0x4e5f8;
|
||||
|
@ -12,4 +12,5 @@ method Texture *getTemporaryTextureData(uint id) = 0x53168;
|
||||
|
||||
property bool blur = 0x39;
|
||||
property std::vector<DynamicTexture *> dynamic_textures = 0x40;
|
||||
property uint current_texture = 0x3c;
|
||||
property uint current_texture = 0x3c;
|
||||
property Options *options = 0x30;
|
Loading…
x
Reference in New Issue
Block a user