Jump to content

Concatenação


Recommended Posts

16 hours ago, andreisrw said:

thePlayer é, de fato, o parâmetro da sua função que recebe o jogador?

Você não está verificando se a função getPlayerAccount está retornando uma conta válida. Use isGuestAccount para verificar.

Sim o thePlayer é o parâmetro da minha função, tentei verificar dessa fora porém ainda deu errado

 

local player = getPlayerAccount(thePlayer)
    if isGuestAccount(player) then
    	if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then
 
Ele está me retornando a Boolean value ainda.

Só que agora no getPlayerAccount e no isGuestAccount(player) then

Link to comment
1 hour ago, Joaovit13 said:

Sim o thePlayer é o parâmetro da minha função, tentei verificar dessa fora porém ainda deu errado

 


local player = getPlayerAccount(thePlayer)
    if isGuestAccount(player) then
    	if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then
 
Ele está me retornando a Boolean value ainda.

Só que agora no getPlayerAccount e no isGuestAccount(player) then

Sua condição está errada, só vai ser verdadeira se for uma conta de convidado, não se não for. E outra, onde você está criando a variável accName??

Teste isso e veja se funciona (não testei) :

local account = getPlayerAccount ( thePlayer ) 
local accName = getAccountName ( account )
	if not isGuestAccount(account) then
		if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then
    
    		--CÓDIGO
    		end
  	end

 

Link to comment
25 minutes ago, Boechat said:

Sua condição está errada, só vai ser verdadeira se for uma conta de convidado, não se não for. E outra, onde você está criando a variável accName??

Teste isso e veja se funciona (não testei) :



local account = getPlayerAccount ( thePlayer ) 
local accName = getAccountName ( account )
	if not isGuestAccount(account) then
		if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then
    
    		--CÓDIGO
    		end
  	end

 

function vipBronze(thePlayer)
    local account = getPlayerAccount ( thePlayer ) 
	local accName = getAccountName ( account )
	if not isGuestAccount(account) then
		if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then
        	givePlayerMoney(player, 5000)
        end
    end
end

setTimer(vipBronze, 60, 1)

Meu código ficou desse jeito porém está dando bad argument no getPlayerAccount, getAccountName e no isGuestAccount e fora a concatenação que ainda está dando erro.

Edited by Joaovit13
Link to comment
6 minutes ago, Joaovit13 said:



function vipBronze(thePlayer)
    local account = getPlayerAccount ( thePlayer ) 
	local accName = getAccountName ( account )
	if not isGuestAccount(account) then
		if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then
        	givePlayerMoney(player, 5000)
        end
    end
end

setTimer(vipBronze, 60, 1)

Meu código ficou desse jeito porém está dando bad argument no getPlayerAccount, getAccountName e no isGuestAccount e fora a concatenação que ainda está dando erro.

Esse setTimer está fora da função? Porque pelo visto ele está chamando a função do nada e não está passando o thePlayer como parâmetro.

 

function vipBronze(thePlayer)
	local account = getPlayerAccount ( thePlayer ) 
	local accName = getAccountName ( account )
	if not isGuestAccount(account) then
		if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then
			givePlayerMoney(player, 5000)
		end
	end
end

addCommandHandler ('vipbronze', vipBronze)

Testa com um comando pra ver se vai funcionar. Se funcionar, o problema é na hora de chamar a função. Aparentemente você n está passando o thePlayer do parâmetro.

Lembrando que a pessoa que der o comando deve estar na acl Bronze e todo o código é server-side.

Edited by Boechat
Link to comment
15 minutes ago, Boechat said:

Esse setTimer está fora da função? Porque pelo visto ele está chamando a função do nada e não está passando o thePlayer como parâmetro.

 


function vipBronze(thePlayer)
	local account = getPlayerAccount ( thePlayer ) 
	local accName = getAccountName ( account )
	if not isGuestAccount(account) then
		if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then
			givePlayerMoney(player, 5000)
		end
	end
end

addCommandHandler ('vipbronze', vipBronze)

