Decompiled source of Tablet Display v1.2.0

Tablet_Display.dll

Decompiled 4 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using FistVR;
using HarmonyLib;
using OtherLoader;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
namespace Packer.Tablet_Display
{
	[BepInPlugin("Packer.Tablet_Display", "Tablet_Display", "1.2.0")]
	[BepInProcess("h3vr.exe")]
	[Description("Built with MeatKit")]
	[BepInDependency("h3vr.otherloader", "1.3.0")]
	public class Tablet_DisplayPlugin : BaseUnityPlugin
	{
		private static readonly string BasePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

		internal static ManualLogSource Logger;

		private void Awake()
		{
			Logger = ((BaseUnityPlugin)this).Logger;
			LoadAssets();
		}

		private void LoadAssets()
		{
			Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "Packer.Tablet_Display");
			OtherLoader.RegisterDirectLoad(BasePath, "Packer.Tablet_Display", "", "", "packer.tabletdisplay", "");
		}
	}
}
namespace Packer
{
	public class CameraDisplay : MonoBehaviour
	{
		[SerializeField]
		private Camera displayCamera;

		private RenderTexture renderTexture;

		private Camera targetCamera;

		[SerializeField]
		private Texture2D offlineTexture;

		public List<Camera> cameras = new List<Camera>();

		public int index = 0;

		private Material renderMaterial;

		private FVRPhysicalObject physObject;

		[SerializeField]
		private Transform offset;

		[SerializeField]
		private MeshRenderer meshRenderer;

		private Quaternion offsetDefault;

		private bool quickbeltUpdate = false;

		public FVRPointableButton[] buttons;

		public Text cameraName;

		public GameObject crosshair;

		private bool preState = true;

		private void Start()
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Expected O, but got Unknown
			renderTexture = new RenderTexture(1024, 1024, 16, (RenderTextureFormat)0);
			((Object)renderTexture).name = "DisplayRender";
			displayCamera.targetTexture = renderTexture;
			((Renderer)meshRenderer).materials[1] = renderMaterial;
		}

		private void SetCameraAtIndex()
		{
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			targetCamera = cameras[index];
			displayCamera.farClipPlane = targetCamera.farClipPlane;
			cameraName.text = ((Object)((Component)cameras[index]).transform).name + " " + index;
			SM.PlayGlobalUISound((GlobalUISound)0, ((Component)GM.CurrentPlayerBody).transform.position);
		}

		private void OnEnable()
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			physObject = ((Component)this).GetComponent<FVRPhysicalObject>();
			renderMaterial = ((Renderer)meshRenderer).materials[1];
			offsetDefault = offset.localRotation;
		}

		private void Update()
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: 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_0195: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)targetCamera) && ((Behaviour)displayCamera).enabled)
			{
				((Component)displayCamera).transform.SetPositionAndRotation(((Component)targetCamera).transform.position, ((Component)targetCamera).transform.rotation);
				if (((Behaviour)targetCamera).enabled)
				{
					displayCamera.fov = targetCamera.fov;
					displayCamera.fieldOfView = targetCamera.fieldOfView;
				}
			}
			if ((Object)(object)physObject.QuickbeltSlot != (Object)null && !((FVRInteractiveObject)physObject).IsHeld)
			{
				offset.LookAt(GM.CurrentPlayerBody.Head, Vector3.up);
				if (quickbeltUpdate)
				{
					preState = ((Component)buttons[0]).gameObject.activeSelf;
					for (int i = 0; i < buttons.Length; i++)
					{
						((Component)buttons[i]).gameObject.SetActive(false);
					}
					quickbeltUpdate = false;
				}
			}
			else if (!quickbeltUpdate)
			{
				offset.localRotation = offsetDefault;
				quickbeltUpdate = true;
				for (int j = 0; j < buttons.Length; j++)
				{
					((Component)buttons[j]).gameObject.SetActive(preState);
				}
				if (offset.localScale.x < 0.2f)
				{
					ResetScale();
				}
			}
		}

		public void AdjustScale(float amount)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			if (amount < 0f && offset.localScale.x > 0.2f)
			{
				Transform obj = offset;
				obj.localScale += new Vector3(amount, amount, amount);
			}
			else
			{
				if (!(amount > 0f) || !(offset.localScale.x < 2f))
				{
					SM.PlayGlobalUISound((GlobalUISound)1, ((Component)GM.CurrentPlayerBody).transform.position);
					return;
				}
				Transform obj2 = offset;
				obj2.localScale += new Vector3(amount, amount, amount);
			}
			SM.PlayGlobalUISound((GlobalUISound)0, ((Component)GM.CurrentPlayerBody).transform.position);
		}

		public void AdjustWidth(float amount)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: 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_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			if (amount < 0f && offset.localScale.x > 0.3f)
			{
				Transform obj = offset;
				obj.localScale += new Vector3(amount, 0f, 0f);
			}
			else
			{
				if (!(amount > 0f) || !(offset.localScale.x < 1.9f))
				{
					SM.PlayGlobalUISound((GlobalUISound)1, ((Component)GM.CurrentPlayerBody).transform.position);
					return;
				}
				Transform obj2 = offset;
				obj2.localScale += new Vector3(amount, 0f, 0f);
			}
			SM.PlayGlobalUISound((GlobalUISound)0, ((Component)GM.CurrentPlayerBody).transform.position);
		}

		public void ToggleCrosshair()
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			crosshair.SetActive(!crosshair.activeSelf);
			SM.PlayGlobalUISound((GlobalUISound)0, ((Component)GM.CurrentPlayerBody).transform.position);
		}

		public void ToggleUI()
		{
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			for (int i = 0; i < buttons.Length; i++)
			{
				((Component)buttons[i]).gameObject.SetActive(!((Component)buttons[i]).gameObject.activeSelf);
			}
			SM.PlayGlobalUISound((GlobalUISound)0, ((Component)GM.CurrentPlayerBody).transform.position);
		}

		public void ResetScale()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			offset.localScale = Vector3.one;
			SM.PlayGlobalUISound((GlobalUISound)0, ((Component)GM.CurrentPlayerBody).transform.position);
		}

		public void ToggleOnCamera()
		{
			//IL_0029: 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_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			if (((Behaviour)displayCamera).enabled)
			{
				((Behaviour)displayCamera).enabled = false;
				((Component)displayCamera).transform.position = Vector3.zero;
				((Component)displayCamera).transform.rotation = Quaternion.identity;
				renderMaterial.SetTexture("_MainTex", (Texture)(object)offlineTexture);
			}
			else if (cameras.Count > 0 && index < cameras.Count && Object.op_Implicit((Object)(object)cameras[index]))
			{
				((Behaviour)displayCamera).enabled = true;
				renderMaterial.SetTexture("_MainTex", (Texture)(object)renderTexture);
				SM.PlayGlobalUISound((GlobalUISound)0, ((Component)GM.CurrentPlayerBody).transform.position);
				return;
			}
			SM.PlayGlobalUISound((GlobalUISound)1, ((Component)GM.CurrentPlayerBody).transform.position);
		}

		public void RemoveCurrentCamera()
		{
			//IL_0033: 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)
			if (cameras.Count == 0 || index >= cameras.Count)
			{
				SM.PlayGlobalUISound((GlobalUISound)1, ((Component)GM.CurrentPlayerBody).transform.position);
				return;
			}
			cameras.RemoveAt(index);
			if (cameras.Count == 0)
			{
				cameraName.text = "Awaiting Cameras";
				((Behaviour)displayCamera).enabled = false;
				renderMaterial.SetTexture("_MainTex", (Texture)(object)offlineTexture);
				SM.PlayGlobalUISound((GlobalUISound)1, ((Component)GM.CurrentPlayerBody).transform.position);
			}
			else
			{
				if (index > 0)
				{
					index--;
				}
				else
				{
					index = 0;
				}
				SetCameraAtIndex();
			}
		}

		public void NextCamera()
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			if (cameras.Count == 0)
			{
				SM.PlayGlobalUISound((GlobalUISound)1, ((Component)GM.CurrentPlayerBody).transform.position);
				return;
			}
			if (index + 1 >= cameras.Count)
			{
				index = 0;
			}
			else
			{
				index++;
			}
			if ((Object)(object)cameras[index] == (Object)null)
			{
				SM.PlayGlobalUISound((GlobalUISound)1, ((Component)GM.CurrentPlayerBody).transform.position);
			}
			else
			{
				SetCameraAtIndex();
			}
		}

		public void PrevCamera()
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			if (cameras.Count == 0)
			{
				SM.PlayGlobalUISound((GlobalUISound)1, ((Component)GM.CurrentPlayerBody).transform.position);
				return;
			}
			if (index - 1 < 0)
			{
				index = cameras.Count - 1;
			}
			else
			{
				index--;
			}
			if ((Object)(object)cameras[index] == (Object)null)
			{
				SM.PlayGlobalUISound((GlobalUISound)1, ((Component)GM.CurrentPlayerBody).transform.position);
			}
			else
			{
				SetCameraAtIndex();
			}
		}

		public void RefreshCameras()
		{
			//IL_008c: 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_00bc: Unknown result type (might be due to invalid IL or missing references)
			Camera[] array = Object.FindObjectsOfType<Camera>();
			cameras.Clear();
			index = 0;
			for (int i = 0; i < array.Length; i++)
			{
				if (!((Object)array[i]).name.Contains(((Object)displayCamera).name))
				{
					cameras.Add(array[i]);
				}
			}
			if (cameras.Count > 0)
			{
				SetCameraAtIndex();
				return;
			}
			((Component)displayCamera).transform.SetPositionAndRotation(((Component)this).transform.position, ((Component)this).transform.rotation);
			cameraName.text = "Awaiting Cameras";
			SM.PlayGlobalUISound((GlobalUISound)1, ((Component)GM.CurrentPlayerBody).transform.position);
		}

		private void OnDestroy()
		{
		}
	}
}
namespace Packer.Packers_Vending_Machines
{
	public class AmmoBoxVendor : VendingMachine
	{
		[Header("-Ammo Box Vendor-")]
		public bool prefilled = true;

