Jump to content

Light system


saluta

Recommended Posts

Hello dear, I want to make a high beam system from scratch, well, like from scratch - there is already a system of light shaders vechicles_lighting_systems. You press the button and the high beam turns on, how to make the button press and the high beam turns on, here is the light shader code itself.

Spoiler

local vehLiTable = { leftEN ={}, rightEN ={}, left={},right={}, color ={}, isBlown={}, vehType={}, strOut={} }

local gWorldSelfShadow = false -- enables object self shadowing ( may be bugged for rotated objects on a custom map)
local gLightTheta = math.rad(6) -- Theta is the inner cone angle (6)
local gLightPhi = math.rad(20) -- Phi is the outer cone angle (18)
local gLightFalloff = 1.5 -- light intensity attenuation between the phi and theta areas
local gLightAttenuation = 18 -- 15
local flTimerUpdate = 200 -- the effect update time interval
local lightMaxDistance = 100

local excludeVehicleId = {441,464,501,465,564,571,594,606,607,610,611,584,608,450,591}

function getPositionFromElementOffset(element,offX,offY,offZ)
	local m = getElementMatrix ( element )  -- Get the matrix
	local x = offX * m[1][1] + offY * m[2][1] + offZ * m[3][1] + m[4][1]  -- Apply transform
	local y = offX * m[1][2] + offY * m[2][2] + offZ * m[3][2] + m[4][2]
	local z = offX * m[1][3] + offY * m[2][3] + offZ * m[3][3] + m[4][3]
	return x, y, z                               -- Return the transformed point
end

addEventHandler("onClientPreRender", root, function()
	for index,this in ipairs(getElementsByType("vehicle")) do
		if vehLiTable.leftEN[this] or vehLiTable.rightEN[this] then
			local rx, ry, rz = getElementRotation(this, "ZXY")
			rx = rx - 4
			local x1,y1,z1,x2,y2,z2
			local col = vehLiTable.color[this]
			local vehType = vehLiTable.vehType[this]
			if vehType == "Bike" then
				x1,y1,z1 = getPositionFromElementOffset(this,0,0.8,0.1) -- (left,front,above)			
			elseif vehType == "Train" then
				x1,y1,z1 = getPositionFromElementOffset(this,-0.7,5.0,-0.9) -- (left,front,above)
				x2,y2,z2 = getPositionFromElementOffset(this,0.7,5.0,-0.9) -- (left,front,above)
			else
				x1,y1,z1 = getPositionFromElementOffset(this,-0.7,0.8,-0.1) -- (left,front,above)
				x2,y2,z2 = getPositionFromElementOffset(this,0.7,0.8,-0.1) -- (left,front,above)
			end
			
			if vehLiTable.leftEN[this] then
				exports.dynamic_lighting:setLightDirection(vehLiTable.left[this],rx,ry,rz,true)
				exports.dynamic_lighting:setLightPosition(vehLiTable.left[this],x1,y1,z1)
				exports.dynamic_lighting:setLightColor(vehLiTable.left[this],col[1],col[2],col[3],1) 
			end
			if vehLiTable.rightEN[this] and vehType~="Bike" then
				exports.dynamic_lighting:setLightDirection(vehLiTable.right[this],rx,ry,rz,true)
				exports.dynamic_lighting:setLightPosition(vehLiTable.right[this],x2,y2,z2)
				exports.dynamic_lighting:setLightColor(vehLiTable.right[this],col[1],col[2],col[3],1)  
			end
		end
	end
end
)

function createWorldLight()
	return exports.dynamic_lighting:createSpotLight(0,0,3,0,0,0,0,0,0,0,true,gLightFalloff,gLightTheta,gLightPhi,gLightAttenuation,gWorldSelfShadow)
end

function destroyWorldLight(this)
	return exports.dynamic_lighting:destroyLight(this)
end

function isInNightTime()
    local hour, minutes = getTime()
   return (hour>=22 or hour<=5)
end

function lightEffectStop(thisVeh)
	if vehLiTable.leftEN[thisVeh] then
		destroyWorldLight(vehLiTable.left[thisVeh])
		vehLiTable.leftEN[thisVeh]=false
	end
	if vehLiTable.rightEN[thisVeh] then
		destroyWorldLight(vehLiTable.right[thisVeh])
		vehLiTable.rightEN[thisVeh]=false
	end
end

