Implementación de Clear Inventory en Muemu Season 6

Implementación de Clear Inventory en Muemu Season 6

La implementación de ‘Clear Inventory’ en Muemu Season 6 es una mejora clave para optimizar la gestión del inventario del jugador. Esta nueva funcionalidad permite a los usuarios deshacerse de objetos no deseados de manera eficiente, mejorando así la experiencia de juego.

¿Qué es ‘Clear Inventory’?

La funcionalidad ‘Clear Inventory’ proporciona a los jugadores una herramienta para limpiar su inventario rápidamente. Esto es especialmente útil en Muemu Season 6, donde la gestión del espacio es crucial para el rendimiento del juego.

Beneficios de la Implementación

  1. Mejora de la Experiencia del Jugador: Al permitir a los jugadores eliminar objetos innecesarios, se facilita una navegación más fluida en el inventario.
  2. Optimización del Rendimiento: Un inventario más limpio puede contribuir a un mejor rendimiento del juego, reduciendo la carga en el sistema.
  3. Facilidad de Uso: La interfaz intuitiva diseñada para esta funcionalidad hace que sea accesible para todos los jugadores, independientemente de su nivel de experiencia.

Cómo Funciona

La implementación se realiza a través de varias modificaciones en el código del servidor, incluyendo cambios en archivos clave como Common.cpp, Controller.cpp, y Interface.cpp. Estos cambios permiten la integración de un menú de «basura» donde los jugadores pueden gestionar sus objetos.

Conclusión

La implementación de ‘Clear Inventory’ en Muemu Season 6 es un paso significativo hacia una experiencia de juego más fluida y eficiente. Esta mejora no solo facilita la gestión del inventario, sino que también contribuye a un entorno de juego más agradable.


Descripción: La implementación de ‘Clear Inventory’ en Muemu Season 6 optimiza la gestión del inventario del jugador, mejorando la experiencia de juego con una interfaz intuitiva.

Implementación de Clear Inventory en Muemu Season 6 Implementación de Clear Inventory en Muemu Season 6

1. Configuración Inicial en stdafx.h

Primero, definimos una macro que habilitará la funcionalidad de «Clear Inventory»:

cpp

Copiar
#define	ClearIn_ventory				    1

 

2. Modificaciones en Common.cpp

En este archivo, utilizamos la macro definida para personalizar la interfaz del juego. Si ClearIn_ventory está habilitado, se establece un puntero a la imagen que se usará para la interfaz de «basura»:

cpp

Copiar
#if(ClearIn_ventory==1)
    SetDword(0x00837955 + 1, 0x7950); //-> Custom\\Interface\\newui_item_money_trash.tga
#endif

 

3. Cambios en Controller.cpp

Aquí se añaden las funciones que permiten abrir el menú de «basura» y mostrar advertencias al usuario:

cpp

Copiar
#if(ClearIn_ventory)
            //-> Clear Inventory
            gInterface.EventDrawMenuTrash_Open(wParam);
            gInterface.DrawMenuTrash_Warning_Main(wParam);
            //--
#endif

 

4. Definiciones en Importh.h

Se definen punteros a funciones que serán utilizados en el manejo de la interfaz de «basura»:

cpp

Copiar
//ClearIn_ventory
#define pChatSend				((int(__cdecl*)(LPCSTR Text)) 0x005BDE40)
//ClearIn_ventory
#define pAllowGUI					((bool(__cdecl*)()) 0x007D4250)

 

5. Configuración de la Interfaz en Interface.cpp

Se vinculan los objetos necesarios para la interfaz de «basura»:

cpp

Copiar
#if(ClearIn_ventory)

    this->BindObject(eTrash, 0x9993, 24, 24, -1, -1); //909986
    this->BindObject(eTrash_Expanded, 0x9993, 24, 24, -1, -1);

    this->BindObject(eTrash_MAIN, 0x7A5A, 222, 120, -1, -1);
    this->BindObject(eTrash_TITLE, 0x7A63, 230, 67, -1, -1);
    this->BindObject(eTrash_FRAME, 0x7A58, 230, 15, -1, -1);
    this->BindObject(eTrash_FOOTER, 0x7A59, 230, 50, -1, -1);
    this->BindObject(eTrash_YES, 0x7B12, 54, 30, -1, -1);
    this->BindObject(eTrash_NO, 0x7B0C, 54, 30, -1, -1);
#endif

 

6. Carga de Imágenes

Se cargan las imágenes necesarias para la interfaz:

cpp

