• 28 Mars 2024, 09:27:05


Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Sujets - S!m

Pages: [1] 2 3 4
1
Autre / Recherche projet
« le: 21 Avril 2013, 22:02:51 »
Bonjour à vous,

voilà, j'ai une semaine de vacance et j'aimerais investir ce temps sur un projet.
Si vous avez des idées de script intéressantes, partagez les et je pourrais bien les coder.
Si vous avez un serveur/projet de serveur, envoyez moi un MP et s'il est assez intéressant j'aimerais bien en faire un peu.

merci et bonne journée

++Sim++

5
Bien faire ses tests de distance

Table des matières

1. Présentation

2. Mathématiques

   2.1 Calcul de distance
   2.2 Tests de position

3. Fonctions en PAWN

4. Conclusion


1. Présentation

Salut et bienvenue à vous sur ce tutoriel.

Des votre arrivée à la programmation sur SA:MP, vous avez surement eu des idées nécessitant des tests de distance ou de position.
Ce tutoriel est très simple, il présente des fonctions permettant d'effectuer ces tests, explique leur fonctionnement, leur provenance (pour les simplifications mathématiques) et leur utilisation.

J'espère donc que vous apprendrez beaucoup grâce à cette lecture. ;D

2. Développement mathématique des formules de base

La section suivante comporte les développements mathématiques des formules utilisées pour les tests de position et de distance. Je cherche ici à faire comprendre d'où proviennent les codes en question, mais vous pouvez néanmoins sauter et passer directement aux codes si vous ne désirez pas comprendre.

2.1 Calcul de distance
Le calcul de distance consiste simplement à l'évaluation de la distance entre deux points.
Ce calcul est simplement l'évaluation de la norme d'un vecteur en trois dimension.
Il s'agit du vecteur reliant les deux points en question.
Pour ceux qui ne sont pas familier avec les vecteurs, on peut voir ce calcul comme une généralisation du théorème de Pythagore.

Mathématique

Ceux qui connaissent bien le côté mathématique de ce type de calcul, vous pouvez passer à la section implantation.
Dans les formules que j'utiliserai prochainement pour montrer le principe de ce type de calcul, j'utiliserai la nomenclature suivante:

  • X1 = position sur l'axe X du point 1
  • Y1 = position sur l'axe Y du point 1
  • Z1 = position sur l'axe Z du point 1
  • X2 = position sur l'axe X du point 2
  • Y2 = position sur l'axe Y du point 2
  • Z2 = position sur l'axe Z du point 2
  • dX = différence des positions des points sur l'axe X
  • dY = différence des positions des points sur l'axe Y
  • dZ = différence des positions des points sur l'axe Z
Donc, quand on parle du théorème de pythagore, on pense tout de suite à la formule suivante:

A² + B² = C²


En posant un point sur chaque coin du triangle, on obtient la figure suivante:

IMAGES À REDIMENSIONNER

Ainsi:
  • A est la distance entre le point 1 et le 3
  • B est la distance entre le point 2 et le 3
  • C est la distance entre le point 1 et le 2
En utilisant le système de coordonnée illustré et les conventions décrites ci-haut, nous obtenons les informations suivantes:

A = Y1 - Y3
B = X2 - X3

Nous pouvons désormais substituer ces données dans la formule de Pythagore:

(Y1 - Y3)² + (X2 - X3)² = C²

Le résultat recherché est donc la distance entre le point 1 et le point 2, ce qui correspond donc à C.
La formule précédente nous donne la valeur de C, mais comporte deux inconvénients majeurs:

  • Nous devons passer par un troisième point hypothétique pour trouver la réponse
  • Nous n'obtenons pas la valeur de C mais son carré

Pour résoudre ces problèmes, il va falloir réfléchir un peu...
que peut-on faire... Substituer? trouver des équivalence? un peu d'algèbre?...

Commençons par régler le problème du carré.
Au fond, il nous faut simplement trouver l'inverse du carré afin d'isoler notre C.
Quel exposant annule l'exposant 2? 0.5 bien sur! Il s'agit de la racine carrée.

