Charan

Make player login after finishing download

Recommended Posts

So i play on my server and i put some heavy mods of about 140 mb and my some people who join have bad internet connection and sometimes my upload rate slows down , so the login panel

keeps annoying the hell out of people is there any way i can like to bypass login panel and then open it after player has downloaded?

Share this post


Link to post
6 minutes ago, StormFighter said:

Maybe this can help you.

 

i did something like that ill give you the code 

6 minutes ago, StormFighter said:

Maybe this can help you.

 

Client.LUA
------------------------------------------
-- 		 	  Dx Login Panel			--
------------------------------------------
-- Developer: Braydon Davis	(xXMADEXx)	--
-- File: client.lua						--
-- Copyright 2013 (C) Braydon Davis		--
-- All rights reserved.					--
------------------------------------------

local enableGuest = true;

local sx, sy = guiGetScreenSize ( )
local pX, pY = ( sx / 2 - 485 / 2 ), ( sy / 2 - 231 / 2 )
local username = guiCreateEdit(pX+156, pY+61, 288, 33, "", false)
guiSetVisible ( username, false )
local password = guiCreateEdit(pX+156, pY+121, 288, 33, "", false)
guiSetVisible ( password, false )
guiEditSetMasked(password, true)
local window = guiCreateWindow( ( sx / 2 - 266 / 2 ), ( sy / 2 - 208 / 2 ), 266, 208, "Login Panel Message", false)
guiWindowSetMovable(window, false)
guiWindowSetSizable(window, false)
guiSetVisible ( window, false )
guiSetAlpha ( window, 1 )
local exitBtn = guiCreateButton(155, 162, 101, 36, "Exit", false, window)
local infoLbl = guiCreateLabel(18, 26, 228, 130, "Message", false, window)
local isOpen = false;
local isLoggedin = false;
local data = {
	login = {
		hovering = false,
		alphaMode = false,
		loginTextAlpha = 235,
		colors = { 255, 255, 255 }
	},
	reg = {
		hovering = false,
		alphaMode = false,
		loginTextAlpha = 235,
		colors = { 255, 255, 255 }
	},
	guest = {
		hovering = false,
		alphaMode = false,
		loginTextAlpha = 235,
		colors = { 255, 255, 255 }
	}
}
function dxDrawLoginPanel( )
	-- default: 350, 266
	if ( isOpen ) then
		dxDrawRectangle(pX, pY, 485, 231, tocolor(0, 0, 0, 180), false)
		dxDrawText("Login", pX, pY, 870, 314, tocolor(255, 255, 255, 255), 1.50, "bankgothic", "center", "top", false, false, false, false, false)
		dxDrawLine(pX, pY+48, pX+485, pY+48, tocolor(255, 255, 255, 255), 1, false)
		dxDrawText("Username:", pX+10, pY+69, 506, 368, tocolor(255, 255, 255, 255), 0.80, "bankgothic", "left", "top", false, false, false, false, false)
		dxDrawText("Password:", pX+10, pY+129, 506, 428, tocolor(255, 255, 255, 255), 0.80, "bankgothic", "left", "top", false, false, false, false, false)
		dxDrawLine(pX+281, pY+168, pX+281, pY+168+34, tocolor(255, 255, 255, 255), 1, false)

		local r, g, b = unpack ( data.login.colors )
		dxDrawText("Login", pX+166, pY+167, 600, 468, tocolor( r, g, b, data.login.loginTextAlpha), 1.00, "bankgothic", "left", "top", false, false, false, false, false)
		local r, g, b = unpack ( data.reg.colors )
		dxDrawText("Register", pX+305, pY+167, 794, 468, tocolor(r, g, b, data.reg.loginTextAlpha), 1.00, "bankgothic", "left", "top", false, false, false, false, false)
		
		if ( enableGuest ) then
			local r, g, b = unpack ( data.guest.colors )
			dxDrawText("Guest", pX+40, pY+167, 600, 468, tocolor( r, g, b, data.guest.loginTextAlpha), 1.00, "bankgothic", "left", "top", false, false, false, false, false)
			dxDrawLine(pX+155, pY+168, pX+155, pY+168+34, tocolor(255, 255, 255, 255), 1, false)
		end
		
		-- give fade effect
		if ( data.login.hovering ) then
			data.login.colors = { 255, 140, 0 }
			local alpha = data.login.loginTextAlpha
			if ( not data.login.alphaMode ) then
				data.login.loginTextAlpha = alpha - 5
				if ( data.login.loginTextAlpha <= 50 ) then
					data.login.alphaMode = true
				end
			else
				data.login.loginTextAlpha = alpha + 5
				if ( data.login.loginTextAlpha >= 235 ) then
					data.login.alphaMode = false
				end
			end
		elseif ( data.reg.hovering ) then
			data.reg.colors = { 255, 140, 0 }
			local alpha = data.reg.loginTextAlpha
			if ( not data.reg.alphaMode ) then
				data.reg.loginTextAlpha = alpha - 5
				if ( data.reg.loginTextAlpha <= 50 ) then
					data.reg.alphaMode = true
				end
			else
				data.reg.loginTextAlpha = alpha + 5
				if ( data.reg.loginTextAlpha >= 235 ) then
					data.reg.alphaMode = false
				end
			end
		elseif ( data.guest.hovering ) then
			data.guest.colors = { 255, 140, 0 }
			local alpha = data.guest.loginTextAlpha
			if ( not data.guest.alphaMode ) then
				data.guest.loginTextAlpha = alpha - 5
				if ( data.guest.loginTextAlpha <= 50 ) then
					data.guest.alphaMode = true
				end
			else
				data.guest.loginTextAlpha = alpha + 5
				if ( data.guest.loginTextAlpha >= 235 ) then
					data.guest.alphaMode = false
				end
			end
		else
			data.login.loginTextAlpha = 235
			data.guest.loginTextAlpha = 235
			data.reg.loginTextAlpha = 235
			data.login.colors = { 255, 255, 255 }
			data.guest.colors = { 255, 255, 255 }
			data.reg.colors = { 255, 255, 255 }
		end
	end
