[Paid] Immersive Weed System [SCRIPT]

:herb:Immersive Weed System​:seedling:

“Weed Growing System is a highly modular, framework-agnostic FiveM script for immersive cannabis production, processing, and usage. It features fully synced, persistent plants with realistic growth stages, dynamic interaction (target scripts or native 3D text), and a polished UI for every step from seed to smoke. With configurable support for ESX, QBCore, Qbox, ox_inventory, qb-inventory, qs-inventory, ox_target, qb-target, and more, this script integrates seamlessly into any modern server setup.It includes drying racks, joint crafting and smoking (with effects), boss/management support, and extensive config options for advanced RP.”

:movie_camera: Watch the Full Showcase Here: Watch Now


:sparkles: Features:

:white_check_mark: Persistent Planting: Grow and manage plants indoors/outdoors with full tracking and stages.
:white_check_mark: Realistic Growth: Plants grow over time, require care, and can die if neglected.
:white_check_mark: Water & Fertilizer: Use items to water/fertilize. Stats tracked in real time.
:white_check_mark: Drying System: Hang buds on racks with visual props and configurable timers.
:white_check_mark: Processing Stations: Craft items via menus for processing, drying, and rolling.
:white_check_mark: Joint Crafting & Smoking: Smoke joints with effects, animations, and puff system.
:white_check_mark: Skill & Job Gating: Restrict features by job, grade, or skill level.
:white_check_mark: Highly Configurable: Control all data from configs, plants, times, jobs, effects.
:white_check_mark: Polished Visuals: 3D text, custom UI, menus, overlays, and progress bars.
:white_check_mark: Boss Support: Job-based access to management zones with target/3D text.

View Images 📸

View Config 💻
--                   CONFIGURATION FILE                  --
--                Weed Growing & Drying System           --
--========================================================--

Config                       = {}


--========================================================================================--
--  BUGS / SUPPORT ► https://discord.gg/QJKtsYBpmW  |  Open a ticket for help & fixes     --
--========================================================================================--


--========================================================--
-- SYSTEM INTEGRATIONS
--========================================================--
Config.Systems               = {
    Framework   = 'auto', -- 'esx' | 'qbcore' | 'qbox' | 'auto'
    Inventory   = 'auto', -- 'ox' | 'qb' | 'esx' | 'auto'
    Notify      = 'auto', -- 'ox_lib' | 'qbx_core' | 'qb_core' | 'esx' | 'custom' | 'auto'
    Interaction = 'auto', -- 'ox_target' | 'qb_target' | '3dtext' | 'auto'
    Menu        = 'auto', -- 'ox_lib' | 'qb_menu' | 'esx_menu' | 'auto'
}

-- If using 3dtext, here are the controls to open the UIS
Config.PromptOpenKey = 38 -- Default: E (use 47 for G, 29 for B, etc.)
-- https://docs.fivem.net/docs/game-references/controls/ << -- Can find the keys which are respresented by the numbers

--========================================================--
-- CORE SYSTEM SETTINGS
--========================================================--


Config.WaterRequiredPerStage = 10 -- Water units required for a plant to grow to the next stage
Config.WaterGainPerUse       = 30 -- Water units added to a plant when watering once
Config.WaterLossPerTick      = 1 -- Water lost from each plant every health tick (see HealthTickMinutes)
Config.HealthTickMinutes     = 0.3 -- Interval (in minutes) between health/water decay checks on all plants
Config.HealthDecayPerTick    = 5 -- Amount of health lost per tick if a plant runs out of water
Config.MinPlaceDistance      = 1.2 -- Minimum distance (in meters) allowed between newly placed plants
Config.ActionDistance        = 1.2 -- Distance (in meters) at which a player can interact with a plant
Config.FertilizerGrowthBuff = 20 -- How much faster in % the plant will grow upon being fertilized


Config.WateringCanItem       = 'watering_can'
Config.FertilizerItem        = 'weed_fertilizer'
Config.SoilItem              = 'growing_soil'
Config.HarvestToolItem       = 'growing_sickle'
Config.PotItem               = 'growing_pot'

