[QBCore|ESX]Horse Riding "Bring RedM to FiveM"

Horse Riding

Features

  • Different horse breeds with unique speeds and stats

  • Buy, sell, and manage horses at stables

  • Customization like Saddle and other horse accessories

  • smooth animations

  • Horses get tired and need rest with Stamina System

  • See your horse’s location on the map with Horse Blip

  • Horse follows you when not riding if used

Systems Available

  • “Garage System”: Store horses in physical garages.

  • “Call System”: Summon horses anywhere configurable.

  • “Shop”: Buy horses from stable vendors.

  • “sell”: sell horses and there modifications at stables.

  • “Customization”: Visual modifications for horses.

Controls

  • we use the normal player movment keys with small addon keys like :

  • H - Open Horse Menu Call System

  • E - Dismount Horse

  • Left Shift - Sprint

  • Double Tap Shift - Trot

Commands

/callhorse - Call your horse Call System

Interaction

  • the system use eather "qb-target" or "ox_target" for Interaction :

  • Ride Horse : used to ride the owned horse.

  • send to stable : used to send the horse to garage.

  • Follow me : used to make the horse follow the owner.

  • stay here : used to make the horse stay at location.

  • shop and sell and Customize are enabled when player is riding the horse.

Menus and input

  • the system use ox_lib menu and input to buy/sell/call/Customize the owned Horses

Available Feed Items

  • Apple - +25 Stamina

  • Carrot - +40 Stamina

  • Sugar - +15 Stamina

  • Hay - +60 Stamina

  • Horse Tonic - +100 Stamina + 1 minute no stamina drain

Using Feed Items

  • Have feed item in inventory

  • Be mounted on your horse

  • Use item from inventory

  • Horse gains stamina

Horse Blips

  • Blip automatically appears when horse is spawned

  • Only visible to horse owner

  • Shows horse’s realtime location and direction

Follow System

  • Horse maintains a small distance from player

  • Teleports closer if too far away

  • Uses pathfinding for realistic movement

Available Horse Breeds

  • The script includes multiple horse breeds with different stats:

  • American Paint Horse: the slowes one.

  • Giara : Balanced speed and nice look.

  • Holsteiner : fast and good looking.

  • holsteiner : Very fast sprinter and good hundling.

  • you can add your horses if you have more.

ChangeLogs

Change Logs : 1.1.0

  • The script now uses ‘real’ and ‘fake’ systems.
  • Real systems use actual horse movement.
  • Perfect synchronization and low resource monitoring.
  • The Fake system is the same as the old.
  • Fixed horse keeps running after player dismounts.
  • Improved and fixed other problems.
  • update Preview

Change Logs : 1.2.0

  • Expanded translation options.
  • Added new Preview Horses with 3D names if Enabled.
  • Added options to pay with cash or bank.
  • Garage system Fixed.
  • Fixed minor bugs and glitches.

Change Logs : 1.6.0

  • Removed the old fake horse system and cleaned the resource to use only the real riding system.
  • Added stamina support to the real riding system.
  • Improved horse driving/handling.
  • Added native custom horse audio for addon horse models.
  • Added running breath sound playback.
  • Added snort sounds on exhaustion and horse death.
  • Added unridden ambient idle horse animations.
  • Improved horse rider animations.
  • Added horse anti-scare behavior with config toggle.
  • Improved horse shop preview camera.
  • Improved customs preview camera.
  • preview Update : https://youtu.be/5FHl2Scl_C4

Config

Config = {}

