From 7768541f12ccfc75e7fba13ae2c7eb97a4919c3b Mon Sep 17 00:00:00 2001 From: AlexCube Date: Mon, 14 Sep 2026 15:05:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=BE=D1=80=D0=B3=D0=BE=D0=B2=D1=86?= =?UTF-8?q?=D1=8B-=D0=BF=D1=80=D0=B8=D0=B7=D1=80=D0=B0=D0=BA=D0=B8:=20?= =?UTF-8?q?=D0=BD=D0=B0=D1=81=D1=82=D0=BE=D1=8F=D1=89=D0=B0=D1=8F=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B7=D1=80=D0=B0=D1=87=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D1=8C=20=D1=82=D0=B5=D0=BB=D0=B0,=20=D0=BC=D0=B0=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=BE=D1=81=D1=82=D1=8C,=20=D0=BA=D0=BE=D0=BD=D1=81?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Прозрачность у торговцев управляла только бородой. Причина была напечатана зондом ещё при первом заходе: у шейдера тела (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 Claude-Session: https://claude.ai/code/session_01XN8J75vnum2qAVrtRUMKf7 --- HarmonySrc/GhostTraderCommand.cs | 174 ++++++++++ HarmonySrc/GhostTraderPatch.cs | 567 ++++++++++++++++++++++++++++--- NecromancerHarmony.dll | Bin 75264 -> 83968 bytes NecromancerHarmony.pdb | Bin 25148 -> 27056 bytes 4 files changed, 696 insertions(+), 45 deletions(-) create mode 100644 HarmonySrc/GhostTraderCommand.cs diff --git a/HarmonySrc/GhostTraderCommand.cs b/HarmonySrc/GhostTraderCommand.cs new file mode 100644 index 0000000..5714664 --- /dev/null +++ b/HarmonySrc/GhostTraderCommand.cs @@ -0,0 +1,174 @@ +using System.Collections.Generic; +using UnityEngine.Scripting; + +namespace NecromancerTome +{ + /// + /// `necroghost [percent|reset]` - turns the traders' transparency live, without a rebuild + /// (user request 2026-09-14, right after the alpha went from 1% to 10%: "Сделай консольную + /// команду на альфу, чтобы крутить в игре"). The number being hunted - "a ghost, not a broken + /// model" - can only be judged by looking at him, and every step of that hunt otherwise costs + /// an edit, a `dotnet build`, a restart and the four-minute walk back to a trader, because + /// traders are streamed in on approach. This collapses the loop to one line in the console. + /// + /// IT TAKES PERCENT OF TRANSPARENCY, NOT ALPHA, and that is deliberate: percent is the unit + /// the request has been made in twice ("буквально 1%", "пусть будет 10%"), while alpha is the + /// unit the renderer wants, and they run in opposite directions - 10% transparent is alpha + /// 0.9. Guessing which one a typed "10" meant would be a coin flip, so the command fixes the + /// unit and prints both back every time. + /// + /// NOTHING IS PERSISTED. The value lives for the session; the one that turns out to be right + /// gets written into GhostTraderPatch.DefaultGhostAlpha, which is the line a release ships. + /// A settings file would just be a second place for the answer to hide. + /// + /// WHY THE GAME FINDS THIS CLASS WITHOUT ANY REGISTRATION. SdtdConsole.RegisterCommands goes + /// through ReflectionHelpers.FindTypesImplementingBase(typeof(IConsoleCommand)), and that + /// walks ModManager.GetLoadedAssemblies() alongside the game's own - so a ConsoleCmdAbstract + /// in a mod DLL is picked up like any vanilla one. Ordering is not a gamble either: + /// GameManager calls ModManager.LoadMods() three lines before RegisterCommands(). + /// + /// IsExecuteOnClient IS true BECAUSE THIS CHANGES PIXELS. On a server the command would + /// otherwise run where there is nothing to look at; the flag makes the server bounce it back + /// to the client that typed it (ConnectionManager.ServerConsoleCommand), which is where the + /// materials and the eyes are. In single player it changes nothing. + /// + [Preserve] + public class ConsoleCmdNecroGhost : ConsoleCmdAbstract + { + public override bool IsExecuteOnClient => true; + + public override bool AllowedInMainMenu => false; + + public override string[] getCommands() + { + return new string[] { "necroghost", "necrotrader" }; + } + + public override string getDescription() + { + return "Necromancer's Tome: how transparent the ghost traders are, in percent."; + } + + public override string getHelp() + { + return "necroghost - show the current value and mode\n" + + "necroghost <0-100> - set transparency in percent (10 = the default, barely there;\n" + + " 30 = clearly a ghost; past ~30 he stops reading as a body)\n" + + "necroghost blend - fade the body by blending (re-shades it; smooth)\n" + + "necroghost dither - fade the body by dithering (the game's own _Fade; grainy)\n" + + "necroghost reset - back to the built-in default value and mode\n" + + "\n" + + "Applies to traders already in the world, immediately - walk up to one first and\n" + + "watch him while you type. Not saved: tell the mod author what you settled on.\n" + + "\n" + + "THE MODES ARE NOT DEGREES OF ONE THING. The body's own shader cannot blend, so the\n" + + "game fades it by throwing pixels away in a pattern - that is the fine grid. Blend\n" + + "re-shades the body onto the hair's shader, which has a transparent pass, at the\n" + + "cost of the character shader's own lighting. The hair fades the same way either\n" + + "way, so it is the body you compare.\n" + + "\n" + + "If he comes apart instead of fading - teeth through the cheek, an arm through the\n" + + "chest - that is not this number, that is depth writing, and no value here will fix it."; + } + + public override void Execute(List _params, CommandSenderInfo _senderInfo) + { + if (_params.Count == 0) + { + Report("Ghost traders"); + return; + } + + string argument = _params[0].Trim(); + if (argument.EqualsCaseInsensitive("reset")) + { + GhostTraderPatch.GhostAlpha = GhostTraderPatch.DefaultGhostAlpha; + SetMode(GhostTraderPatch.BodyOpacityMode.Blend, "Reset"); + return; + } + + if (argument.EqualsCaseInsensitive("blend")) + { + SetMode(GhostTraderPatch.BodyOpacityMode.Blend, "Body mode"); + return; + } + + if (argument.EqualsCaseInsensitive("dither")) + { + SetMode(GhostTraderPatch.BodyOpacityMode.Dither, "Body mode"); + return; + } + + if (!TryParsePercent(argument, out float percent)) + { + SingletonMonoBehaviour.Instance.Output( + "necroghost: '" + argument + "' is neither a percentage nor blend/dither/reset. " + + "Try 'necroghost 10', or 'help necroghost'."); + return; + } + + if (percent < 0f || percent > 100f) + { + SingletonMonoBehaviour.Instance.Output( + "necroghost: " + percent.ToString("0.#") + "% is outside 0-100. 0 = solid, 100 = invisible."); + return; + } + + GhostTraderPatch.GhostAlpha = 1f - percent / 100f; + Report("Set"); + + // Said only when asked for, and only once the value is actually past the point where + // the two failure modes stop looking different - see GhostTraderPatch.GhostAlpha. + if (GhostTraderPatch.GhostAlpha < 0.7f) + { + SingletonMonoBehaviour.Instance.Output( + " (past ~30% the silhouette stops reading as a solid body at all, which looks like " + + "a broken model for a different reason than depth writing does)"); + } + } + + /// Switches how the body is faded and rebuilds the traders already standing, which + /// is the expensive path - the materials have to be built again from the originals, since + /// a re-shaded material cannot be un-re-shaded. Changing only the number never comes here. + /// Saying so out loud matters: this is the one thing in the command that is not free, and + /// flipping modes back and forth while hunting a value is the obvious way to use it. + public static void SetMode(GhostTraderPatch.BodyOpacityMode _mode, string _prefix) + { + bool changed = GhostTraderPatch.BodyMode != _mode; + GhostTraderPatch.BodyMode = _mode; + int rebuilt = changed ? GhostTraderPatch.Reapply() : 0; + Report(_prefix); + if (changed && rebuilt > 0) + { + SingletonMonoBehaviour.Instance.Output( + " (" + rebuilt + " renderer(s) rebuilt from their original materials)"); + } + } + + /// Current value plus what it actually reached, in both units, and which way the + /// body is being faded. The count is the half that answers "did it do anything": 0 + /// materials means no trader has been converted yet - they stream in on approach - not + /// that the number was refused. + public static void Report(string _prefix) + { + float alpha = GhostTraderPatch.GhostAlpha; + int applied = GhostTraderPatch.Retint(); + SingletonMonoBehaviour.Instance.Output( + _prefix + ": " + ((1f - alpha) * 100f).ToString("0.#") + "% transparent (alpha " + + alpha.ToString("0.###") + "), body mode " + GhostTraderPatch.BodyMode + + ", applied to " + applied + " live material(s) across " + + GhostTraderPatch.Ghosted.Count + " trader(s) converted this session."); + } + + /// Percent out of what the user typed. StringParsers is the game's own parser and + /// is culture-independent, which matters here - but it reads ',' as a THOUSANDS separator, + /// so on a keyboard where the decimal key produces a comma "12,5" would silently parse as + /// 125 and the trader would vanish. The comma is turned into a point before it gets there. + /// A trailing '%' is accepted because it is the obvious thing to type. + public static bool TryParsePercent(string _argument, out float _percent) + { + string text = _argument.Replace(',', '.').TrimEnd('%').Trim(); + return StringParsers.TryParseFloat(text, out _percent); + } + } +} diff --git a/HarmonySrc/GhostTraderPatch.cs b/HarmonySrc/GhostTraderPatch.cs index 2b76d53..336b766 100644 --- a/HarmonySrc/GhostTraderPatch.cs +++ b/HarmonySrc/GhostTraderPatch.cs @@ -10,12 +10,13 @@ namespace NecromancerTome /// торговцев убираем совсем"). Fits the mod - the necromancer deals with the dead, and the /// only people still trading are not quite alive. /// - /// TRANSPARENCY WAS DROPPED, THEN ASKED BACK FOR AT A SLIVER. The user first said "убираем - /// совсем", confirmed the result ("торговец стал непрозрачным и полностью чёрно-белым, как и - /// требовалось"), and then asked for "лёгкую прозрачность, буквально 1%" to push him a little - /// further towards a ghost. Dropping it was still the release this effect needed, because it - /// is what allowed the shader to stay put - see below; the 1% is now a separate, optional - /// layer on top (ApplyTransparency) that cannot break the greyscale if the shaders refuse it. + /// TRANSPARENCY WAS DROPPED, THEN ASKED BACK FOR AT A SLIVER, THEN RAISED TO 10%. The user + /// first said "убираем совсем", confirmed the result ("торговец стал непрозрачным и + /// полностью чёрно-белым, как и требовалось"), then asked for "лёгкую прозрачность, + /// буквально 1%", and on 2026-09-14 for 10% - "чтобы он выглядел как призрак, а не как + /// сломанная модель". Dropping it was still the release this effect needed, because it + /// is what allowed the shader to stay put - see below; the alpha is a separate, optional layer + /// on top (ApplyTransparency) that cannot break the greyscale if the shaders refuse it. /// /// The two failed attempts are worth keeping written down, because neither could have been /// predicted from the decompiler and each was settled by one log line: @@ -56,6 +57,10 @@ namespace NecromancerTome /// source texture: these are 4096x4096, and a readback per renderer per sweep would be /// indefensible. /// + /// THE ALPHA IS TURNED FROM THE CONSOLE, not from this file: `necroghost `, in + /// GhostTraderCommand.cs. A rendering balance can only be judged by looking at it, and a + /// rebuild-restart-walk-to-a-trader cycle per step is not a way to look at anything. + /// /// WHY A TICK AND NOT A SPAWN HOOK. Traders are streamed in on approach ("force spawning /// pending entity npcTraderRekt" appeared ~4 minutes after the world loaded), and Jen is built /// at runtime, so her renderers do not all exist when the entity is added to the world. @@ -68,15 +73,125 @@ namespace NecromancerTome /// Seconds between sweeps. public const float SweepInterval = 2f; - /// 1 = solid. 0.99 is the "буквально 1%" the user asked for on 2026-09-13 after - /// seeing the black-and-white traders: a hint of not-quite-there rather than a ghost. - /// Deliberately close to opaque for a second reason too - see ApplyTransparency, which - /// keeps depth writing on precisely because a nearly-solid character can afford to. - public const float GhostAlpha = 0.99f; + /// What a fresh game boots with. 1 = solid; 0.3 is what the hunt actually landed + /// on - the user set 70% transparency in game on 2026-09-14 once the body was blending + /// instead of dithering, and kept it. THE VALUE FOUND IN GAME BELONGS HERE: the console + /// command turns GhostAlpha for the session only and deliberately persists nothing, so a + /// number worth keeping has to be written into this line. + /// + /// The road here was 1% -> 10% -> 70%, and the last jump was not a change of taste: at 10% + /// the body was still being dithered, and a dither is only bearable while it is faint. Once + /// it became real blending, far more of it turned out to look right. + public const float DefaultGhostAlpha = 0.3f; - /// Colour properties that might carry an alpha, best first. + /// The opacity actually in use. THIS IS THE ONE NUMBER TO TURN when hunting the + /// balance between "ghost" and "broken model" - everything else in this file is about + /// making the number mean what it says - and `necroghost <percent>` turns it live + /// (GhostTraderCommand.cs), because every step of that hunt otherwise costs a rebuild, a + /// restart and the four-minute walk to a trader. + /// + /// Which way to turn it is decided by WHICH failure you are looking at, and the two look + /// nothing alike: + /// - reads as a solid person, no ghost at all -> lower it (0.85, 0.8). + /// - the world shows through him but he still reads as one body -> this is the target. + /// - you can see his teeth through his cheek, eyes through eyelids, an arm through the + /// chest -> that is the "broken model", and it is NOT this number's fault. It means + /// depth writing came off somewhere; see _ZWrite in ApplyTransparency. Dropping the + /// alpha further only makes it worse. + /// THE OLD "nothing below ~0.7" NOTE WAS WRONG, and it is worth saying why rather than + /// quietly deleting: it was written while the body was still dithering, where a low value + /// means a coarse pattern and the silhouette falls apart early. With the body blending, + /// 0.3 reads as a ghost and holds together - the limit belonged to the technique, not to + /// the eye. Depth writing is what keeps him one body, and it does not care how low the + /// number goes. + public static float GhostAlpha = DefaultGhostAlpha; + + /// One opacity lever this patch installed on a trader, remembered so the alpha + /// can be turned again WITHOUT rebuilding anything. Keeping the base value is the whole + /// point: the live value is always base * GhostAlpha, never "multiply what is there now by + /// the new number" - that would compound (0.9 then 0.8 would land on 0.72) and the second + /// turn of the dial would lie about where it put you. + /// + /// IsColour says which of the two kinds this is - the alpha channel of a colour, or a + /// plain float - because a trader needs BOTH and they are not interchangeable: the body + /// only has the float (_Fade) and the hair only has the colour (_Color). One material can + /// therefore contribute one entry, and one trader contributes several of both kinds. + public struct GhostMaterial + { + public Material Material; + public string Property; + public bool IsColour; + public float BaseValue; + } + + /// A renderer this patch has taken over, with the materials it had before. The + /// originals are the reason a mode can be switched at all: after the first pass + /// renderer.sharedMaterials hands back OUR clones, so rebuilding from what is currently + /// on the renderer would re-shade an already re-shaded material and there would be no way + /// back to the body's real one. Rebuilding always starts here instead. + public struct GhostRenderer + { + public Renderer Renderer; + public Material[] Originals; + } + + /// Every renderer taken over, in the order it was found. Pruned of destroyed + /// renderers as they are walked; dropped wholesale when the world unloads. + public static readonly List Converted = new List(); + + /// Every material installed on a live trader that has somewhere to put an alpha. + /// Retint walks this instead of redoing the work: re-running the sweep would re-clone the + /// materials and, far worse, hand the 4096x4096 desaturation another readback per trader. + /// Entries go stale when the game destroys the material with its trader - Retint prunes + /// those, and WorldShuttingDown drops the lot. + public static readonly List TintedMaterials = new List(); + + /// Colour properties that might carry an alpha, best first. Confirmed in game: + /// the hair/beard shader "Game/Autodesk" has _Color; the BODY shader "Game/Character" has + /// no colour property at all - see FadeNameHints. public static readonly string[] TintNameHints = { "_Color", "_BaseColor", "_TintColor", "_Tint" }; + /// How the BODY is made see-through. The two are not two settings of one thing, + /// they are two different renderers' worth of behaviour, and only a look in game can pick + /// between them - which is why both stay reachable from the console. + /// + /// Dither is the game's own _Fade, and on 2026-09-14 the user reported what it actually + /// looks like: "тело гаснет, но идёт мелкой сеточкой". That is screen-door transparency - + /// the shader is not blending anything, it is THROWING PIXELS AWAY in a fixed pattern. + /// It is what an opaque-queue character shader can do without a transparent pass, and no + /// value of GhostAlpha turns a dropped pixel into a translucent one. + /// + /// Blend re-shades the body onto the shader the HAIR is already drawn with, which does + /// have a transparent pass. The existence proof is on the same model in the same frame: + /// the beard has been fading smoothly this whole time while the body was dithering. + public enum BodyOpacityMode + { + Dither, + Blend + } + + /// Blend by default: dither has been looked at and rejected. `necroghost blend` + /// and `necroghost dither` switch it live - see GhostTraderCommand.cs. + public static BodyOpacityMode BodyMode = BodyOpacityMode.Blend; + + /// The hair's shader, kept once it is found on a real trader. Taken off the model + /// rather than through Shader.Find so it is the exact shader already proven to work in + /// this scene - name lookups can miss a stripped or renamed shader and hand back null, + /// and the mod has been down that road twice already with the Unlit family. + public static Shader BlendShader; + + /// Normal-map properties, best first. "Game/Character" calls it _Normal, the hair + /// shader wants _BumpMap - the same disagreement the albedo has. + public static readonly string[] NormalNameHints = { "_BumpMap", "_Normal", "_NormalMap", "_NormalTex" }; + + /// Float properties that fade the whole material out, best first. This is the + /// body's only lever and the game's own: EntityModel.SetFade writes exactly "_Fade", and + /// guards it with `material.HasProperty("_Fade") && shader.name.Contains("Game/Character")` + /// - the same shader our traders' bodies are drawn with. EntityAlive.Update drives it from + /// renderFade, and SetVisible(renderFade > 0.01f) right next to it settles the direction + /// beyond doubt: 1 = solid, 0 = gone, exactly like an alpha. + public static readonly string[] FadeNameHints = { "_Fade" }; + /// Entity ids already converted. Cleared when the world unloads. public static readonly HashSet Ghosted = new HashSet(); @@ -109,6 +224,9 @@ namespace NecromancerTome { Ghosted.Clear(); GreyTextures.Clear(); + TintedMaterials.Clear(); + Converted.Clear(); + BlendShader = null; timer = 0f; } @@ -155,7 +273,12 @@ namespace NecromancerTome return false; } + // Before anything is touched, because the body's replacement shader is found on the + // trader's OWN hair and the hair is not guaranteed to come first in this array. + FindBlendShader(renderers); + int converted = 0; + int leversBefore = TintedMaterials.Count; foreach (Renderer renderer in renderers) { if (renderer == null || renderer is ParticleSystemRenderer) @@ -169,26 +292,266 @@ namespace NecromancerTome continue; } - Material[] greys = new Material[sources.Length]; - bool anyChanged = false; - for (int i = 0; i < sources.Length; i++) + Converted.Add(new GhostRenderer { Renderer = renderer, Originals = sources }); + if (Convert(renderer, sources)) { - greys[i] = MakeGreyMaterial(sources[i], ref anyChanged); - } - if (anyChanged) - { - renderer.materials = greys; converted++; } } + // The lever count is the half that answers "will the console command reach him": + // desaturation and opacity come from different properties, and the body had the first + // without the second until 2026-09-14. Fewer levers than converted renderers means + // some part of this trader can only ever be black-and-white, never transparent. Debug.Log("[NecromancerTome] GhostTraderPatch: " + _trader.EntityClass.entityClassName + - " (entity " + _trader.entityId + ") - " + converted + " of " + renderers.Length + " renderer(s) desaturated"); + " (entity " + _trader.entityId + ") - " + converted + " of " + renderers.Length + + " renderer(s) desaturated, " + (TintedMaterials.Count - leversBefore) + " opacity lever(s) installed"); return true; } - /// Clone of the source material - SAME shader, same everything - with only its - /// albedo replaced by a black-and-white copy. + /// Builds and installs this renderer's ghost materials from the ORIGINALS it was + /// handed. True when anything was actually changed - a renderer nothing could be done to + /// keeps the materials it has rather than being handed a half-built array. + public static bool Convert(Renderer _renderer, Material[] _sources) + { + Material[] ghosts = new Material[_sources.Length]; + bool anyChanged = false; + for (int i = 0; i < _sources.Length; i++) + { + ghosts[i] = MakeGreyMaterial(_sources[i], ref anyChanged); + } + if (anyChanged) + { + _renderer.materials = ghosts; + } + return anyChanged; + } + + /// Rebuilds every trader already converted, from their original materials, under + /// whatever BodyMode is set now. This is the expensive path and exists only for the mode + /// switch; changing the alpha alone goes through Retint, which touches no materials at + /// all. Even here the 4096x4096 desaturation is not redone - GreyTextures is keyed by the + /// source texture, and the source is the same original every time. + public static int Reapply() + { + TintedMaterials.Clear(); + int rebuilt = 0; + for (int i = Converted.Count - 1; i >= 0; i--) + { + GhostRenderer entry = Converted[i]; + if (entry.Renderer == null) + { + Converted.RemoveAt(i); + continue; + } + if (Convert(entry.Renderer, entry.Originals)) + { + rebuilt++; + } + } + return rebuilt; + } + + /// Remembers the first shader on this model that can actually blend - it needs + /// both a colour to put an alpha in and a blend mode to honour it. On a trader that is the + /// hair's shader. Falls back to looking the name up only if the model somehow has no such + /// material, and says so either way, because a null here silently disables the whole Blend + /// mode and leaves the body dithering with no explanation. + public static Shader FindBlendShader(Renderer[] _renderers) + { + if (BlendShader != null) + { + return BlendShader; + } + + foreach (Renderer renderer in _renderers) + { + if (renderer == null || renderer is ParticleSystemRenderer) + { + continue; + } + Material[] materials = renderer.sharedMaterials; + if (materials == null) + { + continue; + } + foreach (Material material in materials) + { + if (material == null || material.shader == null || !CanBlendInPlace(material)) + { + continue; + } + BlendShader = material.shader; + Debug.Log("[NecromancerTome] GhostTraderPatch: blend shader taken off the model: '" + + BlendShader.name + "'"); + return BlendShader; + } + } + + BlendShader = Shader.Find("Game/Autodesk"); + Debug.Log("[NecromancerTome] GhostTraderPatch: no blend-capable material on this model; " + + "the shader was looked up by name instead and came back " + + (BlendShader != null ? BlendShader.name : "NULL - the body stays dithered")); + return BlendShader; + } + + /// Whether this material can be made see-through where it stands: somewhere to + /// put an alpha, and a blend mode to make the alpha mean something. The body fails both + /// halves and the hair passes both - which is the whole difference between them, and the + /// reason this is a capability test rather than a check on the shader's name. + public static bool CanBlendInPlace(Material _material) + { + if (!_material.HasProperty("_SrcBlend") || !_material.HasProperty("_DstBlend")) + { + return false; + } + foreach (string hint in TintNameHints) + { + if (_material.HasProperty(hint)) + { + return true; + } + } + return false; + } + + /// + /// The body, re-shaded onto the hair's shader so it can blend the way the hair does, with + /// the black-and-white albedo it would have had anyway. + /// + /// ONLY WHAT IS UNDERSTOOD IS CARRIED OVER - albedo and normal map. The body's third map, + /// _RMOE, is a packed roughness/metallic/occlusion/emission texture, and the destination + /// shader's _MetallicGlossMap expects metallic in R and smoothness in A: the channels do + /// not line up, and wiring them by hope is exactly how a character comes out looking like + /// wet plastic or a negative. It is left empty and the two floats are set by hand instead + /// - no metal, barely any gloss, which is what a dead man in black and white should be. + /// + /// This is a real trade and worth stating plainly: the body loses the character shader's + /// own lighting response and gets standard lighting instead. In exchange it can actually + /// be translucent rather than dithered. If it reads wrong in game, `necroghost dither` is + /// one line away and nothing has to be rebuilt. + /// + public static Material MakeBlendMaterial(Material _source, Texture2D _albedo) + { + Material blend = new Material(BlendShader); + blend.SetTexture("_MainTex", _albedo); + + Texture normal = FindTexture(_source, NormalNameHints); + if (normal != null && blend.HasProperty("_BumpMap")) + { + blend.SetTexture("_BumpMap", normal); + } + MakeMatte(blend); + // Standard's own "Fade" setting. The shader branches on keywords rather than on this + // float, and ApplyTransparency sets those - but a material inspected later with its + // mode still reading "Opaque" is a trap for whoever looks next. + if (blend.HasProperty("_Mode")) + { + blend.SetFloat("_Mode", 2f); + } + + ApplyTransparency(blend); + return blend; + } + + /// + /// Takes the shine off (user request 2026-09-14, once the body was blending properly: + /// "слишком оно бликует, я бы вообще сделал матовым"). Applied to EVERY ghost material, not just the + /// re-shaded body: the hair is drawn by the same shader and was keeping its own shine, and + /// a matte body under a glossy beard would have read worse than either. + /// + /// THREE THINGS, BECAUSE THEY FAIL DIFFERENTLY: + /// + /// - _Glossiness (smoothness) to 0. This one is plain shader maths and always works - + /// the surface becomes maximally rough, and a rough surface has no tight highlight. + /// It is the load-bearing half of this method. + /// - _SpecularHighlights / _GlossyReflections to 0 WITH their keywords. These are the + /// Standard shader's [ToggleOff] pair: the float is only what the inspector shows, the + /// shader branches on _SPECULARHIGHLIGHTS_OFF / _GLOSSYREFLECTIONS_OFF, so setting the + /// float alone does nothing at all. They kill the direct highlight and the reflection + /// probe contribution outright. + /// - The gloss MAPS, cleared if anything is in them. A map wins over the float: leave + /// one in place and _Glossiness is ignored, which is the silent way for all of this to + /// appear to do nothing. They are empty on these traders today - this is for the next + /// model that is not. + /// + /// HONEST LIMIT: those two keywords are `shader_feature`, which Unity strips at build time + /// if no material in the game ships with them set. If they were stripped, EnableKeyword is + /// a no-op and only the roughness half lands. That is why the roughness half is not + /// treated as a fallback but as the main lever - and why this is not attempted at all on + /// the body's own "Game/Character" shader, which has none of these properties: its shine + /// lives inside the packed _RMOE texture and would have to be repainted, not switched off. + /// + public static void MakeMatte(Material _material) + { + if (_material.HasProperty("_Glossiness")) + { + _material.SetFloat("_Glossiness", 0f); + } + if (_material.HasProperty("_GlossMapScale")) + { + _material.SetFloat("_GlossMapScale", 0f); + } + if (_material.HasProperty("_Metallic")) + { + _material.SetFloat("_Metallic", 0f); + } + if (_material.HasProperty("_SpecularHighlights")) + { + _material.SetFloat("_SpecularHighlights", 0f); + _material.EnableKeyword("_SPECULARHIGHLIGHTS_OFF"); + } + if (_material.HasProperty("_GlossyReflections")) + { + _material.SetFloat("_GlossyReflections", 0f); + _material.EnableKeyword("_GLOSSYREFLECTIONS_OFF"); + } + ClearTexture(_material, "_SpecGlossMap"); + ClearTexture(_material, "_MetallicGlossMap"); + } + + /// Empties a texture slot if this material has one and it is not already empty. + /// + public static void ClearTexture(Material _material, string _property) + { + if (_material.HasProperty(_property) && _material.GetTexture(_property) != null) + { + _material.SetTexture(_property, null); + } + } + + /// First texture among these property names that this material actually has + /// something in. + public static Texture FindTexture(Material _source, string[] _hints) + { + foreach (string hint in _hints) + { + if (_source.HasProperty(hint)) + { + Texture texture = _source.GetTexture(hint); + if (texture != null) + { + return texture; + } + } + } + return null; + } + + /// + /// This material's ghost version. Two shapes, and which one it takes is decided by what + /// the material can do rather than by what it is called: + /// + /// - CAN be made see-through where it stands (the hair) -> a clone with the SAME shader + /// and only its albedo swapped for a black-and-white copy. Lighting, normal maps, + /// specular, skinning - all still the game's own. + /// - CANNOT (the body: no colour, no blend mode) -> under BodyMode.Blend it is re-shaded + /// onto the shader the hair uses, which can. Under BodyMode.Dither it takes the clone + /// path anyway and gets the _Fade lever, which works but throws pixels away. + /// + /// The albedo is desaturated first either way, because both shapes need it and the result + /// is cached per source texture - the re-shaded body is not paying for a second readback. + /// public static Material MakeGreyMaterial(Material _source, ref bool _changed) { if (_source == null) @@ -198,48 +561,83 @@ namespace NecromancerTome ProbeShaderOnce(_source); + string albedoProperty = FindAlbedoProperty(_source); + Texture2D desaturated = albedoProperty != null + ? Desaturate(_source.GetTexture(albedoProperty)) + : null; + + // Re-shading without an albedo to hand over would produce an untextured silhouette - + // the exact failure this patch already shipped once, on 2026-09-13. If the texture + // could not be read, the body keeps its own shader and stays dithered instead, and + // the lever count in the log is what says so. + if (BodyMode == BodyOpacityMode.Blend && BlendShader != null && desaturated != null && + !CanBlendInPlace(_source)) + { + _changed = true; + return MakeBlendMaterial(_source, desaturated); + } + Material grey = new Material(_source); + MakeMatte(grey); if (ApplyTransparency(grey)) { _changed = true; } - string albedoProperty = FindAlbedoProperty(_source); - if (albedoProperty == null) + if (desaturated == null) { // Nothing to desaturate on this material; hand back the clone unchanged rather // than dropping the renderer's material entirely. return grey; } - Texture2D desaturated = Desaturate(_source.GetTexture(albedoProperty)); - if (desaturated == null) - { - return grey; - } - grey.SetTexture(albedoProperty, desaturated); _changed = true; return grey; } /// - /// Makes the material blend instead of being drawn solid, then dials its alpha down by the - /// requested sliver. Two levers, both conditional, because the traders' own shaders are - /// game-specific and nothing about them can be assumed: + /// Dials this material's opacity down to GhostAlpha. THREE levers, each conditional, + /// because a trader is drawn by two different shaders that have almost nothing in common - + /// and the first version of this method only had the levers the hair happens to own, which + /// is why the user reported on 2026-09-14 that the console command "управляет только + /// прозрачностью бороды". The probe had already printed the reason, one line each: /// - /// - A COLOUR with an alpha channel (_Color and friends). This is the only thing that - /// actually sets the opacity. + /// shader 'Game/Character' - albedo: _Albedo -> HD_Rekt 4096x4096; + /// tint property: ; blend-mode properties present: False + /// shader 'Game/Autodesk' - albedo: _MainTex -> HD_Rekt_Hair 2048x2048; + /// tint property: _Color (alpha 1); blend-mode properties present: True + /// + /// The BODY has no colour property and no blend mode at all. Two of the three levers below + /// simply do not exist on it, and no value of GhostAlpha was ever going to reach it. + /// + /// - A COLOUR with an alpha channel (_Color and friends). The hair's lever; the body + /// does not have one. + /// - THE FADE FLOAT (_Fade). The body's lever, and the game's own: EntityModel.SetFade + /// writes this exact property and guards it with a check for the "Game/Character" + /// shader by name, so this is not a property we found and hoped about - it is the one + /// the engine itself fades these very models with. Nothing else in the body's property + /// list can carry an opacity: the rest is _Albedo/_Normal/_RMOE, an alpha-CUTOUT + /// cluster (_AlphaCut, _AlphaCutoff, _SoftAlphaCutoff, _AlphaSoftness - a dissolve, + /// which punches holes rather than making glass), _EmissiveColor, and flags. /// - THE BLEND MODE (_SrcBlend/_DstBlend). An opaque shader ignores any alpha it is - /// handed, so without this the first lever does nothing visible - the same wall the + /// handed, so without this the COLOUR lever does nothing visible - the same wall the /// mod's first transparency attempt hit back on 2026-08-28 with the summoned pets. /// The recipe is the game's own: MeshDescription.SetupMaterialWithBlendMode writes - /// exactly these properties plus _ZWrite and the _ALPHABLEND_ON keyword. + /// exactly these properties plus _ZWrite and the _ALPHABLEND_ON keyword. The _Fade + /// lever needs none of it - the shader does its own fading internally, which is + /// exactly why it exists. /// - /// _ZWrite IS LEFT ALONE ON PURPOSE. The usual recipe switches depth writing off, which is - /// right for glass and wrong for a person: without it every part of the model shows through - /// every other part and the trader turns into a soup of overlapping limbs. At 99% opacity - /// there is nothing to see through anyway, so keeping depth writing costs nothing visible - /// and avoids that entirely. + /// _ZWrite IS LEFT ALONE ON PURPOSE, AND AT 10% THAT IS THE WHOLE BALANCE. The usual + /// transparency recipe switches depth writing off, which is right for glass and wrong for + /// a person: without it every surface of the model blends over every other one, and the + /// trader becomes teeth through cheeks, eyeballs through eyelids, the far arm through the + /// chest - exactly the "сломанная модель" the user does not want. With it on, the depth + /// test keeps only the nearest surface and that one surface blends with the WORLD behind + /// him. So he goes see-through without coming apart: a ghost, not a mess. + /// + /// At 99% this cost nothing because there was nothing to see through; at 90% it is the + /// reason the effect is usable at all. Note that it is not set here either way - these + /// shaders write depth by default, and leaving the property untouched is what keeps it. /// /// Whatever is missing is reported by the probe rather than silently skipped - if neither /// lever exists on these shaders, the traders stay solid black-and-white and the log says @@ -256,8 +654,43 @@ namespace NecromancerTome continue; } Color tint = _material.GetColor(hint); - tint.a *= GhostAlpha; + float baseAlpha = tint.a; + tint.a = baseAlpha * GhostAlpha; _material.SetColor(hint, tint); + TintedMaterials.Add(new GhostMaterial + { + Material = _material, + Property = hint, + IsColour = true, + BaseValue = baseAlpha + }); + touched = true; + break; + } + + foreach (string hint in FadeNameHints) + { + if (!_material.HasProperty(hint)) + { + continue; + } + // A base of 0 would mean the material is already fully faded out, which no + // standing trader is - it means the property is sitting at a default nobody set. + // Multiplying by it would make him vanish outright and no value of GhostAlpha + // could bring him back, so it is read as "solid" instead. + float baseFade = _material.GetFloat(hint); + if (baseFade <= 0f) + { + baseFade = 1f; + } + _material.SetFloat(hint, baseFade * GhostAlpha); + TintedMaterials.Add(new GhostMaterial + { + Material = _material, + Property = hint, + IsColour = false, + BaseValue = baseFade + }); touched = true; break; } @@ -274,6 +707,40 @@ namespace NecromancerTome return touched; } + /// Pushes the current GhostAlpha onto every trader already standing in the world, + /// and returns how many materials took it. Traders that spawn later need nothing from this + /// - ApplyTransparency reads the same field on the way past. + /// + /// Unity's fake null is the reason for the rebuild-in-place rather than a simple loop: a + /// destroyed Material compares equal to null but is still a live list entry, and touching + /// it throws. Walking backwards and dropping those as we go keeps the list from growing + /// across a session of traders streaming in and out. + public static int Retint() + { + int applied = 0; + for (int i = TintedMaterials.Count - 1; i >= 0; i--) + { + GhostMaterial entry = TintedMaterials[i]; + if (entry.Material == null) + { + TintedMaterials.RemoveAt(i); + continue; + } + if (entry.IsColour) + { + Color tint = entry.Material.GetColor(entry.Property); + tint.a = entry.BaseValue * GhostAlpha; + entry.Material.SetColor(entry.Property, tint); + } + else + { + entry.Material.SetFloat(entry.Property, entry.BaseValue * GhostAlpha); + } + applied++; + } + return applied; + } + /// Name of the texture property holding this material's albedo, or null. Walks /// the shader's declared properties rather than assuming a name - the body and the hair of /// the same trader disagree about it. @@ -407,13 +874,23 @@ namespace NecromancerTome break; } } + string fade = ""; + foreach (string hint in FadeNameHints) + { + if (_source.HasProperty(hint)) + { + fade = hint + " (" + _source.GetFloat(hint).ToString("0.###") + ")"; + break; + } + } bool canBlend = _source.HasProperty("_SrcBlend") && _source.HasProperty("_DstBlend"); Debug.Log("[NecromancerTome] GhostTraderPatch: shader '" + shaderName + "' properties: " + (sb.Length > 0 ? sb.ToString() : "")); Debug.Log("[NecromancerTome] GhostTraderPatch: shader '" + shaderName + "' - albedo: " + (chosen ?? "") + " -> " + (chosenTexture != null ? chosenTexture.name + " " + chosenTexture.width + "x" + chosenTexture.height : "") + - "; tint property: " + tint + "; blend-mode properties present: " + canBlend); + "; tint property: " + tint + "; fade property: " + fade + + "; blend-mode properties present: " + canBlend); } } } diff --git a/NecromancerHarmony.dll b/NecromancerHarmony.dll index b0500621d9c450dc828e08ae1a1b2a1b5821cfb7..b6cf2eb11ab0af85b66d6a7b5755e8d63dde5a1d 100644 GIT binary patch literal 83968 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

(Zfy6a8CIn8BgIU>z?RZ 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 D7P1Nn literal 75264 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 Czg%ko diff --git a/NecromancerHarmony.pdb b/NecromancerHarmony.pdb index 7d512a7f0c31bf0aa9e630fc3fcf479cafea3c96..ab270633f1cc67eaa31559b3a64c905a5afd55e3 100644 GIT binary patch delta 8871 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