sliders-simpleConfig

Config = {}

-- ════════════════════════════════════════════════════════════════════════════════
-- CORE SETTINGS
-- ════════════════════════════════════════════════════════════════════════════════

Config.targetResource = "ox_target" -- Interaction system: "ox_target" or "qb-target"

Config.enableLoot = true             -- Enable zombie loot drops (set to false to disable all loot)
Config.lootMode = "instant"         -- Loot pickup mode:
--   "instant"  = item goes directly into inventory
--   "interact" = requires interacting with zombie body

Config.lootObjectModel = "prop_money_bag_01" -- Object model for loot drops (only used in "interact" mode)

Config.enableJacking = false                 -- Allow zombies to pull players out of vehicles
Config.canRagdoll = true                     -- Allow zombies to enter ragdoll state
Config.replaceGasParticle = true             -- Replace gas particle with custom particle
Config.disableWeaponWhip = true              -- Disable weapon whip
Config.zombiesBlips = true                   -- Enable blips for zombies on the minimap
Config.playerAffectRadiusBlip = true         -- Enable an circle overlay showing the radius in which player is detected by zombies

Config.debug = true                          -- Enable debug mode: on-screen overlay (location, zombie counts, player state, config),
-- ox_lib zone boundary visualization, and verbose console logging
-- (spawn/despawn events, aggro triggers, zone enter/exit)

Config.gameBucket = 0 -- Routing bucket for zombie spawns (must match the bucket your players are in)

-- ════════════════════════════════════════════════════════════════════════════════
-- COMBAT LIMITS
-- Controls how many zombies can attack the player simultaneously
-- ════════════════════════════════════════════════════════════════════════════════

Config.combatLimits = {
    primaryCount = 6,        -- Max zombies performing melee attacks at once
    secondaryCount = 4,      -- Max zombies surrounding/taunting the player
    populationPedCount = 10, -- Max ambient NPCs that may join combat
}

-- ════════════════════════════════════════════════════════════════════════════════
-- SPAWN SETTINGS
-- Night time multiplier and zone archetype system
-- ════════════════════════════════════════════════════════════════════════════════

Config.nightTimeSpawnMultiplier = 1.15 -- Spawn count multiplied by this during night time (stacks with zone multiplier)
Config.nightTime = {                   -- Define night time hours for spawn multiplier (game time, not real time)
    beginHour = 21,
    beginMinute = 0,
    endHour = 5,
    endMinute = 0
}

Config.defaultArchetype = "urban" -- Fallback archetype for GTA zones not listed in Config.zoneMapping
Config.affectDangerZones = false -- If true, zone archetype multipliers also apply inside danger zones

-- ════════════════════════════════════════════════════════════════════════════════
-- ZONE ARCHETYPES
-- Define spawn profiles by environment type instead of per-zone.
-- Each archetype controls: spawn multiplier, type distribution, loot table,
-- and default zombie model pool (defaultZombieModels).
--
-- NOTE: spawnChances values are WEIGHTS, not percentages - they do NOT need to
-- sum to 100. The system sums all weights and picks proportionally.
-- Example: { ["default"] = 70, ["tank"] = 10 } means 87.5% default, 12.5% tank.
-- ════════════════════════════════════════════════════════════════════════════════

