Jump to content

Guardar width o progreso de un dxRectangle?


Anzo

Recommended Posts

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

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

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

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 by Anzo
Link to comment

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

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 xD

Edited by Anzo
Link to comment

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 by Anzo
Link to comment

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

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 by aka Blue
Link to comment
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
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...