Files
necromants-tome-7d2d-3-2/HarmonySrc/BundleShaderFix.cs
T

97 lines
3.4 KiB
C#

using System.Collections.Generic;
using HarmonyLib;
using UnityEngine;
namespace NecromancerTome
{
/// <summary>
/// Шейдер Standard из наших бандлов (10.10.2026). Тест в игре: останки красного трупа вышли бледно-бежевыми, хотя
/// в Unity тот же префаб тёмный и багровый (снимок NecroPreviewOne) - игра рисует копию Standard, приехавшую
/// в бандле, не так, как свой Standard. То же раньше было у крысы (RatModel.cs подменяет шейдер на свой) и у
/// пирамиды (маджента издалека). Здесь - общая подмена для новых моделей: останки (сущность necroRemains),
/// череп и нож-меч прилива (модели предметов). Материалы бандла общие - правится один раз на материал.
/// Очередь отрисовки сохраняется (у меча прилива - прозрачная, Fade).
/// </summary>
public static class BundleShaderFix
{
static Shader _std;
static readonly HashSet<int> _done = new HashSet<int>();
/// <summary>Выход из мира: бандлы при следующей загрузке дадут новые материалы - старые номера не нужны
/// (вызывает RemainsDecay, когда мира нет).</summary>
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<Renderer>(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 + ")");
}
}
}
}
/// <summary>Останки красного трупа - модель сущности.</summary>
[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());
}
}
}
/// <summary>Череп и нож (меч прилива) - модели предметов: в руке и на земле.</summary>
[HarmonyPatch(typeof(ItemClass), nameof(ItemClass.CloneModel))]
public static class Patch_ItemClass_CloneModel_BundleShaderFix
{
public static void Postfix(ItemClass __instance, AssetManagement.InstanceHandle<GameObject> __result)
{
string n = __instance?.Name;
if (n != "necroSkull" && n != SnakeMode.KnifeName)
{
return;
}
GameObject go = __result.Instance;
if (go != null)
{
BundleShaderFix.Fix(go.transform);
}
}
}
}