end

function cursorMove ( _, _, x, y )
	if ( isCursorShowing ( ) and not guiGetVisible ( window ) and isOpen) then
		if ( y >=  pY+170 and y <=  pY+200 ) then
			if ( x >= pX+161 and x <= pX+251 ) then
				data.login.hovering = true
				return
			elseif ( x >= pX+305 and x <= pX+445 ) then
				data.reg.hovering = true
				return
			elseif ( x >= pX+40 and x <= pX+135 ) then
				data.guest.hovering = true
				return
			end
		end
	end
	data.login.hovering = false
	data.reg.hovering = false
	data.guest.hovering = false
end

function openLogin ( )
	addEventHandler ( "onClientPreRender", root, dxDrawLoginPanel )
	addEventHandler ( 'onClientCursorMove', root, cursorMove )
	addEventHandler ( "onClientClick", root, clientClicking )
	guiSetInputMode ( "no_binds_when_editing" )
	guiSetVisible ( password, true )
	guiSetVisible ( username, true )
	showCursor ( true )
	addEventHandler ( 'onClientGUIClick', root, clientClosingErrorWindowEvent )
	isOpen = true
	showChat(false)
end
addEvent ( "onClientPlayerLogout", true )
addEventHandler ( 'onClientPlayerLogout', root, openLogin )
addEvent ( "onClientFileDownloadComplete", true )
addEventHandler ( "onClientFileDownloadComplete", root, openLogin )

function closeLogin ( )
	removeEventHandler ( "onClientPreRender", root, dxDrawLoginPanel )
	removeEventHandler ( 'onClientCursorMove', root, cursorMove )
	removeEventHandler ( "onClientClick", root, clientClicking )
	guiSetVisible ( password, false )
	guiSetVisible ( username, false )
	showCursor ( false )
	removeEventHandler ( 'onClientGUIClick', root, clientClosingErrorWindowEvent )
	guiSetVisible ( window, false )
	isOpen = false
	isLoggedin = true
	showChat(true)
