using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BBModMenu;
using CustomFlashlight;
using MelonLoader;
using UnityEngine;
using UnityEngine.UIElements;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(FlashlightMod), "FlashlightToggle", "1.0.0", "Bowilla", null)]
[assembly: MelonGame("", "Beton Brutal")]
[assembly: AssemblyTitle("FlashlightToggle")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("FlashlightToggle")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("7cc147f5-c8aa-4f03-bf1f-71c78f5e8cdf")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace CustomFlashlight;
public class FlashlightMod : MelonMod
{
private Light flashlight;
private bool toggle_enable = true;
private float intensity = 3f;
private Color color = new Color(1f, 1f, 1f);
private string toggleKey;
private float[] custom_light;
public override void OnLateInitializeMelon()
{
//IL_0712: Unknown result type (might be due to invalid IL or missing references)
MelonLogger.Msg("CustomFlashlight starting to load.");
flashlight = Light.GetLights((LightType)0, 0)[0];
GameObject val = GameObject.Find("GameUI");
GameUI component = val.GetComponent<GameUI>();
UIScreen? obj = ((typeof(GameUI)?.GetField("screens", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(component) is List<UIScreen> source) ? ((IEnumerable<UIScreen>)source).FirstOrDefault((Func<UIScreen, bool>)((UIScreen screen) => screen is ModMenu)) : null);
ModMenu val2 = (ModMenu)(object)((obj is ModMenu) ? obj : null);
if (val2 == null)
{
MelonLogger.Msg("ModMenu not found");
return;
}
string text = "Flashlight";
VisualElement flashlightSettings = val2.AddSetting(text);
Toggle val3 = val2.CreateToggle(text, "CameraGlow", true);
INotifyValueChangedExtensions.RegisterValueChangedCallback<bool>((INotifyValueChanged<bool>)(object)val3, (EventCallback<ChangeEvent<bool>>)delegate(ChangeEvent<bool> b)
{
((Component)Camera.main).GetComponentInChildren<Light>().intensity = (b.newValue ? 1 : 0);
});
HotKeyEntry val4 = val2.CreateHotKey(text, "ToggleHotkey", (KeyCode)108);
toggleKey = val4.Value;
val4.OnChanged = (Action<string>)Delegate.Combine(val4.OnChanged, (Action<string>)delegate(string newKey)
{
MelonLogger.Msg("Flashlight Toggle Hotkey : " + newKey);
toggleKey = newKey;
});
Slider intensitySlider = val2.CreateSlider(text, "Intensity", 0f, 10f, 3f, false);
INotifyValueChangedExtensions.RegisterValueChangedCallback<float>((INotifyValueChanged<float>)(object)intensitySlider, (EventCallback<ChangeEvent<float>>)delegate(ChangeEvent<float> f)
{
intensity = f.newValue;
if (flashlight.intensity > 0f)
{
flashlight.intensity = intensity;
}
custom_light[0] = f.newValue;
});
Slider rangeSlider = val2.CreateSlider(text, "Range", 0f, 500f, 15f, true);
INotifyValueChangedExtensions.RegisterValueChangedCallback<float>((INotifyValueChanged<float>)(object)rangeSlider, (EventCallback<ChangeEvent<float>>)delegate(ChangeEvent<float> f)
{
flashlight.range = f.newValue;
custom_light[1] = f.newValue;
});
Slider angleSlider = val2.CreateSlider(text, "Angle", 0f, 160f, 120f, true);
INotifyValueChangedExtensions.RegisterValueChangedCallback<float>((INotifyValueChanged<float>)(object)angleSlider, (EventCallback<ChangeEvent<float>>)delegate(ChangeEvent<float> f)
{
flashlight.spotAngle = f.newValue;
custom_light[2] = f.newValue;
});
Slider rSlider = val2.CreateSlider(text, "Red", 0f, 1f, 1f, false);
INotifyValueChangedExtensions.RegisterValueChangedCallback<float>((INotifyValueChanged<float>)(object)rSlider, (EventCallback<ChangeEvent<float>>)delegate(ChangeEvent<float> f)
{
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
color.r = f.newValue;
flashlight.color = color;
custom_light[3] = f.newValue;
});
Slider gSlider = val2.CreateSlider(text, "Green", 0f, 1f, 1f, false);
INotifyValueChangedExtensions.RegisterValueChangedCallback<float>((INotifyValueChanged<float>)(object)gSlider, (EventCallback<ChangeEvent<float>>)delegate(ChangeEvent<float> f)
{
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
color.g = f.newValue;
flashlight.color = color;
custom_light[4] = f.newValue;
});
Slider bSlider = val2.CreateSlider(text, "Blue", 0f, 1f, 1f, false);
INotifyValueChangedExtensions.RegisterValueChangedCallback<float>((INotifyValueChanged<float>)(object)bSlider, (EventCallback<ChangeEvent<float>>)delegate(ChangeEvent<float> f)
{
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
color.b = f.newValue;
flashlight.color = color;
custom_light[5] = f.newValue;
});
VisualElement sliderGroup = val2.CreateGroup("CustomLightSliders");
List<string> list = new List<string> { "Default Flashlight", "Cheap Flashlight", "Cold Headlight", "Warm Headlight", "Night Vision Goggles", "UV Flashlight", "Builder's Super Torch", "Custom Flashlight" };
Dictionary<string, float[]> dictionary = new Dictionary<string, float[]>
{
{
"Default Flashlight",
new float[6] { 3f, 15f, 120f, 1f, 1f, 1f }
},
{
"Cheap Flashlight",
new float[6] { 4f, 5f, 85f, 1f, 1f, 1f }
},
{
"Cold Headlight",
new float[6] { 3f, 150f, 120f, 0.7f, 0.7f, 1f }
},
{
"Warm Headlight",
new float[6] { 2f, 150f, 120f, 1f, 0.7f, 0.5f }
},
{
"Night Vision Goggles",
new float[6] { 3f, 500f, 160f, 0.3f, 1f, 0.3f }
}
};
float[] obj2 = new float[6] { 10f, 15f, 0f, 0.3f, 0f, 1f };
obj2[2] = Camera.main.fieldOfView;
dictionary.Add("UV Flashlight", obj2);
dictionary.Add("Builder's Super Torch", new float[6] { 2f, 500f, 160f, 1f, 1f, 1f });
dictionary.Add("Custom Flashlight", new float[6]
{
((BaseField<float>)(object)intensitySlider).value,
((BaseField<float>)(object)rangeSlider).value,
((BaseField<float>)(object)angleSlider).value,
((BaseField<float>)(object)rSlider).value,
((BaseField<float>)(object)gSlider).value,
((BaseField<float>)(object)bSlider).value
});
Dictionary<string, float[]> lightValues = dictionary;
CarouselEntry val5 = val2.CreateCarousel(text, "FlashlightPresets", list, (Action<string>)delegate(string _key)
{
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
MelonLogger.Msg("Flashlight changed to " + _key);
lightValues.TryGetValue(_key, out var value2);
flashlight.intensity = (intensity = value2[0]);
flashlight.range = value2[1];
flashlight.spotAngle = value2[2];
flashlight.color = new Color(value2[3], value2[4], value2[5]);
if (_key == "Custom Flashlight")
{
custom_light = value2;
((BaseField<float>)(object)intensitySlider).value = value2[0];
((BaseField<float>)(object)rangeSlider).value = value2[1];
((BaseField<float>)(object)angleSlider).value = value2[2];
((BaseField<float>)(object)rSlider).value = value2[3];
((BaseField<float>)(object)gSlider).value = value2[4];
((BaseField<float>)(object)bSlider).value = value2[5];
flashlightSettings.Add(sliderGroup);
}
else
{
flashlightSettings.Remove(sliderGroup);
}
}, "Default Flashlight");
VisualElement val6 = val2.CreateGroup("Toggles");
VisualElement val7 = val2.CreateWrapper();
val7.Add((VisualElement)(object)val2.CreateLabel("Flashlight Power Button"));
val7.Add(val4.Root);
VisualElement val8 = val2.CreateWrapper();
val8.Add((VisualElement)(object)val2.CreateLabel("Enable Camera Glow"));
val8.Add((VisualElement)(object)val3);
VisualElement val9 = val2.CreateWrapper();
val9.Add((VisualElement)(object)val2.CreateLabel("Flashlight Presets"));
val9.Add(val5.Root);
val6.Add(val7);
val6.Add(val8);
val6.Add(val9);
VisualElement val10 = val2.CreateWrapper();
val10.Add((VisualElement)(object)val2.CreateLabel("Intensity"));
val10.Add((VisualElement)(object)intensitySlider);
VisualElement val11 = val2.CreateWrapper();
val11.Add((VisualElement)(object)val2.CreateLabel("Range"));
val11.Add((VisualElement)(object)rangeSlider);
VisualElement val12 = val2.CreateWrapper();
val12.Add((VisualElement)(object)val2.CreateLabel("Angle"));
val12.Add((VisualElement)(object)angleSlider);
VisualElement val13 = val2.CreateWrapper();
val13.Add((VisualElement)(object)val2.CreateLabel("Red"));
val13.Add((VisualElement)(object)rSlider);
VisualElement val14 = val2.CreateWrapper();
val14.Add((VisualElement)(object)val2.CreateLabel("Green"));
val14.Add((VisualElement)(object)gSlider);
VisualElement val15 = val2.CreateWrapper();
val15.Add((VisualElement)(object)val2.CreateLabel("Blue"));
val15.Add((VisualElement)(object)bSlider);
sliderGroup.Add(val10);
sliderGroup.Add(val11);
sliderGroup.Add(val12);
sliderGroup.Add(val13);
sliderGroup.Add(val14);
sliderGroup.Add(val15);
flashlightSettings.Add(val6);
lightValues.TryGetValue(val5.Value, out var value);
flashlight.intensity = (intensity = value[0]);
flashlight.range = value[1];
flashlight.spotAngle = value[2];
flashlight.color = new Color(value[3], value[4], value[5]);
if (val5.Value == "Custom Flashlight")
{
custom_light = value;
flashlightSettings.Add(sliderGroup);
}
((Component)Camera.main).GetComponentInChildren<Light>().intensity = (((BaseField<bool>)(object)val3).value ? 1 : 0);
}
public override void OnUpdate()
{
if (toggle_enable && Utils.IsHotkeyPressed(toggleKey))
{
if (flashlight.intensity > 0f)
{
flashlight.intensity = 0f;
}
else
{
flashlight.intensity = intensity;
}
}
}
}