Archinet Posted March 5, 2019 Share Posted March 5, 2019 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
Alexs Posted March 5, 2019 Share Posted March 5, 2019 (edited) 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 March 5, 2019 by Alexs 1 Link to comment
Archinet Posted March 7, 2019 Author Share Posted March 7, 2019 (edited) @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 March 7, 2019 by Archinet Link to comment
aka Blue Posted March 8, 2019 Share Posted March 8, 2019 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. 1 Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now