Big Smoker Posted January 15, 2022 Share Posted January 15, 2022 boa tarde, Pessoal queria saber se o MTA tem uma função que faz uma animação na esteira em skin de tanques (tipo Rhino) uma animação nas rodas, um exemplo é a esteira do Rhino tem um site do GTA:SA normal e vi um mod em modo CLEO que Habilita a animação da esteira do Rhino. E eu queria fazer a esteira de uma skin de um tanque mexer, pois ela fica PARADA e não mexe. https://www.mixmods.com.br/2020/09/rhino-animated-tanque-original-animado/ Link to comment
Other Languages Moderators Lord Henry Posted January 16, 2022 Other Languages Moderators Share Posted January 16, 2022 Olá. Você consegue por meio de shaders. Em especial o exemplo do UV Scroll. Link to comment
Big Smoker Posted January 19, 2022 Author Share Posted January 19, 2022 On 1/16/2022 at 1:33 PM, Lord Henry said: Olá. Você consegue por meio de shaders. Em especial o exemplo do UV Scroll. Não entendi como devo fazer, devo mexer na skin ? ou é uma função ? Link to comment
Other Languages Moderators Lord Henry Posted January 20, 2022 Other Languages Moderators Share Posted January 20, 2022 Basicamente você pega a textura da esteira (vc precisa saber o nome dessa textura que está no TXD) e "movimenta" ela usando o shader. Link to comment
Big Smoker Posted January 24, 2022 Author Share Posted January 24, 2022 On 20/01/2022 at 13:46, Lord Henry said: Basicamente você pega a textura da esteira (vc precisa saber o nome dessa textura que está no TXD) e "movimenta" ela usando o shader. Entendi, mais qual deles eu posso usar? Pois nao achei a shader que movimenta. Eu coloquei na shader e ele fica parado ainda Link to comment
Big Smoker Posted January 25, 2022 Author Share Posted January 25, 2022 tentei usar e nao deu certo. Nao sei qual das shader usar. E para movimentar ele fazendo a animação Link to comment
Other Languages Moderators Lord Henry Posted January 26, 2022 Other Languages Moderators Share Posted January 26, 2022 (edited) Como eu mencionei anteriormente, você usa o shader UV Scroll. Mas precisa saber configurar as coisas para que funcione. Depois de estudar bastante o shader, fiz o resource inteiro e também editei um Rhino para testar. Também vinculei a velocidade do veículo ao movimento da textura. client.lua Spoiler local ID = 432 local txd = {[ID] = engineLoadTXD ("rhino.txd")} local dff = {[ID] = engineLoadDFF ("rhino.dff")} addEventHandler ("onClientResourceStart", resourceRoot, function () engineImportTXD (txd[ID], ID) engineReplaceModel (dff[ID], ID) end) -- |---------------------------------------------| -- | DAQUI PRA BAIXO É O CONTROLE DAS ESTEIRAS | -- |---------------------------------------------| local shaders = {} -- Cada veículo terá um shader separado, caso contrário um tanque em movimento irá movimentar as texturas dos outros também. addEventHandler ("onClientResourceStart", resourceRoot, function() -- Executa essa função ao iniciar este resource. -- Version check if getVersion().sortable < "1.1.0" then outputChatBox ("Resource 'uv_scroll' is not compatible with this client.") return end for _, veh in pairs (getElementsByType("vehicle", true)) do -- Para cada veículo que o jogador está renderizando, faça: shaders[veh] = dxCreateShader ("uv_scroll.fx", 0, 70, false, "vehicle") -- Cria o shader usando este .fx, prioridade normal, visível até 70 metros de distância, somente em texturas de veículos. if (shaders[veh]) then -- Se o shader foi criado com sucesso, então: dxSetShaderValue (shaders[veh], "speed", 0) -- Variável que determina a velocidade do movimento da textura. Valores negativos movimentam ao contrário. engineApplyShaderToWorldTexture (shaders[veh], "tanktrack", veh) -- Aplica o shader somente na textura "tanktrack" do veículo específico. end end end) addEventHandler ("onClientElementStreamIn", root, function () -- Executa essa função sempre que um novo elemento começa a ser renderizado pelo jogador. (não executa para elementos nativos do cenário) if (getElementType (source) == "vehicle") then -- Se o elemento for um veículo, então: if not (shaders[source]) then -- Se este veículo não tem um shader, então: shaders[source] = dxCreateShader ("uv_scroll.fx", 0, 70, false, "vehicle") -- Cria o shader da mesma forma que acima, vinculando-o ao source. if (shaders[source]) then dxSetShaderValue (shaders[source], "speed", 0) engineApplyShaderToWorldTexture (shaders[source], "tanktrack", source) end end end end) addEventHandler ("onClientElementStreamOut", root, function () -- Executa essa função sempre que um elemento parar de ser renderizado pelo jogador. (não executa para elementos nativos do cenário) if (getElementType (source) == "vehicle") then -- Se o elemento for um veículo, então: if (shaders[source]) then -- Se este veículo tem um shader, então: destroyElement (shaders[source]) -- Destrói o shader. shaders[source] = nil -- Anula a variável do shader para liberar espaço na memória. end end end) addEventHandler ("onClientPreRender", root, function () -- Executa essa função no início de cada frame. for veh, shader in pairs (shaders) do -- Para cada shader que está na tabela shaders, faça: if (isElement(veh)) then local sx, sy, sz = getElementVelocity (veh) -- Obtém a velocidade X, Y, Z do veículo. local kmhs = math.floor(((sx^2 + sy^2 + sz^2)^(0.5)*(1.61))*100) -- Calcula a velocidade em km/h local speed = kmhs * 0.55 -- Aqui vc muda esse valor para sincronizar a velocidade da textura com a velocidade do veículo. Texturas de diferentes tamanhos tem valores diferentes. if (isVehicleReversing(veh)) then -- Se o veículo está indo pra trás, então: speed = kmhs * -0.55 -- Torna a velocidade da esteira negativa para que ela se movimente ao contrário. end if (shader) then dxSetShaderValue (shader, "speed", speed) -- Aplica a velocidade de movimento na esteira. end end end end) function isVehicleReversing(theVehicle) -- Função que verifica se o veículo está indo pra trás ou não. local getMatrix = getElementMatrix (theVehicle) local getVelocity = Vector3 (getElementVelocity(theVehicle)) local getVectorDirection = (getVelocity.x * getMatrix[2][1]) + (getVelocity.y * getMatrix[2][2]) + (getVelocity.z * getMatrix[2][3]) if (getVehicleCurrentGear(theVehicle) == 0 and getVectorDirection < 0) then return true end return false end uv_scroll.fx Spoiler // Example shader - uv_scroll.fx float gTime : TIME; float speed; //------------------------------------------- // Returns UV anim transform //------------------------------------------- float3x3 getTextureTransform () { float posU = 0; // Scroll Horizontal // float posV = 0; // Scroll Vertical // float posU = -fmod( gTime/8 ,1 ); // Habilite esta linha para movimento horizontal. float posV = -fmod(gTime*speed, 1); // Habilite esta linha para movimento vertical. return float3x3( 1, 0, 0, 0, 1, 0, posU, posV, 1 ); } technique tec0 { pass P0 { // Set the UV thingy TextureTransform[0] = getTextureTransform (); // Enable UV thingy TextureTransformFlags[0] = Count2; } } meta.xml Spoiler <meta> <info author="Lord Henry" name="Rhino 2.0" description="Rhino com esteira funcional nas rodas." version="1.3" type="misc" /> <script src="client.lua" type="client" /> <file src="uv_scroll.fx" /> <file src="rhino.txd" /> <file src="rhino.dff" /> </meta> rhino.dff rhino.txd Edited January 26, 2022 by Lord Henry Códigos comentados. 1 Link to comment
Big Smoker Posted January 26, 2022 Author Share Posted January 26, 2022 41 minutes ago, Lord Henry said: Como eu mencionei anteriormente, você usa o shader UV Scroll. Mas precisa saber configurar as coisas para que funcione. Depois de estudar bastante o shader, fiz o resource inteiro e também editei um Rhino para testar. Também vinculei a velocidade do veículo ao movimento da textura. client.lua Reveal hidden contents local ID = 432 local txd = {[ID] = engineLoadTXD ("rhino.txd")} local dff = {[ID] = engineLoadDFF ("rhino.dff")} addEventHandler ("onClientResourceStart", resourceRoot, function () engineImportTXD (txd[ID], ID) engineReplaceModel (dff[ID], ID) end) -- |---------------------------------------------| -- | DAQUI PRA BAIXO É O CONTROLE DAS ESTEIRAS | -- |---------------------------------------------| local shaders = {} -- Cada veículo terá um shader separado, caso contrário um tanque em movimento irá movimentar as texturas dos outros também. addEventHandler ("onClientResourceStart", resourceRoot, function() -- Executa essa função ao iniciar este resource. -- Version check if getVersion().sortable < "1.1.0" then outputChatBox ("Resource 'uv_scroll' is not compatible with this client.") return end for _, veh in pairs (getElementsByType("vehicle", true)) do -- Para cada veículo que o jogador está renderizando, faça: shaders[veh] = dxCreateShader ("uv_scroll.fx", 0, 70, false, "vehicle") -- Cria o shader usando este .fx, prioridade normal, visível até 70 metros de distância, somente em texturas de veículos. if (shaders[veh]) then -- Se o shader foi criado com sucesso, então: dxSetShaderValue (shaders[veh], "speed", 0) -- Variável que determina a velocidade do movimento da textura. Valores negativos movimentam ao contrário. engineApplyShaderToWorldTexture (shaders[veh], "tanktrack", veh) -- Aplica o shader somente na textura "tanktrack" do veículo específico. end end end) addEventHandler ("onClientElementStreamIn", root, function () -- Executa essa função sempre que um novo elemento começa a ser renderizado pelo jogador. (não executa para elementos nativos do cenário) if (getElementType (source) == "vehicle") then -- Se o elemento for um veículo, então: if not (shaders[source]) then -- Se este veículo não tem um shader, então: shaders[source] = dxCreateShader ("uv_scroll.fx", 0, 70, false, "vehicle") -- Cria o shader da mesma forma que acima, vinculando-o ao source. if (shaders[source]) then dxSetShaderValue (shaders[source], "speed", 0) engineApplyShaderToWorldTexture (shaders[source], "tanktrack", source) end end end end) addEventHandler ("onClientElementStreamOut", root, function () -- Executa essa função sempre que um elemento parar de ser renderizado pelo jogador. (não executa para elementos nativos do cenário) if (getElementType (source) == "vehicle") then -- Se o elemento for um veículo, então: if (shaders[source]) then -- Se este veículo tem um shader, então: destroyElement (shaders[source]) -- Destrói o shader. shaders[source] = nil -- Anula a variável do shader para liberar espaço na memória. end end end) addEventHandler ("onClientPreRender", root, function () -- Executa essa função no início de cada frame. for veh, shader in pairs (shaders) do -- Para cada shader que está na tabela shaders, faça: if (isElement(veh)) then local sx, sy, sz = getElementVelocity (veh) -- Obtém a velocidade X, Y, Z do veículo. local kmhs = math.floor(((sx^2 + sy^2 + sz^2)^(0.5)*(1.61))*100) -- Calcula a velocidade em km/h local speed = kmhs * 0.55 -- Aqui vc muda esse valor para sincronizar a velocidade da textura com a velocidade do veículo. Texturas de diferentes tamanhos tem valores diferentes. if (isVehicleReversing(veh)) then -- Se o veículo está indo pra trás, então: speed = kmhs * -0.55 -- Torna a velocidade da esteira negativa para que ela se movimente ao contrário. end if (shader) then dxSetShaderValue (shader, "speed", speed) -- Aplica a velocidade de movimento na esteira. end end end end) function isVehicleReversing(theVehicle) -- Função que verifica se o veículo está indo pra trás ou não. local getMatrix = getElementMatrix (theVehicle) local getVelocity = Vector3 (getElementVelocity(theVehicle)) local getVectorDirection = (getVelocity.x * getMatrix[2][1]) + (getVelocity.y * getMatrix[2][2]) + (getVelocity.z * getMatrix[2][3]) if (getVehicleCurrentGear(theVehicle) == 0 and getVectorDirection < 0) then return true end return false end uv_scroll.fx Reveal hidden contents // Example shader - uv_scroll.fx float gTime : TIME; float speed; //------------------------------------------- // Returns UV anim transform //------------------------------------------- float3x3 getTextureTransform () { float posU = 0; // Scroll Horizontal // float posV = 0; // Scroll Vertical // float posU = -fmod( gTime/8 ,1 ); // Habilite esta linha para movimento horizontal. float posV = -fmod(gTime*speed, 1); // Habilite esta linha para movimento vertical. return float3x3( 1, 0, 0, 0, 1, 0, posU, posV, 1 ); } technique tec0 { pass P0 { // Set the UV thingy TextureTransform[0] = getTextureTransform (); // Enable UV thingy TextureTransformFlags[0] = Count2; } } meta.xml Hide contents <meta> <info author="Lord Henry" name="Rhino 2.0" description="Rhino com esteira funcional nas rodas." version="1.3" type="misc" /> <script src="client.lua" type="client" /> <file src="uv_scroll.fx" /> <file src="rhino.txd" /> <file src="rhino.dff" /> </meta> eu fiz os testes e nao deu certo. A esteira nao mexeu no rhino. Preciso configura algo? rhino.dff 219.36 kB · 1 download rhino.txd 57.84 kB · 1 download não deu certo. Ele nao executa. os movimentos Link to comment
Other Languages Moderators Lord Henry Posted January 27, 2022 Other Languages Moderators Share Posted January 27, 2022 Aparece algum erro no Debugscript? Você está usando exatamente os mesmos arquivos que enviei? 1 Link to comment
Big Smoker Posted February 2, 2022 Author Share Posted February 2, 2022 On 27/01/2022 at 12:34, Lord Henry said: Aparece algum erro no Debugscript? Você está usando exatamente os mesmos arquivos que enviei? Deu certo, foi erro meu. Eu que criei o FX errado. Link to comment
Recommended Posts