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

attempt to index a nil value


thomasx3

Question

Bonjour, Bonsoir,

 

Je possede des files 2016 modifié en dedié.
Recemment, j'ai voulu installer le Anyshop(Item-Shop In game)
Cependant, j'ai cette erreur :

SYSERR: Sep  3 04:49:51 :: RunState: LUA_ERROR: locale/france/quest/questlib.lua:2680: attempt to index a nil value
SYSERR: Sep  3 04:49:51 :: WriteRunningStateToSyserr: LUA_ERROR: quest AnyShop.start click

Voici la fonction de la ligne 2680 :

 

mysql_query = function(query)
    if not pre then
        local rt = io.open('CONFIG','r'):read('*all')
        pre,_= string.gsub(rt,'.+PLAYER_SQL:%s(%S+)%s(%S+)%s(%S+)%s(%S+).+','-h%1 -u%2 -p%3 -D%4')
    end
    math.randomseed(os.time())
    local fi,t,out = 'mysql_data_'..math.random(10^9)+math.random(2^4,2^10),{},{}
    --os.execute('mysql '..pre..' --e='..string.format('%q',query)..' > '..fi) -- f? MySQL51
    os.execute('mysql '..pre..' -e'..string.format('%q',query)..' > '..fi) -- f? MySQL55
    for av in io.open(fi,'r'):lines() do table.insert(t,split(av,'\t')) end; os.remove(fi);  <---------Celle ci la 2680
    for i = 2, table.getn(t) do table.foreach(t[i],function(a,b)
        out[i-1]               = out[i-1] or {}
        out[i-1][a]            = tonumber(b) or b or 'NULL'
        out[t[1][a]]           = out[t[1][a]] or {}
        out[t[1][a]][i-1]      = tonumber(b) or b or 'NULL'
    end) end
    return out
end

 

Et maintenant la quête :

 