-- Note: Theres 2 systems 'real' and 'fake'
-- real -----------------------------------
-- the horse actualy walk and sprint and run
-- all horses are the same(speed...)
-- harder control over the horse "the horse may stop runing for some reasons like terrain and cars.." happen  rarely.
-- better becuase it runs at lew resmon "0.00 to 0.02"
-- no stamina in this system
-------------------------------------------
-- fake: -----------------------------------
-- the horse dont actualy walk but act like a vehicle and do the animation of the walking...
-- horses are not the same (speed...)
-- full control over the horse "like a vehicle"
-- high resmon "0.07 to 0.18+"
-- use stamina
-------------------------------------------
Config.System = "real" -- "real" or "fake" - Read Above
Config.Framework = "QBCore" -- "ESX" , "QBCore"
Config.Notify = "ox"       -- "qb", "ox", or "esx"
Config.Target = "qb-target" -- "qb-target" , "ox_target"
Config.UseRope = false -- if true a rope is created near horse head
Config.MoneyType = "money" --"money" for cash or "bank" 
-- preview horses they spawn at resource start
Config.Draw3DText = false -- if true the horse name will show in 3d for the preview horses
Config.PreviewHorses = {
    -- paleto
    ["americanpaint_paleto"] = {pos = vector4(421.75, 6479.17, 27.81, 129.41),model = "americanpaint"},
    ["Giara_paleto"] = {pos = vector4(433.68, 6473.05, 27.77, 233.3),model = "Giara"},
    ["Andalusian_paleto"] = {pos = vector4(426.18, 6463.25, 27.78, 3.5),model = "Andalusian"},
    ["holsteiner_paleto"] = {pos = vector4(431.7, 6458.58, 27.75, 320.26),model = "holsteiner"},
    -- race track
    ["americanpaint_racetrack"] = {pos = vector4(1209.86, 319.17, 79.99, 269.48),model = "americanpaint"},
    ["Giara_racetrack"] = {pos = vector4(1214.37, 309.19, 79.99, 138.74),model = "Giara"},
    ["Andalusian_racetrack"] = {pos = vector4(1227.22, 303.65, 79.99, 232.42),model = "Andalusian"},
    ["holsteiner_racetrack"] = {pos = vector4(1228.64, 311.33, 79.99, 110.85),model = "holsteiner"},
}
-- Translate
Config.Translate = {
    -- blips
    blip_Stable = "Horse Stable",
    blip_Garage = 'Horse Garage',
    blip_my_horse = "My Horse",
    -- notify
    Cant_follow = "Horse cant Follow!.",
    No_horse_found = "No horse found!.",
    bought_without_money = "Item purchased without payment!",
    stay_here = "Your horse will stay here.",
    follow = "Your horse will follow you. Use 'Stay Here' to stop.",
    send_to_Stable = "Your horse has been sent to the stable.",
    recovered_Stamina = "Your horse has recovered some Stamina!",
    exhausted = "Your horse is exhausted!",
    tired = "Your horse is tired!",
    too_tired = "Your horse is too tired to run!",
    feed_horse = "You need to be on a horse to feed it!",
    cant_use = "This item cannot be used to feed horses",
    apple = "Horse enjoyed the apple! restored some stamina",
    carrot = "Horse loved the carrot! restored some stamina" ,
    sugar = "Horse got some energy from sugar! restored some stamina",
    hay = "Horse is well fed! restored some stamina",
    horse_tonic = "Horse tonic restored all stamina!",
    riding_horse = "You need to be riding a horse!",
    dont_own = "You don't own any horses!",
    Your_horse = "Your horse",
    taken_out = " has been taken out!",
    cant_store = "You don't have a horse to store!",
    stored = "Horse stored in Stable!",
    not_near = "You're not near a horse Stable!",
    Cant_find_path = "Horse is having trouble finding a path to you (Attempt ",
    arrived = "has arrived!",
    open_area = "couldn't find a path to you. Try moving to a more open area.",
    already_out = "Your horse is already out!",
    coming = "is coming to you!",
    dont_belong = "This horse does not belong to you!",
    sold =  "You sold your horse for $",
    sold_for =  "You sold %s for $%d!",
    nearby = "No horse nearby to ride.",
    bought_horse = "You bought a %s named %s!",
    not_enough = "Not enough money!",
    Custom_buy = "Bought %s for your horse!",
    -- target
    open_stable = "Open Stable",
    Horse_Ride = "Ride Horse",
    Horse_Follow = "Follow Me",
    Horse_Stay = "Stay Here",
    Horse_Stable = "Send to Stable",
    Horse_Buy = "Buy a Horse",
    Horse_Customize = "Customize Horse",
    Horse_Sell = "Sell Horse",
    Horse_Parts = "Sell Horse Parts",
    -- input
    input_buy = "🐎 Buy ",
    input_name = "Horse Name",
    inpute_give_name = "Give your new horse a name",
    input_Name_horse = "🐎 Name your ",
    -- menu
    Menu_Speed = "Speed: ",
    Menu_Walk = " | Walk: ",
    Menu_Shop = "🐎 Horse Shop",
    Menu_Close = "⬅ Close",
    Menu_Return = "⬅ Return",
    Menu_Confirm = "Confirm Purchase",
    Menu_buy = "Buy ",
    Menu_for = " for $",
    Menu_cancel = "Cancel",
    Menu_Remove_Preaview = "Remove preview",
    Menu_Customize = "🔧 Customize Horse",
    Menu_Preaview = "Preview this custom on your horse",
    Menu_Return = "Return",
    Menu_Back_Custom = "Back to customizations",
    Menu_customs_menu = "🎨 Horse Customization",
    Menu_Take_Out = "Take out your horse",
    Menu_Stable = " Stable",
    Menu_Call = "🐎 Call Horse",
    Menu_Sell_Custom = "💰 Sell Custom Parts"
}
-- shops and garages
Config.Stable = {
    ShopBlip = true, -- shops blips
    GarageBlip = true, -- garages blips
    CallHorseKey = "H", -- to open call horse menu
    CallHorseCommand = "callhorse", -- to open call horse menu
    DrawGarageMarker = false, -- if true a green marker will show at garage location
    System = "callhorse", -- "callhorse" or "garage"
    -- if system = "garages" player have to take the horse out of the garages under 
    Garages = {
        Paleto = {
            target = vector3(408.13, 6498.44, 27.76), -- where player target to open garage menu
            out = vector4(408.1, 6495.36, 27.94, 176.73) -- horse spawn coord
        },
        RaceTrack = {
            target = vector3(1226.87, 327.71, 81.99),
            out = vector4(1225.44, 325.48, 81.99, 152.89)
        }
        -- add here
    },
    shops = {
        Paleto = {
            PedModel = "a_m_m_farmer_01",
            PedCoords = vector4(420.29, 6470.77, 28.81, 346.34),
            PreviewCoords = vector4(425.02, 6471.12, 27.8, 52.35),
            UsePreviewHorse = true,
        },
        RaceTrack = {
            PedModel = "a_m_m_farmer_01",
            PedCoords = vector4(1219.61, 332.82, 81.99, 166.86),
            PreviewCoords = vector4(1223.43, 332.86, 80.99, 145.55),
            UsePreviewHorse = true,
        }
        -- add here
    },
}

-- horse blip system
Config.HorseBlip = {
    Enabled = true, -- enable/disable
    BlipSprite = 684,
    BlipColor = 5,
    BlipScale = 0.8,
    ShowHeading = true, -- show direction arrow
    FlashWhenCalled = false -- flash when horse is called
}
-- horse following player if used
Config.HorseFollow = {
    Enabled = true, -- enable/disable
    FollowDistance = 3.0, 
    MaxFollowDistance = 20.0, 
    MaxSpeed = "trot", 
    TeleportWhenTooFar = true,
    UpdateInterval = 2000
}
-- if config System = "callhorse"
Config.HorseSpawning = {
    SpawnDistance = { min = 20, max = 30 }, -- distance range in meters
    MaxPathfindingAttempts = 3, -- how many times to try pathfinding
    PathfindingTimeout = 30000, -- 30 seconds timeout for pathfinding
    DirectMovementTimeout = 20000, -- 20 seconds timeout for direct movement
    ArrivalDistance = 5.0, -- distance considered "arrived"
    UsePathfindingFirst = true, -- try pathfinding before direct movement
    TeleportOnCompleteFailure = true -- teleport horse if all methods fail
}
-- stamina system
Config.Stamina = {
    Enabled = true, -- enable/disable
    BaseStamina = 100.0, -- maximum stamina
    StaminaDrainRate = 3.0, -- stamina drains when running (in seconds)
    StaminaRegenRate = 5.0, -- stamina regenerates when not running (per second)
    ExhaustionThreshold = 20.0, -- horse gets tired When stamina drops below this
    ExhaustionDuration = 10, -- how long horse stays exhausted (seconds)
    WalkSpeedMultiplier = 0.6, -- speed multiplier when exhausted
    DisplayLowStamina = true -- display simple text to show lew stamina
}

