• 09 Avril 2025, 09:18:04


Auteur Sujet: Une petite question à propos du SendClientMessage  (Lu 2128 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Romeo_Urbano

  • *
  • Tueur en série
  • Messages: 128
    • Voir le profil
Une petite question à propos du SendClientMessage
« le: 11 Mai 2014, 18:17:21 »
Bonjour Bonsoir tout le monde,

Aujourd'hui je demande de l'aide car j'ai pas trouvé la solution, mais je cherches encore comment faire, mon problème est simple:

En écrivant un message trop long, on risque de pas voir le tout par exemple je veux écrire "Salut je m'appel Romeo j'ai 18 ans" on voit que "Salut Je m'ap"

je parles pas du string, car je parles bien des longs textes qui font plus du max string de SAMP

alors moi je cherches une solution pour que quand on dépasse par exemple les 200 Caractère le message se coupe pas, mais genre il écrit un deuxième texte qui est la suite du message par exemple on a

"Salut je m'appel Romeo j'ai 18 ans"

au lieu d'avoir "Salut Je m'ap"

on aura
"Salut Je m'appe"
"pel Romeo j'ai 18 ans"

Genre Deux SendClientMessage au lieu d'un

et c'est là ou je trouves pas un truc ou un code qui genre prend l'ancien message, il élimine les 100 1er caractère et met les 100 derniers comme ça on a la suite du message.

j'espère que vous avez bien compris, sinon je peux réexpliquer en me le demandant


Merci d'avance
« Modifié: 24 Mai 2014, 08:53:04 par Gzsume »

Hors ligne Infu

  • *
  • Modo LS - Admin FnF
  • Messages: 3551
    • Voir le profil
Re : Une petite question à propos du SendClientMessage
« Réponse #1 le: 11 Mai 2014, 18:26:11 »
La première chose qui m'est venue à l'esprit c'est peut-être d'utiliser strlen(), puis strmid(). Et donc si strlen > 200 caractères, on copie le texte entre les caractères 200 et le nombre de caractères tapés.

Je risque de ne pas être explicite, mais voilà comment je procèderai à ta place ;)


Adju ♥
(-_-)



Hors ligne Romeo_Urbano

  • *
  • Tueur en série
  • Messages: 128
    • Voir le profil
Re : Une petite question à propos du SendClientMessage
« Réponse #2 le: 11 Mai 2014, 18:28:35 »
j'ai bien compris ton idée, et c'est aussi se que j'ai voulu faire, mais comment ? xd

je donnes un autre exemple, par exemple un mec a écrit: "Heey salut tout le monde chui cool"

mais on écrit que le "Tout le monde chui cool" comment éliminer le "Hey Salut"

Hors ligne Romeo_Urbano

  • *
  • Tueur en série
  • Messages: 128
    • Voir le profil
Re : Une petite question à propos du SendClientMessage
« Réponse #3 le: 11 Mai 2014, 18:35:16 »
Désolé pour le double poste mais je poste la solution, j'ai trouvé enfait xd fallait juste travailler encore plus les méninges.

Au fait la solution est strdel(Texte, Du caractère X, à caractère Y);

par exemple on a le text qui fait 200

tu bloque le 1er message en 100

puis tu mets strdel(Texte, 0, 100); alors il élimine les 100 1ers caractères.

puis tu mets le deuxième message, et voilà :D


Bonne soirée et à la prochaine

Hors ligne Pirhotau

  • *
  • Nouveau
  • Messages: 11
    • Voir le profil
Re : Une petite question à propos du SendClientMessage
« Réponse #4 le: 11 Mai 2014, 21:28:51 »
Salut!
Je sais que l'habitude n'est pas sur ce forum de poster des bouts de code tout fait, mais j'avais créé un système qui permettait de redimensionner des longues chaines de caractères pour les afficher à l'écran...
Je vous donne les deux versions que j'ai créées:
- Affichage du texte dans le chat avec "SendClientMessage"
[spoiler]
Code: (pawn) [Sélectionner]
new str[1024]; // Stockage brut du texte (cad le texte que l'on veut redimensionner)

