CM_OfficialYT
1/3 Games Approved
It seems like I am very well good at hooking Armeabi-v7a. But when it comes to compatibility. I also need to hook up Arm-v8a due to many mobile phones are no longer 32 bit support, instead most modern phones are only 64 bit.
I am hooking "il2cpp.so" for years and got used to it.
[PROBLEM]
• I tried hooking Arm-v8a (il2cpp.so) and they're not working as Armeabi-v7a.
Here's a full code:
I am hooking "il2cpp.so" for years and got used to it.
[PROBLEM]
• I tried hooking Arm-v8a (il2cpp.so) and they're not working as Armeabi-v7a.
Here's a full code:
C++:
#include <list>
#include <vector>
#include <string.h>
#include <pthread.h>
#include <cstring>
#include <jni.h>
#include <unistd.h>
#include <fstream>
#include <iostream>
#include <dlfcn.h>
#include "Includes/Logger.h"
#include "Includes/obfuscate.h"
#include "Includes/Utils.h"
#include "KittyMemory/MemoryPatch.h"
#include "Menu.h"
#define targetLibName OBFUSCATE("libil2cpp.so")
#include "Includes/Macros.h"
struct My_Patches {
MemoryPatch CursorRange;
} hexPatches;
bool gMode = false;
float mSpeed = 1.0;
bool smSpeed = false;
bool iJump = false;
float jHeight = 1.0;
bool sJHeight = false;
int mHealth = 1;
bool smHealth = false;
int mbHealth = 1;
bool smbHealth = false;
bool sfHealth = false;
bool fBreaking = false;
float sSpeed = 0.0;
bool ssSpeed = false;
bool fpWall = false;
bool fpBlock = false;
bool bbFar = false;
int pRange = 1;
bool spRange = false;
int sIAmount = 1;
bool sSIAmount = false;
int sIAPJoin = 1;
bool sSIAPJoin = false;
bool cRange = false;
int mAna = 1;
bool sMana = false;
int dEfense = 1;
bool sDefense = false;
int mInion = 1;
bool sMinion = false;
int wDamage = 1;
bool swDamage = false;
float mEleeDamage = 1.0;
float mAgicDamage = 1.0;
float rAngedDamage = 1.0;
float aRrowDamage = 1.0;
float bUlletDamage = 1.0;
float rOcketDamage = 1.0;
float mInionDamage = 1.0;
bool sCDamage = false;
/*void (*old_Hurt)(void *instance);void Hurt(void *instance) {if (instance != NULL) {if (gMode == true) {
*(bool *) ((uint64_t) instance + 0x361) = true;
*(int *) ((uint64_t) instance + 0x364) = 10; // public Int32 immuneTime
}}return old_Hurt(instance);}*/
float (*old_Hurt)(void *instance);float Hurt(void *instance) {if (instance != NULL) {if (gMode == true) {
return 0.0;}}return old_Hurt(instance);}
void (*old_maxRunSpeed)(void *instance);void maxRunSpeed(void *instance) {if (instance != NULL) {if (smSpeed == true) {
*(float *) ((uint64_t) instance + 0x8C8) = mSpeed;
*(float *) ((uint64_t) instance + 0x9E8) = mSpeed;
}}return old_maxRunSpeed(instance);}
void (*old_jump)(void *instance);void jump(void *instance) {if (instance != NULL) {if (iJump == true) {
*(int *) ((uint64_t) instance + 0x514) = 2;
*(int *) ((uint64_t) instance + 0x5D8) = 2;
}}return old_jump(instance);}
void (*old_jumpSpeedBoost)(void *instance);void jumpSpeedBoost(void *instance) {if (instance != NULL) {if (sJHeight == true) {
*(float *) ((uint64_t) instance + 0x9BC) = jHeight;
*(float *) ((uint64_t) instance + 0xAF0) = jHeight;}}return old_jumpSpeedBoost(instance);}
void (*old_statLifeMax)(void *instance);void statLifeMax(void *instance) {if (instance != NULL) {if (smHealth == true) {
*(int *) ((uint64_t) instance + 0x6C0) = mHealth;
*(int *) ((uint64_t) instance + 0x7B8) = mHealth;}if (smbHealth == true) {
*(int *) ((uint64_t) instance + 0x6C4) = mbHealth;
*(int *) ((uint64_t) instance + 0x7BC) = mbHealth;}if (sfHealth == true) {sfHealth = false; // public Int32 statLifeMax2
*(int *) ((uint64_t) instance + 0x6C8) = 999999999;
*(int *) ((uint64_t) instance + 0x7C0) = 999999999;}}return old_statLifeMax(instance);} // public Int32 statLife
void (*old_itemTime)(void *instance);void itemTime(void *instance) {if (instance != NULL) {if (fBreaking == true) {
*(float *) ((uint64_t) instance + 0xBF0) = 0.0;
*(float *) ((uint64_t) instance + 0xD58) = 0.0;}}return old_itemTime(instance);}
void (*old_meleeSpeed)(void *instance);void meleeSpeed(void *instance) {if (instance != NULL) {if (ssSpeed == true) {
*(float *) ((uint64_t) instance + 0x86C) = sSpeed;
*(float *) ((uint64_t) instance + 0x97C) = sSpeed;}}return old_meleeSpeed(instance);}
void (*old_wallSpeed)(void *instance);void wallSpeed(void *instance) {if (instance != NULL) {if (fpWall == true) {
*(float *) ((uint64_t) instance + 0x87C) = 0.0;
*(float *) ((uint64_t) instance + 0x98C) = 0.0;}}return old_wallSpeed(instance);}
void (*old_tileSpeed)(void *instance);void tileSpeed(void *instance) {if (instance != NULL) {if (fpBlock == true) {
*(float *) ((uint64_t) instance + 0x880) = 0.0;
*(float *) ((uint64_t) instance + 0x990) = 0.0;}if (spRange == true) {
*(int *) ((uint64_t) instance + 0x9D0) = pRange;
*(int *) ((uint64_t) instance + 0xB04) = pRange; // public Int32 blockRange
}}return old_tileSpeed(instance);}
bool (*old_IsTargetTileInItemRange)(void *instance);bool IsTargetTileInItemRange(void *instance) {if (instance != NULL) {if (bbFar == true) {
return true;}}return old_IsTargetTileInItemRange(instance);}
void (*old_stack)(void *instance);void stack(void *instance) {if (instance != NULL) {if (sSIAmount == true) {
*(int *) ((uint64_t) instance + 0x54) = sIAmount;
*(int *) ((uint64_t) instance + 0x60) = sIAmount;}}return old_stack(instance);}
void (*old_stack1)(void *instance);void stack1(void *instance) {if (instance != NULL) {if (sSIAPJoin == true) {
*(int *) ((uint64_t) instance + 0x54) = sIAPJoin;
*(int *) ((uint64_t) instance + 0x60) = sIAPJoin;}}return old_stack1(instance);}
void (*old_statMana)(void *instance);void statMana(void *instance) {if (instance != NULL) {if (sMana == true) {
*(int *) ((uint64_t) instance + 0x6CC) = mAna;
*(int *) ((uint64_t) instance + 0x6D0) = mAna; // public Int32 statManaMax
*(int *) ((uint64_t) instance + 0x6D4) = mAna;
*(int *) ((uint64_t) instance + 0x7C4) = mAna;
*(int *) ((uint64_t) instance + 0x7C8) = mAna; // public Int32 statManaMax
*(int *) ((uint64_t) instance + 0x7CC) = mAna;}}return old_statMana(instance);} // public Int32 statManaMax2
void (*old_statDefense)(void *instance);void statDefense(void *instance) {if (instance != NULL) {if (sDefense == true) {
*(int *) ((uint64_t) instance + 0x6BC) = dEfense;
*(int *) ((uint64_t) instance + 0x7B4) = dEfense;}}return old_statDefense(instance);}
void (*old_maxMinions)(void *instance);void maxMinions(void *instance) {if (instance != NULL) {if (sMinion == true) {
*(int *) ((uint64_t) instance + 0x2A0) = mInion;
*(int *) ((uint64_t) instance + 0x2F8) = mInion;}}return old_maxMinions(instance);}
void (*old_meleeDamage)(void *instance);void meleeDamage(void *instance) {if (instance != NULL) {if (swDamage == true) {
*(float *) ((uint64_t) instance + 0x840) = wDamage;
*(float *) ((uint64_t) instance + 0x844) = wDamage; // public Single magicDamage
*(float *) ((uint64_t) instance + 0x848) = wDamage; // public Single rangedDamage
*(float *) ((uint64_t) instance + 0x84C) = wDamage; // public Single rangedMultDamage
*(float *) ((uint64_t) instance + 0x854) = wDamage; // public Single arrowDamage
*(float *) ((uint64_t) instance + 0x858) = wDamage; // public Single bulletDamage
*(float *) ((uint64_t) instance + 0x85C) = wDamage; // public Single rocketDamage
*(float *) ((uint64_t) instance + 0x860) = wDamage; // public float minionDamage
*(float *) ((uint64_t) instance + 0x950) = wDamage;
*(float *) ((uint64_t) instance + 0x954) = wDamage; // public Single magicDamage
*(float *) ((uint64_t) instance + 0x958) = wDamage; // public Single rangedDamage
*(float *) ((uint64_t) instance + 0x95C) = wDamage; // public Single rangedMultDamage
*(float *) ((uint64_t) instance + 0x964) = wDamage; // public Single arrowDamage
*(float *) ((uint64_t) instance + 0x968) = wDamage; // public Single bulletDamage
*(float *) ((uint64_t) instance + 0x96C) = wDamage; // public Single rocketDamage
*(float *) ((uint64_t) instance + 0x970) = wDamage; // public float minionDamage
}if (sCDamage == true) {if (mEleeDamage > 1) {
*(float *) ((uint64_t) instance + 0x840) = mEleeDamage;
*(float *) ((uint64_t) instance + 0x950) = mEleeDamage;
}if (mAgicDamage > 1) {
*(float *) ((uint64_t) instance + 0x844) = mAgicDamage;
*(float *) ((uint64_t) instance + 0x954) = mAgicDamage; // public Single magicDamage
}if (rAngedDamage > 1) {
*(float *) ((uint64_t) instance + 0x848) = rAngedDamage; // public Single rangedDamage
*(float *) ((uint64_t) instance + 0x84C) = rAngedDamage; // public Single rangedMultDamage
*(float *) ((uint64_t) instance + 0x958) = rAngedDamage; // public Single rangedDamage
*(float *) ((uint64_t) instance + 0x95C) = rAngedDamage;
}if (aRrowDamage > 1) {
*(float *) ((uint64_t) instance + 0x854) = aRrowDamage;
*(float *) ((uint64_t) instance + 0x964) = aRrowDamage; // public Single arrowDamage
}if (bUlletDamage > 1) {
*(float *) ((uint64_t) instance + 0x858) = bUlletDamage;
*(float *) ((uint64_t) instance + 0x968) = bUlletDamage;// public Single bulletDamage
}if (rOcketDamage > 1) {
*(float *) ((uint64_t) instance + 0x85C) = rOcketDamage;
*(float *) ((uint64_t) instance + 0x96C) = rOcketDamage; // public Single rocketDamage
}if (mInionDamage > 1) {
*(float *) ((uint64_t) instance + 0x860) = mInionDamage;
*(float *) ((uint64_t) instance + 0x970) = mInionDamage; // public Single minionDamage
}}}return old_meleeDamage(instance);} // public Single minionDamage
void *hack_thread(void *) {
LOGI(OBFUSCATE("pthread created"));
do {
sleep(1);
} while (!isLibraryLoaded(targetLibName));
/*do {
sleep(1);
} while (!isLibraryLoaded("libYOURNAME.so"));*/
LOGI(OBFUSCATE("%s has been loaded"), (const char *) targetLibName);
#if defined(__aarch64__)
/*/ class Player
A64HookFunction((void *)getAbsoluteAddress(targetLibName, 0x129F0D4), (void *)Hurt, (void **)&old_Hurt); // public double Hurt(PlayerDeathReason damageSource, int Damage, int hitDirection, bool pvp = False, bool quiet = False, bool Crit = False, int cooldownCounter = -1, bool dodgeable = True) { }
A64HookFunction((void *)getAbsoluteAddress(targetLibName, 0x12BDFD0), (void *)maxRunSpeed, (void **)&old_maxRunSpeed); // public Void HorizontalMovement() { }
A64HookFunction((void *)getAbsoluteAddress(targetLibName, 0x12C2620), (void *)jump, (void **)&old_jump); // public Void JumpMovement() { }
A64HookFunction((void *)getAbsoluteAddress(targetLibName, 0x12BD52C), (void *)jumpSpeedBoost, (void **)&old_jumpSpeedBoost); // public Void UpdateJumpHeight() { }
A64HookFunction((void *)getAbsoluteAddress(targetLibName, 0x12BAE30), (void *)statLifeMax, (void **)&old_statLifeMax); // public Void UpdateLifeRegen() { }
A64HookFunction((void *)getAbsoluteAddress(targetLibName, 0x12ED598), (void *)itemTime, (void **)&old_itemTime); // public Void LookForTileInteractions() { }
A64HookFunction((void *)getAbsoluteAddress(targetLibName, 0x12E0278), (void *)meleeSpeed, (void **)&old_meleeSpeed); // private void CapAttackSpeeds() { }
A64HookFunction((void *)getAbsoluteAddress(targetLibName, 0x1315900), (void *)wallSpeed, (void **)&old_wallSpeed); // private Void PlaceThing_Walls() { }
A64HookFunction((void *)getAbsoluteAddress(targetLibName, 0x13153B4), (void *)tileSpeed, (void **)&old_tileSpeed); // private void PlaceThing_Tiles(bool doPlacementAction) { }
A64HookFunction((void *)getAbsoluteAddress(targetLibName, 0x1349E30), (void *)IsTargetTileInItemRange, (void **)&old_IsTargetTileInItemRange); // public bool IsTargetTileInItemRange(Item sItem) { }
// class Item
A64HookFunction((void *)getAbsoluteAddress(targetLibName, 0xEC73AC), (void *)stack, (void **)&old_stack); // public Item Clone() { }
A64HookFunction((void *)getAbsoluteAddress(targetLibName, 0xEC7924), (void *)stack1, (void **)&old_stack1); // public void Refresh(bool onlyIfVariantChanged = True) { }
hexPatches.CursorRange = MemoryPatch::createWithHex(targetLibName, string2Offset(OBFUSCATE("0x13CB460")), OBFUSCATE("1E FF 2F E1"));
hexPatches.CursorRange = MemoryPatch::createWithHex(targetLibName, string2Offset(OBFUSCATE("0x13CB534")), OBFUSCATE("1E FF 2F E1"));
A64HookFunction((void *)getAbsoluteAddress(targetLibName, 0x12BD0E4), (void *)statMana, (void **)&old_statMana); // public Void UpdateManaRegen() { }
A64HookFunction((void *)getAbsoluteAddress(targetLibName, 0x1299E84), (void *)statDefense, (void **)&old_statDefense); // public void UpdateBuffs(int i) { }
A64HookFunction((void *)getAbsoluteAddress(targetLibName, 0x12B489C), (void *)maxMinions, (void **)&old_maxMinions); // public void UpdatePet(int i) { }
A64HookFunction((void *)getAbsoluteAddress(targetLibName, 0x12E0410), (void *)meleeDamage, (void **)&old_meleeDamage); // public void UpdateLuckFactors() { }*/
HOOK("0x129F0D4", Hurt, old_Hurt); // public double Hurt(PlayerDeathReason damageSource, int Damage, int hitDirection, bool pvp = False, bool quiet = False, bool Crit = False, int cooldownCounter = -1, bool dodgeable = True) { }
HOOK("0x12BDFD0", maxRunSpeed, old_maxRunSpeed); // public Void HorizontalMovement() { }
HOOK("0x12C2620", jump, old_jump); // public Void JumpMovement() { }
HOOK("0x12BD52C", jumpSpeedBoost, old_jumpSpeedBoost); // public Void UpdateJumpHeight() { }
HOOK("0x12BAE30", statLifeMax, old_statLifeMax); // public Void UpdateLifeRegen() { }
HOOK("0x12ED598", itemTime, old_itemTime); // public Void LookForTileInteractions() { }
HOOK("0x12E0278", meleeSpeed, old_meleeSpeed); // private void CapAttackSpeeds() { }
HOOK("0x1315900", wallSpeed, old_wallSpeed); // private Void PlaceThing_Walls() { }
HOOK("0x13153B4", tileSpeed, old_tileSpeed); // private void PlaceThing_Tiles(bool doPlacementAction) { }
HOOK("0x1349E30", IsTargetTileInItemRange, old_IsTargetTileInItemRange); // public bool IsTargetTileInItemRange(Item sItem) { }
// class Item
HOOK("0xEC73AC", stack, old_stack); // public Item Clone() { }
HOOK("0xEC7924", stack1, old_stack1); // public void Refresh(bool onlyIfVariantChanged = True) { }
//hexPatches.CursorRange = MemoryPatch::createWithHex(targetLibName, string2Offset(OBFUSCATE("0x13CB460")), OBFUSCATE("1E FF 2F E1"));
//hexPatches.CursorRange = MemoryPatch::createWithHex(targetLibName, string2Offset(OBFUSCATE("0x13CB534")), OBFUSCATE("1E FF 2F E1"));
HOOK("0x12BD0E4", statMana, old_statMana); // public Void UpdateManaRegen() { }
HOOK("0x1299E84", statDefense, old_statDefense); // public void UpdateBuffs(int i) { }
HOOK("0x12B489C", maxMinions, old_maxMinions); // public void UpdatePet(int i) { }
HOOK("0x12E0410", meleeDamage, old_meleeDamage); // public void UpdateLuckFactors() { }
#else
/*/ class Player
MSHookFunction((void *)getAbsoluteAddress(targetLibName, 0x13F81E8), (void *)Hurt, (void **)&old_Hurt); // public double Hurt(PlayerDeathReason damageSource, int Damage, int hitDirection, bool pvp = False, bool quiet = False, bool Crit = False, int cooldownCounter = -1, bool dodgeable = True) { }
MSHookFunction((void *)getAbsoluteAddress(targetLibName, 0x14233D0), (void *)maxRunSpeed, (void **)&old_maxRunSpeed); // public Void HorizontalMovement() { }
MSHookFunction((void *)getAbsoluteAddress(targetLibName, 0x1429580), (void *)jump, (void **)&old_jump); // public Void JumpMovement() { }
MSHookFunction((void *)getAbsoluteAddress(targetLibName, 0x1421F70), (void *)jumpSpeedBoost, (void **)&old_jumpSpeedBoost); // public Void UpdateJumpHeight() { }
MSHookFunction((void *)getAbsoluteAddress(targetLibName, 0x141EA80), (void *)statLifeMax, (void **)&old_statLifeMax); // public Void UpdateLifeRegen() { }
MSHookFunction((void *)getAbsoluteAddress(targetLibName, 0x146854C), (void *)itemTime, (void **)&old_itemTime); // public Void LookForTileInteractions() { }
MSHookFunction((void *)getAbsoluteAddress(targetLibName, 0x14551B4), (void *)meleeSpeed, (void **)&old_meleeSpeed); // private void CapAttackSpeeds() { }
MSHookFunction((void *)getAbsoluteAddress(targetLibName, 0x14A29E8), (void *)wallSpeed, (void **)&old_wallSpeed); // private Void PlaceThing_Walls() { }
MSHookFunction((void *)getAbsoluteAddress(targetLibName, 0x14A2230), (void *)tileSpeed, (void **)&old_tileSpeed); // private void PlaceThing_Tiles(bool doPlacementAction) { }
MSHookFunction((void *)getAbsoluteAddress(targetLibName, 0x14F56F8), (void *)IsTargetTileInItemRange, (void **)&old_IsTargetTileInItemRange); // public bool IsTargetTileInItemRange(Item sItem) { }
// class Item
MSHookFunction((void *)getAbsoluteAddress(targetLibName, 0xE5EF20), (void *)stack, (void **)&old_stack); // public Item Clone() { }
MSHookFunction((void *)getAbsoluteAddress(targetLibName, 0xE5F6B8), (void *)stack1, (void **)&old_stack1); // public void Refresh(bool onlyIfVariantChanged = True) { }
hexPatches.CursorRange = MemoryPatch::createWithHex(targetLibName, string2Offset(OBFUSCATE("0x13CB460")), OBFUSCATE("1E FF 2F E1"));
hexPatches.CursorRange = MemoryPatch::createWithHex(targetLibName, string2Offset(OBFUSCATE("0x13CB534")), OBFUSCATE("1E FF 2F E1"));
MSHookFunction((void *)getAbsoluteAddress(targetLibName, 0x14218F8), (void *)statMana, (void **)&old_statMana); // public Void UpdateManaRegen() { }
MSHookFunction((void *)getAbsoluteAddress(targetLibName, 0x13EEB10), (void *)statDefense, (void **)&old_statDefense); // public void UpdateBuffs(int i) { }
MSHookFunction((void *)getAbsoluteAddress(targetLibName, 0x1416028), (void *)maxMinions, (void **)&old_maxMinions); // public void UpdatePet(int i) { }
MSHookFunction((void *)getAbsoluteAddress(targetLibName, 0x14553C0), (void *)meleeDamage, (void **)&old_meleeDamage); // public void UpdateLuckFactors() { }*/
HOOK("0x13F81E8", Hurt, old_Hurt); // public double Hurt(PlayerDeathReason damageSource, int Damage, int hitDirection, bool pvp = False, bool quiet = False, bool Crit = False, int cooldownCounter = -1, bool dodgeable = True) { }
HOOK("0x14233D0", maxRunSpeed, old_maxRunSpeed); // public Void HorizontalMovement() { }
HOOK("0x1429580", jump, old_jump); // public Void JumpMovement() { }
HOOK("0x1421F70", jumpSpeedBoost, old_jumpSpeedBoost); // public Void UpdateJumpHeight() { }
HOOK("0x141EA80", statLifeMax, old_statLifeMax); // public Void UpdateLifeRegen() { }
HOOK("0x146854C", itemTime, old_itemTime); // public Void LookForTileInteractions() { }
HOOK("0x14551B4", meleeSpeed, old_meleeSpeed); // private void CapAttackSpeeds() { }
HOOK("0x14A29E8", wallSpeed, old_wallSpeed); // private Void PlaceThing_Walls() { }
HOOK("0x14A2230", tileSpeed, old_tileSpeed); // private void PlaceThing_Tiles(bool doPlacementAction) { }
HOOK("0x14F56F8", IsTargetTileInItemRange, old_IsTargetTileInItemRange); // public bool IsTargetTileInItemRange(Item sItem) { }
// class Item
HOOK("0xE5EF20", stack, old_stack); // public Item Clone() { }
HOOK("0xE5F6B8", stack1, old_stack1); // public void Refresh(bool onlyIfVariantChanged = True) { }
//hexPatches.CursorRange = MemoryPatch::createWithHex(targetLibName, string2Offset(OBFUSCATE("0x13CB460")), OBFUSCATE("1E FF 2F E1"));
//hexPatches.CursorRange = MemoryPatch::createWithHex(targetLibName, string2Offset(OBFUSCATE("0x13CB534")), OBFUSCATE("1E FF 2F E1"));
HOOK("0x14218F8", statMana, old_statMana); // public Void UpdateManaRegen() { }
HOOK("0x13EEB10", statDefense, old_statDefense); // public void UpdateBuffs(int i) { }
HOOK("0x1416028", maxMinions, old_maxMinions); // public void UpdatePet(int i) { }
HOOK("0x14553C0", meleeDamage, old_meleeDamage); // public void UpdateLuckFactors() { }
LOGI(OBFUSCATE("Done"));
#endif
return NULL;
}
extern "C" {
JNIEXPORT jobjectArray
JNICALL
Java_uk_lgl_modmenu_FloatingModMenuService_getFeatureList(JNIEnv *env, jobject context) {
jobjectArray ret;
MakeToast(env, context, OBFUSCATE("Modded by CreeperMods"), Toast::LENGTH_LONG);
const char *features[] = {
OBFUSCATE("Category_[[ PLAYER ]]"),
OBFUSCATE("0_Toggle_God Mode"),
OBFUSCATE("1_SeekBar_Movement Speed_0_100"),
OBFUSCATE("2_Toggle_Set Movement Speed"),
OBFUSCATE("3_Toggle_Infinite Jump"),
OBFUSCATE("4_SeekBar_Jump Height_0_100"),
OBFUSCATE("5_Toggle_Set Jump Height"),
OBFUSCATE("Collapse_[[ CUSTOM HEALTH ]]"),
OBFUSCATE("6_CollapseAdd_InputValue_Max Health"),
OBFUSCATE("7_CollapseAdd_Toggle_Set Max Health"),
OBFUSCATE("8_CollapseAdd_InputValue_Max Boost Health"),
OBFUSCATE("9_CollapseAdd_Toggle_Set Max Boost Health"),
OBFUSCATE("10_CollapseAdd_Button_Set Full Health"),
OBFUSCATE("Category_[[ PLAYER CAPABILITY ]]"),
OBFUSCATE("11_Toggle_Fast Breaking"),
OBFUSCATE("110_SeekBar_Swing Speed_0_15"),
OBFUSCATE("111_Toggle_Set Swing Speed"),
OBFUSCATE("12_Toggle_Fast Place Wall"),
OBFUSCATE("13_Toggle_Fast Place Block"),
OBFUSCATE("14_Toggle_Break Block Far"),
OBFUSCATE("15_SeekBar_Place Range_0_100"),
OBFUSCATE("16_Toggle_Set Place Range"),
OBFUSCATE("17_InputValue_9999_Specific Item Amount"),
OBFUSCATE("18_Toggle_Set Specific Item Amount"),
OBFUSCATE("180_InputValue_9999_Specific Item Amount Per Join"),
OBFUSCATE("181_Toggle_Set Specific Item Amount Per Join"),
//OBFUSCATE("182_Toggle_Cursor Range"),
OBFUSCATE("Category_[[ STATISTIC ]]"),
OBFUSCATE("19_InputValue_Mana"),
OBFUSCATE("20_Toggle_Set Mana"),
OBFUSCATE("21_InputValue_Defense"),
OBFUSCATE("22_Toggle_Set Defense"),
OBFUSCATE("23_InputValue_Minion"),
OBFUSCATE("24_Toggle_Set Minion"),
OBFUSCATE("Category_[[ WEAPON ]]"),
OBFUSCATE("25_InputValue_Weapon Damage"),
OBFUSCATE("26_Toggle_Set Weapon Damage"),
OBFUSCATE("Collapse_[[ CUSTOM WEAPON DAMAGE ]]"),
OBFUSCATE("27_CollapseAdd_InputValue_Melee Damage"),
OBFUSCATE("28_CollapseAdd_InputValue_Magic Damage"),
OBFUSCATE("29_CollapseAdd_InputValue_Ranged Damage"),
OBFUSCATE("30_CollapseAdd_InputValue_Arrow Damage"),
OBFUSCATE("31_CollapseAdd_InputValue_Bullet Damage"),
OBFUSCATE("32_CollapseAdd_InputValue_Rocket Damage"),
OBFUSCATE("33_CollapseAdd_InputValue_Minion Damage"),
OBFUSCATE("34_CollapseAdd_Toggle_Set Custom Damage"),
OBFUSCATE("Category_[[ LINKS ]]"),
OBFUSCATE("ButtonLink_YouTube_https://youtube.com/@creepermods4641"),
OBFUSCATE("ButtonLink_Discord_https://discord.gg/mSf9bUPmfe")
};
int Total_Feature = (sizeof features / sizeof features[0]);
ret = (jobjectArray)
env->NewObjectArray(Total_Feature, env->FindClass(OBFUSCATE("java/lang/String")),
env->NewStringUTF(""));
for (int i = 0; i < Total_Feature; i++)
env->SetObjectArrayElement(ret, i, env->NewStringUTF(features[i]));
pthread_t ptid;
pthread_create(&ptid, NULL, antiLeech, NULL);
return (ret);
}
JNIEXPORT void JNICALL
Java_uk_lgl_modmenu_Preferences_Changes(JNIEnv *env, jclass clazz, jobject obj,
jint featNum, jstring featName, jint value,
jboolean boolean, jstring str) {
LOGD(OBFUSCATE("Feature name: %d - %s | Value: = %d | Bool: = %d | Text: = %s"), featNum,
env->GetStringUTFChars(featName, 0), value,
boolean, str != NULL ? env->GetStringUTFChars(str, 0) : "");
switch (featNum) {
case 0: gMode = boolean; break;
case 1: mSpeed = value; break;
case 2: smSpeed = boolean; break;
case 3: iJump = boolean; break;
case 4: jHeight = value; break;
case 5: sJHeight = boolean; break;
case 6: mHealth = value; break;
case 7: smHealth = boolean; break;
case 8: mbHealth = value; break;
case 9: smbHealth = boolean; break;
case 10: sfHealth = true; break;
case 11: fBreaking = boolean; break;
case 110: sSpeed = value; break;
case 111: ssSpeed = boolean; break;
case 12: fpWall = boolean; break;
case 13: fpBlock = boolean; break;
case 14: bbFar = boolean; break;
case 15: pRange = value; break;
case 16: spRange = boolean; break;
case 17: sIAmount = value; break;
case 18: sSIAmount = boolean; break;
case 180: sIAPJoin = value; break;
case 181: sSIAPJoin = boolean; break;
case 182: cRange = boolean;
if (cRange == true) {
hexPatches.CursorRange.Modify();
} else {
hexPatches.CursorRange.Restore();
}
break;
case 19: mAna = value; break;
case 20: sMana = boolean; break;
case 21: dEfense = value; break;
case 22: sDefense = boolean; break;
case 23: mInion = value; break;
case 24: sMinion = boolean; break;
case 25: wDamage = value; break;
case 26: swDamage = boolean; break;
case 27: mEleeDamage = value; break;
case 28: mAgicDamage = value; break;
case 29: rAngedDamage = value; break;
case 30: aRrowDamage = value; break;
case 31: bUlletDamage = value; break;
case 32: rOcketDamage = value; break;
case 33: mInionDamage = value; break;
case 34: sCDamage = boolean; break;
}
}
}
__attribute__((constructor))
void lib_main() {
pthread_t ptid;
pthread_create(&ptid, NULL, hack_thread, NULL);
}
/*
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved) {
JNIEnv *globalEnv;
vm->GetEnv((void **) &globalEnv, JNI_VERSION_1_6);
return JNI_VERSION_1_6;
}
*/