Files
2026-11-05 19:45:34 +01:00

12 KiB

Function renames (this pass)

Inferred from behaviour. hitboxes_apply_hitbox_expansion_original is the original engine copy; the descriptor uses the correctly named hitboxes_on_reach_query logic function. block_esp_queue_loaded_chunks was verified against its body (it queues the loaded chunks for scanning).

old new
packet_entity_lookup no_item_release_on_send_packet
activate_hold hitboxes_apply_hitbox_expansion_original
compare_height_desc compare_overlay_entries_by_height_desc
take_pending_bool take_and_clear_pending_flag
rotation_cache_toggle free_look_on_toggle
store_cached_rotation free_look_save_rotation
enchantment_flags_item_stack get_weapon_enchant_flags
weapons_part is_held_item_accepted_weapon
click_with_helper is_holding_accepted_weapon
close_screen_and_release refill_disable_and_close_screen
find_hotbar_cell refill_pick_inventory_cell
remove_id_key friend_set_remove_by_key
clear_id_flag friend_set_clear_dirty
compare_hurt_time compare_by_hurt_time_desc
clear_list_set free_block_search_section_lists
text_filter_upper search_box_append_char
sort_float_entries block_esp_queue_loaded_chunks
clear_mesh rebuild_block_esp_mesh
free_allocator_pages free_block_search_cache
pending_action_flag timer_range_is_delay_pending
item_speed_by_type no_slow_item_use_speed
zero_motion_tick anti_debuff_tick

Context struct (Ctx) fields

Every module handler receives a Ctx *c. Fields were previously a, b, c18, ...:

old new meaning
a jvm JNI/JVM handle, first argument of every java_* call
p08 module_manager target of queue_module_toggle
p10 profile_list
c18 minecraft Minecraft instance
p20 world client world
b player local player entity
p30 key_state_table
p38 target current combat target record
f40 in_game non-zero while a world is loaded

Event handler names

Most handlers are <module>_on_<event>, where the event is the descriptor slot the handler is registered in; handlers whose purpose is clearer keep a semantic name (for example velocity_mode_3_delayed, notifications_draw_slide_boxes): +0x48 tick, +0x58 frame, +0x68 packet_received, +0x78 packet_sent, +0x88 input, +0x98 toggle, +0xa8 render_world, +0xb8 render_entity_overlay, +0xc8 reach_query, +0xd8 hud_tick, +0xe8 hud_render, +0x118 rotation_update, +0x128 attack, +0x138 attack_post, +0x158 player_update, +0x168 late_tick, +0x188 world_change, +0x198 movement_input, +0x1a8 move_flying, +0x1b8 game_packet_sent, +0x1d8 inventory_tick, +0x1e8 shutdown. These slot meanings are inferred from the handlers' behaviour, not from the original binary.

Locals, parameters and struct fields

Renamed with a scope-aware AST pass (every edit is validated against the compiler and the generated object code):

  • Jvm *j, void *a (first parameter) -> jvm; Ctx *c -> ctx; *Hook *h -> hook
  • JNI accessor object parameters take the class from the accessor body, e.g. a1 -> game_settings, key_binding, entity_player; setter value parameters are value
  • locals initialised from an accessor are named after it (mc -> minecraft, it -> stack, ...)
  • NanoVG context ig -> nvg, GUI state block g -> gui, Rot r -> rotation, register-function argument m -> module
  • duplicate HCtx structs use the same field names as Ctx (jvm, module_manager, minecraft, key_state_table, target, in_game, ...)
  • event structs: f24 -> verdict, p10 -> packet

GUI state block (include/slinky/gui_state.h)

All raw gui + 0x... / gui[0x...] accesses are now named members of struct GuiState (toast_text, tabs, selected_tab, input_mode, edit_text, popup_kind, popup_rgb, popup_hsl, popup_list_*, mouse_scene, scroll, row_height, click_capture, ...). The layout-row stack at the start of the block is GuiState::rows[5] (GuiLayoutRow, 0x78 bytes each). Offsets are checked with static_asserts; overlapping uses (a text buffer that doubles as a key-bind callback, the popup payload) are unions. Field names are inferred from how the GUI code uses them.

__N disambiguators

Duplicate constants, strings and tables no longer carry __N: a symbol that is used from one file gets _in_<file> (for example row_height_20_in_gui_controls), module state that already starts with the module name gets an ordinal (aim_assist_rng_states_second), and symbols only referenced from the data tables get _copy.

Verification note

The only generated-code difference from the original tree is in gui_layout.cpp, where the layout-row index is now written &gui->rows[n - 1]; the compiler emits the same address computation with base and index registers swapped.

Widgets, padding and parameter fixes

  • Settings widgets: the W1/W2/W3/Wid structs became DropdownSetting, ColorSetting, ListSetting, ToggleSetting, SliderSetting and RangeSetting, with fields such as label, format, step, scale, min, max, low, high, names, optional, popup_title, get_candidates. ListSet / ListOps gained add and remove.
  • Misnamed functions: draw_keybind_control -> draw_dropdown_row, draw_checkbox -> draw_color_swatch_row, draw_colored_checkbox -> draw_list_editor_row, draw_label -> draw_toggle_row, draw_slider_label -> draw_slider_row, draw_slider_with_label -> draw_range_slider_row, draw_label_va -> draw_section_label, get_net_handler -> get_game_settings (it returns Minecraft.gameSettings).
  • Module GUI callbacks take (GuiState *gui, window) and the widget_* functions take (window, gui, setting); an earlier pass had called the first argument jvm, which was wrong for these functions and is fixed.
  • Padding fields are named by their byte offset (padding_08, padding_11, ...), computed from clang's record layouts. Offset-named fields with a known role got names (on_shutdown, register_settings, fill_fraction, key_state_table, reach, ...); the remaining zeroed filler bytes are reserved_NN.
  • hook_* natives: (env, native_class, receiver, ...); java_jni_is_instance_of_* takes candidate; integer error-code locals are error_code.