Concernant le problème du troisième point, il faut chercher un peu plus.
Il faut principalement utiliser un dessin bien fait pour nous mettre la puce à l'oreille.
Comme nos axes concordent avec les cathètes de notre triangle, les coordonnées Y2 et Y3 sont en fait identiques, de même que X3 et X1.

On peut donc substituer dans la formule:

(Y1 - Y2)² + (X2 - X1)² = C²

Et en ajoutant la racine carrée:

((Y1 - Y2)² + (X2 - X1)²)½ = C = Distance

Nous avons donc finalement atteint notre formule finale, celle qui donne directement la distance, sans passer par un point fictif ni besoin de calcul supplémentaire.

Petit ennui par contre: GTA:SA est en 3D, pas en 2D!!!

Alors là, je vous demande de me croire sur parole (on peut refaire le même principe avec un triangle supplémentaire, le A de ce nouveau triangle serait le C de celui que nous avons vu et le B l'axe des Z), nous avons la formule suivante:

((Z1 - Z2)² + (Y1 - Y2)² + (X2 - X1)²)½ = C = Distance

2.2 Tests de position

Dans la section précédente, j'ai donné le développement de la formule pour évaluer la distance entre deux points.
Toutefois, il faut remarquer que dans une majorité de cas, on veut savoir si la distance entre les points est inférieur à une autre distance (souvent constante) ou si un point se trouve dans une zone.
C'est le genre de tâche qui est effectué par la fonction PlayerToPoint (qui est obsolète, désormais IsPlayerInRangeOfPoint) ou encore IsPlayerInZone (qui test une zone carrée).
Heureusement, quand on ne veut que savoir si la distance est inférieur à une autre distance, il existe une optimisation au niveau mathématique, ce qui nous permettra d'améliorer l'efficacité de notre fonction.
Par contre, pour savoir si un joueur est dans un rectangle (zone), il n'existe pas vraiment d'optimisation possible, il ne s'agit que de bien faire sa fonction.

Tests de distance

Nous avons vu précédemment la formule suivante:

((Z1 - Z2)² + (Y1 - Y2)² + (X2 - X1)²)½ = C = Distance

Nous avions ajouté la racine carrée afin d'avoir la valeur exacte de la distance. Dans ce cas ci, nous comparons deux distances. La formules est donc transformée à quelque chose de ce genre:

((Z1 - Z2)² + (Y1 - Y2)² + (X2 - X1)²)½ <= Distance max

Nous savons tous, n'es-ce pas, qu'il est relativement difficile d'implanter la racine carrée, la fonction est relativement complexe et demande beaucoup de calcul. Nous voudrions donc éviter d'utiliser cette fonction démoniaque  >:(.
Quelle est la fonction inverse de la racine carrée?
Mais l'exposant 2 bien sur!
Attention: il faut appliquer l'opération des deux côtés de l'inégalité, nous conservons ainsi notre test. Si une valeur était plus petite avant d'être mise au carrée, elle le sera toujours après.
En l'appliquant de chaque côté, et sachant que les exposant ainsi placés se multiplient, nous avons:

(((Z1 - Z2)² + (Y1 - Y2)² + (X2 - X1)²)½)² <= (Distance max)²
(Z1 - Z2)² + (Y1 - Y2)² + (X2 - X1)² <= (Distance max)²

Nous avons donc grandement réduit notre temps de calcul. La fonction permettant d'obtenir l'exponentielle d'une valeur est avantageuse lorsque l'exposant est relativement grand, dans le cas de 2, il vaut mieux simplement utiliser : x² = x * x.

Tests de zone

Les tests de zone sont très simples, il ne s'agit que de vérifier si la position d'un point est entre certaines bornes.

En gros:

minimum X <= X     ET     maximum X >= X

Le tout se fait sur chacun des axes testés (2 ou 3 selon une zone de forme rectangulaire ou un prisme à base rectangulaire).

3. Fonctions de tests (PAWN)

Commençons avec une fonction qui permet de connaître la distance entre deux points:

DistanceBetweenPoints(Float:X1, Float:Y1, Float:Z1, Float:X2, Float:Y2, Float:Z2)
{
new Float:dX, Float:dY, Float:dZ;

dX = X1 - X2;
dY = Y1 - Y2;
dZ = Z1 - Z2;

return floatsqroot(dX * dX + dY * dY + dZ * dZ);
}

Explication:
J'utilise des variables intermédiaires pour les distances sur chaque axe pour éviter de faire ces calculs 2 fois, on gagne ainsi en efficacité. Pour le reste, la multiplication des distances par elles-mêmes permet de les mettre au carrée de façon plus efficace que floatpower.
Cette fonction retourne la valeur CORRECTE de la distance entre les deux points passés en paramètres.

On peut utiliser cette fonction dans d'autres fonctions pour la distance entre différents éléments, voici quelques exemples:

Float:DistanceBetweenPlayerAndPoint(playerid, Float:X, Float:Y, Float:Z)
{
new Float:pX, Float:pY, Float:pZ, Float:distance = 999999999.9999;//je préférerais utiliser NAN au lieu de 9999999999.9999

if(IsPlayerConnected(playerid))
{
GetPlayerPos(playerid, pX, pY, pZ);

distance = DistanceBetweenPoints(pX, pY, pZ, X, Y, Z);//récupération de la distance
}

return distance;
}

Float:DistanceBetweenPlayerAndVehicle(playerid, vehicleid)
{
new Float:pX, Float:pY, Float:pZ;
new Float:vX, Float:vY, Float:vZ;
new Float:distance = 999999999.9999;//je préférerais utiliser NAN au lieu de 9999999999.9999

if(IsPlayerConnected(playerid) && GetVehicleModel(vehicleid) >= 200)//permet de savoir si le véhicule est valide
{
GetPlayerPos(playerid, pX, pY, pZ);
GetVehiclePos(vehicleid, vX, vY, vZ);

distance = DistanceBetweenPoints(pX, pY, pZ, vX, vY, vZ);//récupération de la distance
}

return distance;
}

Maintenant, on passe à la seconde explication: Le tests de grandeur de distance.

PointToPoint(Float:X1, Float:Y1, Float:Z1, Float:X2, Float:Y2, Float:Z2, Float:distanceMax)
{
new Float:dX, Float:dY, Float:dZ;

dX = X1 - X2;
dY = Y1 - Y2;
dZ = Z1 - Z2;

return (dX * dX + dY * dY + dZ * dZ <= distanceMax * distanceMax);
}

Explication:
Tout comme dans la fonction précédente, nous calculons en premier lieu la différence de position sur chacun des axes. Par la suite, nous additionnons les carrées de chaque différence et comparons la valeur (la distance au carrée entre les points) avec la valeur de la distance maximale autorisée mise au carré. De la même façon, nous pouvons nous en servir pour créer des fonctions subalternes.

Finalement, nous arrivons au test de position de type test de zone.

//on peut retirer le Z des paramètres, mais gardons le pour les apparences (question d'uniformité)
IsPointInZone(Float:X, Float:Y, Float:Z, Float:minX, Float:maxX, Float:minY, Float:maxY)
{
return ((X >= minX && X <= maxX) && (Y >= minY && Y <= maxY));
}

IsPointInCube(Float:X, Float:Y, Float:Z, Float:minX, Float:maxX, Float:minY, Float:maxY, Float:minZ, Float:maxZ)
{
return ((X >= minX && X <= maxX) && (Y >= minY && Y <= maxY) && (Z >= minZ && Z <= maxZ));
}

Explication:

Il y a très peu à expliquer ici, j'ai fait le tout sur une ligne, sans condition pour réduire les calculs inutiles.

4. Conclusion

....À FAIRE

Merci de passer vos commentaires, si vous ne trouver pas que mon explication est claire, avez des idées pour améliorer, formulations différentes peut-être... voir passer par un chemin complètement différent.

Concernant le niveau de difficulté, je ne sais pas quoi mettre, mais comme le côté programmation est très très simple...

7
Showroom SA:MP / [INC] teams - gestion d'équipes
« le: 12 Juillet 2011, 04:12:54 »
Teams
Une libraire de gestion d'équipes

Présentation

Cette librairie a été créé lors du développement du nouveau serveur de GtaOnline.
Son principal but était très simple : simplifier la vie des scripteurs du projet au niveau de la gestion des équipes.
Bien sur, de nombreuses améliorations peuvent encore être apportées à cette librairie et je n'ai pas l'intention de prétendre qu'il s'agisse d'une référence.
Toutefois, je crois que mon but original est atteint, l'utilisation de cette librairie permet de simplifier la gestion des équipes.

Utilisation

Pour utiliser cette librairie, il suffit de la transférer dans le dossier include du bon pawno puis ajouter la ligne #include <teams> en haut du mode en cours de développement.

Si vous rencontrez des erreurs, veuillez les poster dans ce fil de discussion et j'ajouterai une liste dans cette section des erreurs potentielles, leurs causes et leurs solutions.

Cette librairie utilise des variables qui ne sont pas accessible pour une fonction hors du fichier source (de la librairie).
Normalement, toutes les fonctions nécessaire à la manipulation des teams devraient être incluses, vous ne devriez donc pas avoir à modifier la librairie.

Toutefois, il existe des limites établies par des constantes dans le fichier même. Ces constantes peuvent être modifiées si vous désirez ajouter plus de teams différentes, augmenter la taille des noms de team etc..
Vous les trouverez aux lignes 101 à 103 telle que ci-dessous:
#define MAX_TEAMS (16)
#define MAX_TEAM_VEHICLES (128)
#define MAX_TEAM_NAME (16)
La première constante correspond au nombre maximal d'équipes différentes autorisées.
La seconde, le nombre maximal de véhicule associé à chaque équipe.
La dernière correspond à la longueur maximale du nom de la team.

Les fonctions listées dans le fichier peuvent être utilisées ou non sans problème.
Il est toutefois possible que certaines erreurs subsistent dans certaines fonctions, j'avoue ne pas les avoir toutes testées.

Liste des fonctions

GetPlayerTeam(playerid);
SetPlayerTeam(playerid, teamid);
bool:IsSameTeam(playerid, pid);

BlockTeamKills();
UnblockTeamKills();

GiveTeamPoints(teamid, points);
GetTeamPoints(teamid);
SetTeamPoints(teamid, points);//les points ne peuvent être négatifs

TextDrawShowForTeam(teamid, Text:td);
TextDrawHideForTeam(teamid, Text:td);
GameTextForTeam(teamid, const string[], time, style);
SendPlayerMessageToTeam(teamid, senderid, msg[]);
SendTeamMsg(teamid, msg[]);

GiveTeamWeapon(teamid, weaponid, ammo);
GiveTeamArmor(teamid, amount);
GiveTeamHealth(teamid, amount);
GiveTeamMoney(teamid, amount);

SetTeamVirtualWorld(teamid, worldid);
SetTeamInterior(teamid, interiorid);
WarpTeam(teamid, Float:X, Float:Y, Float:Z);
SetTeamObjective(teamid, Float:X, Float:Y, Float:Z, Float:radius);//checkpoint normal
RemoveTeamObjective(teamid);
SetTeamWantedLevel(teamid, level);

SetTeamSpec(teamid, playerid);//la team teamid spec le joueur playerid (ou avec une team)
StopTeamSpec(teamid);

ExploseTeam(teamid, type = 7, Float:radius = 10.0);//voir les params par défaut

CreateTeamVehicle(model, Float:X, Float:Y, Float:Z, Float:angle, color1, color2, respawn_time, teamid = INVALID_TEAM)
DestroyTeamVehicle(vehicleid);

SetTeamName(teamid, const name[]);
GetTeamName(teamid, name[], len = MAX_TEAM_NAME);
SetTeamSpawnWeapon(teamid, weaponid, ammo, pos = 0);
SetTeamSpawnHealth(teamid, Float:health);
SetTeamSpawnArmor(teamid, Float:armor);

GangZoneShowForTeam(teamid, zoneid, color);
GangZoneHideForTeam(teamid, zoneid);
GangZoneFlashForTeam(teamid, zoneid);
GangZoneStopFlashForTeam(teamid, zoneid);

Les callbacks suivantes sont "interceptées" par la librairie:
OnPlayerSpawn
OnPlayerEnterVehicle
OnPlayerEnterCheckpoint
OnPlayerLeaveCheckpoint

si vous avez des problèmes de compatibilité concernant le système d’accrochage des callbacks, veuillez m'en faire part.
Normalement, la méthode utilisée est compatible avec la plupart des librairies, du moins, celles qui suivent la méthode développée par Y_LESS.

Voilà, je crois avoir fait le tour, bonne chance à vous.

Venons en aux faits:
Téléchargement

V0.1.1:
Lien Pastebin
Lien SolidFiles

V0.1.0 - ANCIENNE VERSION:
Lien Pastebin
Lien SolidFiles

License:


Planification

 - Ajout d'une fonction pour balancer les équipes actives (encore à déterminer la méthode pour savoir quelles équipes sont actives)

Historique

V0.1.1 : Correction du test d'atteinte des objetifs (ce sont des checkpoints)
V0.1.0 : Sortie officielle et initiale

Commentaires

Les suggestions et commentaires sont les bienvenus, surtout si constructifs.

Merci à vous d'utiliser cette librairie ^^

++Sim++

10
Problèmes et bugs / DÉPLACÉ: Problème Freeze
« le: 11 Juin 2011, 17:31:33 »

11
Autre / DÉPLACÉ: Problème Miami RP modif
« le: 11 Juin 2011, 01:05:28 »

13
Bonjour à vous,

je suis présentement à la recherche de 2 mappeurs et 1 scripteur pour m'aider avec un serveur.

Il s'agit d'un serveur de type Stunt comportant des DM, des courses et du drift. Donc les maps à faire seraient dans ce type.

Afin de relancer un peu le serveur, je cherche à y faire un petit renouveau, toutefois, mes temps libre ont fondus comme neige au soleil depuis quelques mois.
C'est pourquoi je suis à la recherche de personnes intéressés à intégrer le projet et le faire évoluer.
Mon principal critère est la motivation, suivi d'un minimum de talent.

Mappeurs
Si vous avez un certains talent pour créer des maps original, vous seriez appréciés.
À noter que je n'ai pas l'intention d'abuser de qui que ce soit, il s'agit simplement de renouveler les maps afin de donner un second souffle au serveur.
Vous êtes plutôt libres dans vos création, toutefois, je doit accepter les maps et je m'occuperai de les mettre en ligne.

Scripteur
En ce qui concerne le recrutement d'un scripteur, je recherche une personne autonome capable de coder avec certaines restrictions.
Certains codes peuvent représenter un niveau de difficulté assez élevé, si vous n'êtes pas capable de faire certaines section, je m'en chargerai.
Toutefois, il ne serait pas pratique de prendre quelqu'un qui ne peut coder un minimum de script sans aide.
Donc, je recherche un scripteur d'expérience, dans la limite du possible bien sur.
À noter que je préfère ne pas donner le code à qui que ce soit, ainsi les scripts seront fait à côté puis intégrés dans le mode par mes soins.
De plus, les gens imaginatifs et pleins d'idées originales seraient grandement appréciés.

Je recherche des volontaires, je n'offre pas de rémunération pour ces postes.
Vous êtes tous les bienvenue.

PS. merci de faire les offres par message privé. Il serait apprécié que vous fournissiez un exemple de ce que vous savez faire avec un court texte montrant votre motivation à vous engagez dans un tel projet ainsi que votre maturité.

PPS. Vous pouvez bien sur participer à l'amélioration du serveur en fournissant des idées, pour plus de détails messages privés merci.

PPPS. J'espère sincèrement que ceci ne sera pas perçu comme un coup de pub, je suis sincèrement à la recherche d'aide.

++Sim++

15
Scripting SA-MP [Pawn center] / DÉPLACÉ: Je cherche une serveur
« le: 08 Décembre 2010, 16:17:40 »
Ce fil de discussion a été déplacé vers Autre.

http://www.gtaonline.fr/forums/index.php?topic=12249.0

Pages: [1] 2 3 4