Anzo Posted August 30, 2016 Share Posted August 30, 2016 Estoy intentando hacer que se guarden las posiciones de los objetos con sql, pero me dio este error y no sé por que será. (tampoco se que cambiarle para que funcione) Lo que debería hacer es guardar la posición de los objetos al apagar el script, y al iniciarlo que se creen de nuevo. Este es mi código: function uselt(modelosID) if (modelosID) then local x, y, z = getElementPosition ( source ) local rx, ry, rz = getElementRotation ( source ) local matrix = (Matrix.create(x,y,z,rx,ry,rz)) local forward = (Matrix.getForward(matrix) * 2) local pos = (Matrix.getPosition(matrix) + forward) local dim = getElementDimension(source) local int = getElementInterior(source) allObjs = createObject(modelosID, pos) setElementRotation(allObjs,x,y,z,"default",true) setElementDimension(allObjs,dim) setElementInterior(allObjs,int) end end addEventHandler("useObjects", root, uselt) local connects = dbConnect ("sqlite", "file.db") function saveP () for i,vp in ipairs(getElementsByType("object")) do local modelid = getElementModel(vp) local x,y,z = getElementPosition (source) local rx,ry,rz = getElementPosition (source) local pos = dbQuery (connects, "CREATE TABLE IF NOT EXISTS `position` (`modelid` int, `x` float, `y` float, `z` float,`rx` float,`ry` float, `rz` float)") local query = dbQuery ( connects, "SELECT * FROM position") local result = dbPoll (query, -1) if (#result == 0) or not result or type(result) ~= "table" then local q = dbQuery (connects, "INSERT INTO `position` VALUES (?, ?, ?)", modelid, x, y, z,rx,ry,rz) else local qq = dbQuery (connects, "UPDATE `position` SET `modelid`="..modelid.."`x`="..x..", `y`="..y..", `z`="..z.."`rx`="..rx.."`ry`="..ry.."`rz`="..rz) end end end addEventHandler ("onResourceStop", getRootElement(), saveP) function loadP () local query = dbQuery ( connects, "SELECT * FROM position") local result = dbPoll (query, -1) for i,v in pairs (result) do createObject (v.modelid, v.x, v.y, v.z,v.rx,v.ry,v.rz) outputChatBox ("Cargando objetos...", soure, 255, 255, 255) end end addEventHandler ("onResourceStart", getRootElement(), loadP) El error esta en esta linea: local result = dbPoll (query, -1) me dice: dbPoll failed; no such table: position y luego, me da error en la linea de abajo for i,v in pairs (result) do dice esto: bad argument #1 to 'pairs' (table expected, got boolean) Ojo, nunca he usado sqlite, esto lo pude hacer gracias a un post que vi, así que si hay muchos errores o algo sin sentido ya saben por que. Link to comment
Bc# Posted August 31, 2016 Share Posted August 31, 2016 Supongo que le metiste datos a las tablas antes de consultarlas. Ya que la tabla te esta arrojando un false Link to comment
Simple0x47 Posted August 31, 2016 Share Posted August 31, 2016 La columna position se encuentra vacía Link to comment
Anzo Posted August 31, 2016 Author Share Posted August 31, 2016 Supongo que le metiste datos a las tablas antes de consultarlas. Ya que la tabla te esta arrojando un false Y cómo sería? no sé que cambiar para que deje de tirar errores en esas lineas. La columna position se encuentra vacía Se que es por eso pero no sé porque esta vacía ni como arreglarlo. Se supone que en realidad eso debería guardar la posición del jugador donde quedo la ultima vez al salir del servidor, yo solo intente hacer que guarde la posición de los objetos al apagar el script, pero no funciona. Link to comment
Simple0x47 Posted August 31, 2016 Share Posted August 31, 2016 Se que es por eso pero no sé porque esta vacía ni como arreglarlo. Se supone que en realidad eso debería guardar la posición del jugador donde quedo la ultima vez al salir del servidor, yo solo intente hacer que guarde la posición de los objetos al apagar el script, pero no funciona. La cosa es que no se guarda al salir del servidor el jugador, si no cuando el resource se para en parte servidor. Lo que podrías hacer es: cliente: function triggerSave() if ( localPlayer == source ) then triggerServerEvent( "onSavePlayerData", localPlayer, localPlayer ) end end addEventHandler("onClientPlayerQuit", root, triggerSave) server: addEvent("onSavePlayerData", true) function saveIT( player ) for i,vp in ipairs(getElementsByType("object")) do local modelid = getElementModel(vp) local x,y,z = getElementPosition (player) local rx,ry,rz = getElementPosition (player) local pos = dbQuery (connects, "CREATE TABLE IF NOT EXISTS `position` (`modelid` int, `x` float, `y` float, `z` float,`rx` float,`ry` float, `rz` float)") local query = dbQuery ( connects, "SELECT * FROM position") local result = dbPoll (query, -1) if (#result == 0) or not result or type(result) ~= "table" then local q = dbQuery (connects, "INSERT INTO `position` VALUES (?, ?, ?)", modelid, x, y, z,rx,ry,rz) else local qq = dbQuery (connects, "UPDATE `position` SET `modelid`="..modelid.."`x`="..x..", `y`="..y..", `z`="..z.."`rx`="..rx.."`ry`="..ry.."`rz`="..rz) end end end addEventHandler("onSavePlayerData", saveIT) Deberías hacer lo mismo con el load :v Link to comment
Anzo Posted August 31, 2016 Author Share Posted August 31, 2016 Ok, pero, lo que estoy haciendo es un decorador de interiores, obviamente si no le doy stop al script los objetos nunca se borraran, pero cómo puedo hacer para que los objetos se queden ahí aún así yo reinicie o apague el script? PD: Si pongo lo que me pasaste Simple, no me manda ningún error, pero yo quiero que se queden donde los puse para siempre. :v Link to comment
Simple0x47 Posted August 31, 2016 Share Posted August 31, 2016 Lo que hice es para guardar la cosa en la base de datos, lo que significa que se guardan cuando el jugador entra y siempre estaran ahi :v Link to comment
Anzo Posted August 31, 2016 Author Share Posted August 31, 2016 Lo que hice es para guardar la cosa en la base de datos, lo que significa que se guardan cuando el jugador entra y siempre estaran ahi :v Una pregunta, si yo creo un objeto y me salgo del servidor se quedará ahí aunque no use sqlite? e_a Lo que me pasaste me sirve, pero yo quiero que se queden donde estaban cuando reinicie el script, esto es por si tengo que modificar algo después. Link to comment
Simple0x47 Posted August 31, 2016 Share Posted August 31, 2016 Si creas el objeto server side se quedará ahí. Y los objetos se quedan donde están porque cuando entras al servidor se guardan las posiciones. Lo que significa que cuando reinicies el script seguira ahi :v Link to comment
Anzo Posted August 31, 2016 Author Share Posted August 31, 2016 Pues no sé que pasa, porque cuando reinicio el script desaparecen los objetos, verifica tu el script para ver si hay algo mal: -Server local connects = dbConnect ("sqlite", "file.db") addEvent("onSavePlayerData", true) addEvent("onLoadPlayerData", true) function saveIT( player ) for i,vp in ipairs(getElementsByType("object")) do local modelid = getElementModel(vp) local x,y,z = getElementPosition (player) local rx,ry,rz = getElementPosition (player) local pos = dbQuery (connects, "CREATE TABLE IF NOT EXISTS `position` (`modelid` int, `x` float, `y` float, `z` float,`rx` float,`ry` float, `rz` float)") local query = dbQuery ( connects, "SELECT * FROM position") local result = dbPoll (query, -1) if (#result == 0) or not result or type(result) ~= "table" then local q = dbQuery (connects, "INSERT INTO `position` VALUES (?, ?, ?)", modelid, x, y, z,rx,ry,rz) else local qq = dbQuery (connects, "UPDATE `position` SET `modelid`="..modelid.."`x`="..x..", `y`="..y..", `z`="..z.."`rx`="..rx.."`ry`="..ry.."`rz`="..rz) end end end addEventHandler("onSavePlayerData", root, saveIT) function loadP () local query = dbQuery ( connects, "SELECT * FROM `position`") local result = dbPoll (query, -1) for i,v in pairs (result) do createObject (tonumber(v.modelid), v.x, v.y, v.z,v.rx,v.ry,v.rz) outputChatBox ("Cargando objetos...", soure, 255, 255, 255) end end addEventHandler("onLoadPlayerData", root, loadP) -Client function triggerSave() if ( localPlayer == source ) then triggerServerEvent( "onSavePlayerData", localPlayer, localPlayer ) end end addEventHandler("onClientPlayerQuit", root, triggerSave) function triggerLoad() if ( localPlayer == source ) then triggerServerEvent( "onLoadPlayerData", localPlayer, localPlayer ) end end addEventHandler("onClientResourceStart", getResourceRootElement(getThisResource()), triggerLoad) Y esta es la parte cuando se crean los objetos: function uselt(modelosID) if (modelosID) then local x, y, z = getElementPosition ( source ) -- Obtengo la posicion del jugador local rx, ry, rz = getElementRotation ( source ) -- Obtengo la rotacion del jugador local matrix = (Matrix.create(x,y,z,rx,ry,rz))--Creo la matrix local forward = (Matrix.getForward(matrix) * 2) local pos = (Matrix.getPosition(matrix) + forward) local dim = getElementDimension(source) local int = getElementInterior(source) allObjs = createObject(modelosID, pos) setElementRotation(allObjs,x,y,z,"default",true) setElementDimension(allObjs,dim) setElementInterior(allObjs,int) end end addEventHandler("useObjects", root, uselt) Link to comment
aka Blue Posted August 31, 2016 Share Posted August 31, 2016 outputChatBox ("Cargando objetos...", soure, 255, 255, 255) ¿Soure? ¿Guat? Hazlo por tablas, dios. Es un maldito lío el que te estás montando y en verdad es una tontería. Cuando se cree el objeto que se inserte en una tabla, después loopeas y guardas los objetos guardados en dicha tabla, así tienes el objeto por tabla y su k o index en otra... Link to comment
Anzo Posted August 31, 2016 Author Share Posted August 31, 2016 outputChatBox ("Cargando objetos...", soure, 255, 255, 255) ¿Soure? ¿Guat? Hazlo por tablas, dios. Es un maldito lío el que te estás montando y en verdad es una tontería. Cuando se cree el objeto que se inserte en una tabla, después loopeas y guardas los objetos guardados en dicha tabla, así tienes el objeto por tabla y su k o index en otra... Como dije arriba, esa parte la saque de un post viejo que vi, y tenía 'soure', por alguna razón si pongo otra cosa no me sale el mensaje. Voy a probar con el método que dices a ver que tal. Esto es lo único que se me ocurrió: addEvent("useObjects",true) objs = {} function uselt(modelosID) if (modelosID) then local x, y, z = getElementPosition ( source ) local rx, ry, rz = getElementRotation ( source ) local matrix = (Matrix.create(x,y,z,rx,ry,rz)) local forward = (Matrix.getForward(matrix) * 2) local pos = (Matrix.getPosition(matrix) + forward) local dim = getElementDimension(source) local int = getElementInterior(source) allObjs = createObject(modelosID, pos) table.insert(objs,allObjs) setElementRotation(allObjs,x,y,z,"default",true) setElementDimension(allObjs,dim) setElementInterior(allObjs,int) -- end end addEventHandler("useObjects", root, uselt) function saveObject() for index, theObject in ipairs(objs) do createObject(objs) end end addEventHandler("onResourceStart", root, saveObject) Pero igual desaparecen los objetos. Link to comment
aka Blue Posted August 31, 2016 Share Posted August 31, 2016 ¿Pero se guardan en la base de datos, has visto si se almacenan? Si se almacenan y no se crean es que no los cargas correctamente. Esto es lo más chapucero que he hecho por el momento, pero espero que te puedas hacer una idea... Algo así pero más complicado usaba mi sistema de muebles Roleplay: local muebles = { } local mueblesID = { } function crearNuevaID( ) if #muebles > 0 then -- Si la longitud de la tabla es mayor a 1, es decir, hay alguna id... return #muebles + 1 else return 1 -- En caso contrario, la ID sería 1 end end function crearObjeto( ) local nuevaid = crearNuevaID( ) local objeto = createObject... muebles[ nuevaid ] = objeto mueblesID[ objeto ] = nuevaid end Luego esto lo almacenas en la base de datos y lo cargas, haciendo un loop del result e introduciendo todo en la tabla muebles y mueblesID con su respectiva id, etc. Link to comment
Anzo Posted August 31, 2016 Author Share Posted August 31, 2016 ¿Pero se guardan en la base de datos, has visto si se almacenan? Si se almacenan y no se crean es que no los cargas correctamente. Esto es lo más chapucero que he hecho por el momento, pero espero que te puedas hacer una idea... Algo así pero más complicado usaba mi sistema de muebles Roleplay: local muebles = { } local mueblesID = { } function crearNuevaID( ) if #muebles > 0 then -- Si la longitud de la tabla es mayor a 1, es decir, hay alguna id... return #muebles + 1 else return 1 -- En caso contrario, la ID sería 1 end end function crearObjeto( ) local nuevaid = crearNuevaID( ) local objeto = createObject... muebles[ nuevaid ] = objeto mueblesID[ objeto ] = nuevaid end Luego esto lo almacenas en la base de datos y lo cargas, haciendo un loop del result e introduciendo todo en la tabla muebles y mueblesID con su respectiva id, etc. Voy a probarlo más tarde, ahora no puedo usar la pc. Y no, no se estaban guardando en la db. Link to comment
aka Blue Posted August 31, 2016 Share Posted August 31, 2016 Lo estoy revisando y el código está fatal. Cuando tu usas un UPDATE debe haber un WHERE donde diga el objeto o ID en cuestión que estás modificado, en tu caso, no hay nada de eso. El INSERT TO, te debe devolver el Index o 'k' del nuevo objeto insertado en la tabla, el cual, debes almacenar en una tabla IG con index el objeto. Es algo difícil de explicar si no tienes mucha idea. Si tengo tiempo y ganas después, te paso el codigo hecho. Link to comment
Anzo Posted August 31, 2016 Author Share Posted August 31, 2016 Lo estoy revisando y el código está fatal. Cuando tu usas un UPDATE debe haber un WHERE donde diga el objeto o ID en cuestión que estás modificado, en tu caso, no hay nada de eso. El INSERT TO, te debe devolver el Index o 'k' del nuevo objeto insertado en la tabla, el cual, debes almacenar en una tabla IG con index el objeto.Es algo difícil de explicar si no tienes mucha idea. Si tengo tiempo y ganas después, te paso el codigo hecho. Nunca entendí muy bien esto del sqlite, pensé que estaba bien eso pero parece que no. Entonces, seria así como tengo que hacer el update: dbQuery("UPDATE position WHERE 'x' =".. X) ? Link to comment
aka Blue Posted August 31, 2016 Share Posted August 31, 2016 Lo estoy revisando y el código está fatal. Cuando tu usas un UPDATE debe haber un WHERE donde diga el objeto o ID en cuestión que estás modificado, en tu caso, no hay nada de eso. El INSERT TO, te debe devolver el Index o 'k' del nuevo objeto insertado en la tabla, el cual, debes almacenar en una tabla IG con index el objeto.Es algo difícil de explicar si no tienes mucha idea. Si tengo tiempo y ganas después, te paso el codigo hecho. Nunca entendí muy bien esto del sqlite, pensé que estaba bien eso pero parece que no. Entonces, seria así como tengo que hacer el update: dbQuery("UPDATE position WHERE 'x' =".. X) ? No. Debes crear un row que sea, igual que modelID (que sea INT) pero haciendo referencia al index o ID. De ahí ya cuando vayas haciendo update haces: WHERE ID = ..id. Así es como se hace correctamente. Link to comment
Anzo Posted August 31, 2016 Author Share Posted August 31, 2016 Blue... si no te molesta, podrías ayudarme a hacer para que se guarden los objetos al reiniciar el script? es que la verdad me cuesta entender esto del sqlite ._:, no entiendo mucho las funciones que usa y como usarlas... Link to comment
Tomas Posted August 31, 2016 Share Posted August 31, 2016 Esto debería funcionar: local connects = dbConnect ("sqlite", "file.db") dbExec(connects, "CREATE TABLE IF NOT EXISTS `position` (`table` TEXT)") cache = {} function saveP () for i,vp in ipairs(getElementsByType("object"), resourceRoot) do local modelid = getElementModel(vp) local x,y,z = getElementPosition (source) local rx,ry,rz = getElementPosition (source) cache[i] = {modelid, x, y, z, rx, ry, rz} end dbExec(connects, "INSERT INTO `position` (`table`) VALUES(?)", toJSON(cache)) end addEventHandler ("onResourceStop", getRootElement(), saveP) function loadP () dbQuery(function(qh) local result = dbPoll(qh, 0) for _, v in ipairs(qh) do for _,vv in ipairs(fromJSON(v)) do model, x, y, z, rx, ry, rz = unpack(vv) createObject(model, x, y, z, rx, ry, rz) end end end end, db, "SELECT * FROM `position`") dbExec(connects, "DROP TABLE IF EXISTS `position`") end addEventHandler ("onResourceStart", getRootElement(), loadP) Link to comment
Anzo Posted August 31, 2016 Author Share Posted August 31, 2016 Esto debería funcionar: local connects = dbConnect ("sqlite", "file.db") dbExec(connects, "CREATE TABLE IF NOT EXISTS `position` (`table` TEXT)") cache = {} function saveP () for i,vp in ipairs(getElementsByType("object"), resourceRoot) do local modelid = getElementModel(vp) local x,y,z = getElementPosition (source) local rx,ry,rz = getElementPosition (source) cache[i] = {modelid, x, y, z, rx, ry, rz} end dbExec(connects, "INSERT INTO `position` (`table`) VALUES(?)", toJSON(cache)) end addEventHandler ("onResourceStop", getRootElement(), saveP) function loadP () dbQuery(function(qh) local result = dbPoll(qh, 0) for _, v in ipairs(qh) do for _,vv in ipairs(fromJSON(v)) do model, x, y, z, rx, ry, rz = unpack(vv) createObject(model, x, y, z, rx, ry, rz) end end end end, db, "SELECT * FROM `position`") dbExec(connects, "DROP TABLE IF EXISTS `position`") end addEventHandler ("onResourceStart", getRootElement(), loadP) Me daba error en un end y se lo quite, también me decía que el argumento 2 (db) de dbQuery estaba mal, así que le puse connects, en vez de db, pero me sigue saliendo el mismo error en las tablas, 'no such table: position', y después me da error en el for loop : bad argument #1 to 'ipairs' (table expected, got userdata) Así quedo: local connects = dbConnect ("sqlite", "file.db") dbExec(connects, "CREATE TABLE IF NOT EXISTS `position` (`table` TEXT)") cache = {} function saveP () for i,vp in ipairs(getElementsByType("object"), resourceRoot) do local modelid = getElementModel(vp) local x,y,z = getElementPosition (source) local rx,ry,rz = getElementPosition (source) cache[i] = {modelid, x, y, z, rx, ry, rz} end dbExec(connects, "INSERT INTO `position` (`table`) VALUES(?)", toJSON(cache)) end addEventHandler ("onResourceStop", getRootElement(), saveP) function loadP () dbQuery(function(qh) local result = dbPoll(qh, 0) for _, v in pairs(qh) do for _,vv in pairs(fromJSON(v)) do model, x, y, z, rx, ry, rz = unpack(vv) createObject(model, x, y, z, rx, ry, rz) end end end, connects, "SELECT * FROM `position`") dbExec(connects, "DROP TABLE IF EXISTS `position`") end addEventHandler ("onResourceStart", getRootElement(), loadP) Link to comment
Tomas Posted September 1, 2016 Share Posted September 1, 2016 Ahora que me pongo a ver el codigo original, esta lleno de errores, intenta con esto: local connects = dbConnect ("sqlite", "file.db") dbExec(connects, "CREATE TABLE IF NOT EXISTS `position` (`table` TEXT)") cache = {} function saveP () for i,v in ipairs(getElementsByType("object", resourceRoot)) do local modelid = getElementModel(v) local x,y,z = getElementPosition (v) local rx,ry,rz = getElementPosition (v) cache[i] = {modelid, x, y, z, rx, ry, rz} end dbExec(connects, "INSERT INTO `position` (`table`) VALUES(?)", toJSON(cache)) end addEventHandler ("onResourceStop", resourceRoot, saveP) function loadP () dbQuery(function(qh) local result = dbPoll(qh, 0) for _, v in ipairs(qh) do t = fromJSON(v[1]) end for _,vv in ipairs(t) do model, x, y, z, rx, ry, rz = unpack(vv) createObject(model, x, y, z, rx, ry, rz) end end, db, "SELECT * FROM `position`") dbExec(db, "DROP TABLE IF EXISTS `position`") end addEventHandler ("onResourceStart", resourceRoot, loadP) Link to comment
Anzo Posted September 1, 2016 Author Share Posted September 1, 2016 Ahora que me pongo a ver el codigo original, esta lleno de errores, intenta con esto: local connects = dbConnect ("sqlite", "file.db") dbExec(connects, "CREATE TABLE IF NOT EXISTS `position` (`table` TEXT)") cache = {} function saveP () for i,v in ipairs(getElementsByType("object", resourceRoot)) do local modelid = getElementModel(v) local x,y,z = getElementPosition (v) local rx,ry,rz = getElementPosition (v) cache[i] = {modelid, x, y, z, rx, ry, rz} end dbExec(connects, "INSERT INTO `position` (`table`) VALUES(?)", toJSON(cache)) end addEventHandler ("onResourceStop", resourceRoot, saveP) function loadP () dbQuery(function(qh) local result = dbPoll(qh, 0) for _, v in ipairs(qh) do t = fromJSON(v[1]) end for _,vv in ipairs(t) do model, x, y, z, rx, ry, rz = unpack(vv) createObject(model, x, y, z, rx, ry, rz) end end, db, "SELECT * FROM `position`") dbExec(db, "DROP TABLE IF EXISTS `position`") end addEventHandler ("onResourceStart", resourceRoot, loadP) Ahora solo me da el error que dije antes (bad argument #1 to 'ipairs' (table expected, got userdata) el otro de 'no such table: position' ya no aparece, pero sigue sin funcionar. Link to comment
Tomas Posted September 1, 2016 Share Posted September 1, 2016 Ahora que me pongo a ver el codigo original, esta lleno de errores, intenta con esto: local connects = dbConnect ("sqlite", "file.db") dbExec(connects, "CREATE TABLE IF NOT EXISTS `position` (`table` TEXT)") cache = {} function saveP () for i,v in ipairs(getElementsByType("object", resourceRoot)) do local modelid = getElementModel(v) local x,y,z = getElementPosition (v) local rx,ry,rz = getElementPosition (v) cache[i] = {modelid, x, y, z, rx, ry, rz} end dbExec(connects, "INSERT INTO `position` (`table`) VALUES(?)", toJSON(cache)) end addEventHandler ("onResourceStop", resourceRoot, saveP) function loadP () dbQuery(function(qh) local result = dbPoll(qh, 0) for _, v in ipairs(qh) do t = fromJSON(v[1]) end for _,vv in ipairs(t) do model, x, y, z, rx, ry, rz = unpack(vv) createObject(model, x, y, z, rx, ry, rz) end end, db, "SELECT * FROM `position`") dbExec(db, "DROP TABLE IF EXISTS `position`") end addEventHandler ("onResourceStart", resourceRoot, loadP) Ahora solo me da el error que dije antes (bad argument #1 to 'ipairs' (table expected, got userdata) el otro de 'no such table: position' ya no aparece, pero sigue sin funcionar. ¿En qué linea? Link to comment
Anzo Posted September 5, 2016 Author Share Posted September 5, 2016 Los errores están en estas dos lineas: dbExec(connects, "INSERT INTO `position` (`table`) VALUES(?)", toJSON(cache))--Linea 14 ERROR: dxExec failed; (1) no such table: position for _, v in ipairs(qh) do --Linea 21 ERROR: bad argument #1 to 'ipairs' (table expected, got userdata) Link to comment
aka Blue Posted September 5, 2016 Share Posted September 5, 2016 El primer error te dice que la tabla no existe... Link to comment
Recommended Posts