PDA

View Full Version : |Desenvolvimento| Trocar Protocolo do GameServer



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

Mr.Haziel
14/04/2015, 02:44 PM
Ótima função!! Uso em meus plugin ha alguns anos.
Função criada por uns dos melhores programadores de todos os tempos Welcomevocê X-Team

Obs: Só ressaltando que em gameserves abaixo da season 3.2 nen sempre funciona, tendo que fazer algumas mudanças , por que os protocolos dos mains antigos que é um pouco diferente ex: 99.90T VTN para CHS usando o metodo postado acima = Bug !!

Velton D.
14/04/2015, 09:28 PM
Depois posto certin para CHS, já usei isso no 99.60T e nao tive esses problemas

s00x
15/04/2015, 03:14 PM
Tenho certeza Maykon que isso é algum erro no seu protocolo, como te disse é muito lógico, envio comando pra atacar ele anda, é algum valor errado, tenho certeza .

s00x
15/04/2015, 05:49 PM
Talvez seja até esse MAIN, sei la ...
Testa depois alguns do que te enviei.

Velton D.
16/04/2015, 11:06 PM
Eu estava usando dessa forma e não tive problema algum. Não acredito que tenha conflito, afinal é apenas recebendo/enviando de uma case e retornando para outra. Trocando de Vietnã para CHS em meu test estava tudo Ok, Move, Attack, Skills ...



BYTE ProtocolServer(BYTE Head)
{
switch (Head)
{
case 0xD7:
return 0xD9;
case 0xDD:
return 0xDC;
case 0xD9:
return 0x15;
case 0x1D:
return 0x1D;
default:
return Head;
}
return Head;
}


BYTE ProtocolClient(BYTE Head)
{
switch (Head)
{
case 0xD9:
return 0xD7;
case 0xDC:
return 0xDD;
case 0x15:
return 0xD9;
case 0x1D:
return 0x1D;
default:
return Head;
}
return Head;
}


PS: Não precisa pega do main... Você sendo o protocol do GameServer e do Client vc já tem a lista acima das cases e de cada linguagem. Só organiza, exemplo: GS JPN / Main KOR = ProtocolServer = Recebe Kor e retorna nas Cases do JPN / ProtocolClient Envia JPN porem retorna para enviar KOR... Não tem erro ^^ ou melhor fazer emulador da versão usando a dec do 1.00.18

s00x
16/04/2015, 11:46 PM
Velton D. acho que regredir a versão não compensaria muito, visto que o problema central é apenas os protocolos, e já consegui o Cliente Vietnam para Maykon .

Mr.Haziel
17/04/2015, 02:50 PM
Quando se programa usando o protocolo acima ao ver de inicio não se nota o bug,mais é o que sempre falo,a parada é ver na integra (Online), (POR QUE O BUG SÓ ACONTECE QUANDO SEGURA O CONTROL NO X1 ) pelo seguinte a webzen féis mudanças no protocolo do main! Não são mesmos BYTES das versões acima da season 2.nos mains antigos os BYTES do protocolo são diferente ocasionando o conflito, o que fazer ?

Pegar o BYTE que é enviado no Send,que faz o char correr na hora do x1, por um if igualando ao pacote correto. simples !!

Creio que não adianta ficar falando que emulador seja correto e sim postar a solução do problema.

A logica é essa:Só pegar o pacote de corre e mudar na hora do X1,e enviar no send,foi assim que fixei na minha versão Premium 1.00.13 CHS.

Abraço a todos

Velton D.
17/04/2015, 09:30 PM
wagnerspg vai do que você quer fazer. eu mesmo fiz isso com o Season 4.5 (1.00.90) para Season 3.2 (1.00.77) e isso da mais liberdade alem de você ter todo o codigo do GameServer você pode criar muita coisa que as vezes no plugin limita. como algumas classes que precisa usar asm e tals, então eu prefira fazer assim. mas vai de cada um... eu tenho pouco conhecimento em versões antigas por não gostar muito delas
Mr.Haziel ninguém disse nada sobre emulador ser correto. Quis dizer que com ele você faz direto no código fonte do protocolo apenas isso. Até por que eu já larguei mão desse negocio de plugin então fica apenas como dica para quem quer desenvolver algum mais completo