Jump to content

Lord Henry

Other Languages Moderators
  • Posts

    3,931
  • Joined

  • Last visited

  • Days Won

    174

Everything posted by Lord Henry

  1. Se vcs não tem capacidade de se manterem atualizados, a culpa não é do MTA. Quem não se atualiza, fica para trás. Isso serve em qualquer área.
  2. Não seria mais fácil vcs simplesmente atualizarem seus servidores para a versão 1.6 também?
  3. É bug do seu servidor. Não há nenhum problema com essas skins.
  4. triggerCleintEvent não existe. Vc escreveu errado. O certo é triggerClientEvent Ali no destroyElement, vechile não deveria ser vehicle?
  5. Use isso: createMarker onMarkerHit setPedAnimation
  6. Não é uma boa ideia usar markers tão grandes. Prefira usar colshapes. Por exemplo createColCuboid. Você pode usar o mesmo tamanho que usou no createRadarArea. Também não faz sentido o script forçar um comando sendo que ele poderia simplesmente chamar direto a função que é chamada pelo comando. Aqui tem uma página secreta com todos os colshapes das zonas de San Andreas. Basta escolher qual território você quer. Utilize este mapa para saber os nomes.
  7. Sem print. Upe a imagem no imgur.com e cole aqui o link.
  8. Já tentou reinstalar ou atualizar os drivers da sua placa de vídeo?
  9. Não há diferença. O servidor vai descompactar o ZIP para baixar seu conteúdo de qualquer forma que uma pasta. Porém o ZIP é mais leve de upar na host por exemplo.
  10. Dica sobre os markers: Crie uma tabela com todos os markers para poupar espaço na memória mantendo todos eles na mesma variável. É melhor fazer assim do que vários createMarkers em variáveis diferentes. local theMarkers = { createMarker(0, 0, 3.5, "cylinder"), createMarker(0, 4, 3.5, "cylinder"), createMarker(0, -4, 3.5, "cylinder"), } function function1(keyPresser, key, keyState) -- Função que é ativada ao apertar a tecla bindada G. if isElementWithinMarker (keyPresser, theMarkers[1]) then -- Se o jogador que apertou a tecla estiver dentro do primeiro marker, então: -- Faz tal coisa. elseif isElementWithinMarker (keyPresser, theMarkers[2]) then -- Senão, se ele estiver no segundo marker, então: -- Faz outra coisa. elseif isElementWithinMarker (keyPresser, theMarkers[3]) then -- E assim por diante. -- Faz outra coisa. end end -- Não precisa da function2, pois todos os markers ativarão a function1 que vai determinar oq cada um faz.
  11. Prefira usar variáveis predefinidas. Troque todos os getResourceRootElement(getThisResource()) por resourceRoot. Troque todos os getRootElement() por root. Ao usar getElementsByType, a ordem dos elementos não importa. O pairs é um pouco mais rápido que o ipairs. Troque todos os ipairs por pairs. Por não ser necessário o índice, você pode ignorar a variável i dos loops, trocando eles por _ (underline). Troque todos os i dos loops por _ Não adicione o mesmo evento várias vezes. No seu exemplo você está adicionando 2 onPlayerJoin e 2 onResourceStart. Coloque todos os bindKey na mesma função onde está o onPlayerJoin e o onResourceStart. Delete as funções e eventos repetidos.
  12. Quando for postar os códigos aqui no fórum, clique no botão <> e depois selecione a linguagem Lua. Sobre indentação, você pode aprender aqui: A sua variável next é uma palavra reservada, troque para outra coisa, por exemplo nextInv. E está faltando o nome da função exportada. Se tiver parâmetros, também devem ter seus valores definidos. local nextInv = exports["n3xt_inventario"]:nomeFunction (parametro1, parametro2) Obs: Maiúsculas e minúsculas fazem diferença. Os nomes precisam ser exatos.
  13. Para salvar datas permanentes, você não usa elementDatas, você salva elas na conta do jogador com setAccountData. Depois quando você for logar, você obtém esses dados com getAccountData.
  14. Onde você declarou a variável next? Está usando OOP? Indente seu código para torná-lo legível.
  15. Esse addEventHandler do onPlayerLogin está com o nome da função errado.
  16. Em caso de mapas que utilizam muitos objetos para substituir, é mais recomendado que você coloque-os em IDs vazios em vez de usar os IDs de objetos nativos. Você pode alocar os IDs vazios para usar nos objetos novos com engineRequestModel. -- Tabela com todas as posições dos objetos. local locations = { -- [Index] = {px, py, pz, rx, ry, rz} [1] = {2830.4, -2006.87, 23.431, 0, 0, 90}, [2] = {2627.66, -2162.95, 23.63, 0, 0, 0}, } -- Tabela com os nomes dos arquivos .col, .txd e .dff, precisa estar na mesma ordem das locations. local models = { [1] = "models/station", -- Cada objeto precisa ter seu .col, .txd e .dff com o mesmo nome. [2] = "models/track01", -- Neste exemplo, os arquivos estão dentro de uma pasta chamada "models" dentro do resource. } local allocatedIDs = {} -- Tabela onde os IDs gerados vão ficar. Pois você precisa deletá-los ao desligar este resource. addEventHandler ("onClientResourceStart", resourceRoot, function () -- Ativa essa função quando este resource for iniciado. for i, item in ipairs (locations) do -- Para cada posição de objeto, faça: local x, y, z, rx, ry, rz = unpack(item) local ID = engineRequestModel ("object") -- Gera um ID válido para objetos. local col = engineLoadCOL (models[i]..".col") local txd = engineLoadTXD (models[i]..".txd") local dff = engineLoadDFF (models[i]..".dff") engineReplaceCOL (col, ID) engineImportTXD (txd, ID) engineReplaceModel (dff, ID) engineSetModelLODDistance(ID, 170) -- Visível até 300 metros de distância. Não adianta colocar mais do que isso. createObject(ID, x, y, z, rx, ry, rz) -- Cria o objeto com o ID gerado. table.insert(allocatedIDs, ID) -- Insere o ID gerado na tabela de IDs gerados. end end) addEventHandler ("onClientResourceStop", resourceRoot, function () -- Ativa essa função quando este resource for desligado. for i,v in pairs(allocatedIDs) do -- Para cada ID gerado. engineFreeModel (v) -- Libera este ID da memória. end end) Se você quer que um objeto seja visível por mais do que 300 metros, será necessário criar um objeto LOD e vincular ele no seu objeto. Obviamente o objeto LOD terá um ID diferente do seu objeto vinculado. -- Cria um objeto normal. objNormal = createObject (3620, x, y, z, rx, ry, rz) -- Cria um objeto Low LOD. objLowLOD = createObject (5154, x, y, z, rx, ry, rz, true) -- O true desativa a colisão deste objeto e libera sua distância máxima para até 1000 metros. (Low LOD object) -- Vincula esse objeto Low LOD ao objeto normal. setLowLODElement (objNormal, objLowLOD) -- Define a distância de visão deste objeto Low LOD para o máximo. engineSetModelLODDistance (5154, 300) -- O 300 faz com que a distância do objeto seja máxima mesmo se o jogador configurar sua draw distance para o mínimo possível. -- Definir para 170 faz com que a distância do objeto seja máxima somente se o jogador definir sua draw distance para 100%. -- 170 evita que jogadores com PCs fracos tenham lag, permitindo que eles abaixem a distância dos objetos caso queiram, enquanto que 300 força todo mundo na distância máxima.
  17. createBlipAttachedTo No último parâmetro vc coloca uma tabela com os jogadores da ACL específica, assim somente estes jogadores poderão ver o blip. getPlayersInACLGroup (função útil)
  18. Tente isso: setOcclusionsEnabled (false)
  19. 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.
  20. 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)
  21. 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)
  22. 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
  23. Faltou você fechar o parênteses depois do end.
  24. 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.
  25. 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)
×
×
  • Create New...