• 29 Mars 2024, 07:44:17


Auteur Sujet: [RESOLU] Debut LUA (Barrières Automatiques)  (Lu 3251 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne CafeOLait

  • *
  • Nouveau
  • Messages: 16
    • Voir le profil
[RESOLU] Debut LUA (Barrières Automatiques)
« le: 19 Janvier 2012, 20:38:17 »
Bonsoir,

Avec mes copains de classe, nous avons décidé de faire un serveur MTA:SA entre nous pour pouvoir
jouer ensemble... Jusque la tout vas bien (Mais j'aurais du m'en douter)... Ils veulent pousser la réalité plus loin... La sentence tombe... Apprendre le LUA   :blink

La première idée reçue, des barrières automatiques... Je prend mon "anglais" à deux main fouille dans le wiki MTA j'ESSAIE de m'en sortir... Premier test... Il charge mon script en Gamemode  :dry

J'efface tout...

Alors, je vous demande, si vous -On ne sais jamais- pourriez me donner un coup de main...

Voila le code que j'ai essayé...
PS: Je rappelle que c'est mon premier alors n'hesitez pas...

[spoiler]
 
-- create a command handler
addCommandHandler("entrer01", entreraeroport)

-- create the function the command handler calls, with the arguments: thePlayer, command, vehicleModel
function entreraeroport(thePlayer, command, vehicleModel)
   -- create a vehicle and stuff
   setElementRotation("(barrierturn) (1)",rotX,rotY+60,rotZ)
   -- set a timer so the function is called after 1 second
    setTimer ( delayedChat, 1000, 1, "Hello, World!" )
end
 
 function delayedChat ( )
    setElementRotation("(barrierturn) (1)",rotX,rotY-60,rotZ)
   
end


-- create a command handler
addCommandHandler("sortir01", sortiraeroport)

-- create the function the command handler calls, with the arguments: thePlayer, command, vehicleModel
function sortiraeroport(thePlayer, command, vehicleModel)
   -- create a vehicle and stuff
   setElementRotation("(barrierturn) (2)",rotX,rotY-60,rotZ)
   -- set a timer so the function is called after 1 second
    setTimer ( delayedChat, 1000, 1, "Hello, World!" )
end
 
 function delayedChat ( )
    setElementRotation("(barrierturn) (2)",rotX,rotY+60,rotZ)
   
end
 
[/spoiler]

Aussi, si je suis si  :boulet que ca... dite le moi  ::)

Merci de votre aide...
CaféÔLait
« Modifié: 20 Janvier 2012, 23:35:56 par CafeOLait »

Hors ligne Citizen

  • Scripteur LUA confirmé
  • *
  • Messages: 235
    • Voir le profil
    • Byston Evolution
