Jump to content

Lord Henry

Other Languages Moderators
  • Posts

    4,005
  • Joined

  • Last visited

  • Days Won

    184

Everything posted by Lord Henry

  1. Olá senhores. Bom, estou precisando fazer um objeto apontar para outro como se ele estivesse fazendo um Look At. Mas não sei como calcular o ângulo da rotação Z com base nas posições. Exemplo. Objeto A está na posição 0, 0, 0. Objeto B está na posição 1, 1, 0. Ilustrações: Aplicando o Look At no Objeto A para o B, deve fazer o objeto A "mirar" no Objeto B, colocando a rotação Z do objeto A em 315. Mas como calculo isso? Obs: A rotação é com base nas posições, não importa a rotação do objB.
  2. Favor não usar fontes muito grandes, ninguém aqui é cego e isso é classificado como Spam.
  3. Em relação a fechar o jogo, isso não é possível (e nem permitido) por questões de segurança. Mas você pode sim dar um "Kick zoeiro" no jogador usando a função kickPlayer. Ex: function verifyVIP (thePlayer, cmd) if not (isObjectInACLGroup("user."..getAccountName(getPlayerAccount(thePlayer)), aclGetGroup("VIP"))) then -- Se o jogador não está na ACL Group VIP, então: kickPlayer (thePlayer, "Você foi trolado!") -- Kicka o jogador do servidor, com o motivo definido. end end addCommandHandler ("vip", verifyVIP) Obs: Normalmente não aparece no chat o motivo do kick. Se o seu server estiver com um joinquit ligado, que anuncia quando alguém entra ou sai do seu servidor, ele aparece algo do tipo: NomeJogador left the server. [kicked] De qualquer forma, os outros jogadores não sabem que foi um kick troll. Obs2: O resource precisa ter acesso à permissão function.kickPlayer para funcionar.
  4. Usar setTimer não é recomendável pra longos períodos de tempo. Ele é mais pesado do que o getRealTime.
  5. Não há limite de estoque. Você define isso.
  6. Então só fazer isso na variável: nomeVariavel = nomeVariavel + quantidadeDeGrana Exemplo: granaPickup = granaPickup + 5000
  7. Depende. Onde está guardado o valor acumulado do pickup? Numa variável ou como elementData?
  8. É mais fácil criar o cifrão inteiro client-side e usar um triggerServerEvent para mandar o valor acumulado pro lado server e setar no player. Pois as funções de dxDraw são feitas usando onClientRender (a cada frame) e portanto ficaria inviável ficar recebendo esse valor do server para usar no client o tempo todo.
  9. Criei um tópico na sessão internacional perguntando o motivo da Wiki sempre evitar usar os nomes das entidades nas variáveis. Espero que eles não me ignorem. (como sempre fazem)
  10. Hello. Is there any difference between using the entity's name instead of a custom name in a variable? local vehicle = createVehicle (...) or local theVehicle = createVehicle (...) Why does the Wiki always avoid using the entity's name as variable? If I use the entity's name instead of a custom name, is this a bad programming method? PS: I am not using OOP.
  11. Realmente, não são reservadas... Chamar assim foi equívoco meu. São nomes de entidades utilizadas pelos arquivos XML do MTA, por exemplo arquivos .map para que seja possível obtê-los do XML para usar diretamente em um script. De fato, se for em script isolado sem XML envolvido, creio que não há problema. Mas isso se torna um vício de programação e vícios devem ser evitados. Honestamente não sei o real motivo de se evitar seu uso em variáveis ou parâmetros, mas os exemplos da Wiki sempre evitam. <vehicle id="vehicle (Patriot) (1)" sirens="false" paintjob="3" interior="0" alpha="255" model="470" plate="IPA0VWH" dimension="0" color="95,10,21,0,0,0,0,0,0,0,0,0" posX="2160.6001" posY="-2281" posZ="13.6" rotX="0" rotY="0" rotZ="225"></vehicle>
  12. Os parâmetros de função do addCommandHandler são respectivamente: Player que executou o comando. (elemento) [Se o script for server-side] Comando utilizado. (texto) Texto 1 após o comando. (texto) Texto 2 após o comando. (texto) E assim por diante. Estude seu script e comente cada linha dele para saber como ele funciona, dessa forma: local cifrao = createPickup (-2180.62329, -232.94133, 36.77124, 3, 1550, 1000) -- Cria um pickup personalizado, com o modelo 1550 que respawna após 1 segundo. local fX, fY, fZ = getElementPosition (cifrao) -- fX, fY e fZ recebem as coordenadas do pickup. -- local pColShapeGetBox = createColSphere (fX, fY, fZ, 2) -- Nulo, é só usar onPickupHit. addEventHandler ("onPickupHit", cifrao, function (thePlayer) -- Executa essa função quando alguém colide no pickup cifrao. setPedAnimation (thePlayer, "ROB_BANK", "CAT_Safe_Rob", -1, true, false, false) -- Faz o player executar essa animação. local objPick = createObject (1550, fX, fY, fZ) -- Cria a bolsa de dinheiro. setTimer (function (thePlayer) -- Após 1 segundo: setPedAnimation (thePlayer, nil) -- Para a animação. exports.bone_attach:attachElementToBone (objPick, thePlayer, 4, -0.3, 0.2, 0, -125, 0, 0) -- Anexa a bolsa nas costas do player. (Não precisa colocar ; no fim de cada linha.) end, 1000, 1, thePlayer) end)
  13. Da próxima vez, poste na sessão correta de Programação em Lua. E poste seu código usando a ferramenta de código do fórum para que ele seja legível.
  14. Sim, você fez bem errado. Vc declarou as variáveis fX, fY e fZ depois de usá-las no createPickup. Você deve declará-las antes, caso contrário o script vai dizer que elas não existem. Além disso, vc está tentando pegar a posição de pColShape, mas isso não é um elemento. E já falei pra vc parar de usar palavras reservadas para dar nome às coisas. (pickup e player.) Em vez disso, use thePickup e thePlayer.
  15. function obterDinheiroPickup() local grana = (getRealTime().timestamp - tempo)*dinheiroPorSegundos -- Calcula a quantidade de grana acumulada com base no tempo real. if grana >= 10000 then -- Se a grana acumulada for maior ou igual a 10 mil, então: grana = 10000 -- A grana acumulada é igual a 10 mil. end return grana -- Essa função retorna a grana acumulada, que nunca será mais que 10 mil. end Tente isso nessa função.
  16. --------------------------------------- Corrigindo esse problema de sintaxe, ele funcionou o emprego aqui. MAS, tenho algumas observações: Você precisa dar feedback ao jogador quando ele entra no primeiro marker para fazer aparecer o caminhão, ex: AVISO: Você começou a trabalhar de leiteiro, entre no caminhão ao lado e leve o leite até o blip vermelho. Dessa forma o jogador não precisa adivinhar o que deve fazer em seguida. Você só paga $150 ao jogador por cada viagem, isso é pouco, considerando o tempo de viagem e a dificuldade de subir o morro de volta até a fazenda com um caminhão de baixa potência. A não ser que no seu servidor a economia baseie-se em supervalorização da moeda, você deve pagar mais ao jogador. Você deixou o blip do emprego com distância de visualização máxima (9999). Isso não é recomendável, pois se você tiver vários empregos com blips assim, seu radar ficará entupido de blips e pelo que estou percebendo, vc irá usar o mesmo blip para todos os empregos (T = Trabalho), o que aumentará ainda mais a confusão do jogador. Minha sugestão é deixar no máximo 600, assim o blip só aparecerá no radar quando o jogador estiver mais próximo dele. ------------------------------------------------ Em relação ao código: Não entendi a necessidade de vc criar uma matriz bidimensional para colocar os markers, blips e veículos. Mas como isso parece estar funcionando, nem tentei mudar isso. Preste atenção nas cores que vc usa no seu outputChatBox. Não há necessidade de colocar um código #HEX no início do texto se você pode colocá-lo direto nos parâmetros da função. Isso é questão de otimização. Ex: outputChatBox ("#FF0000Texto em vermelho #00FF00e verde.", thePlayer, 255, 255, 255, true) -- Errado. outputChatBox ("Texto em vermelho #00FF00e verde.", thePlayer, 255, 0, 0, true) -- Certo. Ambos vão enviar isso: Texto em vermelho e verde. Sua função de onVehicleExit está parando de executar na metade pois você colocou uma condição impossível de validar. Depure essa função colocando alguns print por ela, dessa maneira: (precisa estar com o /debugscript 3 ligado, como sempre) function sairVeh (elemento) local meuCarro = false print ("01") -- Coloque alguns desses pela função, para usar como depurador de código e saber onde ele está parando. if elemento and isElement(elemento) and getElementType(elemento) == "player" and tabela[elemento] and tabela[elemento]["carro"] then print ("02") if source == vehicle then -- vehicle não foi declarado em lugar nenhum, ele nunca vai passar daqui. (source ~= null) print ("03") meuCarro = vehicle end end if not meuCarro then return end -- Sempre vai parar aqui e não vai nem executar o resto. Pois meuCarro sempre será false. print ("04") if not isTimer (globalTimer[meuCarro]) then print ("05") outputChatBox ("ATENÇÃO: #8E8E8ERetorne para o veiculo da fazenda em 1 minuto, senão, perderá o trabalho!", elemento, 255, 0, 0, true) globalTimer[meuCarro] = setTimer (function() print ("06") destroyElement (meuCarro) end, 20000, 1) else print ("07") resetTimer (globalTimer[meuCarro]) end end addEventHandler ("onVehicleExit", root, sairVeh) Resultado da depuração: 01 02 Ele não chegou a ler do 03 em diante. Então significa que depois do 02 e antes do 03, houve algum problema. Esse problema não aparece de cara no /debugscript 3 pois não é um problema de sintaxe.
  17. Testando seu script, de cara já veio erro na linha 54, que a função entrarVeh não existe. Vc colocou o nome da função com letra minúscula: entrarveh Sempre deixe o /debugscript 3 ligado para procurar por erros antes de criar um post.
  18. Verifique por erros no /debugscript 3 E da próxima vez, poste na área correta de Programação Lua.
  19. Ele está respawnando antes pois o tempo de idle (inativo) dele está para 10 segundos. Mude essa parte para isso: setVehicleIdleRespawnDelay (vehicle, 60000) -- 60 mil = 60 segundos. Em vez de reinventarmos a roda, é melhor deixar tudo automático mesmo carros = { -- Tabela com vários veículos em suas posições. createVehicle (411, 2475, -1657, 13.2, 0, 0, 0), -- Cria o veículo na coordenada específica. (essa posição é por padrão o ponto de respawn) createVehicle (411, 2480, -1657, 13.2, 0, 0, 0), -- Cria outro veículo na outra coordenada e assim por diante. Este é um caso raro onde o elemento pode ser chamado sem estar em uma variável. } for i, vehicle in ipairs (carros) do -- Para cada veículo da table 'carros', faça: toggleVehicleRespawn (vehicle, true) -- Permite que eles respawnem automaticamente. setVehicleIdleRespawnDelay (vehicle, 60000) -- Respawnar após 60 segundos de inatividade do veículo. (Ex: Sem ninguém no veículo, ou alguém empurra o veículo pra fora de sua posição sem entrar nele) setVehicleRespawnDelay (vehicle, 5000) -- Respawnar após 5 segundos que explodiu. (Ex: Veículo explode sem ninguém sair nem entrar nele.) end
  20. Realmente, esqueci do fato do jogador morrer e não sair do veículo. Assim funcionará perfeitamente: carros = { -- Tabela com vários veículos em suas posições. createVehicle (411, 2475, -1657, 13.2, 0, 0, 0), -- Cria o veículo na coordenada específica. (essa posição é por padrão o ponto de respawn) createVehicle (411, 2480, -1657, 13.2, 0, 0, 0), -- Cria outro veículo na outra coordenada e assim por diante. Este é um caso raro onde o elemento pode ser chamado sem estar em uma variável. -- (precisa ter a vírgula no final de cada veículo pois os elementos de uma table precisam estar separados entre vírgulas) } globalTimer = {} -- tabela vazia global. Os timers serão anexados aos veículos e não nos jogadores. for i, vehicle in ipairs (carros) do -- Para cada veículo da table 'carros', faça: toggleVehicleRespawn (vehicle, true) -- Permite que eles respawnem automaticamente. setVehicleIdleRespawnDelay (vehicle, 10000) -- Respawnar após 10 segundos sem ninguém no veículo. (Ex: jogador morre e não sai do veículo, ou alguém empurra o veículo de sua posição sem entrar nele) setVehicleRespawnDelay (vehicle, 5000) -- Respawnar após 5 segundos que explodiu. (Ex: Veículo explode sem ninguém sair dele.) end function startRespawn (thePlayer) local meuCarro = false -- Variável local, que será preenchida pelo veículo que o jogador saiu se ele estiver na tabela carros. for i, vehicle in ipairs (carros) do -- Para cada veículo da table 'carros', faça: if source == vehicle then -- Se o veículo que o jogador saiu for um veículo deste script, então: meuCarro = vehicle break -- (Break = sair deste FOR) Para de verificar os outros carros, pois o veículo já foi encontrado. end end if not meuCarro then return end -- Se o veículo que o jogador saiu não está na lista acima (não faz parte deste script), então nada acontece. if not isTimer (globalTimer[meuCarro]) then -- Verifica se o veículo já possui um timer ativo. if (#getVehicleOccupants(meuCarro) > 0) then return end -- Não faz nada se ainda houver alguém dentro do veículo e não inicia o timer. outputChatBox ("Esse veiculo será respawnado em 10 segundos! Entre nele novamente!", thePlayer) -- Mensagem de aviso para o player. globalTimer[meuCarro] = setTimer (function() -- Conta 10 segundos respawnVehicle (meuCarro) -- Respawna o veículo. setVehicleEngineState (meuCarro, false) -- Desliga o motor do veículo. end, 10000, 1) -- Tempo e repetições do timer. else resetTimer (globalTimer[meuCarro]) -- Se já existe o timer do veículo, reinicia ele. end end addEventHandler ("onVehicleExit", root, startRespawn) -- Executa essa função quando qualquer um sair de qualquer veículo. function cancelRespawn (thePlayer) local meuCarro = false -- Variável local, que será preenchida pelo veículo que o jogador entrou se ele estiver na tabela carros. for i, vehicle in ipairs (carros) do -- Para cada veículo da table 'carros', faça: if source == vehicle then -- Se o veículo que o jogador entrou for um veículo deste script, então: meuCarro = vehicle break -- (Break = sair deste FOR) Para de verificar os outros carros, pois o veículo já foi encontrado. end end if not meuCarro then return end -- Se o veículo que o jogador entrou não está na lista acima (não faz parte deste script), então nada acontece. if isTimer (globalTimer[meuCarro]) then -- Se existe o timer deste veículo, então: killTimer (globalTimer[meuCarro]) -- Cancela o timer deste veículo e ele não vai mais respawnar até que o último jogador saia de novo do veículo. outputChatBox ("Esse veiculo não será mais respawnado.", thePlayer) -- Mensagem de aviso para o player. end end addEventHandler ("onVehicleEnter", root, cancelRespawn) -- Executa essa função quando qualquer um entrar em qualquer veículo. No caso de cair na água, vai acontecer exatamente como o @MaligNos disse: Ou os ocupantes do veículo morrerão dentro dele (deixando o veículo inativo e respawnando com o setVehicleIdleRespawnDelay), ou eles sairão do veículo (ativando o timer de saída). Caso o veículo exploda com ou sem ninguém dentro, ele respawnará com o setVehicleRespawnDelay. ------------------------------------------------------------------- Tome cuidado, vc está criando 2 veículos idênticos no mesmo lugar.
×
×
  • Create New...