Skip to content

Configuration

All settings are found in configs/config.lua. Map-specific settings are in configs/maps/*.lua, and logging is configured in configs/logs.lua. This page covers every configurable option in the main config file.

Debug Options

lua
DebugPrints = false,
DebugZones = false,
KeyTypeDefaultDescription
DebugPrintsbooleanfalseEnable console debug messages
DebugZonesbooleanfalseEnable visual debug for zones and target spheres

Locale

lua
Locale = "en",

Sets the language for all translations. The script loads the corresponding JSON file from locales/. Available locales: en (English), de (German). Falls back to English if the specified locale file is not found.

UI Accent Color

lua
AccentColor = "d97706",

Hex color code without the # prefix. Used for HUD elements, shop UI, and other interface components.

Examples: "d97706" (amber, default), "3b82f6" (blue), "10b981" (green), "ef4444" (red), "8b5cf6" (purple), "ec4899" (pink).

Map Selection

lua
Maps = {
    'server_farm',
    'cayo_estate',
    'doomsday_bunker',
    'gunrunning_bunker'
},

An array of map file names (without .lua extension) from configs/maps/. The script loads each map config on startup. Remove or add entries to control which maps are available.

Cooldown

lua
Cooldown = {
    enabled = true,
    duration = 60,
},
KeyTypeDefaultDescription
Cooldown.enabledbooleantrueEnable the post-game cooldown
Cooldown.durationnumber60Cooldown duration in minutes

INFO

The cooldown is tracked per-player identifier. After completing a horde game, the player must wait before starting another.

Restart Restrictions

Integration with txAdmin prevents games from running into scheduled server restarts.

lua
RestartRestrict = {
    enabled = true,
    blockNewGamesTime = 1800,
    endActiveGamesTime = 600,
},
KeyTypeDefaultDescription
RestartRestrict.enabledbooleantrueEnable restart detection and game blocking
RestartRestrict.blockNewGamesTimenumber1800Seconds before restart to block new games and ped interaction (30 min)
RestartRestrict.endActiveGamesTimenumber600Seconds before restart to force-end active/pending games (10 min)

WARNING

This feature relies on txAdmin's scheduled restart events. If you use a different restart method, this setting will have no effect.

Rejoin System

If a player disconnects during a mission, the rejoin system allows them to return.

lua
RejoinSystem = {
    enabled = true,
    allowRejoin = true,
    rejoinTimeout = 300,
    pauseOnEmpty = true,
    pauseTimeout = 120,
    resumeCountdown = 10,
    resumeEnemyDelay = 1000,
    deadPlayerTimeout = 120,
},
KeyTypeDefaultDescription
RejoinSystem.enabledbooleantrueMaster toggle for the entire rejoin system
RejoinSystem.allowRejoinbooleantrueAllow individual players to rejoin after disconnect
RejoinSystem.rejoinTimeoutnumber300Seconds a player has to rejoin (5 minutes)
RejoinSystem.pauseOnEmptybooleantruePause game instead of ending when all players disconnect
RejoinSystem.pauseTimeoutnumber120Seconds the game stays paused waiting for a rejoin (2 minutes)
RejoinSystem.resumeCountdownnumber10Seconds countdown before game resumes after rejoin
RejoinSystem.resumeEnemyDelaynumber1000Milliseconds delay before enemies resume attacking after game resumes
RejoinSystem.deadPlayerTimeoutnumber120Seconds before game ends when only dead players remain after alive players disconnect

TIP

If pauseOnEmpty is enabled and all players disconnect, the game freezes. Enemy spawning stops and the round timer pauses until at least one player reconnects or the timeout expires.

Inventory

Confiscation and Return

lua
ConfiscateInventory = true,
ManualInventoryReturn = true,
KeyTypeDefaultDescription
ConfiscateInventorybooleantrueRemove all items on entry and store them for return later
ManualInventoryReturnbooleantrueAdds a target option on the ped to manually retrieve confiscated inventory (fallback for crashes)

Inventory Restrictions

lua
InventoryRestrictions = {
    preventDrop = true,
    preventGive = true,
},
KeyTypeDefaultDescription
InventoryRestrictions.preventDropbooleantruePrevent players from dropping items during a horde game
InventoryRestrictions.preventGivebooleantruePrevent players from giving items to other players during a horde game

WARNING

Inventory restrictions only work with ox_inventory. Other inventory systems do not support external hooks for preventing drop/give actions.

Starting Loadout

lua
StartingLoadout = {
    enabled = true,
    items = {
        { name = "WEAPON_PISTOL", count = 1 },
        { name = "ammo-9", count = 200 },
        { name = "bandage", count = 10 },
        { name = "oxy", count = 10 },
        { name = "burger", count = 3 },
        { name = "water", count = 3 },
        { name = "radio", count = 1 },
    },
},
KeyTypeDefaultDescription
StartingLoadout.enabledbooleantrueWhether to give players the starting loadout on entry
StartingLoadout.itemstableSee aboveArray of { name, count } entries. Item names must match your inventory system

TIP

If ConfiscateInventory is true and StartWithLootRound is false, players would start with no items and no weapons. Enable the starting loadout or start with a loot round to avoid this.

Zone Exit Timeout

lua
ZoneExitTimeout = 3,

Seconds before a player is removed from the game when they leave the play area. Set to 0 for instant removal.

Group Settings

lua
MaxGroupMembers = 4,
FriendlyFire = false,
KeyTypeDefaultDescription
MaxGroupMembersnumber4Maximum players per group (including leader). Set to 0 for unlimited
FriendlyFirebooleanfalseWhether group members can damage each other

Revive Settings

lua
ReviveOnExit = true,

ShopRevive = {
    enabled = true,
    cost = 5000,
},
KeyTypeDefaultDescription
ReviveOnExitbooleantrueRevive players when they leave or are removed from a horde game
ShopRevive.enabledbooleantrueAllow reviving dead teammates from the shop menu
ShopRevive.costnumber5000Cost in points to revive a teammate

Radio Sync

Requires pma-voice. Players in a game are automatically assigned a shared radio channel.

lua
RadioSync = {
    enabled = true,
    useChannelPool = false,
    channelPool = { 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010 },
    useRandomChannel = true,
    randomMin = 100000,
    randomMax = 999999,
    channelOffset = 1000,
},
KeyTypeDefaultDescription
RadioSync.enabledbooleantrueEnable radio sync (requires pma-voice)
RadioSync.useChannelPoolbooleanfalseUse a predefined pool of channels
RadioSync.channelPooltable1001-1010Pool of available channels (only if useChannelPool = true)
RadioSync.useRandomChannelbooleantrueGenerate a random channel (only if useChannelPool = false)
RadioSync.randomMinnumber100000Minimum random channel value
RadioSync.randomMaxnumber999999Maximum random channel value
RadioSync.channelOffsetnumber1000Channel = gameIdCounter + offset (fallback if both pool and random are disabled)

INFO

Channel allocation priority: useChannelPool > useRandomChannel > channelOffset. The first enabled method is used.

Level System

lua
LevelSystem = {
    levels = {
        [1] = 0,       -- Starting level
        [2] = 100,
        [3] = 250,
        [4] = 450,
        [5] = 700,
        [6] = 1000,
        [7] = 1400,
        [8] = 1900,
        [9] = 2500,
        [10] = 3200,
        [11] = 4000,
        [12] = 5000,
        [13] = 6200,
        [14] = 7600,
        [15] = 9200,
        [16] = 11000,
        [17] = 13000,
        [18] = 15500,
        [19] = 18500,
        [20] = 22000,
    },
    xpRewards = {
        enemyKill = 10,
        roundComplete = 50,
        hordeComplete = 200,
        lootDeposit = 5,
    },
},

The levels table maps level numbers to cumulative XP thresholds. You can add more levels by extending the table.

XP RewardDefaultDescription
enemyKill10XP per enemy killed
roundComplete50XP per round completed
hordeComplete200XP for completing all rounds
lootDeposit5XP per loot crate deposited

Ped Configuration

The NPC that players interact with to start missions. Uses ox_lib point-based spawning.

lua
Ped = {
    enabled = true,
    model = 'g_m_y_lost_01',
    coords = vector4(705.81, -966.72, 29.41, 304.76),
    spawnDistance = 50.0,
    despawnDistance = 60.0,
    scenario = 'WORLD_HUMAN_SMOKING',
    invincible = true,
    freeze = true,
    blockEvents = true,
    target = {
        enabled = true,
        icon = 'fas fa-comments',
        label = 'Talk',
        distance = 2.5,
    }
},
KeyTypeDefaultDescription
Ped.enabledbooleantrueEnable/disable ped spawning
Ped.modelstring'g_m_y_lost_01'Ped model name
Ped.coordsvector4See aboveSpawn location (x, y, z, heading)
Ped.spawnDistancenumber50.0Distance to spawn the ped
Ped.despawnDistancenumber60.0Distance to despawn the ped (should be > spawnDistance)
Ped.scenariostring'WORLD_HUMAN_SMOKING'Ped scenario/animation (nil to disable)
Ped.invinciblebooleantrueMake ped invincible
Ped.freezebooleantrueFreeze ped in place
Ped.blockEventsbooleantrueBlock ped from reacting to events
Ped.target.enabledbooleantrueEnable target interaction on the ped
Ped.target.iconstring'fas fa-comments'Font Awesome icon for the target
Ped.target.labelstring'Talk'Target label text
Ped.target.distancenumber2.5Interaction distance

Zone Configuration

An alternative (or supplement) to the ped -- a target zone without a ped model.

lua
Zone = {
    enabled = false,
    coords = vector3(707.32, -967.67, 30.48),
    size = vector3(1.5, 1.5, 2.0),
    rotation = 0.0,
    debug = false,
    target = {
        icon = 'fas fa-skull-crossbones',
        label = 'Horde Mode',
        distance = 2.5,
    }
},
KeyTypeDefaultDescription
Zone.enabledbooleanfalseEnable the zone target
Zone.coordsvector3See aboveZone center position
Zone.sizevector31.5, 1.5, 2.0Zone dimensions (width, depth, height)
Zone.rotationnumber0.0Zone rotation in degrees
Zone.debugbooleanfalseShow debug zone outline

TIP

You can use the Ped, Zone, or both simultaneously for horde entry. Set Ped.enabled = false and Zone.enabled = true for a zone-only setup.

Round and Enemy Settings

Enemy Spawn Cap

lua
MaxAliveEnemies = 15,

Limits the number of enemies alive at once. When an enemy dies, a new one spawns if there are still enemies remaining for the round. Set to 0 or nil to disable (spawn all enemies at once). This can also be overridden per-difficulty in map configs.

Dead Body Cleanup

lua
ClearBodiesOnRoundEnd = true,
MaxDeadBodies = 10,
DeadBodyDespawnTime = 30,
KeyTypeDefaultDescription
ClearBodiesOnRoundEndbooleantrueClear dead bodies when a new round begins
MaxDeadBodiesnumber10Maximum dead bodies at once during a round (oldest removed first). 0 or nil to disable
DeadBodyDespawnTimenumber30Seconds before a dead body is automatically cleaned up. 0 or nil to disable timed cleanup

Looting and Round Flow

lua
LootingPhaseDuration = 240,
StartWithLootRound = true,
RerollCost = 200,
PerkVoteDuration = 15,
KeyTypeDefaultDescription
LootingPhaseDurationnumber240Duration of the looting phase in seconds
StartWithLootRoundbooleantrueStart with a looting phase instead of an enemy round after the intro
RerollCostnumber200Cost to reroll the shop inventory
PerkVoteDurationnumber15Seconds to vote for a perk between rounds

WARNING

If ConfiscateInventory is true and StartWithLootRound is false, players will start the first enemy round with only whatever is in the starting loadout. Enable StartWithLootRound to give players a chance to buy equipment from the shop first.

Shop Items

The default shop configuration used for all maps (maps can override this with their own shopItems table).

lua
ShopItems = {
    guaranteeAmmoForWeapons = true,
    ammoBoostMultiplier = 3,

    items = {
        itemCount = 6,
        list = { ... },
    },
    weapons = {
        itemCount = 3,
        list = { ... },
    },
    perks = {
        itemCount = 2,
        list = { ... },
    },
},
KeyTypeDefaultDescription
guaranteeAmmoForWeaponsbooleantrueAlways include matching ammo for selected weapons in the items section
ammoBoostMultipliernumber3Boost ammo chance multiplier when matching weapon is in shop (used if guarantee is off)
items.itemCountnumber6Number of items to show in the shop
weapons.itemCountnumber3Number of weapons to show in the shop
perks.itemCountnumber2Number of perks to show in the shop

Each item in a list has:

FieldTypeDescription
namestringItem spawn name (must match inventory item name)
labelstringDisplay name in the shop UI
raritystring"common", "uncommon", "rare", or "epic"
pricenumberCost in horde points
chancenumberWeighted chance to appear (higher = more likely)
quantitynumberHow many items received per purchase (default: 1)
amountnumber?How many times this item can be purchased before sold out. Omit for single purchase

Weapon Display Models

Maps weapon names to their prop models for the mystery box weapon display animation.

lua
WeaponDisplayModels = {
    ["weapon_pistol"] = "w_pi_pistol",
    ["weapon_carbinerifle"] = "w_ar_carbinerifle",
    -- ... full list in config
},
WeaponDisplayFallback = "w_pi_pistol",

If a weapon is not listed in the table, WeaponDisplayFallback is used as the display model.

Weapon Ammo Types

Maps weapons to their ammo item names. Used to link weapons to their correct ammo in shops.

lua
WeaponAmmoTypes = {
    ["weapon_pistol"] = "ammo-9",
    ["weapon_combatpistol"] = "ammo-9",
    ["weapon_assaultrifle"] = "ammo-rifle2",
    -- ... full list in config
},

Weapons not listed here (like melee weapons) will not have ammo requirements.

Carry Animation

Default carry animation for loot objects, and per-model overrides.

lua
CarryAnimation = {
    dict = 'anim@heists@box_carry@',
    anim = 'idle',
    bone = 0xEB95,
    offset = vector3(0.075, -0.15, 0.30),
    rotation = vector3(-130.0, 105.0, 0.0),
},

CarryOffsets = {
    ['prop_box_ammo01a'] = {
        offset = vector3(0.155, -0.090, 0.130),
        rotation = vector3(-110.0, 179.0, 45.0),
    },
    -- ... per-model overrides
},

Perk System (VotePerks)

The VotePerks table defines all available perks that can appear in voting and the shop. Each perk has:

FieldTypeDescription
idstringUnique perk identifier (referenced by shop perks)
iconstringIcon name from Lucide Icons (kebab-case)
benefitstringDisplay text for the positive effect
downsidestringDisplay text for the negative effect (or "NO DOWNSIDE")
effectstableArray of effect definitions applied by the perk

Available Effect Types

Player Combat Modifiers:

Effect TypeValue TypeDescription
damagenumberDamage dealt modifier (e.g., 1.0 = +100%)
incoming_damagenumberDamage taken modifier (negative = reduction)
speednumberMovement speed modifier
armornumberFlat armor value
heal_on_killnumberHP restored per kill
ammo_on_killnumberAmmo gained per kill
headshot_damagenumberHeadshot damage multiplier
bodyshot_damagenumberBody damage modifier (negative = reduction)
regen_per_secondnumberHP regenerated per second

Currency/Rewards:

Effect TypeValue TypeDescription
loot_valuenumberLoot value multiplier
pointsnumberPoints earned multiplier
currencynumberAll currency earned multiplier
headshot_currencynumberBonus currency for headshot kills
kill_currencynumberFlat bonus currency per kill
shop_discountnumberShop price reduction (e.g., 0.25 = -25%)

Enemy Modifiers (debuffs):

Effect TypeValue TypeDescription
enemy_speednumberEnemy speed increase
enemy_healthnumberEnemy health increase
enemy_damagenumberEnemy damage increase
enemy_armornumberEnemy armor increase
enemy_accuracynumberEnemy accuracy increase

Boolean Toggles:

Effect TypeDescription
infinite_ammoInfinite ammo
no_health_regenDisable natural health regen
one_hit_killPlayer dies in one hit
explosive_roundsBullets cause explosions
thermite_roundsEnemies burn on hit
no_armorCannot have armor
last_standSurvive one fatal hit
super_jumpSuper jump (very high)
jump_heightJump height modifier (number, e.g., 0.5 = +50%)

Special Effects:

Effect TypeDescription
berserkerDamage per kill (stacks), resets on hit. Supports maxStacks
adrenalineSpeed bonus below HP threshold. Supports threshold
rage_modeDamage per 10% HP lost
gamblerRandom bonuses/penalties

Default Perks

The config includes 20+ perks spanning damage, defense, mobility, utility, risk/reward, currency, and enemy modifier categories. Two additional perks (explosive_rounds and thermite_rounds) are commented out by default due to potential issues with certain weapons.

Player Statistics

lua
Stats = {
    enabled = true,
    showGamesPlayed = true,
    showSoloGames = true,
    showGroupGames = true,
    showPlayTime = true,
    showKills = true,
    showRoundsCleared = true,
    showHordesCompleted = true,
    showDamageDealt = true,
    showDamageTaken = true,
    showCoinsEarned = true,
    showCoinsSpent = true,
    showLootDeposited = true,
},
KeyTypeDefaultDescription
Stats.enabledbooleantrueMaster toggle -- if false, stats option is hidden from ped menu entirely
Stats.show*booleantrueToggle individual stat categories

End Game Loot

End game loot is configured per-map and optionally per-difficulty. A fallback can be defined in the main config (commented out by default). Priority order:

  1. Per-difficulty endGameLoot (in difficulty config)
  2. Map-level endGameLoot (in map config)
  3. Main config EndGameLoot (fallback, commented out by default)

Each end game loot config has:

KeyTypeDescription
rerollCostnumberCost to reroll the loot shop items
itemCountnumberNumber of items shown at once
durationnumberSeconds before the game fully ends (countdown)
lootTabletableArray of loot items with name, label, rarity, price, chance, quantity

Logging Configuration

Logging is configured in configs/logs.lua. See the file for full documentation on all 20+ log events.

lua
logs = {
    service = 'none',  -- 'discord', 'fivemanage', 'fivemerr', 'loki', 'grafana', or 'none'
    screenshots = false,
    discord = { ... },
    fivemanage = { ... },
    loki = { ... },
    grafana = { ... },
    events = { ... },
}
ServiceDescription
'discord'Discord webhook with rich embeds
'fivemanage'Fivemanage dashboard
'fivemerr'Fivemerr (fm-logs)
'loki'Loki/Prometheus stack
'grafana'Grafana Cloud
'none'Disable all logging

Each event in the events table can be individually enabled/disabled and customized with title, description, color, and fields using placeholders like {player}, {map}, {gameId}, etc.

Map-Specific Configuration

See the individual map pages and Creating Maps for details on per-map settings including:

  • Difficulty tiers with round counts, enemy configuration, and boss fights
  • Map-specific shop items (override the global shop)
  • Map-specific end game loot tables
  • Requirements (level, completed maps, items)
  • Mystery box configuration
  • Loot objects and spawn locations

Map pages: