Spawn and Special Infected Difficulty
Two layers: spawn control decides when and where SI appear; AI difficulty sets SI behavior by team PPM.
Two systems, two responsibilities
The difficulty tier affects both spawn strategy and AI behavior, but each system has a different responsibility.
infected_control manages the kill observation window, the full 16-second countdown, Anti-Bait holds, directed Nav candidates, spawn safety checks, and candidate scoring.
The dynamic AI plugin assigns a tier from the mean individual PPM of human survivors, then applies pounce, bunnyhop, tongue, vomit, charge, and Tank behavior settings.
How the Five AI Tiers Are Assigned
The system calculates each human survivor individual PPM and then takes the arithmetic mean; it does not divide team score by team time. Automatic mode selects only the five tiers from Simple through Extreme.
| Tier | Team PPM | Check window | Full countdown | Low SI Threshold | Scored candidates | Sweet Spot Width | Feel |
|---|---|---|---|---|---|---|---|
| Easy | < 30.89 | 16s | 16s | 12% / 6 SI <= 1 | 9 | 1.25x | Slowest fallback start |
| Normal | 30.89 - 43.23 | 12s | 16s | 20% / 6 SI <= 1 | 10 | 1.15x | Baseline pressure |
| Hard | 43.23 - 63.70 | 10s | 16s | 27% / 6 SI <= 1 | 11 | 1.08x | Earlier base countdown start |
| Expert | 63.70 - 77.57 | 8s | 16s | 34% / 6 SI <= 2 | 12 | 1.00x | Main combat pressure tier |
| Extreme | >= 77.57 | 6s | 16s | 50% / 6 SI <= 3 | 12 | 1.00x | Earliest checks and highest attributes |
Overall stats are used by default. Operators may enable quarterly stats with at least 300 individual quarterly minutes. The saferoom tier is provisional and recalculates after team changes; it locks for the round when survivors leave. If daily P60 / P75 / P90 / P95 thresholds are unavailable or stale, configured defaults are used.
Special Infected wave timeline
The 16 seconds are a complete countdown that starts after the kill observation ends, not a forced gap between the last successful spawns of two waves.
The normal spawn queue is filled first, then the kill observation window for the current tier begins.
The countdown may start early when the normal and asynchronous queues are empty, active SI are at the low-pressure threshold, survivors are healthy, and no Tank pressure exists; otherwise it waits for the tier check time.
The base countdown runs independently. Time since the previous SI spawn does not offset it, and low SI pressure cannot shorten it again.
Anti-Bait can arm only in the final 4 seconds. A healthy, grouped team that remains stalled for 2 seconds enters an unlimited hold at the deadline.
Without a hold, the wave releases at the deadline. During a hold, 2 stable seconds of progress, breakup, isolation, or vulnerability releases it immediately.
How Anti-Bait detects holding
It does not watch whether one player stops. It combines team progress, formation structure, and vulnerability. A spread-out but stalled team prepares a breach wave but does not enter an unlimited hold.
Progress uses the team lower-median Flow, so one fast runner cannot reset the timer for everyone.
Pressure can begin only during the final 4 seconds of the base countdown.
Healthy, at least two valid survivors, stably grouped, and still stalled.
Stable confirmation after progress, group breakup, isolation, incapacitation, ledge grab, pin, or invalid Flow.
At least two valid survivors are required. The team must form one connected group with no member isolated by 1200 units or more, and either have a maximum spread of 800 or less, or a maximum spread of 1500 or less with average nearest-teammate distance of 800 or less. Incapacitation, ledge grabs, pins, death, or unreadable Flow count as vulnerability.
Why spawns appear near, far, or above
The main pipeline no longer enumerates candidates from Flow buckets. The extension supplies reachable candidates from a directed Nav graph, then SourcePawn applies safety filters and class scoring. It falls back to all Nav areas and real path checks only when the graph is unavailable.
A candidate within 250 units of any survivor is rejected. This is a 3D direct distance and is unaffected by Nav detours.
Class minimum and maximum ranges, distance sweet spots, and near-to-far candidate order all use the directed path distance from candidate Nav to target Nav.
Nav attributes, route progress, local density, stuck state, visibility, and the real path are checked in order. Unsafe points are never scored.
Only safe candidates are ranked by distance, height, Flow, dispersion, and class-specific tactical quality.
Class path-distance bands
Each class searches a tighter preferred band first. On failure, only the far limit expands: the class minimum stays fixed, and the search processes only the new Nav interval beyond the previous band. Every value below is the directed path distance from candidate Nav to target Nav.
| Class | Preferred band | Second band | Final band |
|---|---|---|---|
| Smoker | 500-1200 | 500-2100 | 500-3000 |
| Boomer | 250-550 | 250-1000 | 250-1800 |
| Hunter | 350-950 | 350-1750 | 350-2900 |
| Spitter | 300-800 | 300-1450 | 300-2300 |
| Jockey / Charger | 250-700 | 250-1250 | 250-2200 |
Once a candidate is more than 32 units above the target eye, extra height is subtracted from raw Nav distance at 1.5x, capped at 1000. This only relaxes the maximum and scoring; it never bypasses the 250 direct-distance exclusion or lowers the class minimum.
Once a candidate is more than 32 units above the target eye, extra height reduces Nav distance at 1.15x, capped at 800. This keeps roofs and ledges in scoring when Nav detours are long.
How the five automatic AI tiers feel
The automatic profiles control 97 unique cvars in total. This table keeps the speed differences most noticeable in play; Extreme also takes over additional official ability settings.
| Key behavior | Easy | Normal | Hard | Expert | Extreme |
|---|---|---|---|---|---|
Hunter / Jockey air speedhunter_pounce_air_speed / jockey_pounce_air_speed |
700 | 750 | 800 | 850 | 900 |
Smoker bunnyhop speedai_SmokerBhopSpeed |
70 | 90 | 105 | 120 | 150 |
Jockey bunnyhop speedai_JockeyBhopSpeed |
50 | 60 | 70 | 80 | 150 |
Spitter bunnyhop speedai_SpitterBhopSpeed |
45 | 65 | 85 | 100 | 250 |
Charger bunnyhop speedai_ChagrerBhopSpeed |
45 | 60 | 75 | 90 | 150 |
Boomer bunnyhop speedai_BoomerBhopSpeed |
70 | 95 | 125 | 150 | 250 |
Tank maximum bunnyhop speedai_tank3_bhop_max_speed |
700 | 800 | 900 | 1000 | 1050 |
Extreme
- Target acquisition waits drop to 0; Smoker miss cooldown is 3 seconds, tongue range is 800, and tongue speed is 1200.
- Hunter enables converted pounces, reflection, and long-range settings; Jockey rear vision rises to 100.
- Spitter acid damage is set to 3 / 2; Boomer vomit fatigue is 1500 and range is 300.
- Charger charge distance is 280, aim offset is 35, and air correction is stronger.
Neri
Automatic PPM never selects tier 6. Neri builds on Extreme with Anne-Neri behaviors; its spawn strategy is the same as Extreme: a 6-second check window, full 16-second countdown, and 12 scored candidates.
- Enables the Anne-Neri air ability patch and Smoker jump-pull.
- Hunter pounce interval and cooldown are both 0.
- Charger aim offset rises to 180 and air-correction interpolation to 0.50.
- Boomer enables jump-vomit, with 0 vomit fatigue and 400 vomit range.
- Tank bunnyhop pursuit distance is 99999, throw force is 1000, and ladder animation rate is 4; Witch anger rate is 1.
The plugin restores the baseline for every cvar controlled by tiers 1-6 before applying the target profile. Current entry counts are 84 / 84 / 84 / 84 / 97 / 105; including Neri, 105 unique cvars are involved.
Performance controls for operators
These settings are runtime ConVars. Slower machines can reduce per-frame attempts, Nav inspection counts, or millisecond budgets. Hot loops read cached values, and changing them resets the active search.
| Setting | Default | function |
|---|---|---|
inf_spawn_attempts_per_frame |
4 | Maximum normal/teleport spawn attempts advanced per frame |
inf_spawn_frame_budget_ms |
2.0 ms | Soft per-frame time budget for spawn attempts |
inf_spawn_nav_candidates_per_slice |
256 | Maximum Nav candidates inspected per search slice |
inf_spawn_nav_expensive_per_slice |
8 | Maximum candidates entering visibility/path checks per slice |
inf_spawn_nav_slice_budget_ms |
1.0 ms | Soft time budget for one Nav search slice |
Background candidate refresh rate
With no nearby spawn work, the extension refreshes candidates about once per second. With queued work, an initial-wave or spawn timer, or no more than 1 second until release, it switches to about every 0.1 seconds. Candidate result pages expire after 0.2 seconds to avoid reusing stale positions.