> 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/getting-started-installation/scripts/electrician-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-electrician`: tw-lib notices your edit and stores it.                                                                                         |
| **Server console: `twlib set`**                            | Quick changes without opening a file: `twlib set tw-electrician Config.MaxPlayersInLobby 3`, then `restart tw-electrician`. Undo with `twlib unset tw-electrician 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, regions & rewards, daily missions, tutorial videos, truck lift, levels |
| `defaults/coordinate.lua` | Work spots of every region (transformers, boards, lamps, traffic lights, poles)                                       |
| `defaults/locales/*.lua`  | Texts in 7 languages                                                                                                  |
| `hooks/*.lua`             | Your own functions (start/end hooks, notifications, prompts)                                                          |

{% 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-electrician 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" | "3dtext" | "qb" | "esx" | "ox_lib" | "custom"
Config.DrawTextPosition   = "right-center" -- "left-center" | "right-center" | "top-center"
Config.InteractionKeyColor = "~g~"
```

| `Config.InteractionHandler`   | 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                                                                    |

`Config.DrawTextUI` decides what draws the "\[E] - Fix transformer" prompts:

| `Config.DrawTextUI` | Prompt                                                                                      |
| ------------------- | ------------------------------------------------------------------------------------------- |
| `"twlib"`           | The shared Tworst prompt from tw-lib (default, same look in every Tworst job)               |
| `"3dtext"`          | The job's own 3D text in the world                                                          |
| `"qb"`              | qb-core DrawText                                                                            |
| `"esx"`             | GTA help notification (top left)                                                            |
| `"ox_lib"`          | ox\_lib TextUI. ox\_lib must be started on your server                                      |
| `"custom"`          | Your own functions: `Config.CustomDrawText` / `Config.CustomHideText` (see [Hooks](#hooks)) |

Anything other than `"3dtext"` shows one prompt on screen: when several points are in range, the closest one wins. `Config.DrawTextPosition` is used by `"ox_lib"` and `"qb"`.

***

## 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.Debug                = false
```

### Who Can Take the Job

```lua
Config.Job = {
    ['job'] = 'all',              -- 'all', a job name ('mechanic') or a list ({ 'mechanic', 'police' })
    ['removePlayerHealt'] = 15,   -- Health taken when a repair minigame fails
    ...
}
```

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     = "jobresetelectrician",
    jobLeave     = "jobleaveelectrician",
    openTutorial = "openTutorialelectrician",
}
```

### Invite Keys

```lua
Config.Keys = {
    inviteAccept  = 246, -- Y
    inviteDecline = 306, -- CTRL
}
```

### Truck Lift

```lua
Config.ControlLift = {
    up   = 172, -- Arrow up
    down = 173, -- Arrow down
}
```

***

## Job Menu Look

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

```lua
Config.UI = {
    primary            = 'rgb(125, 139, 189)',       -- Accent: buttons, titles, bars
    primaryHover       = 'rgb(61, 95, 139)',
    primaryTransparent = 'rgba(125, 157, 189, 0.1)',
    background         = 'rgba(19, 34, 41, 0.94)',
    titleBg            = 'rgba(26, 43, 51, 1)',
    titleFont          = 'Nature',
    logo               = 'img/newLogo.png',          -- Path inside html/ or an https:// link
    scoreIcon          = 'img/teamScoreImg.png',
    regionImage        = 'img/region.png',
    scriptName         = 'Electrician',
}
```

`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(528.77, -1603.26, 29.34),
        ['ped'] = true,
        ['pedCoords'] = vector3(528.77, -1603.26, 29.34),
        ['pedHeading'] = 46.59,
        ['pedHash'] = 0x49EA5685,
    },
    ['blip'] = { show = true, blipType = 643, blipColor = 3, blipScale = 0.9 },
    ...
}
```

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

***

## Regions & Rewards

```lua
['regionData'] = {
    {
        regionID = 1,
        regionInfo = {
            regionName = "Alta",
            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 = "utillitruck2", vehicle2 = 'utillitruck3' },
        vehicleSpawnCoords = {
            vehicleCoords  = vector4(528.24, -1590.85, 29.28, 139.91),
            vehicleCoords2 = vector4(516.8, -1604.03, 29.3, 319.85),
        },
        regionJobTask = {
            { id = 1, jobName = "fixTrafo",       missionCount = { minAmount = 1, maxAmount = 2 } },
            { id = 2, jobName = "fixHouseBoard",  missionCount = { minAmount = 2, maxAmount = 4 } },
            { id = 3, jobName = "fixStreetLamp",  missionCount = { minAmount = 1, maxAmount = 4 } },
            { id = 4, jobName = "fixTrafficLamp", missionCount = { minAmount = 1, maxAmount = 1 } },
            { id = 5, jobName = "phonePole",      missionCount = { minAmount = 1, maxAmount = 2 } },
        },
    },
},
```

The six regions (Alta, El Burro Heights, Vespucci, Rockford Hills, Strawberry, Mirror Park) all pay $5,000 and 1,000 XP by default. `missionCount` sets how many of each task a region can roll. The work spots themselves are in `defaults/coordinate.lua` under `Config.Coordinate[regionID]`.

{% 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',   count = 50,    xp = 2500, money = 1000 },
    { name = 'jobtask_two',   count = 10,    xp = 1000, money = 3000 },
    { name = 'jobtask_three', count = 10000, xp = 2000, money = 3000 },
    { name = 'jobtask_four',  count = 20,    xp = 2000, money = 3000 },
},
```

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

***

## Tutorial

```lua
Config.TutorialList = {
    { id = 1, title = ..., description = ..., name = 'https://r2.fivemanage.com/.../Electrician1.mp4' },
    -- ... 5 videos
}
```

Players open it with `/openTutorialelectrician`. Replace a `name` with your own video 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 == 'mechanic'
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

-- Your own prompt when Config.DrawTextUI = "custom".
-- Called once when a prompt appears (and again only if its text changes), never every frame.
-- text has no "[E] - " prefix; key is "E" or nil for an info-only prompt.
Config.CustomDrawText = function(text, key, position)
    exports['my-textui']:Show(text, key)
end
Config.CustomHideText = function()
    exports['my-textui']:Hide()
end
```

***

## Need Help?

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