Velton D.
14/04/2015, 11:12 AM
Venho trazer uma forma fácil de fazer a troca de protocolo do servidor, Funciona com qualquer versão de gs, só adaptar
1º Passo: Verificar corretamente as cases do Procolo que vai usar. Lembrando que no exemplo abaixo está trocando de JPN para Vietnã.
BYTE ProtocolServer(BYTE Head)
{
switch(Head)
{
case 0xD9:
return 0x1D; // -> Walk [JPN]
case 0xDC:
return 0xD6; // -> Damage [JPN]
case 0x15:
return 0xDC; // -> Attack [JPN]
case 0x1D:
return 0xD7; // -> Skill [JPN]
default:
return Head;
}
return Head;
}
BYTE ProtocolClient(BYTE Head)
{
switch(Head)
{
case 0x1D: // -> Walk [JPN]
return 0xD9;
case 0xD6: // -> Damage [JPN]
return 0xDC;
case 0xDC: // -> Attack [JPN]
return 0x15;
case 0xD7: // -> Skill [JPN]
return 0x1D;
default:
return Head;
}
return Head;
}
2º Passo: Chamando a troca de cases no ProtocolCore e DataSend
void DataRecvEx(BYTE protoNum,LPBYTE aRecv,DWORD aLen,DWORD aIndex,DWORD Encrypt,int Serial)
{
if(aRecv[0] == 0xC1 || aRecv[0] == 0xC3)
{
aRecv[2] = ProtocolServer(aRecv[2]);
protoNum = aRecv[2];
}
else
{
aRecv[3] = ProtocolServer(aRecv[3]);
protoNum = aRecv[3];
}
// ----
DataRecv(protoNum,aRecv,aLen,aIndex,Encrypt,Serial );
}
void DataSendEx(int aIndex, LPBYTE aSend, int aLen)
{
if(aSend[0] == 0xC1 || aSend[0] == 0xC3)
{
aSend[2] = ProtocolClient(aSend[2]);
}
else
{
aSend[3] = ProtocolClient(aSend[3]);
}
// ----
DataSend(aIndex,aSend,aLen);
}
3º Passo: Apenas faça os Hooks nos Offsets corretos do seu GameServer cada função e pronto! Não tem como não funcionar. Abaixo uma Lista de Protocolos de MuOnline
Japan Protocol
Walk = 1D
Damage = D6
Attack = DC
Skill = D7
===================
English Protocol
Walk = D4
Damage = 15
Attack = 11
Skill = DB
===================
Vietnam Protocol
Walk = D9
Damage = DC
Attack = 15
Skill = 1D
===================
Philippine Protocol
Walk = DD
Damage = DF
Attack = D6
Skill = 11
===================
China Protocol
Walk = D9
Damage = D0
Attack = D7
Skill = 1D
===================
Korean Protocol
Walk = D3
Damage = DF
Attack = D7
Skill = 10
1º Passo: Verificar corretamente as cases do Procolo que vai usar. Lembrando que no exemplo abaixo está trocando de JPN para Vietnã.
BYTE ProtocolServer(BYTE Head)
{
switch(Head)
{
case 0xD9:
return 0x1D; // -> Walk [JPN]
case 0xDC:
return 0xD6; // -> Damage [JPN]
case 0x15:
return 0xDC; // -> Attack [JPN]
case 0x1D:
return 0xD7; // -> Skill [JPN]
default:
return Head;
}
return Head;
}
BYTE ProtocolClient(BYTE Head)
{
switch(Head)
{
case 0x1D: // -> Walk [JPN]
return 0xD9;
case 0xD6: // -> Damage [JPN]
return 0xDC;
case 0xDC: // -> Attack [JPN]
return 0x15;
case 0xD7: // -> Skill [JPN]
return 0x1D;
default:
return Head;
}
return Head;
}
2º Passo: Chamando a troca de cases no ProtocolCore e DataSend
void DataRecvEx(BYTE protoNum,LPBYTE aRecv,DWORD aLen,DWORD aIndex,DWORD Encrypt,int Serial)
{
if(aRecv[0] == 0xC1 || aRecv[0] == 0xC3)
{
aRecv[2] = ProtocolServer(aRecv[2]);
protoNum = aRecv[2];
}
else
{
aRecv[3] = ProtocolServer(aRecv[3]);
protoNum = aRecv[3];
}
// ----
DataRecv(protoNum,aRecv,aLen,aIndex,Encrypt,Serial );
}
void DataSendEx(int aIndex, LPBYTE aSend, int aLen)
{
if(aSend[0] == 0xC1 || aSend[0] == 0xC3)
{
aSend[2] = ProtocolClient(aSend[2]);
}
else
{
aSend[3] = ProtocolClient(aSend[3]);
}
// ----
DataSend(aIndex,aSend,aLen);
}
3º Passo: Apenas faça os Hooks nos Offsets corretos do seu GameServer cada função e pronto! Não tem como não funcionar. Abaixo uma Lista de Protocolos de MuOnline
Japan Protocol
Walk = 1D
Damage = D6
Attack = DC
Skill = D7
===================
English Protocol
Walk = D4
Damage = 15
Attack = 11
Skill = DB
===================
Vietnam Protocol
Walk = D9
Damage = DC
Attack = 15
Skill = 1D
===================
Philippine Protocol
Walk = DD
Damage = DF
Attack = D6
Skill = 11
===================
China Protocol
Walk = D9
Damage = D0
Attack = D7
Skill = 1D
===================
Korean Protocol
Walk = D3
Damage = DF
Attack = D7
Skill = 10