using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Scoops;
using Scoops.patches;
using Scoops.rendering;
using Scoops.service;
using Sponge.Utilities.IL;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Experimental.Rendering;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
[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: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Runtime")]
[assembly: AssemblyCompany("LethalSpongeLegacy")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("0.0.0.0")]
[assembly: AssemblyInformationalVersion("0.0.0-alpha.0.58+5d066a3b176347077dc30d4cec1106211489197e")]
[assembly: AssemblyProduct("LethalSpongeLegacy")]
[assembly: AssemblyTitle("LethalSpongeLegacy")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace Sponge.Utilities.IL
{
public class ILInjector
{
[CompilerGenerated]
private sealed class <GetRelativeInstructions>d__32 : IEnumerable<CodeInstruction>, IEnumerable, IEnumerator<CodeInstruction>, IEnumerator, IDisposable
{
private int <>1__state;
private CodeInstruction <>2__current;
private int <>l__initialThreadId;
private int offset;
public int <>3__offset;
private int size;
public int <>3__size;
public ILInjector <>4__this;
private int <i>5__1;
CodeInstruction IEnumerator<CodeInstruction>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <GetRelativeInstructions>d__32(int <>1__state)
{
this.<>1__state = <>1__state;
<>l__initialThreadId = Environment.CurrentManagedThreadId;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<i>5__1 = 0;
break;
case 1:
<>1__state = -1;
<i>5__1++;
break;
}
if (<i>5__1 < size)
{
<>2__current = <>4__this.instructions[<>4__this.index + offset + <i>5__1];
<>1__state = 1;
return true;
}
return false;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
[DebuggerHidden]
IEnumerator<CodeInstruction> IEnumerable<CodeInstruction>.GetEnumerator()
{
<GetRelativeInstructions>d__32 <GetRelativeInstructions>d__;
if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
{
<>1__state = 0;
<GetRelativeInstructions>d__ = this;
}
else
{
<GetRelativeInstructions>d__ = new <GetRelativeInstructions>d__32(0)
{
<>4__this = <>4__this
};
}
<GetRelativeInstructions>d__.offset = <>3__offset;
<GetRelativeInstructions>d__.size = <>3__size;
return <GetRelativeInstructions>d__;
}
[DebuggerHidden]
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable<CodeInstruction>)this).GetEnumerator();
}
}
private const string INVALID = "Injector is invalid";
private const string MATCH_END_INVALID = "The end of the last search was invalid";
private List<CodeInstruction> instructions = instructions.ToList();
private ILGenerator generator;
private int index;
private int matchEnd;
public bool IsValid => instructions != null && IsIndexValid(index);
public CodeInstruction Instruction
{
get
{
if (!IsIndexInRange(index))
{
return null;
}
return instructions[index];
}
set
{
if (!IsIndexInRange(index))
{
throw new InvalidOperationException($"Current index {index} is out of range of instruction count {instructions.Count}");
}
instructions[index] = value;
}
}
public CodeInstruction LastMatchedInstruction
{
get
{
int num = matchEnd - 1;
if (!IsIndexInRange(num))
{
return null;
}
return instructions[num];
}
set
{
int num = matchEnd - 1;
if (!IsIndexInRange(num))
{
throw new InvalidOperationException($"Last matched index {index} is out of range of instruction count {instructions.Count}");
}
instructions[num] = value;
}
}
public ICollection<CodeInstruction> Instructions => instructions.AsReadOnly();
public ILInjector(IEnumerable<CodeInstruction> instructions, ILGenerator generator = null)
{
this.generator = generator;
index = 0;
matchEnd = -1;
base..ctor();
}
public ILInjector GoToStart()
{
matchEnd = index;
index = 0;
return this;
}
public ILInjector GoToEnd()
{
matchEnd = index;
index = instructions.Count;
return this;
}
public ILInjector Forward(int offset)
{
if (!IsValid)
{
return this;
}
matchEnd = index;
index = Math.Clamp(index + offset, -1, instructions.Count);
return this;
}
public ILInjector Back(int offset)
{
return Forward(-offset);
}
private void MarkInvalid()
{
index = -1;
matchEnd = -1;
}
private void Search(bool forward, ILMatcher[] predicates)
{
if (!IsValid)
{
return;
}
int num = 1;
if (!forward)
{
num = -1;
index--;
}
while (forward ? (index < instructions.Count) : (index >= 0))
{
if (forward && index + predicates.Length > instructions.Count)
{
index = instructions.Count;
break;
}
int i;
for (i = 0; i < predicates.Length && predicates[i].Matches(instructions[index + i]); i++)
{
}
if (i == predicates.Length)
{
matchEnd = index + i;
return;
}
index += num;
}
MarkInvalid();
}
public ILInjector Find(params ILMatcher[] predicates)
{
Search(forward: true, predicates);
return this;
}
public ILInjector ReverseFind(params ILMatcher[] predicates)
{
Search(forward: false, predicates);
return this;
}
public ILInjector GoToPush(int popIndex)
{
if (!IsValid)
{
return this;
}
matchEnd = index;
index--;
int num = 0;
while (index >= 0)
{
CodeInstruction instruction = instructions[index];
num += instruction.PushCount();
num -= instruction.PopCount();
if (num > popIndex)
{
return this;
}
index--;
}
return this;
}
public ILInjector SkipBranch()
{
if (Instruction == null)
{
return this;
}
if (!(Instruction.operand is Label label) || 1 == 0)
{
throw new InvalidOperationException($"Current instruction is not a branch: {Instruction}");
}
return FindLabel(label);
}
public ILInjector FindLabel(Label label)
{
matchEnd = index + 1;
for (index = 0; index < instructions.Count; index++)
{
if (instructions[index].labels.Contains(label))
{
return this;
}
}
MarkInvalid();
return this;
}
public ILInjector GoToMatchEnd()
{
index = matchEnd;
return this;
}
public ILInjector GoToLastMatchedInstruction()
{
if (!IsIndexValid(matchEnd))
{
return this;
}
index = matchEnd - 1;
return this;
}
private bool IsIndexValid(int index)
{
return index != -1;
}
private bool IsIndexInRange(int index)
{
return index >= 0 && index < instructions.Count;
}
public CodeInstruction GetRelativeInstruction(int offset)
{
if (!IsValid)
{
throw new InvalidOperationException("Injector is invalid");
}
int num = index + offset;
if (!IsIndexInRange(num))
{
throw new IndexOutOfRangeException($"Offset {offset} would read out of bounds at index {num}");
}
return instructions[num];
}
public void SetRelativeInstruction(int offset, CodeInstruction instruction)
{
if (!IsValid)
{
throw new InvalidOperationException("Injector is invalid");
}
int num = index + offset;
if (!IsIndexInRange(num))
{
throw new IndexOutOfRangeException($"Offset {offset} would write out of bounds at index {num}");
}
instructions[num] = instruction;
}
[IteratorStateMachine(typeof(<GetRelativeInstructions>d__32))]
public IEnumerable<CodeInstruction> GetRelativeInstructions(int offset, int size)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <GetRelativeInstructions>d__32(-2)
{
<>4__this = this,
<>3__offset = offset,
<>3__size = size
};
}
public IEnumerable<CodeInstruction> GetRelativeInstructions(int size)
{
return GetRelativeInstructions(0, size);
}
private void GetLastMatchRangeAbsolute(out int start, out int end)
{
start = index;
end = matchEnd;
if (start > end)
{
int num = end;
int num2 = start;
start = num;
end = num2;
}
}
private void GetLastMatchRange(out int start, out int size)
{
GetLastMatchRangeAbsolute(out start, out var end);
if (start < 0 || start >= instructions.Count)
{
throw new InvalidOperationException($"Last match range starts at invalid index {start}");
}
if (end < 0 || end > instructions.Count)
{
throw new InvalidOperationException($"Last match range ends at invalid index {end}");
}
size = end - start;
}
public List<CodeInstruction> GetLastMatch()
{
GetLastMatchRange(out var start, out var size);
return instructions.GetRange(start, size);
}
public Label AddLabel()
{
if (generator == null)
{
throw new InvalidOperationException("No ILGenerator was provided");
}
Label label = generator.DefineLabel();
Instruction.labels.Add(label);
return label;
}
public ILInjector AddLabel(Label label)
{
Instruction.labels.Add(label);
return this;
}
public ILInjector InsertInPlace(params CodeInstruction[] instructions)
{
if (!IsValid)
{
throw new InvalidOperationException("Injector is invalid");
}
this.instructions.InsertRange(index, instructions);
if (matchEnd >= index)
{
matchEnd += instructions.Length;
}
return this;
}
public ILInjector Insert(params CodeInstruction[] instructions)
{
InsertInPlace(instructions);
index += instructions.Length;
return this;
}
public ILInjector InsertInPlaceAfterBranch(params CodeInstruction[] instructions)
{
if (!IsValid)
{
throw new InvalidOperationException("Injector is invalid");
}
List<Label> labels = Instruction.labels;
this.instructions.InsertRange(index, instructions);
Instruction.labels.AddRange(labels);
labels.Clear();
if (matchEnd >= index)
{
matchEnd += instructions.Length;
}
return this;
}
public ILInjector InsertAfterBranch(params CodeInstruction[] instructions)
{
InsertInPlaceAfterBranch(instructions);
index += instructions.Length;
return this;
}
public ILInjector RemoveAllPreviousInstructions()
{
if (!IsValid)
{
throw new InvalidOperationException("Injector is invalid");
}
instructions.RemoveRange(0, index);
matchEnd -= index;
if (matchEnd < 0)
{
matchEnd = 0;
}
index = 0;
return this;
}
public ILInjector Remove(int count = 1)
{
if (!IsValid)
{
throw new InvalidOperationException("Injector is invalid");
}
instructions.RemoveRange(index, count);
if (matchEnd > index)
{
matchEnd = Math.Max(index, matchEnd - count);
}
return this;
}
public ILInjector RemoveLastMatch()
{
GetLastMatchRange(out var start, out var size);
instructions.RemoveRange(start, size);
index = start;
matchEnd = start;
return this;
}
public ILInjector ReplaceLastMatch(params CodeInstruction[] instructions)
{
RemoveLastMatch();
Insert(instructions);
return this;
}
public List<CodeInstruction> ReleaseInstructions()
{
List<CodeInstruction> result = instructions;
instructions = null;
return result;
}
public ILInjector PrintContext(int context, string header = "")
{
if (!IsValid)
{
throw new InvalidOperationException("Injector is invalid (" + header + ")");
}
StringBuilder stringBuilder = new StringBuilder(header);
if (header.Length > 0)
{
stringBuilder.Append(':');
}
stringBuilder.AppendLine();
GetLastMatchRangeAbsolute(out var start, out var end);
int num = Math.Min(end + 1 + context, instructions.Count);
for (int i = Math.Max(start - context, 0); i < num; i++)
{
if (end == -1 && i == index)
{
stringBuilder.Append("╶> ");
}
else
{
if (i >= start && i < end)
{
stringBuilder.Append("│");
}
else
{
stringBuilder.Append(" ");
}
if (i == index)
{
stringBuilder.Append("╶> ");
}
else
{
stringBuilder.Append(" ");
}
}
stringBuilder.AppendLine($"{i}: {instructions[i]}");
}
Plugin.Log.LogInfo((object)stringBuilder);
return this;
}
public ILInjector PrintContext(string header = "")
{
return PrintContext(4, header);
}
}
public interface ILMatcher
{
private static OpCode[] branchInstructions = new OpCode[4]
{
OpCodes.Br,
OpCodes.Br_S,
OpCodes.Brfalse,
OpCodes.Brfalse_S
};
bool Matches(CodeInstruction instruction);
static NotMatcher Not(ILMatcher matcher)
{
return new NotMatcher(matcher);
}
static OpcodeMatcher Opcode(OpCode opcode)
{
return new OpcodeMatcher(opcode);
}
static OpcodesMatcher Opcodes(params OpCode[] opcodes)
{
return new OpcodesMatcher(opcodes);
}
static OpcodeOperandMatcher OpcodeOperand(OpCode opcode, object operand)
{
return new OpcodeOperandMatcher(opcode, operand);
}
static InstructionMatcher Instruction(CodeInstruction instruction)
{
return new InstructionMatcher(instruction);
}
static LdargMatcher Ldarg(int? arg = null)
{
return new LdargMatcher(arg);
}
static LdlocMatcher Ldloc(int? loc = null)
{
return new LdlocMatcher(loc);
}
static StlocMatcher Stloc(int? loc = null)
{
return new StlocMatcher(loc);
}
static LdcI32Matcher Ldc(int? value = null)
{
return new LdcI32Matcher(value);
}
static BranchMatcher Branch()
{
return new BranchMatcher();
}
static OpcodeOperandMatcher Ldfld(FieldInfo field)
{
if (field == null)
{
Plugin.Log.LogWarning((object)$"Field passed to ILMatcher.Ldfld() was null\n{new StackTrace()}");
}
return new OpcodeOperandMatcher(OpCodes.Ldfld, field);
}
static OpcodeOperandMatcher Ldsfld(FieldInfo field)
{
if (field == null)
{
Plugin.Log.LogWarning((object)$"Field passed to ILMatcher.Ldsfld() was null\n{new StackTrace()}");
}
return new OpcodeOperandMatcher(OpCodes.Ldsfld, field);
}
static OpcodeOperandMatcher Stfld(FieldInfo field)
{
if (field == null)
{
Plugin.Log.LogWarning((object)$"Field passed to ILMatcher.Stfld() was null\n{new StackTrace()}");
}
return new OpcodeOperandMatcher(OpCodes.Stfld, field);
}
static OpcodeOperandMatcher Stsfld(FieldInfo field)
{
if (field == null)
{
Plugin.Log.LogWarning((object)$"Field passed to ILMatcher.Stsfld() was null\n{new StackTrace()}");
}
return new OpcodeOperandMatcher(OpCodes.Stsfld, field);
}
static OpcodeOperandMatcher Callvirt(MethodBase method)
{
if (method == null)
{
Plugin.Log.LogWarning((object)$"Method passed to ILMatcher.Callvirt() was null\n{new StackTrace()}");
}
return OpcodeOperand(OpCodes.Callvirt, method);
}
static OpcodeOperandMatcher Call(MethodBase method)
{
if (method == null)
{
Plugin.Log.LogWarning((object)$"Method passed to ILMatcher.Call() was null\n{new StackTrace()}");
}
return OpcodeOperand(OpCodes.Call, method);
}
static PredicateMatcher Predicate(Func<CodeInstruction, bool> predicate)
{
return new PredicateMatcher(predicate);
}
static PredicateMatcher Predicate(Func<FieldInfo, bool> predicate)
{
return new PredicateMatcher((CodeInstruction insn) => insn.operand is FieldInfo arg && predicate(arg));
}
}
public class NotMatcher : ILMatcher
{
private readonly ILMatcher matcher;
public NotMatcher(ILMatcher matcher)
{
this.matcher = matcher;
base..ctor();
}
public bool Matches(CodeInstruction instruction)
{
return !matcher.Matches(instruction);
}
}
public class OpcodeMatcher : ILMatcher
{
private readonly OpCode opcode;
public OpcodeMatcher(OpCode opcode)
{
this.opcode = opcode;
base..ctor();
}
public bool Matches(CodeInstruction instruction)
{
return instruction.opcode == opcode;
}
}
public class OpcodesMatcher : ILMatcher
{
private readonly OpCode[] opcodes;
public OpcodesMatcher(OpCode[] opcodes)
{
this.opcodes = opcodes;
base..ctor();
}
public bool Matches(CodeInstruction instruction)
{
return opcodes.Contains(instruction.opcode);
}
}
public class OpcodeOperandMatcher : ILMatcher
{
private readonly OpCode opcode;
private readonly object operand;
public OpcodeOperandMatcher(OpCode opcode, object operand)
{
this.opcode = opcode;
this.operand = operand;
base..ctor();
}
public bool Matches(CodeInstruction instruction)
{
return instruction.opcode == opcode && instruction.operand == operand;
}
}
public class InstructionMatcher : ILMatcher
{
private readonly OpCode opcode = instruction.opcode;
private readonly object operand = instruction.operand;
private readonly Label[] labels = instruction.labels.ToArray();
public InstructionMatcher(CodeInstruction instruction)
{
}
public bool Matches(CodeInstruction instruction)
{
if (instruction.opcode != opcode)
{
return false;
}
if (instruction.operand != operand)
{
return false;
}
if (instruction.labels.Count != labels.Length)
{
return false;
}
for (int i = 0; i < labels.Length; i++)
{
if (labels[i] != instruction.labels[i])
{
return false;
}
}
return true;
}
}
public class LdargMatcher : ILMatcher
{
private readonly int? arg;
public LdargMatcher(int? arg)
{
this.arg = arg;
base..ctor();
}
public bool Matches(CodeInstruction instruction)
{
return arg.HasValue ? (instruction.GetLdargIndex() == arg) : instruction.GetLdargIndex().HasValue;
}
}
public class LdlocMatcher : ILMatcher
{
private readonly int? loc;
public LdlocMatcher(int? loc)
{
this.loc = loc;
base..ctor();
}
public bool Matches(CodeInstruction instruction)
{
return loc.HasValue ? (instruction.GetLdlocIndex() == loc) : instruction.GetLdlocIndex().HasValue;
}
}
public class StlocMatcher : ILMatcher
{
private readonly int? loc;
public StlocMatcher(int? loc)
{
this.loc = loc;
base..ctor();
}
public bool Matches(CodeInstruction instruction)
{
return loc.HasValue ? (instruction.GetStlocIndex() == loc) : instruction.GetStlocIndex().HasValue;
}
}
public class LdcI32Matcher : ILMatcher
{
private readonly int? value;
public LdcI32Matcher(int? value)
{
this.value = value;
base..ctor();
}
public bool Matches(CodeInstruction instruction)
{
return (!value.HasValue && instruction.GetLdcI32().HasValue) || instruction.GetLdcI32() == value;
}
}
public class BranchMatcher : ILMatcher
{
public bool Matches(CodeInstruction instruction)
{
Label? label = default(Label?);
return CodeInstructionExtensions.Branches(instruction, ref label);
}
}
public class PredicateMatcher : ILMatcher
{
private readonly Func<CodeInstruction, bool> predicate;
public PredicateMatcher(Func<CodeInstruction, bool> predicate)
{
this.predicate = predicate;
base..ctor();
}
public bool Matches(CodeInstruction instruction)
{
return predicate(instruction);
}
}
internal static class InstructionUtilities
{
public static CodeInstruction MakeLdarg(int index)
{
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
//IL_0081: Expected O, but got Unknown
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Expected O, but got Unknown
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Expected O, but got Unknown
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: Expected O, but got Unknown
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Expected O, but got Unknown
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: Expected O, but got Unknown
if (1 == 0)
{
}
CodeInstruction result = (CodeInstruction)((index >= 256) ? ((object)new CodeInstruction(OpCodes.Ldarg, (object)index)) : (index switch
{
0 => (object)new CodeInstruction(OpCodes.Ldarg_0, (object)null),
1 => (object)new CodeInstruction(OpCodes.Ldarg_1, (object)null),
2 => (object)new CodeInstruction(OpCodes.Ldarg_2, (object)null),
3 => (object)new CodeInstruction(OpCodes.Ldarg_3, (object)null),
_ => (object)new CodeInstruction(OpCodes.Ldarg_S, (object)index),
}));
if (1 == 0)
{
}
return result;
}
public static int PopCount(this CodeInstruction instruction)
{
if (instruction.opcode == OpCodes.Call || instruction.opcode == OpCodes.Callvirt)
{
MethodInfo methodInfo = (MethodInfo)instruction.operand;
int num = methodInfo.GetParameters().Length;
if (!methodInfo.IsStatic)
{
num++;
}
return num;
}
if (instruction.opcode == OpCodes.Ret)
{
return 1;
}
StackBehaviour stackBehaviourPop = instruction.opcode.StackBehaviourPop;
if (1 == 0)
{
}
int result = stackBehaviourPop switch
{
StackBehaviour.Pop0 => 0,
StackBehaviour.Pop1 => 1,
StackBehaviour.Pop1_pop1 => 2,
StackBehaviour.Popi => 1,
StackBehaviour.Popi_pop1 => 2,
StackBehaviour.Popi_popi => 2,
StackBehaviour.Popi_popi8 => 2,
StackBehaviour.Popi_popi_popi => 3,
StackBehaviour.Popi_popr4 => 2,
StackBehaviour.Popi_popr8 => 2,
StackBehaviour.Popref => 1,
StackBehaviour.Popref_pop1 => 2,
StackBehaviour.Popref_popi => 2,
StackBehaviour.Popref_popi_popi => 3,
StackBehaviour.Popref_popi_popi8 => 3,
StackBehaviour.Popref_popi_popr4 => 3,
StackBehaviour.Popref_popi_popr8 => 3,
StackBehaviour.Popref_popi_popref => 3,
StackBehaviour.Varpop => throw new NotImplementedException($"Variable pop on non-call instruction '{instruction}'"),
StackBehaviour.Popref_popi_pop1 => 3,
_ => throw new NotSupportedException($"StackBehaviourPop of {instruction.opcode.StackBehaviourPop} was not a pop for instruction '{instruction}'"),
};
if (1 == 0)
{
}
return result;
}
public static int PushCount(this CodeInstruction instruction)
{
if (instruction.opcode == OpCodes.Call || instruction.opcode == OpCodes.Callvirt)
{
MethodInfo methodInfo = (MethodInfo)instruction.operand;
if (methodInfo.ReturnType == typeof(void))
{
return 0;
}
return 1;
}
StackBehaviour stackBehaviourPush = instruction.opcode.StackBehaviourPush;
if (1 == 0)
{
}
int result = stackBehaviourPush switch
{
StackBehaviour.Push0 => 0,
StackBehaviour.Push1 => 1,
StackBehaviour.Push1_push1 => 2,
StackBehaviour.Pushi => 1,
StackBehaviour.Pushi8 => 1,
StackBehaviour.Pushr4 => 1,
StackBehaviour.Pushr8 => 1,
StackBehaviour.Pushref => 1,
StackBehaviour.Varpush => throw new NotImplementedException($"Variable push on non-call instruction '{instruction}'"),
_ => throw new NotSupportedException($"StackBehaviourPush of {instruction.opcode.StackBehaviourPush} was not a push for instruction '{instruction}'"),
};
if (1 == 0)
{
}
return result;
}
public static int? GetLdargIndex(this CodeInstruction instruction)
{
OpCode opcode = instruction.opcode;
if (opcode == OpCodes.Ldarg_0)
{
return 0;
}
if (opcode == OpCodes.Ldarg_1)
{
return 1;
}
if (opcode == OpCodes.Ldarg_2)
{
return 2;
}
if (opcode == OpCodes.Ldarg_3)
{
return 3;
}
if (opcode == OpCodes.Ldarg || opcode == OpCodes.Ldarg_S)
{
return instruction.operand as int?;
}
return null;
}
public static int? GetLdlocIndex(this CodeInstruction instruction)
{
OpCode opcode = instruction.opcode;
if (opcode == OpCodes.Ldloc_0)
{
return 0;
}
if (opcode == OpCodes.Ldloc_1)
{
return 1;
}
if (opcode == OpCodes.Ldloc_2)
{
return 2;
}
if (opcode == OpCodes.Ldloc_3)
{
return 3;
}
if (opcode == OpCodes.Ldloc || opcode == OpCodes.Ldloc_S)
{
return (instruction.operand as LocalBuilder)?.LocalIndex;
}
return null;
}
public static int? GetStlocIndex(this CodeInstruction instruction)
{
OpCode opcode = instruction.opcode;
if (opcode == OpCodes.Stloc_0)
{
return 0;
}
if (opcode == OpCodes.Stloc_1)
{
return 1;
}
if (opcode == OpCodes.Stloc_2)
{
return 2;
}
if (opcode == OpCodes.Stloc_3)
{
return 3;
}
if (opcode == OpCodes.Stloc || opcode == OpCodes.Stloc_S)
{
return (instruction.operand as LocalBuilder)?.LocalIndex;
}
return null;
}
public static CodeInstruction LdlocToStloc(this CodeInstruction instruction)
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Expected O, but got Unknown
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Expected O, but got Unknown
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Expected O, but got Unknown
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
//IL_0081: Expected O, but got Unknown
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
//IL_00b5: Expected O, but got Unknown
OpCode opcode = instruction.opcode;
if (opcode == OpCodes.Ldloc_0)
{
return new CodeInstruction(OpCodes.Stloc_0, (object)null);
}
if (opcode == OpCodes.Ldloc_1)
{
return new CodeInstruction(OpCodes.Stloc_1, (object)null);
}
if (opcode == OpCodes.Ldloc_2)
{
return new CodeInstruction(OpCodes.Stloc_2, (object)null);
}
if (opcode == OpCodes.Ldloc_3)
{
return new CodeInstruction(OpCodes.Stloc_3, (object)null);
}
if (opcode == OpCodes.Ldloc || opcode == OpCodes.Ldloc_S)
{
return new CodeInstruction(OpCodes.Stloc, instruction.operand);
}
return null;
}
public static CodeInstruction StlocToLdloc(this CodeInstruction instruction)
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Expected O, but got Unknown
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Expected O, but got Unknown
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Expected O, but got Unknown
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
//IL_0081: Expected O, but got Unknown
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
//IL_00b5: Expected O, but got Unknown
OpCode opcode = instruction.opcode;
if (opcode == OpCodes.Stloc_0)
{
return new CodeInstruction(OpCodes.Ldloc_0, (object)null);
}
if (opcode == OpCodes.Stloc_1)
{
return new CodeInstruction(OpCodes.Ldloc_1, (object)null);
}
if (opcode == OpCodes.Stloc_2)
{
return new CodeInstruction(OpCodes.Ldloc_2, (object)null);
}
if (opcode == OpCodes.Stloc_3)
{
return new CodeInstruction(OpCodes.Ldloc_3, (object)null);
}
if (opcode == OpCodes.Stloc || opcode == OpCodes.Stloc_S)
{
return new CodeInstruction(OpCodes.Ldloc, instruction.operand);
}
return null;
}
public static int? GetLdcI32(this CodeInstruction instruction)
{
OpCode opcode = instruction.opcode;
if (opcode == OpCodes.Ldc_I4_M1)
{
return -1;
}
if (opcode == OpCodes.Ldc_I4_0)
{
return 0;
}
if (opcode == OpCodes.Ldc_I4_1)
{
return 1;
}
if (opcode == OpCodes.Ldc_I4_2)
{
return 2;
}
if (opcode == OpCodes.Ldc_I4_3)
{
return 3;
}
if (opcode == OpCodes.Ldc_I4_4)
{
return 4;
}
if (opcode == OpCodes.Ldc_I4_5)
{
return 5;
}
if (opcode == OpCodes.Ldc_I4_6)
{
return 6;
}
if (opcode == OpCodes.Ldc_I4_7)
{
return 7;
}
if (opcode == OpCodes.Ldc_I4_8)
{
return 8;
}
if (opcode == OpCodes.Ldc_I4_S)
{
return instruction.operand as sbyte?;
}
if (opcode == OpCodes.Ldc_I4)
{
return instruction.operand as int?;
}
return null;
}
}
}
namespace Scoops
{
public class Config
{
public static ConfigEntry<bool> unloadUnused;
public static ConfigEntry<bool> fixCameraSettings;
public static ConfigEntry<bool> applyShipCameraQualityOverrides;
public static ConfigEntry<bool> applySecurityCameraQualityOverrides;
public static ConfigEntry<bool> applyMapCameraQualityOverrides;
public static ConfigEntry<bool> cameraRenderTransparent;
public static ConfigEntry<bool> patchCameraScript;
public static ConfigEntry<float> securityCameraCullDistance;
public static ConfigEntry<int> mapCameraFramerate;
public static ConfigEntry<int> securityCameraFramerate;
public static ConfigEntry<int> shipCameraFramerate;
public static ConfigEntry<int> vSyncCount;
public static ConfigEntry<bool> qualityOverrides;
public static ConfigEntry<int> decalDrawDist;
public static ConfigEntry<int> decalAtlasSize;
public static ConfigEntry<string> reflectionAtlasSize;
public static ConfigEntry<int> maxCubeReflectionProbes;
public static ConfigEntry<int> maxPlanarReflectionProbes;
public static ConfigEntry<int> shadowsMaxResolution;
public static ConfigEntry<int> shadowsAtlasSize;
public Config(ConfigFile cfg)
{
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
//IL_0100: Expected O, but got Unknown
//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
//IL_01bc: Expected O, but got Unknown
//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
//IL_0200: Expected O, but got Unknown
//IL_0262: Unknown result type (might be due to invalid IL or missing references)
//IL_026c: Expected O, but got Unknown
//IL_0290: Unknown result type (might be due to invalid IL or missing references)
//IL_029a: Expected O, but got Unknown
//IL_02bd: Unknown result type (might be due to invalid IL or missing references)
//IL_02c7: Expected O, but got Unknown
//IL_02fc: Unknown result type (might be due to invalid IL or missing references)
//IL_0306: Expected O, but got Unknown
//IL_033b: Unknown result type (might be due to invalid IL or missing references)
//IL_0345: Expected O, but got Unknown
cfg.SaveOnConfigSet = false;
unloadUnused = cfg.Bind<bool>("Cleanup", "unloadUnused", true, "Should Sponge call UnloadUnusedAssets each day?");
fixCameraSettings = cfg.Bind<bool>("Cameras", "fixCameraSettings", true, "Should Sponge change the settings for the ship cameras and radar cam to improve performance?");
applyShipCameraQualityOverrides = cfg.Bind<bool>("Cameras", "applyShipCameraQualityOverrides", true, "Should Sponge disable extra HDRP rendering features on the Ship camera? (Requires fixCameraSettings = true)");
applySecurityCameraQualityOverrides = cfg.Bind<bool>("Cameras", "applySecurityCameraQualityOverrides", true, "Should Sponge disable extra HDRP rendering features on the Security camera? (Requires fixCameraSettings = true)");
applyMapCameraQualityOverrides = cfg.Bind<bool>("Cameras", "applyMapCameraQualityOverrides", true, "Should Sponge disable extra HDRP rendering features on the Map camera? (Requires fixCameraSettings = true)");
cameraRenderTransparent = cfg.Bind<bool>("Cameras", "cameraRenderTransparent", true, "Should the Ship and Security camera render transparent objects? (Requires applyShipCameraQualityOverrides or applySecurityCameraQualityOverrides)");
patchCameraScript = cfg.Bind<bool>("Cameras", "patchCameraScript", true, "Should Sponge replace the base Lethal Company ManualCameraRenderer.MeetsCameraEnabledConditions function with one that more reliably disables ship cameras when they're not in view?");
securityCameraCullDistance = cfg.Bind<float>("Cameras", "securityCameraCullDistance", 20f, new ConfigDescription("What should the culling distance be for the ship security camera? You might want to increase this if you're using a mod to re-add planets in orbit. (LC default is 150)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(15f, 150f), Array.Empty<object>()));
securityCameraFramerate = cfg.Bind<int>("Cameras", "securityCameraFramerate", 15, "What framerate should the exterior cam run at? 0 = not limited. (Requires fixCameraSettings = true)");
shipCameraFramerate = cfg.Bind<int>("Cameras", "shipCameraFramerate", 15, "What framerate should the interior cam run at? 0 = not limited. (Requires fixCameraSettings = true)");
mapCameraFramerate = cfg.Bind<int>("Cameras", "mapCameraFramerate", 20, "What framerate should the radar map camera run at? 0 = not limited. (Requires fixCameraSettings = true)");
vSyncCount = cfg.Bind<int>("Rendering", "vSyncCount", 1, "When the option \"Use monitor (V-Sync)\" is selected in Options, what VSyncCount should be used? (LC default is 1)");
qualityOverrides = cfg.Bind<bool>("Graphics Quality", "qualityOverrides", true, "Should Sponge change the default quality settings? This must be on for any of the other Graphics Quality settings to take effect.");
decalDrawDist = cfg.Bind<int>("Graphics Quality", "decalDrawDist", 100, new ConfigDescription("What should the maximum distance be for drawing decals like blood splatters? (LC default is 1000)", (AcceptableValueBase)(object)new AcceptableValueRange<int>(50, 1000), Array.Empty<object>()));
decalAtlasSize = cfg.Bind<int>("Graphics Quality", "decalAtlasSize", 2048, new ConfigDescription("What should the texture size be for the the Decal Atlas? (squared) (LC default is 4096)", (AcceptableValueBase)(object)new AcceptableValueList<int>(new int[2] { 2048, 4096 }), Array.Empty<object>()));
reflectionAtlasSize = cfg.Bind<string>("Graphics Quality", "reflectionAtlasSize", "Resolution1024x1024", new ConfigDescription("What should the texture size be for the the Reflection Atlas? (LC default is 16384x8192)", (AcceptableValueBase)(object)new AcceptableValueList<string>(new string[7] { "Resolution512x512", "Resolution1024x512", "Resolution1024x1024", "Resolution2048x1024", "Resolution2048x2048", "Resolution4096x2048", "Resolution16384x8192" }), Array.Empty<object>()));
maxCubeReflectionProbes = cfg.Bind<int>("Graphics Quality", "maxCubeReflectionProbes", 12, new ConfigDescription("How many Cube Reflection Probes should be able to be on screen at once? (LC default is 48)", (AcceptableValueBase)(object)new AcceptableValueRange<int>(6, 48), Array.Empty<object>()));
maxPlanarReflectionProbes = cfg.Bind<int>("Graphics Quality", "maxPlanarReflectionProbes", 8, new ConfigDescription("How many Cube Reflection Probes should be able to be on screen at once? (LC default is 16)", (AcceptableValueBase)(object)new AcceptableValueRange<int>(4, 16), Array.Empty<object>()));
shadowsMaxResolution = cfg.Bind<int>("Graphics Quality", "shadowsMaxResolution", 256, new ConfigDescription("What should the maximum resolution be for Shadow Maps? (LC default is 2048)", (AcceptableValueBase)(object)new AcceptableValueList<int>(new int[6] { 64, 128, 256, 512, 1024, 2048 }), Array.Empty<object>()));
shadowsAtlasSize = cfg.Bind<int>("Graphics Quality", "shadowsAtlasSize", 2048, new ConfigDescription("What should the resolution be for the Shadow Map Atlas? (LC default is 4096)", (AcceptableValueBase)(object)new AcceptableValueList<int>(new int[3] { 1024, 2048, 4096 }), Array.Empty<object>()));
ClearOrphanedEntries(cfg);
cfg.Save();
cfg.SaveOnConfigSet = true;
}
private static void ClearOrphanedEntries(ConfigFile cfg)
{
PropertyInfo propertyInfo = AccessTools.Property(typeof(ConfigFile), "OrphanedEntries");
Dictionary<ConfigDefinition, string> dictionary = (Dictionary<ConfigDefinition, string>)propertyInfo.GetValue(cfg);
dictionary.Clear();
}
}
public static class PluginInformation
{
public const string PLUGIN_GUID = "LethalSpongeLegacy";
public const string PLUGIN_NAME = "LethalSpongeLegacy";
public const string PLUGIN_VERSION = "1.0.0";
}
[BepInPlugin("LethalSpongeLegacy", "LethalSpongeLegacy", "1.0.0")]
public class Plugin : BaseUnityPlugin
{
public static AssetBundle SpongeAssets;
private readonly Harmony _harmony = new Harmony("LethalSpongeLegacy");
public static Plugin Instance { get; set; }
public static Config SpongeConfig { get; internal set; }
public static ManualLogSource Log => ((BaseUnityPlugin)Instance).Logger;
public Plugin()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Expected O, but got Unknown
Instance = this;
}
private void Awake()
{
Log.LogInfo((object)"Loading LethalSpongeLegacy Version 1.0.0");
string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location);
string text = Path.Combine(directoryName, "spongeassets");
SpongeAssets = AssetBundle.LoadFromFile(text);
SpongeConfig = new Config(((BaseUnityPlugin)this).Config);
Log.LogInfo((object)"Applying base patches...");
ApplyPluginPatch();
Log.LogInfo((object)"Base patches applied");
AlterQualitySettings();
}
private void ApplyPluginPatch()
{
_harmony.PatchAll(typeof(StartOfRoundSpongePatch));
if (Config.unloadUnused.Value)
{
_harmony.PatchAll(typeof(MainMenuSpongePatch));
}
if (Config.patchCameraScript.Value)
{
_harmony.PatchAll(typeof(ManualCameraRendererSpongePatch));
}
if (Config.vSyncCount.Value != 1)
{
_harmony.PatchAll(typeof(IngamePlayerSettingsSpongePatch));
}
}
private void AlterQualitySettings()
{
//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_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
//IL_0217: 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_0227: Unknown result type (might be due to invalid IL or missing references)
if (Config.qualityOverrides.Value)
{
RenderPipelineSettings currentPlatformRenderPipelineSettings = ((HDRenderPipelineAsset)GraphicsSettings.currentRenderPipeline).currentPlatformRenderPipelineSettings;
if (Config.decalDrawDist.Value != 1000)
{
currentPlatformRenderPipelineSettings.decalSettings.drawDistance = Config.decalDrawDist.Value;
}
if (Config.decalAtlasSize.Value != 4096)
{
currentPlatformRenderPipelineSettings.decalSettings.atlasHeight = Config.decalAtlasSize.Value;
currentPlatformRenderPipelineSettings.decalSettings.atlasWidth = Config.decalAtlasSize.Value;
}
if (Config.reflectionAtlasSize.Value != "Resolution16384x8192")
{
currentPlatformRenderPipelineSettings.lightLoopSettings.reflectionProbeTexCacheSize = Enum.Parse<ReflectionProbeTextureCacheResolution>(Config.reflectionAtlasSize.Value);
}
if (Config.maxCubeReflectionProbes.Value != 48)
{
currentPlatformRenderPipelineSettings.lightLoopSettings.maxCubeReflectionOnScreen = Config.maxCubeReflectionProbes.Value;
}
if (Config.maxPlanarReflectionProbes.Value != 16)
{
currentPlatformRenderPipelineSettings.lightLoopSettings.maxPlanarReflectionOnScreen = Config.maxPlanarReflectionProbes.Value;
}
if (Config.shadowsMaxResolution.Value != 2048)
{
currentPlatformRenderPipelineSettings.hdShadowInitParams.maxPunctualShadowMapResolution = Config.shadowsMaxResolution.Value;
currentPlatformRenderPipelineSettings.hdShadowInitParams.maxDirectionalShadowMapResolution = Config.shadowsMaxResolution.Value;
currentPlatformRenderPipelineSettings.hdShadowInitParams.maxAreaShadowMapResolution = Config.shadowsMaxResolution.Value;
}
if (Config.shadowsAtlasSize.Value != 4096)
{
currentPlatformRenderPipelineSettings.hdShadowInitParams.punctualLightShadowAtlas.shadowAtlasResolution = Config.shadowsAtlasSize.Value;
currentPlatformRenderPipelineSettings.hdShadowInitParams.cachedPunctualLightShadowAtlas = Config.shadowsAtlasSize.Value / 2;
currentPlatformRenderPipelineSettings.hdShadowInitParams.areaLightShadowAtlas.shadowAtlasResolution = Config.shadowsAtlasSize.Value;
currentPlatformRenderPipelineSettings.hdShadowInitParams.cachedAreaLightShadowAtlas = Config.shadowsAtlasSize.Value / 2;
}
((HDRenderPipelineAsset)GraphicsSettings.currentRenderPipeline).m_RenderPipelineSettings = currentPlatformRenderPipelineSettings;
((RenderPipelineAsset)(HDRenderPipelineAsset)GraphicsSettings.currentRenderPipeline).OnValidate();
}
}
}
public static class PluginInfo
{
public const string PLUGIN_GUID = "LethalSpongeLegacy";
public const string PLUGIN_NAME = "LethalSpongeLegacy";
public const string PLUGIN_VERSION = "1.0.0";
}
}
namespace Scoops.service
{
public static class CameraService
{
public static Camera MapCamera;
public static Camera ShipCamera;
public static Camera SecurityCamera;
public static GameObject MonitorWall;
public static GameObject ShipInside;
public static MeshRenderer DoorMonitor;
public static Terminal MainTerminal;
public static GameObject oldVolume;
public static GameObject newVolume;
public static CustomPass oldPass;
public static CustomPass newPass;
public static bool Init()
{
Plugin.Log.LogMessage((object)"Finding Ship cameras.");
bool result = true;
Transform val = ((Component)StartOfRound.Instance).transform.parent.Find("ItemSystems/MapCamera");
if ((Object)(object)val != (Object)null)
{
MapCamera = ((Component)val).GetComponent<Camera>();
}
else
{
Plugin.Log.LogError((object)"Sponge could not find MapCamera. Camera fixes may not function.");
result = false;
}
Transform val2 = StartOfRound.Instance.elevatorTransform.Find("Cameras/ShipCamera");
if ((Object)(object)val2 != (Object)null)
{
ShipCamera = ((Component)val2).GetComponent<Camera>();
}
else
{
Plugin.Log.LogError((object)"Sponge could not find ShipCamera. Camera fixes may not function.");
result = false;
}
Transform val3 = StartOfRound.Instance.elevatorTransform.Find("Cameras/FrontDoorSecurityCam/SecurityCamera");
if ((Object)(object)val3 != (Object)null)
{
SecurityCamera = ((Component)val3).GetComponent<Camera>();
}
else
{
Plugin.Log.LogError((object)"Sponge could not find SecurityCamera. Camera fixes may not function.");
result = false;
}
Transform val4 = StartOfRound.Instance.elevatorTransform.Find("ShipModels2b/MonitorWall");
if ((Object)(object)val4 != (Object)null)
{
MonitorWall = ((Component)val4).gameObject;
}
else
{
Plugin.Log.LogError((object)"Sponge could not find MonitorWall. Camera fixes may not function.");
result = false;
}
Transform val5 = StartOfRound.Instance.elevatorTransform.Find("Terminal/TerminalTrigger/TerminalScript");
if ((Object)(object)val5 != (Object)null)
{
MainTerminal = ((Component)val5).GetComponent<Terminal>();
}
Transform val6 = StartOfRound.Instance.elevatorTransform.Find("ShipModels2b/MonitorWall/SingleScreen");
if ((Object)(object)val6 != (Object)null)
{
DoorMonitor = ((Component)val6).GetComponent<MeshRenderer>();
}
return result;
}
public static void DisablePosterization()
{
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Expected O, but got Unknown
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
oldVolume = GameObject.Find("CustomPass");
newVolume = new GameObject("SpongeCustomPass");
newVolume.transform.parent = oldVolume.transform.parent;
newVolume.AddComponent<CustomPassVolume>();
newVolume.GetComponent<CustomPassVolume>().injectionPoint = (CustomPassInjectionPoint)1;
newPass = (CustomPass)(object)new SpongeCustomPass();
newVolume.GetComponent<CustomPassVolume>().customPasses.Add(newPass);
foreach (CustomPass customPass in oldVolume.GetComponent<CustomPassVolume>().customPasses)
{
if (customPass.name == "FS")
{
oldPass = customPass;
oldPass.enabled = false;
break;
}
}
}
public static bool TogglePasses()
{
if (newPass != null && oldPass != null)
{
oldPass.enabled = !oldPass.enabled;
newPass.enabled = !oldPass.enabled;
Plugin.Log.LogMessage((object)((newPass.enabled ? "Enabling" : "Disabling") + " Sponge custom shader."));
return newPass.enabled;
}
return false;
}
public static void ApplyCameraFixes()
{
if (Config.applyShipCameraQualityOverrides.Value)
{
SetOverrides(ShipCamera);
}
if (Config.applySecurityCameraQualityOverrides.Value)
{
SetOverrides(SecurityCamera);
}
if (Config.applyMapCameraQualityOverrides.Value)
{
SetOverrides(MapCamera, mapCamera: true);
}
ShipCamera.farClipPlane = 13f;
SecurityCamera.farClipPlane = Config.securityCameraCullDistance.Value;
if (Config.shipCameraFramerate.Value != 0)
{
((Component)ShipCamera).GetComponent<ManualCameraRenderer>().renderAtLowerFramerate = true;
((Component)ShipCamera).GetComponent<ManualCameraRenderer>().fps = Config.shipCameraFramerate.Value;
((Component)ShipCamera).GetComponent<HDAdditionalCameraData>().hasPersistentHistory = true;
}
if (Config.securityCameraFramerate.Value != 0)
{
((Component)SecurityCamera).GetComponent<ManualCameraRenderer>().renderAtLowerFramerate = true;
((Component)SecurityCamera).GetComponent<ManualCameraRenderer>().fps = Config.securityCameraFramerate.Value;
((Component)SecurityCamera).GetComponent<HDAdditionalCameraData>().hasPersistentHistory = true;
}
if (Config.mapCameraFramerate.Value != 0)
{
((Component)MonitorWall.transform.Find("Cube.001/CameraMonitorScript")).GetComponent<ManualCameraRenderer>().renderAtLowerFramerate = true;
((Component)MonitorWall.transform.Find("Cube.001/CameraMonitorScript")).GetComponent<ManualCameraRenderer>().fps = Config.mapCameraFramerate.Value;
((Component)MapCamera).GetComponent<HDAdditionalCameraData>().hasPersistentHistory = true;
}
Plugin.Log.LogMessage((object)"Ship cameras patched.");
}
private static void SetOverrides(Camera camera, bool mapCamera = false)
{
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
HDAdditionalCameraData component = ((Component)camera).GetComponent<HDAdditionalCameraData>();
component.customRenderingSettings = true;
((BitArray128)(ref component.renderingPathCustomFrameSettingsOverrideMask.mask))[4u] = true;
component.renderingPathCustomFrameSettings.msaaMode = (MSAAMode)1;
if (!mapCamera)
{
((BitArray128)(ref component.renderingPathCustomFrameSettingsOverrideMask.mask))[62u] = true;
((BitArray128)(ref component.renderingPathCustomFrameSettingsOverrideMask.mask))[63u] = true;
component.renderingPathCustomFrameSettings.maximumLODLevelMode = (MaximumLODLevelMode)2;
component.renderingPathCustomFrameSettings.maximumLODLevel = 2;
}
((BitArray128)(ref component.renderingPathCustomFrameSettingsOverrideMask.mask))[66u] = true;
component.renderingPathCustomFrameSettings.materialQuality = (MaterialQuality)1;
if (!mapCamera || !Config.cameraRenderTransparent.Value)
{
component.DisableHDField((FrameSettingsField)3);
}
component.DisableHDField((FrameSettingsField)12);
component.DisableHDField((FrameSettingsField)8);
component.DisableHDField((FrameSettingsField)9);
component.DisableHDField((FrameSettingsField)92);
component.DisableHDField((FrameSettingsField)6);
component.DisableHDField((FrameSettingsField)10);
component.DisableHDField((FrameSettingsField)13);
component.DisableHDField((FrameSettingsField)14);
component.DisableHDField((FrameSettingsField)39);
component.DisableHDField((FrameSettingsField)80);
component.DisableHDField((FrameSettingsField)81);
component.DisableHDField((FrameSettingsField)82);
component.DisableHDField((FrameSettingsField)83);
component.DisableHDField((FrameSettingsField)84);
component.DisableHDField((FrameSettingsField)85);
component.DisableHDField((FrameSettingsField)86);
component.DisableHDField((FrameSettingsField)87);
component.DisableHDField((FrameSettingsField)89);
component.DisableHDField((FrameSettingsField)90);
component.DisableHDField((FrameSettingsField)91);
component.DisableHDField((FrameSettingsField)93);
component.DisableHDField((FrameSettingsField)97);
component.DisableHDField((FrameSettingsField)17);
component.DisableHDField((FrameSettingsField)68);
component.DisableHDField((FrameSettingsField)99);
component.DisableHDField((FrameSettingsField)20);
component.DisableHDField((FrameSettingsField)21);
component.DisableHDField((FrameSettingsField)127);
component.DisableHDField((FrameSettingsField)34);
component.DisableHDField((FrameSettingsField)23);
component.DisableHDField((FrameSettingsField)95);
component.DisableHDField((FrameSettingsField)24);
component.DisableHDField((FrameSettingsField)26);
component.DisableHDField((FrameSettingsField)27);
component.DisableHDField((FrameSettingsField)28);
component.DisableHDField((FrameSettingsField)29);
component.DisableHDField((FrameSettingsField)33);
component.DisableHDField((FrameSettingsField)35);
component.DisableHDField((FrameSettingsField)37);
component.DisableHDField((FrameSettingsField)46);
component.DisableHDField((FrameSettingsField)79);
if (mapCamera)
{
component.DisableHDField((FrameSettingsField)38);
}
}
private static void DisableHDField(this HDAdditionalCameraData data, FrameSettingsField field)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Expected I4, but got Unknown
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
((BitArray128)(ref data.renderingPathCustomFrameSettingsOverrideMask.mask))[(uint)(int)field] = true;
((FrameSettings)(ref data.renderingPathCustomFrameSettings)).SetEnabled(field, false);
}
}
}
namespace Scoops.rendering
{
internal class SpongeCustomPass : CustomPass
{
public static Material posterizationMaterial;
public static Shader posterizationShader;
public static RTHandle posterizationRT;
public override void Setup(ScriptableRenderContext renderContext, CommandBuffer cmd)
{
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Expected O, but got Unknown
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
posterizationShader = (Shader)Plugin.SpongeAssets.LoadAsset("SpongePosterizeNew");
posterizationRT = RTHandles.Alloc(Vector2.one, TextureXR.slices, (DepthBits)0, (GraphicsFormat)74, (FilterMode)0, (TextureWrapMode)0, TextureXR.dimension, false, false, true, false, 1, 0f, (MSAASamples)1, false, true, (RenderTextureMemoryless)0, (VRTextureUsage)0, "Posterization Buffer");
posterizationMaterial = CoreUtils.CreateEngineMaterial(posterizationShader);
}
public override void Execute(CustomPassContext ctx)
{
//IL_0001: 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_002d: 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_0059: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: 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_00b0: Unknown result type (might be due to invalid IL or missing references)
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
//IL_00d6: 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_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
ctx.propertyBlock.SetFloat("_OutlineThickness", 0.001f);
ctx.propertyBlock.SetFloat("_DepthThreshold", 0.4f);
ctx.propertyBlock.SetFloat("_DepthCurve", 0.4f);
ctx.propertyBlock.SetFloat("_DepthStrength", 6f);
ctx.propertyBlock.SetFloat("_ColorThreshold", 0.47f);
ctx.propertyBlock.SetFloat("_ColorCurve", 2.94f);
ctx.propertyBlock.SetFloat("_ColorStrength", 0.65f);
CoreUtils.SetRenderTarget(ctx.cmd, posterizationRT, (ClearFlag)7, 0, (CubemapFace)(-1), -1);
CoreUtils.DrawFullScreen(ctx.cmd, posterizationMaterial, ctx.propertyBlock, posterizationMaterial.FindPass("ReadColor"));
ctx.propertyBlock.SetTexture("_PosterizationBuffer", RTHandle.op_Implicit(posterizationRT));
CoreUtils.SetRenderTarget(ctx.cmd, ctx.cameraColorBuffer, (ClearFlag)0, 0, (CubemapFace)(-1), -1);
CoreUtils.DrawFullScreen(ctx.cmd, posterizationMaterial, ctx.propertyBlock, posterizationMaterial.FindPass("WriteColor"));
}
public override void Cleanup()
{
CoreUtils.Destroy((Object)(object)posterizationMaterial);
posterizationRT.Release();
}
}
}
namespace Scoops.patches
{
[HarmonyPatch(typeof(IngamePlayerSettings))]
public class IngamePlayerSettingsSpongePatch
{
[HarmonyPatch("SetFramerateCap")]
[HarmonyPostfix]
public static void IngamePlayerSettings_SetFramerateCap(int value)
{
if (value == 0)
{
QualitySettings.vSyncCount = Config.vSyncCount.Value;
}
}
}
public class MainMenuSpongePatch
{
[HarmonyPatch(typeof(MenuManager), "Start")]
[HarmonyPostfix]
public static void Start(ref MenuManager __instance)
{
if (!__instance.isInitScene)
{
Plugin.Log.LogMessage((object)"Calling initial Resources.UnloadUnusedAssets().");
Resources.UnloadUnusedAssets();
}
}
}
[HarmonyPatch(typeof(ManualCameraRenderer))]
public class ManualCameraRendererSpongePatch
{
[HarmonyPatch("Update")]
[HarmonyTranspiler]
private static IEnumerable<CodeInstruction> ManualCameraRenderer_Update_Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Expected O, but got Unknown
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_00c4: Expected O, but got Unknown
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
//IL_00d2: Expected O, but got Unknown
ILInjector iLInjector = new ILInjector(instructions).Find(ILMatcher.Ldarg(0), ILMatcher.Ldfld(AccessTools.Field(typeof(ManualCameraRenderer), "renderAtLowerFramerate")), ILMatcher.Opcode(OpCodes.Brfalse));
if (!iLInjector.IsValid)
{
Plugin.Log.LogError((object)"Failed to find renderAtLowerFramerate branch in ManualCameraRenderer.Update");
return instructions;
}
Label label = (Label)iLInjector.LastMatchedInstruction.operand;
return iLInjector.GoToLastMatchedInstruction().FindLabel(label).RemoveLastMatch()
.InsertInPlace(new CodeInstruction(OpCodes.Ldarg_0, (object)null), new CodeInstruction(OpCodes.Call, (object)typeof(ManualCameraRendererSpongePatch).GetMethod("ApplyFramerateCap")), new CodeInstruction(OpCodes.Ret, (object)null))
.ReleaseInstructions();
}
[HarmonyPatch("Update")]
[HarmonyPostfix]
private static void ManualCameraRenderer_Update(ref ManualCameraRenderer __instance)
{
if (!((Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)null) && !((Object)(object)NetworkManager.Singleton == (Object)null) && __instance.overrideCameraForOtherUse)
{
PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
Camera camera = (localPlayerController.isPlayerDead ? StartOfRound.Instance.spectateCamera : localPlayerController.gameplayCamera);
if ((Object)(object)__instance.mesh != (Object)null && !MeshVisible(camera, __instance.mesh))
{
((Behaviour)__instance.cam).enabled = false;
}
else if (__instance.renderAtLowerFramerate)
{
ApplyFramerateCap(__instance);
}
else
{
((Behaviour)__instance.cam).enabled = true;
}
}
}
[HarmonyPatch("MeetsCameraEnabledConditions")]
[HarmonyAfter(new string[] { "Zaggy1024.OpenBodyCams" })]
[HarmonyPostfix]
private static void ManualCameraRenderer_MeetsCameraEnabledConditions(ref ManualCameraRenderer __instance, ref bool __result, PlayerControllerB player)
{
Camera camera = (player.isPlayerDead ? StartOfRound.Instance.spectateCamera : player.gameplayCamera);
if ((Object)(object)__instance.mesh != (Object)null && !MeshVisible(camera, __instance.mesh))
{
__result = false;
if ((Object)(object)__instance.cam == (Object)(object)CameraService.SecurityCamera && (Object)(object)CameraService.DoorMonitor != (Object)null && MeshVisible(camera, CameraService.DoorMonitor))
{
__result = true;
}
}
if ((Object)(object)__instance == (Object)(object)StartOfRound.Instance.mapScreen && !__result && !((Object)(object)CameraService.MainTerminal == (Object)null) && (Object)(object)CameraService.MainTerminal.displayingPersistentImage == (Object)(object)__instance.mapCamera.activeTexture && ((Behaviour)CameraService.MainTerminal.terminalUIScreen).isActiveAndEnabled)
{
__result = true;
}
}
private static bool MeshVisible(Camera camera, MeshRenderer mesh)
{
//IL_0036: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
Plane[] array = GeometryUtility.CalculateFrustumPlanes(camera);
if (Object.op_Implicit((Object)(object)((Component)mesh).GetComponent<Collider>()))
{
return GeometryUtility.TestPlanesAABB(array, ((Component)mesh).GetComponent<Collider>().bounds);
}
if (Object.op_Implicit((Object)(object)((Component)mesh).GetComponent<Renderer>()))
{
return GeometryUtility.TestPlanesAABB(array, ((Component)mesh).GetComponent<Renderer>().bounds);
}
return !array.Any((Plane plane) => ((Plane)(ref plane)).GetDistanceToPoint(((Component)mesh).transform.position) < 0f);
}
public static void ApplyFramerateCap(ManualCameraRenderer manualCameraRenderer)
{
((Behaviour)manualCameraRenderer.cam).enabled = false;
manualCameraRenderer.elapsed += Time.deltaTime;
if (manualCameraRenderer.elapsed > 1f / manualCameraRenderer.fps)
{
manualCameraRenderer.elapsed = 0f;
((Behaviour)manualCameraRenderer.cam).enabled = true;
}
}
}
[HarmonyPatch(typeof(StartOfRound))]
public class StartOfRoundSpongePatch
{
[HarmonyPatch("Start")]
[HarmonyPostfix]
private static void StartOfRound_Start(ref StartOfRound __instance)
{
if (Config.fixCameraSettings.Value && CameraService.Init())
{
CameraService.ApplyCameraFixes();
}
CameraService.DisablePosterization();
}
[HarmonyPatch("PassTimeToNextDay")]
[HarmonyPostfix]
private static void StartOfRound_PassTimeToNextDay(ref StartOfRound __instance)
{
if (Config.unloadUnused.Value)
{
Plugin.Log.LogMessage((object)"Calling Resources.UnloadUnusedAssets().");
Resources.UnloadUnusedAssets();
}
}
}
}
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
internal sealed class IgnoresAccessChecksToAttribute : Attribute
{
public IgnoresAccessChecksToAttribute(string assemblyName)
{
}
}
}