GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Tutoriels et références SA:MP => Discussion démarrée par: UrbanGhetto le 14 Décembre 2007, 22:04:57

Titre: [TUTO] Fonction IsPlayerInArea
Posté par: UrbanGhetto le 14 Décembre 2007, 22:04:57
Bonjour, J'ai créer derniérement une petite fonction qui sert à définir une zone.

Fonction :

A mettre en haut de votre GM.

stock IsPlayerInArea(playerid,Float:max_x,Float:min_x,Float:max_y,Float:min_y)
{
new Float:X;
new Float:Y;
new Float:Z;
GetPlayerPos(playerid, X, Y, Z); // On récupére la position du joueur
if(X <= max_x && X >= min_x && Y <= max_y && Y >= min_y) { // Si le joueur est dans les cordonnées à définir
return 1;
}
return 0;
}

Comment ça marche ? :

Il y a 5 paramètres dans cette fonction

IsPlayerInArea(playerid,Float:max_x,Float:min_x,Float:max_y,Float:min_y)
Les paramètres :


Exemple d'utilisation :

Içi, Le joueur est dans une zone, Il tape une commande et une action se produit.

if (strcmp("/vie", cmdtext, true) == 0){
if (IsPlayerInArea(playerid,397.0478, -81.74512, 2172.085, 1658.258)) { // max_x, min_x max_y, min_y
SetPlayerHealth(playerid,100); // Vie à 100%
SendClientMessage(playerid,0xFFFF00AA,"Vous êtes dans la Zone 69, Votre vie à été régénérée.");
}
return 1;
}

Pour avoir des cordonnées max_x, min_x max_y, min_y utilisez Ultimate Visual Mapper (http://forum.sa-mp.com/index.php?topic=14702.0)

Enjoy  :king
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: R@f le 14 Décembre 2007, 22:42:20
joli, utile pour les débutant ;)

je déplace dans tuto

++
R@f
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: MrFredo le 14 Décembre 2007, 23:18:46
Moi dans le mode godfather j'ai vu autre chose pour des zone  si le joueur est dans un certain "cube" autour d'un point qu'on defini ba il peux faire quelque chose

je vous montre

en haut de votre script

forward PlayerToPoint(Float:radi, playerid, Float:x, Float:y, Float:z);
ensuite on fait le public

public PlayerToPoint(Float:radi, playerid, Float:x, Float:y, Float:z)
{
    if(IsPlayerConnected(playerid))
{
new Float:oldposx, Float:oldposy, Float:oldposz;
new Float:tempposx, Float:tempposy, Float:tempposz;
GetPlayerPos(playerid, oldposx, oldposy, oldposz);
tempposx = (oldposx -x);
tempposy = (oldposy -y);
tempposz = (oldposz -z);
if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
{
return 1;
}
}
return 0;
}


apres on peux utiliser sa n'importe ou

if(PlayerToPoint(1.0,playerid,X,Y,Z))
1.0 = la taille du "cube" dans laquel le joueur peux realiser l'action normalement on peux mettre la taille qu'on veux

puis playerid tout le monde connait

ensuite ya la position X,Y,Z du centre du "cube"

C'est pa moi qui l'et fait c'est juste dans le mode godfather et je vous en fait profiter

Voila sa poura p-e aider perso je m'en sert que pour des petite zone

du genre pour entré dans un batiment ou quoi

Voila si sa vous aide temps mieux



Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: UrbanGhetto le 15 Décembre 2007, 17:12:31
Ben mon astuce est beaucoup moins court...  ???
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: ApocKalipsS le 15 Décembre 2007, 18:12:48
Cool, maintenant si tu pourrais édit et faire les WorldsBounds je sais plus quoi ...  :D
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: Syg le 15 Décembre 2007, 23:13:22
Mister-fred, soit le mode godfather est complétement buggé, soit tu as mal copié la fonction.
Ce qui m'ettone c'est quand tu dis que tu t'en sers, vu que cette fonction ne marche pas ....

Si on prend les lignes ci dessous :
new Float:oldposx, Float:oldposy, Float:oldposz;
new Float:tempposx, Float:tempposy, Float:tempposz;
GetPlayerPos(playerid, oldposx, oldposy, oldposz);
tempposx = (oldposx -x);