end
addEvent ( "onClientPlayerLogin", true )
addEventHandler ( "onClientPlayerLogin", root, closeLogin )
addEvent ( "onClientFileDownloadComplete", false )
addEventHandler ( "onClientFileDownloadComplete", root, closeLogin )


function sendError ( msg )
	if ( not guiGetVisible ( window ) ) then
		guiSetVisible ( window, true )
		guiSetText ( infoLbl, msg )
		guiBringToFront ( window )
	end
end
addEvent ( "onPlayerLoginPanelError", true )
addEventHandler ( "onPlayerLoginPanelError", root, sendError )

function clientClicking ( btn, state, x, y )
	if ( btn == 'left' and not guiGetVisible ( window ) and state == 'down' and isOpen ) then
		if ( y >=  pY+170 and y <=  pY+200 ) then
			local user, pass = guiGetText ( username ), guiGetText ( password )
			-- Login Button --
			if ( x >= pX+156 and x <= pX+246 ) then
				if ( string.gsub ( user, ' ', '' ) ~= '' and string.gsub ( pass, ' ', '' ) ~= '' ) then
					if ( string.find ( user, '%s' ) ) then
						return sendError ( "Spaces (' ') are not allowed\nin the username." )
					end if ( string.find ( pass, '%s' ) ) then
						return sendError ( "Spaces (' ') are not allowed\nin the password." )
					end
					triggerServerEvent ( "Login:onClientAttemptLogin", localPlayer, user, pass )
				else
					sendError ( "A username and password are\nrequired to access the server." )
				end

			-- register button
			elseif ( x >= pX+300 and x <= pX+440 ) then
				if ( string.gsub ( user, ' ', '' ) ~= '' and string.gsub ( pass, ' ', '' ) ~= '' ) then
					if ( string.find ( user, '%s' ) ) then
						return sendError ( "Spaces are not allowed\nin the username." )
					end if ( string.find ( pass, '%s' ) ) then
						return sendError ( "Spaces are not allowed\nin the password." )
					end if ( string.len ( user ) < 5 ) then
						return sendError ( "You're username must be at\nleast 5 characters long." )
					end if ( string.len ( pass ) < 6 ) then
						return sendError ( "You're password must be at\nleast 6 characters long." )
					end
					triggerServerEvent ( "Login:onClientAttemptRegistration", localPlayer, user, pass )
				else
					sendError ( "A username and password are\nrequired to access the server." )
				end
				
			-- play as guest
			elseif ( x >= pX+40 and x <= pX+135 ) then
				closeLogin ( )
				triggerServerEvent ( "Login:doClientGuestLogin", localPlayer )
			end
		end
	end
end

function clientClosingErrorWindowEvent( )
	if ( source == exitBtn ) then
		guiSetVisible ( window, false )
	end
end

function isClientLoggedin ( )
	return isLoggedin
end

setTimer ( function ( )
	openLogin ( )
end, 700, 1 )
SERVER.LUA
------------------------------------------
-- 		 	  Dx Login Panel			--
------------------------------------------
-- Developer: Braydon Davis	(xXMADEXx)	--
-- File: server.lua						--
-- Copyright 2013 (C) Braydon Davis		--
-- All rights reserved.					--
------------------------------------------

local cameras = {
	{ 329.10980224609, -2117.2749023438, 50.161201477051, 329.65179443359, -2116.4926757813, 49.853763580322 },
	{ 1266.0053710938, -1965.7087402344, 114.59829711914, 1265.1549072266, -1966.1115722656, 114.25980377197 },
	{ 1514.0283203125, -1716.5743408203, 39.910701751709, 1514.5087890625, -1715.865234375, 39.394691467285 },
	{ 1338.7514648438, -875.66558837891, 99.84880065918, 1339.4935302734, -875.07824707031, 99.52579498291 },
	{ 1426.5421142578, -725.40289306641, 120.97090148926, 1427.3695068359, -725.00805664063, 120.571434021 },
	{ 1357.5914306641, -592.23327636719, 125.15190124512, 1357.1751708984, -593.02673339844, 124.70780944824 },
	{ 988.01123046875, -341.88409423828, 74.752601623535, 988.70251464844, -342.45135498047, 75.200187683105 },
	{ -224.32290649414, -153.71020507813, 35.085899353027, -223.61195373535, -153.04695129395, 34.852146148682 }
}