		public int cost = 1;

		[Header("Item Checker")]
		public FVRQuickBeltSlot itemSlot;

		private FireArmRoundType roundType;

		private FVRInteractiveObject lastItem;

		private FVRPhysicalObject physicalObject;

		protected List<FVRObject> fvrObjects = new List<FVRObject>();

		public override void Start()
		{
			displayLogo.SetActive(true);
			ItemScan();
			UpdateMoneyDisplay();
			base.LoadConfig();
		}

		public override void SetupCosts()
		{
			prefilled = VendingMachine.config.ammoBoxVendor.prefilled;
			cost = VendingMachine.config.ammoBoxVendor.costs[0];
			if (itemTables.Count == 0)
			{
				itemTables.Add(new ItemTable());
			}
		}

		protected override void Update()
		{
			base.Update();
			if ((Object)(object)itemSlot.HeldObject != (Object)null)
			{
				ItemScan();
			}
			else if ((Object)(object)itemSlot.HeldObject == (Object)null && buttonList.Count > 0)
			{
				for (int i = 0; i < buttonList.Count; i++)
				{
					Object.Destroy((Object)(object)((Component)buttonList[i]).gameObject);
				}
				buttonList.Clear();
				displayLogo.SetActive(true);
				lastItem = null;
			}
		}

		private void ItemScan()
		{
			//IL_0085: 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)
			//IL_00d4: 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)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Invalid comparison between Unknown and I4
			if ((Object)(object)itemSlot.HeldObject == (Object)null || (Object)(object)itemSlot.HeldObject == (Object)(object)lastItem)
			{
				return;
			}
			lastItem = itemSlot.HeldObject;
			physicalObject = ((Component)itemSlot.HeldObject).gameObject.GetComponent<FVRPhysicalObject>();
			if ((Object)(object)physicalObject == (Object)null)
			{
				return;
			}
			roundType = physicalObject.ObjectWrapper.RoundType;
			fvrObjects = new List<FVRObject>();
			fvrObjects.AddRange(ManagerSingleton<IM>.Instance.ObjectDic.Values);
			for (int num = fvrObjects.Count - 1; num >= 0; num--)
			{
				if (fvrObjects[num].RoundType != roundType || (int)fvrObjects[num].MagazineType != 0 || (int)fvrObjects[num].Category != 40 || !fvrObjects[num].UsesRoundTypeFlag)
				{
					fvrObjects.RemoveAt(num);
				}
			}
			if (fvrObjects.Count == 0)
			{
				SFXFailed();
			}
			itemTables[0].collected.Clear();
			itemTables[0].collected = fvrObjects;
			itemTables[0].cost = cost;
			GenerateButtons(itemTables[0]);
		}

		public override GameObject PurchaseItemID(FVRObject fvrObject, int cost)
		{
			GameObject val = base.PurchaseItemID(fvrObject, cost);
			if ((Object)(object)val == (Object)null)
			{
				return null;
			}
			FVRFireArmMagazine component = val.GetComponent<FVRFireArmMagazine>();
			if ((Object)(object)component != (Object)null)
			{
				SetMagazinePrefilled(component, prefilled);
			}
			return val;
		}
	}
	[Serializable]
	public class ItemTable
	{
		public string name = "Table";

		public int cost = 2;

		public Sprite thumbnail;

		public List<FVRObject> collected;

		public bool objectIDsOnly = false;

		public List<string> objectIDs = new List<string>();

		public ObjectCategory category = (ObjectCategory)0;

		public List<OTagSet> set = new List<OTagSet>();

		public List<OTagEra> eras = new List<OTagEra>();

		public List<OTagFirearmSize> sizes = new List<OTagFirearmSize>();

		public List<OTagFirearmAction> actions = new List<OTagFirearmAction>();

		public List<OTagFirearmFiringMode> modes = new List<OTagFirearmFiringMode>();

		public List<OTagFirearmFiringMode> excludeModes = new List<OTagFirearmFiringMode>();

		public List<OTagFirearmFeedOption> feedoptions = new List<OTagFirearmFeedOption>();

		public List<OTagFirearmMount> mounts = new List<OTagFirearmMount>();

		public List<OTagFirearmRoundPower> roundPowers = new List<OTagFirearmRoundPower>();

		public List<OTagAttachmentFeature> features = new List<OTagAttachmentFeature>();

		public List<OTagMeleeStyle> meleeStyles = new List<OTagMeleeStyle>();

		public List<OTagMeleeHandedness> meleeHandedness = new List<OTagMeleeHandedness>();

		public List<OTagPowerupType> powerupTypes = new List<OTagPowerupType>();

		public List<OTagThrownType> thrownTypes = new List<OTagThrownType>();

		public List<OTagThrownDamageType> thrownDamage = new List<OTagThrownDamageType>();

