Decompiled source of RCCars v1.0.4

RCCars.dll

Decompiled 2 months ago
using System;
using System.Collections;
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 System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using GameNetcodeStuff;
using LethalConfig;
using LethalConfig.ConfigItems;
using LethalConfig.ConfigItems.Options;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using RCCars.Scripts;
using StaticNetcodeLib;
using TMPro;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.AI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("RCCars")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("RCCars")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+a0f156be1948ff33140808bae7b044c81da8f9b1")]
[assembly: AssemblyProduct("RCCars")]
[assembly: AssemblyTitle("RCCars")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace RCCars
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("wexop.rc_cars", "RCCars", "1.0.4")]
	public class RCCarsPlugin : BaseUnityPlugin
	{
		private const string GUID = "wexop.rc_cars";

		private const string NAME = "RCCars";

		private const string VERSION = "1.0.4";

		public static RCCarsPlugin instance;

		public Dictionary<ulong, RegistredCar> RegistredCars = new Dictionary<ulong, RegistredCar>();

		public ConfigEntry<float> honkVolume;

		public ConfigEntry<float> engineVolume;

		public ConfigEntry<float> rotationSpeed;

		public ConfigEntry<int> explosionDamage;

		public ConfigEntry<float> syncInterval;

		public ConfigEntry<string> blacklistCar;

		public ConfigEntry<int> carPrice;

		public ConfigEntry<int> policeCarPrice;

		public ConfigEntry<int> ambulanceCarPrice;

		public ConfigEntry<int> sportCarPrice;

		public ConfigEntry<int> bombCarPrice;

		public ConfigEntry<int> cruiserCarPrice;

		public ConfigEntry<int> wexopCarPrice;

		private void Awake()
		{
			instance = this;
			((BaseUnityPlugin)this).Logger.LogInfo((object)"RCCars starting....");
			string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "rccars");
			AssetBundle bundle = AssetBundle.LoadFromFile(text);
			LoadConfigs();
			RegisterCar(bundle);
			((BaseUnityPlugin)this).Logger.LogInfo((object)"RCCars ready !!");
		}

		private void RegisterCar(AssetBundle bundle)
		{
			Item val = bundle.LoadAsset<Item>("Assets/LethalCompany/Mods/RCCars/RCCar.asset");
			((BaseUnityPlugin)this).Logger.LogInfo((object)(((Object)val).name + " FOUND"));
			((BaseUnityPlugin)this).Logger.LogInfo((object)$"{val.spawnPrefab} prefab");
			if (!CarIsInBlacklist(val.itemName))
			{
				NetworkPrefabs.RegisterNetworkPrefab(val.spawnPrefab);
				Utilities.FixMixerGroups(val.spawnPrefab);
				Items.RegisterItem(val);
				Items.RegisterShopItem(val, instance.carPrice.Value);
			}
			Item val2 = bundle.LoadAsset<Item>("Assets/LethalCompany/Mods/RCCars/RCCarPolice.asset");
			((BaseUnityPlugin)this).Logger.LogInfo((object)(((Object)val2).name + " FOUND"));
			((BaseUnityPlugin)this).Logger.LogInfo((object)$"{val2.spawnPrefab} prefab");
			if (!CarIsInBlacklist(val2.itemName))
			{
				NetworkPrefabs.RegisterNetworkPrefab(val2.spawnPrefab);
				Utilities.FixMixerGroups(val2.spawnPrefab);
				Items.RegisterItem(val2);
				Items.RegisterShopItem(val2, instance.policeCarPrice.Value);
			}
			Item val3 = bundle.LoadAsset<Item>("Assets/LethalCompany/Mods/RCCars/RCCarAmbulance.asset");
			((BaseUnityPlugin)this).Logger.LogInfo((object)(((Object)val3).name + " FOUND"));
			((BaseUnityPlugin)this).Logger.LogInfo((object)$"{val3.spawnPrefab} prefab");
			if (!CarIsInBlacklist(val3.itemName))
			{
				NetworkPrefabs.RegisterNetworkPrefab(val3.spawnPrefab);
				Utilities.FixMixerGroups(val3.spawnPrefab);
				Items.RegisterItem(val3);
				Items.RegisterShopItem(val3, instance.ambulanceCarPrice.Value);
			}
			Item val4 = bundle.LoadAsset<Item>("Assets/LethalCompany/Mods/RCCars/RCSportCar.asset");
			((BaseUnityPlugin)this).Logger.LogInfo((object)(((Object)val4).name + " FOUND"));
			((BaseUnityPlugin)this).Logger.LogInfo((object)$"{val4.spawnPrefab} prefab");
			if (!CarIsInBlacklist(val4.itemName))
			{
				NetworkPrefabs.RegisterNetworkPrefab(val4.spawnPrefab);
				Utilities.FixMixerGroups(val4.spawnPrefab);
				Items.RegisterItem(val4);
				Items.RegisterShopItem(val4, instance.sportCarPrice.Value);
			}
			Item val5 = bundle.LoadAsset<Item>("Assets/LethalCompany/Mods/RCCars/RCCarBomb.asset");
			((BaseUnityPlugin)this).Logger.LogInfo((object)(((Object)val5).name + " FOUND"));
			((BaseUnityPlugin)this).Logger.LogInfo((object)$"{val5.spawnPrefab} prefab");
			if (!CarIsInBlacklist(val5.itemName))
			{
				NetworkPrefabs.RegisterNetworkPrefab(val5.spawnPrefab);
				Utilities.FixMixerGroups(val5.spawnPrefab);
				Items.RegisterItem(val5);
				Items.RegisterShopItem(val5, instance.bombCarPrice.Value);
			}
			Item val6 = bundle.LoadAsset<Item>("Assets/LethalCompany/Mods/RCCars/RCCruiserCar.asset");
			((BaseUnityPlugin)this).Logger.LogInfo((object)(((Object)val6).name + " FOUND"));
			((BaseUnityPlugin)this).Logger.LogInfo((object)$"{val6.spawnPrefab} prefab");
			if (!CarIsInBlacklist(val6.itemName))
			{
				NetworkPrefabs.RegisterNetworkPrefab(val6.spawnPrefab);
				Utilities.FixMixerGroups(val6.spawnPrefab);
				Items.RegisterItem(val6);
				Items.RegisterShopItem(val6, instance.cruiserCarPrice.Value);
			}
			Item val7 = bundle.LoadAsset<Item>("Assets/LethalCompany/Mods/RCCars/RCCarWexop.asset");
			((BaseUnityPlugin)this).Logger.LogInfo((object)(((Object)val7).name + " FOUND"));
			((BaseUnityPlugin)this).Logger.LogInfo((object)$"{val7.spawnPrefab} prefab");
			if (!CarIsInBlacklist(val7.itemName))
			{
				NetworkPrefabs.RegisterNetworkPrefab(val7.spawnPrefab);
				Utilities.FixMixerGroups(val7.spawnPrefab);
				Items.RegisterItem(val7);
				Items.RegisterShopItem(val7, instance.wexopCarPrice.Value);
			}
		}

		public void LoadConfigs()
		{
			honkVolume = ((BaseUnityPlugin)this).Config.Bind<float>("General", "honkVolume", 1f, "Honk volume. No need to restart the game :)");
			CreateFloatConfig(honkVolume, 0f, 2f);
			engineVolume = ((BaseUnityPlugin)this).Config.Bind<float>("General", "engineVolume", 0.2f, "Engine volume. No need to restart the game :)");
			CreateFloatConfig(engineVolume, 0f, 2f);
			rotationSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("General", "rotationSpeed", 7f, "Cars rotation speed. No need to restart the game :)");
			CreateFloatConfig(rotationSpeed, 0f, 200f);
			explosionDamage = ((BaseUnityPlugin)this).Config.Bind<int>("General", "explosionDamage", 50, "Cars explosion damage on destroy. No need to restart the game :)");
			CreateIntConfig(explosionDamage, 0, 200);
			blacklistCar = ((BaseUnityPlugin)this).Config.Bind<string>("General", "blacklistCar", "RCWexopCar", "Blacklist car, they will not be added into the game. You can find cars name into the terminal store. Use this config like this : RCCar,RCPoliceCar");
			CreateStringConfig(blacklistCar, requireRestart: true);
			syncInterval = ((BaseUnityPlugin)this).Config.Bind<float>("General", "syncInterval", 0.35f, "Cars sync interval between players. No need to restart the game :)");
			CreateFloatConfig(syncInterval, 0f, 2f);
			carPrice = ((BaseUnityPlugin)this).Config.Bind<int>("Price", "carPrice", 100, "Normal car price. You need to restart the game.");
			CreateIntConfig(carPrice, 0, 1000, restart: true);
			policeCarPrice = ((BaseUnityPlugin)this).Config.Bind<int>("Price", "policeCarPrice", 150, "Police car price. You need to restart the game.");
			CreateIntConfig(policeCarPrice, 0, 1000, restart: true);
			ambulanceCarPrice = ((BaseUnityPlugin)this).Config.Bind<int>("Price", "ambulanceCarPrice", 175, "Ambulance car price. You need to restart the game.");
			CreateIntConfig(ambulanceCarPrice, 0, 1000, restart: true);
			sportCarPrice = ((BaseUnityPlugin)this).Config.Bind<int>("Price", "sportCarPrice", 200, "Sport car price. You need to restart the game.");
			CreateIntConfig(sportCarPrice, 0, 1000, restart: true);
			bombCarPrice = ((BaseUnityPlugin)this).Config.Bind<int>("Price", "bombCarPrice", 75, "Bomb car price. You need to restart the game.");
			CreateIntConfig(bombCarPrice, 0, 1000, restart: true);
			cruiserCarPrice = ((BaseUnityPlugin)this).Config.Bind<int>("Price", "cruiserCarPrice", 125, "Cruiser car price. You need to restart the game.");
			CreateIntConfig(cruiserCarPrice, 0, 1000, restart: true);
			wexopCarPrice = ((BaseUnityPlugin)this).Config.Bind<int>("Price", "wexopCarPrice", 200, "Wexop car price. You need to restart the game.");
			CreateIntConfig(wexopCarPrice, 0, 1000, restart: true);
		}

		public static string ConditionalString(string value)
		{
			string text = value.ToLower();
			while (text.Contains(" "))
			{
				text = text.Replace(" ", "");
			}
			return text;
		}

		private bool CarIsInBlacklist(string name)
		{
			if (instance.blacklistCar.Value == "")
			{
				return false;
			}
			string nameSearch = ConditionalString(name);
			bool disable = false;
			instance.blacklistCar.Value.Split(",").ToList().ForEach(delegate(string hazard)
			{
				if (hazard != "")
				{
					string value = ConditionalString(hazard);
					if (nameSearch.Contains(value))
					{
						disable = true;
					}
				}
			});
			return disable;
		}

		private void CreateFloatConfig(ConfigEntry<float> configEntry, float min = 0f, float max = 100f)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Expected O, but got Unknown
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Expected O, but got Unknown
			FloatSliderOptions val = new FloatSliderOptions();
			((BaseRangeOptions<float>)val).Min = min;
			((BaseRangeOptions<float>)val).Max = max;
			((BaseOptions)val).RequiresRestart = false;
			FloatSliderConfigItem val2 = new FloatSliderConfigItem(configEntry, val);
			LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val2);
		}

		private void CreateIntConfig(ConfigEntry<int> configEntry, int min = 0, int max = 100, bool restart = false)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Expected O, but got Unknown
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Expected O, but got Unknown
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			IntSliderOptions val = new IntSliderOptions();
			((BaseRangeOptions<int>)val).Min = min;
			((BaseRangeOptions<int>)val).Max = max;
			((BaseOptions)val).RequiresRestart = restart;
			IntSliderConfigItem val2 = new IntSliderConfigItem(configEntry, val);
			LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val2);
		}

		private void CreateStringConfig(ConfigEntry<string> configEntry, bool requireRestart = false)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Expected O, but got Unknown
			TextInputFieldConfigItem val = new TextInputFieldConfigItem(configEntry, new TextInputFieldOptions
			{
				RequiresRestart = requireRestart
			});
			LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val);
		}

		private void CreateBoolConfig(ConfigEntry<bool> configEntry)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Expected O, but got Unknown
			BoolCheckBoxConfigItem val = new BoolCheckBoxConfigItem(configEntry, new BoolCheckBoxOptions
			{
				RequiresRestart = false
			});
			LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val);
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "RCCars";

		public const string PLUGIN_NAME = "RCCars";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace RCCars.Scripts
{
	public class EnableDecalLayer : MonoBehaviour
	{
		private void Start()
		{
			MeshRenderer component = ((Component)this).GetComponent<MeshRenderer>();
			((Renderer)component).renderingLayerMask = 257u;
		}
	}
	public class RCBombCarItem : RCCarItem
	{
		public override void Honk()
		{
			SetNewHealth(0);
		}
	}
	public class RCCarItem : PhysicsProp, IHittable
	{
		public Rigidbody rigidbody;

		public NavMeshAgent navMeshAgent;

		public TextMeshProUGUI playerText;

		public List<Light> carLights;

		public Light carVisionLight;

		public Color carLightsColor;

		public Camera carCamera;

		public Transform itemHeldPosition;

		public AudioSource SfxAudioSource;

		public AudioSource drivingAudioSource;

		public GameObject carBody;

		public AudioClip honkAudio;

		public AudioClip drivingLoop;

		public GrabbableObject itemHeld;

		public float speed = 0.4f;

		public float syncInterval = 0.5f;

		public bool playerIsDriving;

		public bool playerIsLocal;

		public float honkInterval = 1f;

		public float rotationSpeed = 10f;

		public int MaxHealth = 2;

		public int Health = 2;

		public ParticleSystem smokeParticules;

		public ParticleSystem explosion;

		public AudioClip explosionAudio;

		public float explosionRange;

		private PlayerControllerB playerDriving;

		private Camera playerCamera;

		private Ray interactRay;

		private RaycastHit hit;

		private Vector3 dropPos;

		private bool shouldBeDropPos;

		private bool carIsMoving;

		private bool lastFrameCarIsMoving;

		private float interactTimer;

		private float honkTimer;

		private float posSyncTimer;

		private float hitTimer;

		public void RegisterCar()
		{
			if (RCCarsPlugin.instance.RegistredCars.ContainsKey(((NetworkBehaviour)this).NetworkObjectId))
			{
				RCCarsPlugin.instance.RegistredCars.Remove(((NetworkBehaviour)this).NetworkObjectId);
			}
			RegistredCar registredCar = new RegistredCar();
			registredCar.networkObjectId = ((NetworkBehaviour)this).NetworkObjectId;
			registredCar.rcCarItem = this;
			RCCarsPlugin.instance.RegistredCars.Add(((NetworkBehaviour)this).NetworkObjectId, registredCar);
		}

		public void RefreshPluginValues()
		{
			drivingAudioSource.volume = RCCarsPlugin.instance.engineVolume.Value;
			SfxAudioSource.volume = RCCarsPlugin.instance.honkVolume.Value;
			rotationSpeed = RCCarsPlugin.instance.rotationSpeed.Value;
			syncInterval = RCCarsPlugin.instance.syncInterval.Value;
		}

		public override void Start()
		{
			((GrabbableObject)this).Start();
			EnableCamera(enable: false);
			CarLights(on: false);
			navMeshAgent.speed = 50f;
			((Behaviour)navMeshAgent).enabled = false;
			RegisterCar();
			RefreshPluginValues();
			((TMP_Text)playerText).text = "";
		}

		public void EnableCamera(bool enable)
		{
			((Component)carCamera).gameObject.SetActive(enable);
		}

		public void CarLights(bool on)
		{
			carLights.ForEach(delegate(Light l)
			{
				//IL_0017: Unknown result type (might be due to invalid IL or missing references)
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				l.color = (on ? carLightsColor : Color.black);
			});
			((Behaviour)carVisionLight).enabled = on;
		}

		public void ChangeToolTips()
		{
			List<string> list = new List<string> { "[G] Leave RCCar", "[LMB] Honk" };
			if ((Object)(object)itemHeld != (Object)null)
			{
				list.Add("[E] Drop " + itemHeld.itemProperties.itemName);
			}
			HUDManager.Instance.ClearControlTips();
			HUDManager.Instance.ChangeControlTipMultiple(list.ToArray(), false, (Item)null);
		}

		public IEnumerator SetPlayerBack(PlayerControllerB player)
		{
			yield return (object)new WaitForSeconds((Health <= 0) ? 0.8f : 0f);
			EnableCamera(enable: false);
			if ((Object)(object)playerCamera != (Object)null)
			{
				player.gameplayCamera = playerCamera;
			}
			player.disableMoveInput = false;
			player.disableLookInput = false;
			player.disableInteract = false;
			HUDManager.Instance.ClearControlTips();
		}

		public void ChangePlayerControls(PlayerControllerB player, bool driving)
		{
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f9: 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_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: 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_0178: Unknown result type (might be due to invalid IL or missing references)
			//IL_017d: Unknown result type (might be due to invalid IL or missing references)
			RefreshPluginValues();
			playerIsLocal = player.playerClientId == GameNetworkManager.Instance.localPlayerController.playerClientId;
			if (player.isInHangarShipRoom && driving)
			{
				if (playerIsLocal)
				{
					HUDManager.Instance.DisplayTip("Warning", "You can't drive in the ship !", false, false, "LC_Tip1");
				}
				return;
			}
			if (RoundManager.Instance.currentLevel.PlanetName.Contains("Gordion") && driving)
			{
				if (playerIsLocal)
				{
					HUDManager.Instance.DisplayTip("Warning", "You can't drive in company building !", false, false, "LC_Tip1");
				}
				return;
			}
			dropPos = ((Component)this).transform.localPosition;
			playerIsDriving = driving;
			((GrabbableObject)this).grabbable = !driving;
			CarLights(driving);
			rigidbody.useGravity = driving;
			((Behaviour)navMeshAgent).enabled = driving;
			if (driving)
			{
				if (playerIsLocal)
				{
					EnableCamera(enable: true);
					player.DiscardHeldObject(false, (NetworkObject)null, default(Vector3), true);
					playerCamera = player.gameplayCamera;
					player.gameplayCamera = carCamera;
					player.disableMoveInput = true;
					player.disableLookInput = true;
					player.disableInteract = true;
					ChangeToolTips();
				}
				else
				{
					((TMP_Text)playerText).text = player.playerUsername;
				}
				((GrabbableObject)this).targetFloorPosition = ((GrabbableObject)this).GetItemFloorPosition(((Component)this).transform.localPosition);
				((GrabbableObject)this).parentObject = null;
				honkTimer = honkInterval - 1f;
				playerDriving = player;
			}
			else
			{
				if (playerIsLocal)
				{
					((MonoBehaviour)this).StartCoroutine(SetPlayerBack(player));
				}
				((GrabbableObject)this).parentObject = null;
				((TMP_Text)playerText).text = "";
				((GrabbableObject)this).reachedFloorTarget = false;
				((Component)this).transform.localPosition = dropPos;
				((GrabbableObject)this).startFallingPosition = dropPos;
				((GrabbableObject)this).FallToGround(false);
				((GrabbableObject)this).grabbable = true;
				DropHeldItem();
				drivingAudioSource.Stop();
				playerIsLocal = false;
			}
		}

		public void OnStopUsingCar(Vector3 pos)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)playerDriving))
			{
				((Component)this).transform.position = pos;
				if (playerIsLocal)
				{
					ChangePlayerControls(GameNetworkManager.Instance.localPlayerController, driving: false);
				}
				else
				{
					ChangePlayerControls(playerDriving, driving: false);
				}
			}
		}

		public void DropHeldItem()
		{
			//IL_0038: 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_006f: 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)
			if (!((Object)(object)itemHeld == (Object)null))
			{
				itemHeld.reachedFloorTarget = false;
				((Component)itemHeld).transform.position = ((Component)itemHeld).transform.position;
				itemHeld.targetFloorPosition = ((Component)itemHeld).transform.position;
				itemHeld.startFallingPosition = ((Component)itemHeld).transform.position;
				itemHeld.FallToGround(false);
				itemHeld.grabbable = true;
				itemHeld = null;
				ChangeToolTips();
			}
		}

		public override void ItemActivate(bool used, bool buttonDown = true)
		{
			((GrabbableObject)this).ItemActivate(used, buttonDown);
			if (Object.op_Implicit((Object)(object)((GrabbableObject)this).playerHeldBy))
			{
				ChangePlayerControls(((GrabbableObject)this).playerHeldBy, driving: true);
			}
		}

		public void GrabItem(GrabbableObject item)
		{
			DropHeldItem();
			itemHeld = item;
			itemHeld.grabbable = false;
			ChangeToolTips();
		}

		public void HonkOnEveryClient()
		{
			RCCarNetwork.CarHonkServerRpc(((NetworkBehaviour)this).NetworkObjectId);
		}

		public virtual void Honk()
		{
			RefreshPluginValues();
			SfxAudioSource.clip = honkAudio;
			SfxAudioSource.Play();
			honkTimer = 0f;
		}

		public void SyncPositionClient(Vector3 pos)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)playerDriving) && !playerIsLocal && ((Behaviour)navMeshAgent).enabled)
			{
				navMeshAgent.SetDestination(pos);
			}
		}

		public void StopDrivingSoundClient(bool turnOff)
		{
			if (turnOff)
			{
				drivingAudioSource.Stop();
			}
			else
			{
				drivingAudioSource.Play();
			}
		}

		public override void Update()
		{
			//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_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_01eb: 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_01f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0205: 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_02a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0277: 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_028c: Unknown result type (might be due to invalid IL or missing references)
			hitTimer += Time.deltaTime;
			if (Object.op_Implicit((Object)(object)playerDriving) && !playerIsLocal)
			{
				Vector3 velocity = navMeshAgent.velocity;
				carIsMoving = !((Vector3)(ref velocity)).Equals(Vector3.zero);
				if (carIsMoving != lastFrameCarIsMoving)
				{
					lastFrameCarIsMoving = carIsMoving;
					if (!carIsMoving)
					{
						drivingAudioSource.Stop();
					}
					else
					{
						drivingAudioSource.clip = drivingLoop;
						drivingAudioSource.Play();
					}
				}
			}
			if (shouldBeDropPos)
			{
				((Component)this).transform.position = dropPos;
				shouldBeDropPos = false;
			}
			if (!playerIsDriving)
			{
				((GrabbableObject)this).Update();
			}
			if (!playerIsDriving || !playerIsLocal)
			{
				return;
			}
			if (playerDriving.isPlayerDead)
			{
				RCCarNetwork.StopUseCarServerRpc(((NetworkBehaviour)this).NetworkObjectId, ((Component)this).transform.position);
			}
			if (!playerIsDriving)
			{
				return;
			}
			interactTimer += Time.deltaTime;
			honkTimer += Time.deltaTime;
			posSyncTimer += Time.deltaTime;
			float num = IngamePlayerSettings.Instance.playerInput.actions.FindAction("ActivateItem", false).ReadValue<float>();
			if (num > 0f && honkTimer >= honkInterval)
			{
				HonkOnEveryClient();
			}
			Vector3 val = Vector2.op_Implicit(IngamePlayerSettings.Instance.playerInput.actions.FindAction("Move", false).ReadValue<Vector2>());
			if (val.x != 0f || val.y != 0f)
			{
				if (!drivingAudioSource.isPlaying)
				{
					drivingAudioSource.clip = drivingLoop;
					drivingAudioSource.Play();
				}
				if (val.y > 0f)
				{
					navMeshAgent.Move(((Component)this).transform.forward * speed * Time.deltaTime);
				}
				((Component)this).transform.eulerAngles = new Vector3(0f, ((Component)this).transform.eulerAngles.y + val.x * rotationSpeed, 0f);
			}
			else
			{
				drivingAudioSource.Stop();
			}
		}

		public override void LateUpdate()
		{
			//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_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_0071: 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_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: 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_0184: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: 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_0194: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: 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)
			if (!playerIsDriving)
			{
				((GrabbableObject)this).LateUpdate();
			}
			if ((Object)(object)itemHeld != (Object)null)
			{
				((GrabbableObject)this).reachedFloorTarget = false;
				itemHeld.targetFloorPosition = itemHeldPosition.position;
				itemHeld.startFallingPosition = itemHeldPosition.position;
				((Component)itemHeld).gameObject.transform.position = itemHeldPosition.position + Vector3.up * (float)itemHeld.itemProperties.floorYOffset;
			}
			if (!playerIsDriving || !playerIsLocal)
			{
				return;
			}
			float num = IngamePlayerSettings.Instance.playerInput.actions.FindAction("Interact", false).ReadValue<float>();
			if (num > 0f && (Object)(object)itemHeld != (Object)null && interactTimer >= 1f)
			{
				interactTimer = 0f;
				RCCarNetwork.CarDropItemServerRpc(((NetworkBehaviour)this).NetworkObjectId);
				ChangeToolTips();
			}
			float num2 = IngamePlayerSettings.Instance.playerInput.actions.FindAction("Discard", false).ReadValue<float>();
			if (num2 > 0f)
			{
				RCCarNetwork.StopUseCarServerRpc(((NetworkBehaviour)this).NetworkObjectId, ((Component)this).transform.position);
			}
			interactRay = new Ray(((Component)this).transform.position, ((Component)this).transform.forward);
			if (Physics.Raycast(interactRay, ref hit, 10f, 1073742656) && ((Component)((RaycastHit)(ref hit)).collider).gameObject.layer != 8 && ((Component)((RaycastHit)(ref hit)).collider).gameObject.layer != 30)
			{
				GrabbableObject component = ((Component)((RaycastHit)(ref hit)).collider).gameObject.GetComponent<GrabbableObject>();
				if (component.grabbable)
				{
					((TMP_Text)GameNetworkManager.Instance.localPlayerController.cursorTip).text = "Grab : [E]";
					if (num > 0f)
					{
						interactTimer = 0f;
						RCCarNetwork.CarGrabItemServerRpc(((NetworkBehaviour)this).NetworkObjectId, ((NetworkBehaviour)component).NetworkObjectId);
					}
				}
			}
			if (posSyncTimer >= syncInterval)
			{
				posSyncTimer = 0f;
				RCCarNetwork.SyncCarPositionServerRpc(((NetworkBehaviour)this).NetworkObjectId, ((Component)this).transform.position);
			}
		}

		public void SetNewHealth(int health)
		{
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: 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)
			Health = health;
			if (Health < MaxHealth && !smokeParticules.isPlaying)
			{
				smokeParticules.Play();
			}
			if (Health > 0)
			{
				return;
			}
			explosion.Play();
			SfxAudioSource.PlayOneShot(explosionAudio);
			RCCarNetwork.StopUseCarServerRpc(((NetworkBehaviour)this).NetworkObjectId, ((Component)this).transform.position);
			if (Vector3.Distance(((Component)GameNetworkManager.Instance.localPlayerController).transform.position, ((Component)this).transform.position) <= explosionRange)
			{
				GameNetworkManager.Instance.localPlayerController.DamagePlayer(RCCarsPlugin.instance.explosionDamage.Value, true, true, (CauseOfDeath)0, 0, false, default(Vector3));
			}
			List<EnemyAI> list = Object.FindObjectsOfType<EnemyAI>().ToList();
			list.ForEach(delegate(EnemyAI enemy)
			{
				//IL_0007: 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)
				if (Vector3.Distance(((Component)enemy).transform.position, ((Component)this).transform.position) <= explosionRange)
				{
					enemy.HitEnemy(3, (PlayerControllerB)null, false, -1);
				}
			});
			List<RCCarItem> list2 = Object.FindObjectsOfType<RCCarItem>().ToList();
			list2.ForEach(delegate(RCCarItem car)
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				//IL_0031: Unknown result type (might be due to invalid IL or missing references)
				if (((NetworkBehaviour)car).NetworkObjectId != ((NetworkBehaviour)this).NetworkObjectId && car.Health > 0 && Vector3.Distance(((Component)car).transform.position, ((Component)this).transform.position) <= explosionRange && ((NetworkBehaviour)this).IsServer)
				{
					RCCarNetwork.SetCarHealthServerRpc(((NetworkBehaviour)car).NetworkObjectId, car.Health - 2);
				}
			});
			((MonoBehaviour)this).StartCoroutine(DestroyObject());
		}

		public IEnumerator DestroyObject()
		{
			carBody.SetActive(false);
			yield return (object)new WaitForSeconds(1f);
			RCCarsPlugin.instance.RegistredCars.Remove(((NetworkBehaviour)this).NetworkObjectId);
			if (((NetworkBehaviour)this).IsServer)
			{
				Object.Destroy((Object)(object)((Component)this).gameObject);
			}
		}

		public bool Hit(int force, Vector3 hitDirection, PlayerControllerB playerWhoHit = null, bool playHitSFX = false, int hitID = -1)
		{
			if (hitTimer >= 0.2f)
			{
				hitTimer = 0f;
				RCCarNetwork.SetCarHealthServerRpc(((NetworkBehaviour)this).NetworkObjectId, Health - force);
			}
			return true;
		}
	}
	[StaticNetcode]
	public class RCCarNetwork
	{
		public static RegistredCar GetRegistredCar(ulong networkId)
		{
			RegistredCar registredCar = null;
			if (RCCarsPlugin.instance.RegistredCars.ContainsKey(networkId))
			{
				registredCar = RCCarsPlugin.instance.RegistredCars[networkId];
			}
			if (registredCar == null)
			{
				Debug.LogError((object)$"COULD NOT FOUND CAR WITH ID {networkId}");
			}
			return registredCar;
		}

		public static GrabbableObject GetItem(ulong networkId)
		{
			List<GrabbableObject> list = Object.FindObjectsByType<GrabbableObject>((FindObjectsSortMode)0).ToList();
			GrabbableObject val = list.Find((GrabbableObject e) => ((NetworkBehaviour)e).NetworkObjectId == networkId);
			if ((Object)(object)val == (Object)null)
			{
				Debug.LogError((object)$"COULD NOT FOUND ITEM WITH ID {networkId}");
			}
			return val;
		}

		[ServerRpc]
		public static void CarHonkServerRpc(ulong networkId)
		{
			CarHonkClientRpc(networkId);
		}

		[ClientRpc]
		public static void CarHonkClientRpc(ulong networkId)
		{
			GetRegistredCar(networkId)?.rcCarItem.Honk();
		}

		[ServerRpc]
		public static void StopUseCarServerRpc(ulong networkId, Vector3 pos)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			StopUseCarClientRpc(networkId, pos);
		}

		[ClientRpc]
		public static void StopUseCarClientRpc(ulong networkId, Vector3 pos)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			GetRegistredCar(networkId)?.rcCarItem.OnStopUsingCar(pos);
		}

		[ServerRpc]
		public static void UpdateDrivingSoundServerRpc(ulong networkId, bool value)
		{
			UpdateDrivingSoundClientRpc(networkId, value);
		}

		[ClientRpc]
		public static void UpdateDrivingSoundClientRpc(ulong networkId, bool value)
		{
			GetRegistredCar(networkId)?.rcCarItem.StopDrivingSoundClient(value);
		}

		[ServerRpc]
		public static void CarGrabItemServerRpc(ulong networkId, ulong itemNetworkId)
		{
			CarGrabItemClientRpc(networkId, itemNetworkId);
		}

		[ClientRpc]
		public static void CarGrabItemClientRpc(ulong networkId, ulong itemNetworkId)
		{
			RegistredCar registredCar = GetRegistredCar(networkId);
			if (registredCar != null)
			{
				GrabbableObject item = GetItem(itemNetworkId);
				if (!((Object)(object)item == (Object)null))
				{
					registredCar.rcCarItem.GrabItem(item);
				}
			}
		}

		[ServerRpc]
		public static void CarDropItemServerRpc(ulong networkId)
		{
			CarDropItemClientRpc(networkId);
		}

		[ClientRpc]
		public static void CarDropItemClientRpc(ulong networkId)
		{
			GetRegistredCar(networkId)?.rcCarItem.DropHeldItem();
		}

		[ServerRpc]
		public static void SyncCarPositionServerRpc(ulong networkId, Vector3 pos)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			SyncCarPositionClientRpc(networkId, pos);
		}

		[ClientRpc]
		public static void SyncCarPositionClientRpc(ulong networkId, Vector3 pos)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			GetRegistredCar(networkId)?.rcCarItem.SyncPositionClient(pos);
		}

		[ServerRpc]
		public static void SetCarHealthServerRpc(ulong networkId, int health)
		{
			SetCarHealthClientRpc(networkId, health);
		}

		[ClientRpc]
		public static void SetCarHealthClientRpc(ulong networkId, int health)
		{
			GetRegistredCar(networkId)?.rcCarItem.SetNewHealth(health);
		}
	}
	public class RCPoliceCarItem : RCCarItem
	{
		public List<Light> blueLights;

		private bool blueLightsAnimationRunning;

		private int actualBlueLightEnabled;

		private float blueLightsAnimationTimer;

		private float blueLightsInterval = 0.5f;

		public override void Start()
		{
			TurnOffBlueLights();
			base.Start();
		}

		public void SwitchBlueLights()
		{
			((Behaviour)blueLights[0]).enabled = actualBlueLightEnabled == 1;
			((Behaviour)blueLights[1]).enabled = actualBlueLightEnabled == 0;
			actualBlueLightEnabled = ((actualBlueLightEnabled == 0) ? 1 : 0);
		}

		public void TurnOffBlueLights()
		{
			blueLights.ForEach(delegate(Light l)
			{
				((Behaviour)l).enabled = false;
			});
		}

		public IEnumerator RunBlueLightsAnimation()
		{
			yield return (object)new WaitForSeconds(10f);
			blueLightsAnimationRunning = false;
			TurnOffBlueLights();
		}

		public override void Honk()
		{
			base.Honk();
			blueLightsAnimationRunning = true;
			((MonoBehaviour)this).StopCoroutine(RunBlueLightsAnimation());
			((MonoBehaviour)this).StartCoroutine(RunBlueLightsAnimation());
		}

		public override void Update()
		{
			if (blueLightsAnimationRunning)
			{
				blueLightsAnimationTimer += Time.deltaTime;
				if (blueLightsAnimationTimer >= blueLightsInterval)
				{
					SwitchBlueLights();
					blueLightsAnimationTimer = 0f;
				}
			}
			base.Update();
		}
	}
	public class RegistredCar
	{
		public ulong networkObjectId;

		public RCCarItem rcCarItem;
	}
}