Config.zoneArchetypes = {
    --[[
        Military / Secure Facilities
        Fort Zancudo, Humane Labs, N.O.O.S.E, Bolingbroke Penitentiary.
    ]]
    military = {
        multiplier = 1.4,
        spawnChances = {
            ["default"]    = 58,
            ["tank"]       = 10,
            ["juggernaut"] = 10,
            ["exploder"]   = 10,
            ["skeleton"]   = 6,
            ["splitter"]   = 6,
        },
        lootTable = "military",
        defaultZombieModels = { "s_m_y_blackops_02", "s_m_y_blackops_03", "s_m_y_marine_01", "s_m_y_marine_02", "s_m_y_marine_03", "csb_ramp_marine", "csb_mweather" },
    },

    --[[
        Prison / Correctional Facilities
        Bolingbroke Penitentiary.
    ]]
    prison = {
        multiplier = 1.2,
        spawnChances = {
            ["default"]  = 82,
            ["tank"]     = 12,
            ["exploder"] = 6,
        },
        lootTable = "default",
        defaultZombieModels = { "s_m_m_prisguard_01", "s_m_y_prismuscl_01", "s_m_y_prisoner_01", "s_m_y_ranger_01", "ig_rashcosvki", "u_m_y_prisoner_01" },
    },

    --[[
        Industrial / Port Zones
        Airports, power stations, ports, container yards.
    ]]
    industrial = {
        multiplier = 1.2,
        spawnChances = {
            ["default"]  = 82,
            ["screamer"] = 8,
            ["exploder"] = 6,
            ["tank"]     = 4,
        },
        lootTable = "industrial",
        defaultZombieModels = { "G_M_M_Zombie_01", "G_M_M_Zombie_05", "u_m_y_corpse_01", "ig_gustavo_02", "u_m_y_zombie_01" },
    },

    --[[
        Downtown / City Center
        Pillbox Hill, Legion Square, Mission Row, Downtown.
    ]]
    downtown = {
        multiplier = 1.2,
        spawnChances = {
            ["default"]  = 88,
            ["screamer"] = 8,
            ["splitter"] = 2,
            ["tank"]     = 2,
        },
        lootTable = "downtown",
        defaultZombieModels = { "IG_Zombie_DJ_01", "u_f_y_corpse_01", "u_f_y_corpse_02", "u_f_m_corpse_01", "u_m_y_corpse_01", "u_m_o_tramp_01", "a_f_m_tramp_01", "a_f_m_trampbeac_01", "a_m_m_tramp_01", "a_m_m_trampbeac_01", "a_m_o_tramp_01", "u_m_y_zombie_01", "g_m_m_zombie_05", "G_M_M_Zombie_01", "u_m_o_filmnoir", "u_m_m_prolsec_01" },
    },

    --[[
        Urban / City Neighborhoods
        Residential and commercial districts across Los Santos.
    ]]
    urban = {
        multiplier = 1.0,
        spawnChances = {
            ["default"]  = 86,
            ["screamer"] = 8,
            ["exploder"] = 2,
            ["summoner"] = 2,
            ["tank"]     = 2,
        },
        lootTable = "default",
        defaultZombieModels = { "IG_Zombie_DJ_01", "u_f_y_corpse_01", "u_f_y_corpse_02", "u_f_m_corpse_01", "u_m_y_corpse_01", "u_m_o_tramp_01", "a_f_m_tramp_01", "a_f_m_trampbeac_01", "a_m_m_tramp_01", "a_m_m_trampbeac_01", "a_m_o_tramp_01", "u_m_y_zombie_01", "g_m_m_zombie_05", "G_M_M_Zombie_01", "u_m_o_filmnoir", "u_m_m_prolsec_01" },
    },

    --[[
        Suburban / Coastal
        Beach areas, quieter neighborhoods, golf courses, bluffs.
    ]]
    suburban = {
        multiplier = 1.0,
        spawnChances = {
            ["default"]  = 91,
            ["screamer"] = 5,
            ["exploder"] = 2,
            ["skeleton"] = 2,
        },
        lootTable = "default",
        defaultZombieModels = { "a_f_y_runner_01", "a_m_y_runner_01", "a_m_y_golfer_01", "a_f_y_golfer_01", "a_m_y_yoga_01", "a_f_y_hipster_01", "a_m_y_hipster_01", "a_f_m_fatwhite_01", "a_m_m_socenlat_01", "a_f_y_bevhills_01", "a_m_y_bevhills_01", "u_f_y_corpse_01", "u_f_m_corpse_01", "u_m_y_corpse_01", "G_M_M_Zombie_01" },
    },

    --[[
        Coastal / Beach
        Vespucci Beach, Del Perro Beach, Procopio Beach.
    ]]
    coastal = {
        multiplier = 1.0,
        spawnChances = {
            ["default"]  = 93,
            ["screamer"] = 5,
            ["animal"] = 5
        },
        lootTable = "default",
        defaultZombieModels = { "a_m_o_beach_01", "a_m_y_beach_01", "a_m_y_beach_02", "a_f_y_beach_01", "a_f_m_beach_01", "a_f_y_runner_01", "a_m_y_runner_01", "a_m_y_runner_02", "ig_gustavo_02", "u_f_y_corpse_01", "u_m_y_corpse_01" },
    },

    --[[
        Small Town
        Paleto Bay, Sandy Shores, Grapeseed.
    ]]
    small_town = {
        multiplier = 1.0,
        spawnChances = {
            ["default"]  = 84,
            ["animal"]   = 5,
            ["screamer"] = 5,
            ["skeleton"] = 2,
            ["trainer"]  = 2,
            ["exploder"] = 2,
        },
        lootTable = "default",
        defaultZombieModels = { "a_m_m_hillbilly_01", "a_m_m_hillbilly_02", "a_m_m_rurmeth_01", "cs_old_man1a", "cs_old_man2", "u_m_o_tramp_01", "u_m_y_corpse_01", "u_m_y_zombie_01", "G_M_M_Zombie_01", "a_f_o_indian_01" },
    },

    --[[
        Rural / Wilderness
        Mountains, forests, deserts, rivers, farmland.
    ]]
    rural = {
        multiplier = 0.8,
        spawnChances = {
            ["default"]  = 76,
            ["animal"]   = 20,
            ["skeleton"] = 2,
            ["trainer"]  = 2,
        },
        lootTable = "rural",
        defaultZombieModels = { "a_f_o_indian_01", "a_m_m_hillbilly_01", "a_m_m_hillbilly_02", "a_m_m_indian_01", "a_m_m_rurmeth_01", "a_m_y_hiker_01", "a_f_y_hiker_01", "cs_old_man1a", "cs_old_man2", "s_m_y_construct_01", "u_m_o_tramp_01", "u_m_y_zombie_01" },
    },
}

-- ════════════════════════════════════════════════════════════════════════════════
-- ZONE → ARCHETYPE MAPPING
-- Assign each GTA zone to an archetype.
-- Unmapped zones fall back to Config.defaultArchetype.
-- ════════════════════════════════════════════════════════════════════════════════

