З цим модом трава стає справжнім укриттям. Присів або ліг у рослинності — і вороги проходять повз, не помічаючи тебе. Встав на повний зріст — і трава вже не ховає, незалежно від того, наскільки вона густа навколо.
Стелс залежить від того, наскільки висока і густа трава на локації прямо зараз. Якщо трава низька або її зовсім немає — ховатися нема де, мод не допоможе. Але з настанням ночі, в дощ або туман — ворог бачить погано навіть на відкритому полі.
Важливо: зброя в руках не робить тебе помітнішим. Ворог не бачить тебе краще через те, що ти тримаєш автомат замість пістолета. Але кожен постріл — це звук, і всі вороги в радіусі його чують. Глушник суттєво скорочує цей радіус.
Відкриває бінарний файл $game_levels$/level_name/level.details через io.open(path, "rb") і парсить структуру чанків:
Chunk 0 — заголовок сітки: зміщення ox / oz, розмір sx / sz, крок клітинки DETAIL_CELL = 2.0 м.
Chunk 2 — слот-дані: 16 байт на клітинку (f32 Y + два 32-бітних bitmask).
Позиція актора → індекс клітинки: cx = floor(pos.x / 2.0) + ox.
Зчитуються два bitmask — кожен біт = один екземпляр трав'яного об'єкта в клітинці.
Підраховується popcount (0–64 встановлених бітів).
Popcount відрізняє декоративну траву від польової:
pc ≤ 8 — асфальт або декоративна трава на дорозі (pc 4–6) → стелс не активується.
pc 15–25 — реальна польова трава → повне укриття.
Формула покриття: cover = clamp((pc − 8) / 13, 0, 1).
Кешується 300 мс щоб не читати файл щокадру.
Додатково зчитується r__detail_height з консолі рушія — м'який штраф якщо гравець знизив висоту трави в графіці: hf = clamp(h / 0.7, 0.2, 1.0). Фінальне покриття = cover × hf.
Підключається до коллбека on_enemy_eval системи Stealth 2.31 і модифікує поле flags.result. Якщо умови стелсу виконані — виявлення скасовується на поточний тік.
Перед розрахунком перевіряється obj:best_enemy(). Якщо NPC вже має актора як активну ціль — flags.result не скидається. Захищає від помилкового стелсу під час бою.
Хук на actor_on_weapon_fired. Визначається тип зброї та наявність silencer. Вороги у радіусі виявлення отримують відповідний стан через внутрішню чергу стану NPC.
При виявленні зберігається combat_memory[npc_id] = time_global(). На наступних тіках перевіряється дельта з поточним часом. Якщо менше memory_duration — повторна перевірка пропускається.
Перевіряється level.get_time_hours(). Якщо час між night_start = 21 і night_end = 6 і увімкнено night_stealth_enabled — застосовується night_factor.
Зчитується level.rain_factor(). Якщо значення вище нуля — застосовується rain_bonus. Туман визначається через level.get_fog_density().
Обчислюється вектор між позицією актора і NPC. Якщо ворог вище і вертикальна складова перевищує поріг, а density > sparse_threshold — захист від виявлення зверху не діє.
Всі параметри зберігаються через ui_mcm.get(). Значення зчитуються щотіку в on_enemy_eval — зміни набирають чинності без перезапуску гри.
Розширює Stealth 2.31 без заміни його файлів — патчить через RegisterScriptCallback. Потребує MCM для налаштування. Сумісний з будь-якими модами що не замінюють on_enemy_eval.
Стелс від трави працює виключно коли ти присів або лежиш. Встав — і ти одразу видимий, навіть якщо стоїш у найгустіших заростях.
Лежачи ти вдвічі непомітніший ніж просто у присяді. У густій траві лежачи ворог може пройти буквально поруч і не помітити. Завжди лягай якщо є час.
Увімкнений ліхтар миттєво скасовує весь стелс. Ані трава, ані ніч, ані дощ — вже не мають значення. Перед тим як ховатися — завжди вимикай світло.
З 21:00 до 06:00 ворог бачить дуже погано. Навіть на відкритій місцевості без жодної трави — шанс що тебе помітять мінімальний. Плануй найнебезпечніші маршрути на ніч.
Зброя в руках нічого не міняє — тебе бачать однаково. Але після пострілу всі вороги в радіусі чують де ти. Глушник у 3–6 разів скорочує цей радіус.
Якщо ворог стоїть на пагорбі або даху і дивиться вниз — трава дає значно менший захист. Уникай низин де ворог знаходиться вище тебе.
У погану погоду вороги реагують пізніше і з меншої відстані. Замість того щоб чекати на ясну погоду — використовуй дощ щоб підійти ближче або перетнути відкриту ділянку.
Якщо ворог вже стріляє в тебе — трава не допоможе. Потрібно спочатку відійти за укриття, перечекати, і тільки після того як він заспокоїться — знову ховатися.
Висока і густа трава — надійне укриття. Низька або рідка — майже не допомагає. Якщо трава нижча за коліно або зовсім відсутня — стелс від рослинності не спрацює.
Будь-який удар ножем, рукою або прикладом тимчасово вимикає стелс на кілька секунд. Якщо бʼєш — роби це і відразу відходь, не чекай.
Після того як ворог тебе помітив — він памʼятає де ти ще 15 секунд. У цей час повторно сховатися неможливо. Спочатку відійди, потім ховайся.
Зомбі і бандити помічають тебе погано. Армія, Борг і Моноліт — максимально уважні. Підходити до армійського блокпоста вдень значно небезпечніше ніж до табору ренегатів.
Шанс що тебе помітять вдень при ясній погоді. Вночі та в дощ — значно нижче у всіх.
На мутантів час доби та погода не впливають — вони орієнтуються не тільки зором.
Всі вороги в цьому радіусі чують постріл і знають звідки він. Глушник суттєво скорочує цю відстань.
| Тип зброї | Без глушника | З глушником |
|---|---|---|
| ВСС / ВАЛ / ВСК-94 | 5 м | 5 м |
| Пістолет | 60 м | 10 м |
| Пістолет-кулемет | 80 м | 15 м |
| Дробовик | 80 м | 80 м |
| Штурмова гвинтівка | 100 м | 40 м |
| Снайперська гвинтівка | 120 м | 30 м |
* Дробовик — глушник практично не дає ефекту через конструктивні особливості. ВСС / ВАЛ / ВСК-94 — завжди тихі незалежно від глушника.
With this mod, grass becomes real cover. Crouch or go prone in vegetation — and enemies walk right past you without noticing. Stand up — and all that grass around you stops mattering instantly.
Stealth depends on how tall and dense the grass actually is in the current location. If the grass is low or absent — there's nowhere to hide, the mod won't help. But at night, in rain, or in fog — enemies can barely see you even in open terrain.
Important: what weapon you hold does not make you more visible. Enemies don't spot you more easily because you're carrying a rifle instead of a pistol. But every shot you fire is a sound — and every enemy within range hears exactly where you are. A suppressor significantly cuts that radius.
Opens the binary file $game_levels$/level_name/level.details via io.open(path, "rb") and parses its chunk structure:
Chunk 0 — grid header: offset ox / oz, size sx / sz, cell step DETAIL_CELL = 2.0 m.
Chunk 2 — slot data: 16 bytes per cell (f32 Y + two 32-bit bitmasks).
Actor position → cell index: cx = floor(pos.x / 2.0) + ox.
Two bitmasks are read — each bit = one grass detail object instance in that cell.
Popcount (0–64 set bits) is calculated.
Popcount distinguishes decorative grass from real field grass:
pc ≤ 8 — asphalt or road decoration (pc 4–6) → stealth does not activate.
pc 15–25 — real field grass → full cover.
Cover formula: cover = clamp((pc − 8) / 13, 0, 1).
Cached for 300 ms to avoid reading the file every frame.
Reads r__detail_height from the engine console as a soft penalty when the player has reduced grass height in graphics settings: hf = clamp(h / 0.7, 0.2, 1.0). Final cover = cover × hf.
Hooks into the on_enemy_eval callback of Stealth 2.31 and modifies flags.result. If stealth conditions are met — detection is cancelled for the current tick.
Before each stealth calculation, obj:best_enemy() is checked. If the NPC already has the actor as an active target — flags.result is not cleared. Prevents false stealth during active combat.
Hooks actor_on_weapon_fired. Determines weapon type and silencer presence. Enemies within the detection radius receive a hostile state via the NPC internal state queue.
On detection, stores combat_memory[npc_id] = time_global(). Subsequent ticks compare the delta against the current time. If below memory_duration — the check is skipped.
Reads level.get_time_hours(). If the time falls between night_start = 21 and night_end = 6 and night_stealth_enabled is true — night_factor is applied.
Reads level.rain_factor(). If the value is above zero — rain_bonus is applied. Fog is determined via level.get_fog_density().
Computes the vector between actor and NPC positions. If the enemy is above and the vertical component exceeds the threshold while density > sparse_threshold — overhead protection is disabled.
All parameters are read via ui_mcm.get() on every tick inside on_enemy_eval. Changes take effect immediately — no game restart required.
Extends Stealth 2.31 without replacing any of its files — patches via RegisterScriptCallback. Requires MCM for configuration. Compatible with any mod that does not override on_enemy_eval.
Vegetation stealth only works while crouching or lying prone. Stand up — and you're immediately visible, even if you're standing in the thickest overgrowth.
Lying down makes you twice as hard to spot compared to crouching. In dense grass, an enemy can pass within arm's reach and not notice you. Always go prone if you have time.
An active flashlight instantly cancels all stealth. Grass, night, rain — none of it matters anymore. Always turn your light off before going into stealth.
From 21:00 to 06:00 enemies can barely see. Even in open terrain with no grass at all — the chance of being spotted is minimal. Plan your most dangerous routes after dark.
Your weapon in hand changes nothing. But after firing, every enemy within range hears exactly where you are. A suppressor cuts that radius by 3–6x.
An enemy on a hill, rooftop, or any elevated position looking down has a better angle through the grass. Avoid terrain depressions where enemies are positioned above you.
In bad weather enemies react slower and at shorter range. Instead of waiting for clear skies — use rain to close distance or cross open ground.
If an enemy is already shooting at you — grass won't help. You need to disengage behind hard cover first, wait for the enemy to calm down, and only then return to stealth.
Tall, dense grass is reliable cover. Short or sparse grass barely helps. If the vegetation barely reaches your knees or is absent entirely — vegetation stealth won't activate.
Any melee hit — knife, fist, or butt-stock — temporarily disables stealth for a few seconds. If you strike, do it and move immediately. Don't linger.
After spotting you, an enemy remembers your position for 15 seconds. You cannot re-enter stealth during that window. Break contact first, then hide again.
Zombies and bandits rarely notice you. Army, Duty, and Monolith are always alert. Approaching an army checkpoint in daylight is far more dangerous than sneaking past a renegade camp.
Base detection chance during daytime in clear weather. At night and in rain — much lower for everyone.
Mutants don't rely on sight alone — time of day and weather have no effect on them.
Every enemy within this range hears your shot and knows where it came from. A suppressor cuts the distance significantly.
| Weapon Type | No Suppressor | With Suppressor |
|---|---|---|
| VSS / VAL / VSK-94 | 5 m | 5 m |
| Pistol | 60 m | 10 m |
| SMG | 80 m | 15 m |
| Shotgun | 80 m | 80 m |
| Assault Rifle | 100 m | 40 m |
| Sniper Rifle | 120 m | 30 m |
* Shotgun — suppressor has virtually no effect due to how the weapon operates. VSS / VAL / VSK-94 — always quiet regardless of suppressor.