Jump to content

Shader


Recommended Posts

Tem algum meio pra que o shader seja visivel pra o outro player, por exemplo eu fiz um script de modificação de arma, mas só que a customização só aparece para o proprio player, teria como deixar visivel para os dois?

function ReplaceWeapon()
txd = engineLoadTXD('m4.txd', 356)
engineImportTXD(txd, 356)
dff = engineLoadDFF('m4.dff', 356)
engineReplaceModel(dff, 356)
end
addEventHandler( 'onClientResourceStart', getResourceRootElement(getThisResource()), ReplaceWeapon)

local tTextures = {}
local pShaders = {}

addEventHandler( "onClientResourceStart", resourceRoot,
	function()
		tTextures["M4A1[057]"] = dxCreateTexture("image1.png")
		
	end
)

addCommandHandler( "t",
	function()
		applyShader( tTextures, localPlayer )
	end
)

addCommandHandler( "v",
	function()
		for _, t in pairs(pShaders) do
			engineRemoveShaderFromWorldTexture( t[1], t[2], localPlayer )
		end
	end
)

function applyShader( t, player )
	if type(t) == "table" and isElement(player) then
		for tex_name, tex_element in pairs(t) do
			local s = dxCreateShader('tex_replace.fx', 0, 0, true, 'ped')
			table.insert( pShaders, {s, tex_name} )

			dxSetShaderValue(s, 'gTexture', tex_element) 
			engineApplyShaderToWorldTexture(s, tex_name, player) 
		end
		
		--
	end
end

 

Link to comment

cara não sei se vou conseguir te ajudar porque minha especialidade é race certo, mas se fosse race seria isso

local lightsShader = {}

for i=1,6 do
	local shader = dxCreateShader("lights/lights.fx")
	local texture = dxCreateTexture("lights/"..i..".png","dxt3")
	dxSetShaderValue(shader,"gTexture",texture)
	lightsShader[i] = shader
end

function setLight(vehicle,id)
    engineApplyShaderToWorldTexture(lightsShader[id],"vehiclelights128",vehicle)
    engineApplyShaderToWorldTexture(lightsShader[id],"vehiclelightson128",vehicle)
end

function loadVehicleCustoms(vehicle)
	local player = vehicle:getController()
	if player then
        if player:getData("lightID") then
            setLight(vehicle,tonumber(player:getData("lightID")))
		end
	end
end

addEventHandler("onClientVehicleEnter",root,
	function ()
		loadVehicleCustoms(source)
	end
)

player:setData("lightID",5)

no seu caso voce precisa setar um elementData nos players que vao usar o shader e escolher um evento tipo onClientElementStreamIn ou onClientElementStreamOut pra fazer ele aparecer.

Link to comment
On 01/04/2020 at 11:47, Gw8 said:

cara não sei se vou conseguir te ajudar porque minha especialidade é race certo, mas se fosse race seria isso


local lightsShader = {}

for i=1,6 do
	local shader = dxCreateShader("lights/lights.fx")
	local texture = dxCreateTexture("lights/"..i..".png","dxt3")
	dxSetShaderValue(shader,"gTexture",texture)
	lightsShader[i] = shader
end

function setLight(vehicle,id)
    engineApplyShaderToWorldTexture(lightsShader[id],"vehiclelights128",vehicle)
    engineApplyShaderToWorldTexture(lightsShader[id],"vehiclelightson128",vehicle)
end

function loadVehicleCustoms(vehicle)
	local player = vehicle:getController()
	if player then
        if player:getData("lightID") then
            setLight(vehicle,tonumber(player:getData("lightID")))
		end
	end
end

addEventHandler("onClientVehicleEnter",root,
	function ()
		loadVehicleCustoms(source)
	end
)

player:setData("lightID",5)

no seu caso voce precisa setar um elementData nos players que vao usar o shader e escolher um evento tipo onClientElementStreamIn ou onClientElementStreamOut pra fazer ele aparecer.

