using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using Assimp;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using UnityEngine;
using UnityEngine.SceneManagement;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("0.4.1")]
[assembly: AssemblyInformationalVersion("1.0.0+fece214403af15dd9ed037ab5dff9f054396610c")]
[assembly: AssemblyVersion("0.4.1.0")]
public class OBJLoader
{
private struct OBJFace
{
public string materialName;
public string meshName;
public int[] indexes;
}
public static bool splitByMaterial = false;
public static string[] searchPaths;
public static Vector3 ParseVectorFromCMPS(string[] cmps)
{
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
float num = float.Parse(cmps[1]);
float num2 = float.Parse(cmps[2]);
if (cmps.Length == 4)
{
float num3 = float.Parse(cmps[3]);
return new Vector3(num, num2, num3);
}
return Vector2.op_Implicit(new Vector2(num, num2));
}
public static Color ParseColorFromCMPS(string[] cmps, float scalar = 1f)
{
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
float num = float.Parse(cmps[1]) * scalar;
float num2 = float.Parse(cmps[2]) * scalar;
float num3 = float.Parse(cmps[3]) * scalar;
return new Color(num, num2, num3);
}
public static string OBJGetFilePath(string path, string basePath, string fileName)
{
string[] array = searchPaths;
foreach (string text in array)
{
string text2 = text.Replace("%FileName%", fileName);
if (File.Exists(basePath + text2 + path))
{
return basePath + text2 + path;
}
if (File.Exists(path))
{
return path;
}
}
return null;
}
public static Material[] LoadMTLFile(string fn)
{
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00cd: Expected O, but got Unknown
//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
//IL_0252: Unknown result type (might be due to invalid IL or missing references)
//IL_0257: Unknown result type (might be due to invalid IL or missing references)
//IL_0268: Unknown result type (might be due to invalid IL or missing references)
Material val = null;
List<Material> list = new List<Material>();
FileInfo fileInfo = new FileInfo(fn);
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fn);
string fullName = fileInfo.Directory.FullName;
char directorySeparatorChar = Path.DirectorySeparatorChar;
string basePath = fullName + directorySeparatorChar;
string[] array = File.ReadAllLines(fn);
foreach (string text in array)
{
string text2 = text.Trim().Replace(" ", " ");
string[] array2 = text2.Split(new char[1] { ' ' });
string text3 = text2.Remove(0, text2.IndexOf(' ') + 1);
if (array2[0] == "newmtl")
{
if ((Object)(object)val != (Object)null)
{
list.Add(val);
}
val = new Material(Shader.Find("Standard (Specular setup)"));
((Object)val).name = text3;
}
else if (array2[0] == "Kd")
{
val.SetColor("_Color", ParseColorFromCMPS(array2));
}
else if (array2[0] == "map_Kd")
{
string text4 = OBJGetFilePath(text3, basePath, fileNameWithoutExtension);
if (text4 != null)
{
val.SetTexture("_MainTex", (Texture)(object)TextureLoader.LoadTexture(text4));
}
}
else if (array2[0] == "map_Bump")
{
string text5 = OBJGetFilePath(text3, basePath, fileNameWithoutExtension);
if (text5 != null)
{
val.SetTexture("_BumpMap", (Texture)(object)TextureLoader.LoadTexture(text5, normalMap: true));
val.EnableKeyword("_NORMALMAP");
}
}
else if (array2[0] == "Ks")
{
val.SetColor("_SpecColor", ParseColorFromCMPS(array2));
}
else if (array2[0] == "Ka")
{
val.SetColor("_EmissionColor", ParseColorFromCMPS(array2, 0.05f));
val.EnableKeyword("_EMISSION");
}
else if (array2[0] == "d")
{
float num = float.Parse(array2[1]);
if (num < 1f)
{
Color color = val.color;
color.a = num;
val.SetColor("_Color", color);
val.SetFloat("_Mode", 3f);
val.SetInt("_SrcBlend", 5);
val.SetInt("_DstBlend", 10);
val.SetInt("_ZWrite", 0);
val.DisableKeyword("_ALPHATEST_ON");
val.EnableKeyword("_ALPHABLEND_ON");
val.DisableKeyword("_ALPHAPREMULTIPLY_ON");
val.renderQueue = 3000;
}
}
else if (array2[0] == "Ns")
{
float num2 = float.Parse(array2[1]);
num2 /= 1000f;
val.SetFloat("_Glossiness", num2);
}
}
if ((Object)(object)val != (Object)null)
{
list.Add(val);
}
return list.ToArray();
}
public static GameObject LoadOBJFile(string fn)
{
//IL_05f3: Unknown result type (might be due to invalid IL or missing references)
//IL_05fa: Expected O, but got Unknown
//IL_062d: Unknown result type (might be due to invalid IL or missing references)
//IL_0634: Expected O, but got Unknown
//IL_065e: Unknown result type (might be due to invalid IL or missing references)
//IL_0669: Unknown result type (might be due to invalid IL or missing references)
//IL_0670: Expected O, but got Unknown
//IL_0219: Unknown result type (might be due to invalid IL or missing references)
//IL_0242: Unknown result type (might be due to invalid IL or missing references)
//IL_026c: Unknown result type (might be due to invalid IL or missing references)
//IL_0271: Unknown result type (might be due to invalid IL or missing references)
//IL_07f9: Unknown result type (might be due to invalid IL or missing references)
//IL_080a: Unknown result type (might be due to invalid IL or missing references)
//IL_081b: Unknown result type (might be due to invalid IL or missing references)
//IL_096a: Unknown result type (might be due to invalid IL or missing references)
//IL_0970: Expected O, but got Unknown
//IL_09ad: Unknown result type (might be due to invalid IL or missing references)
//IL_09b3: Expected O, but got Unknown
//IL_044f: Unknown result type (might be due to invalid IL or missing references)
//IL_048d: Unknown result type (might be due to invalid IL or missing references)
//IL_0477: Unknown result type (might be due to invalid IL or missing references)
//IL_04cc: Unknown result type (might be due to invalid IL or missing references)
//IL_04b7: Unknown result type (might be due to invalid IL or missing references)
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fn);
bool flag = false;
List<Vector3> list = new List<Vector3>();
List<Vector3> list2 = new List<Vector3>();
List<Vector2> list3 = new List<Vector2>();
List<Vector3> list4 = new List<Vector3>();
List<Vector3> list5 = new List<Vector3>();
List<Vector2> list6 = new List<Vector2>();
List<string> list7 = new List<string>();
List<string> list8 = new List<string>();
Dictionary<string, int> dictionary = new Dictionary<string, int>();
List<OBJFace> list9 = new List<OBJFace>();
string text = "";
string text2 = "default";
Material[] array = null;
FileInfo fileInfo = new FileInfo(fn);
string[] array2 = File.ReadAllLines(fn);
foreach (string text3 in array2)
{
if (text3.Length <= 0 || text3[0] == '#')
{
continue;
}
string text4 = text3.Trim().Replace(" ", " ");
string[] array3 = text4.Split(new char[1] { ' ' });
string text5 = text4.Remove(0, text4.IndexOf(' ') + 1);
if (array3[0] == "mtllib")
{
string fullName = fileInfo.Directory.FullName;
char directorySeparatorChar = Path.DirectorySeparatorChar;
string text6 = OBJGetFilePath(text5, fullName + directorySeparatorChar, fileNameWithoutExtension);
if (text6 != null)
{
array = LoadMTLFile(text6);
}
}
else if ((array3[0] == "g" || array3[0] == "o") && !splitByMaterial)
{
text2 = text5;
if (!list8.Contains(text2))
{
list8.Add(text2);
}
}
else if (array3[0] == "usemtl")
{
text = text5;
if (!list7.Contains(text))
{
list7.Add(text);
}
if (splitByMaterial && !list8.Contains(text))
{
list8.Add(text);
}
}
else if (array3[0] == "v")
{
list.Add(ParseVectorFromCMPS(array3));
}
else if (array3[0] == "vn")
{
list2.Add(ParseVectorFromCMPS(array3));
}
else if (array3[0] == "vt")
{
list3.Add(Vector2.op_Implicit(ParseVectorFromCMPS(array3)));
}
else
{
if (!(array3[0] == "f"))
{
continue;
}
int[] array4 = new int[array3.Length - 1];
for (int k = 1; k < array3.Length; k++)
{
string text7 = array3[k];
int num = -1;
int num2 = -1;
int num3 = -1;
if (text7.Contains("//"))
{
string[] array5 = text7.Split(new char[1] { '/' });
num = int.Parse(array5[0]) - 1;
num2 = int.Parse(array5[2]) - 1;
}
else if (text7.Count((char x) => x == '/') == 2)
{
string[] array6 = text7.Split(new char[1] { '/' });
num = int.Parse(array6[0]) - 1;
num3 = int.Parse(array6[1]) - 1;
num2 = int.Parse(array6[2]) - 1;
}
else if (!text7.Contains("/"))
{
num = int.Parse(text7) - 1;
}
else
{
string[] array7 = text7.Split(new char[1] { '/' });
num = int.Parse(array7[0]) - 1;
num3 = int.Parse(array7[1]) - 1;
}
string key = num + "|" + num2 + "|" + num3;
if (dictionary.ContainsKey(key))
{
array4[k - 1] = dictionary[key];
continue;
}
array4[k - 1] = dictionary.Count;
dictionary[key] = dictionary.Count;
list4.Add(list[num]);
if (num2 < 0 || num2 > list2.Count - 1)
{
list5.Add(Vector3.zero);
}
else
{
flag = true;
list5.Add(list2[num2]);
}
if (num3 < 0 || num3 > list3.Count - 1)
{
list6.Add(Vector2.zero);
}
else
{
list6.Add(list3[num3]);
}
}
if (array4.Length < 5 && array4.Length >= 3)
{
OBJFace item = default(OBJFace);
item.materialName = text;
item.indexes = new int[3]
{
array4[0],
array4[1],
array4[2]
};
item.meshName = (splitByMaterial ? text : text2);
list9.Add(item);
if (array4.Length > 3)
{
OBJFace item2 = default(OBJFace);
item2.materialName = text;
item2.meshName = (splitByMaterial ? text : text2);
item2.indexes = new int[3]
{
array4[2],
array4[3],
array4[0]
};
list9.Add(item2);
}
}
}
}
if (list8.Count == 0)
{
list8.Add("default");
}
GameObject val = new GameObject(fileNameWithoutExtension);
foreach (string obj in list8)
{
GameObject val2 = new GameObject(obj);
val2.transform.SetParent(val.transform);
val2.transform.localScale = new Vector3(-1f, 1f, 1f);
Mesh val3 = new Mesh();
((Object)val3).name = obj;
List<Vector3> list10 = new List<Vector3>();
List<Vector3> list11 = new List<Vector3>();
List<Vector2> list12 = new List<Vector2>();
List<int[]> list13 = new List<int[]>();
Dictionary<int, int> dictionary2 = new Dictionary<int, int>();
List<string> meshMaterialNames = new List<string>();
OBJFace[] source = list9.Where((OBJFace x) => x.meshName == obj).ToArray();
foreach (string mn in list7)
{
OBJFace[] array8 = source.Where((OBJFace x) => x.materialName == mn).ToArray();
if (array8.Length == 0)
{
continue;
}
int[] array9 = new int[0];
OBJFace[] array10 = array8;
for (int l = 0; l < array10.Length; l++)
{
OBJFace oBJFace = array10[l];
int num4 = array9.Length;
Array.Resize(ref array9, num4 + oBJFace.indexes.Length);
Array.Copy(oBJFace.indexes, 0, array9, num4, oBJFace.indexes.Length);
}
meshMaterialNames.Add(mn);
if (val3.subMeshCount != meshMaterialNames.Count)
{
val3.subMeshCount = meshMaterialNames.Count;
}
for (int m = 0; m < array9.Length; m++)
{
int num5 = array9[m];
if (dictionary2.ContainsKey(num5))
{
array9[m] = dictionary2[num5];
continue;
}
list10.Add(list4[num5]);
list11.Add(list5[num5]);
list12.Add(list6[num5]);
dictionary2[num5] = list10.Count - 1;
array9[m] = dictionary2[num5];
}
list13.Add(array9);
}
val3.vertices = list10.ToArray();
val3.normals = list11.ToArray();
val3.uv = list12.ToArray();
for (int n = 0; n < list13.Count; n++)
{
val3.SetTriangles(list13[n], n);
}
if (!flag)
{
val3.RecalculateNormals();
}
val3.RecalculateBounds();
MeshFilter val4 = val2.AddComponent<MeshFilter>();
MeshRenderer val5 = val2.AddComponent<MeshRenderer>();
Material[] array11 = (Material[])(object)new Material[meshMaterialNames.Count];
int i;
for (i = 0; i < meshMaterialNames.Count; i++)
{
if (array == null)
{
array11[i] = new Material(Shader.Find("Standard (Specular setup)"));
}
else
{
Material val6 = Array.Find(array, (Material x) => ((Object)x).name == meshMaterialNames[i]);
if ((Object)(object)val6 == (Object)null)
{
array11[i] = new Material(Shader.Find("Standard (Specular setup)"));
}
else
{
array11[i] = val6;
}
}
((Object)array11[i]).name = meshMaterialNames[i];
}
((Renderer)val5).materials = array11;
val4.mesh = val3;
}
return val;
}
static OBJLoader()
{
string[] obj = new string[2] { "", null };
char directorySeparatorChar = Path.DirectorySeparatorChar;
obj[1] = "%FileName%_Textures" + directorySeparatorChar;
searchPaths = obj;
}
}
public class TextureLoader : MonoBehaviour
{
public static Texture2D LoadTGA(string fileName)
{
using FileStream tGAStream = File.OpenRead(fileName);
return LoadTGA(tGAStream);
}
public static Texture2D LoadDDSManual(string ddsPath)
{
//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
//IL_00ec: Expected O, but got Unknown
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
//IL_00ae: Expected O, but got Unknown
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
try
{
byte[] array = File.ReadAllBytes(ddsPath);
byte b = array[4];
if (b != 124)
{
throw new Exception("Invalid DDS DXTn texture. Unable to read");
}
int num = array[13] * 256 + array[12];
int num2 = array[17] * 256 + array[16];
byte b2 = array[87];
TextureFormat val = (TextureFormat)12;
if (b2 == 49)
{
val = (TextureFormat)10;
}
if (b2 == 53)
{
val = (TextureFormat)12;
}
int num3 = 128;
byte[] array2 = new byte[array.Length - num3];
Buffer.BlockCopy(array, num3, array2, 0, array.Length - num3);
FileInfo fileInfo = new FileInfo(ddsPath);
Texture2D val2 = new Texture2D(num2, num, val, false);
val2.LoadRawTextureData(array2);
val2.Apply();
((Object)val2).name = fileInfo.Name;
return val2;
}
catch (Exception)
{
Debug.LogError((object)"Error: Could not load DDS");
return new Texture2D(8, 8);
}
}
public static void SetNormalMap(ref Texture2D tex)
{
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
Color[] pixels = tex.GetPixels();
for (int i = 0; i < pixels.Length; i++)
{
Color val = pixels[i];
val.r = pixels[i].g;
val.a = pixels[i].r;
pixels[i] = val;
}
tex.SetPixels(pixels);
}
public static Texture2D LoadTexture(string fn, bool normalMap = false)
{
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Expected O, but got Unknown
if (!File.Exists(fn))
{
return null;
}
string text = Path.GetExtension(fn).ToLower();
if (text == ".png" || text == ".jpg")
{
Texture2D tex = new Texture2D(1, 1);
ImageConversion.LoadImage(tex, File.ReadAllBytes(fn));
if (normalMap)
{
SetNormalMap(ref tex);
}
return tex;
}
if (text == ".dds")
{
Texture2D tex2 = LoadDDSManual(fn);
if (normalMap)
{
SetNormalMap(ref tex2);
}
return tex2;
}
if (text == ".tga")
{
Texture2D tex3 = LoadTGA(fn);
if (normalMap)
{
SetNormalMap(ref tex3);
}
return tex3;
}
Debug.Log((object)("texture not supported : " + fn));
return null;
}
public static Texture2D LoadTGA(Stream TGAStream)
{
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Expected O, but got Unknown
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
using BinaryReader binaryReader = new BinaryReader(TGAStream);
binaryReader.BaseStream.Seek(12L, SeekOrigin.Begin);
short num = binaryReader.ReadInt16();
short num2 = binaryReader.ReadInt16();
int num3 = binaryReader.ReadByte();
binaryReader.BaseStream.Seek(1L, SeekOrigin.Current);
Texture2D val = new Texture2D((int)num, (int)num2);
Color32[] array = (Color32[])(object)new Color32[num * num2];
switch (num3)
{
case 32:
{
for (int j = 0; j < num * num2; j++)
{
byte b4 = binaryReader.ReadByte();
byte b5 = binaryReader.ReadByte();
byte b6 = binaryReader.ReadByte();
byte b7 = binaryReader.ReadByte();
array[j] = new Color32(b6, b5, b4, b7);
}
break;
}
case 24:
{
for (int i = 0; i < num * num2; i++)
{
byte b = binaryReader.ReadByte();
byte b2 = binaryReader.ReadByte();
byte b3 = binaryReader.ReadByte();
array[i] = new Color32(b3, b2, b, (byte)1);
}
break;
}
default:
throw new Exception("TGA texture had non 32/24 bit depth.");
}
val.SetPixels32(array);
val.Apply();
return val;
}
}
namespace CustomMeshes;
[BepInPlugin("cjayride.CustomMeshes", "Custom Meshes", "0.4.1")]
public class BepInExPlugin : BaseUnityPlugin
{
[HarmonyPatch(typeof(ZNetScene), "Awake")]
private static class ZNetScene_Awake_Patch
{
private static void Postfix()
{
}
}
[HarmonyPatch(typeof(ItemDrop), "Awake")]
private static class ItemDrop_Patch
{
private static void Postfix(ItemDrop __instance)
{
ItemData itemData = __instance.m_itemData;
object obj;
if (itemData == null)
{
obj = null;
}
else
{
GameObject dropPrefab = itemData.m_dropPrefab;
obj = ((dropPrefab != null) ? ((Object)dropPrefab).name : null);
}
string text = (string)obj;
if (text == null || !customMeshes.ContainsKey(text))
{
return;
}
MeshFilter[] componentsInChildren = __instance.m_itemData.m_dropPrefab.GetComponentsInChildren<MeshFilter>(true);
MeshFilter[] array = componentsInChildren;
foreach (MeshFilter val in array)
{
string name = ((Object)((Component)((Component)val).transform.parent).gameObject).name;
Dbgl("got mesh filter, item name: " + text + ", obj: " + name + ", mf: " + ((Object)val).name);
if (text == GetPrefabName(name) && customMeshes[text].ContainsKey(((Object)val).name) && customMeshes[text][((Object)val).name].ContainsKey(((Object)val).name))
{
Dbgl("replacing item mesh " + ((Object)val).name);
val.mesh = customMeshes[text][((Object)val).name][((Object)val).name].mesh;
}
else if (customMeshes[text].ContainsKey(name) && customMeshes[text][name].ContainsKey(((Object)val).name))
{
Dbgl("replacing attached mesh " + ((Object)val).name);
val.mesh = customMeshes[text][name][((Object)val).name].mesh;
}
}
SkinnedMeshRenderer[] componentsInChildren2 = __instance.m_itemData.m_dropPrefab.GetComponentsInChildren<SkinnedMeshRenderer>(true);
SkinnedMeshRenderer[] array2 = componentsInChildren2;
foreach (SkinnedMeshRenderer val2 in array2)
{
string name2 = ((Object)((Component)((Component)val2).transform.parent).gameObject).name;
Dbgl("got skinned mesh renderer, item name: " + text + ", obj: " + name2 + ", smr: " + ((Object)val2).name);
if (text == GetPrefabName(name2) && customMeshes[text].ContainsKey(((Object)val2).name) && customMeshes[text][((Object)val2).name].ContainsKey(((Object)val2).name))
{
Dbgl("replacing item mesh " + ((Object)val2).name);
val2.sharedMesh = customMeshes[text][((Object)val2).name][((Object)val2).name].mesh;
}
else if (customMeshes[text].ContainsKey(name2) && customMeshes[text][name2].ContainsKey(((Object)val2).name))
{
Dbgl("replacing attached mesh " + ((Object)val2).name);
val2.sharedMesh = customMeshes[text][name2][((Object)val2).name].mesh;
}
}
}
}
[HarmonyPatch(typeof(Piece), "Awake")]
private static class Piece_Patch
{
private static void Postfix(Piece __instance)
{
string prefabName = GetPrefabName(((Object)((Component)__instance).gameObject).name);
MeshFilter[] componentsInChildren = ((Component)__instance).gameObject.GetComponentsInChildren<MeshFilter>(true);
if (!customMeshes.ContainsKey(prefabName))
{
return;
}
MeshFilter[] array = componentsInChildren;
foreach (MeshFilter val in array)
{
string name = ((Object)((Component)((Component)val).transform.parent).gameObject).name;
if (customMeshes[prefabName].ContainsKey(name) && customMeshes[prefabName][name].ContainsKey(((Object)val).name))
{
val.mesh = customMeshes[prefabName][name][((Object)val).name].mesh;
}
}
}
}
[HarmonyPatch(typeof(VisEquipment), "Awake")]
private static class Awake_Patch
{
private static void Postfix(VisEquipment __instance)
{
Dbgl("Vis Awake .");
if (!__instance.m_isPlayer || __instance.m_models.Length == 0)
{
return;
}
Dbgl("Checking for custom player models.");
if (!customMeshes.ContainsKey("player"))
{
return;
}
Dbgl("Has player.");
if (!customMeshes["player"].ContainsKey("model"))
{
return;
}
Dbgl("Has player model.");
SkinnedMeshRenderer val = null;
if (customMeshes["player"]["model"].ContainsKey("0"))
{
Dbgl("Replacing player model 0 with imported mesh.");
CustomMeshData customMeshData = customMeshes["player"]["model"]["0"];
__instance.m_models[0].m_mesh = customMeshData.mesh;
val = customMeshData.renderer;
}
if (customMeshes["player"]["model"].ContainsKey("1"))
{
Dbgl("Replacing player model 1 with imported mesh.");
CustomMeshData customMeshData2 = customMeshes["player"]["model"]["1"];
__instance.m_models[1].m_mesh = customMeshData2.mesh;
val = customMeshData2.renderer;
}
if (!((Object)(object)val != (Object)null))
{
return;
}
Transform parent = __instance.m_bodyModel.rootBone.parent;
Dbgl("Setting up new bones array");
Transform[] array = (Transform[])(object)new Transform[val.bones.Length];
for (int i = 0; i < array.Length; i++)
{
array[i] = RecursiveFind(parent, ((Object)val.bones[i]).name);
if ((Object)(object)array[i] == (Object)null)
{
Dbgl("Could not find existing bone " + ((Object)val.bones[i]).name);
}
}
__instance.m_bodyModel.bones = array;
}
}
[HarmonyPatch(typeof(InventoryGui), "SetupDragItem")]
private static class SetupDragItem_Patch
{
private static void Postfix(ItemData item)
{
if (item != null)
{
string name = ((Object)item.m_dropPrefab).name;
MeshFilter[] componentsInChildren = item.m_dropPrefab.GetComponentsInChildren<MeshFilter>();
MeshFilter[] array = componentsInChildren;
foreach (MeshFilter val in array)
{
Dbgl("dragging item name: " + name + ", mf: " + ((Object)val).name);
}
}
}
}
[HarmonyPatch(typeof(Player), "Awake")]
private static class Player_Awake_Patch
{
private static void Postfix(Player __instance)
{
}
}
[HarmonyPatch(typeof(Terminal), "InputText")]
private static class InputText_Patch
{
private static bool Prefix(Terminal __instance)
{
if (!modEnabled.Value)
{
return true;
}
return true;
}
}
private static Dictionary<string, Dictionary<string, Dictionary<string, CustomMeshData>>> customMeshes = new Dictionary<string, Dictionary<string, Dictionary<string, CustomMeshData>>>();
private static Dictionary<string, AssetBundle> customAssetBundles = new Dictionary<string, AssetBundle>();
private static Dictionary<string, Dictionary<string, Dictionary<string, GameObject>>> customGameObjects = new Dictionary<string, Dictionary<string, Dictionary<string, GameObject>>>();
private static BepInExPlugin context;
public static ConfigEntry<bool> modEnabled;
public static ConfigEntry<bool> isDebug;
public static Mesh customMesh { get; set; }
public static void Dbgl(string str = "", bool pref = true)
{
if (isDebug.Value)
{
Debug.Log((object)((pref ? (typeof(BepInExPlugin).Namespace + " ") : "") + str));
}
}
private void Awake()
{
context = this;
modEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enabled", true, "Enable this mod");
isDebug = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "IsDebug", false, "Enable debug");
if (modEnabled.Value)
{
SceneManager.sceneLoaded += SceneManager_sceneLoaded;
Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null);
}
}
private void Update()
{
if (!Input.GetKeyDown((KeyCode)117))
{
}
}
private void SceneManager_sceneLoaded(Scene arg0, LoadSceneMode arg1)
{
PreloadMeshes();
}
private static void PreloadMeshes()
{
foreach (AssetBundle value in customAssetBundles.Values)
{
value.Unload(true);
}
customMeshes.Clear();
customGameObjects.Clear();
customAssetBundles.Clear();
Dbgl("Importing meshes");
string path = Path.Combine(Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath), "CustomMeshes");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
return;
}
string[] directories = Directory.GetDirectories(path);
foreach (string path2 in directories)
{
string fileName = Path.GetFileName(path2);
Dbgl("Importing meshes: " + fileName);
customMeshes[fileName] = new Dictionary<string, Dictionary<string, CustomMeshData>>();
customGameObjects[fileName] = new Dictionary<string, Dictionary<string, GameObject>>();
string[] directories2 = Directory.GetDirectories(path2);
foreach (string path3 in directories2)
{
string fileName2 = Path.GetFileName(path3);
Dbgl("Importing meshes: " + fileName + "\\" + fileName2);
customMeshes[fileName][fileName2] = new Dictionary<string, CustomMeshData>();
customGameObjects[fileName][fileName2] = new Dictionary<string, GameObject>();
string[] files = Directory.GetFiles(path3);
foreach (string text in files)
{
try
{
SkinnedMeshRenderer val = null;
Mesh val2 = null;
Dbgl("Importing " + text + " " + Path.GetFileNameWithoutExtension(text) + " " + Path.GetFileName(text) + " " + Path.GetExtension(text).ToLower());
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(text);
if (fileNameWithoutExtension == Path.GetFileName(text))
{
AssetBundle val3 = AssetBundle.LoadFromFile(text);
customAssetBundles.Add(fileNameWithoutExtension, val3);
GameObject val4 = val3.LoadAsset<GameObject>("Player");
if ((Object)(object)val4 != (Object)null)
{
val = val4.GetComponentInChildren<SkinnedMeshRenderer>();
if ((Object)(object)val != (Object)null)
{
val2 = val.sharedMesh;
Dbgl("Importing " + text + " asset bundle as player");
}
else
{
Dbgl($"No SkinnedMeshRenderer on {val4}");
}
if ((Object)(object)val2 == (Object)null)
{
val2 = val3.LoadAsset<Mesh>("body");
}
}
else
{
val2 = val3.LoadAsset<Mesh>("body");
if ((Object)(object)val2 != (Object)null)
{
Dbgl("Importing " + text + " asset bundle as mesh");
}
else
{
Dbgl("Failed to find body");
}
}
}
else if (Path.GetExtension(text).ToLower() == ".fbx")
{
GameObject val5 = MeshImporter.Load(text);
object obj;
if (val5 == null)
{
obj = null;
}
else
{
Transform obj2 = val5.transform.Find("Player");
if (obj2 == null)
{
obj = null;
}
else
{
Transform obj3 = obj2.Find("Visual");
obj = ((obj3 != null) ? ((Component)obj3).gameObject : null);
}
}
GameObject val6 = (GameObject)obj;
val2 = val5.GetComponentInChildren<MeshFilter>().mesh;
if ((Object)(object)val6 != (Object)null)
{
val = val6.GetComponentInChildren<SkinnedMeshRenderer>();
}
if ((Object)(object)val2 != (Object)null)
{
if ((Object)(object)val != (Object)null)
{
Dbgl("Importing " + text + " fbx as player");
}
else
{
Dbgl("Importing " + text + " fbx as mesh");
}
}
}
else if (Path.GetExtension(text).ToLower() == ".obj")
{
val2 = new ObjImporter().ImportFile(text);
if ((Object)(object)val2 != (Object)null)
{
Dbgl("Imported " + text + " obj as mesh");
}
}
if ((Object)(object)val2 != (Object)null)
{
customMeshes[fileName][fileName2].Add(fileNameWithoutExtension, new CustomMeshData(fileName, fileNameWithoutExtension, val2, val));
Dbgl("Added mesh data to customMeshes[" + fileName + "][" + fileName2 + "][" + fileNameWithoutExtension + "]");
}
}
catch
{
}
}
}
}
}
private static string GetPrefabName(string name)
{
char[] anyOf = new char[2] { '(', ' ' };
int num = name.IndexOfAny(anyOf);
if (num >= 0)
{
return name.Substring(0, num);
}
return name;
}
private static Transform RecursiveFind(Transform parent, string childName)
{
Transform val = null;
for (int i = 0; i < parent.childCount; i++)
{
val = parent.GetChild(i);
if (((Object)val).name == childName)
{
break;
}
val = RecursiveFind(val, childName);
if ((Object)(object)val != (Object)null)
{
break;
}
}
return val;
}
}
internal class CustomMeshData
{
public string objName;
public string meshName;
public Mesh mesh;
public SkinnedMeshRenderer renderer;
public CustomMeshData(string dirName, string name, Mesh mesh, SkinnedMeshRenderer renderer = null)
{
objName = dirName;
meshName = name;
this.mesh = mesh;
this.renderer = renderer;
}
}
internal class MeshMaterialBinding
{
private string meshName;
private Mesh mesh;
private Material material;
public Mesh Mesh => mesh;
public Material Material => material;
public string MeshName => meshName;
private MeshMaterialBinding()
{
}
public MeshMaterialBinding(string meshName, Mesh mesh, Material material)
{
this.meshName = meshName;
this.mesh = mesh;
this.material = material;
}
}
public class MeshImporter
{
public static GameObject Load(string meshPath, float scaleX = 1f, float scaleY = 1f, float scaleZ = 1f)
{
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Expected O, but got Unknown
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Expected O, but got Unknown
//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
//IL_0103: Unknown result type (might be due to invalid IL or missing references)
//IL_010f: Unknown result type (might be due to invalid IL or missing references)
//IL_011b: Unknown result type (might be due to invalid IL or missing references)
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
//IL_013d: Unknown result type (might be due to invalid IL or missing references)
//IL_03fe: Unknown result type (might be due to invalid IL or missing references)
//IL_0405: Expected O, but got Unknown
//IL_021a: Unknown result type (might be due to invalid IL or missing references)
//IL_021f: Unknown result type (might be due to invalid IL or missing references)
//IL_0224: Unknown result type (might be due to invalid IL or missing references)
//IL_022c: Unknown result type (might be due to invalid IL or missing references)
//IL_0233: Unknown result type (might be due to invalid IL or missing references)
//IL_023a: Unknown result type (might be due to invalid IL or missing references)
//IL_0282: Unknown result type (might be due to invalid IL or missing references)
//IL_0287: Unknown result type (might be due to invalid IL or missing references)
//IL_028c: Unknown result type (might be due to invalid IL or missing references)
//IL_0294: Unknown result type (might be due to invalid IL or missing references)
//IL_029b: Unknown result type (might be due to invalid IL or missing references)
//IL_02a2: Unknown result type (might be due to invalid IL or missing references)
//IL_03bf: Unknown result type (might be due to invalid IL or missing references)
//IL_03c4: Unknown result type (might be due to invalid IL or missing references)
//IL_03c9: Unknown result type (might be due to invalid IL or missing references)
//IL_03d0: Unknown result type (might be due to invalid IL or missing references)
//IL_03d7: Unknown result type (might be due to invalid IL or missing references)
if (!File.Exists(meshPath))
{
return null;
}
AssimpContext val = new AssimpContext();
Scene val2 = val.ImportFile(meshPath);
if (val2 == null)
{
return null;
}
string fullName = Directory.GetParent(meshPath).FullName;
List<Material> list = new List<Material>();
if (val2.HasMaterials)
{
Color color = default(Color);
Color val4 = default(Color);
foreach (Material material in val2.Materials)
{
Material val3 = new Material(Shader.Find("Standard"));
if (material.HasColorDiffuse)
{
((Color)(ref color))..ctor(material.ColorDiffuse.R, material.ColorDiffuse.G, material.ColorDiffuse.B, material.ColorDiffuse.A);
val3.color = color;
}
if (material.HasColorEmissive)
{
((Color)(ref val4))..ctor(material.ColorEmissive.R, material.ColorEmissive.G, material.ColorEmissive.B, material.ColorEmissive.A);
val3.SetColor("_EmissionColor", val4);
val3.EnableKeyword("_EMISSION");
}
if (material.HasReflectivity)
{
val3.SetFloat("_Glossiness", material.Reflectivity);
}
bool flag = false;
list.Add(val3);
}
}
List<MeshMaterialBinding> uMeshAndMats = new List<MeshMaterialBinding>();
if (val2.HasMeshes)
{
foreach (Mesh mesh in val2.Meshes)
{
List<Vector3> list2 = new List<Vector3>();
List<Vector3> list3 = new List<Vector3>();
List<Vector2> list4 = new List<Vector2>();
List<int> list5 = new List<int>();
if (mesh.HasVertices)
{
foreach (Vector3D vertex in mesh.Vertices)
{
list2.Add(new Vector3(0f - vertex.X, vertex.Y, vertex.Z));
}
}
if (mesh.HasNormals)
{
foreach (Vector3D normal in mesh.Normals)
{
list3.Add(new Vector3(0f - normal.X, normal.Y, normal.Z));
}
}
if (mesh.HasFaces)
{
foreach (Face face in mesh.Faces)
{
if (face.IndexCount != 1 && face.IndexCount != 2)
{
for (int i = 0; i < face.IndexCount - 2; i++)
{
list5.Add(face.Indices[i + 2]);
list5.Add(face.Indices[i + 1]);
list5.Add(face.Indices[0]);
}
}
}
}
if (mesh.HasTextureCoords(0))
{
foreach (Vector3D item in mesh.TextureCoordinateChannels[0])
{
list4.Add(new Vector2(item.X, item.Y));
}
}
Mesh val5 = new Mesh();
val5.vertices = list2.ToArray();
val5.normals = list3.ToArray();
val5.triangles = list5.ToArray();
val5.uv = list4.ToArray();
uMeshAndMats.Add(new MeshMaterialBinding(mesh.Name, val5, list[mesh.MaterialIndex]));
}
}
return NodeToGameObject(val2.RootNode);
GameObject NodeToGameObject(Node node)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_000d: Expected O, but got Unknown
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
//IL_011e: Unknown result type (might be due to invalid IL or missing references)
//IL_0124: Unknown result type (might be due to invalid IL or missing references)
//IL_012a: Unknown result type (might be due to invalid IL or missing references)
//IL_0130: Unknown result type (might be due to invalid IL or missing references)
//IL_013d: Unknown result type (might be due to invalid IL or missing references)
//IL_0142: Unknown result type (might be due to invalid IL or missing references)
//IL_014a: Unknown result type (might be due to invalid IL or missing references)
//IL_0150: Unknown result type (might be due to invalid IL or missing references)
//IL_0156: Unknown result type (might be due to invalid IL or missing references)
//IL_015c: Unknown result type (might be due to invalid IL or missing references)
//IL_016d: Unknown result type (might be due to invalid IL or missing references)
//IL_0173: Unknown result type (might be due to invalid IL or missing references)
//IL_0179: Unknown result type (might be due to invalid IL or missing references)
//IL_017f: Unknown result type (might be due to invalid IL or missing references)
//IL_0190: Unknown result type (might be due to invalid IL or missing references)
//IL_0197: Unknown result type (might be due to invalid IL or missing references)
//IL_019f: Unknown result type (might be due to invalid IL or missing references)
//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Expected O, but got Unknown
//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
GameObject val6 = new GameObject(node.Name);
if (node.HasMeshes)
{
foreach (int meshIndex in node.MeshIndices)
{
MeshMaterialBinding meshMaterialBinding = uMeshAndMats[meshIndex];
GameObject val7 = new GameObject(meshMaterialBinding.MeshName);
val7.AddComponent<MeshFilter>();
val7.AddComponent<MeshRenderer>();
val7.AddComponent<MeshCollider>();
val7.GetComponent<MeshFilter>().mesh = meshMaterialBinding.Mesh;
((Renderer)val7.GetComponent<MeshRenderer>()).material = meshMaterialBinding.Material;
val7.transform.SetParent(val6.transform, true);
val7.transform.localScale = new Vector3(scaleX, scaleY, scaleZ);
}
}
Vector3D val8 = default(Vector3D);
Quaternion val9 = default(Quaternion);
Vector3D val10 = default(Vector3D);
Matrix4x4 transform = node.Transform;
((Matrix4x4)(ref transform)).Decompose(ref val8, ref val9, ref val10);
Quaternion val11 = default(Quaternion);
((Quaternion)(ref val11))..ctor(val9.X, val9.Y, val9.Z, val9.W);
Vector3 eulerAngles = ((Quaternion)(ref val11)).eulerAngles;
val6.transform.localScale = new Vector3(val8.X, val8.Y, val8.Z);
val6.transform.localPosition = new Vector3(val10.X, val10.Y, val10.Z);
val6.transform.localRotation = Quaternion.Euler(eulerAngles.x, 0f - eulerAngles.y, eulerAngles.z);
if (node.HasChildren)
{
foreach (Node child in node.Children)
{
GameObject val12 = NodeToGameObject(child);
val12.transform.SetParent(val6.transform, false);
}
}
return val6;
}
}
}
public class ObjImporter
{
private struct meshStruct
{
public Vector3[] vertices;
public Vector3[] normals;
public Vector2[] uv;
public Vector2[] uv1;
public Vector2[] uv2;
public int[] triangles;
public int[] faceVerts;
public int[] faceUVs;
public Vector3[] faceData;
public string name;
public string fileName;
}
public Mesh ImportFile(string filePath)
{
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_00fe: Expected O, but got Unknown
//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
//IL_00da: Unknown result type (might be due to invalid IL or missing references)
meshStruct mesh = createMeshStruct(filePath);
populateMeshStruct(ref mesh);
Vector3[] array = (Vector3[])(object)new Vector3[mesh.faceData.Length];
Vector2[] array2 = (Vector2[])(object)new Vector2[mesh.faceData.Length];
Vector3[] array3 = (Vector3[])(object)new Vector3[mesh.faceData.Length];
int num = 0;
Vector3[] faceData = mesh.faceData;
foreach (Vector3 val in faceData)
{
array[num] = mesh.vertices[(int)val.x - 1];
if (val.y >= 1f)
{
array2[num] = mesh.uv[(int)val.y - 1];
}
if (val.z >= 1f)
{
array3[num] = mesh.normals[(int)val.z - 1];
}
num++;
}
Mesh val2 = new Mesh();
val2.vertices = array;
val2.uv = array2;
val2.normals = array3;
val2.triangles = mesh.triangles;
val2.RecalculateBounds();
val2.Optimize();
return val2;
}
private static meshStruct createMeshStruct(string filename)
{
int num = 0;
int num2 = 0;
int num3 = 0;
int num4 = 0;
int num5 = 0;
meshStruct result = default(meshStruct);
result.fileName = filename;
StreamReader streamReader = File.OpenText(filename);
string s = streamReader.ReadToEnd();
streamReader.Close();
using (StringReader stringReader = new StringReader(s))
{
string text = stringReader.ReadLine();
char[] separator = new char[1] { ' ' };
while (text != null)
{
if (!text.StartsWith("f ") && !text.StartsWith("v ") && !text.StartsWith("vt ") && !text.StartsWith("vn "))
{
text = stringReader.ReadLine();
if (text != null)
{
text = text.Replace(" ", " ");
}
continue;
}
text = text.Trim();
string[] array = text.Split(separator, 50);
switch (array[0])
{
case "v":
num2++;
break;
case "vt":
num3++;
break;
case "vn":
num4++;
break;
case "f":
num5 = num5 + array.Length - 1;
num += 3 * (array.Length - 2);
break;
}
text = stringReader.ReadLine();
if (text != null)
{
text = text.Replace(" ", " ");
}
}
}
result.triangles = new int[num];
result.vertices = (Vector3[])(object)new Vector3[num2];
result.uv = (Vector2[])(object)new Vector2[num3];
result.normals = (Vector3[])(object)new Vector3[num4];
result.faceData = (Vector3[])(object)new Vector3[num5];
return result;
}
private static void populateMeshStruct(ref meshStruct mesh)
{
//IL_03b8: Unknown result type (might be due to invalid IL or missing references)
//IL_03bd: Unknown result type (might be due to invalid IL or missing references)
//IL_0389: Unknown result type (might be due to invalid IL or missing references)
//IL_038e: Unknown result type (might be due to invalid IL or missing references)
//IL_03f0: Unknown result type (might be due to invalid IL or missing references)
//IL_03f5: Unknown result type (might be due to invalid IL or missing references)
//IL_032b: Unknown result type (might be due to invalid IL or missing references)
//IL_0330: Unknown result type (might be due to invalid IL or missing references)
//IL_035a: Unknown result type (might be due to invalid IL or missing references)
//IL_035f: Unknown result type (might be due to invalid IL or missing references)
//IL_041c: Unknown result type (might be due to invalid IL or missing references)
//IL_0497: Unknown result type (might be due to invalid IL or missing references)
//IL_0499: Unknown result type (might be due to invalid IL or missing references)
StreamReader streamReader = File.OpenText(mesh.fileName);
string s = streamReader.ReadToEnd();
streamReader.Close();
using StringReader stringReader = new StringReader(s);
string text = stringReader.ReadLine();
char[] separator = new char[1] { ' ' };
char[] separator2 = new char[1] { '/' };
int num = 0;
int num2 = 0;
int num3 = 0;
int num4 = 0;
int num5 = 0;
int num6 = 0;
int num7 = 0;
while (text != null)
{
if (!text.StartsWith("f ") && !text.StartsWith("v ") && !text.StartsWith("vt ") && !text.StartsWith("vn ") && !text.StartsWith("g ") && !text.StartsWith("usemtl ") && !text.StartsWith("mtllib ") && !text.StartsWith("vt1 ") && !text.StartsWith("vt2 ") && !text.StartsWith("vc ") && !text.StartsWith("usemap "))
{
text = stringReader.ReadLine();
if (text != null)
{
text = text.Replace(" ", " ");
}
continue;
}
text = text.Trim();
string[] array = text.Split(separator, 50);
switch (array[0])
{
case "v":
mesh.vertices[num3] = new Vector3(Convert.ToSingle(array[1]), Convert.ToSingle(array[2]), Convert.ToSingle(array[3]));
num3++;
break;
case "vt":
mesh.uv[num5] = new Vector2(Convert.ToSingle(array[1]), Convert.ToSingle(array[2]));
num5++;
break;
case "vt1":
mesh.uv[num6] = new Vector2(Convert.ToSingle(array[1]), Convert.ToSingle(array[2]));
num6++;
break;
case "vt2":
mesh.uv[num7] = new Vector2(Convert.ToSingle(array[1]), Convert.ToSingle(array[2]));
num7++;
break;
case "vn":
mesh.normals[num4] = new Vector3(Convert.ToSingle(array[1]), Convert.ToSingle(array[2]), Convert.ToSingle(array[3]));
num4++;
break;
case "f":
{
int num8 = 1;
List<int> list = new List<int>();
while (num8 < array.Length && (array[num8] ?? "").Length > 0)
{
Vector3 val = default(Vector3);
string[] array2 = array[num8].Split(separator2, 3);
val.x = Convert.ToInt32(array2[0]);
if (array2.Length > 1)
{
if (array2[1] != "")
{
val.y = Convert.ToInt32(array2[1]);
}
val.z = Convert.ToInt32(array2[2]);
}
num8++;
mesh.faceData[num2] = val;
list.Add(num2);
num2++;
}
for (num8 = 1; num8 + 2 < array.Length; num8++)
{
mesh.triangles[num] = list[0];
num++;
mesh.triangles[num] = list[num8];
num++;
mesh.triangles[num] = list[num8 + 1];
num++;
}
break;
}
}
text = stringReader.ReadLine();
if (text != null)
{
text = text.Replace(" ", " ");
}
}
}
}