Прозрачность у торговцев управляла только бородой. Причина была напечатана
зондом ещё при первом заходе: у шейдера тела (Game/Character) нет НИ цвета с
альфой, НИ режима смешивания - оба рычага ApplyTransparency существуют только
у шейдера волос (Game/Autodesk). Никакое значение альфы тело бы не тронуло.
Сначала добавлен третий рычаг - _Fade, собственный рычаг игры:
EntityModel.SetFade пишет ровно это свойство и отбирает материалы проверкой
HasProperty("_Fade") && shader.name.Contains("Game/Character"), а стоящий рядом
SetVisible(renderFade > 0.01f) закрывает направление: 1 = сплошной, 0 = исчез.
В игре выяснилось, что шейдер реализует его screen-door дизерингом - "тело
гаснет, но идёт мелкой сеточкой". Рычаг рабочий, но пиксели не смешиваются, а
выбрасываются, и никакое число этого не исправит. Оставлен как режим dither.
РАБОЧЕЕ РЕШЕНИЕ - перешивка тела на шейдер волос, у которого есть прозрачный
проход. Доказательство лежало на той же модели в том же кадре: борода всё это
время гасла плавно. Шейдер берётся С МОДЕЛИ - первый материал, умеющий
смешивать (есть цвет с альфой И режим смешивания); Shader.Find оставлен
запасным путём, потому что мод уже дважды получал null/негатив от семейства
Unlit. Решение принимается по способностям материала, имя шейдера нигде не
зашито. Переносятся только альбедо и нормаль: _RMOE - упакованная
roughness/metallic/occlusion/emission, а _MetallicGlossMap ждёт металл в R и
гладкость в A, каналы не совпадают, и связывание "на авось" даёт мокрый пластик
или негатив. Цена названа прямо: тело теряет собственную световую модель
шейдера персонажа и получает стандартную.
МАТОВОСТЬ по просьбе пользователя - три рычага, ломаются по-разному:
_Glossiness в 0 (чистая математика шейдера, работает всегда - несущая
половина); _SpecularHighlights и _GlossyReflections в 0 ВМЕСТЕ с ключевыми
словами _SPECULARHIGHLIGHTS_OFF / _GLOSSYREFLECTIONS_OFF, потому что это
[ToggleOff]-пара и запись одного флоата не делает ничего; карты глянца
очищаются, если непусты, - карта побеждает флоат. Оба keyword'а -
shader_feature, Unity вырезает такие на сборке, если их не выставляет ни один
материал игры, поэтому шершавость сделана основным рычагом, а не запасным.
Применяется ко всем призрачным материалам: волосы нарисованы тем же шейдером и
сохраняли свой блеск, а матовое тело под глянцевой бородой читалось бы хуже.
КОНСОЛЬНАЯ КОМАНДА necroghost (алиас necrotrader): проценты прозрачности,
blend/dither, reset. Балансировать рендер можно только глядя на него, а шаг без
команды стоил пересборки, перезапуска и ~4 минут пешком до торговца. Проценты,
а не альфа: это единица, в которой просьба формулировалась, и они идут в разные
стороны. Регистрации нет и не требуется - SdtdConsole.RegisterCommands ищет
через ReflectionHelpers.FindTypesImplementingBase, который обходит
ModManager.GetLoadedAssemblies(), а LoadMods() стоит на три строки раньше
RegisterCommands(). IsExecuteOnClient = true: команда меняет пиксели.
Две мины, обе реальные. Повторное применение не должно умножать: материалы
кэшируются, и sharedMaterials после первого прохода возвращает наши же клоны,
так что наивный повторный свип дал бы 0.9, потом 0.8 = 0.72; запоминается
базовое значение, живое всегда base * GhostAlpha. Запятая: StringParsers не
зависит от локали, но читает "," как разделитель ТЫСЯЧ, и "necroghost 12,5"
молча стало бы 125 - запятая заменяется на точку до парсинга.
DefaultGhostAlpha 0.9 -> 0.3: 70% прозрачности, найденные в игре. Путь был
1% -> 10% -> 70%, и последний скачок не смена вкуса - на 10% тело ещё
дизерилось, а дизеринг терпим лишь пока слаб. Поэтому же переписана заметка
"ниже ~0.7 силуэт разваливается": предел принадлежал технике, а не глазу.
---
Ghost traders: the body really blends, matte finish, console command
The transparency only ever reached the beard. The probe had already printed
why: the body's shader (Game/Character) has NEITHER a colour with an alpha NOR
a blend mode - both of ApplyTransparency's levers exist only on the hair's
shader (Game/Autodesk). No value of the alpha was ever going to touch it.
A third lever was added first - _Fade, the game's own: EntityModel.SetFade
writes exactly that property and guards it with HasProperty("_Fade") &&
shader.name.Contains("Game/Character"), and the SetVisible(renderFade > 0.01f)
sitting next to it settles the direction: 1 = solid, 0 = gone. In game the
shader turned out to implement it as screen-door dithering - "the body fades,
but goes to a fine grid". The lever works, but pixels are thrown away rather
than blended, and no number fixes that. It is kept as the dither mode.
WHAT ACTUALLY WORKS is re-shading the body onto the hair's shader, which does
have a transparent pass. The existence proof was on the same model in the same
frame: the beard had been fading smoothly all along. The shader is taken OFF
THE MODEL - the first material that can blend (a colour with an alpha AND a
blend mode); Shader.Find is kept only as a fallback, because this mod has twice
been handed null or a negative by the Unlit family. The decision is made on
what a material can do; no shader name is hard-coded. Only albedo and normal
are carried over: _RMOE is a packed roughness/metallic/occlusion/emission map
while _MetallicGlossMap wants metallic in R and smoothness in A - the channels
do not line up, and wiring them by hope is how a character ends up looking like
wet plastic or a negative. The trade is stated plainly: the body loses the
character shader's own lighting response and gets standard lighting instead.
MATTE, as requested - three levers that fail differently: _Glossiness to 0
(plain shader maths, always works - the load-bearing half); _SpecularHighlights
and _GlossyReflections to 0 TOGETHER WITH the _SPECULARHIGHLIGHTS_OFF /
_GLOSSYREFLECTIONS_OFF keywords, because they are a [ToggleOff] pair and
setting the float alone does nothing; and the gloss maps cleared if anything is
in them, since a map beats the float. Both keywords are shader_feature, which
Unity strips at build time if no material in the game sets them - which is why
roughness is the main lever and not the fallback. Applied to every ghost
material: the hair uses the same shader and kept its own shine, and a matte
body under a glossy beard would have read worse than either.
CONSOLE COMMAND necroghost (alias necrotrader): transparency in percent,
blend/dither, reset. A rendering balance can only be judged by looking at it,
and without the command each step cost a rebuild, a restart and a four-minute
walk to a trader. Percent rather than alpha: percent is the unit the request
was made in, and the two run in opposite directions. No registration is needed
- SdtdConsole.RegisterCommands goes through
ReflectionHelpers.FindTypesImplementingBase, which walks
ModManager.GetLoadedAssemblies(), and LoadMods() runs three lines before
RegisterCommands(). IsExecuteOnClient = true: the command changes pixels.
Two real traps. Re-applying must not compound: materials are cached and
sharedMaterials hands back our own clones after the first pass, so a naive
second sweep would give 0.9, then 0.8 = 0.72; the base value is remembered and
the live one is always base * GhostAlpha. The comma: StringParsers is
culture-independent but reads "," as a THOUSANDS separator, so "necroghost
12,5" would silently have become 125 - the comma is turned into a point first.
DefaultGhostAlpha 0.9 -> 0.3: the 70% transparency settled on in game. The road
was 1% -> 10% -> 70%, and the last jump was not a change of taste - at 10% the
body was still dithering, and a dither is bearable only while it is faint. For
the same reason the old "below ~0.7 the silhouette falls apart" note was
rewritten: that limit belonged to the technique, not to the eye.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XN8J75vnum2qAVrtRUMKf7
Книга некроманта / Necromancer's Tome (NecromancerTome)
Версия 1.0.1 — для 7 Days to Die 3.2. Автор: Alex Cube.
- Страница мода: https://www.alexcube.ru/7-days-to-die-moi-mody/kniga-nekromanta-necromancer-s-tome/
- Nexus Mods: https://www.nexusmods.com/7daystodie/mods/12547
- Репозиторий: https://git.08h.ru/alex/necromants-tome-7d2d-3-2
- YouTube-канал автора: https://www.youtube.com/@alexcube
Мод для 7 Days to Die о пути от обычного выжившего до некроманта — с собственной веткой прогрессии, тёмным оружием, призываемыми существами и сюжетной концовкой.
Завязка
Всё начинается с записки, читая которую персонаж видит неясный флэшбек.
Некромантия в этом моде — ответ на проклятие, а не побочная ветка крафта. Вместо того чтобы однажды пасть перед ордой и присоединиться к ней, игрок учится подчинять мёртвых себе: заражать зомби безумием, стравливать их друг с другом, поднимать против них собственных тварей. Не выживание вопреки смерти, а власть.
Прогрессия
Отдельный скилл "Некромантия" растёт не от опыта, а от счётчика упокоенных зомби — свой счётчик, своя механика. Пять тиров, каждый открывает часть арсенала:
| Тир | Порог | Что открывается |
|---|---|---|
| Адепт | сразу | Камень духов, Нож некроманта, Синий портальный камень, Пирамида духов |
| Адепт (доп.) | 20 зомби | Пространственный браслет |
| Адепт (доп.) | 30 / 60 / 100 / 300 зомби | Моды ножа: Слёзы мертвеца, Пир падальщика, Могильный покой, Тёмное чутьё |
| Подмастерье | 500 зомби | Свиток девиации |
| Подмастерье (доп.) | 1400 / 1700 зомби | Моды ножа: Хватка мертвеца, Мёртвая буря |
| Ученик | 2000 зомби | Призыв зомбособаки, Жуки Властелина, Призыв зомбогрифа |
| Некромант | 3000 зомби | Призыв зомбомедведя, Призыв зомбоволка, Свиток банши |
| Мастер | 5000 зомби | Чёрный портальный камень |
Арсенал
- Камень духов — брошенный камень, светящийся некромантской энергией. Задевает одного зомби: тот переходит на вашу сторону и начинает атаковать других зомби вместо вас.
- Свиток девиации — тот же эффект, но мощнее: при броске переманивает на вашу сторону сразу всех зомби в области взрыва, а не одного. Расходуется при использовании.
- Нож некроманта — почерневший костяной клинок. Урон растёт вместе с навыком Некромантии: почти бесполезен в неопытных руках, смертоносен у прокачанного игрока. Лечит владельца на половину нанесённого урона и метит раненого зомби как Жертву — тот при смерти гарантированно оставляет особый мешок с ингредиентами.
- Шесть модов только для Ножа некроманта — обычные моды для ножей в это оружие не встают, а эти не встают ни во что другое: Слёзы мертвеца (2 воды с каждого убитого клинком зомби), Пир падальщика (2 еды за труп), Могильный покой (защита от перегрева и переохлаждения, пока нож в руках), Хватка мертвеца (раненый клинком зомби замедляется), Мёртвая буря (силовая атака бьёт по площади с кровотечением, за 10 здоровья вместо 5 и двойную выносливость), Тёмное чутьё (все зомби поблизости отмечены на компасе и карте, пока нож в руках).
- Кровь некроманта — ритуальный ресурс: чтобы получить банку, нужны пустая банка, любой нож в руках и 90% текущего здоровья за одну порцию. Ингредиент для самых тёмных рецептов — Чёрного портала и самого Ножа.
- Кожа жертвы и Прах зомби — остаются от зомби, помеченного Ножом некроманта как Жертва. Ингредиенты для книг призыва и большинства некромантских рецептов соответственно.
- Синий портальный камень — держите кнопку использования 10 секунд, чтобы телепортироваться к своему спальному мешку. Прерывается любым уроном или силовой атакой раньше времени. Не расходуется.
- Пространственный браслет — силовая атака открывает личный разлом-хранилище, чей размер растёт вместе с уровнем Некромантии. Обычная атака пока ничего не делает.
- Консервные банки (пустая / с речной водой / с кипячёной) — расходный цикл вместо одноразовых банок: наполняются водой, кипятятся прямо на костре без кастрюли, выпиваются, банка возвращается пустой. Речная вода из банки может вызвать дизентерию, как обычная мутная вода; кипячёная безопасна. Вмещают меньше воды, чем стеклянные банки.
Питомцы
Призывные книги поднимают союзных существ, которые дерутся с зомби, а не с игроком. Питомец не «следует» за игроком в строгом смысле — просто бродит сам по себе, а если отойдёт дальше 32 блоков и в этот момент не занят боем, его телепортирует обратно к владельцу:
- Зомбособака, Зомбомедведь, Зомбоволк, Зомбогриф — постоянные спутники. Можно держать по одному экземпляру каждого вида одновременно; отзываются обратно в книгу силовой атакой.
- Жуки Властелина — разовый свиток, выпускающий рой. Жуки сами разлетаются по широкому радиусу и жалят зомби; ужаленный переходит на вашу сторону, как от Камня духов. Рой нельзя отозвать обратно, активен может быть только один. Расходуется при использовании.
- Свиток банши — одноразовый: при открытии вопит голосом банши и поднимает рядом с игроком небольшую враждебную орду. Это не союзники — эти зомби так же опасны для вас, как любые другие.
Оборона базы
- Пирамида духов — деплоябл-блок, не удержимый предмет. Пока вы стоите в её радиусе, она сама заряжает девиацией любого незаряженного зомби поблизости и поджигает его холодным фиолетовым пламенем, обращая против других зомби вместо вас или вашей базы. В меню блока можно включать/выключать эффект и показывать границу радиуса действия.
Чёрный портал — финал истории
Чёрный портальный камень открывается на вершине прогрессии (5000 зомби) и является концовкой мода. Активация запускает диалог подтверждения, останавливает игру и разворачивает полноэкранную финальную сцену — она досказывает историю, начатую запиской в первый день. Заканчивается сцена выбором из двух вариантов: один закрывает историю и выходит в главное меню, другой возвращает игрока в мир и позволяет играть дальше.
Сюжетные тексты — в Config/Localization.csv, ключи necroFinal*. Здесь они не пересказываются
намеренно: README читают до прохождения.
По мелочи
- Стартовая записка при открытии тоже ставит игру на паузу и проигрывает короткий флэшбек.
- Некоторые декоративные блоки (кровати, кулеры, картонные коробки) можно разобрать удержанием, как верстак.
Локализация
13 языков полностью: русский, английский, немецкий, испанский, французский, итальянский,
японский, корейский, польский, португальский (Бразилия), турецкий, китайский упрощённый и
традиционный. Все 123 ключа Config/Localization.csv заполнены, пустых ячеек нет.
Установка
Распакуйте папку NecromancerTome в <папка игры>/Mods/ (или в %APPDATA%/7DaysToDie/Mods/) и
запустите игру. Мод содержит Harmony-библиотеки, поэтому EAC должен быть выключен.
Рассчитан на одиночную игру: ванильная пауза работает только в сингле, поэтому в мультиплеере сюжетные сцены проиграются без остановки времени.
Статус
Версия 1.0.1 — исправление по первому баг-репорту с Nexus: содержимое Пространственного
браслета больше не пропадает после выхода из игры (хранилище теперь сохраняется в файле
игрока, рядом с рюкзаком). Весь заявленный контент реализован и проходит тесты в игре. Из запланированного не
сделана только часть фирменных звуков. Текст описания для сайта (RU + EN) — в
SITE_DESCRIPTION.html (разметка блоков WordPress). Полная техническая история разработки и текст финала лежат рядом с модом
в BACKLOG.md и FINAL_TEXT.md — в репозиторий они не входят (спойлеры и внутренняя кухня).