• 17 Juin 2024, 11:15:11


Auteur Sujet: System de distance  (Lu 1790 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne 69scorpion

  • MrCorona
  • *
  • Tueur en série
  • Messages: 125
    • Voir le profil
    • Scorpion City
System de distance
« 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
[RP] 69scorpion [100%]


Hors ligne Lance

  • *
  • Tueur
  • Messages: 87
    • Voir le profil
Re : System de distance
« Réponse #1 le: 16 Août 2009, 02:04:22 »
Avec un PlayerToPoint

En haut

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

Dans ta commande

Citer
if (PlayerToPoint(15, playerid,1589.053344,-1638.123168,14.122960))
      {

Tous en bas

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

Hors ligne 69scorpion

  • MrCorona
  • *
  • Tueur en série
  • Messages: 125
    • Voir le profil
    • Scorpion City
Re : System de distance
« Réponse #2 le: 16 Août 2009, 02:10:11 »
Merci mais sa c'est pas très fiable car faut êtes a une position précise Merci quand même.
« Modifié: 16 Août 2009, 02:23:08 par 69scorpion »
[RP] 69scorpion [100%]


Hors ligne Lance

  • *
  • Tueur
  • Messages: 87
    • Voir le profil
Re : Re : System de distance
« Réponse #3 le: 16 Août 2009, 02:53:50 »
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

Hors ligne hardcoder

  • *
  • Tueur
  • Messages: 67
    • Voir le profil
Re : System de distance
« Réponse #4 le: 16 Août 2009, 02:58:37 »
d(x1, y1, z1, x2, y2, z2) = √ ( (x2-x1)² + (y2-y1)² + (z2-z1)² )

En code Pawn, optimisé, ca donne:
Code: (pawn) [Sélectionner]
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:
Code: (pawn) [Sélectionner]
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.
« Modifié: 16 Août 2009, 03:53:05 par hardcoder »

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : System de distance
« Réponse #5 le: 16 Août 2009, 14:11:37 »
deja resolu par moi


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)))
  {
  &nbsp;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)
  {
  &nbsp;return 1;
}
  return 0;
 }
« Modifié: 18 Août 2009, 19:33:46 par sasuke78200 »



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : System de distance
« Réponse #6 le: 17 Août 2009, 17:27:13 »
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
Courtesy of GtaManiac

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : Re : System de distance
« Réponse #7 le: 17 Août 2009, 19:03:37 »
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



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : System de distance
« Réponse #8 le: 18 Août 2009, 10:26:44 »
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
Courtesy of GtaManiac

Hors ligne hardcoder

  • *
  • Tueur
  • Messages: 67
    • Voir le profil
Re : System de distance
« Réponse #9 le: 18 Août 2009, 16:02:46 »
Je pensais que mon post était largement suffisant et explicite, apparament non.. lol

Hors ligne 69scorpion

  • MrCorona
  • *
  • Tueur en série
  • Messages: 125
    • Voir le profil
    • Scorpion City
Re : System de distance
« Réponse #10 le: 19 Août 2009, 01:01:27 »
Merci
[RP] 69scorpion [100%]


Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Re : System de distance
« Réponse #11 le: 19 Août 2009, 08:50:37 »
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
Courtesy of GtaManiac

Hors ligne hardcoder

  • *
  • Tueur
  • Messages: 67
    • Voir le profil
Re : System de distance
« Réponse #12 le: 19 Août 2009, 09:55:34 »
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

Hors ligne 69scorpion

  • MrCorona
  • *
  • Tueur en série
  • Messages: 125
    • Voir le profil
    • Scorpion City
Re : System de distance
« Réponse #13 le: 19 Août 2009, 23:04:17 »
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 je me suis dit sa doit pas être sa....
[RP] 69scorpion [100%]