Jump to content

androksi

Other Languages Moderators
  • Posts

    542
  • Joined

  • Last visited

  • Days Won

    37

Posts posted by androksi

  1. E aí, @zezzok7 — tudo em cima?

    Primeiramente, não acho necessário usar o getTickCount no client-side para salvar o tempo decorrido, a menos que você esteja usando para outros propósitos. Você pode usar um banco de dados ou a função mencionada por você mesmo (setAccountData). No banco de dados, você precisará salvar os segundos que passou desde o início ao fim da entrega. Tudo isso pode ser feito sem problemas no server-side apenas.

    Você precisa de uma tabela que armazenará o tick atual assim que o jogador iniciar a entrega. Depois, quando ela for realizada, você obtém o tick atual e acha a diferença entre o que foi salvo. Vamos ao exemplo:
     

    local players_delivery_time = { }
    
    -- Quando o trabalho inicia (função somente a fim de exemplo!)
    function startWork( player )
        players_delivery_time[ player ] = getTickCount( )
    end
    
    -- Quando o trabalho finalizar/for entregue
    function stopWork( player )
        local current_tick = getTickCount( ) -- Pegamos o tick atual
        local old_tick = players_delivery_time[ player ] -- Pegamos o tick antigo, que foi salvo anteriormente assim que iniciou-se o trabalho
      
        local elapsed_time = current_tick - old_tick -- Finalmente obtemos a diferença, retornando em milisegundos
        elapsed_time = elapsed_time / 1000 -- Convertendo pra segundos...
    end

    De forma direta, esse elapsed_time você salvaria no banco de dados e com o uso da matemática, poderia transformar os segundos em minutos, horas, seja lá como queira.

  2. Opa, e aí @Clebson — como é que vai?

    Essa função foi removida do painel admin por motivos de segurança. Agora você deve usar o resource runcode para executar comandos e/ou códigos. Ele é bem simples. Primeiramente, você deve iniciar o resource, com o comando /start runcode. Uma vez iniciado, você tem os seguintes comandos:

    • srun - executa server-side.
    • crun - executa client-side.

    Exemplos de uso:

    srun createVehicle(411, getElementPosition(getPlayerFromName("seu_nickname"))) | O comando, assim que executado, irá criar um veículo no lado server, ou seja, para todos.

    crun setSkyGradient(255, 255, 255, 0, 255, 0) | O comando, assim que executado, irá mudar a cor do céu somente para você, ou seja, client-side, quem executou o comando.

    ATENÇÃO! Esse resource, por motivos de segurança, deve permanecer DESLIGADO em um servidor on-line, público.

    • Like 1
    • Thanks 1
  3. Hello.

    I believe that it's better to do all the saving logics server-side, using a database or whatever you prefer. Once the player hits the marker and start the mission, call a server-side through triggerServerEvent function and store the information in the database. It would be interesting to save timestamps too, as you stated that missions are made once a day.

    Now, when the player reconnects from the server, all you need to do is checking database to get the player's mission.

  4. E aí, @AllissonDxyz — bem-vindo ao fórum!

    Desculpe pelo atraso na resposta. Sobre o seu erro, você pode tentar resolver isso no client-side, trocando de:

    local player = client

    para:

    local player = source

    Aquele variável client não existe no client-side, ela existe apenas no server-side para fins de segurança, onde você pode confiar nela.

    • Like 1
  5. E aí, @JulianaCXRP — como é que você tá?

    Primeiramente, devo apontar um erro comum de digitação que acontece. Sua cláusula MySQL tá incorreta, o correto seria WHERE, enquanto no código mostrado está WERE. Embora você mencionou que o código antigo estava funcionando corretamente, dentro do MTA não é uma boa prática usar a função MySQL LAST_INSERT_ROWID.

    Uma solução para isso seria criar uma variável de controle. Sempre que você iniciar o script (onResourceStart) faça uma chamada no banco de dados, com o SELECT e atribua àquela variável anteriormente mencionada.

    Exemplo:

    local lastInsertRowId = 0;
    
    addEventHandler( "onResourceStart", resourceRoot, function( )
        local dbConnection = ... -- Sua conexão com o banco de dados.
    
        local function callback( qh )
            local poll = dbPoll( qh, 0 );
    
            if ( #poll <= 0 ) then
                lastInsertRowId = 0;
                return;
            end
    
            lastInsertRowId = poll[ #poll ].id;
        end
    
        dbQuery( callback, dbConnection, "SELECT * FROM `...`;" );
    end );

    Estou considerando que a coluna na sua tabela do banco de dados tenha o nome id. Importante: não se esqueça que você deve implementar a função AUTO_INCREMENT nessa coluna.

    Concluindo, sempre que você adicionar mais uma entrada no banco de dados, lembre-se de acrescentar mais um (+1) naquela variável, apenas para fins de controle e nada sairá da contagem correta.

  6. Não exatamente. Você precisa deixar assim:

    Observação: Percebi que no código existe um "~:" no nome da função. Se realmente for o caso, remova e deixe apenas com letras.

    local function onGas(element, samedim)
        if getElementType(element) == "player" then
            local currentHealth = getElementHealth(element)
            setElementHealth(element, currentHealth - 25)
        end
    end
  7. Opa, @Dekonpriv — beleza?

    Acredito que a melhor forma de alcançar esse objetivo é criando um resource separado. Por exemplo, você pode criar um resource discord_webhooks e, num arquivo server-side, definir uma tabela sendo o índice dela um nome que você referencie e o valor será o link. Olha aí abaixo:

    local webhooks = {
        [ "vehicle-logs" ] = "https://api.discord.com/...1",
        [ "bank-logs" ] = "https://api.discord.com/...2",
        [ "punishment-logs" ] = "https://api.discord.com/...3"
    };
    
    function sendInfoThrough( webhookReference, data )
        local discordWebhookURI = webhooks[ webhookReference ];
    
        if ( not discordWebhookURI ) then
            return;
        end
    
        fetchRemote( discordWebhookURI, data ); -- Aqui seria a lógica que você provavelmente já fez.
    end

    Agora a função sendInfoThrough precisa ser exportada para que outros resources possam executá-la. Uma vez exportada, em outros resources você usaria desta forma:

    exports.discord_webhooks:sendInfoThrough( "bank-logs", {
        player_name = getPlayerName( player ),
        message = "Executou um depósito no banco."
    } );
    
    exports.discord_webhooks:sendInfoThrough( "vehicle-logs", {
        player_name = getPlayerName( player ),
        message = "Comprou o veículo ..."
    } );

     

  8. Fiz um outro script que carrega aqueles arquivos criptografados. Ficará mais fácil para você entender. Você pode baixá-lo clicando aqui. Atente-se que, agora, a variável KEY também está dentro do loader.lua. Essa chave deve ser a mesma que está no arquivo que faz a criptografia.

    Pode ser que quando eu tiver um tempinho livre eu faça um aplicativo, software ou pequeno site só pra criptografar os arquivos, sem necessidade de adicionar um novo script no seu servidor. Acredito que seja mais prático até ksks.

    • Thanks 1
  9. Não precisa deixar aquele script (encrypt-assets) ativado, ele é responsável por criptografar seus modelos e texturas somente uma vez, quando você executa o comando. Tudo o que importa está no output, que são seus arquivos protegidos

    On 17/06/2023 at 21:19, wesssley said:

    devo copiar o arquivo _encrypted e o client/loader para a pasta ou tenho que deixar esse mod "encrypt-assets" sempre ligado?

    Respondendo essa pergunta: Sim! O client/loader.lua deve estar na pasta da sua joalheria, assim como seus arquivos criptografados também. Não se esqueça de configurar naquela tabela o nome/caminho de onde os arquivos estão e qual o ID que está sendo substituído.

  10. E aí, @wesssley — como é que você tá?

    Existe sim uma maneira de você fazer isso, através das funções de criptografia base64Encode, base64Decode, encodeString e decodeString. Deixarei abaixo um código que escrevi e você pode estudar mais como funcionaria. De qualquer forma, explicarei como usar:

    1. Adicione o resource no seu servidor local. Sim, eu recomendo que use um servidor local, uma vez que o resource irá fazer um processamento pesado, podendo até causar perda de performance.

    2. Vá até a pasta shared e abra o arquivo settings.lua. Edite as seguintes variáveis:

    3. Adicione os arquivos sem criptografia na pasta assets e também adicione-os no meta.xml.

    4. Inicie o resource no seu servidor, com o comando /start encrypt-assets. Você pode acompanhar a compilação no console do seu servidor, aquele terminal fora do MTA.

    5. Uma vez finalizado, os arquivos criptografados estarão na pasta assets/output. Vá até o meta.xml e altere onde os arquivos criptografados estão, que é na pasta citada anteriormente, neste passo. Além disso, atente-se ao nome do arquivo, a extensão deles mudou para .dff_encrypted ou .txd_encrypted.

    Deseja mover esses arquivos para outro resource? Você pode mover, desde que o client/loader.lua esteja lá, configurado da maneira correta.

    Anexo: https://drive.google.com/file/d/1aOkqqLCj6wAq64kwzS7IfYuredrFAf_Z/view?usp=sharing

    Observação: por mais que eu tenha enviado o resource pronto para uso, peço que estude como ele funciona.

    • Like 2
    • Thanks 1
  11. Olá, @Gustavik — tudo tranquilo?

    Esse template string é do JavaScript, portanto não é possível utilizar em Lua, a menos que você crie do zero um sistema que leia. Entretanto, em Lua, você usa %s. Deixarei um exemplo abaixo:

    local messages = {
        ["recebeu_dinheiro"] = "Você recebeu R$%s.",
        ["matou_alguém"] = "Você matou %s e recebeu R$%s por isso!"
    }
    
    outputChatBox(messages["recebeu_dinheiro"]:format(math.random(1000)), root, 0, 255, 0)
    outputChatBox(messages["matou_alguém"]:format("Pepe_Moreno", math.random(1000)), root, 0, 255, 0)

    Como você pôde ver, usamos um método da biblioteca string, o format. Lembre-se que você deve passar os valores em ordem, de acordo com a sequência.

  12. Olá, comunidade brasileira!

    Hoje preparei para vocês um tutorial de banco de dados, com utilização dentro do MTA:SA. Além do bônus especial usando tabelas para armazenar em cachê tudo aquilo que está no banco de dados, dessa forma evitando várias consultas desnecessárias ao banco de dados.

    Clique no texto abaixo para acessar o meu tutorial. Espero que seja de grande ajuda para o seu desenvolvimento com programação.

    Ir para o tutorial ?

    • Like 1
    • Thanks 1
  13. Olá, @SciptNovato! Tudo bem?

    Acredito que com este evento seja possível bloquear todos as binds:

    addEventHandler("onClientKey", root,
        function(key, press)
            if not press then
                return false
            end
        	
            if isLoginEnabled then -- Aqui seria a variável responsável por dizer se o painel de login está na tela ou não.
                cancelEvent(true)
            end
        end
    )

     

  14. E aí, @Joao_Preis!

    O nome não é alterado pois contém acentuação. Nesse caso, nós temos um til (~). O MTA só aceita caracteres de A até Z, sem nenhuma acentuação. Fique esperto também no tamanho do nome, o limite é de 22 caracteres, sem espaços.

    Você pode conferir os caracteres válidos aqui. Aparecerá da seguinte forma:

    DEwgFPe.png

    • Thanks 1
×
×
  • Create New...