Copiar
#if(ClearIn_ventory)
pLoadImage("Custom\\Interface\\Null.tga", 0x9993, 0x2601, 0x2900, 1, 0);
#endif

 

7. Dibujo del Menú de Basura

Finalmente, se dibujan los elementos del menú de «basura»:

cpp

Copiar
#if(ClearIn_ventory==1)
    pLoadImage("Custom\\Interface\\newui_item_money_trash2.tga", 0x7950, 0x2601, 0x2900, 1, 0);
#endif
#if(ClearIn_ventory)
    gInterface.DrawMenuTrash();
    gInterface.DrawMenuTrash_Warning();
#endif
#if(ClearIn_ventory)

void Interface::DrawMenuTrash()
{
    if (this->CheckWindow(ObjWindow::Warehouse))
    {
        return;
    }

    if (this->CheckWindow(ObjWindow::Inventory) && this->CheckWindow(ObjWindow::Character))
    {
        this->Data[eTrash_Expanded].OnShow = true;

        float MainWidth = 230.0;

        float MainHeight = 130.0;

        float PosX = (MAX_WIN_WIDTH / 2) - (MainWidth / 2);

        this->DrawGUI(eTrash_Expanded, PosX + 212, 365);

        if (IsWorkZone(eTrash_Expanded))
        {
            this->DrawToolTip(PosX + 164, 350, "Limpar Inventário");
        }
    }

    if (this->CheckWindow(ObjWindow::Inventory))
    {
        if (this->CheckWindow(ObjWindow::Character))
        {
            return;
        }

        else
        {
            this->Data[eTrash].OnShow = true;

            float MainWidth = 230.0;

            float MainHeight = 130.0;

            float PosX = (MAX_WIN_WIDTH / 2) - (MainWidth / 2);

            this->DrawGUI(eTrash, PosX + 400, 365);

            if (IsWorkZone(eTrash))
            {
                this->DrawToolTip(PosX + 364, 350, "Limpar Inventário");
            }
        }
    }
}

bool Interface::EventDrawMenuTrash_Open(DWORD Event)
{
    if (this->CheckWindow(ObjWindow::Warehouse))
    {
        return false;
    }

    if (this->CheckWindow(ObjWindow::Inventory) && this->CheckWindow(ObjWindow::Character))
    {
        DWORD CurrentTick = GetTickCount();
        DWORD Delay = (CurrentTick - this->Data[eTrash_Expanded].EventTick);

        if (!this->CheckWindow(ObjWindow::Inventory) && this->CheckWindow(ObjWindow::Character) || !IsWorkZone(eTrash_Expanded))
        {
            return false;
        }

        if (Event == WM_LBUTTONDOWN)
        {
            this->Data[eTrash_Expanded].OnClick = true;
            pSetCursorFocus = true;
            return true;
        }

        this->Data[eTrash_Expanded].OnClick = false;
        pSetCursorFocus = false;

        if (Delay < 500)
        {
            return false;
        }

        this->Data[eTrash_Expanded].EventTick = GetTickCount();

        gInterface.OpenTrashWindow();
    }

    if (this->CheckWindow(ObjWindow::Inventory))
    {
        if (this->CheckWindow(ObjWindow::Character))
        {
            return false;
        }

        else
        {
            DWORD CurrentTick = GetTickCount();
            DWORD Delay = (CurrentTick - this->Data[eTrash].EventTick);

            if (!this->CheckWindow(ObjWindow::Inventory) || !IsWorkZone(eTrash))
            {
                return false;
            }

            if (Event == WM_LBUTTONDOWN)
            {
                this->Data[eTrash].OnClick = true;
                pSetCursorFocus = true;
                return true;
            }

            this->Data[eTrash].OnClick = false;
            pSetCursorFocus = false;

            if (Delay < 500)
            {
                return false;
            }

            this->Data[eTrash].EventTick = GetTickCount();

            gInterface.OpenTrashWindow();
        }
    }

    return true;
}

