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

Quête


bd59140

Question

Bonjour cher funk's,

 

Je viens vers vous car j'ai un souci avec une quête (Plutôt 2 en fait).

 

Version des fichiers/ Type d'émulateur : 2016 de Seajin

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

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

 

Description du problème :

Voilà en fait je veux faire en sorte que mon item donne un bonus pour 1h et qu'il soit cumulable.

La fonction mise est la suivante :  affect.add_collect_point(apply.MOV_SPEED, 10, 60*60*1)

 

Comment reproduire le problème ? : ///

Recherches et tests effectués : bonne question.

 

Screenshot du problème concerné :

La quête en question :

 

191150quest.PNG

 

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

Lien vers le commentaire
Partager sur d’autres sites

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

Meilleurs contributeurs dans cette question

Meilleurs contributeurs dans cette question

Messages recommandés

  • 0

oui kameyu,

J'ai essayer de chercher sur google si quelqu'un aurais eu un soucis similaire mes non !!

Et oui test plusieurs fonction affect.add pour voir si ce cumuler mes nada !

 

du coup je cherche encore!

Ou si quelqu'un a la solution je le remercie d'avance!!

Lien vers le commentaire
Partager sur d’autres sites

  • 0
local name = pc.get_name()
local recupere_id = mysql_query("SELECT * FROM player.player WHERE player.name='"..name.."'")
local id = recupere_id[1][1]
local select_table_affect = mysql_query("SELECT * FROM player.affect WHERE player.dwPID='"..id.."'")
local bonus = select_table_affect[1][6]
local ajout_temps = 60*60*1 -- ou 3600 étant le calcul de 60 sec * 60 min * 1h 
local cumul_temps = bonus+ajout_temps
local maj = mysql_query("UPDATE player.affect SET IDuration='"..cumul_temps.."' WHERE bTYpe='le code de ton bonus' AND bApplyOn='vnum de ton bunus ")

 

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

  • 0
  • Développeur
il y a 1 minute, Jinzo a dit :

local name = pc.get_name()
local recupere_id = mysql_query("SELECT * FROM player.player WHERE player.name='"..name.."'")
local id = recupere_id[1][1]
local select_table_affect = mysql_query("SELECT * FROM player.affect WHERE player.dwPID='"..id.."'")
local bonus = select_table_affect[1][6]
local ajout_temps = 60*60*1
local cumul_temps = bonus+ajout_temps
local maj = local maj_bonus = mysql_query("UPDATE player.affect SET IDuration='"..cumul_temps.."' WHERE bTYpe='le code de ton bonus' AND bApplyOn='vnum de ton bunus ")

 

 

OULA, NON. Jamais faire ça. C'est presque une insulte.

 

Fais plutôt ce qui suit.

Dans les sources, fichier questlua_affect, à la fonction affect_add(lua_State *L) supprime ou commente ces deux lignes:

if (ch->FindAffect(AFFECT_QUEST_START_IDX, applyOn))
	return 0;

Ensuite utilise affect.add plutôt que affect.add_collect(_point).

La fonction add_collect est faite, à la base, pour les quêtes du biologiste. D'où le nom collect, les quêtes biologiste s'appellent collect_quest_lvX.quest

Lien vers le commentaire
Partager sur d’autres sites

  • 0
il y a 2 minutes, Kameyu a dit :

 

OULA, NON. Jamais faire ça. C'est presque une insulte.

 

Fais plutôt ce qui suit.

Dans les sources, fichier questlua_affect, à la fonction affect_add(lua_State *L) supprime ou commente ces deux lignes:


if (ch->FindAffect(AFFECT_QUEST_START_IDX, applyOn))
	return 0;

Ensuite utilise affect.add plutôt que affect.add_collect(_point).

La fonction add_collect est faite, à la base, pour les quêtes du biologiste. D'où le nom collect, les quêtes biologiste s'appellent collect_quest_lvX.quest

c'est vexant , une façon peut orthodoxe je te l'accorde cependant cela fonctionne trés bien , je n'ai jamais rencontrer de soucis via ce script ( qui a été modifier , j'ai mal copier coller ) .

Néanmoins , ta solution est bien plus propre 😃

Lien vers le commentaire
Partager sur d’autres sites

  • 0
  • Développeur

C'est certes vexant mais au moins tu sais que c'est une grave erreur.

À ce que je vois tu utilises le mysql_query de Mijago, qui est une véritable horreur en termes de performance.

Ce mysql_query qu'a fait Mijago c'est un script qui ouvre une connexion à partir du mot de passe défini dans ton db/conf.txt

Déjà en terme de sécurité c'est pas bien malin. Ensuite, ce que le script fait pour une seule requête c'est, dans l'ordre:

  1. Ouvre le fichier conf.txt
  2. Lit son contenu pour récupérer le mot de passe
  3. Trie les données pour tirer uniquement le mot de passe
  4. Ferme le fichier conf.txt
  5. Utilise le client mysql du serveur avec le mot de passe récupéré
  6. Exécute la query, puis ferme le client mysql

Imagine si tu fais 3 queries d'affilée, la joie que c'est en terme de perf...

 

Edit: de plus, pour appliquer les bonus une fois changés avec ta méthode, il faut se reconnecter à chaque changement.

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

  • 0