Testa com um comando pra ver se vai funcionar. Se funcionar, o problema é na hora de chamar a função. Aparentemente você n está passando o thePlayer do parâmetro.

Lembrando que a pessoa que der o comando deve estar na acl Bronze e todo o código é server-side.

Então pelo addCommandHandler funcionou porém eu queria que a cada tantos minutos dava o dinheiro pro player, quais parâmetros devo passar para o setTimer?

Link to comment
7 minutes ago, Joaovit13 said:

Então pelo addCommandHandler funcionou porém eu queria que a cada tantos minutos dava o dinheiro pro player, quais parâmetros devo passar para o setTimer?

Então você não pode passar o player por parâmetro, deve verificar dentro da função.

local tempo = 10000 --tempo em milisegundos

function vipBronze()
	for i, thePlayer in ipairs(getElementsByType('player')) do --Pega todos os players do servidor, joga dentro de um for (estrutura de repetição)
		local account = getPlayerAccount ( thePlayer ) --Pega conta do player da vez (vai verificar todos os players do servidor, um por um)
		local accName = getAccountName ( account )
		if not isGuestAccount(account) then
			if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then
				givePlayerMoney(thePlayer, 5000)
			end
		end
	end
end
setTimer(vipBronze, tempo, 0)

Testa aí e vê se funciona.

Edited by Boechat
  • Thanks 1
Link to comment
11 minutes ago, Boechat said:

Então você não pode passar o player por parâmetro, deve verificar dentro da função.


local tempo = 10000 --tempo em milisegundos

function vipBronze()
	for i, thePlayer in ipairs(getElementsByType('player')) do --Pega todos os players do servidor, joga dentro de um for (estrutura de repetição)
		local account = getPlayerAccount ( thePlayer ) --Pega conta do player da vez (vai verificar todos os players do servidor, um por um)
		local accName = getAccountName ( account )
		if not isGuestAccount(account) then
			if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then
				givePlayerMoney(thePlayer, 5000)
			end
		end
	end
end
setTimer(vipBronze, tempo, 0)

Testa aí e vê se funciona.

Muito Obrigado irmão consegui aqui agora eu entendi que não pode declarar o parâmetro na função e sim dentro dela, muito obrigado mesmo

Link to comment
28 minutes ago, Joaovit13 said:

Muito Obrigado irmão consegui aqui agora eu entendi que não pode declarar o parâmetro na função e sim dentro dela, muito obrigado mesmo

Por nada, qualquer coisa estamos aí :)

Mas pera, pode declarar parâmetros na função sim! O que acontece é que você não estava chamando a função pra um player específico. Vou te dar um exemplo de um jeito (menos eficiente, porém só pra demonstração) de chamar uma função com parâmetro: 

 

function darDinheiro (thePlayer)
	givePlayerMoney(thePlayer, 5000)
end
function vipBronze()
	for i, thePlayer in ipairs(getElementsByType('player')) do
		local account = getPlayerAccount ( thePlayer )
		local accName = getAccountName ( account )
		if not isGuestAccount(account) then
			if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then
				darDinheiro (thePlayer) --Se todas as condições estiverem ok, chama a função de dar dinheiro passando o player expecífico como parâmetro
			end
		end
	end
end
setTimer(vipBronze, tempo, 0)

 

Link to comment
  • Other Languages Moderators

A solução encontrada por vocês, é sim eficaz, porém podem haver sobrecargas no servidor, devido à função isObjectInACLGroup. Caso o servidor atinja uma quantidade considerável de jogadores - mais que 100 - essa função pode até causar um NETWORK TROUBLE no servidor. Claro que não é tão assim de forma exagerada, depende de vários fatores, incluindo o potencial de processamento do servidor - mas né, não vamos deixar algo mal feito.

Você poderia definir um timer assim que o jogador entrar numa sessão (login). Dessa forma, cada um iria receber o prêmio (ou dinheiro, como vejo no exemplo acima), de acordo com a sessão. Ninguém iria receber ao mesmo tempo, o que já tiraria uma grande responsabilidade do servidor de processar várias informações de uma só vez.

