Exercice en Pawn - Avancй
#1

[CENTER][SIZE="4"]Niveau des exercices : [COLOR="Red"]Avancй[/COLOR][/SIZE]

Bonjour,
ici vous trouverez des exercices qui seront а faire et а poster а la suite de ce sujet.

Si vous pensez que les exercices indiquйs sont trop faciles pour vous, regardez les autres sujets d'exercices.
Pensez а expliquer votre code, ne le postez pas bкtement, prouvez que vous avez compris ce que vous avez fait.

Vous pouvez poster un exercice, dиs que celui en cours est terminй.
Pensez а indiquer les ressources (callbacks, fonctions, tableaux, boucles etc...) pour chaque exercice afin d'aider un minimum pour rйaliser le code.


[ttable]

[tr]
[td][SIZE="3"][COLOR="DarkRed"][CENTER]Exercice[/CENTER][/COLOR][/SIZE][/td]
[td][SIZE="3"][COLOR="DarkRed"][CENTER]Rйsolution[/CENTER][/COLOR][/SIZE][/td]
[td][SIZE="3"][COLOR="DarkRed"][CENTER]Points[/CENTER][/COLOR][/SIZE][/td]
[/tr]

[tr]
[td][URL="https://sampforum.blast.hk/showthread.php?pid=3432858#pid3432858"]Exercice : 1[/URL] [ZENON][/td]
[td][URL="https://sampforum.blast.hk/showthread.php?pid=3432858#pid3432858"]Rйsolution [/URL] [Ivory][/td]
[td]:cool:[/td]
[/tr]

[tr]
[td][URL="https://sampforum.blast.hk/showthread.php?pid=3433694#pid3433694"]Exercice : 2[/URL] [Ivory][/td]
[td][URL="https://sampforum.blast.hk/showthread.php?pid=3438103#pid3438103"]Rйsolution [/URL] [Sunaxx][/td]
[td]:cool:[/td]
[/tr]

[tr]
[td][URL="https://sampforum.blast.hk/showthread.php?pid=3442905#pid3442905"]Exercice : 3[/URL] [TheWWorld][/td]
[td][URL="https://sampforum.blast.hk/showthread.php?pid=3449021#pid3449021"]Rйsolution [/URL] [nicolaskettler][/td]
[td]:cool:[/td]
[/tr]

[tr]
[td][URL="https://sampforum.blast.hk/showthread.php?pid=3449231#pid3449231"]Exercice : 4[/URL] [S4t3k][/td]
[td][URL="https://sampforum.blast.hk/showthread.php?pid=3451701#pid3451701"]Rйsolution [/URL] [Dutheil][/td]
[td]:cool:[/td]
[/tr]

[tr]
[td][URL="https://sampforum.blast.hk/showthread.php?pid=3481948#pid3481948"]Exercice : 5[/URL] [Dutheil][/td]
[td][URL="https://sampforum.blast.hk/showthread.php?pid=3482065#pid3482065"]Rйsolution [/URL] [nicolaskettler][/td]
[td]:cool:[/td]
[/tr]

[/ttable][/CENTER]
Reply
#2

