Jump to content

Alguém ajuda com esse mod (backfire)


Recommended Posts

Queria ajuda para quando eu digitar certo comando no chat, ativar o efeito "gunflash" nos determinados locais que está no script, ex: /backfire

Mas sinto que está faltando algo nesse código, obs: não é meu, está disponível na web, só preciso de ajuda mesmo.

Desde já agradeço a qualquer tipo de ajuda.

ENGINE_ENABLED = true
ENGINE_VOLUME_MASTER = 0.15 -- volume multiplier
ENGINE_VOLUME_THROTTLE_BOOST = 2.5	 -- boosting engine volume if we use throttle
ENGINE_SOUND_FADE_DIMENSION = 6969 -- dimension for unloading sounds
ENGINE_SOUND_DISTANCE = 80 -- max distance

DEBUG = false

-- offsets of exhaust flames
local als = { 
	[411] = { 
		{-0.60, -2.4, -0.3},
	},
	
	[451] = { 
		{0, -2.5, -0.35},
	},


	[506] = { 
		{-0.44, -2.4, -0.20},
		{-0.38, -2.4, -0.20},
	},
	
		[401] = { 
		{-0.70, -2.2, -0.4},
	    {0.70, -2.2, -0.4},
	},
	
			[503] = { 
		{-0.50, -2.4, -0.3},
	    {0.50, -2.4, -0.3},
	},
	
				[419] = { 
		{-0.50, -2.5, -0.3},
	    {0.50, -2.5, -0.3},
	},
	
				[562] = { 
		{-0.70, -2.4, -0.3},
	    {0.70, -2.4, -0.3},
	},
					[534] = { 
		{-0.70, -2.2, -0.3},
	    {0.70, -2.2, -0.3},
	},
	
	[496] = { 
		{-0.65, -2.4, -0.4},
	},
	
		[494] = { 
		{-0.50, -2.3, -0.2},
	    {0.50, -2.3, -0.2},
	},
	
		[517] = { 
		{-0.60, -2.3, -0.5},
	    {0.60, -2.4, -0.5},
	},
	
		[541] = { 
		{-0.62, -2.3, -0.4},
	    {0.62, -2.4, -0.4},
	},
	
		[458] = { 
		{-0.70, -2.7, -0.5},
	    {0.70, -2.7, -0.5},
	},
	
		[529] = { 
		{-0.68, -2.4, -0.3},
	    {0.68, -2.4, -0.3},
	},
	
		[429] = { 
		{-0.40, -2.5, -0.3},
	    {0.40, -2.5, -0.3},
	},
	
		[405] = { 
		{-0.60, -2.8, -0.3},
	    {0.60, -2.8, -0.3},
	},
	
		[602] = { 
		{-0.55, -2.4, -0.2},

	},
	
	[555] = { 
		{-0.50, -2.4, -0.6},
		{0.50, -2.4, -0.6},
	},

		[507] = { 
		{-0.65, -2.9, -0.4},
		{0.65, -2.9, -0.4},
	},
	
		[420] = { 
		{-0.10, -2.4, -0.3},
		{0.10, -2.4, -0.3},
	},
	
		[546] = { 
		{0.50, -2.4, -0.3},
	},
		[565] = { 
		{-0.50, -2.3, -0.5},
		{0.50, -2.3, -0.5},
	},
		[410] = { 
		{-0.55, -2.1, -0.4},
		{0.55, -2.1, -0.4},
	},
	
		[421] = { 
		{0.60, -2.7, 0.09},
		{0.70, -2.7, 0.09},
	},
	
		[492] = { 
		{-0.160, -2.3, -0.4},
		{0.190, -2.3, -0.4},
	},
		[561] = { 
		{0.70, -2.7, -0.3},
	},
			[426] = { 
		{0.65, -2.5, -0.5},
	},
		[585] = { 
		{0.70, -2.3, -0.3},
	},
		[547] = { 
		{-0.60, -2.7, -0.3},
		{0.60, -2.7, -0.3},
	},
		[451] = { 
		{-0.45, -2.1, -0.4},
		{0.45, -2.1, -0.4},
	},
		[527] = { 
		{-0.65, -2.2, -0.4},
		{0.65, -2.2, -0.4},
	},
		[491] = { 
		{-0.59, -2.5, -0.4},
		{0.59, -2.5, -0.4},
	},
		[558] = { 
		{0.50, -2.9, -0.3},
	},
		[558] = { 
		{0.50, -2.9, -0.3},
	},
	
		[466] = { 
		{-0.65, -2.7, -0.2},
		{0.65, -2.7, -0.2},
	},
		[560] = { 
		{-0.70, -2.7, -0.5},
	},
		[526] = { 
		{-0.65, -2.7, -0.3},
		{0.65, -2.7, -0.3},
	},
		[404] = { 
		{-0.50, -2.6, -0.5},
		{0.50, -2.6, -0.5},
	},
		[589] = { 
		{-0.50, -2.5, -0.5},
		{0.50, -2.5, -0.5},
	},
			[438] = { 
		{-0.60, -2.1, -0.1},
		{0.60, -2.1, -0.1},
	},
	
		[409] = { 
		{-0.55, -2.8, -0.3},
	},
			[479] = { 
		{-0.55, -2.6, -0.3},
		{0.55, -2.6, -0.3},
	},
}



