[SOURCE 5.2 BASE] Registro In-Game Multilenguaje - Source Mu - Mu Server Files
 

[SOURCE 5.2 BASE] Registro In-Game Multilenguaje

Publicado por Dakosmu, Mar 15, 2026, 05:21 PM

Tema anterior - Siguiente tema

0 Miembros y 2 Visitantes están viendo este tema.

Dakosmu

[SOURCE 5.2 BASE] Registro In-Game Multilenguaje


Para los que buscamos un servidor profesional y detallista, dejar los textos "hardcoded" (fijos en el código) no es una opción. En esta primera parte, adaptaremos el sistema de registro para que cargue todos sus textos desde el TextClien, permitiendo que si tu servidor es español/inglés/portugués, la interfaz cambie automáticamente.



Novedades de esta Versión:
  • Sistema de Índices (RGIG): Centraliza todos los mensajes (errores, etiquetas, botones) en un Enum para facilitar el mantenimiento.
  • Validación Robusta: Controla que la cuenta tenga mínimo 4 caracteres y el password 6.
  • Formateo de Mensajes: Uso de sprintf para mostrar mensajes dinámicos, como el tiempo de espera (cooldown) restante.
  • Auto-Login Post-Registro: Si el registro es exitoso, el sistema rellena automáticamente el ID y el Pass en la ventana de Login.

Este código requiere que tengas definida la clase gTextClien en tu proyecto para la lectura de los strings multilenguaje.



Implementación (CB_DangKyInGame.cpp)

A continuación, el núcleo del sistema de registro. Este archivo maneja desde el renderizado de las cajas de texto hasta la lógica de envío de paquetes.

#include "StdAfx.h"
#include "CB_DangKyInGame.h"
#include "NewUISystem.h"
#include "CBInterface.h"
// ... (resto de includes de tu proyecto)

// Enumeración para el control de textos en múltiples idiomas
enum RGIG_TEXT_INDEX {
RGIG_TITLE = 0,                   // "Registro de Cuenta"
RGIG_ACCOUNT_LABEL = 1,           // "cuenta"
RGIG_PASSWORD_LABEL = 2,          // "Clave"
RGIG_CAPTCHA_CODE_LABEL = 3,      // "Captshap codigo"
RGIG_ACCOUNT_RULES_NOTICE = 6,    // Mensaje de reglas de cuenta
RGIG_CONFIRM_BUTTON = 8,          // Botón Confirmar
RGIG_ERROR_TITLE = 9,             // Título de error
RGIG_INCORRECT_CAPTCHA = 10,      // Captcha incorrecto
RGIG_PLEASE_WAIT = 11,            // Esperar X segundos
RGIG_ACCOUNT_MIN_LENGTH = 12,     // Cuenta mínimo 4 caracteres
RGIG_PASSWORD_MIN_LENGTH = 13,    // Contraseña mínimo 6 caracteres
RGIG_EXACTLY_7_DIGITS = 14,       // Exactamente 7 dígitos
RGIG_PHONE_LENGTH_REQUIREMENT = 15, // Teléfono 10-11 dígitos
RGIG_ACCOUNT_PASSWORD_CHARS_ONLY = 16, // Solo letras y números
RGIG_RESULT_TITLE = 17,           // Título de resultado
RGIG_REGISTRATION_SUCCESS = 18,   // Registro exitoso
RGIG_ACCOUNT_ALREADY_EXISTS = 19, // Cuenta ya existe
RGIG_INVALID_INFORMATION = 20     // Información inválida
};

// Lógica de Registro con soporte Multilenguaje
bool CB_DangKyInGame::RequsetDKTK()
{
// ... (Validaciones de Captcha)

DWORD currentTime = GetTickCount();
if (this->TimeSendRegTK > currentTime)
{
    DWORD waitTime = (this->TimeSendRegTK - currentTime) / 1000;
    char buffer[256];
    // Aquí cargamos el texto dinámico según el idioma
    sprintf(buffer, gTextClien.TextClien_Rgig[RGIG_PLEASE_WAIT], waitTime);
    gInterface->OpenMessageBox(gTextClien.TextClien_Rgig[RGIG_ERROR_TITLE], buffer);
    return false;
}

// Validación de longitud de caracteres
if (strlen(szID) < 4)
{
    gInterface->OpenMessageBox(gTextClien.TextClien_Rgig[RGIG_ERROR_TITLE], gTextClien.TextClien_Rgig[RGIG_ACCOUNT_MIN_LENGTH]);
    return false;
}

// ... (El resto del envío de paquetes al GS)
return true;
}

Es fundamental que los índices definidos en el RGIG_TEXT_INDEX coincidan exactamente con las líneas de tu archivo de texto del cliente (Text.txt o similar).

Si al compilar recibes errores en SAFE_DELETE, verifica que tienes incluida la cabecera Util.h o define el macro correctamente para evitar fugas de memoria.

Con esta estructura, tu sistema de registro no solo es más seguro, sino que está listo para un servidor global de Mu Online.





Estructura de Cabecera (CB_DangKyInGame.h)
Este archivo define el esqueleto de la interfaz y la estructura de red PMSG_REGISTER_MAIN_SEND, la cual debe ser idéntica en el GameServer para procesar el registro.

#pragma once
#include "Protocol.h"
class CUITextInputBox;

