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
-
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 :
- Playerid = Récupérer l'ID du joueur.
- max_x = Coordonnée du maximum X de la zone.
- min_x = Coordonnée du minimum X de la zone.
- max_y = Coordonnée du maximum Y de la zone.
- min_y = Coordonnée du minimum Y de la zone.
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
-
joli, utile pour les débutant ;)
je déplace dans tuto
++
R@f
-
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
-
Ben mon astuce est beaucoup moins court... ???
-
Cool, maintenant si tu pourrais édit et faire les WorldsBounds je sais plus quoi ... :D
-
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
-
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
-
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
-
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
:)
-
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
-
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
-
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 ! :)
@ + ;)
-
aless ? xD c'est R@f ! même que aless est a côté de moi la ^^
++
R@f
-
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 !!!
-
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 + ;)
-
Petite précision :
C'est un cube ouvert par le haut, Si vous voulez qu'il soit fermé ajoutez les cordonnées max_z.
-
Ok je test sa en fin de semaine ;)
-
Salut, je n'arrive pas à trouver les Min_y Max_y et tous ça sur X-Treme Mapper plus...
Aidez-moi...
-
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 ;)
-
Quelqu'un de vous n'aurais pas un autre lien pour "Ultimate Visual Mapper" pour la source svp ?
Merci
NV.
-
Urban avec le PlayerInArea
Tu Peux me dire comment faire pour que quand quelqu'un va dans la zone sa ecrit quelque chose ?
-
Ba..
tu met un "If (IsPlayerInArea etc..."
SendClientMessage
Et je pense que ca marche...
-
Merci
-
Ben tu vas le mettre où ton code ?
Faut faire un timer.
-
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 implemented
Ligne 1273 :
if(IsPlayerInArea(playerid,2073.0295,2058.8405,1377.8999,1363.7943))
-
T'es sur que t'as ajouté la fonction ? ???
-
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
-
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 ;) )
-
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 ??
-
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++
-
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
-
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
-
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