Installation

Install oxide-weed, register every required item, and verify cultivation, processing, and selling.

Step-by-step setup for oxide-weed. Follow the steps in order — most issues come from skipping one.

Before You Start

oxide-weed works on QBCore, QBX, and ESX. It detects your framework automatically — there is nothing framework-specific to configure in the script itself. The only framework-side work is adding the items to your inventory (step 4).

You need these resources installed and working first:

ResourceWhat it does
ox_libProvides translations, callbacks, and UI helpers
oxmysqlConnects the server to your MySQL database
o-linkConnects weed to your framework (players, inventory, money, notifications, targeting) and runs the in-world placement tool. Version 1.9.0 or newer

If you already run other Oxide resources, you have all three. Update o-link to 1.9.0 or newer if placing plants, lamps, heaters, or equipment says it needs an updated o-link.

Installation Steps

1. Place the resource

Put the oxide-weed folder inside your server's resources folder.

2. Set the startup order

In your server.cfg, make sure the dependencies start before weed:

ensure ox_lib
ensure oxmysql
ensure o-link
ensure oxide-weed

Your framework and inventory resources should already start before o-link — if other Oxide resources work on your server, this is already correct.

3. Database

The resource creates its own database tables and adds missing columns on boot when the database user has CREATE and ALTER permissions. Normal installs and upgrades need no manual SQL. (sql/install.sql is still included if you prefer to create the tables yourself or want to see the schema.)

These are the tables it creates:

TableWhat it stores
drugs_progressionEach player's weed level, XP, and lifetime totals
drug_equipmentWeed tables, totes, water containers, drying racks, freeze dryers, and brick presses placed in the world
drug_plantsEvery growing plant — its strain, timers, water, owner, and quality
drug_lampsGrow lamps and which plant each one is helping
drug_heatersHeaters and which weed table each one is attached to
drug_drying_slotsWhat's drying where, so nothing is lost on a server restart
drug_strainsEvery strain players have created or discovered, and which are signature strains, with their reputation
weed_hosesWhich water tanks have a hose connected
weed_tentsGrow tents placed in the world, and whether each has a carbon filter
weed_carried_tanksThe water in picked-up water tanks, until each is placed again
weed_growerEach character's first-time XP bonuses and personal bests
weed_strain_masteryEach character's harvests, best quality and units sold of each strain
weed_grower_goalsEach character's daily and weekly goals and their progress
weed_grower_ranksEach character's master rank perk picks
oxide_settingsSaved resource settings

Updating from an older version with those database permissions needs no manual SQL: the resource creates the weed_hoses, weed_tents, weed_carried_tanks, weed_grower, weed_strain_mastery, weed_grower_goals and weed_grower_ranks tables, adds growth_state, tent_id, tent_slot, grower_bonus and pollen_ready_at columns to drug_plants, and adds the signature strain columns to drug_strains itself on its next start. sql/phase_7_growth.sql, sql/migrate_water_hose.sql, sql/migrate_grow_tents.sql, sql/migrate_carried_tanks.sql, sql/migrate_grower.sql, sql/migrate_pollen_regrow.sql, sql/migrate_strain_mastery.sql, sql/migrate_grower_goals.sql, sql/migrate_master_ranks.sql and sql/migrate_signature_strains.sql do the same by hand if you prefer. Each is safe to run more than once. The shared drugs_progression table is never changed.

It is safe to run oxide-weed alongside oxide-meth or oxide-cocaine — the first two tables are shared between Oxide drug resources on purpose, and each resource only creates them if they don't exist yet.

4. Add the items to your inventory

oxide-weed needs every item below to exist in your inventory with the exact spelling shown. A single typo in an item name will break that step of the pipeline.

"Must be usable" means the player can right-click/use the item from their inventory. The script handles what happens when it's used — your inventory just needs to allow it.

Growing supplies

ItemLabelMust be usable
cannabis_seedCannabis SeedYes
plant_potPlant PotNo
waterWaterNo
fertilizerFertilizerNo
watering_canWatering CanYes
growing_manualGrowing ManualYes
gelato_seed_packGelato Seed PackYes
wedding_cake_seed_packWedding Cake Seed PackYes
durban_poison_seed_packDurban Poison Seed PackYes

Equipment (all must be usable)

