Z-Project [WIP] https://stgscripts.com
A set of resources for a zombie survival server. Loot, needs, infection, a sense-based zombie AI, a camp/placement system, skills, gunplay and the HUD that ties it together. Everything runs on QBCore and Qbox without code changes — the framework and the inventory are detected at runtime.
| Resource | What it does |
|---|---|
art-corez |
Survival core — searchable prop looting, needs (stomach/thirst/hygiene/stress), reading books for skill XP |
art-zombie |
The zombie system — sense-based AI (sight/hearing), infection, corpse looting |
art-essentials |
Camp/placement — tents, campfires, chairs, sleeping bags, cooking, plus the smaller world tweaks |
art-character |
Skills and knowledge menu (XP, levels, exercise) |
art-hudz |
Status HUD |
art-notify |
Notifications |
art-gunplay |
Camera-based aim sway, recoil and suppression effects |
art-dismemberment |
Gore / limb damage |
art-trader |
NPC that swaps zombie loot for rarer items through a dialogue |
stg_lib |
Framework bridge the others depend on |
ox_liboxmysqlox_targetPolyZoneqb-coreorqbx_coreqb-inventoryorox_inventory
- Drop the
[artz]folder into your resources. - Import the SQL files once (they create their own tables):
art-character/art-character.sqlart-essentials/art_essentials.sqlart-trader/art_trader.sqlart-zombie/art-zombie.sql
- Make sure
stg_libstarts before theart-*resources, and the inventory before them too. Easiest is to ensure the categories in order:ensure qbx_core # or qb-core ensure [artz] ensure [ox] - Set the language:
setr ox:locale "en" # or "tr"
Locales live in each resource under locales/ (en.json is the base, tr.json
overrides it). If a string shows up in English while your locale is tr, it just
isn't translated yet — copy the key over.
The resources never register items themselves. An item has to exist in your inventory's own item list first, then you reference its name in a config. Where the item list lives depends on which inventory you run.
qb-inventory — add it to qb-core/shared/items.lua:
['raw_meat'] = { name = 'raw_meat', label = 'Raw Meat', weight = 200, type = 'item', image = 'raw_meat.png', unique = false, useable = true, shouldClose = true, description = '' },ox_inventory — add it to ox_inventory/data/items.lua:
['raw_meat'] = {
label = 'Raw Meat',
weight = 200,
},Put a name.png next to your inventory's other item images:
- ox_inventory →
ox_inventory/web/images/ - qb-inventory →
qb-inventory/html/images/
Loot tables — art-corez/shared/config.lua (world props) and
art-zombie/shared/config.lua (corpses). Each entry is one line:
{ Item = 'raw_meat', Min = 1, Max = 2, Chance = 20 },Chance is a percent. Min/Max is how many drop when it hits.
Camp items — art-essentials/shared/config.lua, under Config.Props. The item
field is the inventory item that places the prop.
That's the whole loop: define the item → add the image → reference its name in a config. Restart the inventory and the resource you edited and it's in.
stg_lib is set to auto, so it picks QBCore or Qbox on its own — you don't configure
anything. The loot/stash code goes through a small bridge that talks to whichever
inventory is running, so qb-inventory and ox_inventory both work.