PDA

Ver la versión completa : Enviar Packets...



locobans
17-12-2005, 02:14
Bien antes que nada me introduzco bien...

Mi nombre es manuel calderon, y vengo para ver si me podrian dar una mano con...un juego llamado helbreath.

Bien el sistema de login del juego, el que maneja los datos de los jugadores/characters (no las cuentas) es denominado WorldServer.exe el cual tambien acepta todos los mapas del juego los cuales se ponen online mediante un archivo llamado GameServer el cual carga los archivos de los mapas y establece la conexion con el WorldServer para que el jugador pueda pasar al GameServer o mapa. Esta conexion se efectua mediante el puerto 2501, osea el GameServer se conecta al WorldServer mediante el port 2501.

Bien, cada GameServer.exe (hosteador de mapas) cuando te sales del juego le manda tu informacion de tu jugador al WorldServer para que este a su vez la grabe. Ahora bien lo que ando buscando es como mandar ese "packet" que manda el GameServer.exe mandarlo yo editado o cambiado al WorldServer.exe para que este lo grabe. En este caso podria hacerle todo tipo de cambios a los datos del jugador...

Bien aca les dejo los 3 packets que creo que son los que debería usar o que ustedes deberian saber...

Packets del HGserver.exe
MSGID_REQUEST_REGISTERGAMESERVER (para registrarse en el WorldServer)
MSGID_REQUEST_PLAYERDATA (para obtener la informacion del jugador)
MSGID_REQUEST_SAVEPLAYERDATA (para grabar la informacion del jugador)

MSGID = MSGID_REQUEST_REGISTERGAMESERVER (0x0512A3F4, DWORD)
MSGTYPE = DEF_MSGTYPE_CONFIRM (0x0F14, WORD)
SERVER NAME = 10 bytes (char)
SERVER IP ADDRESS = 16 bytes (char)
SERVER PORT = 2 bytes (WORD)
TOTAL MAPS = 1 byte (char)
y para cada mapa (osea hay que poner MAPNAME = nombredelmapa):
MAPNAME = 11 bytes (char)

MSGID = MSGID_REQUEST_PLAYERDATA (0x0C152210, DWORD)
MSGTYPE = DEF_MSGTYPE_CONFIRM (0x0F14, WORD)
CHARNAME = 10 bytes (char)
ACCOUNT NAME = 10 bytes (char)
PASSWORD = 10 bytes (char)
CLIENT IP ADDRESS = 15 bytes (char)

MSGID = MSGID_REQUEST_SAVEPLAYERDATA (0x0DF3076F, DWORD)
MSGTYPE = DEF_MSGTYPE_CONFIRM (0x0F14, WORD)
CHARACTER NAME = 10 bytes (char)
ACCOUNT NAME = 10 bytes (char)
PASSWORD = 10 bytes (char)
FLAG = 1 byte (char)
CHARACTER FILE DATA = various bytes (char)

locobans
17-12-2005, 02:18
Aca les dejo los codigos fuentes del GameServer.exe (hosteador de mapas)

case MSGID_REQUEST_REGISTERGAMESERVER:


wsprintf(cTxt, "(!) Try to register game server(%s) - GateServer", m_cServerName);
PutLogList(cTxt);

dwp = (DWORD *)(cData + DEF_INDEX4_MSGID);
*dwp = MSGID_REQUEST_REGISTERGAMESERVER;
wp = (WORD *)(cData + DEF_INDEX2_MSGTYPE);
*wp = DEF_MSGTYPE_CONFIRM;

cp = (char *)(cData + DEF_INDEX2_MSGTYPE + 2);

memcpy(cAccountName, m_cServerName, 10);
memcpy(cAddress, m_cGameServerAddr, strlen(m_cGameServerAddr));

memcpy(cp, cAccountName, 10);
cp += 10;

memcpy(cp, cAddress, 16);
cp += 16;

wp = (WORD *)cp;
*wp = m_iGameServerPort;
cp += 2;

