matucha123 Posted February 13, 2012 Posted February 13, 2012 I'm starting scripter in lua. While scripting I run into problem with SpwanPlayer. When I login(or register) get error playerDataSaving_loading.lua:13: Bad argument @ 'spwanPlayer' playerDataSaving_loading(serverside): addEvent("playerDataLoad", true) function playerDataLoading(thePlayer, username) local result = mysql_query(mysqldb, "Select * From players where username='"..username.."'") if not result then outputDebugString( "EVENT:playerDataLoading mysql_query failed: (" .. tostring( mysql_errno( mysqldb ) ).. ") " ..tostring( mysql_error( mysqldb ) ) ) mysql_free_result(result) return end local field = mysql_fetch_field(result) setElementData(thePlayer, "playerUsername", username) --spawnPlayer(thePlayer, field["pos_X"], field["pos_Y"], field["pos_Z"]) tried simple coordination's. spawnPlayer(theplayer, 0, 0, 3) mysql_free_result(result) end addEventHandler("playerDataLoad", root, playerDataLoading) function playerDataSaving() if get("AutoSaveOnQuit") then local posX, posY, posZ = getElementPosition(source) mysql_query(mysqldb, "Update players Set pos_X="..posX.." pos_Y="..posY.." pos_Z="..posZ.." Where username='"..getElementData(source, "playerUsername").."'") end end addEventHandler("onPlayerQuit", root, playerDataSaving) GUI creating, events calling(client): addEvent( "falseLogin", true) function createLoginRegisterGUI( ) local X = 0.375 local Y = 0.375 local Width = 0.35 local Height = 0.35 myFont = guiCreateFont( "password.ttf", 15 ) wdwLogin = guiCreateWindow(X, Y, Width, Height, "Login/Register window", true) tabPanel = guiCreateTabPanel ( 0, 0.1, 1, 1, true, wdwLogin) tabLogin = guiCreateTab( "Login", tabPanel ) local tabRegister = guiCreateTab( "Register", tabPanel ) X = 0.0825 Y = 0.2 Width = 0.25 Height = 0.25 guiCreateLabel(X, Y, Width, Height, "Username", true, tabLogin) Y = 0.5 guiCreateLabel(X, Y, Width, Height, "Password", true, tabLogin) X = 0.315 Y = 0.2 Width = 0.6 Height = 0.15 edtUser = guiCreateEdit(X, Y, Width, Height, "", true, tabLogin) Y = 0.5 edtPass = guiCreateEdit(X, Y, Width, Height, "", true, tabLogin) guiSetFont(edtPass, myFont ) guiEditSetMaxLength(edtUser, 50) guiEditSetMaxLength(edtPass, 50) X = 0.05 Y = 0.75 Width = 0.9 Height = 0.15 btnLogin = guiCreateButton(X, Y, Width, Height, "Log In", true, tabLogin) --========================Regsiter=============================================== X = 0.0825 Y = 0.21 Width = 0.2 Height = 0.2 guiCreateLabel(X, Y, Width, Height, "Username", true, tabRegister) Y = 0.41 guiCreateLabel(X, Y, Width, Height, "Password", true, tabRegister) Y = 0.61 guiCreateLabel(X, Y, Width, Height, "Repeat password", true, tabRegister) X = 0.315 Y = 0.2 Width = 0.6 Height = 0.1 edtReUser = guiCreateEdit(X, Y, Width, Height, "", true, tabRegister) Y = 0.4 edtRegPass = guiCreateEdit(X, Y, Width, Height, "", true, tabRegister) Y = 0.6 edtRePass = guiCreateEdit(X, Y, Width, Height, "", true, tabRegister) myFont = guiCreateFont( "password.ttf", 10 ) guiSetFont( edtRegPass, myFont ) guiSetFont( edtRePass, myFont ) guiEditSetMaxLength(edtReUser, 50) guiEditSetMaxLength(edtRegPass, 50) guiEditSetMaxLength(edtRePass, 50) X = 0.05 Y = 0.8 Width = 0.9 Height = 0.15 btnRegister = guiCreateButton(X, Y, Width, Height, "Register", true, tabRegister) guiSetVisible(wdwLogin, false) addEventHandler( "onClientGUIClick", btnLogin, clientSubmitLogin, false ) addEventHandler( "onClientGUIClick", btnRegister, clientSubmitRegister, false ) end addEvent("succesRegister", true) addEventHandler("succesRegister", resourceRoot, function(password) guiSetInputEnabled( false ) guiSetVisible( wdwLogin, false ) showCursor( false ) outputChatBox("* You have registeres succesfuly! Your password is: "..password, 0, 255, 0) end ) function clientSubmitRegister(button, state) if button == "left" and state == "up" then local username = guiGetText(edtReUser) local password = guiGetText(edtRegPass) local repass = guiGetText(edtRePass) if username and password then triggerServerEvent( "submitRegister", localPlayer, username, password, repass ) end end end function clientSubmitLogin( button,state ) if button == "left" and state == "up" then local username = guiGetText( edtUser ) local password = guiGetText( edtPass ) if username and password then triggerServerEvent( "submitLogin", localPlayer, username, password ) guiSetInputEnabled( false) guiSetVisible( wdwLogin, false) showCursor( false ) else outputChatBox("Please enter a username and password.") end end end addEventHandler( "onClientResourceStart", resourceRoot, function ( ) createLoginRegisterGUI( ) outputChatBox( "Welcome to My MTA:SA Server." ) if wdwLogin then guiSetVisible( wdwLogin, true ) else outputChatBox( "An unexpected error has occurred and the log in GUI has not been created." ) end showCursor( true ) guiSetInputEnabled( true ) end ) addEventHandler( "falseLogin", root, function( ) guiSetInputEnabled( true ) guiSetVisible( wdwLogin, true ) showCursor( true ) end ) login_register (server) local spawnX, spawnY, spawnZ = 1959.55, -1714.46, 20 addEvent( "submitLogin", true ) addEvent( "submitRegister", true) function loginHandler(username, password ) local password2=whirlpool(password) local result = mysql_query( mysqldb, "SELECT * FROM players WHERE username = '"..username.. "' AND pass = '"..password2.. "'" ) if not result then outputDebugString( "EVENT:submitLogin mysql_query failed: (" .. tostring( mysql_errno( mysqldb ) ).. ") " ..tostring( mysql_error( mysqldb ) ) ) else if mysql_num_rows( result ) > 0 then fadeCamera(source, true) setCameraTarget(source, source) outputChatBox( "Welcome to My Server.", source ) triggerEvent("playerDataLoad", resourceRoot, source, username) else outputChatBox( "Invalid username and password. Please try again.",source, 255, 0, 0) triggerClientEvent ( "falseLogin", root ) end mysql_free_result( result ) end end function registerHandler(user, pass, repass ) local result = mysql_query( mysqldb, "SELECT * FROM players WHERE username = '"..user.."'" ) if not result then outputDebugString( "EVENT:submitRegister mysql_query failed: (" .. tostring( mysql_errno( mysqldb ) ).. ") " ..tostring( mysql_error( mysqldb ) ) ) else if mysql_num_rows( result ) > 0 then outputChatBox( "Username which you selected already exists!",source, 255, 0, 0 ) else if pass == repass then local pass2 = whirlpool(pass) local Result = mysql_query( mysqldb, "INSERT INTO players (username, pass) VALUES ('"..user.."', '"..pass2.."')" ) if Result then mysql_free_result( Result ) fadeCamera(source, true) setCameraTarget(source, source) spawnPlayer(source, spawnX, spwanY, spawnZ) setElementData(source, "pMoney", get("PlayerStartingMoney")) givePlayerMoney(source, get("PlayerStartingMoney")) triggerClientEvent(source, "succesRegister", root, pass) else outputDebugString( "Register not succes: mysql_query failed: (" .. tostring( mysql_errno( mysqldb ) ).. ") " ..tostring( mysql_error( mysqldb ) ) ) end else outputChatBox( "Passwords dosen't match. Please re-enter passwords!",source, 255, 0, 0 ) end end mysql_free_result( result ) end end addEventHandler( "submitRegister", root, registerHandler ) addEventHandler( "submitLogin", root, loginHandler ) MySQL callings are right. Inputs in database appears. I think I messed whit triggering events
Kenix Posted February 13, 2012 Posted February 13, 2012 Try Server addEvent( "playerDataLoad", true ) function playerDataLoading( username ) local result = mysql_query( mysqldb, "Select * From players where username = '"..username.."'" ) if not result then outputDebugString( "EVENT:playerDataLoading mysql_query failed: (" .. tostring( mysql_errno( mysqldb ) ).. ") " ..tostring( mysql_error( mysqldb ) ) ) return end setElementData( source, "playerUsername", username ) spawnPlayer( source, 0, 0, 3) mysql_free_result( result ) end function playerDataSaving( ) if get "AutoSaveOnQuit" then local posX, posY, posZ = getElementPosition( source ) mysql_query( mysqldb, "Update players Set pos_X = "..posX..", pos_Y = "..posY..",\ pos_Z = "..posZ.." Where username = '"..tostring( getElementData( source, "playerUsername" ) ).."'" ) end end addEventHandler( "onPlayerQuit", root, playerDataSaving ) addEventHandler( "playerDataLoad", root, playerDataLoading ) Login local spawnX, spawnY, spawnZ = 1959.55, -1714.46, 20 addEvent( "submitLogin", true ) addEvent( "submitRegister", true) function loginHandler(username, password ) local password2 = whirlpool( password ) local result = mysql_query( mysqldb, "SELECT * FROM players WHERE username = '"..username.. "' AND pass = '"..password2.. "'" ) if not result then outputDebugString( "EVENT:submitLogin mysql_query failed: (" .. tostring( mysql_errno( mysqldb ) ).. ") " ..tostring( mysql_error( mysqldb ) ) ) else if mysql_num_rows( result ) > 0 then fadeCamera( source, true ) setCameraTarget( source, source ) outputChatBox( "Welcome to My Server.", source ) triggerEvent( "playerDataLoad", source, username ) else outputChatBox( "Invalid username and password. Please try again.",source, 255, 0, 0) triggerClientEvent ( "falseLogin", root ) end mysql_free_result( result ) end end function registerHandler(user, pass, repass ) local result = mysql_query( mysqldb, "SELECT * FROM players WHERE username = '"..user.."'" ) if not result then outputDebugString( "EVENT:submitRegister mysql_query failed: (" .. tostring( mysql_errno( mysqldb ) ).. ") " ..tostring( mysql_error( mysqldb ) ) ) else if mysql_num_rows( result ) > 0 then outputChatBox( "Username which you selected already exists!",source, 255, 0, 0 ) else if pass == repass then local pass2 = whirlpool( pass ) local Result = mysql_query( mysqldb, "INSERT INTO players (username, pass) VALUES ('"..user.."', '"..pass2.."')" ) if Result then mysql_free_result( Result ) fadeCamera( source, true ) setCameraTarget( source, source ) spawnPlayer( source, spawnX, spwanY, spawnZ ) setElementData( source, "pMoney", get( "PlayerStartingMoney" ) ) givePlayerMoney( source, get( "PlayerStartingMoney" ) ) triggerClientEvent( source, "succesRegister", root, pass ) else outputDebugString( "Register not succes: mysql_query failed: (" .. tostring( mysql_errno( mysqldb ) ).. ") " ..tostring( mysql_error( mysqldb ) ) ) end else outputChatBox( "Passwords dosen't match. Please re-enter passwords!",source, 255, 0, 0 ) end end mysql_free_result( result ) end end addEventHandler( "submitRegister", root, registerHandler ) addEventHandler( "submitLogin", root, loginHandler )
matucha123 Posted February 13, 2012 Author Posted February 13, 2012 Ok, its works with login, but register isnt working... Could you explain then I should use "source" "root" "resourceRoot" and etc? I dont get this part...
Kenix Posted February 13, 2012 Posted February 13, 2012 Remember lua is case sensitive. Example var = 5 print( var ) -- 5 print( Var ) -- nil So your code: function playerDataLoading(thePlayer, username) -- in argument thePlayer local result = mysql_query(mysqldb, "Select * From players where username='"..username.."'") if not result then outputDebugString( "EVENT:playerDataLoading mysql_query failed: (" .. tostring( mysql_errno( mysqldb ) ).. ") " ..tostring( mysql_error( mysqldb ) ) ) mysql_free_result(result) return end local field = mysql_fetch_field(result) setElementData(thePlayer, "playerUsername", username) spawnPlayer(theplayer, 0, 0, 3) -- theplayer is nil mysql_free_result(result) end Events: I always see how scripters triggered some event Example: -- wrong code -- Server addCommandHandler( 'some', function( player ) triggerClientEvent( 'some',root,player ) --[[ So it triggered base element root ( instead of source player ) ( see on wiki ) then player element Why? If 2 argument is base element and not need triggered next optional arguments. ]] end ) -- Client addEvent( 'some',true ) addEventHandler( 'some',root, function( player ) -- why need use player? If you trigger source event ( not root ) you can use source in event. local x,y,z = getElementPosition( player ) createExplosion( x,y,z,4 ) end ) -- correct -- Server addCommandHandler( 'some', function( player ) triggerClientEvent( 'some',player ) end ) -- Client addEvent( 'some',true ) addEventHandler( 'some',root, function( ) local x,y,z = getElementPosition( source ) createExplosion( x,y,z,4 ) end ) --[[ This examples triggered for all elements( root ) ]] Your code triggerEvent("playerDataLoad", resourceRoot, source, username) You triggered base element resource root and then source and then username , but why? You can trigger base element source ( source player ) and then username. https://wiki.multitheftauto.com/wiki/Pre ... ables_list https://wiki.multitheftauto.com/wiki/Event_system
matucha123 Posted February 13, 2012 Author Posted February 13, 2012 And one more question. How can I see element tree? I can't understand Wiki...
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