Anzo Posted September 26, 2016 Share Posted September 26, 2016 Pues quisiera saber si se puede guardar el width de un dxRectangle aunque me salga de servidor, un ejemplo: El dxRectangle normalmente esta en "0 (width)" pero si yo mato a un player sube a 1 y pues si matas a 100 la barra se va alargando hasta llegar a 100 width. Mi pregunta es, puedo guardar el progreso del dxRectangle, que si yo mato a 100 jugadores, al entrar el dxRectangle tenga los 100 de largo? Link to comment
aka Blue Posted September 26, 2016 Share Posted September 26, 2016 Si, puedes guardarlo haciendo una variable en el script y al desloguearse o irse del servidor hacer una serie de triggers para enviar los datos y guardarlos con SQLite o XML, lo que quieras. (Aunque tambien puedes usar elementData). Luego al loguearse pues simplemente mandas los datos al cliente, llenando esa variable que hemos creado y añadiéndole el progreso. Link to comment
Anzo Posted September 26, 2016 Author Share Posted September 26, 2016 1 hour ago, aka Blue said: Si, puedes guardarlo haciendo una variable en el script y al desloguearse o irse del servidor hacer una serie de triggers para enviar los datos y guardarlos con SQLite o XML, lo que quieras. (Aunque tambien puedes usar elementData). Luego al loguearse pues simplemente mandas los datos al cliente, llenando esa variable que hemos creado y añadiéndole el progreso. Voy a intentar, gracias. Aunque el problema es con el SQLite que no lo sé usar muy bien. Link to comment
aka Blue Posted September 26, 2016 Share Posted September 26, 2016 Te dejo unos ejemplos por aquí para que te puedas guiar. Sinceramente, no sé si son los métodos más efectivos (no nos vamos a mentir), por lo tanto no te aseguro una máxima optimización, pero en cuanto a si funciona o no, sí funciona. Suerte y si tienes alguna duda me dices. -- Creamos la base de datos y la tabla principal addEventHandler( "onResourceStart", resourceRoot, function( ) sql = dbConnect ( "sqlite" , "accounts.db" ) -- Create the connection accountsTable = dbExec ( sql , "CREATE TABLE IF NOT EXISTS accounts (account TEXT,password TEXT,serial TEXT)" ) if fileExists( "accounts.db" ) and sql and accountsTable then outputDebugString( "Succefully connected SQLite resource" ) else outputDebugString( "Failed to connect SQLite" ) end end ) -- Comprobar si un SELECT FROM devuelve un resultado: local find_account = dbQuery ( sql , "SELECT * FROM accounts WHERE account = ?", username ) local result = dbPoll( find_account, -1 ) if result and #result > 0 then outputDebugString( "Account exists" ) else outputDebugString( "Account does not exists" ) end -- Uso de INSERT local qh = dbQuery ( sql , "INSERT INTO accounts (account,password,serial) VALUES (?,?,?)", username, md5(password), serial ) local result = dbPoll( qh, -1 ) if result then outputDebugString( "Registered" ) return true else outputDebugString( "Error, contact server admin" ) return end -- Uso de UPDATE local result = dbFree ( dbQuery ( sql , "UPDATE accounts SET password = ? WHERE account = ?" , md5(new_pass), account ) ) if result then outputDebugString( "New MD5 password = "..md5(new_pass) ) outputDebugString( "Without MD5 = "..tostring( new_pass ) ) else outputDebugString( "Error changing password" ) end Link to comment
Anzo Posted September 26, 2016 Author Share Posted September 26, 2016 Gracias, voy a ver que puedo sacar de eso. Link to comment
Anzo Posted September 29, 2016 Author Share Posted September 29, 2016 (edited) Una pregunta, si yo tengo la variable en client tengo que pasarla a server con triggerClientEvent para que así sqlite pueda leerla? Otra pregunta similar... estoy haciendo un panel de logros y digamos que ya lo tengo terminado, solo me falta que se guarden aunque te salgas del servidor; estoy usando variables para esto, ya que no era necesario usar elementData y si lo usará, tendría que usar varias. Mi pregunta es la misma de arriba, tengo que pasar estas variables a server para poder usar sqlite? Edited September 29, 2016 by Anzo Link to comment
aka Blue Posted September 29, 2016 Share Posted September 29, 2016 Si, debes pasarla a servidor ya que las funciones SQLite son de lado servidor. Link to comment
Anzo Posted September 29, 2016 Author Share Posted September 29, 2016 La verdad no he usado casi nunca esa función pero creo que así estaría bien : --client function reqJetKill(attacker,weapon,part,loss) if (attacker == localPlayer) then if (doesPedHaveJetPack(localPlayer) == true) then jetCount = jetCount+1 end end if (jetCount == 30) then if not jet then outputChatBox(" has matado a 30 jugadores en jetpack ") jet = true end end end addEventHandler("onClientPlayerWasted",root, reqJetKill) function variables(jet) jet = true end addEvent("variableToSave",true) addEventHandler("variableToSave", root, true) --server function ss(jet) triggerClientEvent("variableToSave",source, jet) end addEventHandler("onResourceStart",root,ss) Esta bien hecho? yo lo que quisiera es pasar la variable jet cuando este en true, o sea, cuando mate a los 30 jugadores en jet Link to comment
aka Blue Posted September 29, 2016 Share Posted September 29, 2016 Deberías hacer que cargue los datos cuando se loguee, no cuando inicie el recurso. Por lo demás, en el guardado, haz que tire un trigger al cliente y que devuelve al servidor con los datos y compruebas si el jet está en true, en caso contrario que no lo guarde. Link to comment
Anzo Posted September 29, 2016 Author Share Posted September 29, 2016 Yo me refería a si estaba bien la forma en que estaba pasando la variable a server, porque según me dijeron, solo puedo guardar variables usando sqlite o mysql... Link to comment
aka Blue Posted September 29, 2016 Share Posted September 29, 2016 Es que no lo entiendo bien el código. Link to comment
Anzo Posted September 29, 2016 Author Share Posted September 29, 2016 (edited) Es que lo hice too loco Bueno, esta parte creo que se entiende, si estas en un jetpack y matas a un jugador va sumandose la variable jetcount hasta llegar a 30, y cuando llega a 30 te sale un mensaje de que mataste a 30 y bla bla, después puse una variable (jet) pues para saber cuando terminó de matar a los 30 jugadores. function reqJetKill(attacker,weapon,part,loss) if (attacker == localPlayer) then if (doesPedHaveJetPack(localPlayer) == true) then jetCount = jetCount+1 end end if (jetCount == 30) then if not jet then outputChatBox(" has matado a 30 jugadores en jetpack ") jet = true end end end addEventHandler("onClientPlayerWasted",root, reqJetKill) --Y esto no sé si este bien, lo que quiero es pasar la variable jet = true (cuando termines de matar a los 30 jugadores) a server, para después intentar guardarla con sqlite; para que así, si mataste antes a los 30 jugadores aunque te salgas y entres del servidor no tendras que volverlos a matar. function variables(SPAMs) if (jet == true) then jet = true end end addEvent("variableToSave",true) addEventHandler("variableToSave", root, variables) --Y este es el server que algo me dice que lo estoy haciendo mal function ss(jet) triggerClientEvent("variableToSave",source, jet) end addEventHandler("onPlayerLogin",root,ss) PD: No le hagan caso a "SPAMs" fue un error de copy paste y no lo puedo editar Edited September 29, 2016 by Anzo Link to comment
aka Blue Posted September 29, 2016 Share Posted September 29, 2016 ¿Por qué no guardas directamente el numero de tiros y los compruebas después? Haz un triggerClientEvent cuando se desloguee, luego de cliente a servidor con los datos y ya al loguearse pues comprobar sin más. Link to comment
Anzo Posted September 29, 2016 Author Share Posted September 29, 2016 (edited) Algo como esto dices? function jetP() if (jetCount >= 30) then outputChatBox("Logro completado") end end addEvent("serveri",true) addEventHandler("serveri",root,jetP) --Server function salir() triggerClientEvent("serveri", source) end addEventHandler("onPlayerLogin", root, salir) lo de desloguearse no lo entendí muy bien Edited September 29, 2016 by Anzo Link to comment
aka Blue Posted September 30, 2016 Share Posted September 30, 2016 Si. Solo que al loguearse haz un par de llamadas a SQLite para sacar los datos y triggealos. Link to comment
Anzo Posted September 30, 2016 Author Share Posted September 30, 2016 Tengo esto hasta ahora (lo he logrado hacer con ayuda de un amigo): --Client function shared() triggerServerEvent("test", localPlayer, completeAll) end addEventHandler("onClientPlayerQuit", root, shared) addEvent("loadDataAccount", true) addEventHandler("loadDataAccount", localPlayer, function(tabla_variables) variables = tabla_variables end) addEventHandler("onClientRender", root, function() if variables then if variables[1]["logro_1"] == true then--attemp to index field '?' (a nil value) guiSetText(none10, "COMPLETADO") end end end) --Server addEventHandler("onResourceStart", getResourceRootElement(getThisResource()), function() executeSQLQuery( 'CREATE TABLE IF NOT EXISTS logrosLatin_Server (cuenta, logro_1)' ) end) function asd(variable) executeSQLQuery( 'INSERT INTO logrosLatin_Server( cuenta, logro_1 ) VALUES( ?, ? )', getAccountName(getPlayerAccount(source)), variable) end addEvent("test",true) addEventHandler("test",root, asd) addEventHandler("onPlayerLogin", root, function() local readData = executeSQLQuery( "SELECT * FROM logrosLatin_server WHERE cuenta=?", getAccountName(getPlayerAccount(source))) triggerClientEvent("loadDataAccount", source, readData) end) también probé cambiando los 'executeSQLQuery' por 'dxExec' (y creado la base de datos, claro) pero era el mismo resultado, daba error en esta linea: if variables[1]["logros_1"] == true then Link to comment
aka Blue Posted September 30, 2016 Share Posted September 30, 2016 (edited) No te recomiendo guardarlo así. Guardalo tipo 1 o 0, 1 sería igual a completado y 0 a no completado. Y no, no uses executeSQLQuery porque esas funciones solo actúan para el registry.db como bien dice la wiki: NOTE: This function only acts upon registry.db. Use dbQuery to query a custom SQL databse. Te lo digo porque creo que no se pueden guardar variables en una base de datos. Simplemente antes del guardado, realiza una condicion, es decir, si la variable es true, entonces lo guardas como '1', y en caso de que no, pues como '0'. Algo así: --Client e = { t = triggerServerEvent, a = addEventHandler, l = addEvent } e.a( "onClientPlayerQuit", root, function( ) e.t( "test", localPlayer, completeAll ) end ) e.l( "loadDataAccount", true ) e.a( "loadDataAccount", root, function( tabla_variables ) variables = tabla_variables end ) e.a( "onClientRender", root, function( ) if variables then if variables[1]["logro_1"] == 1 then guiSetText(none10, "COMPLETADO") else guiSetText(none10, "NO COMPLETADO") end end end ) PD: Por favor, ordena un poco el código que no entiendo nada xd. Edited September 30, 2016 by aka Blue Link to comment
Enargy, Posted September 30, 2016 Share Posted September 30, 2016 4 hours ago, aka Blue said: No te recomiendo guardarlo así. Guardalo tipo 1 o 0, 1 sería igual a completado y 0 a no completado. Y no, no uses executeSQLQuery porque esas funciones solo actúan para el registry.db como bien dice la wiki: NOTE: This function only acts upon registry.db. Use dbQuery to query a custom SQL databse. Te lo digo porque creo que no se pueden guardar variables en una base de datos. Simplemente antes del guardado, realiza una condicion, es decir, si la variable es true, entonces lo guardas como '1', y en caso de que no, pues como '0'. Algo así: --Client e = { t = triggerServerEvent, a = addEventHandler, l = addEvent } e.a( "onClientPlayerQuit", root, function( ) e.t( "test", localPlayer, completeAll ) end ) e.l( "loadDataAccount", true ) e.a( "loadDataAccount", root, function( tabla_variables ) variables = tabla_variables end ) e.a( "onClientRender", root, function( ) if variables then if variables[1]["logro_1"] == 1 then guiSetText(none10, "COMPLETADO") else guiSetText(none10, "NO COMPLETADO") end end end ) PD: Por favor, ordena un poco el código que no entiendo nada xd. No entiendo para que le cambias el nombre a las funciones xd. Link to comment
Recommended Posts