Jump to content

androksi

Other Languages Moderators
  • Posts

    546
  • Joined

  • Last visited

  • Days Won

    38

Everything posted by androksi

  1. A opacidade está sendo aplicada? O negócio da colisão precisa estar atualizando sempre que um novo carro é criado, você precisa desenvolver alguma lógica pra isso - não irei explicar aqui, pois não faz parte do tópico. Mas de qualquer forma, é pra funcionar. Inclusive, este tópico já está com muitas postagens. Dê mais algumas olhadas, faça testes no seu servidor local e afins. Porque pode ser que algo esteja dando conflito no servidor em si, diante aos outros resources. Aplique mais detalhes nas suas respostas, também. Como imagens da pasta onde os arquivos estão, conteúdo do meta.xml, possíveis erros no debugscript 3.
  2. O código está funcionando. Fiz os testes. Veja o resultado abaixo: (aquele "Funcionou" ali, é porque o veículo teve o ghostmode ativado com sucesso)
  3. Usei o seu código para exemplificar melhor, pois você parece estar começando com scripting. Não há nenhum problema nisso. Inclusive, continue assim pedindo ajuda. Porém, peço que leia a documentação das funções, é de suma importância. Também, tente não copiar códigos. Escreva para que fixe melhor na sua mente como o problema poderia ser resolvido.
  4. Lá, no client-side. Também, por favor, verifique os parâmetros da função setElementCollidableWith. Não são apenas dois. Leia a documentação da página de ajuda.
  5. Muito bom que tenha conseguido aplicar a opacidade no veículo. ? Agora, sobre a colisão, se você visitar o site da função setElementCollidableWith, verá que é client-side! Isso significa que você deverá usar uma outra função, triggerClientEvent, para executar a colisão lá. Visite o site dela e veja como funciona. Apenas reforçando o seu código acima: source já é o veículo, você não precisa utilizar getPedOccupiedVehicle para obtê-lo novamente. Evite redundâncias.
  6. It's public because it was leaked. Sorry. We do not support leaked resources/gamemodes here.
  7. Sim, está correto. Dessa vez você entendeu. Fico feliz que tenha se esforçado. Sobre não estar funcionando, tenha certeza de que o código esteja rodando server-side. Verifique, também, se o nome da elementData está correta. Pode ser alguma outra parte do código que esteja fazendo-o não funcionar. Faça as devidas verificações e volte aqui, caso não funcione.
  8. Olá. Por favor, formate o código usando a ferramenta disponibilizada. A marcação em vermelho é onde você usa para adicionar códigos à sua postagem; A marcação em verde é onde você usa para adicionar um spoiler, devido ao código ser muito grande. Considere adicionar o código dentro dele.
  9. Veja esta imagem: Os parâmetros que serão passados no evento estão escritos ali em cima. Sendo eles: thePed, seat, jacked. Os nomes não importam muito, mas sim, você deve ser o mais descritivo possível. Aqui um exemplo de como você iria usar: addEventHandler("onVehicleEnter", root, function(thePlayer, seat) if seat == 0 then -- verifica se é o banco do motorista -- continue o seu código end end)
  10. Acredito que você não prestou atenção na documentação dos eventos citados, nem no que eu disse. Por favor, leia novamente e veja, com atenção, o código de exemplo mostrado na documentação. Nós não damos códigos prontos aqui. O intuito é fazer com que a pessoa entenda e faça por elas mesmas. Mais uma vez: source é o veículo; o primeiro parâmetro do evento é o elemento do jogador; o segundo, é o assento.
  11. Olá. Veja os parâmetros do evento onVehicleEnter. Você está utilizando de forma incorreta. O próprio evento já fornece o elemento do veículo, que no caso é o source, você não precisa definí-lo. O primeiro parâmetro é o elemento do jogador. O segundo, é o assento no qual o jogador sentou - é importante verificar se foi o motorista! O mesmo se aplica ao outro evento.
  12. Olá. Há toda uma polêmica sobre o uso dessas funções, por conta de desempenho dentro do servidor. Minha recomendação é que você dê uma estudada em tabelas, e também sobre como sincronizá-las. Mas vamos lá. A função setElementData possui um quarto parâmetro, sendo os valores aceitos true ou false. Caso você não for usar o dado no outro lado, opte por definir como false. Por padrão, você não precisa mexer nisso, a menos que seja necessário ter o dado em ambos lados, tanto client-side como também server-side. Aqui um exemplo: -- Server-side addCommandHandler("uuu", function(player) setElementData(player, "player.accountName", getAccountName(getPlayerAccount(player))) end) -- Client-side addCommandHandler("account", function() local cAccountName = getElementData(localPlayer, "player.accountName") or "?" outputChatBox("A sua conta é: " .. cAccountName) end) Pelo amor de Deus, nunca faça algo assim.
  13. Olá! Você pode usar a função setVehicleColor para isso. Também é válido postar o código que você está trabalhando, ao menos uma parte dele para que nós possamos ajudar. Além da função citada, você também irá usar: addCommandHandler - para adicionar o comando, fazendo com que o jogador possa usá-lo para alterar a cor. getPedOccupiedVehicle - para obter o veículo no qual o jogador está.
  14. E aí novamente. Presumindo que você tenha "criado um botão", funções DX não são tratadas da mesma forma que GUI. Em DX, você deve usar o evento onClientClick, onde ele recebe alguns parâmetros, sendo os dois primeiros o lado do botão que foi clicado (left, right; esquerda, direita) e o estado, que eu recomendo a você usar o up, em cliques casuais. Aqui um exemplo de uso: Off-topic: evite criar mais um tópico sobre o mesmo assunto, você poderia ter usado este tópico para comentar a sua dúvida. ?
  15. Olá. Não, você não precisa de uma conta no GitHub. Basta acessar o repositório do dgs e seguir a imagem abaixo, após clicar no botão Code, que está na cor verde.
  16. Leia minha postagem novamente, @Boechat. Acabei de editar, falando em relação ao cache. ?
  17. Infelizmente não tem uma forma que seja 100% eficaz, quando o assunto é proteção via IP. O que você pode fazer é: Compilar os seus arquivos antes de enviá-los ao servidor; Não usar resources baixados na Internet, caso ele esteja compilado, pois você não sabe o que tem no código. Considere também excluir o arquivo do cache do cliente. Não é uma proteção, até porque é burlável, mas pelo menos o malandro precisará dar umas voltas. Lembrando que apenas arquivos client-side são carregados para o cliente. Desta forma você remove o arquivo: if fileExists("nome_do_arquivo.lua") then -- ou .luac, caso esteja compilado fileDelete("nome_do_arquivo.lua") end Esse código deve ser adicionado ao final do conteúdo do seu arquivo. Evite usar cache="false" no meta.xml, como uma forma de poupar memória RAM do seu servidor.
  18. Introdução O conteúdo deste tópico será separado por seções, ensinando passo-a-passo cada detalhe - desde criar um BOT no site do Discord Developers, até finalmente ligá-lo e executar os comandos, que serão enviados para o seu servidor MTA. Siga todos os passos para que tudo dê certo. Configurando o ambiente Bom, para que nós possamos iniciar, é necessário instalar duas coisas no seu computador: Node.js e Visual Studio Code. Só um adendo: não é estritamente necessário usar o VSCode, estou apenas sugerindo-o, e também é a IDE que irei utilizar neste tutorial. Após instalá-los, seguiremos a próxima seção. Como criar um BOT no Discord Developers Acesse este link: https://discord.com/developers/applications - se você não estiver com uma sessão do Discord aberta no navegador, faça o login para que você possa acessar as funcionalidades desse site. Provavelmente, após entrar numa sessão, uma página como esta irá surgir: Ignore as minhas aplicações. O seu estará vazio - eu acho. Para iniciarmos a criação de uma nova aplicação, clique no botão que está no canto superior direito: Escolha o nome que desejar, isso não importa muito para este tutorial. Uma vez criada, uma outra página aparecerá, com mais informações. Primeiramente, vá até a aba Bot. O botão fica ao lado esquerdo: Agora, para que criemos de fato o BOT, clique no botão ao lado direito: Um pop-up irá aparecer, basta clicar em Yes, do it! Mais uma vez, irá carregar, na mesma aba, mais informações, agora sobre o seu BOT. Não compartilhe nada do que estiver escrito na página, com ênfase no seu token, que faz o seu BOT ficar online. Agora, voltemos para a aba principal: Nessa aba, você possui o Client ID da sua aplicação. Esse ID não é o token, você não precisa se preocupar caso compartilhe com alguém: Copie-o e acesse este link para que possamos dar continuidade: https://discordapi.com/permissions.html. Nesse site, nós podemos gerar o link de convite, no qual você irá precisar para adicionar o BOT no seu servidor do Discord. Cole o ID que você copiou neste campo: Também, selecione a permissão de administrador, que fica logo acima: Feito todos os passos, copie o link, abra uma nova aba no seu navegador e acesse o link gerado. Ele é parecido com este: Assim que você acessar, selecione o servidor no qual você quer adicionar o BOT e confirme tudo o que é pedido. Caso você tenha feito corretamente, o seu BOT já está no seu servidor. Vamos a próxima seção. Clonando o repositório do BOT Optei por criar um repositório no GitHub para que fique mais fácil este tutorial. Se você não sabe o que é clonar, apenas clique no botão de baixar, ao invés de clonar. Ele é assim: Clique em Download ZIP. Uma vez que temos o repositório no computador, descompacte-o na área de trabalho mesmo. Feito isso, uma pasta será criada. Agora, abriremos o VSCode. Siga estas instruções: Você irá selecionar a sub-pasta, que está dentro do pasta descompactada. Preste atenção ao selecionar. Há uma outra pasta dentro daquela que extraímos, abra a pasta correta. O resultado deve ser este: Ignore os ícones, fonte, cor de fundo. São extensões que eu uso. Vamos a próxima seção. Como instalar os pacotes da aplicação Ainda no VSCode, pressione CTRL + ' (aspas simples). O terminal irá abrir. Com ele aberto, digite o comando npm install. Os pacotes serão instalados - uma nova pasta e arquivo serão gerados. Não se preocupe com isso, não faz parte deste tutorial. Próxima seção! Como habilitar o Modo Desenvolvedor no Discord Para que nós possamos avançar a próxima seção, nós precisamos habilitar o modo desenvolvedor, para obter os IDs de canais, servidor, usuário, cargos e outros. É simples. Acesse as configurações da sua conta, clique na aba Aparência, desça tudo e irá se deparar com isto: O meu já está ativado. Caso o seu não esteja, ative-o. Next... Configurando as variáveis do BOT Agora que nós já podemos copiar o ID de alguns elementos do Discord, iremos configurar os arquivos que estão dentro da pasta config, abra-a. Os arquivos são estes: Primeiramente, crie um canal no seu servidor do Discord e copie o ID dele. Basta clicar com o botão direito em cima e copiá-lo. Abra o arquivo channel.js e apenas altere o valor que está lá. Salve o arquivo e abra o próximo, guild.js. Para eu não me estender muito, você fará os mesmos passos acima, copiando o ID e substituindo. Para copiar o ID do seu servidor, basta clicar com o botão direito em cima do nome dele. Já no arquivo mta.js, você deve alterar as informações de acordo com o seu servidor. Veja a explicação abaixo. ip - do seu servidor. httpPort - a porta HTTP do seu servidor, você pode consultá-la aqui neste site. username - crie um usuário no seu servidor e dê permissões administrativas para ele. password - a senha que você colocou no usuário. ATENÇÃO: USE UM USUÁRIO E SENHA QUE NÃO SEJA FÁCIL DE DESCOBRIR, LOGO NÃO COMPARTILHE COM NINGUÉM. Em relação ao outro arquivo, prefix.js, é apenas o prefixo que você usará nos comandos, altere se quiser. O arquivo token.js fala por si só, você irá pegar o token de acesso do seu BOT, lá no site do Discord Developers e substituir dentro do arquivo. Acompanhe na imagem abaixo. Bom, já disse na seção passada que você não deve compartilhar o token. Seguiremos a próxima. Clonando o repositório do resource Assim como no repositório do BOT, o resource também está no GitHub. Baixe-o, da mesma forma do BOT, mas agora adicione no seu servidor MTA, na pasta resources. Lembrando que deve-se extrair e colocar a pasta correta, verifique bem a sub-pasta. Uma vez adicionado no seu servidor, use o comando refresh para atualizar a lista de resources e inicie-o. Ah, e também dê permissões administrativas para ele! Pronto. Já podemos prosseguir. Iniciando o BOT Estamos quase ao ponto de executar os comandos. Vamos iniciar o BOT. Agora no VSCode, naquele mesmo terminal, use o comando npm start. Se tudo foi feito corretamente, ele irá se iniciar sem erros e uma mensagem dizendo que o BOT foi ligado deve aparecer. Testando os comandos Lembra que nós criamos um canal para executar os comandos? Pois é agora que iremos utilizá-lo. Lembre-se: o seu servidor deve estar ligado - entre nele também para que você possa ver as mensagens no chat. Alguns comandos que eu fiz, apenas para exemplificar. Você pode adicionar mais comandos se quiser. Se você não alterou o prefixo, aqui estão os comandos que fiz. (Você deve ser ADMINISTRADOR do seu servidor para executá-los) $settime <hora> <minuto> - $settime 12 00 | Irá alterar o clima no servidor. $text <mensagem> - $text opa, jogadores, tudo bem? | A mensagem será enviada no chat do servidor. $status | Mostrará algumas informações do servidor no chat do Discord. $mute <jogador> - $mute andr0xy | O jogador ficará mutado até se reconectar. $givemoney <jogador> <quantia> - $givemoney andr0xy 15000 | Dá dinheiro ao jogador. $cgroup <nome> - $cgroup VIP | Cria um grupo na ACL. Apenas uma observação: é possível sim, nos comandos que envolvem jogadores, executá-los pelo ID. Basta você editar o resource - não irei explicar como faz isso, pois não tem relação ao tutorial. Agradecimento & Informações Muito obrigado por seguir o tutorial. Fiz com o ❤ para toda a comunidade. Espero que vocês evoluam ambos códigos e que isso se torne muito maior dentro do servidor de vocês. Lembre-se que tudo é possível no MTA, contribuam sempre de alguma forma para que outros também possam evoluir. A união é importante nessa área. Busquem conhecimento! Crédito ao autor da SDK, o que faz ser possível conectar-se ao servidor MTA. 4O4 - GitHub Edições neste tutorial 28.01.2021 - AVISO: renomeie o resource para discordapp. 29.01.2021 - CORREÇÃO: texto confuso na seção Clonando o repositório do BOT. 29.01.2021 - AVISO: código do resource refatorado, sendo mais fácil adicionar novos comandos.
  19. Obrigado. ? Exatamente. O nome da função no código do 4O4 é testProcedure, no qual estou substituindo por discordGiveMoney. Você pode encontrar a função em questão dentro do arquivo discord.lua. Essas funções devem ser exportadas, server-side, como mostrei no código do arquivo meta.xml. Sobre a sua recomendação, eu mesmo irei criar um tutorial, com mais informações e mais código. Mas não por agora.
  20. É possível sim. Você precisa de alguma SDK, para criar a conexão entre o seu app (bot) e o servidor MTA. Aqui estão algumas SDKs feitas pelos próprios administradores/staff do MTA: https://github.com/botder/mtasa-discord-bot - por botder https://github.com/4O4/node-mtasa - por 4O4 Você precisa ter um pouco de conhecimento em relação aos módulos/pacotes do Node.js. Está tudo explicado em ambos links. Particularmente, eu acho os dois muito bons, apesar de que o primeiro, feito pelo botder, possa ser um pouco mais complicado configurar, porém é o mais completo. Irei explicar sobre a SDK feita pelo 4O4. Ao abrir o link, você irá se deparar com esta página: https://prnt.sc/xpky0k - deixei em formato de link, pois a imagem é grande. Desça um pouco a página, terá as instruções sobre como usar. Lembrando que o seu app (bot) deve ser em JavaScript, utilizando o framework Discord.js. Este é o comando que você irá utilizar para adicionar o pacote ao seu projeto: Aqui, é onde você irá carregar o pacote e logo em seguida instanciar a classe Client: Feito isso, agora você deve configurar o IP do seu servidor, porta (HTTP), nome de usuário e senha - lembrando que eles, nome de usuário e senha, devem possuir acesso admin ao servidor. Sugiro criar uma conta dentro do seu servidor só para esse propósito. Insira uma senha forte. Você fará o procedimento acima desta forma: - a ordem dos parâmetros é a mesma que eu citei acima. IP, Porta (HTTP), usuário e senha. Finalmente, você está apto para criar uma comunicação com o seu servidor MTA através de comandos do seu app (bot). A imagem abaixo mostra duas opções de implementação. (lembrando que o código deve estar dentro de um bloco de comando, não irei me estender muito, mas você pode voltar aqui para retirar suas dúvidas. ?) A primeira implementação é feita baseada em Async/Await, ou seja, de forma bem resumida, o seu código será assíncrono. O app (bot) irá esperar uma resposta do servidor para continuar a execução do código por completo, uma vez que o await é chamado para alguma função. Já a segunda, é um pouco mais antiga, feita através de Promises. Sobre o código mostrado acima, vou explicar um pouco mais sobre ele. Uma vez que a conexão está aberta (no caso, armazenada na variável mta), nós podemos obter os resources do servidor, através da propriedade resources, como mostrado no código abaixo - leve em consideração, a partir daqui, o segundo método, sem async/await. mta.resources Quando nós obtemos os resources, é possível buscar algum em específico, da mesma forma, usando a notação ponto. Em nosso caso, o código está buscando pelo resource nomeado de test_resource. Finalmente, quando buscamos por ele, você pode usar qualquer função que esteja dentro dele - a função deve ser exportada, com o atributo http definido como true. Então, vamos criar um exemplo de código, usado no MTA. Arquivo discord.lua onde ficará suas funções que farão alguma ação dentro do jogo: Arquivo meta.xml, no qual você exportará as funções do arquivo acima: Sobre o arquivo discord.lua: tudo o que está retornando, aparecerá como um feedback em result, aqui: Recomendo fortemente que você retorne qualquer feedback, para facilitar a sua visualização, se um comando foi efetuado ou não com sucesso dentro do servidor.
  21. Estranho. Acabei de testar e está funcionando normal. Código que eu usei: local status = false addCommandHandler("sprint", function(p) status = not status toggleControl(p, "sprint", status) outputChatBox("Sprint is now " .. (status and "enabled" or "disabled") .. ".", p, 0, 255, 0) end) Demonstração: https://streamable.com/4gjijx
  22. toggleControl - junto com a propriedade sprint.
  23. A solução encontrada por vocês, é sim eficaz, porém podem haver sobrecargas no servidor, devido à função isObjectInACLGroup. Caso o servidor atinja uma quantidade considerável de jogadores - mais que 100 - essa função pode até causar um NETWORK TROUBLE no servidor. Claro que não é tão assim de forma exagerada, depende de vários fatores, incluindo o potencial de processamento do servidor - mas né, não vamos deixar algo mal feito. Você poderia definir um timer assim que o jogador entrar numa sessão (login). Dessa forma, cada um iria receber o prêmio (ou dinheiro, como vejo no exemplo acima), de acordo com a sessão. Ninguém iria receber ao mesmo tempo, o que já tiraria uma grande responsabilidade do servidor de processar várias informações de uma só vez. Porém, também tenho alguns contras sobre o setTimer. Infelizmente, terá vários timers dentro do resource rodando. O que pode ou não ser um problema - ao meu ver, não é tão prejudicial assim. Mas, venho com outra solução, que seria melhor! Assim que o jogador entrar na sessão, insira-o numa tabela e, ao invés de percorrer todos os jogadores usando o getElementsByType, você iria percorrer apenas a tabela, com alguns jogadores apenas. Isso sim já seria uma ótima solução e que causaria o mínimo de impacto no servidor. Pode parecer uma solução meio grande à primeira vista, mas é bem otimizada. O timer só irá se iniciar caso algum jogador Premium entre numa sessão - apenas uma vez, claro; O timer também irá se desfazer e ser destruído caso não haja mais jogadores premium no servidor; Concluindo, você evitou de percorrer todos os jogadores do servidor - que poderia ser acima de 100, 200 ou até 300 - para uma simples tabela que haverá alguns jogadores. Acredito eu que, menos de 50 jogadores. O importante é otimizar os timers e ser o mais específico e objetivo possível.
×
×
  • Create New...