Jump to content

FAZER FUNÇÕES A PARTIR DE USO DO COMANDO


Recommended Posts

Bem, eu estava iniciando um script que se conceitua em ao player dar /ptr iniciar PTR e fazer algumas funções, até aí ok! Porém eu queria que fosse obrigatório ele finalizar, com outro comando, pra poder iniciar novamente, vamo supor, criar uma obrigatoriedade de ao iniciar ele ter que finalizar, pra dar novamente o comando de iniciar.

Problema: Fazer uma função aonde não pode iniciar outra PTR sem ter finalizado outra.

Conceito do Script: Euq ueria fazer como se fosse um "Log", para eu saber o tempo que as corporações fazem Patrulhamento em meu servidor.
Se alguém puder me explicar como posso fazer isso com outro script... Desde já agradeço! 

Link to comment
  • Other Languages Moderators

Pra criar um log, você precisa fazer com que o servidor escreva mensagens em um arquivo de texto. Vou dar um exemplo genérico de um log que marca o instante e o nick quando alguém usar o comando /ptr. (Script server-side.)

addCommandHandler ("ptr", function (thePlayer, cmd, state)
    if (state == "iniciar" or state == "finalizar") then -- Verifica se o comando é seguido por um parâmetro válido.
        local name = getPlayerName (thePlayer) -- Obtém o nick de quem executou o comando.
        local horario = showTime() -- Obtém o horário atual do servidor por meio de uma função útil.
        if (fileExists ("logPTR.txt")) then -- Se já existe um arquivo de texto com este nome neste resource, então:
            newFile = fileOpen ("logPTR.txt") -- Abre o arquivo para poder editá-lo.
            fileSetPos (newFile, fileGetSize (newFile)) -- Coloca o cursor de escrita no fim do arquivo, caso contrário ele vai começar a escrever no começo dele, antes do que já estiver escrito no arquivo.
            if (state == "iniciar") then -- Se o parâmetro que o jogador usou após o comando foi "iniciar" então:
                outputChatBox ("Patrulha iniciada.", thePlayer) -- Apenas pra saber q o comando funcionou, normalmente teria as verificações antes de permissões e se já está em patrulha.
                fileWrite (newFile, "["..horario.."] "name.." Iniciou sua patrulha.\n") -- Escreve isso no documento. O \n pula para a linha seguinte após a mensagem.
            elseif (state == "finalizar") then
                outputChatBox ("Patrulha finalizada.", thePlayer)
                fileWrite (newFile, "["..horario.."] "name.." Finalizou sua patrulha.\n")
            end
            fileClose (newFile) -- Para todo fileOpen ou fileCreate, é necessário um fileClose pois enquanto arquivos estiverem abertos, eles podem ser corrompidos e os dados serão perdidos.
        else -- Se o arquivo ainda não existe, então:
            newFile = fileCreate ("logPTR.txt") -- Cria o arquivo de texto dentro deste resource e abre ele. (se já existisse um arquivo com esse nome, substituiria por um novo em branco)
            if (newFile) then -- Se conseguiu criar o arquivo, então: (as vezes pode dar erro de permissão no servidor, então use isso para evitar erros.)
                fileSetPos (newFile, fileGetSize (newFile))
                if (state == "iniciar") then
                    outputChatBox ("Patrulha iniciada.", thePlayer)
                    fileWrite (newFile, "["..horario.."] "name.." Iniciou sua patrulha.\n")
                elseif (state == "finalizar") then
                    outputChatBox ("Patrulha finalizada.", thePlayer)
                    fileWrite (newFile, "["..horario.."] "name.." Finalizou sua patrulha.\n")
                end
                fileClose (newFile)
            else -- Se não conseguiu criar o arquivo, então:
                debug ("ERRO: Impossivel criar arquivo 'logPTR.txt' no servidor.")
            end
        end
    else -- Se não usou nenhum parâmetro após o comando ou então usou um parâmetro incorreto, então:
        outputChatBox ("Sintaxe: /ptr <iniciar / finalizar>", thePlayer, 255, 255, 0)
    end
end)

