-
Posts
545 -
Joined
-
Last visited
-
Days Won
38
androksi last won the day on April 22
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
8,803 profile views
androksi's Achievements
-
androksi changed their profile photo
-
FernandoMTA started following 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.