function lightEffectManage(thisVeh,vehType)
addCommandHandler("Strobo Light On", lightEffectManage)
bindKey("i", "down", "Strobo Light On")
	if vehLiTable.isBlown[thisVeh] then return end
	local posX,posY,posZ = getElementPosition(thisVeh)
	local camX,camY,camZ = getCameraMatrix()
	local camDist = getDistanceBetweenPoints3D ( posX,posY,posZ,camX,camY,camZ )
	local lightSwitched = false
	local ispastDist = lightMaxDistance < camDist
	if ispastDist then
		if vehLiTable.leftEN[thisVeh] then
			destroyWorldLight(vehLiTable.left[thisVeh])
			vehLiTable.leftEN[thisVeh]=false		
		end
		if vehLiTable.rightEN[thisVeh] then
			destroyWorldLight(vehLiTable.right[thisVeh])
			vehLiTable.rightEN[thisVeh]=false			
		end
		return
	end
	if ((getVehicleLightState ( thisVeh, 0 )==1 or getVehicleOverrideLights(thisVeh)==1)) and vehLiTable.leftEN[thisVeh] then 
		destroyWorldLight(vehLiTable.left[thisVeh])
		vehLiTable.leftEN[thisVeh]=false		
	end

	if ((getVehicleLightState ( thisVeh, 1 )==1 or getVehicleOverrideLights(thisVeh)==1)) and vehLiTable.rightEN[thisVeh] then 
		destroyWorldLight(vehLiTable.right[thisVeh])
		vehLiTable.rightEN[thisVeh]=false	
	end	
	
	if getVehicleEngineState(thisVeh) then
		if (getVehicleLightState ( thisVeh, 0 )==0 and getVehicleOverrideLights(thisVeh)==0) then 
			if isInNightTime() then
				if vehLiTable.leftEN[thisVeh]~=true and (getVehicleOccupant( thisVeh ,0 ) or not vehLiTable.strOut[thisVeh]) then
					if not ispastDist then
						vehLiTable.left[thisVeh] = createWorldLight()
						vehLiTable.leftEN[thisVeh]=true
						lightSwitched=true
					end
				end
			else
				if vehLiTable.leftEN[thisVeh]==true then
					destroyWorldLight(vehLiTable.left[thisVeh])
					vehLiTable.leftEN[thisVeh]=false
				end
			end
		end
		
		if (getVehicleLightState ( thisVeh, 1 )==0 and getVehicleOverrideLights(thisVeh)==0 and vehType~="Bike")  then
			if isInNightTime() then 
				if vehLiTable.rightEN[thisVeh]~=true and (getVehicleOccupant( thisVeh ,0 ) or not vehLiTable.strOut[thisVeh]) then
					if not ispastDist then
						vehLiTable.right[thisVeh] = createWorldLight()
						vehLiTable.rightEN[thisVeh]=true
						lightSwitched=true
					end
				end
			else
				if vehLiTable.rightEN[thisVeh]==true then
					destroyWorldLight(vehLiTable.right[thisVeh])
					vehLiTable.rightEN[thisVeh]=false
				end
			end
		end
	end

	if (getVehicleLightState ( thisVeh, 0 )==0 and getVehicleOverrideLights(thisVeh)==2) and vehLiTable.leftEN[thisVeh]~=true then
		if not ispastDist then
			vehLiTable.left[thisVeh] = createWorldLight()
			vehLiTable.leftEN[thisVeh]=true
		end
	end
	
	if (getVehicleLightState ( thisVeh, 1 )==0 and getVehicleOverrideLights(thisVeh)==2) and vehLiTable.rightEN[thisVeh]~=true and vehType~="Bike" then
		if not ispastDist then
			vehLiTable.right[thisVeh] = createWorldLight()
			vehLiTable.rightEN[thisVeh]=true
		end
	end
	if lightSwitched then vehLiTable.strOut[thisVeh]=false end
	if vehLiTable.rightEN[thisVeh] or vehLiTable.leftEN[thisVeh] then
		local r,g,b = getVehicleHeadLightColor(thisVeh)
		vehLiTable.color[thisVeh] = {r/255,g/255,b/255}
	end
end

addEventHandler( "onClientElementStreamOut", getRootElement( ),function ()
	if getElementType( source ) == "vehicle" then
		vehLiTable.strOut[source] = true
	end
end
)

addEventHandler( "onClientElementStreamIn", getRootElement( ),function ()
	if getElementType( source ) == "vehicle" then
		--vehLiTable.strOut[source] = false
	end
end
)

addEventHandler("onClientResourceStart", getResourceRootElement( getThisResource()), function()
	if FLenTimer then return end
	local shTeNul = dxCreateShader ( "shaders/shader_null.fx",0,0,false )
	engineApplyShaderToWorldTexture(shTeNul, "headlight*" )
	for index,thisVeh in ipairs(getElementsByType("vehicle")) do
		vehLiTable.isBlown[thisVeh] = isVehicleBlown(thisVeh)
		vehLiTable.strOut[thisVeh] = not isElementStreamedIn(thisVeh)
	end
	FLenTimer = setTimer(	function()
		for index,thisVeh in ipairs(getElementsByType("vehicle")) do
			if isElementStreamedIn(thisVeh) then
				local vehType = getVehicleType(thisVeh)
				local vehID = getElementModel(thisVeh)
				local isMatch = true
				for index,name in ipairs(excludeVehicleId) do
					if vehID==name then isMatch = false end
				end
				vehLiTable.vehType[thisVeh] = vehType
				if isMatch and ((vehType == "Automobile") or (vehType == "Monster Truck") or 
					(vehType == "Bike") or (vehType == "Train")) then
					if isElementStreamedIn(thisVeh) then
						lightEffectManage(thisVeh,vehType)
					elseif not isElementStreamedIn(thisVeh) then
						lightEffectStop(thisVeh)
					end
				end
			end
		end
	end
	,flTimerUpdate,0 )
end
)

addEventHandler("onClientResourceStop", getResourceRootElement( getThisResource()), function()
	if not FLenTimer then return end
	killTimer(FLenTimer)
	for index,thisVeh in ipairs(getElementsByType("vehicle")) do
		lightEffectStop(thisVeh)
	end	
end
)

addEventHandler("onClientVehicleExplode", getRootElement(), function()
	if getElementType(source) == "vehicle"  then
		vehLiTable.isBlown[source] = true
		lightEffectStop(source)
	end
end
)

addEventHandler("onClientElementDestroy", getRootElement(), function ()
	if getElementType(source) == "vehicle"  then
		lightEffectStop(source)
	end
end
)

 

 

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