function showtime () -- Função que apenas retorna o horário atual.
	local time = getRealTime()
	local hours = time.hour
	local minutes = time.minute
	local seconds = time.second
	-- Make sure to add a 0 to the front of single digits.
	if (hours < 10) then
		hours = "0"..hours
	end
	if (minutes < 10) then
		minutes = "0"..minutes
	end
	if (seconds < 10) then
		seconds = "0"..seconds
	end
	return hours..":"..minutes..":"..seconds
end

 

Sobre a parte de tornar obrigatório a finalização da patrulha antes de começar outra, você tem 2 modos:

  1. Sete um elementData no jogador após ele iniciar uma patrulha. Sempre que ele tentar iniciar uma nova patrulha, verifique se ele já tem essa elementData. Se tiver, bloqueia e pede pra finalizar a patrulha atual. Ao finalizar uma patrulha, remove o elementData do jogador (setando o valor dela como false).
  2. Utilize tabelas. Quando alguém inicia uma patrulha, adiciona a conta dele na tabela e quando ele finaliza, remove ele da tabela. É mais leve do que elementData mas vc precisa adicionar verificadores de logout/quit/disconnect do servidor. Caso contrário o jogador pode sair do servidor e sua patrulha ainda vai estar ativa na tabela do resource. Além disso, todas as patrulhas são perdidas ao reiniciar o resource.
Edited by Lord Henry
  • Thanks 1
Link to comment
On 11/12/2020 at 16:35, Lord Henry said:

Pra criar um log, você precisa fazer com que o servidor escreva mensagens em um arquivo de texto. Vou dar um exemplo genérico de um log que marca o instante e o nick quando alguém usar o comando /ptr. (Script server-side.)


addCommandHandler ("ptr", function (thePlayer, cmd, state)
    if (state == "iniciar" or state == "finalizar") then -- Verifica se o comando é seguido por um parâmetro válido.
        local name = getPlayerName (thePlayer) -- Obtém o nick de quem executou o comando.
        local horario = showTime() -- Obtém o horário atual do servidor por meio de uma função útil.
        if (fileExists ("logPTR.txt")) then -- Se já existe um arquivo de texto com este nome neste resource, então:
            newFile = fileOpen ("logPTR.txt") -- Abre o arquivo para poder editá-lo.
            fileSetPos (newFile, fileGetSize (newFile)) -- Coloca o cursor de escrita no fim do arquivo, caso contrário ele vai começar a escrever no começo dele, antes do que já estiver escrito no arquivo.
            if (state == "iniciar") then -- Se o parâmetro que o jogador usou após o comando foi "iniciar" então:
                outputChatBox ("Patrulha iniciada.", thePlayer) -- Apenas pra saber q o comando funcionou, normalmente teria as verificações antes de permissões e se já está em patrulha.
                fileWrite (newFile, "["..horario.."] "name.." Iniciou sua patrulha.\n") -- Escreve isso no documento. O \n pula para a linha seguinte após a mensagem.
            elseif (state == "finalizar") then
                outputChatBox ("Patrulha finalizada.", thePlayer)
                fileWrite (newFile, "["..horario.."] "name.." Finalizou sua patrulha.\n")
            end
            fileClose (newFile) -- Para todo fileOpen ou fileCreate, é necessário um fileClose pois enquanto arquivos estiverem abertos, eles podem ser corrompidos e os dados serão perdidos.
        else -- Se o arquivo ainda não existe, então:
            newFile = fileCreate ("logPTR.txt") -- Cria o arquivo de texto dentro deste resource e abre ele. (se já existisse um arquivo com esse nome, substituiria por um novo em branco)
            if (newFile) then -- Se conseguiu criar o arquivo, então: (as vezes pode dar erro de permissão no servidor, então use isso para evitar erros.)
                fileSetPos (newFile, fileGetSize (newFile))
                if (state == "iniciar") then
                    outputChatBox ("Patrulha iniciada.", thePlayer)
                    fileWrite (newFile, "["..horario.."] "name.." Iniciou sua patrulha.\n")
                elseif (state == "finalizar") then
                    outputChatBox ("Patrulha finalizada.", thePlayer)
                    fileWrite (newFile, "["..horario.."] "name.." Finalizou sua patrulha.\n")
                end
                fileClose (newFile)
            else -- Se não conseguiu criar o arquivo, então:
                debug ("ERRO: Impossivel criar arquivo 'logPTR.txt' no servidor.")
            end
        end
    else -- Se não usou nenhum parâmetro após o comando ou então usou um parâmetro incorreto, então:
        outputChatBox ("Sintaxe: /ptr <iniciar / finalizar>", thePlayer, 255, 255, 0)
    end
end)

function showtime () -- Função que apenas retorna o horário atual.
	local time = getRealTime()
	local hours = time.hour
	local minutes = time.minute
	local seconds = time.second
	-- Make sure to add a 0 to the front of single digits.
	if (hours < 10) then
		hours = "0"..hours
	end
	if (minutes < 10) then
		minutes = "0"..minutes
	end
	if (seconds < 10) then
		seconds = "0"..seconds
	end
	return hours..":"..minutes..":"..seconds
end

 

Sobre a parte de tornar obrigatório a finalização da patrulha antes de começar outra, você tem 2 modos:

  1. Sete um elementData no jogador após ele iniciar uma patrulha. Sempre que ele tentar iniciar uma nova patrulha, verifique se ele já tem essa elementData. Se tiver, bloqueia e pede pra finalizar a patrulha atual. Ao finalizar uma patrulha, remove o elementData do jogador (setando o valor dela como false).
  2. Utilize tabelas. Quando alguém inicia uma patrulha, adiciona a conta dele na tabela e quando ele finaliza, remove ele da tabela. É mais leve do que elementData mas vc precisa adicionar verificadores de logout/quit/disconnect do servidor. Caso contrário o jogador pode sair do servidor e sua patrulha ainda estar ativa na tabela do resource. Além disso, todas as patrulhas são perdidas ao reiniciar o resource.

Muito Obrigado, Lord Henry, Antes disso não sabia fazer log's, a partir de hoje eu já sei! Você fez uma boa parte do script para mim, não precisava kkk, mas ajudou dms! Tmj mano

On 11/12/2020 at 16:35, Lord Henry said:

Pra criar um log, você precisa fazer com que o servidor escreva mensagens em um arquivo de texto. Vou dar um exemplo genérico de um log que marca o instante e o nick quando alguém usar o comando /ptr. (Script server-side.)


addCommandHandler ("ptr", function (thePlayer, cmd, state)
    if (state == "iniciar" or state == "finalizar") then -- Verifica se o comando é seguido por um parâmetro válido.
        local name = getPlayerName (thePlayer) -- Obtém o nick de quem executou o comando.
        local horario = showTime() -- Obtém o horário atual do servidor por meio de uma função útil.
        if (fileExists ("logPTR.txt")) then -- Se já existe um arquivo de texto com este nome neste resource, então:
            newFile = fileOpen ("logPTR.txt") -- Abre o arquivo para poder editá-lo.
            fileSetPos (newFile, fileGetSize (newFile)) -- Coloca o cursor de escrita no fim do arquivo, caso contrário ele vai começar a escrever no começo dele, antes do que já estiver escrito no arquivo.
            if (state == "iniciar") then -- Se o parâmetro que o jogador usou após o comando foi "iniciar" então:
                outputChatBox ("Patrulha iniciada.", thePlayer) -- Apenas pra saber q o comando funcionou, normalmente teria as verificações antes de permissões e se já está em patrulha.
                fileWrite (newFile, "["..horario.."] "name.." Iniciou sua patrulha.\n") -- Escreve isso no documento. O \n pula para a linha seguinte após a mensagem.
            elseif (state == "finalizar") then
                outputChatBox ("Patrulha finalizada.", thePlayer)
                fileWrite (newFile, "["..horario.."] "name.." Finalizou sua patrulha.\n")
            end
            fileClose (newFile) -- Para todo fileOpen ou fileCreate, é necessário um fileClose pois enquanto arquivos estiverem abertos, eles podem ser corrompidos e os dados serão perdidos.
        else -- Se o arquivo ainda não existe, então:
            newFile = fileCreate ("logPTR.txt") -- Cria o arquivo de texto dentro deste resource e abre ele. (se já existisse um arquivo com esse nome, substituiria por um novo em branco)
            if (newFile) then -- Se conseguiu criar o arquivo, então: (as vezes pode dar erro de permissão no servidor, então use isso para evitar erros.)
                fileSetPos (newFile, fileGetSize (newFile))
                if (state == "iniciar") then
                    outputChatBox ("Patrulha iniciada.", thePlayer)
                    fileWrite (newFile, "["..horario.."] "name.." Iniciou sua patrulha.\n")
                elseif (state == "finalizar") then
                    outputChatBox ("Patrulha finalizada.", thePlayer)
                    fileWrite (newFile, "["..horario.."] "name.." Finalizou sua patrulha.\n")
                end
                fileClose (newFile)
            else -- Se não conseguiu criar o arquivo, então:
                debug ("ERRO: Impossivel criar arquivo 'logPTR.txt' no servidor.")
            end
        end
    else -- Se não usou nenhum parâmetro após o comando ou então usou um parâmetro incorreto, então:
        outputChatBox ("Sintaxe: /ptr <iniciar / finalizar>", thePlayer, 255, 255, 0)
    end
end)

function showtime () -- Função que apenas retorna o horário atual.
	local time = getRealTime()
	local hours = time.hour
	local minutes = time.minute
	local seconds = time.second
	-- Make sure to add a 0 to the front of single digits.
	if (hours < 10) then
		hours = "0"..hours
	end
	if (minutes < 10) then
		minutes = "0"..minutes
	end
	if (seconds < 10) then
		seconds = "0"..seconds
	end
	return hours..":"..minutes..":"..seconds
end

 

Sobre a parte de tornar obrigatório a finalização da patrulha antes de começar outra, você tem 2 modos:

  1. Sete um elementData no jogador após ele iniciar uma patrulha. Sempre que ele tentar iniciar uma nova patrulha, verifique se ele já tem essa elementData. Se tiver, bloqueia e pede pra finalizar a patrulha atual. Ao finalizar uma patrulha, remove o elementData do jogador (setando o valor dela como false).
  2. Utilize tabelas. Quando alguém inicia uma patrulha, adiciona a conta dele na tabela e quando ele finaliza, remove ele da tabela. É mais leve do que elementData mas vc precisa adicionar verificadores de logout/quit/disconnect do servidor. Caso contrário o jogador pode sair do servidor e sua patrulha ainda estar ativa na tabela do resource. Além disso, todas as patrulhas são perdidas ao reiniciar o resource.

Cara poderia me dar outra ajuda? Não entendo muito de orientador, quando que eu uso cmd, state? Poderia me explicar?

On 11/12/2020 at 16:35, Lord Henry said:

Pra criar um log, você precisa fazer com que o servidor escreva mensagens em um arquivo de texto. Vou dar um exemplo genérico de um log que marca o instante e o nick quando alguém usar o comando /ptr. (Script server-side.)