Config.ItemLabels = {
    watering_can    = "Watering Can",
    weed_fertilizer = "Fertilizer",
    growing_soil    = "Soil",
    growing_sickle  = "Harvest Sickle",
    growing_pot     = "Plant Pot"
}

Config.WaitDurations         = { -- Just the lenght of the animiations between different actions
    placeBucket    = 2000, -- Wouldnt really touch this one or it might look a bit stupid
    plantSeed      = 2000,
    fillSoil       = 3000,
    waterPlant     = 4000,
    fertilizePlant = 2000,
    harvestPlant   = 4000,
}

--==========================================================================--
--   GROW ZONE CONFIGURATION: Blockbudz & Smokeys
--==========================================================================--



Config.GrowZones             = {

    --=========================--
    --    Blockbudz Settings   --
    --=========================--
    blockbudz = {
        enabled    = true,                                   -- Set to false to disable this business
        label      = 'BlockBudz',                            -- Display label
        job        = 'blockbudz',                            -- Job name for permissions
        plants     = 20,                                     -- Max number of plants
        JobCheck   = { Enabled = true, Name = 'blockbudz' }, -- Set Enabled=true to restrict access to job

        -- Boss Management Menu (for job bosses)
        BossMenu   = {
            coords   = vec4(229.3387, -1955.1617, 23.4041, 229.2346),
            size     = vec3(1.0, 1.0, 2.0),
            distance = 1.5,
            minGrade = 4,
        },

        -- Shop Locations (Supplies & Prep)
        Shops      = {
            {
                id      = 'weed_grow_supplies_blockbudz',
                label   = 'Weed Grow Supplies',
                enabled = true, -- Toggle individual shop
                coords  = vec4(242.0649, -1966.9119, 22.1405, 140.0391),
                items   = {
                    { name = 'watering_can',    label = 'Watering Can',     price = 260, stock = 25 },
                    { name = 'weed_fertilizer', label = 'Plant Fertilizer', price = 170, stock = 50 },
                    { name = 'growing_soil',    label = 'Growing Soil',     price = 110, stock = 50 },
                    { name = 'growing_sickle',  label = 'Sickle',           price = 320, stock = 10 },
                    { name = 'growing_pot',     label = 'Growing Pot',      price = 85,  stock = 50 },
                    { name = 'skunk_seed',      label = 'Skunk Seed',       price = 210, stock = 50 },
                    { name = 'purplehaze_seed', label = 'Purple Haze Seed', price = 210, stock = 50 },
                    { name = 'whitewidow_seed', label = 'White Widow Seed', price = 210, stock = 50 },
                    { name = 'amnesia_seed',    label = 'Amnesia Seed',     price = 210, stock = 50 },
                    { name = 'ak47_seed',       label = 'AK47 Seed',        price = 210, stock = 50 },
                    { name = 'ogkush_seed',     label = 'OGKush Seed',      price = 210, stock = 50 },
                }
            },
            {
                id      = 'weed_prep_supplies_blockbudz',
                label   = 'Weed Prep Supplies',
                enabled = true,
                coords  = vec4(226.6735, -1959.0891, 22.5476, 139.8916),
                items   = {
                    { name = 'weed_paper', label = 'Rolling Paper', price = 130, stock = 30 },
                    { name = 'weed_grinder',  label = 'Grinder',       price = 130, stock = 30 },
                }
            },
        },

        -- Stash Locations (Storage)
        Stashes    = {
            {
                id            = 'blockbudz_counter',
                label         = 'Counter',
                coords        = vec4(230.4959, -1953.8402, 22.9002, 46.7748),
                size          = vec3(1.0, 1.0, 2.0),
                jobRestricted = false,
                slots         = 60,
                weight        = 300000,
            },
            {
                id            = 'blockbudz_counter2',
                label         = 'Counter',
                coords        = vec4(228.2035, -1956.4690, 22.9195, 49.4520),
                size          = vec3(1.0, 1.0, 2.0),
                jobRestricted = false,
                slots         = 60,
                weight        = 100000,
            },
            {
                id            = 'blockbudz_stash',
                label         = 'Storage',
                coords        = vec4(225.0151, -1957.3369, 22.9895, 49.8013),
                size          = vec3(1.0, 1.0, 2.0),
                jobRestricted = true,
                slots         = 100,
                weight        = 1000000,
            },
        },

        -- Drying Racks (for drying weed)
        Drying     = {
            Racks           = {
                {
                    id             = 1,
                    name           = "Blockbudz Rack",
                    target         = vector3(241.4948, -1965.0256, 22.3449),
                    shelfBases     = {
                        vector4(245.6450, -1963.2603, 24.3503, 139.4548),
                        vector4(244.9629, -1962.3115, 24.3503, 139.4548),
                        vector4(243.8193, -1962.0912, 24.3503, 139.4548),
                        vector4(243.0780, -1961.3075, 24.3503, 139.4548),
                    },
                    plantsPerShelf = 5, -- Would not touch this
                    maxPlants      = 20,-- Would not touch this
                },
            },
            PropSpacing     = 1.1, -- Would not touch this
            UI_RANGE        = 2.0, -- Would not touch this
            DriedProp       = 'bkr_prop_weed_drying_01a',
        },

        -- Processing Stations (cleaning/rolling)
        Processing = {
            Stations = {
                {
                    coords     = vec4(243.5155, -1960.4667, 22.0653, 319.2770),
                    label      = 'Process Buds',
                    categories = { 'Cleaning' },
                    anim       = { dict = 'anim@amb@business@weed@weed_sorting_seated@', clip = 'sorter_right_sort_v3_sorter02' },
                    handProp   = 'bkr_prop_weed_bud_02a',
                    tableProp  = 'bkr_prop_weed_bud_02a',
                },
                {
                    coords     = vec4(230.3163, -1952.3601, 23.3159, 319.9118),
                    label      = 'Rolling Table',
                    categories = { 'Rolling' },
                    anim       = { dict = 'anim@amb@business@weed@weed_sorting_seated@', clip = 'base_sorter_left_sorter01' },
                    handProp   = 'p_cs_joint_01',
                    tableProp  = 'p_cs_joint_02',
                },
            }
        },
    },

    --=========================--
    --     Smokeys Settings    --
    --=========================--
    smokeys = {
        enabled    = true,
        label      = 'Smokeys',
        job        = 'smokeys',
        plants     = 20,
        JobCheck   = { Enabled = false, Name = 'smokeys' }, -- Restricts access to "smokeys" job

        BossMenu   = {
            coords   = vec4(1133.3590, -990.9971, 46.6357, 277.1366),
            size     = vec3(1.0, 1.0, 2.0),
            distance = 2.5,
            minGrade = 4,
        },

        Shops      = {
            {
                id      = 'weed_grow_supplies_smokeys',
                label   = 'Weed Grow Supplies',
                enabled = true,
                coords  = vec4(1124.2236, -986.3421, 46.4918, 277.0585),
                items   = {
                    { name = 'watering_can',    label = 'Watering Can',     price = 260, stock = 25 },
                    { name = 'weed_fertilizer', label = 'Plant Fertilizer', price = 170, stock = 50 },
                    { name = 'growing_soil',    label = 'Growing Soil',     price = 110, stock = 50 },
                    { name = 'growing_sickle',  label = 'Sickle',           price = 320, stock = 10 },
                    { name = 'growing_pot',     label = 'Growing Pot',      price = 85,  stock = 50 },
                    { name = 'skunk_seed',      label = 'Skunk Seed',       price = 210, stock = 50 },
                    { name = 'purplehaze_seed', label = 'Purple Haze Seed', price = 210, stock = 50 },
                    { name = 'whitewidow_seed', label = 'White Widow Seed', price = 210, stock = 50 },
                    { name = 'amnesia_seed',    label = 'Amnesia Seed',     price = 210, stock = 50 },
                    { name = 'ak47_seed',       label = 'AK47 Seed',        price = 210, stock = 50 },
                    { name = 'ogkush_seed',     label = 'OGKush Seed',      price = 210, stock = 50 },
                }
            },
            {
                id      = 'weed_prep_supplies_smokeys',
                label   = 'Weed Prep Supplies',
                enabled = true,
                coords  = vec4(1131.1688, -987.2418, 45.4419, 17.7669),
                items   = {
                    { name = 'weed_paper', label = 'Rolling Paper', price = 130, stock = 30 },
                    { name = 'weed_grinder',  label = 'Grinder',       price = 130, stock = 30 },
                }
            },
        },

        Stashes    = {
            {
                id            = 'smokeys_stash',
                label         = 'Storage',
                coords        = vec4(1132.1068, -995.2280, 46.3391, 98.9760),
                size          = vec3(1.0, 1.0, 2.0),
                jobRestricted = true,
                slots         = 100,
                weight        = 1000000,
            },
            {
                id            = 'smokeys_counter',
                label         = 'Counter',
                coords        = vec4(1133.5796, -992.7437, 46.3118, 7.4939),
                size          = vec3(1.0, 1.0, 2.0),
                jobRestricted = false,
                slots         = 40,
                weight        = 120000,
            },
            {
                id            = 'smokeys_counter2',
                label         = 'Counter',
                coords        = vec4(1133.0480, -989.3034, 46.3118, 276.4157),
                size          = vec3(1.0, 1.0, 2.0),
                jobRestricted = false,
                slots         = 40,
                weight        = 120000,
            },
        },

        Drying     = {
            Racks           = {
                {
                    id             = 1,
                    name           = "Smokeys Main Rack",
                    target         = vector3(1121.5403, -984.8937, 46.4541),
                    shelfBases     = {
                        vector4(1123.7944, -986.0609, 48.4, 98.7038),
                        vector4(1124.2157, -984.4356, 48.4, 96.5777),
                        vector4(1123.8494, -983.1790, 48.4, 96.6172),
                        vector4(1123.6990, -981.7292, 48.4, 96.3025),
                    },
                    plantsPerShelf = 5,-- Would not touch this
                    maxPlants      = 20,-- Would not touch this
                },
            },
            PropSpacing     = 0.5, -- Would not touch this
            UI_RANGE        = 1.0, -- Would not touch this
            DriedProp       = 'bkr_prop_weed_drying_01a',
        },

        Processing = {
            Stations = {
                {
                    coords     = vec4(1124.0295, -983.6332, 46.2943, 277.7026),
                    label      = 'Process Buds',
                    categories = { 'Cleaning' },
                    anim       = { dict = 'anim@amb@business@weed@weed_sorting_seated@', clip = 'sorter_right_sort_v3_sorter02' },
                    handProp   = 'bkr_prop_weed_bud_02a',
                    tableProp  = 'bkr_prop_weed_bud_02a',
                },
                {
                    coords     = vec4(1132.8855, -987.8391, 46.4602, 278.1383),
                    label      = 'Rolling Table',
                    categories = { 'Rolling' },
                    anim       = { dict = 'anim@amb@business@weed@weed_sorting_seated@', clip = 'base_sorter_left_sorter01' },
                    handProp   = 'p_cs_joint_01',
                    tableProp  = 'p_cs_joint_02',
                },
            }
        },
    },
}