Porém, também tenho alguns contras sobre o setTimer. Infelizmente, terá vários timers dentro do resource rodando. O que pode ou não ser um problema - ao meu ver, não é tão prejudicial assim.

Mas, venho com outra solução, que seria melhor!

Assim que o jogador entrar na sessão, insira-o numa tabela e, ao invés de percorrer todos os jogadores usando o getElementsByType, você iria percorrer apenas a tabela, com alguns jogadores apenas. Isso sim já seria uma ótima solução e que causaria o mínimo de impacto no servidor.

Spoiler

local premiumPlayers = {}
local premiumTimer

addEventHandler("onPlayerLogin", root, function(_, pAccount)
    local accountName = getAccountName(pAccount)

    if isObjectInACLGroup("user." .. accountName, aclGetGroup("Premium")) then
        table.insert(premiumPlayers, source)

        if #premiumPlayers == 1 then
            if not premiumTimer then
                premiumTimer = setTimer(function()
                    for k, v in pairs(premiumPlayers) do
                        givePlayerMoney(v, 50000)
                    end
                end, 60000 * 5, 0)
            end
        end
    end
end)

addEventHandler("onPlayerQuit", root, function()
    for k, v in pairs(premiumPlayers) do
        if v == source then
            table.remove(premiumPlayers, k)
            break
        end
    end

    if #premiumPlayers == 0 then
        if premiumTimer and isTimer(premiumTimer) then
            killTimer(premiumTimer)
            premiumTimer = nil
        end
    end
end)

 

Pode parecer uma solução meio grande à primeira vista, mas é bem otimizada.

  • O timer só irá se iniciar caso algum jogador Premium entre numa sessão - apenas uma vez, claro;
  • O timer também irá se desfazer e ser destruído caso não haja mais jogadores premium no servidor;

Concluindo, você evitou de percorrer todos os jogadores do servidor - que poderia ser acima de 100, 200 ou até 300 - para uma simples tabela que haverá alguns jogadores. Acredito eu que, menos de 50 jogadores. O importante é otimizar os timers e ser o mais específico e objetivo possível.

  • Thanks 1
Link to comment
1 hour ago, andreisrw said:

A solução encontrada por vocês, é sim eficaz, porém podem haver sobrecargas no servidor, devido à função isObjectInACLGroup. Caso o servidor atinja uma quantidade considerável de jogadores - mais que 100 - essa função pode até causar um NETWORK TROUBLE no servidor. Claro que não é tão assim de forma exagerada, depende de vários fatores, incluindo o potencial de processamento do servidor - mas né, não vamos deixar algo mal feito.

Você poderia definir um timer assim que o jogador entrar numa sessão (login). Dessa forma, cada um iria receber o prêmio (ou dinheiro, como vejo no exemplo acima), de acordo com a sessão. Ninguém iria receber ao mesmo tempo, o que já tiraria uma grande responsabilidade do servidor de processar várias informações de uma só vez.

Porém, também tenho alguns contras sobre o setTimer. Infelizmente, terá vários timers dentro do resource rodando. O que pode ou não ser um problema - ao meu ver, não é tão prejudicial assim.

Mas, venho com outra solução, que seria melhor!

Assim que o jogador entrar na sessão, insira-o numa tabela e, ao invés de percorrer todos os jogadores usando o getElementsByType, você iria percorrer apenas a tabela, com alguns jogadores apenas. Isso sim já seria uma ótima solução e que causaria o mínimo de impacto no servidor.

  Hide contents


local premiumPlayers = {}
local premiumTimer

addEventHandler("onPlayerLogin", root, function(_, pAccount)
    local accountName = getAccountName(pAccount)

    if isObjectInACLGroup("user." .. accountName, aclGetGroup("Premium")) then
        table.insert(premiumPlayers, source)

        if #premiumPlayers == 1 then
            if not premiumTimer then
                premiumTimer = setTimer(function()
                    for k, v in pairs(premiumPlayers) do
                        givePlayerMoney(v, 50000)
                    end
                end, 60000 * 5, 0)
            end
        end
    end
end)

