Jump to content

Lord Henry

Other Languages Moderators
  • Posts

    3,953
  • Joined

  • Last visited

  • Days Won

    177

Everything posted by Lord Henry

  1. Corrija a indentação do seu código, pois desse jeito está ilegível. Faça seu painel otimizado para a proporção 16:9 de tela que é a mais comum. (também é a proporção utilizada por monitores HD, Full HD e Ultra HD) Escolha a resolução 1366x768 ou 1280x720 no jogo, ambas são 16:9. A sua resolução atual 1440x900 é proporção 16:10. Sua lógica de incrementar o valor alpha com um timer repetitivo faz sentido, mas dessa forma você não consegue garantir com precisão a duração do fade, por isso que usamos o interpolateBetween. Porém você errou ao usar showMenu como nome de função ali no seu "onClientRender" pois ele já está sendo usado como variável. Vou mostrar como fazer usando o setTimer que você tentou: client.lua server.lua local loginMarker = createMarker(2245.528, -1260.809, 22.95, "cylinder", 1.5, 255, 255, 255, 50) addEventHandler("onMarkerHit", loginMarker, function(hitElement) -- Ativa essa função quando algum elemento colidir no loginMarker. if hitElement and getElementType(hitElement) == "player" then -- Se o elemento que colidiu é um jogador, então: -- if isGuestAccount (getPlayerAccount(hitElement)) then -- Se o jogador que colidiu estiver deslogado, então: triggerClientEvent(hitElement, "render_UI", resourceRoot, true) -- Mostra o painel pra ele. -- end end end)
  2. Não temos como adivinhar o problema sem mais informações. Alguma mensagem de erro? Se tiver, mande print. Ou algum vídeo mostrando o que acontece ao tentar abrir o MTA.
  3. Não existe uma animação assim. Você pode estar confundindo com aquela que ele toma um tiro no estômago, ajoelha e morre. O nome dessa é KO_shot_stom Também tem outra que ele leva as mãos ao rosto, mas ele não agacha, apenas cai para trás e morre. É a KO_shot_face A animação que ele fica com a mão no rosto por estar asfixiado é a gas_cwr enquanto vai pra trás abaixado.
  4. db = dbConnect("sqlite", "dados.db") -- Cria um arquivo de database chamado dados.db dentro da pasta do resource. dbExec(db, "CREATE TABLE IF NOT EXISTS porta_malas (ID INTEGER, quantidade REAL, nome TEXT)") -- Cria uma tabela com 3 colunas. A primeira de números inteiros e a segunda de números reais e a terceira com texto. dbFree (db) -- Salva os dados. destroyElement(db) -- Fecha a conexão com o banco de dados. De resto, pra manipular esse banco de dados, inserir valores, etc. Vc vai precisar estudar SQL.
  5. Você pode simplesmente setar uma elementData no veículo que não deseja remover com setElementData. O script deve ignorar veículos com essa elementData específica. setTimer( function() for _, carro in ipairs(getElementsByType("vehicle")) do if not getElementData(carro, "permanente") then -- Se o veículo não tem a elementData "permanente", ele será deletado pelo script. local jogadores = getVehicleOccupant(carro) if not jogadores then destroyElement(carro) --exports["FAST_a__infobox"]:addBox(root, "Todos os carros desocupados Foram Removidos", "Todos os carros desocupados Foram Removidos.") restartResource(resource) -- resource = getThisResource() outputDebugString ("O resource de Deletas carros vazios foi reiniciado Automaticamente para evitar bugs.") end end end end, Minutos*60000, 0) Outra forma de fazer seria setar o ID do veículo para algo específico que o resource deve ignorar usando setElementID Minha sugestão é setar ID "0" em veículos usados por NPCs por exemplo. Que não podem ser deletados pois causariam bugs em seus respectivos resources. E no script você faz a mesma coisa só que no lugar do getElementData você usa getElementID.
  6. 1) Mantenha o padrão de usar aspas "duplas" em vez de aspas 'simples' nas suas strings. 2) Troque a linha do triggerClientEvent por isso: if isObjectInACLGroup("user."..getAccountName(getPlayerAccount(element)), aclGetGroup ("Admin")) then -- Troque Admin pela ACL Group que vc quer. triggerClientEvent(element, "openPainel", element) else -- Linha opcional. outputChatBox("Acesso negado.", element, 255, 0, 0) -- Linha opcional. end
  7. Não temos como adivinhar sem o código. Mostre o código onde tem a parte do BindKey no F4.
  8. Tópico movido para a seção de Programação em Lua.
  9. Você pode desativar os sons específicos do tiro dela quando você equipar o slot dela. addEventHandler("onClientPlayerWeaponSwitch", localPlayer, function(prevSlot, curSlot) if getPedWeapon(localPlayer, curSlot) == 31 then -- Se o jogador está com a arma M4, então: setWorldSoundEnabled (5, 3, false) setWorldSoundEnabled (5, 4, false) setWorldSoundEnabled (5, 5, false) -- Desativa os sons da M4 (e também da AK-47). setWorldSoundEnabled (5, 33, false) setWorldSoundEnabled (5, 53, false) else -- Se não estiver com a M4, então: setWorldSoundEnabled (5, 0, true) setWorldSoundEnabled (5, 1, true) setWorldSoundEnabled (5, 2, true) setWorldSoundEnabled (5, 3, true) -- Habilita novamente todos os sons das armas. (se ele estiver com a AK-47, habilita os sons) setWorldSoundEnabled (5, 4, true) setWorldSoundEnabled (5, 5, true) setWorldSoundEnabled (5, 6, true) setWorldSoundEnabled (5, 7, true) setWorldSoundEnabled (5, 8, true) setWorldSoundEnabled (5, 11, true) setWorldSoundEnabled (5, 12, true) setWorldSoundEnabled (5, 13, true) setWorldSoundEnabled (5, 14, true) setWorldSoundEnabled (5, 15, true) setWorldSoundEnabled (5, 16, true) setWorldSoundEnabled (5, 17, true) setWorldSoundEnabled (5, 18, true) setWorldSoundEnabled (5, 21, true) setWorldSoundEnabled (5, 22, true) setWorldSoundEnabled (5, 23, true) setWorldSoundEnabled (5, 24, true) setWorldSoundEnabled (5, 26, true) setWorldSoundEnabled (5, 27, true) setWorldSoundEnabled (5, 29, true) setWorldSoundEnabled (5, 30, true) setWorldSoundEnabled (5, 32, true) setWorldSoundEnabled (5, 33, true) setWorldSoundEnabled (5, 53, true) setWorldSoundEnabled (5, 63, true) setWorldSoundEnabled (5, 72, true) setWorldSoundEnabled (5, 73, true) setWorldSoundEnabled (5, 74, true) setWorldSoundEnabled (5, 76, true) setWorldSoundEnabled (5, 77, true) end end) -- Também daria pra fazer utilizando tabela em vez de um monte de if/elseif mas deixei assim para facilitar. Obs: Outras armas usam outros sons diferentes da M4. Você precisa descobrir quais são para desativar somente os sons corretos. Obs2: Você também deixará de ouvir os sons das armas dos outros jogadores caso elas usem os mesmos sons que você desativou. (se vc estiver com a M4 e outro jogador estiver com a AK-47) Obs3: Se você estiver com uma AK-47 (sons ativados) na mão e pegar uma M4. Os sons permanecerão ativados pois o slot não foi alterado e portanto essa função não foi chamada. O inverso acontece também. Se você estiver com uma M4 na mão (sons desativados) e pegar uma AK-47, ela também continuará com os sons desativados. O som será corrigido ao trocar de slot de arma. Obs4: Não está incluso nesse exemplo os sons de recarga das armas.
  10. Crie um painel para mexer nas TAGs, o painel não deve incluir as TAGs da Staff. Nesse painel você pode dar permissão para a Staff usar, assim eles só conseguem mexer nas demais TAGs que não são da Staff.
  11. Vc pode verificar isso quando o jogador faz login. local bases = {} -- Tabela com todas as bases criadas. (vc precisará adaptar sua função createBase para colocá-las nesta tabela) local blips = {} -- Tabela com todos os blips das bases. function baseBlip(_, _, theSource) -- theSource só existe quando essa função é chamada lá no createBase() if not theSource then theSource = source -- Se essa função foi chamada ao fazer login, theSource passa a ser quem logou. end for i, base in pairs(bases) do -- Para cada base da tabela, faça: if getPlayerFromSerial (getElementData(base, "owner")) then -- Se o jogador que tem o serial do dono desta base está online, então: if getPlayerFromSerial (getElementData(base, "owner")) == theSource then -- Se o jogador que logou é dono desta base, então: if isElement(blips[i]) then -- Se já existe o blip desta base, então: setElementVisibleTo (blips[i], theSource, true) -- Torna este blip visível para este jogador que logou. else -- Se ainda não existe o blip desta base, então: local x, y, z = getElementPosition(base) -- Obtém a posição da base para usar no blip. blips[i] = createBlip(x, y, z, 58, 1, 255, 255, 255, 255, 0, 8500, theSource) -- Cria o blip visível somente para o jogador que logou. end end end end end addEventHandler("onPlayerLogin", root, baseBlip) function unBlip() for i, base in pairs(bases) do -- Para cada base da tabela, faça: if getPlayerFromSerial (getElementData(base, "owner")) then -- Se o jogador que tem o serial do dono desta base está online, então: if getPlayerFromSerial (getElementData(base, "owner")) == source then -- Se o jogador que deslogou é dono desta base, então: if isElement(blips[i]) then -- Se essa base tem o blip criado, então: setElementVisibleTo (blips[i], source, false) -- Para de mostrar pra esse jogador que deslogou ou saiu do servidor. end end end end end addEventHandler("onPlayerLogout", root, unBlip) addEventHandler("onPlayerQuit", root, unBlip) function getPlayerFromSerial (serial) -- Função útil que pega o player online com este serial. assert (type(serial) == "string" and #serial == 32, "getPlayerFromSerial - invalid serial") for i, player in pairs (getElementsByType ("player")) do if getPlayerSerial(player) == serial then return player end end return false end E lá no final da sua função createBase() adicione isso lá dentro: table.insert(bases, baseCol) -- Adiciona a base que foi criada na tabela de bases. baseBlip(false, false, getPlayerFromSerial(owner)) -- Tenta criar o blip para o dono da base, se ele estiver online.
  12. Se o script for server-side, o último parâmetro do createBlip é o jogador para quem ele será visível. Se não especificar esse parâmetro, ele será visível para todo mundo.
  13. O evento onMarkerHit só funciona server-side. Mas a função playSound3D só funciona client-side. Troque o evento por onClientMarkerHit. E faça o script ser client-side.
  14. Coloque todos no mesmo time e depois desabilite o friendly fire do time. Assim ninguém consegue dar dano um no outro. Porém não sei se funciona para casos de atropelamento, tem que testar. CreateTeam SetTeamFriendlyFire SetPlayerTeam
  15. Substituir os blips via shader faz com que eles continuem funcionando da mesma forma que os blips originais. Você só teria problemas com isso se os blips fossem criados via dxDrawImage, sem ser por createBlip.
  16. Sobre sua primeira pergunta, coloque isso em qualquer script client.lua para fazer com que a mensagem fique oculta por padrão. No meu caso, coloquei num resource de radar modificado. bindKey("F11", "down", "radar_help") -- Oculta a mensagem de Help ao abrir o mapa por padrão. Se quiser ver a mensagem, aperte num_1 com o mapa aberto. Basicamente você binda o comando de mostrar/ocultar essa mensagem ao abrir o mapa. Então a mensagem por padrão vai sumir ao abrir o mapa e aparecer ao fechar o mapa. Você ainda pode trocar a ordem apertando a tecla num_1 para mostrar a mensagem novamente, pois este comando funciona em alternância. Obs: Ao sair do servidor, a mensagem volta a ficar oculta por padrão. Sobre sua segunda pergunta relacionada aos blips. Qualquer shader simples que substitui texturas consegue fazer isso. replace.fx // Variable to fetch the texture from the script texture gTexture; // Very simple technique technique simple { pass P0 { // Set the texture Texture[0] = gTexture; } } client.lua local textures = { "radar_centre", "radar_north", "radar_light", "radar_runway", "radar_waypoint", } -- Nomes de alguns blips. addEventHandler ("onClientResourceStart", resourceRoot, function() for i, tex in ipairs(textures) do -- Para cada nome da lista de nomes de blips, faça: local shad = dxCreateShader ("replace.fx") -- Cria um shader a partir deste arquivo. local newTex = dxCreateTexture (tex.."0.png") -- As novas texturas possuem o mesmo nome da textura original seguido por 0. dxSetShaderValue (shad, "gTexture", newTex) -- Utiliza a nova textura no shader. engineApplyShaderToWorldTexture (shad, tex) -- Aplica o shader na textura original, substituindo pela nova. end end)
  17. Conforme está escrito ali, ele está dizendo que apertar a tecla num_1 (1 do teclado numérico) vai ocultar essa mensagem. No entanto, ele só vai lembrar disso durante sua sessão atual de jogo, ou seja, se vc sair e entrar novamente no servidor, a mensagem estará visível novamente. Se o que vc quer fazer é que essa mensagem já esteja oculta por padrão ao entrar no servidor, dai sim você tem que programar umas coisas. Sim, com shaders. Um shader básico de substituição de textura faz isso.
  18. Sim, é possível. Utilize isElementInWater para saber se o jogador está na água, junto com getElementPosition para saber se ele está dentro do mapa (evitar que tome dano em outras águas fora do mapa) e para dar o dano, use getElementHealth junto com setElementHealth.
  19. Eu testei o código e ele está funcionando. Sim, eu fiz as correções de lógica.
  20. @laxante009 ele só está avisando que moveu este tópico para a seção Portuguesa, pois você postou inicialmente na seção errada. Agora o tópico já está na seção correta, não precisa responder ele. Apenas tome cuidado para postar na área correta nas próximas vezes. Sobre sua dúvida. Você adicionou 3x o evento "DarSkin" no server, em vez de adicionar o "DarSkin1" e o "DarSkin2". Outro problema é que você errou ao colocar um valor no lugar de uma variável ali no evento. Além de uma série de erros de lógica e otimização. server-side: addEvent("DarSkin", true) addEventHandler("DarSkin", root, function(skinID) -- skinID recebe o valor que foi passado depois do localPlayer lá no triggerServerEvent. if skinID and tonumber(skinID) then setPedSkin(source, tonumber(skinID)) -- source é o que foi passado como segundo argumento lá no triggerServerEvent. end end) client-side: local janela = guiCreateWindow(0.27, 0.29, 0.54, 0.34, "", true) guiWindowSetSizable(janela, false) guiSetVisible(janela, false) local button = guiCreateButton(0.02, 0.37, 0.44, 0.37, "Skin 1", true, janela) guiSetFont(button, "clear-normal") guiSetProperty(button, "NormalTextColour", "FFAAAAAA") guiSetVisible(button, false) local button1 = guiCreateButton(0.54, 0.38, 0.44, 0.37, "Skin 2", true, janela) guiSetFont(button1, "clear-normal") guiSetProperty(button1, "NormalTextColour", "FFAAAAAA") guiSetVisible(button1, false) local button2 = guiCreateButton(0.73, 0.13, 0.25, 0.14, "inicial", true, janela) guiSetProperty(button2, "NormalTextColour", "FFAAAAAA") guiSetVisible(button2, false) local label = guiCreateLabel(0.09, 0.14, 0.61, 0.09, "pegue a skin do time que vc começou a jogar >", true, janela) guiSetVisible(label, false) local visible = false addCommandHandler("painel", function() if visible == false then guiSetVisible(janela, true) guiSetVisible(button, true) guiSetVisible(button1, true) guiSetVisible(button2, true) guiSetVisible(label, true) visible = true showCursor(true) else guiSetVisible(janela, false) guiSetVisible(button, false) guiSetVisible(button1, false) guiSetVisible(button2, false) guiSetVisible(label, false) visible = false showCursor(false) end end) addEventHandler("onClientGUIClick", guiRoot, function (btn, state) -- btn para não dar conflito com o guiElement chamado button. if btn == "left" and state == "up" then if source == button then -- Se o elemento que foi clicado for o button, então: triggerServerEvent("DarSkin", localPlayer, 294) elseif source == button1 then -- Senão se o elemento que foi clicado for o button1, então: triggerServerEvent("DarSkin", localPlayer, 30) elseif source == button2 then -- Senão se o elemento que foi clicado for o button2, então: triggerServerEvent("DarSkin", localPlayer, 21) end end end)
  21. Troque aquela sua função por esta: addEventHandler("onVehicleEnter", root, function(player) if isObjectInACLGroup ("user."..getAccountName(getPlayerAccount(player)), aclGetGroup ("Admin")) then local model = getElementModel(source) local x, y, z = getElementPosition(source) if getElementData(source, "vehSpawn") then if veh[player] and isElement(veh[player]) then destroyElement(veh[player]) end veh[player] = createVehicle(model, x+3, y, z) warpPedIntoVehicle(player, veh[player]) end else outputChatBox("Acesso negado.", player, 255, 50, 50) removePedFromVehicle(player) end end)
  22. Obs: O comando /aclrequest só pode ser usado por Admins ou superiores por padrão. Então não adianta pedir para staffs Moderadores nem SuperModeradores para aceitar a solicitação pois eles não tem acesso a esse comando por padrão.
  23. Fora do painel P ou sem mexer no acl.xml você não tem como. A não ser que você desenvolva um resource só para fazer isso via comando. (mas obviamente este resource precisará de permissão admin para poder fazer isso) Outra coisa mais inteligente a se fazer é configurar seu resource para solicitar sozinho as permissões que ele precisa. Por exemplo, se o seu resource precisa de permissão admin só para usar a função de KickPlayer, basta você fazer este resource solicitar essa permissão específica em vez de dar acesso total de admin para ele. Para fazer um resource solicitar permissões específicas, basta adicionar isto no meta.xml dele: <aclrequest> <right name="function.kickPlayer" access="true" /> </aclrequest> Depois de iniciar o resource, deve aparecer a solicitação no Debug Console (use /debugscript 3 para mostrá-lo). Para aceitar a solicitação, só precisa que um Staff autorize com /aclrequest allow NomeDoResource all A solicitação também pode ser aceita no Server Console, usando o mesmo comando porém sem a barra.
×
×
  • Create New...