Jump to content

Dudas respecto a el uso de client-server


Recommended Posts

Un saludos a todos en la comunidad

He salido de SAMP para pasarme a MTA por todas las mejoras y diferencias que tiene.

No he podido entender bien el uso que se tiene para el client y para el server, por ejemplo he estado utilizando un script que baje de la comunidad

para el registro, login y save, funciona pero aqui viene mi otra duda.

¿Si quiero cargar el dinero de la base de datos como se lo agrego al jugador?

¿Que método es mas seguro de hacerlo?

En samp GetPlayerMoney retorna el dinero del cliente, ¿en MTA tambien es igual? o es una funcion server-side?

Aqui les dejo el script que edite un poco porque daba algunos errores, funciona y todo pero tengo la duda de agregar el dinero al jugador de forma "incorrecta" y que puedan aprovecharse de eso.

Apreciare sus respuestas de antemano, aqui el script por si pueden darme una mano para poder añadir una forma segura el dinero cargado de la DB.

--[[
* Author: Om (RipeMangoes69)
* Project: None (FFA)
* Date: 8 December 2016
* File: server.lua
]]--

root = getRootElement()
function PlayerJoin()
	triggerClientEvent (source, "openLoginGUI", source, true)
	toggleControl(source, "chatbox", false) 
end
addEventHandler ( "onPlayerJoin", root, PlayerJoin )

-- MySQL Handlers.
db = dbConnect( "mysql", "dbname=db_mta;host=127.0.0.1", "root", "pass", "share=1")

if db then
	outputDebugString( "Connection with database was successfully established." )
else
	outputDebugString( "Connection with database couldn't be established." )
end

function loginPlayer(username, password)
	qh = dbQuery(db, "SELECT * FROM accounts WHERE BINARY username=? and password=?", username, md5(password))
	result , numrows, errmsg = dbPoll (qh, -1)
	local row = result[1]
	if row then
		triggerClientEvent(client, "login.success", client)
  		-- Connect to MTA Login System for Admin Access.
  		local account = getAccount(username, password)
  		if (account ~= false) then
  			logIn(client, getAccount(username), password)
  			outputChatBox("Te has conectado exitosamente como [Administrador].", client)
  		else
  			outputChatBox("Te has conectado exitosamente.", client)
  		end
  		setElementData(client, "isPlayedLoggedIn", true)
  		setElementData(client, "getPlayerUsername", username)
		
		spawnPlayer(client, row["pos_x"], row["pos_y"], row["pos_z"], row["pos_r"], row["skin"], 0, 0, getPlayerTeam(client)) -- spawns player with random skin
  		fadeCamera (client, true)
		setCameraTarget (client, client)
  		toggleControl(client, "chatbox", true) 
  		outputServerLog("Login: User: " .. getPlayerName(client) .. " successfully logged in as " .. username .. "! (IP: " .. getPlayerIP(client) .. " | Serial: " .. getPlayerSerial(client) ..")")
	else
		outputChatBox("Oops! Something went wrong, have a check on your username and password.", client)
	end
end
addEvent("loginPlayer", true)
addEventHandler("loginPlayer", resourceRoot, loginPlayer)

-- Register Player
function registerPlayer(username, password, email)
	qh = dbQuery(db, "SELECT * FROM accounts WHERE BINARY username=?", username)
	result , numrows, errmsg = dbPoll (qh, -1)
	local row = result[1]
	if row then
		outputChatBox("Sorry! Username already in use.", client)
	else
		cr = dbQuery(db, "INSERT INTO accounts (username, password, email) VALUES (?,?,?)", username, md5(password), email)
		triggerClientEvent(client, "register.success", client)
		outputChatBox("Te has registrado correctamente, ahora coloca tus datos para conectarte.", client)
	end
end
addEvent("registerPlayer", true)
addEventHandler("registerPlayer", resourceRoot, registerPlayer)

-- Bug Fixed.
function rejoinMe(thePlayer)
	redirectPlayer(thePlayer,"",0)
end
addEvent("redirectPlr", true)
addEventHandler("redirectPlr", root, rejoinMe)


function saveData() 
	x,y,z = getElementPosition(source) 
	money = getPlayerMoney(source) 
	skin = getPedSkin(source) 
	local query = "UPDATE accounts SET skin='" .. skin .. "', pos_x='" .. x .. "', pos_y='" .. y .."', pos_z='" .. z .."'  WHERE username='" .. getPlayerUsername(source) .."'" 
	dbQuery(db, query) 
	outputServerLog("Guardando jugador "..getPlayerUsername(source).."")
end 
addEvent("saveData", true)
addEventHandler("onPlayerQuit", root, saveData) 


-- Exports
function getPlayerUsername(thePlayer)
	un = getElementData(thePlayer, "getPlayerUsername")
	return un
end












 

Link to comment

Sobre la distinción entre cliente y servidor, puede que en un comienzo parezca confusa, pero resulta más clara si lo piensas como un sitio web: Por un lado tienes la página web (el front-end) en que es visible toda la interfaz con la que el usuario puede interactuar, mientras que "detrás" tienes el servidor (back-end) que puedes pensar como un cúmulo de información disponible para todos los usuarios. Entonces, el cliente es una suerte de caja cerrada a la que otros clientes no pueden acceder directamente.

Si el ejemplo no es claro, la distinción está mejor explicada acá: https://www.cloudflare.com/learning/serverless/glossary/client-side-vs-server-side/

En tu caso, la recomendación general es que el dinero de los usuarios se asigne en el lado del servidor, para esto puedes utilizar setPlayerMoney.

Por último, sin ánimos de remarcar lo evidente, notarás que existen diferentes sintaxis en algunas funciones, dependiendo de si se utilizará en el lado del cliente o del servidor, por lo que sugiero prestar atención a la documentación de la wiki para evitar problemas relacionados a ello.

 

Edited by Alexs
  • Like 1
Link to comment

@Alexs Gracias amigo, ya estoy entendiendo un poco mas lo del cliente - server

Ahora continuo con mi duda relacionada con los datos cargados de la DB para asignarselos al jugador

He visto como algunos utilizan tablas, si no setElementData y otros que usan setAccountData y la verdad es que es algo confuso

En samp yo utilizaba un enum PlayerInfo[playerid][money] = db_money

Pero aqui en mta es algo confuso que metodo utilizar para asignar los datos y poder trabajar con ellos in-game para restar o sumar y que este se guarde luego al salir del juego.

Edited by Archinet
Link to comment

Para el dinero es mejor utilizar setPlayerMoney con los valores de la db al loguearse el player y luego guardarlos al salir o al modificarse obteniendo el valor con getPlayerMoney.

El elementData lo utilizan mayoritariamente para valores personalizados que quieran compartir (o no) en ambos lados (cliente - servidor). Ejemplo: nivel o experiencia

¿Por qué utilizar elementData para esto (lo mencionado arriba)? Te permite utilizar el valor en ambos lados por lo cual puedes modificarlo tanto en cliente como en servidor y hacer por ejemplo (en este caso) una barra de nivel en el lado cliente obteniendo el valor con getElementData.

Se puede optimizar y mejorar sí pero para empezar y para que le pilles el truquillo va bien.

Pd: es posible que me haya explicado como el c*lo pero estoy desde el móvil.

  • Like 1
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

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