addCommandHandler ("ptr", function (thePlayer, cmd, state)
    if (state == "iniciar" or state == "finalizar") then -- Verifica se o comando é seguido por um parâmetro válido.
        local name = getPlayerName (thePlayer) -- Obtém o nick de quem executou o comando.
        local horario = showTime() -- Obtém o horário atual do servidor por meio de uma função útil.
        if (fileExists ("logPTR.txt")) then -- Se já existe um arquivo de texto com este nome neste resource, então:
            newFile = fileOpen ("logPTR.txt") -- Abre o arquivo para poder editá-lo.
            fileSetPos (newFile, fileGetSize (newFile)) -- Coloca o cursor de escrita no fim do arquivo, caso contrário ele vai começar a escrever no começo dele, antes do que já estiver escrito no arquivo.
            if (state == "iniciar") then -- Se o parâmetro que o jogador usou após o comando foi "iniciar" então:
                outputChatBox ("Patrulha iniciada.", thePlayer) -- Apenas pra saber q o comando funcionou, normalmente teria as verificações antes de permissões e se já está em patrulha.
                fileWrite (newFile, "["..horario.."] "name.." Iniciou sua patrulha.\n") -- Escreve isso no documento. O \n pula para a linha seguinte após a mensagem.
            elseif (state == "finalizar") then
                outputChatBox ("Patrulha finalizada.", thePlayer)
                fileWrite (newFile, "["..horario.."] "name.." Finalizou sua patrulha.\n")
            end
            fileClose (newFile) -- Para todo fileOpen ou fileCreate, é necessário um fileClose pois enquanto arquivos estiverem abertos, eles podem ser corrompidos e os dados serão perdidos.
        else -- Se o arquivo ainda não existe, então:
            newFile = fileCreate ("logPTR.txt") -- Cria o arquivo de texto dentro deste resource e abre ele. (se já existisse um arquivo com esse nome, substituiria por um novo em branco)
            if (newFile) then -- Se conseguiu criar o arquivo, então: (as vezes pode dar erro de permissão no servidor, então use isso para evitar erros.)
                fileSetPos (newFile, fileGetSize (newFile))
                if (state == "iniciar") then
                    outputChatBox ("Patrulha iniciada.", thePlayer)
                    fileWrite (newFile, "["..horario.."] "name.." Iniciou sua patrulha.\n")
                elseif (state == "finalizar") then
                    outputChatBox ("Patrulha finalizada.", thePlayer)
                    fileWrite (newFile, "["..horario.."] "name.." Finalizou sua patrulha.\n")
                end
                fileClose (newFile)
            else -- Se não conseguiu criar o arquivo, então:
                debug ("ERRO: Impossivel criar arquivo 'logPTR.txt' no servidor.")
            end
        end
    else -- Se não usou nenhum parâmetro após o comando ou então usou um parâmetro incorreto, então:
        outputChatBox ("Sintaxe: /ptr <iniciar / finalizar>", thePlayer, 255, 255, 0)
    end
end)

function showtime () -- Função que apenas retorna o horário atual.
	local time = getRealTime()
	local hours = time.hour
	local minutes = time.minute
	local seconds = time.second
	-- Make sure to add a 0 to the front of single digits.
	if (hours < 10) then
		hours = "0"..hours
	end
	if (minutes < 10) then
		minutes = "0"..minutes
	end
	if (seconds < 10) then
		seconds = "0"..seconds
	end
	return hours..":"..minutes..":"..seconds
end

 

Sobre a parte de tornar obrigatório a finalização da patrulha antes de começar outra, você tem 2 modos:

  1. Sete um elementData no jogador após ele iniciar uma patrulha. Sempre que ele tentar iniciar uma nova patrulha, verifique se ele já tem essa elementData. Se tiver, bloqueia e pede pra finalizar a patrulha atual. Ao finalizar uma patrulha, remove o elementData do jogador (setando o valor dela como false).
  2. Utilize tabelas. Quando alguém inicia uma patrulha, adiciona a conta dele na tabela e quando ele finaliza, remove ele da tabela. É mais leve do que elementData mas vc precisa adicionar verificadores de logout/quit/disconnect do servidor. Caso contrário o jogador pode sair do servidor e sua patrulha ainda estar ativa na tabela do resource. Além disso, todas as patrulhas são perdidas ao reiniciar o resource.

Como posso fazer pra criar tabelas? Sempre fiz por elementData, e não sabia que pesava mais

Link to comment
  • Other Languages Moderators
2 hours ago, Otavio said:

Cara poderia me dar outra ajuda? Não entendo muito de orientador, quando que eu uso cmd, state? Poderia me explicar?

Cmd é o comando que vc usou para executar essa função. Não é utilizado neste caso pois só existe 1 comando ativando essa função. Ele só é usado para casos onde vc tem outros comandos ativando a mesma função, mas quer que a função diferencie cada um deles.

State é a palavra que vc usou depois do comando. Se vc usar /ptr eae, então state será igual a "eae". Você pode indicar quantos parâmetros quiser após o comando, cada um ficará em um parâmetro separado pelo espaço.

function qualquerCoisa (thePlayer, cmd, parametro1, parametro2, parametro3) -- Depois de cmd, os demais parâmetros são as palavras que serão usadas após o comando.
    -- CODE
end
addCommandHandler ("teste", qualquerCoisa)
-- Se vc usar /teste eae olá oi, então:
-- cmd = "teste"
-- parametro1 = "eae"
-- parametro2 = "olá"
-- parametro3 = "oi"

 

  • Thanks 1
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...