-
Posts
4,010 -
Joined
-
Last visited
-
Days Won
184
Everything posted by Lord Henry
-
Mods de veículos fazem travar
Lord Henry replied to joãofxp's topic in Ajudas relacionadas ao MTA:SA (Cliente/Servidor)
Já verificou se os mods de veículos que você está colocando são pesados demais? Teste com algum veículo bem leve. -
Eu lhe dei uma solução simples, mas você prefere continuar reclamando e achando que estou debochando, dai não há o que fazer. O mundo não gira ao seu redor. Se pra você é tão incômodo fazer uma atualização, parece que você não leva a sério o seu próprio servidor. Existem as pessoas que já estão correndo atrás e atualizando seus resources, e existem as pessoas que preferem reclamar achando que o sistema vai mudar para atender às suas reclamações como se você fosse o todo-poderoso. É o clássico "estou pagando, então estou na razão." Mesmo que eu concordasse com suas reclamações e lhe dissesse que o sistema deveria manter na top list os servidores desatualizados, o MTA não iria mudar o sistema de qualquer forma, pois seria apenas a minha opinião, que não interfere em nada no desenvolvimento do MTA em si. Enfim, espero que entenda que existem coisas que não estão sob nosso controle, cabe a nós nos adaptar, melhorar e seguir em frente.
-
local infos = { -- Tabela onde as infos de cada bot serão declaradas. [1] = {id, x, y, z, r, "CRACK", "crckidle1", -1, true, true, true}, [2] = {id, x, y, z, r, "CRACK", "crckidle1", -1, true, true, true}, [3] = {id, x, y, z, r, "CRACK", "crckidle1", -1, true, true, true}, } local bots = {} -- Tabela onde cada bot criado vai ficar. for i, v in ipairs(infos) do -- Para cada info, cria um bot na lista de bots. bots[i] = createPed(v[1], v[2], v[3], v[4], v[5]) end function restartPedAnimation() for i, v in pairs (bots) do -- Para cada bot, faça: if source == v then -- Se o bot que tomou dano é um da lista, então: setPedAnimation(source, infos[i][6], infos[i][7], infos[i][8], infos[i][9], infos[i][10], infos[i][11]) -- Seta essa animação que está nas infos. break -- Cancela o loop pois já encontrou o bot correto. end end end addEventHandler("onClientPedDamage", resourceRoot, restartPedAnimation) -- Ativa essa função quando qualquer NPC deste resource tomar dano. Tente isso. (não testado)
-
Se estiver se referindo a dxDraw, só é possível fazer isso com imagem.
-
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.
-
Não seria mais fácil vcs simplesmente atualizarem seus servidores para a versão 1.6 também?
-
triggerClientEvent Expected string at argument 1
Lord Henry replied to ylove's topic in Programação em Lua
triggerCleintEvent não existe. Vc escreveu errado. O certo é triggerClientEvent Ali no destroyElement, vechile não deveria ser vehicle? -
Use isso: createMarker onMarkerHit setPedAnimation
- 1 reply
-
- 1
-
-
Dar comando no Marker (Mais de um marker)
Lord Henry replied to Kryvios's topic in Programação em Lua
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. -
ban BAIXEI O MTA AGORA, E APARECE QUE ESTOU BANIDO
Lord Henry replied to KuroWashiBR's topic in Portuguese / Português
Sem print. Upe a imagem no imgur.com e cole aqui o link. -
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.
-
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.
-
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.
-
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.
-
Onde você declarou a variável next? Está usando OOP? Indente seu código para torná-lo legível.
-
Esse addEventHandler do onPlayerLogin está com o nome da função errado.
-
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.
-
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)
-
Tente isso: setOcclusionsEnabled (false)
-
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.
- 1 reply
-
- 1
-
-
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)
-
[DUVIDA] diferença de com ou sem parenteses
Lord Henry replied to Doongogar's topic in Programação em Lua
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)
