-
Posts
545 -
Joined
-
Last visited
-
Days Won
38
Everything posted by androksi
-
Consertar dbExec failed; (1) SQL logic error
androksi replied to Doongogar's topic in Programação em Lua
E aí, @Doongogar — beleza? Provavelmente o erro ocorre pois você não tá definindo o tipo de dado das colunas. Veja que aqui: dbExec(db, "CREATE TABLE IF NOT EXISTS Estoque(ID, Quantia)") dbExec(db, "CREATE TABLE IF NOT EXISTS Carros(ID INTEGER PRIMARY KEY AUTOINCREMENT, account, idCar, state, placa, imposto, seguro, dataCar, dataTuning)") dbExec(db, "CREATE TABLE IF NOT EXISTS Slots(account, quantia)") Somente o "ID" da tabela "Carros" possui um tipo de dado, que é o INTEGER. Já as outras colunas não possuem nenhuma informação sobre o que vão armazenar. Sugiro que você leia meu tutorial sobre banco de dados para entender e aprender como usar. Também existe muito conteúdo no canal do Discord, onde os usuários e eu mesmo respondo as dúvidas do pessoal. De qualquer forma, irei explicar, em poucos detalhes, sobre como você deveria seguir daqui pra frente na criação de tabelas em banco de dados. O mais importante é que você entenda: toda coluna em uma tabela precisa de um tipo de dado, pois assim o MySQL — ou outra engine — saberá o que está sendo armazenado e, uma vez que uma busca ocorre, os dados retornarão de maneira correta. Outra coisa importante é utilizar crases (`) em volta das palavras. Isso evita quaisquer possíveis erros de palavras reservadas de um banco de dados. Existem algumas, mas citarei uma, que é, por exemplo, a palavra reservada select. Se você tentar criar essa coluna no banco de dados, dará um erro, pois essa (palavra) é reservada para o banco de dados, tanto é que nós a usamos para buscar dados. Entretanto, se mesmo assim você quiser usar como nome de uma coluna, basta aplicar a crase, desta maneira: `select`. Um ponto interessante, também, é organizar melhor a criação da tabela. Perceba que tudo está in-line, deixando uma linha loooooooonga no seu código. Escreverei abaixo como você deveria criar suas tabelas de agora em diante. dbExec( db, [[ CREATE TABLE IF NOT EXISTS `Estoque` ( `ID` INT(11) NOT NULL, `Quantia` INT(11) NOT NULL, ); ]] ); dbExec( db, [[ CREATE TABLE IF NOT EXISTS `Carros` ( `ID` INT(11) NOT NULL AUTO_INCREMENT, `account` VARCHAR(64) NOT NULL, `idCar` INT(11) NOT NULL, `state` VARCHAR(16) NOT NULL, `placa` VARCHAR(16) NOT NULL, `imposto` INT(11) NOT NULL, `seguro` TINYINT(1) NOT NULL, `dataCar` JSON NOT NULL, `dataTuning` JSON NOT NULL, ); ]] ); dbExec( db, [[ CREATE TABLE IF NOT EXISTS `Slots` ( `account` VARCHAR(64) NOT NULL, `quantia` INT(11) NOT NULL, ); ]] ); Pode parecer muito mais complicado, mas não é. Tudo que está aí faz parte da criação de uma tabela no banco de dados, independente da sua aplicação. Nós devemos montar a estrutura para que tudo ocorra bem durante o processo de manipulação de dados. Provavelmente não usei os tipos corretos, pois "chutei" o que cada coluna poderia ser, vai de você adaptar, já que o sistema é de sua criação. Aqui tem uma mensagem minha em nosso canal do Discord que explico mais sobre uma tabela ruim, e como ela deveria ser escrita. Perceba que também existe uma coluna com o tipo de dado JSON, porém, não recomendo. Eu poderia explicar aqui também o porquê, mas minhas respostas no canal do Discord já respondem esses porquês. Sobre os possíveis tipos de dados, confia todos aqui. Recomendo que, quando você tiver tempo livre, leia atentamente como eles funcionam, quantos bytes eles consomem. É importante entender cada um deles — ou somente os mais usados, caso prefira. -
Tem como restartar o mtaserver com o server ligado?
androksi replied to Doongogar's topic in Programação em Lua
E aí, @Doongogar — tranquilo? Só para complementar neste tópico, há algumas configurações que você pode alterar enquanto o servidor está online. Use a função setServerConfigSetting. No próprio site da função existem algumas propriedades que estão disponíveis para serem alteradas. Off-topic: Gostei dos passos a seguir pro servidor desligar. Geralmente o pessoal só fecha o MTA Server e os jogadores ficam sem entender nada... @Lord Henry -
Só para complementar, recentemente foi criado uma nova propriedade para a função setWorldSpecialPropertyEnabled. Basta você usar desta maneira e nenhum carro do servidor irá pegar fogo e/ou explodir ao capotar. -- Server addEventHandler("onResourceStart", resourceRoot, function() setWorldSpecialPropertyEnabled("burnflippedcars", false) end)
-
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.
-
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.
-
E aí, @n0_name — beleza? O shader que você procura está aqui: https://community.multitheftauto.com/index.php?p=resources&s=details&id=18094
-
Erro 'AutoStart' | Crashando MTA
androksi replied to Doongogar's topic in Ajudas relacionadas ao MTA:SA (Cliente/Servidor)
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. -
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.
- 5 replies
-
- save destroyelement
- save
-
(and 2 more)
Tagged with:
-
Sistema de personalizar skin em armas
androksi replied to AllissonDxyz's topic in Programação em Lua
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. -
Nick e a barra de Vida de cima da cabeça do player
androksi replied to Paulo Guilherme's topic in Programação em Lua
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 -
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.
-
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
-
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 ..." } );
-
E aí, @Klehber — como é que você está? Tente remover a verificação da variável isPlayerInsideMarker.
-
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.
-
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.
-
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.
-
Como fazer Concatenação de uma Variável no Shared?
androksi replied to Gustavik's topic in Programação em Lua
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. -
E aí, @AkiraLofy. Tudo em cima? Para realizar tal ação em HTML, você precisa também ter conhecimento básico sobre JavaScript, pois será necessário o uso da função executeBrowserJavascript. Essa função executa um código (JavaScript) na sua página HTML. Se quiser mais informações, deixarei um link abaixo sobre isso. Link: https://github.com/moon91210/mta-notifications
-
E aí, @wesssley. Beleza? Altere esta linha no seu código: de removePedFromVehicle(occupant, vehicle) para removePedFromVehicle(occupant, source) Pois o source do evento é o próprio veículo, de acordo com o que você passou na função triggerClientEvent, segundo parâmetro.
-
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 ?
-
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 )
-
deixar todos os objetos do server de um tal modelo inquebravel
androksi replied to Doongogar's topic in Programação em Lua
E aí, @SciptNovato! Belezinha? Existe a função setObjectBreakable, você pode usá-la combinando com o evento onClientResourceStart. Depois, basta criar um laço de repetição em todos os objetos do servidor e verificar com getElementModel somente aqueles modelos que você deseja — pode até criar uma tabela para isso. -
E aí, @SciptNovato. Beleza? Você pode usar math.floor (para arredondar para baixo) ou math.ceil (para arredondar para cima). Exemplo: local number = 25.912 print(math.floor(number)) -- 25 print(math.ceil(number)) -- 26
-
setPlayerName não está alterando o nome
androksi replied to Joao_Preis's topic in Programação em Lua
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: