Installation

Installation guide for this resource

Ensure following order in your server.cfg

ensure ox_lib
ensure <your_frame_work>
ensure bv-guidedmissile

For ox_inventory > data > items

['mil_laptop'] = {
    label = 'Military Grade Laptop',
    weight = 1000,
    stack = false
}

For qb-core > shared > items

mil_laptop  = { name = 'mil_laptop', label = 'Military Grade Laptop', weight = 1000, type = 'item', image = 'mil_laptop.png', unique = true, useable = true, shouldClose = true, description = 'A Military grade laptop.' },

Config:

ConfigSettings = {
    framework = 'qbox', -- esx, qbox, qbcore

    skillCheck = function() -- Set to true to disable
        return lib.skillCheck({'easy', 'easy', {areaSize = 60, speedMultiplier = 2}, 'hard'}, {'w', 'a', 's', 'd'})
    end,

    cameraFuzzStrength = 0.18,

    killStreaks = false, -- Enables built-in kill Streak System
    
    BallisticMissiles = {
        [`w_ex_vehiclemissile_4`] = {
            fuelLevel = 100.0,
            fuelConsumptionRate = 0.1,

            missileMach = 18.0,
            boostSpeed = 40.0,

            camOffset = vec3(0.0, 0.0, 0.0),
            particleOffset = vec3(0.0, -1.0, 0.0),
            particleSize = 1.0, 

            explosionType = 81, -- (https://docs.fivem.net/natives/?_0xE3AD2BDBAEE269AC)
            damageScale = 5.0,

            spawnHeight = 550.0,
            minDistance = 600.0,
            maximumDistance = 1000.0,

            name = "Chernobog Missile",
            description = "A <strong>next-gen hypersonic missile</strong> equipped with AI-guided precision. Reaches Mach 18 with low-altitude, terrain-hugging flight. Built for overwhelming speed and surgical impact.",
            image = "assets/chernobog.png",

            requireJob = {
                enabled = false,
                name = 'police',
                grade = 1
            },

            killStreak = 3, -- Kill streak needed to select this missile.

            CruiseMissile = true -- will act as a cruise missile inspired from COD
        },
        [`w_smug_airmissile_02`] = {
            fuelLevel = 100.0,
            fuelConsumptionRate = 0.08,

            missileMach = 16.0,
            boostSpeed = 40.0,

            camOffset = vec3(1.0, -3.0, 0.60),
            particleOffset = vec3(0.0, 0.0, 0.0),
            particleSize = 1.0, 

            explosionType = 81,
            damageScale = 8.0,

            spawnHeight = 400.0,
            minDistance = 1000.0,
            maximumDistance = 1500.0,

            name = "HMX-081",
            description = "The <strong>HMX-081</strong> is a next-generation hypersonic missile equipped with <strong>AI-assisted targeting</strong> and <strong>terrain-following guidance</strong>. Reaching speeds up to Mach 16, it delivers precision and power at extreme ranges.",
            image = "assets/hmx081.png",

            requireJob = {
                enabled = true,
                name = 'police',
                grade = 2
            },

            killStreak = 4, -- Kill streak needed to select this missile.

            CruiseMissile = false
        },
        [`w_ex_vehiclemissile_1`] = {
            fuelLevel = 100.0,
            fuelConsumptionRate = 0.06,

            missileMach = 16.0,
            boostSpeed = 40.0,

            camOffset = vec3(1.0, -3.0, 0.60),
            particleOffset = vec3(0.0, -1.0, 0.0),
            particleSize = 1.0, 

            explosionType = 81, 
            damageScale = 10.0,

            spawnHeight = 400.0,
            minDistance = 1500.0,
            maximumDistance = 2000.0,

            name = "Hellfire Missile",
            description = "Advanced <strong>hypersonic cruise missile</strong> with AI-powered targeting. Capable of Mach 16 speeds with terrain-following capability.",
            image = "assets/hellfire.png",

            requireJob = {
                enabled = true,
                name = 'police',
                grade = 4
            },

            killStreak = 5, -- Kill streak needed to select this missile.

            CruiseMissile = false
        }
    },
    
    blipSettings = {
        sprite = 548,
        colour = 5, 
        scale = 1.0,
        display = 2
    },

    laptopModel = "prop_laptop_lester2",
    itemName = 'mil_laptop', -- Set to false to disable use as item

    boostKEY = 'B',
    switchVisionKey = 'CAPITAL',
    detonateKey = 'E',
    cancelKey = 'C',

    OnPlayerUseLaptop = function()
        DisplayRadar(false)
        if GetResourceState('ox_target') == 'started' then
            exports.ox_target:disableTargeting(true)
        elseif GetResourceState('qb-target') == 'started' then
            exports['qb-target']:AllowTargeting(false)
        end
        LocalPlayer.state.invBusy = true
    end,

    OnPlayerMissileTerminated = function()
        ClearTimecycleModifier()
        ClearFocus()
        DisplayRadar(true)
        if GetResourceState('ox_target') == 'started' then
            exports.ox_target:disableTargeting(false)
        elseif GetResourceState('qb-target') == 'started' then
            exports['qb-target']:AllowTargeting(true)
        end
        LocalPlayer.state.invBusy = false
    end,

    keyOptions = function(detonateKey, boostKey, switchkey)
        return {
            string.format('Press <span class="key">%s</span> to Detonate', detonateKey),
            string.format('Press <span class="key">%s</span> to Boost', boostKey),
            string.format('Press <span class="key">%s</span> to Switch Vision', switchkey)
        }
    end,

   Notify = function(data)
        data.title = data.title or 'SYSTEM'
        data.description = data.description or 'NADA'
        data.duration = data.duration or 6000
        data.type = data.type or 'inform'

        if data.src then
            lib.notify(data.src, {
                title = data.title,
                description = data.description,
                showDuration = true,
                position = 'center-right',
                type = data.type,
                duration = data.duration
            })
        else
            lib.notify({
                title = data.title,
                description = data.description,
                showDuration = true,
                position = 'center-right',
                type = data.type,
                duration = data.duration
            })
        end
    end,

    Translations = {
        NOT_ENOUGH_FUEL = "Fuel is too low to boost!",
        NOT_ENOUGH_STREAKS = "You don't have enough kill streaks to select this missile!",
        NOT_ENOUGH_GRADE = "You're rank is not high enough to select this missile!",
        NOT_AUTHORIZED = "You're not authorized to select this missile!",
        IN_VEHICLE = "You can't do that while inside a vehicle!",
        IS_DEAD = "You can't do that whilst dead or unconscious!",
        IN_WATER = "You can't do that while in water!",
        ALREADY_USING = "You're already using a military laptop!",
        KILLSTREAK = "You're on owning! (%s)",
    }
}

Last updated