From 321f5d43377070fea7235880ae2130b44625d0b2 Mon Sep 17 00:00:00 2001 From: AlexCube Date: Fri, 23 Oct 2026 12:51:23 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D1=83=D1=85=D0=B8=20=D1=83=D1=80=D0=BD:?= =?UTF-8?q?=20=D1=81=D0=BB=D0=BE=D0=BC=D0=B0=D0=BD=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D1=88=D0=B5=D0=B9=D0=B4=D0=B5=D1=80=20(=D0=BF=D1=83=D1=80?= =?UTF-8?q?=D0=BF=D1=83=D1=80=D0=BD=D1=8B=D0=B9=20=D0=B4=D1=83=D1=85)=20-?= =?UTF-8?q?=20=D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8=D0=B0=D0=BB=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D1=91=D1=82?= =?UTF-8?q?=D1=81=D1=8F,=20=D0=BF=D1=80=D0=B8=D1=87=D0=B8=D0=BD=D0=B0=20-?= =?UTF-8?q?=20=D0=B2=20=D0=BB=D0=BE=D0=B3=20(#70)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- HarmonySrc/CinerariumGenie.cs | 69 +++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/HarmonySrc/CinerariumGenie.cs b/HarmonySrc/CinerariumGenie.cs index 443158e..c91cbb1 100644 --- a/HarmonySrc/CinerariumGenie.cs +++ b/HarmonySrc/CinerariumGenie.cs @@ -272,8 +272,39 @@ namespace NecromancerTome return p.Key; } } + foreach (KeyValuePair p in _stuckMats) + { + if (p.Value == _ghost) + { + return p.Key; + } + } return _ghost; } + + /// Шейдер материала пропал - дух рисуется пурпурным (23.10.2026, скриншот пользователя: после выхода из + /// питомца в 218 блоках от базы все духи некротехнологов пурпурные; раньше - #70, дух закопанной урны). + public static bool Broken(Material _m) + { + return _m != null && (_m.shader == null || !_m.shader.isSupported || _m.shader.name == "Hidden/InternalErrorShader"); + } + + /// Сломанную копию - из кэша вон и собрать заново из исходного материала модели. + public static Material Repair(Material _broken, bool _stuck) + { + Material src = Source(_broken); + Debug.Log("[NecromancerTome] CinerariumGenie: шейдер духа сломан (" + (_broken.shader != null ? _broken.shader.name : "null") + + ", исходный материал '" + (src != null ? src.name : "null") + "' - шейдер " + + (src != null && src.shader != null ? src.shader.name + (src.shader.isSupported ? "" : " НЕ поддерживается") : "null") + + ", Standard " + (Shader.Find("Standard") != null ? "есть" : "НЕ найден") + ") - материал пересоздан"); + if (src == null || src == _broken) + { + return _broken; + } + _ghostMats.Remove(src); + _stuckMats.Remove(src); + return _stuck ? Stuck(src) : Ghost(src); + } } /// Покачивание и поворот джинна над урной. Только вид - никакой логики. @@ -540,9 +571,47 @@ namespace NecromancerTome float _nextSleepCheck; bool _asleep; bool _hiddenApplied; + float _nextShaderCheck; + Renderer[] _renderers; + + /// Раз в 5 с: не сломан ли шейдер у материалов духа (CinerariumGenie.Broken) - починить на месте. + void CheckShaders() + { + if (_renderers == null) + { + _renderers = GetComponentsInChildren(true); + } + foreach (Renderer r in _renderers) + { + if (r == null || r.name.Contains("eye")) + { + continue; + } + Material[] mats = r.sharedMaterials; + bool fixedAny = false; + for (int i = 0; i < mats.Length; i++) + { + if (CinerariumGenie.Broken(mats[i])) + { + mats[i] = CinerariumGenie.Repair(mats[i], _stuck); + fixedAny = true; + } + } + if (fixedAny) + { + r.sharedMaterials = mats; + _glowing.Clear(); // сохранённые светлые наборы могли быть со сломанными копиями + } + } + } void Update() { + if (Time.time >= _nextShaderCheck) + { + _nextShaderCheck = Time.time + 5f; + CheckShaders(); + } if (Time.time >= _nextSleepCheck) { _nextSleepCheck = Time.time + 0.5f;