HunT Posted September 20, 2024 Share Posted September 20, 2024 Hi guys. After a loooooong time I decided to do a rework on one of my map but I need a particular script. I have so forgotten anything related to scripting after 10 years and I don't know if there is any event or function related to this yet. I need help creating a script when a certain vehicle stops touching an object after 5 seconds I have the ability to start a function. Such as destroying the vehicle after 5 seconds if it does not touch an object with its wheels. If anyone helps me I will add credits for the script when I release the map. Thanks for the support Link to comment
Shady1 Posted September 20, 2024 Share Posted September 20, 2024 37 minutes ago, HunT said: Hi guys. After a loooooong time I decided to do a rework on one of my map but I need a particular script. I have so forgotten anything related to scripting after 10 years and I don't know if there is any event or function related to this yet. I need help creating a script when a certain vehicle stops touching an object after 5 seconds I have the ability to start a function. Such as destroying the vehicle after 5 seconds if it does not touch an object with its wheels. If anyone helps me I will add credits for the script when I release the map. Thanks for the support local vehicleTouchData = {} function onVehicleTouch(hitElement, matchingDimension) if getElementType(hitElement) == "vehicle" then local vehicle = hitElement vehicleTouchData[vehicle] = true if isTimer(vehicleTouchData[vehicle.."timer"]) then killTimer(vehicleTouchData[vehicle.."timer"]) vehicleTouchData[vehicle.."timer"] = nil outputChatBox("Vehicle touched the object again, timer canceled.") end end end addEventHandler("onElementCollide", root, onVehicleTouch) function onVehicleLeave(leftElement, matchingDimension) if getElementType(leftElement) == "vehicle" then local vehicle = leftElement vehicleTouchData[vehicle] = false vehicleTouchData[vehicle.."timer"] = setTimer(function() if not vehicleTouchData[vehicle] then if isElement(vehicle) then destroyElement(vehicle) outputChatBox("Vehicle did not touch for 5 seconds, destroyed.") end end end, 5000, 1) end end addEventHandler("onElementLeaveCollide", root, onVehicleLeave) function onVehicleDestroy() vehicleTouchData[source] = nil if isTimer(vehicleTouchData[source.."timer"]) then killTimer(vehicleTouchData[source.."timer"]) end end addEventHandler("onElementDestroy", root, onVehicleDestroy) Link to comment
HunT Posted September 21, 2024 Author Share Posted September 21, 2024 18 hours ago, Shady1 said: local vehicleTouchData = {} function onVehicleTouch(hitElement, matchingDimension) if getElementType(hitElement) == "vehicle" then local vehicle = hitElement vehicleTouchData[vehicle] = true if isTimer(vehicleTouchData[vehicle.."timer"]) then killTimer(vehicleTouchData[vehicle.."timer"]) vehicleTouchData[vehicle.."timer"] = nil outputChatBox("Vehicle touched the object again, timer canceled.") end end end addEventHandler("onElementCollide", root, onVehicleTouch) function onVehicleLeave(leftElement, matchingDimension) if getElementType(leftElement) == "vehicle" then local vehicle = leftElement vehicleTouchData[vehicle] = false vehicleTouchData[vehicle.."timer"] = setTimer(function() if not vehicleTouchData[vehicle] then if isElement(vehicle) then destroyElement(vehicle) outputChatBox("Vehicle did not touch for 5 seconds, destroyed.") end end end, 5000, 1) end end addEventHandler("onElementLeaveCollide", root, onVehicleLeave) function onVehicleDestroy() vehicleTouchData[source] = nil if isTimer(vehicleTouchData[source.."timer"]) then killTimer(vehicleTouchData[source.."timer"]) end end addEventHandler("onElementDestroy", root, onVehicleDestroy) A thousand thanks. I will try this script Link to comment
Shady1 Posted September 21, 2024 Share Posted September 21, 2024 2 hours ago, HunT said: A thousand thanks. I will try this script I have not tested it, so please get back to me if there is anything missing or needs to be edited and I will help you Link to comment
Dzsozi (h03) Posted October 27, 2024 Share Posted October 27, 2024 there are no such events as onElementCollide onElementLeaveCollide https://wiki.multitheftauto.com/wiki/Client_Scripting_Events#Element_events https://wiki.multitheftauto.com/wiki/Server_Scripting_Events#Element_events I think the best thing you could do for this case is either a distance check, or creating collision shapes alongside the objects you need the check against. You maybe could achieve more precise results with a distance check logic, since you could get the position of a vehicle dummy or ped bone and many more, but you'd need to do it in a render event, or an event that is not as heavy as a render, but still constantly called, like onClientPedsProcessed. Link to comment
HunT Posted Tuesday at 08:22 Author Share Posted Tuesday at 08:22 (edited) On 21/09/2024 at 13:15, Shady1 said: I have not tested it, so please get back to me if there is anything missing or needs to be edited and I will help you The truth, I had abandoned this project and did not have the opportunity to try your script. But today out of curiosity I asked chatGPT to write me the script and this is the result local vehicleTimers = {} -- Memorizza i timer dei veicoli -- Funzione per controllare se il veicolo è in aria function checkVehicleAir(vehicle) if not isElement(vehicle) then return end if isVehicleOnGround(vehicle) then resetExplosionTimer(vehicle) else startExplosionTimer(vehicle) end end -- Avvia il timer di esplosione function startExplosionTimer(vehicle) if vehicleTimers[vehicle] then return end -- Evita più timer sullo stesso veicolo vehicleTimers[vehicle] = setTimer(function() if isElement(vehicle) and not isVehicleOnGround(vehicle) then blowVehicle(vehicle) -- Esplode il veicolo! vehicleTimers[vehicle] = nil end end, 5000, 1) -- 5 secondi di tempo end -- Resetta il timer se il veicolo tocca il suolo function resetExplosionTimer(vehicle) if vehicleTimers[vehicle] then killTimer(vehicleTimers[vehicle]) -- Ferma il timer vehicleTimers[vehicle] = nil end end -- Controlla lo stato dei veicoli in un loop function monitorVehicles() for _, vehicle in ipairs(getElementsByType("vehicle")) do if getVehicleController(vehicle) then -- Controlla solo i veicoli con giocatori dentro checkVehicleAir(vehicle) end end end setTimer(monitorVehicles, 1000, 0) -- Controlla ogni secondo -- Quando un veicolo esplode, rimuove il timer associato addEventHandler("onVehicleExplode", root, function() vehicleTimers[source] = nil end) chatGPT can write all kinds of functions, it's amazing Edited Tuesday at 08:37 by HunT 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