Vous devez être connecté et donner une réaction ( Like ) au sujet pour débloquer les liens de téléchargements...
  • 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 ! :)

Share this post


Link to post
Share on other sites

20 answers to this question

Recommended Posts

  • 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 ?

Edited by _Sufhal

Share this post


Link to post
Share on other 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.
 

Share this post


Link to post
Share on other 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 ?

Share this post


Link to post
Share on other 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 !

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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())
 

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.