quest carte1 begin
	state start begin
		when 30342.use begin
			say_title("Carte Noir")
			say("Bonjour jeune Cannabien, ")
			say("Je vois que tu es en possessiond'une")
			say("carte noir !!! ")
			say("Elle te donne 10% de vitesse de déplacement! ")
			say("Veut tu l'utiliser ?")
			local s = select("Oui","Non")
			if s == 1 then
				if pc.getqf("carte_noir") == 0 then
					affect.add_collect(apply.mov, 10, 60*60*1)
					pc.remove_item(30342, 1)
					pc.setqf("carte_noir", 1)
				elseif pc.getqf("carte_noir") == 1 then
					local name = pc.get_name()
					local id = pc.get_player_id()
					local select_table_affect = mysql_query("SELECT * FROM player.affect WHERE player.dwPID='"..id.."'")
					local bonus = select_table_affect[1][6]
					local ajout_temps = 60*60*1
					local cumul_temps = bonus+ajout_temps
					local maj = mysql_query("UPDATE player.affect SET IDuration='"..cumul_temps.."' WHERE bTYpe='le code de ton bonus' AND bApplyOn='vnum de ton bonus ")
				end
			elseif s == 2 then
				return
			end
		end
	end
end

Ne fonctionnera que si le "pc.getqf("carte_noir") == 1"

Lien vers le commentaire
Partager sur d’autres sites

  • 0

non il ne prendra qu'une carte , la fonction elle même ne fonctionnera pas si la quete n'as pas été lancer une fois déjà !

la première fois tu affect le bonus la deuxième fois tu update le bonus.

 

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

  • 0

pense a modifier la quête avec tes informations relative a l'id et au vnum de ton bonus::

local maj = mysql_query("UPDATE player.affect SET IDuration='"..cumul_temps.."' WHERE bTYpe='le code de ton bonus' AND bApplyOn='vnum de ton bonus' ")

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

  • 0
quest carte1 begin
	state start begin
		when 30342.use begin
			say_title("Carte Noir")
			say("Bonjour jeune Cannabien, ")
			say("Je vois que tu es en possession d'une")
			say("carte noir !!! ")
			say("Elle te donne 10% de vitesse de déplacement! ")
			say("Veut tu l'utiliser ?")
			local s = select("Oui","Non")
			if s == 1 then
				if pc.getqf("carte_noir") == 0 then
					affect.add_collect(apply.mov, 10, 60*60*1)
					pc.remove_item(30342, 1)
					pc.setqf("carte_noir", 1)
				elseif pc.getqf("carte_noir") == 1 then
					local id = pc.get_player_id()
					local select_table_affect = mysql_query("SELECT * FROM player.affect WHERE affect.dwPID='"..id.."'")
					local bonus = select_table_affect[1][6]
					local ajout_temps = 60*60*1
					local cumul_temps = bonus+ajout_temps
					local maj = mysql_query("UPDATE player.affect SET IDuration='"..cumul_temps.."' WHERE bType='1000' AND bApplyOn='19' ")
				end
			elseif s == 2 then
				return
			end
		end
	end
end

 

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

  • 0
quest carte1 begin
	state start begin
		when 30342.use begin
			say_title("Carte Noir")
			say("Bonjour jeune Cannabien, ")
			say("Je vois que tu es en possession d'une")
			say("carte noir !!! ")
			say("Elle te donne 10% de vitesse de déplacement! ")
			say("Veut tu l'utiliser ?")
			local s = select("Oui","Non")
			if s == 1 then
				if pc.getqf("carte_noir") == 0 then
					affect.add_collect(apply.mov, 10, 60*60*1)
					pc.remove_item(30342, 1)
					pc.setqf("carte_noir", 1)
				elseif pc.getqf("carte_noir") == 1 then
					local id = pc.get_player_id()
					local select_table_affect = mysql_query("SELECT * FROM player.affect WHERE affect.dwPID='"..id.."'")
					local bonus = select_table_affect[1][6]
					local ajout_temps = 60*60*1
					local cumul_temps = bonus+ajout_temps
					local maj = mysql_query("UPDATE player.affect SET lDuration='"..cumul_temps.."' WHERE bType='1000' AND bApplyOn='19' ")
					pc.remove_item(30342, 1)
  				end
			elseif s == 2 then
				return
			end
		end
	end
end

C'est un L minuscule "l" et non un "i" majuscule I , c'est rectifier.

Par contre il ce peut que le bonus ne soit pas afficher directement , le temps que le serveur actualise la base de données.

J'ai ajouté pc.remove_item(30342, 1) je ne l'avait pas mis sur l'UPDATE

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

  • 0

normal qu'il ne s'ajoute pas , de plus j'ai modifier juste au dessus pour l'item , je te remet la quête ici en EDIT

quest carte1 begin
	state start begin
		when 30342.use begin
			say_title("Carte Noir")
			say("Bonjour jeune Cannabien, ")
			say("Je vois que tu es en possession d'une")
			say("carte noir !!! ")
			say("Elle te donne 10% de vitesse de déplacement! ")
			say("Veut tu l'utiliser ?")
			local s = select("Oui","Non")
			if s == 1 then
				if pc.getqf("carte_noir") == 0 then
					affect.add_collect(apply.mov, 10, 60*60*1)
					pc.remove_item(30342, 1)
					pc.setqf("carte_noir", 1)
				elseif pc.getqf("carte_noir") == 1 then
					local id = pc.get_player_id()
					local select_table_affect = mysql_query("SELECT * FROM player.affect WHERE affect.dwPID='"..id.."'")
					local bonus = select_table_affect[1][6]
					local ajout_temps = 3600
					local cumul_temps = bonus+ajout_temps
					local maj = mysql_query("UPDATE player.affect SET lDuration='"..cumul_temps.."' WHERE bType='1000' AND bApplyOn='19' ")
					pc.remove_item(30342, 1)
    					say("Si la fonction marche tu dois voir ceci")
  				end
			elseif s == 2 then
				return
			end
		end
	end
end

Tu dois surement attendre que le serveur actualise le bonus .

Tu as supprimé le bonus dans la table affect ?

 

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

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


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.