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
thomasx3

en cours attempt to index a nil value

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 ! :)

Partager ce message


Lien à poster
Partager sur d’autres sites

20 réponses à cette question

Messages recommandés

  • 0

Le problème vient du fait que la fonction mysql_query ne retourne rien, est-ce que la table shops existe et si c'est le cas, est-elle remplie ?

Modifié par _Sufhal

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Salut et courage tout problème a sa solution !!

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Bonjour, 
Merci pour votre réponses, oui la table shops existe bien et elle est remplie !

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Tu es bien en mysql 5.6 ?

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Oui !

Voici ce que j'obtien lors d'un mysql -V :
Server version: 5.5.60-log Source distribution

 

Merci pour vos réponses.
 

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Juste une question conne hein, si tu fais les querys directement par Navicat, MySQL te renvoie quoi ?

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

L'environnement à l'air bon, je pense donc que c'est les requêtes qui posent problème.. tu as touché quelque chose à la quête d'origine ?

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 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 !

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

1) Cette requête te renvoi 0 résultat ?

2) Tu es censé avoir combien d'item dans ton itemshop in-game ?

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Exactement, lors de l'application sur putty, elle renvoie un empty set.
Jepossede actuellement 3item dans celui ci.
Merci

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Peux-tu me montre toutes les tables en relation avec ton AnyShop ?

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

1536000403-screenshot-1.png

Modifié par thomasx3

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

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

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

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.

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Même aprés modification, j'obtien une nouvelle erreur : 

 

 RunState: LUA_ERROR: locale/france/quest/questlib.lua:2676: attempt to index a nil value

 

La ligne  2676 correspond a celle ci ! 

   math.randomseed(os.time())
 

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

En tout cas, en passant shop_id de 1 à 2 dans shopitems la requête est bonne. Qu'as tu ligne 2676 ?

 

image.png

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

1536004233-screenshot-3.png

Partager ce message


Lien à poster
Partager sur d’autres sites
  • 0

Hum là, ça sort de mon domaine xD

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.