Exercice en Pawn - Avancй -
Dutheil - 16.04.2015
[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]
Re : Exercice en Pawn - Avancй -
Z3N0N - 16.04.2015
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.
Re : Exercice en Pawn - Avancй -
Ivory - 17.04.2015
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 ^^.
Re : Exercice en Pawn - Avancй -
Dutheil - 17.04.2015
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.
Re : Exercice en Pawn - Avancй -
Ivory - 17.04.2015
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 ?
Re : Exercice en Pawn - Avancй -
Chipardeur - 17.04.2015
@Ivory: Oui t'as raison, j'sais pas pq Dutheil a dit зa.
Re : Exercice en Pawn - Avancй -
Ivory - 17.04.2015
Bah ouaip, voila j'ai йdit le code pour strunpack :)
Re : Exercice en Pawn - Avancй -
Dutheil - 17.04.2015
ouah laisse tomber, j'pas pourquoi j'ai dit зa ptddr
par contre, ta variable line te sert а rien, utilise directement
i
Re : Exercice en Pawn - Avancй -
Ivory - 17.04.2015
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 !! :)
Re : Exercice en Pawn - Avancй -
TheWWorld - 19.04.2015
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 :/
Re : Exercice en Pawn - Avancй -
Vukilore - 19.04.2015
J'ai йditй le premier post
Re : Exercice en Pawn - Avancй -
Sunaxx - 22.04.2015
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, &Float:X, &Float:Y, Float:Angle, Float:Vitesse);
public MoveTextdrawAngle(Text:td, &Float:X, &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 !
Re : Exercice en Pawn - Avancй -
MrAlexisX2 - 24.04.2015
Propose un nouvel exercice ! (йvite les textdraw car sinon on va faire que зa)
Re : Exercice en Pawn - Avancй -
TheWWorld - 27.04.2015
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)
Re : Exercice en Pawn - Avancй -
nicolaskettler - 03.05.2015
terminй, tiens:
PHP Code:
#include <zcmd>
#include <dini>
#include <sscanf2>
#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 i = 1; i < MAX_OBJECTS; i++)
{
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], 0, 0, 0, 100);
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(playerid, params[])
{
new id, cdt[5], Float:PosJ[3];
if(sscanf(params, "is[5]", id, cdt)) return SendClientMessage(playerid, -1, "Commande: /objet ID [SAVE(OUI/NON)]");
if(strcmp(cdt, "OUI", true) == 0)
{
totalobjets += 1;
new objet = totalobjets;
GetPlayerPos(playerid, PosJ[0], PosJ[1], PosJ[2]);
for(new i = 0; i < 3; i++) ObjetInfo[objet][Pos][i] = PosJ[i];
ObjetInfo[objet][Model] = id;
CreateObject(id, PosJ[0], PosJ[1], PosJ[2], 0, 0, 0, 100);
SetPlayerPos(playerid, PosJ[0]+2, PosJ[1]+2, PosJ[2]);
SaveObject(objet);
}
else if(strcmp(cdt, "NON", true) == 0)
{
GetPlayerPos(playerid, PosJ[0], PosJ[1], PosJ[2]);
CreateObject(modelid, PosJ[0], PosJ[1], PosJ[2], 0, 0, 0, 100);
SetPlayerPos(playerid, PosJ[0]+2, PosJ[1]+2, PosJ[2]);
}
else return SendClientMessage(playerid, -1, "SAVE doit кtre OUI OU NON !!!!!!! PFFFF");
return 1;
}
Re : Exercice en Pawn - Avancй -
nicolaskettler - 03.05.2015
FAIL DOUBLE POSTE, SORRY
Re : Exercice en Pawn - Avancй -
S4t3K - 04.05.2015
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:hash, salt[] = "")
{
}
Re: Exercice en Pawn - Avancй -
Noliax8 - 04.05.2015
Via HTTP alors?
Re : Exercice en Pawn - Avancй -
S4t3K - 04.05.2015
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.
Re : Exercice en Pawn - Avancй -
Chipardeur - 04.05.2015
PHP Code:
#include <zcmd>
#include <sscanf2>
CMD:creervehicule(playerid, params[])
{
static Float:position[3], Float:angle, modele, couleur[2], respawn;
if(sscanf(params, "dd(-1)a<d>(0)[2]", modele, respawn, couleur)) return SendClientMessage(playerid, -1, "[Utilisation]: /creervehicule [Modиle] [Temps de respawn (Optionnel)] [Couleur n°1 (Optionnel)] [Couleur n°2 (Optionnel)]");
if(modele < 400 || modele > 611) return SendClientMessage(playerid, -1, "[Erreur]: Le modиle du vйhicule doit кtre compris entre 400 et 611.");
GetPlayerPos(playerid, position[0], position[1], position[2]);
GetPlayerFacingAngle(playerid, angle);
CreateVehicle(modele, position[0], position[1], position[2], angle, couleur[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.