--======================================================================
--  Processing Recipes (shared by all businesses)
--======================================================================
Config.Processing            = {
    Recipes = {
        -- Cleaning
        { name = "amnesia_bud",      label = "Clean Amnesia Buds",     category = "Cleaning", duration = 5,  ingredients = { amnesia_dried = 1 },                                                                   outputs = { amnesia_bud = 5 } },
        { name = "skunk_bud",        label = "Clean Skunk Buds",       category = "Cleaning", duration = 5,  ingredients = { skunk_dried = 1 },                                                                     outputs = { skunk_bud = 5 } },
        { name = "purplehaze_bud",   label = "Clean Purple Haze Buds", category = "Cleaning", duration = 5,  ingredients = { purplehaze_dried = 1 },                                                                outputs = { purplehaze_bud = 5 } },
        { name = "ogkush_bud",       label = "Clean OGKush Buds",      category = "Cleaning", duration = 5,  ingredients = { ogkush_dried = 1 },                                                                    outputs = { ogkush_bud = 5 } },
        { name = "whitewidow_bud",   label = "Clean White Widow Buds", category = "Cleaning", duration = 5,  ingredients = { whitewidow_dried = 1 },                                                                outputs = { whitewidow_bud = 5 } },
        { name = "ak47_bud",         label = "Clean AK47 Buds",        category = "Cleaning", duration = 5,  ingredients = { ak47_dried = 1 },                                                                      outputs = { ak47_bud = 5 } },
        -- Rolling
        { name = "skunk_joint",      label = "Skunk Joint",            category = "Rolling",  duration = 10, ingredients = { skunk_bud = 2, weed_paper = 1, weed_grinder = { amount = 1, removeable = false } },      outputs = { skunk_joint = 1 } },
        { name = "amnesia_joint",    label = "Amnesia Joint",          category = "Rolling",  duration = 10, ingredients = { amnesia_bud = 2, weed_paper = 1, weed_grinder = { amount = 1, removeable = false } },    outputs = { amnesia_joint = 1 } },
        { name = "purplehaze_joint", label = "Purple Haze Joint",      category = "Rolling",  duration = 10, ingredients = { purplehaze_bud = 2, weed_paper = 1, weed_grinder = { amount = 1, removeable = false } }, outputs = { purplehaze_joint = 1 } },
        { name = "ogkush_joint",     label = "OGKush Joint",           category = "Rolling",  duration = 10, ingredients = { ogkush_bud = 2, weed_paper = 1, weed_grinder = { amount = 1, removeable = false } },     outputs = { ogkush_joint = 1 } },
        { name = "whitewidow_joint", label = "White Widow Joint",      category = "Rolling",  duration = 10, ingredients = { whitewidow_bud = 2, weed_paper = 1, weed_grinder = { amount = 1, removeable = false } }, outputs = { whitewidow_joint = 1 } },
        { name = "ak47_joint",       label = "AK47 Joint",             category = "Rolling",  duration = 10, ingredients = { ak47_bud = 2, weed_paper = 1, weed_grinder = { amount = 1, removeable = false } },       outputs = { ak47_joint = 1 } },
    }
}


