diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9491a2f --- /dev/null +++ b/.gitignore @@ -0,0 +1,363 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Oo]ut/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd \ No newline at end of file diff --git a/AutoTrackR2.sln b/AutoTrackR2.sln new file mode 100644 index 0000000..c4b5916 --- /dev/null +++ b/AutoTrackR2.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.12.35521.163 d17.12 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutoTrackR2", "AutoTrackR2\AutoTrackR2.csproj", "{31093634-8FBB-4BC6-BEA4-DAD6C11404F3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {31093634-8FBB-4BC6-BEA4-DAD6C11404F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {31093634-8FBB-4BC6-BEA4-DAD6C11404F3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {31093634-8FBB-4BC6-BEA4-DAD6C11404F3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {31093634-8FBB-4BC6-BEA4-DAD6C11404F3}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/AutoTrackR2/App.xaml b/AutoTrackR2/App.xaml new file mode 100644 index 0000000..a94f622 --- /dev/null +++ b/AutoTrackR2/App.xaml @@ -0,0 +1,362 @@ +<Application x:Class="AutoTrackR2.App" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:local="clr-namespace:AutoTrackR2" + StartupUri="MainWindow.xaml"> + <Application.Resources> + <FontFamily x:Key="Orbitron">/AutoTrackR2;component/Fonts/Orbitron-Bold.ttf#Orbitron</FontFamily> + <FontFamily x:Key="Roboto">/AutoTrackR2;component/Fonts/Roboto-Regular.ttf#Roboto</FontFamily> + + <FontFamily x:Key="DynamicFont">"{}"</FontFamily> + + <!-- Default theme --> + <Color x:Key="AccentColor">#00A9E0</Color> + <Color x:Key="BackgroundDarkColor">#0F1A2B</Color> + <Color x:Key="BackgroundLightColor">#1D2D44</Color> + <Color x:Key="TextColor">#FFFFFF</Color> + + <SolidColorBrush x:Key="TextBrush" Color="{DynamicResource TextColor}" /> + <SolidColorBrush x:Key="AccentBrush" Color="{DynamicResource AccentColor}" /> + <SolidColorBrush x:Key="BackgroundDarkBrush" Color="{DynamicResource BackgroundDarkColor}" /> + <SolidColorBrush x:Key="BackgroundLightBrush" Color="{DynamicResource BackgroundLightColor}" /> + + <!-- Define the Style for Window --> + <Style TargetType="Window" x:Key="CustomWindowStyle"> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="Window"> + <Border BorderBrush="{DynamicResource AccentBrush}" BorderThickness="2" CornerRadius="10" Background="{DynamicResource BackgroundLightBrush}"> + <Grid> + <ContentPresenter HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> + </Grid> + </Border> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> + + <!-- Tab Button Style --> + <Style x:Key="TabButtonStyle" TargetType="Button"> + <Setter Property="Foreground" Value="{DynamicResource TextBrush}"/> + <Setter Property="Background" Value="{DynamicResource BackgroundDarkBrush}"/> + <Setter Property="BorderBrush" Value="{DynamicResource AccentBrush}"/> + <Setter Property="BorderThickness" Value="2"/> + <Setter Property="Cursor" Value="Hand"/> + <Setter Property="Padding" Value="10"/> + <Setter Property="Margin" Value="5"/> + <Setter Property="FontFamily" Value="{StaticResource Orbitron}"/> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="Button"> + <Border Background="{DynamicResource BackgroundDarkBrush}" BorderBrush="{DynamicResource AccentBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="5"> + <!-- ContentPresenter will automatically inherit Foreground from Button --> + <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> + </Border> + </ControlTemplate> + </Setter.Value> + </Setter> + + </Style> + + + <!-- General Button Style --> + <Style x:Key="DisabledButtonStyle" TargetType="Button"> + <Setter Property="Foreground" Value="Gray"/> + <Setter Property="Background" Value="{DynamicResource BackgroundDarkBrush}"/> + <Setter Property="BorderBrush" Value="Gray"/> + <Setter Property="BorderThickness" Value="2"/> + <Setter Property="FontWeight" Value="Bold"/> + <Setter Property="Cursor" Value="Hand"/> + <Setter Property="Padding" Value="5"/> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="Button"> + <Border Background="{DynamicResource BackgroundDarkBrush}" BorderBrush="{DynamicResource AccentBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="5"> + <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> + </Border> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> + + <Style x:Key="ButtonStyle" TargetType="Button"> + <Setter Property="Foreground" Value="{DynamicResource TextBrush}"/> + <Setter Property="Background" Value="{DynamicResource BackgroundDarkBrush}"/> + <Setter Property="BorderBrush" Value="{DynamicResource AccentBrush}"/> + <Setter Property="BorderThickness" Value="2"/> + <Setter Property="FontWeight" Value="Bold"/> + <Setter Property="Cursor" Value="Hand"/> + <Setter Property="Padding" Value="5"/> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="Button"> + <Border Background="{DynamicResource BackgroundDarkBrush}" BorderBrush="{DynamicResource AccentBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="5"> + <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> + </Border> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> + + <!-- Title Bar Button Style --> + <Style x:Key="TitleButtonStyle" TargetType="Button"> + <Setter Property="Foreground" Value="{DynamicResource TextBrush}"/> + <Setter Property="Background" Value="{DynamicResource BackgroundDarkBrush}"/> + <Setter Property="BorderBrush" Value="{DynamicResource AccentBrush}"/> + <Setter Property="BorderThickness" Value="2"/> + <Setter Property="FontWeight" Value="Bold"/> + <Setter Property="Cursor" Value="Hand"/> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="Button"> + <Border Background="{DynamicResource BackgroundDarkBrush}" + BorderBrush="{DynamicResource AccentBrush}" + BorderThickness="2" + CornerRadius="5" + Margin="0,1,4,1"> + <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> + </Border> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> + + <!-- Custom Style for Rounded TextBox --> + <Style x:Key="RoundedTextBox" TargetType="TextBox"> + <Setter Property="Foreground" Value="{DynamicResource TextBrush}"/> + <Setter Property="Background" Value="{DynamicResource BackgroundDarkBrush}"/> + <Setter Property="BorderBrush" Value="{DynamicResource AccentBrush}"/> + <Setter Property="FontFamily" Value="{StaticResource Roboto}"/> + <Setter Property="Height" Value="30"/> + <Setter Property="Padding" Value="5"/> + <Setter Property="VerticalContentAlignment" Value="Center"/> + <Setter Property="HorizontalAlignment" Value="Stretch"/> + <Setter Property="BorderBrush" Value="{DynamicResource AccentBrush}"/> + <Setter Property="BorderThickness" Value="2"/> + <!-- The actual border with rounded corners --> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="TextBox"> + <Border Background="{DynamicResource BackgroundDarkBrush}" + BorderBrush="{DynamicResource AccentBrush}" + BorderThickness="{TemplateBinding BorderThickness}" + CornerRadius="5"> + <ScrollViewer x:Name="PART_ContentHost"/> + </Border> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> + + <!-- Custom Style for Slider --> + <Style x:Key="ThreePositionSlider" TargetType="Slider"> + <Setter Property="Height" Value="40" /> + <Setter Property="Width" Value="160" /> + <Setter Property="Foreground" Value="{DynamicResource TextBrush}" /> + <Setter Property="Background" Value="{DynamicResource BackgroundDarkBrush}" /> + <Setter Property="BorderBrush" Value="{DynamicResource AccentBrush}" /> + <Setter Property="BorderThickness" Value="2" /> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="Slider"> + <Grid Width="120" Height="30" HorizontalAlignment="Left" Margin="58,-6,0,0"> + <!-- Track Background --> + <Border Background="{DynamicResource BackgroundDarkBrush}" BorderBrush="{DynamicResource AccentBrush}" BorderThickness="2" CornerRadius="15" Margin="0,0,-5,-4" /> + + <!-- Track --> + <Track x:Name="PART_Track"> + <Track.Thumb> + <Thumb x:Name="PART_Thumb" + Width="22" + Height="22" + Margin="6,4,1,0"> + <Thumb.Template> + <ControlTemplate TargetType="Thumb"> + <Ellipse Fill="{DynamicResource AccentBrush}" /> + </ControlTemplate> + </Thumb.Template> + </Thumb> + </Track.Thumb> + <Track.DecreaseRepeatButton> + <RepeatButton Background="Transparent" BorderBrush="Transparent" IsHitTestVisible="False"/> + </Track.DecreaseRepeatButton> + <Track.IncreaseRepeatButton> + <RepeatButton Background="Transparent" BorderBrush="Transparent" IsHitTestVisible="False"/> + </Track.IncreaseRepeatButton> + </Track> + </Grid> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> + + <!-- Toggle Slider Style --> + <Style x:Key="ToggleSliderStyle" TargetType="Slider"> + <Setter Property="Height" Value="40" /> + <Setter Property="Width" Value="160" /> + <Setter Property="Foreground" Value="{DynamicResource TextBrush}" /> + <Setter Property="Background" Value="{DynamicResource BackgroundDarkBrush}" /> + <Setter Property="BorderBrush" Value="{DynamicResource AccentBrush}" /> + <Setter Property="BorderThickness" Value="2" /> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="Slider"> + <Grid Width="50" Height="30" HorizontalAlignment="Left" > + <!-- Track Background --> + <Border Background="{DynamicResource BackgroundDarkBrush}" BorderBrush="{DynamicResource AccentBrush}" BorderThickness="2" CornerRadius="15" Margin="0,0,-5,-4" /> + + <!-- Track --> + <Track x:Name="PART_Track"> + <Track.Thumb> + <Thumb x:Name="PART_Thumb" + Width="22" + Height="22" + Margin="6,4,1,0"> + <Thumb.Template> + <ControlTemplate TargetType="Thumb"> + <Ellipse Fill="{DynamicResource AccentBrush}" /> + </ControlTemplate> + </Thumb.Template> + </Thumb> + </Track.Thumb> + <Track.DecreaseRepeatButton> + <RepeatButton Background="Transparent" BorderBrush="Transparent" IsHitTestVisible="False"/> + </Track.DecreaseRepeatButton> + <Track.IncreaseRepeatButton> + <RepeatButton Background="Transparent" BorderBrush="Transparent" IsHitTestVisible="False"/> + </Track.IncreaseRepeatButton> + </Track> + </Grid> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> + + <!-- False toggle theme --> + <Style x:Key="FalseToggleStyle" TargetType="Slider"> + <Setter Property="Height" Value="40" /> + <Setter Property="Width" Value="160" /> + <Setter Property="Foreground" Value="{DynamicResource TextBrush}" /> + <Setter Property="Background" Value="{DynamicResource BackgroundDarkBrush}" /> + <Setter Property="BorderBrush" Value="Gray" /> + <Setter Property="BorderThickness" Value="2" /> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="Slider"> + <Grid Width="50" Height="30" HorizontalAlignment="Left" > + <!-- Track Background --> + <Border Background="{DynamicResource BackgroundDarkBrush}" BorderBrush="{DynamicResource AccentBrush}" BorderThickness="2" CornerRadius="15" Margin="0,0,-5,-4" /> + + <!-- Track --> + <Track x:Name="PART_Track"> + <Track.Thumb> + <Thumb x:Name="PART_Thumb" + Width="22" + Height="22" + Margin="6,4,1,0"> + <Thumb.Template> + <ControlTemplate TargetType="Thumb"> + <Ellipse Fill="Gray" /> + </ControlTemplate> + </Thumb.Template> + </Thumb> + </Track.Thumb> + <Track.DecreaseRepeatButton> + <RepeatButton Background="Transparent" BorderBrush="Transparent" IsHitTestVisible="False"/> + </Track.DecreaseRepeatButton> + <Track.IncreaseRepeatButton> + <RepeatButton Background="Transparent" BorderBrush="Transparent" IsHitTestVisible="False"/> + </Track.IncreaseRepeatButton> + </Track> + </Grid> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> + + <!-- Modern Rounded ScrollBar Style --> + <Style TargetType="ScrollBar"> + <Setter Property="Width" Value="5" /> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="ScrollBar"> + <Grid> + <Track Name="PART_Track" IsDirectionReversed="true" Width="12" Margin="5,0,0,0"> + <!-- Decrease Repeat Button --> + <Track.DecreaseRepeatButton> + <RepeatButton Background="Transparent" BorderBrush="Transparent" BorderThickness="0"> + <RepeatButton.Template> + <ControlTemplate TargetType="RepeatButton"> + <Grid x:Name="RepeatButtonGrid"> + <VisualStateManager.VisualStateGroups> + <VisualStateGroup Name="CommonStates"> + <VisualState Name="Normal"> + <Storyboard> + <DoubleAnimation Storyboard.TargetProperty="Opacity" Storyboard.TargetName="RepeatButtonGrid" To="1" Duration="0:0:0"/> + </Storyboard> + </VisualState> + <VisualState Name="MouseOver"> + <Storyboard> + <DoubleAnimation Storyboard.TargetProperty="Opacity" Storyboard.TargetName="RepeatButtonGrid" To="0" Duration="0:0:0.1"/> + </Storyboard> + </VisualState> + </VisualStateGroup> + </VisualStateManager.VisualStateGroups> + </Grid> + </ControlTemplate> + </RepeatButton.Template> + </RepeatButton> + </Track.DecreaseRepeatButton> + + + <!-- Thumb (Handle) --> + <Track.Thumb> + <Thumb> + <Thumb.Template> + <ControlTemplate TargetType="Thumb"> + <Grid> + <Border + Background="{DynamicResource BackgroundBrush}" + BorderBrush="{DynamicResource AccentBrush}" + BorderThickness="2" + CornerRadius="3" /> + </Grid> + </ControlTemplate> + </Thumb.Template> + </Thumb> + </Track.Thumb> + + <!-- Increase Repeat Button --> + <Track.IncreaseRepeatButton> + <RepeatButton Background="Transparent" BorderBrush="Transparent" BorderThickness="0"> + <RepeatButton.Template> + <ControlTemplate TargetType="RepeatButton"> + <Grid x:Name="RepeatButtonGrid"> + <VisualStateManager.VisualStateGroups> + <VisualStateGroup Name="CommonStates"> + <VisualState Name="Normal"> + <Storyboard> + <DoubleAnimation Storyboard.TargetProperty="Opacity" Storyboard.TargetName="RepeatButtonGrid" To="1" Duration="0:0:0"/> + </Storyboard> + </VisualState> + <VisualState Name="MouseOver"> + <Storyboard> + <DoubleAnimation Storyboard.TargetProperty="Opacity" Storyboard.TargetName="RepeatButtonGrid" To="0" Duration="0:0:0.1"/> + </Storyboard> + </VisualState> + </VisualStateGroup> + </VisualStateManager.VisualStateGroups> + </Grid> + </ControlTemplate> + </RepeatButton.Template> + </RepeatButton> + </Track.IncreaseRepeatButton> + </Track> + </Grid> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> + + </Application.Resources> +</Application> diff --git a/AutoTrackR2/App.xaml.cs b/AutoTrackR2/App.xaml.cs new file mode 100644 index 0000000..85786d2 --- /dev/null +++ b/AutoTrackR2/App.xaml.cs @@ -0,0 +1,14 @@ +using System.Configuration; +using System.Data; +using System.Windows; + +namespace AutoTrackR2 +{ + /// <summary> + /// Interaction logic for App.xaml + /// </summary> + public partial class App : Application + { + } + +} diff --git a/AutoTrackR2/AssemblyInfo.cs b/AutoTrackR2/AssemblyInfo.cs new file mode 100644 index 0000000..b0ec827 --- /dev/null +++ b/AutoTrackR2/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Windows; + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/AutoTrackR2/Assets/AutoTrackR.png b/AutoTrackR2/Assets/AutoTrackR.png new file mode 100644 index 0000000..db26bab Binary files /dev/null and b/AutoTrackR2/Assets/AutoTrackR.png differ diff --git a/AutoTrackR2/Assets/D3VL.png b/AutoTrackR2/Assets/D3VL.png new file mode 100644 index 0000000..9fe0e1b Binary files /dev/null and b/AutoTrackR2/Assets/D3VL.png differ diff --git a/AutoTrackR2/Assets/EMP.png b/AutoTrackR2/Assets/EMP.png new file mode 100644 index 0000000..580ad66 Binary files /dev/null and b/AutoTrackR2/Assets/EMP.png differ diff --git a/AutoTrackR2/Assets/GN.png b/AutoTrackR2/Assets/GN.png new file mode 100644 index 0000000..0d89604 Binary files /dev/null and b/AutoTrackR2/Assets/GN.png differ diff --git a/AutoTrackR2/Assets/HIT.png b/AutoTrackR2/Assets/HIT.png new file mode 100644 index 0000000..cdc8a4a Binary files /dev/null and b/AutoTrackR2/Assets/HIT.png differ diff --git a/AutoTrackR2/Assets/NW.png b/AutoTrackR2/Assets/NW.png new file mode 100644 index 0000000..ac4586e Binary files /dev/null and b/AutoTrackR2/Assets/NW.png differ diff --git a/AutoTrackR2/Assets/VOX.png b/AutoTrackR2/Assets/VOX.png new file mode 100644 index 0000000..d22d6df Binary files /dev/null and b/AutoTrackR2/Assets/VOX.png differ diff --git a/AutoTrackR2/AutoTrackR2.csproj b/AutoTrackR2/AutoTrackR2.csproj new file mode 100644 index 0000000..07f33db --- /dev/null +++ b/AutoTrackR2/AutoTrackR2.csproj @@ -0,0 +1,53 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>WinExe</OutputType> + <TargetFramework>net9.0-windows</TargetFramework> + <Nullable>enable</Nullable> + <ImplicitUsings>enable</ImplicitUsings> + <UseWPF>true</UseWPF> + </PropertyGroup> + + <ItemGroup> + <None Remove="Assets\D3VL.png" /> + <None Remove="Assets\EMP.png" /> + <None Remove="Assets\HIT.png" /> + <None Remove="Assets\NW.png" /> + <None Remove="Assets\VOX.png" /> + <None Remove="Fonts\Orbitron-Bold.ttf" /> + <None Remove="Fonts\Roboto-Regular.ttf" /> + <None Remove="KillTrackR_MainScript.ps1" /> + </ItemGroup> + + <ItemGroup> + <Resource Include="Assets\D3VL.png"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Resource> + <Resource Include="Assets\EMP.png"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Resource> + <Resource Include="Assets\GN.png"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Resource> + <Resource Include="Assets\AutoTrackR.png"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Resource> + <Resource Include="Assets\HIT.png" /> + <Resource Include="Assets\NW.png"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Resource> + <Resource Include="Assets\VOX.png"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Resource> + <Resource Include="Fonts\Orbitron-Bold.ttf"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Resource> + <Resource Include="Fonts\Roboto-Regular.ttf"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </Resource> + <EmbeddedResource Include="KillTrackR_MainScript.ps1"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </EmbeddedResource> + </ItemGroup> + +</Project> diff --git a/AutoTrackR2/ConfigPage.xaml b/AutoTrackR2/ConfigPage.xaml new file mode 100644 index 0000000..7a74a86 --- /dev/null +++ b/AutoTrackR2/ConfigPage.xaml @@ -0,0 +1,97 @@ +<UserControl x:Class="AutoTrackR2.ConfigPage" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + Height="396" Width="626"> + + <Grid Background="{DynamicResource BackgroundLightBrush}"> + <!-- Main Layout Grid --> + <Grid Margin="0,0,5,7"> + <Grid.RowDefinitions> + <!-- One row for the content, the other for buttons --> + <RowDefinition Height="*" /> + <RowDefinition Height="Auto" /> + </Grid.RowDefinitions> + + <Grid.ColumnDefinitions> + <!-- Left column for the main content area --> + <ColumnDefinition Width="*" /> + <!-- Right column for the buttons --> + <ColumnDefinition Width="Auto" /> + </Grid.ColumnDefinitions> + + <!-- Section for Config Fields --> + <StackPanel Grid.Column="0" VerticalAlignment="Center" Height="389"> + <!-- Log File --> + <StackPanel Margin="0,10,0,15" Orientation="Horizontal"> + <TextBlock Text="Log File:" Foreground="{DynamicResource TextBrush}" FontSize="16" Margin="0,5,0,5" FontFamily="{StaticResource Roboto}"/> + <StackPanel Orientation="Horizontal" Margin="30,0,0,0"> + <TextBox Name="LogFilePath" Width="340" Height="30" Style="{StaticResource RoundedTextBox}"/> + <Button Content="Browse" Width="75" Height="30" FontFamily="{StaticResource Orbitron}" Margin="5,0" Style="{StaticResource ButtonStyle}" Click="LogFileBrowseButton_Click"/> + </StackPanel> + </StackPanel> + + <!-- API URL --> + <StackPanel Margin="0,0,0,15" Orientation="Horizontal"> + <TextBlock Text="API URL:" Foreground="{DynamicResource TextBrush}" FontSize="16" Margin="0,5,0,5"/> + <StackPanel Orientation="Horizontal" Margin="30,0,0,0"> + <TextBox Name="ApiUrl" Width="340" Height="30" Style="{StaticResource RoundedTextBox}"/> + <Button Content="Test" Width="75" Height="30" FontFamily="{StaticResource Orbitron}" Margin="5,0" Style="{StaticResource ButtonStyle}"/> + </StackPanel> + </StackPanel> + + <!-- API Key --> + <StackPanel Margin="0,0,0,15" Orientation="Horizontal"> + <TextBlock Text="API Key:" Foreground="{DynamicResource TextBrush}" FontSize="16" Margin="0,5,0,5"/> + <TextBox Name="ApiKey" Width="340" Height="30" Margin="33,0,0,0" Style="{StaticResource RoundedTextBox}"/> + </StackPanel> + + <!-- Video Path --> + <StackPanel Margin="0,0,0,15" Orientation="Horizontal"> + <TextBlock Text="Video Path:" Foreground="{DynamicResource TextBrush}" FontSize="16" Margin="0,5,0,5"/> + <StackPanel Orientation="Horizontal"> + <TextBox Name="VideoPath" Width="340" Height="30" Margin="10,0,0,0" Style="{StaticResource RoundedTextBox}"/> + <Button Content="Browse" Width="75" Height="30" FontFamily="{StaticResource Orbitron}" Margin="5,0" Style="{StaticResource ButtonStyle}" Click="VideoPathBrowseButton_Click"/> + </StackPanel> + </StackPanel> + + <!-- Visor Wipe Toggle Slider --> + <StackPanel Margin="0,0,0,15" Orientation="Horizontal"> + <TextBlock Text="Visor Wipe:" Foreground="{DynamicResource TextBrush}" FontSize="16" Margin="0,7,0,5"/> + <Slider Name="VisorWipeSlider" Minimum="0" Maximum="1" TickFrequency="1" IsSnapToTickEnabled="True" Value="0" Style="{StaticResource ToggleSliderStyle}" Margin="27,-4,0,0" ValueChanged="VisorWipeSlider_ValueChanged"/> + </StackPanel> + + <!-- Video Record Toggle Slider --> + <StackPanel Margin="0,0,0,15" Orientation="Horizontal"> + <TextBlock Text="Video Record:" Foreground="{DynamicResource TextBrush}" FontSize="16" Margin="0,7,0,5"/> + <Slider Name="VideoRecordSlider" Minimum="0" Maximum="1" TickFrequency="1" IsSnapToTickEnabled="True" Value="0" Style="{StaticResource ToggleSliderStyle}" Margin="10,-4,0,0" ValueChanged="VideoRecordSlider_ValueChanged"/> + </StackPanel> + + <!-- Offline Mode Toggle Slider --> + <StackPanel Margin="0,0,0,15" Orientation="Horizontal"> + <TextBlock Text="Offline Mode:" Foreground="{DynamicResource TextBrush}" FontSize="16" Margin="0,7,0,5"/> + <Slider Name="OfflineModeSlider" Minimum="0" Maximum="1" TickFrequency="1" IsSnapToTickEnabled="True" Value="0" Style="{StaticResource ToggleSliderStyle}" Margin="12,-4,0,0" ValueChanged="OfflineModeSlider_ValueChanged"/> + </StackPanel> + + <!-- 3-Position Toggle Slider --> + <StackPanel Margin="0,0,0,15" Orientation="Horizontal"> + <TextBlock Text="Theme:" Foreground="{DynamicResource TextBrush}" FontSize="16" Margin="0,7,0,5"/> + <Slider x:Name="ThemeSlider" + Minimum="0" + Maximum="9" + Value="0" + TickFrequency="1" + IsSnapToTickEnabled="True" + ValueChanged="ThemeSlider_ValueChanged" Width="200" + Style="{StaticResource ThreePositionSlider}" + /> + </StackPanel> + + </StackPanel> + + <!-- Save Button --> + <StackPanel Grid.Column="2" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0"> + <Button x:Name="SaveButton" Content="Save" Width="100" Height="40" Style="{StaticResource ButtonStyle}" FontFamily="{StaticResource Orbitron}" Click="SaveButton_Click"/> + </StackPanel> + </Grid> + </Grid> +</UserControl> diff --git a/AutoTrackR2/ConfigPage.xaml.cs b/AutoTrackR2/ConfigPage.xaml.cs new file mode 100644 index 0000000..7f42d76 --- /dev/null +++ b/AutoTrackR2/ConfigPage.xaml.cs @@ -0,0 +1,396 @@ +using System.IO; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Threading; +using Microsoft.Win32; + +namespace AutoTrackR2 +{ + public partial class ConfigPage : UserControl + { + // Store the current slider value + private double savedSliderValue = 0; + + private MainWindow mainWindow; + + public ConfigPage(MainWindow mainWindow) + { + InitializeComponent(); + this.mainWindow = mainWindow; + + LogFilePath.Text = ConfigManager.LogFile; + ApiUrl.Text = ConfigManager.ApiUrl; + ApiKey.Text = ConfigManager.ApiKey; + VideoPath.Text = ConfigManager.VideoPath; + VisorWipeSlider.Value = ConfigManager.VisorWipe; + VideoRecordSlider.Value = ConfigManager.VideoRecord; + OfflineModeSlider.Value = ConfigManager.OfflineMode; + ThemeSlider.Value = ConfigManager.Theme; + + ApplyToggleModeStyle(OfflineModeSlider.Value, VisorWipeSlider.Value, VideoRecordSlider.Value); + } + + // Method to change the logo image in MainWindow + public void ChangeLogo(string imagePath, Color? glowColor = null) + { + // Update the logo from ConfigPage + mainWindow.ChangeLogoImage(imagePath); + + if (glowColor.HasValue) + { + // Add the glow effect to the logo in MainWindow + DropShadowEffect glowEffect = new DropShadowEffect + { + Color = glowColor.Value, // Glow color + ShadowDepth = 0, // Centered glow + BlurRadius = 20, // Glow spread + Opacity = 0.8 // Intensity + }; + + // Apply the effect to the logo + mainWindow.Logo.Effect = glowEffect; + } + else + { + mainWindow.Logo.Effect = null; + } + } + + // This method will set the loaded config values to the UI controls + public void SetConfigValues(string logFile, string apiUrl, string apiKey, string videoPath, + int visorWipe, int videoRecord, int offlineMode, int theme) + { + // Set the textboxes with the loaded values + LogFilePath.Text = logFile; + ApiUrl.Text = apiUrl; + ApiKey.Text = apiKey; + VideoPath.Text = videoPath; + + // Set the sliders with the loaded values + VideoRecordSlider.Value = videoRecord; + VisorWipeSlider.Value = visorWipe; + OfflineModeSlider.Value = offlineMode; + + // Handle themes + if (theme >= 0 && theme <= 3) + { + ThemeSlider.Value = theme; // Set slider only for visible themes + } + else + { + ApplyTheme(theme); // Apply hidden themes directly + } + } + + private void ApplyToggleModeStyle(double offlineModeValue, double visorWipeValue, double videoRecordValue) + { + // Get the slider + Slider offlineModeSlider = OfflineModeSlider; + Slider visorWipeSlider = VisorWipeSlider; + Slider videoRecordSlider = VideoRecordSlider; + + // Set the appropriate style based on the offlineMode value (0 or 1) + if (offlineModeValue == 0) + { + offlineModeSlider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); + } + + if (visorWipeValue == 0) + { + visorWipeSlider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); + } + + if (videoRecordValue == 0) + { + videoRecordSlider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); + } + } + + private void ThemeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) + { + // Save the current slider value when it changes + savedSliderValue = e.NewValue; + + // Get the slider value (0, 1, or 2) + int themeIndex = (int)savedSliderValue; + + // Apply the selected theme + ApplyTheme(themeIndex); + + mainWindow.UpdateTabVisuals(); + } + + private void ApplyTheme(int themeIndex) + { + switch (themeIndex) + { + case 0: // Default Blue Theme + UpdateThemeColors( + (Color)ColorConverter.ConvertFromString("#00A9E0"), // Accent/Border + (Color)ColorConverter.ConvertFromString("#0F1A2B"), // Button + (Color)ColorConverter.ConvertFromString("#1D2D44"), // Background + (Color)ColorConverter.ConvertFromString("#FFFFFF") // Text + ); + ChangeLogo("/Assets/AutoTrackR.png"); + break; + case 1: // Green Theme + UpdateThemeColors( + (Color)ColorConverter.ConvertFromString("#1D9F00"), // Accent/Border + (Color)ColorConverter.ConvertFromString("#262424"), // Button + (Color)ColorConverter.ConvertFromString("#072501"), // Background + (Color)ColorConverter.ConvertFromString("#D7AF3C") // Text + ); + ChangeLogo("/Assets/AutoTrackR.png"); + break; + case 2: // Red Theme + UpdateThemeColors( + (Color)ColorConverter.ConvertFromString("#D32F2F"), // Accent/Border + (Color)ColorConverter.ConvertFromString("#424242"), // Button + (Color)ColorConverter.ConvertFromString("#212121"), // Light Background + (Color)ColorConverter.ConvertFromString("#E0E0E0") // Text + ); + ChangeLogo("/Assets/AutoTrackR.png"); + break; + case 3: // Purple Theme + UpdateThemeColors( + (Color)ColorConverter.ConvertFromString("#32CD32"), // Accent/Border + (Color)ColorConverter.ConvertFromString("#33065F"), // Button + (Color)ColorConverter.ConvertFromString("#43065F"), // Background + (Color)ColorConverter.ConvertFromString("#00FF00") // Text + ); + ChangeLogo("/Assets/AutoTrackR.png"); + break; + case 4: // GN Theme + UpdateThemeColors( + (Color)ColorConverter.ConvertFromString("#FF0000"), // Accent/Border + (Color)ColorConverter.ConvertFromString("#1C1C1C"), // Button + (Color)ColorConverter.ConvertFromString("#000000"), // Background + (Color)ColorConverter.ConvertFromString("#FBC603") // Text + ); + ChangeLogo("/Assets/GN.png", (Color)ColorConverter.ConvertFromString("#FF0000")); + break; + case 5: // NW Theme + UpdateThemeColors( + (Color)ColorConverter.ConvertFromString("#B92D2D"), // Accent/Border + (Color)ColorConverter.ConvertFromString("#1C1C1C"), // Button + (Color)ColorConverter.ConvertFromString("#262424"), // Background + (Color)ColorConverter.ConvertFromString("#01DDDA") // Text + ); + ChangeLogo("/Assets/NW.png", (Color)ColorConverter.ConvertFromString("#01DDDA")); + break; + case 6: // D3VL Theme + UpdateThemeColors( + (Color)ColorConverter.ConvertFromString("#000000"), // Accent/Border + (Color)ColorConverter.ConvertFromString("#3E3E3E"), // Button + (Color)ColorConverter.ConvertFromString("#4C1C1C"), // Background + (Color)ColorConverter.ConvertFromString("#FF0000") // Text + ); + ChangeLogo("/Assets/D3VL.png", (Color)ColorConverter.ConvertFromString("#000000")); + break; + case 7: // HIT Theme + UpdateThemeColors( + (Color)ColorConverter.ConvertFromString("#000000"), // Accent/Border + (Color)ColorConverter.ConvertFromString("#3E3E3E"), // Button + (Color)ColorConverter.ConvertFromString("#4C1C1C"), // Background + (Color)ColorConverter.ConvertFromString("#FF0000") // Text + ); + ChangeLogo("/Assets/HIT.png", (Color)ColorConverter.ConvertFromString("#fd2929")); + break; + case 8: // VOX Theme + UpdateThemeColors( + (Color)ColorConverter.ConvertFromString("#C0C0C0"), // Accent/Border + (Color)ColorConverter.ConvertFromString("#1C1C1C"), // Button + (Color)ColorConverter.ConvertFromString("#424242"), // Background + (Color)ColorConverter.ConvertFromString("#FFD700") // Text + ); + ChangeLogo("/Assets/VOX.png", (Color)ColorConverter.ConvertFromString("#FFD700")); + break; + case 9: // EMP Theme + UpdateThemeColors( + (Color)ColorConverter.ConvertFromString("#F5721C"), // Accent/Border + (Color)ColorConverter.ConvertFromString("#535353"), // Button + (Color)ColorConverter.ConvertFromString("#080000"), // Background + (Color)ColorConverter.ConvertFromString("#FFFFFF") // Text + ); + ChangeLogo("/Assets/EMP.png", (Color)ColorConverter.ConvertFromString("#F3BD9B")); + break; + } + } + + // Helper method to update both Color and Brush resources + private void UpdateThemeColors(Color accent, Color backgroundDark, Color backgroundLight, Color text) + { + // Update color resources + Application.Current.Resources["AccentColor"] = accent; + Application.Current.Resources["BackgroundDarkColor"] = backgroundDark; + Application.Current.Resources["BackgroundLightColor"] = backgroundLight; + Application.Current.Resources["TextColor"] = text; + + // Update SolidColorBrush resources + Application.Current.Resources["AccentBrush"] = new SolidColorBrush(accent); + Application.Current.Resources["BackgroundDarkBrush"] = new SolidColorBrush(backgroundDark); + Application.Current.Resources["BackgroundLightBrush"] = new SolidColorBrush(backgroundLight); + Application.Current.Resources["TextBrush"] = new SolidColorBrush(text); + } + + // This method will be called when switching tabs to restore the saved slider position. + public void RestoreSliderValue() + { + // Set the slider back to the previously saved value + ThemeSlider.Value = savedSliderValue; + } + + // Log File Browse Button Handler + private void LogFileBrowseButton_Click(object sender, RoutedEventArgs e) + { + var dialog = new Microsoft.Win32.OpenFileDialog(); + dialog.Filter = "Log files (*.log)|*.log|All files (*.*)|*.*"; // Adjust as needed + + if (dialog.ShowDialog() == true) + { + LogFilePath.Text = dialog.FileName; // Set the selected file path to the TextBox + } + } + + // Video Path Browse Button Handler + private void VideoPathBrowseButton_Click(object sender, RoutedEventArgs e) + { + var dialog = new OpenFileDialog(); + dialog.CheckFileExists = false; + dialog.ValidateNames = false; + dialog.Filter = "All files|*.*"; + + if (dialog.ShowDialog() == true) + { + // Extract only the directory path from the file + string selectedFolder = Path.GetDirectoryName(dialog.FileName); + VideoPath.Text = selectedFolder; // Set the folder path + } + } + + private void VisorWipeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) + { + Slider slider = (Slider)sender; + ConfigManager.VisorWipe = (int)slider.Value; // 0 or 1 + + // Check if the value is 0 or 1 and apply the corresponding style + if (ConfigManager.VisorWipe == 0) + { + slider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); // Apply FalseToggleStyle + } + else + { + slider.Style = (Style)Application.Current.FindResource("ToggleSliderStyle"); // Apply ToggleSliderStyle + } + } + + private void VideoRecordSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) + { + Slider slider = (Slider)sender; + ConfigManager.VideoRecord = (int)slider.Value; // 0 or 1 + + // Check if the value is 0 or 1 and apply the corresponding style + if (ConfigManager.VideoRecord == 0) + { + slider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); // Apply FalseToggleStyle + } + else + { + slider.Style = (Style)Application.Current.FindResource("ToggleSliderStyle"); // Apply ToggleSliderStyle + } + } + + private void OfflineModeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) + { + Slider slider = (Slider)sender; + ConfigManager.OfflineMode = (int)slider.Value; // 0 or 1 + + // Check if the value is 0 or 1 and apply the corresponding style + if (ConfigManager.OfflineMode == 0) + { + slider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); // Apply FalseToggleStyle + } + else + { + slider.Style = (Style)Application.Current.FindResource("ToggleSliderStyle"); // Apply ToggleSliderStyle + } + } + + + private void SaveButton_Click(object sender, RoutedEventArgs e) + { + // Get the directory of the running executable + string exeDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + + // Combine the executable directory with the config file name + string configFilePath = Path.Combine(exeDirectory, "config.ini"); + + using (StreamWriter writer = new StreamWriter(configFilePath)) + { + writer.WriteLine($"LogFile={LogFilePath.Text}"); + writer.WriteLine($"ApiUrl={ApiUrl.Text}"); + writer.WriteLine($"ApiKey={ApiKey.Text}"); + writer.WriteLine($"VideoPath={VideoPath.Text}"); + writer.WriteLine($"VisorWipe={(int)VisorWipeSlider.Value}"); + writer.WriteLine($"VideoRecord={(int)VideoRecordSlider.Value}"); + writer.WriteLine($"OfflineMode={(int)OfflineModeSlider.Value}"); + writer.WriteLine($"Theme={(int)ThemeSlider.Value}"); // Assumes you are saving the theme slider value (0, 1, or 2) + } + + // Start the flashing effect + FlashSaveButton(); + ConfigManager.LoadConfig(); + } + + private void FlashSaveButton() + { + string originalText = SaveButton.Content.ToString(); + SaveButton.Content = "Saved"; + + // Save button color change effect + var originalColor = SaveButton.Background; + var accentColor = (Color)Application.Current.Resources["AccentColor"]; + SaveButton.Background = new SolidColorBrush(accentColor); // Change color to accent color + + // Apply glow effect + SaveButton.Effect = new DropShadowEffect + { + Color = accentColor, + BlurRadius = 15, // Add subtle blur + ShadowDepth = 0, // Set shadow depth to 0 for a pure glow effect + Opacity = 0.8, // Set opacity for glow visibility + Direction = 0 // Direction doesn't matter for glow + }; + + // Create a DispatcherTimer to reset everything after the effect + DispatcherTimer timer = new DispatcherTimer + { + Interval = TimeSpan.FromMilliseconds(600) // Interval for flash effect + }; + + int flashCount = 0; + timer.Tick += (sender, e) => + { + if (flashCount < 2) // Flash effect (flash 2 times) + { + flashCount++; + } + else + { + // Stop the timer and restore the original button state + timer.Stop(); + SaveButton.Content = originalText; + SaveButton.Background = originalColor; // Restore the original button color + SaveButton.Effect = null; // Remove the glow effect + } + }; + + // Start the timer + timer.Start(); + } + } +} diff --git a/AutoTrackR2/Fonts/Orbitron-Bold.ttf b/AutoTrackR2/Fonts/Orbitron-Bold.ttf new file mode 100644 index 0000000..9c8643c Binary files /dev/null and b/AutoTrackR2/Fonts/Orbitron-Bold.ttf differ diff --git a/AutoTrackR2/Fonts/Roboto-Regular.ttf b/AutoTrackR2/Fonts/Roboto-Regular.ttf new file mode 100644 index 0000000..2d116d9 Binary files /dev/null and b/AutoTrackR2/Fonts/Roboto-Regular.ttf differ diff --git a/AutoTrackR2/HomePage.xaml b/AutoTrackR2/HomePage.xaml new file mode 100644 index 0000000..b1c9baf --- /dev/null +++ b/AutoTrackR2/HomePage.xaml @@ -0,0 +1,43 @@ +<UserControl x:Class="AutoTrackR2.HomePage" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + Height="396" Width="626"> + <Grid Background="{DynamicResource BackgroundLightBrush}"> + <!-- Main Layout Grid --> + <Grid Margin="0,0,5,7"> + <Grid.RowDefinitions> + <!-- One row for the content, the other for buttons --> + <RowDefinition Height="*" /> + <RowDefinition Height="Auto" /> + </Grid.RowDefinitions> + + <Grid.ColumnDefinitions> + <!-- Left column for the main content area --> + <ColumnDefinition /> + <!-- Right column for the buttons --> + <ColumnDefinition Width="Auto" MinWidth="173" /> + </Grid.ColumnDefinitions> + + <!-- Border for the kill feed section --> + <TextBox Name="OutputTextBox" Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" Height="NaN" Margin="0,0,20,0" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" IsReadOnly="True" Style="{StaticResource RoundedTextBox}"/> + <!-- Border Grid.Row="0" Grid.Column="0" BorderBrush="{DynamicResource AccentBrush}" BorderThickness="2" CornerRadius="10" Padding="10" Background="{DynamicResource BackgroundDarkBrush}" Margin="0,0,20,0"> + <TextBlock Text="Kill Feed Goes Here..." FontSize="18" Foreground="{DynamicResource TextBrush}" HorizontalAlignment="Center" VerticalAlignment="Center" /> + </Border --> + + <!-- StackPanel for Start and Stop buttons --> + <Border Background="{DynamicResource BackgroundDarkBrush}" BorderBrush="{DynamicResource AccentBrush}" Grid.Row="0" Grid.Column="1" BorderThickness="2" CornerRadius="5" Margin="0,0,0,134"/> + <StackPanel Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center" Height="269" Width="152"> + <TextBlock Name="PilotNameTitle" Text="Pilot" Width="152" Height="20" Background="Transparent" FontFamily="{StaticResource Orbitron}" Margin="0,5,0,0" Foreground="{DynamicResource AccentBrush}" FontSize="14"/> + <TextBlock Name="PilotNameTextBox" Text="X" Width="152" Height="20" Background="Transparent" FontFamily="{StaticResource Orbitron}" Margin="0,0,0,0" Foreground="{DynamicResource TextBrush}" FontSize="11" TextAlignment="Center"/> + <TextBlock Name="PlayerShipTitle" Text="Ship" Width="152" Height="20" Background="Transparent" FontFamily="{StaticResource Orbitron}" Margin="0,5,0,0" Foreground="{DynamicResource AccentBrush}" FontSize="14" /> + <TextBlock Name="PlayerShipTextBox" Text="X" Width="152" Height="20" Background="Transparent" FontFamily="{StaticResource Orbitron}" Margin="0,0,0,0" Foreground="{DynamicResource TextBrush}" FontSize="11" TextAlignment="Center"/> + <TextBlock Name="GameModeTitle" Text="Game Mode" Width="152" Height="20" Background="Transparent" FontFamily="{StaticResource Orbitron}" Margin="0,5,0,0" Foreground="{DynamicResource AccentBrush}" FontSize="14"/> + <TextBlock Name="GameModeTextBox" Text="X" Width="152" Height="20" Background="Transparent" FontFamily="{StaticResource Orbitron}" Margin="0,0,0,0" Foreground="{DynamicResource TextBrush}" FontSize="11" TextAlignment="Center"/> + </StackPanel> + <StackPanel Grid.Row="1" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center" Height="120" Width="172" > + <Button Name="StartButton" Content="Start" Width="100" Height="40" Style="{StaticResource ButtonStyle}" FontFamily="{StaticResource Orbitron}" Margin="0,20" Click="StartButton_Click"/> + <Button Name="StopButton" Content="Stop" Width="100" Height="40" Style="{StaticResource DisabledButtonStyle}" FontFamily="{StaticResource Orbitron}" IsEnabled="False"/> + </StackPanel> + </Grid> + </Grid> +</UserControl> diff --git a/AutoTrackR2/HomePage.xaml.cs b/AutoTrackR2/HomePage.xaml.cs new file mode 100644 index 0000000..99dcdf0 --- /dev/null +++ b/AutoTrackR2/HomePage.xaml.cs @@ -0,0 +1,142 @@ +using System.Diagnostics; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using System.Windows.Media.Effects; +using System.IO; + +namespace AutoTrackR2 +{ + public partial class HomePage : UserControl + { + public HomePage() + { + InitializeComponent(); + } + + // Update Start/Stop button states based on the isRunning flag + public void UpdateButtonState(bool isRunning) + { + var accentColor = (Color)Application.Current.Resources["AccentColor"]; + + if (isRunning) + { + // Set Start button to "Running..." and apply glow effect + StartButton.Content = "Running..."; + StartButton.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#00A9E0")); + StartButton.IsEnabled = false; // Disable Start button + StartButton.Style = (Style)FindResource("DisabledButtonStyle"); + + // Add glow effect to the Start button + StartButton.Effect = new DropShadowEffect + { + Color = accentColor, + BlurRadius = 20, // Adjust blur radius for desired glow intensity + ShadowDepth = 0, // Set shadow depth to 0 for a pure glow effect + Opacity = 1, // Set opacity for glow visibility + Direction = 0 // Direction doesn't matter for glow + }; + + StopButton.Style = (Style)FindResource("ButtonStyle"); + StopButton.IsEnabled = true; // Enable Stop button + } + else + { + // Reset Start button back to its original state + StartButton.Content = "Start"; + StartButton.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#0F1A2B")); + StartButton.IsEnabled = true; // Enable Start button + + // Remove the glow effect from Start button + StartButton.Effect = null; + + StopButton.Style = (Style)FindResource("DisabledButtonStyle"); + StartButton.Style = (Style)FindResource("ButtonStyle"); + StopButton.IsEnabled = false; // Disable Stop button + } + } + + private void StartButton_Click(object sender, RoutedEventArgs e) + { + string scriptPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "KillTrackR_MainScript.ps1"); + TailFileAsync(scriptPath); + } + + private async void TailFileAsync(string scriptPath) + { + await Task.Run(() => + { + try + { + ProcessStartInfo psi = new ProcessStartInfo + { + FileName = "powershell.exe", + Arguments = $"-NoProfile -ExecutionPolicy Bypass -File \"{scriptPath}\"", + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true + }; + + using (Process process = new Process { StartInfo = psi }) + { + process.OutputDataReceived += (s, e) => + { + if (!string.IsNullOrEmpty(e.Data)) + { + Dispatcher.Invoke(() => + { + // Parse and display key-value pairs in the OutputTextBox + if (e.Data.Contains("PlayerName=")) + { + string pilotName = e.Data.Split('=')[1].Trim(); + PilotNameTextBox.Text = pilotName; // Update the Button's Content + } + else if (e.Data.Contains("PlayerShip=")) + { + string playerShip = e.Data.Split('=')[1].Trim(); + PlayerShipTextBox.Text = playerShip; + } + else if (e.Data.Contains("GameMode=")) + { + string gameMode = e.Data.Split('=')[1].Trim(); + GameModeTextBox.Text = gameMode; + } + else + { + OutputTextBox.AppendText(e.Data + Environment.NewLine); + } + }); + } + }; + + process.ErrorDataReceived += (s, e) => + { + if (!string.IsNullOrEmpty(e.Data)) + { + Dispatcher.Invoke(() => + { + OutputTextBox.AppendText("Error: " + e.Data + Environment.NewLine); + }); + } + }; + + process.Start(); + process.BeginOutputReadLine(); + process.BeginErrorReadLine(); + + process.WaitForExit(); + } + } + catch (Exception ex) + { + Dispatcher.Invoke(() => + { + MessageBox.Show($"Error running script: {ex.Message}"); + }); + } + }); + } + + } +} diff --git a/AutoTrackR2/KillTrackR_MainScript.ps1 b/AutoTrackR2/KillTrackR_MainScript.ps1 new file mode 100644 index 0000000..2633574 --- /dev/null +++ b/AutoTrackR2/KillTrackR_MainScript.ps1 @@ -0,0 +1,333 @@ +# Path to the config file +$scriptFolder = Split-Path -Parent $MyInvocation.MyCommand.Path +$configFile = Join-Path -Path $scriptFolder -ChildPath "config.ini" + +# Read the config file into a hashtable +if (Test-Path $configFile) { + Write-Output "Config.ini found." + $configContent = Get-Content $configFile | Where-Object { $_ -notmatch '^#|^\s*$' } + + # Escape backslashes by doubling them + $configContent = $configContent -replace '\\', '\\\\' + + # Convert to key-value pairs + $config = $configContent -replace '^([^=]+)=(.+)$', '$1=$2' | ConvertFrom-StringData +} else { + Write-Output "Config.ini not found." + exit +} + +$PlayerName = "Immersion_Breaker" +$PlayerShip = "ANVL_F7A_Mk2" +$GameMode = "PU" + +Write-Output "PlayerName=$PlayerName" +Write-Output "PlayerShip=$PlayerShip" +Write-Output "GameMode=$GameMode" + +# Access config values +$logFile = $config.Logfile +$apiUrl = $config.ApiUrl +$apiKey = $config.ApiKey +$videoPath = $config.VideoPath +$visorWipe = $config.VisorWipe +$videoRecord = $config.VideoRecord +$offlineMode = $config.OfflineMode + +if ($offlineMode -eq 1){ + $offlineMode = $true +} else { + $offlineMode = $false +} + +if ($videoRecord -eq 1){ + $videoRecord = $true +} else { + $videoRecord = $false +} + +$logfileContent = Get-Content $logFile + +If (Test-Path $logFile) { + Write-Output "Logfile found." +} else { + Write-Output "Logfile not found." +} + +Write-Output $logfileContent +<# Define the regex pattern to extract information +$killPattern = "<Actor Death> CActor::Kill: '(?<EnemyPilot>[^']+)' \[\d+\] in zone '(?<EnemyShip>[^']+)' killed by '(?<Player>[^']+)' \[[^']+\] using '(?<Weapon>[^']+)' \[Class (?<Class>[^\]]+)\] with damage type '(?<DamageType>[^']+)'" +$puPattern = '<\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z> \[Notice\] <ContextEstablisherTaskFinished> establisher="CReplicationModel" message="CET completed" taskname="StopLoadingScreen" state=[^ ]+ status="Finished" runningTime=\d+\.\d+ numRuns=\d+ map="megamap" gamerules="SC_Default" sessionId="[a-f0-9\-]+" \[Team_Network\]\[Network\]\[Replication\]\[Loading\]\[Persistence\]' +$acPattern = "ArenaCommanderFeature" +$loadoutPattern = '\[InstancedInterior\] OnEntityLeaveZone - InstancedInterior \[(?<InstancedInterior>[^\]]+)\] \[\d+\] -> Entity \[(?<Entity>[^\]]+)\] \[\d+\] -- m_openDoors\[\d+\], m_managerGEID\[(?<ManagerGEID>\d+)\], m_ownerGEID\[(?<OwnerGEID>[^\[]+)\]' +# $loginPattern = "\[Notice\] <AccountLoginCharacterStatus_Character> Character: createdAt [A-Za-z0-9]+ - updatedAt [A-Za-z0-9]+ - geid [A-Za-z0-9]+ - accountId [A-Za-z0-9]+ - name (?<Player>[A-Za-z0-9_-]+) - state STATE_CURRENT" # KEEP THIS INCASE LEGACY LOGIN IS REMOVED +$loginPattern = "\[Notice\] <Legacy login response> \[CIG-net\] User Login Success - Handle\[(?<Player>[A-Za-z0-9_-]+)\]" +$cleanupPattern = '^(.+?)_\d+$' + +# Lookup Patterns +$joinDatePattern = '<span class="label">Enlisted</span>\s*<strong class="value">([^<]+)</strong>' +$orgPattern = '<IMG[^>]*>\s*([^<]+)' +$ueePattern = '<p class="entry citizen-record">\s*<span class="label">UEE Citizen Record<\/span>\s*<strong class="value">#?(n\/a|\d+)<\/strong>\s*<\/p>' + +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + +# Function to process new log entries and write to the host +function Read-LogEntry { + param ( + [string]$line + ) + + # Apply the regex pattern to the line + if ($line -match $killPattern -and $global:logStart -eq $TRUE) { + # Access the named capture groups from the regex match + $enemyPilot = $matches['EnemyPilot'] + $enemyShip = $matches['EnemyShip'] + $player = $matches['Player'] + $weapon = $matches['Weapon'] + $damageType = $matches['DamageType'] + $ship = $global:loadOut + + If ($enemyShip -eq $global:lastKill){ + $enemyShip = "Passenger" + } Else { + $global:lastKill = $enemyShip + } + + If (($player -eq $global:userName -and $enemyPilot -ne $global:userName) -and ($enemyPilot -notlike "PU_*" -and $enemyPilot -notlike "NPC_*")){ + If ($enemyShip -match $cleanupPattern){ + $enemyShip = $matches[1] + } + If ($weapon -match $cleanupPattern){ + $weapon = $matches[1] + } + If ($weapon -eq "KLWE_MassDriver_S10"){ + $global:loadOut = "AEGS_Idris" + $ship = "AEGS_Idris" + } + if ($damageType -like "*bullet*") { + $ship = "Player" + } + If ($ship -match $cleanupPattern){ + $ship = $matches[1] + } + if ($ship -like "OOC_*"){ + $ship = "Player" + } + If ($enemyShip -like "OOC_*" -or $enemyShip -like "hangar*") { + $enemyShip = "Player" + } + + # Repeatedly remove all suffixes + while ($enemyShip -match '_(PU|AI|CIV|MIL|PIR)$') { + $enemyShip = $enemyShip -replace '_(PU|AI|CIV|MIL|PIR)$', '' + } + # Repeatedly remove all suffixes + while ($ship -match '_(PU|AI|CIV|MIL|PIR)$') { + $ship = $ship -replace '_(PU|AI|CIV|MIL|PIR)$', '' + } + + $KillTime = Get-Date([DateTime]::UtcNow) -UFormat "%d%b%Y %r" + $page1 = Invoke-WebRequest -uri "https://robertsspaceindustries.com/citizens/$enemyPilot" + $page2 = Invoke-WebRequest -uri "https://robertsspaceindustries.com/citizens/$enemyPilot/organizations" + + # Get Enlisted Date + if ($($page1.content) -match $joinDatePattern) { + $joinDate = $matches[1] + } else { + $joinDate = "UNKNOWN" + } + + # Find Org matches using the regex pattern + $orgMatches = [regex]::matches($($page2.links.innerhtml), $orgPattern) + # Check if there are any matches + $enemyOrgs = @() + if ($orgMatches.Count -eq 0) { + $enemyOrgs = "N/A" + } else { + # Loop through each match and display the organization name + foreach ($match in $orgMatches) { + $organizationName = $match.Groups[1].Value.Trim() + $enemyOrgs = $enemyOrgs + $organizationName + } + } + + # Get UEE Number + if ($($page1.content) -match $ueePattern) { + # The matched UEE Citizen Record number is in $matches[1] + $citizenRecord = $matches[1] + } else { + $citizenRecord = "-1" + } + If ($citizenRecord -eq "N/A") { + $citizenRecordAPI = "-1" + } Else { + $citizenRecordAPI = $citizenRecord + } + + # Cleanup Output + $textColor = "Green" + $killText = "Congratulations!" + + # Send to API + # Define the data to send + If ($apiDetected -eq $true -and $urlDetected -eq $true){ + $data = @{ + victim_ship = $enemyShip + victim = $enemyPilot + enlisted = $joinDate + rsi = $citizenRecordAPI + weapon = $weapon + method = $damageType + loadout_ship = $ship + #version = $version + } + + # Headers which may or may not be necessary + $headers = @{ + "Authorization" = "Bearer $apiToken" + "Content-Type" = "application/json" + "User-Agent" = "TEST-PS" + } + + try { + # Send the POST request with JSON data + Invoke-RestMethod -Uri $apiURL -Method Post -Body ($data | ConvertTo-Json -Depth 5) -Headers $headers + } catch { + # Catch and display errors + Write-Output "Error: $($_)" -ForegroundColor red + Write-output "Send error to devs" + Write-Output "Kill saved in $outputPath" + $apiError = $_ + # Add to output file + Add-Content -Path $outputPath -value $($_) + } + } + + # Write-Output to console + write-host "=== $killText" -ForegroundColor $textColor + Write-Host "$killTime" + Write-Host "Enemy Pilot: " -NoNewLine -ForegroundColor $textColor + Write-Host "$enemyPilot" + Write-Host "Enemy Ship: " -NoNewLine -ForegroundColor $textColor + Write-Host "$enemyShip" + Write-Host "Enlisted: " -NoNewLine -ForegroundColor $textColor + Write-Host "$joinDate" + Write-Host "Record #: " -NoNewLine -ForegroundColor $textColor + Write-Host "$citizenRecord" + Write-Host "Org Affiliation: " -NoNewLine -ForegroundColor $textColor + ForEach ($org in $enemyOrgs){ + Write-Host $org + } + Write-Host "Player: " -NoNewLine -ForegroundColor $textColor + Write-Host "$player" + Write-Host "Weapon: " -NoNewLine -ForegroundColor $textColor + Write-Host "$weapon" + Write-Host "Ship: " -NoNewLine -ForegroundColor $textColor + Write-Host "$ship"s + Write-Host "Method: " -NoNewLine -ForegroundColor $textColor + Write-Host "$damageType" + Write-Host "-------------------------" + + # Write output to local log + If ($apiDetected -eq $false -or $urlDetected -eq $false -or $null -ne $apiError){ + Add-Content -Path $outputPath -Value "=== $killText" + Add-Content -Path $outputPath -Value "$killTime" + Add-Content -Path $outputPath -Value "Enemy Pilot: $enemyPilot" + Add-Content -Path $outputPath -Value "Enemy Ship: $enemyShip" + Add-Content -Path $outputPath -Value "Enlisted: $joinDate" + Add-Content -Path $outputPath -Value "Record #: $citizenRecord" + Add-Content -Path $outputPath -Value "Org Affiliation: " -NoNewLine + ForEach ($org in $enemyOrgs){ + Add-Content -Path $outputPath -Value $org + } + Add-Content -Path $outputPath -Value "Player: $player" + Add-Content -Path $outputPath -Value "Weapon: $weapon" + Add-Content -Path $outputPath -Value "Ship: $ship" + Add-Content -Path $outputPath -Value "Method: $damageType" + Add-Content -Path $outputPath -Value "-------------------------" + } + + $sleeptimer = 10 + + # VisorWipe + If ($visorwipe -eq $true -and $enemyShip -ne "Passenger" -and $damageType -notlike "*Bullet*"){ + # send keybind for visorwipe + start-sleep 1 + $sleeptimer = $sleeptimer -1 + &$visorPath + } + + # Record video + if ($recording -eq $true -and $enemyShip -ne "Passenger"){ + # send keybind for windows game bar recording + Start-Sleep 2 + $sleeptimer = $sleeptimer -9 + &$recordPath + Write-Host "=== Kill Clipped!" -ForegroundColor Green + Write-Host "-------------------------" + Start-Sleep 7 + + # + $latestFile = Get-ChildItem -Path $videoPath | Where-Object { -not $_.PSIsContainer } | Sort-Object CreationTime -Descending | Select-Object -First 1 + # Generate a timestamp in ddMMMyyyy-HH:mm format + $timestamp = (Get-Date).ToString("ddMMMyyyy-HHmm") + # Rename the file if it exists + if ($latestFile) { + Rename-Item -Path $latestFile.FullName -NewName "$enemyPilot.$enemyShip.$timestamp.mp4" + } + } + Start-Sleep $sleeptimer + } + } + + # Get Logged-in User + If ($line -match $loginPattern) { + # Load gamelog into memory + $authLog = Get-Content -Path $logFilePath + $authLog = $authlog -match $loginPattern + $authLog = $authLog | Out-String + + # Extract User Name + $nameExtract = "name\s+(?<PlayerName>[^\s-]+)" + + If ($authLog -match $nameExtract -and $global:userName -ne $nameExtract){ + $global:userName = $matches['PlayerName'] + Write-Host "Logged in as $global:userName" -ForegroundColor Green + Write-Host "-------------------------" + } + } + + # Detect PU or AC + if ($line -match $puPattern -and $global:logStart -eq $FALSE) { + $global:logStart = $TRUE + Write-Host "=== Logging: $global:logStart" -ForegroundColor Green + Write-Host "-------------------------" + } + if ($line -match $acPattern -and $global:logStart -eq $TRUE) { + $global:logStart = $FALSE + Write-Host "=== Logging: $global:logStart" -ForegroundColor Red + Write-Host "-------------------------" + } + + #Set loadout + if ($line -match $loadoutPattern) { + $entity = $matches['Entity'] + $ownerGEID = $matches['OwnerGEID'] + + If ($ownerGEID -eq $global:userName -and $entity -notlike "*SoundListener*" -and $entity -notlike "*StreamingSOC*" -and $entity -ne $global:userName) { + $global:loadOut = $entity + If ($global:loadOut -match $cleanupPattern){ + $global:loadOut = $matches[1] + } + Write-Host "=== Loadout: $global:loadOut" -ForegroundColor Yellow + Write-Host "-------------------------" + + } + } +} + +# Monitor the log file and process new lines as they are added +Get-Content -Path $logFile -Wait -Tail 0 | ForEach-Object { + Read-LogEntry $_ +} +#> \ No newline at end of file diff --git a/AutoTrackR2/MainWindow.xaml b/AutoTrackR2/MainWindow.xaml new file mode 100644 index 0000000..53ef1e2 --- /dev/null +++ b/AutoTrackR2/MainWindow.xaml @@ -0,0 +1,39 @@ +<Window x:Class="AutoTrackR2.MainWindow" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + Title="AutoTrackR" Height="450" Width="800" + WindowStyle="None" ResizeMode="NoResize" + AllowsTransparency="True" + Style="{StaticResource CustomWindowStyle}"> + + <Grid> + <!-- Custom Title Bar --> + <DockPanel Height="30" VerticalAlignment="Top" MouseDown="TitleBar_MouseDown" Margin="5" Background="Transparent"> + <StackPanel Orientation="Horizontal" HorizontalAlignment="Right"> + <Button Content="_" Width="30" Height="25" Click="MinimizeWindow" Style="{StaticResource TitleButtonStyle}" FontFamily="{StaticResource Orbitron}"/> + <Button Content="X" Width="30" Height="25" Click="CloseWindow" Style="{StaticResource TitleButtonStyle}" FontFamily="{StaticResource Orbitron}"/> + </StackPanel> + </DockPanel> + <!-- Main Content Area --> + <Grid Margin="0,30,0,0"> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="150"/> + <ColumnDefinition Width="*"/> + </Grid.ColumnDefinitions> + + <!-- Left Tab Panel --> + <StackPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Margin="5,0,0,0"> + <Image x:Name="Logo" Height="138" Source="/Assets/AutoTrackR.png" Stretch="Fill" Width="141" RenderOptions.BitmapScalingMode="Fant"/> + <Button Content="Home" Name="HomeTab" Margin="10,40,10,10" Height="40" Style="{StaticResource TabButtonStyle}" Click="TabButton_Click"/> + <Button Content="Stats" Name="StatsTab" Margin="10" Height="40" Style="{StaticResource TabButtonStyle}" Click="TabButton_Click"/> + <Button Content="Update" Name="UpdateTab" Margin="10" Height="40" Style="{StaticResource TabButtonStyle}" Click="TabButton_Click"/> + <Button Content="Config" Name="ConfigTab" Margin="10" Height="40" Style="{StaticResource TabButtonStyle}" Click="TabButton_Click"/> + </StackPanel> + + <!-- Content Area --> + <ContentControl Grid.Column="1" Name="ContentControl" Margin="10"> + <!-- Default content can be set here --> + </ContentControl> + </Grid> + </Grid> +</Window> \ No newline at end of file diff --git a/AutoTrackR2/MainWindow.xaml.cs b/AutoTrackR2/MainWindow.xaml.cs new file mode 100644 index 0000000..8c9da87 --- /dev/null +++ b/AutoTrackR2/MainWindow.xaml.cs @@ -0,0 +1,236 @@ +using System.Collections.Generic; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using System.IO; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Animation; +using System.Windows.Threading; +using System; + +namespace AutoTrackR2 +{ + public partial class MainWindow : Window + { + private Dictionary<string, bool> tabStates = new Dictionary<string, bool> + { + { "HomeTab", true }, // HomeTab is selected by default + { "StatsTab", false }, + { "UpdateTab", false }, + { "ConfigTab", false } + }; + + private HomePage homePage; // Persistent HomePage instance + private bool isRunning = false; // Single source of truth for the running state + + // Ensure this method is not static + public void ChangeLogoImage(string imagePath) + { + Logo.Source = new BitmapImage(new Uri(imagePath, UriKind.RelativeOrAbsolute)); + } + + public MainWindow() + { + InitializeComponent(); + + // Load configuration settings before setting them in any page + ConfigManager.LoadConfig(); + + homePage = new HomePage(); // Create a single instance of HomePage + ContentControl.Content = homePage; // Default to HomePage + + // Attach event handlers for the HomePage buttons + homePage.StartButton.Click += StartButton_Click; + homePage.StopButton.Click += StopButton_Click; + + // Create ConfigPage and pass the MainWindow reference to it + var configPage = new ConfigPage(this); + + // Set config values after loading them + InitializeConfigPage(); + + UpdateTabVisuals(); + } + + private void CloseWindow(object sender, RoutedEventArgs e) => this.Close(); + + private void MinimizeWindow(object sender, RoutedEventArgs e) => this.WindowState = WindowState.Minimized; + + private void TitleBar_MouseDown(object sender, MouseButtonEventArgs e) + { + if (e.ChangedButton == MouseButton.Left) + { + this.DragMove(); + } + } + + private void TabButton_Click(object sender, RoutedEventArgs e) + { + Button clickedButton = (Button)sender; + string clickedTabName = clickedButton.Name; + + if (clickedTabName == "HomeTab") + { + // Reuse the existing HomePage instance + ContentControl.Content = homePage; + + // Update the button state on the HomePage + homePage.UpdateButtonState(isRunning); + } + else if (clickedTabName == "StatsTab") + { + ContentControl.Content = new StatsPage(); + } + else if (clickedTabName == "UpdateTab") + { + ContentControl.Content = new UpdatePage(); + } + else if (clickedTabName == "ConfigTab") + { + ContentControl.Content = new ConfigPage(this); + } + + // Update tab selection states + UpdateTabStates(clickedTabName); + + // Update the visual appearance of all tabs + UpdateTabVisuals(); + } + + private void UpdateTabStates(string activeTab) + { + foreach (var key in tabStates.Keys) + { + tabStates[key] = key == activeTab; + } + } + + public void UpdateTabVisuals() + { + var accentColor = (Color)Application.Current.Resources["AccentColor"]; + var backgroundDarkColor = (Color)Application.Current.Resources["BackgroundDarkColor"]; + var textColor = (Color)Application.Current.Resources["TextColor"]; + + foreach (var tabState in tabStates) + { + Button tabButton = (Button)this.FindName(tabState.Key); + if (tabButton != null) + { + tabButton.Effect = null; + + if (tabState.Value) // Active tab + { + tabButton.Background = new SolidColorBrush(accentColor); // Highlight color from theme + + // Add glow effect + tabButton.Effect = new DropShadowEffect + { + Color = accentColor, + BlurRadius = 20, // Adjust blur radius for desired glow intensity + ShadowDepth = 0, // Set shadow depth to 0 for a pure glow effect + Opacity = 1, // Set opacity for glow visibility + Direction = 0 // Direction doesn't matter for glow + }; + } + else // Inactive tab + { + tabButton.Background = new SolidColorBrush(backgroundDarkColor); // Default background from theme + } + } + } + } + + private void StartButton_Click(object sender, RoutedEventArgs e) + { + isRunning = true; // Update the running state + homePage.UpdateButtonState(isRunning); // Update HomePage button visuals + // Start your logic here + } + + private void StopButton_Click(object sender, RoutedEventArgs e) + { + isRunning = false; // Update the running state + homePage.UpdateButtonState(isRunning); // Update HomePage button visuals + // Stop your logic here + } + + private void InitializeConfigPage() + { + // Set the values from the loaded config + ConfigPage configPage = new ConfigPage(this); + + // Set the fields in ConfigPage.xaml.cs based on the loaded config + configPage.SetConfigValues( + ConfigManager.LogFile, + ConfigManager.ApiUrl, + ConfigManager.ApiKey, + ConfigManager.VideoPath, + ConfigManager.VisorWipe, + ConfigManager.VideoRecord, + ConfigManager.OfflineMode, + ConfigManager.Theme + ); + } + } + + public static class ConfigManager + { + public static string LogFile { get; set; } + public static string ApiUrl { get; set; } + public static string ApiKey { get; set; } + public static string VideoPath { get; set; } + public static int VisorWipe { get; set; } + public static int VideoRecord { get; set; } + public static int OfflineMode { get; set; } + public static int Theme { get; set; } + + public static void LoadConfig() + { + string exeDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + string configFilePath = Path.Combine(exeDirectory, "config.ini"); + + if (File.Exists(configFilePath)) + { + foreach (var line in File.ReadLines(configFilePath)) + { + if (line.StartsWith("LogFile=")) + LogFile = line.Substring("LogFile=".Length).Trim(); + else if (line.StartsWith("ApiUrl=")) + ApiUrl = line.Substring("ApiUrl=".Length).Trim(); + else if (line.StartsWith("ApiKey=")) + ApiKey = line.Substring("ApiKey=".Length).Trim(); + else if (line.StartsWith("VideoPath=")) + VideoPath = line.Substring("VideoPath=".Length).Trim(); + else if (line.StartsWith("VisorWipe=")) + VisorWipe = int.Parse(line.Substring("VisorWipe=".Length).Trim()); + else if (line.StartsWith("VideoRecord=")) + VideoRecord = int.Parse(line.Substring("VideoRecord=".Length).Trim()); + else if (line.StartsWith("OfflineMode=")) + OfflineMode = int.Parse(line.Substring("OfflineMode=".Length).Trim()); + else if (line.StartsWith("Theme=")) + Theme = int.Parse(line.Substring("Theme=".Length).Trim()); + } + } + } + + public static void SaveConfig() + { + string exeDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + string configFilePath = Path.Combine(exeDirectory, "config.ini"); + + using (StreamWriter writer = new StreamWriter(configFilePath)) + { + writer.WriteLine($"LogFile=\"{LogFile}\""); + writer.WriteLine($"ApiUrl=\"{ApiUrl}\""); + writer.WriteLine($"ApiKey=\"{ApiKey}\""); + writer.WriteLine($"VideoPath=\"{VideoPath}\""); + writer.WriteLine($"VisorWipe=\"{VisorWipe}\""); + writer.WriteLine($"VideoRecord=\"{VideoRecord}\""); + writer.WriteLine($"OfflineMode=\"{OfflineMode}\""); + writer.WriteLine($"Theme=\"{Theme}\""); + } + } + } +} diff --git a/AutoTrackR2/StatsPage.xaml b/AutoTrackR2/StatsPage.xaml new file mode 100644 index 0000000..8ba7626 --- /dev/null +++ b/AutoTrackR2/StatsPage.xaml @@ -0,0 +1,8 @@ +<UserControl x:Class="AutoTrackR2.StatsPage" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + Height="396" Width="626"> + <Grid Background="{DynamicResource BackgroundLightBrush}"> + <TextBlock Text="Welcome to the Stats Tab!" FontSize="24" Foreground="{DynamicResource TextBrush}" HorizontalAlignment="Center" VerticalAlignment="Center"/> + </Grid> +</UserControl> diff --git a/AutoTrackR2/StatsPage.xaml.cs b/AutoTrackR2/StatsPage.xaml.cs new file mode 100644 index 0000000..6ae05d3 --- /dev/null +++ b/AutoTrackR2/StatsPage.xaml.cs @@ -0,0 +1,12 @@ +using System.Windows.Controls; + +namespace AutoTrackR2 +{ + public partial class StatsPage : UserControl + { + public StatsPage() + { + InitializeComponent(); + } + } +} diff --git a/AutoTrackR2/UpdatePage.xaml b/AutoTrackR2/UpdatePage.xaml new file mode 100644 index 0000000..6f16fe9 --- /dev/null +++ b/AutoTrackR2/UpdatePage.xaml @@ -0,0 +1,8 @@ +<UserControl x:Class="AutoTrackR2.UpdatePage" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + Height="396" Width="626"> + <Grid Background="{DynamicResource BackgroundLightBrush}"> + <TextBlock Text="Welcome to the Update Tab!" FontSize="24" Foreground="{DynamicResource TextBrush}" HorizontalAlignment="Center" VerticalAlignment="Center"/> + </Grid> +</UserControl> diff --git a/AutoTrackR2/UpdatePage.xaml.cs b/AutoTrackR2/UpdatePage.xaml.cs new file mode 100644 index 0000000..e8b4302 --- /dev/null +++ b/AutoTrackR2/UpdatePage.xaml.cs @@ -0,0 +1,12 @@ +using System.Windows.Controls; + +namespace AutoTrackR2 +{ + public partial class UpdatePage : UserControl + { + public UpdatePage() + { + InitializeComponent(); + } + } +} diff --git a/AutoTrackR2_Setup/AutoTrackR2.ico b/AutoTrackR2_Setup/AutoTrackR2.ico new file mode 100644 index 0000000..05e94a2 Binary files /dev/null and b/AutoTrackR2_Setup/AutoTrackR2.ico differ diff --git a/AutoTrackR2_Setup/AutoTrackR2_Setup.vdproj b/AutoTrackR2_Setup/AutoTrackR2_Setup.vdproj new file mode 100644 index 0000000..ee11130 --- /dev/null +++ b/AutoTrackR2_Setup/AutoTrackR2_Setup.vdproj @@ -0,0 +1,737 @@ +"DeployProject" +{ +"VSVersion" = "3:800" +"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}" +"IsWebType" = "8:FALSE" +"ProjectName" = "8:AutoTrackR2_Setup" +"LanguageId" = "3:1033" +"CodePage" = "3:1252" +"UILanguageId" = "3:1033" +"SccProjectName" = "8:" +"SccLocalPath" = "8:" +"SccAuxPath" = "8:" +"SccProvider" = "8:" + "Hierarchy" + { + "Entry" + { + "MsmKey" = "8:_A24851E4CCB44E13956E7ABB707AFAF3" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D7592F55D6DB4D76B7100A7F9934B9AC" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + } + "Configurations" + { + "Debug" + { + "DisplayName" = "8:Debug" + "IsDebugOnly" = "11:TRUE" + "IsReleaseOnly" = "11:FALSE" + "OutputFilename" = "8:Debug\\AutoTrackR2_Setup.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:2" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + } + "Release" + { + "DisplayName" = "8:Release" + "IsDebugOnly" = "11:FALSE" + "IsReleaseOnly" = "11:TRUE" + "OutputFilename" = "8:Release\\AutoTrackR2_Setup.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:2" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + } + } + "Deployable" + { + "CustomAction" + { + } + "DefaultFeature" + { + "Name" = "8:DefaultFeature" + "Title" = "8:" + "Description" = "8:" + } + "ExternalPersistence" + { + "LaunchCondition" + { + } + } + "File" + { + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D7592F55D6DB4D76B7100A7F9934B9AC" + { + "SourcePath" = "8:AutoTrackR2.ico" + "TargetName" = "8:AutoTrackR2.ico" + "Tag" = "8:" + "Folder" = "8:_CB06E66FE1FF4B369EBBE88EF55F98CD" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + } + "FileType" + { + } + "Folder" + { + "{1525181F-901A-416C-8A58-119130FE478E}:_12FB7FAF80594D2C92B9C0E2E8F48833" + { + "Name" = "8:#1919" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:ProgramMenuFolder" + "Folders" + { + } + } + "{1525181F-901A-416C-8A58-119130FE478E}:_579F334DBA57439CBDECCA5F443D154B" + { + "Name" = "8:#1916" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:DesktopFolder" + "Folders" + { + } + } + "{3C67513D-01DD-4637-8A68-80971EB9504F}:_CB06E66FE1FF4B369EBBE88EF55F98CD" + { + "DefaultLocation" = "8:[ProgramFilesFolder][Manufacturer]\\[ProductName]" + "Name" = "8:#1925" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:TARGETDIR" + "Folders" + { + } + } + } + "LaunchCondition" + { + } + "Locator" + { + } + "MsiBootstrapper" + { + "LangId" = "3:1033" + "RequiresElevation" = "11:FALSE" + } + "Product" + { + "Name" = "8:Microsoft Visual Studio" + "ProductName" = "8:AutoTrackR2_Setup" + "ProductCode" = "8:{0B3FEBBD-6A78-48FC-BA26-42F6096DA6F5}" + "PackageCode" = "8:{73508E4E-CAAC-418C-8C72-C061905BB75C}" + "UpgradeCode" = "8:{036AE5C2-4EEB-4DFB-B56E-9000603C8E1E}" + "AspNetVersion" = "8:2.0.50727.0" + "RestartWWWService" = "11:FALSE" + "RemovePreviousVersions" = "11:TRUE" + "DetectNewerInstalledVersion" = "11:TRUE" + "InstallAllUsers" = "11:TRUE" + "ProductVersion" = "8:1.0.0" + "Manufacturer" = "8:GrieferNet" + "ARPHELPTELEPHONE" = "8:" + "ARPHELPLINK" = "8:" + "Title" = "8:AutoTrackR2_Setup" + "Subject" = "8:" + "ARPCONTACT" = "8:Fisk_Nian" + "Keywords" = "8:" + "ARPCOMMENTS" = "8:Setup AutoTrackR2." + "ARPURLINFOABOUT" = "8:https://griefernet.org/" + "ARPPRODUCTICON" = "8:" + "ARPIconIndex" = "3:0" + "SearchPath" = "8:" + "UseSystemSearchPath" = "11:TRUE" + "TargetPlatform" = "3:0" + "PreBuildEvent" = "8:" + "PostBuildEvent" = "8:" + "RunPostBuildEvent" = "3:0" + } + "Registry" + { + "HKLM" + { + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_CABE0997872649628E777532FF069619" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_EEC98959116A4294BC24B9971B9E806B" + { + "Name" = "8:[Manufacturer]" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + } + } + "HKCU" + { + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_EED4AE0A1E2E4EDD882FE1C77C43F63E" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D6C9D0B71048424A97D661F444C05F99" + { + "Name" = "8:[Manufacturer]" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + } + } + "HKCR" + { + "Keys" + { + } + } + "HKU" + { + "Keys" + { + } + } + "HKPU" + { + "Keys" + { + } + } + } + "Sequences" + { + } + "Shortcut" + { + "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_16A46D37606E484FA2731DF6906A9852" + { + "Name" = "8:AutoTrackR2" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_A24851E4CCB44E13956E7ABB707AFAF3" + "Folder" = "8:_12FB7FAF80594D2C92B9C0E2E8F48833" + "WorkingFolder" = "8:_CB06E66FE1FF4B369EBBE88EF55F98CD" + "Icon" = "8:_D7592F55D6DB4D76B7100A7F9934B9AC" + "Feature" = "8:" + } + "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_C24193DF92E147468BFD5AB3AE933C25" + { + "Name" = "8:AutoTrackR2" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_A24851E4CCB44E13956E7ABB707AFAF3" + "Folder" = "8:_579F334DBA57439CBDECCA5F443D154B" + "WorkingFolder" = "8:_CB06E66FE1FF4B369EBBE88EF55F98CD" + "Icon" = "8:_D7592F55D6DB4D76B7100A7F9934B9AC" + "Feature" = "8:" + } + } + "UserInterface" + { + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_015EBE98A1CF4DD7AE3842B50A376347" + { + "Name" = "8:#1901" + "Sequence" = "3:1" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_63F1CE1BDEA143C08F073A23FC706A1A" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_0165D8A281694188AD78D4B37C2EB7DB" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim" + } + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_4CDD0401FAD64C46A23593CE68371FE5" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim" + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_679CF890D55B428DAE6A37FAFA98A43B" + { + "Name" = "8:#1902" + "Sequence" = "3:1" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_6676A184BC2B46CC802280AE8946C6BF" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "UpdateText" + { + "Name" = "8:UpdateText" + "DisplayName" = "8:#1058" + "Description" = "8:#1158" + "Type" = "3:15" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1258" + "DefaultValue" = "8:#1258" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_8F9B9C1FF2E54C26BB226BD2C0455E0F" + { + "Name" = "8:#1900" + "Sequence" = "3:2" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_13DE8268FB9F45FBAA3105F13585C757" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1202" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_603BCFA20DEE4DC88DBDFB8564FB477F" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A1FB5C890ADA4DC2AF82E38E994FAAC2" + { + "Sequence" = "3:200" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_A07D2D2E65EF455F992A28ADD024715E" + { + "Name" = "8:#1901" + "Sequence" = "3:2" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_084F8D49DB95439392026C31D354E963" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_D616934338B042F49E30698BBCC2E312" + { + "Name" = "8:#1900" + "Sequence" = "3:1" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_146719AC166E40C48A5A1567600C4208" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_47602CB2E1D242D7922211A0483296F2" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1202" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_8E7EC8448905425DBD9E7BB7A5CE8295" + { + "Sequence" = "3:200" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "InstallAllUsersVisible" + { + "Name" = "8:InstallAllUsersVisible" + "DisplayName" = "8:#1059" + "Description" = "8:#1159" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_E659FA2923A64458A279F42675485E17" + { + "Name" = "8:#1902" + "Sequence" = "3:2" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_641FD66A380643A6920145786A209DF5" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + } + "MergeModule" + { + } + "ProjectOutput" + { + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_A24851E4CCB44E13956E7ABB707AFAF3" + { + "SourcePath" = "8:..\\AutoTrackR2\\obj\\Debug\\net9.0-windows\\apphost.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_CB06E66FE1FF4B369EBBE88EF55F98CD" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:PublishItems" + "OutputProjectGuid" = "8:{31093634-8FBB-4BC6-BEA4-DAD6C11404F3}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + } + } +}