using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Unity.Mathematics;
using UnityEngine;
using UnityEngine.Experimental.Rendering;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
using Woecust.ImmersiveVisor.Config;
using Woecust.ImmersiveVisor.Patches;
using Woecust.ImmersiveVisor.PostProcessing;
[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("ImmersiveVisor")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Immersive Visor for Lethal Company")]
[assembly: AssemblyFileVersion("0.5.2.0")]
[assembly: AssemblyInformationalVersion("0.5.2")]
[assembly: AssemblyProduct("ImmersiveVisor")]
[assembly: AssemblyTitle("ImmersiveVisor")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.5.2.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 Woecust.ImmersiveVisor
{
[BepInPlugin("ImmersiveVisor", "ImmersiveVisor", "0.5.2")]
public class Plugin : BaseUnityPlugin
{
public const string Version = "0.5.2";
private const string Guid = "ImmersiveVisor";
private const string Name = "ImmersiveVisor";
public static Plugin Instance;
internal static ManualLogSource Log;
private void Awake()
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Expected O, but got Unknown
Instance = this;
Log = new ManualLogSource("ImmersiveVisorLogSource");
Logger.Sources.Add((ILogSource)(object)Log);
Log.LogInfo((object)"Mod Loading...");
ConfigLoader.Load();
HDRPChanges.Load();
AssetBundle assetBundle = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "immersivevisor"));
ShaderLoader.LoadAssets(assetBundle);
RaindropSolver.LoadAssets(assetBundle);
Visor.LoadAssets(assetBundle);
Harmony.CreateAndPatchAll(typeof(PlayerControllerBPatch), (string)null);
Harmony.CreateAndPatchAll(typeof(StartOfRoundPatch), (string)null);
Harmony.CreateAndPatchAll(typeof(TimeOfDayPatch), (string)null);
Harmony.CreateAndPatchAll(typeof(EnemyAI), (string)null);
Log.LogInfo((object)"Mod Loaded");
}
public static bool IsModdedWith(string guid)
{
return Chainloader.PluginInfos.ContainsKey(guid);
}
}
public sealed class Visor : MonoBehaviour
{
private const float PhysicalVisorDefaultScale = 0.24f;
public static Visor Instance;
private static AudioClip[] visorBreakSfx;
private static GameObject physicalVisorPrefab;
private static Material physicalVisorMat;
private static readonly int VisorFOV = Shader.PropertyToID("_FieldOfView");
private PlayerControllerB player;
private Transform physicalVisor;
private OccludeAudio rainAmbienceOcclude;
private VisorRaindrop raindrop;
private VisorCrack visorCrack;
private VisorBloodSplatter visorBlood;
private VisorRim visorRim;
private List<Camera> renderClearList;
private bool isRaining;
private bool wasTerminalMenu;
private float visorTerminalLerp;
private bool hideRimInTerminal;
public Dictionary<Camera, VisorRainState> VisorRainStates { get; private set; }
public static void LoadAssets(AssetBundle assetBundle)
{
visorBreakSfx = (AudioClip[])(object)new AudioClip[2];
visorBreakSfx[0] = assetBundle.LoadAsset<AudioClip>("Assets/Audio/sfx_visor_crack_hard.wav");
visorBreakSfx[1] = assetBundle.LoadAsset<AudioClip>("Assets/Audio/sfx_visor_crack_light.wav");
physicalVisorPrefab = assetBundle.LoadAsset<GameObject>("Assets/Prefabs/PhysicalVisor.prefab");
physicalVisorMat = assetBundle.LoadAsset<Material>("Assets/Materials/FirstPersonProjection.mat");
}
public void Start()
{
//IL_0152: Unknown result type (might be due to invalid IL or missing references)
//IL_0172: Unknown result type (might be due to invalid IL or missing references)
//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
//IL_01e8: 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_01f6: Unknown result type (might be due to invalid IL or missing references)
//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
//IL_0204: Unknown result type (might be due to invalid IL or missing references)
//IL_021d: 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_0229: Unknown result type (might be due to invalid IL or missing references)
//IL_0246: Unknown result type (might be due to invalid IL or missing references)
//IL_025b: Unknown result type (might be due to invalid IL or missing references)
//IL_0263: Unknown result type (might be due to invalid IL or missing references)
//IL_026b: Unknown result type (might be due to invalid IL or missing references)
//IL_0291: Unknown result type (might be due to invalid IL or missing references)
//IL_0298: Expected O, but got Unknown
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
else
{
Object.Destroy((Object)(object)this);
}
player = GameNetworkManager.Instance.localPlayerController;
rainAmbienceOcclude = GameObject.Find("Systems/GameSystems/TimeAndWeather/RainParticleContainer/RainAmbience").GetComponent<OccludeAudio>();
VisorRainStates = new Dictionary<Camera, VisorRainState>();
renderClearList = new List<Camera>();
HDAdditionalCameraData component = GameObject.Find("Systems/UI/UICamera").GetComponent<HDAdditionalCameraData>();
((BitArray128)(ref component.renderingPathCustomFrameSettingsOverrideMask.mask))[15u] = true;
((BitArray128)(ref component.renderingPathCustomFrameSettingsOverrideMask.mask))[39u] = true;
((FrameSettings)(ref component.renderingPathCustomFrameSettings)).SetEnabled((FrameSettingsField)15, true);
((FrameSettings)(ref component.renderingPathCustomFrameSettings)).SetEnabled((FrameSettingsField)39, false);
HDAdditionalCameraData component2 = ((Component)player.gameplayCamera).GetComponent<HDAdditionalCameraData>();
if (((BitArray128)(ref component2.renderingPathCustomFrameSettingsOverrideMask.mask))[6u] && !((FrameSettings)(ref component2.renderingPathCustomFrameSettings)).IsEnabled((FrameSettingsField)6))
{
((FrameSettings)(ref component2.renderingPathCustomFrameSettings)).SetEnabled((FrameSettingsField)6, true);
GameObject.Find("Systems/Rendering/CustomPass").SetActive(false);
}
physicalVisor = Object.Instantiate<GameObject>(physicalVisorPrefab).transform;
physicalVisor.SetParent(((Component)this).transform);
physicalVisor.GetChild(0).localEulerAngles = new Vector3(90f, 0f, 0f);
physicalVisor.localScale = new Vector3(0.24f, 0.24f, 0.24f);
CustomPassVolume val = ((Component)physicalVisor).gameObject.AddComponent<CustomPassVolume>();
val.isGlobal = false;
val.priority = 64f;
val.targetCamera = player.gameplayCamera;
val.injectionPoint = (CustomPassInjectionPoint)0;
CustomPass obj = val.AddPassOfType<DrawRenderersCustomPass>();
DrawRenderersCustomPass val2 = (DrawRenderersCustomPass)(object)((obj is DrawRenderersCustomPass) ? obj : null);
BackupFrameBufferPass backupFrameBufferPass = val.AddPassOfType<BackupFrameBufferPass>() as BackupFrameBufferPass;
((CustomPass)val2).name = "GetVisorRim";
((CustomPass)val2).targetColorBuffer = (TargetBuffer)1;
((CustomPass)val2).targetDepthBuffer = (TargetBuffer)2;
((CustomPass)val2).clearFlags = (ClearFlag)0;
((CustomPass)val2).clearFlags = (ClearFlag)(((CustomPass)val2).clearFlags | 1);
val2.renderQueueType = (RenderQueueType)2;
val2.layerMask = LayerMask.op_Implicit(LayerMask.GetMask(new string[1] { "HelmetVisor" }));
val2.overrideMode = (OverrideMaterialMode)1;
val2.overrideMaterial = physicalVisorMat;
val2.overrideMaterialPassName = "MotionVectors";
val2.sortingCriteria = (SortingCriteria)0;
((CustomPass)backupFrameBufferPass).name = "WriteVisorRim";
((CustomPass)backupFrameBufferPass).targetColorBuffer = (TargetBuffer)2;
((CustomPass)backupFrameBufferPass).targetDepthBuffer = (TargetBuffer)2;
((CustomPass)backupFrameBufferPass).clearFlags = (ClearFlag)0;
backupFrameBufferPass.outputRenderTexture = VisorPostProcessingHelper.GetVisorRimMask();
VisorPostProcessingHelper.PlayerCamera = player.gameplayCamera;
GameObject val3 = new GameObject("ImmersiveVisorPostProcessing");
val3.transform.parent = GameObject.Find("Systems/Rendering").transform;
Volume val4 = val3.AddComponent<Volume>();
val4.priority = 421f;
VolumeProfile val5 = ScriptableObject.CreateInstance<VolumeProfile>();
((Object)val5).name = "VisorPostProcessProfile";
raindrop = val5.Add<VisorRaindrop>(true);
((Object)raindrop).name = "VisorRaindrop";
((VolumeParameter<bool>)(object)raindrop.enabled).value = VisorConfig.RaindropShow;
((VolumeParameter<bool>)(object)raindrop.specular).value = VisorConfig.RaindropSpecular;
((VolumeParameter<bool>)(object)raindrop.shadow).value = VisorConfig.RaindropShadow;
((VolumeParameter<float>)(object)raindrop.dryTime).value = VisorConfig.RaindropDryTime;
((VolumeParameter<int>)(object)raindrop.pixelated).value = VisorConfig.PixelatedRain;
visorRim = val5.Add<VisorRim>(true);
((Object)visorRim).name = "VisorRim";
((VolumeParameter<bool>)(object)visorRim.visible).value = VisorConfig.RimShow && !VisorConfig.RimPhysical;
visorCrack = val5.Add<VisorCrack>(true);
((Object)visorCrack).name = "VisorCrack";
((VolumeParameter<bool>)(object)visorCrack.enabled).value = VisorConfig.CrackShow;
((VolumeParameter<int>)(object)visorCrack.pixelated).value = VisorConfig.PixelatedCrack;
visorBlood = val5.Add<VisorBloodSplatter>(true);
((Object)visorBlood).name = "VisorBloodSplatter";
((VolumeParameter<bool>)(object)visorBlood.enabled).value = VisorConfig.BloodShow;
((VolumeParameter<float>)(object)visorBlood.lifeTime).value = VisorConfig.BloodLifeTime;
((VolumeParameter<int>)(object)visorBlood.pixelated).value = VisorConfig.PixelatedBlood;
((VolumeParameter<float>)(object)visorBlood.fadeOut).value = VisorConfig.BloodDryTime;
val4.sharedProfile = val5;
if (VisorConfig.PixelateAuto)
{
int height = ((Texture)player.gameplayCamera.targetTexture).height;
((VolumeParameter<int>)(object)raindrop.pixelated).value = height;
((VolumeParameter<int>)(object)visorCrack.pixelated).value = height;
((VolumeParameter<int>)(object)visorBlood.pixelated).value = height;
}
hideRimInTerminal = Plugin.IsModdedWith("wijes.desktop.terminal");
Plugin.Log.LogInfo((object)"Immersive Visor Initialized");
}
public void Repair()
{
Plugin.Log.LogInfo((object)"Visor Repaired");
((VolumeParameter<int>)(object)visorCrack.crackLevel).value = 0;
}
public void Damage(CauseOfDeath cause)
{
int value = ((VolumeParameter<int>)(object)visorCrack.crackLevel).value;
ClampedIntParameter crackLevel = visorCrack.crackLevel;
int health = player.health;
if (1 == 0)
{
}
int value2 = ((health <= 35) ? 2 : ((health <= 75) ? 1 : ((VolumeParameter<int>)(object)visorCrack.crackLevel).value));
if (1 == 0)
{
}
((VolumeParameter<int>)(object)crackLevel).value = value2;
if (((VolumeParameter<int>)(object)visorCrack.crackLevel).value > 0 && value != ((VolumeParameter<int>)(object)visorCrack.crackLevel).value)
{
HUDManager.Instance.UIAudio.PlayOneShot(visorBreakSfx[((VolumeParameter<int>)(object)visorCrack.crackLevel).value - 1], VisorConfig.CrackVolume);
Plugin.Log.LogInfo((object)$"Visor Damaged : level {((VolumeParameter<int>)(object)visorCrack.crackLevel).value}");
}
}
public void AddCamera(Camera camera)
{
if (VisorRainStates.TryGetValue(camera, out var _))
{
VisorRainStates.Remove(camera);
}
VisorRainStates.Add(camera, new VisorRainState(camera));
}
public void QueueRenderClear(Camera camera)
{
renderClearList.Add(camera);
}
public void LateUpdate()
{
RimUpdate();
((VolumeParameter<bool>)(object)visorBlood.enabled).value = VisorConfig.BloodShow;
((VolumeParameter<bool>)(object)visorCrack.enabled).value = VisorConfig.CrackShow;
if (player.isPlayerDead)
{
((VolumeParameter<int>)(object)visorCrack.crackLevel).value = 0;
}
if (VisorConfig.PixelateAuto)
{
int height = ((Texture)player.gameplayCamera.targetTexture).height;
((VolumeParameter<int>)(object)raindrop.pixelated).value = height;
((VolumeParameter<int>)(object)visorCrack.pixelated).value = height;
((VolumeParameter<int>)(object)visorBlood.pixelated).value = height;
}
else
{
((VolumeParameter<int>)(object)raindrop.pixelated).value = VisorConfig.PixelatedRain;
((VolumeParameter<int>)(object)visorCrack.pixelated).value = VisorConfig.PixelatedCrack;
((VolumeParameter<int>)(object)visorBlood.pixelated).value = VisorConfig.PixelatedBlood;
}
}
public void FixedUpdate()
{
RaindropUpdate();
}
private void RaindropUpdate()
{
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Expected I4, but got Unknown
if (!VisorConfig.RaindropShow)
{
((VolumeParameter<bool>)(object)raindrop.enabled).value = false;
return;
}
int num = (int)TimeOfDay.Instance.currentLevelWeather;
bool flag = (((uint)(num - 1) <= 1u || num == 4) ? true : false);
bool flag2 = flag || ((Component)rainAmbienceOcclude).gameObject.activeInHierarchy;
RemoveNullKeys();
if (isRaining != flag2)
{
if (!flag2)
{
foreach (KeyValuePair<Camera, VisorRainState> visorRainState in VisorRainStates)
{
visorRainState.Value.ForceStop();
raindrop.Clear(visorRainState.Key);
}
}
isRaining = flag2;
}
if (isRaining)
{
bool flag3 = true;
foreach (VisorRainState value in VisorRainStates.Values)
{
value.Update();
if (value.IsRainVisible)
{
flag3 = false;
}
}
((VolumeParameter<bool>)(object)raindrop.enabled).value = !flag3;
}
foreach (Camera renderClear in renderClearList)
{
raindrop.Clear(renderClear);
}
renderClearList.Clear();
}
private void RimUpdate()
{
//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
//IL_011d: Unknown result type (might be due to invalid IL or missing references)
if (!VisorConfig.RimShow)
{
((Component)physicalVisor).gameObject.SetActive(false);
((VolumeParameter<bool>)(object)visorRim.visible).value = false;
return;
}
((VolumeParameter<bool>)(object)visorRim.visible).value = !player.isPlayerDead && !VisorConfig.RimPhysical;
((Component)physicalVisor).gameObject.SetActive(((Component)player.localVisor).gameObject.activeInHierarchy && VisorConfig.RimPhysical && (!hideRimInTerminal || !player.inTerminalMenu));
if (VisorConfig.RimPhysical)
{
physicalVisor.position = ((Component)player.gameplayCamera).transform.position;
physicalVisor.rotation = player.localVisor.rotation;
Vector3 localScale = default(Vector3);
((Vector3)(ref localScale))..ctor(0.24f * (VisorConfig.RimStretch / 1.77f), 0.24f, 0.24f);
physicalVisor.localScale = localScale;
if (wasTerminalMenu != player.inTerminalMenu)
{
visorTerminalLerp = 0f;
wasTerminalMenu = player.inTerminalMenu;
}
if (visorTerminalLerp < 1f)
{
float @float = physicalVisorMat.GetFloat(VisorFOV);
@float = Mathf.Lerp(@float, player.inTerminalMenu ? 55f : 60f, 1f - Mathf.Pow(1f - visorTerminalLerp, 2f));
physicalVisorMat.SetFloat(VisorFOV, @float);
}
visorTerminalLerp = Mathf.Min(1f, visorTerminalLerp + Time.deltaTime);
}
else if (player.isInHangarShipRoom)
{
float num = (player.inTerminalMenu ? visorRim.offset.min : visorRim.offset.max);
((VolumeParameter<float>)(object)visorRim.offset).value = Mathf.MoveTowards(((VolumeParameter<float>)(object)visorRim.offset).value, num, 0.3f * Time.deltaTime);
}
}
private void RemoveNullKeys()
{
Dictionary<Camera, VisorRainState> visorRainStates = VisorRainStates.Where((KeyValuePair<Camera, VisorRainState> pair) => pair.Key != null).ToDictionary((KeyValuePair<Camera, VisorRainState> pair) => pair.Key, (KeyValuePair<Camera, VisorRainState> pair) => pair.Value);
VisorRainStates = visorRainStates;
}
}
public class VisorRainState
{
private const float CeilingCheckInterval = 0.75f;
private const float RaindropLifeTime = 1.5f;
private readonly Camera camera;
private readonly bool isPlayerView;
public Vector3 Forward;
public float Intensity;
public bool IsRainVisible;
private float timeSinceRaindrop;
private float rainCheckTimer;
private bool isRainOccluded;
public VisorRainState(Camera camera)
{
this.camera = camera;
isPlayerView = (Object)(object)camera == (Object)(object)GameNetworkManager.Instance.localPlayerController.gameplayCamera;
}
public void Update()
{
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
bool flag = isPlayerView && GameNetworkManager.Instance.localPlayerController.isPlayerDead;
if (rainCheckTimer <= 0f)
{
if (isPlayerView)
{
isRainOccluded = GameNetworkManager.Instance.localPlayerController.isInsideFactory || LineCastForCeiling();
}
else
{
isRainOccluded = LineCastForCeiling();
}
rainCheckTimer = 0.75f;
}
timeSinceRaindrop = ((!isRainOccluded) ? 0f : (timeSinceRaindrop + Time.deltaTime));
Forward = ((Component)camera).transform.forward;
float num = (isPlayerView ? (1.5f + VisorConfig.RaindropDryTime * 2f) : 3f);
bool flag2 = timeSinceRaindrop < num && !flag;
if (IsRainVisible != flag2)
{
if (!flag2)
{
Visor.Instance.QueueRenderClear(camera);
}
IsRainVisible = flag2;
}
if (IsRainVisible)
{
Intensity = (isRainOccluded ? 0f : Mathf.Clamp01(Intensity + 2f * Time.deltaTime));
}
rainCheckTimer -= Time.deltaTime;
}
public void ForceStop()
{
IsRainVisible = false;
Intensity = 0f;
}
private bool LineCastForCeiling()
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
return Physics.Linecast(((Component)camera).transform.position, ((Component)camera).transform.position + Vector3.up * 100f, 256, (QueryTriggerInteraction)1);
}
}
public static class PluginInfo
{
public const string PLUGIN_GUID = "ImmersiveVisor";
public const string PLUGIN_NAME = "ImmersiveVisor";
public const string PLUGIN_VERSION = "0.5.2";
}
}
namespace Woecust.ImmersiveVisor.PostProcessing
{
public class BackupFrameBufferPass : CustomPass
{
[Header("Output")]
public RenderTexture outputRenderTexture;
protected override bool executeInSceneView => true;
protected override void Execute(CustomPassContext ctx)
{
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)outputRenderTexture == (Object)null))
{
Vector4 rtHandleScale = RTHandles.rtHandleProperties.rtHandleScale;
ctx.cmd.Blit(RTHandle.op_Implicit(ctx.customColorBuffer.Value), RenderTargetIdentifier.op_Implicit((Texture)(object)outputRenderTexture), new Vector2(rtHandleScale.x, rtHandleScale.y), Vector2.zero, 0, 0);
}
}
}
public static class HDRPChanges
{
public static void Load()
{
try
{
Type type = typeof(HDRenderPipelineAsset).Assembly.GetType("UnityEngine.Rendering.HighDefinition.HDRenderPipelineGlobalSettings");
PropertyInfo property = type.GetProperty("instance", BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy);
object value = property.GetValue(null);
FieldInfo field = type.GetField("afterPostProcessCustomPostProcesses", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);
List<string> list = (List<string>)field.GetValue(value);
list.Add(typeof(VisorRim).AssemblyQualifiedName);
field = type.GetField("beforePostProcessCustomPostProcesses", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);
list = (List<string>)field.GetValue(value);
list.Add(typeof(VisorRaindrop).AssemblyQualifiedName);
list.Add(typeof(VisorCrack).AssemblyQualifiedName);
list.Add(typeof(VisorBloodSplatter).AssemblyQualifiedName);
}
catch (Exception ex)
{
Plugin.Log.LogError((object)"Error while patching HDRP!");
Plugin.Log.LogError((object)ex);
}
}
}
public class RaindropSolver
{
public struct RenderInfo
{
private int Width;
private int Height;
private int Scale;
public int ScaledWidth;
public int ScaledHeight;
public RenderInfo(int width, int height, int scale)
{
Width = width;
Height = height;
Scale = scale;
ScaledHeight = Mathf.CeilToInt((float)(520 * Scale) * 0.01f);
ScaledWidth = Mathf.CeilToInt(520f * ((float)width / (float)height) * (float)Scale * 0.01f);
}
public bool Update(int width, int height, int scale)
{
bool result = Height != height || Width != width || Scale != scale;
Width = width;
Height = height;
Scale = scale;
ScaledHeight = Mathf.CeilToInt((float)(520 * Scale) * 0.01f);
ScaledWidth = Mathf.CeilToInt(520f * ((float)width / (float)height) * (float)Scale * 0.01f);
return result;
}
}
private struct Particle
{
public float2 position;
public float2 velocity;
public float size;
public float lifetime;
public Particle(float2 _position)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
position = _position;
velocity = float2.zero;
size = 0f;
lifetime = 0f;
}
}
private const int RenderHeight = 520;
private static readonly int _bounds = Shader.PropertyToID("bounds");
private static readonly int _particleSize = Shader.PropertyToID("particleSize");
private static readonly int _smoothDistance = Shader.PropertyToID("smoothDistance");
private static readonly int _timeStep = Shader.PropertyToID("timeStep");
private static readonly int _gravity = Shader.PropertyToID("gravity");
private static readonly int _staticTime = Shader.PropertyToID("staticTime");
private static readonly int _dynamicTime = Shader.PropertyToID("dynamicTime");
private static readonly int _staticLifetime = Shader.PropertyToID("staticLifetime");
private static readonly int _lifeTimeMultiplier = Shader.PropertyToID("lifeTimeMultiplier");
private static ComputeShader computeAsset;
private readonly ComputeShader compute;
private static int spawnStaticParticlesKernel;
private static int spawnDynamicParticlesKernel;
private static int staticApplyExternalForceKernel;
private static int dynamicApplyExternalForceKernel;
private static int drawRainTexKernel;
private ComputeBuffer spawnTimesStaticBuffer;
private ComputeBuffer spawnTimesDynamicBuffer;
private ComputeBuffer staticParticlesBuffer;
private ComputeBuffer dynamicParticlesBuffer;
private const int StaticParticleCount = 384;
private const int DynamicParticleCount = 8;
private const float StaticTimerTimeStep = 0.0026041667f;
private const float DynamicTimerTimeStep = 0.125f;
public RenderInfo CurrentRenderInfo;
public RenderTexture RainMap;
private RenderTexture dropMap;
private RenderTexture trailMap;
private float staticTimer;
private float dynamicTimer;
private float deltaTime;
public static void LoadAssets(AssetBundle assetBundle)
{
computeAsset = assetBundle.LoadAsset<ComputeShader>("Assets/Scripts/PostProcessing/Raindrop/Resources/CSRaindrop.compute");
}
public RaindropSolver(int scrWidth, int scrHeight, int renderScale)
{
compute = Object.Instantiate<ComputeShader>(computeAsset);
CurrentRenderInfo = new RenderInfo(scrWidth, scrHeight, renderScale);
spawnStaticParticlesKernel = compute.FindKernel("SpawnStaticParticles");
spawnDynamicParticlesKernel = compute.FindKernel("SpawnDynamicParticles");
staticApplyExternalForceKernel = compute.FindKernel("StaticApplyExternalForce");
dynamicApplyExternalForceKernel = compute.FindKernel("DynamicApplyExternalForce");
drawRainTexKernel = compute.FindKernel("DrawRainMask");
SetRenderTextures(drawRainTexKernel);
SetBuffers(spawnStaticParticlesKernel, spawnDynamicParticlesKernel, staticApplyExternalForceKernel, dynamicApplyExternalForceKernel, drawRainTexKernel);
}
private void SetRenderTextures(params int[] kernels)
{
//IL_0037: 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_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_0059: Expected O, but got Unknown
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
//IL_00bd: Expected O, but got Unknown
//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
//IL_0104: Unknown result type (might be due to invalid IL or missing references)
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
//IL_0114: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: Expected O, but got Unknown
if ((Object)(object)dropMap != (Object)null)
{
dropMap.Release();
}
dropMap = new RenderTexture(CurrentRenderInfo.ScaledWidth, CurrentRenderInfo.ScaledHeight, 0, (RenderTextureFormat)28)
{
enableRandomWrite = true,
autoGenerateMips = true,
useMipMap = false
};
dropMap.Create();
if ((Object)(object)trailMap != (Object)null)
{
trailMap.Release();
}
trailMap = new RenderTexture(CurrentRenderInfo.ScaledWidth, CurrentRenderInfo.ScaledHeight, 0, (RenderTextureFormat)28)
{
enableRandomWrite = true,
autoGenerateMips = true,
useMipMap = false
};
trailMap.Create();
if ((Object)(object)RainMap != (Object)null)
{
RainMap.Release();
}
RainMap = new RenderTexture(CurrentRenderInfo.ScaledWidth, CurrentRenderInfo.ScaledHeight, 0, (RenderTextureFormat)28)
{
enableRandomWrite = true,
autoGenerateMips = true,
useMipMap = false
};
RainMap.Create();
foreach (int num in kernels)
{
compute.SetTexture(num, "rainMap", (Texture)(object)RainMap);
compute.SetTexture(num, "dropMap", (Texture)(object)dropMap);
compute.SetTexture(num, "trailMap", (Texture)(object)trailMap);
}
}
private void SetBuffers(params int[] kernels)
{
//IL_0064: 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_00da: Unknown result type (might be due to invalid IL or missing references)
//IL_00e4: Expected O, but got Unknown
//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
//IL_00fe: Expected O, but got Unknown
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
//IL_011c: Expected O, but got Unknown
//IL_012c: Unknown result type (might be due to invalid IL or missing references)
//IL_0136: Expected O, but got Unknown
int num = Marshal.SizeOf(typeof(Particle));
Particle[] array = new Particle[384];
Particle[] array2 = new Particle[8];
staticTimer = -0.1f;
dynamicTimer = -0.1f;
float[] array3 = new float[384];
for (int i = 0; i < 384; i++)
{
array3[i] = 0.0026041667f * (float)i;
array[i] = new Particle(new float2(-9999f, -9999f));
}
float[] array4 = new float[8];
for (int j = 0; j < 8; j++)
{
array4[j] = 0.125f * (float)j;
array2[j] = new Particle(new float2(-9999f, -9999f));
}
staticParticlesBuffer = new ComputeBuffer(384, num);
staticParticlesBuffer.SetData((Array)array);
dynamicParticlesBuffer = new ComputeBuffer(8, num);
dynamicParticlesBuffer.SetData((Array)array2);
spawnTimesStaticBuffer = new ComputeBuffer(384, 4);
spawnTimesStaticBuffer.SetData((Array)array3);
spawnTimesDynamicBuffer = new ComputeBuffer(8, 4);
spawnTimesDynamicBuffer.SetData((Array)array4);
foreach (int num2 in kernels)
{
compute.SetBuffer(num2, "staticParticles", staticParticlesBuffer);
compute.SetBuffer(num2, "dynamicParticles", dynamicParticlesBuffer);
compute.SetBuffer(num2, "spawnTimesStatic", spawnTimesStaticBuffer);
compute.SetBuffer(num2, "spawnTimesDynamic", spawnTimesDynamicBuffer);
}
compute.SetInt("numStatic", 384);
compute.SetInt("numDynamic", 8);
}
public void UpdateProperties(float intensity, int2 renderSize, int renderScale, float particleSize, float smoothDistance, int staticDropRate, int dynamicDropRate, float staticDropLifetime, float dryTime, float3 headForward, float travelTime)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
if (CurrentRenderInfo.Update(renderSize.x, renderSize.y, renderScale))
{
SetRenderTextures(drawRainTexKernel);
}
float num = Vector3.Dot(Vector3.up, float3.op_Implicit(headForward));
float num2 = ((num < -0.5f) ? 0f : 1f);
float num3 = num2 * ((num > 0.8f) ? 0f : 1f);
float num4 = ((num2 * intensity > 0f) ? 1f : (staticDropLifetime / dryTime));
staticTimer += Time.deltaTime * 0.0026041667f * intensity * (float)staticDropRate * num2;
dynamicTimer += Time.deltaTime * 0.125f * intensity * (float)dynamicDropRate * num3;
deltaTime += (Time.unscaledDeltaTime - deltaTime) * 0.1f;
compute.SetFloats(_bounds, new float[2] { CurrentRenderInfo.ScaledWidth, CurrentRenderInfo.ScaledHeight });
compute.SetFloat(_particleSize, particleSize);
compute.SetFloat(_smoothDistance, smoothDistance);
compute.SetFloat(_staticTime, staticTimer);
compute.SetFloat(_dynamicTime, dynamicTimer);
compute.SetFloat(_timeStep, Time.deltaTime);
compute.SetFloat(_staticLifetime, staticDropLifetime);
compute.SetFloat(_lifeTimeMultiplier, num4);
compute.SetFloat(_gravity, (float)(-CurrentRenderInfo.ScaledHeight) / travelTime);
}
public void CalcRainMap()
{
ComputeDispatch(spawnStaticParticlesKernel, 384);
ComputeDispatch(spawnDynamicParticlesKernel, 8);
ComputeDispatch(staticApplyExternalForceKernel, 384);
ComputeDispatch(dynamicApplyExternalForceKernel, 8);
ComputeDispatch(drawRainTexKernel, dropMap);
}
public void ClearRenderTextures()
{
VisorPostProcessingHelper.ClearOutRenderTexture(RainMap);
VisorPostProcessingHelper.ClearOutRenderTexture(trailMap);
VisorPostProcessingHelper.ClearOutRenderTexture(dropMap);
}
public void Release()
{
spawnTimesStaticBuffer.Release();
spawnTimesDynamicBuffer.Release();
staticParticlesBuffer.Release();
dynamicParticlesBuffer.Release();
}
private void ComputeDispatch(int kernel, int length)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
int3 threadGroups = GetThreadGroups(kernel);
compute.Dispatch(kernel, Mathf.CeilToInt((float)length / (float)threadGroups.x), 1, 1);
}
private void ComputeDispatch(int kernel, RenderTexture texture)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
int3 threadGroups = GetThreadGroups(kernel);
compute.Dispatch(kernel, Mathf.CeilToInt((float)((Texture)texture).width / (float)threadGroups.x), Mathf.CeilToInt((float)((Texture)texture).height / (float)threadGroups.y), 1);
}
private int3 GetThreadGroups(int kernel)
{
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
uint num = default(uint);
uint num2 = default(uint);
uint num3 = default(uint);
compute.GetKernelThreadGroupSizes(kernel, ref num, ref num2, ref num3);
return new int3((int)num, (int)num2, (int)num3);
}
}
public static class ShaderLoader
{
public static Shader DrawRaindropsShader;
public static Shader GaussianBlurImageShader;
public static Shader LevelImageShader;
public static Shader DrawScreenShader;
public static Shader DrawVisorCrackShader;
public static Shader RimShader;
public static Shader DrawBloodShader;
public static Shader DrawBloodCanvasShader;
public static Texture Level1Color;
public static Texture Level2Color;
public static Texture Level1Normal;
public static Texture Level2Normal;
public static Texture bloodRound0;
public static Texture bloodRound1;
public static Texture bloodRound2;
public static Texture bloodRound3;
public static void LoadAssets(AssetBundle assetBundle)
{
DrawRaindropsShader = assetBundle.LoadAsset<Shader>("Assets/Scripts/PostProcessing/Raindrop/Shaders/DrawRaindrops.shader");
GaussianBlurImageShader = assetBundle.LoadAsset<Shader>("Assets/Scripts/PostProcessing/Raindrop/Shaders/GaussianBlurImage.shader");
LevelImageShader = assetBundle.LoadAsset<Shader>("Assets/Scripts/PostProcessing/Raindrop/Shaders/LevelImage.shader");
DrawScreenShader = assetBundle.LoadAsset<Shader>("Assets/Scripts/PostProcessing/Raindrop/Shaders/DrawScreen.shader");
RimShader = assetBundle.LoadAsset<Shader>("Assets/Scripts/PostProcessing/VisorRim/Shaders/VisorRim.shader");
DrawBloodShader = assetBundle.LoadAsset<Shader>("Assets/Scripts/PostProcessing/BloodSplatter/Shaders/DrawVisorBlood.shader");
DrawBloodCanvasShader = assetBundle.LoadAsset<Shader>("Assets/Scripts/PostProcessing/BloodSplatter/Shaders/DrawBloodOnCanvas.shader");
DrawVisorCrackShader = assetBundle.LoadAsset<Shader>("Assets/Scripts/PostProcessing/VisorCrack/Shaders/DrawVisorCrack.shader");
Level1Color = assetBundle.LoadAsset<Texture>("Assets/Textures/Cracks/cracks_left_color.png");
Level2Color = assetBundle.LoadAsset<Texture>("Assets/Textures/Cracks/cracks_right_color.png");
Level1Normal = assetBundle.LoadAsset<Texture>("Assets/Textures/Cracks/cracks_left_normal.png");
Level2Normal = assetBundle.LoadAsset<Texture>("Assets/Textures/Cracks/cracks_right_normal.png");
bloodRound0 = assetBundle.LoadAsset<Texture>("Assets/Textures/BloodDecals/Splatter_round_0.png");
bloodRound1 = assetBundle.LoadAsset<Texture>("Assets/Textures/BloodDecals/Splatter_round_1.png");
bloodRound2 = assetBundle.LoadAsset<Texture>("Assets/Textures/BloodDecals/Splatter_round_2.png");
bloodRound3 = assetBundle.LoadAsset<Texture>("Assets/Textures/BloodDecals/Splatter_round_3.png");
}
}
public static class ShaderParams
{
public static readonly int MainTex = Shader.PropertyToID("_MainTex");
public static readonly int CullMask = Shader.PropertyToID("_CullMask");
public static readonly int PixelSize = Shader.PropertyToID("_PixelSize");
public static readonly int Opacity = Shader.PropertyToID("_Opacity");
public static readonly int Offset = Shader.PropertyToID("_Offset");
public static readonly int AspectRatio = Shader.PropertyToID("_AspectRatio");
public static readonly int Mode = Shader.PropertyToID("_ViewMode");
public static readonly int LifeTime = Shader.PropertyToID("_LifeTime");
public static readonly int Distortion = Shader.PropertyToID("_Distortion");
public static readonly int OutBlack = Shader.PropertyToID("_OutBlack");
public static readonly int OutWhite = Shader.PropertyToID("_OutWhite");
public static readonly int InWhite = Shader.PropertyToID("_InWhite");
public static readonly int InBlack = Shader.PropertyToID("_InBlack");
public static readonly int Level1Color = Shader.PropertyToID("_Level1Color");
public static readonly int Level2Color = Shader.PropertyToID("_Level2Color");
public static readonly int Level1Normal = Shader.PropertyToID("_Level1Normal");
public static readonly int Level2Normal = Shader.PropertyToID("_Level2Normal");
public static readonly int CrackLevel = Shader.PropertyToID("_CrackLevel");
public static readonly int RainTex = Shader.PropertyToID("_RainTex");
public static readonly int RainTexTexelSize = Shader.PropertyToID("_RainTex_TexelSize");
public static readonly int Specular = Shader.PropertyToID("_Specular");
public static readonly int Shadow = Shader.PropertyToID("_Shadow");
public static readonly int BloodDecal = Shader.PropertyToID("_Decal");
public static readonly int BloodEraser = Shader.PropertyToID("_Eraser");
public static readonly int PositionX = Shader.PropertyToID("_PositionX");
public static readonly int PositionY = Shader.PropertyToID("_PositionY");
public static readonly int Rotation = Shader.PropertyToID("_Rotation");
public static readonly int DecalSize = Shader.PropertyToID("_DecalSize");
public static readonly int FadeOut = Shader.PropertyToID("_FadeOut");
public static readonly int DecalCanvas = Shader.PropertyToID("_DecalCanvas");
public static readonly int DecalColor = Shader.PropertyToID("_DecalColor");
public static readonly int DrawNew = Shader.PropertyToID("_DrawNew");
}
public static class VisorPostProcessingHelper
{
private const float MaxSplatDistance = 3f;
private const float Randomness = 0.1f;
public static Camera PlayerCamera;
private static RenderTexture visorRimMask;
private static RenderTexture raindropMask;
private static Vector2 lastSplatPosition;
private static bool splatQueued;
private static bool wipeQueued;
public static void Blur(CommandBuffer cmd, RenderTexture target, Material blurMat)
{
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
RenderTexture val = RenderTexture.GetTemporary(((Texture)target).width, ((Texture)target).height, target.depth, target.format);
RenderTexture val2 = RenderTexture.GetTemporary(((Texture)target).width, ((Texture)target).height, target.depth, target.format);
cmd.Blit((Texture)(object)target, RenderTargetIdentifier.op_Implicit((Texture)(object)val));
for (int i = 0; i < 3; i++)
{
val2.DiscardContents();
((Texture)val).filterMode = (FilterMode)1;
cmd.Blit((Texture)(object)val, RenderTargetIdentifier.op_Implicit((Texture)(object)val2), blurMat, i);
RenderTexture obj = val2;
val2 = val;
val = obj;
}
cmd.Blit((Texture)(object)val, RenderTargetIdentifier.op_Implicit((Texture)(object)target));
RenderTexture.ReleaseTemporary(val);
RenderTexture.ReleaseTemporary(val2);
}
public static void RequestSplat(Vector3 bloodSource, float forcedRandomness = 0.1f)
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_003e: 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_00b6: Unknown result type (might be due to invalid IL or missing references)
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
float num = Vector3.Distance(((Component)PlayerCamera).transform.position, bloodSource);
Vector3 forward = ((Component)PlayerCamera).transform.forward;
Vector3 val = bloodSource - ((Component)PlayerCamera).transform.position;
float num2 = Vector3.Dot(forward, ((Vector3)(ref val)).normalized);
bool flag = num <= 3f && num2 >= -0.2f;
Plugin.Log.LogInfo((object)$"Blood splat requested - {flag} - Source : {bloodSource} - Distance : {num} - Dot : {num2}");
if (flag)
{
splatQueued = true;
lastSplatPosition = Vector2.op_Implicit(PlayerCamera.WorldToViewportPoint(bloodSource));
lastSplatPosition += new Vector2((Random.value * 2f - 1f) * forcedRandomness, (Random.value * 2f - 1f) * forcedRandomness);
}
}
public static (bool, Vector2) CheckSplat()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
(bool, Vector2) result = (splatQueued, lastSplatPosition);
if (result.Item1)
{
Plugin.Log.LogInfo((object)$"Blood splat checked true: {lastSplatPosition}");
}
splatQueued = false;
lastSplatPosition = Vector2.zero;
return result;
}
public static void RequestWipe()
{
wipeQueued = true;
}
public static void CheckBloodWipe(RenderTexture decalCanvas)
{
if (wipeQueued)
{
ClearOutRenderTexture(decalCanvas);
wipeQueued = false;
}
}
public static void ClearOutRenderTexture(RenderTexture renderTexture)
{
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
RenderTexture active = RenderTexture.active;
RenderTexture.active = renderTexture;
GL.Clear(true, true, Color.clear);
RenderTexture.active = active;
}
public static void BlitRaindropMask(CommandBuffer cmd, RenderTexture texture)
{
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Expected O, but got Unknown
if (raindropMask == null)
{
raindropMask = new RenderTexture(((Texture)texture).width, ((Texture)texture).height, 0, (RenderTextureFormat)28);
}
cmd.Blit((Texture)(object)texture, RenderTargetIdentifier.op_Implicit((Texture)(object)raindropMask));
}
public static RenderTexture GetRaindropMask()
{
return raindropMask;
}
public static RenderTexture GetVisorRimMask()
{
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: Expected O, but got Unknown
if (visorRimMask == null)
{
visorRimMask = new RenderTexture(Screen.width / 2, Screen.height / 2, (GraphicsFormat)8, (GraphicsFormat)0);
}
return visorRimMask;
}
}
[Serializable]
[VolumeComponentMenu("Post-processing/Custom/VisorBloodSplatter")]
public sealed class VisorBloodSplatter : CustomPostProcessVolumeComponent, IPostProcessComponent
{
[Tooltip("Controls the intensity of the effect.")]
public BoolParameter enabled = new BoolParameter(false, false);
public ColorParameter color = new ColorParameter(new Color(0.3679245f, 0f, 0f, 1f), false);
public ClampedFloatParameter maxOpacity = new ClampedFloatParameter(0.8f, 0f, 1f, false);
public FloatParameter fadeOut = new FloatParameter(3f, false);
public FloatParameter lifeTime = new FloatParameter(5f, false);
public FloatParameter size = new FloatParameter(1.4f, false);
public IntParameter pixelated = new IntParameter(0, false);
private Material bloodMat;
private Material canvasMat;
private Material drawScreenMat;
private bool allMatLoaded;
private Texture[] splatters;
private RenderTexture decalCanvas;
public override CustomPostProcessInjectionPoint injectionPoint => (CustomPostProcessInjectionPoint)1;
public bool IsActive()
{
return allMatLoaded && ((VolumeParameter<bool>)(object)enabled).value && Application.isPlaying && GameNetworkManager.Instance.localPlayerController != null;
}
public override void Setup()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Expected O, but got Unknown
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Expected O, but got Unknown
bloodMat = new Material(ShaderLoader.DrawBloodShader);
canvasMat = new Material(ShaderLoader.DrawBloodCanvasShader);
drawScreenMat = new Material(ShaderLoader.DrawScreenShader);
allMatLoaded = (Object)(object)bloodMat != (Object)null && (((Object)(object)canvasMat != (Object)null) & ((Object)(object)drawScreenMat != (Object)null));
}
public override void Render(CommandBuffer cmd, HDCamera camera, RTHandle source, RTHandle destination)
{
//IL_013e: Unknown result type (might be due to invalid IL or missing references)
//IL_015a: Unknown result type (might be due to invalid IL or missing references)
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
//IL_00cb: Expected O, but got Unknown
//IL_0221: Unknown result type (might be due to invalid IL or missing references)
//IL_023a: Unknown result type (might be due to invalid IL or missing references)
//IL_0284: Unknown result type (might be due to invalid IL or missing references)
if (!IsActive())
{
return;
}
bool flag = (Object)(object)camera.camera == (Object)(object)GameNetworkManager.Instance.localPlayerController.gameplayCamera;
if (camera.camera.targetTexture == null || !flag)
{
drawScreenMat.SetTexture(ShaderParams.MainTex, RTHandle.op_Implicit(source));
HDUtils.DrawFullScreen(cmd, drawScreenMat, destination, (MaterialPropertyBlock)null, 0);
return;
}
if (splatters == null)
{
splatters = (Texture[])(object)new Texture[4]
{
ShaderLoader.bloodRound0,
ShaderLoader.bloodRound1,
ShaderLoader.bloodRound2,
ShaderLoader.bloodRound3
};
}
if (decalCanvas == null)
{
decalCanvas = new RenderTexture(Screen.width, Screen.height, 0, (RenderTextureFormat)23, (RenderTextureReadWrite)1);
}
RenderTexture temporary = RenderTexture.GetTemporary(((Texture)decalCanvas).width, ((Texture)decalCanvas).height, 0, (RenderTextureFormat)23, (RenderTextureReadWrite)1);
(bool, Vector2) tuple = VisorPostProcessingHelper.CheckSplat();
VisorPostProcessingHelper.CheckBloodWipe(decalCanvas);
canvasMat.SetTexture(ShaderParams.BloodDecal, splatters[Random.Range(0, 3)]);
canvasMat.SetTexture(ShaderParams.BloodEraser, (Texture)(object)VisorPostProcessingHelper.GetRaindropMask());
canvasMat.SetFloat(ShaderParams.PositionX, tuple.Item2.x);
canvasMat.SetFloat(ShaderParams.PositionY, tuple.Item2.y);
canvasMat.SetFloat(ShaderParams.Rotation, Random.value * 360f);
canvasMat.SetFloat(ShaderParams.Opacity, ((VolumeParameter<float>)(object)maxOpacity).value);
canvasMat.SetFloat(ShaderParams.DecalSize, 1f / ((VolumeParameter<float>)(object)size).value);
canvasMat.SetFloat(ShaderParams.FadeOut, ((VolumeParameter<float>)(object)fadeOut).value);
canvasMat.SetFloat(ShaderParams.LifeTime, ((VolumeParameter<float>)(object)lifeTime).value);
canvasMat.SetInt(ShaderParams.DrawNew, tuple.Item1 ? 1 : 0);
cmd.Blit((Texture)(object)decalCanvas, RenderTargetIdentifier.op_Implicit((Texture)(object)temporary), canvasMat);
cmd.Blit((Texture)(object)temporary, RenderTargetIdentifier.op_Implicit((Texture)(object)decalCanvas));
bloodMat.SetTexture(ShaderParams.MainTex, RTHandle.op_Implicit(source));
bloodMat.SetTexture(ShaderParams.DecalCanvas, (Texture)(object)decalCanvas);
bloodMat.SetColor(ShaderParams.DecalColor, ((VolumeParameter<Color>)(object)color).value);
bloodMat.SetInt(ShaderParams.PixelSize, ((VolumeParameter<int>)(object)pixelated).value);
HDUtils.DrawFullScreen(cmd, bloodMat, destination, (MaterialPropertyBlock)null, 0);
RenderTexture.ReleaseTemporary(temporary);
}
public override void Cleanup()
{
CoreUtils.Destroy((Object)(object)bloodMat);
CoreUtils.Destroy((Object)(object)canvasMat);
}
}
[Serializable]
[VolumeComponentMenu("Post-processing/Custom/VisorCrack")]
public sealed class VisorCrack : CustomPostProcessVolumeComponent, IPostProcessComponent
{
[Tooltip("Controls the intensity of the effect.")]
public BoolParameter enabled = new BoolParameter(false, false);
public ClampedIntParameter crackLevel = new ClampedIntParameter(0, 0, 2, false);
public ClampedFloatParameter colorOpacity = new ClampedFloatParameter(0f, 0f, 1f, false);
public ClampedFloatParameter distortion = new ClampedFloatParameter(0.2f, 0f, 1f, false);
public IntParameter pixelated = new IntParameter(0, false);
public ViewModeParameter viewMode = new ViewModeParameter(ViewMode.Image);
private Material crackMat;
private Material drawScreenMat;
private bool allMatLoaded;
public override CustomPostProcessInjectionPoint injectionPoint => (CustomPostProcessInjectionPoint)1;
public bool IsActive()
{
return allMatLoaded && ((VolumeParameter<bool>)(object)enabled).value && ((VolumeParameter<int>)(object)crackLevel).value > 0 && GameNetworkManager.Instance.localPlayerController != null;
}
public override void Setup()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Expected O, but got Unknown
crackMat = new Material(ShaderLoader.DrawVisorCrackShader);
drawScreenMat = new Material(ShaderLoader.DrawScreenShader);
allMatLoaded = (Object)(object)crackMat != (Object)null && (Object)(object)drawScreenMat != (Object)null;
}
public override void Render(CommandBuffer cmd, HDCamera camera, RTHandle source, RTHandle destination)
{
if (IsActive())
{
bool flag = (Object)(object)camera.camera == (Object)(object)GameNetworkManager.Instance.localPlayerController.gameplayCamera;
if (camera.camera.targetTexture == null || !flag)
{
drawScreenMat.SetTexture(ShaderParams.MainTex, RTHandle.op_Implicit(source));
HDUtils.DrawFullScreen(cmd, drawScreenMat, destination, (MaterialPropertyBlock)null, 0);
return;
}
crackMat.SetTexture(ShaderParams.MainTex, RTHandle.op_Implicit(source));
crackMat.SetTexture(ShaderParams.Level1Color, ShaderLoader.Level1Color);
crackMat.SetTexture(ShaderParams.Level2Color, ShaderLoader.Level2Color);
crackMat.SetTexture(ShaderParams.Level1Normal, ShaderLoader.Level1Normal);
crackMat.SetTexture(ShaderParams.Level2Normal, ShaderLoader.Level2Normal);
crackMat.SetFloat(ShaderParams.PixelSize, (float)((VolumeParameter<int>)(object)pixelated).value);
crackMat.SetFloat(ShaderParams.Opacity, ((VolumeParameter<float>)(object)colorOpacity).value);
crackMat.SetFloat(ShaderParams.Distortion, ((VolumeParameter<float>)(object)distortion).value);
crackMat.SetInt(ShaderParams.Mode, (int)((VolumeParameter<ViewMode>)viewMode).value);
crackMat.SetInt(ShaderParams.CrackLevel, ((VolumeParameter<int>)(object)crackLevel).value);
HDUtils.DrawFullScreen(cmd, crackMat, destination, (MaterialPropertyBlock)null, 0);
}
}
public override void Cleanup()
{
CoreUtils.Destroy((Object)(object)crackMat);
CoreUtils.Destroy((Object)(object)drawScreenMat);
}
}
[Serializable]
[VolumeComponentMenu("Post-processing/Custom/VisorRaindrop")]
public sealed class VisorRaindrop : CustomPostProcessVolumeComponent, IPostProcessComponent
{
[Header("General")]
public BoolParameter enabled = new BoolParameter(false, false);
public ClampedFloatParameter intensity = new ClampedFloatParameter(0f, 0f, 1f, false);
public ViewModeParameter viewMode = new ViewModeParameter(ViewMode.Image);
[Header("Spawn Settings")]
public ClampedIntParameter staticDropRate = new ClampedIntParameter(128, 0, 128, false);
public ClampedIntParameter dynamicDropRate = new ClampedIntParameter(1, 0, 8, false);
public ClampedFloatParameter staticDropLifetime = new ClampedFloatParameter(1.5f, 0.1f, 2f, false);
public ClampedFloatParameter travelTime = new ClampedFloatParameter(1.1f, 0.1f, 1.25f, false);
public FloatParameter dryTime = new FloatParameter(1f, false);
[Header("Render Settings")]
public ClampedIntParameter renderScale = new ClampedIntParameter(50, 10, 100, false);
public MinIntParameter pixelated = new MinIntParameter(0, 0, false);
public BoolParameter specular = new BoolParameter(true, false);
public BoolParameter shadow = new BoolParameter(true, false);
public FloatParameter distortion = new FloatParameter(0.2f, false);
public ClampedFloatParameter particleSize = new ClampedFloatParameter(0.018f, 0f, 0.1f, false);
public ClampedFloatParameter smoothDistance = new ClampedFloatParameter(0.032f, 0f, 0.1f, false);
[Header("Level Height")]
public ClampedFloatParameter inBlack = new ClampedFloatParameter(100f, 0f, 255f, false);
public ClampedFloatParameter inWhite = new ClampedFloatParameter(255f, 0f, 255f, false);
public ClampedFloatParameter outWhite = new ClampedFloatParameter(220f, 0f, 255f, false);
public ClampedFloatParameter outBlack = new ClampedFloatParameter(6f, 0f, 255f, false);
private bool allMatLoaded;
private Material drawRaindropsMat;
private Material blurMat;
private Material levelMat;
private Material drawScreenMat;
private Dictionary<Camera, RaindropSolver> solvers;
public override CustomPostProcessInjectionPoint injectionPoint => (CustomPostProcessInjectionPoint)1;
public bool IsActive()
{
return allMatLoaded && ((VolumeParameter<bool>)(object)enabled).value && Application.isPlaying && GameNetworkManager.Instance.localPlayerController != null;
}
public override void Setup()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Expected O, but got Unknown
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Expected O, but got Unknown
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Expected O, but got Unknown
drawRaindropsMat = new Material(ShaderLoader.DrawRaindropsShader);
blurMat = new Material(ShaderLoader.GaussianBlurImageShader);
levelMat = new Material(ShaderLoader.LevelImageShader);
drawScreenMat = new Material(ShaderLoader.DrawScreenShader);
allMatLoaded = (Object)(object)drawRaindropsMat != (Object)null && (Object)(object)blurMat != (Object)null && (Object)(object)levelMat != (Object)null && (Object)(object)drawScreenMat != (Object)null;
}
public override void Render(CommandBuffer cmd, HDCamera camera, RTHandle source, RTHandle destination)
{
//IL_019c: Unknown result type (might be due to invalid IL or missing references)
//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
//IL_0239: Unknown result type (might be due to invalid IL or missing references)
//IL_026a: Unknown result type (might be due to invalid IL or missing references)
//IL_026b: Unknown result type (might be due to invalid IL or missing references)
//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
//IL_021c: Unknown result type (might be due to invalid IL or missing references)
//IL_021d: Unknown result type (might be due to invalid IL or missing references)
//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
//IL_0352: Unknown result type (might be due to invalid IL or missing references)
//IL_03dc: Unknown result type (might be due to invalid IL or missing references)
if (!IsActive())
{
return;
}
bool flag = (Object)(object)camera.camera == (Object)(object)GameNetworkManager.Instance.localPlayerController.gameplayCamera;
if (camera.camera.targetTexture == null || (VisorConfig.RaindropOnlyMainCam && !flag))
{
drawScreenMat.SetTexture(ShaderParams.MainTex, RTHandle.op_Implicit(source));
HDUtils.DrawFullScreen(cmd, drawScreenMat, destination, (MaterialPropertyBlock)null, 0);
return;
}
if (solvers == null)
{
solvers = new Dictionary<Camera, RaindropSolver>();
}
if (!solvers.TryGetValue(camera.camera, out var value))
{
RenderTexture targetTexture = camera.camera.targetTexture;
int num = ((VolumeParameter<int>)(object)renderScale).value;
if ((Object)(object)camera.camera != (Object)(object)GameNetworkManager.Instance.localPlayerController.gameplayCamera)
{
num = 25;
}
value = new RaindropSolver(((Texture)targetTexture).width, ((Texture)targetTexture).height, num);
solvers.Add(camera.camera, value);
Visor.Instance.AddCamera(camera.camera);
Plugin.Log.LogInfo((object)$"New RaindropSolver instance created : {((Object)camera.camera).name} - {((Texture)targetTexture).width} / {((Texture)targetTexture).height}");
}
float num2 = Visor.Instance.VisorRainStates[camera.camera].Intensity * VisorConfig.RaindropIntensity;
Vector3 forward = Visor.Instance.VisorRainStates[camera.camera].Forward;
int2 renderSize = default(int2);
((int2)(ref renderSize))..ctor(((Texture)camera.camera.targetTexture).width, ((Texture)camera.camera.targetTexture).height);
if (flag)
{
value.UpdateProperties(num2, renderSize, ((VolumeParameter<int>)(object)renderScale).value, ((VolumeParameter<float>)(object)particleSize).value, ((VolumeParameter<float>)(object)smoothDistance).value, ((VolumeParameter<int>)(object)staticDropRate).value, ((VolumeParameter<int>)(object)dynamicDropRate).value, 1f, ((VolumeParameter<float>)(object)dryTime).value, float3.op_Implicit(forward), ((VolumeParameter<float>)(object)travelTime).value);
}
else
{
value.UpdateProperties(num2, renderSize, 16, 0.02f, 0.04f, 32, ((VolumeParameter<int>)(object)dynamicDropRate).value, ((VolumeParameter<float>)(object)staticDropLifetime).value, ((VolumeParameter<float>)(object)dryTime).value, float3.op_Implicit(forward), 1f);
}
value.CalcRainMap();
int scaledWidth = value.CurrentRenderInfo.ScaledWidth;
int scaledHeight = value.CurrentRenderInfo.ScaledHeight;
RenderTexture temporary = RenderTexture.GetTemporary(scaledWidth, scaledHeight, 0, (RenderTextureFormat)28);
RenderTexture temporary2 = RenderTexture.GetTemporary(scaledWidth, scaledHeight, 0, (RenderTextureFormat)28, (RenderTextureReadWrite)1);
cmd.Blit((Texture)(object)value.RainMap, RenderTargetIdentifier.op_Implicit((Texture)(object)temporary));
VisorPostProcessingHelper.Blur(cmd, temporary, blurMat);
levelMat.SetFloat(ShaderParams.InBlack, ((VolumeParameter<float>)(object)inBlack).value);
levelMat.SetFloat(ShaderParams.InWhite, ((VolumeParameter<float>)(object)inWhite).value);
levelMat.SetFloat(ShaderParams.OutWhite, ((VolumeParameter<float>)(object)outWhite).value);
levelMat.SetFloat(ShaderParams.OutBlack, ((VolumeParameter<float>)(object)outBlack).value);
cmd.Blit((Texture)(object)temporary, RenderTargetIdentifier.op_Implicit((Texture)(object)temporary2), levelMat);
if (VisorConfig.BloodShow)
{
VisorPostProcessingHelper.BlitRaindropMask(cmd, temporary2);
}
drawRaindropsMat.SetTexture(ShaderParams.MainTex, RTHandle.op_Implicit(source));
drawRaindropsMat.SetTexture(ShaderParams.RainTex, (Texture)(object)temporary2);
drawRaindropsMat.SetTexture(ShaderParams.CullMask, (Texture)(object)VisorPostProcessingHelper.GetVisorRimMask());
drawRaindropsMat.SetVector(ShaderParams.RainTexTexelSize, new Vector4((float)((Texture)temporary2).width, (float)((Texture)temporary2).height, 0f, 0f));
drawRaindropsMat.SetFloat(ShaderParams.Distortion, ((VolumeParameter<float>)(object)distortion).value);
drawRaindropsMat.SetFloat(ShaderParams.PixelSize, (float)((VolumeParameter<int>)(object)pixelated).value);
drawRaindropsMat.SetInt(ShaderParams.Mode, (int)((VolumeParameter<ViewMode>)viewMode).value);
drawRaindropsMat.SetInt(ShaderParams.Specular, ((VolumeParameter<bool>)(object)specular).value ? 1 : 0);
drawRaindropsMat.SetInt(ShaderParams.Shadow, ((VolumeParameter<bool>)(object)shadow).value ? 1 : 0);
HDUtils.DrawFullScreen(cmd, drawRaindropsMat, destination, (MaterialPropertyBlock)null, 0);
RenderTexture.ReleaseTemporary(temporary);
RenderTexture.ReleaseTemporary(temporary2);
}
public void Clear(Camera camera)
{
if (solvers != null && solvers.TryGetValue(camera, out var value))
{
value.ClearRenderTextures();
}
}
public override void Cleanup()
{
if (solvers != null)
{
foreach (RaindropSolver value in solvers.Values)
{
value.Release();
}
solvers.Clear();
}
CoreUtils.Destroy((Object)(object)drawRaindropsMat);
CoreUtils.Destroy((Object)(object)blurMat);
CoreUtils.Destroy((Object)(object)levelMat);
CoreUtils.Destroy((Object)(object)drawScreenMat);
}
}
public enum ViewMode
{
Image,
Normal,
Height
}
[Serializable]
public sealed class ViewModeParameter : VolumeParameter<ViewMode>
{
public ViewModeParameter(ViewMode value, bool overrideState = false)
: base(value, overrideState)
{
}
}
[Serializable]
[VolumeComponentMenu("Post-processing/Custom/VisorRim")]
public sealed class VisorRim : CustomPostProcessVolumeComponent, IPostProcessComponent
{
public BoolParameter visible = new BoolParameter(false, false);
public ClampedFloatParameter offset = new ClampedFloatParameter(0f, -0.055f, 0f, false);
public ClampedFloatParameter opacity = new ClampedFloatParameter(0.8f, 0f, 1f, false);
private Material rimMat;
private Material drawScreenMat;
private bool allMatLoaded;
public override CustomPostProcessInjectionPoint injectionPoint => (CustomPostProcessInjectionPoint)2;
public bool IsActive()
{
return allMatLoaded && ((VolumeParameter<bool>)(object)visible).value && ((VolumeParameter<float>)(object)opacity).value > 0f && GameNetworkManager.Instance.localPlayerController != null;
}
public override void Setup()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Expected O, but got Unknown
rimMat = new Material(ShaderLoader.RimShader);
drawScreenMat = new Material(ShaderLoader.DrawScreenShader);
allMatLoaded = (Object)(object)rimMat != (Object)null && (Object)(object)drawScreenMat != (Object)null;
}
public override void Render(CommandBuffer cmd, HDCamera camera, RTHandle source, RTHandle destination)
{
if (IsActive())
{
if (camera.camera.targetTexture == null || (Object)(object)camera.camera != (Object)(object)GameNetworkManager.Instance.localPlayerController.gameplayCamera)
{
drawScreenMat.SetTexture(ShaderParams.MainTex, RTHandle.op_Implicit(source));
HDUtils.DrawFullScreen(cmd, drawScreenMat, destination, (MaterialPropertyBlock)null, 0);
return;
}
rimMat.SetTexture(ShaderParams.MainTex, RTHandle.op_Implicit(source));
rimMat.SetFloat(ShaderParams.Opacity, ((VolumeParameter<float>)(object)opacity).value);
rimMat.SetFloat(ShaderParams.AspectRatio, VisorConfig.RimStretch);
rimMat.SetFloat(ShaderParams.Offset, ((VolumeParameter<float>)(object)offset).value);
HDUtils.DrawFullScreen(cmd, rimMat, destination, (MaterialPropertyBlock)null, 0);
}
}
public override void Cleanup()
{
CoreUtils.Destroy((Object)(object)rimMat);
CoreUtils.Destroy((Object)(object)drawScreenMat);
}
}
}
namespace Woecust.ImmersiveVisor.Patches
{
[HarmonyPatch(typeof(EnemyAI))]
internal class EnemyAIPatch
{
[HarmonyPatch("HitEnemy")]
[HarmonyPostfix]
private static void HitEnemyPatch(EnemyAI __instance)
{
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
if (VisorConfig.BloodShow)
{
Plugin.Log.LogInfo((object)"Splat from enemy");
VisorPostProcessingHelper.RequestSplat(__instance.eye.position);
}
}
}
[HarmonyPatch(typeof(PlayerControllerB))]
internal class PlayerControllerBPatch
{
private static float prevHealth;
[HarmonyPatch("ConnectClientToPlayerObject")]
[HarmonyPostfix]
private static void InitializeVisor(ref PlayerControllerB __instance)
{
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00ac: Expected O, but got Unknown
if (!((Object)(object)GameNetworkManager.Instance.localPlayerController != (Object)(object)__instance))
{
if ((Object)(object)__instance.localVisor != (Object)null)
{
((Component)__instance.localVisor.GetChild(0)).GetComponent<MeshFilter>().mesh = null;
((Renderer)((Component)__instance.localVisor.GetChild(0)).GetComponent<MeshRenderer>()).material = null;
((Renderer)((Component)__instance.localVisor.Find("ScavengerHelmet/Plane")).GetComponent<MeshRenderer>()).materials[0] = null;
}
if ((Object)(object)Visor.Instance == (Object)null)
{
GameObject val = new GameObject("ImmersiveVisor", new Type[1] { typeof(Visor) });
val.transform.SetParent(GameObject.Find("Systems/Rendering").transform);
}
}
}
[HarmonyPatch("DamagePlayer")]
[HarmonyPrefix]
private static void CheckHealth(ref PlayerControllerB __instance)
{
if (!((Object)(object)GameNetworkManager.Instance.localPlayerController != (Object)(object)__instance))
{
prevHealth = __instance.health;
}
}
[HarmonyPatch("DamagePlayer")]
[HarmonyPostfix]
private static void DamageVisor(ref PlayerControllerB __instance, ref CauseOfDeath causeOfDeath)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0004: 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_0009: Invalid comparison between Unknown and I4
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
//IL_00da: Unknown result type (might be due to invalid IL or missing references)
CauseOfDeath val = causeOfDeath;
if (val - 9 <= 2)
{
return;
}
if ((Object)(object)GameNetworkManager.Instance.localPlayerController != (Object)(object)__instance)
{
if (VisorConfig.BloodShow)
{
VisorPostProcessingHelper.RequestSplat(__instance.cameraContainerTransform.position);
}
return;
}
if (__instance.isPlayerDead && prevHealth > 0f)
{
VisorPostProcessingHelper.RequestWipe();
}
else if (VisorConfig.BloodShow && VisorConfig.BloodSelf && (float)__instance.health < prevHealth)
{
VisorPostProcessingHelper.RequestSplat(((Component)__instance.gameplayCamera).transform.position + ((Component)__instance.gameplayCamera).transform.forward * 1f, 0.5f);
}
Visor.Instance.Damage(causeOfDeath);
}
}
[HarmonyPatch(typeof(StartOfRound))]
internal class StartOfRoundPatch
{
[HarmonyPatch("ReviveDeadPlayers")]
[HarmonyPrefix]
private static void ReviveDeadPlayersPatch()
{
if (VisorConfig.CrackRepairDeath && GameNetworkManager.Instance.localPlayerController.isPlayerDead)
{
Visor.Instance.Repair();
}
}
}
[HarmonyPatch(typeof(TimeOfDay))]
internal class TimeOfDayPatch
{
[HarmonyPatch("OnDayChanged")]
[HarmonyPostfix]
private static void OnDayChangedPatch()
{
if (VisorConfig.CrackRepairNewDay)
{
Visor.Instance.Repair();
}
}
[HarmonyPatch("SyncNewProfitQuotaClientRpc")]
[HarmonyPostfix]
private static void SyncNewProfitQuotaClientRpcPatch()
{
if (VisorConfig.CrackRepairNewQuota)
{
Visor.Instance.Repair();
}
}
}
}
namespace Woecust.ImmersiveVisor.Config
{
public static class ConfigLoader
{
public static void Load()
{
Version version = Version.Parse("0.5.2");
Version version2 = new Version(0, 0, 0);
bool flag = File.Exists(((BaseUnityPlugin)Plugin.Instance).Config.ConfigFilePath ?? "");
if (flag)
{
ConfigEntry<string> val = default(ConfigEntry<string>);
if (((BaseUnityPlugin)Plugin.Instance).Config.TryGetEntry<string>("DontTouchThis", "ConfigVersion", ref val))
{
version2 = Version.Parse(val.Value);
}
else
{
((BaseUnityPlugin)Plugin.Instance).Config.Bind<string>("DontTouchThis", "ConfigVersion", version2.ToString(), "It can recover itself, but just don't. It's just going to wipe your ImmersiveVisor configs");
}
if (version < version2)
{
((BaseUnityPlugin)Plugin.Instance).Config.Clear();
Plugin.Log.LogInfo((object)"Downgrade detected, deleting previous config data. But if you touched config version, it's probably a false alarm.");
}
}
ConfigEntry<bool> val2 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("0. General", "RimShow", true, "Make the visor rim visible. This is a post process effect separated from mesh.");
ConfigEntry<bool> val3 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("0. General", "CrackShow", true, "Make the visor reactive to total damage taken.");
ConfigEntry<bool> val4 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("0. General", "RaindropShow", true, "Raindrops hitting the visor on rainy/stormy/flooded weather.");
ConfigEntry<bool> val5 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("0. General", "BloodShow", true, "Blood splatters on screen when someone get damaged near you.");
VisorConfig.RimShow = val2.Value;
VisorConfig.CrackShow = val3.Value;
VisorConfig.RaindropShow = val4.Value;
VisorConfig.BloodShow = val5.Value;
ConfigEntry<bool> val6 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("1. Visor Rim", "RimPhysical", true, "Use mesh version of visor rim instead of post processing.");
ConfigEntry<float> val7 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<float>("1. Visor Rim", "RimStretch", 1.77f, "Stretch the rim to match the size of the screen. Put the aspect ratio of your screen for stretching. 1.77 for no stretch.\n1.33 = 4:3 \n1.77 = 16:9 \n2.33 = 21:9 \n3.55 = 32:9");
VisorConfig.RimPhysical = val6.Value;
VisorConfig.RimStretch = val7.Value;
ConfigEntry<bool> val8 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("2. Visor Crack", "CrackRepairDeath", true, "Visor gets repaired after dying. Option's here but I recommend not setting this to False.");
ConfigEntry<bool> val9 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("2. Visor Crack", "CrackRepairNewDay", true, "Visor gets repaired on a new day. Meaning, when the ship takes off.");
ConfigEntry<bool> val10 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("2. Visor Crack", "CrackRepairNewQuota", true, "Visor gets repaired after a quota gets fulfilled.");
ConfigEntry<float> val11 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<float>("2. Visor Crack", "CrackVolume", 3f, "Volume for visor break SFX. Default is 3.");
VisorConfig.CrackRepairDeath = val8.Value;
VisorConfig.CrackRepairNewDay = val9.Value;
VisorConfig.CrackRepairNewQuota = val10.Value;
VisorConfig.CrackVolume = val11.Value;
ConfigEntry<bool> val12 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("3. Screen Raindrop", "RaindropSpecular", true, "Adds specular to raindrops. Turn off for performance.");
ConfigEntry<bool> val13 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("3. Screen Raindrop", "RaindropShadow", true, "Adds shadows to raindrops. Turn off for performance.");
ConfigEntry<float> val14 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<float>("3. Screen Raindrop", "RaindropDryTime", 4f, "Time in seconds it takes for raindrops to slowly disappear after rain has been occluded.");
ConfigEntry<bool> val15 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("3. Screen Raindrop", "RaindropOnlyMainCam", true, "Cameras that are not rendering the screen doesn't display raindrop");
ConfigEntry<float> val16 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<float>("3. Screen Raindrop", "RaindropIntensity", 1f, "Max intensity for raindrop. from 0.2 to 0.0");
VisorConfig.RaindropSpecular = val12.Value;
VisorConfig.RaindropShadow = val13.Value;
VisorConfig.RaindropDryTime = val14.Value;
VisorConfig.RaindropOnlyMainCam = val15.Value;
VisorConfig.RaindropIntensity = Mathf.Clamp(val16.Value, 0.2f, 1f);
ConfigEntry<bool> val17 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("4. Blood Splatter", "BloodSelf", true, "Taking damage yourself shows splatter.");
ConfigEntry<float> val18 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<float>("4. Blood Splatter", "BloodLifeTime", 2f, "Time it takes until splatters starts to disappear.");
ConfigEntry<float> val19 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<float>("4. Blood Splatter", "BloodDryTime", 4.2f, "Time it takes for splatters to disappear.");
VisorConfig.BloodSelf = val17.Value;
VisorConfig.BloodLifeTime = val18.Value;
VisorConfig.BloodDryTime = val19.Value;
ConfigEntry<bool> val20 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<bool>("5. Pixelation", "PixelateAuto", false, "Pixelates all of them to match the pixel size of the game resolution. If you're playing on HD resolution, it's not going to affect much.");
ConfigEntry<int> val21 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<int>("5. Pixelation", "PixelatedRain", 0, "Pixelate the rain effect. 0 for no effect. 512 is recommended for vanilla feel.");
ConfigEntry<int> val22 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<int>("5. Pixelation", "PixelatedCrack", 0, "Pixelate the rain effect. 0 for no effect. 512 is recommended for vanilla feel.");
ConfigEntry<int> val23 = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<int>("5. Pixelation", "PixelatedBlood", 0, "Pixelate the rain effect. 0 for no effect. 512 is recommended for vanilla feel.");
VisorConfig.PixelateAuto = val20.Value;
VisorConfig.PixelatedRain = val21.Value;
VisorConfig.PixelatedCrack = val22.Value;
VisorConfig.PixelatedBlood = val23.Value;
if (flag && version > version2)
{
ConfigUpdater configUpdater = new ConfigUpdater();
if (!configUpdater.TryUpdate())
{
configUpdater.RemoveOrphans();
((BaseUnityPlugin)Plugin.Instance).Config.Save();
}
}
((BaseUnityPlugin)Plugin.Instance).Config.SettingChanged += SettingChanged;
}
private static void SettingChanged(object sender, SettingChangedEventArgs e)
{
ConfigDefinition definition = e.ChangedSetting.Definition;
FieldInfo field = typeof(VisorConfig).GetField(definition.Key, BindingFlags.Static | BindingFlags.Public);
if (field == null)
{
Plugin.Log.LogError((object)("Changing setting failed! : " + definition.Key));
return;
}
object obj = Convert.ChangeType(e.ChangedSetting.BoxedValue, field.FieldType);
field?.SetValue(null, obj);
Plugin.Log.LogInfo((object)$"Config value changed : {definition.Key} - {obj}");
}
}
public class ConfigUpdater
{
private static readonly Version latestCfgVersion = new Version(0, 5, 0);
private Dictionary<ConfigDefinition, string> orphanEntries;
private ConfigEntry<string> cfgEntry;
private Version cfgVersion;
private Version modVersion;
public bool TryUpdate()
{
if (!((BaseUnityPlugin)Plugin.Instance).Config.TryGetEntry<string>("DontTouchThis", "ConfigVersion", ref cfgEntry))
{
Plugin.Log.LogError((object)"Something went wrong. Called update without previous config version existing.");
return false;
}
cfgVersion = Version.Parse(cfgEntry.Value);
modVersion = Version.Parse("0.5.2");
if (cfgVersion > latestCfgVersion)
{
Plugin.Log.LogError((object)"Plugin Config version is higher than latest config version! Writing appropriate version number...");
((BaseUnityPlugin)Plugin.Instance).Config.Bind<Version>("DontTouchThis", "Config Version", latestCfgVersion, (ConfigDescription)null);
return false;
}
if (cfgVersion == latestCfgVersion)
{
Plugin.Log.LogInfo((object)"Plugin config version is up to data.");
return false;
}
((BaseUnityPlugin)Plugin.Instance).Config.Save();
if (NeedUpdateTo(0, 4, 5))
{
Update_0_4_5();
}
if (NeedUpdateTo(0, 5, 0))
{
Update_0_5_0();
}
RemoveOrphans();
((BaseUnityPlugin)Plugin.Instance).Config.Save();
return true;
}
private bool NeedUpdateTo(int major, int minor, int build)
{
Version version = new Version(major, minor, build);
return modVersion <= version && cfgVersion < version;
}
private void Update_0_4_5()
{
TryGetOrphans(out orphanEntries);
Plugin.Log.LogInfo((object)"Config Update starting...");
ReplaceEntryValue<bool>("VisorCrack", "0. General", "EnableCrack", "CrackShow");
ReplaceEntryValue<bool>("Raindrop", "0. General", "EnableRaindrop", "RaindropShow");
ReplaceEntryValue<bool>("VisorRim", "0. General", "EnableVisorRim", "RimShow");
ReplaceEntryValue<bool>("BloodSplatter", "0. General", "EnableBloodSplatter", "BloodShow");
ReplaceEntryValue<bool>("VisorCrack", "1. Visor Crack", "RepairOnDeath", "CrackRepairDeath");
ReplaceEntryValue<bool>("VisorCrack", "1. Visor Crack", "RepairOnNewDay", "CrackRepairNewDay");
ReplaceEntryValue<bool>("VisorCrack", "1. Visor Crack", "RepairOnQuotaFulfilled", "CrackRepairNewQuota");
ReplaceEntryValue<float>("VisorCrack", "1. Visor Crack", "VisorBreakSFXVolume", "CrackVolume");
ReplaceEntryValue<bool>("Raindrop", "2. Screen Raindrop", "RaindropSpecular", "RaindropSpecular");
ReplaceEntryValue<bool>("Raindrop", "2. Screen Raindrop", "RaindropShadow", "RaindropShadow");
ReplaceEntryValue<bool>("Raindrop", "2. Screen Raindrop", "OnlyMainCamera", "RaindropOnlyMainCam");
ReplaceEntryValue<float>("Raindrop", "2. Screen Raindrop", "RaindropDryTime", "RaindropDryTime");
ReplaceEntryValue<float>("BloodSplatter", "3. Blood Splatter", "LifeTime", "BloodLifeTime");
ReplaceEntryValue<float>("BloodSplatter", "3. Blood Splatter", "DryTime", "BloodDryTime");
ReplaceEntryValue<bool>("BloodSplatter", "3. Blood Splatter", "ShowSplatterFromSelf", "BloodSelf");
cfgEntry.Value = new Version(0, 4, 5).ToString();
Plugin.Log.LogInfo((object)"Config Updated to 0.4.5 version");
}
private void Update_0_5_0()
{
TryGetOrphans(out orphanEntries);
ReplaceEntryValue<bool>("1. Visor Crack", "2. Visor Crack", "CrackRepairDeath", "CrackRepairDeath");
ReplaceEntryValue<bool>("1. Visor Crack", "2. Visor Crack", "CrackRepairNewDay", "CrackRepairNewDay");
ReplaceEntryValue<bool>("1. Visor Crack", "2. Visor Crack", "CrackRepairNewQuota", "CrackRepairNewQuota");
ReplaceEntryValue<float>("1. Visor Crack", "2. Visor Crack", "CrackVolume", "CrackVolume");
ReplaceEntryValue<bool>("2. Screen Raindrop", "3. Screen Raindrop", "RaindropSpecular", "RaindropSpecular");
ReplaceEntryValue<bool>("2. Screen Raindrop", "3. Screen Raindrop", "RaindropShadow", "RaindropShadow");
ReplaceEntryValue<bool>("2. Screen Raindrop", "3. Screen Raindrop", "RaindropOnlyMainCam", "RaindropOnlyMainCam");
ReplaceEntryValue<float>("2. Screen Raindrop", "3. Screen Raindrop", "RaindropDryTime", "RaindropDryTime");
ReplaceEntryValue<float>("2. Screen Raindrop", "3. Screen Raindrop", "RaindropIntensity", "RaindropIntensity");
ReplaceEntryValue<float>("3. Blood Splatter", "4. Blood Splatter", "BloodLifeTime", "BloodLifeTime");
ReplaceEntryValue<float>("3. Blood Splatter", "4. Blood Splatter", "BloodDryTime", "BloodDryTime");
ReplaceEntryValue<bool>("3. Blood Splatter", "4. Blood Splatter", "BloodSelf", "BloodSelf");
ReplaceEntryValue<bool>("4. Pixelation", "5. Pixelation", "PixelateAuto", "PixelateAuto");
ReplaceEntryValue<int>("4. Pixelation", "5. Pixelation", "PixelatedRain", "PixelatedRain");
ReplaceEntryValue<int>("4. Pixelation", "5. Pixelation", "PixelatedCrack", "PixelatedCrack");
ReplaceEntryValue<int>("4. Pixelation", "5. Pixelation", "PixelatedBlood", "PixelatedBlood");
cfgEntry.Value = new Version(0, 5, 0).ToString();
Plugin.Log.LogInfo((object)"Config Updated to 0.5.0 version");
}
private bool TryGetOrphans(out Dictionary<ConfigDefinition, string> orphans)
{
orphans = null;
Dictionary<ConfigDefinition, string> value = Traverse.Create((object)((BaseUnityPlugin)Plugin.Instance).Config).Property("OrphanedEntries", (object[])null).GetValue<Dictionary<ConfigDefinition, string>>();
if (value == null)
{
return false;
}
orphans = value.ToDictionary((KeyValuePair<ConfigDefinition, string> pair) => pair.Key, (KeyValuePair<ConfigDefinition, string> pair) => pair.Value);
return true;
}
public void RemoveOrphans()
{
if (!TryGetOrphans(out orphanEntries))
{
Plugin.Log.LogInfo((object)"No orphaned entries left.");
return;
}
foreach (KeyValuePair<ConfigDefinition, string> orphanEntry in orphanEntries)
{
((BaseUnityPlugin)Plugin.Instance).Config.Bind<string>(orphanEntry.Key, orphanEntry.Value, (ConfigDescription)null);
if (((BaseUnityPlugin)Plugin.Instance).Config.Remove(orphanEntry.Key))
{
Plugin.Log.LogInfo((object)("Stray config [" + orphanEntry.Key.Section + " | " + orphanEntry.Key.Key + "] removed."));
}
}
}
private void ReplaceEntryValue<T>(string section, string srcKey, string dstKey) where T : new()
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Expected O, but got Unknown
ConfigDefinition val = new ConfigDefinition(section, srcKey);
if (orphanEntries.ContainsKey(val))
{
orphanEntries.Remove(val);
((BaseUnityPlugin)Plugin.Instance).Config.Bind<T>(val, default(T), (ConfigDescription)null);
}
ConfigEntry<T> val2 = default(ConfigEntry<T>);
bool flag = ((BaseUnityPlugin)Plugin.Instance).Config.TryGetEntry<T>(section, srcKey, ref val2);
ConfigEntry<T> val3 = default(ConfigEntry<T>);
bool flag2 = ((BaseUnityPlugin)Plugin.Instance).Config.TryGetEntry<T>(section, dstKey, ref val3);
if (!flag || !flag2)
{
if (!flag)
{
Plugin.Log.LogWarning((object)("Old config not found : " + section + " | " + srcKey));
}
if (!flag2)
{
Plugin.Log.LogWarning((object)("New config not found : " + section + " | " + dstKey));
}
}
else
{
val3.Value = val2.Value;
((BaseUnityPlugin)Plugin.Instance).Config.Remove(((ConfigEntryBase)val2).Definition);
Plugin.Log.LogInfo((object)("Config Updated : " + section + " | " + srcKey + " -> " + dstKey));
}
}
private void ReplaceEntryValue<T>(string srcSection, string dstSection, string srcKey, string dstKey) where T : new()
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Expected O, but got Unknown
ConfigDefinition val = new ConfigDefinition(srcSection, srcKey);
if (orphanEntries.ContainsKey(val))
{
orphanEntries.Remove(val);
((BaseUnityPlugin)Plugin.Instance).Config.Bind<T>(val, default(T), (ConfigDescription)null);
}
ConfigEntry<T> val2 = default(ConfigEntry<T>);
bool flag = ((BaseUnityPlugin)Plugin.Instance).Config.TryGetEntry<T>(srcSection, srcKey, ref val2);
ConfigEntry<T> val3 = default(ConfigEntry<T>);
bool flag2 = ((BaseUnityPlugin)Plugin.Instance).Config.TryGetEntry<T>(dstSection, dstKey, ref val3);
if (!flag || !flag2)
{
if (!flag)
{
Plugin.Log.LogWarning((object)("Old config not found : " + srcSection + " | " + srcKey));
}
if (!flag2)
{
Plugin.Log.LogWarning((object)("New config not found : " + dstSection + " | " + dstKey));
}
}
else
{
val3.Value = val2.Value;
((BaseUnityPlugin)Plugin.Instance).Config.Remove(((ConfigEntryBase)val2).Definition);
Plugin.Log.LogInfo((object)("Config Updated : " + srcSection + " -> " + dstSection + " | " + srcKey + " -> " + dstKey));
}
}
}
public static class VisorConfig
{
public static bool PixelateAuto;
public static int PixelatedRain;
public static int PixelatedCrack;
public static int PixelatedBlood;
public static bool RaindropShow;
public static bool RaindropSpecular;
public static bool RaindropShadow;
public static bool RaindropOnlyMainCam;
public static float RaindropDryTime;
public static float RaindropIntensity;
public static bool CrackShow;
public static bool CrackRepairDeath;
public static bool CrackRepairNewDay;
public static bool CrackRepairNewQuota;
public static float CrackVolume;
public static bool RimShow;
public static bool RimPhysical;
public static float RimStretch;
public static bool BloodShow;
public static bool BloodSelf;
public static float BloodLifeTime;
public static float BloodDryTime;
}
}