Re : Debut LUA
« Réponse #1 le: 20 Janvier 2012, 00:19:29 »
Bonsoir,
Pour faire tes propres scripts, il te faut un gamemode. Pour ça, rien de plus simple, il te suffit de créer un dossier
dans C:\...\MTA San Andreas 1.2\server\mods\deathmatch\resources\ tu le nommes comme tu veux ( monserver pour mon exemple ).
Ensuite dedans tu crées un fichier .lua ( server.lua dans mon cas, je te conseilles d'utiliser notepad++ pour programmer )
Tu mettra ton code dedans.

Pour commencer, tu essayes "d'attacher" la commande entrer01 à une fonction qui n'existe pas encore vu qu'elle est en-dessous. Il te faut donc placer ton addCommandHandler après.

Ensuite tu utilises la fonction setElementRotationdont je rappel la syntaxe provenant du wiki:
bool setElementRotation ( element theElement, float rotX, float rotY, float rotZ [, string rotOrder = "default" ] )
donc en gros tu dois lui donner en 1er paramètre l'élément à faire tourner puis la rotation finale ( ce qui est entre crochets est optionnel )
Là par exemple, tu lui donnes du texte ( string en anglais ) en 1er argument, donc ça ne peut pas marcher.
D'après ce que je vois, je penses que tu as utilisé le map editor et tu as seulement copié l'id de l'objet.
Il y a une fonction qui te permet de récupérer l'élément d'un objet si tu connais sont id:
element getElementByID ( string id ), comme tu peux le voir, il a besoin d'un string ( l'id de ta barrière en l’occurrence ).
Donc:
Code: (lua) [Sélectionner]
setElementRotation( getElementByID("(barrierturn) (1)"),rotX,rotY+60,rotZ)
Ensuite tu utilises les variables rotX, rotY, et rotZ mais qui ne sont pas déclarées dans ton code. Je sais qu'ils ont marqué comme ça sur le wiki, mais ce sont des exemples de nom de variables, pour pouvoir les expliquer juste en dessous.
On peut réutiliser ces variables si tu veux mais il nous faut récupérer la rotation actuelle de ta barrière dans ces 3 variables pour pouvoir ensuite faire ton +60.
Pour cela, il y a la fonction getElementRotation, là aussi, il faut que tu lui donnes l'élément dont tu veux récupéré la rotation. Si tu as compris ce que j'ai dit plus haut, il te faudra donc faire:
Code: (lua) [Sélectionner]
getElementRotation( getElementByID( "(barrierturn) (1)" ) )Il faut ensuite stocker ces valeurs ( les 3 rotations ) dans nos variables:
Code: (lua) [Sélectionner]
local rotX, rotY, rotZ = getElementRotation( getElementByID( "(barrierturn) (1)" ) )
/?\Mais qu'est-ce que ce local devant les 3 variables ? /?\
Et bas c'est relativement simple, en fait il faut distinguer 2 types de variables:
- les variables dites "locales"
- les variables dites "globales"


[ je terminerais demain, merci de ta compréhension]


The rEvolution is coming ...

Hors ligne CafeOLait

  • *
  • Nouveau
  • Messages: 16
    • Voir le profil
Re : Debut LUA
« Réponse #2 le: 20 Janvier 2012, 10:21:43 »
Merci pour ta réponse...

Voila, j'ai essayé avec les infos que tu m'a donné...

Bonne nouvelle, il démarre...
Mais quand je tappe la commande...

Citer
/entrer01
Il me met l'erreur: WARNING: script\main.lua:3: Bad argument @ 'setElementRotation'

Voila mon nouveau script:
[spoiler]
-- create the function the command handler calls, with the arguments: thePlayer, command, vehicleModel
function entreraeroport(thePlayer, command, vehicleModel)
   setElementRotation(getElementByID("(barrierturn) (1)"),0,330,316)
end

addCommandHandler("entrer01", entreraeroport)

-- create the function the command handler calls, with the arguments: thePlayer, command, vehicleModel
function sortiraeroport(thePlayer, command, vehicleModel)
   setElementRotation(getElementByID("(barrierturn) (2)"),0,30,316)
end

addCommandHandler("sortir01", entreraeroport)
[/spoiler]

Hors ligne Citizen

  • Scripteur LUA confirmé
  • *
  • Messages: 235
    • Voir le profil
    • Byston Evolution
Re : Debut LUA
« Réponse #3 le: 20 Janvier 2012, 10:42:15 »
Oui c'est normal, il faut que tu lances ta map.
Comme elle n'est pas lancée, il ne connait pas cette objet que tu essayes de le faire trouver portant cet ID.
Il faut donc la démarrer, normalement c'est start leNomDeTaMap, en fait c'est comme un petit gamemode sans scripts, juste avec une map. Tu devrais avoir un dossier ( dans ton dossier resources ) avec le nom de ta map que tu as mis à l'enregistrement dans Map Editor, avec à l'intérieur un .map et une meta.xml.
Je te montrerai comment inclure ton .map dans ton gamemode ( pour éviter d'avoir 36 dossiers pour tes maps scripts etc ).

PS: Je dois passer une soutenance en C vers 13h, et donc je suis obliger de le préparer ( ce que je faisais hier soir ), donc je te répondrai très clairement cet après-midi, et je finirai mon post d'au-dessus. Merci de ta compréhension  :happy

Cordialement,
          Citizen
The rEvolution is coming ...

Hors ligne CafeOLait

  • *
  • Nouveau
  • Messages: 16
    • Voir le profil
Re : Debut LUA
« Réponse #4 le: 20 Janvier 2012, 10:46:44 »
Bon courage ;-)

