Aller au contenu

Nouveau membre ?! Pense à te présenter pour accéder au contenu du forum !

New member ?! Introduce yourself to get access to the forum !

  • 0
Testuff

en cours [Résolu] Recommencer une quete

Question

Posté(e) (modifié)

Version des fichiers/ Type d'émulateur : 2014

Domaine (Base de données, Client, Core...) : Core

Votre niveau (Débutant, Intermédiaire, Avancé..) : Débutant

 

Description du problème : Je souhaiterais pouvoir refaire une quête avec un perso, mais je ne vois pas comment.

Comment reproduire le problème ? : Problème identique sur toutes les quêtes se terminant par set_state(_COMPLETE__)    State __COMPLETE__ BEGIN

Recherches et tests effectués :

Après avoir effectué plusieurs de recherche, voici ce que j'ai compris :

- Lorsqu'une quête se termine par :

set_state(_COMPLETE__)

State __COMPLETE__ begin

 

la quête ne pourra jamais être refaite.

 

J'ai cherché un peu dans la base SQL et je vois que dans table PLAYER / QUEST, on peut trouver la liste des quetes en cours ou en attente pour chaque joueur avec un status + un chiffrage long et bizarre. Ce chiffre semble décrire l'état d'avancement de la quête au programme.

 

J'ai donc cherché à modifier se chiffre pour refaire une quête, mais cela ne marche pas.

 

Pouvez m'aider et me donner un peu plus d'explication sur ce qu'engendre le  "set_state(_COMPLETE__)" et le "state __COMPLETE__ begin" dans la base SQL, et m'aider à trouver comment "rebooter" une quete, s'il vous plait ?

 

merci d'avance pour votre aide

 

Screenshot du problème concerné : NEANT

 

En postant ma demande d'aide, j'affirme avoir lu et accepté le Règlement de Funky-Emulation.

Modifié par Kameyu

Partager ce message


Lien à poster
Partager sur d’autres sites

11 réponses à cette question

Messages recommandés

  • 0

Hello !

 

Avec  set_state(), tu peux mettre le nom du state que tu veux pour changer "l'état" de la quête.

Imaginons que tu englobes ta quêtes dans un state appelé "ma_quete". Si à la fin de la quête, tu fais set_state(start), et bien tu vas pouvoir changer l'état de la quête du joueur et il va pouvoir recommencé dès le début de la state()

 

Sachant que start, c'est la state qui est exécuté en première dans tous les cas.

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Bonsoir,

 

Merci pour cette réponse rapide.

 

Je t'avoue que je ne suis pas un expert en programmation, loin de là. Je ne suis pas sûr d'avoir bien compris.

 

Si je comprends bien set_state() permet de faire sauter le programme jusqu'à la ligne "state ..... begin", c'est bien ça ?

 

180523061858671231.png

 

Mais lorsque le programme arrive à la ligne : "steta __COMPLETE__ begin", concretement il doit bien écrire une information à quelque part pour dire que la quete est "complete" et qu'il ne faut pas la refaire non, svp ?

 

merci encore à tous pour votre aide

 

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Exemple:

quest test begin
	state start begin
		when login begin
			say("coucou")
		end
	end
end

 

Là rien de compliqué. Une quête simple qui dit "Coucou" à chaque connexion sur le jeu (ou changement de map). Maintenant, comment je fais pour que ça ne le fasse qu'une seule fois:

 

quest test begin
	state start begin
		when login begin
			say("coucou")
			set_state(__COMPLETE__)
		end
	end
	
	state __COMPLETE__ begin
	end
end

 

Une fois qu'on a dit coucou, je set la state du joueur à __COMPLETE__. Et comme tu peux le voir, il n'y a rien dans la state __COMPLETE__. C'est juste un moyen pour que le serveur ne recommence pas à state start begin à chaque fois.

Dans ton cas, c'est spécial car tu as plusieurs state. Si le joueur se trouve déjà dans une state qui n'est pas start, le serveur restera dans celle la et n'ira pas chercher à exécuter la state start.

 

Dans ton cas il suffit de faire set_state(start) et la quête recommencera à la state start. Voici un exemple:

 

quest test begin
	state start begin
		when login begin
			say("coucou")
			set_state(etape1)
		end
	end

	state etape1 begin
		when login begin
			say("Bienvenue dans l'étape 1 !")
			set_state(start)
		end
	end
end

La première fois que le joueur va se co, il va obtenir le message: coucou.

La deuxième fois qu'il va se co ou changer de map, il va obtenir le message: Bienvenue dans l'étape 1

La troisième fois qu'il va se co au changer de map, il va obtenir le message coucou 

 

Techniquement, je fais un set_state(etape1). Ensuite une fois qu'il s'est reco ou changer de map, et qu'il a obtenu le message de bienvenue dans l'étape 1, je fais set_state(start) pour faire redémarrer la quête du joueur.

 

Je sais pas si je suis clair, hésite pas si tu as des questions.

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Ok, merci , je penses avoir compris :-).

 

Juste "la state" de la quête est physiquement stockée où dans le jeu, stp ? sur la base SQL ou dans un fichier particulier ? car à chaque redémarrage du serveur, il connais déja le status de toutes quêtes.

 

merci en tout cas pour le super détail de l'explication :-).

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

C'est stocké dans la table quest (base de données player).

On stocke la state actuelle du joueur et comme ça on sait à quel endroit dans la quête le joueur se trouve.

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Ok merci encore, je vais regarder ça en rentrant ce soir.

 

Si tu as un exemple de table player/quest pour me montrer où je trouve cette valeur, car de mémoire, toutes mes quêtes en sont __status avec une collone suivante avec des chiffres.

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

 

fdjTO40.png

 

Tu as le nom de la state dans la colonne szState.

Pas sûr mais je crois que __status est = à start.

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

OK, c'est good j'ai trouvé, la colonne IValue donne state ou se trouve la quete et ces nombres sont définis à cet endroit : /usr/metin2/share/locale/france/quest/object/state

 

merci encore pour ton aide

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Pas de soucis !

N'oublie pas de passer ton sujet en résolu :)

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Désolé pour la question bête mais comment on fait ? Loll

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0
Posté(e) (modifié)
Le 23/05/2018 à 18:45, Testuff a dit :

Juste "la state" de la quête est physiquement stockée où dans le jeu, stp ?

 

Alors, petite précision avant de clore le sujet;

 

Les identifiants des states sont stockés à deux endroits; le premier c'est pour savoir quel est l'identifiant du state et il est stocké ici:

/usr/metin2/share/locale/france/quest/object/state

L'autre, il est stocké dans la base player.quest, plus en détail:

image.thumb.png.468572f7f563849f0b25a7b489b1ea28.png

 

dwPID correspond à l'ID du personnage concerné.

szName correspond au nom de la quête.

La colonne szState peut valoir soit "__status", soit un nom de variable (qu'on déclare avec "setf" ou "setqf")

Ensuite, szState "__status" correspond au state en cours de la quête.

 

Modifier le state par un autre (suivi d'un redémarrage serveur ou un /reload q en jeu) permettra de modifier directement le state :).

 

P.S.: Pour passer ton sujet en résolu, édite ton premier message pour modifier la balise de titre de [En cours] à [Résolu].

 

La bise!

Modifié par Kameyu

Partager ce message


Lien à poster
Partager sur d’autres sites
Invité
Ce sujet ne peut plus recevoir de nouvelles réponses.

×

Information importante

By using this site, you agree to our Conditions d’utilisation.