Jump to content

Lord Henry

Other Languages Moderators
  • Posts

    4,008
  • Joined

  • Last visited

  • Days Won

    184

Everything posted by Lord Henry

  1. Da pra fazer tudo client-side. Basta você setar uma data no jogador quando ele clica no botão e depois tirar essa data quando ele clica novamente. Enquanto ele estiver com essa data ("protegido") ele estará protegido. local x, y = guiGetScreenSize () buttonPro = guiCreateButton (x/2, y/2, 80, 25, "Proteção", false) -- Botão de exemplo. addEventHandler ("onClientGUIClick", buttonPro, function () -- Executa essa função ao clicar no buttonPro. if not getElementData (localPlayer, "protegido") then -- Se o jogador não está protegido, então: setElementData (localPlayer, "protegido", true) -- Torna o jogador protegido. outputChatBox ("Você está protegido.", 0, 255, 0) else -- Se o jogador está protegido, então: setElementData (localPlayer, "protegido", false) -- Torna o jogador desprotegido. outputChatBox ("Você está desprotegido.", 255, 0, 0) end end, false) addEventHandler ("onClientPlayerDamage", getRootElement(), function () -- Protege o jogador contra danos se ele estiver com data "protegido". if getElementData (source, "protegido") then cancelEvent() end end) addEventHandler ("onClientPlayerStealthKill", localPlayer, function (targetPlayer) -- Protege o jogador contra a facada mortal se ele estiver com data "protegido". if getElementData (targetPlayer, "protegido") then cancelEvent() end end)
  2. Não acredito que não vi essa função. Estava me quebrando todo para descobrir como fazer isso. Eu já tinha descoberto que precisava trabalhar com tangente mas estava com problemas para converter o valor obtido em graus. Eu só havia feito isso até então: function lookAt (theSource, target) if isElement (theSource) and isElement (target) then local px, py = getElementPosition (theSource) local tx, ty = getElementPosition (target) local relatedAngle = math.atan2 (px - tx, py - ty) if (relatedAngle < 0) then relatedAngle = relatedAngle + 360 elseif (relatedAngle > 360) then relatedAngle = relatedAngle - 360 end return math.floor(relatedAngle) end end Preciso voltar a estudar mais a Wiki. Muito obrigado.
  3. Elas ficam salvas no banco de dados internal.db Ele está localizado geralmente em C:\Program Files (x86)\MTA San Andreas 1.5\server\mods\deathmatch
  4. 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.
  5. Favor não usar fontes muito grandes, ninguém aqui é cego e isso é classificado como Spam.
  6. 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.
  7. Usar setTimer não é recomendável pra longos períodos de tempo. Ele é mais pesado do que o getRealTime.
  8. Não há limite de estoque. Você define isso.
  9. Então só fazer isso na variável: nomeVariavel = nomeVariavel + quantidadeDeGrana Exemplo: granaPickup = granaPickup + 5000
  10. Depende. Onde está guardado o valor acumulado do pickup? Numa variável ou como elementData?
  11. É 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.
  12. 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)
  13. 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.
  14. 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>
  15. 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)
  16. 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.
  17. 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.
  18. 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.
  19. --------------------------------------- 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.
  20. 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.
×
×
  • Create New...