-- Quest File written by Kilroy.
-- Quest File written by Kilroy.
-- Function: AnyShop Lua/Python/Sql
-- Questpart: 1/1
quest AnyShop begin
	state start begin
		when login begin
			cmdchat(string.format("AnyShop index/%d", q.getcurrentquestindex()))
		end
		when button begin
			cmdchat("getinputbegin")
			local INPUT = AnyShop.stringSplit(input(cmdchat("AnyShop input/")), "/")
			cmdchat("getinputend")
			if INPUT[1]=="open" then
				if not AnyShop.AntiFlood_(1, 3) then return end

				local stringTable, tableItems = {}, mysql_direct_query("SELECT shopitems.vnum, shops.shop_id, categories.name as category, shopitems.preis, shopitems.rabatt, IFNULL(TIMESTAMPDIFF(second, NOW(), shopitems.angebot),0) as seconds, shops.suffix, categories.cat_id FROM anyshop.shopitems JOIN anyshop.shops ON shops.shop_id = shopitems.shop_id JOIN anyshop.categories ON categories.cat_id = shopitems.cat_id ORDER BY verkauft DESC;")
				if (tableItems==nil or tableItems[1]==nil) then syschat("Erreur. Configuration incorrecte dans la table 1") return end
				local tableCount = table.getn(tableItems)
				cmdchat("AnyShop ClearBoard/")


				local moneyQuery, cashs = "", mysql_direct_query("SELECT coin_column, suffix, name, shop_id FROM anyshop.shops;")
				if (cashs==nil or cashs[1]==nil) then syschat("Erreur. Configuration incorrecte dans la table 2") return end 
				for i=1, table.getn(cashs), 1 do moneyQuery = moneyQuery..(i==1 and "" or ",")..cashs[i][1] end
				local money = mysql_direct_query("SELECT "..moneyQuery.." FROM account.account WHERE id = "..pc.get_account_id()..";")
				if (money==nil or money[1]==nil) then syschat("Erreur. Configuration incorrecte dans la table 3") return end 
				local moneyCMD = "AnyShop config/"
				for i=1, table.getn(money[1]), 1 do moneyCMD = moneyCMD..(i==1 and "" or "|")..money[1][i]..","..cashs[i][2]..","..cashs[i][3]..","..cashs[i][4] end
				cmdchat(moneyCMD)
				item.select_cell(204)
				money = item.get_socket(0)
				cmdchat("AnyShop setmoney/3/"..money)


				if tableCount==0 then return end
				for i=1, tableCount, 1 do table.insert(stringTable, string.format("%d,%d,%s,%d,%d,%d,%s,%d", unpack(tableItems[i]))) end
				local AddToListCMD = "AnyShop AddToList/"..stringTable[1]
				for i=2, tableCount, 1 do
					if string.len(AddToListCMD)+string.len(stringTable[i])>=490 then
						cmdchat(AddToListCMD)
						AddToListCMD = "AnyShop AddToList/"..stringTable[i]
					else
						AddToListCMD = AddToListCMD.."|"..stringTable[i]
					end
					if i==tableCount then
						cmdchat(AddToListCMD)
						break
					end
				end
				cmdchat("AnyShop FinishSending/")

			elseif INPUT[1]=="buy" then
				if not AnyShop.AntiFlood_(2, 3) then return end

				local itemVnum = tonumber(INPUT[2])
				local itemCount = tonumber(INPUT[3])
				local shopId = tonumber(INPUT[4])
				
				if (itemVnum==nil or itemVnum<10) or (itemCount==nil or itemCount<1) then return end

				local choosenItem = mysql_direct_query("SELECT shopitems.vnum, shopitems.preis, shopitems.rabatt, IFNULL(TIMESTAMPDIFF(second, NOW(), shopitems.angebot),0) as seconds, shops.coin_column, shops.suffix, shops.shop_id FROM anyshop.shopitems JOIN anyshop.shops ON shops.shop_id = shopitems.shop_id WHERE shopitems.vnum="..itemVnum.." and shopitems.shop_id="..shopId..";")
				if (choosenItem[1]~=nil or table.getn(choosenItem[1]))==0 then syschat("L'article n'est plus disponible !") return end
				local sqlVnum, itemPrice, itemRabatt, itemAngebotSek, cash, Suffix, sqlShopId = tonumber(choosenItem[1][1]),tonumber(choosenItem[1][2]),tonumber(choosenItem[1][3]),tonumber(choosenItem[1][4]),choosenItem[1][5],choosenItem[1][6],tonumber(choosenItem[1][7])
				if (sqlVnum~=itemVnum) or (sqlShopId~=shopId) then return end

				itemPrice = itemPrice * itemCount
				if (itemAngebotSek>=0 and itemRabatt>0) then
					itemPrice = itemPrice-math.floor(itemPrice*(itemRabatt/100))
				end
				
				if shopId == 1 then
					local money = mysql_direct_query("SELECT cash FROM account.account WHERE id = "..pc.get_account_id()..";")[1][1]
					if money < itemPrice then 
						syschat("<Shop> Vous n'avez pas assez de "..Suffix.." pour cette article !") 
						cmdchat("AnyShop setmoney/"..shopId.."/"..money)
						return 
					end

					mysql_direct_query("UPDATE account.account, anyshop.shopitems SET account.cash = account.cash-"..itemPrice..", shopitems.verkauft = shopitems.verkauft+1 WHERE account.id = "..pc.get_account_id().." AND (shopitems.vnum="..itemVnum.." AND shopitems.shop_id="..shopId..") ;")
					money = mysql_direct_query("SELECT cash FROM account.account WHERE id = "..pc.get_account_id()..";")[1][1]
					cmdchat("AnyShop setmoney/"..shopId.."/"..money)
				--	mysql_direct_query("INSERT INTO anyshop.islog (pseudo, id_compte, id_item, prix_item, quantite) VALUES('"..pc.get_name().."', '"..pc.get_account_id().."', '"..itemVnum.."', '"..itemPrice.."', '"..itemCount.."') ;")
					if itemVnum != 80014 and itemVnum != 80015 and itemVnum != 80016 then
						mysql_direct_query("UPDATE account.account SET account.mileage = account.mileage+"..itemPrice.." WHERE account.id = "..pc.get_account_id()..";")
						money2 = mysql_direct_query("SELECT mileage FROM account.account WHERE id = "..pc.get_account_id()..";")[1][1]
						local shopId2 = 2
						cmdchat("AnyShop setmoney/"..shopId2.."/"..money2)
					end

					pc.give_item2_select(itemVnum, 1)
					itemCount = itemCount - 1
					if item.has_flag(4) and itemCount>0 then
						for i=1, math.floor(itemCount/200), 1 do
							pc.give_item2(itemVnum, 200)
						end
						pc.give_item2(itemVnum, (itemCount - math.floor(itemCount/200)*200))
					else
						for i=1, itemCount, 1 do pc.give_item2(itemVnum) end
					end
				end
				if shopId == 2 then
					local money = mysql_direct_query("SELECT mileage FROM account.account WHERE id = "..pc.get_account_id()..";")[1][1]
					if money < itemPrice then 
						syschat("<Shop> Vous n'avez pas assez de "..Suffix.." pour cette article !") 
						cmdchat("AnyShop setmoney/"..shopId.."/"..money)
						return 
					end

					mysql_direct_query("UPDATE account.account, anyshop.shopitems SET account.mileage = account.mileage-"..itemPrice..", shopitems.verkauft = shopitems.verkauft+1 WHERE account.id = "..pc.get_account_id().." AND (shopitems.vnum="..itemVnum.." AND shopitems.shop_id="..shopId..") ;")
					money = mysql_direct_query("SELECT mileage FROM account.account WHERE id = "..pc.get_account_id()..";")[1][1]
					cmdchat("AnyShop setmoney/"..shopId.."/"..money)
					mysql_direct_query("INSERT INTO anyshop.islog (pseudo, id_compte, id_item, prix_item, quantite) VALUES('"..pc.get_name().."', '"..pc.get_account_id().."', '"..itemVnum.."', '"..itemPrice.."', '"..itemCount.."') ;")

					pc.give_item2_select(itemVnum, 1)
					itemCount = itemCount - 1
					if item.has_flag(4) and itemCount>0 then
						for i=1, math.floor(itemCount/200), 1 do
							pc.give_item2(itemVnum, 200)
						end
						pc.give_item2(itemVnum, (itemCount - math.floor(itemCount/200)*200))
					else
						for i=1, itemCount, 1 do pc.give_item2(itemVnum) end
					end
				end
				if shopId == 3 then
					item.select_cell(204)	
					local money = item.get_socket(0)
					if money < itemPrice then 
						syschat("<Shop> Vous n'avez pas assez de "..Suffix.." pour cette article !") 
						cmdchat("AnyShop setmoney/"..shopId.."/"..money)
						return 
					end

					item.set_socket(0, (item.get_socket(0)-itemPrice))	
					money = item.get_socket(0)
					cmdchat("AnyShop setmoney/"..shopId.."/"..money)
					mysql_direct_query("INSERT INTO anyshop.islog (pseudo, id_compte, id_item, prix_item, quantite) VALUES('"..pc.get_name().."', '"..pc.get_account_id().."', '"..itemVnum.."', '"..itemPrice.."', '"..itemCount.."') ;")

					pc.give_item2_select(itemVnum, 1)
					itemCount = itemCount - 1
					if item.has_flag(4) and itemCount>0 then
						for i=1, math.floor(itemCount/200), 1 do
							pc.give_item2(itemVnum, 200)
						end
						pc.give_item2(itemVnum, (itemCount - math.floor(itemCount/200)*200))
					else
						for i=1, itemCount, 1 do pc.give_item2(itemVnum) end
					end
				end
			end
		end
		function stringSplit(str, sep)
			local sep, fields = sep or ",", {}
			local pattern = string.format("([^%s]+)", sep)
			string.gsub(str, pattern, function(c) table.insert(fields, c) end)
			return fields
		end
		function AntiFlood_(n, t)
			if pc.getqf("AntiFlood"..n)>get_time() then
				syschat(string.format("Veuillez patientez %d seconde avant de pouvoir effectuer un autre achat.", pc.getqf("AntiFlood"..n)-get_time()))
				return false
			end
			pc.setqf("AntiFlood"..n, get_time()+t)
			return true
		end
	end
