> For the complete documentation index, see [llms.txt](https://docs.tworst.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tworst.com/scripts/garbage-job/configuration.md).

# Configuration

{% hint style="success" %}
**Your settings survive updates.** In 3.0 every value you change is saved by tw-lib in the database (`tw_lib_settings`). When you install an update, tw-lib writes your values back into the new config file. You never have to back up or merge a config again.
{% endhint %}

***

## Three Ways to Change a Setting

| Way                                                        | Best for                                                                                                                                                                               |
| ---------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **In game: `/twlib` → Settings**                           | Pay, XP, bonus, cooldown, crew size, level rules, reward split, interaction style. Saved values apply when the job restarts: use the **Restart** button in the menu.                   |
| **Edit `defaults/config.lua` / `defaults/coordinate.lua`** | Everything else. Save the file and restart `tw-garbagev2`: tw-lib notices your edit and stores it.                                                                                     |
| **Server console: `twlib set`**                            | Quick changes without opening a file: `twlib set tw-garbagev2 Config.MaxPlayersInLobby 3`, then `restart tw-garbagev2`. Undo with `twlib unset tw-garbagev2 Config.MaxPlayersInLobby`. |

{% hint style="info" %}
After tw-lib stores a value, the line in the config file shows the shipped default next to it, for example `Config.MaxPlayersInLobby = 3 --[[twlib:4]]`. That marker is how tw-lib tells your value from ours. Leave it there.
{% endhint %}

***

## Configuration Files

| File                      | What is inside                                                                                                                   |
| ------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `defaults/config.lua`     | General settings, lobby, commands, UI colours, truck plate, outlines, regions & rewards, daily missions, tutorial videos, levels |
| `defaults/coordinate.lua` | Dumpster spots of every region, props, the recycling plant                                                                       |
| `defaults/locales/*.lua`  | Texts in 7 languages                                                                                                             |
| `hooks/*.lua`             | Your own functions (start/end hooks, notifications)                                                                              |

{% hint style="info" %}
There is no `Config.Framework`, `Config.Inventory` or `Config.SQL` anymore: tw-lib detects them. The old key, fuel and skin functions are gone too; `Config.Vehiclekey`, `Config.Removekeys` and `Config.ChangeClothesSystem` still switch those features off.
{% endhint %}

***

## General

```lua
Config.Locale             = TwLibLocale or 'en' -- Language: en, tr, de, fr, pt, ru, ar
Config.CurrencyUnit       = '$'
Config.ServerName         = "TWORST"            -- Max 10 characters
Config.MoneyType2         = "bank"              -- Reward account: 'bank' or 'cash'
```

### Language

Default is English. To change it, run `twlib set tw-garbagev2 Config.Locale tr` in the server console and restart the job, or change `'en'` in the `Config.Locale` line and restart the job. Both are kept across updates.

***

## Interaction

```lua
Config.InteractionHandler  = 'default' -- 'default' | 'drawtext' | 'ox-target' | 'qb-target' | 'auto'
Config.DrawTextUI          = 'twlib'   -- 'twlib' (Tworst prompt) | '3dtext'
Config.InteractionKeyColor = "~g~"
```

| Value                         | Meaning                                                                                                                          |
| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `'default'`                   | Use the choice made once for **all** Tworst jobs in `/twlib` → Settings → All jobs (or `twlib set tw-lib interaction ox-target`) |
| `'drawtext'`                  | Tworst prompt with **E**                                                                                                         |
| `'ox-target'` / `'qb-target'` | Target eye                                                                                                                       |
| `'auto'`                      | ox\_target if running, else qb-target, else the Tworst prompt                                                                    |

### Outlines

```lua
Config.TrashVisuals = {
    enableOutline = true,
    viewDistance  = 30.0,                              -- Metres
    outlineColor  = { r = 255, g = 255, b = 255, a = 255 },
}
```

Trash and dumpsters near the player get an outline. Change the colour to match your server's theme.

***

## Lobby & Job

```lua
Config.MaxPlayersInLobby     = 4     -- Crew size
Config.LetOwnerSplitRewards  = true  -- The owner sets each member's share of the money reward
Config.jobCoolDownHours      = 0     -- Hours before the same player can work again (0 = none); every crew member counts
Config.jobLevelCheck         = false -- true: everyone in the lobby needs the region's level
Config.ChangeClothesSystem   = true  -- Job uniform on start; the player's own clothes come back at the end
Config.Vehiclekey            = true  -- Give keys for the truck
Config.Removekeys            = true  -- Take them back at the end
Config.EnableConvertDumpster = true  -- false: skip the recycling task
Config.Debug                 = false
```

### Who Can Take the Job

```lua
Config.Job = {
    ['job'] = 'all', -- 'all', a job name ('garbage') or a list ({ 'garbage', 'unemployed' })
    ...
}
```

The job rule is checked on the server when a lobby is opened **and** when an invite is accepted. On frameworks without jobs (standalone, vRP, TMC) everyone can join.

### Commands

```lua
Config.Command = {
    jobReset     = "jobresetgarbage",
    jobLeave     = "jobleavegarbage",
    openTutorial = "openTutorialgarbage",
}
```

### Vehicle Plate

```lua
Config.VehiclePlate = {
    enabled = true,        -- false = GTA's random plate
    format  = "GARB %03d", -- %03d = job number, zero-padded (001, 002...)
    static  = nil,         -- A fixed plate, e.g. "N 21 WST"; overrides format
}
```

The plate is set before keys, fuel and interactions, so key scripts give the right key.

***

## Job Menu Look

The job menu is the shared Tworst job UI inside tw-lib. Garbage's colours and pictures:

```lua
Config.UI = {
    primary            = 'rgb(69, 148, 62)',         -- Accent: buttons, titles, bars
    primaryHover       = 'rgb(41, 84, 37)',
    primaryTransparent = 'rgba(130, 189, 125, 0.1)',
    background         = 'rgba(20, 30, 21, 0.94)',
    titleBg            = 'rgba(28, 39, 29, 1)',
    titleFont          = 'Nature',
    logo               = 'img/newLogo.png',          -- Path inside html/ or an https:// link
    scoreIcon          = 'img/teamScoreImg.png',
    regionImage        = 'img/region.png',
    scriptName         = 'Garbage',
}
```

`Config.DefaultUIPositions` sets where the crew list, score, invite and notification boxes sit on screen. Players can also move them in game.

***

## Job Location & Blips

```lua
Config.Job = {
    ['coords'] = {
        ['intreactionCoords'] = vector3(-324.13, -1533.45, 27.57),
        ['ped'] = true,
        ['pedCoords'] = vector3(-324.13, -1533.45, 27.57),
        ['pedHeading'] = 349.59,
        ['pedHash'] = 0x49EA5685,
    },
    ['blip'] = { show = true, ... },
    ...
}
```

`['missionBlips']` holds the blips of each task type, the truck and the delivery point.

***

## Regions & Rewards

```lua
['regionData'] = {
    {
        regionID = 1,
        regionInfo = {
            regionName = "Los Santos",
            regionImage = "region.png",
            regionMinimumLevel = 0,
        },
        regionAwards = {
            money = 5000,             -- Paid to the crew at the end
            xp = 1000,
            onlineJobExtraAwards = 2, -- Multiplier per extra crew member
            bonusExtraMoney = 500,    -- Bonus task pay
            bonusExtraXP = 200,
        },
        missioncompletedItems = { giveItemPlayer = false, dropMode = "weightedPool", itemList = { ... } },
        regionJobVehicle = { vehicle = "tolgartur" },
        regionJobTask = {
            { jobName = "dumpsterClean",   missionCount = { minAmount = 2, maxAmount = 2 } },
            { jobName = "bagClean",        missionCount = { minAmount = 3, maxAmount = 3 } },
            { jobName = "trashCollect",    missionCount = { minAmount = 2, maxAmount = 2 } },
            { jobName = "convertDumpster", missionCount = { minAmount = 1, maxAmount = 1 } },
        },
    },
},
```

| Region | Name       | Min. level | Money  | XP    |
| ------ | ---------- | ---------- | ------ | ----- |
| 1      | Los Santos | 0          | $5,000 | 1,000 |
| 2      | Davis      | 2          | $5,000 | 1,000 |
| 3      | Vinewood   | 5          | $5,000 | 1,000 |

`missionCount` sets how many of each task a region can roll. The dumpster spots are in `defaults/coordinate.lua` under `Config.Coordinate`, and the recycling plant under `Config.MachineCoords`.

{% hint style="info" %}
Your changes to a region are saved against its `regionID`. If a later update adds, moves or reorders regions, your money and XP stay with the right region. Keep `regionID` values unique and do not reuse them.
{% endhint %}

### Reward Split

With `Config.LetOwnerSplitRewards = true` the lobby owner sets each member's share in the lobby menu: the crew's total (the reward per player × the members online at the payout) is shared by those percentages. With `false` every member gets the same reward.

### Mission Completion Items

`missioncompletedItems` gives extra items at the end of a region. `dropMode = "perItem"` rolls each item on its own; `"weightedPool"` gives one item from the pool.

***

## Daily Missions

```lua
['dailyMission'] = {
    { name = 'jobtask_one',   xp = 2500, money = 1000, ... },
    { name = 'jobtask_two',   xp = 1000, money = 3000, ... },
    { name = 'jobtask_three', xp = 2000, money = 3000, ... },
    { name = 'jobtask_four',  xp = 2000, money = 3000, ... },
},
```

{% hint style="info" %}
Changes to a daily mission are saved against its `name`. Keep the names unique.
{% endhint %}

***

## Tutorial

`Config.TutorialList` holds the tutorial videos. Players open them with `/openTutorialgarbage`. Replace a video's `name` with your own link to show your own tutorial.

***

## Levels

`Config.RequiredXP` holds the XP needed for each of the 70 levels. XP above the requirement carries over to the next level.

***

## Texts

All texts are in `defaults/locales/<language>.lua`. Edit the file and restart the job: tw-lib keeps your edited texts across updates like any other setting. A text missing in a language falls back to English.

***

## Hooks

Functions cannot be stored in the database, so they live in `hooks/`. Copy `hooks/hooks.example.lua` to `hooks/my-hooks.lua` and edit it there. An update replaces only the example; your file is never touched, and it is loaded after the settings, so it wins.

```lua
-- Runs for every player in the lobby before the job starts. Return false to stop that player.
Config.startJobFunction = function(source, owneridentifier)
    local job = exports['tw-lib']:GetPlayerJob(source) -- { name, label, grade }; nil on standalone / vRP / TMC
    return job ~= nil and job.name == 'garbage'
end

-- Runs for every player when the job is finished.
Config.endJobFunction = function(source, owneridentifier, scoreAmount)
end

-- Your own notification system.
Config.sendNotification = function(messageData)
    local text = type(messageData) == 'table' and messageData.text or messageData
    exports['my-notify']:Send(text)
end
```

***

## Need Help?

{% hint style="info" %}
Join our [Discord](https://discord.gg/tworst) and open a ticket.
{% endhint %}
