WhatsApp Discord
Source Main 5.2: Sistema de Registro In-Game (Client Side) - Source Mu - Mu Server Files
 

Source Main 5.2: Sistema de Registro In-Game (Client Side)

Publicado por Dakosmu, Abr 01, 2026, 02:36 AM

Tema anterior - Siguiente tema

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

Dakosmu

Source Main 5.2: Sistema de Registro In-Game (Client Side)

Regístrate para ver el enlace

¡Hola a todos! Hoy les traigo una guía técnica detallada para integrar un sistema de Registro de Cuentas directamente desde el Main en servidores MU Online (específicamente compatible con Source 5.2 Pegasus y similares). Con este sistema, sus jugadores podrán crear sus cuentas sin salir del juego, mejorando la experiencia de usuario y la retención.

Este sistema incluye validaciones de seguridad, soporte para 7 dígitos de seguridad, número telefónico y un sistema de Captcha para evitar el spam de cuentas.

REQUISITOS PREVIOS
  • Tener acceso a los archivos CB_DangKyInGame.cpp y CB_DangKyInGame.h.
  • Conocimientos básicos en C++ y manejo de estructuras de paquetes (Protocol.h).
  • Tener definido el ID de textura Bitmap_button_register en su proyecto.

PASOS PARA LA INTEGRACIÓN

  • Habilitar el Módulo:
    En tu archivo Defined_Global.h, agrega la siguiente línea para activar la compilación del sistema:
    #define CB_DANGKYINGAME  1
  • Registrar la Ventana en la Interfaz:
    Busca en CBInterface.h el bloque de enums de ventanas y añade:
    #if(CB_DANGKYINGAME)
    eWindow_DangKyInGame,
    #endif
  • Configurar el Protocolo de Comunicación:
    En Protocol.h, asegúrate de tener el struct para manejar las respuestas del servidor:
    struct XULY_CGPACKET
    {
    PSBMSG_HEAD header;
    DWORD ThaoTac;
    };
  • Manejo de Paquetes (Recv):
    En Protocol.cpp, dentro del switch del opcode 0xD3, agrega el caso 0x05 para recibir la respuesta del registro:
    case 0xD3:
    switch (((lpMsg[0] == 0xC1) ? lpMsg[3] : lpMsg[4]))
    {
    #if(CB_DANGKYINGAME)
    case 0x05:
    gCB_DangKyInGame->RecvKQRegInGame((XULY_CGPACKET*)lpMsg);
    break;
    #endif
    }
  • Integración en la Pantalla de Login:
    Para que aparezca el botón, debes modificar LoginWin.cpp y LoginWin.h siguiendo la guía de posicionamiento (X: +60, Y: +178 aproximadamente).

ESTRUCTURA DEL PAQUETE (SERVIDOR)
El Main enviará un paquete C1 D3 05 con la siguiente estructura al GameServer/ConnectServer:

struct PMSG_REGISTER_MAIN_SEND {
PSBMSG_HEAD header;  // C1:D3:05
BYTE TypeSend;      // 0x01
char account[11];    // Máx 10 caracteres
char password[21];  // Máx 20 caracteres
char numcode[8];    // 7 dígitos de seguridad
char sodienthoai[14];// Número de teléfono
};

DESCARGAR
CPP Regístrate para ver el enlace
H Regístrate para ver el enlace

El servidor debe responder con el opcode C3 D3 05 enviando en el campo ThaoTac: 1 (Éxito), 2 (Cuenta duplicada) o 3 (Datos inválidos).

¡Listo! Con esto el sistema de registro quedará funcional. Los campos de texto ya vienen configurados para bloquear caracteres especiales en la cuenta y permitir solo números en el teléfono y código secreto.

Si tu source no cuenta con el sistema de Captcha en CBInterface, el botón "Confirm" dará error. Asegúrate de portar las funciones generateCaptcha y check_Captcha antes de compilar.
Bon Dia

Dakosmu

ARCHIVOS BASE REQUERIDOS:
  • CB_DangKyInGame.cpp (Lógica y Renderizado)
  • CB_DangKyInGame.h (Definiciones y Estructuras)

PASO 0 — Carga de Texturas (Indispensable)
Si no declaras el ID de la imagen, el botón no aparecerá o el cliente se cerrará.
En Interface.cpp, dentro de LoadImages():
// Asegúrate de que la ruta del archivo sea correcta en tu carpeta Data
LoadBitmap("Interface\Custom\btn_register.tga", Bitmap_button_register, GL_LINEAR, GL_CLAMP, 1, 0);

PASO 1 — Configuración Global
En Defined_Global.h:
#define CB_DANGKYINGAME    1

PASO 2 — Definición de Ventana
En CBInterface.h, busca eBeginWindowCustom:
#if(CB_DANGKYINGAME)
eWindow_DangKyInGame,
#endif

PASO 3 — Protocolo de Comunicación
En Protocol.h agrega el struct para recibir la respuesta del servidor:
struct XULY_CGPACKET
{
PSBMSG_HEAD header;
DWORD ThaoTac;
};

En Protocol.cpp, registra el manejador del paquete:
#include "CB_DangKyInGame.h"

// Dentro del Switch de OpCode 0xD3
case 0xD3:
switch (((lpMsg[0] == 0xC1) ? lpMsg[3] : lpMsg[4]))
{
#if(CB_DANGKYINGAME)
case 0x05:
gCB_DangKyInGame->RecvKQRegInGame((XULY_CGPACKET*)lpMsg);
break;
#endif
}
break;

PASO 4 — Modificación de la Interfaz de Login

En LoginWin.h:
#if(CB_DANGKYINGAME)
CButton m_DangKy;
#endif

En LoginWin.cpp:

PASO 5 — Lógica de Control y Bloqueo
En LoginWin.cpp, dentro de UpdateWhileActive(), evita que el usuario intente loguear mientras se registra:
#if(CB_DANGKYINGAME)
if (gInterface->Data[eWindow_DangKyInGame].OnShow)
{
return; // Bloquea inputs de la pantalla de login
}
#endif

Manejador del Click del botón:
#if(CB_DANGKYINGAME)
else if (m_DangKy.IsClick())
{
if (gCB_DangKyInGame) gCB_DangKyInGame->OpenOnOff();
}
#endif

ESTRUCTURA DEL PAQUETE AL SERVIDOR
struct PMSG_REGISTER_MAIN_SEND
{
PSBMSG_HEAD header;  // C1:D3:05
BYTE TypeSend;       // = 0x01
char account[11];    // Usuario
char password[21];   // Clave
char numcode[8];     // Pin Seguridad
char sodienthoai[14];// Teléfono
};

TABLA DE RESPUESTAS (Server -> Client)
  • Valor 1: ¡Cuenta Creada!
  • Valor 2: La cuenta ya existe.
  • Valor 3: Error en los datos enviados.

IMPORTANTE: Si el sistema de Captcha no existe en tu CBInterface, el botón de registro no enviará los datos. Debes portar las funciones generateCaptcha y check_Captcha para que el sistema esté al 100%.
Bon Dia

🡱 🡳
Real Time Web Analytics