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

Titre: Alarm
Posté 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
Titre: Re : Alarm
Posté par: Gilux le 23 Novembre 2011, 18:04:16
Salut,
Tu peux poster le code de PlayAlarmSound ?

++
Titre: Re : Alarm
Posté par: Ashley11 le 23 Novembre 2011, 18:06:29
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;
}
Titre: Re : Alarm
Posté par: Gilux le 23 Novembre 2011, 18:12:12
On y est presque... Il me faut ReapitingAlarm et StopingAlarm, c'est sûrement de là que doit venir le problème :P

++
Titre: Re : Alarm
Posté par: Ashley11 le 23 Novembre 2011, 18:30:46
Y'en a pas...

Le soucis et que j'ai aucune erreur lors de la compile  :blink
Titre: Re : Alarm
Posté par: Gilux le 23 Novembre 2011, 18:38:27
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

++
Titre: Re : Alarm
Posté par: Ashley11 le 23 Novembre 2011, 18:51:50
Je vais passer pour un con  :lmfao,

mais je ne l'ai pas trouver, même dans les includes..
Titre: Re : Alarm
Posté par: Ssk le 23 Novembre 2011, 18:56:43
j'ai pas l'impression que le problème viens de la fonction alarme mais plutôt de cette condition.


if(!proprio)
Titre: Re : Alarm
Posté par: Ashley11 le 23 Novembre 2011, 20:00:18
Tu pense que ça viens de là ?


car sinon je test avec ça : if(strcmp(pNane, VehicleInfo[vehid][vOwner], true) == 0)
Titre: Re : Alarm
Posté par: Xartrick le 23 Novembre 2011, 20:02:52
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é.
Titre: Re : Alarm
Posté par: Ashley11 le 23 Novembre 2011, 20:10:07
Elle vaut string, elle retourne le nom du propriétaire.
Titre: Re : Alarm
Posté par: Xartrick le 23 Novembre 2011, 20:15:27
Donc, le test est bon mais pas la variable qui reçoit la valeur !

new proprio[MAX_PLAYER_NAME] = VehicleInfo[vehid][vOwner];
Titre: Re : Alarm
Posté par: Ashley11 le 23 Novembre 2011, 20:58:25
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...
Titre: Re : Alarm
Posté par: Xartrick le 23 Novembre 2011, 21:41:46
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.


Citer
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é.
Titre: Re : Alarm
Posté par: Ashley11 le 23 Novembre 2011, 22:03:41
GetPlayerID() en gros ?  :D
Titre: Re : Alarm
Posté par: Ssk le 24 Novembre 2011, 07:53:06
Cette fonction n'existe pas nativement sous SA-MP, il faut la coder soit même ^^
Titre: Re : Alarm
Posté par: Ashley11 le 24 Novembre 2011, 12:38:40
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)
Titre: Re : Alarm
Posté par: Xartrick le 24 Novembre 2011, 17:47:50
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.
Titre: Re : Alarm
Posté par: Ashley11 le 24 Novembre 2011, 18:38:55
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;
}
Titre: Re : Alarm
Posté par: Ssk le 24 Novembre 2011, 19:02:08
L'erreur vient surtout du fait que tu as oublié de fermer les parenthèse ici

if(!strcmp(pName, VehicleInfo[vehid][vOwner], true)
Titre: Re : Alarm
Posté par: Karting06 le 24 Novembre 2011, 19:20:46
Pour l'alarme, pourquoi est-ce que tu n'utilises pas l'alarme de 0.3c ?
Titre: Re : Alarm
Posté par: Ashley11 le 24 Novembre 2011, 19:29:27
J'ai jamais essayé...


Sinon personne peut m'aider pour mon code ?
Titre: Re : Alarm
Posté par: Xartrick le 25 Novembre 2011, 20:02:05
Tu n'as pas lu le message de Ssk !
Titre: Re : Alarm
Posté par: Ashley11 le 25 Novembre 2011, 22:48:49
Sisi, mais celà viens pas de ça...
Titre: Re : Alarm
Posté par: Xartrick le 26 Novembre 2011, 16:28:05
Renvoi nous le code que tu as sous les yeux en ce moment.
Titre: Re : Alarm
Posté par: Ashley11 le 26 Novembre 2011, 18:00:03
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;
}
Titre: Re : Alarm
Posté par: Xartrick le 26 Novembre 2011, 19:35:28
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;
}
Titre: Re : Alarm
Posté par: Ashley11 le 26 Novembre 2011, 20:37:47
Citer
[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"
Titre: Re : Alarm
Posté par: Xartrick le 26 Novembre 2011, 20:50:08
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.
Titre: Re : Alarm
Posté par: Ashley11 le 26 Novembre 2011, 21:02:40
En effet.. sa retourne un integer, je comprend plus  :-\
Titre: Re : Alarm
Posté par: Xartrick le 26 Novembre 2011, 21:03:39
Donne moi le rapport complet.
Titre: Re : Alarm
Posté par: Ashley11 le 26 Novembre 2011, 21:15:38
Citer
[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
Titre: Re : Alarm
Posté par: Xartrick le 26 Novembre 2011, 21:37:51
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 ...
Titre: Re : Alarm
Posté par: Ashley11 le 26 Novembre 2011, 23:17:29
le "!" est censé dire différent donc pas de soucis à ce niveau là ...?
Titre: Re : Alarm
Posté par: Xartrick le 26 Novembre 2011, 23:22:49
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 ?
Titre: Re : Alarm
Posté par: Ashley11 le 27 Novembre 2011, 00:10:48
Je sait que !strcmp se fait, mais il ya ça aussi strcmp(const char 1, const char 2) != 0)
Titre: Re : Alarm
Posté par: Xartrick le 27 Novembre 2011, 01:00:16
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.
Titre: Re : Alarm
Posté par: Ashley11 le 27 Novembre 2011, 09:37:36
Ah oui désolé,  c'est des tableaux de char en C++
Titre: Re : Alarm
Posté par: Gilux le 27 Novembre 2011, 10:04:16
Tant qu'on y est,

Citer
-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

++
Titre: Re : Alarm
Posté par: Ashley11 le 27 Novembre 2011, 10:46:01
Oui  :P  mais sa dépend de l'ordre dans lequel tu met  tes
Paramètres :)
Titre: Re : Alarm
Posté par: Xartrick le 27 Novembre 2011, 18:16:01
Citer
-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 ?
Titre: Re : Alarm
Posté par: Ashley11 le 29 Novembre 2011, 18:06:06
Oui, biensur je vais voir ça