Config.zoneMapping = {
    -- Military / Secure
    ARMYB   = "military", -- Fort Zancudo
    HUMLAB  = "military", -- Humane Labs and Research
    NOOSE   = "military", -- N.O.O.S.E

    -- Prison
    JAIL    = "prison", -- Bolingbroke Penitentiary

    -- Industrial / Ports
    AIRP    = "industrial", -- Los Santos Airport
    CYPRE   = "industrial", -- Cypress Flats
    ELYSIAN = "industrial", -- Elysian Island
    PALMPOW = "industrial", -- Palmer-Taylor Power Station
    TERMINA = "industrial", -- Terminal
    ZP_ORT  = "industrial", -- Port of South Los Santos
    ZQ_UAR  = "industrial", -- Davis Quartz

    -- Downtown
    DOWNT   = "downtown", -- Downtown
    DTVINE  = "downtown", -- Downtown Vinewood
    LEGSQU  = "downtown", -- Legion Square
    PBOX    = "downtown", -- Pillbox Hill
    SKID    = "downtown", -- Mission Row
    TEXTI   = "downtown", -- Textile City

    -- Urban
    ALTA    = "urban", -- Alta
    BANNING = "urban", -- Banning
    BURTON  = "urban", -- Burton
    CHAMH   = "urban", -- Chamberlain Hills
    DAVIS   = "urban", -- Davis
    DELSOL  = "urban", -- La Puerta (Del Sol)
    EAST_V  = "urban", -- East Vinewood
    EBURO   = "urban", -- El Burro Heights
    HAWICK  = "urban", -- Hawick
    KOREAT  = "urban", -- Little Seoul
    LMESA   = "urban", -- La Mesa
    LOSPUER = "urban", -- La Puerta
    MURRI   = "urban", -- Murrieta Heights
    RANCHO  = "urban", -- Rancho
    SANAND  = "urban", -- San Andreas
    STAD    = "urban", -- Maze Bank Arena
    STRAW   = "urban", -- Strawberry
    VINE    = "urban", -- Vinewood
    WVINE   = "urban", -- West Vinewood
    MOVIE   = "urban", -- Richards Majestic

    -- Suburban
    CHIL    = "suburban", -- Vinewood Hills
    CHU     = "suburban", -- Chumash
    DELPE   = "suburban", -- Del Perro
    GOLF    = "suburban", -- GWC and Golfing Society
    HORS    = "suburban", -- Vinewood Racetrack
    LDAM    = "suburban", -- Land Act Dam
    MIRR    = "suburban", -- Mirror Park
    MORN    = "suburban", -- Morningwood
    OCEANA  = "suburban", -- Pacific Ocean
    PBLUFF  = "suburban", -- Pacific Bluffs
    RGLEN   = "suburban", -- Richman Glen
    RICHM   = "suburban", -- Richman
    ROCKF   = "suburban", -- Rockford Hills
    RTRAK   = "suburban", -- Redwood Lights Track
    VCANA   = "suburban", -- Vespucci Canals
    VESP    = "suburban", -- Vespucci

    -- Coastal / Beach
    BEACH   = "coastal", -- Vespucci Beach
    DELBE   = "coastal", -- Del Perro Beach
    PROCOB  = "coastal", -- Procopio Beach

    -- Small Town
    GRAPES  = "small_town", -- Grapeseed
    PALETO  = "small_town", -- Paleto Bay
    SANDY   = "small_town", -- Sandy Shores

    -- Rural / Wilderness
    ALAMO   = "rural", -- Alamo Sea
    BANHAMC = "rural", -- Banham Canyon Dr
    BHAMCA  = "rural", -- Banham Canyon
    BRADP   = "rural", -- Braddock Pass
    BRADT   = "rural", -- Braddock Tunnel
    CALAFB  = "rural", -- Calafia Bridge
    CANNY   = "rural", -- Raton Canyon
    CCREAK  = "rural", -- Cassidy Creek
    CMSW    = "rural", -- Chiliad Mountain
    DESRT   = "rural", -- Grand Senora Desert
    ELGORL  = "rural", -- El Gordo Lighthouse
    GALFISH = "rural", -- Galilee
    GREATC  = "rural", -- Great Chaparral
    HARMO   = "rural", -- Harmony
    LACT    = "rural", -- Land Act Reservoir
    LAGO    = "rural", -- Lago Zancudo
    MTCHIL  = "rural", -- Mount Chiliad
    MTGORDO = "rural", -- Mount Gordo
    MTJOSE  = "rural", -- Mount Josiah
    NCHU    = "rural", -- North Chumash
    PALCOV  = "rural", -- Paleto Cove
    PALFOR  = "rural", -- Paleto Forest
    PALHIGH = "rural", -- Palomino Highlands
    SANCHIA = "rural", -- San Chianski Mountain Range
    SLAB    = "rural", -- Stab City
    TATAMO  = "rural", -- Tataviam Mountains
    TONGVAH = "rural", -- Tongva Hills
    TONGVAV = "rural", -- Tongva Valley
    WINDF   = "rural", -- Ron Alternates Wind Farm
    ZANCUDO = "rural", -- Zancudo River
}

-- ════════════════════════════════════════════════════════════════════════════════
-- THREAD & SPAWN SETTINGS
-- Core performance and spawn mechanic parameters
-- ════════════════════════════════════════════════════════════════════════════════

Config.threadSettings = {
    threadInterval = 2000,      -- Main script loop interval in ms (2s)

    spawnPedsAllOverMap = true, -- true  = zombies spawn across the entire map
    -- false = zombies only spawn inside danger zones

    globalRespawnCooldown = 150000,     -- Global zombie respawn time in ms (150s)
    baseZombieCount = 8,                -- Base zombies when 1+ player is in a square (solo experience)
    zombiesPerAdditionalPlayer = 5,     -- Scaling factor per additional player (diminishing returns via sqrt)
    maxZombiesCountInSquare = 40,       -- Hard cap on zombies in a single sector regardless of multiplier

    despawnLootObjectsInterval = 60000, -- Dropped loot cleanup interval in ms (60s)

    particlesRenderDistance = 80.0,     -- Particle effect render distance
    soundsListenDistance = 20.0,        -- Zombie sound hearing distance

    chanceToSpawn = {                   -- Fallback spawn weights per type (same system as archetype spawnChances)
        ["default"]  = 75,              -- Used when no zone archetype provides spawnChances
        ["screamer"] = 8,
        ["exploder"] = 6,
        ["splitter"] = 5,
        ["summoner"] = 3,
        ["tank"]     = 3,
    }
}

-- ════════════════════════════════════════════════════════════════════════════════
-- MAP SECTORS
-- Map division for global spawn system
-- ════════════════════════════════════════════════════════════════════════════════

Config.squares = {
    size = 350,   -- Single sector size in meters (the map is divided into a grid of these squares)
    height = 500, -- Sector height for 3D detection (covers vertical space like bridges, tunnels)
}

-- ════════════════════════════════════════════════════════════════════════════════
-- DISTANCES
-- Spawn and despawn distance control
-- ════════════════════════════════════════════════════════════════════════════════

Config.distances = {
    spawnDistance = {
        min = 40.0,             -- Minimum spawn distance from player
        max = 70.0,             -- Maximum spawn distance from player
    },
    spawnRadiusIncrement = 5.0, -- Radius increase (in meters) per failed canSpawnZombieAtCoords check
    despawnDistance = 120.0,    -- Zombies further than this from all players get deleted
}

-- ════════════════════════════════════════════════════════════════════════════════
-- DETECTION DISTANCES
-- Global stimulus detection ranges. These are properties of the stimulus
-- (how loud a horn is), not properties of the zombie type.
-- ════════════════════════════════════════════════════════════════════════════════

Config.detectionDistances = {
    sprint  = 30.0,  -- How far sprinting attracts zombies
    vehicle = 40.0,  -- Vehicle with engine running detection
    horn    = 110.0, -- Vehicle horn detection
}

-- ════════════════════════════════════════════════════════════════════════════════
-- DEAD BODY MANAGEMENT
-- Controls how dead zombie bodies are handled
-- ════════════════════════════════════════════════════════════════════════════════