Build fix and key-binding accessors

  • nvg_names.cpp failed to compile after the parameter pass (the parameter was renamed to nvg but the macro-free bodies still used c); fixed. The two NanoVG-dependent files were not part of my per-file compile checks, so the full CMake cross-build is the reference check; it builds slinky.dll cleanly.
  • Key-binding accessors are named by the GameSettings.keyBindings index they read: java_get_game_settings_attack_key (0), _use_item_key (1), _forward_key (2), _left_key (3), _back_key (4), _right_key (5), _sneak_key (7), _key_8_or_9, _key_17_or_8 (mapping-dependent).
  • Other numbered accessors: java_get_minecraft_object_mouse_over, java_get_minecraft_player_controller, java_get_entity_player_inventory, java_get_moving_object_position_type_ordinal / _entity_hit, java_increment_key_binding_press_time.
  • timer_range_last_forward_input / timer_range_last_strafe_input were swapped in an earlier pass; fixed (they come from the forward/back and left/right keys respectively).
  • CombatTarget (engine.h) replaces raw ctx->target + 0x18 reads with ->valid.

JNI calls, numbered names, constants, padding

  • Raw JNI function-table calls ((*(void ***)env)[0xb0 / 8] and friends) are now named calls through the existing JNIEnv table: (*env)->DeleteGlobalRef, IsSameObject, NewGlobalRef, NewStringUTF, GetObjectArrayElement, GetStringLength, GetStringCritical, ReleaseStringCritical. ((void **)ctx->jvm)[1] is ((Jvm *)ctx->jvm)->env.
  • Functions that ended in _2 / _3 have descriptive names (friends_on_tick, friends_on_toggle, bridge_assist_on_late_tick, piercing_decide_which_entity, java_get_world_chunk_provider_client, ...). The numbers that remain are meaningful (hook_*_1_7 / _1_8 Minecraft versions, player_esp_render_mode_0/1, key-binding array indices, java_call_world_get_block_state/500 method ids).
  • Constants used as arguments of a recognised call are named by role (font_size_16_in_gui_popups, corner_radius_10_in_gui_text, colour_level_0_866667_in_gui_text, walk_period_0_5_in_clutch, random_range_bound_0_05_in_clutch); constants used in arithmetic or comparisons by operator (threshold_, factor_, divisor_, offset_); pi and the 180 / 360 degree constants are pi_constant, half_turn_degrees, full_turn_degrees. Constants whose use is not one of these keep their value in the name.
  • Struct filler bytes are padding_NN (offset in hex), not reserved_NN: they are never read.

Minecraft field / method identifiers, string names, constants

The Minecraft JNI identifiers (JIds members) are now named after what they are in the game (Minecraft_theWorld, Minecraft_thePlayer, Minecraft_objectMouseOver, Entity_boundingBox, World_chunkProvider, MovingObjectPosition_hitVec, InventoryPlayer_itemStack, RenderManager_textRenderer, ...), and their accessors follow (java_get_minecraft_render_item, java_get_entity_riding_entity, ...). Members whose game name I could not establish from the code are called <Class>_unidentified_<offset>; method ids are unidentified_<offset>.

Compatibility: only C identifiers changed. The class / field / method name strings that the client resolves at run time (the obfuscated or mapped names used for the JVM lookups, including any mapping a particular launcher needs) live in src/data/rdata.s and are untouched; the data section hashes identically before and after. Short obfuscated name strings are labelled mc_obf_name_<text>, JNI signature strings jni_signature_<text>, printf formats fmt_<spec> and X.509 OID strings oid_<digits>.

Also: fn_<address> / logic_<address> references in the docs now show the current function names; java_get_static_field_c80 is java_get_c16_enum_state_open_inventory; remaining one- and two-letter locals of struct-pointer type are named after the struct (entry, target, visitor, window, ...); constants used as plain literals are named by number word (one, half, minus_one, ...) or by role (range_low_*).

JNI members named from the client's own mapping tables

Every JIds member (fields and methods of the Minecraft classes the client resolves through JNI) is now named after the MCP name that the client's own data tables carry next to the obfuscated name for each mapping (getBlockState, rayTrace, sideHit, renderGlobal, netManager, updateCameraAndRender, ...), so the names are the ones the data itself uses and are verified against it. Earlier guesses that the tables contradicted were corrected (World_playerEntities / World_loadedEntityList / World_loadedTileEntityList, TileEntity_blockType, NetworkPlayerInfo_displayName, GuiContainer_theSlot, RenderManager_textRenderer, InventoryPlayer_itemStack). The string slots that hold method names and signatures for the render hooks are RendererLivingEntity_*MethodName / *MethodSignature. No unidentified_* names remain. Only identifiers changed; the name strings are unchanged.

Constants

All remaining k_f_* / k_d_* constants are named by purpose (ground_friction_times_air_drag, movement_input_friction, gui_wide_layout_max_width, ...).