PDA

View Full Version : |Source| Atualização do sistema de patente



louis
24/09/2017, 12:38 AM
Me assustei um pouco com o código gigantesco que foi criado para premiar a mudança de patente no ms da falecida f-team. Então estou postando uma modificação bem simples e didática para resumir e melhorar o desempenho do mesmo.

Dentro do CommandManager.cpp você deve remover tudo referente a atualização de patente e colocar apenas isso:



gCustomRankUser.CheckUpdate(lpObj->Index);


Adicionar no CustomRankUser.cpp

void CCustomRankUser::CheckUpdate(int aIndex)
{
LPOBJ lpObj = &gObj[aIndex];

for(int i = 0; i < this->m_count; i++)
{
if(this->m_Data[i].m_iResetMin == lpObj->Reset)
{
SDHP_COMMAND_COIN_RESET pMsg;

pMsg.header.set(0x0F,0x05,sizeof(pMsg));

pMsg.index = lpObj->Index;

memcpy(pMsg.account,lpObj->Account,sizeof(pMsg.account));

pMsg.Type = 1;
pMsg.Value = this->m_Data[i].m_Coin;

gDataServerConnection.DataSend((BYTE*)&pMsg,pMsg.header.size);

gNotice.GCNoticeSendToAll(0,0,0,0,0,0,gMessage.Get Message(763+i),lpObj->Name);
gNotice.GCNoticeSend(lpObj->Index,1,0,0,0,0,0,gMessage.GetMessage(742+i),lpObj->Name);

return;
}
}
return;
}

CustomRankUser.h

void CheckUpdate(int aIndex);

No CustomRankUser.txt você deve adicionar um coluna que será o premio:
Exemplo:


//================================================== ================================================== =============
// #RankIndex #Name #ResetMin #ResetMax #Cash
//================================================== ================================================== =============
0
0 "Novato" 0 50 0
1 "Aprendiz" 51 100 0
2 "Mensageiro" 101 150 0

....

Obs: Não esqueça de dar load nessa coluna.

Créditos
F-team

Arcade
24/09/2017, 01:01 AM
É como eu sempre digo, com um pouco de criatividade dá para usar esse código pra fazer diversos tipos de patentes! E digo mais, apesar de muitas coisas novas estarem aparecendo nos emuladores MuEmu (fonte de estudos para muitos coders), esse sistema de patente funciona em qualquer versão de MuOnline.

Show de Bola! Like mais que merecido queridão.

Mentor
24/09/2017, 02:05 AM
Muito bom louis, vou implementar isso na minha source mais claro que vou dar uma estudada nela pois para aprender porque ficar so no crtl c e crtl v é tenso kkkkkkkk

Unico
24/09/2017, 03:11 AM
update su s4 ? :v

djagripnos
24/09/2017, 08:11 AM
update su s4 ? :v

Update Soon!

Mentor
24/09/2017, 06:17 PM
louis quais textos tenho de por no arquivo mensagem referente a essas duas linhas?


gNotice.GCNoticeSendToAll(0,0,0,0,0,0,gMessage.Get Message(764+i),lpObj->Name);
gNotice.GCNoticeSend(lpObj->Index,1,0,0,0,0,0,gMessage.GetMessage(743+i),lpObj->Name);

louis
24/09/2017, 07:24 PM
@louis ([Only registered and activated users can see links]) quais textos tenho de por no arquivo mensagem referente a essas duas linhas?

Como falei o script criado é muito mal elaborado, não levem a mal, também passei por essa fase quando estava aprendendo e como como muitos eu também não tive professor e acabamos fazendo do nosso jeito, não está errado e irá funcionar porém com o tempo temos que evoluir e aprender a melhorar o código, em vez de criar apenas uma mensagem para todas as mudanças de patentes foram criadas várias mensagens, uma para cada mudança de patente.

Então eu criei um For para testar todas as patentes e premia-las quando necessário, um For nada mais é que uma estrutura de repetição que por sinal é um das coisas mais importantes da programação para obter um código limpo e rápido.

Nesse for criado ele testa todas as patentes 1 por 1 até atingir ou não o resultado definido que no caso é checar se o personagem X tem os resets mínimos para trocar de patente, quando os resets do personagem for exatamente igual ao o mínimo necessário serão executados as funções de premiação.