		public List<OTagFirearmCountryOfOrigin> countryOfOrigins = new List<OTagFirearmCountryOfOrigin>();

		public ItemTable SetupTable()
		{
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: 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_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0234: 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_030e: Unknown result type (might be due to invalid IL or missing references)
			//IL_047c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0390: Unknown result type (might be due to invalid IL or missing references)
			//IL_04bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0412: Unknown result type (might be due to invalid IL or missing references)
			//IL_04fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_053c: Unknown result type (might be due to invalid IL or missing references)
			//IL_057c: Unknown result type (might be due to invalid IL or missing references)
			//IL_05bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_05fc: Unknown result type (might be due to invalid IL or missing references)
			if (objectIDsOnly)
			{
				collected.Clear();
				FVRObject value = null;
				for (int i = 0; i < objectIDs.Count; i++)
				{
					if (IM.OD.TryGetValue(objectIDs[i], out value))
					{
						collected.Add(value);
					}
				}
				return this;
			}
			collected = new List<FVRObject>();
			collected.AddRange(ManagerSingleton<IM>.Instance.ObjectDic.Values);
			for (int num = collected.Count - 1; num >= 0; num--)
			{
				if (objectIDs.Contains(collected[num].ItemID))
				{
					continue;
				}
				if ((int)category != 0 && collected[num].Category != category)
				{
					collected.RemoveAt(num);
					continue;
				}
				if (set.Count > 0 && !set.Contains(collected[num].TagSet))
				{
					collected.RemoveAt(num);
					continue;
				}
				if (eras.Count > 0 && !eras.Contains(collected[num].TagEra))
				{
					collected.RemoveAt(num);
					continue;
				}
				if (sizes.Count > 0 && !sizes.Contains(collected[num].TagFirearmSize))
				{
					collected.RemoveAt(num);
					continue;
				}
				if (actions.Count > 0 && !actions.Contains(collected[num].TagFirearmAction))
				{
					collected.RemoveAt(num);
					continue;
				}
				if (roundPowers.Count > 0 && !roundPowers.Contains(collected[num].TagFirearmRoundPower))
				{
					collected.RemoveAt(num);
					continue;
				}
				if (modes.Count > 0)
				{
					bool flag = false;
					for (int j = 0; j < modes.Count; j++)
					{
						if (!collected[num].TagFirearmFiringModes.Contains(modes[j]))
						{
							flag = true;
							break;
						}
					}
					if (flag)
					{
						collected.RemoveAt(num);
						continue;
					}
				}
				if (excludeModes.Count > 0)
				{
					bool flag2 = false;
					for (int k = 0; k < excludeModes.Count; k++)
					{
						if (collected[num].TagFirearmFiringModes.Contains(excludeModes[k]))
						{
							flag2 = true;
							break;
						}
					}
					if (flag2)
					{
						collected.RemoveAt(num);
						continue;
					}
				}
				if (feedoptions.Count > 0)
				{
					bool flag3 = false;
					for (int l = 0; l < feedoptions.Count; l++)
					{
						if (!collected[num].TagFirearmFeedOption.Contains(feedoptions[l]))
						{
							flag3 = true;
							break;
						}
					}
					if (flag3)
					{
						collected.RemoveAt(num);
						continue;
					}
				}
				if (mounts.Count > 0)
				{
					bool flag4 = false;
					for (int m = 0; m < mounts.Count; m++)
					{
						if (!collected[num].TagFirearmMounts.Contains(mounts[m]))
						{
							flag4 = true;
							break;
						}
					}
					if (flag4)
					{
						collected.RemoveAt(num);
					}
				}
				if (features.Count > 0 && !features.Contains(collected[num].TagAttachmentFeature))
				{
					collected.RemoveAt(num);
				}
				if (meleeStyles.Count > 0 && !meleeStyles.Contains(collected[num].TagMeleeStyle))
				{
					collected.RemoveAt(num);
				}
				if (meleeHandedness.Count > 0 && !meleeHandedness.Contains(collected[num].TagMeleeHandedness))
				{
					collected.RemoveAt(num);
				}
				if (powerupTypes.Count > 0 && !powerupTypes.Contains(collected[num].TagPowerupType))
				{
					collected.RemoveAt(num);
				}
				if (thrownTypes.Count > 0 && !thrownTypes.Contains(collected[num].TagThrownType))
				{
					collected.RemoveAt(num);
				}
				if (thrownDamage.Count > 0 && !thrownDamage.Contains(collected[num].TagThrownDamageType))
				{
					collected.RemoveAt(num);
				}
				if (countryOfOrigins.Count > 0 && !countryOfOrigins.Contains(collected[num].TagFirearmCountryOfOrigin))
				{
					collected.RemoveAt(num);
				}
			}
			return this;
		}
	}
	public class ModConfig
	{
		[Serializable]
		public class Config
		{
			[Serializable]
			public class VendorConfig
			{
				public string name;

				public bool prefilled = true;

				public int[] costs;
			}

			public VendorConfig ammoBoxVendor = new VendorConfig
			{
				name = "Ammo Box Vendor",
				prefilled = true,
				costs = new int[1] { 1 }
			};

			public VendorConfig ordnanceVendor = new VendorConfig
			{
				name = "Ordnance Vendor",
				prefilled = true,
				costs = new int[5] { 2, 5, 3, 1, 2 }
			};
		}

		public static Config LoadConfig()
		{
			string path = Paths.PluginPath + "/Packer-Packers_Vending_Machines/config.json";
			if (!File.Exists(path))
			{
				string contents = JsonUtility.ToJson((object)new Config());
				File.WriteAllText(path, contents);
			}
			Config result = new Config();
			using (StreamReader streamReader = new StreamReader(path))
			{
				string text = streamReader.ReadToEnd();
				try
				{
					result = JsonUtility.FromJson<Config>(text);
				}
				catch (Exception ex)
				{
					Debug.Log((object)ex.Message);
					return result;
				}
			}
			return result;
		}
	}
	public class OriOrdnanceVendor : VendingMachine
	{
		private enum VendorType
		{
			Grenade,
			Airstrike,
			Ordnance,
			Zippo,
			Other
		}

		protected FVRObject fvrZippo = null;

		public override void Start()
		{
			base.LoadConfig();
			PopulateCategoryButtons();
			UpdateMoneyDisplay();
		}

		public override void SetupCosts()
		{
			for (int i = 0; i < itemTables.Count; i++)
			{
				switch (itemTables[i].name)
				{
				case "Grenade":
					itemTables[i].cost = VendingMachine.config.ordnanceVendor.costs[0];
					break;
				case "Airstrike":
					itemTables[i].cost = VendingMachine.config.ordnanceVendor.costs[1];
					break;
				case "Ordnance":
					itemTables[i].cost = VendingMachine.config.ordnanceVendor.costs[2];
					break;
				case "Zippo":
					itemTables[i].cost = VendingMachine.config.ordnanceVendor.costs[3];
					break;
				default:
					itemTables[i].cost = VendingMachine.config.ordnanceVendor.costs[4];
					break;
				}
			}
		}
	}
	public class VendingMachine : FVRFireArmMagazine
	{
		public static ModConfig.Config config;

		[Header("-Vending Machine-")]
		[Header("Currency")]
		public int money = 0;

		private int prevNumRounds = 0;

		[Header("Dispenser")]
		public Transform itemSpawn;

		public Transform refundSpawn;