ItemLabel
grow_lampGrow Lamp
weed_heaterHeater
weed_tableWeed Table
storage_toteStorage Tote
water_container_smallSmall Water Container
water_container_largeLarge Water Container
water_hoseWater Hose
drying_rackDrying Rack
freeze_dryerFreeze Dryer
brick_pressBrick Press
grow_boxGrow Box
grow_tentGrow Tent
grow_tent_largeLarge Grow Tent

Add carbon_filter (Carbon Filter Kit) too. It doesn't need to be usable: players fit it from a grow tent's options.

Harvest and processing

ItemLabelMust be usable
weed_budWeed BudNo
dried_weed_budDried Weed BudNo
pruned_weed_budPruned Weed BudNo
cannabis_leafCannabis LeafNo
pollenPollenNo
trimming_scissorsTrimming ScissorsYes
baggyBaggyNo

Finished products

ItemLabelMust be usable
weed_1gWeed (1g)No
weed_eighthWeed (1/8 oz)No
weed_quarterWeed (1/4 oz)No
weed_halfWeed (1/2 oz)No
weed_ounceWeed (1 oz)No
weed_brickWeed BrickNo

Smoking

ItemLabelMust be usable
rolling_papersRolling PapersYes
cigarillo_wrapsCigarillo WrapsYes
lighterLighterNo
jointJointYes
bluntBluntYes

Watch out for these common naming mistakes:

  • the item is water, not water_bottle
  • rolling_papers is plural
  • baggy must match exactly — don't substitute another bag item

If you use qb-inventory (default QBCore), add the items to qb-core/shared/items.lua. Set useable = true on the items marked "must be usable" above. Set unique = true on watering_can, water_container_small and water_container_large: each one carries its own water, and qb-inventory merges items that aren't unique into one slot:

cannabis_seed = { name = 'cannabis_seed', label = 'Cannabis Seed', weight = 1, type = 'item', image = 'cannabis_seed.png', unique = false, useable = true, shouldClose = true, description = 'A seed ready for planting' },
gelato_seed_pack = { name = 'gelato_seed_pack', label = 'Gelato Seed Pack', weight = 50, type = 'item', image = 'gelato_seed_pack.png', unique = false, useable = true, shouldClose = true, description = 'A sealed pack of Gelato seeds. Open it to plant them' },
weed_bud = { name = 'weed_bud', label = 'Weed Bud', weight = 100, type = 'item', image = 'weed_bud.png', unique = false, useable = false, shouldClose = true, description = 'A fresh cannabis bud' },
weed_table = { name = 'weed_table', label = 'Weed Table', weight = 7000, type = 'item', image = 'weed_table.png', unique = false, useable = true, shouldClose = true, description = 'A work table for processing weed' },
water_container_small = { name = 'water_container_small', label = 'Small Water Container', weight = 3000, type = 'item', image = 'water_container_small.png', unique = true, useable = true, shouldClose = true, description = 'A small water container for storing water' },
grow_tent = { name = 'grow_tent', label = 'Grow Tent', weight = 6000, type = 'item', image = 'grow_tent.png', unique = false, useable = true, shouldClose = true, description = 'A 4x4 grow tent with a built-in light. Holds four plants' },
carbon_filter = { name = 'carbon_filter', label = 'Carbon Filter Kit', weight = 3000, type = 'item', image = 'carbon_filter.png', unique = false, useable = false, shouldClose = true, description = 'A carbon filter and inline fan for a grow tent. Cuts the smell' },
-- ...repeat for every item in the tables above

If you use ox_inventory (common on QBX and ESX), every item above is ready to paste in item images/ox_inventory_items.lua. Copy the entries between its braces into ox_inventory/data/items.lua, above that file's final closing brace. Every item is usable by default in ox_inventory, so there is nothing else to set. water is not in the file because ox_inventory already ships it.

If you use the default ESX inventory, items live in your database. Add a row to the items table for each item:

INSERT INTO `items` (`name`, `label`, `weight`) VALUES
    ('cannabis_seed', 'Cannabis Seed', 1),
    ('gelato_seed_pack', 'Gelato Seed Pack', 1),
    ('weed_bud', 'Weed Bud', 1),
    ('weed_table', 'Weed Table', 7),
    ('grow_tent', 'Grow Tent', 6);
-- ...repeat for every item in the tables above

The script registers which items are usable at startup, so there is no extra "usable" setup on ESX.

5. Copy the item images

Copy all the .png files from item images/ into your inventory's image folder:

  • qb-inventory: qb-inventory/html/images/
  • ox_inventory: ox_inventory/web/images/

The filenames already match the item names, so no renaming is needed.

