Начинающий
- Статус
- Оффлайн
- Регистрация
- 25 Ноя 2024
- Сообщения
- 174
- Реакции
- 1
Написал утилки для инвентаря- >
perka : + -> после идет краш
Utils:
//Inventory
jobject GetEnderEyeItem(JNIEnv* env) {
jclass itemsClass = env->FindClass("dcz");
jfieldID fieldId = env->GetStaticFieldID(itemsClass, "tR", "Ldcr;");
return env->GetStaticObjectField(itemsClass, fieldId);
}
jobject GetCooldownManager(JNIEnv* env, jobject player) {
jclass playerClass = env->FindClass("cut");
jfieldID fieldId = env->GetFieldID(playerClass, "cY", "Ldcs;");
return env->GetObjectField(player, fieldId);
}
bool IsItemOnCooldown(JNIEnv* env, jobject cooldownManager, jobject itemStack) {
jclass cdClass = env->FindClass("dcs");
jmethodID methodId = env->GetMethodID(cdClass, "a", "(Ldcv;)Z");
return env->CallBooleanMethod(cooldownManager, methodId, itemStack);
}
float GetCooldownProgress(JNIEnv* env, jobject cooldownManager, jobject itemStack, float tickProgress) {
jclass cdClass = env->FindClass("dcs");
jmethodID methodId = env->GetMethodID(cdClass, "a", "(Ldcv;F)F");
return env->CallFloatMethod(cooldownManager, methodId, itemStack, tickProgress);
}
int FindItemSlot(JNIEnv* env, jobject player, jobject targetItem) {
jclass playerClass = env->FindClass("cut");
jfieldID invField = env->GetFieldID(playerClass, "cl", "Lcus;");
jobject inventory = env->GetObjectField(player, invField);
jclass invClass = env->FindClass("cus");
jmethodID getStackMid = env->GetMethodID(invClass, "a", "(I)Ldcv;");
jclass stackClass = env->FindClass("dcv");
jmethodID getItemMid = env->GetMethodID(stackClass, "g", "()Ldcr;");
for (int i = 0; i < 36; i++) {
jobject itemStack = env->CallObjectMethod(inventory, getStackMid, i);
if (itemStack) {
jobject currentItem = env->CallObjectMethod(itemStack, getItemMid);
if (env->IsSameObject(currentItem, targetItem)) {
env->DeleteLocalRef(currentItem);
env->DeleteLocalRef(itemStack);
env->DeleteLocalRef(inventory);
return i;
}
env->DeleteLocalRef(currentItem);
env->DeleteLocalRef(itemStack);
}
}
env->DeleteLocalRef(inventory);
return -1;
}
void SetSelectedSlot(JNIEnv* env, jobject player, int slot) {
jclass playerClass = env->FindClass("cut");
jfieldID invField = env->GetFieldID(playerClass, "cl", "Lcus;");
jobject inventory = env->GetObjectField(player, invField);
jclass invClass = env->FindClass("cus");
jfieldID selectedSlotField = env->GetFieldID(invClass, "l", "I");
env->SetIntField(inventory, selectedSlotField, slot);
env->DeleteLocalRef(inventory);
}
jobject UseItem(JNIEnv* env, jobject mc, jobject player, bool offHand) {
jclass mcClass = env->FindClass("fue");
jfieldID imField = env->GetFieldID(mcClass, "u", "Lgru;");
jobject interactionManager = env->GetObjectField(mc, imField);
jclass handClass = env->FindClass("bxi");
jfieldID handFid = env->GetStaticFieldID(handClass, offHand ? "b" : "a", "Lbxi;");
jobject hand = env->GetStaticObjectField(handClass, handFid);
jclass imClass = env->FindClass("gru");
jmethodID interactMid = env->GetMethodID(imClass, "a", "(Lcut;Lbxi;)Lbxj;");
jobject result = env->CallObjectMethod(interactionManager, interactMid, player, hand);
env->DeleteLocalRef(interactionManager);
env->DeleteLocalRef(hand);
return result;
}
void ClickSlot(JNIEnv* env, jobject mc, int syncId, int slotId, int button, int actionTypeIdx, jobject player) {
jclass mcClass = env->FindClass("fue");
jfieldID imField = env->GetFieldID(mcClass, "u", "Lgru;");
jobject interactionManager = env->GetObjectField(mc, imField);
jclass actionTypeClass = env->FindClass("cyx");
jobjectArray valuesMethod = (jobjectArray)env->CallStaticObjectMethod(actionTypeClass, env->GetStaticMethodID(actionTypeClass, "values", "()[Lcyx;"));
jobject actionType = env->GetObjectArrayElement(valuesMethod, actionTypeIdx);
jclass imClass = env->FindClass("gru");
jmethodID clickMid = env->GetMethodID(imClass, "a", "(IIILcyx;Lcut;)V");
env->CallVoidMethod(interactionManager, clickMid, syncId, slotId, button, actionType, player);
env->DeleteLocalRef(interactionManager);
env->DeleteLocalRef(actionType);
env->DeleteLocalRef(valuesMethod);
}
int GetSyncId(JNIEnv* env, jobject player) {
jclass playerClass = env->FindClass("cut");
jfieldID handlerField = env->GetFieldID(playerClass, "bR", "Lcyi;");
jobject screenHandler = env->GetObjectField(player, handlerField);
jclass handlerClass = env->FindClass("cyi");
jfieldID syncIdField = env->GetFieldID(handlerClass, "k", "I");
int id = env->GetIntField(screenHandler, syncIdField);
env->DeleteLocalRef(screenHandler);
return id;
}
Тест:
void onEnable() override {
JNIEnv* env = GetJNIEnv();
if (!env) return;
jobject mc = getInstance(env);
jobject player = Player(env);
if (!player) {
return;
}
jobject enderEye = GetEnderEyeItem(env);
cout << "perka : " << (enderEye ? "+" : "-") << " (0x : " << enderEye << ")" << endl;
if (enderEye) {
int slot = FindItemSlot(env, player, enderEye);
if (slot != -1) {
cout << "item in : " << slot << endl;
jclass playerClass = env->GetObjectClass(player);
jfieldID invField = env->GetFieldID(playerClass, "cl", "Lcus;");
jobject inventory = env->GetObjectField(player, invField);
jmethodID getStackMid = env->GetMethodID(env->FindClass("cus"), "a", "(I)Ldcv;");
jobject stack = env->CallObjectMethod(inventory, getStackMid, slot);
jobject cdManager = GetCooldownManager(env, player);
if (cdManager && stack) {
bool onCd = IsItemOnCooldown(env, cdManager, stack);
float progress = GetCooldownProgress(env, cdManager, stack, 0.0f);
cout << "CoolDownManager good" << endl;
cout << "in cd" << (onCd ? "1" : "0") << endl;
cout << "cooldown - > " << progress << endl;
}
int sId = GetSyncId(env, player);
cout << "SyncID is -> " << sId << endl;
env->DeleteLocalRef(inventory);
env->DeleteLocalRef(stack);
if (cdManager) env->DeleteLocalRef(cdManager);
}
else {
cout << "! in inventory " << endl;
}
}
if (enderEye) env->DeleteLocalRef(enderEye);
env->DeleteLocalRef(player);
env->DeleteLocalRef(mc);
}
perka : + -> после идет краш