Jump to content
×
×
  • Create New...
  • 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.

Link to comment
  • Answers 20
  • Created
  • Last Reply

Top Posters For This Question

Top Posters For This Question

Posted Images

20 answers to this question

Recommended Posts

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

Link to comment
  • 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.

Link to comment
  • 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())
 

Memento mei.

Link to comment
Guest
This topic is now closed to further replies.


  • Flux d'Activité

    1. 38

      Rodnia.net | PVM | International | The Great Conqueror |

    2. 0

      [JAVA] Starloco

    3. 0

      Recherche CMS arkalys 2021

    4. 0

      AresiaCMS

    5. 62

      [CMS] Acamar Cms

    6. 3

      Éditeur Item 2.43 à 2.53

  • Recently Browsing

    • No registered users viewing this page.

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.