A votre avis, sachant que x = 1429.123, combien vaut tempposx ?
Alors ?
Pas de réponse ?
Pourtant c'est facile, tempposx = -1429.123 !!
Et oui, oldpos n'est pas initialisé donc il vaut 0.0.
Il aurait fallu qu'il soit initialisé avec la position précédente (à la seconde précédente par exemple) du joueur.

Et contrairement à ce qu'on pourrait croire (a cause du paramèter radi = rayon), il ne s'agit pas d'un cercle (enfin d'une sphère puisqu'on est en 3D) mais d'un cube.

Donc je vous conseille d'utiliser la fonction de Urban qui a au moins le mérite de fonctionner.

++
Syg
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: MrFredo le 15 Décembre 2007, 23:41:05
je vais verifier si je l'ai bien recopier car elle fonctionne bien je verifier et je vous dit quoi


Edit :

il me semble que je l'ai bien copier je ne comprend pas pourquoi elle ne marche pas car elle est utiliser pour beaucoup de chose sur le mode

:s
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: Syg le 16 Décembre 2007, 02:03:12
Houla, fatigue, fatigue (faut bien que je trouve une excuse).
C'est bon, je viens de re-regarder ta fonction, elle marche, c'est OK.
J'avais zappé le fait que la fonction GetPlayerPos porte sur les variables que je croyais non initialisées.
Autant pour moi.

Par contre, elle contrôle que le joueur est dans un cube (un carré par projection sur le sol) et non pas une sphère (un cercle par projection sur le sol).
Pour moi la fonction d'Urbanghetto est mieux car elle permet de contrôler des rectangles et non pas des carrées (on peut donc contrôler une rue, un toit d'immeuble, ...).
Il est d'ailleurs très facile de modifier la fonction d'Urban pour ajouter le contrôler de la hauteur (coordonnée Z).

Donc je m'excuse encore mister-fred, je n'ai tourné ma langue dans ma bouche que 6 fois avant de répondre à ton premier post.
T'es trop gentil de ne pas m'avoir envoyer boulé :-[.

++
Syg
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: MrFredo le 16 Décembre 2007, 02:38:06
Lol c'est pas grave sa arrive a tout le monde

Tu ma quand meme fait vachement douté lol

Oui la fonction de urban est tres util aussi  je m'en sert beaucoup

C'elle que j'ai donné me sert principalement pour entré dans un batiment

ou definir des petite zone

:)

Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: R@f le 16 Décembre 2007, 04:02:11
moi je trouve le code a urban utile pour un GameMode genre counter strike, un /buy dans la zone de spawn uniquement ^^

[HS] 4h du mat de toujour debout ^^

++
R@f
Titre: Re : Re : [TUTO] Fonction IsPlayerInArea
Posté par: MrFredo le 16 Décembre 2007, 04:18:19
moi je trouve le code a urban utile pour un GameMode genre counter strike, un /buy dans la zone de spawn uniquement ^^

[HS] 4h du mat de toujour debout ^^

++
R@f

HS moi aussi toujour debout lol je dort la journee XD
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: MultiGamers le 16 Décembre 2007, 13:19:06
PTDR ! Comme certains animal....  :D Ouais pas mal Urban! Très pratique pour des modes du genre counterstrike (Comme Aless a dit..)

Continue comme sa !  :)

@ +  ;)
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: R@f le 16 Décembre 2007, 13:28:09
aless ? xD c'est R@f ! même que aless est a côté de moi la ^^

++
R@f
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: MultiGamers le 16 Décembre 2007, 13:29:54
XD Le Modo fait du Hors Sujet !  :D

EDIT: Je pensais que tu appelais alless pour qu'il vienne qaund s'est moi qui ces tromper PTDR !!!
Titre: Re : Re : [TUTO] Fonction IsPlayerInArea
Posté par: MultiGamers le 19 Décembre 2007, 18:32:22
Moi dans le mode godfather j'ai vu autre chose pour des zone  si le joueur est dans un certain "cube" autour d'un point qu'on defini ba il peux faire quelque chose

je vous montre

en haut de votre script

forward PlayerToPoint(Float:radi, playerid, Float:x, Float:y, Float:z);
ensuite on fait le public