		[Header("UI")]
		public Sprite defaultSprite;

		public Text moneyText;

		public GameObject displayLogo;

		public GameObject buttonPrefab;

		protected List<FVRPointableButton> buttonList = new List<FVRPointableButton>();

		[Header("Audio")]
		public AudioSource audioSource;

		public AudioClip addMoneyClip;

		public AudioClip purchaseClip;

		public AudioClip failedClip;

		[Header("Category Item Tables")]
		[SerializeField]
		protected List<ItemTable> itemTables = new List<ItemTable>();

		[Header("Category Selector")]
		[SerializeField]
		protected Transform categoryParent;

		[SerializeField]
		protected GameObject categoryButtonPrefab;

		protected List<GameObject> categoryButtons = new List<GameObject>();

		[Header("Category Content")]
		[SerializeField]
		protected Transform categoryContentParent;

		[SerializeField]
		protected GameObject categoryContentPrefab;

		protected List<GameObject> categoryContents = new List<GameObject>();

		public void OpenCategory(GameObject content)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			for (int i = 0; i < categoryContents.Count; i++)
			{
				categoryContents[i].SetActive(false);
			}
			SM.PlayGlobalUISound((GlobalUISound)0, ((Component)this).transform.position);
			if ((Object)(object)content != (Object)null)
			{
				content.SetActive(true);
			}
		}

		protected void PopulateCategoryButtons()
		{
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Expected O, but got Unknown
			for (int i = 0; i < itemTables.Count; i++)
			{
				if (itemTables[i].collected.Count == 0)
				{
					itemTables[i].SetupTable();
				}
				if (itemTables[i].collected.Count != 0)
				{
					FVRPointableButton component = Object.Instantiate<GameObject>(categoryButtonPrefab, categoryParent).GetComponent<FVRPointableButton>();
					component.Text.text = itemTables[i].name;
					((Component)component).gameObject.SetActive(true);
					component.Image.sprite = itemTables[i].thumbnail;
					categoryButtons.Add(((Component)component).gameObject);
					GameObject content = Object.Instantiate<GameObject>(categoryContentPrefab, categoryContentParent);
					categoryContents.Add(content);
					PopulateCategoryContent(content.transform, itemTables[i]);
					((UnityEvent)((Component)component).gameObject.GetComponent<Button>().onClick).AddListener((UnityAction)delegate
					{
						OpenCategory(content);
					});
				}
			}
		}

		protected void PopulateCategoryContent(Transform parent, ItemTable itemTable)
		{
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Expected O, but got Unknown
			for (int i = 0; i < itemTable.collected.Count; i++)
			{
				if (!((Object)(object)itemTable.collected[i] == (Object)null))
				{
					FVRObject item = itemTable.collected[i];
					int num = i;
					FVRPointable val = GenerateButton(item, itemTable.cost);
					((Component)val).transform.SetParent(parent);
					((UnityEvent)((Component)val).gameObject.GetComponent<Button>().onClick).AddListener((UnityAction)delegate
					{
						PurchaseItemID(item, itemTable.cost);
					});
				}
			}
		}

		protected virtual void Update()
		{
			if (prevNumRounds != base.m_numRounds)
			{
				UpdateMoneyDisplay();
				prevNumRounds = base.m_numRounds;
			}
		}

		public virtual void LoadConfig()
		{
			config = ModConfig.LoadConfig();
			SetupCosts();
		}

		public virtual void SetupCosts()
		{
		}

		public virtual void UpdateMoneyDisplay()
		{
			money = 0;
			for (int i = 0; i < base.LoadedRounds.Length; i++)
			{
				if (base.LoadedRounds[i] != null && !((Object)(object)base.LoadedRounds[i].LR_ObjectWrapper == (Object)null))
				{
					money += GetRoundValue(base.LoadedRounds[i].LR_ObjectWrapper.ItemID);
				}
			}
			moneyText.text = money.ToString();
		}

		public virtual bool SpendMoney(int amount)
		{
			UpdateMoneyDisplay();
			if (money < amount)
			{
				SFXFailed();
				return false;
			}
			money -= amount;
			UpdateLoadedRoundMoney(money);
			return true;
		}

		protected void ClearAllRounds()
		{
			for (int i = 0; i < base.LoadedRounds.Length; i++)
			{
				base.LoadedRounds[i] = null;
			}
			base.m_numRounds = 0;
		}

		public void UpdateLoadedRoundMoney(int amount)
		{
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Expected O, but got Unknown
			ClearAllRounds();
			int num = 0;
			while (amount > 0 && num < base.LoadedRounds.Length)
			{
				string highestValueCashMoney = GetHighestValueCashMoney(amount);
				if (highestValueCashMoney == "")
				{
					break;
				}
				FVRObject value = null;
				IM.OD.TryGetValue(highestValueCashMoney, out value);
				if (!((Object)(object)value == (Object)null))
				{
					base.LoadedRounds[num] = new FVRLoadedRound();
					base.LoadedRounds[num].LR_ObjectWrapper = value;
					amount -= GetRoundValue(highestValueCashMoney);
					num++;
				}
			}
			UpdateMoneyDisplay();
		}

		public virtual void RefundButton()
		{
			int num = 0;
			while (money > 0)
			{
				string highestValueCashMoney = GetHighestValueCashMoney(money);
				if (highestValueCashMoney == "")
				{
					break;
				}
				money -= GetRoundValue(highestValueCashMoney);
				FVRObject value = null;
				IM.OD.TryGetValue(highestValueCashMoney, out value);
				((MonoBehaviour)this).StartCoroutine(WaitandCreate(((AnvilAsset)value).GetGameObject(), (float)num * 0.25f));
				num++;
			}
			ClearAllRounds();
			UpdateMoneyDisplay();
		}

		protected IEnumerator WaitandCreate(GameObject prefab, float waitTime)
		{
			yield return (object)new WaitForSeconds(waitTime);
			Object.Instantiate<GameObject>(prefab, refundSpawn.position + Vector3.up * 0.05f, refundSpawn.rotation);
		}

		protected void RemoveAllButtons()
		{
			for (int i = 0; i < buttonList.Count; i++)
			{
				Object.Destroy((Object)(object)((Component)buttonList[i]).gameObject);
			}
			buttonList.Clear();
		}

		protected virtual void GenerateButtons(ItemTable itemTable)
		{
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Expected O, but got Unknown
			if (itemTable.collected.Count == 0)
			{
				itemTable.SetupTable();
			}
			displayLogo.SetActive(false);
			for (int i = 0; i < itemTable.collected.Count; i++)
			{
				if (!((Object)(object)itemTable.collected[i] == (Object)null))
				{
					FVRObject item = itemTable.collected[i];
					int num = i;
					FVRPointable val = GenerateButton(item, itemTable.cost);
					((UnityEvent)((Component)val).gameObject.GetComponent<Button>().onClick).AddListener((UnityAction)delegate
					{
						PurchaseItemID(item, itemTable.cost);
					});
				}
			}
		}