addEventHandler("onPlayerQuit", root, function()
    for k, v in pairs(premiumPlayers) do
        if v == source then
            table.remove(premiumPlayers, k)
            break
        end
    end

    if #premiumPlayers == 0 then
        if premiumTimer and isTimer(premiumTimer) then
            killTimer(premiumTimer)
            premiumTimer = nil
        end
    end
end)

 

Pode parecer uma solução meio grande à primeira vista, mas é bem otimizada.

  • O timer só irá se iniciar caso algum jogador Premium entre numa sessão - apenas uma vez, claro;
  • O timer também irá se desfazer e ser destruído caso não haja mais jogadores premium no servidor;

Concluindo, você evitou de percorrer todos os jogadores do servidor - que poderia ser acima de 100, 200 ou até 300 - para uma simples tabela que haverá alguns jogadores. Acredito eu que, menos de 50 jogadores. O importante é otimizar os timers e ser o mais específico e objetivo possível.

Eita irmão eu não sabia que podia acontecer esse problema ae, obrigado pelo script e pelo aviso.

Link to comment
18 hours ago, andreisrw said:

A solução encontrada por vocês, é sim eficaz, porém podem haver sobrecargas no servidor, devido à função isObjectInACLGroup. Caso o servidor atinja uma quantidade considerável de jogadores - mais que 100 - essa função pode até causar um NETWORK TROUBLE no servidor. Claro que não é tão assim de forma exagerada, depende de vários fatores, incluindo o potencial de processamento do servidor - mas né, não vamos deixar algo mal feito.

Você poderia definir um timer assim que o jogador entrar numa sessão (login). Dessa forma, cada um iria receber o prêmio (ou dinheiro, como vejo no exemplo acima), de acordo com a sessão. Ninguém iria receber ao mesmo tempo, o que já tiraria uma grande responsabilidade do servidor de processar várias informações de uma só vez.

Porém, também tenho alguns contras sobre o setTimer. Infelizmente, terá vários timers dentro do resource rodando. O que pode ou não ser um problema - ao meu ver, não é tão prejudicial assim.

Mas, venho com outra solução, que seria melhor!

Assim que o jogador entrar na sessão, insira-o numa tabela e, ao invés de percorrer todos os jogadores usando o getElementsByType, você iria percorrer apenas a tabela, com alguns jogadores apenas. Isso sim já seria uma ótima solução e que causaria o mínimo de impacto no servidor.

  Reveal hidden contents


local premiumPlayers = {}
local premiumTimer

addEventHandler("onPlayerLogin", root, function(_, pAccount)
    local accountName = getAccountName(pAccount)

    if isObjectInACLGroup("user." .. accountName, aclGetGroup("Premium")) then
        table.insert(premiumPlayers, source)

        if #premiumPlayers == 1 then
            if not premiumTimer then
                premiumTimer = setTimer(function()
                    for k, v in pairs(premiumPlayers) do
                        givePlayerMoney(v, 50000)
                    end
                end, 60000 * 5, 0)
            end
        end
    end
end)

addEventHandler("onPlayerQuit", root, function()
    for k, v in pairs(premiumPlayers) do
        if v == source then
            table.remove(premiumPlayers, k)
            break
        end
    end

    if #premiumPlayers == 0 then
        if premiumTimer and isTimer(premiumTimer) then
            killTimer(premiumTimer)
            premiumTimer = nil
        end
    end
end)

 

Pode parecer uma solução meio grande à primeira vista, mas é bem otimizada.

  • O timer só irá se iniciar caso algum jogador Premium entre numa sessão - apenas uma vez, claro;
  • O timer também irá se desfazer e ser destruído caso não haja mais jogadores premium no servidor;

Concluindo, você evitou de percorrer todos os jogadores do servidor - que poderia ser acima de 100, 200 ou até 300 - para uma simples tabela que haverá alguns jogadores. Acredito eu que, menos de 50 jogadores. O importante é otimizar os timers e ser o mais específico e objetivo possível.

Sim, eu também não gosto de usar ACL nem timer, faço tudo por banco de dados ou pelo setAccountData. Já o timer eu substituo por getTickCount ()

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...