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

Aide Quête Mysql


Jinzo
Aller à la solution Résolu par Sufhal,

Question

Version des fichiers/ Type d'émulateur : Metin 2

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

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

 

Description du problème : Impossible d'afficher une variable BDD dans un say("")

Comment reproduire le problème ? :

Recherches et tests effectués : j'ai cherché dans divers site d'émulation y compris ici

 

Screenshot du problème concerné :

 

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

 

Bonjour la communauté , je vous expose ici un soucis que je rencontre lors d'une création de quete de téléportation .

Je voudrai avoir la requete BDD qui s'affiche sur un local choix ( local s = select(""..choix1.."",""..choix2.."") .)

 

				local lieu1 = mysql_query("SELECT teleportation.lieu1 FROM player.teleportation WHERE teleportation.name='"..name.."';")
				local lieu2 = mysql_query("SELECT teleportation.lieu2 FROM player.teleportation WHERE teleportation.name='"..name.."';")
				local lieu3 = mysql_query("SELECT teleportation.lieu3 FROM player.teleportation WHERE teleportation.name='"..name.."';")
				local lieu4 = mysql_query("SELECT teleportation.lieu4 FROM player.teleportation WHERE teleportation.name='"..name.."';")
				local lieu5 = mysql_query("SELECT teleportation.lieu5 FROM player.teleportation WHERE teleportation.name='"..name.."';")
				say_title("Ou veux tu te rendre "..pc.get_name().." ? ")
				say("")
				local c = select(""..lieu1.."",""..lieu2.."",""..lieu3.."",""..lieu4.."",""..lieu5.."","Sortir")

Merci d'avance pour votre aide.

Lien vers le commentaire
Partager sur d’autres sites

  • Réponses 28
  • Créé
  • Dernière réponse

Meilleurs contributeurs dans cette question

Meilleurs contributeurs dans cette question

Messages recommandés

  • 0
  • Retraité
  • Solution

Voici une solution qui devrait fonctionner :

local req = mysql_query("SELECT * FROM player.teleportation WHERE teleportation.name='"..name.."'")

local menu_list = {}

if req ~= nil then
	for i=1,table.getn(req) do
		menu_list[i] = req[i][1]
	end

	table.insert(menu_list, "Annuler")
	local s = select_table(menu_list)

	if s == table.getn(lieux_list) then
		return
	end 

	if req[s][2] ~= nil and req[s][3] ~= nil then
		pc.warp(req[s][2],req[s][3])
	else
		syschat("Il y a un problème avec les coordonnées.")
		return
	end
else
	syschat("Vous n'avez aucun lieu d'enregistré.")
	return
end

 

Pour cela il faut que tu modifies ta table teleportation pour qu'elle ait uniquement la colonne name, local_x et local_y.

Rien empêche d'avoir plusieurs lignes pour un seul personnage, ce sera bien plus propre ainsi !

De plus avec cette méthode il sera possible d'y avoir autant de lieu enregistré que désiré.

Lien vers le commentaire
Partager sur d’autres sites

  • 0

La quête n'étant pas terminée je ne peux la dévoiler , je la déposerai lorsqu'elle sera opérationnelle .

Les informations qui sont dans la demande devrai suffir a m'aider étant donner que le soucis repose uniquement sur la commande mysql et la demande du local choix =)

 

 

il y a 6 minutes, antok a dit :

Tu ne peux pas juste écrire "lieu" étant donné que la fonction retourne ça sous forme de tableau à 2 dimensions (n°ligne, n°colonne). Dans ton cas ça donnerait lieu[1][1] (première ligne, première colonne)

Donc si je comprend bien si mon lieu ce trouve sur la première ligne mais en colonne 2 ma condition serai alors : "..lieu1[1][2].." ?

Lien vers le commentaire
Partager sur d’autres sites

  • 0
  • Retraité

Bonjour Jinzo,

 

Premièrement tu fais beaucoup de requête pour rien, tu peux requêter toutes les colonnes d'un seul coup (tu noteras que j'ai enlevé le point-virgule) :

