ENTREGUE Shambles OnChat

Bem-vindo!

Ao se registrar conosco, você poderá discutir, compartilhar e enviar mensagens privadas com outros membros da nossa comunidade.

Inscreva-se agora!
Status
Não está aberto para novas respostas.

Shambles

Craftlandiano
Entrou
Dez 28, 2017
Mensagens
1,189
Cubos
0
Olá,gostaria de compartilhar com vocês a minha macro OnChat que fiz enquanto estudava algumas API do mod macro. Minha Onchat conta com:

  • Login Automático
- Você pode colocar sua senha em um dos parâmetros na macro para fazer seu login automática, você também poderá escutar um efeito sonoro caso tenha logado com sucesso.​

  • Fps / Horarío do Mundo / Money na tela

- Basta criar 2 Labels - "Label1" e "Label2", o nome deve ser igual estes para evitar problemas na macro
Obs: Seu Fps será atualizado quando alguém envia uma mensagem no Chat, não achei nenhum evento mais rápido que esse e ainda não tenho conhecimento para criar uma void loop(). O money será atualizado quando digitar /money ou quando vender / comprar algo.

  • Aviso com efeito sonoro antes do PvP ser ativado

Código da OnChat


Código:
$${

    //****************** [ COPYRIGHT ]  ******************
    //
    // OnChat feita por Shambles (Christopher_Andrade)
    //
    // Discord: Shambles#1158
    //
    //****************** [ COPYRIGHT ]  ******************
                              

    SET(#player_senha, "0");
    //    Mude esse "0" ^ para sua senha
  
    IFMATCHES("%CHATCLEAN%","^»Bem vindo de volta. Por favor digite /login sua-senha.$");

        SET(&label_info, "");
        SET(&label_money, "");

        ECHO("/login %#player_senha%");

        WAIT(1000ms);

        ACHIEVEMENTGET("Logado com Sucesso!", 47);

        PLAYSOUND(random.levelup);

        ECHO("/money");

    ENDIF;

    IFMATCHES("%CHATCLEAN%","Seu saldo atual: (.*)");
      
        SET(&player_money, "%CHATCLEAN%");
        REPLACE(&player_money,"Seu saldo atual: ", "");
        SET(&label_money,"&6Money: &b%&player_money%");
        SETLABEL(Label2, %&label_money%);
  
        LOG("");
        LOG("&c[&6&oMoney atualizado!&o&c]");
        LOG("");

    ENDIF;

    IFMATCHES("%CHATCLEAN%","Você (comprou|vendeu)");
        ECHO("/money");
    ENDIF;


    IFMATCHES("%CHATCLEAN%","Ficará de dia em 30s e o PvP será Desativado");
        ACHIEVEMENTGET(Pvp será desativado!, 56);

        PLAYSOUND(tile.piston.out);
        WAIT(500ms);
        PLAYSOUND(tile.piston.in);
    ENDIF;

    IFMATCHES("%CHATCLEAN%","Ficará de noite em 30s e o PvP será Ativado);
        ACHIEVEMENTGET(Pvp será ativado!,56);

        PLAYSOUND(tile.piston.out);
        WAIT(500ms);
        PLAYSOUND(tile.piston.in);
      
    ENDIF;

    SETLABEL(Label1, "&cFPS: &9%FPS%\n&cX: &9%XPOS% &cY: &9%YPOS% &cZ: &9%ZPOS%\n&o&9Horas&o: &c%DAYTIME%");
    WAIT(10T);
    SETLABEL(Label1, "&cFPS: &9%FPS%\n&cX: &9%XPOS% &cY: &9%YPOS% &cZ: &9%ZPOS%\n&o&9Horas&o: &c%DAYTIME%");

}$$
 
Última edição:
Boa macro!

Uma dica, irmão, sobre IFMATCHES.
Nessa parte aqui:
IFMATCHES("%CHATCLEAN%","Seu saldo atual: (.*)");
Como você usou IFMATCHES, você pode salvar algum dos valores da mensagem. Se você não quer salvar nada, você poderia apagar aquele (.*) ali que funcionaria da mesma forma. Entretanto, se você quiser salvar o valor diretamente daí, sem precisar tirar o "Seu saldo atual: " com o comando REPLACE, na sequência, você pode fazer desta forma:

IFMATCHES("%CHATCLEAN%","Seu saldo atual: (.*)$",&player_money,1);
( ) - Um grupo de parênteses serve para separar informações que podem ser salvas, se você quiser
.* - o ponto é "qualquer caractere menos quebra de linha", e o asterisco significa que o valor anterior pode existir "zero ou mais vezes". Portanto, .* é basicamente qualquer coisa (ou nada kk)
$ - denota que a mensagem termina ali. Coloquei o $ para garantir que o .* vai pegar tudo antes do final do conteúdo da mensagem.
&player_money - onde o conteúdo de um dos grupos ficará salvo (nesse caso só tem um grupo kk)
1 - esse número (no último parâmetro do ifmatches) indica qual grupo você quer salvar na variável (nesse caso, &player_money). Nesse caso aí, como só temos um par de parênteses, só temos um grupo, que é o número 1. Se tivessem mais grupos, você poderia escolher qual salvar (o segundo seria o número 2, etc.). Se você colocar 0 aí, a mensagem inteira será salva na variável.

Dessa forma, o ifmatches já vai armazenar o valor dentro da variável, e você não precisa dos comandos SET e REPLACE que estão na sequência.

Claro, funciona da mesma forma xD tô só tentando agregar informação mesmo xD
o/

Se você usasse desta forma:
IFMATCHES("%CHATCLEAN%","(Seu) (saldo) (atual): (.*)$",&variavel_kkk,3);
Logo depois da mensagem de saldo entrar, a variável &variavel_kkk vai ter o valor de "atual" pois ele é o terceiro grupo ali
 
Última edição:
Boa macro!

Uma dica, irmão, sobre IFMATCHES.
Nessa parte aqui:
IFMATCHES("%CHATCLEAN%","Seu saldo atual: (.*)");
Como você usou IFMATCHES, você pode salvar algum dos valores da mensagem. Se você não quer salvar nada, você poderia apagar aquele (.*) ali que funcionaria da mesma forma. Entretanto, se você quiser salvar o valor diretamente daí, sem precisar tirar o "Seu saldo atual: " com o comando REPLACE, na sequência, você pode fazer desta forma:

IFMATCHES("%CHATCLEAN%","Seu saldo atual: (.*)$",&player_money,1);
( ) - Um grupo de parênteses serve para separar informações que podem ser salvas, se você quiser
.* - o ponto é "qualquer caractere menos quebra de linha", e o asterisco significa que o valor anterior pode existir "zero ou mais vezes". Portanto, .* é basicamente qualquer coisa (ou nada kk)
$ - denota que a mensagem termina ali. Coloquei o $ para garantir que o .* vai pegar tudo antes do final do conteúdo da mensagem.
&player_money - onde o conteúdo de um dos grupos ficará salvo (nesse caso só tem um grupo kk)
1 - esse número (no último parâmetro do ifmatches) indica qual grupo você quer salvar na variável (nesse caso, &player_money). Nesse caso aí, como só temos um par de parênteses, só temos um grupo, que é o número 1. Se tivessem mais grupos, você poderia escolher qual salvar (o segundo seria o número 2, etc.). Se você colocar 0 aí, a mensagem inteira será salva na variável.

Dessa forma, o ifmatches já vai armazenar o valor dentro da variável, e você não precisa dos comandos SET e REPLACE que estão na sequência.

Claro, funciona da mesma forma xD tô só tentando agregar informação mesmo xD
o/

Se você usasse desta forma:
IFMATCHES("%CHATCLEAN%","(Seu) (saldo) (atual): (.*)$",&variavel_kkk,3);
Logo depois da mensagem de saldo entrar, a variável &variavel_kkk vai ter o valor de "atual" pois ele é o terceiro grupo ali

A sim, muito obrigado pela ajuda :), eu até tentei pesquisar como escanear o chat e colocar um valor dele numa variável e acabei usando a função MATCH(), porque queria fazer um sistema de mostrar o lucro caso o money aumentasse ou prejuízo caso diminuísse.

No caso eu declarei a Variável do lucro como inteira, usando um # (#player_money), porém o valor sempre retornava 0 na função MATCH(), talvez seja a falta do parâmetro dos grupos. Outroproblema que tive era para multiplicar a quantidade de itens vendidos e o preço deles para saber o valor gastor, mas tive 2 problemas: 1) Não sabia como multiplicar 2 Variáveis sem utilizar uma função, parece que tudo na macro depende de uma função, além de que o preço é um float e não sei como declara um float nessa macro, mas no caso, creio que pra fazer isso tem que calcular utilizando uma string para cada casa numeral.
 
A sim, muito obrigado pela dica, eu até tentei pesquisar como escanear o chat e colocar um valor dele numa variável e acabei usando a função MATCH(), porque queria fazer um sistema de mostrar o lucro caso o money aumentasse ou prejuízo caso diminuísse.

No caso eu declarei a Variável do lucro como inteira, usando um # (#player_money), porém o valor sempre retornava 0 na função MATCH(). Outro problema que tive era para multiplicar a quantidade de itens vendidos e o preço deles para saber o valor gastor, mas tive 2 problemas: 1) Não sabia como multiplicar 2 Variáveis sem utilizar uma função, parece que tudo na macro depende de uma função, além de que o preço é um float e não sei como declara um float nessa macro, mas no caso, creio que pra fazer isso tem que calcular utilizando uma string para cada casa numeral.
Então, IFMATCHES pode salvar um valor só (e faz checagem, pois é um IF), enquanto MATCH pode salvar quantos quiser (ambos usam regex).
Como o valor que você tá tentando juntar possui pontos e vírgulas, você nunca vai conseguir colocar em uma variável integer (#var), vai retornar 0 mesmo. Macromod não tem variáveis float, apenas números inteiros, texto, booleanas (verdadeiro/falso) e arrays (dos três tipos).

Se quiser fazer operações com a grana, usando uma variável de números inteiros, você pode remover os pontos e vírgulas usando o comando REPLACE, ou via regex.
Tipo,
Código:
IFMATCHES("%CHATCLEAN%","Seu saldo atual: (.*) Coins$",&player_money,1);
replace(%&player_money%,",","");
replace(%&player_money%,".","");
set(#player_money,"%&player_money%"); //agora vai ter só números aqui
E aqui você trabalharia com a #player_money, fazendo operações e tal.
Digamos, se o player tem 123,765.22c, #player_money vai ser igual a 12376522

Se quiser remover os decimais antes do ifmatches, por exemplo, poderia fazer algo assim:
Código:
IFMATCHES("%CHATCLEAN%","Seu saldo atual: (.*)\.\d\d Coins$",&player_money,1);
replace(%&player_money%,",","");
set(#player_money,"%&player_money%"); //agora vai ter só números aqui, e sem os decimais
E aqui você trabalharia com a #player_money, fazendo operações e tal.
Digamos, se o player tem 123,765.22c, #player_money vai ser igual a 123765

breve explicação da regex aí:
\. → significa o caractere de ponto mesmo (tem que usar a \ antes pq . sozinho significa "qualquer coisa menos quebra de linha", como eu falei no outro comentário);
\d → significa um número, é o mesmo que digitar [0-9]
portanto, \.\d\d ali vai ser a parte dos decimais, tipo .99 ou .12 ou .01 , etc.

Dá uma olhadinha nesta macro, talvez te interesse xD (é super mal escrita mas funciona kkkkkkkkk)
https://forum.craftlandia.com.br/xf/threads/1-5-2-e-1-8-money-e-lucro-na-tela-2020.976828/
 
Última edição:
Então, IFMATCHES pode salvar um valor só (e faz checagem, pois é um IF), enquanto MATCH pode salvar quantos quiser (ambos usam regex).
Como o valor que você tá tentando juntar possui pontos e vírgulas, você nunca vai conseguir colocar em uma variável integer (#var), vai retornar 0 mesmo. Macromod não tem variáveis float, apenas números inteiros, texto, booleanas (verdadeiro/falso) e arrays (dos três tipos).

Se quiser fazer operações com a grana, usando uma variável de números inteiros, você pode remover os pontos e vírgulas usando o comando REPLACE, ou via regex.
Tipo,
Código:
IFMATCHES("%CHATCLEAN%","Seu saldo atual: (.*) Coins$",&player_money,1);
replace(%&player_money%,",","");
replace(%&player_money%,".","");
set(#player_money,"%&player_money%"); //agora vai ter só números aqui
E aqui você trabalharia com a #player_money, fazendo operações e tal.
Digamos, se o player tem 123,765.22c, #player_money vai ser igual a 12376522

Se quiser remover os decimais antes do ifmatches, por exemplo, poderia fazer algo assim:
Código:
IFMATCHES("%CHATCLEAN%","Seu saldo atual: (.*)\.\d\d Coins$",&player_money,1);
replace(%&player_money%,",","");
set(#player_money,"%&player_money%"); //agora vai ter só números aqui, e sem os decimais
E aqui você trabalharia com a #player_money, fazendo operações e tal.
Digamos, se o player tem 123,765.22c, #player_money vai ser igual a 123765

breve explicação da regex aí:
\. → significa o caractere de ponto mesmo (tem que usar a \ antes pq . sozinho significa "qualquer coisa menos quebra de linha", como eu falei no outro comentário);
\d → significa um número, é o mesmo que digitar [0-9]
portanto, \.\d\d ali vai ser a parte dos decimais, tipo .99 ou .12 ou .01 , etc.

Dá uma olhadinha nesta macro, talvez te interesse xD (é super mal escrita mas funciona kkkkkkkkk)
https://forum.craftlandia.com.br/xf/threads/1-5-2-e-1-8-money-e-lucro-na-tela-2020.976828/
Blz, vou dar uma estudar e montar uma, muito obrigado pela ajuda :p
 
Boa macro, as dicas do @lomexicano são excelentes!! Também indico utilizar o ^ no início das regex pra evitar fake chat, tem muito engraçadinho que fica mando fake chat no global que pode acabar confundindo a macro.
Outra coisa, a Label1 só será setada quando aparecer alguma mensagem no chat, então se a pessoa desativar o chat a label nunca irá atualizar.
Continue assim ;)
 
Status
Não está aberto para novas respostas.

Users who are viewing this thread

Voltar
Topo