-- avalable animals "horses"
Config.Animals = {
      ['americanpaint'] = {-- jest a name for id
        label = "American Paint Horse",
        model = 'americanpaint',
        price = 9000, -- shop price
        speed = { walk = 1.5, run = 4.1, turnRate = 0.9, trot = 1.9 }, -- horse hundling walking and runing and trot is the one between and turnRate lewer = better only if using 'fake' system
        attachment = { x = -0.32, y = 0.0, z = 0.2 }, -- player attach to horse
        -- avalable customs to the horse
        -- its better to take ur time fixing the pos for the customs ,at the time they are good enough
        Customs = {
            saddle_1 = { -- name for id
                label = "Leather Saddle", -- label on shop
                model = "sinor_saddle_mat_1", -- prop model
                pos = { x = -0.35, y = 0.0, z = -0.33 }, -- pos on horse
                bone = 24816, -- horse bone
                price = 1300 -- price on shop
            },
            saddle_2 = {
                label = "Cloth Saddle",
                model = "sinor_saddle_mat_2",
                pos = { x = -0.2, y = 0.0, z = -0.43 },
                bone = 24816,
                price = 850
            },
            saddle_3 = {
                label = "Race Saddle",
                model = "sinor_saddle_mat_3",
                pos = { x = -0.2, y = 0.0, z = -0.16 },
                bone = 24816,
                price = 1150
            },
            saddle_4 = {
                label = "basic Saddle",
                model = "sinor_saddle_mat_4",
                pos = { x = -0.35, y = 0.0, z = -0.15 },
                bone = 24816,
                price = 360
            },
            saddle_5 = {
                label = "Leather Mat Saddle",
                model = "sinor_saddle_mat_5",
                pos = { x = -0.2, y = 0.0, z = -0.85 },
                bone = 24816,
                price = 2200
            },
            Towel_1 = {
                label = "Cloth Towel",
                model = "sinor_prop_horse_towel_1",
                pos = { x = 0.25, y = 0.0, z = -0.35 },
                bone = 11816,
                price = 900
            },
            Towel_2 = {
                label = "Leather Towel",
                model = "sinor_prop_horse_towel_2",
                pos = { x = 0.25, y = 0.0, z = -0.35 },
                bone = 11816,
                price = 800
            },
            horn_1 = {
                label = "Horns",
                model = "sinor_prop_horn_1",
                pos = { x = 0.0, y = 0.0, z = 0.0 },
                bone = 37193,
                price = 1100
            },
            skull_1 = {
                label = "Skull",
                model = "sinor_prop_skull_1",
                pos = { x = 0.2, y = 0.0, z = 0.15 },
                bone = 37193,
                price = 900
            },
            colar_1 = {
                label = "Rope Colar",
                model = "sinor_prop_colar_1",
                pos = { x = 0.17, y = 0.0, z = 0.0 },
                bone = 31086,
                price = 200
            },
            -- colar_2 = {
            --     label = "Leather Colar",
            --     model = "sinor_prop_colar_2",
            --     pos = { x = 0.21, y = 0.0, z = 0.0 },
            --     bone = 31086,
            --     price = 200
            -- },
            -- colar_3 = {
            --     label = "Cloth Colar",
            --     model = "sinor_prop_colar_3",
            --     pos = { x = 0.21, y = 0.0, z = 0.0 },
            --     bone = 31086,
            --     price = 200
            -- },
            left_foot_boot = {
                label = "Left Front Leather Boot",
                model = "sinor_prop_boot_1",
                pos = { x = 0.02, y = -0.05, z = 0.0 },
                bone = 36029,
                price = 1050
            },
            right_foot_boot = {
                label = "Right Front Leather Boot",
                model = "sinor_prop_boot_1",
                pos = { x = -0.05, y = -0.05, z = 0.0 },
                bone = 6286,
                price = 1050
            },
            left_foot_boot_2 = {
                label = "Left Front Cloth Boot",
                model = "sinor_prop_boot_2",
                pos = { x = 0.02, y = -0.05, z = 0.0 },
                bone = 36029,
                price = 1250
            },
            right_foot_boot_2 = {
                label = "Right Front Cloth Boot",
                model = "sinor_prop_boot_2",
                pos = { x = -0.05, y = -0.05, z = 0.0 },
                bone = 6286,
                price = 1250
            },
            -- add more Customs if needed
        }
    },
    ['Giara'] = {
        label = "Giara Horse",
        model = 'Giara',
        price = 15000, 
        speed = { walk = 2.0, run = 4.6, turnRate = 0.7, trot = 2.4 }, 
        attachment = { x = -0.32, y = 0.0, z = 0.2 },
        Customs = {
            saddle_1 = { 
                label = "Leather Saddle", 
                model = "sinor_saddle_mat_1", 
                pos = { x = -0.35, y = 0.0, z = -0.33 }, 
                bone = 24816, 
                price = 1300 
            },
            saddle_2 = {
                label = "Cloth Saddle",
                model = "sinor_saddle_mat_2",
                pos = { x = -0.2, y = 0.0, z = -0.43 },
                bone = 24816,
                price = 850
            },
            saddle_3 = {
                label = "Race Saddle",
                model = "sinor_saddle_mat_3",
                pos = { x = -0.2, y = 0.0, z = -0.16 },
                bone = 24816,
                price = 1150
            },
            saddle_4 = {
                label = "basic Saddle",
                model = "sinor_saddle_mat_4",
                pos = { x = -0.35, y = 0.0, z = -0.15 },
                bone = 24816,
                price = 360
            },
            saddle_5 = {
                label = "Leather Mat Saddle",
                model = "sinor_saddle_mat_5",
                pos = { x = -0.2, y = 0.0, z = -0.85 },
                bone = 24816,
                price = 2200
            },
            Towel_1 = {
                label = "Cloth Towel",
                model = "sinor_prop_horse_towel_1",
                pos = { x = 0.25, y = 0.0, z = -0.35 },
                bone = 11816,
                price = 900
            },
            Towel_2 = {
                label = "Leather Towel",
                model = "sinor_prop_horse_towel_2",
                pos = { x = 0.25, y = 0.0, z = -0.35 },
                bone = 11816,
                price = 800
            },
            horn_1 = {
                label = "Horns",
                model = "sinor_prop_horn_1",
                pos = { x = 0.0, y = 0.0, z = 0.0 },
                bone = 37193,
                price = 1100
            },
            skull_1 = {
                label = "Skull",
                model = "sinor_prop_skull_1",
                pos = { x = 0.2, y = 0.0, z = 0.15 },
                bone = 37193,
                price = 900
            },
            colar_1 = {
                label = "Rope Colar",
                model = "sinor_prop_colar_1",
                pos = { x = 0.17, y = 0.0, z = 0.0 },
                bone = 31086,
                price = 200
            },
            -- colar_2 = {
            --     label = "Leather Colar",
            --     model = "sinor_prop_colar_2",
            --     pos = { x = 0.21, y = 0.0, z = 0.0 },
            --     bone = 31086,
            --     price = 200
            -- },
            -- colar_3 = {
            --     label = "Cloth Colar",
            --     model = "sinor_prop_colar_3",
            --     pos = { x = 0.21, y = 0.0, z = 0.0 },
            --     bone = 31086,
            --     price = 200
            -- },
            left_foot_boot = {
                label = "Left Front Leather Boot",
                model = "sinor_prop_boot_1",
                pos = { x = 0.02, y = -0.05, z = 0.0 },
                bone = 36029,
                price = 1050
            },
            right_foot_boot = {
                label = "Right Front Leather Boot",
                model = "sinor_prop_boot_1",
                pos = { x = -0.05, y = -0.05, z = 0.0 },
                bone = 6286,
                price = 1050
            },
            left_foot_boot_2 = {
                label = "Left Front Cloth Boot",
                model = "sinor_prop_boot_2",
                pos = { x = 0.02, y = -0.05, z = 0.0 },
                bone = 36029,
                price = 1250
            },
            right_foot_boot_2 = {
                label = "Right Front Cloth Boot",
                model = "sinor_prop_boot_2",
                pos = { x = -0.05, y = -0.05, z = 0.0 },
                bone = 6286,
                price = 1250
            },
            -- add more Customs if needed
        }
    },
    ['holsteiner'] = {
        label = "Holsteiner Horse",
        model = 'holsteiner',
        price = 19500,
        speed = { walk = 2.4, run = 5.2, turnRate = 0.5, trot = 2.8 }, 
        attachment = { x = -0.32, y = 0.0, z = 0.2 },
        Customs = {
            saddle_1 = {
                label = "Leather Saddle",
                model = "sinor_saddle_mat_1",
                pos = { x = -0.35, y = 0.0, z = -0.33 },
                bone = 24816,
                price = 1300
            },
            saddle_2 = {
                label = "Cloth Saddle",
                model = "sinor_saddle_mat_2",
                pos = { x = -0.2, y = 0.0, z = -0.43 },
                bone = 24816,
                price = 850
            },
            saddle_3 = {
                label = "Race Saddle",
                model = "sinor_saddle_mat_3",
                pos = { x = -0.2, y = 0.0, z = -0.16 },
                bone = 24816,
                price = 1150
            },
            saddle_4 = {
                label = "basic Saddle",
                model = "sinor_saddle_mat_4",
                pos = { x = -0.35, y = 0.0, z = -0.15 },
                bone = 24816,
                price = 360
            },
            saddle_5 = {
                label = "Leather Mat Saddle",
                model = "sinor_saddle_mat_5",
                pos = { x = -0.2, y = 0.0, z = -0.85 },
                bone = 24816,
                price = 2200
            },
            Towel_1 = {
                label = "Cloth Towel",
                model = "sinor_prop_horse_towel_1",
                pos = { x = 0.25, y = 0.0, z = -0.35 },
                bone = 11816,
                price = 900
            },
            Towel_2 = {
                label = "Leather Towel",
                model = "sinor_prop_horse_towel_2",
                pos = { x = 0.25, y = 0.0, z = -0.35 },
                bone = 11816,
                price = 800
            },
            horn_1 = {
                label = "Horns",
                model = "sinor_prop_horn_1",
                pos = { x = -0.1, y = 0.0, z = 0.1 },
                bone = 37193,
                price = 1100
            },
            skull_1 = {
                label = "Skull",
                model = "sinor_prop_skull_1",
                pos = { x = 0.2, y = 0.0, z = 0.15 },
                bone = 37193,
                price = 900
            },
            colar_1 = {
                label = "Rope Colar",
                model = "sinor_prop_colar_1",
                pos = { x = 0.17, y = 0.0, z = 0.0 },
                bone = 31086,
                price = 200
            },
            -- colar_2 = {
            --     label = "Leather Colar",
            --     model = "sinor_prop_colar_2",
            --     pos = { x = 0.21, y = 0.0, z = 0.0 },
            --     bone = 31086,
            --     price = 200
            -- },
            -- colar_3 = {
            --     label = "Cloth Colar",
            --     model = "sinor_prop_colar_3",
            --     pos = { x = 0.21, y = 0.0, z = 0.0 },
            --     bone = 31086,
            --     price = 200
            -- },
            left_foot_boot = {
                label = "Left Front Leather Boot",
                model = "sinor_prop_boot_1",
                pos = { x = 0.02, y = -0.05, z = 0.0 },
                bone = 36029,
                price = 1050
            },
            right_foot_boot = {
                label = "Right Front Leather Boot",
                model = "sinor_prop_boot_1",
                pos = { x = -0.05, y = -0.05, z = 0.0 },
                bone = 6286,
                price = 1050
            },
            left_foot_boot_2 = {
                label = "Left Front Cloth Boot",
                model = "sinor_prop_boot_2",
                pos = { x = 0.02, y = -0.05, z = 0.0 },
                bone = 36029,
                price = 1250
            },
            right_foot_boot_2 = {
                label = "Right Front Cloth Boot",
                model = "sinor_prop_boot_2",
                pos = { x = -0.05, y = -0.05, z = 0.0 },
                bone = 6286,
                price = 1250
            },
            -- add more Customs if needed
        },
    },
    ['Andalusian'] = {
        label = "Andalusian Horse",
        model = 'Andalusian',
        price = 25500,
        speed = { walk = 2.6, run = 6.0, turnRate = 0.35, trot = 3.2 },
        attachment = { x = -0.32, y = 0.0, z = 0.2 },
        Customs = {
            saddle_1 = {
                label = "Leather Saddle",
                model = "sinor_saddle_mat_1",
                pos = { x = -0.35, y = 0.0, z = -0.33 },
                bone = 24816,
                price = 1300
            },
            saddle_2 = {
                label = "Cloth Saddle",
                model = "sinor_saddle_mat_2",
                pos = { x = -0.2, y = 0.0, z = -0.43 },
                bone = 24816,
                price = 850
            },
            saddle_3 = {
                label = "Race Saddle",
                model = "sinor_saddle_mat_3",
                pos = { x = -0.2, y = 0.0, z = -0.16 },
                bone = 24816,
                price = 1150
            },
            saddle_4 = {
                label = "basic Saddle",
                model = "sinor_saddle_mat_4",
                pos = { x = -0.35, y = 0.0, z = -0.15 },
                bone = 24816,
                price = 360
            },
            saddle_5 = {
                label = "Leather Mat Saddle",
                model = "sinor_saddle_mat_5",
                pos = { x = -0.2, y = 0.0, z = -0.85 },
                bone = 24816,
                price = 2200
            },
            Towel_1 = {
                label = "Cloth Towel",
                model = "sinor_prop_horse_towel_1",
                pos = { x = 0.25, y = 0.0, z = -0.35 },
                bone = 11816,
                price = 900
            },
            Towel_2 = {
                label = "Leather Towel",
                model = "sinor_prop_horse_towel_2",
                pos = { x = 0.25, y = 0.0, z = -0.35 },
                bone = 11816,
                price = 800
            },
            horn_1 = {
                label = "Horns",
                model = "sinor_prop_horn_1",
                pos = { x = -0.1, y = 0.0, z = 0.1 },
                bone = 37193,
                price = 1100
            },
            skull_1 = {
                label = "Skull",
                model = "sinor_prop_skull_1",
                pos = { x = 0.2, y = 0.0, z = 0.15 },
                bone = 37193,
                price = 900
            },
            colar_1 = {
                label = "Rope Colar",
                model = "sinor_prop_colar_1",
                pos = { x = 0.17, y = 0.0, z = 0.0 },
                bone = 31086,
                price = 200
            },
            -- colar_2 = {
            --     label = "Leather Colar",
            --     model = "sinor_prop_colar_2",
            --     pos = { x = 0.21, y = 0.0, z = 0.0 },
            --     bone = 31086,
            --     price = 200
            -- },
            -- colar_3 = {
            --     label = "Cloth Colar",
            --     model = "sinor_prop_colar_3",
            --     pos = { x = 0.21, y = 0.0, z = 0.0 },
            --     bone = 31086,
            --     price = 200
            -- },
            left_foot_boot = {
                label = "Left Front Leather Boot",
                model = "sinor_prop_boot_1",
                pos = { x = 0.02, y = -0.05, z = 0.0 },
                bone = 36029,
                price = 1050
            },
            right_foot_boot = {
                label = "Right Front Leather Boot",
                model = "sinor_prop_boot_1",
                pos = { x = -0.05, y = -0.05, z = 0.0 },
                bone = 6286,
                price = 1050
            },
            left_foot_boot_2 = {
                label = "Left Front Cloth Boot",
                model = "sinor_prop_boot_2",
                pos = { x = 0.02, y = -0.05, z = 0.0 },
                bone = 36029,
                price = 1250
            },
            right_foot_boot_2 = {
                label = "Right Front Cloth Boot",
                model = "sinor_prop_boot_2",
                pos = { x = -0.05, y = -0.05, z = 0.0 },
                bone = 6286,
                price = 1250
            },
            -- add more Customs if needed
        },
    },
    -- you can add more horses if needed 
}