PS: J'utilise un systeme spécial pour mes objets... Ce qui fait qu'ils sont lancés au démarrage,
j'ouvre mamap.map, je copie mes objets, et je les colles dans le broph.map qui se trouve dans la play.zip et mes objets s'affiches (en l'occurence, mes 2 barrières)

EDIT1:
J'ai TROUVE  :lmao :lmao :lmao

PS: Mon père étant hospitalisé, je vous envoye le code demain...


EDIT2:
Voila mon code...

[spoiler]
gatea = createObject ( 969, 1397.1, 2701.6, 9.8, 0, 0, 270 )
gateb = createObject ( 969, 1397.1, 2693.6, 9.8, 0, 0, 270 )
gatec = createObject ( 987, 2294.6, 2503.2, 2.3, 0, 0, 274 )
gated = createObject ( 987, 2319.8, 2440.5, 2.3, 0, 0, 90 )

-- create the function the command handler calls, with the arguments: thePlayer, command, vehicleModel
function ouvrirdepot(commandName, posX, posY, posZ)
   moveObject ( gatea, 15000, 1397.1, 2689, 9.8 )
   moveObject ( gateb, 7500, 1397.1, 2689, 9.8 )
   setTimer (fermerdepot, 30000, 30 )
end

addCommandHandler("od", ouvrirdepot)

-- create the function the command handler calls, with the arguments: thePlayer, command, vehicleModel
function fermerdepot(commandName, posX, posY, posZ)
   moveObject ( gatea, 15000, 1397.1, 2701.6, 9.8 )
   moveObject ( gateb, 7500, 1397.1, 2693.6, 9.8 )
end

addCommandHandler("fd", fermerdepot)

function op(commandName, posX, posY, posZ)
   moveObject ( gatec, 10000, 2294.6, 2503.2, 7 )
   moveObject ( gated, 10000, 2319.8, 2440.5, 8 )
end

addCommandHandler("op", op)

-- create the function the command handler calls, with the arguments: thePlayer, command, vehicleModel
function fp(commandName, posX, posY, posZ)
   moveObject ( gatec, 10000, 2294.6, 2503.2, 2.3 )
   moveObject ( gated, 10000, 2319.8, 2440.5, 2.3 )
end

addCommandHandler("fp", fp)

[/spoiler]
« Modifié: 20 Janvier 2012, 23:35:15 par CafeOLait »

Hors ligne Citizen

  • Scripteur LUA confirmé
  • *
  • Messages: 235
    • Voir le profil
    • Byston Evolution
Re : [RESOLU] Debut LUA (Barrières Automatiques)
« Réponse #5 le: 21 Janvier 2012, 00:02:02 »
Ouai ok, mais je pensais que tu voulais utiliser ta map oO
Si jamais tu veux par exemple maper des barrières dans Map Editor, il te suffira juste de remplacer par exemple gatea par getElementByID( "idDeMaBarriere" ).
Si tu veux t'amuser avec tes potes, je te conseil de faire un tour ici ( c'est un endroit où les personnes mettent leurs gamemodes, leur systèmes, leurs maps etc, tu y trouveras peut êtres des trucks sympas ^^ )
Allez bonne chance pour la suite alors

Cordialement,
    Citizen
The rEvolution is coming ...

Hors ligne CafeOLait

  • *
  • Nouveau
  • Messages: 16
    • Voir le profil
Re : [RESOLU] Debut LUA (Barrières Automatiques)
« Réponse #6 le: 21 Janvier 2012, 01:03:05 »
Oui, au début, c'est ce que je voulais faire...

mais je préfère le systeme du script. Chaque porte à sa variable et c'est plus simple pour s'y retouver...


Merci beaucoup.
 ;)