using System.Collections.Generic; using HarmonyLib; using UnityEngine; namespace NecromancerTome { /// /// Шейдер Standard из наших бандлов (10.10.2026). Тест в игре: останки красного трупа вышли бледно-бежевыми, хотя /// в Unity тот же префаб тёмный и багровый (снимок NecroPreviewOne) - игра рисует копию Standard, приехавшую /// в бандле, не так, как свой Standard. То же раньше было у крысы (RatModel.cs подменяет шейдер на свой) и у /// пирамиды (маджента издалека). Здесь - общая подмена для новых моделей: останки (сущность necroRemains), /// череп и нож-меч прилива (модели предметов). Материалы бандла общие - правится один раз на материал. /// Очередь отрисовки сохраняется (у меча прилива - прозрачная, Fade). /// public static class BundleShaderFix { static Shader _std; static readonly HashSet _done = new HashSet(); /// Выход из мира: бандлы при следующей загрузке дадут новые материалы - старые номера не нужны /// (вызывает RemainsDecay, когда мира нет). public static void Forget() { _done.Clear(); } public static void Fix(Transform _root) { if (_root == null) { return; } if (_std == null) { _std = Shader.Find("Standard"); if (_std == null) { return; } } foreach (Renderer r in _root.GetComponentsInChildren(true)) { foreach (Material m in r.sharedMaterials) { if (m == null || m.shader == null || m.shader == _std || m.shader.name != "Standard" || !_done.Add(m.GetInstanceID())) { continue; } int queue = m.renderQueue; m.shader = _std; m.renderQueue = queue; Debug.Log("[NecromancerTome] BundleShaderFix: материал '" + m.name + "' - встроенный Standard (очередь " + queue + ")"); } } } } /// Останки красного трупа - модель сущности. [HarmonyPatch(typeof(EModelBase), nameof(EModelBase.createModel))] public static class Patch_EModelBase_createModel_BundleShaderFix { static int _cls = int.MinValue; public static void Postfix(EModelBase __instance) { if (_cls == int.MinValue) { _cls = EntityClass.FromString(RemainsDecay.EntityClassName); } Entity e = __instance.entity; if (e != null && e.entityClass == _cls) { BundleShaderFix.Fix(__instance.GetModelTransform()); } } } /// Череп и нож (меч прилива) - модели предметов: в руке и на земле. [HarmonyPatch(typeof(ItemClass), nameof(ItemClass.CloneModel))] public static class Patch_ItemClass_CloneModel_BundleShaderFix { public static void Postfix(ItemClass __instance, AssetManagement.InstanceHandle __result) { string n = __instance?.Name; if (n != "necroSkull" && n != SnakeMode.KnifeName) { return; } GameObject go = __result.Instance; if (go != null) { BundleShaderFix.Fix(go.transform); } } } }