Jump to content

Lord Henry

Other Languages Moderators
  • Posts

    3,965
  • Joined

  • Last visited

  • Days Won

    179

Everything posted by Lord Henry

  1. Ao iniciar o resource, dará erro sempre que algum jogador não estiver em um veículo, pois a variável local v será false. Você pode evitar esse erro adicionando essa linha antes do for: if not v then return end Mas saiba que qualquer veículo criado depois que essa função já foi chamada, terá colisão normal. Essa função só vai deixar fantasma os veículos que já existiam antes. Além disso, você colocou root ali no eventHandler, isso significa que ele vai chamar essa função sempre que qualquer resource for iniciado. Se você quer que funcione somente ao reiniciar este resource, troque o root por resourceRoot que é a forma resumida de getResourceRootElement(getThisResource()).
  2. @ABR na próxima vez utilize o botão <> do fórum para colocar seu script. Não cole ele direto no texto.
  3. Você pode melhorar seu código utilizando tabelas e loop em vez de ficar adicionando cada comando em uma função separada. Para deixar o jogador imortal, basta colocar uma elementData nele e verificar se ele tem essa data no client. Se tiver, cancela qualquer dano que ele recebe. server.lua local teleportes = { -- [comando] = {x, y, z, nome}, ["cj"] = {2466.6, -1669.82, 13.475, "o CJ"}, ["shp"] = {1129.24, -1468.47, 15.74, "o Shopping"}, ["conce"] = {552.06, -1260.37, 17.24, "a Concessionária"}, ["aldeia"] = {2159.42, -979.93, 17.24, "a Favela da Aldeia"}, ["ljarmas"] = {2162.64, -1732.49, 17.28, "a Loja de Armas"}, ["pvp"] = {437.1, -6549.2, 14.3, "a Área de PvP"}, } local imortais = {} function telePlayer (thePlayer, cmd) -- Função que é ativada pelo addCommandHandler. if teleportes[cmd] then -- Se o comando utilizado existe na tabela, então: if imortais[thePlayer] then -- Se o jogador ainda está imortal, então nada acontece. outputChatBox("Aguarde 3 segundos para teleportar novamente.", thePlayer, 255, 60, 0) return else imortais[thePlayer] = true -- Adiciona o jogador na tabela de imortais. setElementAlpha(thePlayer, 150) -- Deixa o player translúcido (fantasma) pra mostrar que está imortal. setElementData(thePlayer, "imortal", true) -- Coloca essa elementData nele pra deixá-lo imortal. setTimer(function() -- Depois de 3 segundos, tira o jogador da tabela de imortais, deixa ele opaco novamente e remove a data de imortal dele. imortais[thePlayer] = nil setElementAlpha(thePlayer, 255) removeElementData(thePlayer, "imortal") end, 3000, 1) end local x, y, z, nome = unpack(teleportes[cmd]) -- Pega as infos desse item da tabela e separa em variáveis. setElementPosition(thePlayer, x, y, z, true) -- Teleporta o player. -- setElementRotation(thePlayer, 0, 0, 0) outputChatBox("[Teleporte] O jogador #ffffff"..getPlayerName(thePlayer).." #FF3C00foi para "..nome..". [/"..cmd.."]", root, 255, 60, 0, true) -- Manda essa mensagem pra todo mundo. end end for cmd,v in pairs (teleportes) do -- Faz um loop pela tabela, adicionando todos os addCommandHandlers. addCommandHandler(cmd, telePlayer) end client.lua addEventHandler ("onClientPlayerDamage", root, function () if getElementData(source, "imortal") then -- Se o jogador que tomou dano tem essa elementData, então cancela o dano e nada acontece. cancelEvent() end end) addEventHandler ("onClientPlayerStealthKill", localPlayer, function (targetPlayer) if getElementData (targetPlayer, "imortal") then -- Se o jogador que está sendo alvo da facada fatal tiver essa elementData, impede que ele tome a facada e nada acontece. cancelEvent() end end)
  4. Substitua essa linha: if isPedInVehicle(localPlayer) then Por essa: if getPedOccupiedVehicle(localPlayer) then
  5. O terceiro parâmetro representa o jogador que está tendo o veículo roubado. Se ele existe, então cancela a função. Se não existe, então entra no veículo normalmente. addEventHandler ("onVehicleStartEnter", root, function (thePlayer, seat, jacked) if isElement(jacked) then outputChatBox("Você não pode roubar o veículo de alguém.", thePlayer, 255, 150, 0) cancelEvent() end end) Obs: Ele só vai cancelar se for roubar o motorista pra dirigir o veículo dele. Se o veículo tiver passageiro mas não tiver motorista, vai entrar normalmente. Se o jogador for entrar como passageiro, também vai entrar normalmente mesmo se já tiver motorista.
  6. A mira do jogador depende da câmera. Se a câmera não está no jogador, irá bugar. Se quer mirar, volte a câmera pro jogador.
  7. Portas dos veículos não possuem colisão própria. A colisão pro player não atravessar a porta é a própria colisão do veículo. Se você abrir o DFF de um veículo original, vai encontrar várias esferas de colisão dentro dele, são essas esferas que evitam que o jogador atravesse o veículo ao andar em direção a ele.
  8. O script precisa estar declarado como client-side no meta.xml. Além disso, certifique-se de que o volume de áudio do ambiente está configurado nas opções do menu ESC.
  9. O que me chamou mais atenção, além do erro, seria você ter usado isso: if (not sql == false) then Quando poderia simplesmente ter usado isso: if (sql) then
  10. A primeira forma é mais direta, você não declara o nome da função. É mais fácil, porém você não vai conseguir dar unbind depois, pois não terá o nome da função para desbindar. Ideal para quando você quer dar binds permanentes, que não serão desbindadas depois. Essa forma também não permite que você chame por outras formas, por exemplo via comando. A segunda forma resolve todas as limitações da primeira, porém você precisa declarar um nome para a função. Normalmente essa é a forma mais usada. A terceira forma com função local é usada somente por usuários avançados em situações específicas. Funções locais não funcionam fora de seu escopo, porém são um pouco mais leves do que as funções globais, pois elas são apagadas da memória depois que o programa sai do escopo em que elas foram criadas. Também são mais difíceis de hackear com scripts de terceiros que reescrevem sua função. Eu particularmente uso mais a primeira e segunda forma.
  11. Olá. Os markers do tipo cylinder possuem colisão bugada. Você precisa deixá-los um pouco voando para que a colisão deles funcione. Se realmente for um problema para você, sugiro que crie markers do tipo "corona" invisíveis e use-os no script. Então os markers do tipo cylinder seriam apenas visuais.
  12. Aparentemente, a variável Model não pode ser convertida para número. Ou então, não existe esse índice na tabela Config["customCarNames"] Coloque isso antes da sua linha para ver oq está na variável Model: iprint(Model)
  13. Sim, é possível com interpolateBetween.
  14. A questão que mais pesa é a execução diversas vezes em pouco tempo. Trigger em loop também é pesado. Se a elementData não precisa ser sincronizada com todos os jogadores, você pode setá-la no modo de inscrição. Assim você consegue definir jogadores específicos para sincronizar essa elementData só com ele. Fica mais leve do que sincronizar com todo mundo.
  15. Fazer trigger em loop é inviável. Se existe essa necessidade de troca constante de dados entre client-servidor, você pode usar elementDatas.
  16. Depende do que se deseja fazer e qual o tempo de repetição do timer.
  17. Prefira usar tabelas do que elementDatas. Salve no banco de dados sempre que alguém logar/deslogar ou o resource for reiniciado/parado.
  18. Já tentou depurar o código para saber quais partes do código ele está lendo? Coloque um outputChatBox diferente depois de cada if e for. addEvent("Preis:LogarPerson", true) addEventHandler("Preis:LogarPerson", root, function(id) outputChatBox("A: "..id) local t = dbPoll(dbQuery(db, "SELECT * FROM persons WHERE ID=?", id), -1) local Conta = "" local ContaOficial = "" local Nome = "" local Sobrenome = "" local Emprego = "" for i,t2 in ipairs(t) do outputChatBox("B: "..i) Conta = t2.Conta ContaOficial = t2.ContaOficial Nome = t2.Nome Sobrenome = t2.Sobrenome Emprego = t2.Emprego end if (Conta ~= ContaOficial) then outputChatBox("C") logOut(source) logIn(source, getAccount(Conta), "PreisOlympia") end outputChatBox("D: "..tostring(Nome).."_"..tostring(Sobrenome)) setPlayerName(source, Nome .. "_" .. Sobrenome) setElementData(source, "Emprego", Emprego) outputChatBox("Logado com sucesso") triggerClientEvent(source, "Preis:CloseCriadorPersonagem", source) end)
  19. Também mostre a parte do código onde o erro aponta.
  20. Trabalhar com gráficos é muito complexo no MTA. Comece tentando fazer gráficos para coisas mais simples para estudar como criar um. Só depois tente implementar oq você descobriu naquilo que você deseja. Imagino que você vai precisar de um DxDrawLine e vários DxDrawRectangle.
  21. Pra colocar em ordem é só clicar na coluna que você quer organizar em ordem crescente ou decrescente.
  22. if getElementData(thePlayer, "dataName") == "dataValue" then -- Código pra quem tem a data. else -- Código pra quem não tem a data. end
×
×
  • Create New...