using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;
using BepInEx;
using SideLoader;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace RunicDagger;
[BepInPlugin("com.merofos.outward.runicdagger", "Runic Dagger", "0.1.8")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class RunicDaggerPlugin : BaseUnityPlugin
{
private const string PluginGuid = "com.merofos.outward.runicdagger";
private const string SideLoaderGuid = "com.sinai.SideLoader";
private const string PluginName = "Runic Dagger";
private const string PluginVersion = "0.1.8";
private const int RunicDaggerItemId = -2525110;
private const int MaxLoadedMaterialSearchAttempts = 4;
private const string RunicDaggerIconPath = "SideLoader/Items/-2525110-Runic_Dagger/icon.png";
private const string RunicDaggerIconId = "MEROFOS_RunicDaggerIcon";
private const string CapturedRunicBladeMaterialName = "mat_itm_crystalBladeRunicBladeLight";
private const string CapturedRunicBladeMainTextureName = "tex_fx_PerlinNoiseGray";
private const string CapturedRunicBladeWaveTextureName = "tex_env_waterWave_n";
private static readonly HashSet<string> s_missingTextureWarnings = new HashSet<string>();
private static readonly float[] VisualRetryDelays = new float[8] { 0f, 0.1f, 0.25f, 0.5f, 1f, 2f, 4f, 8f };
private static readonly FieldInfo ItemIconField = typeof(Item).GetField("m_itemIcon", BindingFlags.Instance | BindingFlags.NonPublic);
private static readonly FieldInfo ItemIconPathField = typeof(Item).GetField("m_itemIconPath", BindingFlags.Instance | BindingFlags.NonPublic);
private static Texture s_capturedMainTexture;
private static Texture s_capturedWaveTexture;
private readonly Dictionary<int, Material> _materialCache = new Dictionary<int, Material>();
private readonly HashSet<int> _pendingVisualRetries = new HashSet<int>();
private Sprite _runicDaggerIcon;
private Material _runicBladeSourceMaterial;
private int _runicMaterialGeneration;
private bool _capturedTexturesReady;
private bool _loggedIconFailure;
private bool _loggedNoRenderer;
private int _loadedMaterialSearchAttempts;
private static string PluginDirectory
{
get
{
string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
if (!string.IsNullOrEmpty(directoryName))
{
return directoryName;
}
return ".";
}
}
private void Awake()
{
SL.OnPacksLoaded += OnSideLoaderPacksLoaded;
SL_Item.AddOnInstanceStartListener(-2525110, (Action<Item>)OnRunicDaggerInstanceStart);
TryRefreshCapturedTextureState();
TryRefreshRunicBladeSourceMaterial(allowLoadedMaterialSearch: false);
Debug.Log((object)"[Runic Dagger] Loaded.");
}
private void OnRunicDaggerInstanceStart(Item item)
{
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Expected O, but got Unknown
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Expected O, but got Unknown
if (!((Object)(object)item == (Object)null) && item.ItemID == -2525110)
{
ApplyRunicDaggerIcon(item);
item.OnProcessVisual -= new ProcessVisual(OnRunicDaggerProcessVisual);
item.OnProcessVisual += new ProcessVisual(OnRunicDaggerProcessVisual);
QueueRunicVisualApply(item);
}
}
private void OnSideLoaderPacksLoaded()
{
ApplyRunicDaggerIconToPrefab();
}
private void OnRunicDaggerProcessVisual(Item item)
{
QueueRunicVisualApply(item);
}
private void QueueRunicVisualApply(Item item)
{
if (!((Object)(object)item == (Object)null) && item.ItemID == -2525110)
{
TryRefreshCapturedTextureState();
TryRefreshRunicBladeSourceMaterial(allowLoadedMaterialSearch: true);
ApplyRunicVisual(item, logMissingRenderer: false);
int instanceID = ((Object)item).GetInstanceID();
if (_pendingVisualRetries.Add(instanceID))
{
((MonoBehaviour)this).StartCoroutine(ApplyRunicVisualWhenReady(item, instanceID));
}
}
}
private IEnumerator ApplyRunicVisualWhenReady(Item item, int instanceId)
{
bool applied = false;
for (int i = 0; i < VisualRetryDelays.Length; i++)
{
float num = VisualRetryDelays[i];
if (num > 0f)
{
yield return (object)new WaitForSecondsRealtime(num);
}
else
{
yield return null;
}
if ((Object)(object)item == (Object)null)
{
break;
}
TryRefreshCapturedTextureState();
TryRefreshRunicBladeSourceMaterial(allowLoadedMaterialSearch: true);
applied |= ApplyRunicVisual(item, logMissingRenderer: false);
}
if (!applied && (Object)(object)item != (Object)null)
{
ApplyRunicVisual(item, logMissingRenderer: true);
}
_pendingVisualRetries.Remove(instanceId);
}
private bool ApplyRunicVisual(Item item, bool logMissingRenderer)
{
if ((Object)(object)item == (Object)null || item.ItemID != -2525110)
{
return false;
}
if (ApplyToKnownVisualRoots(item))
{
return true;
}
if (logMissingRenderer && !_loggedNoRenderer)
{
_loggedNoRenderer = true;
Debug.LogWarning((object)"[Runic Dagger] Could not find a safe Rondel Dagger renderer to recolor.");
}
return false;
}
private void TryRefreshRunicBladeSourceMaterial(bool allowLoadedMaterialSearch)
{
if (!((Object)(object)_runicBladeSourceMaterial != (Object)null))
{
Material val = LoadCapturedRunicBladeMaterial();
if ((Object)(object)val == (Object)null && allowLoadedMaterialSearch && _loadedMaterialSearchAttempts < 4)
{
_loadedMaterialSearchAttempts++;
val = FindLoadedCapturedRunicBladeMaterial();
}
if (!((Object)(object)val == (Object)null))
{
_runicBladeSourceMaterial = val;
_runicMaterialGeneration++;
_materialCache.Clear();
Debug.Log((object)("[Runic Dagger] Captured Runic Blade material '" + ((Object)val).name + "' with shader '" + ((Object)val.shader).name + "'."));
DumpRunicBladeMaterial(val);
}
}
}
private void TryRefreshCapturedTextureState()
{
bool flag = CapturedRunicBladeTexturesReady();
if (flag != _capturedTexturesReady)
{
_capturedTexturesReady = flag;
if (flag)
{
_runicMaterialGeneration++;
_materialCache.Clear();
Debug.Log((object)"[Runic Dagger] Captured Runic Blade fallback textures are ready.");
}
}
}
private void ApplyRunicDaggerIconToPrefab()
{
try
{
if (ResourcesPrefabManager.Instance != null)
{
Item itemPrefab = ResourcesPrefabManager.Instance.GetItemPrefab(-2525110);
ApplyRunicDaggerIcon(itemPrefab);
}
}
catch (Exception ex)
{
if (!_loggedIconFailure)
{
_loggedIconFailure = true;
Debug.LogWarning((object)("[Runic Dagger] Could not apply custom icon to prefab: " + ex.Message));
}
}
}
private void ApplyRunicDaggerIcon(Item item)
{
if ((Object)(object)item == (Object)null || item.ItemID != -2525110)
{
return;
}
Sprite runicDaggerIcon = GetRunicDaggerIcon();
if ((Object)(object)runicDaggerIcon == (Object)null)
{
return;
}
try
{
if (ItemIconField != null)
{
ItemIconField.SetValue(item, runicDaggerIcon);
}
if (ItemIconPathField != null)
{
ItemIconPathField.SetValue(item, "MEROFOS_RunicDaggerIcon");
}
else
{
item.ItemIconPath = "MEROFOS_RunicDaggerIcon";
}
}
catch (Exception ex)
{
if (!_loggedIconFailure)
{
_loggedIconFailure = true;
Debug.LogWarning((object)("[Runic Dagger] Could not apply custom icon: " + ex.Message));
}
}
}
private Sprite GetRunicDaggerIcon()
{
if ((Object)(object)_runicDaggerIcon != (Object)null)
{
return _runicDaggerIcon;
}
string text = Path.Combine(PluginDirectory, "SideLoader/Items/-2525110-Runic_Dagger/icon.png".Replace('/', Path.DirectorySeparatorChar));
try
{
Texture2D val = CustomTextures.LoadTexture(text, false, false);
if ((Object)(object)val == (Object)null)
{
if (!_loggedIconFailure)
{
_loggedIconFailure = true;
Debug.LogWarning((object)("[Runic Dagger] Could not load custom icon from " + text));
}
return null;
}
((Object)val).name = "MEROFOS_RunicDaggerIcon";
_runicDaggerIcon = CustomTextures.CreateSprite(val, (SpriteBorderTypes)1);
((Object)_runicDaggerIcon).name = "MEROFOS_RunicDaggerIcon";
}
catch (Exception ex)
{
if (!_loggedIconFailure)
{
_loggedIconFailure = true;
Debug.LogWarning((object)("[Runic Dagger] Could not create custom icon: " + ex.Message));
}
}
return _runicDaggerIcon;
}
private bool ApplyToKnownVisualRoots(Item item)
{
HashSet<int> visitedRoots = new HashSet<int>();
bool flag = false;
bool flag2 = SafeIsInWorld(item);
bool flag3 = SafeIsEquipped(item);
if (!flag2 && !flag3)
{
HideKnownItemVisuals(item);
return false;
}
ItemVisual val = SafeGetCurrentVisual(item);
if ((Object)(object)val != (Object)null)
{
flag |= ApplyToVisualRoot(((Component)val).gameObject, visitedRoots);
}
ItemVisual val2 = SafeGetLoadedVisual(item);
if ((Object)(object)val2 != (Object)null)
{
flag |= ApplyToVisualRoot(((Component)val2).gameObject, visitedRoots);
}
if (flag2)
{
flag |= ApplyToVisualRoot(((Component)item).gameObject, visitedRoots);
}
return flag;
}
private bool ApplyToVisualRoot(GameObject root, HashSet<int> visitedRoots)
{
if ((Object)(object)root == (Object)null)
{
return false;
}
int instanceID = ((Object)root).GetInstanceID();
if (!visitedRoots.Add(instanceID))
{
return false;
}
Renderer[] componentsInChildren = root.GetComponentsInChildren<Renderer>(true);
if (!ApplyToRenderers(componentsInChildren, requireVisualName: true))
{
return ApplyToRenderers(componentsInChildren, requireVisualName: false);
}
return true;
}
private static ItemVisual SafeGetCurrentVisual(Item item)
{
try
{
return item.CurrentVisual;
}
catch
{
return null;
}
}
private static ItemVisual SafeGetLoadedVisual(Item item)
{
try
{
return item.LoadedVisual;
}
catch
{
return null;
}
}
private static bool SafeIsInWorld(Item item)
{
try
{
return (Object)(object)item != (Object)null && item.IsInWorld;
}
catch
{
return false;
}
}
private static bool SafeIsEquipped(Item item)
{
try
{
return (Object)(object)item != (Object)null && item.IsEquipped;
}
catch
{
return false;
}
}
private static void HideKnownItemVisuals(Item item)
{
ItemVisual val = SafeGetCurrentVisual(item);
if ((Object)(object)val != (Object)null)
{
SafeHideVisual(val);
}
ItemVisual val2 = SafeGetLoadedVisual(item);
if ((Object)(object)val2 != (Object)null && (Object)(object)val2 != (Object)(object)val)
{
SafeHideVisual(val2);
}
}
private static void SafeHideVisual(ItemVisual visual)
{
try
{
visual.Hide();
}
catch
{
}
}
private bool ApplyToRenderers(Renderer[] renderers, bool requireVisualName)
{
bool result = false;
foreach (Renderer val in renderers)
{
if (!ShouldPatchRenderer(val, requireVisualName))
{
continue;
}
Material[] sharedMaterials = val.sharedMaterials;
if (sharedMaterials == null || sharedMaterials.Length == 0)
{
continue;
}
Material[] array = (Material[])(object)new Material[sharedMaterials.Length];
bool flag = false;
for (int j = 0; j < sharedMaterials.Length; j++)
{
Material val2 = sharedMaterials[j];
if ((Object)(object)val2 == (Object)null || ShouldSkipMaterial(val2))
{
array[j] = val2;
continue;
}
if (IsRunicDaggerMaterial(val2) && !ShouldRefreshRunicMaterial(val2))
{
array[j] = val2;
continue;
}
array[j] = GetRunicMaterial(val2);
flag = true;
}
if (flag)
{
val.sharedMaterials = array;
result = true;
}
}
return result;
}
private Material GetRunicMaterial(Material original)
{
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Expected O, but got Unknown
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Expected O, but got Unknown
string text = ((Object)original).name ?? string.Empty;
int instanceID = ((Object)original).GetInstanceID();
if (_materialCache.TryGetValue(instanceID, out var value) && (Object)(object)value != (Object)null)
{
return value;
}
Material val = new Material(original);
((Object)val).name = "MEROFOS_RunicDagger_" + text;
Material runicBladeSourceMaterial = GetRunicBladeSourceMaterial();
if ((Object)(object)runicBladeSourceMaterial != (Object)null)
{
val = new Material(runicBladeSourceMaterial);
((Object)val).name = "MEROFOS_RunicDagger_Exact_" + ((Object)runicBladeSourceMaterial).name;
}
else
{
ApplyCapturedRunicBladeMaterial(val);
}
_materialCache[instanceID] = val;
return val;
}
private bool ShouldRefreshRunicMaterial(Material material)
{
string text = ((Object)material).name ?? string.Empty;
if ((Object)(object)_runicBladeSourceMaterial != (Object)null && !text.StartsWith("MEROFOS_RunicDagger_Exact_", StringComparison.Ordinal))
{
return true;
}
if (CapturedRunicBladeTexturesReady() && text.StartsWith("MEROFOS_RunicDagger_Captured_", StringComparison.Ordinal))
{
if (HasTexture(material, "_MainTex") && HasTexture(material, "_NormalMap"))
{
return !HasTexture(material, "_DistortMap");
}
return true;
}
return false;
}
private Material GetRunicBladeSourceMaterial()
{
if ((Object)(object)_runicBladeSourceMaterial != (Object)null)
{
return _runicBladeSourceMaterial;
}
TryRefreshRunicBladeSourceMaterial(allowLoadedMaterialSearch: true);
return _runicBladeSourceMaterial;
}
private static void ApplyRunicShader(Material material)
{
Shader val = Shader.Find("Custom/Distort/DistortTextureSpec");
if ((Object)(object)val != (Object)null)
{
material.shader = val;
}
}
private static Material LoadCapturedRunicBladeMaterial()
{
string[] array = new string[5] { "mat_itm_crystalBladeRunicBladeLight", "Materials/mat_itm_crystalBladeRunicBladeLight", "_Materials/mat_itm_crystalBladeRunicBladeLight", "Items/mat_itm_crystalBladeRunicBladeLight", "Weapons/mat_itm_crystalBladeRunicBladeLight" };
for (int i = 0; i < array.Length; i++)
{
Material val = Resources.Load<Material>(array[i]);
if ((Object)(object)val != (Object)null)
{
return val;
}
}
return null;
}
private static Material FindLoadedCapturedRunicBladeMaterial()
{
Material[] array = Resources.FindObjectsOfTypeAll<Material>();
foreach (Material val in array)
{
if (!((Object)(object)val == (Object)null) && ((Object)val).name != null && !((Object)val).name.StartsWith("MEROFOS_RunicDagger_", StringComparison.Ordinal))
{
string name = ((Object)val).name;
if (string.Equals(name, "mat_itm_crystalBladeRunicBladeLight", StringComparison.Ordinal) || name.StartsWith("mat_itm_crystalBladeRunicBladeLight ", StringComparison.Ordinal) || name.StartsWith("mat_itm_crystalBladeRunicBladeLight(", StringComparison.Ordinal))
{
return val;
}
}
}
return null;
}
private static void ApplyCapturedRunicBladeMaterial(Material material)
{
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
((Object)material).name = "MEROFOS_RunicDagger_Captured_mat_itm_crystalBladeRunicBladeLight";
material.renderQueue = 2000;
ApplyRunicShader(material);
SetTexture(material, "_MainTex", GetCapturedMainTexture());
SetTexture(material, "_NormalMap", GetCapturedWaveTexture());
SetTexture(material, "_DistortMap", GetCapturedWaveTexture());
SetColor(material, "_Color", new Color(14.55578f, 6.948529f, 15f, 1f));
SetColor(material, "_SpecColor", new Color(0.3455882f, 0.3455882f, 0.3455882f, 0.759f));
SetFloat(material, "_NormalStrength", 1f);
SetFloat(material, "_Speed", 1f);
SetFloat(material, "_Scale", 2f);
SetFloat(material, "_MaskPow", 0f);
material.shaderKeywords = new string[2] { "_ALPHATEST_ON", "_NORMALMAP" };
material.EnableKeyword("_ALPHATEST_ON");
material.EnableKeyword("_NORMALMAP");
}
private static void DumpRunicBladeMaterial(Material material)
{
try
{
string text = Path.Combine(Paths.ConfigPath, "MEROFOS.RunicDagger.RunicBladeMaterialDump.txt");
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.AppendLine("Runic Dagger - captured Runic Blade material");
stringBuilder.AppendLine("Generated: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
stringBuilder.AppendLine("Material: " + SafeName((Object)(object)material));
stringBuilder.AppendLine("Shader: " + (((Object)(object)material.shader == (Object)null) ? "<null>" : SafeName((Object)(object)material.shader)));
stringBuilder.AppendLine("RenderQueue: " + material.renderQueue);
stringBuilder.AppendLine("Keywords: " + string.Join(", ", material.shaderKeywords ?? new string[0]));
stringBuilder.AppendLine();
stringBuilder.AppendLine("[Textures]");
AppendTexture(stringBuilder, material, "_MainTex");
AppendTexture(stringBuilder, material, "_BumpMap");
AppendTexture(stringBuilder, material, "_NormalMap");
AppendTexture(stringBuilder, material, "_DistortMap");
AppendTexture(stringBuilder, material, "_EmissionMap");
stringBuilder.AppendLine();
stringBuilder.AppendLine("[Colors]");
AppendColor(stringBuilder, material, "_Color");
AppendColor(stringBuilder, material, "_SpecColor");
AppendColor(stringBuilder, material, "_EmissionColor");
AppendColor(stringBuilder, material, "_TintColor");
stringBuilder.AppendLine();
stringBuilder.AppendLine("[Floats]");
AppendFloat(stringBuilder, material, "_NormalStrength");
AppendFloat(stringBuilder, material, "_Speed");
AppendFloat(stringBuilder, material, "_Scale");
AppendFloat(stringBuilder, material, "_MaskPow");
AppendFloat(stringBuilder, material, "_EmissionIntensity");
AppendFloat(stringBuilder, material, "_EmissionPower");
AppendFloat(stringBuilder, material, "_Glow");
AppendFloat(stringBuilder, material, "_GlowIntensity");
AppendFloat(stringBuilder, material, "_Intensity");
AppendFloat(stringBuilder, material, "_Glossiness");
AppendFloat(stringBuilder, material, "_Metallic");
File.WriteAllText(text, stringBuilder.ToString());
Debug.Log((object)("[Runic Dagger] Wrote Runic Blade material dump to " + text));
}
catch (Exception ex)
{
Debug.LogWarning((object)("[Runic Dagger] Could not write Runic Blade material dump: " + ex.Message));
}
}
private static void AppendTexture(StringBuilder builder, Material material, string propertyName)
{
if (!material.HasProperty(propertyName))
{
builder.AppendLine(propertyName + " = <missing>");
return;
}
Texture texture = material.GetTexture(propertyName);
builder.AppendLine(propertyName + " = " + (((Object)(object)texture == (Object)null) ? "<null>" : SafeName((Object)(object)texture)));
}
private static void AppendColor(StringBuilder builder, Material material, string propertyName)
{
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
if (!material.HasProperty(propertyName))
{
builder.AppendLine(propertyName + " = <missing>");
return;
}
Color color = material.GetColor(propertyName);
builder.AppendLine(propertyName + " = " + color.r + ", " + color.g + ", " + color.b + ", " + color.a);
}
private static void AppendFloat(StringBuilder builder, Material material, string propertyName)
{
if (!material.HasProperty(propertyName))
{
builder.AppendLine(propertyName + " = <missing>");
}
else
{
builder.AppendLine(propertyName + " = " + material.GetFloat(propertyName));
}
}
private static string SafeName(Object obj)
{
if (!(obj == (Object)null))
{
return obj.name;
}
return "<null>";
}
private static bool CapturedRunicBladeTexturesReady()
{
if ((Object)(object)GetCapturedMainTexture() != (Object)null)
{
return (Object)(object)GetCapturedWaveTexture() != (Object)null;
}
return false;
}
private static Texture GetCapturedMainTexture()
{
if ((Object)(object)s_capturedMainTexture == (Object)null)
{
s_capturedMainTexture = FindTexture("tex_fx_PerlinNoiseGray");
}
return s_capturedMainTexture;
}
private static Texture GetCapturedWaveTexture()
{
if ((Object)(object)s_capturedWaveTexture == (Object)null)
{
s_capturedWaveTexture = FindTexture("tex_env_waterWave_n");
}
return s_capturedWaveTexture;
}
private static Texture FindTexture(string textureName)
{
string[] array = new string[6]
{
textureName,
"Textures/" + textureName,
"_Textures/" + textureName,
"FX/" + textureName,
"VFX/" + textureName,
"Environment/" + textureName
};
for (int i = 0; i < array.Length; i++)
{
Texture val = Resources.Load<Texture>(array[i]);
if ((Object)(object)val != (Object)null)
{
return val;
}
}
Texture[] array2 = Resources.FindObjectsOfTypeAll<Texture>();
foreach (Texture val2 in array2)
{
if ((Object)(object)val2 != (Object)null && string.Equals(((Object)val2).name, textureName, StringComparison.Ordinal))
{
return val2;
}
}
if (!s_missingTextureWarnings.Contains(textureName))
{
s_missingTextureWarnings.Add(textureName);
Debug.LogWarning((object)("[Runic Dagger] Could not find texture '" + textureName + "' for captured Runic Blade material."));
}
return null;
}
private static void SetColor(Material material, string propertyName, Color value)
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
if (material.HasProperty(propertyName))
{
material.SetColor(propertyName, value);
}
}
private static void SetFloat(Material material, string propertyName, float value)
{
if (material.HasProperty(propertyName))
{
material.SetFloat(propertyName, value);
}
}
private static void SetTexture(Material material, string propertyName, Texture texture)
{
if ((Object)(object)texture != (Object)null && material.HasProperty(propertyName))
{
material.SetTexture(propertyName, texture);
}
}
private static bool HasTexture(Material material, string propertyName)
{
if (material.HasProperty(propertyName))
{
return (Object)(object)material.GetTexture(propertyName) != (Object)null;
}
return false;
}
private static bool IsRunicDaggerMaterial(Material material)
{
if ((Object)(object)material != (Object)null && ((Object)material).name != null)
{
return ((Object)material).name.StartsWith("MEROFOS_RunicDagger_", StringComparison.Ordinal);
}
return false;
}
private static bool ShouldPatchRenderer(Renderer renderer, bool requireVisualName)
{
if ((Object)(object)renderer == (Object)null || renderer is TrailRenderer || renderer is LineRenderer || renderer is ParticleSystemRenderer)
{
return false;
}
if (requireVisualName && !HasRunicDaggerVisualName(((Component)renderer).transform))
{
return false;
}
string text = ((((Object)renderer).name == null) ? string.Empty : ((Object)renderer).name.ToLowerInvariant());
if (!text.Contains("highlight") && !text.Contains("trail") && !text.Contains("linecast") && !text.Contains("gateframe") && !text.Contains("hair") && !text.Contains("head"))
{
return !text.Contains("face");
}
return false;
}
private static bool ShouldSkipMaterial(Material material)
{
string text = ((((Object)material).name == null) ? string.Empty : ((Object)material).name.ToLowerInvariant());
if (!text.Contains("hair") && !text.Contains("skin") && !text.Contains("head") && !text.Contains("face") && !text.Contains("beard"))
{
return text.StartsWith("mat_cha_", StringComparison.Ordinal);
}
return true;
}
private static bool HasRunicDaggerVisualName(Transform transform)
{
Transform val = transform;
while ((Object)(object)val != (Object)null)
{
string text = ((((Object)val).name == null) ? string.Empty : ((Object)val).name.ToLowerInvariant());
if (text.Contains("5110000") || text.Contains("rondeldagger") || text.Contains("rondel dagger") || text.Contains("runicdagger") || text.Contains("runic dagger") || text.Contains("-2525110") || text.Contains("2525110"))
{
return true;
}
val = val.parent;
}
return false;
}
}