Preview

Tebex

GetHere

Support

  • join our discord for any support , you can find it in our tebex store.

other scripts

QBCore/ESX|BaseBuilding
Standalone|AdvancedZombieSystem
Standalone|SurvivalHUD
Standalone|VehicleSpawne
QBCore/ESX|UsableItems
QBCore/ESX|VehicleCrafting
QBCore/ESX|Recycler
QBCore/ESX|Gather
Standalone|SafeZone
QBCore/ESX|LootAreas
QBCore/ESX|LootPeds
QBCore/ESX|RadiationZones
Standalone|ZombieSystem
QBCore|Shop
QBCore|WeatherSync
QBCore/ESX|InGameMusic
QBCore/ESX|CamperHousing
QBCore/ESX|LootBags
Vehicles|ApocalypticVehicles-V1
QBCore/ESX|Menu

Code is accessible Config
Subscription-based No
Lines (approximately) 2300+
Requirements QBCore / ESX
Support Yes
2 Likes

Lovely. I have a couple of questions :slight_smile:

  • Can we custom the horse model?
  • Can the position of the rider be corrected? They shouldn’t be lying forward like that on the horse :slight_smile:
  • What’s the resmon idle/used? That’s really extremely difficult to find a good optimized horse riding script

Cheers!

Yes, you can add any horse model and prop to the horse. You can position the rider, but animation changes are not currently supported; more options will be added in future updates. Resmon usage is approximately 0.05 to 0.11, depending on the horse, props, and speed.

