{"TotalCount":7,"Files":[{"Ident":"notathreat.crosshairbuilder","Path":"Editor/MyEditorMenu.cs","FileName":"MyEditorMenu.cs","PackageType":"library","CodeKind":"Editor","AssetVersionId":67301,"Code":"using Editor;\r\n\r\npublic static class MyEditorMenu\r\n{\r\n\t[Menu( \u0022Editor\u0022, \u0022CrosshairBuilder/My Menu Option\u0022 )]\r\n\tpublic static void OpenMyMenu()\r\n\t{\r\n\t\tEditorUtility.DisplayDialog( \u0022It worked!\u0022, \u0022This is being called from your library\u0027s editor code!\u0022 );\r\n\t}\r\n}\r\n"},{"Ident":"notathreat.crosshairbuilder","Path":"Code/CrosshairBuilder.razor","FileName":"CrosshairBuilder.razor","PackageType":"library","CodeKind":"Game","AssetVersionId":67301,"Code":"@using System;\r\n@using Sandbox;\r\n@using Sandbox.UI;\r\n@inherits PanelComponent\r\n\r\n\u003Croot\u003E\r\n    \u003Cdiv class=\u0022crosshair\u0022 style=\u0022\r\n\t\tposition: absolute;\r\n\t\tleft: @( IsPercentage ? $\u0022{Position.x}%\u0022  : Position.x );\r\n\t\ttop: @( IsPercentage ? $\u0022{Position.y}%\u0022 : Position.y );\r\n\t\ttransform: translate(-50%, -50%);\r\n\t\u0022\u003E\r\n\t\t\u003Cdiv class=\u0022center-dot-border-wrapper\u0022 style=\u0022\r\n\t\t\tdisplay: @(CenterDot ? \u0022flex\u0022 : \u0022none\u0022);\r\n\t\t\tborder: @(Outline ? $\u0022{OutlineThickness}px solid rgba(0, 0, 0, {OutlineOpacity})\u0022 : \u0022none\u0022);\r\n\t\t\tz-index: 100;\r\n\t\t\u0022\u003E\r\n\t\t\t\u003Cdiv class=\u0022center-dot\u0022 style=\u0022\r\n\t\t\t\tbackground-color: rgba(@(Color.r * 255), @(Color.g * 255), @(Color.b * 255), @(CenterDotOpacity));\r\n\t\t\t\tpadding: @(CenterDotThickness)px;\r\n\t\t\t\u0022\u003E\u003C/div\u003E\r\n\t\t\u003C/div\u003E\r\n\t\t\u003Cdiv class=\u0022inner-top-border-wrapper\u0022 style=\u0022\r\n\t\t\tposition: absolute;\r\n    \t\ttop: -@(InnerLinesOffset)px;\r\n    \t\tleft: 50%;\r\n    \t\ttransform: translateX(-50%);\r\n\t\t\tdisplay:@(ShowInnerLines ? \u0022flex\u0022 : \u0022none\u0022);\r\n\t\t\tborder: @(Outline ? $\u0022{OutlineThickness}px solid rgba(0, 0, 0, {OutlineOpacity})\u0022 : \u0022none\u0022);\r\n\t\t\u0022\u003E\r\n\t\t\t\u003Cdiv class=\u0022inner-line top\u0022 style=\u0022\r\n\t\t\t\tbackground-color: rgba(@(Color.r * 255), @(Color.g * 255), @(Color.b * 255), @(InnerLineOpacity));\r\n\t\t\t\tpadding-left: @(InnerLineThickness)px;\r\n    \t\t\tpadding-top: @(InnerLineLenght)px;\r\n\t\t\t\u0022\u003E\u003C/div\u003E\r\n\t\t\u003C/div\u003E\r\n\t\t\u003Cdiv class=\u0022inner-bottom-border-wrapper\u0022 style=\u0022\r\n\t\t\tposition: absolute;\r\n    \t\tbottom: -@(InnerLinesOffset)px;\r\n    \t\tleft: 50%;\r\n    \t\ttransform: translateX(-50%);\r\n\t\t\tdisplay:@(ShowInnerLines ? \u0022flex\u0022 : \u0022none\u0022);\r\n\t\t\tborder: @(Outline ? $\u0022{OutlineThickness}px solid rgba(0, 0, 0, {OutlineOpacity})\u0022 : \u0022none\u0022);\r\n\t\t\u0022\u003E\r\n\t\t\t\u003Cdiv class=\u0022inner-line bottom\u0022 style=\u0022\r\n\t\t\t\tbackground-color: rgba(@(Color.r * 255), @(Color.g * 255), @(Color.b * 255), @(InnerLineOpacity));\r\n\t\t\t\tpadding-left: @(InnerLineThickness)px;\r\n    \t\t\tpadding-bottom: @(InnerLineLenght)px;\r\n\t\t\t\u0022\u003E\u003C/div\u003E\r\n\t\t\u003C/div\u003E\r\n\t\t\u003Cdiv class=\u0022inner-left-border-wrapper\u0022 style=\u0022\r\n\t\t\tposition: absolute;\r\n\t\t\tleft: -@(InnerLinesOffset)px;\r\n\t\t\ttop: 50%;\r\n\t\t\ttransform: translateY(-50%);\r\n\t\t\tdisplay:@(ShowInnerLines ? \u0022flex\u0022 : \u0022none\u0022);\r\n\t\t\tborder: @(Outline ? $\u0022{OutlineThickness}px solid rgba(0, 0, 0, {OutlineOpacity})\u0022 : \u0022none\u0022);\r\n\t\t\u0022\u003E\r\n\t\t\t\u003Cdiv class=\u0022inner-line left\u0022 style=\u0022\r\n\t\t\t\tbackground-color: rgba(@(Color.r * 255), @(Color.g * 255), @(Color.b * 255), @(InnerLineOpacity));\r\n\t\t\t\tpadding-top: @(InnerLineThickness)px;\r\n\t\t\t\tpadding-left: @(InnerLineLenght)px;\r\n\t\t\t\u0022\u003E\u003C/div\u003E\r\n\t\t\u003C/div\u003E\r\n\t\t\u003Cdiv class=\u0022inner-right-border-wrapper\u0022 style=\u0022\r\n\t\t\tposition: absolute;\r\n\t\t\tright: -@(InnerLinesOffset)px;\r\n\t\t\ttop: 50%;\r\n\t\t\ttransform: translateY(-50%);\r\n\t\t\tdisplay: @(ShowInnerLines ? \u0022flex\u0022 : \u0022none\u0022);\r\n\t\t\tborder: @(Outline ? $\u0022{OutlineThickness}px solid rgba(0, 0, 0, {OutlineOpacity})\u0022 : \u0022none\u0022);\r\n\t\t\u0022\u003E\r\n\t\t\t\u003Cdiv class=\u0022inner-line right\u0022 style=\u0022\r\n\t\t\t\tbackground-color: rgba(@(Color.r * 255), @(Color.g * 255), @(Color.b * 255), @(InnerLineOpacity));\r\n\t\t\t\tpadding-top: @(InnerLineThickness)px;\r\n\t\t\t\tpadding-right: @(InnerLineLenght)px;\r\n\t\t\t\u0022\u003E\u003C/div\u003E\r\n\t\t\u003C/div\u003E\r\n\t\t\u003Cdiv class=\u0022outer-top-border-wrapper\u0022 style=\u0022\r\n\t\t\tposition: absolute;\r\n\t\t\ttop: -@(OuterLineOffset)px;\r\n\t\t\tleft: 50%;\r\n\t\t\ttransform: translateX(-50%);\r\n\t\t\tdisplay: @(ShowOuterLines ? \u0022flex\u0022 : \u0022none\u0022);\r\n\t\t\tborder: @(Outline ? $\u0022{OutlineThickness}px solid rgba(0, 0, 0, {OutlineOpacity})\u0022 : \u0022none\u0022);\r\n\t\t\u0022\u003E\r\n\t\t\t\u003Cdiv class=\u0022outer-line top\u0022 style=\u0022\r\n\t\t\t\tbackground-color: rgba(@(Color.r * 255), @(Color.g * 255), @(Color.b * 255), @(OuterLineOpacity));\r\n\t\t\t\tpadding-left: @(OuterLineThickness)px;\r\n\t\t\t\tpadding-top: @(OuterLineLenght)px;\r\n\t\t\t\u0022\u003E\u003C/div\u003E\r\n\t\t\u003C/div\u003E\r\n\t\t\u003Cdiv class=\u0022outer-bottom-border-wrapper\u0022 style=\u0022\r\n\t\t\tposition: absolute;\r\n\t\t\tbottom: -@(OuterLineOffset)px;\r\n\t\t\tleft: 50%;\r\n\t\t\ttransform: translateX(-50%);\r\n\t\t\tdisplay: @(ShowOuterLines ? \u0022flex\u0022 : \u0022none\u0022);\r\n\t\t\tborder: @(Outline ? $\u0022{OutlineThickness}px solid rgba(0, 0, 0, {OutlineOpacity})\u0022 : \u0022none\u0022);\r\n\t\t\u0022\u003E\r\n\t\t\t\u003Cdiv class=\u0022outer-line bottom\u0022 style=\u0022\r\n\t\t\t\tbackground-color: rgba(@(Color.r * 255), @(Color.g * 255), @(Color.b * 255), @(OuterLineOpacity));\r\n\t\t\t\tpadding-left: @(OuterLineThickness)px;\r\n\t\t\t\tpadding-bottom: @(OuterLineLenght)px;\r\n\t\t\t\u0022\u003E\u003C/div\u003E\r\n\t\t\u003C/div\u003E\r\n\t\t\u003Cdiv class=\u0022outer-left-border-wrapper\u0022 style=\u0022\r\n\t\t\tposition: absolute;\r\n\t\t\tleft: -@(OuterLineOffset)px;\r\n\t\t\ttop: 50%;\r\n\t\t\ttransform: translateY(-50%);\r\n\t\t\tdisplay: @(ShowOuterLines ? \u0022flex\u0022 : \u0022none\u0022);\r\n\t\t\tborder: @(Outline ? $\u0022{OutlineThickness}px solid rgba(0, 0, 0, {OutlineOpacity})\u0022 : \u0022none\u0022);\r\n\t\t\u0022\u003E\r\n\t\t\t\u003Cdiv class=\u0022outer-line left\u0022 style=\u0022\r\n\t\t\t\tbackground-color: rgba(@(Color.r * 255), @(Color.g * 255), @(Color.b * 255), @(OuterLineOpacity));\r\n\t\t\t\tpadding-top: @(OuterLineThickness)px;\r\n\t\t\t\tpadding-left: @(OuterLineLenght)px;\r\n\t\t\t\u0022\u003E\u003C/div\u003E\r\n\t\t\u003C/div\u003E\r\n\t\t\u003Cdiv class=\u0022outer-right-border-wrapper\u0022 style=\u0022\r\n\t\t\tposition: absolute;\r\n\t\t\tright: -@(OuterLineOffset)px;\r\n\t\t\ttop: 50%;\r\n\t\t\ttransform: translateY(-50%);\r\n\t\t\tdisplay: @(ShowOuterLines ? \u0022flex\u0022 : \u0022none\u0022);\r\n\t\t\tborder: @(Outline ? $\u0022{OutlineThickness}px solid rgba(0, 0, 0, {OutlineOpacity})\u0022 : \u0022none\u0022);\r\n\t\t\u0022\u003E\r\n\t\t\t\u003Cdiv class=\u0022outer-line right\u0022 style=\u0022\r\n\t\t\t\tbackground-color: rgba(@(Color.r * 255), @(Color.g * 255), @(Color.b * 255), @(OuterLineOpacity));\r\n\t\t\t\tpadding-top: @(OuterLineThickness)px;\r\n\t\t\t\tpadding-right: @(OuterLineLenght)px;\r\n\t\t\t\u0022\u003E\u003C/div\u003E\r\n\t\t\u003C/div\u003E\r\n    \u003C/div\u003E\r\n\u003C/root\u003E\r\n\r\n@code\r\n{\r\n\t// Position properties\r\n\t[Property] \r\n\t[Category(\u0022Position\u0022)] public bool IsPercentage { get; set; } = true;\r\n\t[Property]\r\n\t[Category(\u0022Position\u0022)] public Vector2 Position { get; set; } = new Vector2(50, 50);\r\n\r\n\t// Crosshair properties\r\n\t[Property]\r\n\t[Category(\u0022Crosshair\u0022)] public Color Color { get; set; } = Color.FromRgb(0x2EFF00);\r\n\t[Property]\r\n\t[Category(\u0022Crosshair\u0022)] public bool Outline { get; set; } = true;\r\n\t[Property]\r\n\t[Range(0f, 1f, 0.001f)]\r\n\t[Category(\u0022Crosshair\u0022)] public float OutlineOpacity { get; set; } = 1f;\r\n\t[Property]\r\n\t[Range(1, 10, 1)]\r\n\t[Category(\u0022Crosshair\u0022)] public int OutlineThickness { get; set; } = 2;\r\n\t[Property]\r\n\t[Category(\u0022Crosshair\u0022)] public bool CenterDot { get; set; } = true;\r\n\t[Property]\r\n\t[Range(0f, 1f, 0.001f)]\r\n\t[Category(\u0022Crosshair\u0022)] public float CenterDotOpacity { get; set; } = 1f;\r\n\t[Property]\r\n\t[Range(1, 10, 1)]\r\n\t[Category(\u0022Crosshair\u0022)] public int CenterDotThickness { get; set; } = 1;\r\n\r\n\t// Inner Lines properties\r\n\t[Property]\r\n\t[Category(\u0022Inner Lines\u0022)] public bool ShowInnerLines { get; set; } = true;\r\n\t[Property]\r\n\t[Range(0f, 1f, 0.001f)]\r\n\t[Category(\u0022Inner Lines\u0022)] public float InnerLineOpacity { get; set; } = 1f;\r\n\t[Property]\r\n\t[Range(0, 20, 1)]\r\n\t[Category(\u0022Inner Lines\u0022)] public int InnerLineLenght { get; set; } = 10;\r\n\t[Property]\r\n\t[Range(0, 10, 1)]\r\n\t[Category(\u0022Inner Lines\u0022)] public int InnerLineThickness { get; set; } = 1;\r\n\t[Property]\r\n\t[Range(0, 20, 1)]\r\n\t[Category(\u0022Inner Lines\u0022)] public int InnerLinesOffset { get; set; } = 2;\r\n\r\n\t// Outer Lines properties\r\n\t[Property]\r\n\t[Category(\u0022Outer Lines\u0022)] public bool ShowOuterLines { get; set; } = false;\r\n\t[Property]\r\n\t[Range(0f, 1f, 0.001f)]\r\n\t[Category(\u0022Outer Lines\u0022)] public float OuterLineOpacity { get; set; } = 0.5f;\r\n\t[Property]\r\n\t[Range(0, 20, 1)]\r\n\t[Category(\u0022Outer Lines\u0022)] public int OuterLineLenght { get; set; }\r\n\t[Property]\r\n\t[Range(0, 10, 1)]\r\n\t[Category(\u0022Outer Lines\u0022)] public int OuterLineThickness { get; set; }\r\n\t[Property]\r\n\t[Range(0, 20, 1)]\r\n\t[Category(\u0022Outer Lines\u0022)] public int OuterLineOffset { get; set; }\r\n\r\n\t// Code properties\r\n\t[Property]\r\n\t[Category(\u0022Code\u0022)] public string Code { get; set; }\r\n\r\n\t// Member variables\r\n\tprivate string _cachedCode = null;\r\n\r\n\tpublic string EncodeCrosshairParameters()\r\n\t{\r\n\t\t// Convert boolean values to 1 or 0\r\n\t\tstring EncodeBool(bool value) =\u003E value ? \u00221\u0022 : \u00220\u0022;\r\n\t\t// Convert float values to a shortened string representation (up to 2 decimal places)\r\n\t\tstring EncodeFloat(float value) =\u003E Math.Round(value, 2).ToString(\u00220.##\u0022);\r\n\t\t// Convert integers directly to string\r\n\t\tstring EncodeInt(int value) =\u003E value.ToString();\r\n\r\n\t\t// Concatenate all parameters into a shortened format\r\n\t\tvar parameters = $\u0022{EncodeBool(IsPercentage)},\u0022 \u002B\r\n\t\t\t\t\t\t\t$\u0022{EncodeFloat(Position.x)},{EncodeFloat(Position.y)},\u0022 \u002B\r\n\t\t\t\t\t\t\t$\u0022{EncodeFloat(Color.r)},{EncodeFloat(Color.g)},{EncodeFloat(Color.b)},\u0022 \u002B\r\n\t\t\t\t\t\t\t$\u0022{EncodeBool(Outline)},{EncodeFloat(OutlineOpacity)},{EncodeInt(OutlineThickness)},\u0022 \u002B\r\n\t\t\t\t\t\t\t$\u0022{EncodeBool(CenterDot)},{EncodeFloat(CenterDotOpacity)},{EncodeInt(CenterDotThickness)},\u0022 \u002B\r\n\t\t\t\t\t\t\t$\u0022{EncodeBool(ShowInnerLines)},{EncodeFloat(InnerLineOpacity)},{EncodeInt(InnerLineLenght)},\u0022 \u002B\r\n\t\t\t\t\t\t\t$\u0022{EncodeInt(InnerLineThickness)},{EncodeInt(InnerLinesOffset)},\u0022 \u002B\r\n\t\t\t\t\t\t\t$\u0022{EncodeBool(ShowOuterLines)},{EncodeFloat(OuterLineOpacity)},{EncodeInt(OuterLineLenght)},\u0022 \u002B\r\n\t\t\t\t\t\t\t$\u0022{EncodeInt(OuterLineThickness)},{EncodeInt(OuterLineOffset)}\u0022;\r\n\t\treturn parameters;\r\n\t}\r\n\r\n\tpublic void DecodeCrosshairParameters(string encodedString)\r\n\t{\r\n\t\tvar parameters = encodedString.Split(\u0027,\u0027);\r\n\r\n\t\t// Convert \u00221\u0022 or \u00220\u0022 back to boolean\r\n\t\tbool DecodeBool(string value) =\u003E value == \u00221\u0022;\r\n\t\t// Convert string back to float\r\n\t\tfloat DecodeFloat(string value) =\u003E float.Parse(value);\r\n\t\t// Convert string back to int\r\n\t\tint DecodeInt(string value) =\u003E int.Parse(value);\r\n\r\n\t\t// Assign the decoded values back to the properties\r\n\t\tIsPercentage = DecodeBool(parameters[0]);\r\n\t\tPosition = new Vector2(DecodeFloat(parameters[1]), DecodeFloat(parameters[2]));\r\n\t\tColor = new Color(DecodeFloat(parameters[3]), DecodeFloat(parameters[4]), DecodeFloat(parameters[5]));\r\n\t\tOutline = DecodeBool(parameters[6]);\r\n\t\tOutlineOpacity = DecodeFloat(parameters[7]);\r\n\t\tOutlineThickness = DecodeInt(parameters[8]);\r\n\t\tCenterDot = DecodeBool(parameters[9]);\r\n\t\tCenterDotOpacity = DecodeFloat(parameters[10]);\r\n\t\tCenterDotThickness = DecodeInt(parameters[11]);\r\n\t\tShowInnerLines = DecodeBool(parameters[12]);\r\n\t\tInnerLineOpacity = DecodeFloat(parameters[13]);\r\n\t\tInnerLineLenght = DecodeInt(parameters[14]);\r\n\t\tInnerLineThickness = DecodeInt(parameters[15]);\r\n\t\tInnerLinesOffset = DecodeInt(parameters[16]);\r\n\t\tShowOuterLines = DecodeBool(parameters[17]);\r\n\t\tOuterLineOpacity = DecodeFloat(parameters[18]);\r\n\t\tOuterLineLenght = DecodeInt(parameters[19]);\r\n\t\tOuterLineThickness = DecodeInt(parameters[20]);\r\n\t\tOuterLineOffset = DecodeInt(parameters[21]);\r\n\t}\r\n\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tif (Code == null)\r\n\t\t{\r\n\t\t\tCode = EncodeCrosshairParameters();\r\n\t\t}\r\n\t\tDecodeCrosshairParameters(Code);\r\n\t\t_cachedCode = Code;\r\n\t}\r\n\r\n\tprotected override void OnUpdate()\r\n\t{\r\n\t\tif (Code != _cachedCode)\r\n\t\t{\r\n\t\t\tDecodeCrosshairParameters(Code);\r\n\t\t}\r\n\t\tCode = EncodeCrosshairParameters();\r\n\t\t_cachedCode = Code;\r\n\t}\r\n\r\n\t/// \u003Csummary\u003E\r\n\t/// the hash determines if the system should be rebuilt. If it changes, it will be rebuilt\r\n\t/// \u003C/summary\u003E\r\n\tprotected override int BuildHash()\r\n\t{\r\n\t\tvar positionHash = System.HashCode.Combine( \r\n\t\t\tIsPercentage,\r\n\t\t\tPosition\r\n\t\t);\r\n\r\n\t\tvar crosshairHash = System.HashCode.Combine( \r\n\t\t\tColor,\r\n\t\t\tOutline,\r\n\t\t\tOutlineOpacity,\r\n\t\t\tOutlineThickness,\r\n\t\t\tCenterDot,\r\n\t\t\tCenterDotOpacity,\r\n\t\t\tCenterDotThickness\r\n\t\t);\r\n\r\n\t\tvar innerLinesHash = System.HashCode.Combine(\r\n\t\t\tShowInnerLines,\r\n\t\t\tInnerLineOpacity,\r\n\t\t\tInnerLineLenght,\r\n\t\t\tInnerLineThickness,\r\n\t\t\tInnerLinesOffset\r\n\t\t);\r\n\r\n\t\tvar outerLinesHash = System.HashCode.Combine(\r\n\t\t\tShowOuterLines,\r\n\t\t\tOuterLineOpacity,\r\n\t\t\tOuterLineLenght,\r\n\t\t\tOuterLineThickness,\r\n\t\t\tOuterLineOffset\r\n\t\t);\r\n\r\n\t\tvar codeHash = Code.GetHashCode();\r\n\t\t\r\n\t\treturn System.HashCode.Combine(\r\n\t\t\tpositionHash,\r\n\t\t\tcrosshairHash,\r\n\t\t\tinnerLinesHash,\r\n\t\t\touterLinesHash,\r\n\t\t\tcodeHash\r\n\t\t);\r\n\t}\r\n}\r\n"},{"Ident":"notathreat.crosshairbuilder","Path":"CrosshairBuilder.razor","FileName":"CrosshairBuilder.razor","PackageType":"library","CodeKind":"Game","AssetVersionId":67301,"Code":"@using System;\r\n@using Sandbox;\r\n@using Sandbox.UI;\r\n@inherits PanelComponent\r\n\r\n\u003Croot\u003E\r\n    \u003Cdiv class=\u0022crosshair\u0022 style=\u0022\r\n\t\tposition: absolute;\r\n\t\tleft: @( IsPercentage ? $\u0022{Position.x}%\u0022  : Position.x );\r\n\t\ttop: @( IsPercentage ? $\u0022{Position.y}%\u0022 : Position.y );\r\n\t\ttransform: translate(-50%, -50%);\r\n\t\u0022\u003E\r\n\t\t\u003Cdiv class=\u0022center-dot-border-wrapper\u0022 style=\u0022\r\n\t\t\tdisplay: @(CenterDot ? \u0022flex\u0022 : \u0022none\u0022);\r\n\t\t\tborder: @(Outline ? $\u0022{OutlineThickness}px solid rgba(0, 0, 0, {OutlineOpacity})\u0022 : \u0022none\u0022);\r\n\t\t\tz-index: 100;\r\n\t\t\u0022\u003E\r\n\t\t\t\u003Cdiv class=\u0022center-dot\u0022 style=\u0022\r\n\t\t\t\tbackground-color: rgba(@(Color.r * 255), @(Color.g * 255), @(Color.b * 255), @(CenterDotOpacity));\r\n\t\t\t\tpadding: @(CenterDotThickness)px;\r\n\t\t\t\u0022\u003E\u003C/div\u003E\r\n\t\t\u003C/div\u003E\r\n\t\t\u003Cdiv class=\u0022inner-top-border-wrapper\u0022 style=\u0022\r\n\t\t\tposition: absolute;\r\n    \t\ttop: -@(InnerLinesOffset)px;\r\n    \t\tleft: 50%;\r\n    \t\ttransform: translateX(-50%);\r\n\t\t\tdisplay:@(ShowInnerLines ? \u0022flex\u0022 : \u0022none\u0022);\r\n\t\t\tborder: @(Outline ? $\u0022{OutlineThickness}px solid rgba(0, 0, 0, {OutlineOpacity})\u0022 : \u0022none\u0022);\r\n\t\t\u0022\u003E\r\n\t\t\t\u003Cdiv class=\u0022inner-line top\u0022 style=\u0022\r\n\t\t\t\tbackground-color: rgba(@(Color.r * 255), @(Color.g * 255), @(Color.b * 255), @(InnerLineOpacity));\r\n\t\t\t\tpadding-left: @(InnerLineThickness)px;\r\n    \t\t\tpadding-top: @(InnerLineLenght)px;\r\n\t\t\t\u0022\u003E\u003C/div\u003E\r\n\t\t\u003C/div\u003E\r\n\t\t\u003Cdiv class=\u0022inner-bottom-border-wrapper\u0022 style=\u0022\r\n\t\t\tposition: absolute;\r\n    \t\tbottom: -@(InnerLinesOffset)px;\r\n    \t\tleft: 50%;\r\n    \t\ttransform: translateX(-50%);\r\n\t\t\tdisplay:@(ShowInnerLines ? \u0022flex\u0022 : \u0022none\u0022);\r\n\t\t\tborder: @(Outline ? $\u0022{OutlineThickness}px solid rgba(0, 0, 0, {OutlineOpacity})\u0022 : \u0022none\u0022);\r\n\t\t\u0022\u003E\r\n\t\t\t\u003Cdiv class=\u0022inner-line bottom\u0022 style=\u0022\r\n\t\t\t\tbackground-color: rgba(@(Color.r * 255), @(Color.g * 255), @(Color.b * 255), @(InnerLineOpacity));\r\n\t\t\t\tpadding-left: @(InnerLineThickness)px;\r\n    \t\t\tpadding-bottom: @(InnerLineLenght)px;\r\n\t\t\t\u0022\u003E\u003C/div\u003E\r\n\t\t\u003C/div\u003E\r\n\t\t\u003Cdiv class=\u0022inner-left-border-wrapper\u0022 style=\u0022\r\n\t\t\tposition: absolute;\r\n\t\t\tleft: -@(InnerLinesOffset)px;\r\n\t\t\ttop: 50%;\r\n\t\t\ttransform: translateY(-50%);\r\n\t\t\tdisplay:@(ShowInnerLines ? \u0022flex\u0022 : \u0022none\u0022);\r\n\t\t\tborder: @(Outline ? $\u0022{OutlineThickness}px solid rgba(0, 0, 0, {OutlineOpacity})\u0022 : \u0022none\u0022);\r\n\t\t\u0022\u003E\r\n\t\t\t\u003Cdiv class=\u0022inner-line left\u0022 style=\u0022\r\n\t\t\t\tbackground-color: rgba(@(Color.r * 255), @(Color.g * 255), @(Color.b * 255), @(InnerLineOpacity));\r\n\t\t\t\tpadding-top: @(InnerLineThickness)px;\r\n\t\t\t\tpadding-left: @(InnerLineLenght)px;\r\n\t\t\t\u0022\u003E\u003C/div\u003E\r\n\t\t\u003C/div\u003E\r\n\t\t\u003Cdiv class=\u0022inner-right-border-wrapper\u0022 style=\u0022\r\n\t\t\tposition: absolute;\r\n\t\t\tright: -@(InnerLinesOffset)px;\r\n\t\t\ttop: 50%;\r\n\t\t\ttransform: translateY(-50%);\r\n\t\t\tdisplay: @(ShowInnerLines ? \u0022flex\u0022 : \u0022none\u0022);\r\n\t\t\tborder: @(Outline ? $\u0022{OutlineThickness}px solid rgba(0, 0, 0, {OutlineOpacity})\u0022 : \u0022none\u0022);\r\n\t\t\u0022\u003E\r\n\t\t\t\u003Cdiv class=\u0022inner-line right\u0022 style=\u0022\r\n\t\t\t\tbackground-color: rgba(@(Color.r * 255), @(Color.g * 255), @(Color.b * 255), @(InnerLineOpacity));\r\n\t\t\t\tpadding-top: @(InnerLineThickness)px;\r\n\t\t\t\tpadding-right: @(InnerLineLenght)px;\r\n\t\t\t\u0022\u003E\u003C/div\u003E\r\n\t\t\u003C/div\u003E\r\n\t\t\u003Cdiv class=\u0022outer-top-border-wrapper\u0022 style=\u0022\r\n\t\t\tposition: absolute;\r\n\t\t\ttop: -@(OuterLineOffset)px;\r\n\t\t\tleft: 50%;\r\n\t\t\ttransform: translateX(-50%);\r\n\t\t\tdisplay: @(ShowOuterLines ? \u0022flex\u0022 : \u0022none\u0022);\r\n\t\t\tborder: @(Outline ? $\u0022{OutlineThickness}px solid rgba(0, 0, 0, {OutlineOpacity})\u0022 : \u0022none\u0022);\r\n\t\t\u0022\u003E\r\n\t\t\t\u003Cdiv class=\u0022outer-line top\u0022 style=\u0022\r\n\t\t\t\tbackground-color: rgba(@(Color.r * 255), @(Color.g * 255), @(Color.b * 255), @(OuterLineOpacity));\r\n\t\t\t\tpadding-left: @(OuterLineThickness)px;\r\n\t\t\t\tpadding-top: @(OuterLineLenght)px;\r\n\t\t\t\u0022\u003E\u003C/div\u003E\r\n\t\t\u003C/div\u003E\r\n\t\t\u003Cdiv class=\u0022outer-bottom-border-wrapper\u0022 style=\u0022\r\n\t\t\tposition: absolute;\r\n\t\t\tbottom: -@(OuterLineOffset)px;\r\n\t\t\tleft: 50%;\r\n\t\t\ttransform: translateX(-50%);\r\n\t\t\tdisplay: @(ShowOuterLines ? \u0022flex\u0022 : \u0022none\u0022);\r\n\t\t\tborder: @(Outline ? $\u0022{OutlineThickness}px solid rgba(0, 0, 0, {OutlineOpacity})\u0022 : \u0022none\u0022);\r\n\t\t\u0022\u003E\r\n\t\t\t\u003Cdiv class=\u0022outer-line bottom\u0022 style=\u0022\r\n\t\t\t\tbackground-color: rgba(@(Color.r * 255), @(Color.g * 255), @(Color.b * 255), @(OuterLineOpacity));\r\n\t\t\t\tpadding-left: @(OuterLineThickness)px;\r\n\t\t\t\tpadding-bottom: @(OuterLineLenght)px;\r\n\t\t\t\u0022\u003E\u003C/div\u003E\r\n\t\t\u003C/div\u003E\r\n\t\t\u003Cdiv class=\u0022outer-left-border-wrapper\u0022 style=\u0022\r\n\t\t\tposition: absolute;\r\n\t\t\tleft: -@(OuterLineOffset)px;\r\n\t\t\ttop: 50%;\r\n\t\t\ttransform: translateY(-50%);\r\n\t\t\tdisplay: @(ShowOuterLines ? \u0022flex\u0022 : \u0022none\u0022);\r\n\t\t\tborder: @(Outline ? $\u0022{OutlineThickness}px solid rgba(0, 0, 0, {OutlineOpacity})\u0022 : \u0022none\u0022);\r\n\t\t\u0022\u003E\r\n\t\t\t\u003Cdiv class=\u0022outer-line left\u0022 style=\u0022\r\n\t\t\t\tbackground-color: rgba(@(Color.r * 255), @(Color.g * 255), @(Color.b * 255), @(OuterLineOpacity));\r\n\t\t\t\tpadding-top: @(OuterLineThickness)px;\r\n\t\t\t\tpadding-left: @(OuterLineLenght)px;\r\n\t\t\t\u0022\u003E\u003C/div\u003E\r\n\t\t\u003C/div\u003E\r\n\t\t\u003Cdiv class=\u0022outer-right-border-wrapper\u0022 style=\u0022\r\n\t\t\tposition: absolute;\r\n\t\t\tright: -@(OuterLineOffset)px;\r\n\t\t\ttop: 50%;\r\n\t\t\ttransform: translateY(-50%);\r\n\t\t\tdisplay: @(ShowOuterLines ? \u0022flex\u0022 : \u0022none\u0022);\r\n\t\t\tborder: @(Outline ? $\u0022{OutlineThickness}px solid rgba(0, 0, 0, {OutlineOpacity})\u0022 : \u0022none\u0022);\r\n\t\t\u0022\u003E\r\n\t\t\t\u003Cdiv class=\u0022outer-line right\u0022 style=\u0022\r\n\t\t\t\tbackground-color: rgba(@(Color.r * 255), @(Color.g * 255), @(Color.b * 255), @(OuterLineOpacity));\r\n\t\t\t\tpadding-top: @(OuterLineThickness)px;\r\n\t\t\t\tpadding-right: @(OuterLineLenght)px;\r\n\t\t\t\u0022\u003E\u003C/div\u003E\r\n\t\t\u003C/div\u003E\r\n    \u003C/div\u003E\r\n\u003C/root\u003E\r\n\r\n@code\r\n{\r\n\t// Position properties\r\n\t[Property] \r\n\t[Category(\u0022Position\u0022)] public bool IsPercentage { get; set; } = true;\r\n\t[Property]\r\n\t[Category(\u0022Position\u0022)] public Vector2 Position { get; set; } = new Vector2(50, 50);\r\n\r\n\t// Crosshair properties\r\n\t[Property]\r\n\t[Category(\u0022Crosshair\u0022)] public Color Color { get; set; } = Color.FromRgb(0x2EFF00);\r\n\t[Property]\r\n\t[Category(\u0022Crosshair\u0022)] public bool Outline { get; set; } = true;\r\n\t[Property]\r\n\t[Range(0f, 1f, 0.001f)]\r\n\t[Category(\u0022Crosshair\u0022)] public float OutlineOpacity { get; set; } = 1f;\r\n\t[Property]\r\n\t[Range(1, 10, 1)]\r\n\t[Category(\u0022Crosshair\u0022)] public int OutlineThickness { get; set; } = 2;\r\n\t[Property]\r\n\t[Category(\u0022Crosshair\u0022)] public bool CenterDot { get; set; } = true;\r\n\t[Property]\r\n\t[Range(0f, 1f, 0.001f)]\r\n\t[Category(\u0022Crosshair\u0022)] public float CenterDotOpacity { get; set; } = 1f;\r\n\t[Property]\r\n\t[Range(1, 10, 1)]\r\n\t[Category(\u0022Crosshair\u0022)] public int CenterDotThickness { get; set; } = 1;\r\n\r\n\t// Inner Lines properties\r\n\t[Property]\r\n\t[Category(\u0022Inner Lines\u0022)] public bool ShowInnerLines { get; set; } = true;\r\n\t[Property]\r\n\t[Range(0f, 1f, 0.001f)]\r\n\t[Category(\u0022Inner Lines\u0022)] public float InnerLineOpacity { get; set; } = 1f;\r\n\t[Property]\r\n\t[Range(0, 20, 1)]\r\n\t[Category(\u0022Inner Lines\u0022)] public int InnerLineLenght { get; set; } = 10;\r\n\t[Property]\r\n\t[Range(0, 10, 1)]\r\n\t[Category(\u0022Inner Lines\u0022)] public int InnerLineThickness { get; set; } = 1;\r\n\t[Property]\r\n\t[Range(0, 20, 1)]\r\n\t[Category(\u0022Inner Lines\u0022)] public int InnerLinesOffset { get; set; } = 2;\r\n\r\n\t// Outer Lines properties\r\n\t[Property]\r\n\t[Category(\u0022Outer Lines\u0022)] public bool ShowOuterLines { get; set; } = false;\r\n\t[Property]\r\n\t[Range(0f, 1f, 0.001f)]\r\n\t[Category(\u0022Outer Lines\u0022)] public float OuterLineOpacity { get; set; } = 0.5f;\r\n\t[Property]\r\n\t[Range(0, 20, 1)]\r\n\t[Category(\u0022Outer Lines\u0022)] public int OuterLineLenght { get; set; }\r\n\t[Property]\r\n\t[Range(0, 10, 1)]\r\n\t[Category(\u0022Outer Lines\u0022)] public int OuterLineThickness { get; set; }\r\n\t[Property]\r\n\t[Range(0, 20, 1)]\r\n\t[Category(\u0022Outer Lines\u0022)] public int OuterLineOffset { get; set; }\r\n\r\n\t// Code properties\r\n\t[Property]\r\n\t[Category(\u0022Code\u0022)] public string Code { get; set; }\r\n\r\n\t// Member variables\r\n\tprivate string _cachedCode = null;\r\n\r\n\tpublic string EncodeCrosshairParameters()\r\n\t{\r\n\t\t// Convert boolean values to 1 or 0\r\n\t\tstring EncodeBool(bool value) =\u003E value ? \u00221\u0022 : \u00220\u0022;\r\n\t\t// Convert float values to a shortened string representation (up to 2 decimal places)\r\n\t\tstring EncodeFloat(float value) =\u003E Math.Round(value, 2).ToString(\u00220.##\u0022);\r\n\t\t// Convert integers directly to string\r\n\t\tstring EncodeInt(int value) =\u003E value.ToString();\r\n\r\n\t\t// Concatenate all parameters into a shortened format\r\n\t\tvar parameters = $\u0022{EncodeBool(IsPercentage)},\u0022 \u002B\r\n\t\t\t\t\t\t\t$\u0022{EncodeFloat(Position.x)},{EncodeFloat(Position.y)},\u0022 \u002B\r\n\t\t\t\t\t\t\t$\u0022{EncodeFloat(Color.r)},{EncodeFloat(Color.g)},{EncodeFloat(Color.b)},\u0022 \u002B\r\n\t\t\t\t\t\t\t$\u0022{EncodeBool(Outline)},{EncodeFloat(OutlineOpacity)},{EncodeInt(OutlineThickness)},\u0022 \u002B\r\n\t\t\t\t\t\t\t$\u0022{EncodeBool(CenterDot)},{EncodeFloat(CenterDotOpacity)},{EncodeInt(CenterDotThickness)},\u0022 \u002B\r\n\t\t\t\t\t\t\t$\u0022{EncodeBool(ShowInnerLines)},{EncodeFloat(InnerLineOpacity)},{EncodeInt(InnerLineLenght)},\u0022 \u002B\r\n\t\t\t\t\t\t\t$\u0022{EncodeInt(InnerLineThickness)},{EncodeInt(InnerLinesOffset)},\u0022 \u002B\r\n\t\t\t\t\t\t\t$\u0022{EncodeBool(ShowOuterLines)},{EncodeFloat(OuterLineOpacity)},{EncodeInt(OuterLineLenght)},\u0022 \u002B\r\n\t\t\t\t\t\t\t$\u0022{EncodeInt(OuterLineThickness)},{EncodeInt(OuterLineOffset)}\u0022;\r\n\t\treturn parameters;\r\n\t}\r\n\r\n\tpublic void DecodeCrosshairParameters(string encodedString)\r\n\t{\r\n\t\tvar parameters = encodedString.Split(\u0027,\u0027);\r\n\r\n\t\t// Convert \u00221\u0022 or \u00220\u0022 back to boolean\r\n\t\tbool DecodeBool(string value) =\u003E value == \u00221\u0022;\r\n\t\t// Convert string back to float\r\n\t\tfloat DecodeFloat(string value) =\u003E float.Parse(value);\r\n\t\t// Convert string back to int\r\n\t\tint DecodeInt(string value) =\u003E int.Parse(value);\r\n\r\n\t\t// Assign the decoded values back to the properties\r\n\t\tIsPercentage = DecodeBool(parameters[0]);\r\n\t\tPosition = new Vector2(DecodeFloat(parameters[1]), DecodeFloat(parameters[2]));\r\n\t\tColor = new Color(DecodeFloat(parameters[3]), DecodeFloat(parameters[4]), DecodeFloat(parameters[5]));\r\n\t\tOutline = DecodeBool(parameters[6]);\r\n\t\tOutlineOpacity = DecodeFloat(parameters[7]);\r\n\t\tOutlineThickness = DecodeInt(parameters[8]);\r\n\t\tCenterDot = DecodeBool(parameters[9]);\r\n\t\tCenterDotOpacity = DecodeFloat(parameters[10]);\r\n\t\tCenterDotThickness = DecodeInt(parameters[11]);\r\n\t\tShowInnerLines = DecodeBool(parameters[12]);\r\n\t\tInnerLineOpacity = DecodeFloat(parameters[13]);\r\n\t\tInnerLineLenght = DecodeInt(parameters[14]);\r\n\t\tInnerLineThickness = DecodeInt(parameters[15]);\r\n\t\tInnerLinesOffset = DecodeInt(parameters[16]);\r\n\t\tShowOuterLines = DecodeBool(parameters[17]);\r\n\t\tOuterLineOpacity = DecodeFloat(parameters[18]);\r\n\t\tOuterLineLenght = DecodeInt(parameters[19]);\r\n\t\tOuterLineThickness = DecodeInt(parameters[20]);\r\n\t\tOuterLineOffset = DecodeInt(parameters[21]);\r\n\t}\r\n\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tif (Code == null)\r\n\t\t{\r\n\t\t\tCode = EncodeCrosshairParameters();\r\n\t\t}\r\n\t\tDecodeCrosshairParameters(Code);\r\n\t\t_cachedCode = Code;\r\n\t}\r\n\r\n\tprotected override void OnUpdate()\r\n\t{\r\n\t\tif (Code != _cachedCode)\r\n\t\t{\r\n\t\t\tDecodeCrosshairParameters(Code);\r\n\t\t}\r\n\t\tCode = EncodeCrosshairParameters();\r\n\t\t_cachedCode = Code;\r\n\t}\r\n\r\n\t/// \u003Csummary\u003E\r\n\t/// the hash determines if the system should be rebuilt. If it changes, it will be rebuilt\r\n\t/// \u003C/summary\u003E\r\n\tprotected override int BuildHash()\r\n\t{\r\n\t\tvar positionHash = System.HashCode.Combine( \r\n\t\t\tIsPercentage,\r\n\t\t\tPosition\r\n\t\t);\r\n\r\n\t\tvar crosshairHash = System.HashCode.Combine( \r\n\t\t\tColor,\r\n\t\t\tOutline,\r\n\t\t\tOutlineOpacity,\r\n\t\t\tOutlineThickness,\r\n\t\t\tCenterDot,\r\n\t\t\tCenterDotOpacity,\r\n\t\t\tCenterDotThickness\r\n\t\t);\r\n\r\n\t\tvar innerLinesHash = System.HashCode.Combine(\r\n\t\t\tShowInnerLines,\r\n\t\t\tInnerLineOpacity,\r\n\t\t\tInnerLineLenght,\r\n\t\t\tInnerLineThickness,\r\n\t\t\tInnerLinesOffset\r\n\t\t);\r\n\r\n\t\tvar outerLinesHash = System.HashCode.Combine(\r\n\t\t\tShowOuterLines,\r\n\t\t\tOuterLineOpacity,\r\n\t\t\tOuterLineLenght,\r\n\t\t\tOuterLineThickness,\r\n\t\t\tOuterLineOffset\r\n\t\t);\r\n\r\n\t\tvar codeHash = Code.GetHashCode();\r\n\t\t\r\n\t\treturn System.HashCode.Combine(\r\n\t\t\tpositionHash,\r\n\t\t\tcrosshairHash,\r\n\t\t\tinnerLinesHash,\r\n\t\t\touterLinesHash,\r\n\t\t\tcodeHash\r\n\t\t);\r\n\t}\r\n}\r\n"},{"Ident":"notathreat.crosshairbuilder","Path":"UnitTests/LibraryTest.cs","FileName":"LibraryTest.cs","PackageType":"library","CodeKind":"UnitTest","AssetVersionId":67301,"Code":"using Sandbox;\r\n\r\n[TestClass]\r\npublic partial class LibraryTests\r\n{\r\n\t[TestMethod]\r\n\tpublic void SceneTest()\r\n\t{\r\n\t\tvar scene = new Scene();\r\n\t\tusing ( scene.Push() )\r\n\t\t{\r\n\t\t\tvar go = new GameObject();\r\n\r\n\t\t\tAssert.AreEqual( 1, scene.Directory.GameObjectCount );\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"},{"Ident":"notathreat.crosshairbuilder","Path":"__gen_RazorNamespace.cs","FileName":"__gen_RazorNamespace.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":67301,"Code":"global using Microsoft.AspNetCore.Components; \nglobal using Microsoft.AspNetCore.Components.Rendering;\n"},{"Ident":"notathreat.crosshairbuilder","Path":".obj/__compiler_extra.cs","FileName":"__compiler_extra.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":67301,"Code":"global using static Sandbox.Internal.GlobalGameNamespace;\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022AddonTitle\u0022, \u0022CrosshairBuilder\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022AddonIdent\u0022, \u0022crosshairbuilder\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022OrgIdent\u0022, \u0022notathreat\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022Ident\u0022, \u0022notathreat.crosshairbuilder\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022CompileTime\u0022, \u00228/19/2024 3:47:41 PM\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022EngineVersion\u0022, \u002217\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022EngineMinorVersion\u0022, \u00221\u0022 )]\r\n\r\n[assembly: System.Runtime.Versioning.TargetFramework( \u0022.NETCoreApp,Version=v7.0\u0022, FrameworkDisplayName = \u0022.NET 7.0\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyVersion(\u00220.0.121.0\u0022)]\r\n[assembly: global::System.Reflection.AssemblyFileVersion(\u00220.0.121.0\u0022)]"},{"Ident":"notathreat.crosshairbuilder","Path":"UnitTests/UnitTest.cs","FileName":"UnitTest.cs","PackageType":"library","CodeKind":"UnitTest","AssetVersionId":67301,"Code":"global using Microsoft.VisualStudio.TestTools.UnitTesting;\r\n\r\n[TestClass]\r\npublic class TestInit\r\n{\r\n\t[AssemblyInitialize]\r\n\tpublic static void ClassInitialize( TestContext context )\r\n\t{\r\n\t\tSandbox.Application.InitUnitTest();\r\n\t}\r\n}\r\n"}]}