*cp = m_iTotalMaps;
cp++;

for (i = 0; i < m_iTotalMaps; i++) {
memcpy(cp, m_pMapList[i]->m_cName, 11);
cp += 11;
}

dwp = (DWORD *)cp;
*dwp = (DWORD)GetCurrentProcessId(); // ÇÁ·Î¼¼½º ÇÚµéÀ» ±â·ÏÇÑ´Ù.
cp += 4;

dwp = (DWORD *)cp;
*dwp = (DWORD)DEF_BUILDDATE;
cp += 4;

iRet = m_pGateSock->iSendMsg(cData, 39 + m_iTotalMaps*11 + 4);
break;



case MSGID_REQUEST_PLAYERDATA:


if (_bCheckSubLogSocketIndex() == FALSE) return FALSE;

if (m_pClientList[iClientH] == NULL) return FALSE;

dwp = (DWORD *)(G_cData50000 + DEF_INDEX4_MSGID);
*dwp = MSGID_REQUEST_PLAYERDATA;
wp = (WORD *)(G_cData50000 + DEF_INDEX2_MSGTYPE);
*wp = DEF_MSGTYPE_CONFIRM;

cp = (char *)(G_cData50000 + DEF_INDEX2_MSGTYPE + 2);

if (strlen(m_pClientList[iClientH]->m_cCharName) == 0) PutLogList("(X) CharName NULL!");

memcpy(cCharName, m_pClientList[iClientH]->m_cCharName, 10);
memcpy(cAccountName, m_pClientList[iClientH]->m_cAccountName, 10);
memcpy(cAccountPassword, m_pClientList[iClientH]->m_cAccountPassword, 10);

memcpy((char *)cp, cCharName, 10);
cp += 10;

memcpy((char *)cp, cAccountName, 10);
cp += 10;

memcpy((char *)cp, cAccountPassword, 10);
cp += 10;

ZeroMemory(cTemp, sizeof(cTemp));
iRet = m_pClientList[iClientH]->m_pXSock->iGetPeerAddress(cTemp);
memcpy((char *)cp, cTemp, 15);
cp += 15;

iRet = m_pSubLogSock[m_iCurSubLogSockIndex]->iSendMsg(G_cData50000, 52);
iSendSize = 52;
break;



case MSGID_REQUEST_SAVEPLAYERDATA_REPLY:
case MSGID_REQUEST_SAVEPLAYERDATA:
case MSGID_REQUEST_SAVEPLAYERDATALOGOUT:

if (_bCheckSubLogSocketIndex() == FALSE) return FALSE;

if (m_pClientList[iClientH] == NULL) return FALSE;

dwp = (DWORD *)(G_cData50000 + DEF_INDEX4_MSGID);
*dwp = dwMsg;
wp = (WORD *)(G_cData50000 + DEF_INDEX2_MSGTYPE);
*wp = DEF_MSGTYPE_CONFIRM;

cp = (char *)(G_cData50000 + DEF_INDEX2_MSGTYPE + 2);

memcpy(cCharName, m_pClientList[iClientH]->m_cCharName, 10);
memcpy(cAccountName, m_pClientList[iClientH]->m_cAccountName, 10);
memcpy(cAccountPassword, m_pClientList[iClientH]->m_cAccountPassword, 10);

memcpy((char *)cp, cCharName, 10);
cp += 10;

memcpy((char *)cp, cAccountName, 10);
cp += 10;

memcpy((char *)cp, cAccountPassword, 10);
cp += 10;

locobans
17-12-2005, 02:21
Este es un ejemplo de un archivo, osea del archivo de un jugador...

http://hb-zion.com/Info.txt

Ese es un ejemplo, lo que me gustaria ser es enviar un archivo como este (cambiando varios valores) al servidor del juego, que en este caso se puede enviar hacia el WorldServer.exe que es el que los graba...

P.D: Gracias por leer, y esperaré por respuetas! :0=

locobans
23-12-2005, 04:51
Nadie mas?