local lieux = mysql_query("SELECT lieu1, lieu2, lieu3, lieu4, lieu5 FROM player.teleportation WHERE teleportation.name='"..name.."' LIMIT 1")

 

Deuxièmement tu ne peux pas faire un select() dynamique comme tu l'as fait pour une raison que j'ignore (j'ai déjà essayé aussi).

En revanche tu peux utiliser select_table() dans lequel tu passeras un tableau avec les joueurs à l'intérieur en paramètre. 

 

La variable étant devenue un tableau tu peux faire comme suit :

local lieux_list = {}

for i=1,table.getn(lieux) do
	table.insert(lieux_list, lieux[1][i])
end

table.insert(lieux_list, "Annuler")
local s = select_table(lieux_list)

if s == table.getn(lieux_list) then
  return
end

Tu aurais aussi pu insérer directement "Annuler" dans lieux mais je trouve ça plus propre de faire un tableau spécialement pour le menu sans toucher au premier dans le cas où tu voudrais réutiliser celui-ci.

Je t'aurais bien mis la suite du code mais ne sachant pas comme tu as stocké les positions dans lieu1 et 2 je ne vois pas trop comment tu peux récupérer les coordonnées X et Y.

 

En espérant t'avoir éclairé sur le problème ^_^

 

Lien vers le commentaire
Partager sur d’autres sites

  • 0
il y a 18 minutes, _Sufhal a dit :

Bonjour Jinzo,

 

Premièrement tu fais beaucoup de requête pour rien, tu peux requêter toutes les colonnes d'un seul coup (tu noteras que j'ai enlevé le point-virgule) :


local lieux = mysql_query("SELECT lieu1, lieu2, lieu3, lieu4, lieu5 FROM player.teleportation WHERE teleportation.name='"..name.."'")

 

