Jump to content

Lord Henry

Other Languages Moderators
  • Posts

    3,956
  • Joined

  • Last visited

  • Days Won

    178

Everything posted by Lord Henry

  1. Não, pois você ainda terá problemas com as áreas clicáveis dos botões que precisarão ser adaptadas também.
  2. Outro problema é que em resoluções baixas demais, seu texto se tornará ilegível se usar escala menor. 640x480 1920x1080 Os botões de sim e não também bugarão pois são menores do que o raio dos cantos.
  3. A resolução segura mais baixa do MTA é 640x480. Então eu prefiro fazer os painéis com no máximo esse tamanho e deixar fixo. Ou vc faz tamanho fixo ou você cria condições que verificam o tamanho da tela do jogador e seta uma escala diferente nas fontes. Você também pode criar uma tabela com todas as resoluções padrão do MTA e setar uma escala de fonte diferente em cada uma delas. Obviamente isso dará trabalho pois você precisará testar todas as opções de resolução no seu script.
  4. Textos não acompanham resolução da tela. Você terá que alterar a escala da fonte de acordo com o tamanho da tela do jogador. É por esse motivo que eu prefiro fazer com tamanho fixo, pois os textos não são responsivos. Além disso, dependendo da resolução do jogador, a proporção da tela também mudará. (por padrão é 16:9, mas algumas resoluções mais baixas podem chegar até a 4:3)
  5. Depure seu código com vários outputChatBox diferentes pra ver quais partes ele está lendo. Assim você descobre em qual condição ele está parando.
  6. Remova o último ), deve ter sido erro de digitação minha. Editei meu código acima também.
  7. O nome do seu evento está errado. O nome correto é onClientPlayerStealthKill. Faça assim: addEventHandler ("onClientPlayerDamage", root, function () if getElementData(source, "imortal") then cancelEvent() end end) addEventHandler ("onClientPlayerStealthKill", localPlayer, function (targetPlayer) if getElementData (targetPlayer, "imortal") then cancelEvent() end end)
  8. Ah, errei. local name = getResourceName(res) -- Obtém o nome do resource. Agora sim.
  9. Copie meu código e apenas atualize o painel e as linhas do isMouseInPosition pra ficarem iguais aos botões novos. Sobre quanto menos linhas é melhor sim para a gente ler, mas para casos onde a gente precisa testar o script, dai precisa das demais partes que tem relação com o problema. Nesse caso por exemplo, você não precisa incluir a parte do funcionamento do trabalho, pois o problema está apenas relacionado ao painel.
  10. @SciptNovato dará erro pois tonumber(policiais) não consegue converter true pra número. @wesssley tente isso: function obterPoliciais(thePlayer) local contador = 0 for _, player in pairs(getElementsByType("player")) do -- Para cada jogador conectado no server, faça: local policial = getElementData(player, "TrabalhoPolicia") -- Obtém a data TrabalhoPolicia deste jogador, será false se ele não tiver. if policial then -- Se o jogador tem essa elementData, então: contador = contador + 1 -- Acrescenta +1 na contagem de policiais. end -- Fecha o if end -- Fecha o loop outputChatBox("Existem "..contador.." policiais em serviço.", thePlayer) -- Mostra quantos policiais existem para quem executou o comando end -- Fecha a função addCommandHandler("policiais", obterPoliciais) -- Comando para ativar essa função: /policiais
  11. Primeiro você pega todos os jogadores. Depois você pega o nome e cargo de cada um deles. Com o nome e cargo, você coloca um número antes do nome de acordo com o cargo. Ex: "JoaoGaymer" tem o cargo de Fundador, então o nome dele vai ficar " 00JoaoGaymer". (sim, com espaço na frente) "PedroBilau" tem o cargo de VIP, então o nome dele vai ficar " 03PedroBilau". E assim por diante. Depois de colocar os números antes do nome dos jogadores (você não vai renomear os jogadores, apenas mexer na variável que tem os nomes deles no script), você então pode reordenar a tabela de nomes dos jogadores. Os que começam com " 00" vão aparecer antes dos que começam com " 01", depois os que começam com " 02" e assim por diante. Só depois de ordenada a tabela, você passa um loop por ela removendo os números e o espaço de cada nome. Vou inventar de cabeça aqui um exemplo. local nomes = {} -- Tabela vazia onde vão ficar os nomes de todos os jogadores conectados no server. local cargos = { -- Aqui você coloca todos os Cargos em ordem. Nesse caso irei indexar como string pois o 0 é obrigatório até o 9. [" 01"] = "Fundador", [" 02"] = "Patrocinador", [" 03"] = "Booster", [" 04"] = "Youtuber", [" 05"] = "Admin", [" 06"] = "VIP", [" 07"] = "Membro", [" 08"] = "Policial", [" 09"] = "Gang", [" 10"] = "", -- O último cargo da tabela precisa ser vazia. Será onde os jogadores sem cargo ficarão classificados. } -- O espaço antes do número serve para garantir que nenhum espertinho mude seu próprio nick pra ficar na frente. O MTA não permite espaço no nome. -- Caso contrário, um jogador cujo nick começa com "#" ficaria na frente do Fundador. for _,player in pairs (getElementsByType("player")) do -- Para cada jogador conectado no server, faça: local nome = getPlayerName (player) local cargo = getElementData(player, "Cargo") or "" -- Se o player não tiver essa elementData, será string vazia. Evita o erro de comparar string com boolean. for i,item in pairs (cargos) do -- Para cada cargo da tabela cargos, faça: if cargo == item then -- Se o jogador tem esse cargo, então: nome = i..nome -- Adiciona o número desse cargo na frente do nome do jogador. Se o jogador tem o cargo Admin, a variável nome passa a ser " 05NomeDoPlayer" por exemplo, inclusive com o espaço. Se o jogador não tiver cargo nenhum, ele ficará como " 10NomeDoPlayer" table.insert(nomes, nome) -- Adiciona o nome modificado deste jogador na tabela nomes. break -- Sai deste loop. Não precisa verificar os demais cargos, pois já encontrou o cargo correto. end end end table.sort(nomes) -- Ordena todos os nomes da tabela nomes. for i,nome in ipairs (nomes) do -- Para cada nome da tabela nomes, faça: if string.find(nome, " ") then -- Se o nome tem espaço (foi alterado), então: nomes[i] = string.sub(nome, 4) -- Remove a alteração do nome, mas mantém na mesma posição ordenada. end print(nomes[i]) end -- A tabela nomes agora tem todos os nomes originais em ordem.
  12. Isso acontece pois além de errar na indentação, você não percebeu que faltou colocar states = false depois do showCursor(false) Além disso, seu isMouseInPosition não parece estar seguindo a mesma posição dos botões do painel (a não ser que você mudou o painel e não mostrou ele) Também seria interessante você incluir as funções úteis que você está usando, fica complicado de testar seu script se você não inclui as funções úteis. Fiz várias correções, dê uma estudada nas diferenças.
  13. Mais fácil vc simplesmente criar um marker na posição do respawn. Quem sair do marker volta a ter colisão normal.
  14. N precisa usar quote se só tem 2 pessoas na conversa. O quote serve pra vc citar oq alguém falou pra quando tem várias pessoas na conversa e sua resposta ser direcionada pra aquele comentário específico. Vc tbm pode apenas citar o nome do usuário que deseja responder, sem precisar de quote. Só colocar o @ na frente e depois o nome do usuário @SciptNovato mas não mencione quem não estiver no seu tópico. Sobre seu script, tente isso: function displayResources() local resourceTable = getResources() -- Obtém todos os resources do server. for _, res in pairs(resourceTable) do -- Para cada resource, faça: local name = getResourceName(resourceValue) -- Obtém o nome do resource. enviarMsg("Resource ["..name.."]") -- Mostra uma mensagem com o nome. end end addCommandHandler("rsc", displayResources)
  15. Depure seu código com vários outputChatBox para saber até qual linha ele está lendo, descobrindo assim qual condição está com problema. function MarkerEntregaFunction3(thePlayer) outputChatBox("A", thePlayer) if getElementType(thePlayer) ~= "player" then return end outputChatBox("B", thePlayer) if isPedInVehicle(thePlayer) then outputChatBox("C", thePlayer) local ocupado = getPedOccupiedVehicle(thePlayer) if getElementData(thePlayer, "EntregadorD") == true and getElementData(ocupado, "kombiEntregas") == true and getElementData(thePlayer, "Entregou2") == false then outputChatBox("D", thePlayer) givePlayerMoney(thePlayer, 1000) setElementVisibleTo(MarkerEntrega2, thePlayer, false) setElementVisibleTo(BlipEntrega2, thePlayer, false) setElementVisibleTo(MarkerEntrega3, thePlayer, true) setElementVisibleTo(BlipEntrega3, thePlayer, true) setElementData(thePlayer, "Entregou2", true) end end end addEventHandler("onMarkerHit", MarkerEntrega3, MarkerEntregaFunction3)
  16. Isso acontece devido a sua condição if not isCursorShowing() then pois ela se torna false depois que o cursor fica visível. Tire essa condição dali e também o showCursor. Coloque o showCursor lá em baixo na função que adiciona/remove o onClientRender. local screenW, screenH = guiGetScreenSize() local states = false function DX_Entregas() dxDrawRectangle(screenW * 0.3794, screenH * 0.2467, screenW * 0.2288, screenH * 0.4833, tocolor(31, 31, 31, 255), false) dxDrawRectangle(screenW * 0.3794, screenH * 0.2356, screenW * 0.2288, screenH * 0.0111, tocolor(116, 0, 165, 255), false) dxDrawRoundedRectangle(screenW * 0.3956, screenH * 0.2711, screenW * 0.1969, screenH * 0.3333, 15, tocolor(82, 82, 82, 224), false) dxDrawRoundedRectangle(screenW * 0.4019, screenH * 0.6444, screenW * 0.0769, screenH * 0.0533, 15, tocolor(82, 82, 82, 224), false) dxDrawRoundedRectangle(screenW * 0.5094, screenH * 0.6444, screenW * 0.0769, screenH * 0.0533, 15, tocolor(82, 82, 82, 224), false) dxDrawText("SIM", screenW * 0.4200, screenH * 0.6489, screenW * 0.4788, screenH * 0.6778, tocolor(25, 232, 4, 255), 3.00, "default-bold", "left", "top", false, false, false, false, false) dxDrawText("NÃO", screenW * 0.5240, screenH * 0.6489, screenW * 0.5837, screenH * 0.6778, tocolor(237, 0, 0, 255), 3.00, "default-bold", "left", "top", false, false, false, false, false) dxDrawText("Você quer trabalhar entregando drogas?", screenW * 0.4200, screenH * 0.2822, screenW * 0.6019, screenH * 0.3122, tocolor(255, 255, 255, 255), 1.00, "default-bold", "left", "top", false, false, false, false, false) dxDrawText("--Receber uma van no local ao lado", screenW * 0.4044, screenH * 0.3267, screenW * 0.5863, screenH * 0.3567, tocolor(255, 255, 255, 255), 1.00, "default-bold", "left", "top", false, false, false, false, false) dxDrawText("--Entregar a carga em um local secreto", screenW * 0.4044, screenH * 0.3567, screenW * 0.5863, screenH * 0.3867, tocolor(255, 255, 255, 255), 1.00, "default-bold", "left", "top", false, false, false, false, false) dxDrawText("--Receber de 10000 a 13000 de Dinheiro Sujo", screenW * 0.4044, screenH * 0.3867, screenW * 0.5863, screenH * 0.4211, tocolor(255, 255, 255, 255), 1.00, "default-bold", "left", "top", false, false, false, false, false) end addEvent("Open:Ilegal", true) addEventHandler("Open:Ilegal", root, function() if states then removeEventHandler("onClientRender", root, DX_Entregas) else addEventHandler("onClientRender", root, DX_Entregas) end states = not states -- Alterna states entre true e false a cada vez. showCursor(states) end)
  17. Prefira usar a palavra "obter". Ninguém usa "getar", só se for "setar". Você pode obter todos os elementos criados via script por um resource e depois verificar quais deles são do tipo "vehicle". Primeiro você usa getResourceDynamicElementRoot para obter o rootElement dinâmico do resource específico. Depois apenas pegue os elementos do tipo "vehicle" que estejam neste rootElement. local dynamicRoot = getResourceDynamicElementRoot (getResourceFromName ("teste")) -- Nome do resource aqui. local resourceVehs = getElementsByType("vehicle", dynamicRoot) -- Obtém todos os elementos do tipo veículo que estão no dynamicRootElement -- Obs: veículos criados por arquivos.map não entram aqui, somente os criados via script como createVehicle. -- Obs2: se quiser somente os veículos criados por arquivos.map do resource, utilize na primeira linha getResourceMapRootElement em vez disso. for _,veh in pairs (resourceVehs) do -- Exemplo q torna todos os veículos deste resource translúcidos (fantasmas). setElementAlpha(veh, 150) end
  18. Nunca use source como parâmetro de função. A variável res não é uma table. Acho que você queria usar getResources para obter uma table com todos os resources.
  19. Coloque alguns outputChatBox entre cada condição pra saber quais partes estão sendo lidas.
  20. De nada. O tonumber é bem comum de se usar, também tem o tostring pra converter um valor em texto.
  21. Ele está reclamando que thePlayer é um veículo e não um pedestre. Isso acontece se você encostar no marker dentro de um veículo, isso faz com que ele ative 2x, um pro veículo e outra pro jogador. Para evitar que ele considere o veículo, apenas adicione isso no começo da sua função: if getElementType(thePlayer) ~= "player" then return end -- Se o tipo de thePlayer for diferente de um jogador, então cancela a função e nada acontece.
  22. Dai é na seção Mapas para MTA:SA, aqui é só sobre programação. Tópico movido.
  23. Faça tipo assim: addEventHandler("onClientKey", root, function(key, press) if not press then return false end if isLoginEnabled then -- Aqui seria a variável responsável por dizer se o painel de login está na tela ou não. cancelEvent() end end) function abrePainel() -- Exemplo da sua função que faz o painel aparecer pro jogador. -- Aqui é onde está o código que mostra o painel. isLoginEnabled = true -- Define essa variável como true, então as binds deixam de funcionar mas ainda dá pra digitar no painel. end function fechaPainel() -- Exemplo da sua função que faz o painel desaparecer pro jogador. -- Aqui é onde está o código que oculta o painel. isLoginEnabled = false -- Define essa variável como false, então as binds voltam funcionar normalmente. end
×
×
  • Create New...