20260806b — v2.24.48 | UPD: Cybrp ItemDrawers 1.2.5. updateType=patch. 20260806a — v2.24.47 | REN: ItemDrawers 1.2.4 — отображаемое имя BROHEIM ItemDrawers → Cybrp ItemDrawers (BepInEx name, логи, баннер). GUID kg.ItemDrawers без изменений. updateType=patch. 20260804d — v2.24.46 | FIX: ItemDrawers 1.2.3 — убраны HarmonyX warnings: мёртвый AccessTools-поиск m_selectedLanguage/m_currentLanguage заменён на кэш GetSelectedLanguage()/m_language + SetupLanguage override; CS0109 Log исправлен. updateType=patch. 20260804c — v2.24.45 | FIX: ItemDrawers 1.2.2 — цвет баннера Tiffany #0ABAB5: запись напрямую в BepInEx ConsoleStream + Virtual Terminal (ANSI truecolor); раньше System.Console перехватывался и escape-коды показывались текстом. updateType=patch. 20260804b — v2.24.44 | NEW: ItemDrawers 1.2.1 — ASCII-баннер CYBRP — ITEMDRAWERS в консоли при загрузке (цвет Tiffany #0ABAB5). updateType=patch. 20260804a — v2.24.43 | FIX: ItemDrawers 1.2.0 — (1) Цвета кружка редкости: чтение приватных полей EpicLoot (_epicRarityColor, _legendaryRarityColor и т.д.) вместо неверного метода EnchantingUIController.GetRarityColor (который возвращал цвета материалов крафта, а не редкости). (2) NEW: Harmony patch EpicLoot.ItemDataExtensions.GetDisplayName — повторный lookup имени легендарного предмета из переведённого конфига вместо сохранённого английского DisplayName в customData. Исправляет 'Enchanted Defensive Shield' → 'Зачарованный Защитный Щит' для существующих предметов. (3) NEW: Hover text ящика теперь показывает EpicLoot-имя (например 'Магич. Деревянный щит') вместо ванильного имени. updateType=patch. 20260803j — v2.24.42 | FIX: ItemDrawers 1.1.9 — цвет Legendary исправлен: Teal теперь (0, 0.5, 0.5) вместо (0, 1, 1) (соответствует EpicLoot's named color 'Teal'). Поиск EpicLoot API GetRarityColor через reflection по всем типам сборки. updateType=patch. 20260803i — v2.24.41 | FIX: ItemDrawers 1.1.8 — цвета кружка редкости теперь берутся из EpicLoot API (через reflection), а не захардкожены. Добавлено подробное логирование: GetEpicLootRarity (raw json, parsed value), GetRarityColor (EpicLoot API vs fallback), InvokeUpdateIcon (rarity, color, vec, customData keys), RPC_UpdateIcon (color32, active, parent, size). updateType=patch. 20260803h — v2.24.40 | FIX: ItemDrawers 1.1.7 — кружок редкости уменьшен вдвое (32→16px). NEW: Переведены все непереведённые названия и описания легендарных предметов в патчах MajesticBalances (LegendarySets + MythicSets) — 72+72 предмета и 9+9 наборов, включая 'Enchanted Defensive Shield' → 'Зачарованный Защитный Щит'. updateType=patch. 20260803g — v2.24.39 | FIX: ItemDrawers 1.1.6 (rebuild) — Harmony patch параметр 'lang' переименован в 'language' (имя параметра должно совпадать с оригинальным методом SetupLanguage(string language)). FIX: Кружок редкости — создан как дочерний элемент _image вместо корня canvas. updateType=patch. 20260803f — v2.24.38 | FIX: ItemDrawers 1.1.6 — локализация: язык всегда определялся как 'English' т.к. поле m_selectedLanguage не найдено. Теперь параметр lang из SetupLanguage() используется напрямую. FIX: Кружок редкости — создан как дочерний элемент _image (который уже рендерится) вместо корня canvas. updateType=patch. 20260803e — v2.24.37 | FIX: ItemDrawers 1.1.5 — локализация: токены регистрировались с префиксом '$', но Valheim Localize() ищет без '$'. Исправлено — ключи теперь регистрируются без '$'. FIX: Кружок редкости — увеличен размер (14→32px), установлен z-position для рендера поверх меша, добавлен raycastTarget=false. updateType=patch. 20260803d — v2.24.36 | FIX: ItemDrawers 1.1.4 — локализация: токены не регистрировались (m_translations field не найден или Localization.instance null при инициализации). Добавлено логирование ошибок, отложенная регистрация. FIX: Кружок редкости — GetEpicLootRarity теперь парсит Rarity напрямую из m_customData JSON (без EpicLoot API, работает на сервере). updateType=patch. 20260803c — v2.24.35 | NEW: ItemDrawers 1.1.3 — собственная независимая система локализации мода (встроенные JSON-файлы English.json и Russian.json в DLL). Токены $broheim_id_* регистрируются через reflection в Valheim Localization. Перехват смены языка через Harmony patch (Localization.SetupLanguage). Все строки UI, подсказок и сообщений переведены через токены. По умолчанию английский, русский — при выборе русского языка в игре. updateType=patch. 20260803b — v2.24.34 | NEW: ItemDrawers 1.1.2 — индикатор редкости зачарования в виде цветного кружка в правом верхнем углу ящика (вместо окрашивания цифр). Magic=синий, Rare=жёлтый, Epic=фиолетовый, Legendary=бирюзовый, Mythic=оранжевый. Цифры количества остаются цвета Тиффани. updateType=patch. 20260803a — v2.24.33 | NEW: ItemDrawers 1.1.1 — стак только одинаковых зачарований (StackOnlySameEnchantment, по умолчанию вкл) — предметы с разными зачарованиями больше не смешиваются в одном ящике. NEW: Цветовая индикация редкости зачарования на ящике (RarityColorEnabled) — Magic=синий, Rare=жёлтый, Epic=фиолетовый, Legendary=бирюзовый, Mythic=оранжевый. FIX: QuickStack для зачарованных предметов — проверка совпадения зачарования при автоскладывании. TR: EpicLoot legendaries.json — переведены все 190 hardcoded английских названий и описаний легендарных/мифических предметов (Зачарованный Защитный Щит и т.д.). updateType=patch. 20260802u — v2.24.19 | FIX: TargetParameterCountException при помещении зачарованного предмета в ящик — byte[] не поддерживается как тип параметра RPC в Valheim, конвертация в base64 string. updateType=patch. 20260802t — v2.24.18 | NEW: Гибридное хранилище для зачарованных предметов (EpicLoot). Предметы с m_customData (зачарования, модовые данные) теперь сохраняются индивидуально через ZPackage-сериализацию — при выдаче возвращаются со всеми эффектами, прочностью, именем кузнеца. Ванильные предметы по-прежнему используют счётчик (эффективно). Quick Stack (P) пропускает зачарованные предметы — их нужно класть вручную. При разрушении ящика зачарованные предметы выпадают индивидуально. Общее количество (ванильные + зачарованные) отображается на ящике. updateType=patch. 20260802s — v2.24.17 | UPD: AzuExtendedPlayerInventory 2.4.1 → 2.4.2. DEL: RtDQuestForge (Soloredis) — мод удалён. FIX: ItemDrawers — предупреждение HarmonyX "Could not find type QuickStackStore.QSSConfig" — добавлена проверка загрузки сборки перед AccessTools.TypeByName. FIX: Сайт — BROHEIM-ItemDrawers 404 на Thunderstore (алиас команды BROHEIM_CYBRP в build_data.py и check_updates.py). updateType=patch. 20260802r — v2.24.16 | FIX: OdinHorse — добавлен токен horse_cart (Конная повозка) — мод определяет два токена для "Horse Cart" (pin_cart и horse_cart), но только pin_cart был переведён. FIX: ItemDrawers API — ItemDrawers_API.cs искал сборку "BroheimItemDrawers" вместо правильной "kg_ItemDrawers" — API для сторонних модов не работал. updateType=patch. 20260802q — v2.24.15 | FIX: Обводка/тень не отображались — динамически созданный шрифт Norse получает Mobile SDF шейдер (TextMeshPro/Mobile/Distance Field), который не поддерживает OUTLINE/UNDERLAY. Теперь в ApplyTextEffects шейдер материала переключается на полный SDF (TextMeshPro/Distance Field) перед установкой свойств обводки/тени. Добавлен диагностический лог переключения шейдера. updateType=patch. 20260802p — v2.24.14 | FIX: ApplyTextEffects — обводка/тень не отображались. Причина: text.fontMaterial = new Material(src) (setter) просто устанавливает m_sharedMaterial, но при рендеринге TMP вызывает getter fontMaterial → GetMaterial() → CreateMaterialInstance, создающий НОВЫЙ instance, на котором свойства не были установлены. Исправлено: теперь используется GETTER text.fontMaterial (создаёт instance), затем свойства ставятся на возвращённый instance + SetAllDirty() для принудительной перерисовки. updateType=patch. 20260802o — v2.24.13 | FIX: ApplyTextEffects — NullReferenceException (156 ошибок) при set_outlineWidth на динамически созданном шрифте Norse. Свойства обводки/тени теперь задаются напрямую через material.SetFloat/SetColor (не через text.outlineWidth который вызывает SetOutlineThickness и падает). Добавлен null-чек fontSharedMaterial и try-catch вокруг всего метода. updateType=patch. 20260802n — v2.24.12 | NEW: Обводка и тень для цифр на ящиках — добавлены конфиги TextEffects (OutlineEnabled, OutlineWidth, OutlineColor, ShadowEnabled, ShadowColor, ShadowOffset, ShadowSoftness). Материал шрифта клонируется в instance (fontMaterial) чтобы не затронуть другие тексты игры. Обводка (OUTLINE_ON) + тень (UNDERLAY_ON) применяются к цифрам количества и к числу качества. updateType=patch. 20260802m — v2.24.11 | FIX: NorseFontLoader — метод TMP_FontAsset.CreateFontAssetFromFont не существует в версии TMP Valheim; правильное имя — CreateFontAsset. Переписан NorseFontLoader с 3 стратегиями загрузки TTF: (1) CreateFontAsset(fontFilePath) — прямая загрузка из файла, (2) CreateFontAsset(Font) через Unity Font, (3) fallback по имени OS-шрифта. Шрифт Norse-Bold теперь должен корректно применяться к цифрам на ящиках. updateType=patch. 20260802l — v2.24.10 | FIX: Категория «Ящики для предметов» — добавлен токен jotunn_cat_itemdrawers (Jotunn использует jotunn_cat_ префикс, не piecemanager_cat_). FIX: OdinHorse — добавлены клиентские токены (pin_cart → Конная повозка, horse_odin → Лошадь, и др.) — Nagir YAML был только на сервере. FIX: BetterRiding — перевод «Bonded Rider:» → «Привязанный наездник:». FIX: AzuAutoStore/AzuCraftyBoxes — перевод «is not in nearby containers» → «не в ближайших контейнерах», «is not in nearby drawers» → «не в ближайших ящиках». updateType=patch. 20260802k — v2.24.9 | FIX: Категория Ящики для предметов восстановлена через Jotunn PieceManager.AddPieceCategory. FIX: BuildBridge удалён — причина фризов (патч HaveReferences вызывался при каждом изменении инвентаря). AzuCraftyBoxes теперь обрабатывает ресурсы при строительстве/крафте. PERF: Взаимодействие с ящиками больше не вызывает фризов. updateType=patch. 20260802j — v2.24.8 | FIX: Assembly name changed to kg_ItemDrawers + added API.ClientSideV2 class — AzuCraftyBoxes now detects drawers (Type.GetType finds API.ClientSideV2, kg_ItemDrawers)). UI строительства/крафта будет корректно показывать ресурсы из ящиков. updateType=patch. 20260802i — v2.24.7 | FIX: GUID сменён на kg.ItemDrawers — AzuCraftyBoxes теперь видит ящики (UI строительства показывает ресурсы, крафт/стройка берут из ящиков). FIX: QuickStackBridge — отложенная инициализация через AssemblyLoad event (патчи применяются после загрузки QuickStackStore). FIX: BuildBridge — null-чеки, прямой доступ к ZDO, защита от NRE при shutdown. updateType=patch. 20260802h — v2.24.6 | NEW: BuildBridge — ресурсы при строительстве и крафте берутся из ближайших ящиков (патч Player.HaveRequirements и Player.ConsumeResources). FIX: Мини-версии — убраны переопределения данных. FIX: Щит с custom data — убрана блокировка. FIX: QuickStack для нестакаемых предметов. updateType=patch. 20260802g — v2.24.5 | FIX: Мини-версии печей/кузней/бродилен — убраны все переопределения данных (maxOre, maxFuel, notOnWood, groundPiece), теперь наследуют параметры оригиналов. FIX: Щит (и другие предметы с custom data от модов) не сохранялся в ящиках — убрана блокировка custom data в UseItem. FIX: QuickStack не переносил щиты (maxStackSize=1) в ящики — изменён фильтр с <=1 на <1. updateType=patch. 20260802f — v2.24.4 | FIX: FieldAccessException ItemDrop:m_nview (5654 ошибок) — автоподбор не работал (заменено на GetComponent()). FIX: MethodAccessException ItemDrop.Save() (33 ошибки) — InstantiateItem не работал (reflection). Все приватные поля Valheim заменены на публичные методы/reflection. updateType=patch. 20260802e — v2.24.3 | FIX: FieldAccessException ItemDrop:s_instances (4137 ошибок) — автоподбор предметов не работал (reflection). FIX: FieldAccessException Humanoid:m_inventory — UseItem не работал (заменено на GetInventory()). Цвет шрифта: Тиффани #0ABAB5. Перевод: «Выдвижные ящики» → «Ящики для предметов». updateType=patch. 20260802d — v2.24.2 | FIX: FieldAccessException ObjectDB:m_itemByHash в ItemValid — предметы пропадали, цифры сбрасывались (заменено на GetItemPrefab()). Цвет шрифта ящиков: Тиффани #0ABAB5. Перевод: «Выдвижные ящики» → «Ящики для предметов». updateType=patch. 20260802c — v2.24.1 | FIX: FieldAccessException при регистрации префабов ящиков (ZNetScene.m_namedPrefabs/m_prefabs — приватные поля, заменены на reflection). FIX: Telegram-бот не мог подключиться к API (Address family not supported — DNS возвращал IPv6, принудительно используется IPv4). Добавлено отсутствующее правило маршрутизации ip rule для туннеля awg-telegram. updateType=patch. 20260802b — v2.24.0 | BROHEIM-ItemDrawers: полностью самостоятельная замена устаревшего KGvalheim-ItemDrawers v1.2.0. Объединяет в один DLL: ItemDrawers + BROHEIM-DrawerAuto + BROHEIM-QuickStackDrawersBridge. Исправлен критический баг NullReferenceException в DrawerComponent.Repeat() (item.m_nview.ClaimOwnership() без null-check — ломал строительство). Префабы и ZDO-поля сохранены для совместимости с существующими ящиками в мире. Цвет цифр по умолчанию — бирюзовый (вместо красного). Размер шрифта цифр уменьшен вдвое. Авто-кормление станций (Smelter/Cooking/Fireplace/Fermenter/Beehive/SapCollector) и интеграция с QuickStack (P — склад в ящики, L — ресток из ящиков) работают через прямой доступ к API без reflection. Лаунчер автоматически удалит 3 старых мода через removals-список и установит новый. updateType=minor — обновить клиент через лаунчер, сервер уже перезапущен. 20260802a — v2.23.0 | Удалён мод Smoothbrain-Cooking (навык кулинарии, buff'ы от готовки). CookingAdditions (blacks7ar) оставлен — это отдельный мод. BROHEIM-RU перевод Cooking также удалён. Лаунчер автоматически удалит файлы у клиентов через removals-список. updateType=minor — сервер перезапущен, клиент обновить через лаунчер. 20260801b — v2.22.10 | Оптимизация: борьба с прогрессирующими тормозами от накопления ZDO (135K на сервере). 1) FGN Max Active ZDOs снижен с 500K до 130K — очистка осиротевших ZDO теперь запускается при превышении порога. 2) OneMap RadarRadius снижен с 150 м до 50 м для всех биомов и категорий (14 секций) — меньше пинов обнаружения = меньше генерация ZDO при исследовании. 3) FGN Log Send Queue Heartbeat + Large ZDO Diagnostics включены для диагностики. 4) Сервер: таймзона установлена на Asia/Novosibirsk (UTC+7), ежедневный рестарт перенесён на 6:00 НСК. Конфиги синхронизированы в клиентский модпак. updateType=patch. 20260801a — v2.22.9 | PassivePowers: отключены горячие клавиши активации способностей (Alt+1..7 → None). Активация теперь только через UI. Конфиги обновлены на сервере и в клиентском модпаке (шорткаты не синхронизируются сервером — каждый клиент использует свой локальный конфиг). updateType=patch. 20260731j — v2.22.8 | FIX: все хеши навыков были неправильные! Использован простой djb2 вместо ванильного GetStableHashCode (двухаккумуляторный). Пересчитаны все skill_ токены: Mining (skill_1408976878), Sailing (skill_2143840399), DualWield (5 навыков), Fermenting (skill_2016410895), Hunting (skill_405490625). Также исправлен формат description: skilldesc_ вместо skill__desc. updateType=patch. 20260731i — v2.22.7 | FIX v2: добавлен добор 's'→'с' для последних секунд в пасеке/смолоуловителе (в конце строки, без \r\n). Проверены все fragments во всех broheim-ru-* — ни одного глобального 's'→'с' не осталось. Экран «Изменения» (ванильный ChangeLog) больше не должен ломаться. updateType=patch. 20260731h — v2.22.6 | FIX: глобальные fragments "s\n"→"с\n" ломали все 's' на концах строк в игре (мод-UI, tooltip'ы). Переведены на точечные patches.tsv — замены применяются только к возвращаемым значениям методов AzuHoverStats (TimeCalc, GetFireplaceString, GetBeehiveString, GetSapCollectorString, GetCookingStationString). Формат времени "11h 06m 40s"→"11ч 06м 40с" работает как прежде. updateType=patch. 20260731g — v2.22.5 | PassivePowers: сокращены переводы эффектов способностей для умещения в UI. Формат «Свойство: +X%» вместо длинных предложений. Пример: «Снижает расход выносливости при беге на 50%.» → «Бег: −50% расход выносливости.». updateType=patch. 20260731f — v2.22.4 | Формат времени везде переведён: "11h 06m 40s" → "11ч 06м 40с". Добавлены fragments в broheim-ru-azuhoverstats (топливо факелов/печей, таймеры пасеки/смолоуловителя). updateType=patch. 20260731e — v2.22.3 | Доперевод: WackysDatabase — Small Fermenter (Малая бродильня), Small Spinning Wheel (Малое прядильное колесо) + их описания («Крошечная версия бродильни/прядильного колеса»). OdinHorse — «Sit on the Horsie» (Сесть на коняшку), hover-тексты взаимодействий: «Remove Armor» (Снять броню), «Resume/Wait Here» (Продолжить движение/Ждать здесь), «Open Saddlebags» (Открыть седельные сумки). updateType=patch — обновить клиент через лаунчер. 20260731d — v2.22.2 | ТЕСТ автообновления лаунчера 1.2.0 (контент = 2.22.1, только bump версии). Ожидается: красный мигающий индикатор в трее → авто-чистая установка → зелёный огонёк. 20260731c — Launcher 1.1.25 → 1.2.0 (Electron, не VBS). Лаунчер теперь всегда живёт в трее: запуск игры сворачивает его в трей, а не закрывает (полный выход — только через «Выход» в меню трея). Полностью автоматическая установка обновлений модпака: при появлении новой версии лаунчер сам скачивает и ставит её чистой переустановкой в фоне (если Valheim не запущен), с уведомлениями в трее. Иконка в трее с индикатором: зелёный огонёк — всё актуально, красный мигающий — есть обновление. Добавлена настройка «Автоустановка обновлений модпака» (можно отключить, тогда только индикатор + ручные кнопки). Кнопки «Обновить и запустить» и «Полная переустановка» сохранены. VBS-установщик окончательно удалён (Electron-лаунчер — единственный). Самообновление лаунчера (electron-updater) раздаёт 1.2.0 всем существующим установкам автоматически. 20260731b — v2.22.1 | актуальные серверные конфиги 4 модов навыков Smoothbrain теперь едут в клиентском модпаке (раньше — только через ServerSync при заходе). Cooking: Health/Stamina/Regen/Eitr Increase Factor=1.8, Crafting Time Reduction=50, Happy Buff Duration=10, Happy Buff Strength=1.3, Skill Experience Gain Factor=2. DualWield/Mining/Sailing — на дефолтах автора (server-locked, синкаются). updateType=patch — обновить клиент через лаунчер. 20260731 — v2.22.0 | 4 новых мода навыков Smoothbrain (blaxxun-boop, embedded SkillManager+ServerSync, только BepInEx-зависимость): DualWield 1.0.10 (5 навыков парного оружия: топоры/дубины/ножи/мечи/оффхенд), Cooking 1.2.2 (бонус ванильного навыка Готовка 105: «Happy»-бафф за идеальное блюдо + бонус к скорости), Mining 1.1.6 (бонус к добыче руды + «взрывной майнинг» с ур.50), Sailing 1.1.8 (скорость/прочность корабля + радиус разведки карты + «толкнуть корабль»). Совместимость проверена декомпиляцией: конфликтов с blacks7ar-CookingAdditions/OreMines/BoatAdditions нет (аддитивные, разные методы), с BowsBeforeHoes/Therzie — нет. Полный русский перевод через data-only пакеты BROHEIM-RU (без DLL): broheim-ru-dualwield (10 токенов навыков), broheim-ru-mining (токен + сообщения взрывного майнинга), broheim-ru-sailing (токен + 4 сообщения + «Толкнуть корабль»), broheim-ru-cooking (статус «Воодушевление» + тултипы). Ставится на сервер + клиент. updateType=minor — обновить клиент через лаунчер, сервер уже перезапущен с модами (4 мода загрузились, ConfigSync RPC зарегистрированы, ошибок нет). 20260730b — добавлены мини-версии ресурсных зданий (WackysDatabase, категория молотка TinyVersions): Small Smelter (x0.7), Small Kiln (x0.5), Small Blast Furnace (x0.75), Small Eitr Refinery (x0.6), Small Windmill (x0.7), Small Fermenter (x0.6), Small Spinning Wheel (x0.6). Затраты строительства пропорциональны размеру от ванильных. Клоны ванильных префабов, функциональность наследуют. Сервер-side, раздаётся клиентам через ServerSync (клиентский модпак не тронут). Все 7 зарегистрированы без ошибок, сервер перезапущен. 2.21.0 — обновление модов: WackysDatabase 2.5.12→2.5.13, OdinHorse 1.6.4→1.6.5. RU-перевод OdinHorse (Nagir) и конфиги сохранены. Сервер перезапущен, оба мода загрузились без ошибок. 20260730a — счётчик загрузок на сайте теперь real-time: считает клики лаунчера (.exe) + модпака (.zip) через считающий endpoint (X-Accel-Redirect, nginx стримит файл сам, range/resume работает). Кнопки сайта и manifest ведут через /dl/. Фронт опрашивает каждые 20с. 2.20.1 — убран сохранённый пароль сервера из QuickConnect (пароль вводится вручную) 20260729b — v2.20.0 | FiresGhettoNetworking 1.3.10 (VerdantsAscent) — сетевая оптимизация + server-authority. ZSTD-компрессия пакетов, ZDO delta-compression, расширенная предзагрузка зон (server-side, +1 слой вокруг игроков — сглаживает фризы на границах зон), AI LOD/throttling, WearNTear CPU-skip для целых кусков, bulk transfer queue boost для ServerSync-модов. Авто-тюн: сервер определил tier=High (12 ядер / 23 ГБ ОЗУ), клиентский авто-тюн сработает при заходе игрока (probe → LOW/MED/HIGH, кеш 7 дней). Конфиги не трогать — автор просит оставить дефолты. Ставится на сервер + клиент. updateType=minor — обновить клиент через лаунчер, сервер уже перезапущен. 20260729 — v2.19.0 | RtDLegends 1.3.43 → 1.3.46 (обновление мода от автора; логика регистрации данжей идентична — 83 кастомные комнаты через Jotunn DungeonManager, без новых конфигов). Кастомный русский перевод сохранён (доп. токены SE_ArcherArmor*/SE_FairyHeal/SE_FairyShield, которых нет в стоке). updateType=minor — обновить клиент через лаунчер, сервер уже перезапущен с модом. 20260726 — v2.18.0 | Backpacks 1.3.8 с нуля (Smoothbrain) + broheim-ru-backpacks (полный перевод стокового рюкзака: 9 токенов + labels/fragments). Без Backpacks.Wizardry.yml. DrawerAuto 1.7.1: Radius/SmelterRadius=12 (забор из ItemDrawers для печей/станций). updateType=minor — обновить клиент через лаунчер, сервер уже с модом. 20260726e — v2.17.27 | PassivePowers: макс. силы, активка+пассивка, русификация. PassivePowers: - Maximum boss powers = 7 (максимум). - Min kills (Active) = 1 у всех боссов — активные силы включены (раньше -1 = выкл). - Activation spread = Everyone (без изменений). - Пассивка: Min kills (Passive) = 1. Русификация: - Пакет broheim-ru-passivepowers (47 токенов powers_*). updateType=patch. 20260726d — v2.17.26 | ProximityVoice 0.2.1 (голос на всю карту). ProximityVoice: - Установлен на сервер и в клиентский модпак. - HearingRange=10000, FullVolumeRange=10000 — слышно всех игроков на карте (без модификации DLL). updateType=patch. 20260726c — v2.17.24 | Перевод навыков + fragment для "Rock". BROHEIM-RU: - Добавлены 52 токена навыков в vanilla_fixes.txt (msg_skillup, skill_swords, skill_knives, и т.д. — всего 26 навыков + 26 описаний). - Добавлен fragment "Rock" → "Камень" в _fragments.tsv (для декоративных камней с литеральным m_name). updateType=patch. 20260726b — v2.17.23 | Перезапуск 7:00 NSK, PassivePowers, обновления WackysDB/OdinHorse. Перезапуск сервера: - Cron 0 0 * * * UTC = 7:00 NSK (UTC+7), скрипт /opt/valheim/scripts/daily_restart.sh. - Graceful SIGINT (чистый сейв), подавление Telegram-уведомлений (state.json). Моды: - Smoothbrain-PassivePowers 1.1.5 — новый мод (пассивные силы боссов). - WackyMole-WackysDatabase 2.5.11 → 2.5.12 — обновление. - OdinPlus-OdinHorse 1.6.2 → 1.6.4 — обновление. updateType=patch. 20260726 — v2.17.22 | Ротация бэкапов 24ч/неделя/месяц + OneMap дедупликация пинов. Бэкапы: - Скрипт backup_world.sh переписан: hourly (24 часа), weekly (12 недель), monthly (3 месяца). - Еженедельный архив создаётся по понедельникам, ежемесячный — 1-го числа. - Старые hourly бэкапы (30 дней) удалены, освобождено ~6.7 ГБ (89% → 75% диска). OneMap (дедупликация пинов): - BroheimOneMapPinFix 1.4.9: Harmony Prefix на MapPinSynchronizer.SendPinToServer. - Клиентский кэш отправленных discovery-пинов (радиус 5м, TTL 300с). - Повторные RPC на сервер для уже существующих пинов полностью подавляются. - Устраняет сотни избыточных сетевых запросов и нагрузку CPU при повторном входе в зоны. updateType=patch. 20260725c — v2.17.18 | Починка локализации квестов RtDQuestForge (токены не резолвились на клиенте). RtDQuestForge: - Токены квестов (rtdq_q_*) и UI-токены (rtdqf_*) добавлены в BROHEIM-RU Words (vanilla_fixes.txt). - BROHEIM-RU Translate_Patch перехватывает токены раньше Jotunn, возвращает русский текст. - English.json в translations/ также обновлён с русским текстом (fallback). updateType=patch. 20260725b — v2.17.17 | RtD квесты переведены на русский + 10 новых квестов с возрастающей сложностью. RtDQuestForge (квесты): - Переведены на русский все 4 стандартных квеста (через $token локализацию + Russian.json). - Создан rtd_legends_quests.json с 10 новыми квестами, образующими цепочку от Meadows до Mistlands. - Цепочка: Лесные угрозы → Охота на троллей → Болотные твари → Костяная угроза → Горные угрозы → Король Фенрир → Равнинная война → Король Гоблинов → Туманные охотники → Королева Пауков. - Сложность: Common → Uncommon → Rare → Epic → Legendary. Награды растут от 20 до 250 монет + RtD токены. - RtD боссы как цели: MountainBoss_RtD (Король Фенрир), PlainsBoss_RtD (Король Гоблинов), SpiderQueen_RtD (Королева Пауков). - Создан translations/Russian.json со всеми UI-токенами (Журнал заданий, Принять, Отменить, Убить, Собрать, Награда, и т.д.) + токенами квестов. - Всего: 14 квестов из 2 файлов (4 стандартных + 10 новых). updateType=patch. 20260725 — v2.17.16 | Убраны обычные модовые существа с радара + TTS debounce (починка двойной озвучки). OneMap (радар существ): - Убраны с радара все обычные модовые океанские существа: 15 SeaAnimals (SA_*) + 18 RtDOcean (AnimalCod, AnimalCrab, Belzor, BoneFish, CatFish, Shark, и т.д.). - SeaAnimals.customprefabs.txt: все Critter:Ocean отключены (true → false). - RtDOcean.customprefabs.txt: все Critter:Ocean отключены (true → false). - creatures.txt: 15 SA_* записей удалены. Остались только ванильные: 12 рыб, Змей, Левиафан. - На радаре остались только: боссы (14), минибоссы (7), ванильные океанские существа (14). TTS (двойная озвучка): - Bug: одна и та же фраза зачитывалась дважды (ворон, руны). Причина: несколько Harmony-хуков ловят одно сообщение (LoreTextHook на TextViewer.ShowText + NpcDialogueHook на Chat.SetNpcText), и SpeechQueue.Enqueue() не имел дедупликации. - Fix: добавлен глобальный debounce в SpeechQueue.Enqueue() — одинаковый текст в течение 2.5 секунд подавляется, независимо от того, какой хук сработал. - Лог: "Enqueue: debounced duplicate text" при срабатывании. OneMap (RtD подземелья — проверка): - Подтверждено по логам: RtD-подземелья ОТМЕЧАЮТСЯ на карте. При заходе игрока созданы пины "Подземелье Лугов" и "MeadowsAltar_RtD" (17 → 19 пинов). OneMap сам отбрасывает дубликаты. updateType=patch. 20260724 — v2.17.15 | RtD локации на карте (подземелья, алтари, святилища) + PinFix 1.4.8 (убран RunestonePinCleaner). OneMap (RtD локации): - OneMap не автодетектит RtD-локации (Jotunn ZoneManager не сканируется OneMap). Создан RtDLocations.customprefabs.txt с 59 RtD-локациями. - Подземелья (8 биомов): Meadows_DG_RtD, BlackForest_DG_RtD, Swamp_DG_RtD, Mountain_DG_RtD, Plains_DG_RtD, Mistlands_DG_RtD, AshLands_DG_RtD, DeepNorth_DG_RtD + theme names. - Алтари боссов (7): MeadowsAltar_RtD (Эйктюр), BlackForestAltar_RtD (Король Троллей), SwampAltar_RtD (Повелитель Болот), MountainAltar_RtD (Король Фенрир), PlainsAltar_RtD (Король Гоблинов), MistlandsAltar_RtD (Королева Пауков), NecromancerAltar_RtD (Некромант) — с значками трофеев. - Входа в подземелья (10): *_Entrance_RtD + *_Entrance_Boss_RtD (Mountain, Mistlands). - Святилища (2): SpiritShrine_RtD (Дух), ThorShrine_RtD (Тор). - Руины (4): FaeRuins1/2_RtD, GothicRuin1/2_RtD. - Прочее: FaeSpawner_RtD (Призыватель Фей), FaeTree_RtD (Дерево Фей), DragonBoarRuinStone_RtD (рунический камень). - Вегвизиры (6): VegvisirMeadows/BlackForest/Mountain/Plains/Mistlands_RtD + Vegvisir_Necromancer_RtD. - Все 59 keywords добавлены в TrackedDiscovery + TrackedRadar. Аббревиатуры (русские имена пинов) добавлены в cfg. - Show на минимапе = true для всех RtD-локаций. PinFix 1.4.8: - Полностью удалён RunestonePinCleaner (по требованию пользователя). Очистка рунных камней выполнена разово в v1.4.7, больше не нужна. updateType=patch. 20260723b — v2.17.11 | Перевод непереведённого (Вегвизир Pin, Ancient Bowl, Burn item) + убраны пины рунных камней + значки трофеев на радаре. BROHEIM-RU (перевод): - "Вегвизир Pin" → "Вегвизир Метка": ванильный Vegvisir.cs имеет m_hoverName = "Pin" (хардкод, не токен). Добавлен фрагмент " Pin\n" → " Метка\n" в _fragments.tsv. - "Ancient Bowl" → "Древняя чаша", "Burn item" → "Сжечь предмет": ванильные токены prop_eldersummoningbowl_name/use не локализовались. Добавлены в vanilla_fixes.txt (Words) + фрагменты в _fragments.tsv. - Также добавлены: Sacrificial Altar → Жертвенный алтарь, Make offering → Совершить подношение, Offer item → Пожертвовать предмет, и все piece_offerbowl_* токены. OneMap (пины рунных камней): - "Runestone" удалён из TrackedDiscovery и TrackedRadar в cfg — новые пины рунных камней больше не создаются. - Существующие пины рунных камней были удалены разовой очисткой в PinFix 1.4.7 (14 пинов). В v1.4.8 очиститель удалён. OneMap (значки существ на радаре): - Bug в OneMap 1.2.14: GetCreatureIconMap() использует DisplayName (русский) как ключ, но TryGetIcon() вызывается с MatchKeyword (английский) → значки существ НИКОГДА не работали, все показывались точками по умолчанию. - PinFix 1.4.7: Harmony postfix на GetCreatureIconMap() пересобирает словарь с MatchKeyword как ключом → 117 значков, 68 существ теперь показывают правильные иконки (трофеи/мясо/предметы). - RtD боссы: добавлены iconoverride с ванильными трофеями (TrophyFenring, TrophyGoblinBrute, TrophySeekerBrute, TrophySkeleton, TrophyFrostTroll, TrophyCharredMage, TrophyFallenValkyrie). - Минибоссы: GoblinBruteBros → TrophyGoblinBrute, Charred_Melee_Dyrnwyn → TrophyCharredMelee. - Океан: Leviathan → Chitin (как иконка). updateType=patch. 20260723 — v2.17.10 | OneMap: модовые существа на радаре переработаны + SileroTTS: голос по каналам. OneMap (радар существ): - Обычные модовые существа УБРАНЫ с радара (все 199 Critter:Modded записей отключены в *.customprefabs.txt). - Значимые модовые боссы/минибоссы ДОБАВЛЕНЫ в creatures.txt со значками трофеев: * Боссы RtD (7): Король Фенрир, Король Гоблинов, Королева Пауков, Повелитель Нежити, Король Троллей, Дух Лича, Мороносец (Тор). * Минибоссы Therzie Monstrum (3): Асмодей, Свальт, Вриколатас (значки трофеев подтверждены). - Радиус радара: Bosses/Minibosses/Ocean = 150 м (без изменений). OneMap (пин "Flintm" → русский): - OneMap 1.2.14 не биндит кастомные аббревиатуры локаций (ore mines, MWL, Beehive) — только 111 ванильных. - PinFix 1.4.5: инжектит кастомные аббревиатуры из cfg в AbbreviationEntries через рефлексию → 48 аббревиатур забинжены, синхронизируются клиентам. Пин "Flintm" → "Кремнёвая шахта" (и все ore mines / MWL / Beehive). SileroTTS 1.3.5 → 1.4.0: - Новая секция [Channel Voice] в cfg: можно задать отдельный голос (speaker) для каждого канала (Chat, Center, Runes, NPC, Dreams, RuneStones). Если пусто — используется глобальный VoiceSpeaker. updateType=patch. 20260722d — v2.15.2 | ПОЛНЫЙ ПЕРЕВОД НОВЫХ МОДОВ (RtDOcean + PotionPlus). Анализ: оба мода УЖЕ имели полноценный родной русский перевод (RtDOcean — 350 токенов в Assets/Translations/Russian/Russian_RtDOcean.json, PotionPlus — 117 токенов во встроенном PotionsPlus.translations.Russian.json), который грузится автоматически т.к. BROHEIM-RU ставит язык игры = Russian (Localization.SetLanguage("Russian")). Качество перевода — высокое (имена+описания+статус-эффекты, правильная русская проза). Найдены и заполнены ТОЛЬКО пробелы — токены, на которые ссылаются префабы, но не определённые автором ни в одном языке (отображались бы raw-токеном): RtDOcean — 6 токенов добавлены в Russian_RtDOcean.json (350→356): Fairy1_RtD=Фея, OceanCrystal=Океанский Кристалл, se_harpooned_name=Пронзён гарпуном, se_harpooned_tooltip=Вас пронзил гарпун — движение ограничено., se_tared_name=Обмазан дёгтем, se_tared_tooltip=Вы покрыты дёгтем. (остальные 350 — имена существ/предметов/культур/суши/супов/похлёбок + их описания + SE_ эффекты — уже переведены автором). PotionPlus — перевод встроен в DLL (не файл), поэтому создан пакет broheim-ru-potionplus (tokens.txt, 9 токенов), загружаемый движком BROHEIM-RU: pp_lesser/large/grand_mana_potion_se (Малое/Большое/Великое зелье маны), pp_lesser/medium/grand_eitr_se (Малое/Среднее/Великое зелье эйтра), pp_dragon_staff_shield (Щит драконьего посоха), pp_se_alcskill (Алхимический процесс), pp_se_cheatdeath_description (tooltip философского камня обмана смерти). Иерархия размеров: lesser=Малое, medium=Среднее, large=Большое, grand=Великое — в соответствии с существующими переводами зелий (vial=Малый, potion=Средний, elixir=Большой). Не переведено намеренно: всплывающий бойцовский текст "+N HP" при лечении (Character.Message) — перевод "HP"→"ОЗ" глобальным фрагментом рискован (встречается в массе других строк); "HP" общепонятно. Config-UI (ConfigurationManager, F1) остаётся английским — стандарт для модпаков. Итог: RtDOcean и PotionPlus теперь полностью на русском (имена, описания, тултипы, статус-эффекты). updateType=patch. Проверить: имена/описания зелий PotionPlus, имена океанских существ/предметов/суши RtDOcean, тултипы статус-эффектов — русский. 20260722c — v2.15.1 | ЧИСТКА stale-конфигов. В v2.15.0 в зип попали inert cfg-файлы удалённых модов (warpalicious.More_World_Locations_AIO.cfg, Therzie.Wizardry.cfg, Therzie.WarfareFireAndIce.cfg, blacks7ar.SeedBed.cfg) — старый ещё-живой серверный процесс (с загруженными модами) переписал их на диск после mv-бэкапа, до рестарта. Теперь сервер без этих модов — cfg удалены с диска и не пересоздадутся. DLL-ек удалённых модов в зипе НЕ было и нет. Пересобрано: 4 inert cfg убраны из зипа. Функционально v2.15.0 == v2.15.1 (контент тот же). updateType=patch. 20260722b — v2.15.0 | БОЛЬШАЯ РОТАЦИЯ КОНТЕНТА. Удалено 5 модов, добавлено 2. УДАЛЕНО (бэкапы в /root/backups/pre-rtdocean-20260722/): - More_World_Locations_AIO 5.0.6 (DLL + Bundles/ + assetBundleManifest_full + cfg + warpalicious.*.yml) — по запросу - Therzie.Wizardry (DLL + cfg + TherzieTranslations + EpicLoot-патчи + Backpacks.Wizardry.yml + CreatureConfig_Wizardry.yml + ValheimEnchantmentSystem req) - Therzie.WarfareFireAndIce (DLL + cfg + TherzieTranslations + EpicLoot-патчи) - Therzie.MonstrumDeepNorth (т.к. ЗАВИСЕЛ от WarfareFireAndIce — без него BepInEx отказал в загрузке: "missing dependencies: Therzie.WarfareFireAndIce"; удалён вместе с cfg + TherzieTranslations + EpicLoot bounty) - blacks7ar.SeedBed (DLL + cfg + .yml + broheim-ru-seedbed) — т.к. RtDOcean объявил SeedBed НЕСОВМЕСТИМЫМ: "Could not load [RtDOcean] because it is incompatible with: blacks7ar.SeedBed" Также удалён broheim-ru-mwl (перевод-пак для MWL) и OneMap MoreWorldLocationsAIO.customprefabs.txt (MWL-пины). ДОБАВЛЕНО: - RtDOcean 2.2.38 (Soloredis) — океанский контент: культуры, морская жизнь, суши, рапаны, дружелюбные морские существа, агрессивные хищники, подводное исследование, relic-crafting, океанский босс. 73МБ DLL с встроенными ассетами, Jotunn-зависимость удовлетворена. Встроенный РУССКИЙ перевод (Assets/Translations/Russian/Russian_RtDOcean.json). OneMap CustomPrefabScanner АВТОМАТИЧЕКИ нашёл 41 кастомный префаб RtDOcean → они появятся на радаре/пинах. - PotionsPlus 4.3.0 (OdinPlus) — зелья + улучшение навыков, server-sync. Предупреждение "Groups mod not detected" — необязательная зависимость (OdinPlus Groups), групповые зелья создаются но могут работать ограниченно; некритично. ЛОГ ЗАПУСКА СЕРВЕРА (05:08-05:09): - 73 плагина загружены. RtDOcean + PotionsPlus — ОК. Удалённые моды — отсутствуют. - Конфликты зависимостей УСТРАНЕНЫ (больше нет "incompatible" / "missing dependencies"). - Некритичные ошибки: (1) "Can't return the graphics config when it's not loaded!" — headless-сервер без GPU, безобидно; (2) IndexOutOfRangeException в kg_ItemDrawers AudioMan_Awake_Patch.Postfix (ItemDrawers.cs:133), триггер SoftReferencePrefabSpawner.Awake→Instantiate→AudioMan.Awake — серверный баг ItemDrawers на headless (нет аудио-устройства, пустой массив клипов); НЕ фатален — сервер продолжил загрузку и поднял ZNET; (3) "Failed to parse key combat_default:deathpenalty_casual:... as GlobalKeys!" — известный .fwl preset-string quirk (непечатный); (4) shader-варнинги (DepthOfField/SunShafts) — headless, нет GPU. - ZNET START, Game server connected, Steam server opened — сервер здоров. ВНИМАНИЕ КЛИЕНТУ: это минор-бамп (2.14.10→2.15.0). Лаунчер должен ПОЛНОСТЬЮ очистить BepInEx/plugins перед распаковкой нового зипа, иначе останутся stale DLL удалённых модов (MWL/Wizardry/WarfareFireAndIce/MonstrumDeepNorth/SeedBed) — клиент будет грузить их, а сервер нет → рассинхрон. Если лаунчер оверлеит без очистки — удалить папку BepInEx/plugins вручную перед обновлением. updateType=minor. 20260722 — v2.14.10 | TTS 1.3.0→1.3.3 в модпаке. Симптом v2.14.9: в клиентском логе "Broheim Silero TTS 1.3.0 loaded" — хотя 1.3.3 была собрана и залита на Thunderstore, DLL в client_extras не обновили (там оставалась 1.3.0 от 13.07). Из-за этого у юзера руны "читались слишком громко" — на 1.3.0 нет отдельного канала RuneStonesVolume и софт-клиппинга. Фикс: замена BepInEx/plugins/Broheim-SileroTTS/BroheimSileroTts.dll на сборку 1.3.3 (md5 7a764d…, из /root/BROHEIM/mods/broheim-silero-tts/bin/). 1.3.3 = пик-нормализация (target 0.74) + софт-клиппинг (tanh) + отдельный канал RuneStonesVolume + чанкование текста по предложениям (фикс "слитного" чтения заголовков). Конфиг: RuneStonesVolume 1→2 (теперь все каналы = 2; софт-клиппинг tame-ит громкость рун). Остальное без изменений. updateType=patch — обновить клиент через лаунчер, перезайти. Проверить: руны озвучиваются на комфортной громкости (не клиппит), заголовки не читаются слитно с телом. 20260720b — v2.14.9 | MWL AIO: ПЕРЕВОД ПОРТ-ТУТОРИАЛА. Симптом v2.14.8: порт-UI (вкладка туториала) — sidebar (Introduction/Port/Manifest/Shipment/Delivery/Teleport) и тела (markdown: "Ports are locations...", "How it works", "Find a port and talk to its Port Manager...", и т.д.) на английском. Анализ исходника MWL (Src/Ports/src/tutorials/PortTutorial.cs): туториалы — это HARDCODED markdown-файлы (introduction.md/port.md/manifest.md/shipment.md/delivery.md/teleport.md), embedded-ресурсы DLL, НЕ токены локализации → MWL YAML их перевести НЕ может (YAML покрывает только 111 токенов: имена торговцев, предметы, руны, UI-кнопки вкладок, диалоги портовых торговцев — те УЖЕ переведены). Фикс: расширение пакета broheim-ru-mwl — labels.tsv (sidebar: Introduction→Введение, Port→Порт, Manifest→Манифест, Shipment→Отправления, Delivery→Доставки, Teleport→Телепорт) + fragments.tsv (тела всех 6 туториалов по предложениям/буллетам, rich-text теги // сохранены). Движок BROHEIM-RU патчит и TMP_Text.SetText, и IMGUI (GUILayout/GUI.Label) — оба применяют labels(точно)+fragments(подстрока), так что тела переведутся независимо от того, какой рендер использует порт-UI. ИМЕНА ПОРТОВ (Hrafnlund и т.д.) НЕ переводятся: это сгенерированные Norse-топонимы (NameGenerator: 27 prefix × 20 mid × 14 suffix = 7560 комбинаций), переводить их по частям через fragments нельзя — части ("Iron","Storm","vik","heim"...) встречаются в массе других строк и сломают глобальный перевод; топонимы остаются Norse (стандарт для имён собственных). Пакет: fragments.tsv 66→121, labels.tsv 10→16. updateType=patch — обновить клиент через лаунчер, перезайти на сервер. Проверить: открыть порт → вкладка туториала → sidebar и тела на русском; верхние вкладки и диалоги торговцев — на русском (это из YAML, уже работало). 20260720a — v2.14.8 | MWL AIO: ПЕРЕВОД shrine-UI + названий локаций + OneMap-пины. Симптом v2.14.7: на скриншотах не переведены UI святилищ ("Odin's Shrine of The Hatchling", "Sacrifice 1x", "Duration: 30 min", "Stamina regen: +20%", "Can only be used once per day") и баннеры названий локаций ("Skald's Respite", "Midgard Outpost"). Анализ исходников MWL (Shrine.cs/ShrineUtils.cs/ShrineDB.cs) + извлечение встроенного YAML: локализация MWL содержит ТОЛЬКО 111 токенов (имена торговцев, предметы, руны, UI портов, туториалы) — shrine-UI и названия локаций ЗАХАРДКОЖЕНЫ в префабах/коде и НЕ проходят через локализацию MWL → YAML их перевести НЕ может. Фикс: 1) НОВЫЙ ПАКЕТ broheim-ru-mwl (client_extras/BepInEx/plugins/broheim-ru-mwl/, fragments.tsv 66 + labels.tsv 10) для движка BROHEIM-RU. Shrine.cs GetHoverText прогоняет ВЕСЬ hover через Localization.Localize() → движок перехватывает (LocalizeFragment_Patch + TMP_Text_SetText_Patch + Character_Message_Patch): 24 имени святилищ "Odin's Shrine of The X"→"Святилище Одина: X", фрагменты UI (Sacrifice→Принести в жертву, Duration→Длительность, once per day→раз в день, min→мин), 22 метки эффектов (Stamina/Health/Eitr regen→Регенерация, Carry weight→Переносимый вес, Speed/Stealth/Noise, *_stamina_use→Расход выносливости, Damage mods, Skill), 9 названий локаций (Skald's Respite→Приют Скальда, Midgard Outpost→Форпост Мидгарда, Garden/Temple of Eik→Сад/Храм Эйка, Tyggrasons Church→Церковь Тигграсона, Hjortkult Ruins→Руины Хьорткулта, Midgard Scout Tower→Разведывательная башня Мидгарда, Sacrificial Altar→Жертвенный алтарь, Underground Ruins→Подземные руины). Сортировка по длине EN убыв. (длинные первыми — безопасно для подстроки). 2) OneMap: MoreWorldLocationsAIO.customprefabs.txt (server BepInEx/config/OneMapToRuleThemAll/) — постоянные discovery-пины + радар-пины для значимых MWL-локаций: 12 святилищ, 9 именованных локаций, 2 данжа, 7 торговцев, 4 тренера, 6 портов (40 записей). Формат OneMap LoadLocation: Location:Keyword:DisplayName:true (Keyword=полное имя префаба, подстрока; DisplayName=метка пины БЕЗ двоеточий). Ключевые слова авто-добавляются в CustomLocationsKeywords → LocationsDiscovery + LocationsRadar (Server.Discovery/Radar/Map.Enabled=true, _ToggleAll=true уже стоит). Пины появляются по мере подхода игрока (discovery радиус 6м, radar 150м). updateType=patch — обновить клиент через лаунчер (новый пакет перевода broheim-ru-mwl) И перезапустить сервер (загрузить customprefabs.txt → OneMap начнёт ставить пины MWL-локаций). Проверить: святилище — наведение полностью на русском; баннеры локаций — на русском; на карте/миникарте — пины святилищ/торговцев/портов/данжей. 20260719s — v2.14.7 | НОВЫЙ МОД More World Locations AIO 5.0.6 (warpalicious, GUID warpalicious.More_World_Locations_AIO, both): добавляет 181 новую точку интереса (POI) по всем биомам — 179 кастомных локаций + 2 процедурных данжа (Black Forest, Swamp), торговцы NPC (7 уникальных, по одному на мир), тренеры (Skill Books), святилища (Shrines, временные баффы), waystones (пины данжей/раскрытие карты), морские порты (Shipping Ports — логистика предметов + опциональный телепорт между портами). Каждая локация спавнится до 20 раз. Ассеты через Valheim SoftReferenceableAssets (assetBundleManifest_full + 261 bundle в BepInEx/plugins/Bundles/). Локализация: клиентский конфиг warpalicious.More_World_Locations_AIO.cfg → Use Custom Localization = On + русский YAML warpalicious.More_World_Locations_Localization.Russian.yml (111 токенов: имена локаций, лор, UI, диалоги торговцев, туториалы портов). ВАЖНО: мир перегенерирован с тем же сидом SuperSeed, чтобы MWL-локации разместились с самого начала (старый мир был без MWL — мод просто не был установлен в прошлой сессии, только YAML перевода). updateType=minor — ОБЯЗАТЕЛЬНО обновить клиент через лаунчер (новый мод + ~80 МБ ассетов) И перезаход на сервер (мир уже пересоздан). 20260719r — v2.14.5 | BROHEIM-OneMapPinFix 1.4.2 → 1.4.3: ПРАВИЛА УДАЛЕНИЯ МЕТОК. Раньше vanilla ClientCanRemovePin разрешал админу удалять ЛЮБУЮ метку (байпас), и мой Postfix лишь расширял это. Теперь Postfix ПОЛНОСТЬЮ переопределяет результат: auto-метки (OwnerId="auto", ставит мод) → ТОЛЬКО админ может удалить; игрок-метки → ТОЛЬКО владелец (по стабильному SteamID hostName для новых меток, ИЛИ по сессионному m_uid peerUid для legacy-меток в той же сессии). Админ больше НЕ может удалять чужие игрок-метки — только свои (как владелец) + auto (как админ). updateType=patch — обновить клиент через лаунчер И перезапустить сервер. 20260719q — v2.14.4 | BROHEIM-OneMapPinFix 1.4.1 → 1.4.2: ФИКС ДУБЛИКАТОВ МЕТОК (корневая причина «не удаляется»). Диагностика v2.14.3 раскрыла картину: после перезахода AppendPins корректно заменил TEST 1 на save=False (лог: `m_pins=6 save=True:0 save=False:6 TEST-like=1 ['TEST 1' save=False pos=(-206.57,-221.11)]`). НО при ПКМ та же метка TEST 1 на той же позиции имела save=True! Между этими событиями НЕ было left-click и НЕ было повторного AppendPins. Вывод: vanilla пере-создаёт save=True копии shared-меток из in-memory map-данных (загруженных из .fch при загрузке мира) при ОТКРЫТИИ карты — даже после того как AppendPins уже заменил их на save=False. Итог: в m_pins ДУБЛЬ — save=False (мод) + save=True (vanilla) на одной точке. ПКМ (OnMapRightClick → RemovePin(pos,radius) → GetClosestPin → RemovePin(PinData)) снимает ТОЛЬКО ОДНУ (ближайшую), вторая остаётся видимой → «не удаляется» (и видны двойные right-click'ы в логе). Фикс: в Prefix на Minimap.RemovePin(PinData) теперь ищу ВСЕ записи в m_pins совпадающие по имени+типу+DistanceXZ<1м, КРОМЕ переданного pin (его уберёт сама vanilla RemovePin), и уничтожаю их через MapPinSynchronizer.DestroyPinEntry (рефлексия, private static) — удаляет из списка + Destroy GameObject маркера. Затем RemovePinFromServer(match) чистит ClientPins + шлёт RPC. Итог: обе копии (save=False и save=True) удалены, метка полностью исчезает с карты. Логирование: `destroyed N duplicate m_pins entr(ies)`. updateType=patch — обновить клиент через лаунчер И перезапустить сервер. 20260719p — v2.14.3 | BROHEIM-OneMapPinFix 1.4.0 → 1.4.1: УЛУЧШЕННАЯ ДИАГНОСТИКА перезахода. Симптом v2.14.2: Крипта (auto) удалилась ✓, но новые игрок-метки TEST 1/TEST 2 после перезахода «не удалялись» (по словам пользователя), хотя сервер ЧЕСТНО удалял их (ServerPins 7->6->5, .explored и .fch чистые), а в логе видно RemovePinFromServer done. Загадка: удалённые метки имели save=True (vanilla-локальная копия), т.е. AppendPins НЕ заменил их на save=False. Также в логе видны двойные right-click'ы (16:19:56, 16:19:57) без срабатывания RemovePin — возможно визуальный дубль. v1.4.0 ставил диагностический Postfix на OnServerInitialPins — но он НИКОГДА не срабатывал, т.к. мод использует chunked-путь OnServerInitialPinsChunk (именно он вызывает AppendPins). Фикс-диагностика: 1) Перенёс Postfix на реальный метод OnServerInitialPinsChunk — логирует ClientPins (count, auto/player, TEST-like, Крипт-like) при перезаходе. 2) Добавил Postfix на AppendPins — логирует m_pins (count, save=True/False, TEST-like с координатами) → покажет, остаются ли save=True копии и есть ли дубли. Логика удаления (RemovePinFromServer) без изменений — она работает (сервер подтверждает). updateType=patch — обновить клиент через лаунчер И перезапустить сервер. 20260719o — v2.14.2 | BROHEIM-OneMapPinFix 1.3.0 → 1.4.0: ФИКС ВОЗВРАТА МЕТОК ПОСЛЕ ПЕРЕЗАХОДА + AUTO-МЕТКИ. Симптом v2.14.0: TEST2/TEST3 (игрок-метки) удалялись (сервер подтверждал ServerPins 11->10, .explored и .fch чистые), но пользователь сообщал что после перезахода метки «так и не удаляются». Анализ исходника OneMap выявил корневую причину: серверный OnClientRemovePin для НЕ-auto меток рассылает OM_ServerRemovePin всем КРОМЕ отправителя (item.m_rpc != client) → отправитель НИКОГДА не получает подтверждения → его локальный ClientPins не очищался сервером → AppendPins() переподкладывал метку при следующем открытии карты. Также: auto-метки (Крипта и т.д.) vanilla ClientCanRemovePin возвращал false ВСЕГДА (даже админу) → v1.3.0 их skip'ал. Фикс: 1) Клиентский Prefix на Minimap.RemovePin(PinData) теперь использует родной MapPinSynchronizer.RemovePinFromServer(match) — он атомарно удаляет из локального ClientPins И шлёт OM_ClientRemovePin (плюс AutoPinPlacer.InvalidatePinIndex для auto) → AppendPins больше не переподкладывает. 2) Убран skip auto-меток — теперь шлём RPC и для них. 3) Серверный Postfix на ClientCanRemovePin уже разрешал админу удалять auto (с v1.3.0) — теперь это срабатывает. 4) Добавлен Postfix на OnServerInitialPins (клиент) — логирует что реально пришло с сервера при перезаходе (ClientPins count, auto/player, TEST-like, Крипт-like) для точной диагностики. Также: убран дубликат плагина (loose DLL + папка) — BepInEx грузил его дважды. updateType=patch — обновить клиент через лаунчер И перезапустить сервер. 20260719n — v2.14.0 | BROHEIM-OneMapPinFix 1.2.0 → 1.3.0: ДИАГНОСТИКА. Симптом v2.13.0: клиентский Prefix срабатывал и шлёт OM_ClientRemovePin (лог `sent OM_ClientRemovePin for 'фцвфцвфцв' owner=76561198815371052`), но метка остаётся в .explored — сервер её НЕ удаляет. Добавлен подробный лог на сервер-сайд: Prefix на OnClientRemovePin логирует прибытие RPC (name/owner/ModActive/ActiveEnabled/ServerPins-до), Postfix логирует ServerPins-после и сколько удалено; Postfix на ClientCanRemovePin логирует полный разбор решения (isAuto/isAdmin/peerUid/hostName/ownerByUid/ownerByHost→result). Клиентский Prefix тоже расширен (pin.m_save, ClientPins count, isServer, ActiveEnabled, serverRPC). Цель — точно определить, где обрыв: RPC не доходит / OnClientRemovePin ранний возврат / ClientCanRemovePin отказ / RemovePin не находит. Также: ServerPins (private) и AdminCommands.IsAdmin (internal) переведены на рефлексию. updateType=minor — обновить клиент через лаунчер И перезапустить сервер. 20260719m — v2.13.0 | BROHEIM-OneMapPinFix 1.1.0 → 1.2.0: КОРРЕКТНАЯ ТОЧКА ПЕРЕХВАТА (клиент-сайд). Симптом v2.12.0: ПКМ по shared-меткам всё ещё не удаляло (в логе `Could not find field m_largePinRoot/m_removePinRadius` — мой фолбэк ломался, а основной путь `GetClosestPinPatch.Last` был всегда null). Причина (найдена декомпиляцией Minimap): vanilla `OnMapRightClick` вызывает `RemovePin(pos, radius)`, а НЕ `GetClosestPin` напрямую; `GetClosestPin` вызывается уже внутри `RemovePin(Vector3,float)` — и мой Postfix на GetClosestPin ловил `__result` ДО того как One Map-мод переопределял его на shared save:false метку (порядок патчей) → ловил null. Плюс `GetClosestPin` вообще пропускает `m_save==false` метки. Фикс: убрал GetClosestPatch и фолбэк с приватными полями; перешёл на Prefix на `Minimap.RemovePin(PinData)` — это метод, который vanilla вызывает с уже найденной (модом) shared-меткой, без зависимости от порядка патчей GetClosestPin. OnServerRemovePin использует DestroyPinEntry (не RemovePin(PinData)) → зацикливания нет. Сервер-сайд патчи (rewrite OwnerId→SteamID, SteamID-проверка) без изменений. updateType=minor — обновить клиент через лаунчер И перезапустить сервер. 20260719l — v2.12.0 | BROHEIM-OneMapPinFix 1.0.1 → 1.1.0: ФИКС УДАЛЕНИЯ МЕТОК ДЛЯ НЕ-АДМИНОВ. Симптом: обычный игрок мог удалить свою метку только в текущей сессии; после перезахода сервер возвращал метку (т.к. OwnerId = сессионный m_uid, а не стабильный SteamID → проверка владельца падала). Фикс (сервер-сайд, 2 новых патча): 1) Prefix на MapPinSynchronizer.OnClientAddPin — при приёме метки от клиента перезаписываю OwnerId на SteamID (peer.m_socket.GetHostName()), для auto-меток не трогаю. Перепаковка через UnpackPin/PackPin + ZPackage.Load. 2) Postfix на ClientCanRemovePin — если стандартная проверка отказала, дополнительно сравниваю pin.OwnerId с SteamID запросившего (hostName); совпало → разрешаю. Теперь новые метки (после фикса) хранят стабильный SteamID и удаляются владельцем в любой сессии. Старые метки (OwnerId=старый сессионный m_uid) не-админам по-прежнему не удалить — их админ снесёт сам (байпас). Плагин теперь и на сервере, и в client_extras. updateType=minor — обновить клиент через лаунчер И перезапустить сервер. 20260719k — v2.11.31 | ФИКС BROHEIM-OneMapPinFix 1.0.0 → 1.0.1. В логе клиента v2.11.30 плагин падал при загрузке: `Could not find method for type Minimap and name GetClosestPin and parameters (Vector3, float)` → `Undefined target method`. Причина: я указал 2 параметра, а ванильный `Minimap.GetClosestPin` принимает 3 — `(Vector3 pos, float radius, bool something)` (точно как патчит сам OneMap). Фикс: HarmonyPatch сигнатура исправлена на `(Vector3, float, bool)`. Логика Prefix без изменений. updateType=patch — обновить клиент через лаунчер, рестарт сервера не нужен. 20260719j — v2.11.30 | НОВЫЙ МОД BROHEIM-OneMapPinFix (GUID broheim.onemap.pinfix, v1.0.0, client-only). Симптом: свои метки на карте из прошлой сессии НЕ удалялись ПКМ — локально исчезали, но после перезахода возвращались (сервер их хранил). Vanilla-метки удалялись нормально. Причина (найдена разбором OneMapToRuleThemAll.dll + парсом .explored): One Map хранит OwnerId метки как ZNet.GetUID().ToString() — а на нашем клиенте это сессионный m_uid (отрицательное число, напр. -266246563), НЕ стабильный SteamID64, и он МЕНЯЕТСЯ между сессиями. Идентично: RPC удаления OM_ClientRemovePin не доходил до сервера (ранний возврат в OnMapRightClick Postfix при LatestClosestPin==null, либо в RemovePinFromServer при ActiveEnabled==false) → сервер метку не удалял → SendPinsToClient возвращал её при перезаходе. Фикс: Harmony-Prefix на Minimap.OnMapRightClick — надёжно находит ближайшую метку (через мой Postfix на GetClosestPin + фолбэк через приватные m_pins/m_largePinRoot/m_removePinRadius), матчит её с MapStateRepository.ClientPins по ArePinsEqual (имя+тип+DistanceXZ<1м), и для НЕ-auto меток шлёт OM_ClientRemovePin напрямую через ZNetProxy.GetServerRPC (минуя ActiveEnabled-возврат). Сервер (админ-байпас IsAdmin=True по SteamID 76561198815371052) удаляет метку из ServerPins. Auto-метки (OwnerId="auto") не трогаю — их мод пересоздаёт по дизайну. Модов: 120. updateType=patch — обновить клиент через лаунчер, рестарт сервера НЕ нужен (плагин только в client_extras). 20260719i — v2.11.26 | ФИКС СЧЁТЧИКА Restock моста 1.0.3 → 1.0.4. Симптом: при L рядом с ItemDrawers предметы пополнялись из ящиков, но сообщение Restock показывало только сундуки (например «0/5»). Причина: Restock был Postfix'ом на DoRestock — пополнение из ящиков происходило ПОСЛЕ сообщения. Фикс: перенёс логику в Prefix на RestockModule.ReportRestockResult, прибавляю к movedCount (стаки до полного) и partiallyFilledCount (частично) через ref, с кап movedCount≤totalCount (чтобы не было «Invalid restock»). Теперь и P, и L показывают корректное суммарное число (сундуки + ящики). updateType=patch — обновить клиент через лаунчер, рестарт сервера уже сделан. 20260719h — v2.11.25 | ФИКС СООБЩЕНИЯ QuickStack моста 1.0.2 → 1.0.3. Симптом: при P рядом с ItemDrawers предметы уходили в ящики, но центральное сообщение QuickStack показывало «0 штук». Причина: мост патчил DoQuickStack Postfix'ом — ход в ящики происходил ПОСЛЕ того как QuickStack показывал свой результат (счётчик учитывал только сундуки, не ящики). Фикс: перенёс логику депозита в Prefix на QuickStackModule.ReportQuickStackResult и прибавляю счётчик ящиков к movedCount через ref — теперь QuickStack показывает корректное суммарное число (сундуки + ящики) своим локализованным сообщением. updateType=patch — обновить клиент через лаунчер, рестарт сервера уже сделан. 20260719g — v2.11.24 | TTS: RunesVolume 2 → 3 (ворон Hugin/Munin громче), SkipOwnChat false → true (свои сообщения не озвучиваются). Файл: client_extras/BepInEx/config/Broheim.SileroTTS.cfg. Также: AzuWorkbenchTweaks Auto Repair = On (серверный sync-конфиг, уже применён рестартом — авторемонт предметов в инвентаре при взаимодействии с верстаком). updateType=patch — обновить клиент через лаунчер. 20260719f — v2.11.23 | TTS: отключил NarrateCenter (короткие центральные всплывашки Huginn/ивенты больше не озвучиваются). Ворон (Hugin/Munin) остаётся — NarrateRunes=true (панель-туториал + руны + интро). Файл: client_extras/BepInEx/config/Broheim.SileroTTS.cfg. updateType=patch — обновить клиент через лаунчер, рестарт сервера не нужен. 20260719e — v2.11.22 | ФИКС МОСТА QuickStackDrawersBridge 1.0.1 → 1.0.2 (повторный фикс FieldAccessException). В логе клиента после v2.11.20 мост всё ещё падал: `FieldAccessException: Field 'Inventory:m_inventory' is inaccessible from method BroheimQuickStackDrawersBridge.*:Postfix` (строки 2382/2395). Причина: я ошибочно считал Inventory.m_inventory public — оно PRIVATE в ванильной assembly_valheim (а Inventory.Changed() тоже private). После фикса player.m_inventory выполнение дошло до inv.m_inventory и снова упало. Провёл полный аудит видимости через monodis по ВАНИЛЬНОЙ (non-publicized) сборке: Humanoid.m_inventory=family(protected), Inventory.m_inventory=private, Inventory.Changed()=private, Inventory.GetAllItems()=public, Inventory.RemoveItem()=public, Humanoid.GetInventory()=public, все поля ItemData (m_stack/m_quality/m_shared/m_equipped/m_dropPrefab/m_gridPos/m_customData)=public. Фикс: player.m_inventory → player.GetInventory() (public), inv.m_inventory → inv.GetAllItems() (public), inv.Changed() → Util.MarkChanged() (рефлексия по приватному методу). Теперь мост не падает на P/L. updateType=patch — обновить клиент через лаунчер, рестарт сервера уже сделан. 20260719d — v2.11.21 | TTS громкость: CenterVolume 1 → 2 (короткие центральные всплывашки Huginn/ивенты), RunesVolume 3 → 2 (панель-туториал ворона Hugin/Munin + руны + интро). Файл: client_extras/BepInEx/config/Broheim.SileroTTS.cfg. updateType=patch — обновить клиент через лаунчер, рестарт сервера не нужен (правки только в client_extras). 20260719c — v2.11.20 | ФИКС МОСТА QuickStackDrawersBridge 1.0.0 → 1.0.1. В логе клиента (LogOutput.log) при нажатии P/L падало FieldAccessException: `Humanoid:m_inventory is inaccessible from method BroheimQuickStackDrawersBridge.*:Postfix` — мост компилился против publicized-сборки, но на клиенте грузится ванильная (non-publicized) assembly_valheim, где Humanoid.m_inventory protected -> прямой IL-доступт бросает исключение (Valheim Mono игнорирует IgnoresAccessChecksTo). Фикс: доступ к player.m_inventory переведён на рефлексию (AccessTools.Field(typeof(Humanoid),\"m_inventory\")), как и в BROHEIM-DrawerAuto. Также: QSSConfig.QuickStackConfig/RestockConfig — это вложенные ТИПЫ (не поля), а range = ConfigEntry (не int) -> QssReflect переписан на AccessTools.Inner + чтение float; ранее падало в warning \"Could not find field QuickStackConfig\" и range/hotbar молча брали дефолт. Теперь читает реальные значения (range=50, hotbar=on). updateType=patch — обновить клиент через лаунчер, рестарт сервера нужен (новая DLL моста на сервере). 20260719b — v2.11.19 | ПЕРЕВОД: фикс непереведённых описаний. Причина: BROHEIM-RU вёл литерал-перевод через labels.tsv (точное совпадение всей строки), но имена/описания предметов в tooltip'ах идут составной строкой с color-тегами -> точное совпадение не срабатывало. Фикс: переведённые пары EN→RU добавлены в fragments.tsv (подстрока), отсортированы по длине EN убыв. (длинные первыми — безопасно, без коллатерала). 1) brohem-ru-backpacks 1.3.8.ru2 → ru3: добавлены 15 описаний рюкзаков в fragments (ранее были только в labels -> не ловились в tooltip). Имена рюкзаков уже были в fragments (работали). 2) broheim-ru-wackysdatabase 2.4.94.ru2 → ru3: Stone Pickaxe (имя+описание) + все 117 литерал-пар из labels.tsv (имена и описания кастомных предметов JewelHeim) добавлены в fragments — теперь переводятся в tooltip'ах. updateType=patch — обновить клиент через лаунчер, рестарт сервера НЕ нужен (только client_extras). 20260719a — v2.11.18 | НОВЫЙ МОСТ BROHEIM-QuickStackDrawersBridge (GUID broheim.QuickStackDrawersBridge, v1.0.0, both): решает давнюю несовместимость Quick Stack и ItemDrawers. Quick Stack (P) теперь раскладывает стакаемые предметы в подходящие соседние выдвижные ящики (по prefab+качеству), а Restock (L) пополняет неполные стаки из ящиков. Реализация: Harmony-Postfix на QuickStackModule.DoQuickStack и RestockModule.DoRestock — после отработки сундуков мост прогоняет ту же логику по ящикам через API.ClientSideV2.AllDrawers() (ZDO Prefab/Amount/Quality + RPC UpdateIcon — тот же проверенный патч, что в BROHEIM-DrawerAuto). Уважает избранное (UserConfig.IsItemNameOrSlotFavorited через рефлексию), экипировку, hotbar-настройки и радиус QuickStack (50 м). В неполные/пустые неподходящие ящики НЕ складывает (безопасно). Также: DrawerAuto Radius 16 → 10 м. Модов: 119. updateType=patch — обновить клиент через лаунчер, рестарт сервера нужен (новый плагин на сервере). 20260718c — SERVER | Перегенерация мира BROHEIM с seed SuperSeed. Модификаторы без изменений. Бэкап: /opt/valheim/backups/pre-seed-SuperSeed-20260718/. 20260718b — SERVER | Перегенерация мира BROHEIM с фиксированным seed tyeDWcN7cp (предыдущий случайный ZjPaS8QxrU&). Модификаторы те же: death casual, resources muchmore, portals casual, combat/raids normal, shared map on. Персонажи и миры снова удалены. Бэкап: /opt/valheim/backups/pre-seed-tyeDWcN7cp-20260718/. 20260718a — SERVER | Полный вайп мира BROHEIM. Удалены все персонажи и все миры, создан новый мир BROHEIM с нуля. Модификаторы: Death Penalty Casual, Resources Much More, Portals Casual (перенос всего через порталы), Combat Normal, Raids Normal (дефолт). Shared map включена (без nomap; One Map To Rule Them All). Новый seed: ZjPaS8QxrU& (старый HCYLKm4jETkq). Бэкап до вайпа: /opt/valheim/backups/pre-wipe-20260718/. Всем игрокам нужно создать новых персонажей — старый прогресс недоступен без восстановления из бэкапа. updateType=major (несовместимость с прежним миром) — клиент обновлять не нужно, пароль прежний. 20260712t — v2.11.5 | Silero TTS улучшения: 1) МУЖСКОЙ ГОЛОС — Silero Speaker = aidar (был xenia женский). Доступные RU голоса: kseniya/aidar(м)/baya/xenia/eugene(м). 2) ЦИФРЫ — акцентор вырезал всё кроме кириллицы+пунктуации, цифры молча пропускались. Добавлен ExpandNumbers: standalone числа (включая десятичные 3.14 → «три запятая один четыре») конвертируются в русские слова ПЕРЕД фильтром (полный конвертер 0-триллион с правильным склонением тысяча/тысячи/тысяч и женским родом для тысяч). 3) АНГЛИЙСКИЕ СЛОВА — латиница вырезалась. Добавлен TransliterateLatin: runs [a-z] транслитерируются в кириллицу (th→з, ch→ч, sh→ш, oo→у, ya→я и т.д.) — RU-модель произносит их с русским акцентом вместо пропуска. Broheim-TextToSpeech 2.1.2 → 2.1.3. updateType=patch — обновить клиент, проверить: мужской голос, «5 штук» → «пять штук», «test» → «тэст». 20260712s — v2.11.4 | ФИКС Silero TTS — БАГ В BuildWav. Диагностика v2.11.3 показала: синтез ПОЛНОСТЬЮ работает (text='Я НА МЕСТЕ!' → seqLen=16 → OK samples=32400, sr=24000 — модель сгенерила 1.35с аудио), НО wav=44 байта. Причина: BuildWav писал PCM через `Buffer.BlockCopy(pcm, 0, ms.GetBuffer(), ms.Position, dataLen)` прямо в нижележащий буфер MemoryStream — это НЕ обновляет ms.Length, поэтому ms.ToArray() обрезал WAV до 44 байт (только заголовок, без данных). Фикс: PCM пишется через BinaryWriter (bw.Write(pcmBytes)) — он корректно обновляет ms.Length, ToArray() возвращает полный WAV с аудио. Broheim-TextToSpeech 2.1.1 → 2.1.2. updateType=patch — обновить клиент, зайти, написать в чат — теперь должен быть звук. 20260712r — v2.11.3 | Silero TTS: модель грузится чисто (фасад-фикс v2.11.2 сработал — нет FileNotFoundException), НО звука нет. В логе после «model loaded» ни ошибок ни успеха — пайплайн не наблюдаем. Добавил диагностику во все этапы: Speak (text/engine/src), SynthesizeAsync (seqLen/spkId — предупреждение если последовательность пуста), успешный синтез (samples/sr), PlayAudio (wav/clip/src). Подозрение: RU-акцентор даёт пустую последовательность если текст не кириллица (center-сообщения/raven при спавне могут быть английскими) → return null → тишина без лога. Broheim-TextToSpeech 2.1.0 → 2.1.1. updateType=patch — обновить клиент, зайти, послать сообщение в чат, прислать лог. 20260712q — v2.11.2 | КОРНЕВОЙ ФИКС Silero TTS: «ударь крота» зависимостей ЗАКОНЧЕН. monodis --assemblyref TorchSharp.dll показал что TorchSharp ссылается на 5 сборок: netstandard 2.0.0.0, Google.Protobuf, System.Memory, SkiaSharp, ICSharpCode.SharpZipLib. Valheim- Mono уже имеет netstandard.dll, и я забандлил реализации (System.Memory/System.Buffers/System.Runtime.CompilerServices.Unsafe). НО netstandard.dll тайп-форвардит типы в фасадные сборки [System.Runtime, 4.0.0.0], [System.Runtime.InteropServices, 4.0.0.0] и т.д. — этих ФАСАДОВ в Valheim НЕТ (Mono держит типы в mscorlib/System), поэтому каждый новый code-path TorchSharp падал с FileNotFoundException следующей фасадной сборки (System.Memory → Unsafe → Buffers → System.Runtime). ФИКС: забандлил ВЕСЬ netstandard2.0 facade-set (98 DLL из NETStandard.Library 2.0.3 ref/) которых НЕТ в Valheim_Data/Managed — вычислил diff (facade − Valheim-сборки), чтобы НЕ затенить реальные Mono-сборки (System.dll/System.Net.Http.dll/System.Numerics.dll/System.IO.Compression.dll и т.д. оставлены). Фасады — 4.0.0.0 контракты, тайп-форвардят в mscorlib/System, ~2.5МБ суммарно. Теперь ВСЁ замыкание managed-зависимостей TorchSharp резолвится разом — больше не будет «следующей недостающей сборки». Существующие реализации (System.Memory 4.0.1.2 / System.Buffers / System.Runtime.CompilerServices.Unsafe) остаются — фасады тайп-форвардят в них. updateType=patch — обновить клиент через лаунчер, рестарт сервера не нужен. 20260712p — v2.11.1 | КОРНЕВОЙ ФИКС 1267 warning'ов «unknown config entry» (OdinHorse/DragonRiders/Armory/SeaAnimals/Backpacks/ItemDrawers/BetterRiding ItemManager/CreatureManager/PieceManager). ПРИЧИНА (найдена декомпиляцией OdinHorse): Jotunn managers (ItemManager/CreatureManager/PieceManager) используют ОТДЕЛЬНЫЙ `english` экземпляр Localization (LocalizationCache.ForLanguage("English")) для языко-независимых имён секций конфига — `englishName = english.Localize(name)` (OdinHorse.decompiled.cs:2589/6128/22981). Но BROHEIM-RU патчил Localization.Translate/Localize/AddWord/SetupLanguage ГЛОБАЛЬНО (все экземпляры) → на клиенте english.Localize(name) тоже русифицировался → секция конфига становилась «Конина» вместо «Horse Meat» → сервер шлёт английские секции, клиент их не узнаёт → 1267 mismatch. ФИКС: BROHEIM-RU 2.0.0 → 2.0.1 — все 4 патча Localization (Translate_Patch, AddWord_Patch, LocalizeFragment_Patch Prefix+Postfix, SetupLanguage_Patch Postfix) теперь срабатывают ТОЛЬКО когда __instance == Localization.instance (активный экземпляр для отображения). Отдельный `english` экземпляр больше НЕ трогается → секции конфигов остаются английскими (совпадают с сервером), отображение остаётся русским. Также: BROHEIM-RU + broheim-ru-* возвращены в client_extras (клиент-only), с сервера удалены — серверу локализация не нужна (секции и так английские). Это ИСПРАВЛЕНИЕ АСИММЕТРИИ а не заплатка. updateType=patch — обновить клиент через лаунчер, рестарт сервера НЕ нужен (сервер уже перезапущен без BROHEIM-RU, 0 ошибок). 20260712o — v2.11.0 | 1) ФИКС SILERO TTS: первый синтез падал с FileNotFoundException «System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1». TorchSharp.torch.tensor(Int64[]) использует System.SpanHelpers+PerTypeValues → нужен System.Runtime.CompilerServices.Unsafe (asm 4.0.4.1) — ещё одна managed-зависимость TorchSharp, отсутствующая в Mono-рантайме Valheim (та же природа, что у System.Memory в v2.9.2). Забандлил в папку плагина: System.Runtime.CompilerServices.Unsafe.dll 4.5.3 (asm 4.0.4.1) + System.Buffers.dll 4.5.1 (превентивно — Span/ArrayPool). Модель Silero грузилась OK и до фикса, падало именно на создании тензора. Теперь конвейер RU (accentor → tts_runner.pt → WAV) должен работать. 2) УДАЛён кастомный мод BROHEIM-CampsiteTweaks (хардкод стоимости кемпинга) — по запросу. OdinPlus-OdinCampsite остаётся с ванильными рецептами. ZRpcTimeoutFix (v2.10.0) остаётся — он починил вход (8МБ map-данных + minimap = >30с ванильного таймаута). updateType=minor — обновить клиент, рестарт сервера. 20260712n — v2.10.0 | ФИКС ДИСКОННЕКТА ПРИ ВХОДЕ НА СЕРВЕР. Новый мини-плагин BROHEIM-ZRpcTimeoutFix (GUID broheim.zrpcfix, server+client): увеличивает ZRpc.m_timeout с ванильных 30с до 120с (настраиваемо в Broheim.zrpcfix.cfg). Причина: при входе клиент обрабатывал ~8МБ распакованных map-данных исследования мира (13КБ сжатых → 8МБ) + генерация minimap 8с = суммарно main-thread молчал >30с → сервер детектил «ZRpc timeout detected» и сбрасывал соединение (ErrorDisconnected / ClosedByPeer) до завершения спавна. 1267 warning'ов «unknown config entry» (OdinHorse/DragonRiders/Armory/SeaAnimals ItemManager) — косметический рассинхрон ServerSync версий модов, НЕ причина дисконнекта и НЕ русификация. TTS (Broheim-TextToSpeech 2.1.0) загружен чисто, System.Memory-ошибок нет (фикс v2.9.2 работает). updateType=minor — обновить клиент через лаунчер, сервер перезапустить. 20260712m — v2.9.2 | Фикс Silero на клиенте: TorchSharp не находил System.Memory. При первом синтезе Silero падало с «Could not load file or assembly 'System.Memory, Version=4.0.1.2'» — TorchSharp.dll (netstandard2.0) ссылается на managed-зависимости, которых нет в Mono-рантайме Valheim. Забандлил рядом с TorchSharp.dll в папке плагина: System.Memory.dll 4.5.5 (Span/Memory), Google.Protobuf.dll 3.21.9 (парсинг TorchScript .pt = protobuf), ICSharpCode.SharpZipLib.dll 1.4.0 (torch.load zip-формат), SkiaSharp.dll 2.88.6 (managed-stub, не используется на нашем код-пути но есть в ссылках TorchSharp — натив libskiasharp НЕ нужен т.к. SkiaSharp-методы не вызываются, Mono грузит ссылки лениво). Мод грузился OK и до фикса (ленивый резолв), ошибка вылезала только при первом вызове jit.load. BepInEx резолвит managed-DLL из папки плагина. Размер модпака 1698.9→1699.4МБ (+0.5МБ). Конфиг тот же (Silero/Russian/xenia, Skip Self=Off, Strip Chat Speaker=On). updateType=patch — обновить клиент через лаунчер. предустановленный конфиг Broheim.TextToSpeech.cfg — TTS Engine = Silero (вместо Piper), Silero Language = Russian, Silero Speaker = xenia, Skip Self In Chat = Off (озвучка своих сообщений включена для проверки), Strip Chat Speaker = On (озвучка без ника — только текст сообщения). Speak Chat Messages = On. Остальные настройки те же (NPC/Rune/Dream=Off, Center=On). Для возврата к Piper: TTS Engine = Piper, Active Voice = irina, Skip Self In Chat = On. updateType=patch — обновить клиент через лаунчер. EN / RU / DE предусстановлены, выбор в конфиге. Broheim-TextToSpeech 2.0.1 → 2.1.0: Silero теперь не только русский. Три предустановленных модель-бандла в silero_assets/{ru,en,de}/, все pure-C# через TorchSharp/libtorch (без Python, без клиентских установок, без скачиваний): 1) RU (v4_ru) — полный авто-акцентор + ё, 5 спикеров (xenia/aidar/baya/kseniya/eugene), silero_accentor.dat 9.7МБ. 2) EN (v3_en) — БЕЗ акцентора (set_accent=False), 119 спикеров, 12 курируемых по частоте основного тона (6 мужских 80-143Гц + 6 женских 173-245Гц: en_0/en_20/en_27/en_42/en_46/en_70/en_80/en_91/en_48/en_116/en_82/en_67/en_95), preprocess.dat 1.7КБ. 3) DE (v3_de) — БЕЗ акцентора, 5 спикеров (bernd_ungerer/eva_k/friedrich/hokuspokus/karlsson) + маппинг умлаутов ß/ä/ö/ü→0/1/2/3, preprocess.dat 459Б. Новые конфиги: «TTS Engine» = Piper|Silero (дефолт Piper), «Silero Language» = Russian|English|German (дефолт Russian), «Silero Speaker» = имя спикера (дефолт xenia; в описании перечислены валидные для каждого языка). «Active Voice» теперь Piper-only (выбирает голос Piper из voices.json при Engine=Piper). Миграция: старый Active Voice = silero_ → Engine=Silero, Language=Russian, Speaker=. Архитектура: EN/DE используют новый SileroPreprocessor.cs (lowercase → фильтр по symbols[3:] → symb_to_ascii → sos+symbol_to_id+eos → ones для durs/pitch), RU по-прежнему SileroAccentor.cs (полный ngram/MLP stress-пайплайн). TorchSileroEngine обобщён под мульти-язычность: ленивая загрузка silero_assets//tts_runner.pt + .dat по языку, libtorch-native (~256МБ) общие в корне silero_assets/. TtsRunner-обёртка идентична для всех языков (tts_model.forward сигнатура совпадает: sequence/speaker_ids/durs_rate/pitch_coefs + baked sr=24000/{}None). Верификация БИТ-В-БИТ: EN 5/5 (maxdiff=0.0 vs apply_tts, включая тексты без терминальной пунктуации, с пунктуацией, single-char), DE 5/5 (maxdiff=0.0, включая умлауты Grüße/Märchenbücher/Fußballplätze), C# SileroPreprocessor 10/10 (последовательности токенов идентичны Python). voices.json: 5 silero_* записей удалены (Silero теперь через конфиг, не каталог), 4 Piper ru_RU остались. Дефолт публичного конфига: Engine=Piper, Active Voice=irina, Skip Self=On. Для теста Silero EN: TTS Engine=Silero, Silero Language=English, Silero Speaker=en_0. Размер модпака 1597.7→1698.9МБ (+101МБ: en/de tts_runner.pt ~55МБ каждый, жмутся ~2:1). Модов: 120 → 120 (обновление). updateType=minor — обновить клиент через лаунчер. предустановленный конфиг Broheim.TextToSpeech.cfg — Active Voice = silero_xenia (вместо irina), Skip Self In Chat = Off (озвучка своих сообщений включена временно для проверки Silero в игре). Остальные настройки те же (Speak Chat=On, Strip Chat Speaker=On, NPC/Rune/Dream/Center=Off кроме Center=On). Для возврата к Piper: Active Voice = irina, Skip Self In Chat = On. updateType=patch — обновить клиент через лаунчер. 20260712h — v2.8.0 | SILERO TTS: чистый C# через TorchSharp/libtorch (без Python, без клиентских установок). Broheim-TextToSpeech 2.0.0 → 2.0.1: SileroEngine (Python-sidecar sileno_synth.py + требование установить Python 3.10-3.12 с torch) ПОЛНОСТЬЮ заменён на TorchSileroEngine — Silero v4_ru запускается нативно в libtorch прямо внутри C#-мода. Архитектура: 1) C#-порт accentor+text-preprocess (SileroAccentor.cs) — кириллица→ascii, tokenize_clean, word_ngrams, ngram-embedding gather (126523×16), stress/yo MLP, postprocess_accentor, preprocess_tacotron → sequence/durs_rate/pitch_coefs тензоры; верифицирован БИТ-В-БИТ с оригинальным TorchScript-пайплайном (10/10 тестов: «привет как дела», «в недрах тундры выдры в гетрах тырят в вёдра ядра кедров», пунктуация, ё, исключения). 2) Нейронный tts_model (dur_predictor + pitch_predictor + encoder + decoder + vocoder со всеми runtime-чеками is_autocast_enabled/is_nested/Fast-Path prim::If) запускается нативно в libtorch из silero_assets/tts_runner.pt (TorchScript, 46МБ, собран torch 2.10 для совместимости с TorchSharp 0.106.0/libtorch 2.10.0). 3) Полная C#-цепочка (accentor→тензоры→TorchSharp→audio) верифицирована 5/5 — аудио БИТ-ИДЕНТИЧНО Python model.apply_tts (maxdiff=0.0). Почему не ONNX: graph surgery невозможна — aten::is_autocast_enabled/prim::is_nested отсутствуют в JIT-графах (генерируются ONNX-symbolic для MultiheadAttention), ScalarType UNKNOWN_SCALAR идёт из Fast-Path prim::If в shape inference; TorchSharp выполняет оригинальный TorchScript нативно, обходя все ограничения ONNX-экспортёра. Бандл в silero_assets/: tts_runner.pt (46МБ) + silero_accentor.dat (9.7МБ, все accentor-ассеты одним бинарником) + TorchSharp.dll (managed) + libtorch-cpu-win-x64 native (torch_cpu.dll 265МБ + c10/LibTorchSharp/libiomp/uv/torch_global_deps). Native-резолвинг: папка silero_assets/ prepended to PATH перед первым вызовом TorchSharp — DllImport находит LibTorchSharp.dll и её зависимости. Удалено: «Silero Python Executable» из cfg, sileno_synth.py. Голоса Silero (xenia/aidar/baya/kseniya/eugene) теперь работают из коробки — просто выбери silero_* в «Active Voice». Размер модпака +~310МБ (libtorch-cpu; в ZIP torch_cpu.dll жмётся ~2:1). -BepInEx/plugins/Broheim-TextToSpeech/sileno_synth.py (в removals). Модов: 120 → 120 (обновление). updateType=minor — обновить клиент через лаунчер. 20260712g — v2.7.13 | ПЕРЕИМЕНОВАНИЕ И РАСШИРЕНИЕ TTS: Azumatt-TextToSpeech → Broheim-TextToSpeech 2.0.0 (новый GUID Broheim.TextToSpeech, отдельный мод). Engine-абстракция ITtsEngine: PiperEngine (нативный piper.exe, мульти-голос, prosody-параметры length_scale/noise_scale/noise_w) + SileroEngine (Python-sidecar silero_synth.py, русский v4_ru с авто-ударением put_accent и ё через torch.hub). Мульти-голосовой каталог voices.json (рядом с DLL): 4 голоса Piper ru_RU (Ирина/Дмитрий/Денис/Руслан) + 5 спикеров Silero v4_ru (xenia/aidar/baya/kseniya/eugene); активный голос — в cfg «Active Voice» (дефолт irina). Конфиг расширен: «Silero Python Executable» (путь к Python 3.10-3.12 с torch+silero; пусто = Silero выключен). Миграция: при первом запуске из старого Azumatt.TextToSpeech.cfg импортируется Voice Model URL (сопоставляется с существующим голосом по URL — «legacy»-дубль не создаётся) и Toggle-настройки (Skip Self/Speak Center/NPC/Rune/Chat/Dream). Все фиксы 1.1.0 сохранены: NPC-голоса качаются ТОЛЬКО при Speak NPC=On, reload-цикл конфига разорван (watcher паузится на время Save), Strip Chat Speaker озвучивает только текст, Speak Chat Messages работает. Piper-бинарь + ru_RU-irina перенесены из старого мода (без перекачки). -Azumatt-TextToSpeech (удалён, в removals). Модов: 120 → 120 (замена). updateType=minor — обновить клиент через лаунчер. Silero на клиенте требует установки Python 3.10-3.12 + pip install torch silero (см. README мода); Piper работает без Python. 20260712f — v2.7.12 | ПЕРЕПИСЬ МОДА TextToSpeech (вместо кастомных патчей). Azumatt.TextToSpeech 1.0.3 → BROHEIM-форк 1.1.0 (drop-in, тот же GUID/конфиг). Мод давно не поддерживается — фиксы вшиты прямо в исходник, BROHEIM-TtsChatFix удалён (больше не нужен). Что исправлено в форке: 1) NPC-голоса (Haldor/Hildir/Hugin/Munin/BogWitch, ~240МБ en_US/sv_SE) теперь регистрируются ТОЛЬКО при Speak NPC Messages = On — при Off не скачиваются и не проверяются (раньше качались всегда). 2) Разорван reload-цикл конфига: SaveWithRespectToConfigSet паузит FileSystemWatcher на время Config.Save() — watcher больше не ловит собственную запись, цикл «reload→write→reload» (1/сек весь сеанс) устранён; легитимные внешние правки конфига по-прежнему подхватываются. 3) Новая опция «Strip Chat Speaker = On» — озвучка чата произносит только текст сообщения (префикс «{ник} said in chat:» стрипается); ник-стрип раньше делался BROHEIM-TtsChatFix, теперь встроен. 4) Заработала опция «Speak Chat Messages» (в 1.0.3 была мёртвой — чат озвучивался независимо от неё). Piper-процесс запускается через reflection (System.Diagnostics.Process) — обход круговой TypeForwardedTo-цепочки netstandard2.1-facade при компиляции с UnityEngine.AudioModule. Конфиг клиента: Voice Model URL = ru_RU-irina, Skip Self = On, Speak NPC/Rune/Dream/Center = Off, Speak Chat = On. Модов: 121 → 120. updateType=patch — обновить клиент через лаунчер. 20260712e — v2.7.11 | Фикс TextToSpeech: элегантное решение спама/замедления загрузки. Проблема: TTS при каждом старте спамил лог (18× «Russian-voice patching DISABLED» от BROHEIM-RU, 15× «Configuration reload complete») и скачивал 4 лишних NPC-голоса (en_US-libritts_r/ryan-high/bryce + sv_SE-nst, ~240МБ) — хотя «Speak NPC Messages = Off». Причина 1: BROHEIM-RU вызывал TryPatchTtsSpeak из SetupLanguage_Patch при каждой настройке языка (~18 раз) — мёртвый код (kill-switch с v2.6.7), который только спамил лог. Причина 2: TTS хардкодит 5 NPC-моделей (Haldor/Hildir/Hugin/Munin/BogWitch) и качает их все в LoadModelsAsync. Причина 3: reload-цикл — FileSystemWatcher ловит запись конфига от SaveWithRespectToConfigSet → reload → запись → reload (1/сек весь сеанс), каждый reload перезапускает LoadModelsAsync. Решение: 1) BROHEIM-RU — ВЕСЬ TTS-код удалён (kill-switch, TryPatchTtsSpeak, TtsRussianHelper, TtsSpeak_Patch, TtsGetVoiceModel_Patch, BepInDependency). Русский голос ru_RU-irina теперь идёт НАТИВНО через конфиг TTS (Voice Model URL), без патчей BROHEIM-RU. 2) BROHEIM-TtsChatFix 1.0.0 → 1.1.0 — добавлены два патча: TtsLoadFilterPatch (LoadModelsAsync Prefix фильтрует _models до «default» — NPC-голоса больше не скачиваются и не грузятся; GetVoiceModel имеет fallback на «default», так что NPC/raven-пути безопасны, а NPC-речь выключена) + TtsReloadLoopFixPatch (SaveWithRespectToConfigSet Pre/Postfix паузит FileSystemWatcher на время Config.Save — разрывает reload-цикл, легитимные внешние правки конфига по-прежнему подхватываются). Итог: 0 лишних скачиваний, 0 reload-цикла, 0 kill-switch-спама — загрузка быстрее, чат озвучивается Ириной, ник стрипается, свои сообщения не озвучиваются (Skip Self = On). updateType=patch — обновить клиент через лаунчер. 20260712d — v2.7.3 | Русификация XPortal: UI конфигурации порталов. «[hud_xportal_title]» → «Привет, путник!», «[piece_portal_target]» → «Пункт назначения», «[piece_portal_target_none]» → «(нет цели)», «[piece_portal_tag_none]» → «(без имени)», «[piece_portal_defaultportal]» → «Портал по умолчанию». Причина: SpikeHimself-XPortal использует Localization.instance.Localize(\"$piece_portal_*\"), но НЕ грузит свои xportal-translations-russian.json кодом — полагается на локализацию игры. Ванильный RU имеет только piece_portal_tag («Метка») и piece_portal_settag («Переименовать»), а target/target_none/tag_none/defaultportal и hud_xportal_title (XPortal-specific) отсутствуют → сырые токены в UI. +broheim-ru-xportal: 6 токенов через BROHEIM-RU engine (AddWord, авторитативное переопределение). Пакетов русификации: 25 → 26. Модов: 113 → 114. updateType=minor — обновить клиент через лаунчер. 20260712c — v2.7.2 | Русификация CL&LC: стихийные префиксы существ. «Lightning-Infused Грейдворф» → «Грозовой Грейдворф». Причина: Smoothbrain-CreatureLevelAndLootControl (CL&LC) добавляет существам стихийные ауры и префиксы к именам, формат [{infusion}-Infused ]{name}. В текущей DLL встроены только English/Chinese/French/German yml — русского не было, префикс оставался английским («Lightning-Infused»), тогда как имя существа уже русское (ванильный токен). CL&LC грузит внешний <папка_плагина>/.yml приоритетно над встроенными. Создан Smoothbrain-CreatureLevelAndLootControl/Russian.yml (на базе официального перевода автора + Nagir для enum/settings). Формат [{infusion} ]{name}[ — {affix}] — чистый, без «мутант». Переведены: стихии (Fire→Огненный, Frost→Ледяной, Lightning→Грозовой, Chaos→Хаотический, Spirit→Духовный, Poison→Ядовитый), эффекты (Aggressive/Armored/Curious/Quick/Regenerating/Splitting), аффиксы боссов (Reflective→Отражающий, Shielded→Защищённый, Mending→Исцеляющий, Summoner→Призыватель, Elementalist→Элементалист, Enraged→Разъярённый, Twin→Двойной), объявления секторов, enum и описания настроек. Файл грузится и на сервере, и на клиенте (через модпак) — CL&LC вызывает LoadLanguage(GetSelectedLanguage()), игра на русском. updateType=patch — обновить клиент через лаунчер, сервер перезапущен. 20260712b — v2.7.1 | Архерия + фикс дублирования HP у морских существ. 1) BOWPLUGIN по запросу: Draw Speed 1 → 1.2 (натяжение луков на 20% быстрее), Reload Speed 0.6 → 1 (перезарядка арбалетов в 1.67× быстрее). Конфиг сервер-синхронизирован — применится после рестарта. 2) ДУБЛИРОВАНИЕ HP (Кит, акулы): Marlthon-SeaAnimals имеет СОБСТВЕННЫЙ HP-дисплей над полосой здоровья для своих существ (секция [! HP Display], «Show HP on all creatures = Off» = показывать только для своих существ), а BetterUI (showEnemyHPText=true) тоже рисует HP-текст на EnemyHud → у морских существ два HP, у остальных только BetterUI. SeaAnimals не умеет отключать HP для своих существ (Off=только свои, On=все). Решение: SeaAnimals «Show HP on all creatures = On» (теперь единый источник HP-текста для ВСЕХ существ) + BetterUI showEnemyHPText = false (отключил дубль). HP-текст теперь один везде, стиль SeaAnimals (current/max). BetterUI по-прежнему показывает уровень (звёзды), имя, alerted-статус, зелёный HP прирученных. updateType=patch — обновить клиент через лаунчер, сервер перезапущен (синк BowPlugin + SeaAnimals конфигов). 20260712a — v2.7.0 | ЛУКИ/АРБАЛЕТЫ: возврат архивных модов + русификация. +blacks7ar-BowPlugin v1.8.6 (из старой сборки, с твоими конфигами: Velocity x4, Critical Chance 25%, Critical Damage x3, Crosshair Default красный) — настраиваемая механика луков/арбалетов + новые луки (длинный/костяной/эльфийский/жучий/клинковый), 5 арбалетов (кремнёвый/бронзовый/железный/серебряный/черный металл), болты, разрывные стрелы/болты (огонь/мороз/яд). +blacks7ar-MagicBows v1.1.8 (из старой сборки) — 10 эндгейм-магических луков и арбалетов (пламенный/ледяной/громовой/духовный/ядовитый), используют эйтр вместо стрел. EpicLoot-патчи для BowPlugin (уже были осиротевшие в конфиге) теперь подцепят новый мод для зачарований. +broheim-ru-bowplugin: нативный BowPlugin.Russian.yml (JLocalizationManager) — 40 токенов bbp_* переведены (предметы + шанс/урон крита). +broheim-ru-magicbows: нативный MagicBows.Russian.yml — 20 токенов bmb_* переведены (10 магических луков/арбалетов). -WackyMole-Tone_Down_the_Twang (удалён по запросу — нерф скорости натяжения; с BowPlugin своя механика крита). Пакетов русификации: 23 → 25. Модов: 110 → 113. updateType=minor — обновить клиент через лаунчер, сервер перезапущен. 20260711c — v2.6.9 | Фикс поздней русификации + озвучка своих сообщений отключена. 1) РУСИФИКАЦИЯ С ГЛАВНОГО МЕНЮ: поля BETTERUI (KILLS/DEATHS/CRAFTS/BUILDS) и QuickConnect ('Quick Connect'/'Connecting to BROHEIM'/'Cancel') русифицировались только после подключения/отключения от сервера. Причина: все fragment/label-патчи гейтились флагом RussianActive, который становился true лишь при Localization.SetupLanguage('Russian') на загрузке мира. На чистой установке FejdStartup_DefaultRussian_Patch помечал себя выполненным ДО проверки Localization.instance==null и больше не ретраил -> язык не ставился Russian на меню -> патчи ранний-возврат -> английский. Фикс: RussianActive=true по умолчанию в Awake (русский модпак); SetupLanguage_Patch только ставит true (не сбрасывает при SetupLanguage('English')); FejdStartup_Patch ставит _done только после успешного SetLanguage -> ретраит пока Localization.instance не готов. Теперь fragments/labels (TMP_Text, IMGUI) работают с первого кадра. 2) TTS: Skip Self In Chat = On в Azumatt.TextToSpeech.cfg -> свои сообщения в чате НЕ озвучиваются, чужие — Ириной. updateType=patch — обновить клиент. 20260711b — v2.6.8 | ВОЗВРАТ ОЗВУЧКИ ЧАТА (русский голос Ирина) без краша. Причина краша v2.6.5: BROHEIM-RU ИЗБЫТОЧНО форсировал ru_RU-irina поверх уже настроенного конфига TextToSpeech (GetVoiceModel-постфикс -> реэнтри/нативный segfault piper ONNX при спавне). Решение: мои TTS-патчи отключены (kill-switch из v2.6.7), голос ru_RU-irina теперь идёт НАТИВНО через конфиг Azumatt.TextToSpeech.cfg (Voice Model URL = ru_RU-irina-medium.onnx). Дополнительно: PIPER-БИНАРНИК (piper.exe + onnxruntime + espeak-ng-data) и модель ru_RU-irina (.onnx 61МБ + .json) ЗАШИТЫ прямо в модпак (Azumatt-TextToSpeech/Piper/) — чистая установка больше не зависит от скачивания с GitHub (которое падало 'An error occurred while sending the request'). BROHEIM-TtsChatFix по-прежнему убирает ник из озвучки. Размер модпака +99МБ. updateType=patch — обновить клиент. 20260711a — v2.6.7 | КРИТИЧЕСКИЙ ФИКС КРАША КЛИЕНТА ПРИ ПОДКЛЮЧЕНИИ. Движок BROHEIM-RU: ОТКЛЮЧЕН форсинг русского голоса TTS (ru_RU-irina) — kill-switch. Причина: после v2.6.5 (фикс EnsureRussianVoice) piper-голос ru_RU-irina стал реально грузиться → TextToSpeech.Speak запускал нативный ONNX-инференс → segfault (нативный краш без managed-исключения) ровно в момент «voice model ready» при спавне → игра вылетала/замирала, затем ZRpc timeout. До v2.6.5 голос был null и Speak пропускался — краша не было. Теперь TTS-патчи полностью отключены, TextToSpeech работает в ванильном режиме (стандартный голос, озвучка чужих сообщений чата сохранена через BROHEIM-TtsChatFix). Русификация текстов НЕ затронута — все broheim-ru-* пакеты на месте. updateType=patch — обновить клиент. 20260710j — v2.6.6 | Рюкзаки: имена = литеральные YAML-ключи (БЕЗ апострофа — «Explorers Backpack», не «Explorer's»!), мой label с апострофом не совпадал. +broheim-ru-backpacks: 16 рюкзаков (Majestic: Explorer/Simple/Mining/Foraging/Treasures/Troll/Armory/Weaponry/Food/Trophy/Ammo + Wizardry: Novice/Scholar/Magus/Wizard/Electromancer) — labels+fragments (подстрока ловит color-теги tooltip) + 16 описаний. OdinHorse: только 2 $-токена ($horse_odin/$pin_cart), остальные предметы — литералы. +broheim-ru-odinhorse: 22 предмета (Iron Horse Armor→«Железная конская броня», Horse Saddle/Cape/Trophy/Trophy Helmet, Horseaker, Horsie Chair, конина/шкура/ковры, Dark Frankfurter, Shaslik, Thick Soup, Drapmadr/Skogarmadr-сеты, horse bite) — labels+fragments. EpicLoot: строка поиска в инвентаре «Search...» — хардкод в DLL (_placeholder.text), не покрывается нативным Russian.json (1450 el_* ключей). +broheim-ru-epicloot: «Search...»→«Поиск...». Пакетов русификации: 22 → 23. Пакеты ru1→ru2: backpacks, odinhorse. updateType=patch — обновить клиент. 20260710i — v2.6.5 | Движок BROHEIM-RU v2.0.0 (пересборка DLL): 1) EnsureRussianVoice — _piperFolder это INSTANCE-поле TextToSpeechPlugin, GetValue(null) падал «Non-static field requires a target» -> ищем экземпляр через FindObjectOfType; + TtsSpeak_Patch skip Speak если voiceModel=null (гасит NullReferenceException в TextToSpeech.FireAndForget на каждом чат-сообщении). 2) IMGUI — добавлены перегрузки GUILayout.Label/Button(string, GUIStyle, options) и GUILayout.Window — QuickConnect использует именно их (GUILayout.Window + Label/Button со стилем), поэтому «Quick Connect»/«Choose A Server:»/«Reload from Disk» теперь ловятся. SeaAnimals: +fragments.tsv (имена+описания мяса как подстроки, longest-first) — ловит tooltip даже если имя обёрнуто в color-теги (exact-label промахивался); +14 описаний в labels (Raw/Roasted ... meat.). Пакет seaanimals ru2→ru3. updateType=patch — обновить клиент. 20260710h — v2.6.4 | Исправлены 4 пробела из клиентского лога/скриншотов: 1) BetterUI — статы на экране выбора персонажа (showCustomCharInfo=true, дефолт) «Kills/Deaths/Crafts/Builds»→«Убийств/Смертей/Крафтов/Построек» (fragments, ставятся напрямую в TMP). 2) WackysDatabase — вкладка молотка «TinyVersions [1]» не ловилась точным label из-за суффикса счётчика -> перенесена в fragments (подстрока) → «Мини-версии [1]». Crafting/Misc/Furniture — ванильные PieceCategory enum, уже RU через $-токены. 3) AzuEPI — слоты снаряжений «Loadout 1..10»→«Снаряжение 1..10» (fragment «Loadout »→«Снаряжение », заголовок «Loadouts» уже в labels). 4) Therzie-Warfare — 2 новых предмета отсутствовали во внешнем English.yml (только во встроенном yml мода): Flametal Battleaxe→«Пламенная секира» (+описание), Flametal Sledgehammer→«Пламенный молот» (+описание) — добавлены в Warfare.Russian.yml. Crystal Battleaxe/Demolisher/Iron Sledge/Stagbreaker переиспользуют ванильные токены — уже RU. Пакеты ru1→ru2: betterui, wackysdatabase, azuepi. updateType=patch — обновить клиент. 20260710g — v2.6.3 | BetterUI ForeverMaintained: аудит — мод использует 44 ванильных $-токена для всей стат-разметки ($item_armor/$inventory_*/$skill_*/$piece_* -> уже RU). +broheim-ru-betterui (fragments) для хардкод in-game строк, которые появляются при включении соответствующих фич: "Lvl:" (customSkillUI, дефолт off), "Lv." (enemyLevelStyle=PrefixLevelNumber, дефолт DefaultStars-звёзды), "LEVEL UP"/"Level: /Progress: " (Character XP, в BROHEIM config уже отключено showCharacterXP=false), "MODDED" (маркер мод-предмета в звёздах качества). Теперь BetterUI полностью переведён независимо от настроек. Пакетов русификации: 21 -> 22. updateType=patch — обновить клиент. Модов: 108 -> 109. 20260710f — v2.6.2 | SeaAnimals: добавлено всё мясо (литерал m_name, нет $-токенов) в broheim-ru-seaanimals/labels.tsv — 14 наименований: Blue Shark Meat→«Мясо синей акулы», Shark Meat→«Мясо акулы», Crocodile/Humboldt Squid/Sea Turtle/Turtle/Whale Meat + жареные варианты (Roasted ...). Проверены DragonRiders (полностью через токены), Spearfishing/Hunting/BetterRiding (нет литерал-предметов). Пакет seaanimals ru1→ru2. updateType=patch — обновить клиент. 20260710e — v2.6.1 | Исправлены пробелы, замеченные игроками: +broheim-ru-azuepi — панель Stats AzuExtendedPlayerInventory (60+ характеристик: Attack/Block/Sneak Stamina, Blunt/Pierce/Slash/Fire/Frost/Poison/Lightning/Spirit Damage+Resist, Health/Eitr/Stamina Regen, Movement/Run/Swim/Jump Speed, Crit Chance, Comfort/Cover/Noise Level, Total Armor, Lifesteal, Stagger Resist и др.), слоты экипировки (Backpack/Cape/Helmet/Legs/Chest/Tool/Torch/Utility/Quiver/Trinket/Wishbone), кнопки панелей (Loadouts/Select All/Clear All/Repair all). Backpacks: добавлены labels-литералы (дубль токенов на случай кэша JLocalizationManager) — «Backpack»→«Рюкзак», «Explorer's Backpack»→«Сундук исследователя». Therzie-Warfare: восстановлены 3 отсутствовавших ключа в Warfare.Russian.yml — crossbow_wood_TW «Crude Crossbow»→«Грубый арбалет» (+описание) и SE_Decapitator5_description_TW. OdinHorse: добавлена телега «Horse Cart»/«Odin Cart»→«Конская повозка» (BuildPiece rae_HorseCart, имя-литерал; Nagir-RU покрывал только токены horse_odin/saddle/armor). WackysDatabase: добавлены 4 вкладки молотка строительства (piecehammerCategory-литералы) — TinyVersions→«Мини-версии», Crafting→«Крафт», Misc→«Разное», Furniture→«Мебель». Пакетов русификации: 20 → 21. updateType=patch — обновить клиент. Модов: 107 → 108. 20260710d — v2.6.0 | Закрыты все пробелы русификации (аудит 86 модов). +broheim-ru-wackysdatabase: 64 предмета/постройки JewelHeim с литеральным английским m_name (Eruptor×10, пояса×3, Bandage/Suture, Honey/Jelly Glazed×7, Jerky×6, рыбные блюда×4, зелья Quiet/Tail Wind/Wind Run/Wisp, Skill Potion×7, Staff of Healing×2, Burst Shot×4, Royal Beehive, Small Blast Furnace/Kiln/Smelter/Windmill/Eitr Refinery) — переведены через точные Labels без правки YAML. +broheim-ru-backpacks: 9 токенов UI/имён рюкзаков (нет встроенного Russian.yml). +broheim-ru-craftyboxes: 21 категория контейнеров (хардкод в DLL). +broheim-ru-quickconnect: кнопка + статусы подключения. Уточнено: EpicLoot и EpicLoot_Therzie уже переведены нативно (встроен EpicLoot.localizations.Russian.json, 1450/1450 ключей el_*). Итого 20 per-mod пакетов + движок. updateType=minor — обновить клиент через лаунчер. Модов: 103 → 107. 20260710c — v2.5.1 | Аудит русификации: PlantEverything был непереведён — восстановлены pe_* токены (59) в broheim-ru-planteverything/tokens.txt + включена нативная локализация (EnableLocalization=true, Language=russian) для подгрузки russian_PlantEverything.json от StaryPartisan. Найден пробел: ~60 предметов и 6 построек WackysDatabase (Eruptor-варианты, ремни, glazed-еда, вяленое мясо, зелья навыков, посохи лечения, Royal Beehive, Small Blast Furnace/Kiln/Smelter/Windmill/Eitr Refinery) имеют литеральный английский m_name без токена — не переводятся (было и в старой сборке). updateType=patch — обновить клиент. 20260710b — v2.5.0 | Русификатор переведён на модульную архитектуру: один движок BROHEIM-RU v2.0.0 (патчит Localization, TTS-голос Ирина, захардкоженные строки UI) автозагружает per-mod пакеты broheim-ru-<мод> без своих DLL. Создано 16 точечных пакетов: azuhoverstats, betterriding, dragonriders, fermenting, hunting, itemdrawers (токены+подписи), oremings, seedbed, tarcollector, spearfishing, seaanimals, chatter, speedypaths, odinhorse, boatadditions (патчи якорей), planteverything (патч единиц времени). Удалены переводы для отсутствующих модов (HaldorOverhaul, TheFisher, WardIsLove, BowPlugin, MagicPlugin, Sailing, ComfortTweaks, SkillXpMead, MoreWorldLocations, BalrondConstructions) — «без лишнего». Therzie ×6, XPortal, QuickStackStore, BoatAdditions, OdinHorse, PlantEverything используют уже встроенные русские файлы — их .txt-дубликаты убраны из движка. updateType=minor — обновить клиент через лаунчер. Модов: 86 → 103. 20260710a — v2.4.0 | Обновлён OneMapToRuleThemAll 1.2.10→1.2.14 (фикс рыбного радара встроен upstream — спасибо BROHEIM_CYBRP). WackysDatabase 2.4.93→2.4.94 (ammoType для предметов). Удалён BROHEIM-OmtrtaFishRadarFix (интегрирован в OMTRTA 1.2.14). Удалён BROHEIM-ServerDevFix (Server Devcommands 1.108 работает без него). Vapok-ShieldMeBruh перенесён с сервера в client_extras (чисто клиентский мод — не должен работать на дедике). Удалены мёртвые конфиги WackysDatabase от OdinsKingdom (15 предупреждений «Piece GB_* not found») и сломанные рецепты WindPotion/WindRun_JH (требовали несуществующий InfusedCrystal_JH). updateType=minor — обновить клиент через лаунчер, сервер уже перезапущен. Модов: 86. 20260702k — v2.3.2 | BetterUI: showCharacterXP=false (убраны LEVEL UP и жёлтая полоска XP). updateType=patch — обновить клиент. 20260702j — v2.3.1 | AzuClock: «В игре …» того же цвета, что и основное время (#E8E8E8). +BROHEIM-TtsChatFix: в озвучке чата не произносится ник (в т.ч. свой) — только текст сообщения. updateType=patch — обновить клиент. Модов: 88. 20260702i — v2.3.0 | +BetterUI ForeverMaintained 2.5.9 — клиентские улучшения UI (HUD, инвентарь, подсказки, уровни врагов). Только клиент, на дедик не ставится. updateType=minor — обновить клиент через лаунчер. Модов: 87. 20260702h — v2.2.1 | AzuClock: убраны секунды (HH:mm), строка «В игре … · день …» выделена жёлтым (#FFD700). updateType=patch — обновить клиент. 20260702g — v2.2.0 | QuickConnect 1.7.1: кнопка быстрого подключения к BROHEIM на главном экране (vh.cybrp.com:2456), пароль из quick_connect_servers.cfg. -OdinPlus-OdinsKingdom (замковые постройки убраны из сборки). updateType=minor — обновить клиент через лаунчер. 20260702c — v2.1.1 | OdinHorse ConfigSync: пересоздан Raelaziel.OdinHorse.cfg по документации мода (удалён устаревший файл с дублирующими секциями без метаданных — из‑за них клиент падал на Sequence contains no elements при синке базовых настроек лошади). Восстановлены настройки BROHEIM: Lock Configuration=Off, хоткеи R/T/B, седловые сумки включены, спавн лошади Spawn time=Always. updateType=patch — обновить клиент через лаунчер. Модов: 86. 20260702b — v2.1.0 | Возврат части модов со старой сборки BROHEIM в текущую конфигурацию сервера (58 модов + конфиги). Добавлены: админ/dev-команды (Server_devcommands, World_Edit_Commands, Upgrade_World, Item_Stand_All_Items + кастомный патч BROHEIM-ServerDevFix, без которого был возможен краш ComponentInfo.SearchComponents), хранение персонажей на сервере (ServerCharacters), общая карта с авто-метками (OneMapToRuleThemAll + фикс рыбного радара), редкий лут и зачарования (EpicLoot + патчи EpicLoot_Therzie под Warfare/Armory/Monstrum/Wizardry), морские существа (SeaAnimals), маунты и транспорт (BetterRiding, DragonRiders, OdinHorse + рус. перевод, BoatAdditions + рус. перевод), чертежи построек (PlanBuild — 44 готовых блюпринта, HammerTime, AzuWorkbenchTweaks, ProfitablePieces), ферма и автоматизация (PlantEverything + рус. перевод, PlantEasily, SeedBed, OreMines, TarCollector, Fermenting, Hunting, LazyVikings), большой блок инвентарь/QoL (AzuExtendedPlayerInventory, AzuAutoStore, AzuCraftyBoxes, AzuAreaRepair, Recycle_N_Reclaim, AAA_Crafting, BowsBeforeHoes, PetPantry, SleepSkip, AzuHoverStats, AzuClock, Pet_Protection, ItemDrawers, ItemStacksItemWeights, ShieldMeBruh, Quick_Stack_Store_Sort_Trash_Restock), порталы и телепорт (XPortal, TeleportEverything, QuickTeleport), навыки (SpeedyPaths, Spearfishing, Digitalroots_Slope_Combat_Assistance) и интерфейс/чат (MoreMapPins, Chatter, LoadingScreen, TextToSpeech, AutoRemoveDeathPin, LootParticlePlus, GammaOfNightLights). Модов: 24 → 86. Решения по проверке совместимости: (1) MSchmoecker-MultiUserChest НЕ добавлен — именно эта связка с AzuAutoStore и ItemDrawers вызывала лог-флуд ~14000 строк/сек и краш на старом сервере (см. записи 20260628b/20260628), общий доступ к сундукам остаётся ванильным; (2) Smoothbrain-TargetPortal удалён и заменён на SpikeHimself-XPortal — обе делали одно и то же (список порталов вместо тегов), дублировать не стали; (3) 5 модов, которые нельзя ставить на дедик (PlantEasily/TextToSpeech — прямой запрет авторов, плюс LoadingScreen/MoreMapPins/AutoRemoveDeathPin), возвращены в отдельный клиентский слой client_extras — build_modpack.py снова умеет доклеивать его поверх серверного дерева в клиентский архив. Обнаруженные и закрытые недостающие зависимости: ValheimModding-JsonDotNET (для EpicLoot), ValheimModding-YamlDotNet (для ItemStacksItemWeights), ValheimModding-HookGenPatcher + сгенерированные MMHOOK-сборки (для PlanBuild — без них он не грузился, TypeLoadException на старте), апгрейд ValheimModding-Jotunn 2.27.1 → 2.29.1 (EpicLoot требовал ≥2.29.0, PlanBuild ≥2.28.0). Фикс конфига по запросу: shudnal.ItemStacksItemWeights — StackMultiplier.Global поднят 1 → 3 (размер стаков x3); в перенесённых конфигах вычищены игрок-привязанные и бэкапные файлы старого сервера (Recycle_N_Reclaim player .dat, EpicLoot BountySaves .dat, OdinHorse/HammerTime *.bak). Мир НЕ вайпнут — сохранена текущая карта сервера. updateType=minor → лаунчер сделает чистую установку клиента. Модов: 86. 20260702 — v2.0.0 | ПОЛНЫЙ ПЕРЕЗАПУСК СЕРВЕРА. Старая сборка BROHEIM (121 мод) полностью снята, /opt/valheim перенесён в бэкап (/root/old-vh-server), поставлен чистый ванильный Valheim Dedicated Server через SteamCMD с нуля. Базовая конфигурация новой сборки была собрана на основе набора JewelHeim, 24 мода: ванильно-подобная прогрессия — новое оружие/броня/магия (Warfare, WarfareFireAndIce, Armory, Wizardry), новые монстры и мини-боссы (Monstrum, MonstrumDeepNorth), настраиваемые рейды и спавны (Custom Raids, Spawn That!, Drop That!), рюкзаки, порталы по списку (TargetPortal), MouseTweaks и прочий QoL. Причина: старая сборка накопила несовместимые правки и заняла критично много места на диске (лишние логи/крашдампы/старые архивы модпака — расчищено ~9 ГБ, диск расширен на +10 ГБ до 58 ГБ). Discord-бот (RustyMods-DiscordBot) из сборки убран. Имя сервера, адрес и пароль — прежние (BROHEIM / vh.cybrp.com), МИР НОВЫЙ (несовместим со старым из-за смены модпака) — старый мир сохранён в бэкапе. Клиентский модпак пересобран с нуля (1.06 ГБ, без старых серверных секретов), лаунчер как обычно выполняет чистую установку. updateType=major. Модов: 24. 20260628k — v1.5.6 | BROHEIM-DrawerAuto 1.2.0: патч WardIsLove — заглушка ошибки AddStaggerDamage. WardIsLove 3.6.3 при входе любого существа в зону варда запускает корутину UpdateDamage с _type=Stagger, которая вызывает удалённый из Valheim метод Character.AddStaggerDamage() → MissingMethodException каждые 2 секунды пока существо внутри. Это происходило ПОСТОЯННО у базы (животные, мобы). Фикс: перехватываем OnTriggerEnter, меняем тип Stagger → Normal до старта корутины. Вард по-прежнему наносит damage через ApplyDamage, просто без stagger-анимации. patch. 20260628j — v1.5.5 | BROHEIM-DrawerAuto 1.1.0: автофикс радиуса подбора у ящиков. Проблема: DrawerPickupRange в конфиге это лишь дефолт для НОВЫХ ящиков — у существующих радиус 4 был записан прямо в ZDO мира и не менялся при изменении конфига. Фикс: при спавне игрока и каждые 10 секунд плагин проверяет все загруженные ящики и поднимает их PickupRange до текущего Radius (16) если он меньше. Итог: все уже построенные ящики автоматически получат радиус 16 м без ручной настройки. patch. 20260628i — v1.5.4 | Хотфикс 1.5.3: BepInEx.cfg восстановлена консоль (Enabled = true). patch. 20260628h — v1.5.3 | Фикс радиуса подбора и стабилизация клиента. (1) kg.ItemDrawers: DrawerPickupRange 4 → 16 м — теперь выдвижные ящики подбирают дроп с плавилен/горна/угольной ямы/ферментёра с радиуса 16 м (совпадает с радиусом подачи BROHEIM-DrawerAuto). Раньше дроп подбирался только с 4 м, поэтому складирование выглядело «меньше». Значение на стороне сервера, server-synced. (2) BepInEx.cfg на клиенте: включён уровень логирования Fatal/Error/Warning/Message/Info (Debug отключён). Это устраняет флуд от AzuAutoStore, OdinsFoodBarrels и AzuExtendedPlayerInventory (сотни строк в секунду), который нагружал диск и дестабилизировал клиент — вероятная причина нативных вылетов. Анализ логов показал: вылет при постройке «каменного ящика» НЕ был вызван KG или BROHEIM-DrawerAuto; плагин работает корректно (ZDO-ключи "Amount"/"Prefab"/"Quality" совпадают, рефлексия разрешает все методы). updateType=patch. Модов: 121. 20260628g — v1.5.2 | BROHEIM-DrawerAuto: радиус поиска ящиков увеличен 8 → 16 м (broheim.DrawerAuto.cfg → General.Radius). Конфиг не server-synced, поэтому значение доставляется паком; лаунчер распаковывает с перезаписью, так что после обновления у всех станет 16. При желании можно поправить локально в BepInEx/config/broheim.DrawerAuto.cfg (до 50). updateType=patch. Модов: 121. 20260628f — v1.5.1 | ФИКС BROHEIM-DrawerAuto: в 1.5.0 плагин падал с FieldAccessException на каждом тике станции и поэтому НИЧЕГО не делал (ни подачи, ни складывания). Причина: собрал против «опубличенной» сборки игры, а Mono Valheim в рантайме запрещает прямой доступ к приватным полям (m_nview, GetFuel и т.п.) и не уважает IgnoresAccessChecksTo (проверено самотестом на сервере). Переписал доступ к приватным членам через рефлексию (как делает Harmony внутри — гарантированно работает на этом Mono), m_nview беру публичным GetComponent(). На сервере подтверждено: «VReflect: all private members resolved», исключений доступа больше нет. Логика та же (подача топлива/материалов из KG-ящиков во все станции + складывание готовки/мёда/сока в ящики, owner-авторитарно, loss-safe). updateType=patch — набор модов тот же, лаунчер обновит DLL «поверх». Модов: 121. 20260628e — v1.5.0 | +BROHEIM-DrawerAuto 1.0.0 — свой мод-мост LazyVikings↔KGvalheim-ItemDrawers. Теперь станции автоматически берут ресурсы НАПРЯМУЮ из выдвижных ящиков KG (раньше LazyVikings видел только сундуки/контейнеры с инвентарём). Подача (топливо + материалы) во ВСЕ типы станций: плавильня/доменная печь/угольная яма/ветряк/прялка/эйтр-очиститель/чан (Smelter-класс), готовка (костёр-для-готовки/железный/каменная печь), очаги-костры-факелы-бонфайр (Fireplace), ферментёр. Складывание готового продукта В ящики: плавильни/печи/яма/ветряк/прялка/ферментёр сами роняют продукт на землю — ближний ящик KG с этим предметом подбирает его штатно (нужно: PickupRange>0 и ящик уже «настроен» на этот предмет, т.е. в нём уже лежит такой); для ГОТОВКИ, УЛЬЕВ и СОКОСБОРНИКОВ (хранят продукт внутри, на землю не роняют) мод сам кладёт продукт в подходящий ящик. Чтобы не было дублей, у LazyVikings отключён ВЫХОД именно для этих трёх: Beehive=Off, SapCollector=Off, Cooking/IronCooking/StoneOven Automation=Fuel — подачу из сундуков LazyVikings при этом продолжает. Безопасность от дюпов: мод действует ТОЛЬКО на владельце станции; при подаче сначала списывает из ящика, потом отдаёт в станцию (при сбое связи — потеря, не дубликат); при складывании наоборот — сначала забирает из станции, потом кладёт в ящик. В чужие/пустые ящики не пишет — только в те, что уже настроены на этот предмет. Радиус поиска ящиков 8 м (config General.Radius, до 50). Тумблеры в BepInEx-конфиге broheim.DrawerAuto: Enabled / FeedFromDrawers / DepositToDrawers — если вдруг увидишь дубликаты, мгновенно выключи DepositToDrawers. updateType=minor → лаунчер сделает ЧИСТУЮ установку. Модов: 120. 20260628d — v1.4.0 | Перевод: доперевод WardIsLove и ящиков KG. (1) Вард — зашитый в DLL текст наведения теперь по-русски: «Вард заряжён», «Дней до истечения», «Зарядить вард», «Открыть меню варда», статус Да/Нет, «Радиус», «Лимит вардов», «Вы не администратор», «[Steam-инфо: …]» (через _fragments.tsv, т.к. это хардкод, а не токены). (2) KGvalheim-ItemDrawers — имена всех 7 построек и категория «Выдвижные ящики» переведены по ТОКЕНАМ (piece_kg_ItemDrawer_*/piecemanager_cat_itemdrawers) через словарь BROHEIM-RU (надёжнее фрагментов; старый ItemDrawers.txt был от удалённого makail-мода). Подсказки наведения KG (взять стопку/один, сложить всё, очистить, открыть настройки, «используйте хотбар») и окно настроек уже на русском. Ящики KG показывают число предметов на лицевой стороне (цвет настраивается: глобально DefaultColor и индивидуально в окне «Цвет текста») и сохраняют звёзды качества. Изменения только клиентские (тексты BROHEIM-RU), но updateType=minor → лаунчер сделает ЧИСТУЮ установку, чтобы гарантированно подтянуть KG-ящики и переводы у всех. Модов: 119. 20260628c — v1.3.0 | ItemDrawers: makail-ItemDrawers 0.5.8 → KGvalheim-ItemDrawers 1.2.0. Это окончательно чинит вылет у базы с ящиками: у makail внутренние контейнеры ящиков (Container_1) попадали в обычное сканирование AzuAutoStore, и он каждый цикл пытался затолкать туда весь инвентарь (нативный вылет при подходе к большому складу). KG-версию AzuAutoStore/AzuCraftyBoxes/QuickStack понимают через специальный API (kg_ItemDrawers) — авто-раскладка кладёт в ящик ТОЛЬКО его тип предмета, без перебора всего инвентаря. Что теперь работает штатно: AzuAutoStore и QuickStack авто-раскладывают предметы по ящикам; AzuCraftyBoxes автоматически берёт ресурсы из ящиков для крафта (Container Range = 50). Из AzuAutoStore.yml убраны временные исключения ящиков (piece_drawer/Container_0..3) — иначе авто-раскладка по ящикам была бы выключена. Плавильни (smelter/blastfurnace/charcoal_kiln) остаются вне авто-раскладки (топливо/руду кидаем вручную). Старые ящики makail конвертируются в KG автоматически без потери содержимого (на сервере сделан бэкап мира). WardIsLove: рецепт постройки варда («Тор») удешевлён — теперь требуется только 10 Wood (было FineWood:10 + SurtlingCore:10 + Thunderstone:1); рецепт не синкается с сервером (это определение build-piece), поэтому новая стоимость доставляется именно паком — обнови клиент. Перевод WardIsLove проверен и корректен (RU: меню/вкладки/взаимодействия/PvP/рейды/авторемонт, предмет «Тор» и описание). updateType=minor → лаунчер сделает ЧИСТУЮ установку. Модов: 119. 20260628b — v1.2.0 | -MSchmoecker-MultiUserChest (удалён). Это окончательный фикс фриза/вылета у базы. Причина была в связке: AzuAutoStore через свою встроенную ItemDrawers-интеграцию (в обход yml-правил, исключить конфигом нельзя) каждый цикл пытался разложить весь инвентарь по каждому ящику, а MultiUserChest логировал КАЖДЫЙ отказ (PreventItemAdd, у мода нет опций отключить лог) — десятки ящиков × весь инвентарь × каждый кадр = ~14000 строк/сек → фриз → краш. MultiUserChest — необязательный мод (AzuAutoStore и QuickStack лишь опционально его учитывали, жёсткой зависимости нет), поэтому удалён: лог-флуд исчезает в корне, авто-раскладка по сундукам/ящикам и ограничения ящиков продолжают работать через ванильную логику. Что теряется: одновременный доступ нескольких игроков к ОДНОМУ сундуку (возвращается ванильное «сундук занят», если двое лезут в один сундук в один момент). updateType=minor → лаунчер сделает ЧИСТУЮ установку (мод гарантированно удалится с клиента); также прописан в removals. Модов: 119. 20260628 — v1.1.2 | Фикс фриза/вылета клиента у базы (ItemDrawers + AzuAutoStore + MultiUserChest). Причина: AzuAutoStore каждый цикл пытался разложить ВЕСЬ инвентарь по КАЖДОМУ выдвижному ящику (makail-ItemDrawers), каждый ящик принимает только свой 1 тип предмета, MultiUserChest отбивал остальное (Stone/Wood/RoundLog/CopperOre != Coal) и логировал КАЖДУЮ попытку — десятки ящиков × весь инвентарь × каждый кадр = ~14000 строк в лог за секунды → фриз → вылет. Решение: в Azumatt.AzuAutoStore.yml ящики исключены из авто-раскладки (piece_drawer, piece_chest_drawer и внутренние контейнеры Container_0..3 = exclude All); заодно из авто-подачи исключены плавильни/печи (smelter, blastfurnace, charcoal_kiln, windmill, eitrrefinery, spinningwheel) — у них топливный слот тоже только Coal. Конфиг server-synced (AzuAutoStore синкает yml клиентам), но т.к. пак раздаёт клиентам копию серверных конфигов — версия поднята, чтобы у клиента локальная копия тоже была актуальной. Нюанс: AzuAutoStore больше не заполняет ящики/печи автоматически — кидаем в них вручную (у ItemDrawers свой подбор дропа в радиусе). patch-обновление (изменился только конфиг). Модов: 120. 20260627f — v1.1.1 | Откат WardIsLove 3.7.2 → 3.6.3 (последняя РАБОЧАЯ версия). Тест подтвердил: 3.7.2 вызывает бесконечную загрузку при входе ДАЖЕ при синхронных версиях клиент/сервер и чистой установке — после «Starting respawn» спавн не завершается (переписанная в 3.7.0+ RPC/спавн-логика варда). 3.6.3 заходит штатно. Русский перевод WardIsLove полностью сохранён (от версии не зависит). Это patch-обновление (меняется только WardIsLove.dll, набор файлов идентичен) — лаунчер обновит «поверх», чистая установка не нужна. Обнови пак 1.1.0 → 1.1.1. Модов: 120. 20260627e — v1.1.0 | Azumatt-WardIsLove обновлён до 3.7.2 (последняя версия) на сервере и в клиентском паке — версии синхронизированы на обеих сторонах (прошлое зависание было из-за рассинхрона: на сервере вард был, у клиента — нет/старый). WardIsLove ПОЛНОСТЬЮ русифицирован: создан BROHEIM-RU/Translations/Russian/WardIsLove.txt (65 токенов — меню настройки варда, вкладки Основное/Дополнительно/Доступ/Обратная связь, все взаимодействия: сундуки/двери/порталы/корабли/таблички/верстаки/плавильни/ульи/картостол, PvP, рейды, авторемонт, список разрешённых, предмет «Тор»). Серверные сообщения варда переведены (вход «Вы вошли в вард игрока …», выход, тревога «К оружию! Враг вошёл в ваш вард!»). ВНИМАНИЕ: т.к. изменился набор/версия модов (updateType=minor) и при апдейте «поверх» старые моды не удаляются — лаунчер теперь принудительно делает ЧИСТУЮ установку. Лаунчер v1.1.12: (1) форс чистой установки при minor/major-обновлениях — гарантирует точное совпадение набора клиента с сервером (раньше extract-over не удалял исчезнувшие моды → дрейф: Logo Changer оставался, WardIsLove мог пропасть); (2) проверка целостности скачанного архива по SHA256 + сверка кэша по хэшу (раньше сверялся только размер — битый файл того же размера шёл в установку). Обязательно: дождись автообновления лаунчера до 1.1.12 и установи пак (будет чистая установка). Модов: 120. 20260627d — v1.0.10 | -Azumatt-Logo_Changer: мод замены логотипа удалён — вызывал замедление загрузки при входе на сервер. Если установлен — папки плагина и конфига удалятся автоматически при обновлении. 20260627c — v1.0.9 | Обновлён логотип Ashlands (v2). Превью блюпринтов уменьшены до 256px. 20260627b — v1.0.8 | +Azumatt-Logo_Changer 1.0.12: логотип Valheim заменён на BROHEIM (главный экран + экран Пепельных земель). Обновление модпака 1.0.7 → 1.0.8 обязательно. 20260627 — v1.0.7 | +Azumatt-WardIsLove 3.7.2: улучшенные охранные камни — настройка доступа по Steam/Xbox-ID, гибкие разрешения/запреты внутри зоны (огонь, порталы, постройки, пикапы и др.), визуальный индикатор статуса. +PlanBuild чертежи (44 блюпринта): BROHEIM-пак готовых построек (дома, форты, стены, деревни, стартовые базы). Конфигурация сервера: PlanBuild теперь раздаёт серверные чертежи всем клиентам (Allow serverside blueprints = true), бесплатное прямое размещение блюпринтов отключено (Allow direct build = false) — строим по чертежам с реальными ресурсами. Обновление модпака 1.0.5 → 1.0.6 обязательно. 20260625f — ФИНАЛЬНЫЙ ФИКС озвучки (бесконечная рекурсия → краш): в BROHEIM-RU патч TtsGetVoiceModel (на VoiceModelManager.GetVoiceModel) создавал бесконечную рекурсию: GetVoiceModel → Postfix → EnsureRussianVoice → GetVoiceModel → ... → StackOverflow → игра падала без managed-исключения ровно после спавна (когда первый раз срабатывал TTS). Патч GetVoiceModel УДАЛЁН полностью. EnsureRussianVoice теперь кэширует VoiceModel-объект через Activator.CreateInstance и возвращает его напрямую — без вызова GetVoiceModel. Озвучка Irina (русский голос) работает через TtsSpeak_Patch.Prefix + прямой кэш. Обновление модпака 1.0.4 → 1.0.5 обязательно (рестарт сервера не нужен). 20260625e — КРИТИЧЕСКИЙ ФИКС озвучки (краш игры после спавна): TextToSpeech.Speak — async-метод, и после первого await его продолжение (PlayAudio → создание AudioClip/GameObject/AudioSource) выполнялось НЕ в главном потоке Unity (в Unity нет SynchronizationContext, продолжение уходит в пул потоков). Создание Unity-объектов из фонового потока — это жёсткий НАТИВНЫЙ краш процесса без managed-исключения (игра «сама закрывалась» сразу после входа, в логах пусто). Решение: BROHEIM-RU теперь патчит TextToSpeech.PlayAudio и принудительно перебрасывает воспроизведение звука обратно в главный поток Unity через BepInEx ThreadingHelper. Сам мод Azumatt-TextToSpeech.dll НЕ изменён (идентичен оригиналу). Озвучка Irina (русский голос) снова работает, и игра больше не вылетает. Обновление модпака 1.0.3 → 1.0.4 обязательно (рестарт сервера не нужен — это клиентский фикс). 20260625d — Критический фикс зависания игры после входа на сервер: AzuAntiArthriticCrafting.dll падал с TypeLoadException (не мог загрузить ui_lib / Auga.CraftingControls) при каждом Harmony-сканировании сборок — итого 160+ исключений в секунду после спавна, игра зависала. Добавлен stub-файл ui_lib.dll (пустая заглушка с нужными типами), который устраняет TypeLoadException. AzuAntiArthriticCrafting теперь загружается чисто, весь интерфейс крафта работает корректно. Обновление модпака 1.0.2 → 1.0.3 обязательно. 20260625c — Лаунчер v1.1.4: исправлено закрытие окна настроек по крестику (window.close() как надёжный fallback); все три опции теперь реально включены по умолчанию на свежей установке (get-settings больше не перезаписывает autoLaunch из системного состояния; настройки применяются к ОС при первом запуске). 20260625b — BroheimRU TTS фикс: EnsureRussianVoice больше не падает с «Non-static field requires a target» при каждом сообщении в чате — GetValue(null) обёрнут в try-catch, fallback-путь через Assembly.Location теперь реально исполняется. Результат: русский голос Irina регистрируется корректно, TTS озвучивает чат по-русски. 20260625 — +Vapok-ShieldMeBruh 1.0.8: новый мод — авто-экипировка щита при взятии одноручного оружия. Обновление WackysDatabase 2.4.83 → 2.4.92. Исправлено 4 бага: (1) BroheimRU TTS NullReferenceException — TtsSpeak_Patch.Prefix теперь возвращает Task.CompletedTask вместо null при пропуске сообщения; (2) BroheimRU SearchComponents — патч ServerDevcommands откладывается до FejdStartup.Awake, когда все плагины уже загружены; (3) BroheimRU _piperFolder — путь Piper вычисляется из Assembly.Location вместо обращения к инстансу через null; (4) WackysDatabase «Didn't find effect» — удалены ссылки на vfx_meteorstart_TW, vfx_yagluthtoothmeteors_TW, fx_StaffStorm_*, vfx_StormStaff_* из YAML конфигов оружия Warfare (5 файлов). Новый серверный мод-патч BROHEIM-ServerDevFix (не клиентский) — null-safe замена SearchComponents на сервере. Модов: 121. 20260623g — KG ItemDrawers: полная русификация в BROHEIM-RU — названия всех 7 построек и категория «Выдвижные ящики», подсказки при наведении (взять стопку/один, сложить всё, очистить, настройки), окно настроек (цвет текста, радиус подбора, «Применить»). BROHEIM-RU: добавлен IMGUI-патч (GUILayout/GUI.Window) для перевода окон модов вне Localize(). Горячие клавиши — устранены конфликты: RequipMe Alt+Z→F2 (слоты AzuEPI сохраняют Alt+Z/X/C/V/B/N/1/2); PassivePowers Alt+1..7→Ctrl+1..7 (силы боссов); MagicPlugin развеять призыв Shift+F→Ctrl+U (якорь лодки остаётся Shift+F); EpicLoot способности g/h/j→F5/F7/F9 (следующая стрела лука остаётся G). Сайт: секция «Горячие клавиши» обновлена. Требуется обновление модпака и рестарт сервера. Модов: 120. 20260623f — Горячие клавиши и конфиги: проведена ревизия всех биндов модов, секция «Горячие клавиши» на сайте приведена в соответствие с конфигами сборки. Добавлен блок QuickStack (P — разложить стопки по сундукам рядом, L — пополнить из открытого сундука, O — сортировка контейнера/инвентаря, Alt+ЛКМ — «избранное»/защита). Исправлены подписи кнопок мыши: AutoStore «один предмет» и Recycle-треш — это СКМ (средняя кнопка, Mouse2), а не ПКМ (на сайте было ошибочно ПКМ). Добавлены клавиши коня OdinHorse (B — сумки, T — стоять, R — снять броню). Конфликт устранён: у QuickStack отключена корзина мусора (DisplayTrashCanUI/EnableQuickTrash = false, TrashKeybind очищен) — её Delete пересекался с «Уничтожить» у Recycle_N_Reclaim, а сам функционал дублировал Recycle (по твоей просьбе «не пересекать»). Требуется обновление модпака (изменился конфиг QuickStack). Модов: 120. 20260623e — Сборка: добавлен мод Quick Stack — Store — Sort — Trash — Restock (1.4.13, Goldenrevolver) рядом с AzuAutoStore (не конфликтуют, AEPI/MultiUserChest учтены). Что даёт: «Разложить» (клавиша P) раскладывает предметы по всем сундукам рядом (радиус 50 м; работает и при открытом сундуке — QuickStackToBoth), «Пополнить» (L) добирает стрелы/еду из ближних сундуков (радиус 50 м), сортировка инвентаря и сундуков (по типу/имени/весу/цене), кнопка «Сложить всё» и корзина для мусора, избранное (Alt+клик) для защиты предметов. Примечание: «зажать E» по дизайну мода всегда кладёт только в один сундук (это не настраивается) — для раскладки по всем рядом используйте клавишу P. Полностью русифицирован вручную в BROHEIM-RU (встроенный русский Opik7 заменён: исправлены ломаная грамматика и сокращения вроде «в.имя/п.имя»). Радиус AzuAutoStore («.») увеличен до 50 м. Требуется рестарт сервера (выполнен) и обновление модпака. Модов: 120. 20260623d — Сборка: добавлен мод AzuWorkbenchTweaks (1.0.5, Azumatt) — настройка зоны действия верстаков. Радиус строительства вокруг верстака увеличен с 20 до 100 м (WorkBenchRange = 100), радиус действия расширений станции (точильный камень, дубильная стойка и т.п.) — с 5 до 20 м (WorkBench Extension = 20). Радиус «базы» (где не спавнятся враги) оставлен 20 м. Server-synced, конфиг залочен. ВНИМАНИЕ: мод проверяет версию и кикает клиентов без него — обязательно обновите модпак. Требуется рестарт сервера (выполнен). Модов: 119. 20260623c — BROHEIM-RU (магазин Халдора, HaldorOverhaul): вычитка перевода торговца как живого текста. Вкладки и категории магазина (Купить/Продать/Банк, Оружие/Броня/Щиты/Боеприпасы/Расходники/Материалы/Снаряжение/Трофеи/Разное) перенесены в точные подписи _labels.tsv — раньше категория «Utility» переводилась калькой «Утилиты» (это про софт, а не про снаряжение/пояса/инструменты), а короткие слова жили в подстрочных заменах с риском задеть другие строки. Закрыты «полуанглийские» уведомления покупки/продажи: «Bought … for … coins» / «Sold … for … coins» — добавлены «Bought » → «Куплено: » и « for » → « за », теперь полностью по-русски (напр. «Куплено: 5 Бронза за 120 монет»). +«No player found.» → «Игрок не найден.» Клиентский апдейт (рестарт сервера не нужен; обновите модпак). Модов: 118. 20260623b — BROHEIM-RU (локализация растений и рыб): PlantEverything — добавлены русские названия и описания всех посадок (токены peName/Description): кусты малины/черники/морошки, грибы/жёлтые/голубые/дымовик/папоротник, чертополох, одуванчики, саженцы (бук, пихта, сухая пихта, Иггдрасиль, осенняя берёза, пепельное дерево, пепельная лоза), кусты/кустарники биомов, ветка/камень/кремень, папоротник Пепельных земель. Раньше у PlantEverything в RU был только префикс таймера, поэтому имена при посадке оставались английскими. TheFisher — закрыты оставшиеся токены из ассет-бандла: вся рыболовная наживка по биомам (лес/океан/болото/Мгла/равнины/Пепел/пещеры/Дальний Север) и трофей морской черепахи (с фиксом опечатки мода thophy). Названия рыб уже были верны (сверено с бандлом). Дублирующийся английский таймер роста: AzuHoverStats «Show Pickable Status» = Off (для «Show Plant Status» уже было Off) — у выросших растений/кустов остаётся только русский таймер PlantEverything. Клиентский апдейт (рестарт сервера не нужен; обновите модпак). Модов: 118. 20260623 — ItemDrawers: мод makail-ItemDrawers (0.5.8) заменён на KGvalheim-ItemDrawers (1.2.0) — переработка с 3 стилями ящиков (дерево/камень/мрамор), сохранением уровня (звёзд) предмета и авто-подбором дропа (радиус 5). Ёмкость ящика теперь фактически безлимитная (хранится как int, миллионы предметов — заведомо ≥100000; отдельной настройки лимита у мода нет). Старые ящики Makail автоматически конвертируются в деревянные без потери содержимого. +Pet_Protection (0.2.0, zebediah49): смертельно раненое прирученное животное не умирает, а падает без сознания на 15 минут (добить можно только самому ножом мясника) — аналог V+ «Tamed = Essential». Требуется рестарт сервера и обновление модпака. Модов: 118. 20260622d — BROHEIM-RU (НАСТОЯЩАЯ причина рыбы/мяса): токены SeaAnimals были полностью неверными в моём файле (item_SA_RoastBlueSharkMeat и т.п.), а реальные — в нижнем регистре и зашиты в ассет-бандл мода: item_bluesharkmeat, item_roastbluesharkmeat, item_sharkmeat …, существа $enemy_blueshark/$enemy_orca и т.д. Извлёк настоящие токены из бандла (UnityPy) и переписал SeaAnimals.txt. Теперь мясо/рыба и морские существа переводятся. (TheFisher-токены проверены — они были корректны.) Клиентский апдейт. Модов: 117. 20260622c — BROHEIM-RU: в строку загрузки добавлена метка сборки «[build 20260622c +Translate]» — чтобы по логу клиента однозначно определять, подхватилась ли последняя версия. Модов: 117. 20260622 — BROHEIM-RU (рыба/мясо — настоящий фикс): добавлен перехват по-токенного резолвера Localization.Translate(word). Прежний префикс ловил только строку целиком из «$токена», а имена предметов сидят ВНУТРИ составной строки тултипа (Valheim зовёт Localize один раз на всём тексте) — поэтому мясо/рыба оставались английскими, хотя токены верные. Теперь любой известный токен (item_clownfish→Рыба-клоун, item_SA_RoastBlueSharkMeat→Жареное мясо синей акулы и т.д.) возвращает русский, минуя словарь, что бы туда ни писали мод-менеджеры. Также сбрасывается кэш Localization при смене языка. AzuHoverStats: «Show Plant Status»/«Show Tree Status» = Off — убран дублирующийся английский таймер роста (PlantEverything уже показывает свой, по-русски). Клиентский апдейт. Модов: 117. 20260622 — BROHEIM-RU (типы предметов): значения «Тип предмета» в тултипе (AzuHoverStats, enum ItemType) переведены — Расходуемое, Одноручное/Двуручное оружие, Лук, Щит, Шлем, Нагрудник, Накидка, Поножи, Перчатки, Аксессуар, Трофей, Факел, Разное, Инструмент, Рыба, Подвеска, Боеприпасы, Материал, Внешний вид. Замены привязаны к подстроке «Тип предмета: » (без коллизий с описаниями). Клиентский апдейт. Модов: 117. 20260622 — BROHEIM-RU (фикс рыб/еды): добавлен префикс на Localization.Localize — для строки «$токен» наш перевод возвращается ДО ванильного поиска, поэтому мод-менеджеры (ItemManager/CreatureManager/PieceManager) больше не могут перебить русский своим английским fallback'ом. Это чинит мясо/рыбу SeaAnimals (Roasted Blue Shark Meat и весь список) и любые другие предметы с верным токеном. Имена существ SeaAnimals (Косатка, Дельфин, Синяя акула, Акула-молот и т.д.) добавлены точными подписями _labels.tsv (токен зашит в бандл). Клиентский апдейт. Модов: 117. 20260622 — BROHEIM-RU (фикс): системный перехват Localization.AddWord переписан на устойчивый __args (прежняя привязка не срабатывала) — теперь токены реально переживают поздние ServerSync-применения мод-менеджеров: оживлены мясо/рыба SeaAnimals (Roasted Blue Shark Meat и пр.). Категории Warfare/Fire And Ice/CollectorSeries/Food Barrels/TheFisher переведены через правильный токен piecemanager_cat_* (blacks7ar/Azumatt PieceManager, не Jotunn). «Mods settings» в меню → «Настройки модов» (значение конфига shudnal-ConfigurationManager). Клиентский апдейт. Модов: 117. 20260622 — Сборка: удалён мод незнакомых рецептов sighsorry-VeiledRecipes. AzuCraftyBoxes: радиус подтягивания предметов из сундуков 20 → 50 (server-synced). Модов: 117. 20260622 — BROHEIM-RU (движок): системный перехват Localization.AddWord — токен-файлы теперь авторитетны и не затираются английским из мод-менеджеров (ItemManager/PieceManager) и модов с собственной загрузкой переводов. Это оживило рыбу/мясо SeaAnimals (Blue shark meat и пр.) и постройки Balrond (Corewood/Clay). Добавлен механизм точных подписей (_labels.tsv) для коротких литералов без риска задеть чат. TTS больше не озвучивает собственные сообщения игрока (только чужие). 20260622 — BROHEIM-RU (контент): категории строительства (Военное дело, Огонь и лёд, Рыбалка, Сборщики ресурсов, Пищевые бочки, Декор/Удобства/Кухня/Скульптуры); кнопки Chatter (Сказать/Кричать/Шептать/Метка); «Mods Settings» → «Настройки модов»; Конная повозка (OdinHorse) и седельные сумки; свёрнут полный RU-перевод Balrond Constructions (372 токена). PlantEverything: «Готово in» → «Готово через», единицы ч/м/с; PlantEasily сбор по площади «(area)» → «(зона)». Клиентский апдейт (рестарт сервера не нужен для переводов; для удаления мода и радиуса — нужен). Модов: 117. 20260622 — Лут: castix-FloatingItems заменён на blacks7ar-LootParticlePlus. Плавание всех дропов на воде (вкл.), радиус автоподбора 4 м (×2 от ванили 2), хоткей сбора Q (радиус 8). Частицы над дропом и автостак на земле — выключены. Server-synced. Требуется рестарт сервера. Модов: 118. 20260621 — Карта (OneMapToRuleThemAll): подписи всех discovery/радар-пинов доведены до русского — переведены оставшиеся 64 английских сокращения (ягоды, овощи, руда, камень, существа: Грейлинг, Серый карлик, Драугр, Фулинг, Искатель и т.д.). Требуется рестарт сервера для активации. Модов: 118. 20260621 — Карта: ServerSideMap и arielle-MoreMapPins заменены на OneMapToRuleThemAll (общая карта + авто-метки и радар), KG-MoreMapPins и фикс OmtrtaFishRadarFix. Конфиг отображения/радара и иконки меток перенесены со старого сервера. Модов: 118. 20260621 — BROHEIM-RU: ручной проход — CreatureLevelAndLootControl (Russian.yml: аффиксы/эффекты/инфузии существ, призыв боссов, «Уровень сектора», уведомление о росте силы) + Spearfishing (сообщение «на гарпуне!»). Модов: 117. 20260621 — BROHEIM-RU: ручной проход по не-админским модам — PlantEasily/Balrond/OdinHorse/MWL/PlanBuild/Recycle (доп. UI-фразы и сообщения). Модов: 117. 20260621 — BROHEIM-RU: доп. ручной проход — BowPlugin/MagicPlugin/AzuAutoStore/ServerCharacters (криты, уровни, автосклад, hardcore-сообщение). Модов: 117. 20260621 — BROHEIM-RU: ручной проход по Azumatt/ServerCharacters — переведены hardcoded-сообщения наборов, ремонта, автосклада и серверного обслуживания. Модов: 117. 20260621 — BROHEIM-RU: очередной ручной проход — BetterRiding/Sailing/ComfortTweaks/BowPlugin/MagicPlugin/OreMines (hardcoded уведомления и подсказки). Модов: 117. 20260621 — BROHEIM-RU: следующий проход по порядку — DragonRiders (+Lox Bite/Stomp), Fermenting/Hunting (hardcoded статусные сообщения). Модов: 117. 20260621 — BROHEIM-RU: точечный проход по модам по порядку; закрыты hardcoded-строки Therzie-Monstrum (Fox/Black bear/Grizzly rug). Модов: 117. 20260621 — TextToSpeech: голос ru_RU-irina (женский). Модов: 117. 20260621 — GammaOfNightLights: обычный туман отключён полностью (все Fog density = 0). Модов: 117. 20260621 — TextToSpeech: голос ru_RU-dmitri (мужской), ники в чате не озвучиваются — только текст сообщения. Модов: 117. 20260621 — TextToSpeech: принудительно ru_RU-irina (BROHEIM-RU патчит Piper + «said in chat» → «написал в чате»). Обновите модпак или BroheimRU.dll. Модов: 117. 20260621 — TextToSpeech: принудительно русский голос Piper (ru_RU-irina); BROHEIM-RU переводит «said in chat» → «написал в чате». Модов: 117. 20260621 — BROHEIM-RU: доп. переводы MWL (111), MoreGates (84), DragonRiders, SeaAnimals, BetterRiding, SkillXpMead, XPortal; Balrond +66 ключей; патчи TMP/Message для HaldorOverhaul, SpeedyPaths, AzuAreaRepair. ~3500+ токенов. Модов: 117. 20260621 — +BROHEIM-RU: сборный русификатор внутриигровых элементов модов (предметы, постройки, существа, навыки, панели и подсказки) — свыше 2800 строк ручного перевода. Покрыты Therzie ×6, blacks7ar (магия/оружие/луки/руда/смола/грядки), AzuEPI (панель статистики персонажа), AzuHoverStats, TheFisher, OdinBanners/OdinCampsite, Clutter, ComfortTweaks, PassivePowers и др. Модов: 117. 20260621 — GammaOfNightLights: убран ночной туман (Fog density at night = 0). Сайт: добавлен Telegram-бот @cybrp_vh_bot. 20260621 — +shudnal-GammaOfNightLights: ночь чуть светлее (Luminance at night = 1.5), остальное как в ванилле. Модов: 116. 20260621 — +Azumatt-ProfitablePieces (полный возврат ресурсов при сносе), +castix-FloatingItems (все предметы плавают). LazyVikings: радиус автосклада улья 5→10. Модов: 115. 20260621 — добавлен Azumatt-TextToSpeech (клиентский): озвучка сообщений чата (Piper). Читаются только чужие сообщения, стандартный голос. Модов в сборке: 113. BROHEIM Valheim Modpack — changelog [20260620] - Сборка из 113 модов (BepInEx 5.4.2202). - Установщик: автопоиск Valheim через Steam, чистая/обновляющая установка, ярлыки Vanilla/Modded. - Из клиентского пака исключены серверные секреты (DiscordBot webhooks/token) и per-player данные. - Ключевые настройки: расширенный инвентарь, телепорт без ограничений (руда/телеги/союзники), ItemDrawers до 100000, чат всегда виден (ник красный / сообщение зелёное), кастомные экраны загрузки BROHEIM. === 1.5.7 === - BROHEIM-DrawerAuto v1.3.0: WardIsLove патч улучшен — MoveNext корутины UpdateDamage полностью заблокирован, AddStaggerDamage больше не вызывается ни при каких условиях === 1.6.0 === - УДАЛЁН WardIsLove (постоянные краши) - ДОБАВЛЕН BetterWards 1.9.5 (стабильная альтернатива) - BROHEIM-DrawerAuto v1.5.0: убраны все патчи WardIsLove - Клиент: автоматически удалит папку WardIsLove при обновлении === 2.7.4 === - ВОССТАНОВЛЕН BROHEIM-DrawerAuto v1.7.0 (сервер+клиент): ресурсные станции снова автоматически забирают топливо/ингредиенты из соседних ItemDrawers (радиус 16 м) и складывают готовый продукт обратно (печи/кухни/камины/бродильни/ульи/смолокурни). В v2.7.0 плагин был случайно потерян — теперь возвращён. - broheim-ru-seaanimals 0.3.6.ru4: переведено Морское седло (Maritime Saddle) — имя + описание (для верховой езды на косатке/дельфине/крокодиле/белой акуле). === 2.7.5 === - WackysDatabase: переведены 16 статус-эффектов (Status_m_name — английские литералы, не токены): Electromancer Feather Fall → «Медленное падение электромантика», Bandage/Bandage+/Suture Kit → «Бинт»/«Бинт+»/«Хирургический набор», Recovery ×2 → «Восстановление», Tail Wind → «Попутный ветер», Noise → «Шумоподавление», Angler ×3 (рыбные джерки) → «Рыбак», Seeker → «Ищейка», Lox → «Локс», BlackMetal/Silver/Dvergr Belt → «Пояс из чёрного металла»/«Серебряный пояс»/«Пояс дворфов». Кэш .se очищен для перечитывания. Имена попадают в клиентский модпак через config-копию. === 2.7.6 === - ДОБАВЛЕН blacks7ar-CookingAdditions v1.3.1: 23 новых блюда (варёное яйцо, куриный/рыбный/мясной/ овощной/томатный супы, острое мясное ассорти/«Суприм»/мясо змея, сладко-острая рыба), 3 кулинарные станции (кухонный котёл, гриль, большой мясной гриль), 2 переработки (дробилка, сушильная стойка), добыча соли (залежи у берега) + каменная соль, томаты и перец чили (дикие + семена + ростки), механика curing — засолка мяса/яиц + вяление на сушильной стойке на солнце (2 игровых дня). Тот же автор что Fermenting/BowPlugin → полная совместимость. ServerSync. - ДОБАВЛЕН broheim-ru-cookingadditions v1.3.1.ru1: ПОЛНЫЙ русский перевод (90 ключей) — все блюда, станции, ингредиенты, солёное/вяленое мясо (асксвин/кабан/жук/курица/олень/рыба/заяц/волк) и яйца (асксвин/курица/стервятник), полуфабрикаты, UI сушилки. Через нативный CookingAdditions.Russian.yml (JLocalizationManager, сканирует BepInEx/plugins/*.yml). === 2.7.7 === - ДОБАВЛЕН OdinPlus-OdinCampsite v1.6.3: кемпинговые постройки — спальный мешок (rae_SleepingBag), малый костёр (rae_Campsite_MiniPit), малая палатка (rae_Campsite), большая палатка (rae_CampsiteBig). Строятся без верстака. Кемпинговые припасы (rae_CampsiteResources) — кастомный материал. ServerSync. - ДОБАВЛЕН BROHEIM-CampsiteTweaks v1.0.0: твикер рецептов (т.к. в OdinCampsite рецепты хардкод в DLL, конфигом не настраиваются). Применены требования: * rae_CampsiteResources (припасы) = оленья шкура x1 + древесина x2 + уголь x1 + камень x1 * rae_Campsite (малая палатка) = припасы x1 * rae_CampsiteBig (большая палатка) = припасы x2 (было x3) - ДОБАВЛЕН broheim-ru-odincampsite v1.6.3.ru1: ПОЛНЫЙ русский перевод OdinCampsite (10 ключей) — кемпинговые припасы, малый костёр, спальный мешок, малая/большая палатки + описания. Через нативный OdinCampsite.Russian.yml (JLocalizationManager). === 2.7.8 === - ДОБАВЛЕН OdinPlus-OdinCampsite v1.6.3: кемпинговые постройки — спальный мешок (rae_SleepingBag), малый костёр (rae_Campsite_MiniPit), малая палатка (rae_Campsite), большая палатка (rae_CampsiteBig). Строятся без верстака. Кемпинговые припасы (rae_CampsiteResources) — кастомный материал. Рецепты по умолчанию (хардкод мода, не настраиваются конфигом): * rae_CampsiteResources = оленья шкура x8 + древесина x8 * rae_Campsite (малая палатка) = припасы x1 * rae_CampsiteBig (большая палатка) = припасы x3 * rae_SleepingBag = припасы x1 * rae_Campsite_MiniPit (костёр) = камень x2 + древесина x3 - ДОБАВЛЕН broheim-ru-odincampsite v1.6.3.ru1: ПОЛНЫЙ русский перевод OdinCampsite (10 ключей) — кемпинговые припасы, малый костёр, спальный мешок, малая/большая палатки + описания. Через нативный OdinCampsite.Russian.yml (JLocalizationManager). === 2.7.9 === - ВОЗВРАЩЁН BROHEIM-CampsiteTweaks v1.2.0 (корутина, применяется после загрузки ObjectDB/ZNetScene): твик рецептов OdinCampsite (рецепты хардкод в DLL, конфигом не настраиваются): * rae_CampsiteResources (припасы) = оленья шкура x1 + древесина x2 (было шкура x8 + древесина x8) * rae_CampsiteBig (большая палатка) = припасы x2 (было x3) * rae_Campsite (малая палатка) = припасы x1 (без изменений) === 2.7.10 === - ДОБАВЛЕН Azumatt-AllTheBases v1.0.11: редактирование базовых значений игры (ServerSync). Настроено: Base Carry Weight = 1000 (было 300) — базовая грузоподъёмность игрока. Остальные значения по умолчанию (Base HP 25, Stamina 50, Eitr 0, Megingjord +150, радиусы стройки/взаимодействия/автоподбора). Тот же автор что AzuEPI/AzuCraftyBoxes. 20260713a — v2.11.6 | ФИКС Silero TTS — НЕВЕРНЫЙ МАППИНГ RU SPEAKER. При Silero Speaker = aidar звучал ЖЕНСКИЙ голос (baya). Причина: RuSpeakerToId был захардкожен как aidar=1, baya=2, kseniya=0, xenia=3, eugene=4 — но фактический порядок model.speakers в Silero v4_ru = ['aidar','baya','kseniya','xenia','eugene','random'], т.е. aidar=0, baya=1, kseniya=2, xenia=3, eugene=4. aidar→1 давал ID 1 = baya (женский). xenia=3 и eugene=4 были верны, aidar/baya/kseniya перепутаны. Фикс: маппинг приведён к фактическому порядку модели (aidar=0, baya=1, kseniya=2, xenia=3, eugene=4). EN/DE корректны — их speaker→id берётся из model.speakers через preprocess.dat. Broheim-TextToSpeech 2.1.3 → 2.1.5 (2.1.4 = public-release cleanup: default Engine=Silero, success-логи на Debug). updateType=patch — обновить клиент, проверить: aidar теперь мужской. 20260713b — v2.11.7 | Настройка TTS по запросу: 1) ЖЕНСКИЙ ГОЛОС — Silero Speaker = kseniya (был aidar мужской; kseniya отличается от прежней xenia). Доступные женские RU: kseniya, baya, xenia. 2) ВОРОН — Speak Rune Messages = On (был Off, поэтому Huginn не озвучивался). 3) СУЩЕСТВА/NPC — Speak NPC Messages = On (был Off). Skip Self In Chat оставлен Off (тест-режим, пользователь слышит свои сообщения). updateType=patch — обновить клиент, проверить: другой женский голос, озвучку ворона при спавне/туториале, озвучку NPC-диалогов (Хальдор и т.д.). 20260713c — v2.11.8 | Уборка мусора: 1) УДАЛЁН JewelHeim-Road_To_Muspelheim_and_Niflheim (он же "JewelHeim Content Bundle" / BROHEIM_Content_Bundle v5.0.0) — manifest-only стаб БЕЗ DLL, не содержал собственного контента (реальный контент дают моды Therzie и WackysDatabase). Бесполезная заглушка-манифест. 2) УДАЛЁН мёртвый staging-архив BepInEx/config/_RTMN Files/ — конфиги drop_that/spawn_that/custom_raids/ThisGoesHouse лежали в нестандартном пути и НЕ подгружались (активные моды читают верхний уровень config/, там этих файлов не было). Удаление не меняет текущее поведение. 3) СОХРАНЁН RTMN-контент WackysDatabase (config/wackysDatabase/{Items,Pieces,Recipes}/RTMN_*) — это реальные предметы/куски/рецепты, которые WackysDatabase подгружает. build_data.py почищен от упоминаний стаба. updateType=patch — пересобран клиентский модпак, перезапущен сервер. 20260713d — v2.11.9 | ItemDrawers авто-подбор с земли вместо DrawerAuto: 1) Подтверждено — AzuAutoStore (Chests Pickup From Ground = On, уже включено) + встроенная drawer-интеграция kg_ItemDrawers уже подбирают с земли в ItemDrawers (кладут в ящик только его тип предмета). Работает для выхода станций, падающего на землю (печь/домна/обжиговая). 2) УВЕЛИЧЕНА дистанция: kg.ItemDrawers DrawerPickupRange 16→20, AzuAutoStore Fallback Range 10→20. 3) DrawerAuto ОТКЛЮЧЕН (broheim.DrawerAuto.cfg Enabled=false) — его auto-deposit станции→drawer (кухня/улей/смолокольня/ферментер, чей выход НЕ падает на землю) временно не нужен; при необходимости можно вернуть Enabled=true. ПРЕДУПРЕЖДЕНИЕ: авто-депозит готовой еды/мёда/смолы/браги в drawer'ы теперь НЕ работает (AzuAutoStore берёт только с земли/инвентаря, эти станции держат продукцию внутри). ZRpcFix ранее удалён. updateType=patch — перезапущен сервер, пересобран модпак. 20260713e — v2.11.10 | Broheim-TextToSpeech 2.1.5 → 2.1.6 (bump «для порядка», без изменения кода — те же фиксы: маппинг RU speaker-ов aidar=0, числа→слова, латиница→кириллица, BuildWav, multi-lang Silero, default Engine=Silero). GitHub-репо https://github.com/alexkuryshko/Broheim-TextToSpeech почищен (убран co-author cursoragent из Contributors). updateType=patch — пересобран модпак с DLL 2.1.6. 20260713f — v2.11.11 | ЗАМЕНА TTS на независимый мод Broheim-SileroTTS v1.0.0. Ранее стоял Broheim-TextToSpeech (форк Azumatt.TextToSpeech) — автор оригинала (Azumatt) указал на неавторизованный реверс-инжиниринг его закрытого кода, Thunderstore отклонил все версии 2.1.5+. Полностью переписан с нуля как самостоятельный мод (новый GUID Broheim.SileroTTS, БЕЗ кода Azumatt: убраны Piper-бэкенд, VoiceCatalog/voices.json, NPC-голоса, миграция Azumatt.cfg, config-watcher, брендинг «fork»). Оставлено только своё: Silero-движок (TorchSharp/libtorch), RU-акцентор, препроцессор EN/DE, и новые Harmony-хуки на те же методы Valheim (чат/руны/ворон/NPC/центр/сны), написанные своим кодом. Новый конфиг-layout [Voice] Language/Speaker + [Triggers] Narrate* (вместо Speak X Messages). Тестовые настройки: Language=Russian, Speaker=kseniya, NarrateChat/Center/Runes/Npc=On, SkipOwnChat=Off (слышно свои сообщения для проверки), AnnounceSpeaker=Off. Добавлены отладочные LogDebug по всему конвейеру (hook→Narrate→Synthesize→ToClip→Play). Старый плагин и cfg добавлены в removals (лаунчер почистит у клиентов). updateType=patch — обновить клиент через лаунчер, зайти в игру, проверить озвучку чата/ворона/NPC, при сбое прислать LogOutput.log (видны отладочные строки этапов). 20260713g — v2.11.12 | Broheim-SileroTTS 1.0.0 → 1.1.0: RU-модель переведена на Silero v5_4_ru. Что сделано: 1) АКЦЕНТОР v5 — полностью переписан на C# порт Silero v5 AccentorNgram (нативно-кириллический n-gram + MLP-классификаторы stress/ё, 16969 исключений). Верифицирован 1:1 против оригинального v5 TorchScript-акцентора (19/19 тестов). BERT-гомографы v5 (HomoSolver, 1924 слова) НЕ бандлятся — гомографы используют n-gram-предсказание (держит пакет Python/BERT-свободным). 2) ГОЛОСА v5_4_ru — 4 голоса: kseniya(по умолчанию)/aidar/baya/xenia; eugene (нет в v5_4_ru) → fallback xenia. 3) МОДЕЛЬ — собран новый tts_runner.pt (TorchScript-обёртка v5_4_ru forward), silero_accentor_v5.dat (веса+данные акцентора). Старый silero_accentor.dat добавлен в removals (лаунчер почистит). 4) ЛИЦЕНЗИИ — README+LICENSE: Silero CC BY-NC-SA 4.0 (некоммерческая), libtorch BSD-3, TorchSharp/.NET MIT. Атрибуция Azumatt (идея озвучки) оставлена вверху README. Дельта vs полный v5: только 1924 гомографа — n-gram вместо BERT-дизамбигуации. updateType=patch — обновить клиент через лаунчер, зайти, проверить озвучку чата (RU/kseniya). Если звук есть — залить BroheimSileroTTS-1.1.0.zip на Thunderstore и запушить GitHub. 20260713h — v2.11.13 | TTS v1.1.0 → 1.2.0 + DrawerAuto вернулся + перевод AzuCraftyBoxes hover. 1) TTS: лучший мужской голос — Speaker по умолчанию aidar (единственный мужской в v5_4_ru; baya/kseniya/xenia женские). 2) TTS: НОВЫЕ настройки тональности в [Voice]: Pitch (0.5–2.0, <1 = грубее/ниже, >1 = выше) и Speed (0.5–2.0, <1 = медленнее, >1 = быстрее). Применяются масштабированием pitch_coefs/durs_rate при синтезе — БЕЗ пересборки .pt. Для грубого мужского: aidar + Pitch≈0.85. 3) DrawerAuto ВЕРНУТЬ — broheim.DrawerAuto.cfg Enabled=true (Radius=16, FeedFromDrawers=true, DepositToDrawers=true). Авто-депозит готовой еды/мёда/смолы/браги из кухонных станций/ульев/смолокулен в подходящие drawer'ы снова работает (AzuAutoStore этого не делал — он берёт только с земли). 4) ПЕРЕВОД AzuCraftyBoxes hover: найден хардкод-английский в OverrideHoverText*/HoverTextPatch/SE_ContainerPull («from Inventory & Nearby Containers», «in nearby containers», «Prevents pulling from nearby containers & backpacks»). Добавлен fragments.tsv в broheim-ru-craftyboxes (ru1→ru2) — строки идут через Localization.Localize() -> ApplyFragments (подстрока). GitHub + Thunderstore zip обновлены до 1.2.0. updateType=patch — обновить клиент через лаунчер, зайти, проверить: мужской голос aidar, tooltip углевыжигательной печи теперь по-русски, авто-депозит в drawer'ы. 20260713i — v2.11.14 | TTS v1.2.0 → 1.2.1: настройка громкости речи. Новый [Voice] Volume (0.0–3.0, по умолч. 1.0). >1 = громче (1.5 заметно громче, 2.0 очень громко, с хард-клипом против искажений), <1 = тише. Применяется на уровне PCM-семплов — работает и для 2D-озвучки (чат/ворон/центр), и для пространственного NPC. Независимо от общей громкости игры. GitHub + Thunderstore zip обновлены до 1.2.1. updateType=patch — обновить клиент, в cfg поставить Volume=1.5 (или 2.0) для громкости. 20260713j — v2.11.15 | TTS cfg: Pitch 1→0.8 (грубее/ниже мужской aidar), Volume 1→2 (громче на 1 выше дефолта, с хард-клипом). Speaker=aidar, Speed=1. Применяется на лету. updateType=patch — обновить клиент, проверить грубость/громкость. 20260713k — v2.11.16 | TTS v1.2.1 → 1.3.0: 1) ANTI-OVERLAP — [Voice] OverlapMode (Queue/Interrupt/Overlap, по умолч. Queue). Озвучка теперь идёт через сериальную очередь: ворон больше не накладывается на текст чата, фразы звучат по очереди. Interrupt = новая фраза обрывает текущую. Overlap = смешивать. 2) ГРОМКОСТЬ ПО КАНАЛАМ — новая секция [Channel Volume]: ChatVolume/CenterVolume/RunesVolume/NpcVolume/DreamsVolume (0–3, множитель поверх [Voice] Volume). 3) ПРОГЛАТЫВАНИЕ ПЕРВЫХ БУКВ — починено: [Voice] PreRollMs (по умолч. 120) добавляет лид-сайленс в начало, чтобы аудио-источник не съедал первый буфер при старте. + [Voice] TrimTrailingSilence (по умолч. true) обрезает хвостовую тишину модели — озвучка стала резче. cfg: Pitch=0.8, Volume=2, OverlapMode=Queue, PreRollMs=120, TrimTrailingSilence=true, все ChannelVolume=1. GitHub + Thunderstore zip → 1.3.0. updateType=patch — обновить клиент, проверить: 1) ворон не накладывается, 2) первые буквы не проглатываются, 3) громкость по каналам. 20260713l — v2.11.17 | TTS cfg: RunesVolume 1→2 (голос ворона на 1 выше дефолта, поверх [Voice] Volume=2). updateType=patch — обновить клиент. 20260719a — v2.11.27 | 1) AzuAutoStore: Must Have Existing Item To Pull = Off → On. Теперь сундуки принимают с земли/от станций только те предметы, что УЖЕ лежат внутри. Цель: уголь из углевыжигательной печи идёт в подходящий ItemDrawer (где уже есть уголь), а не в ближайший пустой сундук. Внимание: пустые сундуки больше НЕ принимают всё подряд — кладите в них образец нужного предмета. 2) TTS v1.3.0 → 1.3.1: PEAK-НОРМАЛИЗАЦИЯ в WavPlayer — тихий сигнал Silero (длинный русский текст ворона часто выдаёт пик ~0.1) теперь подтягивается к полному масштабу ДО применения громкости. Раньше множитель громкости только клиппал пики, а тело фразы оставалось тихим — ворон был тихим независимо от RunesVolume. Теперь ворон (и все каналы) реально громче. 3) TTS cfg: ВСЕ каналы = 2 (Chat/Center/Runes/Npc/Dreams), master Volume=2. 4) TTS: LoreTextHook переведён на Info-лог — следующий LogOutput.log покажет, срабатывает ли озвучка ворона (style=2) и какой peak/нормализация. updateType=patch — обновить клиент через лаунчер, зайти, проверить: уголь → drawer, ворон громче. Прислать LogOutput.log (видны строки LoreTextHook/WavPlayer.ToClip). 20260719b — v2.11.28 | TTS v1.3.1 → 1.3.2: ПОЧИНЕН СЛИТНЫЙ ВОРОН + чанкование. Раньше весь текст (заголовок + тело + все абзацы) шёл одним forward-вызовом Silero — заголовок «Ворон» читался слитно с телом, абзацы склеивались, длинная фраза монотонно затихала. Что сделано: 1) РАЗБИЕНИЕ НА ПРЕДЛОЖЕНИЯ — текст дробится по . ! ? ; и переводам строк, каждый кусок синтезируется отдельно, PCM склеивается с паузой 150мс между кусками. Естественные паузы после заголовка и между абзацами; короткие utterance дают стабильную просодию/громкость. 2) РАЗДЕЛИТЕЛЬ ЗАГОЛОВОК↔ТЕЛО — LineJoin.Join: если заголовок не заканчивается знаком препинания, добавляется точка → заголовок становится отдельным чанком с паузой после. Применено к ворону (TextViewer) и NPC-диалогу. 3) ОГРАНИЧЕНИЕ ДЛИНЫ чанка 200 символов (долгие предложения дополнительно режутся по запятым/словам). Конфиг не менялся. updateType=patch — обновить клиент через лаунчер, зайти, проверить: ворон читает «Ворон» [пауза] тело, абзацы разделены. Прислать LogOutput.log (видны строки Silero [...]: chunks=N/M). 20260719c — v2.11.29 | TTS v1.3.2 → 1.3.3: РУНЫ СЛИШКОМ ГРОМКО + мягкий клиппинг. После нормализации (v1.3.1) сигнал стал полного масштаба, а master(2)×channel(2)=4 вызывал жёсткий клиппинг → резкий «слишком громкий» звук. Что сделано: 1) МЯГКИЙ КЛИППИНГ (tanh) вместо жёсткого — высокий gain теперь мягко сжимает, а не искажает; нормализация до 0.74 даёт плавную кривую: vol=1 → умеренно, vol=2 → громко, vol=4 → максимум без хрипа. 2) ОТДЕЛЬНЫЙ КАНАЛ ДЛЯ РУН — новый RuneStonesVolume (рунные камни, style=0), отдельно от RunesVolume (ворон/intro, style=1/2). Теперь руны можно сделать тише ворона. 3) cfg: master Volume 2→1 (после нормализации мастер больше не нужен высокий), RunesVolume=2 (ворон громко), RuneStonesVolume=1 (руны умеренно), остальные каналы=2. updateType=patch — обновить клиент через лаунчер, зайти, проверить: руны комфортно, ворон громко. Прислать LogOutput.log (видны LoreTextHook: style=Rune, ch=RuneStones). === v2.17.11 (2026-07-23) === OneMap / PinFix: • Удалены метки Рунных камней с карты (RunestonePinCleaner в pinfix v1.4.6). "Runestone" уже убран из TrackedDiscovery/TrackedRadar — теперь и существующие постоянные метки удаляются при старте сервера. • Иконки модовых минибоссов (Therzie Monstrum): добавлены ванильные трофеи как fallback-иконки (TrophySkeleton, TrophyFenring, TrophyBat), т.к. трофеи Therzie отсутствуют в ObjectDB. Локализация (BROHEIM-RU _fragments.tsv): • "Вегвизир Pin" → "Вегвизир Метка" (m_hoverName префаба Vegvisir — литерал "Pin"). • "Ancient bowl" → "Древняя чаша" (m_name префаба OfferingBowl — литерал без $-токена). • "Burn item" → "Сжечь предмет" (m_useItemText префаба OfferingBowl — литерал). • Добавлены варианты для других алтарей боссов: "Withered bones", "Dragon egg", "Ymir flesh" (на случай литералов в префабах). v2.24.20 - ItemDrawers: Заменена reflection-сериализация (ItemData.Save/Load) на ручную. Причина: AccessTools.Method не находил методы в runtime-сборке, сериализация возвращала пустой массив, предмет удалялся из инвентаря, но сервер отклонял пустой RPC — предмет бесследно исчезал. - ItemDrawers: Предмет теперь удаляется из инвентаря ТОЛЬКО после успешной сериализации. При ошибке предмет остаётся в инвентаре. - ItemDrawers: Добавлено диагностическое логирование на сервере (RPC_AddEnchanted). - ItemDrawers: Null-проверки в SerializeNamedItemList и DropEnchantedItem. v2.24.21 - FIX: В модпаке v2.24.20 в папке client_extras находился СТАРЫЙ DLL ItemDrawers (reflection-сериализация), который перезаписывал новый DLL из сервера при сборке. Теперь client_extras содержит правильный DLL с ручной сериализацией. Это была причина, по которой предметы продолжали исчезать. v2.24.22 - FIX: ZPackage.Write(byte[]) уже пишет длину внутри. В SerializeNamedItemList длина записывалась дважды → десериализация списка зачарованных предметов была повреждена, предметы терялись при чтении из ZDO. - FIX: client_extras теперь содержит правильный DLL (проверено побайтово). v2.24.23 - CRITICAL FIX ItemDrawers: EnchantedData хранился как ZDO byte[] — null ронял BinarySearchDictionary.SetValue (null.Equals) и ZDO.Serialize (ZPackage.Write(null)). Теперь base64-строка EnchantedB64. - Очистка legacy null byte[] через Remove (не Set). - Harmony-guard на ZPackage.Write(byte[]): null → empty. v2.24.24 - ItemDrawers: Счётчик на ящике теперь показывает TotalCount (ваниль + зачарованные). Раньше UpdateIcon передавал только Amount=0 для зачарованных → цифра была неверной. - QuickStack: зачарованные предметы кладутся через AddEnchanted RPC (с сохранением эффектов). - QuickStack/Restock/API/BuildBridge/StationAuto видят полный запас (Amount + EnchantedB64). - Пустые ящики тоже принимают QuickStack. v2.24.25 - ItemDrawers 1.0.3: счётчик через ZDO int Total + EncCount (не зависит от base64). - В логе клиента должно быть: "BROHEIM ItemDrawers BROHEIM_ID_1_0_3 loaded". - build_modpack: убраны дубликаты файлов (server побеждает client_extras). - Лаунчер: проверка метки DLL после установки; если метки нет — не пишет версию. v2.24.26 - ItemDrawers 1.0.4: Счётчики — QuickStack/StationAuto/BuildBridge больше НЕ делают ClaimOwnership и не пишут Amount на клиенте (это ломало цифры на выделенном сервере). Все операции через owner RPC; UpdateIcon показывает число от владельца. - ОТКЛЮЧЕНО автоскладывание QuickStack в пустые ящики. v2.24.27 - ItemDrawers 1.0.5: Руда/стакаемое ВСЕГДА идёт в обычный Amount (не в enchanted). Чинится назначение руды на ящик. Ghost Prefab при 0 запасе сбрасывается. Fallback имени префаба если m_dropPrefab=null. DepositLogs включены. - StationAuto FeedFromDrawers выключен (плавильни больше не выгребают руду). v2.24.28 - ItemDrawers 1.0.6: ВКЛЮЧЕНА автоподача для плавилен/печей/станций. Берёт только из ящиков с совпадающим префабом (НЕ из пустых). - Убран ClaimOwnership из Repeat (автоподбор) и DrawerRangeFixer — это рассинхронизировало счётчики на выделенном сервере. - StationAuto.Take теперь пишет UpdateIcon через RPC (не BroadcastIcon). v2.24.29 - ItemDrawers 1.0.7: Значок предмета на ящике теперь ОСТАЁТСЯ когда счётчик доходит до 0 (ящик "зарезервирован" под этот предмет). Раньше значок пропадал и ящик выглядел неназначенным. - Убран клиентский ghost-clearing из UseItem — серверный RPC_AddItem авторитетно обрабатывает переназначение, клиент не мутирует ZDO. - При пустом ящике (0) можно назначить ЛЮБОЙ новый предмет. v2.24.30 - ItemDrawers 1.0.8: Подробное логирование зачарованных предметов на каждом шаге (депозит, изъятие, сериализация, десериализация, копирование customData). - Убран ItemDrop.Save() из InstantiateEnchantedItem — мог сбрасывать customData. - Добавлен прогрев кэша EpicLoot через GetMagicItem() после установки customData. - Принудительный захват владения ZDO сервером для всех ящиков. v2.24.31 - ItemDrawers 1.0.9: Исправлена потеря магических свойств EpicLoot при изъятии из ящика. Причина: Object.Instantiate создавал пустой кэш ItemInfo до присвоения m_customData. Теперь вызывается Data().LoadAll() для принудительного построения MagicItemComponent из новых ключей m_customData. v2.24.32 - ItemDrawers 1.1.0: ИСПРАВЛЕНА потеря магических свойств EpicLoot! Причина: метод Data() находится в классе EpicLoot.Data.ItemExtensions, а НЕ EpicLoot.ItemDataExtensions (как предполагалось ранее). Теперь правильный класс используется для прогрева кэша.