class CB_DangKyInGame
{
enum TYPE_INPUT_DKTK
{
Account,
Pass,
Snonumber,
Phone,
eMaxINPUT,
};

struct PMSG_REGISTER_MAIN_SEND
{
    PSBMSG_HEAD header; // C1:D2:02
    BYTE TypeSend;
    char account[11];
    char password[21];
    char numcode[8];
    char sodienthoai[14];
};
enum eRecvKetQua
{
    eDangKyThanhCong = 1,
    eTaiKhoanDaTonTai = 2,
    eDuLieuNhapKhongDung = 3,
    eDatLaiMatKhauThanhCong = 11,
    eThongTinBaoMatKhongChinhXac = 12,
};
public:
CB_DangKyInGame();
~CB_DangKyInGame();
bool RenderWindow(int X, int Y);
void OpenOnOff();
bool RequsetDKTK();
void RecvKQRegInGame(XULY_CGPACKET* lpMsg);
void Clear();
static CB_DangKyInGame* Instance();

protected:
CUITextInputBox* CInputData[TYPE_INPUT_DKTK::eMaxINPUT];
CUITextInputBox* CInputCaptCha;
DWORD TimeSendRegTK;
bool OpenDKTK;
};

#define gCB_DangKyInGame (CB_DangKyInGame::Instance())



Gestión de Textos Multilenguaje (TextClien.h / TextClien.cpp)
Para que el sistema funcione, necesitamos un cargador que busque el archivo correspondiente al idioma seleccionado (ej. TextClien_Eng.ini, TextClien_Spn.ini).

// TextClien.cpp - Lógica de carga desde archivos .ini
void cTextClien::Load()
{
char strFileName[255];
memset(strFileName, 0, sizeof(strFileName));
// Carga dinámica basada en g_strSelectedML (idioma del cliente)
sprintf(strFileName, "./Data/Custom/TextClien/TextClien_%s.ini", g_strSelectedML.c_str());

char GetFotText[35] = { 0 };
for (int st = 0; st < 50; st++)
{
    wsprintf(GetFotText, "Mess%d", st);
    GetPrivateProfileStringA("ThongTin", GetFotText, "Null", TextClien_ThongTin[st], sizeof(TextClien_ThongTin[st]), strFileName);
    GetPrivateProfileStringA("Khac",   GetFotText, "Null", TextClien_Khac[st], sizeof(TextClien_Khac[st]), strFileName);
    GetPrivateProfileStringA("Rgig", GetFotText, "Null", TextClien_Rgig[st], sizeof(TextClien_Rgig[st]), strFileName);
   
    // Debug para consola en desarrollo
    g_ConsoleDebug->Write(5, "[Load text clien: %d: %s]", st, TextClien_ThongTin[st]);
}
}

El uso de GetPrivateProfileStringA permite leer secciones específicas del archivo INI, lo que mantiene el código limpio y organizado por categorías (Información, Otros, Registro).

Asegúrate de que la ruta ./Data/Custom/TextClien/ exista en tu cliente, de lo contrario los textos aparecerán como "Null" por defecto.[/error]

Con estas cabeceras implementadas, el cliente ya es capaz de entenderse con el servidor y gestionar múltiples idiomas para la interfaz de registro.




Configuración del archivo INI (Localización)

Debes dirigirte a la carpeta de tu cliente y localizar (o crear si no existe) el archivo en la ruta Data/Custom/TextClien/TextClien_(su idioma).ini.

Recuerda que el nombre del archivo debe coincidir con el identificador de idioma de tu cliente, por ejemplo: TextClien_Spn.ini para español o TextClien_Eng.ini para inglés.

[Rgig]
Mess0 = "Account Registration"
Mess1 = "Account:"
Mess2 = "Password:"
Mess3 = "Code:"
Mess4 = "7 Secret Digits:"
Mess5 = "Phone"
Mess6 = "The account can only use characters 0~9, a~z"
Mess7 = "Code:"
Mess8 = "Confirm"
Mess9 = "ERROR"
Mess10 = "Incorrect Captcha Code"
Mess11 = "Please wait %d seconds before trying again"
Mess12 = "The account must have at least 4 characters"
Mess13 = "The password must have at least 6 characters"
Mess14 = "You must enter exactly 7 security digits"
Mess15 = "The phone number must have 10-11 digits"
Mess16 = "The account and password can only contain letters and numbers"
Mess17 = "Result"
Mess18 = "Congratulations on the successful registration! \n ID: %s"
Mess19 = "ID: %s \n Already exists, please register a different account!"
Mess20 = "The entered information is not valid, please check again!"



Puntos clave para la instalación:

  • Identificadores de Idioma: Asegúrate de que el sufijo del archivo (_Spn, _Eng, _Por) coincida con lo que tu cliente tiene definido en su configuración principal.
  • Formato de Mensajes: Fíjate en el uso de %d y %s en los mensajes 11, 18 y 19. Estos son marcadores de posición que el código reemplaza en tiempo real con números o nombres de cuenta.
  • Salto de línea: El uso de \n permite que el texto se divida en dos líneas dentro de los cuadros de mensaje (MessageBox).

Si el archivo no tiene exactamente el nombre esperado o no se encuentra en la ruta Data/Custom/TextClien/, el cliente podría cerrarse o mostrar textos vacíos al intentar abrir la ventana de registro.

Al editar el archivo INI, asegúrate de mantener las comillas para evitar errores de lectura en strings que contengan espacios.

Con este último paso, tu sistema de registro In-Game para Source 5.2 BASE queda totalmente funcional y listo para recibir jugadores de cualquier región.



Créditos: Dexign
Bon Dia

🡱 🡳
Real Time Web Analytics