local streamedVehicles = {}
local pi = math.pi 

function calculateGearRatios(vehicle, maxRPM, startRatio)
	local ratios = {}
	local handling = getVehicleHandling(vehicle)
	
	local gears = math.max(4, handling.numberOfGears)
	local maxVelocity = handling.maxVelocity
	local acc = handling.engineAcceleration 
	local drag = handling.dragCoeff
	--local c = ((acc*maxVelocity) / maxRPM)*(maxRPM*0.00175)
	--local c = startRatio or ((acc / drag / maxVelocity) * pi) * 20
	
	local curGear, curRatio = 1, 0
	local mRPM = maxVelocity * 100
	mRPM = ((maxRPM*gears)/mRPM)*maxRPM
	
	repeat 
		if mRPM/curGear > maxRPM*curRatio then 
			curRatio = curRatio+0.1/curGear
		else 
			ratios[curGear] = curRatio*0.95
			curGear = curGear+1
			curRatio = 0
		end
	until #ratios == gears 

	ratios[0] = 0 
	ratios[-1] = ratios[1] 
	
	--[[
	ratios[0] = 0
	for gear=1, gears do
		if gear > 1 then 
			c = c - c*(gear*0.02)
		end 
		
		ratios[gear] = (c / gear)
	end
	ratios[-1] = ratios[1]
	--]]
	
	return ratios
end 