// Système de redimensionnement:
new tmp[256]; // Stockage du texte temporaire (cad le texte que l'on va afficher)
new StrLenMax = 100; // Longueur max du texte à afficher (en nombre de caractères)
new idx; // pour le fonctionnement du strtok
if(strlen(str) > StrLenMax) // Si texte trop long
{
    new len = 0; // Longueur du texte déjà redimensionné
    while(len < strlen(str)) // Tant que la taille nouveau texte est inférieur à celle du texte d'origine (donc qu'il n'a pas été recréé en entier)
    {
// Ici, on décompose: on prend chaque mot un par un
          new str2[128]; // Stocke un mot
          str2 = strtok(str,idx); // Trouve le mot
          format(tmp,256,"%s",str2); // L'integre au début de la nouvelle ligne
         
          while(strlen(tmp) < StrLenMax) // Crée la suite de la ligne en ajoutant autant de mots que nécessaire
          {
              str2 = strtok(str,idx);
              format(tmp,256,"%s %s",tmp,str2);
          }
         
          len = len + strlen(tmp) + 1; // Enregistre la longueur de texte redimensionné
          SendClientMessageToAll(COLOR_BL,tmp); // Affiche le texte
    }
}
else // Si le texte est suffisement court, l'afficher directement
{
     SendClientMessageToAll(COLOR_BL,str);
}
Je résume: entrée: str, sortie: SendClientMessage
[/spoiler]


- La deuxième version qui permet d'afficher le texte dans un dialog par exemple. (En sortie, on obtient une chaine de caractère qui comporte des retours à la ligne)
[spoiler]
Code: (pawn) [Sélectionner]
new str[256]; // Texte de départ
                       
 // Redimensionnement du texte:
new tmp[256]; // Stockage du texte temporaire
new StrLenMax = 60; // Longueur max du texte à afficher
new msg[512]; // Stockage du message final

 if(strlen(str) > StrLenMax) // Si texte trop long
{
      new len = 0; // Longueur du texte déjà redimensionné
      new bool:PremiereLigne = true;
      while(len < strlen(str)) // Tant que le nouveau texte est inférieur au texte d'origine (donc qu'il n'a as été recréé en entier)
       {
             new str2[128]; // Stocke un mot
             str2 = strtok(str,idx); // Trouve le mot
             format(tmp,256,"%s",str2); // L'integre au début de la nouvelle ligne

             while(strlen(tmp) < StrLenMax) // Crée la suite de la ligne en ajoutant autant de mots que nécessaire
             {
                    str2 = strtok(str,idx);
                    format(tmp,256,"%s %s",tmp,str2);
             }

             len += strlen(tmp) + 1; // Enregistre la longueur de texte redimensionné

              // Colle les bouts ensemble:
              if(PremiereLigne == false)
              {
                    format(msg,512,"%s\n%s",msg,tmp);
              }
              if(PremiereLigne == true)
              {
                    format(msg,512,"%s",tmp);
                    PremiereLigne = false;
              }
        }
}
else // Si le texte est suffisement court, l'afficher directement
{
         format(msg,512,"%s",str);
}
Je résume: entrée: str, sortie: msg
[/spoiler]


Je ne vous encourage pas à le recopier bêtement pour la simple et bonne raison qu'il est très loin d'être optimisé (notamment en ce qui concerne la longueur de chaînes de caractères), mais aussi parce que vous pouvez aisément créer le votre! :)
L'avantage de ce système, c'est que les mots ne sont pas coupés n'importe comment.

