FIX Retiro en el Banco de Ítems Personalizados MUEMU - S6.E15 GamingMaster - 2025 - Source Mu - Mu Server Files
 

FIX Retiro en el Banco de Ítems Personalizados MUEMU - S6.E15 GamingMaster - 2025

Publicado por Dakosmu, Nov 07, 2025, 03:25 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Dakosmu

🏦 FIX CRÍTICO: Bug de Depósito/Retiro en el Banco de Ítems Personalizados MUEMU - S6.E15 GamingMaster - 2025

¡Atención, administradores y desarrolladores de Base Pike 4.3!

Se ha identificado un bug de lógica crítica en la función que gestiona las transacciones (depósito/retiro) del banco de ítems personalizados o joyas (BankItem), impidiendo que los ítems sean depositados correctamente si es la primera vez que se depositan.



🔍 DETALLES DEL BUG: Ítems Nuevos no se Depositan

  • Descripción del Problema: Si un jugador intentaba depositar un ítem por primera vez en el Banco de Ítems Personalizados, la operación fallaba o el ítem no se registraba en una nueva ranura.
  • Causa Raíz: La función CongTruBank estaba diseñada para iterar solo sobre los ítems que ya existían en el banco del usuario (buscando coincidencias para aumentar el contador). Si el ítem no existía, el bucle terminaba sin usar una ranura vacía (ItemIndex == -1) para registrar el nuevo depósito.



💻 SOLUCIÓN TÉCNICA (Fix.cpp / BCustomItemBank.cpp)

La corrección se aplica dentro del bucle de iteración de la función BCustomItemBank::CongTruBank. Debemos mover el chequeo de si es un ítem válido (mSlot != -1) y buscar una ranura para depósito fuera del chequeo inicial o realizar una gestión más limpia de las ranuras.

Código Original que Contenía el Bug:
(Fragmento afectado dentro de la función)

    for (int n = 0; n < 100; n++)
    {
        if (gObj[aIndex].BankJewelData[n].ItemIndex == -1) continue; // Si es -1 (vacío), lo ignora y pasa al siguiente. ¡ERROR!

        int mSlot = this->CheckInfoListItemBank(ItemIndex, ItemLevel);
        if (mSlot == -1) continue;

        if (gObj[aIndex].BankJewelData[n].ItemIndex == ItemIndex &&
            gObj[aIndex].BankJewelData[n].ItemLevel == ItemLevel)
        {
            // Lógica de Suma/Resta...

Lógica de Corrección (Explicación):
Cuando el bucle encuentra una ranura vacía (ItemIndex == -1), esta ranura debe ser usada para registrar el nuevo ítem si es que aún no existe en el banco del usuario. Alternativamente, si el bucle termina sin encontrar el ítem, se debe agregar el nuevo ítem en la primera ranura vacía disponible.

La manera más efectiva de corregir esto es implementar un segundo bucle (o mover la lógica de búsqueda de ranura vacía) que se ejecute después del bucle principal, si el ítem no fue encontrado. O, más simple: **Mover la lógica de búsqueda de ranura vacía fuera del bucle de coincidencias y usarla si no se encuentra un ítem existente.**



✅ CRÉDITOS

Créditos por el análisis y la solución del problema:
truongtienhp

Descarga del Parche/Cliente Actualizado:
Regístrate para ver el enlace



¡Aplica este fix lo antes posible para evitar problemas en las transacciones del banco de ítems!
Bon Dia

Dakosmu

bool BCustomItemBank::CongTruBank(int aIndex, int ItemIndex, int ItemLevel, int Vaule)
{
    if (gObj[aIndex].Type != OBJECT_USER || Vaule == 0)
    {
        return false;
    }

    if (gObjIsConnected(aIndex) == false)
    {
        return false;
    }

    if (gObj[aIndex].IsBot >= 1 || gObj[aIndex].m_OfflineMode != 0 /*|| gObj[aIndex].IsFakeOnline != 0*/)
    {
        return false;
    }

    if (!this->Enable)
    {
        return false;
    }

    for (int n = 0; n < 100; n++)
    {
        if (gObj[aIndex].BankJewelData[n].ItemIndex == -1) continue;

        int mSlot = this->CheckInfoListItemBank(ItemIndex, ItemLevel);
        if (mSlot == -1) continue;

        if (gObj[aIndex].BankJewelData[n].ItemIndex == ItemIndex &&
            gObj[aIndex].BankJewelData[n].ItemLevel == ItemLevel)
        {
            int beforeCount = gObj[aIndex].BankJewelData[n].ItemCount; // Số dư trước

            if (Vaule > 0) // Gửi vào ngân hàng
            {
                if ((Vaule + beforeCount) > this->mListItemBank[mSlot].MaxCountType[gObj[aIndex].AccountLevel])
                {
                    gNotice.GCNoticeSend(aIndex, 1, 0, 0, 0, 0, 0,
                        this->GetMessage(3),
                        gItemLevel.GetItemName(this->mListItemBank[mSlot].ItemIndex, this->mListItemBank[mSlot].ItemLevel),
                        this->mListItemBank[mSlot].MaxCountType[gObj[aIndex].AccountLevel]);
                    return false;
                }

                gObj[aIndex].BankJewelData[n].ItemCount += Vaule;

                gNotice.GCNoticeSend(aIndex, 1, 0, 0, 0, 0, 0,
                    this->GetMessage(4), Vaule,
                    gItemLevel.GetItemName(ItemIndex, ItemLevel));
            }
            else if (Vaule < 0) // Rút từ ngân hàng
            {
                if ((beforeCount + Vaule) < 0)
                {
                    gNotice.GCNoticeSend(aIndex, 1, 0, 0, 0, 0, 0,
                        this->GetMessage(2));
                    return false;
                }

                gObj[aIndex].BankJewelData[n].ItemCount += Vaule;

                gNotice.GCNoticeSend(aIndex, 1, 0, 0, 0, 0, 0,
                    this->GetMessage(5), Vaule,
                    gItemLevel.GetItemName(ItemIndex, ItemLevel));
            }

            int afterCount = gObj[aIndex].BankJewelData[n].ItemCount; // Số dư sau

            // ===== Lưu DB ngay sau khi thay đổi =====
            this->GSSendDSSaveDataUser(aIndex);

            // Gửi thông tin mới về client
            this->UserSendClientInfo(aIndex);

            return true;
        }
    }

    return false;
}
Bon Dia

🡱 🡳
Real Time Web Analytics