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
{
}
}
}