GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Ashley11 le 23 Novembre 2011, 17:42:59
-
Bonsoir,
J'ai besoin de votre aide pour scripter une sorte "d'alarme" mais evidement, une fois en jeux CELA NE MARCHE PAS !
J'appelle la fonction dans "OnPlayerEnterVehicle" ;)
forward AlarmON(playerid)
public AlarmON(playerid)
{
new vehid = GetPlayerVehicleID(playerid);
new proprio = VehicleInfo[vehid][vOwner];
if(IsPlayerConnected(playerid))
{
if(!proprio)
{
if(IsAnOwnableCar(vehid))
{
if(VehicleInfo[vehid][vAlarm] == 1)
{
SendClientMessage(proprio, COLOR_RED, ".:[ALARM]:.Votre Voiture est en train de se faire voler !");
SendClientMessage(playerid, COLOR_RED, ".:[ALARM]:. Vous tentez de voler une voiture de niveau 1 !");
}
if(VehicleInfo[vehid][vAlarm] == 2)
{
SendClientMessage(playerid, COLOR_RED, ".:[ALARM]:.Votre Voiture est en train de se faire voler !");
SendClientMessage(playerid, COLOR_RED, ".:[ALARM]:. Vous tentez de voler une voiture de niveau 2 !");
PlayAlarmSound(vehid, 30.0, 30000);
}
}
}
}
return 1;
}
Merci d'avance
-
Salut,
Tu peux poster le code de PlayAlarmSound ?
++
-
C'est une fonction sur U2C, elle ne viens pas de moi ;)
public PlayAlarmSound(vehicleid, Float:radi, time)
{
for(new i=0; i<MAX_PLAYERS;i++)
{
if(ProxDetectorV(Float:radi, i, vehicleid))
{
AlarmTime[i] = SetTimerEx("ReapitingAlarm", 1000, false, "d", i, Float:radi, vehicleid);
SetTimerEx("StopingAlarm", time, false, "d", i);
vehaS[i] = vehicleid;
roda[i] = radi;
return 1;
}
}
return 0;
}
-
On y est presque... Il me faut ReapitingAlarm et StopingAlarm, c'est sûrement de là que doit venir le problème :P
++
-
Y'en a pas...
Le soucis et que j'ai aucune erreur lors de la compile :blink
-
Elle n'est pas dans une include ?
Elle est forcément quelque part, sinon tu aurais des erreurs étant donné que c'est un timer ;)
Au pire cherche les "forward" pour la trouver plus vite :P
++
-
Je vais passer pour un con :lmfao,
mais je ne l'ai pas trouver, même dans les includes..
-
j'ai pas l'impression que le problème viens de la fonction alarme mais plutôt de cette condition.
if(!proprio)
-
Tu pense que ça viens de là ?
car sinon je test avec ça : if(strcmp(pNane, VehicleInfo[vehid][vOwner], true) == 0)
-
Que vaut VehicleInfo[vehid][vOwner] ?
Pour commencer, trouve son type (string, integer, float, ...) et en fonction de cela, tu utilise la fonction format avec le symbole de formatage adapté.
-
Elle vaut string, elle retourne le nom du propriétaire.
-
Donc, le test est bon mais pas la variable qui reçoit la valeur !
new proprio[MAX_PLAYER_NAME] = VehicleInfo[vehid][vOwner];
-
Exacte, pas encore la main avec le pawn :happy
Merci en tout cas.
EDIT : Enfaite, vous auriez du m'alarmer (c'est le cas de le dire !) SendClientMessage(); prend en parametre un ID et non un string.
Là sa devient un peu plus compliquer...
-
Effectivement, il faut que tu vérifie si le joueur est connecter pour commencer, et si c'est le cas, retourner son indice.
Ce qui donne ceci.
Fonction Début | _GetPlayerIndexByName | sUsername[]
Boucle Début | i < MAX_PLAYERS
Condition Début | Si i est connecté
Appel Fonction | Récupération du pseudo du joueur qui porte l'indice i
Appel Fonction | Comparaison de sUsername est du pseudo trouvé précédemment
Condition Debut | Si les pseudos correspondes
Retour | i
Condition Fin
Condition Fin
Boucle Fin
Retour | -1
Fonction Fin
Si tu n'arrives pas à former un code fonctionnel après maintes fois, je l'ai envoyé ici: codes/scripts utiles (http://www.gtaonline.fr/forums/index.php/topic,2149.msg252729.html#msg252729).
Mais essaye quand même de créer ton code avec ce que je t'ai donné.
-
GetPlayerID() en gros ? :D
-
Cette fonction n'existe pas nativement sous SA-MP, il faut la coder soit même ^^
-
Je suis d'accord, elle n'est pas par default, mais l'include "uf.inc" permet de rajouter certaines Fonction complémentaire ;)
http://wiki.sa-mp.com/wiki/Useful_Callbacks#Useful_Callbacks_.28uf.inc.29 (http://wiki.sa-mp.com/wiki/Useful_Callbacks#Useful_Callbacks_.28uf.inc.29)
-
Elle n'est donc pas native, c'est bien ce qui est dit !
C'est toujours un bon exercice d'écrire des fonctions, après, libre à toi de la faire, c'est simplement pour t'améliorer.
-
Bon voilà mon code, sa ne marche toujours pas :
EDIT : L'erreur doit venir de pName !
forward AlarmON(playerid)
public AlarmON(playerid)
{
new vehid = GetPlayerVehicleID(playerid);
new proprio[MAX_PLAYER_NAME];
proprio = VehicleInfo[vehid][vOwner];
new pName[MAX_PLAYER_NAME];
GetPlayerName(playerid, pName, sizeof(pName));
if(IsPlayerConnected(playerid))
{
if(!strcmp(pName, VehicleInfo[vehid][vOwner], true)
{
if(IsAnOwnableCar(vehid))
{
if(VehicleInfo[vehid][vAlarm] == 1)
{
SendClientMessage(GetPlayerID(proprio), COLOR_RED, ".:[ALARM]:.Votre Voiture est en train de se faire voler !");
SendClientMessage(playerid, COLOR_RED, ".:[ALARM]:. Vous tentez de voler une voiture de niveau 1 !");
}
if(VehicleInfo[vehid][vAlarm] == 2)
{
SendClientMessage(GetPlayerID(proprio), COLOR_RED, ".:[ALARM]:.Votre Voiture est en train de se faire voler !");
SendClientMessage(playerid, COLOR_RED, ".:[ALARM]:. Vous tentez de voler une voiture de niveau 2 !");
PlayAlarmSound(vehid, 30.0, 30000);
}
}
return 1;
}
}
return 1;
}
-
L'erreur vient surtout du fait que tu as oublié de fermer les parenthèse ici
if(!strcmp(pName, VehicleInfo[vehid][vOwner], true)
-
Pour l'alarme, pourquoi est-ce que tu n'utilises pas l'alarme de 0.3c ?
-
J'ai jamais essayé...
Sinon personne peut m'aider pour mon code ?
-
Tu n'as pas lu le message de Ssk !
-
Sisi, mais celà viens pas de ça...
-
Renvoi nous le code que tu as sous les yeux en ce moment.
-
forward AlarmON(playerid)
public AlarmON(playerid)
{
new vehid = GetPlayerVehicleID(playerid);
new proprio[MAX_PLAYER_NAME];
proprio = VehicleInfo[vehid][vOwner];
new pName[MAX_PLAYER_NAME];
GetPlayerName(playerid, pName, sizeof(pName));
if(IsPlayerConnected(playerid))
{
if(!strcmp(pName, proprio, false))
{
if(IsAnOwnableCar(vehid))
{
if(VehicleInfo[vehid][vAlarm] == 1)
{
SendClientMessage(GetPlayerID(proprio), COLOR_RED, ".:[ALARM]:.Votre Voiture est en train de se faire voler !");
SendClientMessage(playerid, COLOR_RED, ".:[ALARM]:. Vous tentez de voler une voiture de niveau 1 !");
}
if(VehicleInfo[vehid][vAlarm] == 2)
{
SendClientMessage(GetPlayerID(proprio), COLOR_RED, ".:[ALARM]:.Votre Voiture est en train de se faire voler !");
SendClientMessage(playerid, COLOR_RED, ".:[ALARM]:. Vous tentez de voler une voiture de niveau 2 !");
PlayAlarmSound(vehid, 30.0, 30000);
}
}
}
}
return 1;
}
-
J'ai changé un peu le code pour qu'il soit plus compréhensible, mais pratiquement rien ne change, tu peux donc l'utiliser tel-quelle.
Pour savoir d'où vient le problème, j'ai posé des lignes de debugs à des emplacements statégiques, dit nous se qu'il en sort.
forward AlarmON(playerid)
public AlarmON(playerid)
{
printf("CALL: AlarmOn(%i)", playerid);
new iVehicleID = GetPlayerVehicleID(playerid);
new sOwner[MAX_PLAYER_NAME] = VehicleInfo[iVehicleID][vOwner];
new iOwner = GetPlayerID(sOwner);
new sName[MAX_PLAYER_NAME];
GetPlayerName(playerid, sName, sizeof(sName));
printf("VARIABLE: iVehicleID: %i", iVehicleID);
printf("VARIABLE: sOwner: %s", sOwner);
printf("VARIABLE: iOwner: %i", iOwner);
printf("VARIABLE: sName: %s", sName);
if (IsPlayerConnected(playerid))
{
printf("CONDITION: %i is connected", playerid);
if (!(strcmp(sName, sOwner, false)))
{
printf("CONDITION: %s = %s", sName, sOwner);
if (IsAnOwnableCar(iVehicleID))
{
printf("CONDITION: %i is ownable", iVehicleID);
printf("VARIABLE: %i alarm level.", VehicleInfo[iVehicleID][vAlarm]);
if (VehicleInfo[iVehicleID][vAlarm] == 1)
{
SendClientMessage(iOwner, COLOR_RED, ".:[ALARM]:.Votre Voiture est en train de se faire voler !");
SendClientMessage(playerid, COLOR_RED, ".:[ALARM]:. Vous tentez de voler une voiture de niveau 1 !");
}
else if (VehicleInfo[iVehicleID][vAlarm] == 2)
{
SendClientMessage(iOwner, COLOR_RED, ".:[ALARM]:.Votre Voiture est en train de se faire voler !");
SendClientMessage(playerid, COLOR_RED, ".:[ALARM]:. Vous tentez de voler une voiture de niveau 2 !");
PlayAlarmSound(iVehicleID, 30.0, 30000);
}
}
else
{
printf("CONDITION: %i isn't ownable", iVehicleID);
}
}
else
{
printf("CONDITION: %s != %s", sName, sOwner);
}
}
else
{
printf("CONDITION: %i is connected", playerid);
}
printf("END: AlarmON");
return 1;
}
-
[20:35:27] CALL: AlarmOn(0)
[20:35:27] VARIABLE: iVehicleID: 0
[20:35:27] VARIABLE: sOwner: Pt˜¼à(Lp”¸Ü
[20:35:27] VARIABLE: iOwner: -1
[20:35:27] VARIABLE: sName: aSh_smith
[20:35:27] CONDITION: 0 is connected
[20:35:27] CONDITION: aSh_smith != Pt˜¼à(Lp”¸Ü
[20:35:27] END: AlarmON
Celà dit, je comprend pas pourquoi VehInfo[pid][vOwner] ne vaut pas aSh_smith ! j'avais pourtant déjà essayer un print la derniere fois et elle me retourner bien mon nom...
EDIT : Si on entre dans la 2ème boucle c'est que sName != sOwner et non le contraire, de même pour le "else"
-
Tu vois d'où vient le problème je pense.
La variable VehicleInfo[iVehicleID][vOwner] ne doit pas être une chaîne de caractère.
Pour voir ce quelle contient, remplace la ligne ...
printf("VARIABLE: sOwner: %s", sOwner);
... par ...
printf("VARIABLE: sOwner: %i", sOwner);
... et montre moi le résultat.
-
En effet.. sa retourne un integer, je comprend plus :-\
-
Donne moi le rapport complet.
-
[21:01:16] CALL: AlarmOn(0)
[21:01:16] VARIABLE: iVehicleID: 0
[21:01:16] VARIABLE: sOwner: 80
[21:01:16] VARIABLE: iOwner: -1
[21:01:16] VARIABLE: sName: TR
[21:01:16] CONDITION: 0 is connected
-
Il y a quelque-chose qui me chiffonne.
if (!(strcmp(sName, sOwner, false)))
Si le nom du joueur qui possède la voiture est le même que celui du voleur de la voiture ?
Dans ce cas, le joueur vol sa propre voiture ?
Bref, ce n'est pas l'important, tu trouve une valeur (80), il faut maintenant que tu trouves d'où elle vient !
Il faut savoir que tu dois faire certains tests pour ton système car le joueur qui possède la voiture peut ne pas être connecté, etc ...
-
le "!" est censé dire différent donc pas de soucis à ce niveau là ...?
-
Les différents opérateurs [niveau: tous] (http://www.gtaonline.fr/forums/index.php/topic,6175.0.html)
Révise la fonction de l'opérateur !.
Ici, ce qui t'induit en erreur, c'est la valeur de retour de la fonction strcmp, va lire le Wiki !
Sinon, tu as trouvé à quoi correspond la valeur 80 ?
-
Je sait que !strcmp se fait, mais il ya ça aussi
strcmp(const char 1, const char 2) != 0)
-
strcmp
Compare deux chaînes de caractères pour voir si elles sont les mêmes.
Paramètres
(const string1[], const string2[], bool:ignorecase, length)
string1 - La première chaîne de caractères à comparer.
string2 - La seconde chaîne de caractères à comparer.
ignorecase (optionel) - Quand cette valeur est vrai, la casse n'importe pas.
length (optionel) - Compare seulement les length premiers caractères des deux chaînes de caractères.
Retour
-1 - Si la première chaîne de caractères vient avant la seconde.
1 - Si la première chaîne de caractères vient après la seconde.
0 - Si les chaînes de caractères sont les mêmes.
-
Ah oui désolé, c'est des tableaux de char en C++
-
Tant qu'on y est,
-1 - Si la première chaîne de caractères vient avant la seconde.
1 - Si la première chaîne de caractères vient après la seconde.
Elle est où la différence ? :P
++
-
Oui :P mais sa dépend de l'ordre dans lequel tu met tes
Paramètres :)
-
-1 - Si la première chaîne de caractères vient avant la seconde.
1 - Si la première chaîne de caractères vient après la seconde.
Elle est là la différence.
Sinon, tu as trouvé à quoi corresponds le nombre 80 ?
-
Oui, biensur je vais voir ça