--========================================================--
-- SEED TYPES & STATS
--========================================================--

-- growthTime is in MINUTES (e.g., 0.1 = 6 seconds, 1.0 = 1 minute, 2.5 = 2 minutes 30 seconds)

Config.Seeds = {
    ['skunk'] = {
        label               = 'Skunk Plant',
        seedItem            = 'skunk_seed',
        standardharvestItem = 'skunk_plant',
        harvestMin          = 1,
        harvestMax          = 1,
        growthTime          = 1.5, -- 1.5 minutes per growth stage (total 7.5 min to fully grown)
        waterLossPerStage   = 5,
    },
    ['purplehaze'] = {
        label               = 'Purple Haze Plant',
        seedItem            = 'purplehaze_seed',
        standardharvestItem = 'purplehaze_plant',
        harvestMin          = 1,
        harvestMax          = 1,
        growthTime          = 2.0, -- 2.0 minutes per growth stage (total 10 min to fully grown)
        waterLossPerStage   = 5,
    },
    ['whitewidow'] = {
        label               = 'White Widow Plant',
        seedItem            = 'whitewidow_seed',
        standardharvestItem = 'whitewidow_plant',
        harvestMin          = 1,
        harvestMax          = 1,
        growthTime          = 2.5, -- 2.5 minutes per growth stage (total 12.5 min to fully grown)
        waterLossPerStage   = 10,
    },
    ['amnesia'] = {
        label               = 'Amnesia Plant',
        seedItem            = 'amnesia_seed',
        standardharvestItem = 'amnesia_plant',
        harvestMin          = 1,
        harvestMax          = 1,
        growthTime          = 3.0, -- 3.0 minutes per growth stage (total 15 min to fully grown)
        waterLossPerStage   = 10,
    },
    ['ak47'] = {
        label               = 'AK47 Plant',
        seedItem            = 'ak47_seed',
        standardharvestItem = 'ak47_plant',
        harvestMin          = 1,
        harvestMax          = 1,
        growthTime          = 3.0, -- 3.0 minutes per growth stage (total 15 min to fully grown)
        waterLossPerStage   = 10,
    },
    ['ogkush'] = {
        label               = 'OGKush Plant',
        seedItem            = 'ogkush_seed',
        standardharvestItem = 'ogkush_plant',
        harvestMin          = 1,
        harvestMax          = 1,
        growthTime          = 3.5, -- 3.5 minutes per growth stage (total 17.5 min to fully grown)
        waterLossPerStage   = 25,
    },
    ['empty'] = { -- default fallback – do not edit
        seedItem            = nil,
        standardharvestItem = nil,
        harvestMin          = 0,
        harvestMax          = 0,
        growthTime          = 999.0,
        waterLossPerStage   = 0,
    },
}