Com o for foi definindo um inicio em um fim fazendo um contagem na variável "i", que é responsável por definir o número da patente que está sendo testada naquele momento. Então quando o resultado necessário for atingido será exibida a mensagem da patente que está sendo testada, por exemplo:

O jogador atingiu a patente:
4 "Assasino" 201 250

Será exibida a mensagem(reparem o que está em vermelho):
gNotice.GCNoticeSendToAll(0,0,0,0,0,0,gMessage.Get Message(763+4),lpObj->Name);

Mensagem no message.txt:
767 "O jogador %s alcançou a patente Assasino!"

Portanto a cada patente alcançada vai somando no GetMessage para pegar o texto correto.

Obs1: Eu tinha colocado o numero errado (764 e 743) na mensagem, o correto é 763 e 742 respectivamente pois a patente novato não conta, já corrigi no tópico inicial.
Obs2: Eu ainda faria apenas uma frase no Message.txt, alterando Apenas o nome da patente e o nome do char que subiu de patente. Ex: O jogador %s alcançou a patente %s!

Mentor
24/09/2017, 07:28 PM
Vlw professor aloprado :ott

felipecoder
11/10/2017, 08:11 PM
bem bacana, obrigado por manter os créditos, é uma coisa simples e fácil que eu tbm fiz, com os for e i++ mas modifiquei meu sistema de rankings então não uso os resets

mkslep
13/10/2017, 05:07 PM
Me assustei um pouco com o código gigantesco que foi criado para premiar a mudança de patente no ms da falecida f-team. Então estou postando uma modificação bem simples e didática para resumir e melhorar o desempenho do mesmo.

Dentro do CommandManager.cpp você deve remover tudo referente a atualização de patente e colocar apenas isso:



gCustomRankUser.CheckUpdate(lpObj->Index);


Adicionar no CustomRankUser.cpp

void CCustomRankUser::CheckUpdate(int aIndex)
{
LPOBJ lpObj = &gObj[aIndex];

for(int i = 0; i < this->m_count; i++)
{
if(this->m_Data[i].m_iResetMin == lpObj->Reset)
{
SDHP_COMMAND_COIN_RESET pMsg;

pMsg.header.set(0x0F,0x05,sizeof(pMsg));

pMsg.index = lpObj->Index;

memcpy(pMsg.account,lpObj->Account,sizeof(pMsg.account));

pMsg.Type = 1;
pMsg.Value = this->m_Data[i].m_Coin;

gDataServerConnection.DataSend((BYTE*)&pMsg,pMsg.header.size);

gNotice.GCNoticeSendToAll(0,0,0,0,0,0,gMessage.Get Message(763+i),lpObj->Name);
gNotice.GCNoticeSend(lpObj->Index,1,0,0,0,0,0,gMessage.GetMessage(742+i),lpObj->Name);

return;
}
}
return;
}

CustomRankUser.h

void CheckUpdate(int aIndex);

No CustomRankUser.txt você deve adicionar um coluna que será o premio:
Exemplo:


//================================================== ================================================== =============
// #RankIndex #Name #ResetMin #ResetMax #Cash
//================================================== ================================================== =============
0
0 "Novato" 0 50 0
1 "Aprendiz" 51 100 0
2 "Mensageiro" 101 150 0

....

Obs: Não esqueça de dar load nessa coluna.

Créditos
F-team


Teria como me ajudar com esses dois problemas ou fazer um tutorial passo a passo de como fazer essa sua alteração porque parece que falta algo

Veja a imagem

[Only registered and activated users can see links]
[Only registered and activated users can see links]

[Only registered and activated users can see links]

Malyk
13/10/2017, 05:35 PM
Existe alguma Job ou algo do tipo que possa premiar o player com alguma moeda, quando ele passa de patente?

louis
13/10/2017, 07:17 PM
[Only registered and activated users can see links]

mkslep
13/10/2017, 07:20 PM
@louis ([Only registered and activated users can see links])
isso na que o Ycrazy postou

Mentor
13/10/2017, 08:55 PM
Teria como me ajudar com esses dois problemas ou fazer um tutorial passo a passo de como fazer essa sua alteração porque parece que falta algo

