Jump to content

Lord Henry

Other Languages Moderators
  • Posts

    3,812
  • Joined

  • Last visited

  • Days Won

    153

Everything posted by Lord Henry

  1. Tente isso: setOcclusionsEnabled (false)
  2. Você pode setar a posição da câmera na posição atual dela, "desconectando" ela do jogador. addEventHandler("onClientPlayerWasted", root, function() -- Chama essa função quando alguém morre. if source == localPlayer then -- Se o jogador que morreu é o localPlayer, então: local camPosX, camPosY, camPosZ, lookAtX, lookAtY, lookAtZ, roll, fov = getCameraMatrix(localPlayer) -- Obtém a posição da câmera do jogador, posição em que ela está apontada, ângulo da câmera e campo de visão da câmera. setCameraMatrix(camPosX, camPosY, camPosZ, lookAtX, lookAtY, lookAtZ, roll, fov) -- Aplica todos os atributos atuais da câmera nela mesma, desconectando ela do jogador e evitando que ela balance. end end) Por padrão, o gamemode "Play" restaura a câmera do jogador depois que ele respawna. Mas caso você esteja usando outra gamemode, talvez seja necessário restaurar a câmera com isso depois que o jogador respawna: setCameraTarget(localPlayer) Obs: Tudo client-side.
  3. Tipo isso? local prizeMin, prizeMax = 5000, 10000 -- Prêmio mínimo e máximo. local segundos = 120 -- Duração da animação de roubo até o prêmio. function givePrize(thePlayer) local randomprize = math.random(prizeMin, prizeMax) -- Gera um valor aleatório entre o valor mínimo e máximo de prêmio. local sujo = getElementData(thePlayer, "DSujo") or 0 -- Obtém a quantidade atual de dinheiro sujo do jogador. setElementData(thePlayer, "DSujo", sujo + randomprize) -- Aumenta a quantidade de dinheiro sujo no jogador. -- givePlayerMoney(thePlayer, randomprize) -- Usado para testes sem o dinheiro sujo. Dá dinheiro normal ao jogador. setPedAnimation(thePlayer) -- Remove a animação do jogador. outputChatBox("Você coletou #00ff00R$ "..randomprize.."#ffffff de dinheiro sujo.", thePlayer, 255, 255, 255, true) theTimer = nil -- Anula a variável do timer para liberar espaço na memória. end theMarker = createMarker(2487, -1667, 12.4, "cylinder", 1.5) -- Cria um marker na Grove Street. addEventHandler("onMarkerHit", theMarker, function (hitElement, dimension) -- Ativa essa função quando algum elemento colidir no theMarker. if getElementType(hitElement) == "player" and dimension then -- Se o elemento que colidiu no marker for um player e estiver na mesma dimensão que o marker, então: if isTimer(theTimer) then return end -- Se já tem alguém roubando, cancela a função e nada acontece. setPedAnimation(hitElement, "ROB_BANK", "CAT_Safe_Rob", true, false, false, false) -- Seta essa animação de roubo em loop no jogador que colidiu no marker. theTimer = setTimer(givePrize, 1000 * segundos, 1, hitElement) -- Inicia o timer para dar o prêmio ao jogador após X segundos. Após esse tempo, a função givePrize será chamada. end end)
  4. Algumas linguagens de programação obrigam o uso do parênteses mesmo se for condição única, mas não é o caso da linguagem Lua, você pode declarar a condição sem os parênteses. Você só vai precisar colocar parênteses em condições compostas com AND ou OR em que a ordem de leitura importa. Vou dar um exemplo. local var1, var2, var3 = 1, 2, 3 if var1 == 4 and (var2 == 2 or var3 == 3) then --if false and (true) then --if false then print("False.") elseif var1 == 4 and var2 == 2 or var3 == 3 then -- if false and true or true then -- if false or true then -- if true then print("True.") end Da mesma forma que funciona em operações matemáticas, o parênteses dá prioridade para o que está dentro dele ser resolvido primeiro. local var1 = 5*2+2 -- 10+2 = 12 local var2 = 5*(2+2) -- 5*(4) = 20 print(var1, var2)
  5. Client-side: local normalDrawDistance = 50.0 addEventHandler("onClientResourceStart", resourceRoot, function () for k, player in pairs(getElementsByType("player")) do setPlayerNametagShowing(player, false) end end) addEventHandler("onClientResourceStop", resourceRoot, function () for k, player in pairs(getElementsByType("player")) do setPlayerNametagShowing(player, true) end end) addEventHandler("onClientPlayerJoin", root, function () setPlayerNametagShowing(source, false) end) addEventHandler("onClientRender", root, function () local target = getPedTarget(localPlayer) for _, player in pairs(getElementsByType("player", root, true)) do if player ~= localPlayer then local cx, cy, cz = getCameraMatrix() local vx, vy, vz = getPedBonePosition(player, 8) local dist = getDistanceBetweenPoints3D(cx, cy, cz, vx, vy, vz) if dist < normalDrawDistance or player == target then if isLineOfSightClear(cx, cy, cz, vx, vy, vz, true, false, false, true, false, false, false, localPlayer) then local x, y = getScreenFromWorldPosition(vx, vy, vz + 0.3) if x and y then local text = getElementData(player, "ID") or "N/A" local w = dxGetTextWidth(text, 1, "default-bold", true) local alpha = 255 if dist >= 10 then local leftover = dist - 10 alpha = math.max(0, alpha - dist * (leftover/5)) end if not getElementData(player, "isStaff") then -- Se o alvo NÃO É staff, então: dxDrawBorderedText(text, x - w, y - 10, x + w, y, tocolor(255, 255, 255, alpha), alpha, 1, "default-bold", "center", "top", false, false, false, true) end end end end end end end) function dxDrawBorderedText(text, left, top, right, bottom, color, alpha, scale, font, alignX, alignY, clip, wordBreak,postGUI) for oX = -1, 1 do -- Border size is 1 for oY = -1, 1 do -- Border size is 1 dxDrawText(text, left + oX, top + oY, right + oX, bottom + oY, tocolor(0, 0, 0, alpha), scale, font, alignX, alignY, clip, wordBreak,postGUI) end end dxDrawText(text, left, top, right, bottom, color, scale, font, alignX, alignY, clip, wordBreak, postGUI) end Server-side: addEventHandler("onResourceStart", resourceRoot, function () for _, player in pairs(getElementsByType("player")) do local acc = getPlayerAccount(player) if not isGuestAccount(acc) then local id = getAccountID(acc) -- Obtém o ID da conta do jogador. if id then -- Se existe o ID, então: setElementData(player, "ID", id) end if hasObjectPermissionTo(player, "command.mute", false) then -- Se o jogador é Staff, então: setElementData(player, "isStaff", true) else -- Caso o jogador tinha essa data antes, mas trocou de conta enquanto este resource estava desligado e agora não está como Staff: removeElementData(player, "isStaff") end else -- Caso o jogador tinha essa data antes, mas deslogou enquanto este resource estava desligado e agora não está logado: removeElementData(player, "ID") end end end) addEventHandler("onPlayerLogin", root, function (_, acc) local id = getAccountID(acc) -- Obtém o ID da conta do jogador. if id then -- Se existe o ID, então: setElementData(source, "ID", id) end if hasObjectPermissionTo(source, "command.mute", false) then -- Se o jogador é Staff, então: setElementData(source, "isStaff", true) end end) addEventHandler("onPlayerLogout", root, function(acc) removeElementData(source, "isStaff") -- Deslogou, não está mais logado na conta de Staff. removeElementData(source, "ID") -- Não está mais logado numa conta para ter um ID. end) addCommandHandler("id", function (player, _, id) if tonumber(id) then local thePlayer = getPlayerFromID(tonumber(id)) if thePlayer then outputChatBox ( "INFO #106FE7➺ #ffffff Nome do Jogador #106FE7" ..getPlayerName(thePlayer), player, 255, 255, 255, true) end end end) function getPlayerFromID(id) for _, v in pairs(getElementsByType("player")) do local data = getElementData(v, "ID") if data then -- Evita dar erro caso o jogador não tenha essa data. if data == id then return v end end end end
  6. Faltou você fechar o parênteses depois do end.
  7. As alterações que mostrei era pra você mexer somente nas funções que mostrei. Não era pra apagar o resto do seu código.
  8. Faça essas alterações: server-side function Start_Id() for _, player in pairs(getElementsByType("player")) do local acc = getPlayerAccount(player) if not isGuestAccount(acc) then setElementData(player, "ID", getAccountID(acc) or "N/A") if hasObjectPermissionTo(player, "command.mute", false) then -- Se o jogador é Staff, então: setElementData(player, "isStaff", true) else -- Caso o jogador tinha essa data antes, mas trocou de conta enquanto este resource estava desligado e agora não está como Staff: removeElementData(player, "isStaff") end end end end addEventHandler("onResourceStart", resourceRoot, Start_Id) function Login_Id(_, acc) setElementData(source, "ID", getAccountID(acc) or "N/A") if hasObjectPermissionTo(source, "command.mute", false) then -- Se o jogador é Staff, então: setElementData(source, "isStaff", true) end end addEventHandler("onPlayerLogin", root, Login_Id) addEventHandler("onPlayerLogout", root, function(acc) removeElementData(source, "isStaff") -- Deslogou, não está mais logado na conta de Staff. end) client-side function fRenderNameTag() local target = getPedTarget(localPlayer) for _, player in pairs(getElementsByType("player", root, true)) do if player ~= localPlayer then local cx, cy, cz = getCameraMatrix() local vx, vy, vz = getPedBonePosition(player, 8) local dist = getDistanceBetweenPoints3D(cx, cy, cz, vx, vy, vz) if dist < normalDrawDistance or player == target then if isLineOfSightClear(cx, cy, cz, vx, vy, vz, true, false, false, true, false, false, false, localPlayer) then local x, y = getScreenFromWorldPosition(vx, vy, vz + 0.3) if x and y then local text = getElementData(player, "ID") or "N/A" local w = dxGetTextWidth(text, 1, "default-bold", true) local alpha = 255 if dist >= 10 then local leftover = dist - 10 alpha = math.max(0, alpha - dist * (leftover/5)) end if not getElementData(player, "isStaff") then -- Se o alvo NÃO É staff, então: dxDrawBorderedText(text, x - w, y - 10, x + w, y, tocolor(255, 255, 255, alpha), alpha, 1, "default-bold", "center", "top", false, false, false, true) end end end end end end end addEventHandler("onClientRender", root, fRenderNameTag)
  9. O script que você mostrou não tem a parte de mostrar o ID em cima da cabeça do jogador. Falta a parte client-side.
  10. Você pode simplesmente aumentar o tamanho do marker invisível. Sendo necessário sair muito do lugar para farmar.
  11. Não. Nas luzes do farol e freios você não mexe. Deixe as originais. Só troque as texturas das setas pelas customizadas. Pra "acender" a textura, você apenas troca ela pela versão acesa. A versão acesa da textura customizada não precisa estar no TXD do veículo, só a versão apagada. No dxSetShaderValue você coloca a textura acesa que vai substituir a versão apagada da textura customizada. Não. Precisa adaptar o veículo se quiser usar setas nele. Os veículos originais usam a mesma textura dos faróis e freios nas setas, não tem como diferenciar as texturas das setas e dos faróis. Se você tentar fazer com veículos originais, você vai acabar substituindo as luzes dos faróis e freios junto.
  12. Se você tiver um velocímetro qualquer, é só detectar quando o jogador está com velocidade baixa demais e cancelar o drift. Se não quer fazer por meio da velocidade, crie um marker invisível e fique setando a posição dele no veículo a cada segundo. Se o veículo do jogador não sair desse marker depois de tanto tempo, cancela o contador de drift. Se o veículo do jogador estiver em movimento, ele sempre vai ficar saindo de dentro desse marker, se o veículo estiver parado farmando drift, ele não vai sair de dentro do marker e dai vc detecta ele. Obs: Faça tudo client-side.
  13. Faça o veículo com texturas customizadas nas setas. (a textura pode ser igual, mas tem que ter nome diferente). Nas setas esquerdas, coloquei uma textura com nome vehiclelights32Left, nas setas da direita, vehiclelights32Right. Então o shader basicamente só precisa substituir essas texturas pela versão acesa quando for pra acender e pela versão normal quando for apagar. Sobre o shader.fx usar, basta usar o shader simples de substituir texturas. Exemplo na Wiki: https://wiki.multitheftauto.com/wiki/Element/Shader#Simple Obs: Obviamente as texturas customizadas precisam estar incluídas no TXD do veículo.
  14. Utilize a função útil PlayVideo
  15. Também já percebi essa limitação. Mas nunca soube de onde vem. Talvez seja do próprio GTA.
  16. @SciptNovato na nova atualização 1.6 do MTA, a função getAllElementData passa a funcionar também client-side.
  17. Server-side local pendentes = {} -- Lista de players que tem solicitação de skin pendente. Formato: [playerElement] = skinID, local timersPendentes = {} -- Lista com os timers de cada solicitação. addCommandHandler("mudarskin", function(thePlayer, cmd, playerName, skinID) -- Comando para enviar a solicitação para o jogador. if not playerName or not skinID then outputChatBox("Sintaxe: /mudarskin <NomeJogador> <skinID>", thePlayer) return -- Se faltou especificar o nome do jogador ou o id da skin no comando, cancela a função e nada acontece. end local otherPlayer = getPlayerFromPartialName(playerName) -- Obtém o jogador pelo nome. if otherPlayer then -- Se encontrou o jogador, então: if pendentes[otherPlayer] then -- Se o jogador já tem uma solicitação na lista, então: outputChatBox("Este jogador já tem uma solicitação de skin pendente.", thePlayer) else -- Se o jogador ainda não tem uma solicitação na lista, então: pendentes[otherPlayer] = tonumber(skinID) -- Adiciona a solicitação dele na lista. outputChatBox("Você recebeu uma solicitação de skin "..skinID..". Digite /aceitarskin ou /recusarskin", otherPlayer) -- Manda isso pra ele. timersPendentes[otherPlayer] = setTimer(function() -- Depois de 10 segundos, expira a solicitação. pendentes[otherPlayer] = nil -- Remove a solicitação da lista. timersPendentes[otherPlayer] = nil -- Anula a variável do timer, removendo da lista de timers. outputChatBox("O jogador '"..playerName.."' não respondeu a sua solicitação e ela expirou.", thePlayer) end, 10000, 1) end else -- Se não encontrou o jogador pelo nome, então: outputChatBox("Não foi encontrado nenhum jogador com o nome '"..playerName.."'", thePlayer) end end) function getPlayerFromPartialName(name) -- Função útil que faz o mesmo que getPlayerFromName, mas o nome não precisa ser exato. local name = name and name:gsub("#%x%x%x%x%x%x", ""):lower() or nil if name then for _, player in ipairs(getElementsByType("player")) do local name_ = getPlayerName(player):gsub("#%x%x%x%x%x%x", ""):lower() if name_:find(name, 1, true) then return player end end end end function changeSkin(thePlayer, cmd) -- Função de aceitar ou recusar solicitações. if pendentes[thePlayer] then -- Se o jogador que executou o comando tem alguma solicitação na lista, então: if cmd == "aceitarskin" then -- Se ele usou o comando /aceitarskin então: setElementModel (thePlayer, pendentes[thePlayer]) -- Muda a skin dele. outputChatBox("Você aceitou a solicitação de skin.", thePlayer) else -- Se ele usou o comando /recusarskin então: outputChatBox("Você recusou a solicitação de skin.", thePlayer) end pendentes[thePlayer] = nil -- Remove a solicitação da lista. if isTimer(timersPendentes[thePlayer]) then -- Se existe o timer da solicitação, então: killTimer(timersPendentes[thePlayer]) -- Cancela o timer da solicitação. timersPendentes[thePlayer] = nil -- Remove o timer da lista de timers. end else -- Se o jogador que executou o comando não tem nenhuma solicitação na lista, então: outputChatBox("Você não tem nenhuma solicitação de skin para aceitar ou recusar.", thePlayer) end end addCommandHandler("aceitarskin", changeSkin) addCommandHandler("recusarskin", changeSkin)
  18. Por enquanto segue funcionando normalmente. Mas eu trocaria todos eles por root logo pois fica mais limpo o script.
  19. Você também pode usar a função útil math.randomDiff para nunca repetir o mesmo valor gerado anteriormente. Um dos exemplos inclusive faz ele gerar um valor numa série sem repetir nenhum até que a sequência inteira já tenha sido gerada.
  20. Pode reagir sim nos tópicos antigos, só é considerado reviver tópico se você comentar mais alguma coisa. Você também pode solicitar que tranquem o tópico depois que sua dúvida foi resolvida. Neste caso seria justificável você reviver o tópico para solicitar que tranquem ele. Mas somente se o tópico for seu.
  21. Ali o i do for é o índice do retângulo. Se você quer que ao clicar no primeiro retângulo da tabela faça tal coisa, você coloca isso: if i == 1 then -- Code end Depois elseif i == 2 then pro segundo retângulo. E assim por diante nos próximos retângulos.
  22. Tipo assim: local screen = Vector2(guiGetScreenSize()) -- Obtém a resolução do jogador. retangulos = { -- posX, posY, tamanhoX, tamanhoY {screen.x/2 - 100, screen.y/2 - 100, 200, 20}, {screen.x/2 - 100, screen.y/2 - 60, 200, 20}, {screen.x/2 - 100, screen.y/2 - 20, 200, 20}, {screen.x/2 - 100, screen.y/2 + 20, 200, 20}, {screen.x/2 - 100, screen.y/2 + 60, 200, 20}, {screen.x/2 - 100, screen.y/2 + 100, 200, 20}, } function isMouseInPosition (x, y, width, height) -- Função útil. if (not isCursorShowing()) then return false end local sx, sy = guiGetScreenSize() local cx, cy = getCursorPosition() local cx, cy = (cx * sx), (cy * sy) return ((cx >= x and cx <= x + width) and (cy >= y and cy <= y + height)) end function renderPanel() -- Renderiza o painel. local cx, cy = getCursorPosition() for _, infos in pairs(retangulos) do -- Para cada item da tabela retangulos, faça: local x, y, sizeX, sizeY = unpack(infos) -- Obtém cada valor desse item e separa numa variável. if isMouseInPosition (x, y, sizeX, sizeY) then -- Se o mouse está em cima deste retângulo, então: dxDrawRectangle (x, y, sizeX, sizeY, 0xFFFFFFFF, true) -- Retângulo selecionado branco. else dxDrawRectangle (x, y, sizeX, sizeY, 0xFF0000FF, true) -- Retângulo normal azul. end end end addCommandHandler("eae", function(cmd) -- Mostra/oculta o painel. showCursor(not isCursorShowing()) if isCursorShowing() then addEventHandler("onClientRender", root, renderPanel) else removeEventHandler("onClientRender", root, renderPanel) end end) addEventHandler("onClientClick", root, function(button, state) -- Função que mostra qual botão foi clicado. if button == "left" and state == "down" then for i, infos in pairs(retangulos) do local x, y, sizeX, sizeY = unpack(infos) if isMouseInPosition (x, y, sizeX, sizeY) then outputChatBox("Você clicou no botão "..i) break -- Não precisa verificar os demais botões, pois já achou o que foi clicado. end end end end)
  23. Você pode pegar o colorPicker do painel F1 (freeroam). (deixe os arquivos dele dentro de uma pasta chamada "colorpicker" e deixe essa pasta dentro do seu resource) Aqui estão os arquivos dele: (clique com o botão direito em cima da imagem e depois vá em "Salvar como") Aqui está a parte que você precisa incluir no meta.xml do seu resource: <script src="colorpicker/colorpicker.lua" type="client" /> <file src="colorpicker/palette.png" /> <file src="colorpicker/alpha.png" /> E por fim, aqui está um exemplo que eu fiz para abrir, usar e fechar o colorPicker. client.lua (coloquei dentro de spoiler pq o código ficou grande) server.lua addEvent("getColorsFromClient", true) addEventHandler("getColorsFromClient", root, function(r1, g1, b1, r2, g2, b2, r3, g3, b3, r, g, b) if isElement(source) then setVehicleColor(source, r1, g1, b1, r2, g2, b2, r3, g3, b3) setVehicleHeadLightColor(source, r, g, b) end end) Resumo de funções usadas e sua utilidade: colorPicker.isSelectOpen() Retorna true se a janela do colorPicker está aberta e retorna false caso contrário. Não precisa de parâmetros. colorPicker.setValue() Seta uma cor RGBA na janela, use isso antes de abrir a janela se não quiser que ela abra na cor vermelha (padrão). Precisa de um único parâmetro que é uma tabela com os valores {r, g, b, a} respectivamente. colorPicker.updateTempColors() Retorna 4 valores inteiros, RGBA respectivamente. É a cor que está na janela do colorPicker. Basicamente é um getValue() da janela. Precisa estar dentro de um onClientRender para ficar obtendo a posição atual da seleção na janela. Não precisa de parâmetros. colorPicker.openSelect() Mostra a janela do colorPicker. (ela já foi criada ao iniciar o resource, mas fica oculta até ser chamada) Precisa ter um showCursor(true) antes para mostrar o ponteiro do mouse e interagir com o colorPicker. Não precisa de parâmetros. colorPicker.closeSelect() Oculta a janela do colorPicker. (ela não é destruída, apenas ocultada) Precisa ter um showCursor(false) depois para ocultar o ponteiro do mouse. A não ser que no seu resource tenha outra janela para interagir e por isso não precisaria ocultar o ponteiro ainda. Essa função é chamada automaticamente se clicar fora da janela do colorPicker. Não precisa de parâmetros. OBS: Esse colorPicker foi editado por Lord Henry para tradução e para desabilitar a cor 4 que não é utilizada.
×
×
  • Create New...