Yasuoo Posted February 19, 2019 Share Posted February 19, 2019 need help [19-02-19 17:35:37] ERROR: [core]/server/Server/server.lua:150: attempt to get length of a boolean value Spoiler -- Positions for the matrix view for the login screen local matrixViewPositions = { {2060.693359375, 1323.3287353516, 65.554336547852, 2154.0563964844, 1301.9788818359, 36.787712097168}, {-488.73297119141, 2129.7478027344, 131.07089233398, -577.43792724609, 2095.4423828125, 100.17473602295}, {355.38235473633, -1999.6640625, 34.214122772217, 401.36798095703, -2077.3337402344, -8.8294067382813}, {2373.4975585938, 69.472595214844, 68.322166442871, 2420.0559082031, -10.329551696777, 30.060695648193}, {2055.7841796875, 1197.9633789063, 25.738883972168, 2141.7668457031, 1147.1596679688, 20.643169403076}, {2321.8068847656, -1100.53125, 76.947044372559, 2365.5268554688, -1017.3639526367, 42.716026306152}, {-807.52880859375, 2699.8017578125, 75.263061523438, -853.92779541016, 2777.5541992188, 32.816757202148}, {196.63110351563, 2660.5759277344, 53.300601959229, 262.5549621582, 2594.3989257813, 17.598323822021}, {-458.94390869141, -164.11698913574, 123.5959777832, -548.6953125, -195.21823120117, 92.332641601563}, {-1070.3149414063, -1610.5084228516, 94.326530456543, -1135.0595703125, -1682.0073242188, 67.944076538086}, {-632.33306884766, -1473.3518066406, 44.557136535645, -545.33532714844, -1492.6140136719, -0.833984375}, {270.52749633789, -1205.0640869141, 110.60611724854, 321.99029541016, -1128.5759277344, 71.861503601074}, {1156.4423828125, -1441.9432373047, 38.343357086182, 1086.1207275391, -1504.4560546875, 4.4757308959961}, {-1267.3508300781, 1106.96484375, 102.32939910889, -1311.2535400391, 1019.9342041016, 80.008575439453}, {-2662.2238769531, 2242.8115234375, 89.52938079834, -2584.8740234375, 2297.583984375, 57.639293670654}, } local antisaveTimers = {} local loggingIn = {} -- Create teams and set time addEventHandler ( "onResourceStart", resourceRoot, function () setGameType( "CSG V"..getCSGServerVersion() ) setOcclusionsEnabled( false ) createTeam("Staff",255,255,255) local query = exports.DENmysql:query("SELECT * FROM teams ORDER BY list ASC") for k,v in ipairs(query) do createTeam(v["name"],v["cR"],v["cG"],v["cB"]) end local realtime = getRealTime() setTime( realtime.hour, realtime.minute ) setMinuteDuration( 60000 ) setServerPassword("") --set the password to nothing if any password is set. end ) addEventHandler("onResourceStop",resourceRoot, function() setServerPassword(math.random(1239871)) --set a password so that no one can connect back on while the kicking process continues. for k,v in ipairs(getElementsByType("player")) do kickPlayer(v,"Core","Core Stopping / Restarting...") end end) -- Check if there is not already a player ingame with the same serial addEventHandler( "onPlayerConnect", root, function ( playerNick, playerIP, playerUsername, playerSerial, playerVersionNumber ) for k, thePlayer in pairs ( getElementsByType ( "player" ) ) do if ( getPlayerSerial( thePlayer ) == playerSerial ) then cancelEvent( true, "There is already a player online with this serial!" ); return end end end ) -- When the player joins spawn him ingame addEventHandler( "onPlayerJoin", root, function () if ( spawnPlayer( source, 0, 0, 0 ) ) then setCameraTarget ( source ) fadeCamera( source, true, 1.0, 0, 0, 0 ) startMatrix(source) showPlayerHudComponent ( source, "radar", false ) showPlayerHudComponent ( source, "area_name", false ) setElementDimension ( source, 1234 ) showChat( source, false ) end end ) local refreshTimers = {} function startMatrix(player) if (isElement(player)) then if (exports.server:isPlayerLoggedIn(player) == false) then fadeCamera(player, false,1.0,0,0,0) setTimer(fadeCamera,1000,1,player, true) local x, y, z, lx, ly, lz = unpack( matrixViewPositions[ math.random ( #matrixViewPositions ) ] ) setTimer(setCameraMatrix,1000,1,player, x, y, z, lx, ly, lz ) refreshTimers[player] = setTimer(startMatrix,5000,1, player) else if (isTimer(refreshTimers[player])) then killTimer(refreshTimers[player]) end return false --no more updating. end else return false end end -- Kick the player when he has a too low resolution --[[addEvent( "doKickPlayer", true ) addEventHandler( "doKickPlayer", root, function () kickPlayer( source, "Connection refused due a too low screen resolution" ) end )]]-- -- When the player spawns check if we show the login screen or draw a ban window addEvent( "doSpawnPlayer", true ) addEventHandler( "doSpawnPlayer", root, function () local time = getRealTime() local banData = exports.DENmysql:query( "SELECT banstamp,bannedby,reason,serial FROM bans WHERE serial=? LIMIT 1", getPlayerSerial( source ) ) if banData and banData[1] then if ( time.timestamp > tonumber( banData[1].banstamp ) ) and not ( tonumber( banData[1].banstamp ) == 0 ) then exports.DENmysql:exec( "DELETE FROM bans WHERE serial = ?", getPlayerSerial( source ) ) triggerClientEvent( source, "setLoginWindowVisable", source ) else setElementData( source, "Occupation", "Banned" ) triggerClientEvent( source, "drawClientBanScreen", source, banData[1].serial, banData[1].reason, banData[1].banstamp, banData.bannedby ) toggleAllControls(source,false) end else triggerClientEvent( source, "setLoginWindowVisable", source ) end end ) -- Timestap convert function timestampConvert ( timeStamp ) local time = getRealTime(timeStamp) local year = time.year + 1900 local month = time.month + 1 local day = time.monthday local hour = time.hour local minute = time.minute return "" .. hour ..":" .. minute .." - " .. month .."/" .. day .."/" .. year .."" end -- When the player creates a new account addEvent( "doAccountRegister", true ) addEventHandler( "doAccountRegister", root, function ( username, password1, password2, email, genderMale, genderFemale ) if ( exports.DENmysql:querySingle( "SELECT username FROM accounts WHERE username=? LIMIT 1", string.lower( username ) ) ) then triggerClientEvent( source, "setWarningLabelText", source, "This username is already taken!", "registerWindow", 225, 0, 0 ) elseif ( #exports.DENmysql:query( "SELECT * FROM accounts WHERE serial = ?", getPlayerSerial( source ) ) >= 2 ) then triggerClientEvent( source, "setWarningLabelText", source, "You can only register 2 accounts for each serial!", "registerWindow", 225, 0, 0 ) else if ( genderFemale ) then theGender = 93 else theGender = 0 end if ( exports.DENmysql:exec( "INSERT INTO accounts SET username=?, password=?, email=?, serial=?, skin=?", string.lower( username ), email, getPlayerSerial( source ), theGender ) ) then local userData = exports.DENmysql:querySingle( "SELECT * FROM accounts WHERE username=? AND password=? LIMIT 1", string.lower( username ) ) exports.DENmysql:exec("INSERT INTO weapons SET userid=?", tonumber( userData.id ) ) exports.DENmysql:exec("INSERT INTO playerstats SET userid=?", tonumber( userData.id ) ) triggerClientEvent( source, "setPopupWindowVisable", source ) end end end ) -- When the player password changed function onPasswordRequestCallback () -- callBack functie after password is changed nothing important though end -- Password reset function addEvent( "doPlayerPasswordReset", true ) addEventHandler( "doPlayerPasswordReset", root, function ( email, username, newPassword ) local userData= exports.DENmysql:querySingle( "SELECT email FROM accounts WHERE username = ? LIMIT 1", string.lower(username) ) if ( userData ) then if ( userData.email == "" ) or ( userData.email == " " ) then triggerClientEvent( source, "setWarningLabelText", source, "No email found with this account!", "passwordWindow", 225, 0, 0 ) elseif not ( string.match(tostring( userData.email ), "^.+@.+%.%a%a%a*%.*%a*%a*%a*") )then triggerClientEvent( source, "setWarningLabelText", source, "You didn't enter a vaild email adress!", "passwordWindow", 225, 0, 0 ) elseif not ( string.lower( userData.email ) == string.lower(email) ) then triggerClientEvent( source, "setWarningLabelText", source, "The email with this account doesn't match!", "passwordWindow", 225, 0, 0 ) else if ( exports.DENmysql:exec( "UPDATE accounts SET password=? WHERE username=? AND email=?", sha512(newPassword), string.lower(username), email ) ) then callRemote( "http://csgmta.net/mail/password.php", onPasswordRequestCallback, username, email, newPassword ) exports.DENdxmsg:createNewDxMessage(source, "Your password is changed and sent to your email!", 0, 225, 0) triggerClientEvent( source, "setWarningLabelText", source, "A new password has been sent!", "passwordWindow", 225, 0, 0 ) triggerClientEvent ( source, "setLoginWindowVisable", source ) end end else triggerClientEvent( source, "setWarningLabelText", source, "No account found with this name!", "passwordWindow", 225, 0, 0 ) end end ) -- When the player send the login forum addEvent( "doPlayerLogin", true ) addEventHandler( "doPlayerLogin", root, function ( username, password, usernameTick, passwordTick ) if not (exports.DENmysql:getConnection()) then triggerClientEvent(source,"setWarningLabelText",source,"Database is down! Please contact a developer!","loginWindow",255,0,0) return false end local accountID = false local idQuery = exports.DENmysql:query("SELECT id FROM accounts WHERE username=? LIMIT 1",username:lower()) if idQuery and #idQuery == 1 then accountID = idQuery[1].id end if not accountID then triggerClientEvent( source, "setWarningLabelText", source, "Wrong username and/or password!", "loginWindow", 225, 0, 0 ) triggerClientEvent(source,"toggleLoginButton",source,true) return end if ( #exports.DENmysql:query( "SELECT id FROM accounts WHERE id=? AND password=? LIMIT 1", accountID, md5( password ) ) == 1 ) then -- If the password is a MD5 passwoard from the old system then force the player to change it triggerClientEvent( source, "setWarningLabelText", source, "Unable to login, please change password first!", "loginWindow", 225, 0, 0 ) triggerClientEvent( source, "setNewPasswordWindowVisable", source ) setElementData( source, "temp:UsernameData", string.lower( username ) ) setElementData( source, "temp:PasswordData", md5( password ) ) elseif ( #exports.DENmysql:query( "SELECT id FROM accounts WHERE id=? AND password=? LIMIT 1", accountID, ( password ) ) == 1 ) then -- If the password is correct and a SHA512 password then log the player in --exports.irc:outputIRC(tostring(loggingIn[username])) if (loggingIn[username] == nil) then loggingIn[username] = true --set this true to prevent it from logging in again --exports.irc:outputIRC(username.." login stored.") elseif (loggingIn[username] == true) then --exports.irc:outputIRC(username.." was refused login since he spammed the :~ out of login.") return false else --exports.irc:outputIRC("Something :Oed up, blame Priyen!") --exports.irc:outputIRC(tostring(loggingIn[username])) end local banData = exports.DENmysql:query( "SELECT banstamp FROM bans WHERE username=? LIMIT 1", username:lower() ) if ( banData and #banData == 1 ) then if ( banData[1].banstamp == 0 ) then triggerClientEvent( source, "setWarningLabelText", source, "This account is Permanently Banned from the server!", "loginWindow", 225, 0, 0 ) elseif ( getRealTime().timestamp < banData[1].banstamp ) then triggerClientEvent( source, "setWarningLabelText", source, "This account is banned from the server til: "..timestampConvert( banData[1].banstamp ), "loginWindow", 225, 0, 0 ) elseif ( banData[1].banstamp > 0 ) and ( getRealTime().timestamp > banData[1].banstamp ) and ( exports.DENmysql:exec( "DELETE FROM bans WHERE account=?", username:lower() ) ) then triggerClientEvent( source, "setWarningLabelText", source, "Your account is now unbanned! Try again.", "loginWindow", 0, 225, 0 ) end else removeElementData( source, "temp:UsernameData" ) removeElementData( source, "temp:PasswordData" ) triggerClientEvent ( source, "updateAccountXMLData", source, username, password, usernameTick, passwordTick ) local accountData = exports.DENmysql:query( "SELECT * FROM accounts WHERE id=? LIMIT 1", accountID ) local groupData = exports.DENmysql:query( "SELECT groupname,grouprank,groupid FROM groups_members WHERE memberid=? LIMIT 1", accountID ) for k,v in ipairs(getElementsByType("player")) do if (getElementData(v,"accountUserID") == accountData[1].id) then kickPlayer(v,"Accounts",getPlayerName(source).." has logged into your account.") end end exports.DENmysql:exec( "INSERT INTO logins SET serial=?, ip=?, nickname=?, accountname=?", getPlayerSerial( source ), getPlayerIP ( source ), getPlayerName( source ), username ) exports.DENmysql:exec( "UPDATE accounts SET serial=?,IP=? WHERE id=?", getPlayerSerial( source ), getPlayerIP( source ), accountData[1].id ) setPlayerTeam ( source, getTeamFromName(accountData[1].team) ) setElementData( source, "accountUserID", accountID ) setElementData( source, "tempdata.accountUserID", accountID ) setElementData( source, "Occupation", accountData[1].occupation ) setElementData( source, "playerAccount", accountData[1].username ) setElementData( source, "playerEmail", accountData[1].email ) setElementData( source, "playerIP", getPlayerIP ( source ) ) setElementData( source, "joinTick", getTickCount() ) setElementData(source,"playerScore",accountData[1].score) setElementData( source, "carLicence", true ) setElementData( source, "planeLicence", true ) setElementData( source, "bikeLicence", true ) setElementData( source, "chopperLicence", true ) setElementData( source, "boatLicence", true ) if ( groupData and #groupData == 1 ) then setElementData( source, "Group", groupData[1].groupname ) setElementData( source, "GroupRank", groupData[1].grouprank ) setElementData( source, "GroupID", tonumber(groupData[1].groupid) ) end if ( tonumber(accountData[1].premium) < 1 ) then setElementData( source, "isPlayerPremium", false ) setElementData( source, "Premium", "No" ) setElementData(source,"premiumType",accountData[1].premiumType) else setElementData( source, "isPlayerPremium", true ) setElementData( source, "Premium", "Yes" ) setElementData(source,"premiumType",accountData[1].premiumType) end setElementData( source, "playTime", accountData[1].playtime ) triggerClientEvent( source, "setAllWindowsHided", source ) triggerClientEvent( source, "clientPlayerLogin", source, accountData[1].id, username ) fadeCamera( source, false, 1.0, 0, 0, 0 ) setTimer( fadeCamera, 2000, 1, source, true, 1.0, 0, 0, 0 ) setTimer( createPlayerElementIntoGame, 1000, 1, source, accountData[1] ) antisaveTimers[source] = setTimer(allowSaving,10000,1,source) triggerEvent( "onPlayerLogin", source ) loggingIn[username] = nil end else -- If the password is wrong triggerClientEvent( source, "setWarningLabelText", source, "Wrong username and/or password!", "loginWindow", 225, 0, 0 ) triggerClientEvent(source,"toggleLoginButton",source,true) end end ) function allowSaving(player) if (isElement(player)) then antisaveTimers[source] = nil end end -- Change password addEvent( "onPlayerUpdatePasswords", true ) addEventHandler( "onPlayerUpdatePasswords", root, function ( password ) if ( getElementData( source, "temp:UsernameData" ) ) then if ( exports.DENmysql:exec( "UPDATE accounts SET password=? WHERE username=?", sha512( password ), getElementData( source, "temp:UsernameData" ) ) ) then triggerClientEvent ( source, "setLoginWindowVisable", source ) exports.DENdxmsg:createNewDxMessage( thePlayer, "Your password is changed!", 0, 225, 0 ) else triggerClientEvent ( source, "setLoginWindowVisable", source ) exports.DENdxmsg:createNewDxMessage( thePlayer, "We couldn't change your password try again!", 225, 0, 0 ) end else triggerClientEvent ( source, "setLoginWindowVisable", source ) exports.DENdxmsg:createNewDxMessage( thePlayer, "We couldn't change your password try again!", 225, 0, 0 ) end end ) -- Spawn the player into the world function createPlayerElementIntoGame ( thePlayer, dataTable ) if ( exports.server:isPlayerLoggedIn( thePlayer ) ) then local playerID = exports.server:getPlayerAccountID( thePlayer ) exports.DENdxmsg:createNewDxMessage( thePlayer, "Welcome back to CSG " .. getPlayerName( thePlayer ) .. "!", 238, 154, 0 ) setCameraTarget( thePlayer, thePlayer ) showChat( thePlayer, true ) showPlayerHudComponent ( thePlayer, "radar", true ) showPlayerHudComponent ( thePlayer, "area_name", true ) if ( dataTable.team == "Criminals" ) or ( dataTable.team == "Unemployed" ) or ( dataTable.team == "Unoccupied" ) then spawnPlayer( thePlayer, dataTable.x, dataTable.y, dataTable.z +1, dataTable.rotation, dataTable.skin, dataTable.interior, dataTable.dimension, dataTable.team ) else spawnPlayer( thePlayer, dataTable.x, dataTable.y, dataTable.z +1, dataTable.rotation, dataTable.jobskin, dataTable.interior, dataTable.dimension, dataTable.team ) end local CJCLOTTable = fromJSON( tostring( dataTable.cjskin ) ) if CJCLOTTable then for theType, index in pairs( CJCLOTTable ) do local texture, model = getClothesByTypeIndex ( theType, index ) addPedClothes ( thePlayer, texture, model, theType ) end end local weapons = fromJSON( dataTable.weapons ) if ( weapons ) then for weapon, ammo in pairs( weapons ) do if not ( tonumber(weapon) == 36 ) and not ( tonumber(weapon) == 37 ) and not ( tonumber(weapon) == 38 ) and not ( tonumber(weapon) == 18 ) then giveWeapon( thePlayer, tonumber(weapon), tonumber(ammo) ) end end end local playerStatus = exports.DENmysql:querySingle( "SELECT * FROM playerstats WHERE userid=? LIMIT 1", playerID ) if ( playerStatus ) then local wepSkills = fromJSON( playerStatus.weaponskills ) if ( wepSkills ) then for skillint, valueint in pairs( wepSkills ) do if ( tonumber(valueint) > 950 ) then setPedStat ( thePlayer, tonumber(skillint), 995 ) else setPedStat ( thePlayer, tonumber(skillint), tonumber(valueint) ) end end end end if ( dataTable.health == 0 ) then killPed( thePlayer ) else setElementHealth( thePlayer, tonumber( dataTable.health ) ) end exports.DENmysql:exec( "UPDATE groups_members SET lastonline=? WHERE memberid=?", getRealTime().timestamp, playerID ) setPedArmor( thePlayer, tonumber( dataTable.armor ) ) setPlayerMoney( thePlayer, tonumber( dataTable.money ) ) setPedFightingStyle ( thePlayer, tonumber( dataTable.fightstyle ) ) setElementData ( thePlayer, "isPlayerLoggedin", true ) setElementData ( thePlayer, "wantedPoints", tonumber( dataTable.wanted ) ) local jailData = exports.DENmysql:querySingle("SELECT * FROM jail WHERE userid=? LIMIT 1",dataTable.id) if (jailData) then triggerClientEvent( thePlayer, "onSetPlayerJailed", thePlayer, jailData.jailtime ) end triggerEvent ( "onServerPlayerLogin", thePlayer, playerID, dataTable.username ) exports.DENvehicles:reloadFreeVehicleMarkers( thePlayer ) end end function getCSGServerVersion() query = exports.DENmysql:querySingle("SELECT value FROM settings WHERE settingName=? LIMIT 1","serverVersion") if (query) then return query["value"] else return "2.1.4" end end addEvent("updatePlayerFPS",true) addEventHandler("updatePlayerFPS",root, function(fps) if (isElement(source)) and fps then setElementData(source,"FPS",fps) end end) --[[function updatePlayerTeamToElementData() for k,v in ipairs(getElementsByType("player")) do team = getPlayerTeam(v) if (team = nil) then setElementData(v,"playerTeam",team) outputDebugString(getTeamFromName(team)) end end end setTimer(updatePlayerTeamToElementData,2000,0)]]-- function isAllowedToSave(player) if (isTimer(antisaveTimers[player])) then return false else return true end end Link to comment
Addlibs Posted February 19, 2019 Share Posted February 19, 2019 (edited) This is line 150: elseif ( #exports.DENmysql:query( "SELECT * FROM accounts WHERE serial = ?", getPlayerSerial( source ) ) >= 2 ) then The problem is simple. The query exports.DENmysql:query( "SELECT * FROM accounts WHERE serial = ?", getPlayerSerial(source)) failed and returned a boolean instead of a table, thus the # (length operator) raised an error. P.S. Use code blocks next time. It's very unhelpful to share code without line numbers. Also, you should provide more info as well. Saying "need help" isn't going to attract people willing to help. Also, share only relevant lines of the code, please? It's annoying to have to scroll through 400 lines of code when we're just interested in 1 line. Edited February 19, 2019 by MrTasty Link to comment
Yasuoo Posted February 20, 2019 Author Share Posted February 20, 2019 15 hours ago, MrTasty said: This is line 150: elseif ( #exports.DENmysql:query( "SELECT * FROM accounts WHERE serial = ?", getPlayerSerial( source ) ) >= 2 ) then The problem is simple. The query exports.DENmysql:query( "SELECT * FROM accounts WHERE serial = ?", getPlayerSerial(source)) failed and returned a boolean instead of a table, thus the # (length operator) raised an error. P.S. Use code blocks next time. It's very unhelpful to share code without line numbers. Also, you should provide more info as well. Saying "need help" isn't going to attract people willing to help. Also, share only relevant lines of the code, please? It's annoying to have to scroll through 400 lines of code when we're just interested in 1 line. im really sorry i dont understand that scripts but im a well owner . i have little bit experience in LUA scripts and if you can help as a devoloper that will be so good thanks Link to comment
Discord Moderators Pirulax Posted February 23, 2019 Discord Moderators Share Posted February 23, 2019 -- Positions for the matrix view for the login screen local matrixViewPositions = { {2060.693359375, 1323.3287353516, 65.554336547852, 2154.0563964844, 1301.9788818359, 36.787712097168}, {-488.73297119141, 2129.7478027344, 131.07089233398, -577.43792724609, 2095.4423828125, 100.17473602295}, {355.38235473633, -1999.6640625, 34.214122772217, 401.36798095703, -2077.3337402344, -8.8294067382813}, {2373.4975585938, 69.472595214844, 68.322166442871, 2420.0559082031, -10.329551696777, 30.060695648193}, {2055.7841796875, 1197.9633789063, 25.738883972168, 2141.7668457031, 1147.1596679688, 20.643169403076}, {2321.8068847656, -1100.53125, 76.947044372559, 2365.5268554688, -1017.3639526367, 42.716026306152}, {-807.52880859375, 2699.8017578125, 75.263061523438, -853.92779541016, 2777.5541992188, 32.816757202148}, {196.63110351563, 2660.5759277344, 53.300601959229, 262.5549621582, 2594.3989257813, 17.598323822021}, {-458.94390869141, -164.11698913574, 123.5959777832, -548.6953125, -195.21823120117, 92.332641601563}, {-1070.3149414063, -1610.5084228516, 94.326530456543, -1135.0595703125, -1682.0073242188, 67.944076538086}, {-632.33306884766, -1473.3518066406, 44.557136535645, -545.33532714844, -1492.6140136719, -0.833984375}, {270.52749633789, -1205.0640869141, 110.60611724854, 321.99029541016, -1128.5759277344, 71.861503601074}, {1156.4423828125, -1441.9432373047, 38.343357086182, 1086.1207275391, -1504.4560546875, 4.4757308959961}, {-1267.3508300781, 1106.96484375, 102.32939910889, -1311.2535400391, 1019.9342041016, 80.008575439453}, {-2662.2238769531, 2242.8115234375, 89.52938079834, -2584.8740234375, 2297.583984375, 57.639293670654}, } local antisaveTimers = {} local loggingIn = {} -- Create teams and set time addEventHandler ( "onResourceStart", resourceRoot, function () setGameType( "CSG V"..getCSGServerVersion() ) setOcclusionsEnabled( false ) createTeam("Staff",255,255,255) local query = exports.DENmysql:query("SELECT * FROM teams ORDER BY list ASC") for k,v in ipairs(query) do createTeam(v["name"],v["cR"],v["cG"],v["cB"]) end local realtime = getRealTime() setTime( realtime.hour, realtime.minute ) setMinuteDuration( 60000 ) setServerPassword("") --set the password to nothing if any password is set. end ) addEventHandler("onResourceStop",resourceRoot, function() setServerPassword(math.random(1239871)) --set a password so that no one can connect back on while the kicking process continues. for k,v in ipairs(getElementsByType("player")) do kickPlayer(v,"Core","Core Stopping / Restarting...") end end) -- Check if there is not already a player ingame with the same serial addEventHandler( "onPlayerConnect", root, function ( playerNick, playerIP, playerUsername, playerSerial, playerVersionNumber ) for k, thePlayer in pairs ( getElementsByType ( "player" ) ) do if ( getPlayerSerial( thePlayer ) == playerSerial ) then cancelEvent( true, "There is already a player online with this serial!" ); return end end end ) -- When the player joins spawn him ingame addEventHandler( "onPlayerJoin", root, function () if ( spawnPlayer( source, 0, 0, 0 ) ) then setCameraTarget ( source ) fadeCamera( source, true, 1.0, 0, 0, 0 ) startMatrix(source) showPlayerHudComponent ( source, "radar", false ) showPlayerHudComponent ( source, "area_name", false ) setElementDimension ( source, 1234 ) showChat( source, false ) end end ) local refreshTimers = {} function startMatrix(player) if (isElement(player)) then if (exports.server:isPlayerLoggedIn(player) == false) then fadeCamera(player, false,1.0,0,0,0) setTimer(fadeCamera,1000,1,player, true) local x, y, z, lx, ly, lz = unpack( matrixViewPositions[ math.random ( #matrixViewPositions ) ] ) setTimer(setCameraMatrix,1000,1,player, x, y, z, lx, ly, lz ) refreshTimers[player] = setTimer(startMatrix,5000,1, player) else if (isTimer(refreshTimers[player])) then killTimer(refreshTimers[player]) end return false --no more updating. end else return false end end -- Kick the player when he has a too low resolution --[[addEvent( "doKickPlayer", true ) addEventHandler( "doKickPlayer", root, function () kickPlayer( source, "Connection refused due a too low screen resolution" ) end )]]-- -- When the player spawns check if we show the login screen or draw a ban window addEvent( "doSpawnPlayer", true ) addEventHandler( "doSpawnPlayer", root, function () local time = getRealTime() local banData = exports.DENmysql:query( "SELECT banstamp,bannedby,reason,serial FROM bans WHERE serial=? LIMIT 1", getPlayerSerial( source ) ) if banData and banData[1] then if ( time.timestamp > tonumber( banData[1].banstamp ) ) and not ( tonumber( banData[1].banstamp ) == 0 ) then exports.DENmysql:exec( "DELETE FROM bans WHERE serial = ?", getPlayerSerial( source ) ) triggerClientEvent( source, "setLoginWindowVisable", source ) else setElementData( source, "Occupation", "Banned" ) triggerClientEvent( source, "drawClientBanScreen", source, banData[1].serial, banData[1].reason, banData[1].banstamp, banData.bannedby ) toggleAllControls(source,false) end else triggerClientEvent( source, "setLoginWindowVisable", source ) end end ) -- Timestap convert function timestampConvert ( timeStamp ) local time = getRealTime(timeStamp) local year = time.year + 1900 local month = time.month + 1 local day = time.monthday local hour = time.hour local minute = time.minute return "" .. hour ..":" .. minute .." - " .. month .."/" .. day .."/" .. year .."" end -- When the player creates a new account addEvent( "doAccountRegister", true ) addEventHandler( "doAccountRegister", root, function ( username, password1, password2, email, genderMale, genderFemale ) if ( exports.DENmysql:querySingle( "SELECT username FROM accounts WHERE username=? LIMIT 1", string.lower( username ) ) ) then triggerClientEvent( source, "setWarningLabelText", source, "This username is already taken!", "registerWindow", 225, 0, 0 ) elseif ( #exports.DENmysql:query( "SELECT * FROM accounts WHERE serial = ?", getPlayerSerial( source ) ) >= 2 ) then triggerClientEvent( source, "setWarningLabelText", source, "You can only register 2 accounts for each serial!", "registerWindow", 225, 0, 0 ) else if ( genderFemale ) then theGender = 93 else theGender = 0 end if ( exports.DENmysql:exec( "INSERT INTO accounts SET username=?, password=?, email=?, serial=?, skin=?", string.lower( username ), email, getPlayerSerial( source ), theGender ) ) then local userData = exports.DENmysql:querySingle( "SELECT * FROM accounts WHERE username=? AND password=? LIMIT 1", string.lower( username ) ) exports.DENmysql:exec("INSERT INTO weapons SET userid=?", tonumber( userData.id ) ) exports.DENmysql:exec("INSERT INTO playerstats SET userid=?", tonumber( userData.id ) ) triggerClientEvent( source, "setPopupWindowVisable", source ) end end end ) -- When the player password changed function onPasswordRequestCallback () -- callBack functie after password is changed nothing important though end -- Password reset function addEvent( "doPlayerPasswordReset", true ) addEventHandler( "doPlayerPasswordReset", root, function ( email, username, newPassword ) local userData= exports.DENmysql:querySingle( "SELECT email FROM accounts WHERE username = ? LIMIT 1", string.lower(username) ) if ( userData ) then if ( userData.email == "" ) or ( userData.email == " " ) then triggerClientEvent( source, "setWarningLabelText", source, "No email found with this account!", "passwordWindow", 225, 0, 0 ) elseif not ( string.match(tostring( userData.email ), "^.+@.+%.%a%a%a*%.*%a*%a*%a*") )then triggerClientEvent( source, "setWarningLabelText", source, "You didn't enter a vaild email adress!", "passwordWindow", 225, 0, 0 ) elseif not ( string.lower( userData.email ) == string.lower(email) ) then triggerClientEvent( source, "setWarningLabelText", source, "The email with this account doesn't match!", "passwordWindow", 225, 0, 0 ) else if ( exports.DENmysql:exec( "UPDATE accounts SET password=? WHERE username=? AND email=?", sha512(newPassword), string.lower(username), email ) ) then callRemote( "http://csgmta.net/mail/password.php", onPasswordRequestCallback, username, email, newPassword ) exports.DENdxmsg:createNewDxMessage(source, "Your password is changed and sent to your email!", 0, 225, 0) triggerClientEvent( source, "setWarningLabelText", source, "A new password has been sent!", "passwordWindow", 225, 0, 0 ) triggerClientEvent ( source, "setLoginWindowVisable", source ) end end else triggerClientEvent( source, "setWarningLabelText", source, "No account found with this name!", "passwordWindow", 225, 0, 0 ) end end ) -- When the player send the login forum addEvent( "doPlayerLogin", true ) addEventHandler( "doPlayerLogin", root, function ( username, password, usernameTick, passwordTick ) if not (exports.DENmysql:getConnection()) then triggerClientEvent(source,"setWarningLabelText",source,"Database is down! Please contact a developer!","loginWindow",255,0,0) return false end local accountID = false local idQuery = exports.DENmysql:query("SELECT id FROM accounts WHERE username=? LIMIT 1",username:lower()) if idQuery and #idQuery == 1 then accountID = idQuery[1].id end if not accountID then triggerClientEvent( source, "setWarningLabelText", source, "Wrong username and/or password!", "loginWindow", 225, 0, 0 ) triggerClientEvent(source,"toggleLoginButton",source,true) return end if ( #exports.DENmysql:query( "SELECT id FROM accounts WHERE id=? AND password=? LIMIT 1", accountID, md5( password ) ) == 1 ) then -- If the password is a MD5 passwoard from the old system then force the player to change it triggerClientEvent( source, "setWarningLabelText", source, "Unable to login, please change password first!", "loginWindow", 225, 0, 0 ) triggerClientEvent( source, "setNewPasswordWindowVisable", source ) setElementData( source, "temp:UsernameData", string.lower( username ) ) setElementData( source, "temp:PasswordData", md5( password ) ) elseif ( #exports.DENmysql:query( "SELECT id FROM accounts WHERE id=? AND password=? LIMIT 1", accountID, ( password ) ) == 1 ) then -- If the password is correct and a SHA512 password then log the player in --exports.irc:outputIRC(tostring(loggingIn[username])) if (loggingIn[username] == nil) then loggingIn[username] = true --set this true to prevent it from logging in again --exports.irc:outputIRC(username.." login stored.") elseif (loggingIn[username] == true) then --exports.irc:outputIRC(username.." was refused login since he spammed the :~ out of login.") return false else --exports.irc:outputIRC("Something :Oed up, blame Priyen!") --exports.irc:outputIRC(tostring(loggingIn[username])) end local banData = exports.DENmysql:query( "SELECT banstamp FROM bans WHERE username=? LIMIT 1", username:lower() ) if ( banData and #banData == 1 ) then if ( banData[1].banstamp == 0 ) then triggerClientEvent( source, "setWarningLabelText", source, "This account is Permanently Banned from the server!", "loginWindow", 225, 0, 0 ) elseif ( getRealTime().timestamp < banData[1].banstamp ) then triggerClientEvent( source, "setWarningLabelText", source, "This account is banned from the server til: "..timestampConvert( banData[1].banstamp ), "loginWindow", 225, 0, 0 ) elseif ( banData[1].banstamp > 0 ) and ( getRealTime().timestamp > banData[1].banstamp ) and ( exports.DENmysql:exec( "DELETE FROM bans WHERE account=?", username:lower() ) ) then triggerClientEvent( source, "setWarningLabelText", source, "Your account is now unbanned! Try again.", "loginWindow", 0, 225, 0 ) end else removeElementData( source, "temp:UsernameData" ) removeElementData( source, "temp:PasswordData" ) triggerClientEvent ( source, "updateAccountXMLData", source, username, password, usernameTick, passwordTick ) local accountData = exports.DENmysql:query( "SELECT * FROM accounts WHERE id=? LIMIT 1", accountID ) local groupData = exports.DENmysql:query( "SELECT groupname,grouprank,groupid FROM groups_members WHERE memberid=? LIMIT 1", accountID ) for k,v in ipairs(getElementsByType("player")) do if (getElementData(v,"accountUserID") == accountData[1].id) then kickPlayer(v,"Accounts",getPlayerName(source).." has logged into your account.") end end exports.DENmysql:exec( "INSERT INTO logins SET serial=?, ip=?, nickname=?, accountname=?", getPlayerSerial( source ), getPlayerIP ( source ), getPlayerName( source ), username ) exports.DENmysql:exec( "UPDATE accounts SET serial=?,IP=? WHERE id=?", getPlayerSerial( source ), getPlayerIP( source ), accountData[1].id ) setPlayerTeam ( source, getTeamFromName(accountData[1].team) ) setElementData( source, "accountUserID", accountID ) setElementData( source, "tempdata.accountUserID", accountID ) setElementData( source, "Occupation", accountData[1].occupation ) setElementData( source, "playerAccount", accountData[1].username ) setElementData( source, "playerEmail", accountData[1].email ) setElementData( source, "playerIP", getPlayerIP ( source ) ) setElementData( source, "joinTick", getTickCount() ) setElementData(source,"playerScore",accountData[1].score) setElementData( source, "carLicence", true ) setElementData( source, "planeLicence", true ) setElementData( source, "bikeLicence", true ) setElementData( source, "chopperLicence", true ) setElementData( source, "boatLicence", true ) if ( groupData and #groupData == 1 ) then setElementData( source, "Group", groupData[1].groupname ) setElementData( source, "GroupRank", groupData[1].grouprank ) setElementData( source, "GroupID", tonumber(groupData[1].groupid) ) end if ( tonumber(accountData[1].premium) < 1 ) then setElementData( source, "isPlayerPremium", false ) setElementData( source, "Premium", "No" ) setElementData(source,"premiumType",accountData[1].premiumType) else setElementData( source, "isPlayerPremium", true ) setElementData( source, "Premium", "Yes" ) setElementData(source,"premiumType",accountData[1].premiumType) end setElementData( source, "playTime", accountData[1].playtime ) triggerClientEvent( source, "setAllWindowsHided", source ) triggerClientEvent( source, "clientPlayerLogin", source, accountData[1].id, username ) fadeCamera( source, false, 1.0, 0, 0, 0 ) setTimer( fadeCamera, 2000, 1, source, true, 1.0, 0, 0, 0 ) setTimer( createPlayerElementIntoGame, 1000, 1, source, accountData[1] ) antisaveTimers[source] = setTimer(allowSaving,10000,1,source) triggerEvent( "onPlayerLogin", source ) loggingIn[username] = nil end else -- If the password is wrong triggerClientEvent( source, "setWarningLabelText", source, "Wrong username and/or password!", "loginWindow", 225, 0, 0 ) triggerClientEvent(source,"toggleLoginButton",source,true) end end ) function allowSaving(player) if (isElement(player)) then antisaveTimers[source] = nil end end -- Change password addEvent( "onPlayerUpdatePasswords", true ) addEventHandler( "onPlayerUpdatePasswords", root, function ( password ) if ( getElementData( source, "temp:UsernameData" ) ) then if ( exports.DENmysql:exec( "UPDATE accounts SET password=? WHERE username=?", sha512( password ), getElementData( source, "temp:UsernameData" ) ) ) then triggerClientEvent ( source, "setLoginWindowVisable", source ) exports.DENdxmsg:createNewDxMessage( thePlayer, "Your password is changed!", 0, 225, 0 ) else triggerClientEvent ( source, "setLoginWindowVisable", source ) exports.DENdxmsg:createNewDxMessage( thePlayer, "We couldn't change your password try again!", 225, 0, 0 ) end else triggerClientEvent ( source, "setLoginWindowVisable", source ) exports.DENdxmsg:createNewDxMessage( thePlayer, "We couldn't change your password try again!", 225, 0, 0 ) end end ) -- Spawn the player into the world function createPlayerElementIntoGame ( thePlayer, dataTable ) if ( exports.server:isPlayerLoggedIn( thePlayer ) ) then local playerID = exports.server:getPlayerAccountID( thePlayer ) exports.DENdxmsg:createNewDxMessage( thePlayer, "Welcome back to CSG " .. getPlayerName( thePlayer ) .. "!", 238, 154, 0 ) setCameraTarget( thePlayer, thePlayer ) showChat( thePlayer, true ) showPlayerHudComponent ( thePlayer, "radar", true ) showPlayerHudComponent ( thePlayer, "area_name", true ) if ( dataTable.team == "Criminals" ) or ( dataTable.team == "Unemployed" ) or ( dataTable.team == "Unoccupied" ) then spawnPlayer( thePlayer, dataTable.x, dataTable.y, dataTable.z +1, dataTable.rotation, dataTable.skin, dataTable.interior, dataTable.dimension, dataTable.team ) else spawnPlayer( thePlayer, dataTable.x, dataTable.y, dataTable.z +1, dataTable.rotation, dataTable.jobskin, dataTable.interior, dataTable.dimension, dataTable.team ) end local CJCLOTTable = fromJSON( tostring( dataTable.cjskin ) ) if CJCLOTTable then for theType, index in pairs( CJCLOTTable ) do local texture, model = getClothesByTypeIndex ( theType, index ) addPedClothes ( thePlayer, texture, model, theType ) end end local weapons = fromJSON( dataTable.weapons ) if ( weapons ) then for weapon, ammo in pairs( weapons ) do if not ( tonumber(weapon) == 36 ) and not ( tonumber(weapon) == 37 ) and not ( tonumber(weapon) == 38 ) and not ( tonumber(weapon) == 18 ) then giveWeapon( thePlayer, tonumber(weapon), tonumber(ammo) ) end end end local playerStatus = exports.DENmysql:querySingle( "SELECT * FROM playerstats WHERE userid=? LIMIT 1", playerID ) if ( playerStatus ) then local wepSkills = fromJSON( playerStatus.weaponskills ) if ( wepSkills ) then for skillint, valueint in pairs( wepSkills ) do if ( tonumber(valueint) > 950 ) then setPedStat ( thePlayer, tonumber(skillint), 995 ) else setPedStat ( thePlayer, tonumber(skillint), tonumber(valueint) ) end end end end if ( dataTable.health == 0 ) then killPed( thePlayer ) else setElementHealth( thePlayer, tonumber( dataTable.health ) ) end exports.DENmysql:exec( "UPDATE groups_members SET lastonline=? WHERE memberid=?", getRealTime().timestamp, playerID ) setPedArmor( thePlayer, tonumber( dataTable.armor ) ) setPlayerMoney( thePlayer, tonumber( dataTable.money ) ) setPedFightingStyle ( thePlayer, tonumber( dataTable.fightstyle ) ) setElementData ( thePlayer, "isPlayerLoggedin", true ) setElementData ( thePlayer, "wantedPoints", tonumber( dataTable.wanted ) ) local jailData = exports.DENmysql:querySingle("SELECT * FROM jail WHERE userid=? LIMIT 1",dataTable.id) if (jailData) then triggerClientEvent( thePlayer, "onSetPlayerJailed", thePlayer, jailData.jailtime ) end triggerEvent ( "onServerPlayerLogin", thePlayer, playerID, dataTable.username ) exports.DENvehicles:reloadFreeVehicleMarkers( thePlayer ) end end function getCSGServerVersion() query = exports.DENmysql:querySingle("SELECT value FROM settings WHERE settingName=? LIMIT 1","serverVersion") if (query) then return query["value"] else return "2.1.4" end end addEvent("updatePlayerFPS",true) addEventHandler("updatePlayerFPS",root, function(fps) if (isElement(source)) and fps then setElementData(source,"FPS",fps) end end) --[[function updatePlayerTeamToElementData() for k,v in ipairs(getElementsByType("player")) do team = getPlayerTeam(v) if (team = nil) then setElementData(v,"playerTeam",team) outputDebugString(getTeamFromName(team)) end end end setTimer(updatePlayerTeamToElementData,2000,0)]]-- function isAllowedToSave(player) if (isTimer(antisaveTimers[player])) then return false else return true end end there it is 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