Aller au contenu
Top-Metin2.org - Vous êtes à la recherche d'un serveur Metin 2 ? ×
×
×
  • Créer...

[Création] Quêtes, Les bases.


Valithis²

Messages recommandés

  • Retraité

Niveau requis Débutant

Pré-requis :

  • Un éditeur de texte : Notepad++, SublimText, VisualStudio etc...
  • La liste des fonctions (merci sparks), consultez le fichier quest_functions.lua pour avoir l'ensemble des fonctions disponibles.
  • De l'imagination
  • Du café

 

I. Généralités

Révélation

 

A. Le LUA, tout une histoire (merci wikipédia)

Révélation

Lua est un langage de script libre, réflexif et impératif.

Créé en 1993, il est conçu de manière à pouvoir être embarqué au sein d'autres applications afin d'étendre celles-ci. Lua (du portugais : Lua [ˈlu.ɐ], au Brésil : [ˈlu.a], signifiant « Lune »3) a été développé par Luiz Henrique de Figueiredo, Roberto Ierusalimschy (en) et Waldemar Celes, membres du groupe de recherche TeCGraf, de l'université pontificale catholique de Rio de Janeiro au Brésil.

L'interpréteur Lua est écrit en langage C ANSI strict, et de ce fait est compilable sur une grande variété de systèmes. Il est également très compact, la version 5.0.2 n'occupant que 95 ko à 185 ko selon le compilateur utilisé et le système cible. Il est souvent utilisé dans des systèmes embarqués tels qu'OpenWrt4 où cette compacité est très appréciée. Il profite de la compatibilité que possède le langage C avec un grand nombre de langages pour s'intégrer facilement dans la plupart des projets.

Il est particulièrement apprécié pour l'embarqué, le développement réseau et les jeux vidéo.

Le Lua est utilisé dans des jeux vidéo comme : Transformice, World Of Warcraft (addons), roblox, garrysmod, computercraft mod., Multi Theft Auto (mod multijoueur de GTA: San Andreas), ainsi que les moteurs de jeu vidéo tels que CryENGINE, LÖVE, ou encore les Fantasy consoles.

Il est également utilisé au niveau réseau comme hook sur Apache, Lighttpd (par défaut), Nginx (via OpenResty), dans les routeurs Cisco, dans l'analyseur de paquets Wireshark, l'antispam Rspamd, l'autocommutateur téléphonique privé Asterisk (optionnel), pour les scripts de MediaWiki.

B. Trouver, modifier, implanter une quête

Révélation

Suivant la version de vos files, le chemin d'accès varie quelque peu mais voici globalement les deux principaux au jour d'aujourd'hui :

  • /usr/metin2/share/locale/france/quest pour la plupart des files actuels.
  • M2SF/resources/locale/france/quest si vous êtes sur les files M2SF.

 

L'implantation est simple, téléversez votre fichier en ce lieu et inscrivez le nom de ce dernier dans le fichier locale_list.

Il ne vous restera plus qu'à compiler vos quêtes avec la commande suivante : sh quest.sh sur votre machine virtuelle.

 

 

II. Notre première quête

Révélation

A. La base

Révélation

 



quest ma_premiere_quete begin
	state start begin

	end
end

Voici l'architecture principale de vos quêtes hors cas spéciaux que nous n'aborderons pas dans ce sujet.

Toute votre quête se trouvera donc à l'intérieur de ce bout de code.

Vous remarquerez les end, la règle est simple, mettez-en un pour chaque étape/condition de votre quête. Inutile de traduire, vous l'aurez compris, il permet tout bonnement de fermer vos state/when/if etc ... . Sans ce end, vous aurez droit à un message d'erreur du type : Segmentation fault (core dumped) sur votre machine virtuelle.

Dernier point, le format de votre fichier sera .quest, exemple : ma_premiere_quete.quest

 B. Notre première condition

Révélation