		protected virtual FVRPointable GenerateButton(FVRObject itemObject, int itemCost)
		{
			if ((Object)(object)itemObject == (Object)null)
			{
				Debug.LogError((object)"Could not generate button with missing FVRObject");
				return null;
			}
			FVRPointableButton component = Object.Instantiate<GameObject>(buttonPrefab, buttonPrefab.transform.parent).GetComponent<FVRPointableButton>();
			((Component)component).gameObject.SetActive(true);
			if ((Object)(object)component.Text != (Object)null)
			{
				component.Text.text = itemObject.DisplayName;
			}
			ManagerSingleton<IM>.Instance.SpawnerIDDic.TryGetValue(itemObject.SpawnedFromId, out var value);
			if ((Object)(object)value != (Object)null && (Object)(object)value.Sprite != (Object)null)
			{
				component.Image.sprite = value.Sprite;
			}
			else
			{
				component.Image.sprite = defaultSprite;
			}
			buttonList.Add(component);
			for (int i = 0; i < ((Component)component).transform.childCount; i++)
			{
				if (((Object)((Component)component).transform.GetChild(i)).name == "Cost")
				{
					((Component)((Component)component).transform.GetChild(i)).GetComponent<Text>().text = itemCost.ToString();
					break;
				}
			}
			return (FVRPointable)(object)component;
		}

		protected virtual void GenerateButtons(List<FVRObject> itemsObjects)
		{
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Expected O, but got Unknown
			displayLogo.SetActive(false);
			RemoveAllButtons();
			for (int i = 0; i < itemsObjects.Count; i++)
			{
				int num = i;
				int newCost = 1;
				((UnityEvent)((Component)GenerateButton(itemsObjects[i], newCost)).gameObject.GetComponent<Button>().onClick).AddListener((UnityAction)delegate
				{
					PurchaseItemID(itemsObjects[i], newCost);
				});
			}
		}

		protected virtual void GenerateButtons(List<FVRObject> itemsObjects, int newCost)
		{
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Expected O, but got Unknown
			displayLogo.SetActive(false);
			for (int i = 0; i < itemsObjects.Count; i++)
			{
				if (!((Object)(object)itemsObjects[i] == (Object)null))
				{
					FVRObject item = itemsObjects[i];
					int num = i;
					FVRPointable val = GenerateButton(item, newCost);
					((UnityEvent)((Component)val).gameObject.GetComponent<Button>().onClick).AddListener((UnityAction)delegate
					{
						PurchaseItemID(item, newCost);
					});
				}
			}
		}

		public virtual GameObject PurchaseItemID(FVRObject fvrObject, int cost)
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)fvrObject == (Object)null || !SpendMoney(cost))
			{
				SFXFailed();
				return null;
			}
			SFXPurchase();
			UpdateLoadedRoundMoney(money);
			GameObject gameObject = ((AnvilAsset)fvrObject).GetGameObject();
			return Object.Instantiate<GameObject>(gameObject, itemSpawn.position, itemSpawn.rotation);
		}

		public void SetMagazinePrefilled(FVRFireArmMagazine mag, bool prefilled)
		{
			if (!prefilled && (Object)(object)mag != (Object)null)
			{
				for (int i = 0; i < mag.LoadedRounds.Length; i++)
				{
					mag.LoadedRounds[i] = null;
				}
				mag.m_numRounds = 0;
			}
		}

		protected virtual int GetRoundValue(string itemID)
		{
			return itemID switch
			{
				"Cartridge69CashMoneyD1" => 1, 
				"Cartridge69CashMoneyD5" => 5, 
				"Cartridge69CashMoneyD10" => 10, 
				"Cartridge69CashMoneyD25" => 25, 
				"Cartridge69CashMoneyD100" => 100, 
				"Cartridge69CashMoneyD1000" => 1000, 
				_ => 0, 
			};
		}

		protected virtual string GetHighestValueCashMoney(int cash)
		{
			if (cash >= 1000)
			{
				return "Cartridge69CashMoneyD1000";
			}
			if (cash >= 100)
			{
				return "Cartridge69CashMoneyD100";
			}
			if (cash >= 25)
			{
				return "Cartridge69CashMoneyD25";
			}
			if (cash >= 10)
			{
				return "Cartridge69CashMoneyD10";
			}
			if (cash >= 5)
			{
				return "Cartridge69CashMoneyD5";
			}
			if (cash >= 1)
			{
				return "Cartridge69CashMoneyD1";
			}
			return "";
		}

		protected virtual FVRLoadedRound GetLoadedRound(string itemID)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			FVRLoadedRound result = new FVRLoadedRound();
			string highestValueCashMoney = GetHighestValueCashMoney(money);
			IM.OD.TryGetValue(itemID, out var _);
			return result;
		}

		public void SFXAddMoney()
		{
			audioSource.PlayOneShot(addMoneyClip);
		}

		public void SFXPurchase()
		{
			audioSource.PlayOneShot(purchaseClip);
		}

		public void SFXFailed()
		{
			audioSource.PlayOneShot(failedClip);
		}
	}
}
public class CuttableMesh
{
	private MeshRenderer inputMeshRenderer;

	private bool hasUvs;

	private bool hasUv1s;

	private bool hasColours;

	private List<CuttableSubMesh> subMeshes;

	public CuttableMesh(Mesh inputMesh)
	{
		Init(inputMesh, ((Object)inputMesh).name);
	}

	public CuttableMesh(MeshRenderer input)
	{
		inputMeshRenderer = input;
		MeshFilter component = ((Component)input).GetComponent<MeshFilter>();
		Mesh sharedMesh = component.sharedMesh;
		Init(sharedMesh, ((Object)input).name);
	}

	public CuttableMesh(CuttableMesh inputMesh, List<CuttableSubMesh> newSubMeshes)
	{
		inputMeshRenderer = inputMesh.inputMeshRenderer;
		hasUvs = inputMesh.hasUvs;
		hasUv1s = inputMesh.hasUv1s;
		hasColours = inputMesh.hasColours;
		subMeshes = new List<CuttableSubMesh>();
		subMeshes.AddRange(newSubMeshes);
	}

	private void Init(Mesh inputMesh, string debugName)
	{
		subMeshes = new List<CuttableSubMesh>();
		if (inputMesh.isReadable)
		{
			Vector3[] vertices = inputMesh.vertices;
			Vector3[] normals = inputMesh.normals;
			Vector2[] uv = inputMesh.uv;
			Vector2[] uv2 = inputMesh.uv2;
			Color32[] colors = inputMesh.colors32;
			hasUvs = uv != null && uv.Length > 0;
			hasUv1s = uv2 != null && uv2.Length > 0;
			hasColours = colors != null && colors.Length > 0;
			for (int i = 0; i < inputMesh.subMeshCount; i++)
			{
				int[] indices = inputMesh.GetIndices(i);
				CuttableSubMesh item = new CuttableSubMesh(indices, vertices, normals, colors, uv, uv2);
				subMeshes.Add(item);
			}
		}
		else
		{
			Debug.LogError((object)("CuttableMesh's input mesh is not readable: " + debugName), (Object)(object)inputMesh);
		}
	}

	public void Add(CuttableMesh other)
	{
		if (subMeshes.Count != other.subMeshes.Count)
		{
			throw new Exception("Mismatched submesh count");
		}
		for (int i = 0; i < subMeshes.Count; i++)
		{
			subMeshes[i].Add(other.subMeshes[i]);
		}
	}

	public int NumSubMeshes()
	{
		return subMeshes.Count;
	}

	public bool HasUvs()
	{
		return hasUvs;
	}

	public bool HasColours()
	{
		return hasColours;
	}

	public List<CuttableSubMesh> GetSubMeshes()
	{
		return subMeshes;
	}

	public CuttableSubMesh GetSubMesh(int index)
	{
		return subMeshes[index];
	}

