local skateboard, Dir, customCam, Attached, overSpeed = {}, {}, nil, false, nil local function createSkateboardEntity() local entity = makeVeh("triBike3", vec4(0, 0, 0, 0)) local prop = makeProp({ prop = "v_res_skateboard", coords = vec4(0, 0, 0, 0) }, 0, 1) while not DoesEntityExist(entity) or not DoesEntityExist(prop) do Wait(5) end SetEntityVisible(entity, (Config.System.Debug), 0) AttachEntityToEntity(prop, entity, GetPedBoneIndex(PlayerPedId(), 28422), 0.0, 0.0, -0.60, 0.0, 0.0, 90.0, false, true, true, true, 1, true) SetEntityNoCollisionEntity(entity, PlayerPedId(), false) SetEntityNoCollisionEntity(prop, PlayerPedId(), false) SetEntityCompletelyDisableCollision(entity, true, true) SetEntityCompletelyDisableCollision(prop, true, true) SetVehicleDoorsLocked(entity, 10) DisableCamCollisionForEntity(entity) DisableCamCollisionForEntity(prop) return entity, prop end local function configureSkateboard(entity) for k, v in pairs({ ["fSteeringLock"] = 9.0, ["fDriveInertia"] = 0.05, ["fMass"] = 1800.0, ["fPercentSubmerged"] = 105.0, ["fDriveBiasFront"] = 0.0, ["fInitialDriveForce"] = 0.25, ["fInitialDriveMaxFlatVel"] = 135.0, ["fTractionCurveMax"] = 2.2, ["fTractionCurveMin"] = 2.12, ["fTractionCurveLateral"] = 22.5, ["fTractionSpringDeltaMax"] = 0.1, ["fLowSpeedTractionLossMult"] = 0.7, ["fCamberStiffnesss"] = 0.0, ["fTractionBiasFront"] = 0.478, ["fTractionLossMult"] = 0.0, ["fSuspensionForce"] = 1.2, ["fSuspensionReboundDamp"] = 1.7, ["fSuspensionUpperLimit"] = 0.1, ["fSuspensionLowerLimit"] = -0.3, ["fSuspensionRaise"] = 0.0, ["fSuspensionBiasFront"] = 0.5, ["fAntiRollBarForce"] = 0.0, ["fAntiRollBarBiasFront"] = 0.65, ["fBrakeForce"] = 0.53 }) do SetVehicleHandlingFloat(entity, "CHandlingData", k, v) end end local function createBikeDriver(bike) local entity = makePed("S_M_M_AutoShop_01", vec4(0.0, 0.0, 0.0, 0.0), 0, 1, nil, nil) SetEntityNoCollisionEntity(entity, PlayerPedId(), false) SetEntityCompletelyDisableCollision(entity, true, true) SetEnableHandcuffs(entity, true) SetEntityInvincible(entity, true) FreezeEntityPosition(entity, true) TaskWarpPedIntoVehicle(entity, bike, -1) SetEntityVisible(entity, (Config.System.Debug), 0) return entity end local function makeFakeSkateboard(Ped, remove) -- The animation for picking up and placing the board local prop = makeProp({ prop = "v_res_skateboard", coords = vec4(0,0,0,0), false, true}) if GetEntityModel(Ped) == `a_c_cat_01` then SetPedCanRagdoll(PlayerPedId(), false) AttachEntityToEntity(prop, PlayerPedId(), GetPedBoneIndex(PlayerPedId(), 31086), 0.18, -0.14, 0.0, -87.0, -100.0, 1.0, true, true, false, false, 1, true) else AttachEntityToEntity(prop, Ped, GetPedBoneIndex(Ped, 57005), 0.3, 0.08, 0.09, -86.0, -60.0, 50.0, true, true, false, false, 1, true) playAnim("pickup_object", "pickup_low", -1, 0) end if remove then DeleteVehicle(skateboard.Bike) destroyProp(skateboard.Skate) DeleteEntity(skateboard.Driver) end Wait(900) destroyProp(prop) end RegisterNetEvent("jim-skateboard:PickPlace", function() local Ped = PlayerPedId() if not IsPedSittingInAnyVehicle(Ped) then if DoesEntityExist(skateboard.Bike) then removeEntityTarget(skateboard.Skate) removeEntityTarget(skateboard.Driver) removeEntityTarget(skateboard.Bike) Attached = false Wait(100) stopTempCam() makeFakeSkateboard(Ped, true) -- pick up animation addItem("skateboard", 1) skateboard = {} Dir = {} else --Make and configure skateboard skateboard.Bike, skateboard.Skate = createSkateboardEntity() configureSkateboard(skateboard.Bike) -- Driver properties skateboard.Driver = createBikeDriver(skateboard.Bike) local options = { { action = function() TriggerEvent("jim-skateboard:GetOn", { board = skateboard.Skate }) end, icon = "fas fa-car", label = "Get on", board = skateboard.Skate }, { action = function() TriggerEvent("jim-skateboard:PickPlace", { board = skateboard.Skate }) end, icon = "fas fa-hand-holding", label ="Pick up", board = skateboard.Skate }, } createEntityTarget(skateboard.Skate, options, 2.5) createEntityTarget(skateboard.Driver, options, 2.5) createEntityTarget(skateboard.Bike, options, 2.5) makeFakeSkateboard(Ped) SetEntityCoords(skateboard.Bike, GetOffsetFromEntityInWorldCoords(Ped, 0.0, 0.5, 1.5)) SetEntityHeading(skateboard.Bike, GetEntityHeading(PlayerPedId())+90) removeItem("skateboard", 1) Dir = {} end end end) RegisterKeyMapping('skategetoff', 'Skateboard: Get Off', 'keyboard', 'G') RegisterCommand('skategetoff', function() if Attached then if not IsEntityInAir(skateboard.Bike) then stopTempCam() DetachEntity(PlayerPedId(), false, false) TaskVehicleTempAction(skateboard.Driver, skateboard.Bike, 1, 100) Attached = false Dir = {} ClearPedTasks(PlayerPedId()) end end end) RegisterKeyMapping('+skateforward', 'Skateboard: Forward', 'keyboard', 'W') RegisterCommand('+skateforward', function() if Attached and not overSpeed then CreateThread(function() if not Dir.forward then Dir.forward = true while Dir.forward do if not Dir.right and not Dir.left then TaskVehicleTempAction(skateboard.Driver, skateboard.Bike, 9, 0.1) end if Dir.left then TaskVehicleTempAction(skateboard.Driver, skateboard.Bike, 7, 0.1) end if Dir.right then TaskVehicleTempAction(skateboard.Driver, skateboard.Bike, 8, 0.1) end Wait(50) end else return end end) end end) RegisterCommand('-skateforward', function() if Attached then Dir.forward = nil TaskVehicleTempAction(skateboard.Driver, skateboard.Bike, 1, 1) end end) RegisterKeyMapping('+skatebackward', 'Skateboard: Backward', 'keyboard', 'S') RegisterCommand('+skatebackward', function() if Attached and not overSpeed then CreateThread(function() if not Dir.backward then Dir.backward = true while Dir.backward do if Dir.left then TaskVehicleTempAction(skateboard.Driver, skateboard.Bike, 13, 0.1) elseif Dir.right then TaskVehicleTempAction(skateboard.Driver, skateboard.Bike, 14, 0.1) elseif not Dir.right and not Dir.left then TaskVehicleTempAction(skateboard.Driver, skateboard.Bike, 22, 0.1) end Wait(50) end else return end end) end end) RegisterCommand('-skatebackward', function() if Attached then Dir.backward = nil TaskVehicleTempAction(skateboard.Driver, skateboard.Bike, 1, 1) end end) RegisterKeyMapping('+skateleft', 'Skateboard: Left', 'keyboard', 'A') RegisterCommand('+skateleft', function() if Attached and not overSpeed then Dir.left = true end end) RegisterCommand('-skateleft', function() if Attached then Dir.left = nil end end) RegisterKeyMapping('+skateright', 'Skateboard: Right', 'keyboard', 'D') RegisterCommand('+skateright', function() if Attached and not overSpeed then Dir.right = true end end) RegisterCommand('-skateright', function() if Attached then Dir.right = nil end end) RegisterKeyMapping('skatejump', 'Skateboard: Jump', 'keyboard', 'SPACE') RegisterCommand('skatejump', function() local Ped = PlayerPedId() if Attached then if not IsEntityInAir(skateboard.Bike) then local vel = GetEntityVelocity(skateboard.Bike) if GetEntityModel(Ped) == `a_c_cat_01` then playAnim("creatures@cat@move", "idle_dwn", -1, 1) else playAnim("move_crouch_proto", "idle_intro", -1, 1) end local duration = 0 local boost = 0 while IsControlPressed(0, 22) do Wait(10) duration = duration + 10.0 end boost = 6.0 * duration / 250.0 if boost > 6.0 then boost = 6.0 end SetEntityVelocity(skateboard.Bike, vel.x, vel.y, vel.z + boost) if GetEntityModel(Ped) == `a_c_cat_01` then stopAnim("move_crouch_proto", "idle_dwn") playAnim("creatures@cat@move", "idle_upp", -1, 1) else stopAnim("move_crouch_proto", "idle_intro") playAnim("move_strafe@stealth", "idle", -1, 1) end end end end) local toggleCam = false local flipCam = false RegisterKeyMapping('skatecam', 'Skateboard: Unlock/Lock Cam', 'keyboard', 'H') RegisterCommand('skatecam', function() if Attached then toggleCam = not toggleCam updateCamLoc() end end) RegisterKeyMapping('+flipcam', 'Skateboard: Flip Cam', 'keyboard', 'C') RegisterCommand('+flipcam', function() if Attached then AttachCamToEntity(customCam, skateboard.Bike, 0.25, 2.0, 1.5, true) flipCam = true end end) RegisterCommand('-flipcam', function() if Attached then AttachCamToEntity(customCam, skateboard.Bike, 0.25, -2.0, 1.0, true) flipCam = false end end) function updateCamLoc() CreateThread(function() while toggleCam and Attached do local coord = GetOffsetFromEntityInWorldCoords(PlayerPedId(), 0.0, flipCam and -5.0 or 5.0, 0.0) if customCam == nil then customCam = createTempCam(coord, coord) AttachCamToEntity(customCam, skateboard.Bike, 0.25, -2.0, 1.0, true) startTempCam(customCam) end PointCamAtCoord(customCam, coord.x, coord.y, coord.z) Wait(0) end RenderScriptCams(false, true, 500, true, true) DestroyAllCams() customCam = nil end) end RegisterNetEvent("jim-skateboard:GetOn", function() local Ped = PlayerPedId() if GetEntityModel(Ped) == `a_c_cat_01` then AttachEntityToEntity(Ped, skateboard.Bike, 20, 0.0, 0.10, -0.78, 0.4, 0.0, 0.0, -15.0, true, true, false, true, 1, true) playAnim("creatures@cat@move", "idle_upp", -1, 1) else playAnim("move_strafe@stealth", "idle", -1, 1) AttachEntityToEntity(Ped, skateboard.Bike, 20, 0.0, 0.15, 0.05, 0.0, 0.0, -15.0, true, true, false, true, 1, true) end SetEntityCollision(Ped, true, true) Attached = true updateCamLoc() drawText(nil, {"[G] - Get Off Stakeboard", "[H] - Unlock/Lock Cam"}, "w") CreateThread(function() while Attached do StopCurrentPlayingAmbientSpeech(skateboard.Driver) overSpeed = (GetEntitySpeed(skateboard.Bike)*3.6) > 90 local x, y, z = table.unpack(GetEntityRotation(skateboard.Bike)) if (-40.0 < x and x > 40.0) or (-40.0 < y and y > 40.0) then DetachEntity(Ped, false, false) TaskVehicleTempAction(skateboard.Driver, skateboard.Bike, 1, 1) Attached = false Dir = {} if GetEntityModel(Ped) ~= `a_c_cat_01` then stopAnim("move_strafe@stealth", "idle") end SetPedToRagdoll(Ped, 5000, 4000, 0, true, true, false) end if not DoesEntityExist(skateboard.Bike) or GetPedInVehicleSeat(skateboard.Bike, -1) ~= skateboard.Driver then removeEntityTarget(skateboard.Skate) removeEntityTarget(skateboard.Bike) removeEntityTarget(skateboard.Driver) Attached = false Wait(100) makeFakeSkateboard(Ped, true) addItem("skateboard", 1) skateboard = {} Dir = {} end if not IsEntityAttachedToEntity(Ped, skateboard.Bike) then DetachEntity(Ped, false, false) TaskVehicleTempAction(skateboard.Driver, skateboard.Bike, 6, 2000) Attached = false Dir = {} if GetEntityModel(Ped) == `a_c_cat_01` then stopAnim("creatures@cat@move", "idle_upp") stopAnim("creatures@cat@move", "idle_dwn") else stopAnim("move_strafe@stealth", "idle") end end Wait(1000) end hideText() end) end) AddEventHandler('onResourceStop', function(r) if r ~= GetCurrentResourceName() then return end hideText() if DoesEntityExist(skateboard.Bike) then DeleteVehicle(skateboard.Bike) end end)