One item has no image in this folder: water. Most servers already have a water item with an image — if yours doesn't, use any water bottle image you like, named water.png.

6. Review the configuration

The defaults work out of the box. To adjust anything — prices, timers, strains, store stock, NPC locations, zones — use the in-game editor: give yourself admin permission (see Admin) and run /weed settings. Changes apply immediately, are saved to the database, and survive restarts.

The files under shared/config/ only supply the factory defaults that seed the database on first start. If you'd rather pre-set values before ever starting the resource, you can edit them there first — but once the resource has started, use /weed settings (file edits no longer take effect for existing settings).

See Configuration for every setting explained and how the database-backed settings work.

Check That It Works

  1. Start the server and confirm ox_lib, oxmysql, o-link, and oxide-weed all start without errors in the console.
  2. Give yourself admin permission for the test commands (see Admin), then run /weed kit in game — you should receive a full set of seeds, supplies, and equipment.
  3. Use the cannabis seed from your inventory and plant it on open ground. Water and fertilize it when prompted.
  4. Run /weed grow to skip the growing time, then harvest the plant.
  5. Use the weed table item to place a table, put your fresh buds on it to dry, and run /weed dry to skip the drying time.
  6. Collect the dried buds, use the trimming scissors to prune them, then bag them at the table with a baggy.
  7. Visit the supply store (The Germinator — marked on the map by default) and confirm the shop opens and you can buy something.
  8. Run /weed stats and confirm your level and XP card appears.

If any step fails, see Troubleshooting.

Updating to 1.6.0

  • Add water_hose, grow_box, grow_tent, grow_tent_large, carbon_filter, gelato_seed_pack, wedding_cake_seed_pack and durban_poison_seed_pack to your inventory and copy their supplied images. Every new item except carbon_filter must be usable. The complete ox_inventory template is in item images/ox_inventory_items.lua.
  • On qb-inventory, keep watering_can, water_container_small and water_container_large unique so each keeps its own water.
  • Give the database user CREATE and ALTER permissions for the automatic table and column upgrades described above, or apply the included SQL migrations manually. Back up the database before upgrading.
  • Saved settings you customized remain. Unchanged XP defaults migrate once; old drying-rack tray settings migrate to bars, and legacy tote capacity in kilograms converts to grams. Review /weed settings after the update.
  • For package-weight selling XP, use Drug Selling 2.1.0 or newer and merge its file-only weed configuration. Signature strain price bonuses also require the optional PriceFor pricing row; see Integrations.
  • Merge new keys into custom locales. Restart the whole server after updating so the new streamed models load.

Good To Know

  • Players learn the system in game. The growing_manual item opens a full illustrated guide covering planting, genetics, drying, processing, and selling. Hand it out or sell it — players don't need out-of-game instructions.
  • Items keep their strain and quality through the whole chain. Strain data is stored on the item itself, so buds, bags, and bricks can be traded between players without losing anything.
  • The drying rack and brick press are not sold anywhere by default. They unlock at levels 3 and 8, but the store doesn't stock them out of the box — add them to the store's customItems list or sell them through your own shops.
  • Dirty money only applies to the scientist. The Germinator store always charges regular cash. What counts as "dirty money" is set under Dirty Money in /weed settings.
  • After updating, restart the whole server, not just the resource. New model files only load on a full restart; refresh and ensure oxide-weed are not enough.
  • Water containers placed before the water hose update turn into the new water tanks on the next start and keep their spot and rotation. The tap is on the tank's front, so if one ends up with its tap against a wall, pick it up and place it again. If you had changed the store list in /weed settings, the water hose is added to it once; if you had changed the water container models, add the hose to the store yourself. The bottle in the watering scene becomes the new watering can the same way, unless you had chosen your own prop.
  • Grower progression after an update: XP rewards still at their old defaults (harvest, crossbreeding, pollen, brick press, and drying and lamps, which now pay when the dried buds are collected) move to the new ones once; values you changed are kept. If you had set the freeze dryer's own use level higher than its Equipment level, the Equipment level is raised to match, once. If you had changed the strain list or the store list in /weed settings, the three premium strains and their seed packs (with a Seeds tab) are added to them once; remove them again if you don't want them. Players who grew before the update get each first-time XP bonus the next time they do that action.
  • The interface ships pre-built. There is nothing to compile.
  • Translations: all player-facing text lives in locales/en.json (a Spanish translation, es.json, is included).

Next Steps