GTA Közösség - A magyar GTA fórum

Multi Theft Auto (MTA) => MTA: Szerverfejlesztés => Segítségkérés => A témát indította: thegergo02 - 2017. Április 17. - 15:31:24

Cím: Kocsik lekérése
Írta: thegergo02 - 2017. Április 17. - 15:31:24
Sziasztok!
 
A hiba ez lenne: ERROR: ... \'for\' limit must be a number
 
Pedig elvileg egy számot kéne visszakapjak.
 
A kód :


function loadVehs()
    vehIDs = exports.mysql:_QuerySingle(\"SELECT MAX(id) FROM vehicles\")
    for i=0,vehIDs,1
    do
            vehInf = exports.mysql:_QuerySingle(\"select * from vehicles where id = ?\",i)
            veh = createVehicle(vehInf.vehid,vehInf.x,vehInf.y,vehInf.z,0,0,0,vehInf.backplate)
            setVehicleColor(veh,vehInf.r1,vehInf.g1,vehInf.b1,vehInf.r2,vehInf.g2,vehInf.b2,vehInf.r3,vehInf.g3,vehInf.b3,vehInf.r4,vehInf.g4,vehInf.b4)
    end    
    outputDebugString(vehIDs)
    outputDebugString(tostring(vehIDs))
end
addEventHandler(\"onResourceStart\",resourceRoot,loadVehs)
Cím: Kocsik lekérése
Írta: AlexSwamp - 2017. Április 17. - 22:21:27
Próbáld debugoltatni a for nélkül. Ha számot kapsz vissza akkor tonumber pl.
Cím: Kocsik lekérése
Írta: thegergo02 - 2017. Április 17. - 22:55:37
Már probáltam de valami ilyesmit kaptaM : table : szamsorozat (Mármint valamennyi szám, de nem az ami kell) //telo
Cím: Kocsik lekérése
Írta: id100 - 2017. Április 18. - 15:21:13
Az egy element.
 
E: MOST néztem hogy for limitnek kell,
 
akkor abban az esetben #-et írd a tábla elé és egy számot kapsz :D Az lesz az összes elem számosítva.
 
Tehát
 

for i=0,vehIDs,1

 
De #vehIDs kellene oda :)
Cím: Kocsik lekérése
Írta: thegergo02 - 2017. Április 18. - 17:38:50
function loadVehs()
    vehIDs = exports.mysql:_QuerySingle(\"SELECT MAX(id) FROM vehicles\")
    for i=0,#vehIDs,1
    do
            vehInf = exports.mysql:_QuerySingle(\"select * from vehicles where id = ?\",i)
            veh = createVehicle(vehInf.vehid,vehInf.x,vehInf.y,vehInf.z,0,0,0,vehInf.backplate)
            setVehicleColor(veh,vehInf.r1,vehInf.g1,vehInf.b1,vehInf.r2,vehInf.g2,vehInf.b2,vehInf.r3,vehInf.g3,vehInf.b3,vehInf.r4,vehInf.g4,vehInf.b4)
    end    
    outputDebugString(vehIDs)
    outputDebugString(#vehIDs)
    outputDebugString(tostring(vehIDs))
    outputDebugString(tostring(#vehIDs))
 
end
addEventHandler(\"onResourceStart\",resourceRoot,loadVehs)
 
 
 
Most így néz ki, de a vehInf-re azt írja nil.
Cím: Kocsik lekérése
Írta: Enigma - 2017. Április 18. - 18:12:51
Már magát azt nem értem hogy neked miért kell 2 queryzés ahhoz hogy betöltsd az autókat..
Cím: Kocsik lekérése
Írta: thegergo02 - 2017. Április 18. - 18:18:20
Mivel az egyikkel lekérem a max-ot (mennyi kocsi van) a másikkal meg a kocsi infókat.
Cím: Kocsik lekérése
Írta: Enigma - 2017. Április 18. - 18:35:47
És ehhez miért kell 2? Miért kell neked tudni a max kocsikat? Miért nem lehetne egy SELECT * FROM vehicles?
Cím: Kocsik lekérése
Írta: thegergo02 - 2017. Április 18. - 21:23:21
Mert ha nem tudom mennyi kocsi van akkor végtelen for-t hozzak létre? Az meg zabálna feleslegesen.
Cím: Kocsik lekérése
Írta: DrAkE - 2017. Április 18. - 21:48:54
Milyen végtelen ciklus? :D
Inkább nézz utána, hogyan is működik maga az egész adatbázis kezelés az MTAban, meg hogyan működik az SQL :D
 
https://wiki.multitheftauto.com/wiki/DbQueryhttps://wiki.multitheftauto.com/wiki/DbPoll
Cím: Kocsik lekérése
Írta: Enigma - 2017. Április 19. - 10:43:30
Idézetet írta: DrAkE date=1492544934


   
      Inkább nézz utána, hogyan is működik maga az egész adatbázis kezelés az MTAban
   


Hát nem ártana.
 
A SELECT * mindent kiválaszt az adott táblából, és egy táblát returnöl, ami tartalmazza a kocsikat. azon már áttudsz loopolni, és létretudod hozni a kocsikat.
Cím: Kocsik lekérése
Írta: thegergo02 - 2017. Április 19. - 11:09:46
Ohh, kösz Engima, rájöttem hogy táblaként kéne kezelni, Oké, újraírom az egészet.
Cím: Kocsik lekérése
Írta: Xenius - 2017. Április 21. - 20:20:41

function loadOneVehicle(vehInf)
local veh = createVehicle(vehInf.vehid,vehInf.x,vehInf.y,vehInf.z,0,0,0,vehInf.backplate)
if veh then
   setVehicleColor(veh,vehInf.r1,vehInf.g1,vehInf.b1,vehInf.r2,vehInf.g2,vehInf.b2,vehInf.r3,vehInf.g3,vehInf.b3,vehInf.r4,vehInf.g4,vehInf.b4)
end
end
addEventHandler(\"onResourceStart\", resourceRoot, function()
dbQuery(function(qh)
   local res, rows, err = dbPoll(qh, 0)
   if rows > 0 then
      for k, in pairs(res) do
         local co = coroutine.create(loadOneVehicle)
         coroutine.resume(co, v)
      end
   end
end, connection, \"SELECT * FROM vehicles\")
end)

 
+ Javaslom hogy a coroutine részt állítsd egy timerre, ami egyszerre max 2-3 autót tölt be. Ezres nagyságrendnél elég sok problémát tud okozni ha 2000-3000 kocsit töltesz be egyszerre.
 
Vagy pedig használj async-et, az is sokat segít. (https://github.com/Inlife/mta-lua-async)
 
Ahhoz egy példa (a for részt kell kicserélni erre):
 

Async:setPriority(\"normal\") -- engedélyezett típusok: low - lassú, kevés cpu, normal, high - gyors betöltés, sok cpu
Async:foreach(res, function(value)
loadOneVehicle(value)
end, function()
outputChatBox(\"kész\")
end)

 
 
Cím: Kocsik lekérése
Írta: DrAkE - 2017. Április 23. - 20:13:39
Idézetet írta: Xenius date=1492798841


   

function loadOneVehicle(vehInf)
local veh = createVehicle(vehInf.vehid,vehInf.x,vehInf.y,vehInf.z,0,0,0,vehInf.backplate)
if veh then
   setVehicleColor(veh,vehInf.r1,vehInf.g1,vehInf.b1,vehInf.r2,vehInf.g2,vehInf.b2,vehInf.r3,vehInf.g3,vehInf.b3,vehInf.r4,vehInf.g4,vehInf.b4)
end
end
addEventHandler(\"onResourceStart\", resourceRoot, function()
dbQuery(function(qh)
   local res, rows, err = dbPoll(qh, 0)
   if rows > 0 then
      for k, in pairs(res) do
         local co = coroutine.create(loadOneVehicle)
         coroutine.resume(co, v)
      end
   end
end, connection, \"SELECT * FROM vehicles\")
end)

   
      + Javaslom hogy a coroutine részt állítsd egy timerre, ami egyszerre max 2-3 autót tölt be. Ezres nagyságrendnél elég sok problémát tud okozni ha 2000-3000 kocsit töltesz be egyszerre.
   
   
      Vagy pedig használj async-et, az is sokat segít. (https://github.com/Inlife/mta-lua-async)
   
   
      Ahhoz egy példa (a for részt kell kicserélni erre):
   
   

Async:setPriority(\"normal\") -- engedélyezett típusok: low - lassú, kevés cpu, normal, high - gyors betöltés, sok cpu
Async:foreach(res, function(value)
loadOneVehicle(value)
end, function()
outputChatBox(\"kész\")
end)

   
       
   


Tök felesleges ilyen dolgokért async-et, vagy akár coroutinet használni, hacsaknem minden 10 másodpercenként betöltögeted az összes kocsit adatbázisból. Alapból a dbQuery akkor hívja meg a funkciót, amikor az adatok már készen állnak.
Plusz csak megnehezíted a saját dolgodat.
Cím: Kocsik lekérése
Írta: thegergo02 - 2017. Április 24. - 19:51:02
Köszönöm a tanácsokat!
Cím: Kocsik lekérése
Írta: Xenius - 2017. Április 29. - 14:40:55
@DrAkE egyáltalán nem felesleges. Ha egyszerre töltesz be több ezer kocsit akkor addig a szerver lefagy, és kapsz egy jó kis Network trouble üzenetet.
 
Illetve találkoztam már stabilitási gondokkal is. A memória használat felugrott 5-6 gb-ra aztán elkezdte az mta leblokkolni a bejövő kapcsolatokat stb. Mivel a szerver csak 1db logikai szálat használ, ezért szükségesek az ilyen megoldások nagy adat betöltésekor. Nem 20-30 playeres szerverekre gondolok, illetve az async csak egy példa volt. Rengeteg féle megoldás létezik erre.