Jump to content

Boechat

Members
  • Posts

    213
  • Joined

  • Last visited

  • Days Won

    7

Posts posted by Boechat

  1. Não recomendo que você faça com timer infinito, o desempenho não fica legal. Você pode usar a função onPlayerDamage e checar se o dano será fatal, se for, você cancela o dano, derruba o player e faz todo o resto...

     

    function playerDamage ( attacker, weapon, bodypart, loss ) 
    	if ((getElementHealth(source) - loss) <= 0) then
        	cancelEvent()
        	--Faz a animação etc...
        end
    end
    addEventHandler ( "onPlayerDamage", root, playerDamage )

     

  2. Então, difícil te ensinar como fazer do 0, recomendo que você passe por alguns tutoriais antes. Mas basicamente você usará a função addPedClothes para modificar a roupa e setElementModel para modificar a skin do personagem. Como você é iniciante, recomendo que comece fazendo com comandos no chat usando o addCommandoHandler e depois faça uma interface gráfica usando as funções dx ou GUI

    Vou dar um exemplo de como mudar a skin, depois você pode se aventurar aí

    function mudarSkin ( player, comando, id ) --quando uma função é chamada com addCommandHandler é passado por parametro o player que a chamou, o comando e logo em seguida os parâmetros (o que você digitar depois do comando). Por exemplo: /skin 1 (player = jogador que deu o comando, comando = skin, id = 1)
      setElementModel(player, id)
    end
    
    addCommandHandler("skin", mudarSkin) --Ao dar o comando /skin vai executar a função "mudarSkin"

     

  3. Salve rapaziada! 

    Estou criando um mod de minigun em cima de um veículo, para isso eu crio uma arma com o createWeapon  mas o range está muito curtinho, pra tentar aumentar esse range eu usei a função setWeaponProperty aumentado o "weapon_range" mas o range não muda. Até muda teoricamente se eu der um output com o getWeaponProperity, mas na prática os tiros não pegam e somem ainda com um range pequeno... Alguém sabe como arrumar isso?

  4. On 23/10/2021 at 09:57, MTS_LoneWolf said:

    sempre que alguem abre o painel ele abre para todos os jogadores

    Serverside

     

    Arsenal = createMarker(1950.0999755859,-1444.0446777344,13.538549423218 -1, "cylinder", 1.5, 255, 10, 10, 144)

    function AbrirPainel(player) --Abrir
    if isObjectInACLGroup("user."..getAccountName(getPlayerAccount(player)),aclGetGroup("Policial")) then
        if isElementWithinMarker(player,Arsenal) then
            triggerClientEvent ("OpenPanel", getRootElement())
        end
    end
    end

    addCommandHandler("painel", AbrirPainel)

     

    clientside

     

    local exibindo_painel = false
    function ArsenalP()
        dxDrawRectangle(430, 300, 266, 215, tocolor(127, 127, 127, 100), false)

        dxDrawRectangle(436, 310, 250, 31, tocolor(0, 0, 0, 179), false)
        dxDrawRectangle(436, 351, 250, 31, tocolor(0, 0, 0, 179), false)
        dxDrawRectangle(436, 392, 250, 31, tocolor(0, 0, 0, 179), false)
        dxDrawRectangle(436, 433, 250, 31, tocolor(0, 0, 0, 179), false)
        dxDrawRectangle(436, 474, 250, 31, tocolor(0, 0, 0, 179), false)

        dxDrawText("M4A1", 532, 310, 590, 341, tocolor(255, 255, 255, 255), 2.00, "default", "left", "top", false, false, false, false, false)
        dxDrawText("Glock", 532, 351, 590, 382, tocolor(255, 255, 255, 255), 2.00, "default", "left", "top", false, false, false, false, false)
        dxDrawText("Sniper", 532, 392, 590, 423, tocolor(255, 255, 255, 255), 2.00, "default", "left", "top", false, false, false, false, false)
        dxDrawText("Taser", 532, 433, 590, 464, tocolor(255, 255, 255, 255), 2.00, "default", "left", "top", false, false, false, false, false)
        dxDrawText("Colete", 532, 474, 590, 505, tocolor(255, 255, 255, 255), 2.00, "default", "left", "top", false, false, false, false, false)
    end

    --Abrir

    function OpenP()
        if exibindo_painel == false then
            addEventHandler("onClientRender", getRootElement(), ArsenalP)
            exibindo_painel = true
            showCursor(true)
        else
            removeEventHandler("onClientRender", getRootElement(), ArsenalP)
            exibindo_painel = false
            showCursor(false)
        end
    end

    addEvent( "OpenPanel", true )
    addEventHandler( "OpenPanel", localPlayer, OpenP )

    Olá, boa tarde! Primeiramente, sempre que adicionar um código no fórum, use o botão <code> para facilitar a visualização.

    O triggerClientEvent tem como 1° argumento opcional o client que você deseja acionar o evento. No caso, como você não definiu um destinatário, por padrão vai para todos os players (root).

    Para corrigir, mude de:

     triggerClientEvent ("OpenPanel", getRootElement())

    Para:

    triggerClientEvent (player, "OpenPanel", getRootElement())

    Leia mais na página da wiki triggerClientEvent

    • Thanks 1
  5. No lugar de 

    setElementFrozen(targetPlayer, true)

     coloque 

    setElementFrozen(targetPlayer, not isElementFrozen(targetPlayer))

    Obs: pode ter ficado meio bagunçado pq opção <code> do fórum não está funcionando pra mim

    • Haha 1
  6. 15 hours ago, Archz said:

    entendi e como eu poderia resolver isso? @Boechat

     

    INTERFACE.blips é uma tabela que a posição deve ser o diretório da imagem dos blips, por exemplo: INTERFACE.blips[1] = ":ModDeMapa/blips/1.png"

    Encontre onde essa tabela INTERFACE.blips é preenchida porque o erro pode estar nela...

    • Thanks 1
  7. Desculpa mais um comentário, mas agora que me toquei que coloquei as funções mas não fiz o comando KKKK

    Adicione esse código:

    addCommandoHandler("setskin", function(playerSource, cmd, id, skin) --Quando der o comando setskin
        id = tonumber(id) --Por padrão, os comandos vem como string. Nós temos que converter para number (int) para funcionar corretamente.
        skin = tonumber(skin)
    	setPlayerSkinByID (id, skin, playerSource) --Chamando a função de setar skin
    end)

    Aproveitando o post, o 1° código que eu postei ele coloca um sistema de ID no seu servidor que facilita usos futuros, mas se quiser fazer de uma forma mais simples pode fazer assim:

    Spoiler
    function setPlayerSkinByID (id, skin, adm) --Passa um int id, int skin e element(player) adm como parâmetro.
      local player = getPlayerByID(id) -- Chama outra função que retorna um player passando o ID do player como parâmetro. False se não achar o player. 
      if not player then return outputChatBox("Player não encontrado.", adm) end --Se não encontrou o player mostra uma mensagem e para a função.
      setElementModel(player, skin) --Seta a skin desejada no player encontrado pelo ID.
    end  
    
    function getPlayerByID(id)
      for i, player in ipairs(getElementsByType('player')) do --Um for que percorre todos os players online.
        if getAccountID(getPlayerAccount (player)) == id then --Se o ID for igual ao id passado por parâmentro, então... 
          return player --Retorna o player e para a função.
        end
      end
      return false --Se percorrer todos os players e não achar o player com o ID indicado, retorna falso.
    end
    
    addCommandoHandler("setskin", function(playerSource, cmd, id, skin) --Quando der o comando setskin
        id = tonumber(id) --Por padrão, os comandos vem como string. Nós temos que converter para number (int) para funcionar corretamente.
        skin = tonumber(skin)
    	setPlayerSkinByID (id, skin, playerSource) --Chamando a função de setar skin
    end)

     

     

  8. 15 hours ago, Lord Henry said:

    Assim como lhe respondi no privado, o erro acontece pois ele não consegue modificar uma função nativa do MTA getServerPassword

    Troque o nome da função por alguma que não seja nativa, por exemplo getServerPass e o script funcionará normalmente.

    Mas não é possível sobrescrever funções nativas? Pelo que eu li nesse tópico sobre proteção de scripts achei que fosse possível...

  9. Já notei um pequeno erro, corrija por favor (já que não dá para eu editar a resposta)

    Troque "root" por "resourceRoot", senão vai executar o código sempre que qualquer resource iniciar, não somente a resource em questão.

    Como está:

    addEventHandler('onResourceStart', root, function() --Quando iniciar o mod...

    Corrigido:

    addEventHandler('onResourceStart', resourceRoot, function() --Quando iniciar o mod...

     

  10.   Eu postei a resposta acima sem querer antes de escrever o código, quando fui editar a resposta já tinha passado muito tempo... (acho um saco isso de ter limite de tempo para editar uma postagem)

    E eu não testei o código, testa aí e traga possíveis problemas. Não esqueça de dar um /debugscript 3 para ver o erro.

    function setPlayerSkinByID (id, skin, adm) --Passa um int id, int skin e element(player) adm como parâmetro.
      local player = getPlayerByID(id) -- Chama outra função que retorna um player passando o ID do player como parâmetro. False se não achar o player. 
      if not player then return outputChatBox("Player não encontrado.", adm) end --Se não encontrou o player mostra uma mensagem e para a função.
      setElementModel(player, skin) --Seta a skin desejada no player encontrado pelo ID.
    end  
    
    function getPlayerByID(id)
      for i, player in ipairs(getElementsByType('player')) do --Um for que percorre todos os players online.
        if getElementData(player, 'ID') == id then --Se o ID préviamente salvo no player for igual ao id passado por parâmentr, então... (!!!ATENÇÃO!!!)
          return player --Retorna o player e para a função.
        end
      end
      return false --Se percorrer todos os players e não achar o player com o ID indicado, retorna falso.
    end
    
    --ATENÇÃO: SE SEU SERVER JÁ TIVER UM SISTEMA DE ID PODE EXCLUIR TUDO DAQUI PRA BAIXO. E FIQUE ATENTO TAMBÉM AO NOME DO ELEMENTDATA DO ID, SE FOR DIFERENTE DE 'ID' VOCÊ DEVE MUDAR NA LINHA QUE EU COLOQUEI (!!!ATENÇÃO!!!) COMENTADO NA FRENTE.
    
    local function addPlayerDataID (player, id) 
      setElementData(player, 'ID', id) --Seta o ID do player no elemento player (o ID a princípio é relacionado a account do player)
    end
    
    addEventHandler('onResourceStart', root, function() --Quando iniciar o mod...
       for i, player in ipairs(getElementsByType('player')) do --Um for que percorre todos os players online.
          local id = getAccountID(getPlayerAccount (player)) --Pega o ID da conta do player
          addPlayerDataID (player, id) --Chama a função para setar o ID no player.
       end
    end)
    
    addEventHandler('onPlayerLogin', root, function(thePreviousAccount, account) --Quando um player logar...
      local id = getAccountID(account) --Pega o ID da conta do player.
      addPlayerDataID (source, id) --Chama a função para setar o ID no player, que nesse caso é o source do evento..
    end)

     

  11. On 21/05/2021 at 14:09, keven said:

    Estou tentando setar skin no player por ID.

    alguém pode me ajudar???

    exemplo de comando 

     

    /skin 1( player ) 16(ID SKIN)

    Sou muito novo nessa de Script. Então me perdoe pelos erros...

     

    ----------------------------------------------------

    function getSkinNameFromID(i)
        local id = tonumber (i)
            assert(id, "Bad argument 1 @ getSkinFromID [Number expected, got " .. type(i) .. "]")
        local name = skinsTable[id]
            assert(name,"Bad argument 1 @ getSkinFromID [Invaild skin ID]")
        return name 
    end

    addCommandHandler('skin',
    function()
    local name = getSkinNameFromID(getElementModel(localPlayer))
    if name then
    outputChatBox('SkinName : ('..name..') of ID ('..getElementModel(localPlayer)..')',255,255,0)
    else
    outputChatBox('Falha ao obter skin. ID errado ou não encontrado na tabela',255,255,0)
    end
    end)

    Para setar uma skin você deve usar a função setElementModel que recebe o elemento (no caso o player) e o ID do model (skin). Como você quer passar o ID do player, antes deve fazer uma lógica para buscar o player pelo ID.

    Ficaria mais ou menos assim (observe os comentários): 

  12. On 25/08/2021 at 21:57, SciptNovato said:

    ola sou novo no mta e gostaria que esse script fizesse com que eu ja spawnasse o carro, com o player que deu o comando dentro do carro, e se possivel, colocar pra spawnar carro em outras pessoas pelo id da pessoa, ex: /createvehicle (id da pessoa que quero que spawne o carro) (id do carro que vai spawnar)

     

    local distance = 5 --units

    -- define our handler (we'll take a variable number of parameters where the name goes, because there are vehicle names with more than one word)
    function consoleCreateVehicle ( sourcePlayer, commandName, ... )
       -- if a player triggered it, not the admin,
       if ( sourcePlayer ) then
          -- calculate the position of the vehicle based on the player's position and rotation:
          local x, y, z = getElementPosition ( sourcePlayer ) -- get the player's position
          local rotZ = getElementRotation ( sourcePlayer ) -- get the player's rotation around the Z axis in degrees
          x = x + ( ( math.cos ( math.rad ( rotZ ) ) ) * distance ) -- calculate the X position of the vehicle
          y = y + ( ( math.sin ( math.rad ( rotZ ) ) ) * distance ) -- calculate the Y position of the vehicle

          -- get the complete vehicle name by joining all passed parameters using Lua function table.concat
          local vehicleName = table.concat({...}, " ")
          -- get the vehicle's model ID from the name
          local vehicleID = getVehicleModelFromName ( vehicleName )
          -- if vehicle ID is valid,
          if vehicleID then
                -- create the vehicle using the information gathered above:
                local newVehicle = createVehicle ( vehicleID, x, y, z, 0, 0, rotZ )
                -- if vehicle creation failed, give the player a message
                if not newVehicle then
                   outputConsole ( "Failed to create vehicle.", sourcePlayer )
                end
          end
       end
    end

    -- Attach the 'consoleCreateVehicle' function to the "createvehicle" command
    addCommandHandler ( "createvehicle", consoleCreateVehicle )

    Cara, fiquei com preguiça de ler esse código dessa forma, da próxima vez faça como o @Lord Henry instruiu acima...

    Mas basicamente você cria o veículo com o createVehicle e depois use a função warpPedIntoVehicle para colocar o player dentro do veículo.

  13. 20 hours ago, KiritoAguiar said:

    to fazendo um script e preciso q ele pegue uma variavel q ta em outro script, outra resource msm, teria q pegar essa variavel exportando mas n to conseguindo fazer

    Exemplo: 

    SERVER_PASSWORD = "Mw4U8Bq!##K%lBBXC0*BFLUgOTY!%Zkdv4MhD@CtP^D&ZUOfd3"
    
    function getServerPassword() -- Função q quero exportar exportada
    	return SERVER_PASSWORD
    end

    Meta: 

    	<script src="SKServerIP.lua" type="server" /> 
    	<export function="getServerPassword" type="server" />
    	<min_mta_version server="1.5.6-9.18728" client="1.5.6-9.18728" /> 
    	<download_priority_group>2</download_priority_group> 

    E no outro script q quero pegar o SERVER_PASSWORD ta assim:

    function teste ()
    	local senha = exports["SKServerIP"]:getServerPassword () or 0
    	if (senha ~= "Mw4U8Bq!##K%lBBXC0*BFLUgOTY!%Zkdv4MhD@CtP^D&ZUOfd3") then
        	outputChatBox ("teste")
        end
    end
    addEventHandler ("onResourceStart", resourceRoot, teste)

    E no debug da esse erro se referindo a linha 2 desse ultimo script:
    Acce
    ss denied @ "call" [string "?"] 

    O nome do resource é SKServerIP? Pois percebi que é o mesmo nome do arquivo .lua, talvez você tenha confundido...

    A sintaxe é assim: exports["NomeDoMod"]:getServerPassword () ou exports.NomeDoMod:getServerPassword ()

     

  14. On 17/08/2021 at 09:43, Jaga said:

    Opa funcionou para pegar o itens mas oque faz ele funcionar é eu retirando o...

    if isElement(Lixeiras[i]) then destroyElement(Lixeiras[i]) end

    Soque se eu retirar esse destroyElement e so colocar o setElementVisibleTo ele apenas vai fazer o marker sumir, mas mesmo assim vai continuar pegando os itens caso passe os cima, entao precisava fazer o destroyElement e dps fzr o Element voltar quando saisse e voltasse para o trabalho

    É só checar se o marker está sendo exibido para o player, ou você pode mudar a lógica de criação do marker e criar eles client-side sempre que o player entrar no emprego. Da primeira forma é bem mais simples e é só colocar essa condição a mais na função "PegarLixo":

    function PegarLixo(hitElement)
      if isElementVisibleTo ( source, hitElement ) and getElementData(hitElement, "Lixeiro") then
        ...
        ...
        ...
        ...
      end
    end

    Obs: Não testei!

  15. addEventHandler( "onPlayerDamage", root, function (attacker, damage, bodypart, loss) 
        if getElementHealth(source) - loss < 80 then --Calcula se o player ficará com menos de 80 de vida com o dano. Se sim, já retira o dinheiro.
            takePlayerMoney( source, 100 ) --Tira 100 de dinheiro de quem sofreu dano
        end
    end)

    Corrigi algumas coisinhas e diminui um pouco o código.

    • Like 1
    • Thanks 1
  16. Não sei como está o funcionamento desse exports mas acho que assim vai funcionar

    Mude essa linha: exports["Bahamas_Inventory"]:BHM_GiveItem(hitElement, RandomItens, random)

    Para: exports["Bahamas_Inventory"]:BHM_GiveItem(hitElement, Itens[RandomItens][1], random)

    *#Itens retorna um numero do tamanho do array, depois você pegou um número aleatório nesse intervalo e passou ele como referência. Você está passando o RandomItens como parâmetro, que é um número aleatório, talvez o correto não seria passar o nome do item? Já o [1] é porque você colocou os nomes dos itens dentro de outra tabela, n entendi o porquê disso já que só tem um conteúdo dentro da tabela, poderia salvar a string normal mesmo... Testa aí e me fala. 

     

    E sobre o marker, acho que se usar setElementVisibleTo como false seja mais fácil do que destruir o marker, você já está fazendo dessa forma...

     

  17. Faltou a parte em que deixa os markers visíveis quando a pessoa entra no emprego né, mas você não postou essa parte... Mas acho que com o que eu já mandei você consegue se virar para implementar essa parte kkk ;)

    • Thanks 1
  18. Você está passando o source como parâmetro, nunca faça isso! O source é o marker que foi "hitado", o 1° argumento é o hitElement (pode ser um carro, player, objeto etc...).

    Você quer fazer uma função mais genérica né, eu estou meio sem tempo pra algo perfeitinho mas ficaria mais ou menos assim:

    local posLixeiras = {
    	[1] = {1983.001, -1744.44, 13.547},
    	[2] = {1993.668, -1738.607, 13.547},
    }
    
    local Lixeiras = {}
    local blipLixeiras = {}
    
    addEventHandler('onResourceStart', resourceRoot, function ()
      for i, pos in ipairs (posLixeiras) do
         Lixeiras[i] = createMarker(pos[1], pos[2], pos[3], "cylinder", 1.2, 70, 58, 88, 100)
         blipLixeiras[i] = createBlipAttachedTo(Lixeiras[i], 2)
         setBlipVisibleDistance(blipLixeiras[i], 2000)
         setElementVisibleTo(blipLixeiras[i], root, false)
         setElementVisibleTo(Lixeiras[i], root, false)
         setElementVisibleTo(Lixeiras[i], root, false)
         addEventHandler("onMarkerHit", Lixeiras[i], PegarLixo)
      end
    end)
    
    function getMarkerPositionInTable (marker)
      for i, m in ipairs (Lixeiras) do
        if marker == m then return i end
      end
      return false
    end
    
    function PegarLixo(hitElement)
      if getElementData(hitElement, "Lixeiro") then
        local i = getMarkerPositionInTable(source) 
        if not i then return end
        local random = math.random(4, 20)
        exports["Bahamas_Inventory"]:BHM_GiveItem(hitElement, "dollars", random)
        setElementVisibleTo(Lixeiras[i], hitElement, false)
        setElementVisibleTo(blipLixeiras[i], hitElement, false)
        setElementFrozen(hitElement, true)
        setTimer(triggerClientEvent, 1100, 1, hitElement, "progressService", root, 6, "")
        setPedAnimation(hitElement, "uzi", "uzi_reload", 6500, true, false, false, false)
        setTimer(function()
          exports['infobox']:showInfobox(hitElement, "Você recolheu oque estava nessa lata de lixo", "success")
          setElementFrozen(hitElement, false)
        end, 6500, 1)
      end
    end

     Para adicionar novas lixeiras é só colocar novas posições no posLixeiras, conforme os exemplos.

    Obs: Mudei muita coisa no seu script e não testei, teste aí e traga possíveis erros que possam dar no console (digite "/debugscript 3" e fique de olho enquanto testa).

    • Thanks 1
  19. On 13/08/2021 at 18:51, 0Vítor said:

    Estou querendo criar um script onde eu digite "/abrir" e ele abra a cela. No caso, um script que mova objeto por comando.

    Use as funções createObjectmoveObject para criar / mover o objeto e a função addCommandHandler para usar o comando para fazer tudo funcionar. Veja os exemplos da wiki e nos traga dúvidas / erros para que possamos ajudar :)

    Obs: Você pode fazer isso client-side mas no seu caso talvez seja melhor fazer server-side, pois coisas no client-side só funcionaria para o player que deu o comando, já server-side a porta moveria para todos do servidor, não somente do cliente.

    • Like 1
×
×
  • Create New...