Tony0402 Posted May 1, 2020 Share Posted May 1, 2020 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now