Jump to content

Lord Henry

Other Languages Moderators
  • Posts

    3,936
  • Joined

  • Last visited

  • Days Won

    176

Everything posted by Lord Henry

  1. Seria engraçado essa censura de substituição, mas é inútil quando os jogadores realmente querem ofender, pois eles mesmos escrevem de outra forma que não pega no filtro. Por exemplo, em vez de usar "fdp" ele usaria "f.dp" ou outras variações com símbolos ou espaços para escapar da sua censura. Entendo seu objetivo de manter o respeito entre os jogadores, mas nesse caso é mais efetivo manter moderadores online para fazer essas pequenas punições de mutar / kickar os jogadores.
  2. @migsfiveMsubstitua isso: setPedArmor(source, 100) Por isso: setPedArmor(source, 0)
  3. Tente utilizar o programa Wine para executar o mtasa.exe no Linux.
  4. @Cortes na próxima vez utilize o botão <> do fórum para adicionar scripts. Imagens você deve upar no site imgur e colar o link direto da imagem (o link direto aparece nas opções de compartilhamento da imagem no site)
  5. Caso queira fazer com interpolateBetween, troque essas funções no client.lua: function dxFade(showing, maxValue, theDuration, theType, thePeriod, theAmplitude, theOvershoot) local start = getTickCount() -- Marca o instante do início da animação. if showing then -- Se é para fazer fade-in, então: alp = 0 -- Seta o alpha em 0 para começar tudo invisível. function renderIn() -- Executa essa função a cada frame. (onClientRender) local now = getTickCount() -- Obtém o instante deste frame (ms). local endTime = start + theDuration -- Calcula e obtém o instante (ms) que vai acabar a animação. local elapsedTime = now - start -- Calcula quantos ms passaram desde que começou a animação. local duration = endTime - start -- Calcula quantos ms faltam para finalizar a animação. local progress = elapsedTime / duration -- Calcula o progresso atual da animação de 0 até 1. alp = interpolateBetween (0, 0, 0, maxValue, 0, 0, progress, theType, thePeriod, theAmplitude, theOvershoot) -- Aplica o interpolate no alpha. -- É possível interpolar até 3 valores diferentes ao mesmo tempo, desde que eles comecem e terminem ao mesmo tempo. Útil para interpolar alphas diferentes do painel. if alp >= maxValue then -- Se o alpha atingiu o valor de objetivo, então: removeEventHandler("onClientRender", root, renderIn) -- Para de calcular essa interpolação a cada frame, pois ela foi concluída. end end addEventHandler("onClientRender", root, renderIn) -- Começa a calcular a interpolação a cada frame. else -- Se é para fazer fade-out, então: alp = maxValue -- Alpha começa no valor do objetivo para começar tudo visível. function renderOut() -- Igual a parte de cima, mas faz o caminho inverso, interpolando do valor objetivo até 0. local now = getTickCount() local endTime = start + theDuration local elapsedTime = now - start local duration = endTime - start local progress = elapsedTime / duration alp = interpolateBetween (maxValue, 0, 0, 0, 0, 0, progress, theType, thePeriod, theAmplitude, theOvershoot) if alp <= 0 then -- Se o alpha chegou a 0, então: removeEventHandler("onClientRender", root, renderOut) -- Para de calcular essa interpolação a cada frame, pois ela foi concluída. end end addEventHandler("onClientRender", root, renderOut) -- Perceba que para evitar conflitos, essa função tem nome diferente do fadeIn. end end addEvent("render_UI", true) addEventHandler("render_UI", resourceRoot, function(state) -- state = true (faz o painel aparecer) | state = false (faz o painel desaparecer) if state then -- Se o painel deve aparecer, então: background = dxCreateTexture ("background.jpg", "argb", true, "clamp") -- Salva a imagem numa variável para ser mais leve no processamento. addEventHandler("onClientRender", root, drawLoginPanel) -- Começa a renderizar o painel. setTimer(function() addEventHandler("onClientClick", root, clickOnLoginPanel) -- Depois de pouco mais de 1 segundo, faz os botões DX funcionarem. end, 1100, 1) else -- Se o painel deve desaparecer, então: removeEventHandler("onClientClick", root, clickOnLoginPanel) -- Remove a função de clique dos botões. setTimer(function() removeEventHandler("onClientRender", root, drawLoginPanel) -- Depois de pouco mais de 1 segundo, para de renderizar o painel e apaga a imagem da variável. destroyElement(background) background = nil end, 1100, 1) end showCursor(state) -- Mostra/oculta o cursor do mouse quando mostra/oculta o painel. dxFade (state, 255, 1000, "Linear") -- Aciona o interpolateBetween com duração de 1000 ms (1 segundo). O valor vai de 0 até 255 e vice-versa. end) Você também pode utilizar a função útil dxFade que eu criei. Detalhes na Wiki.
  6. 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)
  7. 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.
  8. 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.
  9. 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.
  10. 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.
  11. 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
  12. Não temos como adivinhar sem o código. Mostre o código onde tem a parte do BindKey no F4.
  13. Tópico movido para a seção de Programação em Lua.
  14. 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.
  15. 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.
  16. 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.
  17. 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.
  18. 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.
  19. 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
  20. 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.
  21. 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)
  22. 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.
×
×
  • Create New...