--========================================================--
-- DRYING SYSTEM
--========================================================--

-- YOu can edit these if you want
Config.DryableItems = {
    ["skunk_plant"] = {
        label      = "Skunk",
        outputItem = "skunk_dried",
        amount     = 1, -- How many dried plants are given back upon collection
        dryTime    = 120,    -- 3 min 20 sec
    },
    ["purplehaze_plant"] = {
        label      = "Purple Haze",
        outputItem = "purplehaze_dried",
        amount     = 1,
        dryTime    = 250,    -- 4 min 10 sec
    },
    ["whitewidow_plant"] = {
        label      = "White Widow",
        outputItem = "whitewidow_dried",
        amount     = 1,
        dryTime    = 300,    -- 5 min 0 sec
    },
    ["amnesia_plant"] = {
        label      = "Amnesia",
        outputItem = "amnesia_dried",
        amount     = 1,
        dryTime    = 350,    -- 5 min 50 sec
    },
    ["ak47_plant"] = {
        label      = "AK47",
        outputItem = "ak47_dried",
        amount     = 1,
        dryTime    = 400,    -- 6 min 40 sec
    },
    ["ogkush_plant"] = {
        label      = "OGKush",
        outputItem = "ogkush_dried",
        amount     = 1,
        dryTime    = 450,    -- 7 min 30 sec
    },
}