public PlayerToPoint(Float:radi, playerid, Float:x, Float:y, Float:z)
{
    if(IsPlayerConnected(playerid))
{
new Float:oldposx, Float:oldposy, Float:oldposz;
new Float:tempposx, Float:tempposy, Float:tempposz;
GetPlayerPos(playerid, oldposx, oldposy, oldposz);
tempposx = (oldposx -x);
tempposy = (oldposy -y);
tempposz = (oldposz -z);
if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
{
return 1;
}
}
return 0;
}


apres on peux utiliser sa n'importe ou

if(PlayerToPoint(1.0,playerid,X,Y,Z))
1.0 = la taille du "cube" dans laquel le joueur peux realiser l'action normalement on peux mettre la taille qu'on veux

puis playerid tout le monde connait

ensuite ya la position X,Y,Z du centre du "cube"

C'est pa moi qui l'et fait c'est juste dans le mode godfather et je vous en fait profiter

Voila sa poura p-e aider perso je m'en sert que pour des petite zone

du genre pour entré dans un batiment ou quoi

Voila si sa vous aide temps mieux


Oui ! J'avait un bug avec des checkpoints ! Je croit avec des zones cela va marcher...  :D Il faut que sa face un cube autour du joueur !

Je teste sa en Fin de semaine. JOYEUX NOEL !!!!  :cheers

Merci et A +  ;)
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: UrbanGhetto le 19 Décembre 2007, 18:36:38
Petite précision :

C'est un cube ouvert par le haut, Si vous voulez qu'il soit fermé ajoutez les cordonnées max_z.
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: MultiGamers le 19 Décembre 2007, 20:28:47
Ok je test sa en fin de semaine  ;)
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: ApocKalipsS le 28 Décembre 2007, 17:33:54
Salut, je n'arrive pas à trouver les Min_y Max_y et tous ça sur X-Treme Mapper plus...

Aidez-moi...
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: UrbanGhetto le 28 Décembre 2007, 17:36:48
Il te suffit de rester cliquer sur le bouton gauche et de séléctionner une partie de la map, Ensuite ils te donnent soit un WorldBouns, Soit un GangZone (D'apres ton choix), Dans ces derniers tu trouvera tes cordonnées  ;)
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: NatiVe™ le 22 Janvier 2008, 12:07:18
Quelqu'un de vous n'aurais pas un autre lien pour "Ultimate Visual Mapper" pour la source svp ?

Merci

NV.

Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: marsu le 03 Février 2008, 11:43:09
Urban avec le PlayerInArea

Tu Peux me dire comment faire pour que quand quelqu'un va dans la zone sa ecrit quelque chose ?
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: ApocKalipsS le 03 Février 2008, 13:18:55
Ba..

tu met un "If (IsPlayerInArea  etc..."

SendClientMessage

Et je pense que ca marche...
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: marsu le 03 Février 2008, 18:15:47
Merci
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: UrbanGhetto le 04 Février 2008, 22:11:30
Ben tu vas le mettre où ton code ?

Faut faire un timer.
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: rivoal29 le 29 Février 2008, 21:03:09
Moi j'un un probleme :( quand je fait ta fonction sa me mes une erreur
C:\Program Files\Rockstar Games\GTA San Andreas\samp\gamemodes\test.pwn(1273) : error 004: function "IsPlayerInArea" is not implementedLigne 1273 :
if(IsPlayerInArea(playerid,2073.0295,2058.8405,1377.8999,1363.7943))
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: UrbanGhetto le 29 Février 2008, 22:30:34
T'es sur que t'as ajouté la fonction ?  ???
Titre: Re : Re : [TUTO] Fonction IsPlayerInArea
Posté par: rivoal29 le 01 Mars 2008, 11:41:03
T'es sur que t'as ajouté la fonction ?  ???

a c'est bon sa marche en faite faut le metre avant la ligne #if defined FILTERSCRIPT moi je l'avait mi aprés
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: [StAfF]MaN le 27 Mai 2008, 23:38:23
Pour trouver les coordonnées sans ultimate il faut faire 4 save position ;) (/save)