Faites un systиme de textdraw (beau ou moche on s'en fiche) qui saute des lignes tous les X caractиres aprиs le mot saisit, vous aurez besoin des %, de STRLEN principalement.
Reply
#3

Code:
#define MAX_CHAR_BY_LINE                            50

new PlayerText:textdraw[MAX_PLAYERS];
public OnPlayerConnect(playerid)
{
    // CHARGEMENT DU TEXTDRAW
    textdraw[playerid] = CreatePlayerTextDraw(playerid,484.000000, 167.000000, "text");
    PlayerTextDrawBackgroundColor(playerid,textdraw[playerid], -1);
    PlayerTextDrawFont(playerid,textdraw[playerid], 1);
    PlayerTextDrawLetterSize(playerid,textdraw[playerid], 0.180000, 1.000000);
    PlayerTextDrawColor(playerid,textdraw[playerid], 255);
    PlayerTextDrawSetOutline(playerid,textdraw[playerid], 0);
    PlayerTextDrawSetProportional(playerid,textdraw[playerid], 1);
    PlayerTextDrawSetShadow(playerid,textdraw[playerid], 0);
    PlayerTextDrawSetSelectable(playerid,textdraw[playerid], 0);
    return 1;
}
stock ShowTextDrawForPlayer(playerid, text[])
{
    new str[256], line=0;
    [COLOR="DarkGreen"]// format(str, sizeof str, text);[/COLOR]
    strunpack(str, text); [COLOR="Green"]// EDIT - format remplacer par strunpack (plus rapide car  ne gиre pas les arguments)[/COLOR]
    for(new i = 0; i < strlen(str); i++){
        line++;
        if(line >= MAX_CHAR_BY_LINE && str[i] == ' ') strins(str, "~n~", i), line = 0;
    }
    convert_encoding(str);
    PlayerTextDrawSetString(playerid, textdraw[playerid], str);
    PlayerTextDrawShow(playerid, textdraw[playerid]);
    return 1;
}
stock convert_encoding(string[])    // CONVERSION DES CARACTERES SPECIAUX
{
    new original[50] = {192,193,194,196,198,199,200,201,202,203,204,205,206,207,210,211,212,214,217,218,219,220,223,224,225,226,228,230,231,232,233,234,235,236,237,238,239,242,243,244,246,249,250,251,252,209,241,191,161,176};
    new fixed[50] = {128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,94,124};
    new len = strlen(string);
    for (new i; i < len; i++) {
        for(new j;j < 50;j++) {
            if(string[i] == original[j]) {
                string[i] = fixed[j];
                break;
            }
        }
    }
}

Voila, alors pas eu besoin de '%', strins fait parfaitement l'affaire :).

- Je dйfinie une directive 'define' pour indiquer au bout de combien de caractиre ce fera mon retour а la ligne.
- Je charge les caractйristique du textdraw dans "OnPlayerConnect" puisque j'ai utilisй les textdraw propre au joueur.

- Je crйй une fonction avec un paramиtre 'text' pour indiquer le texte а afficher :
Dans cette fonction je stock sur 'str' mon paramиtre 'text' et je dйfinie une variable nommй 'line' qui m'indiquera quand le retour а la ligne doit ce faire sur cette ligne. je lance une boucle 'for' qui ce rйpйtera sur chaque caractиre de 'str', j'incrйmente 'line' а chaque lancement de la boucle et si line >= MAX_CHAR_BY_LINE et que je suis sur un caractиre qui est un espace alors j'insиre '~n~' avec strins et rйinitialise line а 0 pour la prochaine ligne.
Ensuite j'utilise la fonction 'convert_encoding' sur 'str' afin fixй les caractиres spйciaux (si il y en a) pour le textdraw, j'affecte la variable 'str' sur le textdraw et je l'affiche au joueur.

Voila j'espиre que c'est comprйhensible ^^.
Reply
#4

Code:
stock ShowTextDrawForPlayer(playerid, text[])
{
    new str[256], line=0;
    [B][COLOR="Red"]format(str, sizeof str, text);[/COLOR][/B]
    for(new i = 0; i < strlen(str); i++){
        line++;
        if(line >= MAX_CHAR_BY_LINE && str[i] == ' ') strins(str, "~n~", i), line = 0;
    }
    convert_encoding(str);
    PlayerTextDrawSetString(playerid, textdraw[playerid], str);
    PlayerTextDrawShow(playerid, textdraw[playerid]);
    return 1;
}

Au lieu d'utiliser format, je te conseille d'utiliser, strcat, strins ou strunpack (le plus rapide).

Et ici ta boucle est infini, а aucun moment tu incrйmentes ta variable i.
Reply
#5

la variable 'i' est incrйmenter dans la boucle for 'for(new i = 0; i<strlen(str); [COLOR="Red"]i++[/COLOR])', enfin j'ai toujours procйder ainsi, on incrйmente i manuellement si on utilise 'while' non ?
Reply
#6

@Ivory: Oui t'as raison, j'sais pas pq Dutheil a dit зa.
Reply
#7

Bah ouaip, voila j'ai йdit le code pour strunpack :)
Reply
#8

ouah laisse tomber, j'pas pourquoi j'ai dit зa ptddr
par contre, ta variable line te sert а rien, utilise directement i
Reply
#9

Allй on reste sur les textdraw, je met au dйfi celui qui rйalisera une fonction qui permet de dйplacer en mouvement un textdraw quelconque. Je conseil d'utiliser le plugin YSF qui peut apporter un peu plus de faciliter avec la fonction 'TextDrawSetPos' proposer par la librairie de ce plugin. La fonction doit aussi pouvoir gйrer la vitesse de dйplacement du textdraw (timer) et son pas de dйplacement. Vous aurez surement besoin de mettre en place un timer pour update la position.

Good luck !! :)
Reply
#10

Ivory;3433694 Wrote:Allй on reste sur les textdraw, je met au dйfi celui qui rйalisera une fonction qui permet de dйplacer en mouvement un textdraw quelconque. Je conseil d'utiliser le plugin YSF qui peut apporter un peu plus de faciliter avec la fonction 'TextDrawSetPos' proposer par la librairie de ce plugin. La fonction doit aussi pouvoir gйrer la vitesse de dйplacement du textdraw (timer) et son pas de dйplacement. Vous aurez surement besoin de mettre en place un timer pour update la position.