	public Transform GetTransform()
	{
		if ((Object)(object)inputMeshRenderer != (Object)null)
		{
			return ((Component)inputMeshRenderer).transform;
		}
		return null;
	}

	public MeshRenderer ConvertToRenderer(string newObjectName)
	{
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Expected O, but got Unknown
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_005d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0085: 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_00a9: Unknown result type (might be due to invalid IL or missing references)
		Mesh val = CreateMesh();
		if (val.vertexCount == 0)
		{
			return null;
		}
		GameObject val2 = new GameObject(newObjectName);
		val2.transform.SetParent(((Component)inputMeshRenderer).transform);
		val2.transform.localPosition = Vector3.zero;
		val2.transform.localRotation = Quaternion.identity;
		val2.transform.localScale = Vector3.one;
		MeshFilter val3 = val2.AddComponent<MeshFilter>();
		val3.mesh = val;
		MeshRenderer val4 = val2.AddComponent<MeshRenderer>();
		((Renderer)val4).shadowCastingMode = ((Renderer)inputMeshRenderer).shadowCastingMode;
		((Renderer)val4).reflectionProbeUsage = ((Renderer)inputMeshRenderer).reflectionProbeUsage;
		((Renderer)val4).lightProbeUsage = ((Renderer)inputMeshRenderer).lightProbeUsage;
		((Renderer)val4).sharedMaterials = ((Renderer)inputMeshRenderer).sharedMaterials;
		return val4;
	}

	public Mesh CreateMesh()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Expected O, but got Unknown
		Mesh val = new Mesh();
		int num = 0;
		for (int i = 0; i < subMeshes.Count; i++)
		{
			num += subMeshes[i].NumIndices();
		}
		List<Vector3> list = new List<Vector3>();
		List<Vector3> list2 = new List<Vector3>();
		List<Color32> list3 = ((!hasColours) ? null : new List<Color32>());
		List<Vector2> list4 = ((!hasUvs) ? null : new List<Vector2>());
		List<Vector2> list5 = ((!hasUv1s) ? null : new List<Vector2>());
		List<int> list6 = new List<int>();
		foreach (CuttableSubMesh subMesh in subMeshes)
		{
			list6.Add(list.Count);
			subMesh.AddTo(list, list2, list3, list4, list5);
		}
		val.vertices = list.ToArray();
		val.normals = list2.ToArray();
		val.colors32 = ((!hasColours) ? null : list3.ToArray());
		val.uv = ((!hasUvs) ? null : list4.ToArray());
		val.uv2 = ((!hasUv1s) ? null : list5.ToArray());
		val.subMeshCount = subMeshes.Count;
		for (int j = 0; j < subMeshes.Count; j++)
		{
			CuttableSubMesh cuttableSubMesh = subMeshes[j];
			int num2 = list6[j];
			int[] array = cuttableSubMesh.GenIndices();
			for (int k = 0; k < array.Length; k++)
			{
				array[k] += num2;
			}
			val.SetTriangles(array, j, true);
		}
		return val;
	}
}
public class CuttableSubMesh
{
	private List<Vector3> vertices;

	private List<Vector3> normals;

	private List<Color32> colours;

	private List<Vector2> uvs;

	private List<Vector2> uv1s;

	public CuttableSubMesh(bool hasNormals, bool hasColours, bool hasUvs, bool hasUv1)
	{
		vertices = new List<Vector3>();
		if (hasNormals)
		{
			normals = new List<Vector3>();
		}
		if (hasColours)
		{
			colours = new List<Color32>();
		}
		if (hasUvs)
		{
			uvs = new List<Vector2>();
		}
		if (hasUv1)
		{
			uv1s = new List<Vector2>();
		}
	}

	public CuttableSubMesh(int[] indices, Vector3[] inputVertices, Vector3[] inputNormals, Color32[] inputColours, Vector2[] inputUvs, Vector2[] inputUv1)
	{
		//IL_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00de: Unknown result type (might be due to invalid IL or missing references)
		//IL_0101: 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)
		vertices = new List<Vector3>();
		if (inputNormals != null && inputNormals.Length > 0)
		{
			normals = new List<Vector3>();
		}
		if (inputColours != null && inputColours.Length > 0)
		{
			colours = new List<Color32>();
		}
		if (inputUvs != null && inputUvs.Length > 0)
		{
			uvs = new List<Vector2>();
		}
		if (inputUv1 != null && inputUv1.Length > 0)
		{
			uv1s = new List<Vector2>();
		}
		foreach (int num in indices)
		{
			vertices.Add(inputVertices[num]);
			if (normals != null)
			{
				normals.Add(inputNormals[num]);
			}
			if (colours != null)
			{
				colours.Add(inputColours[num]);
			}
			if (uvs != null)
			{
				uvs.Add(inputUvs[num]);
			}
			if (uv1s != null)
			{
				uv1s.Add(inputUv1[num]);
			}
		}
	}

	public void Add(CuttableSubMesh other)
	{
		for (int i = 0; i < other.vertices.Count; i++)
		{
			CopyVertex(i, other);
		}
	}

	public int NumVertices()
	{
		return vertices.Count;
	}

	public Vector3 GetVertex(int index)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		return vertices[index];
	}

	public bool HasNormals()
	{
		return normals != null;
	}

	public bool HasColours()
	{
		return colours != null;
	}

	public bool HasUvs()
	{
		return uvs != null;
	}

	public bool HasUv1()
	{
		return uv1s != null;
	}

	public void CopyVertex(int srcIndex, CuttableSubMesh srcMesh)
	{
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0030: Unknown result type (might be due to invalid IL or missing references)
		//IL_0052: Unknown result type (might be due to invalid IL or missing references)
		//IL_0074: Unknown result type (might be due to invalid IL or missing references)
		//IL_0096: Unknown result type (might be due to invalid IL or missing references)
		vertices.Add(srcMesh.vertices[srcIndex]);
		if (normals != null)
		{
			normals.Add(srcMesh.normals[srcIndex]);
		}
		if (colours != null)
		{
			colours.Add(srcMesh.colours[srcIndex]);
		}
		if (uvs != null)
		{
			uvs.Add(srcMesh.uvs[srcIndex]);
		}
		if (uv1s != null)
		{
			uv1s.Add(srcMesh.uv1s[srcIndex]);
		}
	}

	public void AddInterpolatedVertex(int i0, int i1, float weight, CuttableSubMesh srcMesh)
	{
		//IL_0004: Unknown result type (might be due to invalid IL or missing references)
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_001c: 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_004c: Unknown result type (might be due to invalid IL or missing references)
		//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_005a: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: 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)
		//IL_0090: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c6: 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)
		//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
		Vector3 vertex = srcMesh.GetVertex(i0);
		Vector3 vertex2 = srcMesh.GetVertex(i1);
		vertices.Add(Vector3.Lerp(vertex, vertex2, weight));
		if (normals != null)
		{
			List<Vector3> list = normals;
			Vector3 val = Vector3.Lerp(srcMesh.normals[i0], srcMesh.normals[i1], weight);
			list.Add(((Vector3)(ref val)).normalized);
		}
		if (colours != null)
		{
			colours.Add(Color32.Lerp(srcMesh.colours[i0], srcMesh.colours[i1], weight));
		}
		if (uvs != null)
		{
			uvs.Add(Vector2.Lerp(srcMesh.uvs[i0], srcMesh.uvs[i1], weight));
		}
		if (uv1s != null)
		{
			uv1s.Add(Vector2.Lerp(srcMesh.uv1s[i0], srcMesh.uv1s[i1], weight));
		}
	}

	public void AddTo(List<Vector3> destVertices, List<Vector3> destNormals, List<Color32> destColours, List<Vector2> destUvs, List<Vector2> destUv1s)
	{
		destVertices.AddRange(vertices);
		if (normals != null)
		{
			destNormals.AddRange(normals);
		}
		if (colours != null)
		{
			destColours.AddRange(colours);
		}
		if (uvs != null)
		{
			destUvs.AddRange(uvs);
		}
		if (uv1s != null)
		{
			destUv1s.AddRange(uv1s);
		}
	}

	public int NumIndices()
	{
		return vertices.Count;
	}

	public int[] GenIndices()
	{
		int[] array = new int[vertices.Count];
		for (int i = 0; i < array.Length; i++)
		{
			array[i] = i;
		}
		return array;
	}
}
public enum VertexClassification
{
	Front = 1,
	Back = 2,
	OnPlane = 4
}
public class MeshCutter
{
	private CuttableMesh inputMesh;