void Interface::DrawMenuTrash_Warning()
{
    if (this->Data[eTrash_MAIN].OnShow)
    {
        pSetCursorFocus = true;
    }

    if (!this->Data[eTrash_MAIN].OnShow)
    {
        return;
    }

    float MainWidth = 230.0;
    float MainHeight = 313.0;
    float StartY = 80.0;
    float StartX = (MAX_WIN_WIDTH / 2) - (MainWidth / 2);
    float MainCenter = StartX + (MainWidth / 3);
    float ButtonX = MainCenter - (29.0 / 2);

    this->DrawGUI(eTrash_MAIN, StartX, StartY + 2);
    this->DrawGUI(eTrash_MAIN, StartX, StartY + 17);
    this->DrawGUI(eTrash_TITLE, StartX, StartY);
    this->DrawGUI(eTrash_FRAME, StartX, StartY + 67);
    this->DrawGUI(eTrash_FRAME, StartX, StartY + 80);
    this->DrawGUI(eTrash_FOOTER, StartX, StartY + 95);

    this->DrawFormat(eGold, StartX + 10, 90, 210, 3, "Limpiar Inventario");

    this->DrawFormat(eRed, StartX + 10, 115, 210, 3, "¡¡¡ATENCIÓN!!!");

    this->DrawFormat(eGold, StartX + 10, 130, 210, 3, "Ejecutar esta función hará que todos los artículos de ");
    this->DrawFormat(eGold, StartX + 10, 141, 210, 3, "su inventario se eliminen permanentemente del juego.");

    this->DrawFormat(eWhite, StartX + 10, 156, 210, 3, "¿Está seguro de que desea Limpiar el Inventario?");

    this->DrawGUI(eTrash_YES, StartX + 30, StartY + 95);
    this->DrawGUI(eTrash_NO, StartX + 140, StartY + 95);
}

bool Interface::DrawMenuTrash_Warning_Main(DWORD Event)
{
    this->DrawMenuTrash_Warning_Yes(Event);
    this->DrawMenuTrash_Warning_No(Event);
    return true;
}

bool Interface::DrawMenuTrash_Warning_Yes(DWORD Event)
{
    DWORD CurrentTick = GetTickCount();
    DWORD Delay = (CurrentTick - this->Data[eTrash_YES].EventTick);

    if (!this->Data[eTrash_MAIN].OnShow || !IsWorkZone(eTrash_YES))
    {
        return false;
    }

    if (Event == WM_LBUTTONDOWN)
    {
        this->Data[eTrash_YES].OnClick = true;
        pSetCursorFocus = true;
        return true;
    }

    this->Data[eTrash_YES].OnClick = false;
    pSetCursorFocus = false;

    if (Delay < 500)
    {
        return false;
    }

    pChatSend("/limparinv"); //Here you change command syntax

    this->CloseTrashWindow();

    return false;
}

bool Interface::DrawMenuTrash_Warning_No(DWORD Event)
{
    DWORD CurrentTick = GetTickCount();
    DWORD Delay = (CurrentTick - this->Data[eTrash_NO].EventTick);

    if (!this->Data[eTrash_MAIN].OnShow || !IsWorkZone(eTrash_NO))
    {
        return false;
    }

    if (Event == WM_LBUTTONDOWN)
    {
        pSetCursorFocus = true;
        this->Data[eTrash_NO].OnClick = true;
        return true;
    }

    this->Data[eTrash_NO].OnClick = false;

    pSetCursorFocus = false;

    if (Delay < 500)
    {
        return false;
    }

    this->Data[eTrash_NO].EventTick = GetTickCount();

    this->CloseTrashWindow();

    return false;
}
//--
//--
#endif

 

8. Definiciones en interface.h

Aquí se definen las enumeraciones y métodos relacionados con la funcionalidad de «basura»:

cpp

Copiar
#if(ClearIn_ventory)
    eTrash,
    eTrash_Expanded,
    eTrash_MAIN,
    eTrash_TITLE,
    eTrash_FRAME,
    eTrash_FOOTER,
    eTrash_YES,
    eTrash_NO,
#endif

 

#if(ClearIn_ventory)
    //-> Clear Inventory
    void		DrawMenuTrash();
    bool		EventDrawMenuTrash_Open(DWORD Event);
    void		DrawMenuTrash_Warning();
    bool		DrawMenuTrash_Warning_Main(DWORD Event);
    bool		DrawMenuTrash_Warning_Yes(DWORD Event);
    bool		DrawMenuTrash_Warning_No(DWORD Event);
    void		OpenTrashWindow() { this->Data[eTrash_MAIN].OnShow = true; pSetCursorFocus = true; };
    void		CloseTrashWindow() { this->Data[eTrash_MAIN].OnShow = false; pSetCursorFocus = false; };
    bool		CheckTrashWindow() { return this->Data[eTrash_MAIN].OnShow; };
    //--
#endif

 


Conclusión

Con estas modificaciones, hemos implementado con éxito la funcionalidad de «Clear Inventory» en Muemu Season 6. Esta característica mejora la experiencia del usuario al permitir una gestión más eficiente del inventario. Si tienes preguntas o necesitas más información sobre la implementación, no dudes en preguntar.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *