75 lines
3.3 KiB
C++
75 lines
3.3 KiB
C++
// helper functions (formerly address block; names inferred from behaviour).
|
|
#include "slinky/engine.h"
|
|
extern "C" char free_look_module_descriptor[]; extern "C" unsigned char free_look_active; extern "C" void *free_look_saved_camera;
|
|
extern "C" int free_look_saved_perspective, free_look_target_perspective_value;
|
|
struct Ev { char padding_00[8]; Ctx *ctx; void *tag; unsigned char on; };
|
|
FN(unsigned char, is_silent_rotation_active, ());
|
|
FN(void *, get_silent_rotation, ());
|
|
FN(void *, get_entity_rotation, (void *jvm, void *entity));
|
|
FN(void *, get_game_settings, (void *jvm, void *object));
|
|
FN(int, java_get_game_settings_third_person_view, (void *jvm, void *game_settings));
|
|
FN(void, java_set_game_settings_third_person_view, (void *jvm, void *game_settings, int value));
|
|
FN(void, set_render_rotation, (void *cam));
|
|
FN(void *, java_call_item_stack_get_enchantment_tag_list, (void *jvm, void *stack));
|
|
FN(int, java_call_nbttag_list_tag_count, (void *jvm, void *list));
|
|
FN(void *, java_call_nbttag_list_get_compound_tag_at, (void *jvm, void *list, int i));
|
|
FN(short, java_jni_call_short_method_nbttag_compound_get_short, (void *jvm, void *tag, void *key));
|
|
struct Jvm2 { void *ids; struct JE **env; };
|
|
struct JE { char padding_00[0x538]; void *(*NewStringUTF)(void *, const char *); };
|
|
extern "C" const char str_id_in_free_look_and_enchants[], str_lvl[];
|
|
extern "C" void free_look_on_toggle(Ev *event) {
|
|
if (event->tag != free_look_module_descriptor)
|
|
return;
|
|
Ctx *ctx = event->ctx;
|
|
if (!ctx->world)
|
|
return;
|
|
if (event->on == 1) {
|
|
free_look_active = 1;
|
|
void *cam;
|
|
if (is_silent_rotation_active())
|
|
cam = get_silent_rotation();
|
|
else
|
|
cam = get_entity_rotation(ctx->jvm, ctx->player);
|
|
free_look_saved_camera = cam;
|
|
}
|
|
void *x = get_game_settings(ctx->jvm, ctx->minecraft);
|
|
void *jvm = ctx->jvm;
|
|
if (event->on != 0) {
|
|
free_look_saved_perspective = java_get_game_settings_third_person_view(jvm, x);
|
|
void *jvm2 = ctx->jvm;
|
|
unsigned persp = free_look_target_perspective_value;
|
|
java_set_game_settings_third_person_view(jvm2, x, persp);
|
|
return;
|
|
}
|
|
java_set_game_settings_third_person_view(jvm, x, free_look_saved_perspective);
|
|
if (free_look_active == 1) {
|
|
set_render_rotation(free_look_saved_camera);
|
|
free_look_active = 0;
|
|
}
|
|
}
|
|
extern "C" void free_look_save_rotation(char *p) { p[8] = 1; *(void **)(p + 0xc) = free_look_saved_camera; }
|
|
|
|
// enchantment flags of an item stack: 1 = id 16, 2 = id 19, 4 = id 20
|
|
extern "C" unsigned get_weapon_enchant_flags(Jvm2 *j, void *stack) {
|
|
void *list = java_call_item_stack_get_enchantment_tag_list(j, stack);
|
|
unsigned flags = 0;
|
|
if (!list) return flags;
|
|
JE **env = j->env;
|
|
void *idS = (*env)->NewStringUTF(env, str_id_in_free_look_and_enchants);
|
|
if (!idS) return flags;
|
|
if (!(*env)->NewStringUTF(env, str_lvl)) return flags;
|
|
int n = java_call_nbttag_list_tag_count(j, list);
|
|
if (n <= 0) return flags;
|
|
flags = 0;
|
|
int i = 0;
|
|
do {
|
|
void *tag = java_call_nbttag_list_get_compound_tag_at(j, list, i);
|
|
switch (java_jni_call_short_method_nbttag_compound_get_short(j, tag, idS)) {
|
|
case 0x10: flags |= 1; break;
|
|
case 0x13: flags |= 2; break;
|
|
case 0x14: flags |= 4; break;
|
|
}
|
|
} while (++i != n);
|
|
return flags;
|
|
}
|