• 19 Juillet 2019, 18:59:16


Auteur Sujet: LUA Example : User selectable warp points.  (Lu 7130 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne spykerc8

  • *
  • 'The GTAOnline.fr GodFather'
  • Messages: 3821
    • Voir le profil
    • http://www.gtaonline.fr
LUA Example : User selectable warp points.
« le: 14 Janvier 2007, 18:59:23 »
Lien du script : à cette page

Démonstration du script :

[yt=250,250]OjuNWLmR3Pw[/yt]

Explications :

Dans ce script, nous allons créer un événement appelé Script_onResourceLoad, qui sera appelée quand le serveur chargera un mod/map qui contiendra cet évènement.

Ensuite nous allons créer une 'global key' pour activer ou désactiver le script. Les bindskey sont appelées pour assigner la touche à la fonction que nous allons créer.

Code: Lua
  1. AddEventHandler ( "onResourceLoad", getRootElement(), "Script_onResourceLoad" )
  2. function Script_onResourceLoad ( resource )
  3.     if ( resource == getThisResource() ) then
  4.         -- for each player already in the server
  5.         for index, player in getElementsByType ( "player" ) do
  6.             -- binds the "i"-key to our function "modeIO"
  7.             bindKey ( player, "i", "down", "modeIO" )
  8.         end
  9.     end
  10. end
  11.  

Il faut noter que l'on termine la fonction avec le mot 'end'.
Ceci dit, la fonction ne s'applique que aux joueurs déjà sur le serveur quand le script est appelé. C'est pourquoi, on va l'étendre à l'évènement onPlayerJoin.

Code: Lua
  1. addEventHandler ( "onPlayerJoin", getRootElement(), "Script_onPlayerJoin" )
  2. function Script_onPlayerJoin ()
  3.     -- binds the "i"-key to our function "modeIO"
  4.     bindKey ( source, "i", "down", "modeIO" )
  5. end
  6.  

La key qu'on a défini est requise pour que les commandes d'origine n'interfèrent pas avec.


Faire marcher le curseur :

Spécifier un point précis avec une touche du clavier serait un peu compliquer, c'est pourquoi, MTA a de bonnes fonctions utilisant le curseur de la souris.
Voyons donc comment faire.
Il faut donc recréer la fonction  "modeIO" que l'on a vu précédemment :

Code: Lua
  1. function modeIO ( source, key, keyState )       -- function toggles the cursor
  2.     if isCursorShowing ( source ) then          -- if cursor was already showing:
  3.         showCursor ( source, false )            --   hide it
  4.     else                                        -- if it wasn't showing:
  5.         showCursor ( source, true )             --   show it
  6.     end
  7. end
  8.  

Maintenant que nous avons trois fonctions et le curseur de la souris utilisable, le plus simple serait d'assigner chaque fonction à un bouton de la souris. C'est ce que nous allons faire.

MTA a un évènement appeler  "onPlayerClick" qui permet aux scripteurs de récupérer les coordonnées XYZ exactes du joueur. Cet évènement n'est possible que quand le curseur est visible.
Voyons comment faire la fonction principale "Script_onPlayerClick".

Code: Lua
  1. addEventHandler ( "onPlayerClick", getRootElement(), "Script_onPlayerClick" )
  2. function Script_onPlayerClick ( key, keyState, element, x, y, z )
  3.     if keyState == "up" then
  4.         return                  -- ignore if the button was released
  5.     end
  6.  


Créer un marqueur :

Avant de faire ça, il faut voir comment fonctionne la hiérarchie des des éléments de MTA.
MTA utilise des 'elements' pour tout le langage. Les marqueurs, les objets, les véhicules, les joueurs, tous sont des 'elements'. Ces 'elements' rendent le codage plus facile car vous n'avez pas à vérifier de quel type d'élément il s'agit. Vous aurez juste à utiliser "destroyElement" ou "setElementPosition" pour ajouter ou supprimer un objet.

Dans cet exemple, nous ne voulons que deux marqueurs par joueur : un marqueur teleport et un marqueur "destination". Pour pouvoir avoir deux marqueurs, nous allons sauver l'ID du marqueur créer pour chaque joueur en utilisant "setElementData".

Si un utilisateur utilise le bouton gauche de la souris, cela créera un marqueur appeler "teleport" qui nous servira de porte de téléportation. Si l'utilisateur utilise le bouton droit de la souris, cela créera le marqueur de "destination".

Voyons comment coder les fonctions par rapports aux boutons :

Code: Lua
  1. if key == "left" then           -- on a left mousebutton
  2.     -- destroy his teleport point, if any
  3.     destroyElement ( getElementData ( source, "teleport" ) )
  4.     -- create a normal cylinder marker
  5.     local marker = createMarker ( x, y, z, "cylinder", 2, 0, 255, 0, 50 )
  6.     -- mark the cylinder as our "teleport" type
  7.     setElementData ( marker, "type", "teleport" )
  8.     -- link the creator (player) to the marker, and vice versa
  9.     setElementData ( source, "teleport", marker )
  10.     setElementData ( marker, "owner", source )
  11.  
  12. elseif key == "right" then              -- on a right mousebutton
  13.     -- destroy his destination point, if any
  14.     destroyElement ( getElementData ( source, "destination" ) )
  15.     -- create a glowing corona
  16.     local marker = createMarker ( x, y, z+1, "corona", 1, 0, 255, 255, 50 )
  17.     -- mark the corona as our "destination" type
  18.     setElementData ( marker, "type", "destination" )
  19.     -- link the creator (player) to the marker, and vice versa
  20.     setElementData ( source, "destination", marker )
  21.     setElementData ( marker, "owner", source )
  22.  

Nous utilisons ici "setElementData" pour sauver les données des marqueurs pour le joueur.
"setElementData" et son partenaire,  "getElementData" intéragissent tous les deux avec les données de la fonction.
Ces données agissent donc comme une sorte de base de donnée qui sauvegarde les infos attachées à un 'element'. On peut par exemple attaché une valeur à un 'element' et l'utiliser plus tard avec "getElementData".

A part créer des marqueurs, on peut également faire des fonctions pour télécharger les joueurs où ils le souhaitent.

Code: Lua
  1. elseif key == "middle" then     -- on a middle mousebutton
  2.     -- teleport the player to whereever he clicked
  3.     setElementPosition ( source, x, y, z+1 )
  4. end
  5.  

Téléporter le joueur :

Nous venons donc de créer des marqueurs, avec leurs propres évènements.
Pour que le script sache si le joueur est rentré dedans, il faudra donc utiliser une fonction pour le lui dire. Cette fonction est "onMarkerHit".

Code: Lua
  1. addEventHandler ( "onMarkerHit", getRootElement(), "Script_onMarkerHit" )
  2. function Script_onMarkerHit ( player )
  3.  

Maintenant il va falloir utiliser les données mises en mémoire dans la fonction "Script_onPlayerClick"  pour savoir de quel marqueur il s'agit.  Cela sera soit "teleport", soit "destination". On ne va agir que si le joueur entre dans un  marqueur "teleport".

Code: Lua
  1.     -- if the marker is a teleport point, proceed
  2.     if getElementData ( source, "type" ) == "teleport" then
  3.         -- get the owner linked to the "teleport" type marker
  4.         local owner = getElementData ( source, "owner" )
  5.         -- get the destination point linked to the owner
  6.         local destination = getElementData ( owner, "destination" )
  7.         -- if the destination point exists, proceed
  8.         if destination then
  9.             -- get the "destination" marker's position
  10.             local x, y, z = getElementPosition ( destination )
  11.             -- finally, warp the player there
  12.             setElementPosition ( player, x, y, z )
  13.         end
  14.     end
  15. end
  16.  


Nettoyage du code :
Pour finir on va nettoyer le code et les infos pour chaque joueur. Cela est nécessaire si l'on ne veut pas qu'un marqueur reste après que le joueur ait quitter le serveur.
Tout comment l'évènement "onPlayerJoin", on dispose d'un évènement "OnPlayerQuit" qui est appelée quand un joueur quitte le serveur.

Code: Lua
  1. addEventHandler ( "onPlayerQuit", getRootElement(), "Script_onPlayerQuit" )
  2. function Script_onPlayerQuit ( reason )
  3.     --destroy his teleport point, if any
  4.     destroyElement ( getElementData ( source, "teleport" ) )
  5.     -- destroy his destination point, if any
  6.     destroyElement ( getElementData ( source, "destination" ) )
  7. end
  8.  



CODE COMPLET :

Code: Lua
  1.  
  2. -- :: MTA Scripting Tutorial I - User selectable warp points
  3. -- http://www.mtasa.com/tutorial1.html
  4. --
  5. -- (C) The MTA Team, 2007
  6. -- www.mtasa.com
  7.  
  8. addEventHandler ( "onMapLoad", getRootElement(), "Script_onMapLoad" )                   --This event tells what happens when the map loads.
  9. function Script_onMapLoad ()
  10.         for index, player in getElementsByType ( "player" ) do                          --For each player in the server,
  11.                 bindKey ( player, "i", "down", "modeIO" )                               --Bind the player's "i" key to the function "modeIO" when the key is pressed
  12.         end
  13. end
  14.  
  15. addEventHandler ( "onPlayerJoin", getRootElement(), "Script_onPlayerJoin" )             --This event tells what happens when a player joins.
  16. function Script_onPlayerJoin ()
  17.         bindKey ( source, "i", "down", "modeIO" )                                       --Bind the player's "i" key to the function "modeIO" when the key is pressed
  18. end
  19.  
  20. function modeIO ( source, key, keyState )                                               --This function toggles the cursor on/off
  21.         if isCursorShowing ( source ) then                                              --If cursor was already showing,
  22.                 showCursor ( source, false )                                            --then hide it;
  23.         else                                                                            --if it wasn't showing,
  24.                 showCursor ( source, true )                                             --then show it.
  25.         end
  26. end
  27.  
  28. addEventHandler ( "onPlayerClick", getRootElement(), "Script_onPlayerClick" )           --This event tells what happens when a player clicks on the screen with the cursor.
  29. function Script_onPlayerClick ( key, keyState, element, x, y, z )
  30.         if keyState == "up" then return end                                             --Don't do anything if he's releasing the button.
  31.         if key == "left" then                                                           --If it's left-click:
  32.                 destroyElement ( getElementData ( source, "teleport" ) )                --Destroy his teleport point, if any
  33.                 local theMarker = createMarker ( x, y, z, "cylinder", 2, 0, 255, 0, 50 )        --Create a cylindric marker
  34.                 setElementData ( theMarker, "type", "teleport" )                                --Mark the cylinder as a teleport
  35.                 setElementData ( source, "teleport", theMarker )                                --Link the creator to the teleport
  36.                 setElementData ( theMarker, "owner", source )                           --Link the teleport to its creator
  37.  
  38.         elseif key == "right" then                                                      --If it's right-click
  39.                 destroyElement ( getElementData ( source, "destination" ) )             --Destroy his destination point, if any
  40.                 local theMarker = createMarker ( x, y, z+1, "corona", 1, 0, 255, 255, 50 )      --Create a glowing corona
  41.                 setElementData ( theMarker, "type", "destination" )                     --Mark the corona as a destination point
  42.                 setElementData ( source, "destination", theMarker )                     --Link the creator to the teleport
  43.                 setElementData ( theMarker, "owner", source )                           --Link the teleport to its creator
  44.  
  45.         elseif key == "middle" then                                                     --If it's middle-click
  46.                 setElementPosition ( source, x, y, z+1 )                                --Teleport the player to where he clicked.
  47.         end
  48. end
  49.  
  50. addEventHandler ( "onMarkerHit", getRootElement(), "Script_onMarkerHit" )               --This event tells what happens if a player steps inside a marker.
  51. function Script_onMarkerHit ( player )
  52.         if getElementData ( source, "type" ) == "teleport" then                         --If the marker is a teleport point,
  53.                 local owner = getElementData ( source, "owner" )                        --Get the owner linked to the teleport point.
  54.                 local destination = getElementData ( owner, "destination" )             --Get the destination point linked to the owner.
  55.                 if destination then                                                     --If destination point exists,
  56.                         local x, y, z = getElementPosition ( destination )              --Get the destination point's position.
  57.                         setElementPosition ( player, x, y, z )                          --Put the player there.
  58.                 end
  59.         end
  60. end
  61.  
  62. addEventHandler ( "onPlayerQuit", getRootElement(), "Script_onPlayerQuit" )             --This event tells what happens if a player disconnects.
  63. function Script_onPlayerQuit ( reason )
  64.         destroyElement ( getElementData ( source, "teleport" ) )                        --Destroy his teleport point, if any
  65.         destroyElement ( getElementData ( source, "destination" ) )                     --Destroy his destination point, if any
  66. end
  67.  
« Modifié: 15 Janvier 2007, 11:53:32 par spykerc8 »


~ Leader honoraire de la FsK Team ~ -
~ Membre honoraire de la PCP Team ~

Co-fondateur de GTAO - Retraité de la communauté

"Nous ne sommes rien, soyons tout !"


Hors ligne Grounch

  • Le seul Russe du forum
  • *
  • Bandit
  • Mafieux en stage
  • Messages: 327
    • Voir le profil
Re : LUA Example : User selectable warp points.
« Réponse #1 le: 14 Janvier 2007, 20:49:49 »
Ah oui quand meme, rien que pour se teleporter :ninja

Hors ligne spykerc8

  • *
  • 'The GTAOnline.fr GodFather'
  • Messages: 3821
    • Voir le profil
    • http://www.gtaonline.fr
Re : LUA Example : User selectable warp points.
« Réponse #2 le: 16 Janvier 2007, 13:19:26 »
En lisant le code complet, c'est assez compréhensible, ceci dit, quand on connait pas le C, comme moi, c'est carrement impossible de coder à l'instinct..


~ Leader honoraire de la FsK Team ~ -
~ Membre honoraire de la PCP Team ~

Co-fondateur de GTAO - Retraité de la communauté

"Nous ne sommes rien, soyons tout !"


Hors ligne Grounch

  • Le seul Russe du forum
  • *
  • Bandit
  • Mafieux en stage
  • Messages: 327
    • Voir le profil
Re : LUA Example : User selectable warp points.
« Réponse #3 le: 16 Janvier 2007, 17:47:17 »
Ptet que sa me motivera a apprendre un language au moins.

 :dling :dling :dling :dling :dling :dling :dling :dling :dling :dling

ps: bon ok j'arete avec ce smiley

Hors ligne DeadPixel

  • Designer attitré et maître du monde en puissance.
  • *
  • Nouveau
  • I'M WITH STUPID ^
  • Messages: 12
    • Voir le profil
    • DeadPx.fr
Re : LUA Example : User selectable warp points.
« Réponse #4 le: 01 Février 2007, 17:55:03 »
Site du zéro, cours de C et C++ pour apprendre... en partant de zéro, comme des incultes que nous sommes. Mieux vaut s'y mettre maintenant ;)
FOR SERIOUS.