Maps & Rewards
Everything you place on the map or hand out as a prize. All of it lives in config/config.lua, below the settings covered in Config.
Factions
Config.Jobs = {}
Config.Jobs["police"] = {
label = "LSPD",
coords = vec3(230.4153, -792.8445, 30.6156),
color = { 0, 100, 255 },
minRank = 1
}
Config.Jobs["ambulance"] = {
label = "LSMD",
coords = vec3(234.7184, -787.0085, 30.6087),
color = { 255, 100, 255 },
minRank = 1
}
Only factions listed here can take part in a gangwar. The table key is the job name exactly as your framework stores it.
| Field | Description |
|---|---|
label | Name shown in the menu, on the scoreboard and in announcements |
coords | The faction's menu point — where members open the gangwar menu. The marker from Config.Markers.menu is drawn here |
color | Faction colour as an RGB triplet, used for blips, markers and the scoreboard |
minRank | Lowest job grade allowed to start an attack. Members below it get rank_too_low and can only join |
Two factions ship as an example. Adding your own is one block each:
Config.Jobs["ballas"] = {
label = "Ballas",
coords = vec3(88.1, -1959.4, 21.1),
color = { 128, 0, 200 },
minRank = 3
}
minRank is what keeps a fresh member from starting a war on their first day — set it to the grade of your leadership ranks.
Maps
Config.Maps = {
{
label = "Windräder",
image = "windrader",
coords = vector3(2167.1680, 1970.2251, 94.9773),
radius = 800,
setup = {
[1] = {
spawn = vector4(2088.9727, 2491.3633, 90.3077, 205.5958),
vehicleSpawner = {
{ coords = vector4(2086.5449, 2461.6538, 87.2303, 217.7015), model = `buzzard2` }
}
},
[2] = {
spawn = vector4(2189.3813, 1491.7916, 83.0748, 359.1926),
vehicleSpawner = {
{ coords = vector4(2201.5806, 1460.2898, 82.7052, 4.6455), model = `buzzard2` }
}
}
}
},
…
}
| Field | Type | Description |
|---|---|---|
label | string | Name of the area in the menu |
image | string | Picture in frontend/assets/images/maps/, without the extension |
coords | vector3 | Centre of the contested area |
radius | number | Size of the area in metres. Leaving it means leaving the fight |
setup[1] / setup[2] | table | One block per side — attacker and defender |
setup[n].spawn | vector4 | Where that side spawns; the fourth value is the heading |
setup[n].vehicleSpawner | list | Vehicles handed out to that side, each with coords and model |
Seven maps are active out of the box — Windräder, East Highway, Stadt, Sandy, Paleto, Ölfelder and Route68. Another fourteen are in the file but commented out: Windräder 2, Flugzeugfriedhof, FIB HQ, Vespucci Kanäle, FIB Tanke, Route68 2, Obsa, Silo, Weinberge, Harmony, Ammoberg, Deutschlandberg, Santaberg and Alienberg. Uncommenting one is the fastest way to grow your rotation — the coordinates are already in there.
Radius and vehicles
The radius decides what kind of fight a map produces. The shipped maps run from 550 up to 1800 (East Highway), and the vehicle spawner scales with it: Windräder hands out a single helicopter per side, while East Highway gives each side 17 vehicles — a row of schafter3, a couple of komoda, a schafter6 and one buzzard2.
An empty list is fine too:
[1] = {
spawn = vector4(2368.1406, 3006.5659, 45.2550, 21.2362),
vehicleSpawner = {}
}
That gives a pure on-foot fight, which is what the smaller commented maps are set up for.
Adding a map
- Fly to the area, note the centre as
vector3and pick a radius that covers it. - Find two spawns far enough apart that neither side starts inside the other's sight line, and write them down as
vector4— the fourth value is the heading. - Place the vehicle spawn points the same way and add them to
vehicleSpawner, each with itsmodel. - Drop a picture into
frontend/assets/images/maps/and put its file name intoimage. - Restart the resource. With
Config.Debug = trueyou can see the area while you align the radius.
Points
Config.Points = {
win = 50,
loose = 25
}
Points a faction earns per fight — and both sides earn them. A loss is worth half a win, so a faction that keeps showing up still makes progress towards the shop. That is what keeps weaker factions in the rotation instead of avoiding fights.
Points are the currency for both the rewards and the upgrades below.
Rewards
Config.RewardImagesUrl = ""
Config.Rewards = {
{
label = "5x Weedpack",
points = 1000,
type = "item",
data = { "weedpack", 5 }
},
{
label = "2x Visum Upgrade",
points = 2500,
type = "item",
image = "visumup",
data = { "visumup", 2 }
},
{
label = "3x Fallschirm",
points = 3000,
type = "weapon",
data = { "GADGET_PARACHUTE", 3 }
},
}
The shop a faction spends its points in. Eight rewards ship by default.
| Field | Description |
|---|---|
label | Text on the card. Put the amount in here — it is not derived from data |
points | Price in faction points |
type | "item" for an inventory item, "weapon" for a weapon or gadget |
data | { name, amount } — the item or weapon name and how many are handed out |
image | Optional. Picture name; without it the reward uses the fallback from Config.UI.images |
Config.RewardImagesUrl is an optional base URL — set it if your reward pictures come from a CDN instead of the resource.
Keep
labelanddatain sync. They are independent: a card can say "5x Weedpack" while handing out three, and nobody notices until a player complains.
Adding one is a single block:
{
label = "1x Armor",
points = 1500,
type = "item",
data = { "armor", 1 }
},
Upgrades
-- Reihenfolge = Freischalt-Reihenfolge (Level 1 zuerst)
Config.Upgrades = {
-- Level 1: hebt das tägliche GW-Limit auf `max`
{
label = "0/5 Gangwars",
points = 1000,
max = 5
},
{
label = "10% Point Boost",
points = 2000
},
{
label = "10% Reward Rabatt",
points = 3000
},
}
Permanent unlocks a faction buys with points. The order in the list is the unlock order — a faction has to buy the first entry before the second becomes available, which the server enforces with the upgrade_previous message.
| Field | Description |
|---|---|
label | Name on the card |
points | Price in faction points |
max | Only on the first entry. Raises Config.GWLimit to this value for the faction |
The three shipped upgrades form a deliberate ladder: more fights per day, then more points per fight, then cheaper rewards. Prices rise with each step (1000 → 2000 → 3000), so keep that curve when you add a fourth.