Une condition commence toujours par un when (lorsque, quand en français).

Quand le joueur se connecte, ceci s'exprime en :



quest xxxxx begin // Debut de quete, xxxx étant le nom de la quete
	state start begin // Début d'une étape
		when login begin // Lorsque le joueur se connecte

		end // Fin du when
	end // Fin de l'étape state
end // Fin de la quete

Quand le joueur parle au PNJ :



quest xxxxx begin // Debut de quete, xxxx étant le nom de la quete
	state start begin // Début d'une étape
		when ID_PNJ.chat."Funky-emu" begin // Lorsque le joueur parle au PNJ

		end // Fin du when
	end // Fin de l'étape state
end // Fin de la quete

Remarque : Vous trouverez l'ID de vos pnj dans votre mob_proto // mob_names

"Funky-emu" sera le nom de l'onglet qui s'affichera quand le joueur parlera au PNJ

 

Lorsque le joueur clique sur un item, ceci s'exprime en :



quest xxxxx begin // Debut de quete, xxxx étant le nom de la quete
	state start begin // Début d'une étape
		when ID_ITEM.use begin // Lorsque je clique sur l'item

		end // Fin du when
	end // Fin de l'étape
end // Fin de la quete

Lorsque le joueur monte level 5, ceci s'exprime en :



quest xxxxx begin // Debut de quete, xxxx étant le nom de la quete
	state start begin // Début d'une étape
		when login or levelup with pc.get_level() >= 5 begin // Lorsque j'up lv5

		end // Fin du when
	end // Fin de l'étape
end // Fin de la quete

Remarque : Le login est important car la quête apparaîtra à chaque connexion du joueur jusqu'à ce qu'il ai enfin cliqué sur la quete

 

Lorsque le joueur entre dans une map précise, ceci s'exprime en :



quest xxxxx begin // Debut de quete, xxxx étant le nom de la quete
	state start begin // Début d'une étape
		when login with pc.get_map_index() == ID_MAP begin // Lorsque le joueur se connecte sur la map ID_MAP

		end // Fin du when
	end // Fin de l'étape
end // Fin de la quete

Remarque : Vous trouverez l'ID de votre map dans l'index situé dans le dossier map de votre serveur.

 

274904funkyemu.jpg

 

Avec ceci, vous pouvez maintenant lancer vos quêtes, mais il vous manque le contenu de ces conditions !

C. Les dialogues

Révélation

Les conditions c'est bien, vous pouvez dorénavant spammer les joueurs avec des quêtes sans contenu ! Cela dit, si vous voulez au moins retenir le joueur plus de cinq minutes sur votre serveur, il va falloir lui offrir un peu de dialogue et s'il a pas envie de vous parler, aucun problème, le mono-dialogue existe.


La fonction say("") sera votre meilleure amie. D'autant que sa propre définition en dit long sur ce qu'elle peut faire !

En plus d'être cool, elle a des amies tout aussi cool que voici :

  • say("") -- C'est bien d'être sa propre amie parfois
  • say_title("") -- Offre un titre à votre fenêtre
  • say_reward("") -- Offre un peu de couleur à votre texte (une seule couleur en faite et elle est défini)
  • say_color("") -- Présente sur certaines files, parfois dans des déclinaisons différentes mais vous l'avez deviné, elle offre une palette de couleur défini dans la fonction.
  •  

Mettons ceci en forme :



quest funkyemu begin // Debut de quete, xxxx étant le nom de la quete
	state start begin // Debut d'une étape
		when ID_DU_PNJ.chat."FunkyEmu"  begin // Lorsque je clique sur le PNJ
			say_title("FunkyEmu") // Titre de la fenetre
			say("Bonjour ! ") // Texte
		end // Fin du when
	end // Fin de l'étape
end // Fin de la quete


Résultats :

Révélation

274904funkyemu1.jpg