Good luck !! :)
Je croit qu'on a tous la flemme :p c'est vrai qu'utiliser les textdraw c'est chiant surtout le temps qu'on doit passer dessus :/
Reply
#11

J'ai йditй le premier post
Reply
#12

La fonction :

Code:
/*
    Description : Permet de deplacer un textdraw en fonction de l'angle choisi.

    td : le textdraw
    X, Y : Positions initiales du textdraw
    Angle : Angle de deplacement en degrй
    Vitesse : Vitesse de deplacement
*/

forward MoveTextdrawAngle(Text:td, &amp;Float:X, &amp;Float:Y, Float:Angle, Float:Vitesse);
public MoveTextdrawAngle(Text:td, &amp;Float:X, &amp;Float:Y, Float:Angle, Float:Vitesse)
{
    X += floatcos(Angle, degrees)*Vitesse ;
    Y += floatsin(Angle, degrees)*Vitesse ;

    TextDrawSetPos(td, X, Y);

    return 1;
}

Expliquation :

C'est trйs simple, il faut juste calculer le cosinus et le sinus de l'angle du dйplacement et l'ajouter aux positions du textdraw sans oublier de le multiplier avec la vitesse. Une fois ceci fait, on met au textdraw sa nouvelle position avec TextDrawSetPos disponible dans YSF.

Utilisation :

Voici un script qui permet de dйplacer un textdraw avec le clic droit de la souris :

D'abords les variables et leurs initialisation :

Code:
new Text:SUNAXX;
new Float:SUNAXXPOS[2];

public OnGameModeInit()
{
    SUNAXXPOS[0] = 100.0; SUNAXXPOS[1] = 100.0;

    SUNAXX = TextDrawCreate(SUNAXXPOS[0],SUNAXXPOS[1],"SUNAXX");

    return 1;
}

Puis un timer qui va tester tout les 0.05sec si le joueur clique bien sur 'KEY_FIRE' pour deplacer le textdraw ensuite.


Code:
forward MoveTextdrawUpdate(playerid);
public MoveTextdrawUpdate(playerid)
{
    new Keys,ud,lr;
    GetPlayerKeys(playerid,Keys,ud,lr);

    if(Keys == KEY_FIRE)
    {
        MoveTextdrawAngle(SUNAXX, SUNAXXPOS[0], SUNAXXPOS[1], 60.0, 8.5);
        TextDrawShowForPlayer(playerid, SUNAXX);
    }

    return 1;
}

CMD:ok(playerid, params[])
{
      SetTimerEx("MoveTextdrawUpdate", 50, true, "i", playerid);

      return SendClientMessage(playerid, -1, "Clic droit pour deplacer le textdraw!");
}

Voila !
Reply
#13

Propose un nouvel exercice ! (йvite les textdraw car sinon on va faire que зa)
Reply
#14

Le prochain devra crйer un script qui fait spawn un objet et qui demande au joueur si il veut l'enregistrer dans un fichier, si oui, зa l'enregistre et le recharge au prochain reboot.

Genre