Config.deadBody = {
    deleteTime = 20000,      -- How long dead bodies persist in ms (20s)
    deleteOnSafeZone = true, -- Delete zombie bodies when they're inside a safe zone
}

-- ════════════════════════════════════════════════════════════════════════════════
-- ZOMBIE TYPE DEFAULTS
-- Base values applied to every type. Types only need to specify fields that
-- differ from these defaults.
-- ════════════════════════════════════════════════════════════════════════════════

Config.typeDefaults = {
    health = 200,
    armor = 0,
    speed = 1.0,
    instantHeadShotKill = false,
    lootTable = "default",
    reactToPlayerDistance = 20.0,
    loseTargetDistance = 70.0,
    loseTargetTimeout = 30000,
    reactToShots = true,
    reactToSprint = true,
    reactToPlayerInVehicle = true,
    reactToPlayerInVehicleHonk = true,
    wanderInArea = true,
    wanderInAreaDistance = 5.0,
}

-- ════════════════════════════════════════════════════════════════════════════════
-- ZOMBIE TYPES
-- Each type defines stats, detection ranges, and special abilities.
-- Fields not listed here use Config.typeDefaults.
--
-- Only include fields you want to change - omitted fields use Config.typeDefaults.
-- Set a detection field to false to disable it entirely (e.g. reactToShots = false).
--
-- All available fields:
--
--   ["example"] = {
--       -- Required
--       model = { "model_name" },            -- Ped model(s) to spawn (random pick)
--
--       -- Base stats (override typeDefaults)
--       health = 200,                         -- Max health
--       armor = 0,                            -- Armor value
--       speed = 1.0,                          -- Movement speed multiplier
--       instantHeadShotKill = false,          -- One-shot headshot kill
--       lootTable = "default",                -- Loot table name (from Config.lootTables, or "default" for zone-based)
--
--       -- Detection (override typeDefaults, set to false to disable)
--       -- Detection distances (sprint, gunfire, vehicle, horn, wander) are global - see Config.detectionDistances
--       reactToPlayerDistance = 20.0,         -- Range to detect player on foot and enter combat
--       loseTargetDistance = 70.0,            -- Range at which zombie starts losing interest
--       loseTargetTimeout = 30000,             -- Time in ms to keep pursuing after exceeding loseTargetDistance (0 = instant)
--       reactToShots = true,                  -- React to nearby gunshots
--       reactToSprint = true,                 -- React to sprinting players
--       reactToPlayerInVehicle = true,        -- React to vehicles with engine running
--       reactToPlayerInVehicleHonk = true,    -- React to horn
--       wanderInArea = true,                  -- Wander when idle (no target)
--
--       -- Visual
--       damagePacks = { "Fall", "SCR_Shark" }, -- Ped damage overlays applied on spawn
--       damagePackCount = { min = 2, max = 4 }, -- How many random damage packs to apply
--       movementClipset = "clipset_name",     -- Custom movement clipset (overrides model default)
--       strafeClipset = "clipset_name",       -- Custom strafe clipset (overrides model default)
--       noZombieClipset = true,               -- Skip zombie walk/strafe animations entirely
--       screenEffect = "CayoMage",           -- Screen effect when player is near this zombie
--       screenEffectDistance = 15.0,          -- Range for screen effect
--
--       -- Combat
--       weapon = "WEAPON_MUSKET",             -- Weapon to give (default: weapon_unarmed)
--       combatRange = 0,                      -- GTA combat range: 0=short/defensive, 1=medium, 2=long
--       shootRate = 40,                       -- GTA shoot rate (lower = slower)
--       maxEngageDistance = 12,               -- Max distance AI will engage from
--       flee = true,                          -- Flee from player instead of fighting
--
--       -- Abilities (only include the ones this type uses)
--       explodeOnDeath = true,                -- Explode when killed (dead man's switch)
--       explodeDamageScale = 1.0,             -- Explosion damage multiplier
--       scream = true,                        -- Scream to attract nearby zombies
--       screamDistance = 30.0,                -- Range to trigger scream
--       screamAggroRadius = 110.0,            -- Radius to aggro existing zombies
--       summon = true,                        -- Summon new zombies via ritual animation
--       summonDistance = 20.0,                -- Range to trigger summoning
--       summonPeds = { ["default"] = 2 },     -- Types and counts to summon per ritual
--       toxic = true,                         -- Emit toxic gas cloud
--       toxicDistance = 2.0,                  -- Gas damage radius
--       toxicDelay = 20000,                   -- Delay between gas attacks (ms)
--       toxicDamageScale = 1.0,               -- Gas damage multiplier
--       splitter = true,                      -- Split into copies on death
--       splitCount = 2,                       -- Number of copies
--       splitZombieType = "splitter",         -- Type of the copies
--       replicate = true,                     -- Summon animals (trainer)
--       replicateDistance = 35.0,             -- Detection range (replaces reactToPlayerDistance)
--       replicateCount = 2,                   -- Animals per summon wave
--       maxReplicateStages = 3,               -- Max summon waves
--       replicateCoolDown = 10000,            -- Cooldown between waves (ms)
--       replicateZombieType = "animal",       -- Type of summoned creatures
--       replicateSpeedMultiplier = 1.8,       -- Speed boost while summoning
--       additionalSpawnReduction = 1,         -- Reduce default spawns to compensate for extras
--   },
-- ════════════════════════════════════════════════════════════════════════════════

Config.types = {
    --[[
        Default Zombie
        Standard enemy with no special abilities.
        Medium durability and speed.
    ]]
    ["default"] = {
        model = { "G_M_M_Zombie_05", "G_M_M_Zombie_01", "IG_Zombie_DJ_01", "u_f_y_corpse_01", "u_f_m_corpse_01", "u_m_m_prolsec_01", "u_m_o_filmnoir", "u_m_y_corpse_01", "u_m_o_tramp_01", "u_m_y_zombie_01", "ig_gustavo_02" },
        reactToPlayerDistance = 15.0,
        damagePacks = { "Fall", "BigHitByVehicle", "Explosion_Large" },
        damagePackCount = { min = 2, max = 4 },
    },

    --[[
        Splitter
        Splits into copies when damaged.
        Lower health but harder to eliminate completely.
    ]]
    ["splitter"] = {
        model = { "G_M_M_Zombie_04" },
        speed = 1.15,
        splitter = true,
        splitCount = 2,
        splitZombieType = "splitter",
        additionalSpawnReduction = 1,
    },

    --[[
        Screamer
        Emits a terrifying scream that attracts nearby zombies.
        High durability, priority target.
    ]]
    ["screamer"] = {
        model = { "mp_f_deadhooker" },
        health = 250,
        speed = 1.1,
        scream = true,
        screamDistance = 30.0,
        screamAggroRadius = 110.0,
    },

    --[[
        Summoner
        Uses a magic staff to summon new zombies.
        Medium durability, slower movement.
    ]]
    ["summoner"] = {
        model = { "G_F_M_UndeadMage", "G_M_M_Zombie_03" },
        health = 300,
        summon = true,
        summonDistance = 20.0,
        summonPeds = { ["default"] = 2 },
        additionalSpawnReduction = 1,
        screenEffect = "CayoMage",
        screenEffectDistance = 15.0,
    },

    --[[
        Exploder
        Explodes on death (dead man's switch).
        Medium durability, dangerous in close quarters.
    ]]
    ["exploder"] = {
        model = { "G_M_M_Zombie_02" },
        health = 200,
        speed = 1.1,
        explodeOnDeath = true,
        explodeDamageScale = 0.5,
    },

    --[[
        Tank
        Massive zombie with huge HP pool.
        Slow but extremely durable.
    ]]
    ["tank"] = {
        model = { "G_M_M_Zombie_02" },
        health = 550,
        armor = 50,
        speed = 0.9,
        lootTable = "tank",
        reactToPlayerDistance = 15.0,
    },

    --[[
        Juggernaut
        Armored zombie emitting toxic fumes.
        Highest durability, deals area damage.
    ]]
    ["juggernaut"] = {
        model = { "u_m_y_juggernaut_01" },
        health = 450,
        armor = 100,
        speed = 0.85,
        lootTable = "juggernaut",
        toxic = true,
        toxicDistance = 2.0,
        toxicDelay = 15000,
        toxicDamageScale = 1.0,
        screenEffect = "CayoToxicWater",
        screenEffectDistance = 5.0,
    },

    --[[
        Skeleton
        Undead warrior armed with a musket.
        Defensive ranged attacker - stays back and shoots, walks normally (no zombie shamble).
    ]]
    ["skeleton"] = {
        model = { "IG_Skeleton_01" },
        instantHeadShotKill = true,
        lootTable = "skeleton",
        weapon = "WEAPON_MUSKET",
        noZombieClipset = true,
        combatRange = 0,
        shootRate = 40,
        maxEngageDistance = 12,
    },

    --[[
        Animal
        Zombie animals - coyotes, boars, deer.
        Low health, melee only, doesn't react to vehicles.
    ]]
    ["animal"] = {
        model = { "a_c_coyote_02", "a_c_boar_02", "a_c_deer_02" },
        health = 100,
        weapon = "WEAPON_ANIMAL",
        reactToPlayerInVehicle = false,
        reactToPlayerInVehicleHonk = false,
    },

    --[[
        Trainer
        Summons and controls animals. When the trainer dies, all its animals die too.
        Does not react to gunshots, sprinting or vehicles - only detects players within replicateDistance.
        Moves toward the player at increased speed while summoning.
    ]]
    ["trainer"] = {
        model = { "ig_hunter" },
        health = 300,
        reactToPlayerDistance = false,
        reactToShots = false,
        reactToSprint = false,
        reactToPlayerInVehicle = false,
        reactToPlayerInVehicleHonk = false,
        flee = true,
        replicate = true,
        replicateDistance = 35.0,
        replicateCount = 2,
        maxReplicateStages = 3,
        replicateCoolDown = 10000,
        replicateZombieType = "animal",
        replicateSpeedMultiplier = 1.8,
        additionalSpawnReduction = 2,
    },
}

-- ════════════════════════════════════════════════════════════════════════════════
-- WEAPON AGGRO RADIUS
-- Per-weapon radius that determines how far gunshots attract zombies.
-- ════════════════════════════════════════════════════════════════════════════════

Config.weaponAggroRadius = {
    default                       = 80.0, -- Used for any weapon not listed below

    -- Melee (quiet)
    [`WEAPON_UNARMED`]            = 3.0,
    [`WEAPON_BAT`]                = 5.0,
    [`WEAPON_KNIFE`]              = 5.0,
    [`WEAPON_MACHETE`]            = 5.0,
    [`WEAPON_HATCHET`]            = 5.0,
    [`WEAPON_SWITCHBLADE`]        = 5.0,
    [`WEAPON_BOTTLE`]             = 5.0,
    [`WEAPON_DAGGER`]             = 5.0,
    [`WEAPON_NIGHTSTICK`]         = 5.0,
    [`WEAPON_WRENCH`]             = 5.0,
    [`WEAPON_HAMMER`]             = 5.0,
    [`WEAPON_CROWBAR`]            = 5.0,
    [`WEAPON_GOLFCLUB`]           = 5.0,
    [`WEAPON_POOLCUE`]            = 5.0,
    [`WEAPON_FLASHLIGHT`]         = 5.0,
    [`WEAPON_KNUCKLE`]            = 5.0,
    [`WEAPON_STONE_HATCHET`]      = 5.0,
    [`WEAPON_BATTLEAXE`]          = 5.0,
    [`WEAPON_CANDYCANE`]          = 5.0,

    -- Pistols
    [`WEAPON_PISTOL`]             = 60.0,
    [`WEAPON_PISTOL_MK2`]         = 60.0,
    [`WEAPON_COMBATPISTOL`]       = 60.0,
    [`WEAPON_PISTOL50`]           = 70.0,
    [`WEAPON_HEAVYPISTOL`]        = 70.0,
    [`WEAPON_APPISTOL`]           = 55.0,
    [`WEAPON_SNSPISTOL`]          = 50.0,
    [`WEAPON_SNSPISTOL_MK2`]      = 50.0,
    [`WEAPON_VINTAGEPISTOL`]      = 60.0,
    [`WEAPON_REVOLVER`]           = 80.0,
    [`WEAPON_REVOLVER_MK2`]       = 80.0,
    [`WEAPON_DOUBLEACTION`]       = 80.0,
    [`WEAPON_NAVYREVOLVER`]       = 80.0,
    [`WEAPON_MARKSMANPISTOL`]     = 65.0,
    [`WEAPON_CERAMICPISTOL`]      = 55.0,
    [`WEAPON_PISTOLXM3`]          = 60.0,
    [`WEAPON_GADGETPISTOL`]       = 55.0,
    [`WEAPON_STUNGUN`]            = 15.0,
    [`WEAPON_STUNGUN_MP`]         = 15.0,
    [`WEAPON_FLAREGUN`]           = 70.0,
    [`WEAPON_RAYPISTOL`]          = 60.0,

    -- SMGs
    [`WEAPON_MICROSMG`]           = 70.0,
    [`WEAPON_SMG`]                = 75.0,
    [`WEAPON_SMG_MK2`]            = 75.0,
    [`WEAPON_ASSAULTSMG`]         = 75.0,
    [`WEAPON_MINISMG`]            = 65.0,
    [`WEAPON_COMBATPDW`]          = 70.0,
    [`WEAPON_MACHINEPISTOL`]      = 65.0,
    [`WEAPON_TECPISTOL`]          = 70.0,
    [`WEAPON_RAYCARBINE`]         = 75.0,

    -- Shotguns
    [`WEAPON_PUMPSHOTGUN`]        = 90.0,
    [`WEAPON_PUMPSHOTGUN_MK2`]    = 90.0,
    [`WEAPON_SAWNOFFSHOTGUN`]     = 80.0,
    [`WEAPON_ASSAULTSHOTGUN`]     = 90.0,
    [`WEAPON_BULLPUPSHOTGUN`]     = 85.0,
    [`WEAPON_HEAVYSHOTGUN`]       = 95.0,
    [`WEAPON_MUSKET`]             = 100.0,
    [`WEAPON_DBSHOTGUN`]          = 90.0,
    [`WEAPON_COMBATSHOTGUN`]      = 90.0,
    [`WEAPON_AUTOSHOTGUN`]        = 85.0,

    -- Assault Rifles
    [`WEAPON_ASSAULTRIFLE`]       = 100.0,
    [`WEAPON_ASSAULTRIFLE_MK2`]   = 100.0,
    [`WEAPON_CARBINERIFLE`]       = 100.0,
    [`WEAPON_CARBINERIFLE_MK2`]   = 100.0,
    [`WEAPON_ADVANCEDRIFLE`]      = 95.0,
    [`WEAPON_SPECIALCARBINE`]     = 100.0,
    [`WEAPON_SPECIALCARBINE_MK2`] = 100.0,
    [`WEAPON_BULLPUPRIFLE`]       = 95.0,
    [`WEAPON_BULLPUPRIFLE_MK2`]   = 95.0,
    [`WEAPON_COMPACTRIFLE`]       = 90.0,
    [`WEAPON_MILITARYRIFLE`]      = 105.0,
    [`WEAPON_HEAVYRIFLE`]         = 105.0,
    [`WEAPON_TACTICALRIFLE`]      = 100.0,

    -- LMGs
    [`WEAPON_MG`]                 = 110.0,
    [`WEAPON_COMBATMG`]           = 110.0,
    [`WEAPON_COMBATMG_MK2`]       = 110.0,
    [`WEAPON_GUSENBERG`]          = 100.0,

    -- Snipers
    [`WEAPON_SNIPERRIFLE`]        = 105.0,
    [`WEAPON_HEAVYSNIPER`]        = 110.0,
    [`WEAPON_HEAVYSNIPER_MK2`]    = 110.0,
    [`WEAPON_MARKSMANRIFLE`]      = 105.0,
    [`WEAPON_MARKSMANRIFLE_MK2`]  = 105.0,
    [`WEAPON_PRECISIONRIFLE`]     = 105.0,

    -- Heavy / Explosives
    [`WEAPON_RPG`]                = 110.0,
    [`WEAPON_GRENADELAUNCHER`]    = 105.0,
    [`WEAPON_MINIGUN`]            = 110.0,
    [`WEAPON_RAILGUN`]            = 110.0,
    [`WEAPON_RAILGUNXM3`]         = 110.0,
    [`WEAPON_HOMINGLAUNCHER`]     = 110.0,
    [`WEAPON_COMPACTLAUNCHER`]    = 105.0,
    [`WEAPON_FIREWORK`]           = 100.0,
    [`WEAPON_EMPLAUNCHER`]        = 100.0,
    [`WEAPON_RAYMINIGUN`]         = 110.0,
    [`WEAPON_GRENADE`]            = 100.0,
    [`WEAPON_PIPEBOMB`]           = 100.0,
    [`WEAPON_MOLOTOV`]            = 90.0,
    [`WEAPON_STICKYBOMB`]         = 100.0,
    [`WEAPON_PROXMINE`]           = 100.0,
    [`WEAPON_BZGAS`]              = 80.0,
    [`WEAPON_SMOKEGRENADE`]       = 50.0,
    [`WEAPON_FLARE`]              = 60.0,

    -- Add any weapon hash here with custom radius
}

-- ════════════════════════════════════════════════════════════════════════════════
-- SUPPRESSOR SETTINGS
-- Weapons with suppressors attached get their aggro radius multiplied by this value.
-- The suppressor components list covers all vanilla GTA V suppressors.
-- ════════════════════════════════════════════════════════════════════════════════

Config.suppressorMultiplier = 0.5 -- Weapon aggro radius is multiplied by this when a suppressor is attached (0.5 = half the noise)

Config.suppressorComponents = {
    `COMPONENT_AT_PI_SUPP`,         -- Pistol suppressor (Combat Pistol, AP Pistol, Heavy Pistol, etc.)
    `COMPONENT_AT_PI_SUPP_02`,      -- Pistol suppressor 2 (Pistol, Pistol MK2, SNS Pistol MK2)
    `COMPONENT_AT_AR_SUPP`,         -- Rifle suppressor (Carbine, Advanced, Bullpup, Marksman, etc.)
    `COMPONENT_AT_AR_SUPP_02`,      -- Rifle suppressor 2 (Assault Rifle, Special Carbine, Sniper, etc.)
    `COMPONENT_AT_SR_SUPP`,         -- Shotgun suppressor (Pump Shotgun)
    `COMPONENT_AT_SR_SUPP_03`,      -- Sniper suppressor (Pump Shotgun MK2, Heavy Sniper MK2)
    `COMPONENT_CERAMICPISTOL_SUPP`, -- Ceramic Pistol suppressor
    `COMPONENT_PISTOLXM3_SUPP`,     -- WM 29 Pistol suppressor
}


-- ════════════════════════════════════════════════════════════════════════════════
-- LOOT TABLES
-- Define items dropped by zombies
-- ════════════════════════════════════════════════════════════════════════════════

Config.lootTables = {
    -- IMPORTANT: All item names below MUST match your inventory system exactly.
    -- Default - balanced survival loot (used by urban and suburban archetypes)
    ["default"] = {
        maxItems = 2,
        chance = 20,
        items = {
            { item = "bread",        min = 1, max = 1, chance = 18 },
            { item = "water_bottle", min = 1, max = 1, chance = 18 },
            { item = "bandage",      min = 1, max = 2, chance = 15 },
            { item = "cloth",        min = 1, max = 3, chance = 15 },
            { item = "ammo-9",       min = 2, max = 8, chance = 12 },
            { item = "wood",         min = 2, max = 6, chance = 10 },
            { item = "stone",        min = 1, max = 4, chance = 8 },
            { item = "metal",        min = 1, max = 2, chance = 4 },
        }
    },

    -- Military - combat supplies, ammo, and advanced materials
    ["military"] = {
        maxItems = 3,
        chance = 30,
        items = {
            { item = "ammo-rifle",   min = 5, max = 15, chance = 22 },
            { item = "ammo-9",       min = 5, max = 20, chance = 18 },
            { item = "ammo-shotgun", min = 3, max = 10, chance = 12 },
            { item = "bandage",      min = 1, max = 2,  chance = 12 },
            { item = "metal",        min = 2, max = 4,  chance = 12 },
            { item = "bread",        min = 1, max = 1,  chance = 10 },
            { item = "hqm",          min = 1, max = 2,  chance = 8 },
            { item = "medkit",       min = 1, max = 1,  chance = 6 },
        }
    },

    -- Industrial - crafting materials and tools
    ["industrial"] = {
        maxItems = 2,
        chance = 22,
        items = {
            { item = "metal",      min = 2, max = 5,  chance = 22 },
            { item = "stone",      min = 2, max = 6,  chance = 18 },
            { item = "ammo-9",     min = 3, max = 10, chance = 12 },
            { item = "wood",       min = 2, max = 5,  chance = 12 },
            { item = "cloth",      min = 1, max = 3,  chance = 10 },
            { item = "ammo-rifle", min = 2, max = 8,  chance = 10 },
            { item = "bandage",    min = 1, max = 2,  chance = 8 },
            { item = "hqm",        min = 1, max = 1,  chance = 5 },
        }
    },

    -- Downtown - scavenged civilian supplies
    ["downtown"] = {
        maxItems = 2,
        chance = 22,
        items = {
            { item = "bread",        min = 1, max = 2,  chance = 20 },
            { item = "water_bottle", min = 1, max = 2,  chance = 20 },
            { item = "bandage",      min = 1, max = 2,  chance = 15 },
            { item = "cloth",        min = 1, max = 3,  chance = 12 },
            { item = "ammo-9",       min = 2, max = 10, chance = 12 },
            { item = "ammo-rifle",   min = 2, max = 6,  chance = 8 },
            { item = "medkit",       min = 1, max = 1,  chance = 4 },
            { item = "metal",        min = 1, max = 2,  chance = 4 },
        }
    },

    -- Rural - natural resources and survival basics
    ["rural"] = {
        maxItems = 2,
        chance = 15,
        items = {
            { item = "wood",         min = 3, max = 10, chance = 25 },
            { item = "stone",        min = 2, max = 6,  chance = 20 },
            { item = "cloth",        min = 1, max = 4,  chance = 15 },
            { item = "bread",        min = 1, max = 1,  chance = 12 },
            { item = "water_bottle", min = 1, max = 1,  chance = 12 },
            { item = "bandage",      min = 1, max = 1,  chance = 8 },
            { item = "ammo-9",       min = 1, max = 5,  chance = 5 },
            { item = "metal",        min = 1, max = 1,  chance = 3 },
        }
    },

    -- ── Type-Specific Tables ─────────────────────────────────────────────────
    -- These override zone-based loot when a zombie type has lootTable = "<name>".
    -- Harder-to-kill types reward better loot regardless of where they died.

    -- Tank - armored brute, rewards heavy materials and ammo
    ["tank"] = {
        maxItems = 3,
        chance = 35,
        items = {
            { item = "metal",        min = 2, max = 5,  chance = 22 },
            { item = "ammo-rifle",   min = 5, max = 15, chance = 18 },
            { item = "ammo-9",       min = 5, max = 15, chance = 15 },
            { item = "hqm",          min = 1, max = 2,  chance = 12 },
            { item = "bandage",      min = 1, max = 3,  chance = 12 },
            { item = "medkit",       min = 1, max = 1,  chance = 10 },
            { item = "bread",        min = 1, max = 2,  chance = 8 },
            { item = "water_bottle", min = 1, max = 1,  chance = 3 },
        }
    },

    -- Juggernaut - toughest kill in the game, best possible drops
    ["juggernaut"] = {
        maxItems = 3,
        chance = 40,
        items = {
            { item = "hqm",          min = 1, max = 3,  chance = 18 },
            { item = "metal",        min = 3, max = 6,  chance = 18 },
            { item = "medkit",       min = 1, max = 1,  chance = 15 },
            { item = "ammo-rifle",   min = 8, max = 20, chance = 15 },
            { item = "bandage",      min = 1, max = 3,  chance = 12 },
            { item = "ammo-shotgun", min = 5, max = 12, chance = 10 },
            { item = "ammo-9",       min = 5, max = 15, chance = 8 },
            { item = "bread",        min = 1, max = 1,  chance = 4 },
        }
    },

    -- Skeleton - ranged undead, drops ammo-focused loot
    ["skeleton"] = {
        maxItems = 2,
        chance = 28,
        items = {
            { item = "ammo-rifle",   min = 5, max = 15, chance = 25 },
            { item = "ammo-9",       min = 5, max = 15, chance = 20 },
            { item = "ammo-shotgun", min = 3, max = 8,  chance = 15 },
            { item = "metal",        min = 1, max = 3,  chance = 12 },
            { item = "bandage",      min = 1, max = 2,  chance = 10 },
            { item = "cloth",        min = 1, max = 3,  chance = 10 },
            { item = "hqm",          min = 1, max = 1,  chance = 5 },
            { item = "bread",        min = 1, max = 1,  chance = 3 },
        }
    },
}

-- ════════════════════════════════════════════════════════════════════════════════
-- SAFE ZONE SETTINGS
-- Global safe zone behavior settings
-- ════════════════════════════════════════════════════════════════════════════════

Config.safeZoneGracePeriod = 10000 -- How long the player stays invincible after leaving a safe zone in ms (10s, 0 to disable)

-- ════════════════════════════════════════════════════════════════════════════════
-- SAFE ZONE DEFAULTS
-- Base values applied to every safe zone. Zones only need to specify fields
-- that differ from these defaults (coords is always required).
-- Sub-tables (blip, zoneBlip, zoneMarker) are merged field-by-field - you can
-- override just the label without repeating sprite/color/scale.
-- ════════════════════════════════════════════════════════════════════════════════

Config.safeZoneDefaults = {
    zoneRadius = 100.0,
    disableWeapons = true,
    invincible = true,
    disablePvP = true,
    ghostMode = false,
    passThroughPlayers = false,
    zoneMarker = { enabled = false, color = { 0, 255, 0 }, alpha = 100 },
    blip = { enabled = true, sprite = 176, color = 2, scale = 1.0, label = "Safe Zone" },
    zoneBlip = { enabled = true, radius = 100.0, color = 2 },
}

-- ════════════════════════════════════════════════════════════════════════════════
-- DANGER ZONE DEFAULTS
-- Base values applied to every danger zone. Zones only need to specify fields
-- that differ from these defaults (coords and pedsToSpawn are always required).
-- Sub-tables (blip, zoneBlip, zoneMarker) are merged field-by-field - you can
-- override just the label without repeating sprite/color/scale.
-- ════════════════════════════════════════════════════════════════════════════════

Config.dangerZoneDefaults = {
    zoneRadius = 100.0,
    healthMultiplier = 1.0,
    respawnCooldown = 200000, -- in ms (200s)
    zoneMarker = { enabled = false, color = { 255, 0, 0 }, alpha = 100 },
    blip = { enabled = true, sprite = 630, color = 1, scale = 1.0, label = "Danger Zone" },
    zoneBlip = { enabled = true, radius = 180.0, color = 1 },
}

-- ════════════════════════════════════════════════════════════════════════════════
-- ZONES
-- Safe and danger zone definitions
-- ════════════════════════════════════════════════════════════════════════════════

Config.zones = {
    --[[
        Safe Zones
        Areas where zombies cannot spawn.
        Ideal for bases, shops, spawn points.

        Only specify fields that differ from Config.safeZoneDefaults.
        Required: coords. Optional: any field from safeZoneDefaults.
    ]]
    safeZones = {
        {
            coords = vector3(-2292.4773, 370.4102, 174.6017),
            blip = { enabled = true, label = "Observatory" },
        }
    },

    --[[
        Danger Zones
        Areas with increased zombie spawns and unique types.
        Higher rewards, greater challenge.

        Only specify fields that differ from Config.dangerZoneDefaults.
        Required: coords, pedsToSpawn. Optional: blip.label (defaults to "Danger Zone").
    ]]
    dangerZones = {
        {   -- Humane Labs
            coords = vector3(3525.9617, 3716.9829, 36.6426),
            blip = { label = "Humane Labs" },
            pedsToSpawn = {
                ["default"]    = 3,
                ["juggernaut"] = 2,
                ["exploder"]   = 2,
                ["tank"]       = 1,
                ["summoner"]   = 1,
            },
            healthMultiplier = 1.3,
        },

        {   -- Bolingbroke Penitentiary
            coords = vector3(1714.4968, 2560.5166, 45.5648),
            blip = { label = "Bolingbroke Penitentiary" },
            pedsToSpawn = {
                ["default"]  = 3,
                ["tank"]     = 2,
                ["exploder"] = 1,
                ["summoner"] = 1,
            },
            healthMultiplier = 1.3,
        },

        {   -- Fort Zancudo
            coords = vector3(-2131.0125, 3140.4380, 32.8101),
            blip = { label = "Fort Zancudo" },
            pedsToSpawn = {
                ["tank"]       = 3,
                ["skeleton"]   = 3,
                ["juggernaut"] = 1,
                ["exploder"]   = 1,
            },
            healthMultiplier = 1.4,
        },

        {   -- LS Airport
            coords = vector3(-1251.8574, -2938.4165, 13.9469),
            zoneRadius = 120.0, -- Larger than default 100.0
            blip = { label = "LS Airport" },
            pedsToSpawn = {
                ["default"]  = 4,
                ["exploder"] = 2,
                ["splitter"] = 2,
                ["tank"]     = 1,
            },
            healthMultiplier = 1.3,
        },

        {   -- N.O.O.S.E
            coords = vector3(2521.6023, -384.2304, 93.0671),
            blip = { label = "N.O.O.S.E" },
            pedsToSpawn = {
                ["tank"]       = 2,
                ["juggernaut"] = 2,
                ["skeleton"]   = 1,
                ["exploder"]   = 1,
            },
            healthMultiplier = 1.3,
        },
    }
}

Last updated