Decompiled source of LaserEyes v1.0.9

LaserEyes.dll

Decompiled a month ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BoneLib;
using BoneLib.BoneMenu;
using LaserEyes;
using MelonLoader;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: MelonInfo(typeof(LaserEyesMod), "LaserEyes", "1.0.9", "YourName", "https://github.com/yourname/lasereyes")]
[assembly: MelonGame("Stress Level Zero", "BONELAB")]
[assembly: MelonPriority(10)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")]
[assembly: AssemblyVersion("0.0.0.0")]
namespace LaserEyes;

public class LaserEyesMod : MelonMod
{
	private enum BindButton
	{
		A,
		B,
		X,
		Y,
		LeftGrip,
		RightGrip,
		LeftStick,
		RightStick
	}

	private GameObject laserObject;

	private LineRenderer lineRenderer;

	private bool modEnabled = true;

	private float maxDistance = 60f;

	private float laserWidth = 0.04f;

	private float damageAmount = 10f;

	private bool dealDamage = true;

	private Color laserColor = Color.red;

	private Transform headTransform;

	private int layerMask;

	private float tickTimer;

	private const float DAMAGE_TICK_RATE = 0.15f;

	private GameObject hitEffect;

	private bool ready;

	private int frameDelay = 30;

	private static Page menuPage;

	private bool menuReady;

	private int menuDelay = 10;

	private bool controllerToggle = true;

	private bool prevBindDown;

	private KeyCode toggleKey = (KeyCode)330;

	private BindButton currentBind;

	public override void OnInitializeMelon()
	{
		layerMask = LayerMask.GetMask(new string[6] { "Default", "NPC", "EnemyColliders", "Player", "Environment", "Dynamic" });
	}

	private void SetupMenu()
	{
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0055: 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_00b2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
		//IL_011e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0145: Unknown result type (might be due to invalid IL or missing references)
		if (menuReady)
		{
			return;
		}
		menuPage = Page.Root.CreatePage("Laser Eyes", Color.red, 0, true);
		menuPage.CreateBool("Enabled", Color.green, modEnabled, (Action<bool>)delegate(bool v)
		{
			modEnabled = v;
			if ((Object)(object)laserObject != (Object)null)
			{
				laserObject.SetActive(v);
			}
		});
		menuPage.CreateFloat("Damage", Color.red, damageAmount, 0f, 100f, 1f, (Action<float>)delegate(float v)
		{
			damageAmount = v;
		});
		menuPage.CreateBool("Deal Damage", Color.red, dealDamage, (Action<bool>)delegate(bool v)
		{
			dealDamage = v;
		});
		menuPage.CreateFloat("Beam Width", Color.cyan, laserWidth, 0.01f, 0.2f, 0.01f, (Action<float>)delegate(float v)
		{
			laserWidth = v;
			if ((Object)(object)lineRenderer != (Object)null)
			{
				lineRenderer.startWidth = laserWidth;
				lineRenderer.endWidth = laserWidth;
			}
		});
		menuPage.CreateFloat("Range", Color.blue, maxDistance, 10f, 200f, 5f, (Action<float>)delegate(float v)
		{
			maxDistance = v;
		});
		menuPage.CreateBool("Controller Toggle", Color.white, controllerToggle, (Action<bool>)delegate(bool v)
		{
			controllerToggle = v;
		});
		menuPage.CreateEnum("Toggle Button", Color.white, (Enum)currentBind, (Action<Enum>)delegate(Enum v)
		{
			//IL_0040: 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_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: 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_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			currentBind = (BindButton)(object)v;
			switch ((BindButton)(object)v)
			{
			case BindButton.A:
				toggleKey = (KeyCode)330;
				break;
			case BindButton.B:
				toggleKey = (KeyCode)331;
				break;
			case BindButton.X:
				toggleKey = (KeyCode)332;
				break;
			case BindButton.Y:
				toggleKey = (KeyCode)333;
				break;
			case BindButton.LeftGrip:
				toggleKey = (KeyCode)334;
				break;
			case BindButton.RightGrip:
				toggleKey = (KeyCode)335;
				break;
			case BindButton.LeftStick:
				toggleKey = (KeyCode)338;
				break;
			case BindButton.RightStick:
				toggleKey = (KeyCode)339;
				break;
			}
		});
		menuReady = true;
	}

	private Material MakeMat(Color c)
	{
		//IL_0068: Unknown result type (might be due to invalid IL or missing references)
		//IL_006e: Expected O, but got Unknown
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_005e: Expected O, but got Unknown
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		Shader val = Shader.Find("Universal Render Pipeline/Unlit");
		if ((Object)(object)val == (Object)null)
		{
			val = Shader.Find("UniversalRenderPipeline/Unlit");
		}
		if ((Object)(object)val == (Object)null)
		{
			val = Shader.Find("Universal Render Pipeline/Lit");
		}
		if ((Object)(object)val == (Object)null)
		{
			val = Shader.Find("Legacy Shaders/Particles/Additive");
		}
		if ((Object)(object)val != (Object)null)
		{
			return new Material(val)
			{
				color = c
			};
		}
		Material val2 = new Material(Shader.Find("Standard"));
		if ((Object)(object)val2.shader != (Object)null)
		{
			val2.color = c;
			return val2;
		}
		return null;
	}

	private void BuildLaser()
	{
		//IL_0074: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: Expected O, but got Unknown
		//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0138: Unknown result type (might be due to invalid IL or missing references)
		//IL_0149: Unknown result type (might be due to invalid IL or missing references)
		//IL_0166: Unknown result type (might be due to invalid IL or missing references)
		//IL_018f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0199: Expected O, but got Unknown
		if (ready)
		{
			return;
		}
		headTransform = null;
		try
		{
			object obj = Player.Head;
			if (obj == null)
			{
				Camera obj2 = Object.FindObjectOfType<Camera>();
				obj = ((obj2 != null) ? ((Component)obj2).transform : null);
			}
			headTransform = (Transform)obj;
		}
		catch
		{
		}
		if ((Object)(object)headTransform == (Object)null)
		{
			try
			{
				Camera main = Camera.main;
				headTransform = ((main != null) ? ((Component)main).transform : null);
			}
			catch
			{
			}
		}
		if (!((Object)(object)headTransform == (Object)null))
		{
			laserObject = new GameObject("LaserEyes_Beam");
			laserObject.SetActive(modEnabled);
			hitEffect = GameObject.CreatePrimitive((PrimitiveType)0);
			((Object)hitEffect).name = "LaserEyes_Impact";
			hitEffect.transform.localScale = Vector3.one * 0.06f;
			hitEffect.SetActive(false);
			Object.Destroy((Object)(object)hitEffect.GetComponent<Collider>());
			MeshRenderer component = hitEffect.GetComponent<MeshRenderer>();
			lineRenderer = laserObject.AddComponent<LineRenderer>();
			lineRenderer.positionCount = 2;
			lineRenderer.startWidth = laserWidth;
			lineRenderer.endWidth = laserWidth;
			lineRenderer.startColor = laserColor;
			lineRenderer.endColor = laserColor;
			((Renderer)lineRenderer).sharedMaterial = ((Renderer)component).sharedMaterial;
			((Renderer)component).sharedMaterial = MakeMat(Color.yellow);
			if ((Object)(object)((Renderer)component).sharedMaterial == (Object)null)
			{
				((Renderer)component).sharedMaterial = new Material(((Renderer)lineRenderer).sharedMaterial);
			}
			hitEffect.transform.SetParent(laserObject.transform);
			ready = true;
			MelonLogger.Msg("Laser Eyes ready");
		}
	}

	public override void OnUpdate()
	{
		//IL_005e: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_0109: Unknown result type (might be due to invalid IL or missing references)
		//IL_0113: Unknown result type (might be due to invalid IL or missing references)
		//IL_0118: 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_0124: Unknown result type (might be due to invalid IL or missing references)
		//IL_0129: 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_012b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0132: Unknown result type (might be due to invalid IL or missing references)
		//IL_0137: Unknown result type (might be due to invalid IL or missing references)
		//IL_013c: Unknown result type (might be due to invalid IL or missing references)
		//IL_013d: Unknown result type (might be due to invalid IL or missing references)
		//IL_013e: Unknown result type (might be due to invalid IL or missing references)
		//IL_013f: Unknown result type (might be due to invalid IL or missing references)
		//IL_015e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0163: Unknown result type (might be due to invalid IL or missing references)
		//IL_0238: Unknown result type (might be due to invalid IL or missing references)
		//IL_0245: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
		if (!menuReady)
		{
			if (menuDelay > 0)
			{
				menuDelay--;
				return;
			}
			SetupMenu();
		}
		if (!ready)
		{
			if (frameDelay > 0)
			{
				frameDelay--;
			}
			else
			{
				BuildLaser();
			}
			return;
		}
		if (controllerToggle && ready)
		{
			bool key = Input.GetKey(toggleKey);
			if (key && !prevBindDown)
			{
				modEnabled = !modEnabled;
				if ((Object)(object)laserObject != (Object)null)
				{
					laserObject.SetActive(modEnabled);
				}
			}
			prevBindDown = key;
		}
		if (!modEnabled || (Object)(object)lineRenderer == (Object)null || (Object)(object)headTransform == (Object)null)
		{
			if ((Object)(object)hitEffect != (Object)null && hitEffect.activeSelf)
			{
				hitEffect.SetActive(false);
			}
			return;
		}
		Vector3 val = headTransform.position + headTransform.forward * 0.08f;
		Vector3 forward = headTransform.forward;
		Vector3 val2 = val + forward * maxDistance;
		RaycastHit val3 = default(RaycastHit);
		if (Physics.Raycast(new Ray(val, forward), ref val3, maxDistance, layerMask))
		{
			val2 = ((RaycastHit)(ref val3)).point;
			if (dealDamage && damageAmount > 0f)
			{
				tickTimer += Time.deltaTime;
				if (tickTimer >= 0.15f)
				{
					tickTimer = 0f;
					DoDamage(((RaycastHit)(ref val3)).collider);
				}
			}
			if ((Object)(object)hitEffect != (Object)null)
			{
				hitEffect.SetActive(true);
				hitEffect.transform.position = ((RaycastHit)(ref val3)).point;
				hitEffect.transform.rotation = Quaternion.LookRotation(((RaycastHit)(ref val3)).normal);
			}
		}
		else
		{
			tickTimer = 0f;
			if ((Object)(object)hitEffect != (Object)null && hitEffect.activeSelf)
			{
				hitEffect.SetActive(false);
			}
		}
		lineRenderer.SetPosition(0, val);
		lineRenderer.SetPosition(1, val2);
	}

	private void DoDamage(Collider c)
	{
		//IL_004a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0055: 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)
		try
		{
			GameObject gameObject = ((Component)c).gameObject;
			gameObject.SendMessage("Damage", (object)damageAmount, (SendMessageOptions)1);
			gameObject.SendMessage("TakeDamage", (object)damageAmount, (SendMessageOptions)1);
			Rigidbody component = gameObject.GetComponent<Rigidbody>();
			if ((Object)(object)component != (Object)null)
			{
				component.AddForce(headTransform.forward * damageAmount * 0.5f, (ForceMode)1);
			}
		}
		catch
		{
		}
	}
}