Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос [РЕШЕНО] JNI | C++ 17 | 1.21.8 VANILLA | Inventory

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
25 Ноя 2024
Сообщения
174
Реакции
1
Написал утилки для инвентаря- >


Utils:
Expand Collapse Copy
//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;
}

Тест:
Expand Collapse Copy
 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 : + -> после идет краш
 
Мне кажется у мя с маппингами что то не так, так как я беру маппинги с 1 build 1.21.8 ->
Пожалуйста, авторизуйтесь для просмотра ссылки.
, а legacy launcher скачал мне ластовый билд. Мб есть какие то утилки, которые вытащат маппинги из джарки моей версии?



PS маппинги не правильные были, вот нужные ->
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
Назад
Сверху Снизу