Veja a imagem

[Only registered and activated users can see links]
[Only registered and activated users can see links]

[Only registered and activated users can see links]

Em comandmanager.h você vai ter de adicionar essa struct caso não tenha:


struct SDHP_COMMAND_COIN_RESET
{
PSBMSG_HEAD header; // C1:0F:04
WORD index;
char account[11];
UINT Type;
UINT Value;
UINT Teste;
};

O ideal é você ir na source dele e buscar a linhas que está dando problema e clicar com o botão direito do mouse sobre ela e clicar em "find all references" dai você vai ver todas as referencias dessa linha e ver o que está faltando você adicionar na sua source para sumir o erro.

Veja também em GameMain.cpp tem essa linha:


CConnection gDataServerConnection;

Ela fica logo no começo acima da linha:
void GameMainInit(HWND hwnd)

mkslep
13/10/2017, 09:22 PM
@Mentor ([Only registered and activated users can see links])
vlw mentor mas consegui resolver isso de outra forma queria saber como faço pra escolher o tipo de moeda que ser dada no direto no Patente.txt

Já consegui colocar o tipo de moeda no Patente.txt

robsonsoares
14/10/2017, 04:29 PM
opa poderia me dizer como vc conseguiu por moeda na patente..
pois na minha source aqui diz q ganha na Coin!! criei a coluna e nao ganhou .. to nesse perrengue

louis tem alguma job p premiar patente com moeda??

Mentor
14/10/2017, 04:37 PM
Eu não conseguir fazer com que o char receba a premiação, pois aparece a mensagem in game que o char recebeu a moeda mais na db está zerada.

robsonsoares
14/10/2017, 04:54 PM
Tava querendo isso pois patente muda e nao esta recompensando in game tmbm

mkslep
14/10/2017, 05:20 PM
@Mentor ([Only registered and activated users can see links])
se vc estiver usando s4 vc tem que mudar a função na DB

@robsonsoares ([Only registered and activated users can see links])
isso server para vc tbm

ache a WZ_ResetCoin

e deixe igual da imagem

[Only registered and activated users can see links]

robsonsoares
14/10/2017, 06:06 PM
sei q vou pazer uma pergunta besta..
cara procurei na db mas nao achei
WZ_ResetCoin
isso é na MuONline

louis
14/10/2017, 07:14 PM
Não sei se está codado na source essa premiação...

Mais tem que checar o Dataserver, Gameserver e essa procedure, pode ser que ao ganhar o premio apareça alguma informação de erro no dataserver.

mkslep
14/10/2017, 07:27 PM
no meu esta funcionando normal


// RankIndex -> Index do Ranking
// Name -> Titulo do Rank
// ResetMin -> Minimo de Resets para determinado Rank
// ResetMin -> Maximo de Resets para determinado Rank
// Cash -> O valor que o player ira ganhar ao atingir a patente
// Moeda -> 1=WcoinC, 2=WcoinP, 3=Pc points poder ser definodo uma moeda para cada patente Tipo
// Você quer que a patente (Aprendiz) ganhe WcoinC vc coloca o numero 1
// Você quer que a patente (AprendizNv2) ganhe WcoinP só vc colocar o numero 2
// Você quer que a patente (AprendizNv3) ganhe Pc points só vc colocar o numero 3
// As patentes são atingida toda ves que chega nos resets tipo (51 Aprendiz), (101 AprendizNv2) assim por diante
//================================================== ================================================== ====
//-- Obs: Obrigatorio o Ultimo Rank o ResetMax ter o valor (-1)
//================================================== ================================================== ====


//================================================== ================================================== ====
// #RankIndex #Name #ResetMin #ResetMax #Cash #Moeda
//================================================== ================================================== ====
0
0 "Novato" 0 50 0 0
1 "Aprendiz" 51 100 6 1

Mentor
15/10/2017, 09:57 PM
mkslep mais seu char está ganhando a premiação normal?
Você está usando a db da season4 né?

Eu vou dar uma verificada nessa db porque acredito que o meu só esteja faltando adicionar a procedure na DB, pois estou utilizando essa custom na seaosn6.