Show us resmon for both Client and Server. Thanks!

1 Like


Worst-case scenario with all props: 0.05 to 0.11, dropping to 0.02 or 0.01 when inactive.
Further updates will bring more optimization.

Great that sounds like a great addition for my new update :slight_smile:

I’m glad you think so! Let me know if you have any other feedback or suggestions.

How is the optimization with 2-5 people riding together?

Also is there a way to customize the sounds for the horses? Because currently they just sound like screaming donkeys.

Also can you shoot from the horse?

I noticed the saddle was attached to the PLAYER when running instead of the horses back as well.

One other thing, the player would look better if he was sitting up more and not leaned over so far.

Testing with three players yielded similar results to solo play, with a potential server-side sync increase of up to 0.01 or 0.02.
Currently, the sound is the default deer sound. If a custom deer sound resembling a horse can be implemented, then it would work.
you can shoot but at the same time cant if player try to shoot the horse will get scared and try to run and the sit animation get messed up
the saddle is attached to the horse at the same possition of the player sit so thats why it looks like that
player possiton can be changed for me it looks fine like this

Awesome work :heart_on_fire: curious how riding looks from another player’s POV?

At lower speeds (walk/trot), horse movement is similar to other players. However, at higher speeds (run), server-side sync corrects the horse’s position if it desynchronizes so It may occasionally stutter to the other pov
i can do a preview to show that if any one want it