Tu veut faire une zone, tu va te placer a chaque coins de ta zone et tu /save ^^ (met comme nom min_x pour la 1er save, min_y pour la 2ième, etc... c'est plus facile pour après ;) )

exemple :


AddPlayerClass(179,-1337.3512,2523.2300,87.0469,270.7198,0,0,0,0,0,0); // min_x
AddPlayerClass(179,-1335.2222,2540.2971,86.8081,357.6589,0,0,0,0,0,0); // min_y
AddPlayerClass(179,-1286.4272,2536.4910,87.5118,182.1182,0,0,0,0,0,0); // max_x
AddPlayerClass(179,-1283.4917,2522.4268,87.3911,177.1048,0,0,0,0,0,0); // max_y

Donc il faut mettre dans cette ordre les coordonnées de couleur :

en 1er : rouge

en 2ième: orange

en 3ième: violet

en 4ième: vert

====
                gang2 = GangZoneCreate(-1337.3512, 2536.4910, -1283.4917, 2540.2971); // Dans OnGameModeInit
====

ça peut paraitre bizarre l'ordre des coordonnées mais ça fonctionne ;) J'ai passé 1 heure a trouver, scripter dans toutes les situations possible et tester chaque changements lol ^^  :laugh
Moi qui cherchais comment faire, voila j'ai finis par trouver !!  :king

PS: pour que la zone soit colorée en rouge et transparente :

GangZoneShowForAll(gang2, 0xFF00004E); // dans OnGameModeInit ou dans toutes autres partie de votre script, la ou vous voulez que la zone soit visible ;)

Si vous voulez mettre une couleur standar mais qui ne sera pas transparente :

GangZoneShowForAll(gang2, COLOR_RED); (prenez les couleurs que vous avez initialisé dans votre script ;) )
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: [StAfF]MaN le 20 Octobre 2008, 22:23:47
Gros Up Désolé  :-[ ainsi qu'un double poste mais bon...  :-\ juste pour vous demandez si vous voulez pas m'aider un ti peut  ^^ parce que j'arrive vraiment pas a faire ce que je veut avec le PlayerToPoint et même de IsPlayerInArea...

Voila ce que je fait :

forward PlayerToPoint(Float:radi, playerid, Float:x, Float:y, Float:z);
new gang2;


public PlayerToPoint(Float:radi, playerid, Float:x, Float:y, Float:z)
{
    if(IsPlayerConnected(playerid))
{
new Float:oldposx, Float:oldposy, Float:oldposz;
new Float:tempposx, Float:tempposy, Float:tempposz;
GetPlayerPos(playerid, oldposx, oldposy, oldposz);
tempposx = (oldposx -x);
tempposy = (oldposy -y);
tempposz = (oldposz -z);
if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
{
return 1;
}
}
return 0;
}


public OnGameModeInit()
{
gang2 = GangZoneCreate(-1337.3512, 2536.4910, -1283.4917, 2540.2971);
return 1;
}


public OnPlayerCommandText(playerid, cmdtext[])
{
   if(!strcmp(cmdtext,"/zone", true))
   {
      SendClientMessage(playerid, COLOR_RED, "lol");
      SetPlayerPos(playerid,-1337.3512, 2536.4910, -1283.4917);
      GangZoneShowForAll(gang2, 0xFF00004E);
      if(PlayerToPoint(3.0,playerid,-1337.3512, 2536.4910, -1283.4917))
      {
     SendClientMessage(playerid, COLOR_RED,"Bonjour !!");
     return 1;
      }
      return 1;
   }
   return 1;
}

Ma zone s'affiche nickel mais quand je rentre dedans pas moyen d'avoir le message "bonjour !!" (c'était un test le bonjour ^^ mais ça ne marche pas...)

même résultat avec le IsPlayerInArea alors bon je dois pas être doué xD

pouvez vous m'aider ??
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: S!m le 21 Octobre 2008, 01:22:41
salut,

tu veut dire que tu fais la commande pendant que tu est dans la zone... car il ne faut pas oublier qu'il ne s'agit pas d'une callback OnPlayerEnterArea.....

sinon, je crois que le téléport est trop instantané par rapport au GetPlayerPos pour qu'il en tienne compte...mais je ne suis pas sur... :'(

IsPlayerToPoint à l'air ok... mais c'est aps un peu bas ,-1283.4917..... ???

dsl..

++Sim++
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: [StAfF]MaN le 21 Octobre 2008, 19:56:38
Si peut être ^^ mais en faite, moi je veut que quand je rentre dans la zone il y est un message, le texte "lol" et la commande c'était pour essayer d'une autre façon parce que comme j'avais fais avant ça ne fonctionnais pas

Le prob, c'est que je me téléporte dans la zone avec la commande et que même si je sort de la zone et que je re rentre dedans le message ne s'affiche toujours pas ....

Aussi mon playerToPoint n'est pas un carré mais un rectangle... enfin normalement xD je vais enlever le -1283.... et mettre 1283.. a la place :p

Pleas help me ;)
thx :p
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: Syg le 22 Octobre 2008, 14:10:50
C'est évident, regardes la définition de PlayerToPoint, elle demande un rayon (radi), un X, un Y et un Z.
Dans ton script, tu passes à cette fonction des valeurs qui n'ont rien à voir (x1, y1 et x2 de ta zone).

En fait, la fonction PlayerToPoint (radi, X, Y, Z) permet de savoir si le joueur est dans un sphère (donc en 3 D) de centre (X, Y, Z) et de rayon radi.

Pour ce que tu veux faire, il faut utiliser IsPlayerInArea, fonction à laquelle tu pourras passer les coordonnées de ta zone de gang.

Mais attention, si tu prends la fonction IsPlayerInArea et la fonction GangZoneCreate, les coordonnées ne sont pas du tout dans le même ordre dans les deux fonctions donc il faut prendre son temps pour faire les correspondances entre les coordonnées correctement.

IsPlayerInArea(playerid,Float:max_x,Float:min_x,Float:max_y,Float:min_y);
GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy);

++
Syg
Titre: Re : [TUTO] Fonction IsPlayerInArea
Posté par: [StAfF]MaN le 22 Octobre 2008, 14:30:53
Tu me sauve la vie ^^ merci Syg !!!  :P

Edit : j'ai fais ça :

forward OnArea(playerid);
new Area;
new Area2;
new gang2;


stock IsPlayerInArea(playerid,Float:max_x,Float:min_x,Float:max_y,Float:min_y)
{
new Float:X;
new Float:Y;
new Float:Z;
GetPlayerPos(playerid, X, Y, Z); // On récupére la position du joueur
if(X <= max_x && X >= min_x && Y <= max_y && Y >= min_y) { // Si le joueur est dans les cordonnées à définir
return 1;
}
return 0;
}


public OnGameModeInit()
{
        gang2 = GangZoneCreate(-1337.3512, 2536.4910, -1283.4917, 2540.2971);
return 1;
}


public OnPlayerSpawn(playerid)
{
   GangZoneShowForAll(gang2, COLOR_RED);
   Area = SetTimer("OnArea",100,1);
   return 1;
}



public OnPlayerCommandText(playerid, cmdtext[])
{
   if(IsPlayerInArea(playerid,-1283.4917, -1337.3512, 2540.2971, 2536.4910))
   {
      if(!strcmp(cmdtext,"/zone", true))
      {
         //SetPlayerPos(playerid,-1337.3512, 2536.4910, -1283.4917);
     SendClientMessage(playerid, COLOR_RED,"Bonjour !!");
     return 1;
      }
   }
   else
   {
      SendClientMessage(playerid, COLOR_RED, "tu n'est pas dans la zone !!!");
      return 1;
   }
   return 1;
}

public OnArea(playerid)
{
   if(IsPlayerInArea(playerid,-1283.4917, -1337.3512, 2540.2971, 2536.4910))
   {
      SendClientMessage(playerid, COLOR_YELLOW, "Tu peut taper /zone");
      KillTimer(Area);
      KillTimer(Area2);
      Area2 = SetTimer("OnArea", 3000, 1);
      return 1;
   }
   else if(!IsPlayerInArea(playerid,-1283.4917, -1337.3512, 2540.2971, 2536.4910))
   {
      KillTimer(Area2);
      Area2 = SetTimer("OnArea", 3000, 1);
  return 1;
   }
   return 1;
}

J'explique le fonctionnement :

On spawn il y a la gangzone qui apparait sur la minimap, quand on va dedans un message nous dit "tu peut taper /zone"
On tape /zone et le message apparait
Si on tape zone en dehors  de la zone, le message "tu n'es pas dans la zone !!!" apparait

voila c'est tout con ^^ Et ça marche ^^

il faut 2 timer, un pour l'amorçage et l'autre pour le maintient ;) Ingénieux :p J'suis content de moi ^^  :king