function openView( plr )
	local theplr = nil
	if ( source and getElementType ( source ) == 'player' ) then
		theplr = source
	elseif ( plr and getElementType ( plr ) == 'player' ) then
		theplr = plr
	end
	setTimer ( function ( p )
		local ind = math.random ( #cameras )
		setCameraMatrix ( p, unpack ( cameras[ind] ) )
	end, 700, 1, theplr )
end
addEventHandler ( "onPlayerJoin", root, openView )
addEventHandler ( "onPlayerLogout", root, openView )
--addCommandHandler ( 'view', openView )

function attemptLogin ( user, pass )
	if ( user and pass and type ( user ) == 'string' and type ( pass ) == 'string' ) then
		--local user = string.lower ( user )
		--local pass = string.lower ( pass )
		local account = getAccount ( user )
		if ( account ) then
			if ( not logIn ( source, account, pass ) ) then
				message ( source, "Incorrect password." )
				return false
			end
			setCameraTarget ( source, source )
			triggerLogin ( source, user, pass )
		else
			message ( source, "Unknown account." )
			return false
		end
	end
	return false
end
addEvent ( "Login:onClientAttemptLogin", true )
addEventHandler ( "Login:onClientAttemptLogin", root, attemptLogin )

function attemptRegister ( user, pass )
	if ( user and pass and type ( user ) == 'string' and type ( pass ) == 'string' ) then
		--local user = string.lower ( user )
		--local pass = string.lower ( pass )
		local account = getAccount ( user )
		if ( not account ) then
			local account = addAccount ( user, pass )
			if ( account ) then
				if ( not logIn ( source, account, pass ) ) then
					return message ( source, "Logging in has failed." )
				end
				setCameraTarget ( source, source )
				triggerLogin ( source, user, pass )
			else
				message ( source, "Adding account failed.\nPlease report to an admin." )
			end
		else
			message ( source, "This account already exists." )
		end
	end
	return false
end
addEvent ( "Login:onClientAttemptRegistration", true )
addEventHandler ( "Login:onClientAttemptRegistration", root, attemptRegister )

function message ( source, msg )
	triggerClientEvent ( source, "onPlayerLoginPanelError", source, msg )
end

function triggerLogin ( source, user,  pass )
	triggerClientEvent ( source, "onClientPlayerLogin", source, user, pass )
end

addEventHandler ( 'onPlayerLogout', root, function ( )
	triggerClientEvent ( source, 'onClientPlayerLogout', source )
end )


addEvent ( 'Login:doClientGuestLogin', true )
addEventHandler ( 'Login:doClientGuestLogin', root, function ( )
	setCameraTarget ( source )
end )

LINE 157 FOR QUICK LOOK

Edited by Charan

Share this post


Link to post

I'd make a table on client side, which contains all your resources and a state, and when a resource has downloaded, I'd set it in the table, then run a check to see if every resource is downloaded, and if that comes back true, I'd show the login panel. So I imagine it like this (of course there could be a better solution):

resources = {
	firstResource = false
	secondResource = false
}

addEventHandler("onClientFileDownloadComplete", root,
	function()
    	local resourceName = getResourceName(source)
    	for i, v in pairs(resources) do
      		if (i == resourceName) then
        		resources[i] = true
       		end
     	end
    	for i, v in pairs(resources) do
      		if (v == false) then
        		ready = false
        		break
       		else
        		ready = true
        	end
      	end
    	if (ready == true) then
      		-- Make your login visible
     	end
   	end
)

NOT TESTED

  • Like 1

Share this post


Link to post
4 hours ago, Charan said:

So i play on my server and i put some heavy mods of about 140 mb and my some people who join have bad internet connection and sometimes my upload rate slows down , so the login panel

keeps annoying the hell out of people is there any way i can like to bypass login panel and then open it after player has downloaded?

use this tag in meta file its the easiest way :)

