Jump to content

[M]ister

Members
  • Posts

    444
  • Joined

  • Last visited

  • Days Won

    3

Everything posted by [M]ister

  1. Obviamente... a não ser que você priorize facilidade na codificação ao invés de um bom desempenho do script na máquina/rede.
  2. https://forum.multitheftauto.com/search/?q=download&type=forums_topic&nodes=127 Você quem escolhe, pois dá para fazer nos dois.
  3. Exemplo de uso (server-side) local capacetes = {} addCommandHandler("capa1", function(player) if (not capacetes[player]) then -- se não possuir capacete --[[ -- adiciona capacete capacetes[player] = createObject(capa1, 0, 0, 0, 0, 0, 0) exports.bone_attachCapa:attachElementToBone(capacetes[player], player, 1, 0, 0.04, 0.07, 0, 270, 0) --]] end end ) addCommandHandler("tirar", function(player) if (capacetes[player]) then -- caso possua capacete --[[ -- remove capacete if (exports.bone_attachCapa:isElementAttachedToBone(capacetes[player])) then exports.bone_attachCapa:detachElementFromBone(capacetes[player]) end destroyElement(capacetes[player]) capacetes[player] = nil --]] end end ) É bom também efetuar a destruição do objeto no onPlayerQuit do player
  4. Acabei de testar aqui e funcionou... mas notei que a altura que você definiu para o colshape está muito pequena (1), e com isso não estava detectando os elementos, só aumentar um pouco que provavelmente funcionará.
  5. Tente: local vZones = { {x = 190, y = -489, z = 980, width = 65, depth = 60, height = 1}, } local z = {} function initvZones() if vZones and #vZones ~= 0 then for _,v in ipairs (vZones) do if v then if v.x and v.y and v.z and v.width and v.depth and v.height then local c = createColCuboid (v.x, v.y, v.z, v.width, v.depth, v.height) setElementDimension(c,100) if c then z[c] = true for _,veh in ipairs (getElementsByType("vehicle")) do if (getElementDimension (veh) == 100) then if isElementWithinColShape (veh, c) then destroyElement(veh) end end end addEventHandler ("onElementDestroy", c, function() if z[source] then z[source] = nil end end) addEventHandler ("onColShapeHit", c, function (h, d) if h and isElement(h) and getElementType (h) == "vehicle" and d then destroyElement(h) end end) end end end end end end addEventHandler ("onResourceStart", resourceRoot, initvZones)
  6. Pode verificar o isConsoleActive Cliente: local consoleActive = false addEventHandler("onClientRender", root, function() if (consoleActive ~= isConsoleActive()) then consoleActive = isConsoleActive() setElementData(localPlayer,"consoleActive",consoleActive) end end ) Server: addEventHandler("onPlayerCommand", root, function(cmd) if (cmd ~= "say") then return end if getElementData(source,"consoleActive") then cancelEvent() outputChatBox("*Uso inválido!", source, 255, 0, 0) end end )
  7. Existe também o Nginx para Windows: http://nginx.org/en/docs/windows.html O correto não é copiar os arquivos do http-client-files para o diretório(padrão) do servidor web, mas sim configurar para que tal requisição http seja direcionada ao diretório http-client-files... desse modo você não teria que se preocupar com possíveis divergências de arquivos entre o servidor de MTA e seu sistema de download... procure por DocumentRoot e Directory no arquivo de configuração do Apache, e troque pelo endereço do http-client-files E para desabilitar a listagem dos diretórios, procure por “Options Indexes", e então remova esse Indexes (Apache) Se usar o Nginx, muitas opções serão semelhantes ao tutorial da WIKI
  8. Não tem como definir as propriedades para jogadores específicos, mas dá para separar com base nas habilidades... por exemplo, todos os jogadores da acl Admin você define com a habilidade “pro” (definindo o norecoil) e todos os demais jogadores em outra categoria: “std” ou “poor” (sem definir o norecoil). Veja: setPedStat / onPlayerLogin / isObjectInACLGroup
  9. Na realidade tem que baixar de novo sim, pois é salvado na RAM... só não sei se é apagado quando desconecta do servidor ou na falta de energia.
  10. Se tú não liga para desempenho, pode usar o onPlayerCommand addEventHandler("onPlayerCommand",root, function(command) for i,gate in pairs(getElementsByType("object")) do if getElementData(gate,"BaseGate") then local baseName = getElementData(gate,"baseName") if isPlayerAllowed(source,gate) then if getElementData(gate,"pass") == command then --- funções que abre o portão end end end end end )
  11. Lá na última linha tá destroyElement, troque por DestroyMarker (confundi quando reescrevi o trecho)
  12. Tente usar esse: function DestroyMarker(source) if isElementWithinMarker(source, destroyM) then local veiculo = getPedOccupiedVehicle (source) if (veiculo) then destroyElement(veiculo) end end end addCommandHandler("destruir", destroyElement) Se não der, apague o arquivo, crie um novo e tente reescrever de novo, pois o código em si está ok.
  13. Se não me engano, existe animações em que é possível andar normalmente enquanto executa, talvez esse seja o caso... mas ai se a animação que você quer, não seja a que é possível andar, pode tentar coloca-la no lugar de alguma que pode: engineLoadIFP
  14. Já ouvi comentários de um tal bug quando copia e cola o código, tente ao invés de copiar, reescrever o código como está aqui.
  15. Na realidade o ponto chave de aprender é tentar! function DestroyMarker(source) if isElementWithinMarker(source, destroyM) then local veiculo = getPedOccupiedVehicle (source) if (veiculo) then destroyElement(veiculo) end end end addCommandHandler("destruir", DestroyMarker) Não entendi o que tú quer fazer com aquela tabela veh, então deixei de acordo com o que foi descrito no tópico.
  16. Infelizmente sim, embora na wiki não informe, existe essa limitação: LINK Na arma também não tem como, o que fazem é uma “gambiarra” deixando invisível o modelo real da arma e anexando ao ped objetos quaisquer que tiveram seu modelo substituído por alguma arma, ou seja, na verdade a arma personalizada pode ser uma pizza (objeto) que foi grudado na sua mão. Com armas até que é viável, já com carros usando tal técnica seria um negócio bem feioso, pois perderia interação... a lataria não danificaria, o pneu não rodaria, a porta não abriria e etc.
  17. O título pelo mesmo fica claro que é ao menos dois com a mesma .dff De qualquer modo, não tem como um player visualizar diferentes modelos/texturas num mesmo veículo. Em relação a sirene em outras motos, pode-se criar algum script de sirene personalizada, visto que addVehicleSirens não funciona com motos.
  18. txd = engineLoadTXD ( "pmerj.txd" ) engineImportTXD ( txd, 522 ) txd = engineLoadTXD ( "pmesp.txd" ) engineImportTXD ( txd, 521 ) txd = engineLoadTXD ( "detran.txd" ) engineImportTXD ( txd, 461 ) dff = engineLoadDFF ( "model.dff" ) engineReplaceModel ( dff, 522 ) engineReplaceModel ( dff, 521 ) engineReplaceModel ( dff, 461 ) Desse modo, eu teria três motos com o modelo igual, porém com a textura diferente (as texturas devem ser compatíveis com o modelo).
  19. Uma boa também é usar resourceRoot no lugar de root, assim aciona a função apenas para elementos pertencentes ao mesmo resource, evitando com isso chamadas desnecessárias por elementos de outros resources.
  20. API: https://vp9lluyksc.execute-api.sa-east-1.amazonaws.com/dev/mtasa?ip=127.0.0.1&port=22003 Pode usar por enquanto, mas o ideal é você buscar algo próprio seguindo o caminho informado pelo DNL291, pois depender de terceiros (ainda mais em serviços free) você não tem garantia de segurança, estabilidade, etc.
  21. Daquele jeito nunca irá mostrar a 1ª mensagem e também não foi definido condição de parada do timer (vai acessar posições indevidas do array). tMensagems = 1 -- TEMPO cont = 0 MensagensInfo = { "Falta 10 Minutos para acabar o Roud.", "Falta 9 Minutos para acabar o Roud.", "Falta 8 Minutos para acabar o Roud.", "Falta 7 Minutos para acabar o Roud.", "Falta 6 Minutos para acabar o Roud.", "Falta 5 Minutos para acabar o Roud.", "Falta 4 Minutos para acabar o Roud.", "Falta 3 Minutos para acabar o Roud.", "Falta 2 Minutos para acabar o Roud.", "Falta 1 Minutos para acabar o Roud.", "Roud Finalizado. X1 de Costas Será iniciado!", } setTimer(function ( ) cont = cont +1 outputChatBox ('#FF0000[INFO]: #FFFFFF'..MensagensInfo[cont] ,getRootElement(),255,255,255,true) end, tMensagems * 60000 , #MensagensInfo)
  22. Infelizmente para esses casos deve-se recorrer a alguma aplicação externa, seja gratuita ou paga, que dai basta efetuar uma simples chamada com fetchRemote que a aplicação cuida do resto. Na wiki do fetchRemote tem até um exemplo de envio de e-mail. Alguns sites que prestam esses serviços: E-mail: mailgun | sendgrid | mailtrap SMS: twilio, e vários outros por ai... O envio de e-mail é mais viável, podendo inclusive criar seu próprio servidor SMTP responsável por enviar os e-mails, e dai não precisar criar essa dependência com aplicações externas. Caso não queira muito trabalho na configuração dos servidores SMTP+HTTP, pode alugar alguma hospedagem web, que no caso já terá esses serviços, além de possibilitar ações além do envio de e-mail, usando talvez PHP-SDK / Node.js-SDK Já com SMS é mais complicado e custoso, visto as taxas das operadoras e etc… não optaria tal uso nesse caso.
  23. O ponto forte do uso de SMS/E-mail seria notificar o autor sobre as utilizações (ativações) trazendo por exemplo, qual IP ativou o resource, e com isso ser possível detectar casos de vazamento/roubo. Mas a segurança do resource em si (bloqueando utilizações indevidas), já seria o suficiente através do IP, pois o uso de SMS/E-mail para requisitar autorização de ativação se enquadraria mais como luxo, visto que o IP já é um dado que temos e é capaz de efetuar a autenticação através dele, sendo ainda que a utilização desses passos adicionais (gerar um código → enviar e-mail com o código → efetuar ação no e-mail → liberar ativação do resource) para autenticação, podem inclusive tornar o sistema mais vulnerável. Então acho que o ideal seria validar através do IP e caso o IP seja diferente do esperado, comunicasse o autor do resource de alguma forma.
  24. E com guiCreateStaticImage ? Particularmente acho esse processo de conversão custoso, a quantidade de dados transferidos seria algo considerável, e a mudança de formato não garante a segurança do dado, você basicamente está mudando o cabeçalho do arquivo e evitando a leitura por algumas aplicações, mas o corpo, o conteúdo em si, é o mesmo. Se não me engano, o fetchRemote tem um limite de dados para transferência, então dependendo do arquivo essa técnica não servirá. Acho que algo localmente, usando talvez base64 juntamente com alguma criptografia seria mais eficaz e seguro.
  25. Pelo que eu entendi, o site converte o formato do arquivo. Não sei como o MTA consegue carregar corretamente tal arquivo ao realizar essa “fake” mudança de formato... ou você fica efetuando o processo inverso ?
×
×
  • Create New...