GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: vardanega le 05 Mai 2011, 21:45:21
-
Bonsoir, j'ai créer un système de tp particulier, bref quand on veux ouvrir un menu il faut etre a coté d'un objet. J'utilise un boucle For pour voir si le joueur est a coté d'un de ses objets.
Voici le code:
<?php
for(new i = 0; i < sizeof(InfoBorne); i++)
{
printf("'i' est egal a: %d",i);
printf("Valeur de test: %f, %f, %f",InfoBorne[i][PosX],InfoBorne[i][PosY],InfoBorne[i][PosZ]);
printf("Valeur de test: %f, %f, %f",InfoBorne[1][PosX],InfoBorne[1][PosY],InfoBorne[1][PosZ]);
printf("Valeur de test: %f, %f, %f",InfoBorne[3][PosX],InfoBorne[3][PosY],InfoBorne[3][PosZ]);
printf("Valeur de test: %f, %f, %f",InfoBorne[5][PosX],InfoBorne[5][PosY],InfoBorne[5][PosZ]);
printf("Valeur de test: %f, %f, %f",InfoBorne[7][PosX],InfoBorne[7][PosY],InfoBorne[7][PosZ]);
printf("Valeur de test: %f, %f, %f",InfoBorne[11][PosX],InfoBorne[11][PosY],InfoBorne[11][PosZ]);
printf("Valeur de test: %f, %f, %f",InfoBorne[9][PosX],InfoBorne[9][PosY],InfoBorne[9][PosZ]);
printf("Valeur de test: %f, %f, %f",InfoBorne[6][PosX],InfoBorne[6][PosY],InfoBorne[6][PosZ]);
printf("Valeur de test: %f, %f, %f",InfoBorne[3][PosX],InfoBorne[3][PosY],InfoBorne[3][PosZ]);
if(IsPlayerInRangeOfPoint(playerid, 5, InfoBorne[i][PosX],InfoBorne[i][PosY],InfoBorne[i][PosZ]))
{
if(IsPlayerConnected(playerid))
{
PlayerPlaySound(playerid, 1054, 0.0, 0.0, 0.0);
ShowPlayerDialog(playerid,MENUPR,DIALOG_STYLE_LIST,"MON DIALOG","Ok", "Retour");
return 1;
}
}
else
{
SendClientMessage(playerid, 0x00D269FF,"Vous n'ete pas a coté de objet!");
return 1;
}
}
?>
Avec mes valeur de test sa fonctionne bien mais sinon 'i' me renvoie toujours '0' .
J'ai déjà eu il y a plusieurs année ce type de problème mais qui n'a jamais été résolu.
Merci pour votre éventuelle aide.
Vince.
-
peut t'on voir a quoi coorespond exactement InfoBorne
-
<?php
enum BorneSystem
{
Id,
Float:PosX,
Float:PosY,
Float:PosZ,
Float:RotX,
Float:RotY,
Float:RotZ
}
new InfoBorne[40][BorneSystem];
?>
Voila, merci.
-
grosso modo quand tu creer une tu ajoute bien +1 a l'id?
-
Oui oui tout les objets de tp on un ID auto-incrémenté, je ne comprend pas d'ou vient le problème ?
Vince.
-
fais comme cela donc
for(new i = 0; i < 40; i++)
-
Toujours le même problème.
Vince.
-
1 - As-tu un warning à la compilation ?
2 - Combien de messages < 'i' est egal a: > sont présents dans le log du serveur ?
De plus, indépendamment du bug dont tu parles, ton code est à revoir :
Voici le pseudo-code de ton bout de script
Boucle sur le tableau
Si joueur à côté objet
Afficher Boite de Dialogue
Sinon
Afficher message d'erreur <- Si le joueur est à côté du dernier objet du tableau, ce message sera affiche 39 fois au joueur !!
Finsi
FinBoucle
Et le test sur IsPlayerConnected est absolument inutile puisque j'imagine que ce code est dans une commande (et si le joueur fait la commande c'est qu'il est connecté).
-
1 - As-tu un warning à la compilation ?
2 - Combien de messages < 'i' est egal a: > sont présents dans le log du serveur ?
De plus, indépendamment du bug dont tu parles, ton code est à revoir :
Voici le pseudo-code de ton bout de script
Boucle sur le tableau
Si joueur à côté objet
Afficher Boite de Dialogue
Sinon
Afficher message d'erreur <- Si le joueur est à côté du dernier objet du tableau, ce message sera affiche 39 fois au joueur !!
Finsi
FinBoucle
Et le test sur IsPlayerConnected est absolument inutile puisque j'imagine que ce code est dans une commande (et si le joueur fait la commande c'est qu'il est connecté).
Bonsoir, aucun Warning a la compilation, quand au message il ne s'affichent qu'une seule fois.
Merci.
-
Difficile d’être plus clair que sim
if(IsPlayerInRangeOfPoint(playerid, 5, InfoBorne[i][PosX],InfoBorne[i][PosY],InfoBorne[i][PosZ]))
{
if(IsPlayerConnected(playerid))
{
PlayerPlaySound(playerid, 1054, 0.0, 0.0, 0.0);
ShowPlayerDialog(playerid,MENUPR,DIALOG_STYLE_LIST,"MON DIALOG","Ok", "Retour");
return 1;
}
}
else
{
SendClientMessage(playerid, 0x00D269FF,"Vous n'ete pas a coté de objet!");
return 1;
}
tes return 1; sont tout simplement mal placé
-
Difficile d’être plus clair que sim syg :P
apparement tu les confond souvent^^
-
Difficile d’être plus clair que sim
if(IsPlayerInRangeOfPoint(playerid, 5, InfoBorne[i][PosX],InfoBorne[i][PosY],InfoBorne[i][PosZ]))
{
if(IsPlayerConnected(playerid))
{
PlayerPlaySound(playerid, 1054, 0.0, 0.0, 0.0);
ShowPlayerDialog(playerid,MENUPR,DIALOG_STYLE_LIST,"MON DIALOG","Ok", "Retour");
return 1;
}
}
else
{
SendClientMessage(playerid, 0x00D269FF,"Vous n'ete pas a coté de objet!");
return 1;
}
tes return 1; sont tout simplement mal placé
Merci 'scott1'
Vince.
-
Bonsoir, aucun Warning a la compilation, quand au message il ne s'affichent qu'une seule fois.
De la façon dont ta boucle est faite, il est normal qu'elle ne soit exécutée qu'une seule fois car tu passes forcément par un des deux return dès le premier "tour" de la boucle.
Donc, non scott1, les return ne sont pas "mal placés", ils sont tout simplement en trop.
C'est tout le bout de script qu'il faut revoir.
Voici la façon dont j'aurais fait cette boucle :
new Trouve=0;
/* Ceci n'est qu'une boucle de recherche, elle ne fait aucun traitement */
for(new i=0 ; i<sizeof(InfoBorne), Trouve==0 ; i++)
{
if(IsPlayerInRangeOfPoint(playerid, 5, InfoBorne[i][PosX],InfoBorne[i][PosY],InfoBorne[i][PosZ]))
{
Trouve = 1; // Un objet a été trouvé, on termine donc la boucle et i contient l'index de l'objet trouvé
}
}
/* Si un objet a été trouvé */
if (Trouve == 1)
{
/* Ici, on peut se servir de i pour savoir quel objet a été trouvé */
PlayerPlaySound(playerid, 1054, 0.0, 0.0, 0.0);
ShowPlayerDialog(playerid,MENUPR,DIALOG_STYLE_LIST,"MON DIALOG","Ok", "Retour");
}
/* Aucun objet trouvé */
else
{
SendClientMessage(playerid, 0x00D269FF,"Vous n'êtes pas a côté d'un objet!");
}
++
Syg