Jump to content

androksi

Other Languages Moderators
  • Posts

    542
  • Joined

  • Last visited

  • Days Won

    37

Everything posted by androksi

  1. E aí, @SciptNovato! Sim, tem como você gerar uma lista pronta com o nome de todos os recursos do seu servidor. Mas, para uma melhor organização, considere usar um nome ou sigla antes, fica muito mais fácil e você tem um controle maior. Daí basta criar um recurso para ligar todos de uma só vez. Com considere usar um nome ou sigla antes eu quis dizer isto, por exemplo: sn_vehicles. Sempre separando por underline, aquele traço inferior.
  2. E aí, @XablauzinFT. Tudo beleza? Você pode usar a função setWeaponProperty para obter esse resultado. Há algumas propriedades, você irá utilizar as seguintes: anim_loop_start anim_loop_stop ...para diminuir o tempo entre um tiro e outro. Se não me engano, essas são as únicas propriedades que você necessita. P.S: irá mudar globalmente, ou seja, para todo o servidor, todos os players. Há uma forma de realizar isso individualmente, mas você teria de fazer bastante modificações.
  3. Sobre o código acima, prefira verificar se o elemento que acertou o marcador foi realmente um player, caso contrário irá dar um aviso no debug. Para isso, use a função getElementType. Para fins de boas práticas de programação, tente sempre colocar bons nomes em variáveis, parâmetros de funções e outros — thePlayer não faz sentido ali, pois o que irá tocar será um elemento, seja ele um player, veículo, objeto, tanto faz. Altere para hitElement.
  4. E aí, @SciptNovato. Belezinha? Quando o código é server-side, o elemento do player precisa estar vindo de algum lugar para o servidor reconhecer. Aquele todo seu primeiro código (para referência, veja abaixo) não faz sentido nesse caso — playerSource, targetPlayer e thePlayer não existem ali. Eles precisam estar dentro de alguma função que o player faça sentido. Além disso, prefira usar variáveis locais em vez de globais, irá poupar recursos do seu servidor e irá manter o escopo global do seu servidor limpo. Jogador1 = getPlayerName(playerSource) Jogador2 = getPlayerName(targetPlayer) Jogador3 = getPlayerName(thePlayer) IP1 = getPlayerIP(playerSource) IP2 = getPlayerIP(targetPlayer) IP3 = getPlayerIP(thePlayer) Serial1 = getPlayerSerial(playerSource) Serial2 = getPlayerSerial(targetPlayer) Serial3 = getPlayerSerial(thePlayer) ID1 = getElementData(playerSource, "ID") ID2 = getElementData(targetPlayer, "ID") ID3 = getElementData(playerSource, "ID") players = getElementsByType("player")
  5. E aí, @Guilherme Mendes! Primeiramente, remova aquele else e return false. Segundamente, o i é referência de cada entrada da tabela de veículos, enquanto o v é o elemento do veículo. Um exemplo mais prático: -- A função getElementsByType retorna uma tabela ordenada de elementos. Ela é semelhante a esta: local vehicles = { [1] = vehicle, [2] = vehicle, [3] = vehicle } -- E assim por diante, dependendo de quantos veículos há no servidor. -- Então, quando fazemos um for loop, a primeira coisa que ele irá pegar é o índice (index), enquanto a segunda é o seu valor. for index, value in pairs(vehicles) do -- Index: 1, 2, 3... -- Value: cada elemento 'vehicle' mostrado naquela tabela de exemplo. -- Como boas práticas de programação, é bom deixar claro o que cada coisa recebe. Então em vez de 'value', eu colocaria 'vehicle'. -- Já que é um carro. end
  6. @carlinloko — para cada dano que o player tomar, você pode enviar para o servidor, sem problemas algum. Isso não irá acarretar problemas de desempenho ou qualquer coisa relacionada. Poderia ter 10 players atirando em outro, mas aquele que atirar por último pra matar mesmo, e quando processar essas informações, é que vai de fato contar quem o matou. Pode não ter sido essa sua dúvida. Me diga se eu estiver errado.
  7. E aí, @Muskzeera, de boa? Você precisa obter as informações sobre o dano dado de acordo com quem tá atirando, e não recebendo os tiros. Para isso, você deve usar o evento onClientPlayerDamage, obter os dados que vêm dos parâmetros da função e enviá-los para o servidor, através da função triggerServerEvent.
  8. E aí, @L0KZERATV! O seu tópico está agora trancado para futuras respostas, pois ele contém poucas informações sobre o que o comando citado irá fazer e causar no PC do usuário que usá-lo. Por favor, numa próxima vez, adicione detalhes sobre a execução de um comando.
  9. E aí, @dextzone! Para fazer isso, você precisa levar em consideração o que a pessoa que atira está vendo. Neste caso, é feito o uso do evento onClientPlayerDamage. Pegando as informações que vêm desse evento, basta mandá-las para o servidor, através de um triggerServerEvent. Só tome cuidado pois você terá de cancelar esse evento, usando cancelEvent. Isso significa que todos os jogadores ficarão invencíveis, mas ainda ocorrerá o tratamento dos dados lá no servidor. Sendo assim, haverá uma perfeita sincronia. Qualquer dúvida, basta deixá-la aqui!
  10. E aí, @Kelvenbrryan! Corrigi o código pra você. local alpha = 255 bindKey ( "aim_weapon", "both", function ( _, state ) if getPedWeaponSlot ( localPlayer ) == 6 then if ( state == "down" ) then alpha = 0 elseif ( state == "up" ) then alpha = 255 end for _, v in ipairs ( getElementsByType ( "object", root, true ) ) do if isElementAttachedToBone ( v ) then local id = getElementModel ( v ) if ( id == 2584 ) then setElementAlpha ( v, alpha ) setElementDimension(v, alpha == 0 and 9999 or getElementDimension(localPlayer)) end end end end end Peço que por favor, nas próximas vezes que postar algo, use a ferramenta Code (<>) e indente o seu código.
  11. E aí, @ajobr! Não funciona pois a função que você usou para criar o veículo (createVehicle) não retorna uma instância. Você precisa usar desta forma: local vehicle = Vehicle(411, Vector3(0, 0, 3)) vehicle:setColor(255, 0, 0) Agora, usando a classe Vehicle, você está apto a usar todos métodos disponíveis. Test: cat.zip
  12. E aí, @BruXo! Antes tarde do que nunca, você pode realizar essa checagem usando a função engineGetVisibleTextureNames. Ela retornará uma tabela. Sendo assim, se o tamanho dela for igual a zero, quer dizer que o player usou aquela opção. Exemplo: local screenWidth, screenHeight = guiGetScreenSize() addEventHandler("onClientRender", root, function() if #engineGetVisibleTextureNames() == 0 then dxDrawRectangle(0, 0, screenWidth, screenHeight, tocolor(0, 0, 0, 255)) dxDrawText("Desabilite a função de remover os gráficos.", 0, 0, screenWidth, screenHeight, tocolor(255, 255, 255, 240), 1.5, "unifont", "center", "center") end end) Assim que ele ativar aquela opção, a tela ficará preta e mostrando aquela mensagem encontrada no código acima.
  13. E aí, @koshe! No terceiro parâmetro da função guiGridListAddColumn você define a largura da coluna. Pode ser um valor real de 0 a 1. Tente diminuir o do ID para 0.15, o nome do item para 0.48, preço e quantidade para 0.4. Foi apenas um chute. Vá configurando e testando novos valores.
  14. E aí, @KiritoAguiar! Fiz um algoritmo pra você, e também já deixarei a lista, em formato de tabela, com todas as localizações. Basicamente, o que o meu algoritmo vai fazer, é passar por cada parte do mapa e, conforme o nome da zona muda, ele salva na tabela. No final, ele gera um arquivo. Se quiser ter ainda mais precisão nos nomes, diminua a velocidade. Você pode fazer isso alterando o valor da variável speed. Quanto menor o valor, demorará mais. Só um aviso: durante o processo, ele requer um alto uso de processamento. Algoritmo: Tabela gerada:
  15. O tutorial de hoje é sobre tabelas! Tabelas irão facilitar a sua vida na hora de programar. Além de economizar dezenas de linhas de código, ele ficará muito mais fácil de ser lido por outras pessoas, e também por você mesmo, depois de um certo tempo sem ter contato com o código. Não só essas coisas, como irá te abrir um mar de possibilidades. Clique no texto abaixo para ir diretamente ao site onde o tutorial está. Optei por escrevê-lo no Gist (do GitHub), como uma forma de organizar um pouco melhor. Ir para o tutorial ?
  16. E aí, @MTS_LoneWolf! Poderia mostrar o meta.xml? Talvez você esteja deixando a prioridade de carregamento do arquivo 'shared' por último. Deve ser algo assim: <meta> <info author="androksi" /> <script src="config.lua" type="shared" /> <script src="server.lua" type="server" /> </meta>
  17. E aí, @SciptNovato! Majoritariamente, esse comando dentro da programação possui dois usos: seja para retornar algum valor ou para encerrar o bloco de execução de alguma função ou escopo. Por exemplo, numa função simples de somar dois números: function somar(n1, n2) local valorSomado = n1 + n2 -- Atribui a soma de 'n1 + n2' à variável 'valorSomado'. return valorSomado -- Retorna o valor atribuído. end -- Agora, se nós chamarmos aquela função, ela irá retornar o valor somado. local soma = somar(5, 2) print(soma) -- Printa o número 7. Mais um exemplo, um pouquinho mais complexo: function obterTodosJogadoresNumCarro() local tempTable = {} -- Apenas uma tabela onde os jogadores que estão em um carro ficarão armazenados temporariamente. for i, v in pairs(getElementsByType("player")) do -- Iremos fazer um loop em todos os jogadores. local veh = getPedOccupiedVehicle(v) -- Verificaremos, então, para cada jogador, se ele está em um veículo. if veh then -- Caso esteja, colocamos ele na nossa tabela. table.insert(tempTable, v) end end return tempTable -- Depois de processar todos os jogadores, retornaremos a nossa tabela, contendo apenas os jogadores que estão num veiculo. end -- Agora que temos uma função que retorna algo, então vamos chamá-la. local jogadoresNumVeiculo = obterTodosJogadoresNumCarro() -- A tabela contendo os jogadores ficará, agora, armazenada na nossa variável 'jogadoresNumVeiculo'. print(#jogadoresNumVeiculo) -- Printando a variável, juntamente com #, irá aparecer o total de jogadores que estão num veículo. Agora, um exemplo de como encerrar uma função ou escopo: function blindarVeiculo(player) local veh = getPedOccupiedVehicle(player) -- Iremos pegar o jogador do veículo. if not veh then -- 'if not veh then', isto é, se NÃO houver um veículo, nós iremos retornar uma mensagem ao jogador, informando-o que só é possível blindar um veículo estando em um. return outputChatBox("#cccccc[SERVER] #ffffffEntre em um veículo para blindá-lo.", player, 255, 255, 255, true) end setVehicleDamageProof(veh, true) -- Se passar por aquela condição, então isso aqui será executado, ou seja, o veículo irá ser blindado. outputChatBox("#cccccc[SERVER] #ffffffO veículo foi blindado!", player, 255, 255, 255, true) end addCommandHandler("blindar", blindarVeiculo) Apenas um adendo: nesse return poderia ter simplesmente nada, se não houvesse necessidade de informar ao jogador que ele deve estar num veículo para usar o comando. Coloquei para te mostrar uma possibilidade. Porém, sempre retorne false ou true. Deixar sem nada não é uma boa prática de programação.
  18. E aí, @SciptNovato! Para isso, você precisa multiplicar todos os valores (sx, sy, sz) por algum número. Exemplo: function setVehicleBoost(vehicle, boostMultiplier) local velocityX, velocityY, velocityZ = getElementVelocity(vehicle) setElementVelocity(vehicle, velocityX * boostMultiplier, velocityY * boostMultiplier, velocityZ * boostMultiplier) end addCommandHandler("boost", function(player) local veh = getPedOccupiedVehicle(player) if veh then setVehicleBoost(veh, 1.20) end end) Criei uma função para que seja possível reutilizá-la em outras partes do seu código, caso haja. E por favor, indente o seu código sempre que possível, você pode ver mais sobre indentação aqui neste tutorial:
  19. Olá, @Jubs_noob! Fiz um exemplo para você, explicando linha por linha. Qualquer coisa, só questionar sobre. Segue o exemplo abaixo: local drugMarkersElement = createElement("marker.drugs") -- Criamos um novo elemento no servidor, para armazenar os posteriores markers. -- Vamos criar uma tabela para armazenar as posições (x, y, z) de onde os marcadores serão criados. local markersTable = { { x = 0, y = 0, z = 3 }, { x = -10, y = 5, z = 3 }, { x = 5, y = -20, z = 3 } } -- Adicionamos um evento para ser acionado assim que ESTE resource iniciar. addEventHandler("onResourceStart", resourceRoot, function() -- Iremos fazer um loop sobre aquelas posições dentro da tabela. Dessa forma, nós podemos criar os markers tudo de uma só vez. for index, data in pairs(markersTable) do local x, y, z = data.x, data.y, data.z -- Obtemos o índice (x, y, z) de cada entrada da tabela. local marker = createMarker(x, y, z, "cylinder", 1.2, 255, 0, 0, 120) -- Cria o marker. setElementParent(marker, drugMarkersElement) -- Colocamos aquele nosso elemento (drugMarkersElement) como sendo o 'pai' de cada marker. end end) -- Adicionamos um evento para tratar todos os markers 'filhos' daquele nosso elemento. -- Perceba que 'drugMarkersElement' é definido aqui como sendo a 'fonte' do evento, ou seja, os filhos aparecerão como 'source'. addEventHandler("onMarkerHit", drugMarkersElement, function(hitElement, matchingDimension) local elementType = getElementType(hitElement) -- Obtemos o tipo do elemento que encostou no marker. if elementType == "player" and matchingDimension then -- Se for um jogador que encostou, e bater uma a dimensão atual, então: triggerClientEvent(hitElement, "vinicin:parte1", hitElement) end end)
  20. Olá, @KiritoAguiar! Existe sim essa maneira. Você pode usar estas funções: xmlLoadFile, xmlNodeGetChildren, xmlNodeGetAttribute e xmlUnloadFile. Fiz um exemplo abaixo de como usá-las, já resolvendo o seu problema. Comentei as linhas para que você possa entender melhor. local validNodeNames = { ["script"] = true, ["file"] = true } function getFilesFromMeta(resourceName) local files = {} -- Uma tabela para armazenar os arquivos. local path = (":%s/meta.xml"):format(resourceName) -- Criamos o caminho para o meta.xml. if fileExists(path) then -- Checa se o caminho existe. local meta = xmlLoadFile(path) -- Carregamos o meta.xml. if not meta then -- Se não carregar corretamente, então cancelaremos a execução do código abaixo. return false end local nodes = xmlNodeGetChildren(meta) -- Obtém aquelas tags dentro do meta.xml (file, script, etc) for i, v in pairs(nodes) do -- Fazemos um loop nessas tags. local nodeName = xmlNodeGetName(v) -- Aqui, estamos obtendo o nome dessas tags. if validNodeNames[nodeName] then -- Criei uma tabela simples para filtrar o tipo de tag que eu desejo. Nesse caso, só 'script' e 'file' mesmo. local attrPath = xmlNodeGetAttribute(v, "src") -- Iremos pegar o caminho que o arquivo está, por exemplo: server/config/main.lua files[#files + 1] = { path = attrPath, type = nodeName } -- Coloca a informação de caminho e tipo do arquivo dentro da tabela. end end xmlUnloadFile(meta) -- Descarrega o meta.xml, removendo-o da memória. return files -- Retorna a tabela pronta para nós. end return false end -- Usei o # aqui para obter o total de scripts e files (juntos), dentro do resource admin. iprint(#getFilesFromMeta("admin"))
  21. Olá, @Jubs_noob! A imagem que você tentou enviar (é uma imagem?) não carregou aqui, mas suponho que seja uma barrinha. Considerando que você queira criar em DX, e também seria o mais adequado, por não ter limites de design, é necessário criar duas barrinhas: uma que ficará atrás, sendo o fundo, e outra que irá representar o valor. Por exemplo: addEventHandler("onClientRender", root, function() local barWidth = 150 -- A largura da barrinha. local playerHealth = getElementHealth(localPlayer) dxDrawRectangle(0, 0, barWidth, 25, tocolor(30, 30, 30, 220)) -- A barrinha que ficará no fundo. dxDrawRectangle(0, 0, (playerHealth / 100) * barWidth, 25, tocolor(255, 55, 55, 255)) -- A barrinha que representará o valor atual da vida do jogador. end) O código acima, uma vez executado, irá criar uma barrinha de vida no canto superior esquerdo. Perceba que há um cálculo para saber qual o tamanho que barrinha deve estar, dependendo do valor atual da vida do jogador. Me refiro a este: (playerHealth / 100) * barWidth Basicamente, nós estamos dividindo a vida pelo seu máximo, isto é, no seu servidor a vida de um jogador só chegará a 100. Digamos que, então, o jogador esteja com a vida completa (100, representado pela variável playerHealth). Se fizermos 100 / 100, dará 1, então multiplicamos pelo tamanho da barrinha (barWidth). Resultará no valor total dela, que seria 150 nesse meu exemplo. Outra representação, seria a vida do jogador estando em 50. 50 / 100 resulta em 0.5, se multiplicarmos pelo tamanho da barrinha, irá resultar na metade dessa barrinha de vida. 0.5 * 150 = 75. Ah, e claro, nós aplicamos esse cálculo apenas naquele retângulo que irá representar a vida.
  22. Seja bem-vindo(a) ao fórum, @Pereiraa16! ? Remover a tecla T para falar no chat, só fazendo um sistema inteiro de chat novamente. O que você pode fazer com o chat atual, é bloqueá-lo para os jogadores, ou seja, eles não poderão enviar mensagens. Para isso, use o evento onPlayerChat. Um pequeno exemplo abaixo: addEventHandler("onPlayerChat", root, function(message, messageType) if messageType == 0 then -- 0 significa o chat 'say', T if not hasObjectPermissionTo(source, "command.mute") then -- Se não tiver permissão de moderador ou superior, então cancelamos o evento. cancelEvent() -- A mensagem não seria enviada. end end end)
  23. Hello, @oblivionosaka! You can always search for resources on our community, where it does have free resources to use, published by scripters. The one you're looking for is here. Also, you can learn Lua (and also MTA scripting) to code your own. By the way, take a look at this function: getPlayerPing.
  24. O código é client-side, como o Lord Henry disse. Provavelmente você manteve no server-side.
×
×
  • Create New...