mkslep
16/10/2017, 04:28 PM
@Mentor ([Only registered and activated users can see links])
como eu tinha dito estou usando a source F-Team e a DB da mesma

felipecoder
17/10/2017, 07:42 PM
A DB é a que está com as custom, vou ta dando uma ajuda para a galera nesse aspecto até pq melhorei a source umas 4x nesse tempo que sumi, pelo oq vi o erro de vocês não premiar pode estar no Dataserver, até pq msm tendo a DB igual se o dataserver não for igual não vai rodar o comando de premiar, no caso do mentor se ele não tiver pegado a parte do script do dataserver não vai premiar

robsonsoares
17/10/2017, 07:48 PM
A DB é a que está com as custom, vou ta dando uma ajuda para a galera nesse aspecto até pq melhorei a source umas 4x nesse tempo que sumi, pelo oq vi o erro de vocês não premiar pode estar no Dataserver, até pq msm tendo a DB igual se o dataserver não for igual não vai rodar o comando de premiar, no caso do mentor se ele não tiver pegado a parte do script do dataserver não vai premiar


o meu custonpatentes.txt


//================================================== ================================================== =============
//-- Definições do Ranking//// Maximo de 10 ranks
//================================================== ================================================== =============
// RankIndex -> Index do Ranking
// Name -> Titulo do Rank
// ResetMin -> Minimo de Resets para determinado Rank
// ResetMin -> Maximo de Resets para determinado Rank
//================================================== ================================================== =============
//-- Obs: Obrigatorio o Ultimo Rank o ResetMax ter o valor (-1)
//================================================== ================================================== =============


//================================================== ================================================== =============
// #RankIndex #Name #ResetMin #ResetMax
//================================================== ================================================== =============
0
0 "Bronze" 0 50
1 "Prata" 51 100
2 "Gold" 101 150
3 "Platina" 151 200
4 "Diamante" 201 250
5 "Mestre" 251 300
6 "Challend" 301 -1


se eu inserir #Cion ou #wCoin e salvar no momento do reload o gs nao abre mais.. bugaa ai tenho q deletar o txt e repor o original mesmo eu apagando nao funciona

felipecoder
17/10/2017, 07:52 PM
o meu custonpatentes.txt


//================================================== ================================================== =============
//-- Definições do Ranking//// Maximo de 10 ranks
//================================================== ================================================== =============
// RankIndex -> Index do Ranking
// Name -> Titulo do Rank
// ResetMin -> Minimo de Resets para determinado Rank
// ResetMin -> Maximo de Resets para determinado Rank
//================================================== ================================================== =============
//-- Obs: Obrigatorio o Ultimo Rank o ResetMax ter o valor (-1)
//================================================== ================================================== =============


//================================================== ================================================== =============
// #RankIndex #Name #ResetMin #ResetMax
//================================================== ================================================== =============
0
0 "Bronze" 0 50
1 "Prata" 51 100
2 "Gold" 101 150
3 "Platina" 151 200
4 "Diamante" 201 250
5 "Mestre" 251 300
6 "Challend" 301 -1


se eu inserir #Cion ou #wCoin e salvar no momento do reload o gs nao abre mais.. bugaa ai tenho q deletar o txt e repor o original mesmo eu apagando nao funciona
isso é pq seu gs não está igual para receber os valores, vc mexeu na sourcer?

robsonsoares
17/10/2017, 07:55 PM
isso é pq seu gs não está igual para receber os valores, vc mexeu na sourcer?


nao tenho a source deste..

felipecoder
17/10/2017, 09:01 PM
nao tenho a source deste..
Ai esta o erro, vc pegou com quem o servidor?

Mentor
17/10/2017, 09:12 PM
Realmente felipecoder, andei verificando o dataserver e estava faltando alguns códigos^^ já atualizei minha source depois vou testar ;)

Obrigado!

robsonsoares
17/10/2017, 09:25 PM
Ai esta o erro, vc pegou com quem o servidor?

boris160
oseason 4

28 minutes:------- Atualizado -------


boris160
oseason 4
ele nao quis fornecer a source

felipecoder
17/10/2017, 10:01 PM
[Only registered and activated users can see links]

Obrigado!

se precisar, tamo ai