Voilà!
Enjoy!
« Modifié: 11 Mai 2014, 21:35:15 par Pirhotau »
Projets:
- FS qui contient de nombreux jeux (Chasse au trésor, course de voitures, braquage d'un fourgon, minis jeux divers (ambulancier, vendeur de glaces...)...) (projet principal)
- FS qui contient un compteur de vitesse, une jauge de carburant, péages et radars (inspirés de scripts de PPC, mais réécris et adaptés à mes besoins), affichage des noms de voitures (réécrit et adapté d'un script de Biltong), concessionnaire automobile.
- FS qui regroupe un grand nombre de commandes utiles (enregistrement dans un fichier de coordonnés pour la création d'objets) ou inutiles (changement de l'heure).
- Des ajouts au GM "LVDM" (gestion de la santé par exemple...)


Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : Une petite question à propos du SendClientMessage
« Réponse #5 le: 11 Mai 2014, 22:21:44 »
Salut, j'ai pas testé mais je pense que ça marche.
C'est commenté, si vous ne comprenez pas, demandez.

Code: (pawn) [Sélectionner]
SendClientMessageEx(playerid, color, message[])
{
new tmp[128];
new len;
new index;

/* On récupère la taille du message */
len = strlen(message);
index = 0;

/* Tant que notre index est plus petit que la taille du texte, alors on exécute la boucle */
while(index < len)
{
/* Si le message à partir de notre index est supérieur à 128 caractères */
if(strlen(message[index]) >= 128)
{
/* On copie dans la variable tmp, les 128 caractères */
format(tmp, sizeof(tmp), message[index]);
/* on augmente notre index de 128 */
index += 128;
/* on affiche le contenue de tmp */
SendClientMessage(playerid, color, tmp);
}
/* sinon si le message à partir d'index est inférieur à 128 caractères */
else
{
/* Alors on affiche le message */
SendClientMessage(playerid, color, message[index]);
/* et fait en sorte que la boucle ne s'execute plus */
index = len;
}
}
}



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne Pirhotau

  • *
  • Nouveau
  • Messages: 11
    • Voir le profil
Re : Une petite question à propos du SendClientMessage
« Réponse #6 le: 11 Mai 2014, 22:52:25 »
Ah! Moi, je pense qu'il y a un problème. (Vous avez le droit de me contre-dire).
Mais le texte va être afficher un gros paquet de fois avec à chaque fois une lettre en plus:

Code: (pawn) [Sélectionner]
       while(index < len)
        {
                /* Si le message à partir de notre index est supérieur à 128 caractères */
                if(strlen(message[index]) >= 128)
                {
                        /* On copie dans la variable tmp, les 128 caractères */
                        format(tmp, sizeof(tmp), message[index]);
                        /* on augmente notre index de 128 */
                        index += 128;
                        /* on affiche le contenue de tmp */
                        SendClientMessage(playerid, color, tmp);               // Il faudrait sortir cette fonction de la boucle...
                }
    [...]
        }
Projets:
- FS qui contient de nombreux jeux (Chasse au trésor, course de voitures, braquage d'un fourgon, minis jeux divers (ambulancier, vendeur de glaces...)...) (projet principal)
- FS qui contient un compteur de vitesse, une jauge de carburant, péages et radars (inspirés de scripts de PPC, mais réécris et adaptés à mes besoins), affichage des noms de voitures (réécrit et adapté d'un script de Biltong), concessionnaire automobile.
- FS qui regroupe un grand nombre de commandes utiles (enregistrement dans un fichier de coordonnés pour la création d'objets) ou inutiles (changement de l'heure).
- Des ajouts au GM "LVDM" (gestion de la santé par exemple...)


Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : Une petite question à propos du SendClientMessage
« Réponse #7 le: 11 Mai 2014, 23:00:33 »
Je viens de tester, aucun problème ça fonctionne comme il faut.
Voici le code.

Code: (pawn) [Sélectionner]
#include <a_samp>

main()
{
}

public OnFilterScriptInit()
{
SendClientMessageEx(-1, -1,
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" \
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
}

SendClientMessageEx(playerid, color, message[])
{
        new tmp[128];
        new len;
        new index;
       
        /* On récupère la taille du message */
        len = strlen(message);
        index = 0;
       
        /* Tant que notre index est plus petit que la taille du texte, alors on exécute la boucle */
        while(index < len)
        {
                /* Si le message à partir de notre index est supérieur à 128 caractères */
                if(strlen(message[index]) >= 128)
                {
                        /* On copie dans la variable tmp, les 128 caractères */
                        format(tmp, sizeof(tmp), message[index]);
                        /* on augmente notre index de 128 */
                        index += 128;
                        /* on affiche le contenue de tmp */
                        //SendClientMessage(playerid, color, tmp);     
printf("- %s\n", tmp);
                }
                /* sinon si le message à partir d'index est inférieur à 128 caractères */
                else
                {
                        /* Alors on affiche le message */
                        //SendClientMessage(playerid, color, message[index]);
printf("- %s\n", message[index]);

                        /* et fait en sorte que la boucle ne s'execute plus */
                        index = len;
                }
        }
}




Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne Pirhotau

  • *
  • Nouveau
  • Messages: 11
    • Voir le profil
Re : Une petite question à propos du SendClientMessage
« Réponse #8 le: 11 Mai 2014, 23:33:21 »
Je m'incline!  :grin:
Projets:
- FS qui contient de nombreux jeux (Chasse au trésor, course de voitures, braquage d'un fourgon, minis jeux divers (ambulancier, vendeur de glaces...)...) (projet principal)
- FS qui contient un compteur de vitesse, une jauge de carburant, péages et radars (inspirés de scripts de PPC, mais réécris et adaptés à mes besoins), affichage des noms de voitures (réécrit et adapté d'un script de Biltong), concessionnaire automobile.
- FS qui regroupe un grand nombre de commandes utiles (enregistrement dans un fichier de coordonnés pour la création d'objets) ou inutiles (changement de l'heure).
- Des ajouts au GM "LVDM" (gestion de la santé par exemple...)