using System; using System.Collections.Generic; using System.Reflection; using System.Runtime.CompilerServices; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Mirror; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: AssemblyVersion("0.0.0.0")] [BepInPlugin("strazer.playerhex", "Strazer's Player HEX", "1.0.0")] public class PlayerHEXPlugin : BaseUnityPlugin { public const string GUID = "strazer.playerhex"; public const string NAME = "Strazer's Player HEX"; public const string VERSION = "1.0.0"; public static ConfigEntry Enabled; public static ConfigEntry PlayerColourHex; public static ConfigEntry WindowToggleKey; private void Awake() { //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Expected O, but got Unknown //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Expected O, but got Unknown Enabled = ((BaseUnityPlugin)this).Config.Bind("General", "Enabled", true, "Enable or disable the mod."); PlayerColourHex = ((BaseUnityPlugin)this).Config.Bind("General", "PlayerColourHex", "#FFFFFF", "HEX color for the local player's forklift. Example values: #FFFFFF, #FF0000, #00FF00, #0000FF."); WindowToggleKey = ((BaseUnityPlugin)this).Config.Bind("General", "WindowToggleKey", "F8", "Key used to toggle the colour picker window on and off. Valid: any KeyCode name (e.g. F8, F1, BackQuote)."); PlayerColorManager_UpdateRenderers_Patch.Initialize(); Harmony val = new Harmony("strazer.playerhex"); val.PatchAll(); GameObject val2 = new GameObject("PlayerHEX_UI"); Object.DontDestroyOnLoad((Object)(object)val2); ((Object)val2).hideFlags = (HideFlags)61; val2.AddComponent(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Strazer's Player HEX loaded"); } } [HarmonyPatch(typeof(PlayerColorManager), "UpdateRenderers")] public static class PlayerColorManager_UpdateRenderers_Patch { private static FieldInfo _vehicleRendersField; private static FieldInfo _playerRendersField; private static FieldInfo _networkField; private static readonly int MainColorId = Shader.PropertyToID("_MainColor"); private static bool _initialized; public static void Initialize() { if (!_initialized) { _vehicleRendersField = AccessTools.Field(typeof(PlayerColorManager), "vehicleRendersToUpdate"); _playerRendersField = AccessTools.Field(typeof(PlayerColorManager), "playerRendersToUpdate"); _networkField = AccessTools.Field(typeof(PlayerColorManager), "playerColorManagerNetwork"); _initialized = true; } } [HarmonyPostfix] public static void Postfix(PlayerColorManager __instance) { //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) if (!PlayerHEXPlugin.Enabled.Value) { return; } string value = PlayerHEXPlugin.PlayerColourHex.Value; if (!HexColorUtil.TryParse(value, out var color)) { return; } object? value2 = _networkField.GetValue(__instance); PlayerColorManagerNetwork val = (PlayerColorManagerNetwork)((value2 is PlayerColorManagerNetwork) ? value2 : null); if ((Object)(object)val == (Object)null || !((NetworkBehaviour)val).isLocalPlayer) { return; } if (_vehicleRendersField.GetValue(__instance) is List { Count: >0 } list) { for (int i = 0; i < list.Count; i++) { Renderer val2 = list[i]; if ((Object)(object)val2 != (Object)null) { MaterialUtil.SetPropertyBlockColor(val2, MainColorId, color); } } } if (!(_playerRendersField.GetValue(__instance) is List { Count: >0 } list2)) { return; } for (int i = 0; i < list2.Count; i++) { Renderer val2 = list2[i]; if ((Object)(object)val2 != (Object)null) { MaterialUtil.SetPropertyBlockColor(val2, MainColorId, color); } } } } public static class HexColorUtil { public static bool TryParse(string hex, out Color color) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) color = Color.white; if (string.IsNullOrEmpty(hex)) { return false; } hex = hex.Trim(); if (!hex.StartsWith("#")) { hex = "#" + hex; } return ColorUtility.TryParseHtmlString(hex, ref color); } public static string ToHex(Color color) { int num = Mathf.RoundToInt(Mathf.Clamp01(color.r) * 255f); int num2 = Mathf.RoundToInt(Mathf.Clamp01(color.g) * 255f); int num3 = Mathf.RoundToInt(Mathf.Clamp01(color.b) * 255f); return "#" + num.ToString("X2") + num2.ToString("X2") + num3.ToString("X2"); } public static void ColorToHSV(Color color, out float h, out float s, out float v) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) Color.RGBToHSV(color, ref h, ref s, ref v); } public static Color HSVToColor(float h, float s, float v) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) return Color.HSVToRGB(h, s, v); } } public class ColorPickerUI : MonoBehaviour { private const int WindowId = 1346913624; private const float Deg2Rad = (float)Math.PI / 180f; private const float Rad2Deg = 57.29578f; private bool _showWindow; private Rect _windowRect = new Rect(20f, 20f, 300f, 520f); private Texture2D _colorWheelTex; private bool _wheelDragging; private float _hue = 0f; private float _saturation = 0f; private float _value = 1f; private int _red = 255; private int _green = 255; private int _blue = 255; private string _hexText = "FFFFFF"; private Color _previewColor = Color.white; private string _hexFieldText = "FFFFFF"; private KeyCode _toggleKey = (KeyCode)289; private void Awake() { _colorWheelTex = GenerateColorWheel(256); LoadFromConfig(); _hexFieldText = _hexText; ParseToggleKey(); } private void OnDestroy() { if ((Object)(object)_colorWheelTex != (Object)null) { Object.Destroy((Object)(object)_colorWheelTex); } } private void ParseToggleKey() { //IL_0023: Unknown result type (might be due to invalid IL or missing references) string value = PlayerHEXPlugin.WindowToggleKey.Value; if (!Enum.TryParse(value, ignoreCase: true, out _toggleKey)) { _toggleKey = (KeyCode)289; } } private void LoadFromConfig() { //IL_0028: 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_001d: Unknown result type (might be due to invalid IL or missing references) //IL_001e: 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_00da: Unknown result type (might be due to invalid IL or missing references) string value = PlayerHEXPlugin.PlayerColourHex.Value; if (HexColorUtil.TryParse(value, out var color)) { _previewColor = color; } else { _previewColor = Color.white; } _hue = 0f; _saturation = 0f; _value = 1f; Color.RGBToHSV(_previewColor, ref _hue, ref _saturation, ref _value); _hue *= 360f; _red = Mathf.RoundToInt(_previewColor.r * 255f); _green = Mathf.RoundToInt(_previewColor.g * 255f); _blue = Mathf.RoundToInt(_previewColor.b * 255f); _hexText = HexColorUtil.ToHex(_previewColor).TrimStart(new char[1] { '#' }); } private void OnGUI() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Invalid comparison between Unknown and I4 //IL_0011: 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_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Expected O, but got Unknown //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) Event current = Event.current; if ((int)current.type == 4 && current.keyCode == _toggleKey && !current.control && !current.shift && !current.alt) { _showWindow = !_showWindow; if (_showWindow) { LoadFromConfig(); } current.Use(); } if (_showWindow) { _windowRect = GUILayout.Window(1346913624, _windowRect, new WindowFunction(DrawWindow), "Strazer's Player HEX", (GUILayoutOption[])(object)new GUILayoutOption[0]); } } private void DrawWindow(int id) { //IL_0054: Unknown result type (might be due to invalid IL or missing references) GUILayout.Space(5f); DrawColorWheel(); DrawValueSlider(); DrawRGBSliders(); DrawHexField(); DrawButtons(); GUILayout.Space(5f); GUI.DragWindow(new Rect(0f, 0f, ((Rect)(ref _windowRect)).width, 25f)); } private void DrawColorWheel() { //IL_0043: 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_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0246: Unknown result type (might be due to invalid IL or missing references) //IL_024c: Invalid comparison between Unknown and I4 //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Invalid comparison between Unknown and I4 //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_0222: 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) GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.FlexibleSpace(); Rect rect = GUILayoutUtility.GetRect(200f, 200f, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.MaxWidth(200f), GUILayout.MaxHeight(200f) }); GUI.DrawTexture(rect, (Texture)(object)_colorWheelTex); float num = ((Rect)(ref rect)).x + ((Rect)(ref rect)).width * 0.5f; float num2 = ((Rect)(ref rect)).y + ((Rect)(ref rect)).height * 0.5f; float num3 = num + Mathf.Cos(_hue * ((float)Math.PI / 180f)) * (_saturation * ((Rect)(ref rect)).width * 0.45f); float num4 = num2 - Mathf.Sin(_hue * ((float)Math.PI / 180f)) * (_saturation * ((Rect)(ref rect)).height * 0.45f); Rect val = default(Rect); ((Rect)(ref val))..ctor(num3 - 4f, num4 - 4f, 8f, 8f); GUI.Box(val, GUIContent.none); Event current = Event.current; if (((Rect)(ref rect)).Contains(current.mousePosition)) { if ((int)current.type == 0 && current.button == 0) { _wheelDragging = true; } if ((_wheelDragging && (int)current.type == 3) || ((int)current.type == 0 && current.button == 0)) { float num5 = (current.mousePosition.x - num) / (((Rect)(ref rect)).width * 0.45f); float num6 = (current.mousePosition.y - num2) / (((Rect)(ref rect)).height * 0.45f); float saturation = Mathf.Clamp01(Mathf.Sqrt(num5 * num5 + num6 * num6)); float hue = (Mathf.Atan2(0f - num6, num5) * 57.29578f + 360f) % 360f; _hue = hue; _saturation = saturation; _previewColor = Color.HSVToRGB(_hue / 360f, _saturation, _value); SyncRGBNumbersFromColor(); SyncHexFromColor(); current.Use(); } } if ((int)current.type == 1 && current.button == 0) { _wheelDragging = false; } GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); } private void DrawValueSlider() { //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.Label("V:", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(20f) }); float num = GUILayout.HorizontalSlider(_value, 0f, 1f, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); if (!Mathf.Approximately(num, _value)) { _value = num; _previewColor = Color.HSVToRGB(_hue / 360f, _saturation, _value); SyncRGBNumbersFromColor(); SyncHexFromColor(); } GUILayout.Label(_value.ToString("F2"), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(35f) }); GUILayout.EndHorizontal(); } private void DrawRGBSliders() { DrawSingleRGBSlider("R:", ref _red); DrawSingleRGBSlider("G:", ref _green); DrawSingleRGBSlider("B:", ref _blue); } private void DrawSingleRGBSlider(string label, ref int value) { //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.Label(label, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(20f) }); float num = value; float num2 = GUILayout.HorizontalSlider(num, 0f, 255f, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); int num3 = Mathf.RoundToInt(num2); if (num3 != value) { value = num3; _previewColor = new Color((float)_red / 255f, (float)_green / 255f, (float)_blue / 255f); SyncHSVFromColor(); SyncHexFromColor(); } GUILayout.Label(value.ToString(), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(30f) }); GUILayout.EndHorizontal(); } private void DrawHexField() { //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Invalid comparison between Unknown and I4 //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_0194: 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) GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.Label("HEX:", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(35f) }); GUI.SetNextControlName("HexInput"); string text = GUILayout.TextField(_hexFieldText, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(80f) }); if (text != _hexFieldText) { _hexFieldText = text; if (HexColorUtil.TryParse(_hexFieldText, out var color)) { _previewColor = color; SyncRGBNumbersFromColor(); SyncHSVFromColor(); _hexText = HexColorUtil.ToHex(_previewColor).TrimStart(new char[1] { '#' }); _hexFieldText = _hexText; } } if (Event.current.isKey && (int)Event.current.keyCode == 13 && GUI.GetNameOfFocusedControl() == "HexInput" && HexColorUtil.TryParse(_hexFieldText, out var color2)) { _hexFieldText = HexColorUtil.ToHex(color2).TrimStart(new char[1] { '#' }); } Rect rect = GUILayoutUtility.GetRect(40f, 20f, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(40f) }); Color backgroundColor = GUI.backgroundColor; GUI.backgroundColor = _previewColor; GUI.Box(rect, GUIContent.none); GUI.backgroundColor = backgroundColor; GUILayout.EndHorizontal(); } private void DrawButtons() { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); if (GUILayout.Button("Apply", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(25f) })) { string text = HexColorUtil.ToHex(_previewColor); PlayerHEXPlugin.PlayerColourHex.Value = text; _hexText = text.TrimStart(new char[1] { '#' }); _hexFieldText = _hexText; } if (GUILayout.Button("Reset", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(25f) })) { LoadFromConfig(); _hexFieldText = _hexText; } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); if (GUILayout.Button("Copy HEX", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(25f) })) { GUIUtility.systemCopyBuffer = "#" + _hexText; } if (GUILayout.Button("Paste HEX", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(25f) })) { string systemCopyBuffer = GUIUtility.systemCopyBuffer; if (!string.IsNullOrEmpty(systemCopyBuffer) && HexColorUtil.TryParse(systemCopyBuffer, out var color)) { _previewColor = color; _hexText = HexColorUtil.ToHex(color).TrimStart(new char[1] { '#' }); _hexFieldText = _hexText; SyncRGBNumbersFromColor(); SyncHSVFromColor(); GUI.FocusControl("HexInput"); } } GUILayout.EndHorizontal(); } private void SyncRGBNumbersFromColor() { _red = Mathf.RoundToInt(_previewColor.r * 255f); _green = Mathf.RoundToInt(_previewColor.g * 255f); _blue = Mathf.RoundToInt(_previewColor.b * 255f); } private void SyncHSVFromColor() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) float num = default(float); float saturation = default(float); float value = default(float); Color.RGBToHSV(_previewColor, ref num, ref saturation, ref value); _hue = num * 360f; _saturation = saturation; _value = value; } private void SyncHexFromColor() { //IL_0003: Unknown result type (might be due to invalid IL or missing references) _hexText = HexColorUtil.ToHex(_previewColor).TrimStart(new char[1] { '#' }); _hexFieldText = _hexText; } private static Texture2D GenerateColorWheel(int size) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(size, size, (TextureFormat)3, false); ((Texture)val).wrapMode = (TextureWrapMode)1; float num = (float)size * 0.5f; float num2 = num; Color[] array = (Color[])(object)new Color[size * size]; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { float num3 = (float)j - num; float num4 = (float)i - num; float num5 = Mathf.Sqrt(num3 * num3 + num4 * num4); float num6 = Mathf.Clamp01(num5 / num2); float num7 = (Mathf.Atan2(num4, num3) * 57.29578f + 360f) % 360f; if (num5 <= num2) { ref Color reference = ref array[i * size + j]; reference = Color.HSVToRGB(num7 / 360f, num6, 1f); } else { ref Color reference2 = ref array[i * size + j]; reference2 = new Color(0.15f, 0.15f, 0.15f, 1f); } } } val.SetPixels(array); val.Apply(); return val; } }