:shopping_cart: Get it now: Purchase
:eyes: Try before you buy! Join our Showcase Server
:speech_balloon: Join our Discord for support & updates!

:arrow_double_down: MY OTHER PROJECTS
[Paid] Tuner Shop - La Mesa [MLO]
[Paid] Sandy Tavern [MLO]
[Paid] Pier 76 Car Club [MLO]
[Paid] Smokey’s Weed Shop [MLO]
[PAID] Harmony Dealership [MLO]
[PAID] Harmony Repair [MLO]
[PAID] The Town Bar & Grill [MLO]
[PAID] Jay’s Auto [MLO]


Framework Inventory Target/Interaction
:white_check_mark: QB :white_check_mark: QB Inventory :white_check_mark: 3D Text (Standalone)
:white_check_mark: QBX :white_check_mark: OX Inventory :white_check_mark: OX Target
:white_check_mark: ESX :white_check_mark: ESX Addon Inventory :white_check_mark: QB Target
Code is accessible No
Subscription-based No
Lines (approximately) 5000+
Requirements & Dependencies [Paid] Smokey’s Weed Shop [MLO] and or [Paid] Block Budz - Davis [MLO]
Support Yes
3 Likes

Very nice release, good job!

2 Likes

an amazing script would be better if it was standalone and could work and be set up with any mlo.

2 Likes

Weed System - 11/21/25

  • Joints can now be passed between players
  • QS Inventory compatibility
  • Configured some different stress systems
  • Implemented a locale to change notification text in escrowed files