GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: 69scorpion le 16 Août 2009, 01:43:22
-
Bonjour j'ai fais une map avec un portail et une commande le seul problème c'est que je peut ouvrir le portail ou je veut par exemple le portail se trouve a sf et moi je me trouve a lv je réussie a l'ouvrir, je voudrais avec votre aide bien sûr faire un code qui permet de mettre une distance comme pour la commande /tazer sur le gf ou un truque de se genre mais pour objetc
"GetDistanceBetweenPlayers"
Haut du script
forward Float:GetDistanceBetweenPlayers(p1,p2);
public OnGameModeInit()
{
//-------------------------------------------------
public Float:GetDistanceBetweenPlayers(p1,p2)
{
new Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;
if(!IsPlayerConnected(p1) || !IsPlayerConnected(p2))
{
return -1.00;
}
GetPlayerPos(p1,x1,y1,z1);
GetPlayerPos(p2,x2,y2,z2);
return floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
}
return 1;
}
Merci
-
Avec un PlayerToPoint
En haut
forward PlayerToPoint(Float:radi, playerid, Float:x, Float:y, Float:z);
Dans ta commande
if (PlayerToPoint(15, playerid,1589.053344,-1638.123168,14.122960))
{
Tous en bas
PlayerToPoint(Float:radi, playerid, Float:x, Float:y, Float:z)
{
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;
}
Moi je fais comme sa ^^
-
Merci mais sa c'est pas très fiable car faut êtes a une position précise Merci quand même.
-
Merci mais sa c'est pas très fiable car faut êtes a une position précise Merci quand même.
if (PlayerToPoint(15, playerid,1589.053344,-1638.123168,14.122960))
Le15 c'est le rayon dans le quel tu pet fair la commnde, tu peux mettre 50 si tu veux :P
-
d(x1, y1, z1, x2, y2, z2) = √ ( (x2-x1)² + (y2-y1)² + (z2-z1)² )
En code Pawn, optimisé, ca donne:
Float:distance(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2)
{
return floatsqroot((x2-=x1)*x2 + (y2-=y1)*y2 + (z2-=z1)*z2);
}
Après pour utiliser entre un joueur et un objet, tu fais:
new Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2;
GetPlayerPos(playerid, x1, y1, z1);
GetObjectPos(objectid, x2, y2, z2);
if (distance(x1, y1, z1, x2, y2, z2) < 50.0) //si le joueur est à moins de 50 mètres de l'objet
{
//faire quelquechose
}
N'utilise pas PlayerToPoint, c'est une fonction qui est très lente.
-
deja resolu par moi
http://www.gtaonline.fr/forums/index.php/topic,7405.0.html (http://www.gtaonline.fr/forums/index.php/topic,7405.0.html) regarde ici
sinon voila la fonction que je vient de faire
regardez si y a pas d erreur svp
stock DistanceBetweenPlayerObject(playerid,objectid,Float:radius) // by sasuke78200
{
new Float:Px,Float:Py,Float:Pz;
new Float:Ox,Float:Oy,Float:Oz;
if(!(IsPlayerConnected(playerid)) & !(IsValidObject(objectid)))
{
return 0;
}
GetPlayerPos(playerid,Px,Py,Pz);
GetObjectPos(objectid,Ox,Oy,Oz);
if(floatsqroot(((Px - Ox) * Px - Ox)) + ((Py - Oy) * (Py - Oy)) + ((Pz - Oz) + (Pz - Oz)) <= radius)
{
return 1;
}
return 0;
}
-
La fonction première de 69scorpion est très bien, le problème c'est qu'elle se trouve à l'intérieur de la callback OnGameModeInit ce qui conduira certainement à des erreurs de compilation. Dans tous les cas, elle ne sera pas utilisable dans le script.
public Float:GetDistanceBetweenPlayers(p1,p2)
{
new Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;
if(!IsPlayerConnected(p1) || !IsPlayerConnected(p2))
{
return -1.00;
}
GetPlayerPos(p1,x1,y1,z1);
GetPlayerPos(p2,x2,y2,z2);
return floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
}
public OnGameModeInit()
{
//-------------------------------------------------
return 1;
}
++
Syg
-
La fonction première de 69scorpion est très bien, le problème c'est qu'elle se trouve à l'intérieur de la callback OnGameModeInit ce qui conduira certainement à des erreurs de compilation. Dans tous les cas, elle ne sera pas utilisable dans le script.
public Float:GetDistanceBetweenPlayers(p1,p2)
{
new Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;
if(!IsPlayerConnected(p1) || !IsPlayerConnected(p2))
{
return -1.00;
}
GetPlayerPos(p1,x1,y1,z1);
GetPlayerPos(p2,x2,y2,z2);
return floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
}
public OnGameModeInit()
{
//-------------------------------------------------
return 1;
}
++
Syg
il chercher la meme fonction mais pour faire la distance entre un objet et un player
-
Ah oui, j'avais mal lu mais le bout de script était faux quand même.
Sinon, pour ce que tu veux faire 69scorpion, il suffit que tu remplaces un des deux GetPlayerPos par un GetObjectPos dans ta fonction :
public Float:GetDistanceToObject (Player, Object)
{
new Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;
if(!IsPlayerConnected(Player))
{
return -1.00;
}
GetPlayerPos (Player,x1,y1,z1);
/* Object est l'ID de l'objet en question */
GetObjectPos (Object,x2,y2,z2);
return floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
}
Attention toutefois, contrairement à un joueur qui peut être assimilé à un point, un objet est souvent beaucoup plus gros.
Si on prend l'exemple d'un bâtiment carré de 10.0 mètres de côté, le joueur ne se trouvera jamais à moins de 10 mètres du centre de l'objet (en admettant que l'origine de l'objet soit en son centre.
Pour les objets avec des formes plus complexes, cette fonction peut ne pas fonctionner correctement.
Pour une grille, je pense qu'elle fera l'affaire.
++
Syg
-
Je pensais que mon post était largement suffisant et explicite, apparament non.. lol
-
Merci
-
Je pensais que mon post était largement suffisant et explicite, apparament non.. lol
Oui, c'est vrai, j'aurai pu ne pas poster mais je trouvais bien de partir du script de scorpion pour qu'il voit les modifications à faire.
Et puis je n'ai pas pu m'empêcher de rajouter du blabla sur le fait que la distance entre un joueur et un objet peut ne pas être très juste et qu'il faut faire attention.
++
Syg
-
Désolé, j'ai tendance à penser que tout le monde connait Pawn sur le bout des doigts, bien souvent j'oublie comme c'etait dur quand je débutais :happy
-
Oué je suis partie avec le code que j'ai citait au début mais quand j'ai vue se poste = http://www.gtaonline.fr/forums/index.php/topic,7405.0.html (http://www.gtaonline.fr/forums/index.php/topic,7405.0.html) je me suis dit sa doit pas être sa....