Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of PolaroidCamera v0.1.9
plugins/Camera-Mod/CameraCore.dll
Decompiled 2 years agousing System; using System.CodeDom.Compiler; 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.Runtime.InteropServices; using System.Runtime.Serialization.Formatters.Binary; using System.Text.RegularExpressions; using BHCamera; using BHCamera.Patches; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LC_API.BundleAPI; using LethalLib.Modules; using Unity.Collections; using Unity.Netcode; using Unity.Netcode.Components; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyVersion("0.0.0.0")] internal class <Module> { static <Module>() { } } public class CameraPluginConfig : SyncedInstance<CameraPluginConfig> { [StructLayout(LayoutKind.Sequential, Size = 1)] public struct ImageSettings { public TextureFormat ImageFormat => (TextureFormat)3; public int ImageResolution => 256; } private static ConfigEntry<string> _configImageFormat; private static ConfigEntry<int> _configPhotoResolution; private static ConfigEntry<string> _configRateLimit; private static ConfigEntry<int> _configCameraPrice; public ImageSettings imageSettings; private string rateLimit; public int cameraPrice => 50; public float RateLimit { get { string input = NormalizeConfigValue(rateLimit); string s = Regex.Replace(input, "[0-9]*", ""); string text = Regex.Replace(input, "[^0-9]*", "").ToLower(); int num = int.Parse(s); int num2 = 1; switch (text) { case "mb": num2 = 1000000; break; case "kb": num2 = 1000; break; default: CameraPlugin.Log.LogError((object)("Invalid Suffix for Rate Limit Given: " + text + " Defaulting to b")); break; case "b": break; } return num * num2; } } public CameraPluginConfig() { InitInstance(this); } public void SetUp(CameraPlugin instance) { //IL_00b3: Unknown result type (might be due to invalid IL or missing references) _configImageFormat = ((BaseUnityPlugin)instance).Config.Bind<string>("Image Settings", "ImageFormat", "RGB24", "Use Unity's built-in TextureFormat for potential values. This will have heavy effects on the performance"); _configPhotoResolution = ((BaseUnityPlugin)instance).Config.Bind<int>("Image Settings", "ImageResolution", 64, "The resolution of the images taken by a camera. Changing this will break all existing images"); _configRateLimit = ((BaseUnityPlugin)instance).Config.Bind<string>("Network Settings", "RateLimit", "", "WIP. Unused. use b (bytes), kb (kilobytes), or mb (megabytes). Leaving it blank will leave the rate limit unbounded"); _configCameraPrice = ((BaseUnityPlugin)instance).Config.Bind<int>("General Settings", "CameraPrice", 50, "The price that shows up on the store"); if (!Enum.TryParse<TextureFormat>(NormalizeConfigValue(_configImageFormat.Value), out TextureFormat result)) { CameraPlugin.Log.LogError((object)"Invalid Setting for Image Format. Defaulting to R8."); result = (TextureFormat)63; } rateLimit = _configRateLimit.Value; } private static string NormalizeConfigValue(string value) { return value.Trim(); } public static void RequestSync() { //IL_0022: Unknown result type (might be due to invalid IL or missing references) if (!SyncedInstance<CameraPluginConfig>.IsClient) { return; } FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(SyncedInstance<CameraPluginConfig>.IntSize, (Allocator)2, -1); try { SyncedInstance<CameraPluginConfig>.MessageManager.SendNamedMessage("PolaroidCamera_OnRequestConfigSync", 0uL, val, (NetworkDelivery)3); } finally { ((IDisposable)(FastBufferWriter)(ref val)).Dispose(); } } public static void OnRequestSync(ulong clientId, FastBufferReader _) { //IL_0047: 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_0068: Unknown result type (might be due to invalid IL or missing references) if (!SyncedInstance<CameraPluginConfig>.IsHost) { return; } CameraPlugin.Log.LogInfo((object)$"Config sync request received from client: {clientId}"); byte[] array = SyncedInstance<CameraPluginConfig>.SerializeToBytes(SyncedInstance<CameraPluginConfig>.Instance); int num = array.Length; FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(num + SyncedInstance<CameraPluginConfig>.IntSize, (Allocator)2, -1); try { ((FastBufferWriter)(ref val)).WriteValueSafe<int>(ref num, default(ForPrimitives)); ((FastBufferWriter)(ref val)).WriteBytesSafe(array, -1, 0); SyncedInstance<CameraPluginConfig>.MessageManager.SendNamedMessage("PolaroidCamera_OnReceiveConfigSync", clientId, val, (NetworkDelivery)3); } catch (Exception arg) { CameraPlugin.Log.LogInfo((object)$"Error occurred syncing config with client: {clientId}\n{arg}"); } finally { ((IDisposable)(FastBufferWriter)(ref val)).Dispose(); } } public static void OnReceiveSync(ulong _, FastBufferReader reader) { //IL_0024: 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) if (!((FastBufferReader)(ref reader)).TryBeginRead(SyncedInstance<CameraPluginConfig>.IntSize)) { CameraPlugin.Log.LogError((object)"Config sync error: Could not begin reading buffer."); return; } int num = default(int); ((FastBufferReader)(ref reader)).ReadValueSafe<int>(ref num, default(ForPrimitives)); if (!((FastBufferReader)(ref reader)).TryBeginRead(num)) { CameraPlugin.Log.LogError((object)"Config sync error: Host could not sync."); return; } byte[] data = new byte[num]; ((FastBufferReader)(ref reader)).ReadBytesSafe(ref data, num, 0); SyncedInstance<CameraPluginConfig>.SyncInstance(data); CameraPlugin.Log.LogInfo((object)"Successfully synced config with host."); } [HarmonyPostfix] [HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")] public static void InitializeLocalPlayer() { //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown if (SyncedInstance<CameraPluginConfig>.IsHost) { SyncedInstance<CameraPluginConfig>.MessageManager.RegisterNamedMessageHandler("PolaroidCamera_OnRequestConfigSync", new HandleNamedMessageDelegate(OnRequestSync)); SyncedInstance<CameraPluginConfig>.Synced = true; } else { SyncedInstance<CameraPluginConfig>.Synced = false; SyncedInstance<CameraPluginConfig>.MessageManager.RegisterNamedMessageHandler("PolaroidCamera_OnReceiveConfigSync", new HandleNamedMessageDelegate(OnReceiveSync)); RequestSync(); } } [HarmonyPostfix] [HarmonyPatch(typeof(GameNetworkManager), "StartDisconnect")] public static void PlayerLeave() { SyncedInstance<CameraPluginConfig>.RevertSync(); CameraImageRegistry.GetInstance().Reset(); } } [CompilerGenerated] [EditorBrowsable(EditorBrowsableState.Never)] [GeneratedCode("Unity.MonoScriptGenerator.MonoScriptInfoGenerator", null)] internal class UnitySourceGeneratedAssemblyMonoScriptTypes_v1 { private struct MonoScriptData { public byte[] FilePathsData; public byte[] TypesData; public int TotalTypes; public int TotalFiles; public bool IsEditorOnly; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static MonoScriptData Get() { MonoScriptData result = default(MonoScriptData); result.FilePathsData = new byte[522] { 0, 0, 0, 1, 0, 0, 0, 59, 92, 65, 115, 115, 101, 116, 115, 92, 67, 97, 109, 101, 114, 97, 92, 65, 115, 115, 101, 109, 98, 108, 105, 101, 115, 92, 67, 97, 109, 101, 114, 97, 67, 111, 114, 101, 92, 67, 97, 109, 101, 114, 97, 73, 109, 97, 103, 101, 82, 101, 103, 105, 115, 116, 114, 121, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 50, 92, 65, 115, 115, 101, 116, 115, 92, 67, 97, 109, 101, 114, 97, 92, 65, 115, 115, 101, 109, 98, 108, 105, 101, 115, 92, 67, 97, 109, 101, 114, 97, 67, 111, 114, 101, 92, 67, 97, 109, 101, 114, 97, 73, 116, 101, 109, 46, 99, 115, 0, 0, 0, 3, 0, 0, 0, 52, 92, 65, 115, 115, 101, 116, 115, 92, 67, 97, 109, 101, 114, 97, 92, 65, 115, 115, 101, 109, 98, 108, 105, 101, 115, 92, 67, 97, 109, 101, 114, 97, 67, 111, 114, 101, 92, 67, 97, 109, 101, 114, 97, 80, 108, 117, 103, 105, 110, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 72, 92, 65, 115, 115, 101, 116, 115, 92, 67, 97, 109, 101, 114, 97, 92, 65, 115, 115, 101, 109, 98, 108, 105, 101, 115, 92, 67, 97, 109, 101, 114, 97, 67, 111, 114, 101, 92, 80, 97, 116, 99, 104, 101, 115, 92, 71, 97, 109, 101, 78, 101, 116, 119, 111, 114, 107, 77, 97, 110, 97, 103, 101, 114, 95, 80, 97, 116, 99, 104, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 71, 92, 65, 115, 115, 101, 116, 115, 92, 67, 97, 109, 101, 114, 97, 92, 65, 115, 115, 101, 109, 98, 108, 105, 101, 115, 92, 67, 97, 109, 101, 114, 97, 67, 111, 114, 101, 92, 80, 97, 116, 99, 104, 101, 115, 92, 80, 108, 97, 121, 101, 114, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 66, 95, 80, 97, 116, 99, 104, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 49, 92, 65, 115, 115, 101, 116, 115, 92, 67, 97, 109, 101, 114, 97, 92, 65, 115, 115, 101, 109, 98, 108, 105, 101, 115, 92, 67, 97, 109, 101, 114, 97, 67, 111, 114, 101, 92, 80, 104, 111, 116, 111, 73, 116, 101, 109, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 51, 92, 65, 115, 115, 101, 116, 115, 92, 67, 97, 109, 101, 114, 97, 92, 65, 115, 115, 101, 109, 98, 108, 105, 101, 115, 92, 67, 97, 109, 101, 114, 97, 67, 111, 114, 101, 92, 83, 99, 114, 97, 112, 76, 111, 97, 100, 101, 114, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 54, 92, 65, 115, 115, 101, 116, 115, 92, 67, 97, 109, 101, 114, 97, 92, 65, 115, 115, 101, 109, 98, 108, 105, 101, 115, 92, 67, 97, 109, 101, 114, 97, 67, 111, 114, 101, 92, 83, 121, 110, 99, 101, 100, 73, 110, 115, 116, 97, 110, 99, 101, 46, 99, 115 }; result.TypesData = new byte[311] { 0, 0, 0, 0, 28, 66, 72, 67, 97, 109, 101, 114, 97, 124, 67, 97, 109, 101, 114, 97, 73, 109, 97, 103, 101, 82, 101, 103, 105, 115, 116, 114, 121, 0, 0, 0, 0, 19, 66, 72, 67, 97, 109, 101, 114, 97, 124, 67, 97, 109, 101, 114, 97, 73, 116, 101, 109, 0, 0, 0, 0, 21, 66, 72, 67, 97, 109, 101, 114, 97, 124, 67, 97, 109, 101, 114, 97, 80, 108, 117, 103, 105, 110, 0, 0, 0, 0, 19, 124, 67, 97, 109, 101, 114, 97, 80, 108, 117, 103, 105, 110, 67, 111, 110, 102, 105, 103, 0, 0, 0, 0, 32, 67, 97, 109, 101, 114, 97, 80, 108, 117, 103, 105, 110, 67, 111, 110, 102, 105, 103, 124, 73, 109, 97, 103, 101, 83, 101, 116, 116, 105, 110, 103, 115, 0, 0, 0, 0, 41, 66, 72, 67, 97, 109, 101, 114, 97, 46, 80, 97, 116, 99, 104, 101, 115, 124, 71, 97, 109, 101, 78, 101, 116, 119, 111, 114, 107, 77, 97, 110, 97, 103, 101, 114, 95, 80, 97, 116, 99, 104, 0, 0, 0, 0, 40, 66, 72, 67, 97, 109, 101, 114, 97, 46, 80, 97, 116, 99, 104, 101, 115, 124, 80, 108, 97, 121, 101, 114, 67, 111, 110, 116, 114, 111, 108, 108, 101, 114, 66, 95, 80, 97, 116, 99, 104, 0, 0, 0, 0, 18, 66, 72, 67, 97, 109, 101, 114, 97, 124, 80, 104, 111, 116, 111, 73, 116, 101, 109, 0, 0, 0, 0, 20, 66, 72, 67, 97, 109, 101, 114, 97, 124, 83, 99, 114, 97, 112, 76, 111, 97, 100, 101, 114, 0, 0, 0, 0, 23, 66, 72, 67, 97, 109, 101, 114, 97, 124, 83, 121, 110, 99, 101, 100, 73, 110, 115, 116, 97, 110, 99, 101 }; result.TotalFiles = 8; result.TotalTypes = 10; result.IsEditorOnly = false; return result; } } namespace BHCamera { public class CameraImageRegistry { private static CameraImageRegistry instance; private int _nextId = 1; private readonly Dictionary<int, byte[]> _imageRegistry; public byte[] this[int index] { get { return _imageRegistry[index]; } set { RegisterImage(value, index); } } public static CameraImageRegistry GetInstance() { return instance ?? (instance = new CameraImageRegistry()); } private CameraImageRegistry() { _imageRegistry = new Dictionary<int, byte[]>(); Reset(); } public void Reset() { _imageRegistry.Clear(); _nextId = 1; } public void LoadImagesFromSave() { string currentSaveFileName = GameNetworkManager.Instance.currentSaveFileName; string[] files = ES3.GetFiles("photos/" + currentSaveFileName); int num = 0; string[] array = files; foreach (string text in array) { int num2 = int.Parse(Regex.Replace(text, "[^0-9]", "")); num = Math.Max(num, num2); int imageResolution = CameraPlugin.CameraConfig.imageSettings.ImageResolution; byte[] value = new byte[imageResolution * imageResolution]; try { value = ES3.LoadImage("photos/" + text).GetRawTextureData(); } catch (Exception ex) { string text2 = "Failed to load " + text; CameraPlugin.Log.LogError((object)text2); CameraPlugin.Log.LogError((object)ex); } _imageRegistry[num2] = value; } _nextId = num + 1; } public void LoadImageFromSave(int id) { string currentSaveFileName = GameNetworkManager.Instance.currentSaveFileName; int imageResolution = CameraPlugin.CameraConfig.imageSettings.ImageResolution; byte[] value = new byte[imageResolution * imageResolution]; string text = "photos/" + currentSaveFileName + "/Photo_" + id + ".raw"; try { value = ES3.LoadRawBytes(text); } catch (Exception ex) { string text2 = "Failed to load " + text; CameraPlugin.Log.LogError((object)text2); CameraPlugin.Log.LogError((object)ex); } _imageRegistry[id] = value; } public void SaveImages() { foreach (KeyValuePair<int, byte[]> item in _imageRegistry) { ES3.SaveRaw(item.Value, "photos/" + GameNetworkManager.Instance.currentSaveFileName + "/Photo_" + item.Key + ".raw"); } } public void SaveImage(int id) { ES3.SaveRaw(_imageRegistry[id], "photos/" + GameNetworkManager.Instance.currentSaveFileName + "/Photo_" + id + ".raw"); } public int RegisterImage(byte[] imageData, int? index = null) { int result; if (index.HasValue) { result = index.Value; _imageRegistry[index.Value] = imageData; } else { while (_imageRegistry.ContainsKey(_nextId)) { _nextId++; } result = _nextId; _imageRegistry[_nextId] = imageData; } return result; } public bool has(int index) { return _imageRegistry.ContainsKey(index); } } public class CameraItem : GrabbableObject { public float renderDistance; private RenderTexture _cameraViewTexture; private Camera camera; private Light flashBulb; private static readonly int MainTexture = Shader.PropertyToID("MainTex"); private static CameraPluginConfig.ImageSettings _imageSettings = CameraPlugin.CameraConfig.imageSettings; private float flashTimeout = 1f; public float[] flashSequence = new float[3] { 0.1f, 0.1f, 0.5f }; private bool dropFlash; public MeshRenderer flashIndicator; private PlayerControllerB previousPlayerHeldBy; private AudioClip photoClick; private AudioSource cameraAudio; private void Awake() { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown _ = ((NetworkBehaviour)this).IsServer; int imageResolution = _imageSettings.ImageResolution; _cameraViewTexture = new RenderTexture(imageResolution, imageResolution, 24); ((Texture)_cameraViewTexture).filterMode = (FilterMode)0; camera = ((Component)this).GetComponentInChildren<Camera>(); flashBulb = ((Component)this).GetComponentInChildren<Light>(); ((Behaviour)flashBulb).enabled = false; photoClick = ScrapLoader.loadedAudio["cameraClick"]; cameraAudio = ((Component)this).GetComponent<AudioSource>(); } public override void GrabItem() { ((GrabbableObject)this).GrabItem(); previousPlayerHeldBy = base.playerHeldBy; } public override void Start() { ((GrabbableObject)this).Start(); camera.Render(); if (!_cameraViewTexture.IsCreated()) { _cameraViewTexture.Create(); } ((Renderer)((Component)((Component)this).transform.Find("Screen")).GetComponent<MeshRenderer>()).material.SetTexture(MainTexture, (Texture)(object)_cameraViewTexture); ((Renderer)((Component)((Component)this).transform.Find("Screen")).GetComponent<MeshRenderer>()).material.mainTexture = (Texture)(object)_cameraViewTexture; camera.targetTexture = _cameraViewTexture; camera.cullingMask = 20649983; camera.farClipPlane = renderDistance; camera.nearClipPlane = 0.55f; } public override void ItemActivate(bool used, bool buttonDown = true) { ((GrabbableObject)this).ItemActivate(used, buttonDown); if (buttonDown && base.insertedBattery.charge > 0f) { dropFlash = true; ((MonoBehaviour)this).StartCoroutine(flashLight()); ((MonoBehaviour)this).StartCoroutine(doNextFrame(TakePicture)); } } public override void Update() { ((GrabbableObject)this).Update(); if (base.isHeld && !base.isHeldByEnemy) { camera.Render(); } } public override void OnDestroy() { ((NetworkBehaviour)this).OnDestroy(); } private void TakePicture() { //IL_0010: 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_0033: 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_0062: Unknown result type (might be due to invalid IL or missing references) int imageResolution = _imageSettings.ImageResolution; Texture2D val = new Texture2D(imageResolution, imageResolution, _imageSettings.ImageFormat, false) { filterMode = (FilterMode)0 }; RenderTexture active = RenderTexture.active; RenderTexture.active = _cameraViewTexture; val.ReadPixels(new Rect(0f, 0f, (float)((Texture)_cameraViewTexture).width, (float)((Texture)_cameraViewTexture).height), 0, 0); val.Apply(); RenderTexture.active = active; byte[] rawTextureData = val.GetRawTextureData(); CameraPlugin.Log.LogInfo((object)("Number of Bytes: " + rawTextureData.Length)); TakePicture_ServerRpc(rawTextureData); } [ServerRpc(RequireOwnership = false)] private void TakePicture_ServerRpc(byte[] imageData) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Invalid comparison between Unknown and I4 //IL_005f: 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_006d: 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_008e: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_01ef: 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_0212: Unknown result type (might be due to invalid IL or missing references) //IL_0213: Unknown result type (might be due to invalid IL or missing references) //IL_0222: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_0280: Unknown result type (might be due to invalid IL or missing references) //IL_0285: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3286540989u, val, (RpcDelivery)0); bool flag = imageData != null; ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives)); if (flag) { ((FastBufferWriter)(ref val2)).WriteValueSafe<byte>(imageData, default(ForPrimitives)); } ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3286540989u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost) && ((NetworkBehaviour)this).IsHost) { int num = CameraImageRegistry.GetInstance().RegisterImage(imageData); CameraImageRegistry.GetInstance().SaveImage(num); CameraPlugin.Log.LogInfo((object)("Uploaded Image to Server: " + num)); CameraPlugin.Log.LogInfo((object)("Number of Bytes: " + imageData.Length)); Vector3 val3 = ((Component)this).transform.position + Vector3.up * 0.25f; Transform val4 = ((((!((Object)(object)base.playerHeldBy != (Object)null) || !base.playerHeldBy.isInElevator) && !StartOfRound.Instance.inShipPhase) || !((Object)(object)RoundManager.Instance.spawnedScrapContainer != (Object)null)) ? StartOfRound.Instance.elevatorTransform : StartOfRound.Instance.elevatorTransform); GameObject obj = Object.Instantiate<GameObject>(ScrapLoader.loadedItems["photo"].spawnPrefab, val3, Quaternion.identity, val4); PhotoItem component = obj.GetComponent<PhotoItem>(); ((GrabbableObject)component).hasHitGround = false; GrabbableObject component2 = obj.GetComponent<GrabbableObject>(); component2.startFallingPosition = val3; component2.targetFloorPosition = component2.GetItemFloorPosition(((Component)this).transform.position); if ((Object)(object)previousPlayerHeldBy != (Object)null && previousPlayerHeldBy.isInHangarShipRoom) { previousPlayerHeldBy.SetItemInElevator(true, true, component2); } ((NetworkBehaviour)component2).NetworkObject.Spawn(false); component.photoID.Value = num; SpawnPhotoClientRpc(NetworkObjectReference.op_Implicit(((Component)this).gameObject.GetComponent<NetworkObject>()), val3); FlashCamera_ClientRpc(Time.time); } } [ClientRpc] public void SpawnPhotoClientRpc(NetworkObjectReference netObjectRef, Vector3 startFallingPos) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Invalid comparison between Unknown and I4 //IL_005f: 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_006d: 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_0083: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3765346262u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkObjectReference>(ref netObjectRef, default(ForNetworkSerializable)); ((FastBufferWriter)(ref val2)).WriteValueSafe(ref startFallingPos); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3765346262u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { if ((Object)(object)base.playerHeldBy != (Object)null) { base.playerHeldBy.activatingItem = false; } if (!((NetworkBehaviour)this).IsServer) { cameraAudio.PlayOneShot(photoClick); ((MonoBehaviour)this).StartCoroutine(waitForPhotoToSpawnOnClient(netObjectRef, startFallingPos)); } } } private IEnumerator waitForPhotoToSpawnOnClient(NetworkObjectReference netObjectRef, Vector3 startFallingPos) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: 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) NetworkObject netObject = null; float startTime = Time.realtimeSinceStartup; while ((double)Time.realtimeSinceStartup - (double)startTime < 8.0 && !((NetworkObjectReference)(ref netObjectRef)).TryGet(ref netObject, (NetworkManager)null)) { yield return (object)new WaitForSeconds(0.03f); } if ((Object)(object)netObject == (Object)null) { Debug.Log((object)"No network object found"); yield break; } yield return (object)new WaitForEndOfFrame(); GrabbableObject component = ((Component)netObject).GetComponent<GrabbableObject>(); component.startFallingPosition = startFallingPos; component.fallTime = 0f; component.hasHitGround = false; component.reachedFloorTarget = false; if ((Object)(object)previousPlayerHeldBy != (Object)null && previousPlayerHeldBy.isInHangarShipRoom) { previousPlayerHeldBy.SetItemInElevator(true, true, component); } } [ClientRpc] private void FlashCamera_ClientRpc(float time) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Invalid comparison between Unknown and I4 //IL_005f: 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_006d: 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_0083: 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) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(4245448909u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe<float>(ref time, default(ForPrimitives)); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 4245448909u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost) && Time.time < time + flashTimeout && !dropFlash) { ((MonoBehaviour)this).StartCoroutine(flashLight()); } } } private IEnumerator flashLight() { dropFlash = false; toggleFlash(true); float[] array = flashSequence; foreach (float num in array) { yield return (object)new WaitForSeconds(num); toggleFlash(); } toggleFlash(false); } private void toggleFlash(bool? isOn = null) { //IL_0046: 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) bool enabled = ((Behaviour)flashBulb).enabled; enabled = isOn ?? (!enabled); ((Behaviour)flashBulb).enabled = enabled; ((Renderer)flashIndicator).material.color = (enabled ? Color.yellow : Color.black); } private IEnumerator doNextFrame(Action action) { yield return null; action(); } protected override void __initializeVariables() { ((GrabbableObject)this).__initializeVariables(); } [RuntimeInitializeOnLoadMethod] internal static void InitializeRPCS_CameraItem() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown NetworkManager.__rpc_func_table.Add(3286540989u, new RpcReceiveHandler(__rpc_handler_3286540989)); NetworkManager.__rpc_func_table.Add(3765346262u, new RpcReceiveHandler(__rpc_handler_3765346262)); NetworkManager.__rpc_func_table.Add(4245448909u, new RpcReceiveHandler(__rpc_handler_4245448909)); } private static void __rpc_handler_3286540989(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: 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_006e: 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_0058: 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) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { bool flag = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives)); byte[] imageData = null; if (flag) { ((FastBufferReader)(ref reader)).ReadValueSafe<byte>(ref imageData, default(ForPrimitives)); } target.__rpc_exec_stage = (__RpcExecStage)1; ((CameraItem)(object)target).TakePicture_ServerRpc(imageData); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3765346262(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: 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_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0060: 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) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { NetworkObjectReference netObjectRef = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref netObjectRef, default(ForNetworkSerializable)); Vector3 startFallingPos = default(Vector3); ((FastBufferReader)(ref reader)).ReadValueSafe(ref startFallingPos); target.__rpc_exec_stage = (__RpcExecStage)2; ((CameraItem)(object)target).SpawnPhotoClientRpc(netObjectRef, startFallingPos); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_4245448909(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: 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_0044: 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) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { float time = default(float); ((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref time, default(ForPrimitives)); target.__rpc_exec_stage = (__RpcExecStage)2; ((CameraItem)(object)target).FlashCamera_ClientRpc(time); target.__rpc_exec_stage = (__RpcExecStage)0; } } protected internal override string __getTypeName() { return "CameraItem"; } } [BepInPlugin("itbeblockhead.lethalcompany.cameraitem", "Camera Item", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class CameraPlugin : BaseUnityPlugin { private static readonly Harmony Harmony = new Harmony("CameraPlugin"); public static readonly Dictionary<string, string> CONFIG = new Dictionary<string, string> { { "PLUGIN_ID", "Camera-Mod" }, { "AUTHOR", "BlockHead" }, { "CAMERA_BUNDLE_PATH", "bundles/camera.assetbundle" } }; public static ScrapLoader ScrapLoader; public static ManualLogSource Log; public static CameraPluginConfig CameraConfig = new CameraPluginConfig(); private void Awake() { Type[] types = Assembly.GetExecutingAssembly().GetTypes(); for (int i = 0; i < types.Length; i++) { MethodInfo[] methods = types[i].GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic); foreach (MethodInfo methodInfo in methods) { if (methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false).Length != 0) { methodInfo.Invoke(null, null); } } } Log = ((BaseUnityPlugin)this).Logger; CameraConfig.SetUp(this); ScrapLoader = new ScrapLoader(); ScrapLoader.setup(); Item val = ScrapLoader.loadedItems["camera"]; if ((Object)(object)val.spawnPrefab.GetComponent<NetworkTransform>() == (Object)null) { NetworkTransform obj = val.spawnPrefab.AddComponent<NetworkTransform>(); obj.SlerpPosition = false; obj.Interpolate = false; obj.SyncPositionX = false; obj.SyncPositionY = false; obj.SyncPositionZ = false; obj.SyncScaleX = false; obj.SyncScaleY = false; obj.SyncScaleZ = false; obj.UseHalfFloatPrecision = true; } val = ScrapLoader.loadedItems["photo"]; if ((Object)(object)val.spawnPrefab.GetComponent<NetworkTransform>() == (Object)null) { NetworkTransform obj2 = val.spawnPrefab.AddComponent<NetworkTransform>(); obj2.SlerpPosition = false; obj2.Interpolate = false; obj2.SyncPositionX = false; obj2.SyncPositionY = false; obj2.SyncPositionZ = false; obj2.SyncScaleX = false; obj2.SyncScaleY = false; obj2.SyncScaleZ = false; obj2.UseHalfFloatPrecision = true; } Items.RegisterShopItem(ScrapLoader.loadedItems["camera"], CameraConfig.cameraPrice); Items.RegisterItem(ScrapLoader.loadedItems["photo"]); Harmony.PatchAll(typeof(GameNetworkManager_Patch)); Harmony.PatchAll(typeof(CameraPluginConfig)); } } public class PhotoItem : GrabbableObject { public NetworkVariable<int> photoID = new NetworkVariable<int>(0, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); private bool _photoDeveloped; private bool _developingPhoto; private float _developed; public float developmentSpeed = 0.2f; private readonly Dictionary<ulong, ClientRpcParams> _idCache = new Dictionary<ulong, ClientRpcParams>(); private Material _filmMaterial; private static readonly int DevelopProgress = Shader.PropertyToID("_developProgress"); private static CameraPluginConfig.ImageSettings _imageSettings = CameraPlugin.CameraConfig.imageSettings; public override void Start() { ((GrabbableObject)this).Start(); developmentSpeed = 0.2f; if (((NetworkBehaviour)this).IsServer) { _imageSettings = CameraPlugin.CameraConfig.imageSettings; } _filmMaterial = ((Renderer)((Component)((Component)this).transform.Find("Film")).GetComponent<MeshRenderer>()).material; } public override void GrabItem() { ((GrabbableObject)this).GrabItem(); if (_photoDeveloped || _developingPhoto) { return; } if (photoID.Value >= 0) { if (CameraImageRegistry.GetInstance().has(photoID.Value)) { DevelopPhoto(); return; } _developingPhoto = true; RequestImage_ServerRpc(NetworkManager.Singleton.LocalClientId, photoID.Value); } else { CameraPlugin.Log.LogError((object)("Item has Invalid photoID: " + photoID.Value)); } } private void DevelopPhoto() { //IL_0026: 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_0032: Expected O, but got Unknown byte[] array = CameraImageRegistry.GetInstance()[photoID.Value]; try { int imageResolution = _imageSettings.ImageResolution; Texture2D val = new Texture2D(imageResolution, imageResolution, _imageSettings.ImageFormat, false); ((Texture)val).filterMode = (FilterMode)0; val.LoadRawTextureData(array); val.Apply(); _filmMaterial.mainTexture = (Texture)(object)val; } catch (Exception ex) { CameraPlugin.Log.LogError((object)"Failed to load image onto photo item"); CameraPlugin.Log.LogError((object)ex); } _photoDeveloped = true; } public override void Update() { ((GrabbableObject)this).Update(); if (_photoDeveloped) { _developed += Time.deltaTime * developmentSpeed; _developed = Mathf.Min(_developed, 1f); _filmMaterial.SetFloat(DevelopProgress, _developed); } } [ServerRpc(RequireOwnership = false)] public void RequestImage_ServerRpc(ulong returnId, int id) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Invalid comparison between Unknown and I4 //IL_005f: 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_006d: 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_007e: 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) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0180: 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_0147: Unknown result type (might be due to invalid IL or missing references) //IL_0151: 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_0169: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3945644824u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, returnId); BytePacker.WriteValueBitPacked(val2, id); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3945644824u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 || (!networkManager.IsServer && !networkManager.IsHost)) { return; } if (((NetworkBehaviour)this).IsServer) { _developingPhoto = false; _photoDeveloped = true; } if (!CameraImageRegistry.GetInstance().has(id)) { CameraImageRegistry.GetInstance().LoadImageFromSave(id); if (!CameraImageRegistry.GetInstance().has(id)) { CameraPlugin.Log.LogError((object)("Requested Image ID " + id + " Does not have a registered image")); } } if (!_idCache.ContainsKey(returnId)) { _idCache[returnId] = new ClientRpcParams { Send = new ClientRpcSendParams { TargetClientIds = new ulong[1] { returnId } } }; } ClientRpcParams clientRpcParams = _idCache[returnId]; RegisterImage_ClientRpc(id, CameraImageRegistry.GetInstance()[id], clientRpcParams); } [ClientRpc] public void RegisterImage_ClientRpc(int id, byte[] imageData, ClientRpcParams clientRpcParams = default(ClientRpcParams)) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Invalid comparison between Unknown and I4 //IL_005f: 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_006d: 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_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009b: 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_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { FastBufferWriter val = ((NetworkBehaviour)this).__beginSendClientRpc(4062700602u, clientRpcParams, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val, id); bool flag = imageData != null; ((FastBufferWriter)(ref val)).WriteValueSafe<bool>(ref flag, default(ForPrimitives)); if (flag) { ((FastBufferWriter)(ref val)).WriteValueSafe<byte>(imageData, default(ForPrimitives)); } ((NetworkBehaviour)this).__endSendClientRpc(ref val, 4062700602u, clientRpcParams, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { CameraImageRegistry.GetInstance()[id] = imageData; _developingPhoto = false; DevelopPhoto(); } } public override int GetItemDataToSave() { return photoID.Value; } public override void LoadItemSaveData(int saveData) { photoID.Value = saveData; } protected override void __initializeVariables() { if (photoID == null) { throw new Exception("PhotoItem.photoID cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)photoID).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)photoID, "photoID"); ((NetworkBehaviour)this).NetworkVariableFields.Add((NetworkVariableBase)(object)photoID); ((GrabbableObject)this).__initializeVariables(); } [RuntimeInitializeOnLoadMethod] internal static void InitializeRPCS_PhotoItem() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown NetworkManager.__rpc_func_table.Add(3945644824u, new RpcReceiveHandler(__rpc_handler_3945644824)); NetworkManager.__rpc_func_table.Add(4062700602u, new RpcReceiveHandler(__rpc_handler_4062700602)); } private static void __rpc_handler_3945644824(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: 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_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { ulong returnId = default(ulong); ByteUnpacker.ReadValueBitPacked(reader, ref returnId); int id = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref id); target.__rpc_exec_stage = (__RpcExecStage)1; ((PhotoItem)(object)target).RequestImage_ServerRpc(returnId, id); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_4062700602(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0075: 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_007b: 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_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_0065: 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) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int id = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref id); bool flag = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives)); byte[] imageData = null; if (flag) { ((FastBufferReader)(ref reader)).ReadValueSafe<byte>(ref imageData, default(ForPrimitives)); } ClientRpcParams client = rpcParams.Client; target.__rpc_exec_stage = (__RpcExecStage)2; ((PhotoItem)(object)target).RegisterImage_ClientRpc(id, imageData, client); target.__rpc_exec_stage = (__RpcExecStage)0; } } protected internal override string __getTypeName() { return "PhotoItem"; } } public class ScrapLoader { public static Dictionary<string, Item> loadedItems = new Dictionary<string, Item>(); public static Dictionary<string, AudioClip> loadedAudio = new Dictionary<string, AudioClip>(); public static bool loaded = false; public void setup() { CameraPlugin.Log.LogInfo((object)"Adding ScrapLoader Event"); load(); } public void load() { //IL_0083: 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_017c: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_01b7: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Expected O, but got Unknown //IL_0323: Unknown result type (might be due to invalid IL or missing references) //IL_0332: Unknown result type (might be due to invalid IL or missing references) //IL_03ff: Unknown result type (might be due to invalid IL or missing references) //IL_0404: Unknown result type (might be due to invalid IL or missing references) //IL_041a: Unknown result type (might be due to invalid IL or missing references) //IL_041f: Unknown result type (might be due to invalid IL or missing references) //IL_0435: Unknown result type (might be due to invalid IL or missing references) //IL_043a: Unknown result type (might be due to invalid IL or missing references) LoadedAssetBundle val = BundleLoader.LoadAssetBundle(Path.Combine(Paths.PluginPath, CameraPlugin.CONFIG["AUTHOR"] + "-PolaroidCamera", CameraPlugin.CONFIG["PLUGIN_ID"] + "/" + CameraPlugin.CONFIG["CAMERA_BUNDLE_PATH"]), true); GameObject asset = val.GetAsset<GameObject>("Assets/Camera/Assets/ViewFinder.prefab"); Texture2D asset2 = val.GetAsset<Texture2D>("Assets/Camera/Assets/camera.png"); Sprite itemIcon = Sprite.Create(asset2, new Rect(0f, 0f, (float)((Texture)asset2).width, (float)((Texture)asset2).height), new Vector2(0.5f, 0.5f), 100f); CameraPlugin.Log.LogInfo((object)"Loading Camera Item"); Item val2 = ScriptableObject.CreateInstance<Item>(); ((Object)val2).name = "PolaroidCamera"; val2.itemName = "Polaroid Camera"; val2.canBeGrabbedBeforeGameStart = true; val2.isScrap = false; val2.minValue = 20; val2.maxValue = 80; val2.creditsWorth = CameraPlugin.CameraConfig.cameraPrice; val2.weight = 1.05f; val2.spawnPrefab = asset; val2.twoHanded = false; val2.twoHandedAnimation = false; val2.requiresBattery = true; val2.isConductiveMetal = true; val2.itemIcon = itemIcon; val2.syncGrabFunction = false; val2.syncUseFunction = false; val2.syncDiscardFunction = false; val2.syncInteractLRFunction = false; val2.verticalOffset = 0.1f; val2.restingRotation = new Vector3(0f, 0f, 0f); val2.positionOffset = new Vector3(0f, 0.25f, -0.125f); val2.rotationOffset = new Vector3(-90f, -90f, 0f); val2.meshOffset = false; val2.meshVariants = Array.Empty<Mesh>(); val2.materialVariants = Array.Empty<Material>(); val2.canBeInspected = true; val2.itemIsTrigger = true; val2.batteryUsage = 0.1f; CameraItem cameraItem = asset.AddComponent<CameraItem>(); ((GrabbableObject)cameraItem).insertedBattery = new Battery(false, 1f); ((GrabbableObject)cameraItem).useCooldown = 1f; ((GrabbableObject)cameraItem).grabbable = true; ((GrabbableObject)cameraItem).itemProperties = val2; ((GrabbableObject)cameraItem).mainObjectRenderer = asset.GetComponent<MeshRenderer>(); cameraItem.renderDistance = 1000f; cameraItem.flashSequence = new float[3] { 0.1f, 0.1f, 0.5f }; cameraItem.flashIndicator = ((Component)((Component)cameraItem).transform.Find("PolaroidCameraModel").Find("Lens")).GetComponent<MeshRenderer>(); Transform val3 = asset.transform.Find("ScanNode"); if ((Object)(object)val3 != (Object)null) { ScanNodeProperties obj = ((Component)val3).gameObject.AddComponent<ScanNodeProperties>(); obj.maxRange = 13; obj.minRange = 1; obj.headerText = val2.itemName; obj.subText = "Value: "; obj.nodeType = 2; } loadedItems["camera"] = val2; GameObject asset3 = val.GetAsset<GameObject>("Assets/Camera/Assets/Photo.prefab"); Texture2D asset4 = val.GetAsset<Texture2D>("Assets/Camera/Assets/photo.png"); Sprite itemIcon2 = Sprite.Create(asset4, new Rect(0f, 0f, (float)((Texture)asset4).width, (float)((Texture)asset4).height), new Vector2(0.5f, 0.5f), 100f); Item val4 = ScriptableObject.CreateInstance<Item>(); ((Object)val4).name = "Photo"; val4.itemName = "Photo"; val4.canBeGrabbedBeforeGameStart = true; val4.isScrap = true; val4.minValue = 20; val4.maxValue = 80; val4.weight = 1.05f; val4.spawnPrefab = asset3; val4.twoHanded = false; val4.twoHandedAnimation = false; val4.requiresBattery = false; val4.isConductiveMetal = false; val4.itemIcon = itemIcon2; val4.syncGrabFunction = false; val4.syncUseFunction = false; val4.syncDiscardFunction = false; val4.syncInteractLRFunction = false; val4.verticalOffset = 0.01f; val4.restingRotation = new Vector3(90f, 0f, 0f); val4.positionOffset = new Vector3(0.25f, 0f, -0.125f); val4.rotationOffset = new Vector3(-90f, -90f, 0f); val4.meshOffset = false; val4.meshVariants = Array.Empty<Mesh>(); val4.materialVariants = Array.Empty<Material>(); val4.canBeInspected = true; val4.saveItemVariable = true; PhotoItem photoItem = asset3.AddComponent<PhotoItem>(); ((GrabbableObject)photoItem).grabbable = true; ((GrabbableObject)photoItem).itemProperties = val4; ((GrabbableObject)photoItem).mainObjectRenderer = asset3.GetComponent<MeshRenderer>(); AudioSource obj2 = asset3.AddComponent<AudioSource>(); obj2.playOnAwake = false; obj2.spatialBlend = 1f; Transform val5 = asset3.transform.Find("ScanNode"); if ((Object)(object)val5 != (Object)null) { ScanNodeProperties obj3 = ((Component)val5).gameObject.AddComponent<ScanNodeProperties>(); obj3.maxRange = 13; obj3.minRange = 1; obj3.headerText = val4.itemName; obj3.subText = "Value: "; obj3.nodeType = 2; } loadedItems["photo"] = val4; loadedAudio["cameraClick"] = val.GetAsset<AudioClip>("Assets/Camera/Assets/click.mp3"); loaded = true; } } [Serializable] public class SyncedInstance<T> { [NonSerialized] protected static int IntSize = 4; internal static CustomMessagingManager MessageManager => NetworkManager.Singleton.CustomMessagingManager; internal static bool IsClient => NetworkManager.Singleton.IsClient; internal static bool IsHost => NetworkManager.Singleton.IsHost; public static T Default { get; private set; } public static T Instance { get; private set; } public static bool Synced { get; internal set; } protected void InitInstance(T instance) { Default = instance; Instance = instance; IntSize = 4; } internal static void SyncInstance(byte[] data) { Instance = DeserializeFromBytes(data); Synced = true; } internal static void RevertSync() { Instance = Default; Synced = false; } public static byte[] SerializeToBytes(T val) { BinaryFormatter binaryFormatter = new BinaryFormatter(); using MemoryStream memoryStream = new MemoryStream(); try { binaryFormatter.Serialize(memoryStream, val); return memoryStream.ToArray(); } catch (Exception arg) { CameraPlugin.Log.LogError((object)$"Error serializing instance: {arg}"); return null; } } public static T DeserializeFromBytes(byte[] data) { BinaryFormatter binaryFormatter = new BinaryFormatter(); using MemoryStream serializationStream = new MemoryStream(data); try { return (T)binaryFormatter.Deserialize(serializationStream); } catch (Exception arg) { CameraPlugin.Log.LogError((object)$"Error deserializing instance: {arg}"); return default(T); } } } } namespace BHCamera.Patches { [HarmonyPatch(typeof(GameNetworkManager))] internal class GameNetworkManager_Patch { [HarmonyPatch("Start")] [HarmonyPrefix] private static void Start_Prefix(GameNetworkManager __instance) { CameraPlugin.Log.LogInfo((object)"Registering Camera Prefab"); Item val = ScrapLoader.loadedItems["camera"]; ((Component)__instance).GetComponent<NetworkManager>().PrefabHandler.AddNetworkPrefab(val.spawnPrefab); CameraPlugin.Log.LogInfo((object)"Registering Photo Prefab"); Item val2 = ScrapLoader.loadedItems["photo"]; ((Component)__instance).GetComponent<NetworkManager>().PrefabHandler.AddNetworkPrefab(val2.spawnPrefab); } } public class PlayerControllerB_Patch { } }