Change Logs : 1.1.0

  • The script now uses ‘real’ and ‘fake’ systems.

  • Real systems use actual horse movement.

  • Perfect synchronization and low resource monitoring.

  • The Fake system is the same as the old.

  • Fixed horse keeps running after player dismounts.

  • Improved and fixed other problems.

  • update Preview

Can players conduct business

haw !

Change Logs : 1.2.0

  • Expanded translation options.
  • Added new Preview Horses with 3D names if Enabled.
  • Added options to pay with cash or bank.
  • Garage system Fixed.
  • Fixed minor bugs and glitches.

Change Logs : 1.3.0

  • Fixed issue where cash was not working for buying customs.
  • Fixed bug where players could get stuck in an animation when sending a horse to the stable.
  • Added free camel ped with the update.
  • Fixed other minor bugs.

Change Logs : 1.5.0

  • Migrated UI from ox_lib to UI.
  • Redesigned buy menu and restyled call UI.
  • Integrated customs UI.
  • Added NUI callback for retrieving horses from the garage.
  • Implemented target option changes and custom prop rotation support.
  • Fixed keybind issue “H key now opens call menu”.
  • Enabled stable/garage blip customization.
  • Preview the update https://youtu.be/b-fxR0tBk_c

Change Logs : 1.6.0

  • Removed the old fake horse system and cleaned the resource to use only the real riding system.
  • Added stamina support to the real riding system.
  • Improved horse driving/handling.
  • Added native custom horse audio for addon horse models.
  • Added running breath sound playback.
  • Added snort sounds on exhaustion and horse death.
  • Added unridden ambient idle horse animations.
  • Improved horse rider animations.
  • Added horse anti-scare behavior with config toggle.
  • Improved horse shop preview camera.
  • Improved customs preview camera.
  • preview Update : https://youtu.be/5FHl2Scl_C4

Change Logs : 1.7.0

  • Replaced the old rope system with the new using two hand-to-head Rope lines.

  • Reworked horse follow into an automatic distance-based system with manual stay support.

  • Added horse lead mode with a single lead rope and separate lead behavior. Separated follow, lead, and call-horse movement logic so each can be tuned independently.

  • Added open editable client/server bridge files for framework, money, notify, callback, and inventory hooks while keeping the main code protected.

  • Added horse appearance/component handling on spawn with configurable reset, reapply, and model override support.

  • Improved horse dismount input so getting off the horse responds more reliably with a single key press.

  • Preview Update : https://youtu.be/l83YtnwU61s