end

 

J'ai cherché mainte et mainte fois, toujours sans succé.
Merci pour votre aide ! :)

Memento mei.

Lien vers le commentaire
Partager sur d’autres sites

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

Meilleurs contributeurs dans cette question

Jours populaires

Meilleurs contributeurs dans cette question

Images postées

20 réponses à cette question

Messages recommandés

  • 0

Lors de l'execution de cette  requete, j'obtiens un empty set,

 

SELECT shopitems.vnum, shops.shop_id, categories.name as category, shopitems.preis, shopitems.rabatt, IFNULL(TIMESTAMPDIFF(second, NOW(), shopitems.angebot),0) as seconds, shops.suffix, categories.cat_id FROM anyshop.shopitems JOIN anyshop.shops ON shops.shop_id = shopitems.shop_id JOIN anyshop.categories ON categories.cat_id = shopitems.cat_id ORDER BY verkauft DESC;

 

 

 

Or les tables sont bel et bien remplie !

Memento mei.

Lien vers le commentaire
Partager sur d’autres sites

  • 0
  • Administrateur

Au niveau des requêtes SQL, me semblait que JOIN seul ne fonctionnait pas si je regarde ce site, INNER JOIN, LEFT JOIN etc...

https://www.w3schools.com/sql/sql_join.asp

 

Sinon envoi moi tes bdd d'anyshop que je teste localement avec la query

Lien vers le commentaire
Partager sur d’autres sites

  • 0
  • Administrateur

Effectivement, 0 résultat.

Après analyse il s'avère qu'il y a des incohérences.

 

Dans shops, tu as shop_id = 2 et dans shoptitems tu déclares 1, qui doit être 2. Dans le cas ou tu n'as qu'une seule catégorie qui porte l'id 2... Donc le résultat de la requête était bonne mais le contenu des tables incorrect.

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.