using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using IL;
using LethalConfig;
using LethalConfig.ConfigItems;
using LethalConfig.ConfigItems.Options;
using Microsoft.CodeAnalysis;
using ModelReplacement;
using ModelReplacement.AvatarBodyUpdater;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Rendering;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("Rumi")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+fdc44488b65e9a96c8ffb8ef5e420bec3c999f97")]
[assembly: AssemblyProduct("CustomShovel")]
[assembly: AssemblyTitle("CustomShovel")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
}
namespace Rumi.CustomShovel
{
[BepInPlugin("Rumi.CustomShovel", "CustomShovel", "1.0.1")]
public class CustomShovel : BaseUnityPlugin
{
public const string modGuid = "Rumi.CustomShovel";
public const string modName = "CustomShovel";
public const string modVersion = "1.0.1";
private static Assembly? _currentAssembly;
private static string? _assemblyName;
private static Transform? _emptyTransform;
private static Material? _coloredMaterial;
public static Assembly currentAssembly => _currentAssembly ?? (_currentAssembly = Assembly.GetExecutingAssembly());
public static string assemblyName => _assemblyName ?? (_assemblyName = currentAssembly.FullName.Split(',')[0]);
public static ManualLogSource? logger { get; private set; }
public static CustomShovelConfig? config { get; private set; }
public static Harmony harmony { get; } = new Harmony("Rumi.CustomShovel");
public static Transform emptyTransform
{
get
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)_emptyTransform == (Object)null)
{
_emptyTransform = new GameObject("Easy Shovel Empty Transform").transform;
Object.DontDestroyOnLoad((Object)(object)_emptyTransform);
}
return _emptyTransform;
}
}
public static Material coloredMaterial
{
get
{
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Expected O, but got Unknown
if ((Object)(object)_coloredMaterial == (Object)null)
{
_coloredMaterial = new Material(Shader.Find("Hidden/Internal-Colored"));
((Object)_coloredMaterial).hideFlags = (HideFlags)61;
_coloredMaterial.SetInt("_SrcBlend", 5);
_coloredMaterial.SetInt("_DstBlend", 10);
_coloredMaterial.SetInt("_Cull", 0);
_coloredMaterial.SetInt("_ZWrite", 0);
}
return _coloredMaterial;
}
}
private void Awake()
{
logger = ((BaseUnityPlugin)this).Logger;
_ = emptyTransform;
ManualLogSource? obj = logger;
if (obj != null)
{
obj.LogInfo((object)"Start loading plugin...");
}
ManualLogSource? obj2 = logger;
if (obj2 != null)
{
obj2.LogInfo((object)"Config Loading...");
}
try
{
config = new CustomShovelConfig(((BaseUnityPlugin)this).Config);
}
catch (Exception ex)
{
config = null;
ManualLogSource? obj3 = logger;
if (obj3 != null)
{
obj3.LogError((object)ex);
}
ManualLogSource? obj4 = logger;
if (obj4 != null)
{
obj4.LogWarning((object)"Failed to load config file\nSettings will be loaded with defaults!");
}
}
ManualLogSource? obj5 = logger;
if (obj5 != null)
{
obj5.LogInfo((object)"HitShovel IL Patch...");
}
CustomShovelPatches.Init();
ManualLogSource? obj6 = logger;
if (obj6 != null)
{
obj6.LogInfo((object)"PlayerControllerB And Camera Patch...");
}
harmony.PatchAll(typeof(CustomShovelDrawHitbox));
CustomShovelDrawHitbox.Init();
ManualLogSource? obj7 = logger;
if (obj7 != null)
{
obj7.LogInfo((object)"ModelReplacementAPI And PlayerControllerB Patch...");
}
try
{
harmony.PatchAll(typeof(CustomShovelSkinFix));
}
catch (TypeLoadException ex2)
{
ManualLogSource? obj8 = logger;
if (obj8 != null)
{
obj8.LogError((object)ex2);
}
ManualLogSource? obj9 = logger;
if (obj9 != null)
{
obj9.LogWarning((object)"ModelReplacementAPI Patch Fail! (This is not a bug and occurs when ModelReplacementAPI is not present)");
}
}
catch (Exception ex3)
{
ManualLogSource? obj10 = logger;
if (obj10 != null)
{
obj10.LogError((object)ex3);
}
ManualLogSource? obj11 = logger;
if (obj11 != null)
{
obj11.LogError((object)"ModelReplacementAPI Patch Fail!");
}
}
ManualLogSource? obj12 = logger;
if (obj12 != null)
{
obj12.LogInfo((object)"Plugin CustomShovel is loaded!");
}
}
}
public class CustomShovelConfig
{
private readonly ConfigEntry<float> _radius;
public const float dRadius = 0.8f;
private readonly ConfigEntry<float> _maxDistance;
public const float dMaxDistance = 1.5f;
private readonly ConfigEntry<bool> _showShovelHitbox;
public const bool dShowShovelHitbox = false;
public float radius
{
get
{
return _radius?.Value ?? 0.8f;
}
set
{
_radius.Value = value;
}
}
public float maxDistance
{
get
{
return _maxDistance?.Value ?? 1.5f;
}
set
{
_maxDistance.Value = value;
}
}
public bool showShovelHitbox
{
get
{
return _showShovelHitbox?.Value ?? false;
}
set
{
_showShovelHitbox.Value = value;
}
}
public CustomShovelConfig(ConfigFile config)
{
_radius = config.Bind<float>("General", "Radius", 0.8f, "Sets the radius of the hitbox circle.");
_radius.SettingChanged += delegate
{
CustomShovelPatches.ShovelPatchUpdate();
};
_maxDistance = config.Bind<float>("General", "Max Distance", 1.5f, "Determines the max distance of the hitbox");
_maxDistance.SettingChanged += delegate
{
CustomShovelPatches.ShovelPatchUpdate();
};
_showShovelHitbox = config.Bind<bool>("Debug", "Show Shovel Hitbox", false, "Shows the shovel's hitbox with a line.");
try
{
LethalConfigPatch();
}
catch (FileNotFoundException ex)
{
ManualLogSource? logger = CustomShovel.logger;
if (logger != null)
{
logger.LogError((object)ex);
}
ManualLogSource? logger2 = CustomShovel.logger;
if (logger2 != null)
{
logger2.LogWarning((object)"Lethal Config Patch Fail! (This is not a bug and occurs when LethalConfig is not present)");
}
}
catch (Exception ex2)
{
ManualLogSource? logger3 = CustomShovel.logger;
if (logger3 != null)
{
logger3.LogError((object)ex2);
}
ManualLogSource? logger4 = CustomShovel.logger;
if (logger4 != null)
{
logger4.LogError((object)"Lethal Config Patch Fail!");
}
}
}
private void LethalConfigPatch()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Expected O, but got Unknown
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Expected O, but got Unknown
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_002d: Expected O, but got Unknown
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: Expected O, but got Unknown
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Expected O, but got Unknown
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_0053: Expected O, but got Unknown
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Expected O, but got Unknown
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Expected O, but got Unknown
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_0075: Expected O, but got Unknown
ConfigEntry<float> obj = _radius;
FloatSliderOptions val = new FloatSliderOptions();
((BaseRangeOptions<float>)val).Min = 0.1f;
((BaseRangeOptions<float>)val).Max = 10f;
((BaseOptions)val).RequiresRestart = false;
LethalConfigManager.AddConfigItem((BaseConfigItem)new FloatSliderConfigItem(obj, val));
ConfigEntry<float> obj2 = _maxDistance;
FloatSliderOptions val2 = new FloatSliderOptions();
((BaseRangeOptions<float>)val2).Min = 0.1f;
((BaseRangeOptions<float>)val2).Max = 10f;
((BaseOptions)val2).RequiresRestart = false;
LethalConfigManager.AddConfigItem((BaseConfigItem)new FloatSliderConfigItem(obj2, val2));
LethalConfigManager.AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(_showShovelHitbox, false));
}
}
public static class CustomShovelDrawHitbox
{
private static PlayerControllerB? _player;
public static PlayerControllerB? player => _player;
public static void Init()
{
RenderPipelineManager.endCameraRendering += RenderPipelineManager_endCameraRendering;
}
[HarmonyPatch(typeof(PlayerControllerB), "Update")]
[HarmonyPostfix]
private static void PlayerControllerB_Update_Postfix(PlayerControllerB __instance)
{
if (((NetworkBehaviour)__instance).IsOwner && (!((NetworkBehaviour)__instance).IsServer || __instance.isHostPlayerObject) && __instance.isPlayerControlled && !__instance.isPlayerDead)
{
_player = __instance;
}
}
private static void RenderPipelineManager_endCameraRendering(ScriptableRenderContext arg1, Camera arg2)
{
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
//IL_008b: 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_00a0: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
//IL_00f2: 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_0103: Unknown result type (might be due to invalid IL or missing references)
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
//IL_011d: Unknown result type (might be due to invalid IL or missing references)
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
//IL_012a: Unknown result type (might be due to invalid IL or missing references)
//IL_0134: Unknown result type (might be due to invalid IL or missing references)
//IL_0137: Unknown result type (might be due to invalid IL or missing references)
//IL_014f: Unknown result type (might be due to invalid IL or missing references)
//IL_0159: Unknown result type (might be due to invalid IL or missing references)
CustomShovelConfig? config = CustomShovel.config;
if (config == null || !config.showShovelHitbox || (Object)(object)CustomShovel.emptyTransform == (Object)null || (Object)(object)player == (Object)null || !player.isHoldingObject || !(player.currentlyHeldObjectServer is Shovel))
{
return;
}
float num = CustomShovel.config?.radius ?? 0.8f;
float num2 = CustomShovel.config?.maxDistance ?? 1.5f;
Vector3 position = ((Component)player.gameplayCamera).transform.position;
Vector3 forward = ((Component)player.gameplayCamera).transform.forward;
RaycastHit[] array = Physics.SphereCastAll(position, num, forward, num2, 11012424, (QueryTriggerInteraction)2);
RaycastHit val = array.Aggregate((RaycastHit x, RaycastHit y) => (!(((RaycastHit)(ref x)).distance > ((RaycastHit)(ref y)).distance)) ? y : x);
if (array.Length != 0)
{
Vector3 center = position + (((RaycastHit)(ref val)).distance - num) * forward;
GL.PushMatrix();
GL.MultMatrix(CustomShovel.emptyTransform.localToWorldMatrix);
if (CustomShovel.coloredMaterial.SetPass(0))
{
Circle3D(center, num, Vector3.right);
Circle3D(center, num, Vector3.forward);
Circle3D(center, num, Vector3.up);
}
for (int i = 0; i < array.Length; i++)
{
Circle3D(((RaycastHit)(ref array[i])).point, 0.1f, forward);
}
GL.PopMatrix();
}
}
public static void Circle3D(Vector3 center, float radius, Vector3 normal)
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_0076: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
GL.Begin(1);
GL.Color(Color.red);
normal = ((Vector3)(ref normal)).normalized;
Vector3 val;
if (!(normal == Vector3.up))
{
val = Vector3.ProjectOnPlane(Vector3.up, normal);
}
else
{
Vector3 val2 = Vector3.ProjectOnPlane(Vector3.forward, normal);
val = ((Vector3)(ref val2)).normalized;
}
Vector3 val3 = val;
Vector3 val4 = Vector3.Cross(normal, val3);
for (float num = 0f; num < MathF.PI * 2f; num += 0.25f)
{
Vector3 val5 = center + val3 * Mathf.Cos(num) * radius + val4 * Mathf.Sin(num) * radius;
GL.Vertex(val5);
if (num != 0f)
{
GL.Vertex(val5);
}
}
GL.End();
}
}
public static class CustomShovelPatches
{
public static void Init()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
Shovel.HitShovel += new Manipulator(HitShovel);
}
public static void ShovelPatchUpdate()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: Expected O, but got Unknown
Shovel.HitShovel -= new Manipulator(HitShovel);
Shovel.HitShovel += new Manipulator(HitShovel);
}
private static void HitShovel(ILContext il)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Expected O, but got Unknown
ILCursor val = new ILCursor(il);
if (val.TryGotoNext(new Func<Instruction, bool>[6]
{
(Instruction x) => ILPatternMatchingExt.MatchLdarg(x, 0),
(Instruction x) => ILPatternMatchingExt.MatchLdarg(x, 0),
(Instruction x) => ILPatternMatchingExt.MatchLdfld<Shovel>(x, "previousPlayerHeldBy"),
(Instruction x) => ILPatternMatchingExt.MatchLdfld<PlayerControllerB>(x, "gameplayCamera"),
(Instruction x) => ILPatternMatchingExt.MatchCallvirt<Component>(x, "get_transform"),
(Instruction x) => ILPatternMatchingExt.MatchCallvirt<Transform>(x, "get_position")
}))
{
ManualLogSource? logger = CustomShovel.logger;
if (logger != null)
{
logger.LogMessage((object)"Try Goto Next Success!");
}
int index = val.Index;
val.Index = index + 1;
val.RemoveRange(25);
val.EmitDelegate<Action<Shovel>>((Action<Shovel>)delegate(Shovel instance)
{
//IL_0011: 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)
instance.objectsHitByShovel = Physics.SphereCastAll(((Component)instance.previousPlayerHeldBy.gameplayCamera).transform.position, CustomShovel.config?.radius ?? 0.8f, ((Component)instance.previousPlayerHeldBy.gameplayCamera).transform.forward, CustomShovel.config?.maxDistance ?? 1.5f, instance.shovelMask, (QueryTriggerInteraction)2);
});
}
else
{
ManualLogSource? logger2 = CustomShovel.logger;
if (logger2 != null)
{
logger2.LogError((object)"Try Goto Next Failed! Bad IL Code!");
}
}
}
}
public static class CustomShovelSkinFix
{
private static bool refresh;
[HarmonyPatch(typeof(ModelReplacementAPI), "SetPlayerModelReplacement")]
[HarmonyPrefix]
public static void ModelReplacementAPI_SetPlayerModelReplacement(ref PlayerControllerB player, ref Type type)
{
BodyReplacementBase val = default(BodyReplacementBase);
if (((Component)player).gameObject.TryGetComponent<BodyReplacementBase>(ref val))
{
int currentSuitID = player.currentSuitID;
string unlockableName = StartOfRound.Instance.unlockablesList.unlockables[currentSuitID].unlockableName;
if (((object)val).GetType() == type && val.suitName == unlockableName)
{
return;
}
}
ManualLogSource? logger = CustomShovel.logger;
if (logger != null)
{
logger.LogInfo((object)"SetPlayerModelReplacement call detected");
}
refresh = true;
}
[HarmonyPatch(typeof(PlayerControllerB), "LateUpdate")]
[HarmonyPostfix]
private static void PlayerControllerB_LateUpdate_Postfix()
{
if (!refresh)
{
return;
}
refresh = false;
int num = LayerMask.NameToLayer("Default");
int layer = LayerMask.NameToLayer("Ignore Raycast");
OffsetBuilder[] array = Object.FindObjectsByType<OffsetBuilder>((FindObjectsInactive)1, (FindObjectsSortMode)0);
for (int i = 0; i < array.Length; i++)
{
Transform[] componentsInChildren = ((Component)array[i]).GetComponentsInChildren<Transform>(true);
foreach (Transform val in componentsInChildren)
{
if (((Component)val).gameObject.layer == num)
{
((Component)val).gameObject.layer = layer;
}
}
}
RotationOffset[] array2 = Object.FindObjectsByType<RotationOffset>((FindObjectsInactive)1, (FindObjectsSortMode)0);
for (int k = 0; k < array.Length; k++)
{
Transform[] componentsInChildren2 = ((Component)array2[k]).GetComponentsInChildren<Transform>(true);
foreach (Transform val2 in componentsInChildren2)
{
if (((Component)val2).gameObject.layer == num)
{
((Component)val2).gameObject.layer = layer;
}
}
}
}
}
}
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
internal sealed class IgnoresAccessChecksToAttribute : Attribute
{
public IgnoresAccessChecksToAttribute(string assemblyName)
{
}
}
}