Simple non ? Passons à quelque chose de plus complexe.
Je veux que le PNJ me donne des choix !

Dans ce cas, nous avons besoin d'une variable auquel nous stockerons nos valeurs :



local nom_variable
-- variable


select("1erChoix", "2ndChoix")
-- valeur

Ce qui donne :



local choix=select("1erChoix", "2ndChoix") // Choix multiple


Continuons ma quete :



quest funkyemu begin // Debut de quete, xxxx étant le nom de la quete
	state start begin // Debut d'une étape
		when ID_DU_PNJ.chat."FunkyEmu"  begin // Lorsque je clique sur le PNJ
			say_title("FunkyEmu") // Titre de la fenetre
			say("Bonjour ! ") // Texte
			say("Qui est Valithis ? ") // Texte
			local choix=select("Un modérateur", "Un spécialiste", "Un noob ?") // Choix multiple

		end // Fin du when
	end // Fin de l'étape
end // Fin de la quete


Résultat :

Révélation

275955funkyemu2.jpg

Vous pouvez essayer !
Nous voilà exposé à un problème ... lorsque je clique sur " Un modérateur ", rien ne se passe ... .
Eh oui ! Nous allons attribuer des actions à ces choix., autrement dit, des CONDITIONS.

En français, nous allons dire :

Citation

" Si le joueur clique sur " Un modérateur " alors il y aura écrit " Bravo ! " "
" Si le joueur clique sur " Un spécialiste " alors il y aura écrit " Bouh tu es nul ! " "
" Si le joueur clique sur " Un noob " alors il y aura écrit " Tu veux ma main dans ta ... ? " "

En lua, ça donne :



if choix == 1 then // Si le joueur clique sur le 1er choix
elseif choix == 2 then // Si le joueur clique sur le 2eme choix
elseif choix == 3 then // Si le joueur clique sur le 3eme choix


Ce qui donne avec le texte :



quest funkyemu begin // Debut de quete, xxxx étant le nom de la quete
	state start begin // Debut d'une étape
		when ID_DU_PNJ.chat."FunkyEmu"  begin // Lorsque je clique sur le PNJ
			say_title("FunkyEmu") // Titre de la fenetre
			say("Bonjour ! ") // Texte
			say("Qui est Valithis ? ") // Texte
			local choix=select("Un modérateur", "Un spécialiste", "Un noob ?") // Choix multiple
			if choix == 1 then // Choix 1
				say_title("FunkyEmu")
				say("Bravo !")
			elseif choix == 2 then // Choix 2
				say_title("FunkyEmu")
				say("Bouh tu es nul ! ")
			elseif choix == 3 then // Choix 3
				say_title("FunkyEmu")
				say("Tu veux ma main dans ta ... ? ")
			end // Fin du IF/ELSEIF
		end // Fin du when
	end // Fin de l'étape
end // Fin de la quete



Résultat :

Révélation

271708funkyemu3.jpg271708funkyemu4.jpg271708funkyemu5.jpg

 

Une limite :

Oui il existe une limite de caractère pour les say, sachez que l'on peut mettre 49 caractères par ligne.
Flemme de compter ? il existe deux types de marqueur :



---                                                     1
----"12345678901234567890123456789012345678901234567890"| 


Alignez le premier - avec le say("")



say_title("FunkyEmu")
---                                                   1
say("Bonjour ! ")


Si vous dépassez cette limite, voici le résultat :

Révélation

275901funkyemu8.jpg

 

D. Les fonctions d'attributions

Révélation

Si vous parvenez à accrocher le joueur avec des dialogues, c'est bien mais nous savons tous que c'était votre multi-compte. Car oui un vrai joueur casse-couille n'en a que faire de vos dialogues, il veut de l'or ! des armes ! de l'expérience ! Bref il veut vider les poches de votre serveur et ça tombe bien, les vôtres sont illimité grâce à votre super don de l'écriture (merci à vos doigts). Voici les fonctions principales à utiliser :

 

  • pc.give_item2()
  • pc.give_exp2()
  • pc.changemoney()
  • pc.remove_item()

 

