Jump to content

Texturas Veiculos


Recommended Posts

Olá pessoal boa noite, gostaria de sabe se e possivel eu ter mais de uma txd em 1 veiculo exemplo, tenho uma mercedes com textura branca, e quero dar um comando /cardrift, ai ele aplica uma textura de drift com cores etc, isso teria que mudar para visão de todos os players não so na do que digitou o comando

Link to comment
  • Other Languages Moderators

Olá.

Sim, é possível. O único porém é que depende de como o carro foi feito. Às vezes pode ser difícil, às vezes pode ser bem simples. Abrindo a textura do veículo com algum programa de visualização, como o Magic TXD, por exemplo, dá pra saber mais ou menos como você iria aplicar uma textura. Uma vez que você sabe, estas funções serão necessárias:

  • Like 1
  • Thanks 1
Link to comment
12 hours ago, andr0xy said:

Olá.

Sim, é possível. O único porém é que depende de como o carro foi feito. Às vezes pode ser difícil, às vezes pode ser bem simples. Abrindo a textura do veículo com algum programa de visualização, como o Magic TXD, por exemplo, dá pra saber mais ou menos como você iria aplicar uma textura. Uma vez que você sabe, estas funções serão necessárias:

Entendi então o veículo teria que ser adaptado para usar, mas seria muito difícil fazer esse script ? E essa adaptação ? Nunca utilizei essas funções tirando a triggerClientEvent

Link to comment
  • Other Languages Moderators

Sim, ele deveria ser adaptado. Não tenho experiência alguma com modelagem de veículos, mas o pessoal pode te ajudar lá no Discord oficial do MTA. Mas dando uma resposta bem superficial, pelo o que eu já vi nos canais de ajuda, não me parece ser algo de outro planeta. ?

Sobre o script, para quem ainda tá na jornada é sim um pouco complicado entender. Comece a fazer, veja o que consegue. Traga as dúvidas para cá ou use o Discord para pedir ajuda.

  • Like 1
  • Thanks 1
Link to comment
44 minutes ago, andr0xy said:

Sim, ele deveria ser adaptado. Não tenho experiência alguma com modelagem de veículos, mas o pessoal pode te ajudar lá no Discord oficial do MTA. Mas dando uma resposta bem superficial, pelo o que eu já vi nos canais de ajuda, não me parece ser algo de outro planeta. ?

Sobre o script, para quem ainda tá na jornada é sim um pouco complicado entender. Comece a fazer, veja o que consegue. Traga as dúvidas para cá ou use o Discord para pedir ajuda.

Duas pergunta andr0xy, como eu poderia testar o script para ver se está pegando para todos ?, outra coisa e possivel salvar a textura ? exemplo a pessoa deu o comando e depois ela nunca mais precisar dar o comando quando der spawn no veiculo novamente

Link to comment
  • Other Languages Moderators

Respondendo a primeira pergunta, usar o triggerClientEvent corretamente já é suficiente; segunda pergunta, sim, totalmente possível. Crie um ID para cada textura e salve-o numa tabela que teria o jogador indexado.

Além do mais, é importante que você crie um cache server-side, para que, assim que os jogadores logarem no servidor, sincronizar com as texturas já ativas nos veículos. Sendo assim, quando o jogador logar, esse cache é enviado para o client-side e lá todas as texturas existentes seriam criadas.

  • Like 1
  • Thanks 1
Link to comment
38 minutes ago, andr0xy said:

Respondendo a primeira pergunta, usar o triggerClientEvent corretamente já é suficiente; segunda pergunta, sim, totalmente possível. Crie um ID para cada textura e salve-o numa tabela que teria o jogador indexado.

Além do mais, é importante que você crie um cache server-side, para que, assim que os jogadores logarem no servidor, sincronizar com as texturas já ativas nos veículos. Sendo assim, quando o jogador logar, esse cache é enviado para o client-side e lá todas as texturas existentes seriam criadas.

Entendi você poderia me dar um exemplo desse cache no server ?

Link to comment
  • Other Languages Moderators

Seria mais ou menos desta forma:

Spoiler

local texturesCache = {}

addCommandHandler("apply", function(player, _, textureID)
    local veh = getPedOccupiedVehicle(player)

    if veh and textureID then
        texturesCache[player] = {veh, textureID} -- Salvamos o veículo e o ID da textura
    end
end)

-- Assim que o jogador logar
addEventHandler("onPlayerLogin", root, function()
    if #texturesCache > 0 then -- Checamos se de fato existe texturas criadas
        triggerClientEvent(source, "createTexturesCache", source, texturesCache) -- Então enviamos ao client-side, para criar apenas para o jogador que acabou de logar
    end
end)

-- Lembrando que é importante sempre anular o índice do jogador assim que ele sai do servidor
addEventHandler("onPlayerQuit", root, function()
    if texturesCache[source] then
        -- Aqui também teria alguma lógica para remover a textura do carro deste jogador
        texturesCache[source] = nil
    end
end)

 

 

  • Like 1
  • Confused 1
Link to comment
8 hours ago, andr0xy said:

Seria mais ou menos desta forma:

  Hide contents

 

 

Bom eu apenas copiei esse codigo que você mandou para min porem não funcionou o script, teria alguma coisa errado ? na Function Apply que está exportando a todos ?

local texturesCache = {}

addCommandHandler("apply", function(player, _, textureID)
    local veh = getPedOccupiedVehicle(player)

    if veh and textureID then
        texturesCache[player] = {veh, textureID} 
    end
end)


addEventHandler("onPlayerLogin", root, function(source)
    if #texturesCache > 0 then 
        triggerClientEvent(source, "Apply", source, texturesCache) 
    end
end)