/objet [ID] [SAVE(OUI/NON]

Vous aurez besoin de

-ZCMD
-sscanf
-de boucles
-des fonctions qui gиre les fichiers (Dini par exemple ou l'include par dйfaut)
Reply
#15

terminй, tiens:
PHP Code:
#include &lt;zcmd&gt;
#include &lt;dini&gt;
#include &lt;sscanf2&gt;
#define MAX_OBJECTS 500
new totalobjets 0;
enum ObInfo
{
    
Model,
    
Float:Pos[3];
}
new 
ObjetInfo[MAX_OBJECTS][ObInfo];

public 
OnGameModeInit()
{
    
LoadObjects();
    return 
1;
}

stock LoadObjects()
{
    new 
string[128];
     for(new 
1&ltMAX_OBJECTSi++)
    {
        
format(string,sizeof(string),"objets/%d.ini",i);
        if(
dini_Exists(string))
        {
        
ObjetInfo[i][Pos][0] = dini_Float(string"X");
        
ObjetInfo[i][Pos][1] = dini_Float(string"Y");
        
ObjetInfo[i][Pos][2] = dini_Float(string"Z");
        
ObjetInfo[i][Model] = dini_Int(string"Model");
        
CreateObject(ObjetInfo[i][Model], ObjetInfo[i][Pos][0], ObjetInfo[i][Pos][1], ObjetInfo[i][Pos][2], 000100);
        
totalobjets += 1;
        }
    }
    return 
1;
}

stock SaveObject(objet)
{
    new 
string[128];
    
format(string,sizeof(string),"objets/%d.ini",objet);
    if(
dini_Exists(string))
    {
    
dini_IntSet(string"Model"ObjetInfo[objet][Model]);
    
dini_FloatSet(string"X"ObjetInfo[objet][Pos][0]); 
    
dini_FloatSet(string"Y"ObjetInfo[objet][Pos][1]);
    
dini_FloatSet(string"Z"ObjetInfo[objet][Pos][2]);
    }
    else {
    
dini_Create(string);
    
dini_IntSet(string"Model"ObjetInfo[objet][Model]);
    
dini_FloatSet(string"X"ObjetInfo[objet][Pos][0]); 
    
dini_FloatSet(string"X"ObjetInfo[objet][Pos][1]);
    
dini_FloatSet(string"X"ObjetInfo[objet][Pos][2]);    
    }
    return 
1;
}

CMD:objet(playeridparams[])
{
    new 
idcdt[5], Float:PosJ[3];
    if(
sscanf(params"is[5]"idcdt)) return SendClientMessage(playerid, -1"Commande: /objet ID [SAVE(OUI/NON)]");
    if(
strcmp(cdt"OUI"true) == 0)
    {
    
totalobjets += 1;
    new 
objet totalobjets;
    
GetPlayerPos(playeridPosJ[0], PosJ[1], PosJ[2]);
    for(new 
0&lt3i++) ObjetInfo[objet][Pos][i] = PosJ[i];
    
ObjetInfo[objet][Model] = id;
    
CreateObject(idPosJ[0], PosJ[1], PosJ[2], 000100);
    
SetPlayerPos(playeridPosJ[0]+2PosJ[1]+2PosJ[2]);
    
SaveObject(objet);
    }
    else if(
strcmp(cdt"NON"true) == 0)
    {
    
GetPlayerPos(playeridPosJ[0], PosJ[1], PosJ[2]);
    
CreateObject(modelidPosJ[0], PosJ[1], PosJ[2], 000100);
    
SetPlayerPos(playeridPosJ[0]+2PosJ[1]+2PosJ[2]);
    }
    else return 
SendClientMessage(playerid, -1"SAVE doit кtre OUI OU NON !!!!!!! PFFFF");
    return 
1;

Reply
#16

FAIL DOUBLE POSTE, SORRY
Reply
#17

dini mdr t'as fait fort hein
Optimisable de beaucoup de faзons, mais bon, vu que зa fonctionne on va en rester la

Prochain exercice, codez moi une commande "/veh [Model/Nom du vйhicule] [Couleur 1 (optionnel)] [Couleur 2 (optionnel)] [Respawn Time (optionnel)]" qui fera spawn le vйhicule de Model choisi a la position du joueur et dans le mкme sens que son angle de face (angle x). Seule contrainte, il faut que зa soit le plus optimisй possible.

Et aprиs, pour vous motiver, un deuxiиme exercice (vous кtes pas obligй de rendre les deux en mкme temps bande de mauvais йlиves) : codez moi une fonction qui va hasher le "buff" dans la "dest" avec le mode de hash choisi, puis, si l'utilisateur a passй un salt, ajouter le salt (avant ou aprиs le hash, comme vous voulez). Seule contrainte : vous n'avez pas le droit aux plugins. Vous devrez йgalement contourner une petite difficultй d'optimisation.

PHP Code:
enum e_hash_type
{
      
MD5,
      
SHA1,
      
WHIRLPOOL,
      
SHA2
}

hash(dest[], buff[], e_hash_type:hashsalt[] = "")
{


Reply
#18

Via HTTP alors?
Reply
#19

Ca ou autrement ;)
Y'a que pour les exercices dйbutant ou je donne les fonctions a utiliser (pour les experts зa peut arriver des fois), mais en avancй, le fait de chercher comment faire un truc prйcis vous aidera a mieux structurer votre pensйe et a mieux coder par la suite.
Reply
#20

PHP Code:
#include &lt;zcmd&gt;
#include &lt;sscanf2&gt;

CMD:creervehicule(playeridparams[])
{
    static 
Float:position[3], Float:anglemodelecouleur[2], respawn;
    if(
sscanf(params"dd(-1)a&lt;d&gt;(0)[2]"modelerespawncouleur)) return SendClientMessage(playerid, -1"[Utilisation]: /creervehicule [Modиle] [Temps de respawn (Optionnel)] [Couleur n°1 (Optionnel)] [Couleur n°2 (Optionnel)]");
    if(
modele &lt400 || modele &gt611) return SendClientMessage(playerid, -1"[Erreur]: Le modиle du vйhicule doit кtre compris entre 400 et 611.");

    
GetPlayerPos(playeridposition[0], position[1], position[2]);
    
GetPlayerFacingAngle(playeridangle);

    
CreateVehicle(modeleposition[0], position[1], position[2], anglecouleur[0], couleur[1], respawn);
    return 
1;


Aucune idйe si c'est le plus optimisй mais si c'est pas le cas dit le moi wlh.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)