Exemple :



quest funkyemu begin // Debut de quete, xxxx étant le nom de la quete
	state start begin // Debut d'une étape
		when ID_DU_PNJ.chat."FunkyEmu"  begin // Lorsque je clique sur le PNJ
			say_title("FunkyEmu") // Titre de la fenetre
			say("Félicitation ! ") // Texte
			say("Tu as atteint le level 5.") // Texte
			say("Je t'offre ceci mais en contrepartie, ")
			say("je te retire cette perle ! ")
			say_reward(" - Un item")
			say_reward(" - De l'expérience. ")
			say_reward(" - Des yangs")
			pc.give_item2(ID_ITEM, NOMBRE_ITEM) // Don de l'item
			pc.give_exp2(NOMBRE_EXP) // Don d'exp
			pc.changemoney(NOMBRE_YANG) // Don de yangs
			pc.remove_item(ID_ITEM, NOMBRE_ITEM) // Suppression de l'item
		end // Fin de l'étape WHEN
	end // Fin de l'étape
end // Fin de la quete

A vous de fouiller votre quest_functions et d'y ajouter d'autres fonctions intéressante pour remplir les poches de vos joueurs !

 

 

 

 

 

Modifié par Valithis²
  • Metin2 Dev 1
  • Love 33

You can't be immortal,
But you can make people remember
you for thousands of years...

Lien vers le commentaire
Partager sur d’autres sites

  • Retraité

Petite modification sur les marqueurs.

Je continuerai ce soir avec les fonctions tel les warp et compagnie ou peut-être les compteurs je ne sais pas, je veux vous fournir des fonctions faciles.

N'hésitez pas à me demander ce que vous désirez, ça complétera mon tutoriel en plus de ce que je vais vous donner.

 

Avec plaisir :tounge:

Bonne journée.

You can't be immortal,
But you can make people remember
you for thousands of years...

Lien vers le commentaire
Partager sur d’autres sites

  • Retraité

Petite précision !

Si vous copiez mes codes, ne prenez pas les commentaires ! Les //

J'ai simplement pris ces // pour en faire un commentaire php.

You can't be immortal,
But you can make people remember
you for thousands of years...

Lien vers le commentaire
Partager sur d’autres sites

  • Retraité

Concernant les erreurs, je ferais tout un paragraphe dessus à la fin de ce tutoriel.

Ceci à pour but de vous laisser réfléchir à votre problème, vous donner une solution immédiatement ne vous aidera pas.

 

Si vous ne trouvez pas l'erreur, c'est que vous n'avez pas bien compris le tutoriel, je n'ai pas dû bien expliquer certaines choses donc n'hésitez pas à me demander des approfondissements.

 

 

Epingled'

 

Un épinglage à la Fatality, magnifiquement dit.

C'est du franglais :wink:

You can't be immortal,
But you can make people remember
you for thousands of years...

Lien vers le commentaire
Partager sur d’autres sites

pc.give_item()  //1° 

 

 

J'crois que le pc.give_item() bug, faut utiliser le pc.give_item2()

 

Non il bug pas.

L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes.

Lien vers le commentaire
Partager sur d’autres sites

  • 4 semaines après...


  • brilliantdiscord_widget
  • Flux d'Activité

    1. 21

      Metin2 en 2020 peut-on en parler?

    2. 0

      METIN2Project

    3. 3

      Ressources - UnPack - Metin2 Client - Officiel

    4. 0

      Barre des tâches d'argent étendue

    5. 16

      Redémarrage automatique des channels

    6. 16

      Multi Logo GM / SGM / GA

  • En ligne récemment

    • Aucun utilisateur enregistré regarde cette page.

Information importante

Conditions d’utilisation / Politique de confidentialité / Règles / Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.