Guía Rápida: Implementación de Fix Post Item y Jewel Bank (Base Pike 4.3) - Source Mu - Mu Server Files
 

Guía Rápida: Implementación de Fix Post Item y Jewel Bank (Base Pike 4.3)

Publicado por Dakosmu, Nov 04, 2025, 02:03 PM

Tema anterior - Siguiente tema

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

Dakosmu

🛠� Guía Rápida: Implementación de Fix Post Item y Jewel Bank (Base Pike 4.3)

Esta guía explica la modificación del código fuente del cliente (Cliente Source) para implementar el "Post Item" mediante CTRL + Clic Derecho y el "Jewel Bank" mediante Clic Derecho en el inventario.

🎯 Objetivos de la Modificación

La implementación se centra en interceptar la función que renderiza el tooltip del ítem para añadir funcionalidades rápidas:

  • Post Item: Publicar un ítem en el chat rápidamente. (CTRL + Clic Derecho)
  • Jewel Bank: Depositar una Joya directamente al Banco de Joyas. (Clic Derecho)

⚙️ Paso a Paso: Modificación del Código Fuente del Cliente

  • 1. Implementar la Lógica en post_item.cpp
Añade o reemplaza la función `HookRenderItemToolTip` para que intercepte la interacción del clic derecho. El código maneja el cálculo del `uniqId` (identificador único del ítem y su ubicación) y revisa las combinaciones de teclas.

CÓDIGO A USAR EN post_item.cpp:
void HookRenderItemToolTip(int a1)
{
    ((void(__cdecl*)()) 0x007DCF20)();
    lpItemObj item = (lpItemObj) * (DWORD*)(a1 + 84);

    if (gInterface.CheckWindow(8))
    {
        return;
    }

    DWORD uniqId = 0;
    if (item)
    {
        int pos = -1;
        if (a1 == *(DWORD*)(*(DWORD*)0x098670B8 + 0x18))
        {
            uniqId = item->UniqueID;
        }
        else if (a1 == *(DWORD*)(*(DWORD*)0x098670B8 + 0x1C))
        {
            uniqId = item->UniqueID + 0x10000000;
        }
        else if (a1 == *(DWORD*)(*(DWORD*)0x098670B8 + 0x20))
        {
            uniqId = item->UniqueID + 0x20000000;
        }

        // === CTRL + Right click = Post item ===
        if (pIsKeyRelease(VK_RBUTTON) && pIsKeyRepeat(VK_CONTROL))
        {
            JCItemPublic.PostItemProc(uniqId);
            return;
        }

        // === Right click = Jewel Bank ===
        if (GetKeyState(VK_RBUTTON) & 0x8000)
        {
            // panel: normal / expanded / 2nd inventory
            int panel = *(DWORD*)(a1 + 44);

           
            if (panel == 200 || panel == 44 || panel == 131)
            {
                int start = (panel == 200) ? 12 : (panel == 44) ? 76 : 108;
                int Slot = item->PosX + (item->PosY * 8) + start;

                gCustomJewelBank.JewelBankSend(Slot);
                return;
            }
        }

        // === Default Right click = move / equip etc ===
        if (!pIsKeyRepeat(VK_CONTROL))
        {
            JCItemPublic.CDActionItem(item);
            return;
        }
    }
}

  • 2. Ajustar la Implementación de Jewel Bank (CustomJewelBank.cpp)
Asegúrate de que la lógica de tu `Jewel Bank` esté correctamente enlazada. Nota que la función `InvetoryItemOver` puede ser un hook alternativo. En este caso, el código original desactiva el hook secundario, confiando en el principal en `post_item.cpp`.

CÓDIGO DE CustomJewelBank.cpp (Referencia):
void CCustomJewelBank::Load()
{
    //SetCompleteHook(0xE8, 0x007DD0D9, &InvetoryItemOver); // El hook está comentado, confiando en post_item.cpp
}

void InvetoryItemOver(int This)
{
    lpItemObj item = (lpItemObj) * (DWORD*)(This + 84);

    if (item)
    {
       
        if (GetKeyState(VK_RBUTTON) & 0x8000)
        {
            int start = 12;
            if (*(DWORD*)(This + 44) == 200)
            {
                start = 12;
            }
            else if (*(DWORD*)(This + 44) == 44)
            {
                start = 76;
            }
            else if (*(DWORD*)(This + 44) == 131)
            {
                start = 108;
            }

            int Slot = item->PosX + (item->PosY * 8) + start;
            gCustomJewelBank.JewelBankSend(Slot);
        }
    }

    ((void(__thiscall*)(int))0x007DCF20)(This);
}

  • 3. Compilación y Despliegue
Una vez aplicados los cambios en los archivos `.cpp`, es necesario recompilar la solución del cliente para generar el ejecutable actualizado con el nuevo comportamiento.
[/list]

🖼� Ejemplo en el Cliente


Visualización de un ítem publicado en el chat después de usar CTRL + Clic Derecho.

⬇️ Descargas y Recursos

Link para Descarga del Source Completo (Base Pike 4.3):
Regístrate para ver el enlace
Bon Dia

🡱 🡳
Real Time Web Analytics