function updateEngines(dt)
	if not ENGINE_ENABLED then return end 
	
	local myVehicle = getPedOccupiedVehicle(localPlayer)
	if myVehicle and getVehicleController(myVehicle) ~= localPlayer then 
		myVehicle = false
	end 
	

	local cx, cy, cz = getCameraMatrix()
	local now = getTickCount()
	
	for vehicle, data in pairs(streamedVehicles) do 
		if isElement(vehicle) then
			local engine = getElementData(vehicle, "vehicle:engine")
			if engine then
				local x, y, z = getElementPosition(vehicle)
				local rx, ry, rz = getElementRotation (vehicle)
				local distance = getDistanceBetweenPoints3D(x, y, z, cx, cy, cz)
				
				if getVehicleEngineState(vehicle) == true and distance < ENGINE_SOUND_DISTANCE*2 then
					local model = getElementModel(vehicle)
					local handling = getVehicleHandling(vehicle)
					local velocityVec = Vector3(getElementVelocity(vehicle))
					local velocity = velocityVec.length * 180
					local controller = getVehicleController(vehicle)
					
					local upgrades = getElementData(vehicle, "vehicle:upgrades") or {} 

					engine.gear = engine.gear or 1
					engine.turbo = upgrades.turbo
					engine.turbo_shifts = upgrades.turbo
					engine.volMult = engine.volMult or 1 
					engine.shiftUpRPM = engine.shiftUpRPM or engine.maxRPM*0.91
					engine.shiftDownRPM = engine.shiftDownRPM or (engine.idleRPM+engine.maxRPM)/2.5
					

					data.prevThrottle = data.throttle
					data.throttle = controller and (getPedControlState(controller, "accelerate"))
					
					if not data.reverse and velocity < 10 then
						data.reverse = controller and (getPedAnalogControlState(controller, "brake_reverse") > 0.5)or false
					elseif data.throttle and velocity < 50 then 
						data.reverse = false
					end
					
					local isSkidding = controller and ( ( getPedControlState(controller, "accelerate") and getPedControlState(controller, "brake_reverse") or getPedControlState(controller, "handbrake") ) and velocity < 40 ) or false
					data.forceNeutral = isSkidding -- w / s or handbrake without moving: neutral gear
								or (isLineOfSightClear(x, y, z, x, y, z-(getElementDistanceFromCentreOfMassToBaseOfModel(vehicle)*1.25), true, false, false, true, true, false, false, vehicle) and data.throttle) -- vehicle in air: neutral gear
								or isElementFrozen(vehicle) or isElementInWater(vehicle) -- frozen / in water: neutral gear
								or (( rx > 110 ) and ( rx < 250 )) -- on roof: neutral gear
								
					data.groundRPM = data.groundRPM or 0
					data.throttlingRPM = data.throttlingRPM or 0
					data.previousGear = data.previousGear or engine.gear
					data.gear = data.gear or 1
					data.currentGear = data.currentGear or 1
					data.changingGear = type(data.changingGear) == "number" and data.changingGear or false
					data.changingRPM = data.changingRPM or 0
					data.changingTargetRPM = data.changingTargetRPM or 0 
					data.turboValue = data.turboValue or 0
					data.prevTurboValue = data.turboValue
					data.als = upgrades.als or false
					data.effects = data.effects or {} 
					
					local changedGear = false 
					
					local gearRatios = calculateGearRatios(vehicle, engine.maxRPM, engine.startRatio or 1)
					local soundPack = engine.soundPack
					local wheel_rpm = velocity*100
					
					local rpm = wheel_rpm -- engine rpm
					
					--if data.reverse then 
						--data.currentGear = -1
					--end
					
					-- calculating rpm + neutral gear
					if getVehicleController(vehicle) then
						rpm = rpm*gearRatios[data.gear]
					else 
						rpm = engine.idleRPM 
					end 
					
					if not data.forceNeutral then
						data.throttlingRPM = math.max(0, data.throttlingRPM - (engine.maxRPM*0.0012)*dt)
					else 
						if data.throttle then 
							data.throttlingRPM = data.throttlingRPM + (engine.maxRPM*0.0012)*dt
						else 
							data.throttlingRPM = math.max(0, data.throttlingRPM - (engine.maxRPM*0.0012)*dt)
						end 
						data.throttlingRPM = math.min(data.throttlingRPM, engine.maxRPM)
					end 			
					rpm = rpm+data.throttlingRPM
					
					-- smooth rpm change
					rpm = rpm+data.changingRPM
					if data.changingGear then
						local progress = (now-data.changingTargetRPM.time) / 300 -- how long
						data.changingRPM = interpolateBetween(data.changingTargetRPM.target, 0, 0, 0, 0, 0, progress, "InQuad")
						
						if progress >= 1 then
							data.changingGear = false
							data.changingGearDirection = false
							data.changingRPM = 0
							data.changingTargetRPM = false
						end
					end 
					
					if data.previousGear ~= data.currentGear then 
						changedGear = (data.currentGear < data.previousGear) and "down" or "up"
												
						data.changingGear = data.currentGear
						data.changingGearDirection = changedGear 
						
						local nextrpm = engine.maxRPM
						if gearRatios[data.changingGear] then
							nextrpm = wheel_rpm*gearRatios[data.changingGear]
						end
						data.changingRPM = rpm-nextrpm
						data.changingTargetRPM = {target=data.changingRPM, time=now}
						
						data.gear = data.currentGear
						data.turboValue = 0
					end 
					
					-- prev gear update
					data.previousGear = data.currentGear 
					
					-- change gears
					if not data.changingGear and data.throttlingRPM == 0 and wheel_rpm > 200 then
						if rpm > engine.shiftUpRPM and data.throttle then 
							data.currentGear = math.min(data.currentGear+1, math.max(4, getVehicleHandling(vehicle).numberOfGears))
						elseif rpm < engine.shiftDownRPM then
							data.currentGear = math.max(1, data.currentGear-1)
						end 
					end 
					
					-- rev limiter
					if rpm < engine.idleRPM then 
						rpm = engine.idleRPM+math.random(0,100)
					elseif rpm > engine.maxRPM then 
						rpm = engine.maxRPM-math.random(0,100)
						data.wasRevLimited = true
					end
					
					-- ALS
					if data.wasRevLimited then -- when using throttle
						if (data.rpm or 0) < engine.maxRPM*0.98 then 
							data.wasRevLimited = false
							if data.als then 
								data.activeALS = true
							end
						end
					else 
						if changedGear == "up" and math.random(1, 4) == 1 then -- randomly with gear change
							if data.als then 
								data.activeALS = true
							end
						elseif data.prevThrottle and not data.throttle and data.rpm > engine.maxRPM*0.5 and math.random(1, 2) == 1 then 
							if data.als then 
								data.activeALS = true
							end
						end
					end 
					
					-- save rpm
					data.rpm = rpm 
					
					-- turbo 
					if engine.turbo then
						if data.throttle and rpm > engine.maxRPM/2 then 
							data.turboValue = math.min(0.5, data.turboValue+ 0.0008*dt)
						else 
							data.turboValue = math.max(0, data.turboValue - 0.0005*dt)
						end 
					end 
					
					
					-- sounds
					local svol = {}
					if not data.sounds then 
						data.sounds = {} 
						data.sounds[1] = playSound3D("sounds/"..soundPack.."/1.wav", x, y, z, true)
						data.sounds[2] = playSound3D("sounds/"..soundPack.."/2.wav", x, y, z, true)
						data.sounds[3] = playSound3D("sounds/"..soundPack.."/3.wav", x, y, z, true)
						data.sounds[4] = playSound3D("sounds/turbo.wav", x, y, z, true)
						
						for i=1, 3 do 
							setSoundEffectEnabled(data.sounds[i], "compressor", true)
						end 
					else 			
						-- engine
						local minMidProgress = math.min(1, (rpm+500)/(engine.maxRPM/2))
						local maxMidProgress = minMidProgress - ((engine.maxRPM/2)/rpm)
						
						local highProgress = (rpm-(engine.maxRPM/2.2))/(engine.maxRPM/2.2)
						
						svol[1] = 1 - 2^(rpm/(engine.idleRPM*1.5) - 2)
						svol[2] =  minMidProgress < 1 and interpolateBetween(0, 0, 0, 0.8, 0, 0, minMidProgress, "InQuad") or interpolateBetween(0.8, 0, 0, 0, 0, 0, maxMidProgress, "OutQuad")
						svol[3] =  interpolateBetween(0, 0, 0, 1, 0, 0, highProgress, "OutQuad")
						
						
						local vol = svol[1]
						vol = vol*ENGINE_VOLUME_MASTER*engine.volMult
						if data.throttle then 
							vol = vol*ENGINE_VOLUME_THROTTLE_BOOST
						end 
						
						setSoundVolume(data.sounds[1], math.max(0, vol))
						setSoundSpeed(data.sounds[2], rpm/(engine.idleRPM*2))
						
						local vol = svol[2]
						vol = vol*ENGINE_VOLUME_MASTER*engine.volMult
						if data.throttle then 
							vol = vol*ENGINE_VOLUME_THROTTLE_BOOST
						end 
						
						if data.changingGearDirection == "up" and vol > 0.1 then 
							vol = vol/2
						end
						
						setSoundVolume(data.sounds[2], math.max(0, vol))
						setSoundSpeed(data.sounds[2], rpm/(engine.maxRPM*0.6))

						local vol = svol[3]
						vol = vol*ENGINE_VOLUME_MASTER*engine.volMult
						if data.throttle then 
							vol = vol*ENGINE_VOLUME_THROTTLE_BOOST
						end 
						
						if data.changingGearDirection == "up" and vol > 0.1 then 
							vol = vol/2
						end
						
						setSoundVolume(data.sounds[3], math.max(0, vol))
						setSoundSpeed(data.sounds[3], rpm/(engine.maxRPM*0.925))
					
						svol[4] = data.turboValue
							
						local vol = svol[4]*ENGINE_VOLUME_MASTER
							
						if data.throttle then 
							vol = vol*ENGINE_VOLUME_THROTTLE_BOOST
						end
							
						setSoundVolume(data.sounds[4], math.max(0, vol*0.9))
						setSoundSpeed(data.sounds[4], svol[4]+0.8)
						
						if ((changedGear == "up" and data.prevTurboValue > 0.2) or (not data.throttle and data.prevTurboValue > 0.2)) and engine.turbo_shifts then
							local sound = 1 
							if changedGear then 
								sound = changedGear and changedGear == "up" and tostring(2) or tostring(1)
							end 
							
							data.sounds[5] = playSound3D("sounds/turbo_shift"..sound..".wav", x, y, z, false)
							setSoundVolume(data.sounds[5], 0.6*ENGINE_VOLUME_MASTER)
							
							if not data.throttle then 
								data.turboValue = 0
							end
						end
						
						if data.activeALS and not isElement(data.sounds[6]) then 
							data.sounds[6] = playSound3D("sounds/als"..math.random(1, 13)..".wav", x, y, z, false)
							setSoundVolume(data.sounds[6], 0.8)
							setSoundSpeed(data.sounds[6], 1.1)
							--setSoundEffectEnabled(data.sounds[6], "reverb", true)
							setSoundEffectEnabled(data.sounds[6], "echo", true)
							setSoundEffectEnabled(data.sounds[6], "compressor", true)
							
							for _, offset in ipairs((als[model] or {})) do
								local ef = createEffect("gunflash", x, y, z, 0, 0, 0) 
								setEffectSpeed(ef, 0.25) 
								setEffectDensity(ef, 2)
								data.effects[ef] = {offset[1], offset[2], offset[3], 90, 0, 180} 
								setTimer(function()
									data.effects[ef] = nil
									destroyElement(ef)
								end, 1000, 1)
							end 
							
							data.activeALS = false
						end
						
						for i=1, #data.sounds do
							local v = data.sounds[i] 
							if isElement(v) then
								setElementPosition(v, x, y, z)
								setElementDimension(v, (svol[i] or 1) > 0 and getElementDimension(vehicle) or ENGINE_SOUND_FADE_DIMENSION)

								if vehicle == getPedOccupiedVehicle(localPlayer) then 
									setSoundMaxDistance(v, ENGINE_SOUND_DISTANCE*2)
								else 
									setSoundMaxDistance(v, ENGINE_SOUND_DISTANCE)
								end
							end
						end
						
						local rx, ry, rz = getElementRotation(vehicle)
						for ef, offset in pairs(data.effects) do 
							if isElement(ef) then 
								local ox, oy, oz = getPositionFromElementOffset(vehicle, offset[1], offset[2], offset[3])
								setElementPosition(ef, ox, oy, oz)
								setElementRotation(ef, offset[4]-rx, offset[5]-ry, offset[6]-rz)
							end
						end 
					end 
										
					if DEBUG and vehicle == myVehicle then
						dxDrawText("Silnik\nTyp: "..tostring(engine.name).."\nRPM: "..tostring(rpm).."\nVol1: "..tostring(svol[1]).."\nVol2: "..tostring(svol[2]).."\nVol3: "..tostring(svol[3]).."\nTurboVol: "..tostring(svol[4]), 300, 300)
						
						local t = "Biegi\nBieg: "..tostring(data.gear).."/"..tostring(#gearRatios).."\n"
						for k, v in ipairs(gearRatios) do 
							t = t.."Ratio "..tostring(k)..": "..v.."\n"
						end
						dxDrawText(t, 300, 440)
						
					end
				else 
					if data.sounds then 
						for k, v in ipairs(data.sounds) do 
							if isElement(v) then 
								destroyElement(v)
							end
						end
						data.sounds = false
					end
					
					data.rpm = 0
					data.gear = 1
					data.previousGear = 0
				end
			end
		end
	end
end 
addEventHandler("onClientPreRender", root, updateEngines)

blowdurum = false
function blowac()
    if blowdurum == false then
        addEventHandler( "onClientHUDRender", root,updateEngines)
        blowdurum = true
    end
end
function blowkapa()
    if blowdurum == true then
       removeEventHandler( "onClientHUDRender", root,updateEngines)
       blowdurum = false
    end
end

function streamInVehicle(vehicle)
	if not streamedVehicles[vehicle] then
		if isElement(vehicle) and getElementData(vehicle, "vehicle:engine") then 
			streamedVehicles[vehicle] = {}
			addEventHandler("onClientElementDestroy", vehicle, function()
				streamOutVehicle(source)
			end)
		end
	end
end

function streamOutVehicle(vehicle)
	if streamedVehicles[vehicle] then 
		if streamedVehicles[vehicle].sounds then 
			for k, v in ipairs(streamedVehicles[vehicle].sounds) do 
				if isElement(v) then 
					destroyElement(v)
				end
			end
		end 
		
		streamedVehicles[vehicle] = nil
	end
end

function toggleGTAEngineSounds(bool)
	setWorldSoundEnabled(7, bool)
	setWorldSoundEnabled(8, bool)
	setWorldSoundEnabled(9, bool)
	setWorldSoundEnabled(10, bool)
	setWorldSoundEnabled(11, bool)
	setWorldSoundEnabled(12, bool)
	setWorldSoundEnabled(13, bool)
	setWorldSoundEnabled(14, bool)
	setWorldSoundEnabled(15, bool)
	setWorldSoundEnabled(16, bool)
	setWorldSoundEnabled(40, bool)
end 

function getGTARPM(vehicle) 
    if (vehicle) then   
		local velocityVec = Vector3(getElementVelocity(vehicle))
		local velocity = velocityVec.length * 180
					
        if (isVehicleOnGround(vehicle)) then
            if (getVehicleEngineState(vehicle) == true) then
                if(getVehicleCurrentGear(vehicle) > 0) then
                    vehicleRPM = math.floor(((velocity/getVehicleCurrentGear(vehicle))*150) + 0.5)
                    if (vehicleRPM < 650) then
                        vehicleRPM = math.random(650, 750)
                    elseif (vehicleRPM >= 8000) then
                        vehicleRPM = 8000
                    end
                else
                    vehicleRPM = math.floor(((velocity/1)*220) + 0.5)
                    if (vehicleRPM < 650) then
                        vehicleRPM = math.random(650, 750)
                    elseif (vehicleRPM >= 8000) then
                        vehicleRPM = 8000
                    end
                end
            else
                vehicleRPM = 0
            end
        else   
            if (getVehicleEngineState(vehicle) == true) then
                vehicleRPM = vehicleRPM - 150
                if (vehicleRPM < 650) then
                    vehicleRPM = math.random(650, 750)
                elseif (vehicleRPM >= 8000) then
                    vehicleRPM = 8000
                end
            else
                vehicleRPM = 0
            end
        end
        return tonumber(vehicleRPM)
    else
        return 0
    end
end

-- EKSPORT 
function getVehicleRPM(vehicle)
	if streamedVehicles[vehicle] then 
		return streamedVehicles[vehicle].rpm or getGTARPM(vehicle)
	else 
		return getGTARPM(vehicle)
	end
end 

function getVehicleGear(vehicle)
	if streamedVehicles[vehicle] then 
		return streamedVehicles[vehicle].gear or getVehicleCurrentGear(vehicle)
	else 
		return getVehicleCurrentGear(vehicle)
	end
end

function toggleEngines(bool)
	ENGINE_ENABLED = bool
	toggleGTAEngineSounds(not ENGINE_ENABLED)
	
	if bool == true then
		for k, v in ipairs(getElementsByType("vehicle", root, true)) do 
			streamInVehicle(v)
		end
	else
		for vehicle, data in pairs(streamedVehicles) do 
			streamOutVehicle(vehicle)
		end
		streamedVehicles = {}
	end
end

addEvent("onClientRefreshEngineSounds", true)
addEventHandler("onClientRefreshEngineSounds", root, function()
	for _, v in pairs(streamedVehicles) do 
		for _, sound in pairs(v.sounds or {}) do 
			if isElement(sound) then 
				stopSound(sound)
			end
		end
		v.sounds = nil
	end
end)

addEventHandler("onClientElementStreamIn", root, 
	function()
		if getElementType(source) == "vehicle" then 
			streamInVehicle(source)
		end
	end
)

addEventHandler("onClientElementStreamOut", root, 
	function()
		streamOutVehicle(source)
	end
)

addEventHandler("onClientVehicleEnter", root, function(player, seat)
	if seat == 0 then 
		setTimer(streamInVehicle, 200, 1, source)
	end
end)

addEventHandler("onClientResourceStart", resourceRoot, function()
	toggleEngines(true)
end)

addEventHandler("onClientResourceStop", resourceRoot, function()
	for k, v in pairs(streamedVehicles) do 
		if v.sounds and #v.sounds > 0 then 
			for _, sound in pairs(v.sounds) do 
				if isElement(sound) then 
					destroyElement(sound)
				end
			end
		end
	end
	
	toggleGTAEngineSounds(true)
end)

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

 

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