--in meta.xml of every resource you want to download earlier than login panel
<download_priority_group>1</download_priority_group>
--increse the value in every resource by one 
<download_priority_group>2</download_priority_group>
<download_priority_group>3</download_priority_group>
<download_priority_group>4</download_priority_group>
--...... all resources you want to be downloaded before login
--and lastly add the below line in meta.xml of login
<download_priority_group>0</download_priority_group> 

 

Share this post


Link to post

Try to upload other login panel or upload a modloader so that player can login first then they can download files later  if they want !!and I suggest u first post thread on Hindi group then come here because our Hindi group need more Indian members !! 

Edited by Khadeer143

Share this post


Link to post

I don't think that's the right event for you, if you look at the wiki: onClientFileDownloadComplete - Clientside event - This event is triggered when a file has been downloaded after downloadFile has been successfully called.

Since you are not using downloadFile, you would need to manually check if the user is still downloading.

local loginTimer = setTimer(function()
    
    if not isTransferBoxActive() then
      addEventHandler("onClientRender", root, "myLoginPanel")
      killTimer(loginTimer)
    end
    
end, 2000, 0)

 

Share this post


Link to post
On 6/26/2017 at 00:44, Khadeer143 said:

Try to upload other login panel or upload a modloader so that player can login first then they can download files later  if they want !!and I suggest u first post thread on Hindi group then come here because our Hindi group need more Indian members !! 

sorry for late reply i dont speak hindi im tamil

 

On 6/27/2017 at 16:03, pa3ck said:

I don't think that's the right event for you, if you look at the wiki: onClientFileDownloadComplete - Clientside event - This event is triggered when a file has been downloaded after downloadFile has been successfully called.

Since you are not using downloadFile, you would need to manually check if the user is still downloading.


local loginTimer = setTimer(function()        if not isTransferBoxActive() then      addEventHandler("onClientRender", root, "myLoginPanel")      killTimer(loginTimer)    end    end, 2000, 0)

 

actually after i did the login panel the onclientdownloadfinish thing it came back after the user downloaded

 

On 6/27/2017 at 16:03, pa3ck said:

I don't think that's the right event for you, if you look at the wiki: onClientFileDownloadComplete - Clientside event - This event is triggered when a file has been downloaded after downloadFile has been successfully called.

Since you are not using downloadFile, you would need to manually check if the user is still downloading.


local loginTimer = setTimer(function()        if not isTransferBoxActive() then      addEventHandler("onClientRender", root, "myLoginPanel")      killTimer(loginTimer)    end    end, 2000, 0)

 

i dont understand...

Share this post


Link to post

@Charan what @pa3ck gave you is a pretty neat way to do what you wanna do. Here goes:

local loginTimer = setTimer(function()
    
    if not isTransferBoxActive() then
      addEventHandler("onClientRender", root, "myLoginPanel")
      killTimer(loginTimer)
    end
    
end, 2000, 0)

A timer is set which checks if the player sees the download box at the bottom center of their screen (that means that they're downloading something). And if the download box is visible nothing happens. But the moment when the player has downloaded everything needed the download box will go away, right? Well the next time this timer runs (which is 2 seconds after the last time it checked things) it will see that the download box is not there. And since there is a specific condition

if not isTransferBoxActive() then

when the download box is gone the code inside the timer function will execute. And all it does is to make your login panel visible to the player and to stop checking if the download is complete because there's no point anymore: if the code executes it means that the player has already downloaded the required stuff.

You should put this resource first in the mtaserver.conf to make it load before all other resources (yes, that works too - easier than setting priority in every resource's meta.xml in my opinion). Also obviously you'll need to make it into a client-side script since it's going to affect each player's download box independently.

Edited by koragg

Share this post


Link to post

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.