Portal SAMP
[Ajuda] Ajuda com OnPlayerText - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] Ajuda com OnPlayerText (/showthread.php?tid=4815)



Ajuda com OnPlayerText - Alfarr Heimrik - 23/06/2024

Bom dia.
Estou precisando de suporte para utilizar a quebra de linha e me dar uma luz quanto a logica, estou
quebrando a cabeça desde ontem, talvez seja algo simples.


Eu preciso arrumar isso ... Eu deveria ter usado switch, mas não sei bem como faz.
O código vai verificar se o player é admin ou civil, para ambos os casos a mensagem será enviada.
Aproveitei e pesquisei como fazer um sistema de quebra de linha, e me veio esse. Tem como diminuir esse código,
deixar ele mais prático?
Para cada level admin, eu preciso que o sistema de quebra de linha seja integrado. Como eu poderia fazer?


Código PHP:
public OnPlayerText(playeridtext[])
{
    new 
String[128], String2[128], Message[128];
    if(strlen(text) > 75)
    {
    
    if(Player[playerid][pAdmin] == 0)
    
    {
        
    format(String2sizeof String2text[75]);
        
    strdel(text75149);
        
    format(Stringsizeof(String), "%s[%d]: %s"pName(playerid), playeridtext);
        
    ProxDetector(20.0playeridStringCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    ProxDetector(20.0playeridString2COLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    return 0;
    
    }
    }
    else
    {
    
    if(Player[playerid][pAdmin] == 0)
    
    {
        
    format(Stringsizeof(String), "%s[%d]: %s"pName(playerid), playeridtext);
        
    ProxDetector(20.0playeridStringCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
    
    }
        return 
0;
    }
    if(
Player[playerid][pAdmin] == 0)
    {
        
format(Messagesizeof(Message), "%s[%d]: %s"pName(playerid), playeridtext);
        ProxDetector(20.0playeridMessageCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        return 0;
    }
    if(Player[playerid][pAdmin] == 1)
    {
        
format(Messagesizeof(Message), "{FFFF00}[Ajudante] {CFCFCF}%s[%d]: %s"pName(playerid), playeridtext);
        ProxDetector(20.0playeridMessageCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        return 0;
    }
    if(Player[playerid][pAdmin] == 2)
    {
        
format(Messagesizeof(Message), "{00FF00}[Moderador] {CFCFCF}%s[%d]: %s"pName(playerid), playeridtext);
        ProxDetector(20.0playeridMessageCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        return 0;
    }
    if(Player[playerid][pAdmin] == 3)
    {
        
format(Messagesizeof(Message), "{FF0000}[Administrador] {CFCFCF}%s[%d]: %s"pName(playerid), playeridtext);
        ProxDetector(20.0playeridMessageCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        return 0;
    }
    if(Player[playerid][pAdmin] == 4)
    {
        
format(Messagesizeof(Message), "{FFA500}[Gerente] {CFCFCF}%s[%d]: %s"pName(playerid), playeridtext);
        ProxDetector(20.0playeridMessageCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        return 0;
    }
    if(Player[playerid][pAdmin] == 5)
    {
        
format(Messagesizeof(Message), "{0000FF}[Diretor] {CFCFCF}%s[%d]: %s"pName(playerid), playeridtext);
        ProxDetector(20.0playeridMessageCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        return 0;
    }
    if(Player[playerid][pAdmin] == 6)
    {
        
format(Messagesizeof(Message), "{4B0082}[Fundador] {CFCFCF}%s[%d]: %s"pName(playerid), playeridtext);
        ProxDetector(20.0playeridMessageCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        return 0;
    }
    return 
1;




RE: Ajuda com OnPlayerText - White_Blue - 23/06/2024

Não entendi o objetivo desse código. O que você quer fazer é quebrar a string caso for grande demais?


RE: Ajuda com OnPlayerText - Alfarr Heimrik - 23/06/2024

(23/06/2024 12:20)White_Blue Escreveu: Não entendi o objetivo desse código. O que você quer fazer é quebrar a string caso for grande demais?

Como pode ver, eu estou usando esse sistema de tags-chat, eu queria saber se tem alguma forma de otimizar o código (diminuindo as linhas).
O sistema de ' quebra de linha ' foi algo que estava implementando, ai eu coloquei ele no post juntamente do código para que aquele que for me ajudar, me mostre como eu devo utilizar ele com o sistema de tag-chat mais otimizado.

Por exemplo: Tem como diminuir esse código? Parece até que estou programando java ... kkk
Código PHP:
public OnPlayerText(playeridtext[])
{
    new 
String[128], String2[128], Message[128];
    if(strlen(text) > 75)
    {
    
    if(Player[playerid][pAdmin] == 0)
    
    {
        
    format(String2sizeof String2text[75]);
        
    strdel(text75149);
        
    format(Stringsizeof(String), "%s[%d]: %s"pName(playerid), playeridtext);
        
    ProxDetector(20.0playeridStringCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    ProxDetector(20.0playeridString2COLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    return 0;
    
    }
    
    if(Player[playerid][pAdmin] == 1)
    
    {
        
    format(String2sizeof String2text[75]);
        
    strdel(text75149);
        
    format(Stringsizeof(String), "%s[%d]: %s"pName(playerid), playeridtext);
        
    ProxDetector(20.0playeridStringCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    ProxDetector(20.0playeridString2COLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    return 0;
    
    }
    
    if(Player[playerid][pAdmin] == 2)
    
    {
        
    format(String2sizeof String2text[75]);
        
    strdel(text75149);
        
    format(Stringsizeof(String), "%s[%d]: %s"pName(playerid), playeridtext);
        
    ProxDetector(20.0playeridStringCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    ProxDetector(20.0playeridString2COLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    return 0;
        }
    
    if(Player[playerid][pAdmin] == 4)
    
    {
        
    format(String2sizeof String2text[75]);
        
    strdel(text75149);
        
    format(Stringsizeof(String), "%s[%d]: %s"pName(playerid), playeridtext);
        
    ProxDetector(20.0playeridStringCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    ProxDetector(20.0playeridString2COLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    return 0;
    
    }
    
    if(Player[playerid][pAdmin] == 5)
    
    {
        
    format(String2sizeof String2text[75]);
        
    strdel(text75149);
        
    format(Stringsizeof(String), "%s[%d]: %s"pName(playerid), playeridtext);
        
    ProxDetector(20.0playeridStringCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    ProxDetector(20.0playeridString2COLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    return 0;
    
    }
    
    if(Player[playerid][pAdmin] == 6)
    
    {
        
    format(String2sizeof String2text[75]);
        
    strdel(text75149);
        
    format(Stringsizeof(String), "%s[%d]: %s"pName(playerid), playeridtext);
        
    ProxDetector(20.0playeridStringCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    ProxDetector(20.0playeridString2COLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    return 0;
    
    }
    }
    return 
1;




RE: Ajuda com OnPlayerText - White_Blue - 23/06/2024

(23/06/2024 17:46)Alfarr Heimrik Escreveu:
(23/06/2024 12:20)White_Blue Escreveu: Não entendi o objetivo desse código. O que você quer fazer é quebrar a string caso for grande demais?

Como pode ver, eu estou usando esse sistema de tags-chat, eu queria saber se tem alguma forma de otimizar o código (diminuindo as linhas).
O sistema de ' quebra de linha ' foi algo que estava implementando, ai eu coloquei ele no post juntamente do código para que aquele que for me ajudar, me mostre como eu devo utilizar ele com o sistema de tag-chat mais otimizado.

Por exemplo: Tem como diminuir esse código? Parece até que estou programando java ... kkk
Código PHP:
public OnPlayerText(playeridtext[])
{
    new 
String[128], String2[128], Message[128];
    if(strlen(text) > 75)
    {
    
    if(Player[playerid][pAdmin] == 0)
    
    {
        
    format(String2sizeof String2text[75]);
        
    strdel(text75149);
        
    format(Stringsizeof(String), "%s[%d]: %s"pName(playerid), playeridtext);
        
    ProxDetector(20.0playeridStringCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    ProxDetector(20.0playeridString2COLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    return 0;
    
    }
    
    if(Player[playerid][pAdmin] == 1)
    
    {
        
    format(String2sizeof String2text[75]);
        
    strdel(text75149);
        
    format(Stringsizeof(String), "%s[%d]: %s"pName(playerid), playeridtext);
        
    ProxDetector(20.0playeridStringCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    ProxDetector(20.0playeridString2COLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    return 0;
    
    }
    
    if(Player[playerid][pAdmin] == 2)
    
    {
        
    format(String2sizeof String2text[75]);
        
    strdel(text75149);
        
    format(Stringsizeof(String), "%s[%d]: %s"pName(playerid), playeridtext);
        
    ProxDetector(20.0playeridStringCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    ProxDetector(20.0playeridString2COLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    return 0;
        }
    
    if(Player[playerid][pAdmin] == 4)
    
    {
        
    format(String2sizeof String2text[75]);
        
    strdel(text75149);
        
    format(Stringsizeof(String), "%s[%d]: %s"pName(playerid), playeridtext);
        
    ProxDetector(20.0playeridStringCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    ProxDetector(20.0playeridString2COLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    return 0;
    
    }
    
    if(Player[playerid][pAdmin] == 5)
    
    {
        
    format(String2sizeof String2text[75]);
        
    strdel(text75149);
        
    format(Stringsizeof(String), "%s[%d]: %s"pName(playerid), playeridtext);
        
    ProxDetector(20.0playeridStringCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    ProxDetector(20.0playeridString2COLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    return 0;
    
    }
    
    if(Player[playerid][pAdmin] == 6)
    
    {
        
    format(String2sizeof String2text[75]);
        
    strdel(text75149);
        
    format(Stringsizeof(String), "%s[%d]: %s"pName(playerid), playeridtext);
        
    ProxDetector(20.0playeridStringCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    ProxDetector(20.0playeridString2COLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
    return 0;
    
    }
    }
    return 
1;


Nesse tipo de verificação, é melhor utilizar a estrutura condicional switch do que blocos de ifs, pois é mais rápido e organizado. Além disso, não é necessário retornar 0 em cada verificação, basta retornar 0 no final da callback.

e.g
Código PHP:
public OnPlayerText(playeridtext[]) {
       switch(
Player[playerid][pAdmin]) {
          case 
1: {
           
// Código para level 1 de admin
          
}
          
// ...
          
default: {
            
// Caso nenhuma das condições dos cases acima forem satisfeitas (caso o jogador não for um admin por exemplo), pulará para a cláusula default
          
}
       }
       return 
0// Retorna 0 aqui para evitar duplicar as mensagens


Mais informações: https://www.est.ufmg.br/~cristianocs/Pacotes2021/Aula4.pdf#Outline0.2.3.8


RE: Ajuda com OnPlayerText - Alfarr Heimrik - 23/06/2024

(23/06/2024 20:01)White_Blue Escreveu:
(23/06/2024 17:46)Alfarr Heimrik Escreveu:
Código PHP:
public OnPlayerText(playeridtext[])
{
    ....... 

Nesse tipo de verificação, é melhor utilizar a estrutura condicional switch do que blocos de ifs, pois é mais rápido e organizado. Além disso, não é necessário retornar 0 em cada verificação, basta retornar 0 no final da callback.

e.g
Código PHP:
public OnPlayerText(playeridtext[]) {
       ........ 

Mais informações: https://www.est.ufmg.br/~cristianocs/Pacotes2021/Aula4.pdf#Outline0.2.3.8


Então é assim que se usa switch ... Certo. Muito obrigado.
Para a quebra de linha, eu tenho que repetir o código em todas as condições?
Seria possível fazer só uma vez, e todo player que falar independente do cargo, ele seria atingido pela quebra de linha?


RE: Ajuda com OnPlayerText - BitSain - 24/06/2024

Foi mal ae, mas até agora não entendi essa quebra se linha que você tanto cita..
Se puder exemplificar eu fico grato


RE: Ajuda com OnPlayerText - Alfarr Heimrik - 24/06/2024

(24/06/2024 08:48)BitSain Escreveu: Foi mal ae, mas até agora não entendi essa quebra se linha que você tanto cita..
Se puder exemplificar eu fico grato

Ue, mas não é assim que se faz?

Código PHP:
if(strlen(text) > 75){
format(String2sizeof String2text[75]);
            strdel(text75149);
            format(Stringsizeof(String), "%s[%d]: %s"pName(playerid), playeridtext);
            ProxDetector(20.0playeridStringCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
            ProxDetector(20.0playeridString2COLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);




RE: Ajuda com OnPlayerText - BitSain - 24/06/2024

Entendi o que você quer fazer.
Otimizei o código pra você além de também melhorar e corrigir a questão da quebra de linha.
Quando o texto tem um size maior que 75, ele quebra em 2 partes:
Código PHP:
public OnPlayerText(playeridtext[]){ 
    
new String[128], textPart1[128], textPart2[128];
    
    
static const prefixos[7][64] = {
        "%s[%d]: %s"// Civil
        "{FFFF00}[Ajudante] {CFCFCF}%s[%d]: %s"// Ajudante
        "{00FF00}[Moderador] {CFCFCF}%s[%d]: %s"// Moderador
        "{FF0000}[Administrador] {CFCFCF}%s[%d]: %s"// Administrador
        "{FFA500}[Gerente] {CFCFCF}%s[%d]: %s"// Gerente
        "{0000FF}[Diretor] {CFCFCF}%s[%d]: %s"// Diretor
        "{4B0082}[Fundador] {CFCFCF}%s[%d]: %s" // Fundador
    };

    if(strlen(text) > 75) {
        strmid(textPart1text075sizeof(textPart1));
        strmid(textPart2text75strlen(text), sizeof(textPart2));
        
        format
(Stringsizeof(String), prefixos[Player[playerid][pAdmin]], pName(playerid), playeridtextPart1);
        ProxDetector(20.0playeridStringCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
        
        format
(Stringsizeof(String), prefixos[Player[playerid][pAdmin]], pName(playerid), playeridtextPart2);
        ProxDetector(20.0playeridStringCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
    }
    else {
        format(Stringsizeof(String), prefixos[Player[playerid][pAdmin]], pName(playerid), playeridtext);
        ProxDetector(20.0playeridStringCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREYCOLOR_GREY);
    }
    return false//true envia a mensagem global do samp. False desativa isso


(Se eu não me engano, o samp já faz a quebra de linha automaticamente, sem a necessidade de criar essa observação ao enviar a mensagem.

Outra coisa é que, por exemplo, se a posição 70-76 for uma palavra, a 76 seria a part2 que seria a última letra da palavra, e com isso, em algumas ocasiões dependendo do "text" seria enviado uma unica palavra no chat do jogador, onde seria viável completar a palavra na part1
Tipo:
Texto original: ola meu nome é BitSain
Suponhamos que o texto original tenha um size > 75:
Part1: ola meu nome é BitSai
Part2: n
)


RE: Ajuda com OnPlayerText - Alfarr Heimrik - 24/06/2024

(24/06/2024 12:37)BitSain Escreveu: Entendi o que você quer fazer.
Otimizei o código pra você além de também melhorar e corrigir a questão da quebra de linha.
Quando o texto tem um size maior que 75, ele quebra em 2 partes:

Entendi. Vou estudar essas funções. Obrigado pelo conteúdo.