Mano tem como vc me explicar melhor? n entendi muito bem

 

Link to comment
  • Moderators

Como o Gw8 disse, faça a sync do shader com elementData, eu criei o código que vai fazer a sync para todos players, se quiser que seja para alguns você terá que editar.
Código:
 

pShaders = {}
tTextures = {}

addEventHandler( "onClientResourceStart", resourceRoot,
function()
	tTextures["M4A1[057]"] = dxCreateTexture("image1.png")
	
end
)

addCommandHandler( "t",
function()
	applyShader( tTextures, localPlayer, true )
end
)

addCommandHandler( "v",
function()
	removeShader( localPlayer, true )
end
)

function applyShader( t, player, sync )
	if type(t) == "table" and isElement(player) then
		for tex_name, tex_element in pairs(t) do
			local s = dxCreateShader('tex_replace.fx', 0, 0, true, 'ped')
			table.insert( pShaders, {s, tex_name} )

			dxSetShaderValue(s, 'gTexture', tex_element) 
			engineApplyShaderToWorldTexture(s, tex_name, player)
		end
		if sync then
			setElementData(player, "wTexChange", true)
		end
	end
end

function removeShader( player, sync )
	if pShaders and isElement(player) then
		for _, t in pairs(pShaders) do
			engineRemoveShaderFromWorldTexture( t[1], t[2], player )
		end
		if sync then
			setElementData(player, "wTexChange", false)
		end
	end
end

addEventHandler( "onClientElementDataChange", root, function(theKey, _, newValue)

	if theKey == "wTexChange" and source ~= localPlayer then
		if newValue == true then

			applyShader( tTextures, source )
		elseif newValue == false then

			removeShader( source )
		end
	end
end )

Além do mais eu não testei esse código, e o mais importante, que o Gw8 também citou, é fazer ativação/desativação do shader com os eventos onClientElementStreamIn e onClientElementStreamOut.

  • Like 1
  • Thanks 1
Link to comment
On 04/04/2020 at 23:58, DNL291 said:

Como o Gw8 disse, faça a sync do shader com elementData, eu criei o código que vai fazer a sync para todos players, se quiser que seja para alguns você terá que editar.
Código:
 


pShaders = {}
tTextures = {}

addEventHandler( "onClientResourceStart", resourceRoot,
function()
	tTextures["M4A1[057]"] = dxCreateTexture("image1.png")
	
end
)

addCommandHandler( "t",
function()
	applyShader( tTextures, localPlayer, true )
end
)

addCommandHandler( "v",
function()
	removeShader( localPlayer, true )
end
)

function applyShader( t, player, sync )
	if type(t) == "table" and isElement(player) then
		for tex_name, tex_element in pairs(t) do
			local s = dxCreateShader('tex_replace.fx', 0, 0, true, 'ped')
			table.insert( pShaders, {s, tex_name} )

			dxSetShaderValue(s, 'gTexture', tex_element) 
			engineApplyShaderToWorldTexture(s, tex_name, player)
		end
		if sync then
			setElementData(player, "wTexChange", true)
		end
	end
end

function removeShader( player, sync )
	if pShaders and isElement(player) then
		for _, t in pairs(pShaders) do
			engineRemoveShaderFromWorldTexture( t[1], t[2], player )
		end
		if sync then
			setElementData(player, "wTexChange", false)
		end
	end
end

addEventHandler( "onClientElementDataChange", root, function(theKey, _, newValue)

	if theKey == "wTexChange" and source ~= localPlayer then
		if newValue == true then

			applyShader( tTextures, source )
		elseif newValue == false then

			removeShader( source )
		end
	end
end )

Além do mais eu não testei esse código, e o mais importante, que o Gw8 também citou, é fazer ativação/desativação do shader com os eventos onClientElementStreamIn e onClientElementStreamOut.

Muito obrigado, vou dá uma olhada aqui, pra ver se consigo fazer

 

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...