Deuxièmement tu ne peux pas faire un select() dynamique comme tu l'as fait pour une raison que j'ignore (j'ai déjà essayé aussi).

En revanche tu peux utiliser select_table() dans lequel tu passeras un tableau avec les joueurs à l'intérieur en paramètre. 

 

La variable étant devenue un tableau tu peux faire comme suit :


local lieux_list = {}

for i=1,table.getn(lieux) do
	table.insert(lieux_list, lieux[i])
end

table.insert(lieux_list, "Annuler")
local s = select_table(lieux_list)

if s == table.getn(lieux_list) then
  return
end

Tu aurais aussi pu insérer directement "Annuler" dans lieux mais je trouve ça plus propre de faire un tableau spécialement pour le menu sans toucher au premier dans le cas où tu voudrais réutiliser celui-ci.

Je t'aurais bien mis la suite du code mais ne sachant pas comme tu as stocké les positions dans lieu1 et 2 je ne vois pas trop comment tu peux récupérer les coordonnées X et Y.

 

En espérant t'avoir éclairé sur le problème ^_^

 

PRIMARY KEY (`name`,`lieu1`,`lieu1_x`,`lieu1_y`,`lieu2`,`lieu2_x`,`lieu2_y`,`lieu3`,`lieu3_x`,`lieu3_y`,`lieu4`,`lieu4_x`,`lieu4_y`,`lieu5`,`lieu5_x`,`lieu5_y`)

voici comment ce trouve ma table il y a 5 lieus possible

j'ai essayé cette fonction dans la local :

local c = select(""..lieu1[1][2].."",""..lieu2[1][5].."",""..lieu3[1][8].."",""..lieu4[1][11].."",""..lieu5[1][14].."","Sortir")

pourrai-je avoir un morceau de code clair afin de m'aider ?

 

Merci _Sufhal j'ai testé ton morceau de code et effectivement je vois bien le premier nom de lieu sur ma quete , hors je ne vois pas les 4 autres qui reste dois-je moidifier une condition sur ton code ?

Modifié par Jinzo
double post
Lien vers le commentaire
Partager sur d’autres sites

  • 0

Bonjour la fonction fonctionne, hors mis pour la partie téléportation.

J'ai du modifier 2 , 3 choses afin que le code que tu as gentiment écrit puisse fonctionner avec ma table .

Modifié par Jinzo
erreur de frappe
Lien vers le commentaire
Partager sur d’autres sites

  • 0
  • Retraité

Qu'as-tu modifié ? Je suis pourtant sûr à 100% que mon code fonctionne sans l'avoir testé si les coordonnées inscrites dans la table ont été enregistrées avec pc.get_local_x et y. 

Tu n'as pas modifié ta table comme je te l'ai suggéré ?

Service ^_^

Lien vers le commentaire
Partager sur d’autres sites

  • 0

J'ai finalement suivi ton code et j'ai modifier ma table "teleportation" comme tu me l'as suggérer.

Il est vrai que cela est plus propre

 

Le soucis que je rencontre est au niveau de la téléportation , IG il ne ce passe rien

, peut tu m'éclairer sur 2 , 3 point s'il te plais , voici mon code :

local req = mysql_query("SELECT * FROM player.teleportation WHERE teleportation.name='"..name.."'")-- selection de toute la table
				local menu_list = {} -- fonctionj menu
				if req ~= nil then -- je ne comprend pas ce symbole "~" et le nil 
					for i=1,table.getn(req) do -- selection de la premiere ligne de la table
						menu_list[i] = req[i][2] -- affiche IG la colonne 2 de la table ( correspond aux noms )
					end
					table.insert(menu_list, "Annuler") -- menu avec les les noms et l'annulation
					local s = select_table(menu_list) -- Si un element du menu est selectionner
					if s == table.getn(lieux_list) then -- si un menu est selectionner alors 
						return -- pourquoi un return ici ?
					end
					if req[s][3] ~= nil and req[s][4] ~= nil then -- selection des coordonnées x et y [3] [4]
						pc.warp(req[s][3],req[s][4]) -- fonction warp ( les position ne sont pas *100 j'ai donc ajouter ceci au pc.getx et y ( pc.getx()*100 et pc.gety()*100 
					else
						syschat("Il y a un problème avec les coordonnées.") 
						return
					end
				else
					syschat("Vous n'avez aucun lieu d'enregistré.")
					return
				end

Vois tu une solution a ce problème de TP ?

 

Voici la table et l'inscription sur la table :

PRIMARY KEY (`name`,`nom`,`local_x`,`local_y`)
INSERT INTO `teleportation` VALUES ('PlayerOne', 'map 1', '476800', '956700');
INSERT INTO `teleportation` VALUES ('PlayerOne', 'map 2', '476900', '956900');
INSERT INTO `teleportation` VALUES ('PlayerOne', 'map 3', '476900', '956900');
INSERT INTO `teleportation` VALUES ('PlayerOne', 'map 4', '476900', '956900');
INSERT INTO `teleportation` VALUES ('PlayerOne', 'map 5', '476900', '956900');

Cordialement

Modifié par Jinzo
Ajout de Code
Lien vers le commentaire
Partager sur d’autres sites

  • 0
  • Retraité
if s == table.getn(lieux_list) then
	return
end 

Getn renvoie le nombre d'éléments dans le tableau, si s est égal à ce nombre cela veut dire que le joueur à cliqué sur "Annuler".

 

if req ~= nil then

Si le tableau req n'est pas nul alors, ~ représente la négation et nil représente une valeur nulle/inexistante en Lua (NULL dans beaucoup d'autres langage).

 

Tu dois te planter au moment où tu enregistres les coordonnées dans la table. Tu devrais utiliser ces fonctions :

player_x = pc.get_local_x()
player_y = pc.get_local_y()

Ces valeurs étant seulement les coordonnées locales il faut les multiplier par 100 puis ajouter les coordonnées de la map mais dans ce cas il faut aussi ajouter les coordonnées de la map dans la table.

Ce serait plus simple d'utiliser un fonction qui permet d'obtenir les coordonnées universelles directement mais je ne sais pas si c'est ce que fait les fonctions :

player_x = pc.get_x()
player_y = pc.get_y()

 

Je suis pas sur mon PC alors je peux pas testé, fais une quête bidon sur un NPC qui donne les valeurs de ces fonctions pour voir à quoi elles ressembles.

Tiens moi au courant !

Lien vers le commentaire
Partager sur d’autres sites

  • 0

Voici ce que j'obtiens avec ce code  :

				player_x = pc.get_local_x() -- ceci indique la position actuel elle est égal a la position sur la mini map 
				player_y = pc.get_local_y()


				player_xx = pc.get_x() 		-- ceci indique la position actuel + la position calculer sur la Map
				player_yy = pc.get_y()


				say(""..player_x..", et "..player_y.." pour player_x ") 	-- position en centaine ( 672, 607)

				say(""..player_xx..", et "..player_yy.." pour player_xx ") 	-- position en millième ( 4768, 9567)

Hidden Content

    Give reaction to this post to see the hidden content.

 

Dans ma quête j'utilise ceci :

 

                        local marque4_x = pc.getx()*100
                        local marque4_y = pc.gety()*100

 

Ce qui correspond :


player_xx = pc.get_x()*100
player_yy = pc.get_y()*100

 

Hidden Content

    Give reaction to this post to see the hidden content.

 

 

Modifié par Funky Emulation
Core X - External 2 Internal
Lien vers le commentaire
Partager sur d’autres sites

  • 0
  • Retraité

Je vois pas trop à quoi correspond les valeurs get_x() et y(). 

 

Le problème étant qu'il n'existe pas de fonction permettant de récupérer les coordonnées d'une map (en elle même, pas celle du personnage) à partir de l'index de celle-ci.

Du coup il faudrait enregistrer les coordonnées des maps à partir de l'index dans un tableau pour faire le calcul à partir des coordonnées locales mais c'est pas pratique dans la mesure où il faudra maintenir constamment ce code en cas de création/implantation de map mais c'est tout à fait faisable, il faut juste y penser.

 

Autre solution : récupérer les coordonnées inscrites dans la table player.player et les inscrire dans ta table player.teleportation.

Mais ces données ne sont malheureusement pas instantanées la position ne sera pas précise.

 

EDIT: si tu bouges sur la même map, les valeurs get_x() et y() changent ?

 

Lien vers le commentaire
Partager sur d’autres sites

  • 0

oui , ce sont les valeurs réel , j'utilise toujours cette méthode

Dans ma table j'obtiens les bonne coordonnées , de plus sur ton code si j'enleve le pc.warp et que je remplace par un say("test")  je n'obtiens aucun resultat  :( le say("test") ne s'affiche pas

 

EDIT: en gros

le pc.get_local_x() correspond au code IG /go x y te permet de te déplacer du a au point b sur la carte

mais si tu fait pc.getx()*100 alors IG te donnerai /warp 111100 111100 te permet de te déplacer de carte en carte

 

Modifié par Jinzo
Lien vers le commentaire
Partager sur d’autres sites

  • 0
  • Retraité

Ah ! 

Met tes syserr de la map sur lequel tu utilises la quête, il devrait afficher quelque chose si le tableau renvoyé par le mysql_query() est bien rempli !

 

Il t'affiche ceci ?

syschat("Il y a un problème avec les coordonnées.") 

 

Lien vers le commentaire
Partager sur d’autres sites

  • 0

Non je n'ai pas le syschat non plus

 

Mais j'ai une erreur dans le channel 1

 

SYSERR: Sep 17 16:43:31 :: RunState: LUA_ERROR: [string "marqueur"]:93: bad argument #1 to `getn' (table expected, got nil)
SYSERR: Sep 17 16:43:31 :: WriteRunningStateToSyserr: LUA_ERROR: quest marqueur.start click

 

Lien vers le commentaire
Partager sur d’autres sites

  • 0

oui j'ai les 5 choix + annuler

Hidden Content

    Give reaction to this post to see the hidden content.

 

lorsque je clique sur "annuler" j'obtiens également la même erreur :

SYSERR: Sep 17 17:01:02 :: RunState: LUA_ERROR: [string "marqueur"]:93: bad argument #1 to `getn' (table expected, got nil)
SYSERR: Sep 17 17:01:02 :: WriteRunningStateToSyserr: LUA_ERROR: quest marqueur.start click

 

Modifié par Funky Emulation
Core X - External 2 Internal
Lien vers le commentaire
Partager sur d’autres sites

  • 0

Voici la quete en question , elle n'est encore qu'une ébauche et les choix ne sont pas tous accessible :

Vous constaterez que "marqueur" n'ai que le nom de la quete et non une chaine =)

Ce n'est qu'une répétition de local .

quest marqueur begin
	state start begin
		when 9005.click begin
			say("Bonjour "..pc.get_name()..".")
			say("")
			local name = pc.get_name()
			local local_x = mysql_query("SELECT teleportation.local_x FROM player.teleportation WHERE teleportation.name='"..name.."';")
			local local_y = mysql_query("SELECT teleportation.local_y FROM player.teleportation WHERE teleportation.name='"..name.."';")
			local nom = mysql_query("SELECT teleportation.nom FROM player.teleportation WHERE teleportation.name='"..name.."';")
			local s = select("Marquer ce point","Teleportation","Supprimer un point","Fermer","raz")
			if s == 1 then
				if pc.getqf("marqueur_vierge") == 0 then
					local marque1_x = pc.getx()*100
					local marque1_y = pc.gety()*100
					say_title("Mes marqueurs")
					say("")
					say("Nommez votre marqueur")
					say("")
					local nomme = input()
					if nomme == "" then
						say("Vous devez nommer votre marqueur")
					else
						local marquage = mysql_query("INSERT INTO player.teleportation (name, nom, local_x, local_y) VALUES ('"..name.."', '"..nomme.."', '"..marque1_x.."', '"..marque1_y.."');")
						pc.setqf("marqueur", 2)
						pc.setqf("marqueur_vierge", 1)
					end
				elseif pc.getqf("marqueur_vierge") == 1 then
					if pc.getqf("marqueur") == 1 then
						local marque1_x = pc.getx()*100
						local marque1_y = pc.gety()*100
						say_title("Mes marqueurs")
						say("")
						say("Nommez votre marqueur")
						say("")
						local nomme = input()
						if nomme == "" then
							say("Vous devez nommer votre marqueur")
						else
							local marquage = mysql_query("INSERT INTO player.teleportation (name, nom, local_x, local_y) VALUES ('"..name.."', '"..nomme.."', '"..marque1_x.."', '"..marque1_y.."');")
							pc.setqf("marqueur", 2)
						end
					elseif pc.getqf("marqueur") == 2 then
						local marque2_x = pc.getx()*100
						local marque2_y = pc.gety()*100
						say_title("Mes marqueurs")
						say("")
						say("Nommez votre marqueur")
						say("")
						local nomme = input()
						if nomme == "" then
							say("Vous devez nommer votre marqueur")
						else
							local marquage = mysql_query("INSERT INTO player.teleportation (name, nom, local_x, local_y) VALUES ('"..name.."', '"..nomme.."', '"..marque2_x.."', '"..marque2_y.."');")
							pc.setqf("marqueur", 3)
						end
					elseif pc.getqf("marqueur") == 3 then
						local marque3_x = pc.getx()*100
						local marque3_y = pc.gety()*100
						say_title("Mes marqueurs")
						say("")
						say("Nommez votre marqueur")
						say("")
						local nomme = input()
						if nomme == "" then
							say("Vous devez nommer votre marqueur")
						else
							local marquage = mysql_query("INSERT INTO player.teleportation (name, nom, local_x, local_y) VALUES ('"..name.."', '"..nomme.."', '"..marque3_x.."', '"..marque3_y.."');")
							pc.setqf("marqueur", 4)
						end
					elseif pc.getqf("marqueur") == 4 then
						local marque4_x = pc.getx()*100
						local marque4_y = pc.gety()*100
						say_title("Mes marqueurs")
						say("")
						say("Nommez votre marqueur")
						say("")
						local nomme = input()
						if nomme == "" then
							say("Vous devez nommer votre marqueur")
						else
							local marquage = mysql_query("INSERT INTO player.teleportation (name, nom, local_x, local_y) VALUES ('"..name.."', '"..nomme.."', '"..marque4_x.."', '"..marque4_y.."');")
							pc.setqf("marqueur", 5)
						end
					elseif pc.getqf("marqueur") == 5 then
						
						local marque5_x = pc.getx()*100
						local marque5_y = pc.gety()*100
						say_title("Mes marqueurs")
						say("")
						say("Nommez votre marqueur")
						say("")
						local nomme = input()
						if nomme == "" then
							say("Vous devez nommer votre marqueur")
						else
							local marquage = mysql_query("INSERT INTO player.teleportation (name, nom, local_x, local_y) VALUES ('"..name.."', '"..nomme.."', '"..marque5_x.."', '"..marque5_y.."');")
							pc.setqf("marqueur", 6)
						end
					elseif pc.getqf("marqueur") == 6 then
						say("Vos marqueurs sont tous utilisés.")
						say("Voulez vous en modifier un ? ")
						say("")
						local p = select("modifier un marquer","Ne rien faire")
						if p == 1 then
							say_title("Selectionnez un marqueur.")
							say("")
						end
					end
				end
			elseif s == 2 then
				say_title("Ou veux tu te rendre "..pc.get_name().." ? ")
				say("")
				local req = mysql_query("SELECT * FROM player.teleportation WHERE teleportation.name='"..name.."'")
				local menu_list = {}
				if req ~= nil then
					for i=1,table.getn(req) do
						menu_list[i] = req[i][2]
					end
					table.insert(menu_list, "Annuler")
					local s = select_table(menu_list)
					if s == table.getn(lieux_list) then
						return
					end
					if req[s][3] ~= nil and req[s][4] ~= nil then
						pc.warp(req[s][3],req[s][4])
						say("oups")
					else
						syschat("Il y a un problème avec les coordonnées.")
						return
					end
				else
					syschat("Vous n'avez aucun lieu d'enregistré.")
					return
				end
			elseif s == 3 then
				say("En attente")
			elseif s == 4 then
				say("Au revoir ! "..name.."")
			elseif s == 5 then
				pc.setqf("marqueur", 0)
				pc.setqf("marqueur_vierge", 0)
			end
			set_state(start)
		end
	end
end

J'ai mis la quete sur un pnj pour le moment , apres ce sera une lettre ... d'ou le set_state(start) a la fin .

Le choix "raz" me permet de remlettre les pc.setqf() a ZERO

 

Je suis conscient qu'avec un while ..... do je n'aurai pas autant de lignes =)

 

Merci a vous , de vous penchez sur ce soucis.

Modifié par Jinzo
Lien vers le commentaire
Partager sur d’autres sites

  • 0
il y a 5 minutes, _Sufhal a dit :

Ouais antok, il a pris les deux codes où j'ai appelé le tableau différemment xD 

Je l'avait devant les yeux pourtant ....

 

Merci a vous 2 , la quête est a présent fonctionnelle ...

 

Mille merci les points vont fuser =)

Lien vers le commentaire
Partager sur d’autres sites

Invité
Ce sujet ne peut plus recevoir de nouvelles réponses.


  • brilliantdiscord_widget
  • Flux d'Activité

    1. 37
    2. 21

      Metin2 en 2020 peut-on en parler?

    3. 0

      METIN2Project

    4. 3

      Ressources - UnPack - Metin2 Client - Officiel

    5. 0

      Barre des tâches d'argent étendue

    6. 16

      Redémarrage automatique des channels

    7. 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.