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