1+ #![ allow( non_snake_case) ]
12mod config;
23mod hook;
34mod logger;
45mod utils;
56
6- use std:: time:: Instant ;
7-
87fn find_water_mob_cap_and_fn_starts ( data : & [ u8 ] ) -> ( Option < usize > , Vec < usize > ) {
98 let mut seen_ret = false ;
109 let mut possible_fn_starts = Vec :: new ( ) ;
@@ -15,7 +14,6 @@ fn find_water_mob_cap_and_fn_starts(data: &[u8]) -> (Option<usize>, Vec<usize>)
1514 #[ cfg( target_arch = "aarch64" ) ] {
1615 const MASKS : [ u32 ; 3 ] = [ 0xFFFF_FC1F , 0xFFFF_FFE0 , 0xFF00_0000 ] ;
1716 const PATTERNS : [ u32 ; 3 ] = [ 0xD65F_0000 , 0x52A8_4200 , 0xD100_0000 ] ;
18-
1917 for inst in data. chunks_exact ( 4 ) {
2018 let addr = inst. as_ptr ( ) as usize ;
2119 let instr = u32:: from_le_bytes ( inst. try_into ( ) . unwrap ( ) ) ;
@@ -45,7 +43,6 @@ fn find_water_mob_cap_and_fn_starts(data: &[u8]) -> (Option<usize>, Vec<usize>)
4543 let mut instruction = Instruction :: default ( ) ;
4644
4745 const TARGET_IMMEDIATE : u64 = 0x42100000 ;
48-
4946 while decoder. can_decode ( ) {
5047 decoder. decode_out ( & mut instruction) ;
5148
@@ -83,43 +80,49 @@ fn find_water_mob_cap_and_fn_starts(data: &[u8]) -> (Option<usize>, Vec<usize>)
8380 ( water_mob_cap, possible_fn_starts)
8481}
8582
86- #[ ctor :: ctor ]
83+ #[ cfg_attr ( target_os = "android" , no_mangle ) ]
8784fn init ( ) {
88- println ! ( "Starting BuildLimitChanger" ) ;
89- let time_start = Instant :: now ( ) ;
90- log:: set_logger ( & logger:: LOGGER ) . expect ( "Logger already set" ) ;
91- log:: set_max_level ( log:: LevelFilter :: Debug ) ;
92-
93- #[ cfg( any( target_os = "windows" , target_os = "linux" ) ) ] {
94- crate :: config:: init_config ( ) ;
95- crate :: logger:: init_log_file ( false ) ;
96- }
97- let mcmap = utils:: find_minecraft_text_section ( ) . expect ( "Cannot find Minecraft .text section" ) ;
85+ let time_start = std:: time:: Instant :: now ( ) ;
86+ let mcmap = utils:: find_minecraft_text_section ( ) . unwrap_or_else ( |e| { panic ! ( "Cannot find Minecraft .text section: {}" , e. to_string( ) ) } ) ;
9887 let data = unsafe { std:: slice:: from_raw_parts ( mcmap. start as * const u8 , mcmap. size ) } ;
99-
10088 let ( water_mob_cap, possible_fn_starts) = find_water_mob_cap_and_fn_starts ( data) ;
101-
102- if water_mob_cap. is_none ( ) {
103- log:: error!( "Cannot find the water mob cap" ) ;
104- return ;
105- }
89+ if water_mob_cap. is_none ( ) { return log:: error!( "Cannot find the water mob cap" ) ; }
10690 let Some ( function_addr) = utils:: find_max_less_than ( & possible_fn_starts, water_mob_cap. unwrap ( ) ) else {
107- log:: error!( "Cannot get the function where water mob cap is located" ) ;
108- return ;
91+ return log:: error!( "Cannot get the function where water mob cap is located" ) ;
10992 } ;
11093 log:: debug!( "Function Offset: 0x{:X}" , function_addr) ;
11194 log:: debug!( "{:02X?}" , & data[ function_addr - mcmap. start..( function_addr - mcmap. start + 10 ) . min( data. len( ) ) ] ) ;
112-
11395 hook:: setup_hook ( function_addr) ;
11496 log:: debug!( "{:02X?}" , & data[ function_addr - mcmap. start..( function_addr - mcmap. start + 10 ) . min( data. len( ) ) ] ) ;
11597 log:: info!( "Took: {:?}" , time_start. elapsed( ) ) ;
11698}
11799
100+ #[ ctor:: ctor]
101+ fn main ( ) {
102+ println ! ( "Starting BuildLimitChanger" ) ;
103+ log:: set_logger ( & logger:: LOGGER ) . expect ( "Logger already set" ) ;
104+ log:: set_max_level ( log:: LevelFilter :: Debug ) ;
105+ #[ cfg( any( target_os = "linux" , target_os = "windows" ) ) ] {
106+ config:: init_config ( & mut utils:: get_config_directory ( ) . expect ( "Failed to get a valid config directory" ) ) ;
107+ logger:: init_log_file ( false ) ;
108+ init ( ) ;
109+ }
110+ }
111+
112+ #[ cfg( target_os = "android" ) ]
113+ #[ no_mangle]
114+ pub extern "C" fn mod_init ( ) {
115+ config:: init_config ( & mut String :: from ( "/data/data/com.mojang.minecraftpe" ) ) ;
116+ logger:: init_log_file ( false ) ;
117+ init ( ) ;
118+ }
119+
118120#[ cfg( target_os = "android" ) ]
119121#[ no_mangle]
120122pub extern "system" fn JNI_OnLoad ( vm : jni:: JavaVM , _: * mut core:: ffi:: c_void ) -> i32 {
121123 let mut env = vm. get_env ( ) . expect ( "Cannot get reference to the JNIEnv" ) ;
122- config:: init_config ( & mut env) ;
123- logger:: init_log_file ( crate :: utils:: is_levi_launcher ( & mut env) ) ;
124+ config:: init_config ( & mut utils:: get_config_directory ( & mut env) . expect ( "Failed to get a valid config directory" ) ) ;
125+ logger:: init_log_file ( utils:: is_levi_launcher ( & mut env) ) ;
126+ init ( ) ;
124127 return jni:: sys:: JNI_VERSION_1_6 ;
125128}
0 commit comments