addEventHandler("onPlayerQuit", root, function(source)
    if texturesCache[source] then

        texturesCache[source] = nil
    end
end)

function Apply(source)
	triggerClientEvent(getRootElement(), "Apply", getRootElement(), source)
end

Ao lado cliente está deste modo
 

function Apply(localPlayer)

    Paint[localPlayer] = {}
    Paint[localPlayer][1] = dxCreateShader("texturechanger.fx", 0, 100, false, "vehicle")
    Paint[localPlayer][2] = dxCreateTexture("image1.png") -- change color
            
    if Paint[localPlayer][1] and Paint[localPlayer][2] then
        dxSetShaderValue(Paint[localPlayer][1], "TEXTURE", Paint[localPlayer][2])
        engineApplyShaderToWorldTexture(Paint[localPlayer][1], "remap_federal", theVehicle)
    end
    
end
addEvent("Apply", true)
addEventHandler("Apply", getRootElement(), Apply)

Obs não pegou mas tem uma variavel Paint = {}

Link to comment
  • Other Languages Moderators

A função Apply não me fez sentido algum, assim como o client-side também.

Server-side:

  • Usando source como parâmetro
  • Usando root como sourceElement do triggerClientEvent
  • Passando o source como um parâmetro no triggerClientEvent
  • Não vejo a função Apply sendo chamada

Client-side:

  • localPlayer como parâmetro de função (???)

A tabela, sim, está correta, porém não vejo sentido usar localPlayer. Peço que se esforce um pouco mais lendo a Wiki e entenda como os eventos funcionam. Você pode também ver estes dois vídeos: #1 e #2. É de um amigo aqui do fórum, o tópico completo sobre os vídeos está aqui.

  • Sad 1
Link to comment
1 hour ago, andr0xy said:

A função Apply não me fez sentido algum, assim como o client-side também.

Server-side:

  • Usando source como parâmetro
  • Usando root como sourceElement do triggerClientEvent
  • Passando o source como um parâmetro no triggerClientEvent
  • Não vejo a função Apply sendo chamada

Client-side:

  • localPlayer como parâmetro de função (???)

A tabela, sim, está correta, porém não vejo sentido usar localPlayer. Peço que se esforce um pouco mais lendo a Wiki e entenda como os eventos funcionam. Você pode também ver estes dois vídeos: #1 e #2. É de um amigo aqui do fórum, o tópico completo sobre os vídeos está aqui.

Entendi fiz algumas modificações
 

Spoiler

Paint = {}

function Apply()

    Paint[1] = dxCreateShader("texturechanger.fx", 0, 100, false, "vehicle")
    Paint[2] = dxCreateTexture("image1.png") -- change color
            
    if Paint[1] and Paint[2] then
        dxSetShaderValue(Paint[1], "TEXTURE", Paint[2])
        engineApplyShaderToWorldTexture(Paint[1], "remap_federal", theVehicle)
    end
end
addEvent("Apply", true)
addEventHandler("Apply", root, Apply)

function Command()
    theVehicle = getPedOccupiedVehicle(localPlayer)

    if theVehicle then
        if (getElementModel(theVehicle) == 490) then
            Apply()
        end
    end
end
addCommandHandler("teste", Command)

 

 

Edited by Tony Scripter
Link to comment
  • Other Languages Moderators

Pode até funcionar, mas não da maneira que deve. Não consigo criar um exemplo que seja simples e fácil de entender, teria que explicar outros vários conceitos. Inclusive, esses conceitos acredito eu que você ainda não tá muito por dentro.

Pedi para que você assistisse aos vídeos sobre a manipulação de eventos, não os vi no seu código acima - nem alguma tentativa. ?

Caso você queira ver meu exemplo: download - o link expira em 1 dia.

Edited by andr0xy
  • Thanks 1
Link to comment
  • Other Languages Moderators

Daria pra simplesmente salvar o ID das texturas de cada veículo em uma tabela JSON dentro da conta do jogador com toJSON e setAccountData. Assim cada conta teria seus IDs salvos em cada veículo. Dai ao logar, aplicaria essas texturas salvas nos veículos.

Se salvar no script, todas as configurações dos jogadores serão perdidas se reiniciar o resource. A não ser que se faça um banco de dados, que no fim das contas dá até mais trabalho do que salvar na conta do jogador.

  • Like 1
Link to comment

Entendi mas seria muito complexo para meu nivel de programação, uma pergunta para utilização de toJSON seria necessario um sqlite ?

42 minutes ago, andr0xy said:

Pode até funcionar, mas não da maneira que deve. Não consigo criar um exemplo que seja simples e fácil de entender, teria que explicar outros vários conceitos. Inclusive, esses conceitos acredito eu que você ainda não tá muito por dentro.

Pedi para que você assistisse aos vídeos sobre a manipulação de eventos, não os vi no seu código acima - nem alguma tentativa. ?

Caso você queira ver meu exemplo: download - o link expira em 1 dia.

Uma pergunta a este codigo na utilização de 

local playersOnly = getElementsByType("player")

Porque você utilizou getElementsByType("") ? isso não e a mesma coisa que utilizar ( player ) ?

Edited by Tony Scripter
Link to comment
7 hours ago, andr0xy said:

Estou pegando todos os jogadores apenas, para não ter que passar o root no primeiro parâmetro do triggerClientEvent. Como você quer sincronizar para os outros jogadores, é necessário enviar para eles também. :) 

Entendi, essa função então e muito util obrigado, irei começar a ver aqueles videos que você me passou quanto mais conteudo melhor :)

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...