Jump to content

androksi

Other Languages Moderators
  • Posts

    542
  • Joined

  • Last visited

  • Days Won

    37

androksi last won the day on November 9 2023

androksi had the most liked content!

About androksi

  • Birthday 23/12/1999

Member Title

  • Portuguese Section Moderator

Details

  • Gang
    Multi Theft Auto
  • Location
    Planet Earth
  • Occupation
    Web Developer & MTA Scripter
  • Interests
    ???

Recent Profile Visitors

7,731 profile views

androksi's Achievements

Playa Partner

Playa Partner (27/54)

295

Reputation

1

Community Answers

  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.
  3. E aí, @n0_name — beleza? O shader que você procura está aqui: https://community.multitheftauto.com/index.php?p=resources&s=details&id=18094
  4. E aí, @Doongogar — tranquilo? Acredito que a maneira mais fácil de encontrar o resource com problemas é ligar o servidor sem nenhum mod ativo, e daí você vai ligando um por um, até crashar. Garanto a você que o problema não é o seu auto-start. O MTA lida muito bem com vários resources carregando ao mesmo tempo.
  5. 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.
  6. 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.
  7. E aí, @Paulo Guilherme — tudo tranquilo? Não, não há nenhum problema. O que ocorre é que essa barra de vida e nome do jogador é padrão do MTA. Você precisa desta função para desativá-la: https://wiki.multitheftauto.com/wiki/SetPlayerNametagShowing
  8. 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.
  9. 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
  10. 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 ..." } );
  11. E aí, @Klehber — como é que você está? Tente remover a verificação da variável isPlayerInsideMarker.
  12. 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.
  13. 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 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.
  14. 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: KEY — use uma senha bem forte, você pode gerar em algum site. (exemplo: https://my.norton.com/extspa/passwordmanager?path=pwd-gen) OUTPUT_PATH — matenha dessa forma. 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.
  15. 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.
×
×
  • Create New...