	private List<CuttableSubMesh> outputFrontSubMeshes;

	private List<CuttableSubMesh> outputBackSubMeshes;

	public void Cut(CuttableMesh input, Plane worldCutPlane)
	{
		//IL_0067: Unknown result type (might be due to invalid IL or missing references)
		//IL_0068: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: 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_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: Unknown result type (might be due to invalid IL or missing references)
		//IL_004c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_0059: Unknown result type (might be due to invalid IL or missing references)
		//IL_005a: 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)
		inputMesh = input;
		outputFrontSubMeshes = new List<CuttableSubMesh>();
		outputBackSubMeshes = new List<CuttableSubMesh>();
		Transform transform = inputMesh.GetTransform();
		Plane cutPlane = default(Plane);
		if ((Object)(object)transform != (Object)null)
		{
			Vector3 val = transform.InverseTransformPoint(ClosestPointOnPlane(worldCutPlane, Vector3.zero));
			Vector3 val2 = transform.InverseTransformDirection(((Plane)(ref worldCutPlane)).normal);
			((Plane)(ref cutPlane))..ctor(val2, val);
		}
		else
		{
			cutPlane = worldCutPlane;
		}
		foreach (CuttableSubMesh subMesh in input.GetSubMeshes())
		{
			Cut(subMesh, cutPlane);
		}
	}

	private static Vector3 ClosestPointOnPlane(Plane plane, Vector3 point)
	{
		//IL_0003: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0032: Unknown result type (might be due to invalid IL or missing references)
		//IL_0035: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_0045: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Unknown result type (might be due to invalid IL or missing references)
		//IL_0026: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		float distanceToPoint = ((Plane)(ref plane)).GetDistanceToPoint(point);
		if (((Plane)(ref plane)).GetSide(point))
		{
			return point - ((Plane)(ref plane)).normal * distanceToPoint;
		}
		return point + ((Plane)(ref plane)).normal * distanceToPoint;
	}

	public CuttableMesh GetFrontOutput()
	{
		return new CuttableMesh(inputMesh, outputFrontSubMeshes);
	}

	public CuttableMesh GetBackOutput()
	{
		return new CuttableMesh(inputMesh, outputBackSubMeshes);
	}

	private void Cut(CuttableSubMesh inputSubMesh, Plane cutPlane)
	{
		//IL_004f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_0059: Unknown result type (might be due to invalid IL or missing references)
		//IL_005e: 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_0068: Unknown result type (might be due to invalid IL or missing references)
		//IL_006b: 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_0076: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		//IL_0081: Unknown result type (might be due to invalid IL or missing references)
		//IL_0083: Unknown result type (might be due to invalid IL or missing references)
		//IL_0121: Unknown result type (might be due to invalid IL or missing references)
		//IL_018e: Unknown result type (might be due to invalid IL or missing references)
		//IL_015b: 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_02be: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c7: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_02cb: Unknown result type (might be due to invalid IL or missing references)
		//IL_02cd: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d4: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d8: Unknown result type (might be due to invalid IL or missing references)
		//IL_02dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_02df: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e3: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01af: Unknown result type (might be due to invalid IL or missing references)
		//IL_021d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0204: Unknown result type (might be due to invalid IL or missing references)
		//IL_029d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0284: Unknown result type (might be due to invalid IL or missing references)
		//IL_0261: Unknown result type (might be due to invalid IL or missing references)
		//IL_0248: Unknown result type (might be due to invalid IL or missing references)
		bool hasNormals = inputSubMesh.HasNormals();
		bool hasColours = inputSubMesh.HasColours();
		bool hasUvs = inputSubMesh.HasUvs();
		bool hasUv = inputSubMesh.HasUv1();
		CuttableSubMesh cuttableSubMesh = new CuttableSubMesh(hasNormals, hasColours, hasUvs, hasUv);
		CuttableSubMesh cuttableSubMesh2 = new CuttableSubMesh(hasNormals, hasColours, hasUvs, hasUv);
		for (int i = 0; i < inputSubMesh.NumVertices(); i += 3)
		{
			int num = i;
			int num2 = i + 1;
			int num3 = i + 2;
			Vector3 vertex = inputSubMesh.GetVertex(num);
			Vector3 vertex2 = inputSubMesh.GetVertex(num2);
			Vector3 vertex3 = inputSubMesh.GetVertex(num3);
			VertexClassification vertexClassification = Classify(vertex, cutPlane);
			VertexClassification vertexClassification2 = Classify(vertex2, cutPlane);
			VertexClassification vertexClassification3 = Classify(vertex3, cutPlane);
			int numFront = 0;
			int numBehind = 0;
			CountSides(vertexClassification, ref numFront, ref numBehind);
			CountSides(vertexClassification2, ref numFront, ref numBehind);
			CountSides(vertexClassification3, ref numFront, ref numBehind);
			if (numFront > 0 && numBehind == 0)
			{
				KeepTriangle(num, num2, num3, inputSubMesh, cuttableSubMesh);
			}
			else if (numFront == 0 && numBehind > 0)
			{
				KeepTriangle(num, num2, num3, inputSubMesh, cuttableSubMesh2);
			}
			else if (numFront == 2 && numBehind == 1)
			{
				if (vertexClassification == VertexClassification.Back)
				{
					SplitA(num, num2, num3, inputSubMesh, cutPlane, cuttableSubMesh2, cuttableSubMesh);
				}
				else if (vertexClassification2 == VertexClassification.Back)
				{
					SplitA(num2, num3, num, inputSubMesh, cutPlane, cuttableSubMesh2, cuttableSubMesh);
				}
				else
				{
					SplitA(num3, num, num2, inputSubMesh, cutPlane, cuttableSubMesh2, cuttableSubMesh);
				}
			}
			else if (numFront == 1 && numBehind == 2)
			{
				if (vertexClassification == VertexClassification.Front)
				{
					SplitA(num, num2, num3, inputSubMesh, cutPlane, cuttableSubMesh, cuttableSubMesh2);
				}
				else if (vertexClassification2 == VertexClassification.Front)
				{
					SplitA(num2, num3, num, inputSubMesh, cutPlane, cuttableSubMesh, cuttableSubMesh2);
				}
				else
				{
					SplitA(num3, num, num2, inputSubMesh, cutPlane, cuttableSubMesh, cuttableSubMesh2);
				}
			}
			else if (numFront == 1 && numBehind == 1)
			{
				if (vertexClassification == VertexClassification.OnPlane)
				{
					if (vertexClassification3 == VertexClassification.Front)
					{
						SplitB(num3, num, num2, inputSubMesh, cutPlane, cuttableSubMesh, cuttableSubMesh2);
					}
					else
					{
						SplitBFlipped(num2, num3, num, inputSubMesh, cutPlane, cuttableSubMesh, cuttableSubMesh2);
					}
					continue;
				}
				switch (vertexClassification2)
				{
				case VertexClassification.OnPlane:
					if (vertexClassification == VertexClassification.Front)
					{
						SplitB(num, num2, num3, inputSubMesh, cutPlane, cuttableSubMesh, cuttableSubMesh2);
					}
					else
					{
						SplitBFlipped(num3, num, num2, inputSubMesh, cutPlane, cuttableSubMesh, cuttableSubMesh2);
					}
					break;
				case VertexClassification.Front:
					SplitB(num2, num3, num, inputSubMesh, cutPlane, cuttableSubMesh, cuttableSubMesh2);
					break;
				default:
					SplitBFlipped(num, num2, num3, inputSubMesh, cutPlane, cuttableSubMesh, cuttableSubMesh2);
					break;
				}
			}
			else if (numFront == 0 && numBehind == 0)
			{
				Vector3 val = vertex2 - vertex;
				Vector3 val2 = vertex3 - vertex;
				Vector3 val3 = Vector3.Cross(val, val2);
				if (Vector3.Dot(val3, ((Plane)(ref cutPlane)).normal) > 0f)
				{
					KeepTriangle(num, num2, num3, inputSubMesh, cuttableSubMesh2);
				}
				else
				{
					KeepTriangle(num, num2, num3, inputSubMesh, cuttableSubMesh);
				}
			}
		}
		outputFrontSubMeshes.Add(cuttableSubMesh);
		outputBackSubMeshes.Add(cuttableSubMesh2);
	}

	private VertexClassification Classify(Vector3 vertex, Plane cutPlane)
	{
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		Vector3 val = default(Vector3);
		((Vector3)(ref val))..ctor(vertex.x, vertex.y, vertex.z);
		float distanceToPoint = ((Plane)(ref cutPlane)).GetDistanceToPoint(val);
		double num = 9.999999747378752E-06;
		if ((double)distanceToPoint > 0.0 - num && (double)distanceToPoint < num)
		{
			return VertexClassification.OnPlane;
		}
		if (distanceToPoint > 0f)
		{
			return VertexClassification.Front;
		}
		return VertexClassification.Back;
	}

	private void CountSides(VertexClassification c, ref int numFront, ref int numBehind)
	{
		switch (c)
		{
		case VertexClassification.Front:
			numFront++;
			break;
		case VertexClassification.Back:
			numBehind++;
			break;
		}
	}

	private void KeepTriangle(int i0, int i1, int i2, CuttableSubMesh inputSubMesh, CuttableSubMesh destSubMesh)
	{
		destSubMesh.CopyVertex(i0, inputSubMesh);
		destSubMesh.CopyVertex(i1, inputSubMesh);
		destSubMesh.CopyVertex(i2, inputSubMesh);
	}

	private void SplitA(int i0, int i1, int i2, CuttableSubMesh inputSubMesh, Plane cutPlane, CuttableSubMesh frontSubMesh, CuttableSubMesh backSubMesh)
	{
		//IL_0004: Unknown result type (might be due to invalid IL or missing references)
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: 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)
		//IL_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: Unknown result type (might be due to invalid IL or missing references)
		//IL_002c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0030: Unknown result type (might be due to invalid IL or missing references)
		Vector3 vertex = inputSubMesh.GetVertex(i0);
		Vector3 vertex2 = inputSubMesh.GetVertex(i1);
		Vector3 vertex3 = inputSubMesh.GetVertex(i2);
		CalcIntersection(vertex, vertex2, cutPlane, out var weight);
		CalcIntersection(vertex3, vertex, cutPlane, out var weight2);
		frontSubMesh.CopyVertex(i0, inputSubMesh);
		frontSubMesh.AddInterpolatedVertex(i0, i1, weight, inputSubMesh);
		frontSubMesh.AddInterpolatedVertex(i2, i0, weight2, inputSubMesh);
		backSubMesh.AddInterpolatedVertex(i0, i1, weight, inputSubMesh);
		backSubMesh.CopyVertex(i1, inputSubMesh);
		backSubMesh.CopyVertex(i2, inputSubMesh);
		backSubMesh.CopyVertex(i2, inputSubMesh);
		backSubMesh.AddInterpolatedVertex(i2, i0, weight2, inputSubMesh);
		backSubMesh.AddInterpolatedVertex(i0, i1, weight, inputSubMesh);
	}

	private void SplitB(int i0, int i1, int i2, CuttableSubMesh inputSubMesh, Plane cutPlane, CuttableSubMesh frontSubMesh, CuttableSubMesh backSubMesh)
	{
		//IL_0004: Unknown result type (might be due to invalid IL or missing references)
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: 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_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		Vector3 vertex = inputSubMesh.GetVertex(i0);
		Vector3 vertex2 = inputSubMesh.GetVertex(i2);
		CalcIntersection(vertex2, vertex, cutPlane, out var weight);
		frontSubMesh.CopyVertex(i0, inputSubMesh);
		frontSubMesh.CopyVertex(i1, inputSubMesh);
		frontSubMesh.AddInterpolatedVertex(i2, i0, weight, inputSubMesh);
		backSubMesh.CopyVertex(i1, inputSubMesh);
		backSubMesh.CopyVertex(i2, inputSubMesh);
		backSubMesh.AddInterpolatedVertex(i2, i0, weight, inputSubMesh);
	}

	private void SplitBFlipped(int i0, int i1, int i2, CuttableSubMesh inputSubMesh, Plane cutPlane, CuttableSubMesh frontSubMesh, CuttableSubMesh backSubMesh)
	{
		//IL_0004: Unknown result type (might be due to invalid IL or missing references)
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: 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_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		Vector3 vertex = inputSubMesh.GetVertex(i0);
		Vector3 vertex2 = inputSubMesh.GetVertex(i1);
		CalcIntersection(vertex, vertex2, cutPlane, out var weight);
		frontSubMesh.CopyVertex(i0, inputSubMesh);
		frontSubMesh.AddInterpolatedVertex(i0, i1, weight, inputSubMesh);
		frontSubMesh.CopyVertex(i2, inputSubMesh);
		backSubMesh.CopyVertex(i1, inputSubMesh);
		backSubMesh.CopyVertex(i2, inputSubMesh);
		backSubMesh.AddInterpolatedVertex(i0, i1, weight, inputSubMesh);
	}

	private Vector3 CalcIntersection(Vector3 v0, Vector3 v1, Plane plane, out float weight)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0003: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: 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)
		//IL_0034: 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_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_004c: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0055: Unknown result type (might be due to invalid IL or missing references)
		Vector3 val = v1 - v0;
		float magnitude = ((Vector3)(ref val)).magnitude;
		Ray val2 = default(Ray);
		((Ray)(ref val2))..ctor(v0, val / magnitude);
		float num = default(float);
		((Plane)(ref plane)).Raycast(val2, ref num);
		Vector3 result = ((Ray)(ref val2)).origin + ((Ray)(ref val2)).direction * num;
		weight = num / magnitude;
		return result;
	}
}