diff --git a/acc-web/accserver/acServer b/acc-web/accserver/acServer
deleted file mode 100644
index a4a238c..0000000
Binary files a/acc-web/accserver/acServer and /dev/null differ
diff --git a/acc-web/accserver/acServer.bat b/acc-web/accserver/acServer.bat
deleted file mode 100644
index d0ed819..0000000
--- a/acc-web/accserver/acServer.bat
+++ /dev/null
@@ -1,14 +0,0 @@
-@echo off
-TITLE AC Server
-echo Starting AC Server...
-SETLOCAL EnableDelayedExpansion
- for /f "skip=1 tokens=1-6 delims= " %%a in ('wmic path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /format:table') do (
- IF NOT "%%~f"=="" (
- set /a _d=10000 * %%f + 100 * %%d + %%a
- set /a _t=10000 * %%b + 100 * %%c + %%e
- )
- )
-
-echo Output is logs/session/output%_d%_%_t%.log
-
-acserver.exe > logs/session/output%_d%_%_t%.log 2> logs/error/error%_d%_%_t%.log
\ No newline at end of file
diff --git a/acc-web/accserver/acServer.exe b/acc-web/accserver/acServer.exe
deleted file mode 100644
index 07ce514..0000000
Binary files a/acc-web/accserver/acServer.exe and /dev/null differ
diff --git a/acc-web/accserver/acServerManager.exe b/acc-web/accserver/acServerManager.exe
deleted file mode 100644
index 1d9a0fe..0000000
Binary files a/acc-web/accserver/acServerManager.exe and /dev/null differ
diff --git a/acc-web/accserver/acServerManager.pdb b/acc-web/accserver/acServerManager.pdb
deleted file mode 100644
index b94a15d..0000000
Binary files a/acc-web/accserver/acServerManager.pdb and /dev/null differ
diff --git a/acc-web/accserver/blacklist.txt b/acc-web/accserver/blacklist.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/acc-web/accserver/cfg/entry_list.ini b/acc-web/accserver/cfg/entry_list.ini
deleted file mode 100644
index c8e4666..0000000
--- a/acc-web/accserver/cfg/entry_list.ini
+++ /dev/null
@@ -1,197 +0,0 @@
-[CAR_0]
-MODEL=bmw_m3_e30
-SKIN=alpine_white_I
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=
-
-[CAR_1]
-MODEL=bmw_m3_e30
-SKIN=Brilliant_red
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_2]
-MODEL=bmw_m3_e30
-SKIN=Cinnabar_red
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_3]
-MODEL=bmw_m3_e30
-SKIN=0_Diamond_Black_metallic
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_4]
-MODEL=bmw_m3_e30
-SKIN=Henna_Red
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_5]
-MODEL=bmw_m3_e30
-SKIN=Jet_Black
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_6]
-MODEL=bmw_m3_e30
-SKIN=Macau_Blue_Metallic
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_7]
-MODEL=bmw_m3_e30
-SKIN=Misano_red
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_8]
-MODEL=bmw_m3_e30
-SKIN=Nogaro_Silver_metallic
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_9]
-MODEL=bmw_m3_e30
-SKIN=Salmon_Silver_metallic
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_10]
-MODEL=bmw_m3_e30
-SKIN=Sterling_Silver_metallic
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_11]
-MODEL=bmw_m3_e30
-SKIN=alpine_white_I
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_12]
-MODEL=bmw_m3_e30
-SKIN=Brilliant_red
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_13]
-MODEL=bmw_m3_e30
-SKIN=Cinnabar_red
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_14]
-MODEL=bmw_m3_e30
-SKIN=0_Diamond_Black_metallic
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_15]
-MODEL=bmw_m3_e30
-SKIN=Henna_Red
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_16]
-MODEL=bmw_m3_e30
-SKIN=Jet_Black
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_17]
-MODEL=bmw_m3_e30
-SKIN=Macau_Blue_Metallic
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_18]
-MODEL=bmw_m3_e30
-SKIN=Misano_red
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_19]
-MODEL=bmw_m3_e30
-SKIN=Nogaro_Silver_metallic
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_20]
-MODEL=bmw_m3_e30
-SKIN=Salmon_Silver_metallic
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_21]
-MODEL=bmw_m3_e30
-SKIN=Sterling_Silver_metallic
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
diff --git a/acc-web/accserver/cfg/server_cfg.ini b/acc-web/accserver/cfg/server_cfg.ini
deleted file mode 100644
index 9087217..0000000
--- a/acc-web/accserver/cfg/server_cfg.ini
+++ /dev/null
@@ -1,74 +0,0 @@
-[SERVER]
-NAME=AC_Server
-CARS=bmw_m3_e30
-CONFIG_TRACK=
-TRACK=magione
-SUN_ANGLE=48
-PASSWORD=
-ADMIN_PASSWORD=mypassword
-UDP_PORT=9600
-TCP_PORT=9600
-HTTP_PORT=8081
-PICKUP_MODE_ENABLED=1
-LOOP_MODE=1
-SLEEP_TIME=1
-CLIENT_SEND_INTERVAL_HZ=18
-SEND_BUFFER_SIZE=0
-RECV_BUFFER_SIZE=0
-RACE_OVER_TIME=180
-KICK_QUORUM=85
-VOTING_QUORUM=80
-VOTE_DURATION=20
-BLACKLIST_MODE=1
-FUEL_RATE=100
-DAMAGE_MULTIPLIER=100
-TYRE_WEAR_RATE=100
-ALLOWED_TYRES_OUT=2
-ABS_ALLOWED=1
-TC_ALLOWED=1
-STABILITY_ALLOWED=0
-AUTOCLUTCH_ALLOWED=0
-TYRE_BLANKETS_ALLOWED=0
-FORCE_VIRTUAL_MIRROR=1
-REGISTER_TO_LOBBY=1
-MAX_CLIENTS=18
-UDP_PLUGIN_LOCAL_PORT=0
-UDP_PLUGIN_ADDRESS=
-AUTH_PLUGIN_ADDRESS=
-LEGAL_TYRES=SV
-
-[PRACTICE]
-NAME=Practice
-TIME=10
-IS_OPEN=1
-
-[QUALIFY]
-NAME=Qualify
-TIME=10
-IS_OPEN=1
-
-[RACE]
-NAME=Race
-LAPS=5
-WAIT_TIME=60
-IS_OPEN=1
-
-[DYNAMIC_TRACK]
-SESSION_START=89
-RANDOMNESS=3
-SESSION_TRANSFER=80
-LAP_GAIN=50
-
-[WEATHER_0]
-GRAPHICS=3_clear
-BASE_TEMPERATURE_AMBIENT=18
-BASE_TEMPERATURE_ROAD=6
-VARIATION_AMBIENT=1
-VARIATION_ROAD=1
-
-[WEATHER_1]
-GRAPHICS=7_heavy_clouds
-BASE_TEMPERATURE_AMBIENT=15
-BASE_TEMPERATURE_ROAD=-1
-VARIATION_AMBIENT=1
-VARIATION_ROAD=1
diff --git a/acc-web/accserver/changelog.txt b/acc-web/accserver/changelog.txt
new file mode 100755
index 0000000..6a8820f
--- /dev/null
+++ b/acc-web/accserver/changelog.txt
@@ -0,0 +1,84 @@
+1.9.3
+- Added support for McLaren 720S GT3 Evo.
+
+1.9.0
+- Added support for GTWCH 2023 DLC content.
+
+1.8.18
+- Updated formation trigger points for Watkins Glen and Zandvoort.
+
+1.8.17
+- Added option to access servers with "registerToLobby": 0".
+- Updated server admin handbook.
+- Fixed a server vulnerability reported by Leonard Schüngel.
+
+1.8.16
+- Protocol update to follow client update.
+
+1.8.15
+- Support for DLC track content.
+- Updated server admin handbook.
+
+1.8.12
+- Support for DLC car content.
+- Updated server admin handbook.
+
+1.8.11
+- Disqualification for reckless driving (extreme amounts of cutting, pitlane speeding and driving in wrong way) is no longer reduced with "allowAutoDQ" set to 0.
+- Disqualification for failure to serve penalties within 3 laps is no longer prevented with "allowAutoDQ" set to 0.
+NOTE: only race format and regulation-related DQ penalties (e.g. failure to serve mandatory pit stop) may be reduced with the server override.
+- Assist rules with no manual override available (e.g. automatic lights) are no longer enforced by the server.
+
+1.8.5
+- Introduced a "publicIP" setting (configuration.json).
+- Updated server admin handbook.
+
+1.8.2
+- Updated server admin handbook.
+
+1.8.0
+- Protol update to follow client update.
+- Track season versions (_2019, _2020) deprecated, all config should use regular track name only (e.g. "misano").
+- Adjusted formation lap trigger points on a number of tracks.
+- Weather model aligned with client update.
+- Updated server admin handbook.
+
+1.7.12
+- Protocol update to follow client update.
+
+1.7.6
+- Adjusted formation lap trigger points for Donington and Oulton Park.
+- Broadcaster: added missing nationality enums.
+
+1.7.4
+- Adjusted formation lap trigger points for Kyalami.
+- Added setting ignorePrematureDisconnects (ignore unless you try to run servers on not supported operating systems, see handbook).
+- Locked races are now properly visible in the server list.
+
+1.7.1
+- Removed spammy log line.
+
+1.7.0
+- Added support for British GT track content.
+- Expanded grid size on Silverstone and Paul Ricard (see Server Handbook).
+- Formation lap - added threshold zone in the double file formation phase in the widget formation type to avoid undeserved penalties for cars in the inside lane on tracks with tight final corners.
+- Minor tweaks for the weather model to match the latest ACC client version.
+
+1.6.1
+- Fixed server track rotation onto unavailable tracks.
+
+1.6.0
+- Protocol update to match ACC client 1.6 release.
+
+1.5.9
+- Minor tweaks for the weather model to match the latest ACC client version.
+
+1.5.8
+- ACC Server is now separated from the main Assetto Corsa Competizione Steam product and is available under the Steam Tools section.
+- Fixed a specific corner case where a results dump would not be generated in qualifying/hotlap servers if the last player to leave the server prematurely (i.e. before the session time is up) has no laptime data on his leaderboard.
+- Fixed an issue with dynamic wind in Multiplayer.
+- Unified and improved Singleplayer and Multiplayer weather model:
+Improved weather predictability and control especially for server admins.
+Removed the tendendcy to snap into Thunderstorm when using more dynamic parameters.
+"Rain" parameter is now the major component responsible for maximum rain intensity to be expected.
+- Updated server admin handbook v9.
\ No newline at end of file
diff --git a/acc-web/accserver/content/cars/abarth500/data.acd b/acc-web/accserver/content/cars/abarth500/data.acd
deleted file mode 100644
index 007a5a7..0000000
Binary files a/acc-web/accserver/content/cars/abarth500/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/abarth500_s1/data.acd b/acc-web/accserver/content/cars/abarth500_s1/data.acd
deleted file mode 100644
index 41c2f7e..0000000
Binary files a/acc-web/accserver/content/cars/abarth500_s1/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/alfa_romeo_giulietta_qv/data.acd b/acc-web/accserver/content/cars/alfa_romeo_giulietta_qv/data.acd
deleted file mode 100644
index ee41183..0000000
Binary files a/acc-web/accserver/content/cars/alfa_romeo_giulietta_qv/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/alfa_romeo_giulietta_qv_le/data.acd b/acc-web/accserver/content/cars/alfa_romeo_giulietta_qv_le/data.acd
deleted file mode 100644
index 7a2ffce..0000000
Binary files a/acc-web/accserver/content/cars/alfa_romeo_giulietta_qv_le/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/bmw_1m/data.acd b/acc-web/accserver/content/cars/bmw_1m/data.acd
deleted file mode 100644
index 2936284..0000000
Binary files a/acc-web/accserver/content/cars/bmw_1m/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/bmw_1m_s3/data.acd b/acc-web/accserver/content/cars/bmw_1m_s3/data.acd
deleted file mode 100644
index 6c317f3..0000000
Binary files a/acc-web/accserver/content/cars/bmw_1m_s3/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/bmw_m3_e30/data.acd b/acc-web/accserver/content/cars/bmw_m3_e30/data.acd
deleted file mode 100644
index 887428d..0000000
Binary files a/acc-web/accserver/content/cars/bmw_m3_e30/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/bmw_m3_e30_drift/data.acd b/acc-web/accserver/content/cars/bmw_m3_e30_drift/data.acd
deleted file mode 100644
index 0b8c96c..0000000
Binary files a/acc-web/accserver/content/cars/bmw_m3_e30_drift/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/bmw_m3_e30_dtm/data.acd b/acc-web/accserver/content/cars/bmw_m3_e30_dtm/data.acd
deleted file mode 100644
index 6c24b4c..0000000
Binary files a/acc-web/accserver/content/cars/bmw_m3_e30_dtm/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/bmw_m3_e30_gra/data.acd b/acc-web/accserver/content/cars/bmw_m3_e30_gra/data.acd
deleted file mode 100644
index 3c5f282..0000000
Binary files a/acc-web/accserver/content/cars/bmw_m3_e30_gra/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/bmw_m3_e30_s1/data.acd b/acc-web/accserver/content/cars/bmw_m3_e30_s1/data.acd
deleted file mode 100644
index 8505214..0000000
Binary files a/acc-web/accserver/content/cars/bmw_m3_e30_s1/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/bmw_m3_e92/data.acd b/acc-web/accserver/content/cars/bmw_m3_e92/data.acd
deleted file mode 100644
index 699b212..0000000
Binary files a/acc-web/accserver/content/cars/bmw_m3_e92/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/bmw_m3_e92_drift/data.acd b/acc-web/accserver/content/cars/bmw_m3_e92_drift/data.acd
deleted file mode 100644
index b8bd586..0000000
Binary files a/acc-web/accserver/content/cars/bmw_m3_e92_drift/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/bmw_m3_e92_s1/data.acd b/acc-web/accserver/content/cars/bmw_m3_e92_s1/data.acd
deleted file mode 100644
index db59ce2..0000000
Binary files a/acc-web/accserver/content/cars/bmw_m3_e92_s1/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/bmw_m3_gt2/data.acd b/acc-web/accserver/content/cars/bmw_m3_gt2/data.acd
deleted file mode 100644
index 494df2a..0000000
Binary files a/acc-web/accserver/content/cars/bmw_m3_gt2/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/bmw_z4/data.acd b/acc-web/accserver/content/cars/bmw_z4/data.acd
deleted file mode 100644
index f38b2c2..0000000
Binary files a/acc-web/accserver/content/cars/bmw_z4/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/bmw_z4_drift/data.acd b/acc-web/accserver/content/cars/bmw_z4_drift/data.acd
deleted file mode 100644
index 8ff138e..0000000
Binary files a/acc-web/accserver/content/cars/bmw_z4_drift/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/bmw_z4_gt3/data.acd b/acc-web/accserver/content/cars/bmw_z4_gt3/data.acd
deleted file mode 100644
index 91378ca..0000000
Binary files a/acc-web/accserver/content/cars/bmw_z4_gt3/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/bmw_z4_s1/data.acd b/acc-web/accserver/content/cars/bmw_z4_s1/data.acd
deleted file mode 100644
index b6f189e..0000000
Binary files a/acc-web/accserver/content/cars/bmw_z4_s1/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ferrari_312t/data.acd b/acc-web/accserver/content/cars/ferrari_312t/data.acd
deleted file mode 100644
index fcc09b8..0000000
Binary files a/acc-web/accserver/content/cars/ferrari_312t/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ferrari_458/data.acd b/acc-web/accserver/content/cars/ferrari_458/data.acd
deleted file mode 100644
index f9233a8..0000000
Binary files a/acc-web/accserver/content/cars/ferrari_458/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ferrari_458_gt2/data.acd b/acc-web/accserver/content/cars/ferrari_458_gt2/data.acd
deleted file mode 100644
index 3ed2856..0000000
Binary files a/acc-web/accserver/content/cars/ferrari_458_gt2/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ferrari_458_s3/data.acd b/acc-web/accserver/content/cars/ferrari_458_s3/data.acd
deleted file mode 100644
index bedc4da..0000000
Binary files a/acc-web/accserver/content/cars/ferrari_458_s3/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ferrari_599xxevo/data.acd b/acc-web/accserver/content/cars/ferrari_599xxevo/data.acd
deleted file mode 100644
index 52f2ec7..0000000
Binary files a/acc-web/accserver/content/cars/ferrari_599xxevo/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ferrari_f40/data.acd b/acc-web/accserver/content/cars/ferrari_f40/data.acd
deleted file mode 100644
index fdf5d0d..0000000
Binary files a/acc-web/accserver/content/cars/ferrari_f40/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ferrari_f40_s3/data.acd b/acc-web/accserver/content/cars/ferrari_f40_s3/data.acd
deleted file mode 100644
index 6fdabbf..0000000
Binary files a/acc-web/accserver/content/cars/ferrari_f40_s3/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ferrari_laferrari/data.acd b/acc-web/accserver/content/cars/ferrari_laferrari/data.acd
deleted file mode 100644
index f6c1389..0000000
Binary files a/acc-web/accserver/content/cars/ferrari_laferrari/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_abarth_595ss/data.acd b/acc-web/accserver/content/cars/ks_abarth_595ss/data.acd
deleted file mode 100644
index a82fdf5..0000000
Binary files a/acc-web/accserver/content/cars/ks_abarth_595ss/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_abarth_595ss_s1/data.acd b/acc-web/accserver/content/cars/ks_abarth_595ss_s1/data.acd
deleted file mode 100644
index 2022e65..0000000
Binary files a/acc-web/accserver/content/cars/ks_abarth_595ss_s1/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_abarth_595ss_s2/data.acd b/acc-web/accserver/content/cars/ks_abarth_595ss_s2/data.acd
deleted file mode 100644
index fab807b..0000000
Binary files a/acc-web/accserver/content/cars/ks_abarth_595ss_s2/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_alfa_33_stradale/data.acd b/acc-web/accserver/content/cars/ks_alfa_33_stradale/data.acd
deleted file mode 100644
index a6509b3..0000000
Binary files a/acc-web/accserver/content/cars/ks_alfa_33_stradale/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_alfa_giulia_qv/data.acd b/acc-web/accserver/content/cars/ks_alfa_giulia_qv/data.acd
deleted file mode 100644
index 32cf344..0000000
Binary files a/acc-web/accserver/content/cars/ks_alfa_giulia_qv/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_alfa_mito_qv/data.acd b/acc-web/accserver/content/cars/ks_alfa_mito_qv/data.acd
deleted file mode 100644
index c9f9d80..0000000
Binary files a/acc-web/accserver/content/cars/ks_alfa_mito_qv/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_audi_a1s1/data.acd b/acc-web/accserver/content/cars/ks_audi_a1s1/data.acd
deleted file mode 100644
index 038ea17..0000000
Binary files a/acc-web/accserver/content/cars/ks_audi_a1s1/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_audi_r8_plus/data.acd b/acc-web/accserver/content/cars/ks_audi_r8_plus/data.acd
deleted file mode 100644
index 9916f71..0000000
Binary files a/acc-web/accserver/content/cars/ks_audi_r8_plus/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_audi_sport_quattro/data.acd b/acc-web/accserver/content/cars/ks_audi_sport_quattro/data.acd
deleted file mode 100644
index b7f6ec9..0000000
Binary files a/acc-web/accserver/content/cars/ks_audi_sport_quattro/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_audi_sport_quattro_rally/data.acd b/acc-web/accserver/content/cars/ks_audi_sport_quattro_rally/data.acd
deleted file mode 100644
index 420a094..0000000
Binary files a/acc-web/accserver/content/cars/ks_audi_sport_quattro_rally/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_audi_sport_quattro_s1/data.acd b/acc-web/accserver/content/cars/ks_audi_sport_quattro_s1/data.acd
deleted file mode 100644
index ba95ecf..0000000
Binary files a/acc-web/accserver/content/cars/ks_audi_sport_quattro_s1/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_corvette_c7_stingray/data.acd b/acc-web/accserver/content/cars/ks_corvette_c7_stingray/data.acd
deleted file mode 100644
index 3a48001..0000000
Binary files a/acc-web/accserver/content/cars/ks_corvette_c7_stingray/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_ford_mustang_2015/data.acd b/acc-web/accserver/content/cars/ks_ford_mustang_2015/data.acd
deleted file mode 100644
index f0084c2..0000000
Binary files a/acc-web/accserver/content/cars/ks_ford_mustang_2015/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_lamborghini_huracan_performante/data.acd b/acc-web/accserver/content/cars/ks_lamborghini_huracan_performante/data.acd
deleted file mode 100644
index 99328a6..0000000
Binary files a/acc-web/accserver/content/cars/ks_lamborghini_huracan_performante/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_lamborghini_miura_sv/data.acd b/acc-web/accserver/content/cars/ks_lamborghini_miura_sv/data.acd
deleted file mode 100644
index f8da8af..0000000
Binary files a/acc-web/accserver/content/cars/ks_lamborghini_miura_sv/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_lamborghini_sesto_elemento/data.acd b/acc-web/accserver/content/cars/ks_lamborghini_sesto_elemento/data.acd
deleted file mode 100644
index fcd640c..0000000
Binary files a/acc-web/accserver/content/cars/ks_lamborghini_sesto_elemento/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_maserati_alfieri/data.acd b/acc-web/accserver/content/cars/ks_maserati_alfieri/data.acd
deleted file mode 100644
index 6ac362f..0000000
Binary files a/acc-web/accserver/content/cars/ks_maserati_alfieri/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_maserati_levante/data.acd b/acc-web/accserver/content/cars/ks_maserati_levante/data.acd
deleted file mode 100644
index 62e5da6..0000000
Binary files a/acc-web/accserver/content/cars/ks_maserati_levante/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_maserati_quattroporte/data.acd b/acc-web/accserver/content/cars/ks_maserati_quattroporte/data.acd
deleted file mode 100644
index 0f04d28..0000000
Binary files a/acc-web/accserver/content/cars/ks_maserati_quattroporte/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_mazda_787b/data.acd b/acc-web/accserver/content/cars/ks_mazda_787b/data.acd
deleted file mode 100644
index 6dad104..0000000
Binary files a/acc-web/accserver/content/cars/ks_mazda_787b/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_mazda_miata/data.acd b/acc-web/accserver/content/cars/ks_mazda_miata/data.acd
deleted file mode 100644
index 38ff31c..0000000
Binary files a/acc-web/accserver/content/cars/ks_mazda_miata/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_nissan_gtr/data.acd b/acc-web/accserver/content/cars/ks_nissan_gtr/data.acd
deleted file mode 100644
index 133eaae..0000000
Binary files a/acc-web/accserver/content/cars/ks_nissan_gtr/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_pagani_huayra_bc/data.acd b/acc-web/accserver/content/cars/ks_pagani_huayra_bc/data.acd
deleted file mode 100644
index d0f3edb..0000000
Binary files a/acc-web/accserver/content/cars/ks_pagani_huayra_bc/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_porsche_cayenne/data.acd b/acc-web/accserver/content/cars/ks_porsche_cayenne/data.acd
deleted file mode 100644
index f0f56fb..0000000
Binary files a/acc-web/accserver/content/cars/ks_porsche_cayenne/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_porsche_macan/data.acd b/acc-web/accserver/content/cars/ks_porsche_macan/data.acd
deleted file mode 100644
index 8cbae5a..0000000
Binary files a/acc-web/accserver/content/cars/ks_porsche_macan/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_porsche_panamera/data.acd b/acc-web/accserver/content/cars/ks_porsche_panamera/data.acd
deleted file mode 100644
index c7eda50..0000000
Binary files a/acc-web/accserver/content/cars/ks_porsche_panamera/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ks_toyota_gt86/data.acd b/acc-web/accserver/content/cars/ks_toyota_gt86/data.acd
deleted file mode 100644
index c6d0dbd..0000000
Binary files a/acc-web/accserver/content/cars/ks_toyota_gt86/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ktm_xbow_r/data.acd b/acc-web/accserver/content/cars/ktm_xbow_r/data.acd
deleted file mode 100644
index b8ec199..0000000
Binary files a/acc-web/accserver/content/cars/ktm_xbow_r/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_2_eleven/data.acd b/acc-web/accserver/content/cars/lotus_2_eleven/data.acd
deleted file mode 100644
index 1890c44..0000000
Binary files a/acc-web/accserver/content/cars/lotus_2_eleven/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_2_eleven_gt4/data.acd b/acc-web/accserver/content/cars/lotus_2_eleven_gt4/data.acd
deleted file mode 100644
index c0eab33..0000000
Binary files a/acc-web/accserver/content/cars/lotus_2_eleven_gt4/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_49/data.acd b/acc-web/accserver/content/cars/lotus_49/data.acd
deleted file mode 100644
index 383b7c5..0000000
Binary files a/acc-web/accserver/content/cars/lotus_49/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_98t/data.acd b/acc-web/accserver/content/cars/lotus_98t/data.acd
deleted file mode 100644
index 9c79c36..0000000
Binary files a/acc-web/accserver/content/cars/lotus_98t/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_elise_sc/data.acd b/acc-web/accserver/content/cars/lotus_elise_sc/data.acd
deleted file mode 100644
index 38ed684..0000000
Binary files a/acc-web/accserver/content/cars/lotus_elise_sc/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_elise_sc_s1/data.acd b/acc-web/accserver/content/cars/lotus_elise_sc_s1/data.acd
deleted file mode 100644
index e75fa8e..0000000
Binary files a/acc-web/accserver/content/cars/lotus_elise_sc_s1/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_elise_sc_s2/data.acd b/acc-web/accserver/content/cars/lotus_elise_sc_s2/data.acd
deleted file mode 100644
index 3042f54..0000000
Binary files a/acc-web/accserver/content/cars/lotus_elise_sc_s2/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_evora_gtc/data.acd b/acc-web/accserver/content/cars/lotus_evora_gtc/data.acd
deleted file mode 100644
index 4791ece..0000000
Binary files a/acc-web/accserver/content/cars/lotus_evora_gtc/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_evora_gte/data.acd b/acc-web/accserver/content/cars/lotus_evora_gte/data.acd
deleted file mode 100644
index 82d5055..0000000
Binary files a/acc-web/accserver/content/cars/lotus_evora_gte/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_evora_gte_carbon/data.acd b/acc-web/accserver/content/cars/lotus_evora_gte_carbon/data.acd
deleted file mode 100644
index 9f30498..0000000
Binary files a/acc-web/accserver/content/cars/lotus_evora_gte_carbon/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_evora_gx/data.acd b/acc-web/accserver/content/cars/lotus_evora_gx/data.acd
deleted file mode 100644
index 9e73545..0000000
Binary files a/acc-web/accserver/content/cars/lotus_evora_gx/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_evora_s/data.acd b/acc-web/accserver/content/cars/lotus_evora_s/data.acd
deleted file mode 100644
index e5e34d0..0000000
Binary files a/acc-web/accserver/content/cars/lotus_evora_s/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_evora_s_s2/data.acd b/acc-web/accserver/content/cars/lotus_evora_s_s2/data.acd
deleted file mode 100644
index e7169fb..0000000
Binary files a/acc-web/accserver/content/cars/lotus_evora_s_s2/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_exige_240/data.acd b/acc-web/accserver/content/cars/lotus_exige_240/data.acd
deleted file mode 100644
index c464d78..0000000
Binary files a/acc-web/accserver/content/cars/lotus_exige_240/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_exige_240_s3/data.acd b/acc-web/accserver/content/cars/lotus_exige_240_s3/data.acd
deleted file mode 100644
index 327cb79..0000000
Binary files a/acc-web/accserver/content/cars/lotus_exige_240_s3/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_exige_s/data.acd b/acc-web/accserver/content/cars/lotus_exige_s/data.acd
deleted file mode 100644
index 39237b2..0000000
Binary files a/acc-web/accserver/content/cars/lotus_exige_s/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_exige_s_roadster/data.acd b/acc-web/accserver/content/cars/lotus_exige_s_roadster/data.acd
deleted file mode 100644
index cf3fdb0..0000000
Binary files a/acc-web/accserver/content/cars/lotus_exige_s_roadster/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_exige_scura/data.acd b/acc-web/accserver/content/cars/lotus_exige_scura/data.acd
deleted file mode 100644
index ed34687..0000000
Binary files a/acc-web/accserver/content/cars/lotus_exige_scura/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_exige_v6_cup/data.acd b/acc-web/accserver/content/cars/lotus_exige_v6_cup/data.acd
deleted file mode 100644
index a381cf5..0000000
Binary files a/acc-web/accserver/content/cars/lotus_exige_v6_cup/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_exos_125/data.acd b/acc-web/accserver/content/cars/lotus_exos_125/data.acd
deleted file mode 100644
index 42ededd..0000000
Binary files a/acc-web/accserver/content/cars/lotus_exos_125/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/lotus_exos_125_s1/data.acd b/acc-web/accserver/content/cars/lotus_exos_125_s1/data.acd
deleted file mode 100644
index 6cf72ba..0000000
Binary files a/acc-web/accserver/content/cars/lotus_exos_125_s1/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/mclaren_mp412c/data.acd b/acc-web/accserver/content/cars/mclaren_mp412c/data.acd
deleted file mode 100644
index 33540d8..0000000
Binary files a/acc-web/accserver/content/cars/mclaren_mp412c/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/mclaren_mp412c_gt3/data.acd b/acc-web/accserver/content/cars/mclaren_mp412c_gt3/data.acd
deleted file mode 100644
index abd43a3..0000000
Binary files a/acc-web/accserver/content/cars/mclaren_mp412c_gt3/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/mercedes_sls/data.acd b/acc-web/accserver/content/cars/mercedes_sls/data.acd
deleted file mode 100644
index 9b05f2b..0000000
Binary files a/acc-web/accserver/content/cars/mercedes_sls/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/mercedes_sls_gt3/data.acd b/acc-web/accserver/content/cars/mercedes_sls_gt3/data.acd
deleted file mode 100644
index 64834d1..0000000
Binary files a/acc-web/accserver/content/cars/mercedes_sls_gt3/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/p4-5_2011/data.acd b/acc-web/accserver/content/cars/p4-5_2011/data.acd
deleted file mode 100644
index b92df02..0000000
Binary files a/acc-web/accserver/content/cars/p4-5_2011/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/pagani_huayra/data.acd b/acc-web/accserver/content/cars/pagani_huayra/data.acd
deleted file mode 100644
index 86641d1..0000000
Binary files a/acc-web/accserver/content/cars/pagani_huayra/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/pagani_zonda_r/data.acd b/acc-web/accserver/content/cars/pagani_zonda_r/data.acd
deleted file mode 100644
index d88c506..0000000
Binary files a/acc-web/accserver/content/cars/pagani_zonda_r/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/ruf_yellowbird/data.acd b/acc-web/accserver/content/cars/ruf_yellowbird/data.acd
deleted file mode 100644
index fe98313..0000000
Binary files a/acc-web/accserver/content/cars/ruf_yellowbird/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/shelby_cobra_427sc/data.acd b/acc-web/accserver/content/cars/shelby_cobra_427sc/data.acd
deleted file mode 100644
index a421fc6..0000000
Binary files a/acc-web/accserver/content/cars/shelby_cobra_427sc/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/cars/tatuusfa1/data.acd b/acc-web/accserver/content/cars/tatuusfa1/data.acd
deleted file mode 100644
index 55a1ef7..0000000
Binary files a/acc-web/accserver/content/cars/tatuusfa1/data.acd and /dev/null differ
diff --git a/acc-web/accserver/content/tracks/drift/data/surfaces.ini b/acc-web/accserver/content/tracks/drift/data/surfaces.ini
deleted file mode 100644
index 738a63a..0000000
--- a/acc-web/accserver/content/tracks/drift/data/surfaces.ini
+++ /dev/null
@@ -1,31 +0,0 @@
-[SURFACE_0]
-KEY=TARMAC-DRIFT
-FRICTION=1
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=KERB
-FRICTION=0.92
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.1
-VIBRATION_LENGTH=0.2
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/drift/models.ini b/acc-web/accserver/content/tracks/drift/models.ini
deleted file mode 100644
index a7489f1..0000000
--- a/acc-web/accserver/content/tracks/drift/models.ini
+++ /dev/null
@@ -1,26 +0,0 @@
-[MODEL_0]
-FILE=drift.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[DYNAMIC_OBJECT_0]
-PROBABILITY=75
-MULT=1,2
-FILE=11.kn5
-POS_MODE=RANDOM
-RND_POS_CENTER=-320,200,200
-RND_POS_RANGE=1000,10,1000
-VEL_MODE=RANDOM
-RND_VEL_BASE=0,0,0
-RND_VEL_RANGE=2,0,2
-
-[DYNAMIC_OBJECT_1]
-PROBABILITY=75
-MULT=1,1
-FILE=12.kn5
-POS_MODE=RANDOM
-RND_POS_CENTER=-320,200,200
-RND_POS_RANGE=1000,10,1000
-VEL_MODE=RANDOM
-RND_VEL_BASE=0,0,0
-RND_VEL_RANGE=2,0,2
diff --git a/acc-web/accserver/content/tracks/imola/data/drs_zones.ini b/acc-web/accserver/content/tracks/imola/data/drs_zones.ini
deleted file mode 100644
index 937e6e9..0000000
--- a/acc-web/accserver/content/tracks/imola/data/drs_zones.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[ZONE_0]
-DETECTION=0.855
-START=0.901
-END=0.116
diff --git a/acc-web/accserver/content/tracks/imola/data/surfaces.ini b/acc-web/accserver/content/tracks/imola/data/surfaces.ini
deleted file mode 100644
index 959902f..0000000
--- a/acc-web/accserver/content/tracks/imola/data/surfaces.ini
+++ /dev/null
@@ -1,175 +0,0 @@
-[SURFACE_0]
-KEY=CONCRETE
-FRICTION=0.96
-DAMPING=0.01
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=CARPET
-FRICTION=0.65
-DAMPING=0
-WAV=extraturf.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.1
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=PITS-IMA
-FRICTION=0.97
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=CUTGRA
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=15
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_4]
-KEY=CUTCONC
-FRICTION=0.96
-DAMPING=0.01
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.01
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=5
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_5]
-KEY=TARMAC-IMA
-FRICTION=0.98
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_6]
-KEY=TARMAC-IMB
-FRICTION=1
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_7]
-KEY=OUT
-FRICTION=0.95
-DAMPING=0.013
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.05
-VIBRATION_LENGTH=0.4
-
-[SURFACE_8]
-KEY=KERB
-FRICTION=0.92
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.4
-VIBRATION_LENGTH=1.5
-
-[SURFACE_9]
-KEY=KRB2CUT
-FRICTION=0.92
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=5
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.3
-VIBRATION_LENGTH=0.6
-
-[SURFACE_10]
-KEY=KRBCUT
-FRICTION=0.92
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=3
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.5
-VIBRATION_LENGTH=0.6
diff --git a/acc-web/accserver/content/tracks/imola/models.ini b/acc-web/accserver/content/tracks/imola/models.ini
deleted file mode 100644
index e43eead..0000000
--- a/acc-web/accserver/content/tracks/imola/models.ini
+++ /dev/null
@@ -1,19 +0,0 @@
-[MODEL_0]
-FILE=imola.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=100.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_black_cat_county/layout_int/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_black_cat_county/layout_int/data/surfaces.ini
deleted file mode 100644
index 8264881..0000000
--- a/acc-web/accserver/content/tracks/ks_black_cat_county/layout_int/data/surfaces.ini
+++ /dev/null
@@ -1,63 +0,0 @@
-[SURFACE_0]
-KEY=OLD
-FRICTION=0.91
-DAMPING=0
-WAV=old.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.1
-VIBRATION_LENGTH=0.35
-
-[SURFACE_1]
-KEY=OFF
-FRICTION=0.7
-DAMPING=0
-WAV=gravel.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.05
-VIBRATION_LENGTH=0.35
-
-[SURFACE_2]
-KEY=PITS
-FRICTION=0.92
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=CUT
-FRICTION=0.8
-DAMPING=0
-WAV=tyre_rolling.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.1
-VIBRATION_LENGTH=0.35
diff --git a/acc-web/accserver/content/tracks/ks_black_cat_county/layout_long/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_black_cat_county/layout_long/data/surfaces.ini
deleted file mode 100644
index 8264881..0000000
--- a/acc-web/accserver/content/tracks/ks_black_cat_county/layout_long/data/surfaces.ini
+++ /dev/null
@@ -1,63 +0,0 @@
-[SURFACE_0]
-KEY=OLD
-FRICTION=0.91
-DAMPING=0
-WAV=old.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.1
-VIBRATION_LENGTH=0.35
-
-[SURFACE_1]
-KEY=OFF
-FRICTION=0.7
-DAMPING=0
-WAV=gravel.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.05
-VIBRATION_LENGTH=0.35
-
-[SURFACE_2]
-KEY=PITS
-FRICTION=0.92
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=CUT
-FRICTION=0.8
-DAMPING=0
-WAV=tyre_rolling.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.1
-VIBRATION_LENGTH=0.35
diff --git a/acc-web/accserver/content/tracks/ks_black_cat_county/layout_short/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_black_cat_county/layout_short/data/surfaces.ini
deleted file mode 100644
index b033b88..0000000
--- a/acc-web/accserver/content/tracks/ks_black_cat_county/layout_short/data/surfaces.ini
+++ /dev/null
@@ -1,64 +0,0 @@
-[SURFACE_0]
-KEY=OLD
-FRICTION=0.91
-DAMPING=0
-WAV=old.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.1
-VIBRATION_LENGTH=0.35
-
-[SURFACE_1]
-KEY=OFF
-FRICTION=0.7
-DAMPING=0
-WAV=gravel.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.05
-VIBRATION_LENGTH=0.35
-
-[SURFACE_2]
-KEY=PITS
-FRICTION=0.92
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=CUT
-FRICTION=0.8
-DAMPING=0
-WAV=tyre_rolling.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.1
-VIBRATION_LENGTH=0.35
-
diff --git a/acc-web/accserver/content/tracks/ks_black_cat_county/models_layout_int.ini b/acc-web/accserver/content/tracks/ks_black_cat_county/models_layout_int.ini
deleted file mode 100644
index 569752f..0000000
--- a/acc-web/accserver/content/tracks/ks_black_cat_county/models_layout_int.ini
+++ /dev/null
@@ -1,46 +0,0 @@
-[MODEL_0]
-FILE=5.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_black_cat_county.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=4.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=100.kn5
-POSITION=-280.4,9.4,287.52
-ROTATION=0,0,0
-
-[DYNAMIC_OBJECT_0]
-PROBABILITY=75
-MULT=1,1
-FILE=11.kn5
-POS_MODE=RANDOM
-RND_POS_CENTER=-320,260,1400
-RND_POS_RANGE=1000,10,1000
-VEL_MODE=RANDOM
-RND_VEL_BASE=0,0,0
-RND_VEL_RANGE=2,0,2
-
-[DYNAMIC_OBJECT_1]
-PROBABILITY=75
-MULT=1,1
-FILE=12.kn5
-POS_MODE=RANDOM
-RND_POS_CENTER=-320,260,1400
-RND_POS_RANGE=1000,10,1000
-VEL_MODE=RANDOM
-RND_VEL_BASE=0,0,0
-RND_VEL_RANGE=2,0,2
diff --git a/acc-web/accserver/content/tracks/ks_black_cat_county/models_layout_long.ini b/acc-web/accserver/content/tracks/ks_black_cat_county/models_layout_long.ini
deleted file mode 100644
index e418867..0000000
--- a/acc-web/accserver/content/tracks/ks_black_cat_county/models_layout_long.ini
+++ /dev/null
@@ -1,46 +0,0 @@
-[MODEL_0]
-FILE=5.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_black_cat_county.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=4.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=100.kn5
-POSITION=-298,9.4,287.35
-ROTATION=0,0,0
-
-[DYNAMIC_OBJECT_0]
-PROBABILITY=75
-MULT=1,1
-FILE=11.kn5
-POS_MODE=RANDOM
-RND_POS_CENTER=-320,260,1400
-RND_POS_RANGE=1000,10,1000
-VEL_MODE=RANDOM
-RND_VEL_BASE=0,0,0
-RND_VEL_RANGE=2,0,2
-
-[DYNAMIC_OBJECT_1]
-PROBABILITY=75
-MULT=1,1
-FILE=12.kn5
-POS_MODE=RANDOM
-RND_POS_CENTER=-320,260,1400
-RND_POS_RANGE=1000,10,1000
-VEL_MODE=RANDOM
-RND_VEL_BASE=0,0,0
-RND_VEL_RANGE=2,0,2
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_black_cat_county/models_layout_short.ini b/acc-web/accserver/content/tracks/ks_black_cat_county/models_layout_short.ini
deleted file mode 100644
index 8da6aca..0000000
--- a/acc-web/accserver/content/tracks/ks_black_cat_county/models_layout_short.ini
+++ /dev/null
@@ -1,46 +0,0 @@
-[MODEL_0]
-FILE=5.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_black_cat_county.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=4.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=3.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=100.kn5
-POSITION=-280.4,9.4,287.52
-ROTATION=0,0,0
-
-[DYNAMIC_OBJECT_0]
-PROBABILITY=75
-MULT=1,1
-FILE=11.kn5
-POS_MODE=RANDOM
-RND_POS_CENTER=-320,260,1400
-RND_POS_RANGE=1000,10,1000
-VEL_MODE=RANDOM
-RND_VEL_BASE=0,0,0
-RND_VEL_RANGE=2,0,2
-
-[DYNAMIC_OBJECT_1]
-PROBABILITY=75
-MULT=1,1
-FILE=12.kn5
-POS_MODE=RANDOM
-RND_POS_CENTER=-320,260,1400
-RND_POS_RANGE=1000,10,1000
-VEL_MODE=RANDOM
-RND_VEL_BASE=0,0,0
-RND_VEL_RANGE=2,0,2
diff --git a/acc-web/accserver/content/tracks/ks_drag/drag1000/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_drag/drag1000/data/surfaces.ini
deleted file mode 100644
index 388a5f7..0000000
--- a/acc-web/accserver/content/tracks/ks_drag/drag1000/data/surfaces.ini
+++ /dev/null
@@ -1,16 +0,0 @@
-[SURFACE_0]
-KEY=START
-FRICTION=1.01
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
diff --git a/acc-web/accserver/content/tracks/ks_drag/drag200/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_drag/drag200/data/surfaces.ini
deleted file mode 100644
index 388a5f7..0000000
--- a/acc-web/accserver/content/tracks/ks_drag/drag200/data/surfaces.ini
+++ /dev/null
@@ -1,16 +0,0 @@
-[SURFACE_0]
-KEY=START
-FRICTION=1.01
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
diff --git a/acc-web/accserver/content/tracks/ks_drag/drag2000/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_drag/drag2000/data/surfaces.ini
deleted file mode 100644
index 388a5f7..0000000
--- a/acc-web/accserver/content/tracks/ks_drag/drag2000/data/surfaces.ini
+++ /dev/null
@@ -1,16 +0,0 @@
-[SURFACE_0]
-KEY=START
-FRICTION=1.01
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
diff --git a/acc-web/accserver/content/tracks/ks_drag/drag400/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_drag/drag400/data/surfaces.ini
deleted file mode 100644
index 388a5f7..0000000
--- a/acc-web/accserver/content/tracks/ks_drag/drag400/data/surfaces.ini
+++ /dev/null
@@ -1,16 +0,0 @@
-[SURFACE_0]
-KEY=START
-FRICTION=1.01
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
diff --git a/acc-web/accserver/content/tracks/ks_drag/drag500/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_drag/drag500/data/surfaces.ini
deleted file mode 100644
index 388a5f7..0000000
--- a/acc-web/accserver/content/tracks/ks_drag/drag500/data/surfaces.ini
+++ /dev/null
@@ -1,16 +0,0 @@
-[SURFACE_0]
-KEY=START
-FRICTION=1.01
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
diff --git a/acc-web/accserver/content/tracks/ks_drag/models_drag1000.ini b/acc-web/accserver/content/tracks/ks_drag/models_drag1000.ini
deleted file mode 100644
index b7fac2b..0000000
--- a/acc-web/accserver/content/tracks/ks_drag/models_drag1000.ini
+++ /dev/null
@@ -1,14 +0,0 @@
-[MODEL_0]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_drag.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=1000.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
diff --git a/acc-web/accserver/content/tracks/ks_drag/models_drag200.ini b/acc-web/accserver/content/tracks/ks_drag/models_drag200.ini
deleted file mode 100644
index 0eaf5a1..0000000
--- a/acc-web/accserver/content/tracks/ks_drag/models_drag200.ini
+++ /dev/null
@@ -1,14 +0,0 @@
-[MODEL_0]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_drag.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=200.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
diff --git a/acc-web/accserver/content/tracks/ks_drag/models_drag2000.ini b/acc-web/accserver/content/tracks/ks_drag/models_drag2000.ini
deleted file mode 100644
index 6273302..0000000
--- a/acc-web/accserver/content/tracks/ks_drag/models_drag2000.ini
+++ /dev/null
@@ -1,14 +0,0 @@
-[MODEL_0]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_drag.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=2000.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
diff --git a/acc-web/accserver/content/tracks/ks_drag/models_drag400.ini b/acc-web/accserver/content/tracks/ks_drag/models_drag400.ini
deleted file mode 100644
index de47cb7..0000000
--- a/acc-web/accserver/content/tracks/ks_drag/models_drag400.ini
+++ /dev/null
@@ -1,14 +0,0 @@
-[MODEL_0]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_drag.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=400.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
diff --git a/acc-web/accserver/content/tracks/ks_drag/models_drag500.ini b/acc-web/accserver/content/tracks/ks_drag/models_drag500.ini
deleted file mode 100644
index d32730e..0000000
--- a/acc-web/accserver/content/tracks/ks_drag/models_drag500.ini
+++ /dev/null
@@ -1,14 +0,0 @@
-[MODEL_0]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_drag.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=500.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
diff --git a/acc-web/accserver/content/tracks/ks_highlands/layout_drift/data/drs_zones.ini b/acc-web/accserver/content/tracks/ks_highlands/layout_drift/data/drs_zones.ini
deleted file mode 100644
index 6a0a611..0000000
--- a/acc-web/accserver/content/tracks/ks_highlands/layout_drift/data/drs_zones.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[ZONE_0]
-DETECTION=0.01
-START=0
-END=0.001
diff --git a/acc-web/accserver/content/tracks/ks_highlands/layout_drift/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_highlands/layout_drift/data/surfaces.ini
deleted file mode 100644
index f537f9c..0000000
--- a/acc-web/accserver/content/tracks/ks_highlands/layout_drift/data/surfaces.ini
+++ /dev/null
@@ -1,79 +0,0 @@
-[SURFACE_0]
-KEY=PAVE
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.4
-VIBRATION_LENGTH=0.5
-
-[SURFACE_1]
-KEY=KERB
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.1
-
-[SURFACE_2]
-KEY=CONCRETE
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.05
-VIBRATION_LENGTH=0.02
-
-[SURFACE_3]
-KEY=PITPAV
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0.4
-VIBRATION_LENGTH=0.5
-
-[SURFACE_4]
-KEY=PITCONC
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0.05
-VIBRATION_LENGTH=0.02
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_highlands/layout_int/data/drs_zones.ini b/acc-web/accserver/content/tracks/ks_highlands/layout_int/data/drs_zones.ini
deleted file mode 100644
index 6a0a611..0000000
--- a/acc-web/accserver/content/tracks/ks_highlands/layout_int/data/drs_zones.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[ZONE_0]
-DETECTION=0.01
-START=0
-END=0.001
diff --git a/acc-web/accserver/content/tracks/ks_highlands/layout_int/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_highlands/layout_int/data/surfaces.ini
deleted file mode 100644
index f537f9c..0000000
--- a/acc-web/accserver/content/tracks/ks_highlands/layout_int/data/surfaces.ini
+++ /dev/null
@@ -1,79 +0,0 @@
-[SURFACE_0]
-KEY=PAVE
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.4
-VIBRATION_LENGTH=0.5
-
-[SURFACE_1]
-KEY=KERB
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.1
-
-[SURFACE_2]
-KEY=CONCRETE
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.05
-VIBRATION_LENGTH=0.02
-
-[SURFACE_3]
-KEY=PITPAV
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0.4
-VIBRATION_LENGTH=0.5
-
-[SURFACE_4]
-KEY=PITCONC
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0.05
-VIBRATION_LENGTH=0.02
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_highlands/layout_long/data/drs_zones.ini b/acc-web/accserver/content/tracks/ks_highlands/layout_long/data/drs_zones.ini
deleted file mode 100644
index 6a0a611..0000000
--- a/acc-web/accserver/content/tracks/ks_highlands/layout_long/data/drs_zones.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[ZONE_0]
-DETECTION=0.01
-START=0
-END=0.001
diff --git a/acc-web/accserver/content/tracks/ks_highlands/layout_long/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_highlands/layout_long/data/surfaces.ini
deleted file mode 100644
index f537f9c..0000000
--- a/acc-web/accserver/content/tracks/ks_highlands/layout_long/data/surfaces.ini
+++ /dev/null
@@ -1,79 +0,0 @@
-[SURFACE_0]
-KEY=PAVE
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.4
-VIBRATION_LENGTH=0.5
-
-[SURFACE_1]
-KEY=KERB
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.1
-
-[SURFACE_2]
-KEY=CONCRETE
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.05
-VIBRATION_LENGTH=0.02
-
-[SURFACE_3]
-KEY=PITPAV
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0.4
-VIBRATION_LENGTH=0.5
-
-[SURFACE_4]
-KEY=PITCONC
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0.05
-VIBRATION_LENGTH=0.02
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_highlands/layout_short/data/drs_zones.ini b/acc-web/accserver/content/tracks/ks_highlands/layout_short/data/drs_zones.ini
deleted file mode 100644
index 6a0a611..0000000
--- a/acc-web/accserver/content/tracks/ks_highlands/layout_short/data/drs_zones.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[ZONE_0]
-DETECTION=0.01
-START=0
-END=0.001
diff --git a/acc-web/accserver/content/tracks/ks_highlands/layout_short/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_highlands/layout_short/data/surfaces.ini
deleted file mode 100644
index f537f9c..0000000
--- a/acc-web/accserver/content/tracks/ks_highlands/layout_short/data/surfaces.ini
+++ /dev/null
@@ -1,79 +0,0 @@
-[SURFACE_0]
-KEY=PAVE
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.4
-VIBRATION_LENGTH=0.5
-
-[SURFACE_1]
-KEY=KERB
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.1
-
-[SURFACE_2]
-KEY=CONCRETE
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.05
-VIBRATION_LENGTH=0.02
-
-[SURFACE_3]
-KEY=PITPAV
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0.4
-VIBRATION_LENGTH=0.5
-
-[SURFACE_4]
-KEY=PITCONC
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0.05
-VIBRATION_LENGTH=0.02
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_highlands/models_layout_drift.ini b/acc-web/accserver/content/tracks/ks_highlands/models_layout_drift.ini
deleted file mode 100644
index a3022be..0000000
--- a/acc-web/accserver/content/tracks/ks_highlands/models_layout_drift.ini
+++ /dev/null
@@ -1,49 +0,0 @@
-[MODEL_0]
-FILE=8.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_highlands.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=9.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=7.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_5]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_6]
-FILE=9.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_7]
-FILE=10.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_8]
-FILE=101.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_9]
-FILE=100.kn5
-POSITION=705.2,9.7,579.13
-ROTATION=-17,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_highlands/models_layout_int.ini b/acc-web/accserver/content/tracks/ks_highlands/models_layout_int.ini
deleted file mode 100644
index 8216969..0000000
--- a/acc-web/accserver/content/tracks/ks_highlands/models_layout_int.ini
+++ /dev/null
@@ -1,49 +0,0 @@
-[MODEL_0]
-FILE=8.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_highlands.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=9.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=4.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_5]
-FILE=3.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_6]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_7]
-FILE=10.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_8]
-FILE=101.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_9]
-FILE=100.kn5
-POSITION=705.2,9.7,579.13
-ROTATION=-17,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_highlands/models_layout_long.ini b/acc-web/accserver/content/tracks/ks_highlands/models_layout_long.ini
deleted file mode 100644
index 76e3d40..0000000
--- a/acc-web/accserver/content/tracks/ks_highlands/models_layout_long.ini
+++ /dev/null
@@ -1,49 +0,0 @@
-[MODEL_0]
-FILE=8.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_highlands.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=9.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=5.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_5]
-FILE=3.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_6]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_7]
-FILE=10.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_8]
-FILE=101.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_9]
-FILE=100.kn5
-POSITION=705.2,9.7,579.13
-ROTATION=-17,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_highlands/models_layout_short.ini b/acc-web/accserver/content/tracks/ks_highlands/models_layout_short.ini
deleted file mode 100644
index 9f75abc..0000000
--- a/acc-web/accserver/content/tracks/ks_highlands/models_layout_short.ini
+++ /dev/null
@@ -1,44 +0,0 @@
-[MODEL_0]
-FILE=8.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_highlands.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=9.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=6.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_5]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_6]
-FILE=10.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_7]
-FILE=101.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_8]
-FILE=100.kn5
-POSITION=705.2,9.7,579.13
-ROTATION=-17,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_laguna_seca/data/drs_zones.ini b/acc-web/accserver/content/tracks/ks_laguna_seca/data/drs_zones.ini
deleted file mode 100644
index 6a0a611..0000000
--- a/acc-web/accserver/content/tracks/ks_laguna_seca/data/drs_zones.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[ZONE_0]
-DETECTION=0.01
-START=0
-END=0.001
diff --git a/acc-web/accserver/content/tracks/ks_laguna_seca/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_laguna_seca/data/surfaces.ini
deleted file mode 100644
index 87f8b6d..0000000
--- a/acc-web/accserver/content/tracks/ks_laguna_seca/data/surfaces.ini
+++ /dev/null
@@ -1,239 +0,0 @@
-[SURFACE_0]
-KEY=PITS
-FRICTION=0.965
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.05
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=KERB
-FRICTION=0.968
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=1.0
-
-[SURFACE_2]
-KEY=CURB
-FRICTION=0.968
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.0
-FF_EFFECT=1
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=1.0
-VIBRATION_LENGTH=0.3
-
-[SURFACE_3]
-KEY=CONCRETE
-FRICTION=0.965
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.1
-VIBRATION_LENGTH=0.5
-
-[SURFACE_4]
-KEY=DRAIN
-FRICTION=0.92
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.3
-
-[SURFACE_5]
-KEY=GRAVEL
-FRICTION=0.75
-DAMPING=0.04
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.5
-VIBRATION_LENGTH=0.6
-
-[SURFACE_6]
-KEY=ASPHNEW
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_7]
-KEY=RDOLD
-FRICTION=0.94
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.2
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=10
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.02
-VIBRATION_LENGTH=0.1
-
-[SURFACE_8]
-KEY=CNCGREEN
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_9]
-KEY=CNCPTS
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_10]
-KEY=PAINT
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_11]
-KEY=ROAD
-FRICTION=0.97
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_12]
-KEY=SAND
-FRICTION=0.8
-DAMPING=0.15
-WAV=sand.wav
-WAV_PITCH=0
-FF_EFFECT=0
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0.04
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.3
-
-[SURFACE_13]
-KEY=RCVTP
-FRICTION=0.94
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.2
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=10
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.02
-VIBRATION_LENGTH=0.1
-
-[SURFACE_14]
-KEY=CUTGRV
-FRICTION=0.75
-DAMPING=0.04
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.5
-VIBRATION_LENGTH=0.6
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_laguna_seca/models.ini b/acc-web/accserver/content/tracks/ks_laguna_seca/models.ini
deleted file mode 100644
index cca66de..0000000
--- a/acc-web/accserver/content/tracks/ks_laguna_seca/models.ini
+++ /dev/null
@@ -1,49 +0,0 @@
-[MODEL_0]
-FILE=8.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_laguna_seca.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=3.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=4.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_5]
-FILE=5.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_6]
-FILE=6.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_7]
-FILE=9.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_8]
-FILE=7.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_9]
-FILE=10.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_monza66/full/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_monza66/full/data/surfaces.ini
deleted file mode 100644
index 7db7a6b..0000000
--- a/acc-web/accserver/content/tracks/ks_monza66/full/data/surfaces.ini
+++ /dev/null
@@ -1,97 +0,0 @@
-[SURFACE_0]
-KEY=CONCRETE
-FRICTION=0.975
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-
-[SURFACE_1]
-KEY=CARPET
-FRICTION=0.96
-DAMPING=0
-WAV=extraturf.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.1
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=PITS
-FRICTION=0.965
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.05
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=PIT-MNZHIST
-FRICTION=0.97
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.05
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-
-[SURFACE_4]
-KEY=OUT
-FRICTION=0.94
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_5]
-KEY=TARMHIST
-FRICTION=0.97
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
diff --git a/acc-web/accserver/content/tracks/ks_monza66/junior/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_monza66/junior/data/surfaces.ini
deleted file mode 100644
index 7db7a6b..0000000
--- a/acc-web/accserver/content/tracks/ks_monza66/junior/data/surfaces.ini
+++ /dev/null
@@ -1,97 +0,0 @@
-[SURFACE_0]
-KEY=CONCRETE
-FRICTION=0.975
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-
-[SURFACE_1]
-KEY=CARPET
-FRICTION=0.96
-DAMPING=0
-WAV=extraturf.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.1
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=PITS
-FRICTION=0.965
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.05
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=PIT-MNZHIST
-FRICTION=0.97
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.05
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-
-[SURFACE_4]
-KEY=OUT
-FRICTION=0.94
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_5]
-KEY=TARMHIST
-FRICTION=0.97
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
diff --git a/acc-web/accserver/content/tracks/ks_monza66/models_full.ini b/acc-web/accserver/content/tracks/ks_monza66/models_full.ini
deleted file mode 100644
index a3ff79e..0000000
--- a/acc-web/accserver/content/tracks/ks_monza66/models_full.ini
+++ /dev/null
@@ -1,39 +0,0 @@
-[MODEL_0]
-FILE=7.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_monza66.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=3.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=6.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=8.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_5]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_6]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_7]
-FILE=9.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_monza66/models_junior.ini b/acc-web/accserver/content/tracks/ks_monza66/models_junior.ini
deleted file mode 100644
index c20ec66..0000000
--- a/acc-web/accserver/content/tracks/ks_monza66/models_junior.ini
+++ /dev/null
@@ -1,34 +0,0 @@
-[MODEL_0]
-FILE=7.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_monza66.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=4.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=8.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_5]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_6]
-FILE=9.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_monza66/models_road.ini b/acc-web/accserver/content/tracks/ks_monza66/models_road.ini
deleted file mode 100644
index 431f22d..0000000
--- a/acc-web/accserver/content/tracks/ks_monza66/models_road.ini
+++ /dev/null
@@ -1,39 +0,0 @@
-[MODEL_0]
-FILE=7.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_monza66.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=3.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=5.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=8.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_5]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_6]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_7]
-FILE=9.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_monza66/road/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_monza66/road/data/surfaces.ini
deleted file mode 100644
index 7db7a6b..0000000
--- a/acc-web/accserver/content/tracks/ks_monza66/road/data/surfaces.ini
+++ /dev/null
@@ -1,97 +0,0 @@
-[SURFACE_0]
-KEY=CONCRETE
-FRICTION=0.975
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-
-[SURFACE_1]
-KEY=CARPET
-FRICTION=0.96
-DAMPING=0
-WAV=extraturf.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.1
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=PITS
-FRICTION=0.965
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.05
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=PIT-MNZHIST
-FRICTION=0.97
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.05
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-
-[SURFACE_4]
-KEY=OUT
-FRICTION=0.94
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_5]
-KEY=TARMHIST
-FRICTION=0.97
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
diff --git a/acc-web/accserver/content/tracks/ks_nurburgring/layout_gp_a/data/drs_zones.ini b/acc-web/accserver/content/tracks/ks_nurburgring/layout_gp_a/data/drs_zones.ini
deleted file mode 100644
index 6e37690..0000000
--- a/acc-web/accserver/content/tracks/ks_nurburgring/layout_gp_a/data/drs_zones.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[ZONE_0]
-DETECTION=0.642
-START=0.738
-END=0.871
-
-[ZONE_1]
-DETECTION=0.925
-START=0.979
-END=0.096
-
diff --git a/acc-web/accserver/content/tracks/ks_nurburgring/layout_gp_a/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_nurburgring/layout_gp_a/data/surfaces.ini
deleted file mode 100644
index 81c6bbc..0000000
--- a/acc-web/accserver/content/tracks/ks_nurburgring/layout_gp_a/data/surfaces.ini
+++ /dev/null
@@ -1,159 +0,0 @@
-[SURFACE_0]
-KEY=CONCRETE
-FRICTION=0.85
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=CARPET
-FRICTION=0.75
-DAMPING=0
-WAV=extraturf.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.1
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=PITS
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.05
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=CUTKRB
-FRICTION=0.98
-DAMPING=0.01
-WAV=kerb.wav
-WAV_PITCH=1.2
-FF_EFFECT=1
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=5
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=1.0
-VIBRATION_LENGTH=1.0
-
-[SURFACE_4]
-KEY=PAINT
-FRICTION=0.92
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_5]
-KEY=OUT
-FRICTION=0.95
-DAMPING=0.012
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_6]
-KEY=ASPH-NURB
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_7]
-KEY=CURB
-FRICTION=0.85
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=1.0
-VIBRATION_LENGTH=1.0
-
-[SURFACE_8]
-KEY=GRS-CUT-B
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=10
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
-
-[SURFACE_9]
-KEY=TRM-CUT-A
-FRICTION=0.99
-DAMPING=0.01
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=5
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
diff --git a/acc-web/accserver/content/tracks/ks_nurburgring/layout_gp_b/data/drs_zones.ini b/acc-web/accserver/content/tracks/ks_nurburgring/layout_gp_b/data/drs_zones.ini
deleted file mode 100644
index 40e67fc..0000000
--- a/acc-web/accserver/content/tracks/ks_nurburgring/layout_gp_b/data/drs_zones.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[ZONE_0]
-DETECTION=0.643
-START=0.740
-END=0.877
-
-[ZONE_1]
-DETECTION=0.925
-START=0.979
-END=0.096
-
diff --git a/acc-web/accserver/content/tracks/ks_nurburgring/layout_gp_b/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_nurburgring/layout_gp_b/data/surfaces.ini
deleted file mode 100644
index b170ac0..0000000
--- a/acc-web/accserver/content/tracks/ks_nurburgring/layout_gp_b/data/surfaces.ini
+++ /dev/null
@@ -1,159 +0,0 @@
-[SURFACE_0]
-KEY=CONCRETE
-FRICTION=0.85
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=CARPET
-FRICTION=0.75
-DAMPING=0
-WAV=extraturf.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.1
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=PITS
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.05
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=CUTKRB
-FRICTION=0.95
-DAMPING=0.01
-WAV=kerb.wav
-WAV_PITCH=1.2
-FF_EFFECT=1
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=5
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=1.0
-VIBRATION_LENGTH=1.0
-
-[SURFACE_4]
-KEY=PAINT
-FRICTION=0.92
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_5]
-KEY=OUT
-FRICTION=0.95
-DAMPING=0.012
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_6]
-KEY=ASPH-NURB
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_7]
-KEY=CURB
-FRICTION=0.85
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=1.0
-VIBRATION_LENGTH=1.0
-
-[SURFACE_8]
-KEY=GRS-CUT-B
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=10
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
-
-[SURFACE_9]
-KEY=TRM-CUT-A
-FRICTION=0.99
-DAMPING=0.012
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=5
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
diff --git a/acc-web/accserver/content/tracks/ks_nurburgring/layout_sprint_a/data/drs_zones.ini b/acc-web/accserver/content/tracks/ks_nurburgring/layout_sprint_a/data/drs_zones.ini
deleted file mode 100644
index 04c0e77..0000000
--- a/acc-web/accserver/content/tracks/ks_nurburgring/layout_sprint_a/data/drs_zones.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-[ZONE_0]
-DETECTION=0.489
-START=0.627
-END=0.825
-
-[ZONE_1]
-DETECTION=0.896
-START=0.970
-END=0.136
diff --git a/acc-web/accserver/content/tracks/ks_nurburgring/layout_sprint_a/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_nurburgring/layout_sprint_a/data/surfaces.ini
deleted file mode 100644
index fd49092..0000000
--- a/acc-web/accserver/content/tracks/ks_nurburgring/layout_sprint_a/data/surfaces.ini
+++ /dev/null
@@ -1,160 +0,0 @@
-[SURFACE_0]
-KEY=CONCRETE
-FRICTION=0.85
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=CARPET
-FRICTION=0.75
-DAMPING=0
-WAV=extraturf.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.1
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=PITS
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.05
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=CUTKRB
-FRICTION=0.95
-DAMPING=0.01
-WAV=kerb.wav
-WAV_PITCH=1.2
-FF_EFFECT=1
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=5
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=1.0
-VIBRATION_LENGTH=1.0
-
-[SURFACE_4]
-KEY=PAINT
-FRICTION=0.92
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_5]
-KEY=OUT
-FRICTION=0.95
-DAMPING=0.012
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_6]
-KEY=ASPH-NURB
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_7]
-KEY=CURB
-FRICTION=0.85
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=1.0
-VIBRATION_LENGTH=1.0
-
-[SURFACE_8]
-KEY=GRS-CUT-B
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=10
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
-
-[SURFACE_9]
-KEY=TRM-CUT-A
-FRICTION=0.99
-DAMPING=0.012
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=5
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
diff --git a/acc-web/accserver/content/tracks/ks_nurburgring/layout_sprint_b/data/drs_zones.ini b/acc-web/accserver/content/tracks/ks_nurburgring/layout_sprint_b/data/drs_zones.ini
deleted file mode 100644
index e5e4ad4..0000000
--- a/acc-web/accserver/content/tracks/ks_nurburgring/layout_sprint_b/data/drs_zones.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-[ZONE_0]
-DETECTION=0.490
-START=0.628
-END=0.828
-
-[ZONE_1]
-DETECTION=0.897
-START=0.970
-END=0.137
diff --git a/acc-web/accserver/content/tracks/ks_nurburgring/layout_sprint_b/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_nurburgring/layout_sprint_b/data/surfaces.ini
deleted file mode 100644
index fd49092..0000000
--- a/acc-web/accserver/content/tracks/ks_nurburgring/layout_sprint_b/data/surfaces.ini
+++ /dev/null
@@ -1,160 +0,0 @@
-[SURFACE_0]
-KEY=CONCRETE
-FRICTION=0.85
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=CARPET
-FRICTION=0.75
-DAMPING=0
-WAV=extraturf.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.1
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=PITS
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.05
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=CUTKRB
-FRICTION=0.95
-DAMPING=0.01
-WAV=kerb.wav
-WAV_PITCH=1.2
-FF_EFFECT=1
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=5
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=1.0
-VIBRATION_LENGTH=1.0
-
-[SURFACE_4]
-KEY=PAINT
-FRICTION=0.92
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_5]
-KEY=OUT
-FRICTION=0.95
-DAMPING=0.012
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_6]
-KEY=ASPH-NURB
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_7]
-KEY=CURB
-FRICTION=0.85
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=1.0
-VIBRATION_LENGTH=1.0
-
-[SURFACE_8]
-KEY=GRS-CUT-B
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=10
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
-
-[SURFACE_9]
-KEY=TRM-CUT-A
-FRICTION=0.99
-DAMPING=0.012
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=5
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
diff --git a/acc-web/accserver/content/tracks/ks_nurburgring/models_layout_gp_a.ini b/acc-web/accserver/content/tracks/ks_nurburgring/models_layout_gp_a.ini
deleted file mode 100644
index ffce6fa..0000000
--- a/acc-web/accserver/content/tracks/ks_nurburgring/models_layout_gp_a.ini
+++ /dev/null
@@ -1,40 +0,0 @@
-[MODEL_0]
-FILE=7.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=ks_nurburgring.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=4.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_5]
-FILE=8.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_6]
-FILE=9.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_7]
-FILE=100.kn5
-POSITION=-8.5,68.9,-696.7
-ROTATION=180,0,0
-
diff --git a/acc-web/accserver/content/tracks/ks_nurburgring/models_layout_gp_b.ini b/acc-web/accserver/content/tracks/ks_nurburgring/models_layout_gp_b.ini
deleted file mode 100644
index c71ad25..0000000
--- a/acc-web/accserver/content/tracks/ks_nurburgring/models_layout_gp_b.ini
+++ /dev/null
@@ -1,39 +0,0 @@
-[MODEL_0]
-FILE=7.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_nurburgring.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=4.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=3.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_5]
-FILE=8.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_6]
-FILE=9.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_7]
-FILE=100.kn5
-POSITION=-8.5,68.9,-696.7
-ROTATION=180,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_nurburgring/models_layout_sprint_a.ini b/acc-web/accserver/content/tracks/ks_nurburgring/models_layout_sprint_a.ini
deleted file mode 100644
index 3196680..0000000
--- a/acc-web/accserver/content/tracks/ks_nurburgring/models_layout_sprint_a.ini
+++ /dev/null
@@ -1,39 +0,0 @@
-[MODEL_0]
-FILE=7.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_nurburgring.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=5.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_5]
-FILE=8.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_6]
-FILE=9.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_7]
-FILE=100.kn5
-POSITION=-8.5,68.9,-696.7
-ROTATION=180,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_nurburgring/models_layout_sprint_b.ini b/acc-web/accserver/content/tracks/ks_nurburgring/models_layout_sprint_b.ini
deleted file mode 100644
index 89e53bb..0000000
--- a/acc-web/accserver/content/tracks/ks_nurburgring/models_layout_sprint_b.ini
+++ /dev/null
@@ -1,39 +0,0 @@
-[MODEL_0]
-FILE=7.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_nurburgring.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=5.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=3.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_5]
-FILE=8.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_6]
-FILE=9.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_7]
-FILE=100.kn5
-POSITION=-8.5,68.9,-696.7
-ROTATION=180,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_silverstone/gp/data/drs_zones.ini b/acc-web/accserver/content/tracks/ks_silverstone/gp/data/drs_zones.ini
deleted file mode 100644
index e076f2e..0000000
--- a/acc-web/accserver/content/tracks/ks_silverstone/gp/data/drs_zones.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-[ZONE_0]
-DETECTION=0.123
-START=0.201
-END=0.296
-
-[ZONE_1]
-DETECTION=0.596
-START=0.707
-END=0.814
diff --git a/acc-web/accserver/content/tracks/ks_silverstone/gp/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_silverstone/gp/data/surfaces.ini
deleted file mode 100644
index 5fbf0b3..0000000
--- a/acc-web/accserver/content/tracks/ks_silverstone/gp/data/surfaces.ini
+++ /dev/null
@@ -1,255 +0,0 @@
-[SURFACE_0]
-KEY=CONCRETE
-FRICTION=0.75
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=CARPET
-FRICTION=0.6
-DAMPING=0
-WAV=extraturf.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.1
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=PIT-SILV
-FRICTION=0.97
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=KURB
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=1.0
-VIBRATION_LENGTH=1.5
-
-[SURFACE_4]
-KEY=TARMSIL_A_
-FRICTION=0.98
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_5]
-KEY=TARMSIL_B_
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_6]
-KEY=OUT
-FRICTION=0.94
-DAMPING=0.01
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_7]
-KEY=BUMP
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_8]
-KEY=CONCOUU
-FRICTION=0.7
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_9]
-KEY=CURB
-FRICTION=0.96
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1
-FF_EFFECT=0
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.3
-VIBRATION_LENGTH=1.5
-
-[SURFACE_10]
-KEY=KERB
-FRICTION=0.96
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.5
-VIBRATION_LENGTH=1
-
-[SURFACE_11]
-KEY=GRS-CUT-A
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=5
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
-
-[SURFACE_12]
-KEY=GRS-CUT-B
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=10
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
-
-[SURFACE_13]
-KEY=TRM-CUT-B
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=10
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_14]
-KEY=CRB-CUT-B
-FRICTION=0.9
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=10
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.3
-VIBRATION_LENGTH=1.5
-
-[SURFACE_15]
-KEY=TRM-CUT-A
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=5
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
diff --git a/acc-web/accserver/content/tracks/ks_silverstone/international/data/drs_zones.ini b/acc-web/accserver/content/tracks/ks_silverstone/international/data/drs_zones.ini
deleted file mode 100644
index 52e0214..0000000
--- a/acc-web/accserver/content/tracks/ks_silverstone/international/data/drs_zones.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[ZONE_0]
-DETECTION=0.242
-START=0.423
-END=0.635
diff --git a/acc-web/accserver/content/tracks/ks_silverstone/international/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_silverstone/international/data/surfaces.ini
deleted file mode 100644
index ef50927..0000000
--- a/acc-web/accserver/content/tracks/ks_silverstone/international/data/surfaces.ini
+++ /dev/null
@@ -1,255 +0,0 @@
-[SURFACE_0]
-KEY=CONCRETE
-FRICTION=0.75
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=CARPET
-FRICTION=0.6
-DAMPING=0
-WAV=extraturf.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.1
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=PIT-SILV
-FRICTION=0.97
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=CURB
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.3
-VIBRATION_LENGTH=1.5
-
-[SURFACE_4]
-KEY=TARMSIL_A_
-FRICTION=0.98
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_5]
-KEY=TARMSIL_B_
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_6]
-KEY=OUT
-FRICTION=0.9
-DAMPING=0.01
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_7]
-KEY=BUMP
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.1
-VIBRATION_LENGTH=0.5
-
-[SURFACE_8]
-KEY=CONCOUT
-FRICTION=0.7
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_9]
-KEY=KERB
-FRICTION=0.96
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.5
-VIBRATION_LENGTH=1.8
-
-[SURFACE_10]
-KEY=GRS-CUT-A
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=5
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
-
-[SURFACE_11]
-KEY=GRS-CUT-B
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=10
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
-
-[SURFACE_12]
-KEY=TRM-CUT-B
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=10
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_13]
-KEY=CRB-CUT-B
-FRICTION=0.9
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=10
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.3
-VIBRATION_LENGTH=1.5
-
-[SURFACE_14]
-KEY=TRM-CUT-A
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=5
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_15]
-KEY=CONCOUU
-FRICTION=0.7
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
diff --git a/acc-web/accserver/content/tracks/ks_silverstone/models_gp.ini b/acc-web/accserver/content/tracks/ks_silverstone/models_gp.ini
deleted file mode 100644
index 8fa4b0a..0000000
--- a/acc-web/accserver/content/tracks/ks_silverstone/models_gp.ini
+++ /dev/null
@@ -1,49 +0,0 @@
-[MODEL_0]
-FILE=7.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_silverstone.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=3.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_5]
-FILE=4.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_6]
-FILE=8.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_7]
-FILE=9.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_8]
-FILE=10.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_9]
-FILE=100.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_silverstone/models_international.ini b/acc-web/accserver/content/tracks/ks_silverstone/models_international.ini
deleted file mode 100644
index 833ac02..0000000
--- a/acc-web/accserver/content/tracks/ks_silverstone/models_international.ini
+++ /dev/null
@@ -1,44 +0,0 @@
-[MODEL_0]
-FILE=7.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_silverstone.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=3.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=5.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_5]
-FILE=8.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_6]
-FILE=9.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_7]
-FILE=10.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_8]
-FILE=100.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_silverstone/models_national.ini b/acc-web/accserver/content/tracks/ks_silverstone/models_national.ini
deleted file mode 100644
index 85292da..0000000
--- a/acc-web/accserver/content/tracks/ks_silverstone/models_national.ini
+++ /dev/null
@@ -1,39 +0,0 @@
-[MODEL_0]
-FILE=7.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_silverstone.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=6.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=8.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_5]
-FILE=9.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_6]
-FILE=10.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_7]
-FILE=101.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_silverstone/national/data/drs_zones.ini b/acc-web/accserver/content/tracks/ks_silverstone/national/data/drs_zones.ini
deleted file mode 100644
index d6d2ee1..0000000
--- a/acc-web/accserver/content/tracks/ks_silverstone/national/data/drs_zones.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[ZONE_0]
-DETECTION=0.301
-START=0.418
-END=0.628
diff --git a/acc-web/accserver/content/tracks/ks_silverstone/national/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_silverstone/national/data/surfaces.ini
deleted file mode 100644
index 073d423..0000000
--- a/acc-web/accserver/content/tracks/ks_silverstone/national/data/surfaces.ini
+++ /dev/null
@@ -1,255 +0,0 @@
-[SURFACE_0]
-KEY=CONCRETE
-FRICTION=0.75
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=CARPET
-FRICTION=0.6
-DAMPING=0
-WAV=extraturf.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.1
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=PIT-SILV
-FRICTION=0.97
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=CURB
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=1.0
-VIBRATION_LENGTH=1.5
-
-[SURFACE_4]
-KEY=TARMSIL_A_
-FRICTION=0.98
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_5]
-KEY=TARMSIL_B_
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_6]
-KEY=OUT
-FRICTION=0.9
-DAMPING=0.01
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_7]
-KEY=BUMP
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_8]
-KEY=CONCOUU
-FRICTION=0.7
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_9]
-KEY=CURB
-FRICTION=0.93
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1
-FF_EFFECT=0
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.3
-VIBRATION_LENGTH=1.5
-
-[SURFACE_10]
-KEY=KERB
-FRICTION=0.96
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.5
-VIBRATION_LENGTH=1
-
-[SURFACE_11]
-KEY=GRS-CUT-A
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=5
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
-
-[SURFACE_12]
-KEY=GRS-CUT-B
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=10
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
-
-[SURFACE_13]
-KEY=TRM-CUT-B
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=10
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_14]
-KEY=CRB-CUT-B
-FRICTION=0.9
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=10
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.3
-VIBRATION_LENGTH=1.5
-
-[SURFACE_15]
-KEY=TRM-CUT-A
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=5
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
diff --git a/acc-web/accserver/content/tracks/ks_silverstone1967/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_silverstone1967/data/surfaces.ini
deleted file mode 100644
index aac73b4..0000000
--- a/acc-web/accserver/content/tracks/ks_silverstone1967/data/surfaces.ini
+++ /dev/null
@@ -1,63 +0,0 @@
-[SURFACE_0]
-KEY=CONCRETE
-FRICTION=0.935
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=OUT
-FRICTION=0.98
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=ASPH_SILV
-FRICTION=0.994
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=PITS_SILV
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
diff --git a/acc-web/accserver/content/tracks/ks_silverstone1967/models.ini b/acc-web/accserver/content/tracks/ks_silverstone1967/models.ini
deleted file mode 100644
index c02282d..0000000
--- a/acc-web/accserver/content/tracks/ks_silverstone1967/models.ini
+++ /dev/null
@@ -1,29 +0,0 @@
-[MODEL_0]
-FILE=4.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_silverstone1967.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=3.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_5]
-FILE=5.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_vallelunga/classic_circuit/data/drs_zones.ini b/acc-web/accserver/content/tracks/ks_vallelunga/classic_circuit/data/drs_zones.ini
deleted file mode 100644
index 28a7150..0000000
--- a/acc-web/accserver/content/tracks/ks_vallelunga/classic_circuit/data/drs_zones.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[ZONE_0]
-DETECTION=0.899
-START=0
-END=0.0001
diff --git a/acc-web/accserver/content/tracks/ks_vallelunga/classic_circuit/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_vallelunga/classic_circuit/data/surfaces.ini
deleted file mode 100644
index 38b70cb..0000000
--- a/acc-web/accserver/content/tracks/ks_vallelunga/classic_circuit/data/surfaces.ini
+++ /dev/null
@@ -1,111 +0,0 @@
-[SURFACE_0]
-KEY=CONCRETE
-FRICTION=0.91
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=CARPET
-FRICTION=0.75
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.1
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=PITS-VAL
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=CURB
-FRICTION=0.93
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1
-FF_EFFECT=0
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.3
-VIBRATION_LENGTH=1.5
-
-[SURFACE_4]
-KEY=OUT
-FRICTION=0.95
-DAMPING=0.01
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_5]
-KEY=KERB
-FRICTION=0.92
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.6
-VIBRATION_LENGTH=1.5
-
-[SURFACE_6]
-KEY=GRS-CUT-A
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=5
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
diff --git a/acc-web/accserver/content/tracks/ks_vallelunga/club_circuit/data/drs_zones.ini b/acc-web/accserver/content/tracks/ks_vallelunga/club_circuit/data/drs_zones.ini
deleted file mode 100644
index a17df9d..0000000
--- a/acc-web/accserver/content/tracks/ks_vallelunga/club_circuit/data/drs_zones.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[ZONE_0]
-DETECTION=0.812
-START=0.908
-END=0.114
diff --git a/acc-web/accserver/content/tracks/ks_vallelunga/club_circuit/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_vallelunga/club_circuit/data/surfaces.ini
deleted file mode 100644
index 38b70cb..0000000
--- a/acc-web/accserver/content/tracks/ks_vallelunga/club_circuit/data/surfaces.ini
+++ /dev/null
@@ -1,111 +0,0 @@
-[SURFACE_0]
-KEY=CONCRETE
-FRICTION=0.91
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=CARPET
-FRICTION=0.75
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.1
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=PITS-VAL
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=CURB
-FRICTION=0.93
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1
-FF_EFFECT=0
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.3
-VIBRATION_LENGTH=1.5
-
-[SURFACE_4]
-KEY=OUT
-FRICTION=0.95
-DAMPING=0.01
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_5]
-KEY=KERB
-FRICTION=0.92
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.6
-VIBRATION_LENGTH=1.5
-
-[SURFACE_6]
-KEY=GRS-CUT-A
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=5
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
diff --git a/acc-web/accserver/content/tracks/ks_vallelunga/extended_circuit/data/drs_zones.ini b/acc-web/accserver/content/tracks/ks_vallelunga/extended_circuit/data/drs_zones.ini
deleted file mode 100644
index b082c11..0000000
--- a/acc-web/accserver/content/tracks/ks_vallelunga/extended_circuit/data/drs_zones.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[ZONE_0]
-DETECTION=0.264
-START=0.331
-END=0.458
-
-
diff --git a/acc-web/accserver/content/tracks/ks_vallelunga/extended_circuit/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_vallelunga/extended_circuit/data/surfaces.ini
deleted file mode 100644
index 38b70cb..0000000
--- a/acc-web/accserver/content/tracks/ks_vallelunga/extended_circuit/data/surfaces.ini
+++ /dev/null
@@ -1,111 +0,0 @@
-[SURFACE_0]
-KEY=CONCRETE
-FRICTION=0.91
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=CARPET
-FRICTION=0.75
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.1
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=PITS-VAL
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=CURB
-FRICTION=0.93
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1
-FF_EFFECT=0
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.3
-VIBRATION_LENGTH=1.5
-
-[SURFACE_4]
-KEY=OUT
-FRICTION=0.95
-DAMPING=0.01
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_5]
-KEY=KERB
-FRICTION=0.92
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.6
-VIBRATION_LENGTH=1.5
-
-[SURFACE_6]
-KEY=GRS-CUT-A
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=5
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
diff --git a/acc-web/accserver/content/tracks/ks_vallelunga/models_classic_circuit.ini b/acc-web/accserver/content/tracks/ks_vallelunga/models_classic_circuit.ini
deleted file mode 100644
index 750bdc7..0000000
--- a/acc-web/accserver/content/tracks/ks_vallelunga/models_classic_circuit.ini
+++ /dev/null
@@ -1,19 +0,0 @@
-[MODEL_0]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_vallelunga.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=4.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=100.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/ks_vallelunga/models_club_circuit.ini b/acc-web/accserver/content/tracks/ks_vallelunga/models_club_circuit.ini
deleted file mode 100644
index e89842c..0000000
--- a/acc-web/accserver/content/tracks/ks_vallelunga/models_club_circuit.ini
+++ /dev/null
@@ -1,19 +0,0 @@
-[MODEL_0]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_vallelunga.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=100.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
diff --git a/acc-web/accserver/content/tracks/ks_vallelunga/models_extended_circuit.ini b/acc-web/accserver/content/tracks/ks_vallelunga/models_extended_circuit.ini
deleted file mode 100644
index 38497d1..0000000
--- a/acc-web/accserver/content/tracks/ks_vallelunga/models_extended_circuit.ini
+++ /dev/null
@@ -1,19 +0,0 @@
-[MODEL_0]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_vallelunga.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=3.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=100.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
diff --git a/acc-web/accserver/content/tracks/ks_zandvoort/data/drs_zones.ini b/acc-web/accserver/content/tracks/ks_zandvoort/data/drs_zones.ini
deleted file mode 100644
index 211c3e2..0000000
--- a/acc-web/accserver/content/tracks/ks_zandvoort/data/drs_zones.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-[ZONE_0]
-DETECTION=0.862
-START=0.956
-END=0.083
-
-[ZONE_1]
-DETECTION=0.583
-START=0.641
-END=0.729
diff --git a/acc-web/accserver/content/tracks/ks_zandvoort/data/surfaces.ini b/acc-web/accserver/content/tracks/ks_zandvoort/data/surfaces.ini
deleted file mode 100644
index 8614a0c..0000000
--- a/acc-web/accserver/content/tracks/ks_zandvoort/data/surfaces.ini
+++ /dev/null
@@ -1,143 +0,0 @@
-[SURFACE_0]
-KEY=OUT
-FRICTION=0.96
-DAMPING=0.01
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=PITS
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=TRM-ZNDV
-FRICTION=0.98
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=TRAV
-FRICTION=0.93
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1
-FF_EFFECT=0
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.3
-
-[SURFACE_4]
-KEY=KERB
-FRICTION=0.96
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1
-FF_EFFECT=0
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.8
-
-[SURFACE_5]
-KEY=CURB
-FRICTION=0.96
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1
-FF_EFFECT=0
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.3
-VIBRATION_LENGTH=1.5
-
-[SURFACE_6]
-KEY=CONCRETE
-FRICTION=0.92
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_7]
-KEY=PAINT
-FRICTION=0.9
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_8]
-KEY=GRAVEL
-FRICTION=0.8
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0.05
-SIN_LENGTH=0.07
-IS_PITLANE=0
-VIBRATION_GAIN=0.4
-VIBRATION_LENGTH=0.3
diff --git a/acc-web/accserver/content/tracks/ks_zandvoort/models.ini b/acc-web/accserver/content/tracks/ks_zandvoort/models.ini
deleted file mode 100644
index de80311..0000000
--- a/acc-web/accserver/content/tracks/ks_zandvoort/models.ini
+++ /dev/null
@@ -1,19 +0,0 @@
-[MODEL_0]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=ks_zandvoort.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=100.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/magione/data/drs_zones.ini b/acc-web/accserver/content/tracks/magione/data/drs_zones.ini
deleted file mode 100644
index ba4fbb8..0000000
--- a/acc-web/accserver/content/tracks/magione/data/drs_zones.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[ZONE_0]
-DETECTION=0.353
-START=0.401
-END=0.676
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/magione/data/surfaces.ini b/acc-web/accserver/content/tracks/magione/data/surfaces.ini
deleted file mode 100644
index f1517b4..0000000
--- a/acc-web/accserver/content/tracks/magione/data/surfaces.ini
+++ /dev/null
@@ -1,207 +0,0 @@
-[SURFACE_0]
-KEY=PITLANE
-FRICTION=0.97
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.05
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=TARMACA
-FRICTION=0.97
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=TARMACB
-FRICTION=0.98
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=TARMACC
-FRICTION=0.98
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_4]
-KEY=TARMACD
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_5]
-KEY=TARMACE
-FRICTION=1.00
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_6]
-KEY=OUT
-FRICTION=0.90
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.15
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_7]
-KEY=KERB
-FRICTION=0.92
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=1.0
-
-[SURFACE_8]
-KEY=CURB
-FRICTION=0.92
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.0
-FF_EFFECT=1
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=1.0
-VIBRATION_LENGTH=1.5
-
-[SURFACE_9]
-KEY=CONCRETE
-FRICTION=0.90
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.1
-VIBRATION_LENGTH=0.5
-
-[SURFACE_10]
-KEY=CUT
-FRICTION=0.90
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_11]
-KEY=PEN-GRS-B
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=10
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
-
-[SURFACE_12]
-KEY=PEN-GRS-A
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=5
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
diff --git a/acc-web/accserver/content/tracks/magione/models.ini b/acc-web/accserver/content/tracks/magione/models.ini
deleted file mode 100644
index fdbe4b9..0000000
--- a/acc-web/accserver/content/tracks/magione/models.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-[MODEL_0]
-FILE=magione.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=100.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/monza/data/drs_zones.ini b/acc-web/accserver/content/tracks/monza/data/drs_zones.ini
deleted file mode 100644
index e692bbe..0000000
--- a/acc-web/accserver/content/tracks/monza/data/drs_zones.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-[ZONE_0]
-DETECTION=0.880
-START=0.029
-END=0.152
-
-[ZONE_1]
-DETECTION=0.482
-START=0.537
-END=0.674
diff --git a/acc-web/accserver/content/tracks/monza/data/surfaces.ini b/acc-web/accserver/content/tracks/monza/data/surfaces.ini
deleted file mode 100644
index 2fa2084..0000000
--- a/acc-web/accserver/content/tracks/monza/data/surfaces.ini
+++ /dev/null
@@ -1,303 +0,0 @@
-[SURFACE_0]
-KEY=CONCRETE
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=CARPET
-FRICTION=0.7
-DAMPING=0
-WAV=extraturf.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.1
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=PITS-MNZ
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=ILLCONC
-FRICTION=0.85
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=5
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_4]
-KEY=OUT
-FRICTION=0.92
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_5]
-KEY=KERB
-FRICTION=0.95
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.6
-VIBRATION_LENGTH=0.8
-
-[SURFACE_6]
-KEY=CURB
-FRICTION=0.95
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.0
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=1.5
-
-[SURFACE_7]
-KEY=MONZA-ASPH
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_8]
-KEY=PEN-ASPH-B
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=10
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_9]
-KEY=PEN-ASPH-A
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=5
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_10]
-KEY=PEN-CNC-A
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=5
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_11]
-KEY=PEN-GRS-D
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=20
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
-
-[SURFACE_12]
-KEY=PEN-GRS-B
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=10
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
-
-[SURFACE_13]
-KEY=PEN-ASPH-D
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=20
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_14]
-KEY=PEN-CNC-D
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=20
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_15]
-KEY=PEN-ASPH-C
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=15
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_16]
-KEY=TARM_OU
-FRICTION=0.95
-DAMPING=0.01
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_17]
-KEY=CNC_OU
-FRICTION=0.93
-DAMPING=0.01
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_18]
-KEY=GRILL
-FRICTION=0.90
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.1
-VIBRATION_LENGTH=0.05
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/monza/models.ini b/acc-web/accserver/content/tracks/monza/models.ini
deleted file mode 100644
index 99d53e2..0000000
--- a/acc-web/accserver/content/tracks/monza/models.ini
+++ /dev/null
@@ -1,34 +0,0 @@
-[MODEL_0]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=monza.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=3.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=4.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_5]
-FILE=5.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_6]
-FILE=100.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/mugello/data/drs_zones.ini b/acc-web/accserver/content/tracks/mugello/data/drs_zones.ini
deleted file mode 100644
index 7bdd892..0000000
--- a/acc-web/accserver/content/tracks/mugello/data/drs_zones.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[ZONE_0]
-DETECTION=0.861
-START=0.911
-END=0.120
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/mugello/data/surfaces.ini b/acc-web/accserver/content/tracks/mugello/data/surfaces.ini
deleted file mode 100644
index 8644b4e..0000000
--- a/acc-web/accserver/content/tracks/mugello/data/surfaces.ini
+++ /dev/null
@@ -1,143 +0,0 @@
-[SURFACE_0]
-KEY=CONCRETE
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=CARPET
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=PITS-MUG
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=CURB
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.02
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.3
-VIBRATION_LENGTH=1.5
-
-[SURFACE_4]
-KEY=OUT
-FRICTION=0.91
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.05
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_5]
-KEY=TARMAC-MUG-A
-FRICTION=0.99
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_6]
-KEY=KERB
-FRICTION=0.92
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.5
-VIBRATION_LENGTH=1.5
-
-[SURFACE_7]
-KEY=CUTRD
-FRICTION=0.95
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_8]
-KEY=GRS-CUT
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=10
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/mugello/models.ini b/acc-web/accserver/content/tracks/mugello/models.ini
deleted file mode 100644
index 6ebca7f..0000000
--- a/acc-web/accserver/content/tracks/mugello/models.ini
+++ /dev/null
@@ -1,19 +0,0 @@
-[MODEL_0]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=mugello.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=100.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/spa/data/drs_zones.ini b/acc-web/accserver/content/tracks/spa/data/drs_zones.ini
deleted file mode 100644
index a3348d1..0000000
--- a/acc-web/accserver/content/tracks/spa/data/drs_zones.ini
+++ /dev/null
@@ -1,11 +0,0 @@
-[ZONE_0]
-DETECTION=0.940
-START=0.981
-END=0.050
-
-[ZONE_1]
-DETECTION=0.109
-START=0.234
-END=0.334
-
-
diff --git a/acc-web/accserver/content/tracks/spa/data/surfaces.ini b/acc-web/accserver/content/tracks/spa/data/surfaces.ini
deleted file mode 100644
index 6b95fd9..0000000
--- a/acc-web/accserver/content/tracks/spa/data/surfaces.ini
+++ /dev/null
@@ -1,287 +0,0 @@
-[SURFACE_0]
-KEY=CONCRETE
-FRICTION=0.85
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=CARPET
-FRICTION=0.65
-DAMPING=0
-WAV=extraturf.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.1
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=ASPH-SPA_BLACK
-FRICTION=0.98
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=CURB
-FRICTION=0.94
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=1.5
-
-[SURFACE_4]
-KEY=OUT
-FRICTION=0.96
-DAMPING=0.012
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.02
-VIBRATION_LENGTH=0.5
-
-[SURFACE_5]
-KEY=KERB
-FRICTION=0.94
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.3
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.5
-VIBRATION_LENGTH=1.5
-
-[SURFACE_6]
-KEY=GRILLE
-FRICTION=0.95
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1.6
-FF_EFFECT=1
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.1
-VIBRATION_LENGTH=0.3
-
-[SURFACE_7]
-KEY=BLOCK-CONCR
-FRICTION=0.75
-DAMPING=0
-WAV=kerb.wav
-WAV_PITCH=1
-FF_EFFECT=1
-DIRT_ADDITIVE=0.05
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.5
-VIBRATION_LENGTH=0.35
-
-[SURFACE_8]
-KEY=PITSPA
-FRICTION=0.98
-DAMPING=0
-WAV=
-WAV_PITCH=
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=1
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_9]
-KEY=ASPH-SPA_VIOLET
-FRICTION=0.97
-DAMPING=0
-WAV=
-WAV_PITCH=
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_10]
-KEY=ASPH-SPA_RED
-FRICTION=0.97
-DAMPING=0
-WAV=
-WAV_PITCH=
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_11]
-KEY=ASPH-SPA_GREEN
-FRICTION=0.97
-DAMPING=0
-WAV=
-WAV_PITCH=
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_12]
-KEY=ASPH-SPA_BLUE
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=1
-BLACK_FLAG_TIME=0
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_13]
-KEY=ASPH-CUT-B
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=10
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_14]
-KEY=CRP-CUT-A
-FRICTION=0.65
-DAMPING=0
-WAV=extraturf.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=5
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_15]
-KEY=CRP-CUT-B
-FRICTION=0.65
-DAMPING=0
-WAV=extraturf.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0.1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=10
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_16]
-KEY=GRS-CUT-A
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=5
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
-
-[SURFACE_17]
-KEY=GRS-CUT-B
-FRICTION=0.6
-DAMPING=0
-WAV=grass.wav
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=1
-IS_VALID_TRACK=0
-BLACK_FLAG_TIME=10
-SIN_HEIGHT=0.03
-SIN_LENGTH=0.5
-IS_PITLANE=0
-VIBRATION_GAIN=0.2
-VIBRATION_LENGTH=0.6
\ No newline at end of file
diff --git a/acc-web/accserver/content/tracks/spa/models.ini b/acc-web/accserver/content/tracks/spa/models.ini
deleted file mode 100644
index 7e2d160..0000000
--- a/acc-web/accserver/content/tracks/spa/models.ini
+++ /dev/null
@@ -1,52 +0,0 @@
-[MODEL_0]
-FILE=3.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_1]
-FILE=spa.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_2]
-FILE=1.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_3]
-FILE=2.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_4]
-FILE=4.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[MODEL_5]
-FILE=100.kn5
-POSITION=0,0,0
-ROTATION=0,0,0
-
-[DYNAMIC_OBJECT_0]
-PROBABILITY=75
-MULT=1,1
-FILE=11.kn5
-POS_MODE=RANDOM
-RND_POS_CENTER=-320,280,1400
-RND_POS_RANGE=1000,10,1000
-VEL_MODE=RANDOM
-RND_VEL_BASE=0,0,0
-RND_VEL_RANGE=2,0,2
-
-[DYNAMIC_OBJECT_1]
-PROBABILITY=75
-MULT=1,1
-FILE=12.kn5
-POS_MODE=RANDOM
-RND_POS_CENTER=-320,280,1400
-RND_POS_RANGE=1000,10,1000
-VEL_MODE=RANDOM
-RND_VEL_BASE=0,0,0
-RND_VEL_RANGE=2,0,2
-
diff --git a/acc-web/accserver/content/tracks/trento-bondone/data/surfaces.ini b/acc-web/accserver/content/tracks/trento-bondone/data/surfaces.ini
deleted file mode 100644
index e696574..0000000
--- a/acc-web/accserver/content/tracks/trento-bondone/data/surfaces.ini
+++ /dev/null
@@ -1,63 +0,0 @@
-[SURFACE_0]
-KEY=CONCRETE
-FRICTION=0.91
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_1]
-KEY=TRM-TN-A
-FRICTION=0.98
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_2]
-KEY=TRM-TN-B
-FRICTION=0.97
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=NULL
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0
-VIBRATION_LENGTH=0
-
-[SURFACE_3]
-KEY=TRM-TN-C
-FRICTION=0.96
-DAMPING=0
-WAV=
-WAV_PITCH=0
-FF_EFFECT=0
-DIRT_ADDITIVE=0
-BLACK_FLAG_TIME=0
-IS_VALID_TRACK=1
-SIN_HEIGHT=0
-SIN_LENGTH=0
-IS_PITLANE=0
-VIBRATION_GAIN=0.0
-VIBRATION_LENGTH=0.0
\ No newline at end of file
diff --git a/acc-web/accserver/manager/ks_tyres.ini b/acc-web/accserver/manager/ks_tyres.ini
deleted file mode 100644
index 7c93441..0000000
--- a/acc-web/accserver/manager/ks_tyres.ini
+++ /dev/null
@@ -1,748 +0,0 @@
-README=Insert your mod's data in mod_tyres.ini
-
-[abarth500]
-ST=Street
-SM=Semislicks
-
-[abarth500_s1]
-ST=Street
-SM=Semislicks
-
-[alfa_romeo_giulietta_qv]
-ST=Street
-
-[alfa_romeo_giulietta_qv_le]
-ST=Street
-
-[bmw_1m]
-ST=Street
-SM=Semislicks
-
-[bmw_1m_s3]
-ST=Street
-SM=Semislicks
-
-[bmw_m3_e30]
-SV=Street 90s
-ST=Street
-SM=Semislick
-
-[bmw_m3_e30_drift]
-SV=Street 90s
-ST=Street
-SM=Semislick
-
-[bmw_m3_e30_dtm]
-S=Slicks Soft DTM90s
-M=Slicks Medium DTM90s
-H=Slicks Hard DTM90s
-
-[bmw_m3_e30_gra]
-S=Slicks Soft DTM90s
-M=Slicks Medium DTM90s
-H=Slicks Hard DTM90s
-
-[bmw_m3_e30_s1]
-SV=Street 90s
-ST=Street
-SM=Semislick
-
-[bmw_m3_e92]
-ST=Street
-SM=Semislicks
-
-[bmw_m3_e92_drift]
-ST=Street
-SM=Semislicks
-
-[bmw_m3_e92_s1]
-ST=Street
-SM=Semislicks
-
-[bmw_m3_gt2]
-SS=Slick SuperSoft
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-SH=Slick SuperHard
-
-[bmw_z4]
-ST=Street
-SM=Semislicks
-
-[bmw_z4_drift]
-ST=Street
-SM=Semislicks
-
-[bmw_z4_gt3]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[bmw_z4_s1]
-ST=Street
-SM=Semislicks
-
-[ferrari_312t]
-S=Soft GP70
-H=Hard GP70
-
-[ferrari_458]
-SM=Semislicks
-ST=Street
-
-[ferrari_458_gt2]
-SS=Slick SuperSoft
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-SH=Slick SuperHard
-
-[ferrari_458_s3]
-H=Trofeo H Slicks
-SM=Semislicks
-
-[ferrari_599xxevo]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ferrari_f40]
-SV=Street90S
-ST=Street
-SM=Semislicks
-
-[ferrari_f40_s3]
-SM=Semislicks
-M=Medium Slicks 90s
-H=Hard Slicks 90s
-
-[ferrari_laferrari]
-HR=Hypercar road
-I=Hypercar Trofeo
-
-[ks_abarth500_assetto_corse]
-H=Slicks
-
-[ks_abarth_595ss]
-V=Street
-
-[ks_abarth_595ss_s1]
-V=Street
-
-[ks_abarth_595ss_s2]
-V=Street
-
-[ks_alfa_33_stradale]
-V=Vintage
-
-[ks_alfa_giulia_qv]
-HR=Hypercar road
-ST=Street
-
-[ks_alfa_mito_qv]
-ST=Street
-SM=Semislicks
-
-[ks_alfa_romeo_155_v6]
-S=Slicks Soft DTM90s
-M=Slicks Medium DTM90s
-H=Slicks Hard DTM90s
-
-[ks_alfa_romeo_4c]
-SM=Semislicks
-ST=Street
-
-[ks_alfa_romeo_gta]
-V=Vintage 60s
-
-[ks_audi_a1s1]
-SM=Semislicks
-ST=Street
-
-[ks_audi_r18_etron_quattro]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_audi_r8_lms]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_audi_r8_lms_2016]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_audi_r8_plus]
-ST=Street
-SM=Semislicks
-
-[ks_audi_sport_quattro]
-SV=Street vintage
-ST=Street
-SM=Semislicks
-
-[ks_audi_sport_quattro_rally]
-H=Tarmac Hard
-
-[ks_audi_sport_quattro_s1]
-SV=Street vintage
-ST=Street
-SM=Semislicks
-
-[ks_audi_tt_cup]
-M=Trofeo M Slicks
-H=Trofeo H Slicks
-
-[ks_audi_tt_vln]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_bmw_m235i_racing]
-M=Trofeo M Slicks
-H=Trofeo H Slicks
-
-[ks_bmw_m4]
-ST=Street
-SM=Semislick
-
-[ks_bmw_m4_akrapovic]
-ST=Street
-SM=Semislick
-
-[ks_corvette_c7r]
-SS=Slick SuperSoft
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-SH=Slick SuperHard
-
-[ks_corvette_c7_stingray]
-ST=Street
-SM=Semislicks
-
-[ks_ferrari_250_gto]
-V=Vintage 60s
-
-[ks_ferrari_288_gto]
-SV=Street90S
-ST=Street
-SM=Semislicks
-
-[ks_ferrari_312_67]
-V=GP67
-
-[ks_ferrari_330_p4]
-V=Vintage
-
-[ks_ferrari_488_gt3]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_ferrari_488_gtb]
-HR=Hypercar road
-
-[ks_ferrari_812_superfast]
-HR=Hypercar road
-
-[ks_ferrari_f138]
-SS=Slick SuperSoft
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_ferrari_f2004]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_ferrari_fxx_k]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_ferrari_sf15t]
-SS=Slick SuperSoft
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_ferrari_sf70h]
-US=Slick UltraSoft
-SS=Slick SuperSoft
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_ford_escort_mk1]
-V70=Vintage GT70
-
-[ks_ford_gt40]
-V=Vintage
-
-[ks_ford_mustang_2015]
-ST=Street
-SM=Semislick
-
-[ks_glickenhaus_scg003]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_lamborghini_aventador_sv]
-HR=Hypercar road
-I=Hypercar Trofeo
-
-[ks_lamborghini_countach]
-V=Pirelli Cinturato
-ST=Street
-SM=Semislick
-
-[ks_lamborghini_countach_s1]
-V=Pirelli Cinturato
-ST=Street
-SM=Semislick
-
-[ks_lamborghini_gallardo_sl]
-ST=Street
-SM=Semislicks
-
-[ks_lamborghini_gallardo_sl_s3]
-ST=Street
-SM=Semislicks
-
-[ks_lamborghini_huracan_gt3]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_lamborghini_huracan_performante]
-HR=Hypercar road
-I=Hypercar Trofeo
-
-[ks_lamborghini_huracan_st]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_lamborghini_miura_sv]
-V=Cinturato
-
-[ks_lamborghini_sesto_elemento]
-SM=Semislicks
-I=Hypercar Trofeo
-
-[ks_lotus_25]
-V=GP63
-
-[ks_lotus_3_eleven]
-I=Hypercar Trofeo
-HR=Hypercar road
-
-[ks_lotus_72d]
-S=Soft GP70
-H=Hard GP70
-
-[ks_maserati_250f_12cyl]
-V=GP57
-
-[ks_maserati_250f_6cyl]
-V=GP54
-
-[ks_maserati_alfieri]
-ST=Street
-
-[ks_maserati_gt_mc_gt4]
-H=Slick Hard
-
-[ks_maserati_levante]
-ST=Street
-
-[ks_maserati_mc12_gt1]
-S=Soft Slicks 06s
-M=Medium Slicks 06s
-H=Hard Slicks 06s
-
-[ks_maserati_quattroporte]
-ST=Street
-
-[ks_mazda_787b]
-S=Soft Slicks 90s
-M=Medium Slicks 90s
-H=Hard Slicks 90s
-
-[ks_mazda_miata]
-SV=Street 90s
-ST=Street
-
-[ks_mazda_mx5_cup]
-H=Slicks
-
-[ks_mazda_mx5_nd]
-ST=Street
-SM=Semislicks
-
-[ks_mazda_rx7_spirit_r]
-SV=Street90S
-ST=Street
-SM=Semislicks
-
-[ks_mazda_rx7_tuned]
-SV=Street90S
-ST=Street
-SM=Semislicks
-
-[ks_mclaren_570s]
-SM=Semislicks
-ST=Street
-
-[ks_mclaren_650_gt3]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_mclaren_f1_gtr]
-S=Soft Slicks 90s
-M=Medium Slicks 90s
-H=Hard Slicks 90s
-
-[ks_mclaren_p1]
-HR=Hypercar road
-I=Hypercar Trofeo
-
-[ks_mclaren_p1_gtr]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_mercedes_190_evo2]
-S=Slicks Soft DTM90s
-M=Slicks Medium DTM90s
-H=Slicks Hard DTM90s
-
-[ks_mercedes_amg_gt3]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_mercedes_c9]
-S=Soft Slicks 90s
-M=Medium Slicks 90s
-H=Hard Slicks 90s
-
-[ks_nissan_370z]
-ST=Street
-SM=Semislicks
-
-[ks_nissan_gtr]
-HR=Hypercar road
-
-[ks_nissan_gtr_gt3]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_nissan_skyline_r34]
-ST=Street
-SM=Semislicks
-
-[ks_pagani_huayra_bc]
-HR=Hypercar road
-I=Hypercar Trofeo
-
-[ks_porsche_718_boxster_s]
-SM=Semislicks
-ST=Street
-
-[ks_porsche_718_boxster_s_pdk]
-SM=Semislicks
-ST=Street
-
-[ks_porsche_718_cayman_s]
-SM=Semislicks
-ST=Street
-
-[ks_porsche_718_spyder_rs]
-V=GT60
-
-[ks_porsche_908_lh]
-V=Vintage
-
-[ks_porsche_911_carrera_rsr]
-V70=Vintage GT70
-
-[ks_porsche_911_gt1]
-S=Soft Slicks 90s
-M=Medium Slicks 90s
-H=Hard Slicks 90s
-
-[ks_porsche_911_gt3_cup_2017]
-H=Slick Cup
-
-[ks_porsche_911_gt3_rs]
-HR=Hypercar road
-
-[ks_porsche_911_gt3_r_2016]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_porsche_911_r]
-HR=Hypercar road
-
-[ks_porsche_911_rsr_2017]
-SS=Slick SuperSoft
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-SH=Slick SuperHard
-
-[ks_porsche_917_30]
-V=Vintage
-
-[ks_porsche_917_k]
-V=Vintage
-
-[ks_porsche_918_spyder]
-HR=Hypercar road
-I=Hypercar Trofeo
-
-[ks_porsche_919_hybrid_2015]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_porsche_919_hybrid_2016]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ks_porsche_935_78_moby_dick]
-V78=Vintage 78
-
-[ks_porsche_962c_longtail]
-S=Soft Slicks 80s
-M=Medium Slicks 80s
-H=Hard Slicks 80s
-
-[ks_porsche_962c_shorttail]
-S=Soft Slicks 80s
-M=Medium Slicks 80s
-H=Hard Slicks 80s
-
-[ks_porsche_991_carrera_s]
-SM=Semislicks
-ST=Street
-
-[ks_porsche_991_turbo_s]
-SM=Semislicks
-ST=Street
-
-[ks_porsche_cayenne]
-ST=Street
-
-[ks_porsche_cayman_gt4_clubsport]
-H=Slick Hard
-
-[ks_porsche_cayman_gt4_std]
-SM=Semislicks
-
-[ks_porsche_macan]
-ST=Street
-
-[ks_porsche_panamera]
-HR=Hypercar road
-
-[ks_praga_r1]
-S=Slicks Soft
-M=Slicks Medium
-H=Slicks Hard
-
-[ks_ruf_rt12r]
-SM=Semislicks
-
-[ks_ruf_rt12r_awd]
-SM=Semislicks
-
-[ks_toyota_ae86]
-SV=Street 90s
-ST=Street
-
-[ks_toyota_ae86_drift]
-SV=Street 90s
-ST=Street
-SM=Semislicks
-
-[ks_toyota_ae86_tuned]
-SM=Semislicks
-ST=Street
-SV=Street 90s
-
-[ks_toyota_celica_st185]
-S=Slicks Soft
-M=Slicks Medium
-H=Slicks Hard
-
-[ks_toyota_gt86]
-E=ECO
-ST=Street
-SM=Semislicks
-
-[ks_toyota_supra_mkiv]
-SV=Street90S
-ST=Street
-SM=Semislicks
-
-[ks_toyota_supra_mkiv_drift]
-SV=Street90S
-ST=Street
-SM=Semislicks
-
-[ks_toyota_supra_mkiv_tuned]
-ST=Street
-SM=Semislick
-
-[ks_toyota_ts040]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ktm_xbow_r]
-SM=Semislicks
-
-[lotus_2_eleven]
-SM=Semislicks
-
-[lotus_2_eleven_gt4]
-SM=Semislicks
-
-[lotus_49]
-V=GP67
-
-[lotus_98t]
-Q=Qualifying GP86
-S=Soft GP86
-M=Medium GP86
-H=Hard GP86
-
-[lotus_elise_sc]
-ST=Street
-SM=Semislicks
-
-[lotus_elise_sc_s1]
-ST=Street
-SM=Semislicks
-
-[lotus_elise_sc_s2]
-ST=Street
-SM=Semislicks
-
-[lotus_evora_gtc]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[lotus_evora_gte]
-ST=Street
-SM=Semislicks
-
-[lotus_evora_gte_carbon]
-ST=Street
-SM=Semislicks
-
-[lotus_evora_gx]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[lotus_evora_s]
-ST=Street
-SM=Semislicks
-
-[lotus_evora_s_s2]
-ST=Street
-SM=Semislicks
-
-[lotus_exige_240]
-ST=Street
-SM=Semislicks
-
-[lotus_exige_240_s3]
-ST=Street
-SM=Semislicks
-
-[lotus_exige_s]
-ST=Street
-SM=Semislicks
-
-[lotus_exige_scura]
-ST=Street
-SM=Semislicks
-
-[lotus_exige_s_roadster]
-ST=Street
-SM=Semislicks
-
-[lotus_exige_v6_cup]
-ST=Street
-SM=Semislicks
-
-[lotus_exos_125]
-M=Slick Medium
-
-[lotus_exos_125_s1]
-SS=Slick SuperSoft
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[mclaren_mp412c]
-SM=Semislicks
-ST=Street
-
-[mclaren_mp412c_gt3]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[mercedes_sls]
-ST=Street
-SM=Semislicks
-
-[mercedes_sls_gt3]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[p4-5_2011]
-SS=Slick SuperSoft
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-SH=Slick SuperHard
-
-[pagani_huayra]
-HR=Hypercar road
-I=Hypercar Trofeo
-
-[pagani_zonda_r]
-S=Slick Soft
-M=Slick Medium
-H=Slick Hard
-
-[ruf_yellowbird]
-SV=Street90S
-ST=Street
-SM=Semislicks
-
-[shelby_cobra_427sc]
-V=Vintage
-
-[tatuusfa1]
-S=Slicks Soft
-M=Slicks Medium
-H=Slicks Hard
diff --git a/acc-web/accserver/presets/SERVER_00/entry_list.ini b/acc-web/accserver/presets/SERVER_00/entry_list.ini
deleted file mode 100644
index e7b8bdf..0000000
--- a/acc-web/accserver/presets/SERVER_00/entry_list.ini
+++ /dev/null
@@ -1,161 +0,0 @@
-[CAR_0]
-MODEL=bmw_m3_e30
-SKIN=Brilliant_red
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_1]
-MODEL=bmw_m3_e30
-SKIN=Cinnabar_red
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_2]
-MODEL=bmw_m3_e30
-SKIN=Henna_Red
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_3]
-MODEL=bmw_m3_e30
-SKIN=Macau_Blue_Metallic
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_4]
-MODEL=bmw_m3_e30
-SKIN=Misano_red
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_5]
-MODEL=bmw_m3_e30
-SKIN=Nogaro_Silver_metallic
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_6]
-MODEL=bmw_m3_e30
-SKIN=Salmon_Silver_metallic
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_7]
-MODEL=bmw_m3_e30
-SKIN=Sterling_Silver_metallic
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_8]
-MODEL=bmw_m3_e30
-SKIN=Brilliant_red
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_9]
-MODEL=bmw_m3_e30
-SKIN=Cinnabar_red
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_10]
-MODEL=bmw_m3_e30
-SKIN=Henna_Red
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_11]
-MODEL=bmw_m3_e30
-SKIN=Macau_Blue_Metallic
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_12]
-MODEL=bmw_m3_e30
-SKIN=Misano_red
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_13]
-MODEL=bmw_m3_e30
-SKIN=Nogaro_Silver_metallic
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_14]
-MODEL=bmw_m3_e30
-SKIN=Salmon_Silver_metallic
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_15]
-MODEL=bmw_m3_e30
-SKIN=Sterling_Silver_metallic
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_16]
-MODEL=bmw_m3_e30
-SKIN=Cinnabar_red
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
-
-[CAR_17]
-MODEL=bmw_m3_e30
-SKIN=Brilliant_red
-SPECTATOR_MODE=0
-DRIVERNAME=
-TEAM=
-GUID=
-BALLAST=0
diff --git a/acc-web/accserver/presets/SERVER_00/server_cfg.ini b/acc-web/accserver/presets/SERVER_00/server_cfg.ini
deleted file mode 100644
index 3005299..0000000
--- a/acc-web/accserver/presets/SERVER_00/server_cfg.ini
+++ /dev/null
@@ -1,94 +0,0 @@
-[SERVER]
-NAME=AC_Server
-CARS=bmw_m3_e30
-CONFIG_TRACK=
-TRACK=magione
-SUN_ANGLE=48
-PASSWORD=
-ADMIN_PASSWORD=mypassword
-UDP_PORT=9600
-TCP_PORT=9600
-HTTP_PORT=8081
-MAX_BALLAST_KG=0
-QUALIFY_MAX_WAIT_PERC=120
-PICKUP_MODE_ENABLED=1
-LOOP_MODE=1
-SLEEP_TIME=1
-CLIENT_SEND_INTERVAL_HZ=18
-SEND_BUFFER_SIZE=0
-RECV_BUFFER_SIZE=0
-RACE_OVER_TIME=180
-KICK_QUORUM=85
-VOTING_QUORUM=80
-VOTE_DURATION=20
-BLACKLIST_MODE=1
-FUEL_RATE=100
-DAMAGE_MULTIPLIER=100
-TYRE_WEAR_RATE=100
-ALLOWED_TYRES_OUT=2
-ABS_ALLOWED=1
-TC_ALLOWED=1
-START_RULE=0
-STABILITY_ALLOWED=0
-AUTOCLUTCH_ALLOWED=0
-TYRE_BLANKETS_ALLOWED=0
-FORCE_VIRTUAL_MIRROR=1
-REGISTER_TO_LOBBY=1
-MAX_CLIENTS=18
-NUM_THREADS=2
-UDP_PLUGIN_LOCAL_PORT=0
-UDP_PLUGIN_ADDRESS=
-AUTH_PLUGIN_ADDRESS=
-LEGAL_TYRES=SV
-WELCOME_MESSAGE=
-
-[FTP]
-HOST=
-LOGIN=
-PASSWORD=cUZjoEySazIKsEmOhbsS5g==
-FOLDER=
-LINUX=0
-
-[PRACTICE]
-NAME=Practice
-TIME=10
-IS_OPEN=1
-
-[QUALIFY]
-NAME=Qualify
-TIME=10
-IS_OPEN=1
-
-[RACE]
-NAME=Race
-LAPS=5
-WAIT_TIME=60
-IS_OPEN=1
-
-[DYNAMIC_TRACK]
-SESSION_START=95
-RANDOMNESS=2
-SESSION_TRANSFER=90
-LAP_GAIN=10
-
-[WEATHER_0]
-GRAPHICS=3_clear
-BASE_TEMPERATURE_AMBIENT=18
-BASE_TEMPERATURE_ROAD=6
-VARIATION_AMBIENT=1
-VARIATION_ROAD=1
-
-[WEATHER_1]
-GRAPHICS=7_heavy_clouds
-BASE_TEMPERATURE_AMBIENT=15
-BASE_TEMPERATURE_ROAD=-1
-VARIATION_AMBIENT=1
-VARIATION_ROAD=1
-
-[DATA]
-DESCRIPTION=
-EXSERVEREXE=
-EXSERVERBAT=
-EXSERVERHIDEWIN=0
-WEBLINK=
-WELCOME_PATH=
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingClient.sln b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingClient.sln
new file mode 100755
index 0000000..ec8fbf0
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingClient.sln
@@ -0,0 +1,31 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.28010.2048
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ksBroadcastingNetwork", "ksBroadcastingNetwork\ksBroadcastingNetwork.csproj", "{1EF9A746-3771-4052-B61B-04BDB3DC381A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ksBroadcastingTestClient", "ksBroadcastingTestClient\ksBroadcastingTestClient.csproj", "{D61DDA03-4BE1-485B-A554-15514058C750}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {1EF9A746-3771-4052-B61B-04BDB3DC381A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1EF9A746-3771-4052-B61B-04BDB3DC381A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1EF9A746-3771-4052-B61B-04BDB3DC381A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1EF9A746-3771-4052-B61B-04BDB3DC381A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D61DDA03-4BE1-485B-A554-15514058C750}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D61DDA03-4BE1-485B-A554-15514058C750}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D61DDA03-4BE1-485B-A554-15514058C750}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D61DDA03-4BE1-485B-A554-15514058C750}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {90AE47EA-E71B-4785-9BD6-0BE64F348AF9}
+ EndGlobalSection
+EndGlobal
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/ACCUdpRemoteClient.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/ACCUdpRemoteClient.cs
new file mode 100755
index 0000000..07bd0d5
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/ACCUdpRemoteClient.cs
@@ -0,0 +1,142 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ksBroadcastingNetwork
+{
+ public class ACCUdpRemoteClient : IDisposable
+ {
+ private UdpClient _client;
+ private Task _listenerTask;
+ public BroadcastingNetworkProtocol MessageHandler { get; }
+ public string IpPort { get; }
+ public string DisplayName { get; }
+ public string ConnectionPassword { get; }
+ public string CommandPassword { get; }
+ public int MsRealtimeUpdateInterval { get; }
+
+ ///
+ /// To get the events delivered inside the UI thread, just create this object from the UI thread/synchronization context.
+ ///
+ public ACCUdpRemoteClient(string ip, int port, string displayName, string connectionPassword, string commandPassword, int msRealtimeUpdateInterval)
+ {
+ IpPort = $"{ip}:{port}";
+ MessageHandler = new BroadcastingNetworkProtocol(IpPort, Send);
+ _client = new UdpClient();
+ _client.Connect(ip, port);
+
+ DisplayName = displayName;
+ ConnectionPassword = connectionPassword;
+ CommandPassword = commandPassword;
+ MsRealtimeUpdateInterval = msRealtimeUpdateInterval;
+
+ _listenerTask = ConnectAndRun();
+ }
+
+ private void Send(byte[] payload)
+ {
+ var sent = _client.Send(payload, payload.Length);
+ }
+
+ public void Shutdown()
+ {
+ ShutdownAsnyc().ContinueWith(t =>
+ {
+ if (t.Exception?.InnerExceptions?.Any() == true)
+ System.Diagnostics.Debug.WriteLine($"Client shut down with {t.Exception.InnerExceptions.Count} errors");
+ else
+ System.Diagnostics.Debug.WriteLine("Client shut down asynchronously");
+
+ });
+ }
+
+ public async Task ShutdownAsnyc()
+ {
+ if (_listenerTask != null && !_listenerTask.IsCompleted)
+ {
+ MessageHandler.Disconnect();
+ _client.Close();
+ _client = null;
+ await _listenerTask;
+ }
+ }
+
+ private async Task ConnectAndRun()
+ {
+ MessageHandler.RequestConnection(DisplayName, ConnectionPassword, MsRealtimeUpdateInterval, CommandPassword);
+ while (_client != null)
+ {
+ try
+ {
+ var udpPacket = await _client.ReceiveAsync();
+ using (var ms = new System.IO.MemoryStream(udpPacket.Buffer))
+ using (var reader = new System.IO.BinaryReader(ms))
+ {
+ MessageHandler.ProcessMessage(reader);
+ }
+ }
+ catch (ObjectDisposedException)
+ {
+ // Shutdown happened
+ break;
+ }
+ catch (Exception ex)
+ {
+ // Other exceptions
+ System.Diagnostics.Debug.WriteLine(ex);
+ }
+ }
+ }
+
+ #region IDisposable Support
+ private bool disposedValue = false; // To detect redundant calls
+
+ protected virtual void Dispose(bool disposing)
+ {
+ if (!disposedValue)
+ {
+ if (disposing)
+ {
+ try
+ {
+ if (_client != null)
+ {
+ _client.Close();
+ _client.Dispose();
+ _client = null;
+ }
+
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(ex);
+ }
+ }
+
+ // TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
+ // TODO: set large fields to null.
+
+ disposedValue = true;
+ }
+ }
+
+ // TODO: override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources.
+ // ~ACCUdpRemoteClient() {
+ // // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
+ // Dispose(false);
+ // }
+
+ // This code added to correctly implement the disposable pattern.
+ public void Dispose()
+ {
+ // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
+ Dispose(true);
+ // TODO: uncomment the following line if the finalizer is overridden above.
+ // GC.SuppressFinalize(this);
+ }
+ #endregion
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/BroadcastingEnums.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/BroadcastingEnums.cs
new file mode 100755
index 0000000..6e78376
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/BroadcastingEnums.cs
@@ -0,0 +1,159 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ksBroadcastingNetwork
+{
+ public enum DriverCategory
+ {
+ Platinum = 3,
+ Gold = 2,
+ Silver = 1,
+ Bronze = 0,
+ Error = 255
+ }
+
+ public enum LapType
+ {
+ ERROR = 0,
+ Outlap = 1,
+ Regular = 2,
+ Inlap = 3
+ }
+
+ public enum CarLocationEnum
+ {
+ NONE = 0,
+ Track = 1,
+ Pitlane = 2,
+ PitEntry = 3,
+ PitExit = 4
+ }
+
+ public enum SessionPhase
+ {
+ NONE = 0,
+ Starting = 1,
+ PreFormation = 2,
+ FormationLap = 3,
+ PreSession = 4,
+ Session = 5,
+ SessionOver = 6,
+ PostSession = 7,
+ ResultUI = 8
+ };
+ public enum RaceSessionType
+ {
+ Practice = 0,
+ Qualifying = 4,
+ Superpole = 9,
+ Race = 10,
+ Hotlap = 11,
+ Hotstint = 12,
+ HotlapSuperpole = 13,
+ Replay = 14
+ };
+
+ public enum BroadcastingCarEventType
+ {
+ None = 0,
+ GreenFlag = 1,
+ SessionOver = 2,
+ PenaltyCommMsg = 3,
+ Accident = 4,
+ LapCompleted = 5,
+ BestSessionLap = 6,
+ BestPersonalLap = 7
+ };
+
+ public enum NationalityEnum
+ {
+ Any = 0,
+ Italy = 1,
+ Germany = 2,
+ France = 3,
+ Spain = 4,
+ GreatBritain = 5,
+ Hungary = 6,
+ Belgium = 7,
+ Switzerland = 8,
+ Austria = 9,
+ Russia = 10,
+ Thailand = 11,
+ Netherlands = 12,
+ Poland = 13,
+ Argentina = 14,
+ Monaco = 15,
+ Ireland = 16,
+ Brazil = 17,
+ SouthAfrica = 18,
+ PuertoRico = 19,
+ Slovakia = 20,
+ Oman = 21,
+ Greece = 22,
+ SaudiArabia = 23,
+ Norway = 24,
+ Turkey = 25,
+ SouthKorea = 26,
+ Lebanon = 27,
+ Armenia = 28,
+ Mexico = 29,
+ Sweden = 30,
+ Finland = 31,
+ Denmark = 32,
+ Croatia = 33,
+ Canada = 34,
+ China = 35,
+ Portugal = 36,
+ Singapore = 37,
+ Indonesia = 38,
+ USA = 39,
+ NewZealand = 40,
+ Australia = 41,
+ SanMarino = 42,
+ UAE = 43,
+ Luxembourg = 44,
+ Kuwait = 45,
+ HongKong = 46,
+ Colombia = 47,
+ Japan = 48,
+ Andorra = 49,
+ Azerbaijan = 50,
+ Bulgaria = 51,
+ Cuba = 52,
+ CzechRepublic = 53,
+ Estonia = 54,
+ Georgia = 55,
+ India = 56,
+ Israel = 57,
+ Jamaica = 58,
+ Latvia = 59,
+ Lithuania = 60,
+ Macau = 61,
+ Malaysia = 62,
+ Nepal = 63,
+ NewCaledonia = 64,
+ Nigeria = 65,
+ NorthernIreland = 66,
+ PapuaNewGuinea = 67,
+ Philippines = 68,
+ Qatar = 69,
+ Romania = 70,
+ Scotland = 71,
+ Serbia = 72,
+ Slovenia = 73,
+ Taiwan = 74,
+ Ukraine = 75,
+ Venezuela = 76,
+ Wales = 77,
+ Iran = 78,
+ Bahrain = 79,
+ Zimbabwe = 80,
+ ChineseTaipei = 81,
+ Chile = 82,
+ Uruguay = 83,
+ Madagascar = 84
+ };
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/BroadcastingNetworkProtocol.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/BroadcastingNetworkProtocol.cs
new file mode 100755
index 0000000..3b75942
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/BroadcastingNetworkProtocol.cs
@@ -0,0 +1,516 @@
+using ksBroadcastingNetwork.Structs;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ksBroadcastingNetwork
+{
+ public enum OutboundMessageTypes : byte
+ {
+ REGISTER_COMMAND_APPLICATION = 1,
+ UNREGISTER_COMMAND_APPLICATION = 9,
+
+ REQUEST_ENTRY_LIST = 10,
+ REQUEST_TRACK_DATA = 11,
+
+ CHANGE_HUD_PAGE = 49,
+ CHANGE_FOCUS = 50,
+ INSTANT_REPLAY_REQUEST = 51,
+
+ PLAY_MANUAL_REPLAY_HIGHLIGHT = 52, // TODO, but planned
+ SAVE_MANUAL_REPLAY_HIGHLIGHT = 60 // TODO, but planned: saving manual replays gives distributed clients the possibility to see the play the same replay
+ }
+
+ public enum InboundMessageTypes : byte
+ {
+ REGISTRATION_RESULT = 1,
+ REALTIME_UPDATE = 2,
+ REALTIME_CAR_UPDATE = 3,
+ ENTRY_LIST = 4,
+ ENTRY_LIST_CAR = 6,
+ TRACK_DATA = 5,
+ BROADCASTING_EVENT = 7
+ }
+
+ public class BroadcastingNetworkProtocol
+ {
+ public const int BROADCASTING_PROTOCOL_VERSION = 4;
+ private string ConnectionIdentifier { get; }
+ private SendMessageDelegate Send { get; }
+ public int ConnectionId { get; private set; }
+ public float TrackMeters { get; private set; }
+
+ internal delegate void SendMessageDelegate(byte[] payload);
+
+ #region Events
+
+ public delegate void ConnectionStateChangedDelegate(int connectionId, bool connectionSuccess, bool isReadonly, string error);
+ public event ConnectionStateChangedDelegate OnConnectionStateChanged;
+
+ public delegate void TrackDataUpdateDelegate(string sender, TrackData trackUpdate);
+ public event TrackDataUpdateDelegate OnTrackDataUpdate;
+
+ public delegate void EntryListUpdateDelegate(string sender, CarInfo car);
+ public event EntryListUpdateDelegate OnEntrylistUpdate;
+
+ public delegate void RealtimeUpdateDelegate(string sender, RealtimeUpdate update);
+ public event RealtimeUpdateDelegate OnRealtimeUpdate;
+
+ public delegate void RealtimeCarUpdateDelegate(string sender, RealtimeCarUpdate carUpdate);
+ public event RealtimeCarUpdateDelegate OnRealtimeCarUpdate;
+
+ public delegate void BroadcastingEventDelegate(string sender, BroadcastingEvent evt);
+ public event BroadcastingEventDelegate OnBroadcastingEvent;
+
+
+
+ #endregion
+
+ #region EntryList handling
+
+ // To avoid huge UDP pakets for longer entry lists, we will first receive the indexes of cars and drivers,
+ // cache the entries and wait for the detailled updates
+ List _entryListCars = new List();
+
+ #endregion
+
+ #region optional failsafety - detect when we have a desync and need a new entry list
+
+ DateTime lastEntrylistRequest = DateTime.Now;
+
+ #endregion
+
+ internal BroadcastingNetworkProtocol(string connectionIdentifier, SendMessageDelegate sendMessageDelegate)
+ {
+ if (string.IsNullOrEmpty(connectionIdentifier))
+ throw new ArgumentNullException(nameof(connectionIdentifier), $"No connection identifier set; we use this to distinguish different connections. Using the remote IP:Port is a good idea");
+
+ if (sendMessageDelegate == null)
+ throw new ArgumentNullException(nameof(sendMessageDelegate), $"The protocol class doesn't know anything about the network layer; please put a callback we can use to send data via UDP");
+
+ ConnectionIdentifier = connectionIdentifier;
+ Send = sendMessageDelegate;
+ }
+
+ internal void ProcessMessage(BinaryReader br)
+ {
+ // Any message starts with an 1-byte command type
+ var messageType = (InboundMessageTypes)br.ReadByte();
+ switch (messageType)
+ {
+ case InboundMessageTypes.REGISTRATION_RESULT:
+ {
+ ConnectionId = br.ReadInt32();
+ var connectionSuccess = br.ReadByte() > 0;
+ var isReadonly = br.ReadByte() == 0;
+ var errMsg = ReadString(br);
+
+ OnConnectionStateChanged?.Invoke(ConnectionId, connectionSuccess, isReadonly, errMsg);
+
+ // In case this was successful, we will request the initial data
+ RequestEntryList();
+ RequestTrackData();
+ }
+ break;
+ case InboundMessageTypes.ENTRY_LIST:
+ {
+ _entryListCars.Clear();
+
+ var connectionId = br.ReadInt32();
+ var carEntryCount = br.ReadUInt16();
+ for (int i = 0; i < carEntryCount; i++)
+ {
+ _entryListCars.Add(new CarInfo(br.ReadUInt16()));
+ }
+ }
+ break;
+ case InboundMessageTypes.ENTRY_LIST_CAR:
+ {
+
+ var carId = br.ReadUInt16();
+
+ var carInfo = _entryListCars.SingleOrDefault(x => x.CarIndex == carId);
+ if(carInfo == null)
+ {
+ System.Diagnostics.Debug.WriteLine($"Entry list update for unknown carIndex {carId}");
+ break;
+ }
+
+ carInfo.CarModelType = br.ReadByte(); // Byte sized car model
+ carInfo.TeamName = ReadString(br);
+ carInfo.RaceNumber = br.ReadInt32();
+ carInfo.CupCategory = br.ReadByte(); // Cup: Overall/Pro = 0, ProAm = 1, Am = 2, Silver = 3, National = 4
+ carInfo.CurrentDriverIndex = br.ReadByte();
+ carInfo.Nationality = (NationalityEnum)br.ReadUInt16();
+
+ // Now the drivers on this car:
+ var driversOnCarCount = br.ReadByte();
+ for (int di = 0; di < driversOnCarCount; di++)
+ {
+ var driverInfo = new DriverInfo();
+
+ driverInfo.FirstName = ReadString(br);
+ driverInfo.LastName = ReadString(br);
+ driverInfo.ShortName = ReadString(br);
+ driverInfo.Category = (DriverCategory)br.ReadByte(); // Platinum = 3, Gold = 2, Silver = 1, Bronze = 0
+
+ // new in 1.13.11:
+ driverInfo.Nationality = (NationalityEnum)br.ReadUInt16();
+
+ carInfo.AddDriver(driverInfo);
+ }
+
+ OnEntrylistUpdate?.Invoke(ConnectionIdentifier, carInfo);
+ }
+ break;
+ case InboundMessageTypes.REALTIME_UPDATE:
+ {
+ RealtimeUpdate update = new RealtimeUpdate();
+ update.EventIndex = (int)br.ReadUInt16();
+ update.SessionIndex = (int)br.ReadUInt16();
+ update.SessionType = (RaceSessionType)br.ReadByte();
+ update.Phase = (SessionPhase)br.ReadByte();
+ var sessionTime = br.ReadSingle();
+ update.SessionTime = TimeSpan.FromMilliseconds(sessionTime);
+ var sessionEndTime = br.ReadSingle();
+ update.SessionEndTime = TimeSpan.FromMilliseconds(sessionEndTime);
+
+ update.FocusedCarIndex = br.ReadInt32();
+ update.ActiveCameraSet = ReadString(br);
+ update.ActiveCamera = ReadString(br);
+ update.CurrentHudPage = ReadString(br);
+
+ update.IsReplayPlaying = br.ReadByte() > 0;
+ if (update.IsReplayPlaying)
+ {
+ update.ReplaySessionTime = br.ReadSingle();
+ update.ReplayRemainingTime = br.ReadSingle();
+ }
+
+ update.TimeOfDay = TimeSpan.FromMilliseconds(br.ReadSingle());
+ update.AmbientTemp = br.ReadByte();
+ update.TrackTemp = br.ReadByte();
+ update.Clouds = br.ReadByte() / 10.0f;
+ update.RainLevel = br.ReadByte() / 10.0f;
+ update.Wetness = br.ReadByte() / 10.0f;
+
+ update.BestSessionLap = ReadLap(br);
+
+ OnRealtimeUpdate?.Invoke(ConnectionIdentifier, update);
+ }
+ break;
+ case InboundMessageTypes.REALTIME_CAR_UPDATE:
+ {
+ RealtimeCarUpdate carUpdate = new RealtimeCarUpdate();
+
+ carUpdate.CarIndex = br.ReadUInt16();
+ carUpdate.DriverIndex = br.ReadUInt16(); // Driver swap will make this change
+ carUpdate.DriverCount = br.ReadByte();
+ carUpdate.Gear = br.ReadByte() - 2; // -2 makes the R -1, N 0 and the rest as-is
+ carUpdate.WorldPosX = br.ReadSingle();
+ carUpdate.WorldPosY = br.ReadSingle();
+ carUpdate.Yaw = br.ReadSingle();
+ carUpdate.CarLocation = (CarLocationEnum)br.ReadByte(); // - , Track, Pitlane, PitEntry, PitExit = 4
+ carUpdate.Kmh = br.ReadUInt16();
+ carUpdate.Position = br.ReadUInt16(); // official P/Q/R position (1 based)
+ carUpdate.CupPosition = br.ReadUInt16(); // official P/Q/R position (1 based)
+ carUpdate.TrackPosition = br.ReadUInt16(); // position on track (1 based)
+ carUpdate.SplinePosition = br.ReadSingle(); // track position between 0.0 and 1.0
+ carUpdate.Laps = br.ReadUInt16();
+
+ carUpdate.Delta = br.ReadInt32(); // Realtime delta to best session lap
+ carUpdate.BestSessionLap = ReadLap(br);
+ carUpdate.LastLap = ReadLap(br);
+ carUpdate.CurrentLap = ReadLap(br);
+
+ // the concept is: "don't know a car or driver? ask for an entry list update"
+ var carEntry = _entryListCars.FirstOrDefault(x => x.CarIndex == carUpdate.CarIndex);
+ if(carEntry == null || carEntry.Drivers.Count != carUpdate.DriverCount)
+ {
+ if ((DateTime.Now - lastEntrylistRequest).TotalSeconds > 1)
+ {
+ lastEntrylistRequest = DateTime.Now;
+ RequestEntryList();
+ System.Diagnostics.Debug.WriteLine($"CarUpdate {carUpdate.CarIndex}|{carUpdate.DriverIndex} not know, will ask for new EntryList");
+ }
+ }
+ else
+ {
+ OnRealtimeCarUpdate?.Invoke(ConnectionIdentifier, carUpdate);
+ }
+ }
+ break;
+ case InboundMessageTypes.TRACK_DATA:
+ {
+ var connectionId = br.ReadInt32();
+ var trackData = new TrackData();
+
+ trackData.TrackName = ReadString(br);
+ trackData.TrackId = br.ReadInt32();
+ trackData.TrackMeters = br.ReadInt32();
+ TrackMeters = trackData.TrackMeters > 0 ? trackData.TrackMeters : -1;
+
+ trackData.CameraSets = new Dictionary>();
+
+ var cameraSetCount = br.ReadByte();
+ for (int camSet = 0; camSet < cameraSetCount; camSet++)
+ {
+ var camSetName = ReadString(br);
+ trackData.CameraSets.Add(camSetName, new List());
+
+ var cameraCount = br.ReadByte();
+ for (int cam = 0; cam < cameraCount; cam++)
+ {
+ var cameraName = ReadString(br);
+ trackData.CameraSets[camSetName].Add(cameraName);
+ }
+ }
+
+ var hudPages = new List();
+ var hudPagesCount = br.ReadByte();
+ for (int i = 0; i < hudPagesCount; i++)
+ {
+ hudPages.Add(ReadString(br));
+ }
+ trackData.HUDPages = hudPages;
+
+ OnTrackDataUpdate?.Invoke(ConnectionIdentifier, trackData);
+ }
+ break;
+ case InboundMessageTypes.BROADCASTING_EVENT:
+ {
+ BroadcastingEvent evt = new BroadcastingEvent()
+ {
+ Type = (BroadcastingCarEventType)br.ReadByte(),
+ Msg = ReadString(br),
+ TimeMs = br.ReadInt32(),
+ CarId = br.ReadInt32(),
+ };
+
+ evt.CarData = _entryListCars.FirstOrDefault(x => x.CarIndex == evt.CarId);
+ OnBroadcastingEvent?.Invoke(ConnectionIdentifier, evt);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ ///
+ /// Laps are always sent in a common way, it makes sense to have a shared function to parse them
+ ///
+ private static LapInfo ReadLap(BinaryReader br)
+ {
+ var lap = new LapInfo();
+ lap.LaptimeMS = br.ReadInt32();
+
+ lap.CarIndex = br.ReadUInt16();
+ lap.DriverIndex = br.ReadUInt16();
+
+ var splitCount = br.ReadByte();
+ for (int i = 0; i < splitCount; i++)
+ lap.Splits.Add(br.ReadInt32());
+
+ lap.IsInvalid = br.ReadByte() > 0;
+ lap.IsValidForBest = br.ReadByte() > 0;
+
+ var isOutlap = br.ReadByte() > 0;
+ var isInlap = br.ReadByte() > 0;
+
+ if (isOutlap)
+ lap.Type = LapType.Outlap;
+ else if (isInlap)
+ lap.Type = LapType.Inlap;
+ else
+ lap.Type = LapType.Regular;
+
+ // Now it's possible that this is "no" lap that doesn't even include a
+ // first split, we can detect this by comparing with int32.Max
+ while (lap.Splits.Count < 3)
+ {
+ lap.Splits.Add(null);
+ }
+
+ // "null" entries are Int32.Max, in the C# world we can replace this to null
+ for (int i = 0; i < lap.Splits.Count; i++)
+ if (lap.Splits[i] == Int32.MaxValue)
+ lap.Splits[i] = null;
+
+ if (lap.LaptimeMS == Int32.MaxValue)
+ lap.LaptimeMS = null;
+
+ return lap;
+ }
+
+ private static string ReadString(BinaryReader br)
+ {
+ var length = br.ReadUInt16();
+ var bytes = br.ReadBytes(length);
+ return Encoding.UTF8.GetString(bytes);
+ }
+
+ private static void WriteString(BinaryWriter bw, string s)
+ {
+ var bytes = Encoding.UTF8.GetBytes(s);
+ bw.Write(Convert.ToUInt16(bytes.Length));
+ bw.Write(bytes);
+ }
+
+ ///
+ /// Will try to register this client in the targeted ACC instance.
+ /// Needs to be called once, before anything else can happen.
+ ///
+ ///
+ ///
+ ///
+ internal void RequestConnection(string displayName, string connectionPassword, int msRealtimeUpdateInterval, string commandPassword)
+ {
+ using (var ms = new MemoryStream())
+ using (var br = new BinaryWriter(ms))
+ {
+ br.Write((byte)OutboundMessageTypes.REGISTER_COMMAND_APPLICATION); // First byte is always the command type
+ br.Write((byte)BROADCASTING_PROTOCOL_VERSION);
+
+ WriteString(br, displayName);
+ WriteString(br, connectionPassword);
+ br.Write(msRealtimeUpdateInterval);
+ WriteString(br, commandPassword);
+
+ Send(ms.ToArray());
+ }
+ }
+
+ internal void Disconnect()
+ {
+ using (var ms = new MemoryStream())
+ using (var br = new BinaryWriter(ms))
+ {
+ br.Write((byte)OutboundMessageTypes.UNREGISTER_COMMAND_APPLICATION); // First byte is always the command type
+ Send(ms.ToArray());
+ }
+ }
+
+
+ ///
+ /// Will ask the ACC client for an updated entry list, containing all car and driver data.
+ /// The client will send this automatically when something changes; however if you detect a carIndex or driverIndex, this may cure the
+ /// problem for future updates
+ ///
+ private void RequestEntryList()
+ {
+ using (var ms = new MemoryStream())
+ using (var br = new BinaryWriter(ms))
+ {
+ br.Write((byte)OutboundMessageTypes.REQUEST_ENTRY_LIST); // First byte is always the command type
+ br.Write((int)ConnectionId);
+
+ Send(ms.ToArray());
+ }
+ }
+
+ private void RequestTrackData()
+ {
+ using (var ms = new MemoryStream())
+ using (var br = new BinaryWriter(ms))
+ {
+ br.Write((byte)OutboundMessageTypes.REQUEST_TRACK_DATA); // First byte is always the command type
+ br.Write((int)ConnectionId);
+
+ Send(ms.ToArray());
+ }
+ }
+
+ public void SetFocus(UInt16 carIndex)
+ {
+ SetFocusInternal(carIndex, null, null);
+ }
+
+ ///
+ /// Always put both cam + cam set; even if it doesn't make sense
+ ///
+ public void SetCamera(string cameraSet, string camera)
+ {
+ SetFocusInternal(null, cameraSet, camera);
+ }
+
+ public void SetFocus(UInt16 carIndex, string cameraSet, string camera)
+ {
+ SetFocusInternal(carIndex, cameraSet, camera);
+ }
+
+ ///
+ /// Sends the request to change the focused car and/or the camera used.
+ /// The idea is that this often wants to be triggered together, so this is a all-in-one function.
+ /// This way we can make sure the switch happens in the same frame, even in more complex scenarios
+ ///
+ private void SetFocusInternal(UInt16? carIndex, string cameraSet, string camera)
+ {
+ using (var ms = new MemoryStream())
+ using (var bw = new BinaryWriter(ms))
+ {
+ bw.Write((byte)OutboundMessageTypes.CHANGE_FOCUS); // First byte is always the command type
+ bw.Write((int)ConnectionId);
+
+ if (!carIndex.HasValue)
+ {
+ bw.Write((byte)0); // No change of focused car
+ }
+ else
+ {
+ bw.Write((byte)1);
+ bw.Write((UInt16)(carIndex.Value));
+ }
+
+ if (string.IsNullOrEmpty(cameraSet) || string.IsNullOrEmpty(camera))
+ {
+ bw.Write((byte)0); // No change of camera set or camera
+ }
+ else
+ {
+ bw.Write((byte)1);
+ WriteString(bw, cameraSet);
+ WriteString(bw, camera);
+ }
+
+ Send(ms.ToArray());
+ }
+ }
+
+ public void RequestInstantReplay(float startSessionTime, float durationMS, int initialFocusedCarIndex = -1, string initialCameraSet = "", string initialCamera = "")
+ {
+ using (var ms = new MemoryStream())
+ using (var bw = new BinaryWriter(ms))
+ {
+ bw.Write((byte)OutboundMessageTypes.INSTANT_REPLAY_REQUEST); // First byte is always the command type
+ bw.Write((int)ConnectionId);
+
+ bw.Write((float)startSessionTime);
+ bw.Write((float)durationMS);
+ bw.Write((int)initialFocusedCarIndex);
+
+ WriteString(bw, initialCameraSet);
+ WriteString(bw, initialCamera);
+
+ Send(ms.ToArray());
+ }
+ }
+
+ public void RequestHUDPage(string hudPage)
+ {
+ using (var ms = new MemoryStream())
+ using (var bw = new BinaryWriter(ms))
+ {
+ bw.Write((byte)OutboundMessageTypes.CHANGE_HUD_PAGE); // First byte is always the command type
+ bw.Write((int)ConnectionId);
+
+ WriteString(bw, hudPage);
+
+ Send(ms.ToArray());
+ }
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Properties/AssemblyInfo.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Properties/AssemblyInfo.cs
new file mode 100755
index 0000000..36bc05e
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("ksBroadcastingNetwork")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ksBroadcastingNetwork")]
+[assembly: AssemblyCopyright("Copyright © 2018")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("1ef9a746-3771-4052-b61b-04bdb3dc381a")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/BroadcastingEvent.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/BroadcastingEvent.cs
new file mode 100755
index 0000000..e2d974c
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/BroadcastingEvent.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ksBroadcastingNetwork.Structs
+{
+ public struct BroadcastingEvent
+ {
+ public BroadcastingCarEventType Type { get; internal set; }
+ public string Msg { get; internal set; }
+ public int TimeMs { get; internal set; }
+ public int CarId { get; internal set; }
+ public CarInfo CarData { get; internal set; }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/CarInfo.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/CarInfo.cs
new file mode 100755
index 0000000..347adeb
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/CarInfo.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ksBroadcastingNetwork.Structs
+{
+ public class CarInfo
+ {
+ public ushort CarIndex { get; }
+ public byte CarModelType { get; internal set; }
+ public string TeamName { get; internal set; }
+ public int RaceNumber { get; internal set; }
+ public byte CupCategory { get; internal set; }
+ public int CurrentDriverIndex { get; internal set; }
+ public IList Drivers { get; } = new List();
+ public NationalityEnum Nationality { get; internal set; }
+
+ public CarInfo(ushort carIndex)
+ {
+ CarIndex = carIndex;
+ }
+
+ internal void AddDriver(DriverInfo driverInfo)
+ {
+ Drivers.Add(driverInfo);
+ }
+
+ public string GetCurrentDriverName()
+ {
+ if (CurrentDriverIndex < Drivers.Count)
+ return Drivers[CurrentDriverIndex].LastName;
+ return "nobody(?)";
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/DriverInfo.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/DriverInfo.cs
new file mode 100755
index 0000000..93d1e54
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/DriverInfo.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ksBroadcastingNetwork.Structs
+{
+ public struct DriverInfo
+ {
+ public string FirstName { get; internal set; }
+ public string LastName { get; internal set; }
+ public string ShortName { get; internal set; }
+ public DriverCategory Category { get; internal set; }
+ public NationalityEnum Nationality { get; internal set; }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/LapInfo.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/LapInfo.cs
new file mode 100755
index 0000000..262eb49
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/LapInfo.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ksBroadcastingNetwork.Structs
+{
+ public class LapInfo
+ {
+ public int? LaptimeMS { get; internal set; }
+ public List Splits { get; } = new List();
+ public ushort CarIndex { get; internal set; }
+ public ushort DriverIndex { get; internal set; }
+ public bool IsInvalid { get; internal set; }
+ public bool IsValidForBest { get; internal set; }
+ public LapType Type { get; internal set; }
+
+ public override string ToString()
+ {
+ return $"{LaptimeMS, 5}|{string.Join("|", Splits)}";
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/RealtimeCarUpdate.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/RealtimeCarUpdate.cs
new file mode 100755
index 0000000..abd6d73
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/RealtimeCarUpdate.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ksBroadcastingNetwork.Structs
+{
+ public struct RealtimeCarUpdate
+ {
+ public int CarIndex { get; internal set; }
+ public int DriverIndex { get; internal set; }
+ public int Gear { get; internal set; }
+ public float WorldPosX { get; internal set; }
+ public float WorldPosY { get; internal set; }
+ public float Yaw { get; internal set; }
+ public CarLocationEnum CarLocation { get; internal set; }
+ public int Kmh { get; internal set; }
+ public int Position { get; internal set; }
+ public int TrackPosition { get; internal set; }
+ public float SplinePosition { get; internal set; }
+ public int Delta { get; internal set; }
+ public LapInfo BestSessionLap { get; internal set; }
+ public LapInfo LastLap { get; internal set; }
+ public LapInfo CurrentLap { get; internal set; }
+ public int Laps { get; internal set; }
+ public ushort CupPosition { get; internal set; }
+ public byte DriverCount { get; internal set; }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/RealtimeUpdate.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/RealtimeUpdate.cs
new file mode 100755
index 0000000..f27d38f
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/RealtimeUpdate.cs
@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ksBroadcastingNetwork.Structs
+{
+ public struct RealtimeUpdate
+ {
+ public int EventIndex { get; internal set; }
+ public int SessionIndex { get; internal set; }
+ public SessionPhase Phase { get; internal set; }
+ public TimeSpan SessionTime { get; internal set; }
+ public TimeSpan RemainingTime { get; internal set; }
+ public TimeSpan TimeOfDay { get; internal set; }
+ public float RainLevel { get; internal set; }
+ public float Clouds { get; internal set; }
+ public float Wetness { get; internal set; }
+ public LapInfo BestSessionLap { get; internal set; }
+ public ushort BestLapCarIndex { get; internal set; }
+ public ushort BestLapDriverIndex { get; internal set; }
+ public int FocusedCarIndex { get; internal set; }
+ public string ActiveCameraSet { get; internal set; }
+ public string ActiveCamera { get; internal set; }
+ public bool IsReplayPlaying { get; internal set; }
+ public float ReplaySessionTime { get; internal set; }
+ public float ReplayRemainingTime { get; internal set; }
+ public TimeSpan SessionRemainingTime { get; internal set; }
+ public TimeSpan SessionEndTime { get; internal set; }
+ public RaceSessionType SessionType { get; internal set; }
+ public byte AmbientTemp { get; internal set; }
+ public byte TrackTemp { get; internal set; }
+ public string CurrentHudPage { get; internal set; }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/TrackData.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/TrackData.cs
new file mode 100755
index 0000000..b0d70fb
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/Structs/TrackData.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ksBroadcastingNetwork.Structs
+{
+ public struct TrackData
+ {
+ public string TrackName { get; internal set; }
+ public int TrackId { get; internal set; }
+ public float TrackMeters { get; internal set; }
+ public Dictionary> CameraSets { get; internal set; }
+ public IEnumerable HUDPages { get; internal set; }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/ksBroadcastingNetwork.csproj b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/ksBroadcastingNetwork.csproj
new file mode 100755
index 0000000..29661eb
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/ksBroadcastingNetwork.csproj
@@ -0,0 +1,57 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {1EF9A746-3771-4052-B61B-04BDB3DC381A}
+ Library
+ Properties
+ ksBroadcastingNetwork
+ ksBroadcastingNetwork
+ v4.6.1
+ 512
+ true
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/server.log b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/server.log
new file mode 100755
index 0000000..bd2b07d
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingNetwork/server.log
@@ -0,0 +1,102 @@
+Server Log Start
+Server Version 212
+SessionStateChange: 1 start: 40.000000 end: 5000.000000
+Sent Lobby Registration Request with trackName hungaroring
+RegisterToLobby succeeded
+WARNING: Lobby accepted connection
+Sent config to kson
+Sent connected drivers list to kson
+SessionStateChange: 4 start: 5002.000000 end: 5002.000000
+Sent new session state to kson
+SessionStateChange: 5 start: 5008.000000 end: 1805008.000000
+Sent new session state to kson
+SessionStateChange: 6 start: 5008.000000 end: 1820009.000000
+Sent new session state to kson
+SessionStateChange: 7 start: 5008.000000 end: 1830012.000000
+Sent new session state to kson
+SessionStateChange: 8 start: 5008.000000 end: 1845015.000000
+Sent new session state to kson
+SessionOverUpdate currentSessionIndex: 1 currentEventIndex: 0
+SessionStateChange: 1 start: 1845063.000000 end: 5000.000000
+Sent new session state to kson
+SessionStateChange: 4 start: 5003.000000 end: 5003.000000
+Sent new session state to kson
+SessionStateChange: 5 start: 5010.000000 end: 3605010.000000
+Sent new session state to kson
+New connection received 336
+TCP PACKET received with ID:9
+ACP_REQUEST_CONNECTION
+CLIENT VERSION: 212
+addNewConnectedCar: new car connected, adding it to the list of connected cars
+Found and added a new player
+New Connection created, new connectedCarId: 1 new connectionId: 1
+Sent connected drivers list to kson
+SessionStateChange: 1 start: 2473227.000000 end: 5000.000000
+Sent new session state to kson
+UDP Packet id: 19
+TCP PACKET received with ID:44
+TCP PACKET received with ID:44
+TCP PACKET received with ID:41
+TCP PACKET received with ID:45
+TCP PACKET received with ID:48
+SessionStateChange: 4 start: 5005.000000 end: 5005.000000
+Sent new session state to kson
+SessionStateChange: 5 start: 5012.000000 end: 1805012.000000
+Sent new session state to kson
+TCP PACKET received with ID:50
+ACP_CAR_LOCATION_UPDATE location updated for carIndex 0
+TCP PACKET received with ID:50
+ACP_CAR_LOCATION_UPDATE location updated for carIndex 0
+TCP PACKET received with ID:49
+ACP_RACE_MANAGER_INFO_COMPLETED connectionId 1 is ready to reaceive packets
+TCP PACKET received with ID:50
+ACP_CAR_LOCATION_UPDATE location updated for carIndex 0
+TCP PACKET received with ID:50
+ACP_CAR_LOCATION_UPDATE location updated for carIndex 0
+TCP PACKET received with ID:50
+ACP_CAR_LOCATION_UPDATE location updated for carIndex 0
+New connection received 344
+TCP PACKET received with ID:9
+ACP_REQUEST_CONNECTION
+CLIENT VERSION: 212
+addNewConnectedCar: new car connected, adding it to the list of connected cars
+Found and added a new player
+New Connection created, new connectedCarId: 2 new connectionId: 2
+Sent connected drivers list to kson
+UDP Packet id: 19
+TCP PACKET received with ID:44
+TCP PACKET received with ID:44
+TCP PACKET received with ID:41
+TCP PACKET received with ID:45
+TCP PACKET received with ID:48
+TCP PACKET received with ID:49
+ACP_RACE_MANAGER_INFO_COMPLETED connectionId 2 is ready to reaceive packets
+TCP PACKET received with ID:34
+CAR_INFO_REQUEST for ID: 2
+Car Info Response sent idRequested: 2, carIndex: 1, driverIndex: 1
+TCP PACKET received with ID:50
+ACP_CAR_LOCATION_UPDATE location updated for carIndex 1
+TCP PACKET received with ID:50
+ACP_CAR_LOCATION_UPDATE location updated for carIndex 1
+TCP PACKET received with ID:34
+CAR_INFO_REQUEST for ID: 1
+Car Info Response sent idRequested: 1, carIndex: 0, driverIndex: 0
+TCP PACKET received with ID:50
+ACP_CAR_LOCATION_UPDATE location updated for carIndex 1
+TCP PACKET received with ID:33
+TCP PACKET received with ID:50
+ACP_CAR_LOCATION_UPDATE location updated for carIndex 1
+TCP PACKET received with ID:50
+ACP_CAR_LOCATION_UPDATE location updated for carIndex 1
+TCP PACKET received with ID:33
+TCP PACKET received with ID:50
+ACP_CAR_LOCATION_UPDATE location updated for carIndex 1
+TCP PACKET received with ID:50
+ACP_CAR_LOCATION_UPDATE location updated for carIndex 0
+TCP PACKET received with ID:50
+ACP_CAR_LOCATION_UPDATE location updated for carIndex 0
+TCP PACKET received with ID:50
+ACP_CAR_LOCATION_UPDATE location updated for carIndex 0
+TCP PACKET received with ID:33
+TCP PACKET received with ID:50
+ACP_CAR_LOCATION_UPDATE
\ No newline at end of file
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/App.config b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/App.config
new file mode 100755
index 0000000..00bfd11
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/App.xaml b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/App.xaml
new file mode 100755
index 0000000..c5ba382
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/App.xaml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/App.xaml.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/App.xaml.cs
new file mode 100755
index 0000000..bdfe37a
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/App.xaml.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Data;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace ksBroadcastingTestClient
+{
+ ///
+ /// Interaction logic for App.xaml
+ ///
+ public partial class App : Application
+ {
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotCarView.xaml b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotCarView.xaml
new file mode 100755
index 0000000..5891b08
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotCarView.xaml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotCarView.xaml.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotCarView.xaml.cs
new file mode 100755
index 0000000..e82ffd7
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotCarView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace ksBroadcastingTestClient.Autopilot
+{
+ ///
+ /// Interaction logic for AutopilotCarView.xaml
+ ///
+ public partial class AutopilotCarView : UserControl
+ {
+ public AutopilotCarView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotCarViewModel.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotCarViewModel.cs
new file mode 100755
index 0000000..dfb0d40
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotCarViewModel.cs
@@ -0,0 +1,356 @@
+using ksBroadcastingNetwork;
+using ksBroadcastingNetwork.Structs;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace ksBroadcastingTestClient.Autopilot
+{
+ public class AutopilotCarViewModel : KSObservableObject
+ {
+ public float Pressure { get => Get(); set { if (Set(value)) NotifyUpdate(nameof(PressureWidth)); } }
+ public GridLength PressureWidth => new GridLength(Pressure, GridUnitType.Star);
+ public GridLength PressureWidthRight => new GridLength(1f - Pressure / 2f, GridUnitType.Star);
+ public int CarIndex { get; }
+ public int RaceNumber { get => Get(); private set => Set(value); }
+ public int CarModelEnum { get => Get(); private set => Set(value); }
+ public string TeamName { get => Get(); private set => Set(value); }
+ public int CupCategoryEnum { get => Get(); private set => Set(value); }
+ public CarLocationEnum CarLocation { get => Get(); private set => Set(value); }
+ public bool CrossedTheLineWithFocus { get; private set; }
+ public int Delta { get => Get(); private set => Set(value); }
+ public int Gear { get => Get(); private set => Set(value); }
+ public int Kmh { get => Get(); private set => Set(value); }
+ public int Position { get => Get(); private set => Set(value); }
+ public int CupPosition { get => Get(); private set => Set(value); }
+ public int TrackPosition { get => Get(); private set => Set(value); }
+ public float SplinePosition { get => Get(); private set => Set(value); }
+ public float WorldX { get => Get(); private set => Set(value); }
+ public float WorldY { get => Get(); private set => Set(value); }
+ public float Yaw { get => Get(); private set => Set(value); }
+ public int Laps { get => Get(); private set => Set(value); }
+ public string LocationHint { get => Get(); private set => Set(value); }
+ public float GapFrontMeters { get => Get(); set => Set(value); }
+ public float GapRearMeters { get => Get(); set => Set(value); }
+ public float GapFrontSeconds { get => Get(); set => Set(value); }
+ public float GapRearSeconds { get => Get(); set => Set(value); }
+ public string CurrentDriverName { get => Get(); private set => Set(value); }
+ public bool HasFocus { get; internal set; }
+ public List PressureCategories { get; } = new List();
+ public int SessionPersonalBestLap { get => Get(); private set => Set(value); }
+ public int PredictedLaptime { get => Get(); private set => Set(value); }
+ public static int SessionBestLap { get; set; }
+ public int CarsAroundMe30m { get; private set; }
+
+ const float OFFSET = 0.001f;
+
+ public AutopilotCarViewModel(ushort carIndex)
+ {
+ CarIndex = carIndex;
+
+ foreach (var item in Enum.GetValues(typeof(CarWeightCategoryEnum)).Cast())
+ {
+ PressureCategories.Add(new CarWeightCategoryViewModel(item));
+ }
+ }
+
+ internal void SetFocused(int focusedCarIndex)
+ {
+ if (CarIndex == focusedCarIndex)
+ {
+ HasFocus = true;
+ // RowForeground = Brushes.Yellow;
+ // RowBackground = Brushes.Black;
+ }
+ else
+ {
+ HasFocus = false;
+ // RowForeground = Brushes.Black;
+ // RowBackground = null;
+ }
+ }
+
+ internal void Update(CarInfo carUpdate)
+ {
+ RaceNumber = carUpdate.RaceNumber;
+ CarModelEnum = carUpdate.CarModelType;
+ TeamName = carUpdate.TeamName;
+ CupCategoryEnum = carUpdate.CupCategory;
+
+ CurrentDriverName = carUpdate.GetCurrentDriverName();
+ }
+
+ internal void Update(RealtimeCarUpdate carUpdate, float trackMeters)
+ {
+ if (carUpdate.CarIndex != CarIndex)
+ {
+ System.Diagnostics.Debug.WriteLine($"Wrong {nameof(RealtimeCarUpdate)}.CarIndex {carUpdate.CarIndex} for {nameof(AutopilotCarViewModel)}.CarIndex {CarIndex}");
+ return;
+ }
+
+ CarLocation = carUpdate.CarLocation;
+ CrossedTheLineWithFocus = false;
+ if (carUpdate.SplinePosition * trackMeters < 100 && HasFocus)
+ CrossedTheLineWithFocus = true;
+ if (CrossedTheLineWithFocus && carUpdate.SplinePosition * trackMeters > 100)
+ CrossedTheLineWithFocus = false;
+
+ if (carUpdate.SplinePosition * trackMeters > 500)
+ Delta = carUpdate.Delta;
+
+ Kmh = carUpdate.Kmh;
+ Position = carUpdate.Position;
+ CupPosition = carUpdate.CupPosition;
+ TrackPosition = carUpdate.TrackPosition;
+ SplinePosition = carUpdate.SplinePosition;
+ WorldX = carUpdate.WorldPosX;
+ WorldY = carUpdate.WorldPosY;
+ Yaw = carUpdate.Yaw;
+ Laps = carUpdate.Laps;
+
+ SessionPersonalBestLap = carUpdate.BestSessionLap.LaptimeMS ?? -1;
+ if (SessionPersonalBestLap > 0 && (SessionPersonalBestLap < SessionBestLap || SessionBestLap <= 0))
+ SessionBestLap = SessionPersonalBestLap;
+
+ if (SessionBestLap > 0)
+ PredictedLaptime = SessionBestLap + Delta;
+
+
+ // The location hint will combine stuff like pits, in/outlap
+ if (CarLocation == CarLocationEnum.PitEntry)
+ LocationHint = "IN";
+ else if (CarLocation == CarLocationEnum.Pitlane)
+ LocationHint = "PIT";
+ else if (CarLocation == CarLocationEnum.PitExit)
+ LocationHint = "OUT";
+ else
+ LocationHint = "OUT";
+ }
+
+ internal void CalcPressure(IList trackPositionCarList, float trackMeters, float currentFocusSeconds, IDictionary categoryWeights, ICamManager camManager)
+ {
+ var OFFSET = 0.001f; // we'll use a (tiny) offset so even a zero doesn't eliminate our information by a zero division;
+ var ONE = 1f + OFFSET;
+ // this way even a multiple "bad, bad, very bad" combination will be greater than "bad, very bad, very bad"
+
+ Pressure = 1f;
+ foreach (var category in PressureCategories)
+ {
+ // Special case: Sitting in the pits or so
+ if (CarLocation == CarLocationEnum.Pitlane)
+ {
+ category.RawValue = OFFSET;
+ category.Hint = $"Pitlane";
+ }
+ else
+ {
+ switch (category.Category)
+ {
+ case CarWeightCategoryEnum.Proximity:
+ {
+ // 1 Proximity - how close is this car to the next one, linearly scaled to 2.5 seconds
+ // Now this is tricky for rear/front, as there are always two cars for the same distance. If we look at the front
+ // or rear car has major impact on the pressure of rearwing or onboard cams, so we'll need a bit of variance here
+ float frontBias = 1f;
+ float rearBias = 0.95f;
+ if (DateTime.Now.Minute % 2 == 0)
+ {
+ frontBias = 0.95f;
+ rearBias = 1f;
+ }
+
+ var closestDistance = Math.Min(GapFrontSeconds * frontBias, GapRearSeconds * rearBias);
+ category.RawValue = ONE - Math.Min(closestDistance, 2.5f) / 2.5f;
+ category.Hint = $"{closestDistance:F1}";
+ }
+ break;
+ case CarWeightCategoryEnum.Pack:
+ {
+ // 2 PackFactor - how many cars are within ~10 and 30 meters? Linearly scaled to 5 cars
+ CarsAroundMe30m = trackPositionCarList.Where(x => Math.Abs(x.SplinePosition - SplinePosition) * trackMeters < 30 && x != this).Count();
+ var carsAroundMe10m = trackPositionCarList.Where(x => Math.Abs(x.SplinePosition - SplinePosition) * trackMeters < 10 && x != this).Count();
+
+ // 10m counts twice
+ category.RawValue = Math.Min(CarsAroundMe30m + carsAroundMe10m, 7) / 7f + OFFSET;
+ category.Hint = $"{CarsAroundMe30m}|{carsAroundMe10m}";
+
+ }
+ break;
+ case CarWeightCategoryEnum.Position:
+ {
+ // 3 Race Position - leaders may be more interesting than anybody else
+ // we have 2 positions; official and track - let's combine them
+ var pos = (Position + TrackPosition) / 2f;
+ category.RawValue = ONE - pos / (float)trackPositionCarList.Count;
+ if (Position != TrackPosition)
+ category.Hint = $"{Position}|{TrackPosition}";
+ else
+ category.Hint = $"{TrackPosition}";
+ }
+ break;
+ case CarWeightCategoryEnum.FocusFast:
+ {
+ // 10 Focus seconds - how long since the last focus switch? This is the short time thing which allows (or denies) to quickly jump
+ // action if there is something happening like a contact, closing in or whatever
+ // First 5s are super critical, we won't really allow a jump there so we scale to 10f - then it's neutral to jump over
+ if (!HasFocus)
+ {
+ category.RawValue = Math.Min(currentFocusSeconds, 10f) / 10f;
+ category.Hint = $"{currentFocusSeconds:F1}s";
+ }
+ else
+ {
+ // While we have focus, we signal that's it's uncritical to stick with us
+ category.RawValue = 1f;
+ category.Hint = $"Focus";
+ }
+ }
+ break;
+ case CarWeightCategoryEnum.FocusSlow:
+ {
+ // Opposed to the "Fast" variant, this is about how long we want to generally stick to a car.
+ // To not confuse the user, we basically want to aim for at least 30 seconds = 50%
+ if (!HasFocus)
+ {
+ category.RawValue = Math.Min(currentFocusSeconds, 60f) / 60f;
+ category.Hint = $"{currentFocusSeconds:F1}s";
+ }
+ else
+ {
+ // While we have focus, we signal that's it's uncritical to stick with us.
+ // though we could gradually lower the value when it's becoming way too long
+ if (currentFocusSeconds > 5 * 60)
+ {
+ // we'll sloooowly reduce this so other cars may get into the focus. After a total of 15minutes the focus will forcibly go away (but most likely earlier)
+ category.RawValue = ONE - Math.Min((Math.Max(currentFocusSeconds - 5f, 0f) * 60f) / 10f * 60f, 0f);
+ category.Hint = $"Focus ({(currentFocusSeconds / 60f):F1}min)";
+ }
+ else
+ {
+ category.RawValue = 1f;
+ category.Hint = $"Focus";
+ }
+ }
+ }
+ break;
+ case CarWeightCategoryEnum.Pace:
+ {
+ // For pace, we either look at the delta (to express how much we're pushing and maybe hunting) or at the predicted laptime - which is gold for the P/Q modes
+ // this way we should be able to focus cars that may end up on pole or high positions while they do so - something quite hard to achieve manually
+ if (PredictedLaptime <= 0)
+ {
+ // No lap set yet, doesn't matter
+ category.RawValue = OFFSET;
+ category.Hint = $"No laptime";
+ }
+ else
+ {
+ var splinePosFactor = SplinePosition;
+ if (CrossedTheLineWithFocus)
+ splinePosFactor = 1f;
+ splinePosFactor = (splinePosFactor + 1f) / 2f;
+ if (PredictedLaptime < SessionBestLap)
+ {
+ // oh on the way to purple!
+ category.RawValue = 1f * splinePosFactor;
+ category.Hint = $"{Delta:N0} (!)";
+ }
+ else
+ {
+ category.RawValue = (1f - Math.Min(PredictedLaptime - SessionBestLap, 1500) / 1500) * splinePosFactor;
+ category.Hint = $"{Delta:N0}";
+ }
+ }
+
+ }
+ break;
+ // Add handling for new enum types here
+ default:
+ {
+ // Using a 1f default for unhandled categories will make them do (and break) nothing
+ category.RawValue = 1f;
+ category.Hint = $"Unmapped";
+ }
+ break;
+ }
+ }
+
+ category.WeightedValue = (float)Math.Pow(category.RawValue, categoryWeights[category.Category]);
+ Pressure *= category.WeightedValue;
+ }
+ }
+
+ public void CalcPreferredCamera(IList trackPositionCarList, float trackMeters, float cameraChangedBeforeSeconds, ICamManager camManager, out AnyCamera preferredCamera, out float rawWeight)
+ {
+ // This is going to be a bigger one. We will select the most interesting/suitable camera for this car
+ var tvCam1Pressure = camManager.GetTVCamPressure(CameraTypeEnum.Tv1, this);
+ var tvCam2Pressure = camManager.GetTVCamPressure(CameraTypeEnum.Tv2, this);
+
+ // Additionally, we will look for cool other cams, like
+ // a) If there is nothing in front, but lots of action in the rear, we like the rear view cam
+ var carsBehindMe = trackPositionCarList.Where(x => Math.Abs(x.SplinePosition - SplinePosition) * trackMeters < 50 && x != this).Count();
+ var rearViewPressure = 0f;
+ if (GapFrontSeconds > 1 && GapRearSeconds < 2.0f && GapRearMeters > 4)
+ rearViewPressure = 1f - Math.Min(Math.Max(GapRearSeconds - 1f, 0f), 1.0f) / 1.0f;
+
+ // b) reversed, if there is action in front of me we can do an onboard
+ var onboardPressure = 0f;
+ if (GapFrontSeconds < 0.5 && GapRearSeconds > 2f && GapFrontMeters > 4f)
+ onboardPressure = 1f - Math.Min(Math.Max(GapFrontSeconds - 1f, 0f), 1.5f) / 1.5f;
+ var pitlaneFactor = CarLocation == CarLocationEnum.Pitlane ? 0f : 1f;
+ var camPressures = new Dictionary()
+ {
+ { CameraTypeEnum.Tv1, tvCam1Pressure * pitlaneFactor },
+ { CameraTypeEnum.Tv2, tvCam2Pressure * pitlaneFactor },
+ { CameraTypeEnum.RearWing, rearViewPressure * pitlaneFactor },
+ { CameraTypeEnum.Onboard, onboardPressure * pitlaneFactor},
+ { CameraTypeEnum.Pitlane, -pitlaneFactor },
+ { CameraTypeEnum.Helicam, 0.8f * pitlaneFactor },
+ };
+
+ // Any of the weights will go down by the time since the last camera switch, which makes hopping unlikely
+ var camClippingPrevention = Math.Min(Math.Max(cameraChangedBeforeSeconds - 3f, 0f), 7f) / 7f + OFFSET;
+
+ foreach (var camType in camPressures.Keys.ToArray())
+ {
+ switch (camType)
+ {
+ // Additionally we have some edits to do
+ case CameraTypeEnum.Tv1:
+ // TV1 is suitable for close combat, but we shouldn't use it too much for packs
+ if (CarsAroundMe30m > 1)
+ camPressures[camType] *= 1f - Math.Min(CarsAroundMe30m - 1, 5) / 5f;
+ break;
+ case CameraTypeEnum.Tv2:
+ // TV2 is always nice, but shouldn't be overused for low car numbers
+ if (CarsAroundMe30m == 0)
+ camPressures[camType] *= 0.5f;
+ if (CarsAroundMe30m == 1)
+ camPressures[camType] *= 0.75f;
+ break;
+ case CameraTypeEnum.Helicam:
+ // helicam is great to catch many cars, and we also like that this will push them automatically for the start
+ if (CarsAroundMe30m > 2)
+ camPressures[camType] = Math.Min(CarsAroundMe30m, 5) / 5f;
+ else
+ // Otherwise this isn't too fancy and should be reserved to replays
+ camPressures[camType] *= 0.002f;
+ break;
+ case CameraTypeEnum.Onboard:
+ // we need to have a fallback if TV cams suck, otherwise the Helicam is too much of an option most of the time
+ camPressures[camType] = Math.Max(camPressures[camType], 0.21f);
+ break;
+ }
+
+ // Clipping prevention: we don't like jumping too quickly
+ if (camClippingPrevention < 1f)
+ camPressures[camType] *= camClippingPrevention;
+ }
+
+ camManager.GetPreferredCameraWithWeight(out preferredCamera, out rawWeight, camPressures, HasFocus);
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotView.xaml b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotView.xaml
new file mode 100755
index 0000000..c4ba72a
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotView.xaml
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotView.xaml.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotView.xaml.cs
new file mode 100755
index 0000000..b6243a5
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotView.xaml.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace ksBroadcastingTestClient.Autopilot
+{
+ ///
+ /// Interaction logic for AutopilotView.xaml
+ ///
+ public partial class AutopilotView : UserControl
+ {
+ public AutopilotView()
+ {
+ InitializeComponent();
+ AutorefreshSorting();
+ }
+
+ private async void AutorefreshSorting()
+ {
+ var sorter = FindResource("src") as CollectionViewSource;
+
+ while (sorter != null)
+ {
+ sorter?.View?.Refresh();
+ await Task.Delay(1000);
+ }
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotViewModel.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotViewModel.cs
new file mode 100755
index 0000000..0a128bf
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotViewModel.cs
@@ -0,0 +1,415 @@
+using ksBroadcastingNetwork;
+using ksBroadcastingNetwork.Structs;
+using ksBroadcastingTestClient.Broadcasting;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ksBroadcastingTestClient.Autopilot
+{
+ ///
+ /// Similar to the Broadcasting view model, but is meant to debug and understand decisions made by the autopilot.
+ /// Is a bit of code duplication, but I wanted this to act stand-alone so it can serve as a base for a good auto-cam mod
+ ///
+ public class AutopilotViewModel : KSObservableObject
+ {
+ public AutopilotWeightsViewModel WeightsVM { get; } = new AutopilotWeightsViewModel();
+ public ObservableCollection Cars { get; } = new ObservableCollection();
+
+ public TrackViewModel TrackVM { get => Get(); private set => Set(value); }
+ public CameraManagementViewModel CamManagerVM { get; } = new CameraManagementViewModel();
+ public KSRelayCommand RequestFocusedCarCommand { get; }
+ public KSRelayCommand ToggleAutopilotCommand { get; }
+ public bool IsAutopilotActive { get => Get(); private set { Set(value); NotifyUpdate(nameof(AutopilotStateText)); } }
+ public string AutopilotStateText { get => IsAutopilotActive ? "Stop" : "Auto"; }
+
+ private List _clients = new List();
+ public List PressureCategoryWeights { get; } = new List();
+ public DateTime LastFocusChange { get => Get(); private set => Set(value); }
+ public DateTime LastCameraSetChange { get => Get(); private set => Set(value); }
+ public DateTime LastCameraChange { get => Get(); private set => Set(value); }
+ public int FocusedCarIndex { get; private set; }
+ public string ActiveCameraSet { get; private set; }
+ public string ActiveCamera { get; private set; }
+ public RaceSessionType SessionType { get => Get(); set => Set(value); }
+ public string CurrentHudPage { get; private set; }
+ public string AutopilotState { get => Get(); private set => Set(value); }
+ public ObservableCollection MiniLog { get; } = new ObservableCollection();
+
+ public AutopilotViewModel()
+ {
+ RequestFocusedCarCommand = new KSRelayCommand(RequestFocusedCar);
+ ToggleAutopilotCommand = new KSRelayCommand((o) => IsAutopilotActive = !IsAutopilotActive);
+ LastFocusChange = DateTime.Now.AddSeconds(-10);
+
+ foreach (var item in Enum.GetValues(typeof(CarWeightCategoryEnum)).Cast())
+ {
+ var weight = new CarWeightCategoryViewModel(item);
+ weight.RawValue = GetDefaultCategoryWeight(item);
+ PressureCategoryWeights.Add(weight);
+ }
+ }
+
+ private float GetDefaultCategoryWeight(CarWeightCategoryEnum item)
+ {
+ switch (item)
+ {
+ // Add cases for overrides, leave them out for a default of 100%
+ default:
+ return 1f;
+ }
+ }
+
+ int cycles = 0;
+ private void CalcCarRanks()
+ {
+ cycles++;
+ // This is the one big responsibility. Once each realtime update cycle, we will walk through all the cars and try to figure out
+ // what is the best car (and camera and everything) to focus right now
+
+ // The obvious stuff is that we want a priority mix of
+ // - close action
+ // - watching the front guys
+ // - distribute screentime across the field
+ // - contacts and accidents
+
+ // but also take more sophisticated stuff into consideration
+ // - camera clipping, avoid too furious jumps
+ // - action clipping - once we watch something, we want to stick there for moment at least
+ // - camera selection: we should offer a healthy mix and shuffle in onboards, bonus points for understanding which camera would be nice for a given situations
+ // - instant replays - in theory we should be able to jump to any contact happening, and selectively offer a replay of the seconds before. Same for overtakes we didn't cover
+
+ // I do see multiple ways to implement this, the regular way would be to use any default decision making method - in the easiest way we could stack up categories and weights.
+ // Due to the nature of the amount solutions we have, I spot a loophole and will (try to) abuse the big trick in genetic algorithms, just without the CPU intensive use.
+ #region deeper thoughts about this
+ // GA's have a black magic component where you only need to describe the fitness function of a given solution. If you do this well, you do not need to understand/implement tactics,
+ // the GA will explore this. But as we only have a number of cars = number of solutions, we can simply bruteforce all scenarios (= amount of cars) and decide by fitness function.
+ // That one has to express either the gain or pain if we focus that car right now. Sounds a lot more fancy than it is, but it's important to understand the perspective and feed the
+ // data we need
+ #endregion
+
+ var trackPositionCarList = Cars.OrderByDescending(x=>x.TrackPosition).ToList();
+ // for the ease of use, we'll set the lead car to the front
+
+ var maxRank = 0f;
+ AutopilotCarViewModel maxRankCar = null;
+ var focusChangedBeforeSeconds = (float)(DateTime.Now - LastFocusChange).TotalSeconds;
+ var cameraChangedBeforeSeconds = (float)(DateTime.Now - LastCameraChange).TotalSeconds;
+
+ var weightDict = PressureCategoryWeights.ToDictionary(x => x.Category, x => x.RawValue);
+ var avgPressure = 0f;
+ foreach (var item in trackPositionCarList)
+ {
+ item.CalcPressure(trackPositionCarList, TrackVM.TrackMeters, focusChangedBeforeSeconds, weightDict, CamManagerVM);
+
+ if(maxRank < item.Pressure)
+ {
+ maxRank = item.Pressure;
+ maxRankCar = item;
+ }
+
+ avgPressure += item.Pressure;
+ }
+
+ if (trackPositionCarList.Count > 0)
+ avgPressure /= trackPositionCarList.Count;
+
+ if (IsAutopilotActive)
+ {
+ // additionally, we will see what cam we want to use
+ // In the first approach, we will ask if there is something to force - eg. TV cams we need to learn
+ var forcedCamSet = CamManagerVM.GetForcedCameraSet();
+ if (forcedCamSet != null)
+ {
+ RequestCameraChange(forcedCamSet.Set, forcedCamSet.Name);
+ }
+ else if(CamManagerVM.TVCamLearningProgress == 1f)
+ {
+ AnyCamera preferredCamera;
+ float rawWeight;
+ maxRankCar.CalcPreferredCamera(trackPositionCarList, TrackVM.TrackMeters, cameraChangedBeforeSeconds, CamManagerVM, out preferredCamera, out rawWeight);
+ var stateStr = "";
+ if (maxRankCar != null && !maxRankCar.HasFocus)
+ stateStr = $"Want: {maxRankCar.CurrentDriverName} ({maxRank:P0})";
+ stateStr += preferredCamera != null ? $" Cam {rawWeight:P0}" : $"-";
+ AutopilotState = stateStr;
+
+ var isFocusChange = maxRankCar != null && !maxRankCar.HasFocus && maxRankCar.Pressure > avgPressure * 0.15f && rawWeight > 0.2f;
+ var isCameraChange = preferredCamera != null && rawWeight > 0.2f;
+ var isHudChange = false;
+ var targetHUD = "";
+ if(isCameraChange)
+ {
+ switch (preferredCamera.CamType)
+ {
+ // Onboards will get the basic hud, with rpm and such
+ case CameraTypeEnum.RearWing:
+ case CameraTypeEnum.Onboard:
+ targetHUD = "Basic HUD";
+ isHudChange = true;
+ break;
+
+ // Default is the broadcasting hud
+ case CameraTypeEnum.Tv1:
+ case CameraTypeEnum.Tv2:
+ case CameraTypeEnum.Helicam:
+ case CameraTypeEnum.Pitlane:
+ case CameraTypeEnum.Unknown:
+ default:
+ targetHUD = "Broadcasting";
+ isHudChange = true;
+ break;
+ }
+
+ if (targetHUD == CurrentHudPage)
+ isHudChange = false;
+ }
+
+ if(isFocusChange && isHudChange)
+ {
+ RequestFocusedCarAndCamera(maxRankCar, preferredCamera.Set, preferredCamera.Name);
+ Log($"Requested Focus: {maxRankCar.CurrentDriverName} ({maxRank:P0}) with cam {preferredCamera.Set}/{preferredCamera.Name} ({rawWeight:P0})");
+ }
+ else if(isFocusChange)
+ {
+ RequestFocusedCar(maxRankCar);
+ Log($"Requested Focus: {maxRankCar.CurrentDriverName} ({maxRank:P0})");
+ }
+ else if(isCameraChange)
+ {
+ RequestCameraChange(preferredCamera.Set, preferredCamera.Name);
+ }
+
+ if(false && isHudChange)
+ {
+ RequestHudPageChange(targetHUD);
+ Log($"Requested HUD change: {targetHUD}");
+ }
+ }
+ }
+ }
+
+ private void RequestFocusedCarAndCamera(object obj, string camSet, string camera)
+ {
+ var car = obj as AutopilotCarViewModel;
+ if (car != null)
+ {
+ foreach (var client in _clients)
+ {
+ // mssing readonly check, will skip this as the ACC client has to handle this as well
+ client.SetFocus(Convert.ToUInt16(car.CarIndex), camSet, camera);
+ }
+
+ LastFocusChange = DateTime.Now;
+ LastCameraChange = DateTime.Now;
+ }
+ }
+
+ private void RequestFocusedCar(object obj)
+ {
+ var car = obj as AutopilotCarViewModel;
+ if (car != null)
+ {
+ foreach (var client in _clients)
+ {
+ // mssing readonly check, will skip this as the ACC client has to handle this as well
+ client.SetFocus(Convert.ToUInt16(car.CarIndex));
+ }
+
+ LastFocusChange = DateTime.Now;
+ }
+ }
+
+ private void RequestHudPageChange(string requestedHudPage)
+ {
+ if(requestedHudPage != CurrentHudPage)
+ {
+ foreach (var client in _clients)
+ {
+ // mssing readonly check, will skip this as the ACC client has to handle this as well
+ client.RequestHUDPage(requestedHudPage);
+ }
+ }
+ }
+
+ private void RequestCameraChange(string camSet, string camera)
+ {
+ foreach (var client in _clients)
+ {
+ // mssing readonly check, will skip this as the ACC client has to handle this as well
+ client.SetCamera(camSet, camera);
+ }
+
+ LastCameraChange = DateTime.Now;
+ }
+
+ internal void RegisterNewClient(ACCUdpRemoteClient newClient)
+ {
+ if (newClient.MsRealtimeUpdateInterval > 0)
+ {
+ // This client will send realtime updates, we should listen
+ newClient.MessageHandler.OnTrackDataUpdate += MessageHandler_OnTrackDataUpdate;
+ newClient.MessageHandler.OnEntrylistUpdate += MessageHandler_OnEntrylistUpdate;
+ newClient.MessageHandler.OnRealtimeUpdate += MessageHandler_OnRealtimeUpdate;
+ newClient.MessageHandler.OnRealtimeCarUpdate += MessageHandler_OnRealtimeCarUpdate;
+ }
+
+ _clients.Add(newClient.MessageHandler);
+ }
+
+ private void MessageHandler_OnTrackDataUpdate(string sender, TrackData trackUpdate)
+ {
+ if (TrackVM?.TrackId != trackUpdate.TrackId)
+ {
+ if (TrackVM != null)
+ {
+ TrackVM.OnRequestCameraChange -= RequestCameraChange;
+ TrackVM.OnRequestHudPageChange -= RequestHudPageChange;
+ }
+
+ TrackVM = new TrackViewModel(trackUpdate.TrackId, trackUpdate.TrackName, trackUpdate.TrackMeters);
+ TrackVM.OnRequestCameraChange += RequestCameraChange;
+ TrackVM.OnRequestHudPageChange += RequestHudPageChange;
+ }
+
+ // The track cams may update in between
+ TrackVM.Update(trackUpdate);
+ CamManagerVM.Update(trackUpdate);
+ }
+
+ private void MessageHandler_OnEntrylistUpdate(string sender, CarInfo carUpdate)
+ {
+ AutopilotCarViewModel vm = Cars.SingleOrDefault(x => x.CarIndex == carUpdate.CarIndex);
+ if (vm == null)
+ {
+ vm = new AutopilotCarViewModel(carUpdate.CarIndex);
+ Cars.Add(vm);
+ }
+
+ vm.Update(carUpdate);
+ }
+
+ private void MessageHandler_OnRealtimeUpdate(string sender, RealtimeUpdate update)
+ {
+ if (TrackVM != null)
+ TrackVM.Update(update);
+
+ SessionType = update.SessionType;
+
+ foreach (var carVM in Cars)
+ {
+ carVM.SetFocused(update.FocusedCarIndex);
+ }
+
+ if(FocusedCarIndex != update.FocusedCarIndex)
+ {
+ FocusedCarIndex = update.FocusedCarIndex;
+ LastFocusChange = DateTime.Now;
+ }
+
+ if(ActiveCameraSet != update.ActiveCameraSet)
+ {
+ ActiveCameraSet = update.ActiveCameraSet;
+ LastCameraSetChange = DateTime.Now;
+ }
+
+ if(ActiveCamera != update.ActiveCamera || ActiveCameraSet != update.ActiveCameraSet)
+ {
+ ActiveCamera = update.ActiveCamera;
+ LastCameraChange = DateTime.Now;
+ }
+
+ CurrentHudPage = update.CurrentHudPage;
+
+ CamManagerVM.RealtimeUpdate(update);
+ try
+ {
+ if (TrackVM?.TrackMeters > 0)
+ {
+ var sortedCars = Cars.OrderByDescending(x => x.SplinePosition).ToArray();
+ if(sortedCars.Count() > 1)
+ {
+ for (int i = 1; i < sortedCars.Length; i++)
+ {
+ var carAhead = sortedCars[i - 1];
+ var carBehind = sortedCars[i];
+
+ var distance = calcMetersDistance(carAhead, carBehind, TrackVM.TrackMeters);
+ carBehind.GapFrontMeters = distance;
+ carAhead.GapRearMeters = distance;
+
+ var combinedSpeedMS = (carAhead.Kmh + carBehind.Kmh) / 2f / 3.6f;
+ if(combinedSpeedMS > 0.0001f)
+ {
+ carBehind.GapFrontSeconds = distance / combinedSpeedMS;
+ carAhead.GapRearSeconds = distance / combinedSpeedMS;
+ }
+ else
+ {
+ carBehind.GapFrontSeconds = 999;
+ carAhead.GapRearSeconds = 999;
+ }
+ }
+
+ // then the first and last cars
+ var distance2 = calcMetersDistance(sortedCars.First(), sortedCars.Last(), TrackVM.TrackMeters);
+ sortedCars.First().GapFrontMeters = distance2;
+ sortedCars.Last().GapRearMeters = distance2;
+ }
+ else
+ {
+ foreach (var item in sortedCars)
+ {
+ item.GapFrontMeters = TrackVM.TrackMeters;
+ item.GapRearMeters = TrackVM.TrackMeters;
+ }
+ }
+ }
+
+ // A bit unfortunate, the RealtimeUpdate is happening before the carUpdates so we will lag a bit
+ // but still it's the one place we know the carupdates are synched and the states are the most comparable
+ // more sophisticated solution would be better, like resetting a counter here and push the calculation once we received all cars
+ CalcCarRanks();
+ }
+ catch (Exception ex)
+ {
+ Debug.WriteLine(ex.Message);
+ }
+ }
+
+ private static float calcMetersDistance(AutopilotCarViewModel carAhead, AutopilotCarViewModel carBehind, float trackMeters)
+ {
+ var splineDistance = carAhead.SplinePosition - carBehind.SplinePosition;
+ while (splineDistance < 0f)
+ splineDistance += 1f;
+
+ return splineDistance * trackMeters;
+ }
+
+ private void MessageHandler_OnRealtimeCarUpdate(string sender, RealtimeCarUpdate carUpdate)
+ {
+ var vm = Cars.FirstOrDefault(x => x.CarIndex == carUpdate.CarIndex);
+ if (vm == null)
+ {
+ // Oh, we don't have this car yet. In this implementation, the Network protocol will take care of this
+ // so hopefully we will display this car in the next cycles
+ return;
+ }
+
+ vm.Update(carUpdate, TrackVM.TrackMeters);
+ if(vm.HasFocus)
+ CamManagerVM.RealtimeUpdateFocusedCar(vm.CarIndex, vm.SplinePosition, vm.Kmh);
+ }
+
+ private void Log(string msg)
+ {
+ MiniLog.Insert(0, msg);
+ while (MiniLog.Count > 15)
+ MiniLog.RemoveAt(MiniLog.Count - 1);
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotWeightsView.xaml b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotWeightsView.xaml
new file mode 100755
index 0000000..1f3c5e3
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotWeightsView.xaml
@@ -0,0 +1,12 @@
+
+
+
+
+
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotWeightsView.xaml.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotWeightsView.xaml.cs
new file mode 100755
index 0000000..13adbd7
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotWeightsView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace ksBroadcastingTestClient.Autopilot
+{
+ ///
+ /// Interaction logic for AutopilotWeightsView.xaml
+ ///
+ public partial class AutopilotWeightsView : UserControl
+ {
+ public AutopilotWeightsView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotWeightsViewModel.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotWeightsViewModel.cs
new file mode 100755
index 0000000..fa6ec2e
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/AutopilotWeightsViewModel.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ksBroadcastingTestClient.Autopilot
+{
+ public class AutopilotWeightsViewModel : KSObservableObject
+ {
+ public string JumpinessHint { get; } = "How willingly will the autopilot jump between cars based on recent action.\nReduce this if it's becoming confusing for the viewer, increase it if we it sticks too long with one car and we miss other things";
+ public float Jumpiness { get => Get(); private set => Set(value); }
+
+ public string RacePositionHint { get; } = "How likely the autopilot will focus lead cars. If this is too high, it would follow a solo leader while the pack behind is fighting for it's life; increase this if you start to see insignificant stuff";
+ public float RacePosition { get => Get(); private set => Set(value); }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/CameraManagementView.xaml.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/CameraManagementView.xaml.cs
new file mode 100755
index 0000000..75cbd49
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/CameraManagementView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace ksBroadcastingTestClient.Autopilot
+{
+ ///
+ /// Interaction logic for CameraManagementView.xaml
+ ///
+ public partial class CameraManagementView : UserControl
+ {
+ public CameraManagementView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/CameraManagementViewModel.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/CameraManagementViewModel.cs
new file mode 100755
index 0000000..a23b4d3
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/CameraManagementViewModel.cs
@@ -0,0 +1,544 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using ksBroadcastingNetwork.Structs;
+
+namespace ksBroadcastingTestClient.Autopilot
+{
+ public enum CameraTypeEnum { Tv1, Tv2, RearWing, Onboard, Helicam, Pitlane, Unknown }
+
+ public interface ICamManager
+ {
+ float GetTVCamPressure(CameraTypeEnum cameraType, AutopilotCarViewModel car);
+ void GetPreferredCameraWithWeight(out AnyCamera preferredCamera, out float rawValue, Dictionary camPressures, bool isFocusedCar);
+ }
+
+ public class AnyCamera : KSObservableObject
+ {
+ public string Set { get; }
+ public string Name { get; }
+ public CameraTypeEnum CamType { get; set; }
+ public bool IsActive { get => Get(); set { Set(value); NotifyUpdate(nameof(IndicatorColor)); } }
+ public virtual System.Windows.Media.Brush IndicatorColor
+ {
+ get
+ {
+ if (IsActive)
+ return System.Windows.Media.Brushes.Green;
+ return System.Windows.Media.Brushes.Gray;
+ }
+ }
+
+ public AnyCamera(string set, string name)
+ {
+ Set = set;
+ Name = name;
+ }
+ }
+
+ class TVCamJsonData
+ {
+ public string SetName { get; set; }
+ public string CamName { get; set; }
+ public float SplinePosStart { get; set; }
+ public float SplinePosEnd { get; set; }
+ public int EntrySpeed { get; set; }
+ public int ExitSpeed { get; set; }
+
+ public static TVCamJsonData FromCam(TVCam cam)
+ {
+ return new TVCamJsonData()
+ {
+ SetName = cam.Set,
+ CamName = cam.Name,
+ SplinePosStart = cam.SplinePosStart,
+ SplinePosEnd = cam.SplinePosEnd,
+ EntrySpeed = cam.EntrySpeed,
+ ExitSpeed = cam.ExitSpeed
+ };
+ }
+
+ public void UpdateTVCam(TVCam cam)
+ {
+ if (string.Equals(SetName, cam.Set) && string.Equals(CamName, cam.Name))
+ {
+ if (cam.SplinePosStart < 0f)
+ cam.SplinePosStart = SplinePosStart;
+ if (cam.SplinePosEnd < 0f)
+ cam.SplinePosEnd = SplinePosEnd;
+ if (cam.EntrySpeed <= 0f)
+ cam.EntrySpeed = EntrySpeed;
+ if (cam.ExitSpeed <= 0f)
+ cam.ExitSpeed = ExitSpeed;
+ }
+ }
+ }
+
+ public class TVCam : AnyCamera
+ {
+ public float SplinePosStart { get; internal set; } = -1f;
+ public float SplinePosEnd { get; internal set; } = -1f;
+
+ public override System.Windows.Media.Brush IndicatorColor
+ {
+ get
+ {
+ if (SplinePosStart < 0f)
+ return IsActive ? System.Windows.Media.Brushes.Brown : System.Windows.Media.Brushes.Red;
+ if (SplinePosEnd < 0f)
+ return IsActive ? System.Windows.Media.Brushes.RosyBrown : System.Windows.Media.Brushes.Orange;
+ return base.IndicatorColor;
+ }
+ }
+
+ public int EntrySpeed { get; internal set; }
+ public int ExitSpeed { get; internal set; }
+ public TVCam PreviousCam { get; internal set; }
+
+ public TVCam(string set, string name)
+ : base(set, name)
+ {
+ }
+
+ internal void SetEntry(float splinePosition, int kmh)
+ {
+ SplinePosStart = splinePosition;
+ EntrySpeed = kmh;
+ NotifyUpdate(nameof(IndicatorColor));
+ }
+
+ internal void SetExit(float splinePosition, int kmh)
+ {
+ SplinePosEnd = splinePosition;
+ ExitSpeed = kmh;
+ NotifyUpdate(nameof(IndicatorColor));
+ }
+
+ public override string ToString()
+ {
+ var startIsSet = SplinePosStart < 0f ? "-" : "|";
+ var endIsSet = SplinePosStart < 0f ? "|" : "|";
+ return $"{startIsSet}{Name}{endIsSet}";
+ }
+ }
+
+ public class CameraManagementViewModel : KSObservableObject, ICamManager
+ {
+ public Dictionary> TVCameraSets { get; private set; }
+ public Dictionary> OtherCameraSets { get; private set; }
+ public Dictionary> AllCameraSets { get; private set; }
+
+ TVCam OldTVCam = null;
+ float LastFocusedCarSplinePosition = -1f;
+ int LastFocusedCarSpeed = -1;
+ int LastFocusedCarId = -1;
+ private AnyCamera CurrentCam;
+
+ public DateTime CurrentCamSetActiveSince { get; private set; }
+
+ private Random R = new Random();
+
+ private Dictionary CamTypeLastActive { get; } = new Dictionary();
+
+ public float TVCamLearningProgress { get => Get(); private set { if (Set(value)) NotifyUpdate(nameof(CameraState)); } }
+ public string CameraState
+ {
+ get
+ {
+ if (TVCameraSets == null || TVCameraSets.Any())
+ return $"Waiting for camera definitions";
+ else if (TVCamLearningProgress < 1f)
+ return $"Learning TV cams {TVCamLearningProgress:P0}";
+ else
+ {
+ return $"Current camera xy";
+ }
+ }
+ }
+
+ public string TrackName { get; private set; }
+ public float TrackMeters { get; private set; }
+
+ internal void Update(TrackData trackUpdate)
+ {
+ TrackName = trackUpdate.TrackName;
+ TrackMeters = trackUpdate.TrackMeters;
+ if (TVCameraSets == null)
+ {
+ OldTVCam = null;
+ TVCameraSets = new Dictionary>();
+ OtherCameraSets = new Dictionary>();
+ AllCameraSets = new Dictionary>();
+
+ foreach (var tvCamSet in trackUpdate.CameraSets.Where(x => x.Key.StartsWith("set")))
+ {
+ // we'll exclude the VR sets, usually can't use them but confuses the learning of TV cams
+ if (tvCamSet.Key.EndsWith("vr", StringComparison.InvariantCultureIgnoreCase))
+ continue;
+
+ TVCameraSets.Add(tvCamSet.Key, new List());
+ AllCameraSets.Add(tvCamSet.Key, new List());
+
+ var lastTvCam = (TVCam)null;
+ foreach (var tvCamName in tvCamSet.Value)
+ {
+ var cam = new TVCam(tvCamSet.Key, tvCamName);
+ if (lastTvCam != null)
+ cam.PreviousCam = lastTvCam;
+ lastTvCam = cam;
+ TVCameraSets[tvCamSet.Key].Add(cam);
+ AllCameraSets[tvCamSet.Key].Add(cam);
+ }
+
+ if (TVCameraSets[tvCamSet.Key].Count > 1)
+ TVCameraSets[tvCamSet.Key].First().PreviousCam = TVCameraSets[tvCamSet.Key].Last();
+ }
+
+ foreach (var camSet in trackUpdate.CameraSets.Where(x => !x.Key.StartsWith("set")))
+ {
+ OtherCameraSets.Add(camSet.Key, new List());
+ AllCameraSets.Add(camSet.Key, new List());
+
+ foreach (var otherCamName in camSet.Value)
+ {
+ var cam = new AnyCamera(camSet.Key, otherCamName);
+ OtherCameraSets[camSet.Key].Add(cam);
+ AllCameraSets[camSet.Key].Add(cam);
+ }
+ }
+
+ foreach (var camera in AllCameraSets.SelectMany(x => x.Value))
+ {
+ camera.CamType = EvaluateCameraType(trackUpdate.TrackName, camera.Set, camera.Name);
+ }
+
+ foreach (var camType in AllCameraSets.SelectMany(x => x.Value).Select(x => x.CamType).Distinct())
+ {
+ CamTypeLastActive.Add(camType, DateTime.Now.AddMinutes(-10));
+ }
+
+ TryLoadTVCameraDefs(TVCameraSets.SelectMany(x => x.Value), TrackName);
+ UpdateTVCamLearningProgress();
+
+ NotifyUpdate(nameof(AllCameraSets));
+ NotifyUpdate(nameof(CameraState));
+ }
+ }
+
+ private CameraTypeEnum EvaluateCameraType(string trackName, string set, string name)
+ {
+ // This should go to a cfg file or so
+ if (set.Contains("set1"))
+ return CameraTypeEnum.Tv1;
+ if (set.Contains("set2"))
+ return CameraTypeEnum.Tv2;
+ if (set.Contains("heli") || set.Contains("Heli"))
+ return CameraTypeEnum.Helicam;
+ if (set == "pitlane")
+ return CameraTypeEnum.Pitlane;
+
+ // the rest should be some kind of onboard, we only look for the rear wing one precisely
+ if (name == "Onboard3")
+ return CameraTypeEnum.RearWing;
+
+ // aeh nobody wants to see chasecams in br
+ if (name.Contains("chase") || name.Contains("chase"))
+ return CameraTypeEnum.Unknown;
+
+ return CameraTypeEnum.Onboard;
+ }
+
+ internal void RealtimeUpdate(RealtimeUpdate update)
+ {
+ try
+ {
+ if (AllCameraSets.ContainsKey(update.ActiveCameraSet))
+ {
+ var cam = AllCameraSets[update.ActiveCameraSet].Single(x => x.Name == update.ActiveCamera);
+ if (!cam.IsActive)
+ {
+ // Cam changed!
+ var lastCams = AllCameraSets.SelectMany(x => x.Value).Where(x => x.IsActive);
+ if (lastCams.Count() == 1)
+ {
+ // regular case, we have a last and new cam
+ var oldCam = lastCams.Single();
+
+ // To learn the stuff, we need to memorize the old cam
+ OldTVCam = (oldCam as TVCam);
+ }
+ else if (lastCams.Count() > 1)
+ Debug.WriteLine($"There are {lastCams.Count()} active cams, something went horribly wrong");
+
+ foreach (var item in lastCams)
+ item.IsActive = false;
+
+ cam.IsActive = true;
+ if (cam.CamType != CurrentCam?.CamType)
+ CurrentCamSetActiveSince = DateTime.Now;
+ CurrentCam = cam;
+ }
+ }
+
+ if (CurrentCam != null)
+ CamTypeLastActive[CurrentCam.CamType] = DateTime.Now;
+ }
+ catch (Exception ex)
+ {
+ Debug.WriteLine(ex.Message);
+ }
+ }
+
+ internal TVCam GetForcedCameraSet()
+ {
+ if (TVCamLearningProgress < 1f)
+ {
+ foreach (var item in TVCameraSets.SelectMany(x => x.Value))
+ {
+ if (item.SplinePosEnd < 0f || item.SplinePosStart < 0f)
+ if (item.Set == CurrentCam?.Set)
+ return null;
+ else
+ return item;
+ }
+ }
+
+ return null;
+ }
+
+ internal AnyCamera GetTVCamByIndex(int camIndex)
+ {
+ foreach (var set in TVCameraSets?.Skip(camIndex))
+ return set.Value.FirstOrDefault();
+ return null;
+ }
+
+ internal void RealtimeUpdateFocusedCar(int focusedCarId, float splinePosition, int kmh)
+ {
+ if (OldTVCam != null && !OldTVCam.IsActive && TVCamLearningProgress < 1f && LastFocusedCarId == focusedCarId)
+ {
+ var currentTVCam = CurrentCam as TVCam;
+ // Looks like we can update the end of the old cam
+ // BUT we need to make sure it's the one before the current cam
+ if (currentTVCam != null)
+ {
+ if (currentTVCam.PreviousCam == OldTVCam)
+ {
+ // Cool, now we can learn where the new one begins
+ if (currentTVCam.SplinePosStart < 0f)
+ currentTVCam.SetEntry(splinePosition, kmh);
+
+ // Additionally, the old cam may learn the exit
+ if (OldTVCam.SplinePosEnd < 0f)
+ OldTVCam.SetExit(LastFocusedCarSplinePosition, LastFocusedCarSpeed);
+
+ var oldProgress = TVCamLearningProgress;
+ UpdateTVCamLearningProgress();
+ if (oldProgress != TVCamLearningProgress && TVCamLearningProgress == 1f)
+ SaveTVCameraDefs(TVCameraSets.SelectMany(x => x.Value), TrackName);
+ }
+ }
+ }
+
+ LastFocusedCarSplinePosition = splinePosition;
+ LastFocusedCarSpeed = kmh;
+ LastFocusedCarId = focusedCarId;
+ }
+
+ private void UpdateTVCamLearningProgress()
+ {
+ // Now we may have an update to the LearningProcess
+ int tvCams = 0;
+ int finalizedTvCams = 0;
+ foreach (var item in TVCameraSets.SelectMany(x => x.Value))
+ {
+ if (item.SplinePosEnd > -1f && item.SplinePosStart > -1f)
+ {
+ // ready to go
+ finalizedTvCams++;
+ }
+ tvCams++;
+ }
+ if (tvCams > 0)
+ TVCamLearningProgress = finalizedTvCams / (float)tvCams;
+ else
+ TVCamLearningProgress = 0;
+ }
+
+ public float GetTVCamPressure(CameraTypeEnum cameraType, AutopilotCarViewModel car)
+ {
+ if (TVCameraSets == null)
+ {
+ Debug.WriteLine($"There are no TV cams (yet?)");
+ return 1f;
+ }
+
+ if (TVCamLearningProgress < 1f)
+ {
+ // while we learn, it's better to stick to a car and let us see all the cams as quick as possible
+ return 0.1f;
+ }
+
+ var setName = TVCameraSets.SelectMany(x => x.Value).FirstOrDefault(x => x.CamType == cameraType)?.Set;
+
+ // Complicated stuff. So the big targets are
+ // 1) avoid changing focus to a car inside the same TV cam, that looks just weird
+ // 2) avoid changing focus to a car that is at the end of the given camera zone
+ // Third is avoid changing focus from a car that just entered a new cam, but this is handled in the car view model
+
+ // let's find the camera this car would be in
+ var potentialTVCam = TVCameraSets[setName].FirstOrDefault(x => x.SplinePosStart < car.SplinePosition && x.SplinePosEnd > car.SplinePosition);
+ if (potentialTVCam == null)
+ {
+ // mh what's this?
+ return 0.1f;
+ }
+
+ var timeToEnd = (potentialTVCam.SplinePosEnd - car.SplinePosition) * TrackMeters / (car.Kmh / 3.6f);
+ // then the pressure is a function of "at least 2s", then we'll blend into full green light at 8s
+ var pressure = Math.Min(Math.Max(timeToEnd - 2, 0), 6) / 6f;
+
+ // Now 1): is this cars not focusing, but we would use the same cam when focused?
+ if (CurrentCam == potentialTVCam)
+ // We are the focused car, always - even if this is called during a pre-step
+ return Math.Max(0.8f, pressure);
+
+ // 2) How much time will we have until this camera ends?
+ if (car.Kmh < 20)
+ return 0.1f;
+
+
+ // TODO: we could edit the pressure to have a healthy ratio between the cam sets, otherwise it'd be random
+ // and set2 may win over proportionally often due to the longer scenes
+
+ return pressure;
+ }
+
+ public void GetPreferredCameraWithWeight(out AnyCamera preferredCamera, out float rawValue, Dictionary camPressures, bool isFocusedCar)
+ {
+ // First we'll edit the camPressures based on settings, recent cameras and strict rules - the car didn't know shit about cams after all
+ foreach (var item in camPressures)
+ {
+ // apply modifiers
+ }
+
+ // now strict rules
+ var camSetActiveSinceMinutes = Convert.ToSingle(Math.Max((DateTime.Now - CurrentCamSetActiveSince).TotalMinutes, 0.5) - 0.5);
+ var lastCamSetSwitchSeconds = Convert.ToSingle((DateTime.Now - CurrentCamSetActiveSince).TotalSeconds);
+ foreach (var camType in camPressures.Keys.ToArray())
+ {
+ var isCurrentCam = camType == CurrentCam?.CamType;
+ var thisCamLastActiveMinutes = (DateTime.Now - CamTypeLastActive[camType]).TotalMinutes;
+ if (thisCamLastActiveMinutes < 5.0 && !isCurrentCam)
+ camPressures[camType] *= Math.Min(Convert.ToSingle(thisCamLastActiveMinutes / 5.0), 1f);
+
+ switch (camType)
+ {
+ case CameraTypeEnum.RearWing:
+ case CameraTypeEnum.Onboard:
+ {
+ // Additionally these are nice, but shouldn't be in too often, so we'll doubledip this calculation
+ if (thisCamLastActiveMinutes < 5.0 && !isCurrentCam)
+ {
+ camPressures[camType] *= Convert.ToSingle(thisCamLastActiveMinutes / 5.0);
+ }
+
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (isCurrentCam && isFocusedCar)
+ {
+ var camIsGettingOldFactor = 1f;
+ if (camType == CameraTypeEnum.Tv1 || camType == CameraTypeEnum.Tv2)
+ camIsGettingOldFactor = 1f - Math.Min(Math.Max(camSetActiveSinceMinutes - 0.5f, 0f) / 3f, 1f);
+ else
+ camIsGettingOldFactor = 1f - Math.Min(Math.Max(camSetActiveSinceMinutes - 0.3f, 0f) / 2f, 2f);
+
+ camPressures[camType] *= camIsGettingOldFactor;
+ }
+
+ if (!isCurrentCam && isFocusedCar)
+ {
+ // on the other hand we don't want to switch too quickly;
+ if (lastCamSetSwitchSeconds < 20)
+ {
+ var camIsYoungFactor = 1f;
+ if (CurrentCam?.CamType == CameraTypeEnum.Tv1 || CurrentCam?.CamType == CameraTypeEnum.Tv2)
+ camIsYoungFactor = Math.Min(Math.Max(lastCamSetSwitchSeconds - 10f, 0f) / 30f, 1f);
+ else
+ camIsYoungFactor = Math.Min(Math.Max(lastCamSetSwitchSeconds - 5f, 0f) / 15f, 1f);
+ camPressures[camType] = Math.Min(camIsYoungFactor + camPressures[camType], 1f);
+ }
+ }
+
+ // In any way we do not want to focus a new car in the same camera, except for TV cams - but here we don't want to jump
+ // into the same or one we recently saw
+ if (!isFocusedCar)
+ {
+ if (camType == CurrentCam?.CamType)
+ camPressures[camType] = 0f;
+ }
+ }
+
+ var winner = camPressures.OrderByDescending(x => x.Value).First();
+
+ // now we'll locate the camera for that, if it's not the same
+ if (winner.Key == CurrentCam?.CamType || winner.Value < 0.1)
+ preferredCamera = null; // null means stick witch it
+ else
+ {
+ // otherwise, we'll select a random cam that matches the type
+ var candidates = AllCameraSets.SelectMany(x => x.Value).Where(x => x.CamType == winner.Key).ToArray();
+ if (!candidates.Any())
+ {
+ Debug.WriteLine($"Requested cam type {winner.Key} isn't available");
+ preferredCamera = null;
+ }
+ else
+ {
+ preferredCamera = candidates[R.Next(candidates.Length)];
+ }
+ }
+
+ rawValue = winner.Value;
+ }
+
+ private static void SaveTVCameraDefs(IEnumerable tVCameraSets, string track)
+ {
+ var defs = tVCameraSets.Select(x => TVCamJsonData.FromCam(x));
+
+ var json = Newtonsoft.Json.JsonConvert.SerializeObject(defs);
+ if (!System.IO.Directory.Exists("camDefs"))
+ System.IO.Directory.CreateDirectory("camDefs");
+ System.IO.File.WriteAllText($"camDefs/{track}.json", json);
+ }
+
+ private static void TryLoadTVCameraDefs(IEnumerable tVCameraSets, string track)
+ {
+ if (!System.IO.File.Exists($"camDefs/{track}.json"))
+ return;
+
+ var json = System.IO.File.ReadAllText($"camDefs/{track}.json");
+ try
+ {
+ var camDefs = Newtonsoft.Json.JsonConvert.DeserializeObject>(json);
+ foreach (var item in tVCameraSets)
+ {
+ var camDef = camDefs.FirstOrDefault(x => string.Equals(x.SetName, item.Set) && string.Equals(x.CamName, item.Name));
+ if (camDef != null)
+ camDef.UpdateTVCam(item);
+ }
+ }
+ catch (Exception ex)
+ {
+ Debug.WriteLine(ex.Message);
+ }
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/CarWeightCategoryView.xaml b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/CarWeightCategoryView.xaml
new file mode 100755
index 0000000..b37996b
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/CarWeightCategoryView.xaml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/CarWeightCategoryView.xaml.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/CarWeightCategoryView.xaml.cs
new file mode 100755
index 0000000..e814d42
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/CarWeightCategoryView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace ksBroadcastingTestClient.Autopilot
+{
+ ///
+ /// Interaction logic for CarWeightCategoryView.xaml
+ ///
+ public partial class CarWeightCategoryView : UserControl
+ {
+ public CarWeightCategoryView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/CarWeightCategoryViewModel.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/CarWeightCategoryViewModel.cs
new file mode 100755
index 0000000..5026513
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Autopilot/CarWeightCategoryViewModel.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ksBroadcastingTestClient.Autopilot
+{
+ public enum CarWeightCategoryEnum { Proximity, Pack, Position, FocusFast, FocusSlow, Pace }
+ public class CarWeightCategoryViewModel : KSObservableObject
+ {
+ public CarWeightCategoryEnum Category { get; }
+ public float RawValue { get => Get(); set => Set(value); }
+ public float WeightedValue { get => Get(); set => Set(value); }
+ public string Hint { get => Get(); set => Set(value); }
+
+ public CarWeightCategoryViewModel(CarWeightCategoryEnum category)
+ {
+ Category = category;
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/BroadcastingEventView.xaml b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/BroadcastingEventView.xaml
new file mode 100755
index 0000000..8e2c9e3
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/BroadcastingEventView.xaml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/BroadcastingEventView.xaml.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/BroadcastingEventView.xaml.cs
new file mode 100755
index 0000000..003b8e9
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/BroadcastingEventView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace ksBroadcastingTestClient.Broadcasting
+{
+ ///
+ /// Interaction logic for BroadcastingEventView.xaml
+ ///
+ public partial class BroadcastingEventView : UserControl
+ {
+ public BroadcastingEventView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/BroadcastingEventViewModel.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/BroadcastingEventViewModel.cs
new file mode 100755
index 0000000..573dbf2
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/BroadcastingEventViewModel.cs
@@ -0,0 +1,46 @@
+using ksBroadcastingNetwork.Structs;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ksBroadcastingTestClient.Broadcasting
+{
+ public class BroadcastingEventViewModel : KSObservableObject
+ {
+ public BroadcastingEvent Evt { get; }
+ public KSRelayCommand PlayReplayCommand { get; }
+
+ public BroadcastingEventViewModel(BroadcastingEvent evt, Action onHighlightReplayDelegate)
+ {
+ Evt = evt;
+ PlayReplayCommand = new KSRelayCommand((o) =>
+ {
+ float secondsBack = 5f;
+ float duration = 10f;
+ switch (Evt.Type)
+ {
+ case ksBroadcastingNetwork.BroadcastingCarEventType.GreenFlag:
+ secondsBack = 7f;
+ duration = 25f;
+ break;
+ case ksBroadcastingNetwork.BroadcastingCarEventType.PenaltyCommMsg:
+ secondsBack = 10f;
+ duration = 6f;
+ break;
+ case ksBroadcastingNetwork.BroadcastingCarEventType.Accident:
+ secondsBack = 10f;
+ duration = 10f;
+ break;
+ default:
+ break;
+ }
+
+ float requestedTime = Evt.TimeMs - (secondsBack * 1000);
+
+ onHighlightReplayDelegate(Evt, requestedTime, duration);
+ });
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/BroadcastingViewModel.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/BroadcastingViewModel.cs
new file mode 100755
index 0000000..31d9342
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/BroadcastingViewModel.cs
@@ -0,0 +1,149 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using ksBroadcastingNetwork;
+using ksBroadcastingNetwork.Structs;
+
+namespace ksBroadcastingTestClient.Broadcasting
+{
+ public class BroadcastingViewModel : KSObservableObject
+ {
+ public ObservableCollection Cars { get; } = new ObservableCollection();
+ public TrackViewModel TrackVM { get => Get(); private set => Set(value); }
+ public KSRelayCommand RequestFocusedCarCommand { get; }
+
+ private List _clients = new List();
+
+ public BroadcastingViewModel()
+ {
+ RequestFocusedCarCommand = new KSRelayCommand(RequestFocusedCar);
+ }
+
+ private void RequestFocusedCar(object obj)
+ {
+ var car = obj as CarViewModel;
+ if (car != null)
+ {
+ foreach (var client in _clients)
+ {
+ // mssing readonly check, will skip this as the ACC client has to handle this as well
+ client.SetFocus(Convert.ToUInt16(car.CarIndex));
+ }
+ }
+ }
+
+ private void RequestHudPageChange(string requestedHudPage)
+ {
+ foreach (var client in _clients)
+ {
+ // mssing readonly check, will skip this as the ACC client has to handle this as well
+ client.RequestHUDPage(requestedHudPage);
+ }
+ }
+
+ private void RequestCameraChange(string camSet, string camera)
+ {
+ foreach (var client in _clients)
+ {
+ // mssing readonly check, will skip this as the ACC client has to handle this as well
+ client.SetCamera(camSet, camera);
+ }
+ }
+
+ internal void RegisterNewClient(ACCUdpRemoteClient newClient)
+ {
+ if (newClient.MsRealtimeUpdateInterval > 0)
+ {
+ // This client will send realtime updates, we should listen
+ newClient.MessageHandler.OnTrackDataUpdate += MessageHandler_OnTrackDataUpdate;
+ newClient.MessageHandler.OnEntrylistUpdate += MessageHandler_OnEntrylistUpdate;
+ newClient.MessageHandler.OnRealtimeUpdate += MessageHandler_OnRealtimeUpdate;
+ newClient.MessageHandler.OnRealtimeCarUpdate += MessageHandler_OnRealtimeCarUpdate;
+ }
+
+ _clients.Add(newClient.MessageHandler);
+ }
+
+ private void MessageHandler_OnTrackDataUpdate(string sender, TrackData trackUpdate)
+ {
+ if (TrackVM?.TrackId != trackUpdate.TrackId)
+ {
+ if (TrackVM != null)
+ {
+ TrackVM.OnRequestCameraChange -= RequestCameraChange;
+ TrackVM.OnRequestHudPageChange -= RequestHudPageChange;
+ }
+
+
+ TrackVM = new TrackViewModel(trackUpdate.TrackId, trackUpdate.TrackName, trackUpdate.TrackMeters);
+ TrackVM.OnRequestCameraChange += RequestCameraChange;
+ TrackVM.OnRequestHudPageChange += RequestHudPageChange;
+ }
+
+ // The track cams may update in between
+ TrackVM.Update(trackUpdate);
+ }
+
+ private void MessageHandler_OnEntrylistUpdate(string sender, CarInfo carUpdate)
+ {
+ CarViewModel vm = Cars.SingleOrDefault(x => x.CarIndex == carUpdate.CarIndex);
+ if (vm == null)
+ {
+ vm = new CarViewModel(carUpdate.CarIndex);
+ Cars.Add(vm);
+ }
+
+ vm.Update(carUpdate);
+ }
+
+ private void MessageHandler_OnRealtimeUpdate(string sender, RealtimeUpdate update)
+ {
+ if (TrackVM != null)
+ TrackVM.Update(update);
+
+ foreach (var carVM in Cars)
+ {
+ carVM.SetFocused(update.FocusedCarIndex);
+ }
+
+ try
+ {
+ if (TrackVM?.TrackMeters > 0)
+ {
+ var sortedCars = Cars.OrderBy(x => x.SplinePosition).ToArray();
+ for (int i = 1; i < sortedCars.Length; i++)
+ {
+ var carAhead = sortedCars[i - 1];
+ var carBehind = sortedCars[i];
+ var splineDistance = Math.Abs(carAhead.SplinePosition - carBehind.SplinePosition);
+ while (splineDistance > 1f)
+ splineDistance -= 1f;
+
+ carBehind.GapFrontMeters = splineDistance * TrackVM.TrackMeters;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Debug.WriteLine(ex.Message);
+ }
+ }
+
+ private void MessageHandler_OnRealtimeCarUpdate(string sender, RealtimeCarUpdate carUpdate)
+ {
+ var vm = Cars.FirstOrDefault(x => x.CarIndex == carUpdate.CarIndex);
+ if (vm == null)
+ {
+ // Oh, we don't have this car yet. In this implementation, the Network protocol will take care of this
+ // so hopefully we will display this car in the next cycles
+ return;
+ }
+
+ vm.Update(carUpdate);
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/CameraSetViewModel.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/CameraSetViewModel.cs
new file mode 100755
index 0000000..e9ad347
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/CameraSetViewModel.cs
@@ -0,0 +1,67 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media;
+
+namespace ksBroadcastingTestClient.Broadcasting
+{
+ public class CameraSetViewModel : KSObservableObject
+ {
+ public string CameraSetName { get; }
+ public ObservableCollection Cameras { get; } = new ObservableCollection();
+
+ public Brush CamsetForeground { get => Get(); private set => Set(value); }
+ public Brush CamsetBackground { get => Get(); private set => Set(value); }
+
+ public CameraSetViewModel(string camSetName)
+ {
+ CameraSetName = camSetName;
+ SetActive("nope", "nope");
+ }
+
+ public void SetActive(string camSet, string camera)
+ {
+ var isActive = CameraSetName == camSet;
+ if(isActive)
+ {
+ CamsetForeground = Brushes.Yellow;
+ CamsetBackground = Brushes.Black;
+ }
+ else
+ {
+ CamsetForeground = Brushes.Black;
+ CamsetBackground = null;
+ }
+
+ foreach (var item in Cameras)
+ item.SetActive(isActive, camera);
+ }
+
+ internal void Update(List cameraNames)
+ {
+ foreach (var cameraUpdateName in cameraNames)
+ {
+ var camVM = Cameras.SingleOrDefault(x => x.CameraName == cameraUpdateName);
+ if (camVM == null)
+ {
+ camVM = new CameraViewModel(CameraSetName, cameraUpdateName);
+ Cameras.Add(camVM);
+ }
+ }
+
+ // Now we check if we have to remove one of our cameras
+ var toRemove = new List();
+ foreach (var camVM in Cameras)
+ {
+ if (!cameraNames.Contains(camVM.CameraName))
+ toRemove.Add(camVM);
+ }
+
+ foreach (var item in toRemove)
+ Cameras.Remove(item);
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/CameraViewModel.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/CameraViewModel.cs
new file mode 100755
index 0000000..df73fa9
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/CameraViewModel.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Windows.Media;
+
+namespace ksBroadcastingTestClient.Broadcasting
+{
+ public class CameraViewModel : KSObservableObject
+ {
+ public string CameraSetName { get; }
+ public string CameraName { get; }
+ public Brush CameraForeground { get => Get(); private set => Set(value); }
+ public Brush CameraBackground { get => Get(); private set => Set(value); }
+
+
+ public CameraViewModel(string cameraSetName, string cameraName)
+ {
+ CameraSetName = cameraSetName;
+ CameraName = cameraName;
+ SetActive(false, "nope");
+ }
+
+ internal void SetActive(bool camSetActive, string activeCamera)
+ {
+ if (camSetActive && CameraName == activeCamera)
+ {
+ CameraForeground = Brushes.Black;
+ CameraBackground = Brushes.Yellow;
+ }
+ else
+ {
+ CameraForeground = Brushes.Black;
+ CameraBackground = null;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/CarViewModel.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/CarViewModel.cs
new file mode 100755
index 0000000..2319a31
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/CarViewModel.cs
@@ -0,0 +1,177 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media;
+using ksBroadcastingNetwork;
+using ksBroadcastingNetwork.Structs;
+
+namespace ksBroadcastingTestClient.Broadcasting
+{
+ public class CarViewModel : KSObservableObject
+ {
+ public int CarIndex { get; }
+ public int RaceNumber { get => Get(); private set => Set(value); }
+ public int CarModelEnum { get => Get(); private set => Set(value); }
+ public string TeamName { get => Get(); private set => Set(value); }
+ public int CupCategoryEnum { get => Get(); private set => Set(value); }
+ public DriverViewModel CurrentDriver { get => Get(); private set => Set(value); }
+
+ public IEnumerable InactiveDrivers { get { return Drivers.Where(x => x.DriverIndex != CurrentDriver?.DriverIndex); } }
+ public ObservableCollection Drivers { get; } = new ObservableCollection();
+
+ public CarLocationEnum CarLocation { get => Get(); private set => Set(value); }
+ public int Delta { get => Get(); private set => Set(value); }
+ public string DeltaString { get => Get(); private set => Set(value); }
+ public Brush DeltaColor { get => Get(); private set => Set(value); }
+ public int Gear { get => Get(); private set => Set(value); }
+ public int Kmh { get => Get(); private set => Set(value); }
+ public int Position { get => Get(); private set => Set(value); }
+ public int CupPosition { get => Get(); private set => Set(value); }
+ public int TrackPosition { get => Get(); private set => Set(value); }
+ public float SplinePosition { get => Get(); private set => Set(value); }
+ public float WorldX { get => Get(); private set => Set(value); }
+ public float WorldY { get => Get(); private set => Set(value); }
+ public float Yaw { get => Get(); private set => Set(value); }
+ public int Laps { get => Get(); private set => Set(value); }
+ public LapViewModel BestLap { get => Get(); private set => Set(value); }
+ public LapViewModel LastLap { get => Get(); private set => Set(value); }
+ public LapViewModel CurrentLap { get => Get(); private set => Set(value); }
+ public string LocationHint { get => Get(); private set => Set(value); }
+
+ public Brush RowForeground { get => Get(); private set => Set(value); }
+ public Brush RowBackground { get => Get(); private set => Set(value); }
+ public float GapFrontMeters { get => Get(); set
+ {
+ if(Set(value))
+ {
+ NotifyUpdate(nameof(GapText));
+ NotifyUpdate(nameof(GapColor));
+ }
+ }
+ }
+
+ public string GapText {
+ get {
+ if (Kmh < 10)
+ return "Gap: ---";
+ return $"Gap: {GapFrontMeters / Kmh * 3.6:F1}s ⇅";
+ }
+ }
+ public Brush GapColor {
+ get {
+ if (Kmh < 10)
+ return Brushes.Gray;
+ var seconds = GapFrontMeters / Kmh * 3.6;
+ if (seconds < 0.5)
+ return Brushes.Red;
+ if (seconds < 2.0)
+ return Brushes.DarkOrange;
+
+ return Brushes.Black;
+ }
+ }
+
+ public CarViewModel(ushort carIndex)
+ {
+ CarIndex = carIndex;
+ }
+
+ internal void Update(CarInfo carUpdate)
+ {
+ RaceNumber = carUpdate.RaceNumber;
+ CarModelEnum = carUpdate.CarModelType;
+ TeamName = carUpdate.TeamName;
+ CupCategoryEnum = carUpdate.CupCategory;
+
+ if(carUpdate.Drivers.Count != Drivers.Count)
+ {
+ Drivers.Clear();
+ int driverIndex = 0;
+ foreach(DriverInfo driver in carUpdate.Drivers)
+ {
+ Drivers.Add(new DriverViewModel(driver, driverIndex++));
+ }
+ NotifyUpdate(nameof(InactiveDrivers));
+ }
+ }
+
+ internal void Update(RealtimeCarUpdate carUpdate)
+ {
+ if (carUpdate.CarIndex != CarIndex)
+ {
+ System.Diagnostics.Debug.WriteLine($"Wrong {nameof(RealtimeCarUpdate)}.CarIndex {carUpdate.CarIndex} for {nameof(CarViewModel)}.CarIndex {CarIndex}");
+ return;
+ }
+
+ if (CurrentDriver?.DriverIndex != carUpdate.DriverIndex)
+ {
+ // The driver has changed!
+ CurrentDriver = Drivers.SingleOrDefault(x => x.DriverIndex == carUpdate.DriverIndex);
+ NotifyUpdate(nameof(InactiveDrivers));
+ }
+
+ CarLocation = carUpdate.CarLocation;
+ Delta = carUpdate.Delta;
+ DeltaString = $"{TimeSpan.FromMilliseconds(Delta):ss\\.f}";
+ if (Delta < -100)
+ DeltaColor = Brushes.Green;
+ else if (Delta > 100)
+ DeltaColor = Brushes.Red;
+ else
+ DeltaColor = null;
+
+ Gear = carUpdate.Gear;
+ Kmh = carUpdate.Kmh;
+ Position = carUpdate.Position;
+ CupPosition = carUpdate.CupPosition;
+ TrackPosition = carUpdate.TrackPosition;
+ SplinePosition = carUpdate.SplinePosition;
+ WorldX = carUpdate.WorldPosX;
+ WorldY = carUpdate.WorldPosY;
+ Yaw = carUpdate.Yaw;
+ Laps = carUpdate.Laps;
+
+ if(BestLap == null && carUpdate.BestSessionLap != null)
+ BestLap = new LapViewModel();
+ if (carUpdate.BestSessionLap != null)
+ BestLap.Update(carUpdate.BestSessionLap);
+
+ if (LastLap == null && carUpdate.LastLap != null)
+ LastLap = new LapViewModel();
+ if (carUpdate.LastLap != null)
+ LastLap.Update(carUpdate.LastLap);
+
+ if (CurrentLap == null && carUpdate.CurrentLap != null)
+ CurrentLap = new LapViewModel();
+ if (carUpdate.CurrentLap != null)
+ CurrentLap.Update(carUpdate.CurrentLap);
+
+ // The location hint will combine stuff like pits, in/outlap
+ if (CarLocation == CarLocationEnum.PitEntry)
+ LocationHint = "IN";
+ else if (CarLocation == CarLocationEnum.Pitlane)
+ LocationHint = "PIT";
+ else if (CarLocation == CarLocationEnum.PitExit)
+ LocationHint = "OUT";
+ else
+ LocationHint = CurrentLap?.LapHint;
+ }
+
+ internal void SetFocused(int focusedCarIndex)
+ {
+ if (CarIndex == focusedCarIndex)
+ {
+ RowForeground = Brushes.Yellow;
+ RowBackground = Brushes.Black;
+ }
+ else
+ {
+ RowForeground = Brushes.Black;
+ RowBackground = null;
+ }
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/EntryListView.xaml b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/EntryListView.xaml
new file mode 100755
index 0000000..53f061d
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/EntryListView.xaml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/EntryListView.xaml.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/EntryListView.xaml.cs
new file mode 100755
index 0000000..bb0de9b
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/EntryListView.xaml.cs
@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+
+namespace ksBroadcastingTestClient.Broadcasting
+{
+ ///
+ /// Interaction logic for EntryListView.xaml
+ ///
+ public partial class EntryListView : UserControl
+ {
+ public EntryListView()
+ {
+ InitializeComponent();
+
+ AutorefreshSorting();
+ }
+
+ ///
+ /// Just a lazy hack to have the EntryList always sorted by position
+ ///
+ private async void AutorefreshSorting()
+ {
+ var sorter = FindResource("src") as CollectionViewSource;
+
+ while (sorter != null)
+ {
+ sorter?.View?.Refresh();
+ await Task.Delay(1000);
+ }
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/HudPageViewModel.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/HudPageViewModel.cs
new file mode 100755
index 0000000..c10150f
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/HudPageViewModel.cs
@@ -0,0 +1,30 @@
+using System.Windows.Media;
+
+namespace ksBroadcastingTestClient.Broadcasting
+{
+ public class HudPageViewModel : KSObservableObject
+ {
+ public string Caption { get; }
+ public Brush HudPageForeground { get => Get(); private set => Set(value); }
+ public Brush HudPageBackground { get => Get(); private set => Set(value); }
+
+ public HudPageViewModel(string hudPageCaption)
+ {
+ Caption = hudPageCaption;
+ }
+
+ public void SetActive(string activeHudPage)
+ {
+ if(Caption == activeHudPage)
+ {
+ HudPageForeground = Brushes.Black;
+ HudPageBackground = Brushes.Yellow;
+ }
+ else
+ {
+ HudPageForeground = Brushes.Black;
+ HudPageBackground = null;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/LapViewModel.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/LapViewModel.cs
new file mode 100755
index 0000000..6b76342
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/LapViewModel.cs
@@ -0,0 +1,74 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media;
+using ksBroadcastingNetwork;
+using ksBroadcastingNetwork.Structs;
+
+namespace ksBroadcastingTestClient.Broadcasting
+{
+ public class LapViewModel : KSObservableObject
+ {
+ public int? LaptimeMS { get => Get(); private set => Set(value); }
+ public string LaptimeString { get => Get(); private set => Set(value); }
+ public int? Split1MS { get => Get(); private set => Set(value); }
+ public string Split1String { get => Get(); private set => Set(value); }
+ public int? Split2MS { get => Get(); private set => Set(value); }
+ public string Split2String { get => Get(); private set => Set(value); }
+ public int? Split3MS { get => Get(); private set => Set(value); }
+ public string Split3String { get => Get(); private set => Set(value); }
+
+ public LapType Type { get => Get(); private set => Set(value); }
+ public bool IsValid { get => Get(); private set => Set(value); }
+ public Brush LaptimeColor { get => Get(); private set => Set(value); }
+ public string LapHint { get => Get(); private set => Set(value); }
+
+ internal void Update(LapInfo lapUpdate)
+ {
+ var isChanged = LaptimeMS != lapUpdate.LaptimeMS;
+ if (isChanged)
+ {
+ LaptimeMS = lapUpdate.LaptimeMS;
+ if (LaptimeMS == null)
+ LaptimeString = "--";
+ else
+ LaptimeString = $"{TimeSpan.FromMilliseconds(LaptimeMS.Value):mm\\:ss\\.fff}";
+
+ Split1MS = lapUpdate.Splits.FirstOrDefault();
+ if (Split1MS != null)
+ Split1String = $"{TimeSpan.FromMilliseconds(Split1MS.Value):ss\\.f}";
+ else
+ Split1String = "";
+
+ Split2MS = lapUpdate.Splits.Skip(1).FirstOrDefault();
+ if (Split2MS != null)
+ Split2String = $"{TimeSpan.FromMilliseconds(Split2MS.Value):ss\\.f}";
+ else
+ Split2String = "";
+
+ Split3MS = lapUpdate.Splits.Skip(2).FirstOrDefault();
+ if (Split3MS != null)
+ Split3String = $"{TimeSpan.FromMilliseconds(Split3MS.Value):ss\\.f}";
+ else
+ Split3String = "";
+
+ Type = lapUpdate.Type;
+ IsValid = lapUpdate.IsValidForBest;
+
+ if (!IsValid)
+ LaptimeColor = Brushes.Red;
+ else
+ LaptimeColor = null; // will use default
+
+ if (Type == LapType.Outlap)
+ LapHint = "OUT";
+ else if (Type == LapType.Inlap)
+ LapHint = "IN";
+ else
+ LapHint = "";
+ }
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/LiveTimingCarView.xaml b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/LiveTimingCarView.xaml
new file mode 100755
index 0000000..b56880d
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/LiveTimingCarView.xaml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/LiveTimingCarView.xaml.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/LiveTimingCarView.xaml.cs
new file mode 100755
index 0000000..80f8e9e
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/LiveTimingCarView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace ksBroadcastingTestClient.Broadcasting
+{
+ ///
+ /// Interaction logic for LiveTimingCarView.xaml
+ ///
+ public partial class LiveTimingCarView : UserControl
+ {
+ public LiveTimingCarView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/LiveTimingCarViewModel.xaml b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/LiveTimingCarViewModel.xaml
new file mode 100755
index 0000000..7262fff
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/LiveTimingCarViewModel.xaml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/LiveTimingCarViewModel.xaml.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/LiveTimingCarViewModel.xaml.cs
new file mode 100755
index 0000000..86b04d1
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/LiveTimingCarViewModel.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace ksBroadcastingTestClient.Broadcasting
+{
+ ///
+ /// Interaction logic for LiveTimingCarViewModel.xaml
+ ///
+ public partial class LiveTimingCarViewModel : UserControl
+ {
+ public LiveTimingCarViewModel()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/ReplayControlView.xaml b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/ReplayControlView.xaml
new file mode 100755
index 0000000..4e6042c
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/ReplayControlView.xaml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/ReplayControlView.xaml.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/ReplayControlView.xaml.cs
new file mode 100755
index 0000000..1e66967
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/ReplayControlView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace ksBroadcastingTestClient.Broadcasting
+{
+ ///
+ /// Interaction logic for ReplayControlView.xaml
+ ///
+ public partial class ReplayControlView : UserControl
+ {
+ public ReplayControlView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/ReplayControlViewModel.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/ReplayControlViewModel.cs
new file mode 100755
index 0000000..db304d7
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/ReplayControlViewModel.cs
@@ -0,0 +1,88 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using ksBroadcastingNetwork;
+using ksBroadcastingNetwork.Structs;
+
+namespace ksBroadcastingTestClient.Broadcasting
+{
+ public class ReplayControlViewModel : KSObservableObject
+ {
+ public KSRelayCommand PlayLiveReplay { get; }
+ public int LiveReplaySecondsBack { get => Get(); private set => Set(value); }
+ public int LiveReplaySecondsPlaytime { get => Get(); private set => Set(value); }
+ public int CurrentSessionTime { get => Get(); private set => Set(value); }
+
+ private List _clients = new List();
+ public ObservableCollection BroadcastingEvents { get; } = new ObservableCollection();
+
+ public ReplayControlViewModel()
+ {
+ PlayLiveReplay = new KSRelayCommand(OnLiveReplay);
+ LiveReplaySecondsBack = 120;
+ LiveReplaySecondsPlaytime = 10;
+ }
+
+ private void OnHighlightReplay(BroadcastingEvent evt, float requestedStartTime, float durationSeconds)
+ {
+ try
+ {
+ foreach (var client in _clients)
+ {
+ client.MessageHandler.RequestInstantReplay(requestedStartTime, durationSeconds * 1000.0f, evt.CarId);
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(ex);
+ }
+ }
+
+ private void OnLiveReplay(object obj)
+ {
+ try
+ {
+ var secondsBack = Convert.ToInt32(obj);
+ var requestedStartTime = CurrentSessionTime - (secondsBack * 1000);
+
+ foreach (var client in _clients)
+ {
+ client.MessageHandler.RequestInstantReplay(requestedStartTime, secondsBack * 1000.0f);
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(ex);
+ }
+ }
+
+ internal void RegisterNewClient(ACCUdpRemoteClient newClient)
+ {
+ newClient.MessageHandler.OnRealtimeUpdate += MessageHandler_OnRealtimeUpdate;
+ newClient.MessageHandler.OnBroadcastingEvent += MessageHandler_OnBroadcastingEvent;
+ _clients.Add(newClient);
+ }
+
+ private void MessageHandler_OnRealtimeUpdate(string sender, ksBroadcastingNetwork.Structs.RealtimeUpdate update)
+ {
+ CurrentSessionTime = Convert.ToInt32(update.SessionTime.TotalMilliseconds);
+ }
+
+ private void MessageHandler_OnBroadcastingEvent(string sender, BroadcastingEvent evt)
+ {
+ if (evt.Type == BroadcastingCarEventType.LapCompleted)
+ // this is a bit spammy
+ return;
+
+ BroadcastingEvents.Insert(0, new BroadcastingEventViewModel(evt, OnHighlightReplay));
+
+ while(BroadcastingEvents.Count > 30)
+ {
+ BroadcastingEvents.Remove(BroadcastingEvents.Last());
+ }
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/SessionInfoView.xaml b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/SessionInfoView.xaml
new file mode 100755
index 0000000..d2f7456
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/SessionInfoView.xaml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/SessionInfoView.xaml.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/SessionInfoView.xaml.cs
new file mode 100755
index 0000000..85e8f4d
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/SessionInfoView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace ksBroadcastingTestClient.Broadcasting
+{
+ ///
+ /// Interaction logic for SessionInfoView.xaml
+ ///
+ public partial class SessionInfoView : UserControl
+ {
+ public SessionInfoView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/SessionInfoViewModel.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/SessionInfoViewModel.cs
new file mode 100755
index 0000000..578b2b7
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/SessionInfoViewModel.cs
@@ -0,0 +1,86 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using ksBroadcastingNetwork;
+using ksBroadcastingNetwork.Structs;
+
+namespace ksBroadcastingTestClient.Broadcasting
+{
+ public class SessionInfoViewModel : KSObservableObject
+ {
+ public TimeSpan SessionTime { get => Get(); private set => Set(value); }
+ public string SessionTimeDisplay { get => Get(); private set => Set(value); }
+ public string RemainingTime { get => Get(); private set => Set(value); }
+ public string TrackDisplayName { get => Get(); private set => Set(value); }
+ public SessionPhase Phase { get => Get(); private set => Set(value); }
+ public RaceSessionType SessionType { get => Get(); private set => Set(value); }
+
+ public string TimeOfDayInfo { get => Get(); private set => Set(value); }
+ public string TempInfo { get => Get(); private set => Set(value); }
+ public string RainInfo { get => Get(); private set => Set(value); }
+ public string CloudInfo { get => Get(); private set => Set(value); }
+
+ internal void RegisterNewClient(ACCUdpRemoteClient newClient)
+ {
+ if (newClient.MsRealtimeUpdateInterval > 0)
+ {
+ // This client will send realtime updates, we should listen
+ newClient.MessageHandler.OnTrackDataUpdate += MessageHandler_OnTrackDataUpdate;
+ newClient.MessageHandler.OnRealtimeUpdate += MessageHandler_OnRealtimeUpdate;
+ }
+ }
+
+ private void MessageHandler_OnRealtimeUpdate(string sender, RealtimeUpdate update)
+ {
+ SessionTime = update.SessionTime;
+ SessionTimeDisplay = SessionTime.ToString("hh\\:mm\\:ss");
+ if(update.SessionEndTime.TotalMilliseconds < 0)
+ {
+ RemainingTime = "∞";
+ }
+ else
+ {
+ var remaining = update.SessionEndTime - update.SessionTime;
+
+ if (update.SessionTime.TotalMilliseconds < 0)
+ RemainingTime = "00:00";
+ else if (remaining.TotalHours > 2)
+ RemainingTime = $"{remaining.TotalHours:F0}h";
+ else if (remaining.TotalMinutes > 60)
+ RemainingTime = $"{remaining.TotalMinutes:F0}m";
+ else
+ RemainingTime = $"{remaining.TotalMinutes:2,F0}:{remaining.Seconds,2}";
+ }
+
+ Phase = update.Phase;
+ SessionType = update.SessionType;
+
+ TimeOfDayInfo = update.TimeOfDay.ToString("hh\\:mm");
+
+ if (update.Clouds < 0.2)
+ CloudInfo = "Sunny";
+ else if (update.Clouds < 0.40)
+ CloudInfo = "Light clouds";
+ else if(update.Clouds < 0.65)
+ CloudInfo = "Cloudy";
+ else
+ CloudInfo = "World's end";
+
+ TempInfo = $"{CloudInfo} {update.AmbientTemp} °C - Track {update.TrackTemp} °C";
+
+
+ if (update.RainLevel < 0.1 && update.Wetness < 0.1)
+ RainInfo = $"Clear";
+ else
+ RainInfo = $"{update.RainLevel:P0} rain, {update.Wetness:P0} wet";
+
+ }
+
+ private void MessageHandler_OnTrackDataUpdate(string sender, TrackData trackUpdate)
+ {
+ TrackDisplayName = trackUpdate.TrackName;
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/TrackCameraView.xaml b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/TrackCameraView.xaml
new file mode 100755
index 0000000..3b9afa1
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/TrackCameraView.xaml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/TrackCameraView.xaml.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/TrackCameraView.xaml.cs
new file mode 100755
index 0000000..55c6aa5
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/TrackCameraView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace ksBroadcastingTestClient.Broadcasting
+{
+ ///
+ /// Interaction logic for TrackCameraView.xaml
+ ///
+ public partial class TrackCameraView : UserControl
+ {
+ public TrackCameraView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/TrackViewModel.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/TrackViewModel.cs
new file mode 100755
index 0000000..23311a7
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/Broadcasting/TrackViewModel.cs
@@ -0,0 +1,102 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using ksBroadcastingNetwork.Structs;
+
+namespace ksBroadcastingTestClient.Broadcasting
+{
+ public class TrackViewModel : KSObservableObject
+ {
+ public int TrackId { get; }
+ public float TrackMeters { get; }
+ public string TrackName { get; }
+
+ public ObservableCollection CameraSets { get; } = new ObservableCollection();
+ public KSRelayCommand RequestCameraSwitchCommand { get; }
+ public KSRelayCommand RequestHudSwitchCommand { get;}
+
+ public ObservableCollection HudPages { get; } = new ObservableCollection();
+
+ public delegate void RequestCameraChangeDelegate(string camSet, string camera);
+ public event RequestCameraChangeDelegate OnRequestCameraChange;
+
+ public delegate void RequestHudChangeDelegate(string requestedHudPage);
+ public event RequestHudChangeDelegate OnRequestHudPageChange;
+
+ public TrackViewModel(int trackId, string trackName, float trackMeters)
+ {
+ TrackId = trackId;
+ TrackName = trackName;
+ TrackMeters = trackMeters;
+
+ RequestCameraSwitchCommand = new KSRelayCommand(RequestCameraSwitch);
+ RequestHudSwitchCommand = new KSRelayCommand(RequestHudPageSwitch);
+ }
+
+ private void RequestHudPageSwitch(object obj)
+ {
+ var hudPageVM = obj as HudPageViewModel;
+ if (hudPageVM != null)
+ OnRequestHudPageChange?.Invoke(hudPageVM.Caption);
+ }
+
+ private void RequestCameraSwitch(object obj)
+ {
+ var cameraVM = obj as CameraViewModel;
+ if(cameraVM != null)
+ OnRequestCameraChange?.Invoke(cameraVM.CameraSetName, cameraVM.CameraName);
+ }
+
+ internal void Update(TrackData trackUpdate)
+ {
+ foreach (var camSetUpdate in trackUpdate.CameraSets)
+ {
+ var camSetVM = CameraSets.SingleOrDefault(x => x.CameraSetName == camSetUpdate.Key);
+ if(camSetVM == null)
+ {
+ camSetVM = new CameraSetViewModel(camSetUpdate.Key);
+ CameraSets.Add(camSetVM);
+ }
+
+ camSetVM.Update(camSetUpdate.Value);
+ }
+
+ // Now we check if we have to remove one of our cam sets
+ var toRemove = new List();
+ foreach (var camSetVM in CameraSets)
+ {
+ if (!trackUpdate.CameraSets.ContainsKey(camSetVM.CameraSetName))
+ toRemove.Add(camSetVM);
+ }
+
+ foreach (var item in toRemove)
+ CameraSets.Remove(item);
+
+
+ // The same (but 1d) for the HUD pages
+ foreach (var hudPageCaption in trackUpdate.HUDPages)
+ {
+ var hudPageVM = HudPages.SingleOrDefault(x => x.Caption == hudPageCaption);
+ if(hudPageVM == null)
+ {
+ hudPageVM = new HudPageViewModel(hudPageCaption);
+ HudPages.Add(hudPageVM);
+ }
+ }
+ }
+
+ internal void Update(RealtimeUpdate update)
+ {
+ foreach (var camSet in CameraSets)
+ camSet.SetActive(update.ActiveCameraSet, update.ActiveCamera);
+
+ foreach (var hudPage in HudPages)
+ {
+ hudPage.SetActive(update.CurrentHudPage);
+ }
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/ClientConnections/ClientConnectionView.xaml b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/ClientConnections/ClientConnectionView.xaml
new file mode 100755
index 0000000..84b0132
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/ClientConnections/ClientConnectionView.xaml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/ClientConnections/ClientConnectionView.xaml.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/ClientConnections/ClientConnectionView.xaml.cs
new file mode 100755
index 0000000..e29ec83
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/ClientConnections/ClientConnectionView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace ksBroadcastingTestClient.ClientConnections
+{
+ ///
+ /// Interaction logic for ClientConnectionViewModel.xaml
+ ///
+ public partial class ClientConnectionView : UserControl
+ {
+ public ClientConnectionView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/ClientConnections/ClientConnectionViewModel.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/ClientConnections/ClientConnectionViewModel.cs
new file mode 100755
index 0000000..549937d
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/ClientConnections/ClientConnectionViewModel.cs
@@ -0,0 +1,41 @@
+using System;
+using ksBroadcastingNetwork;
+
+namespace ksBroadcastingTestClient.ClientConnections
+{
+ public class ClientConnectionViewModel : KSObservableObject
+ {
+ public string IPort => Client.IpPort;
+ public ACCUdpRemoteClient Client { get; }
+ public Action OnClientConnectedCallback { get; }
+ public int ConnectionId { get => Get(); set => Set(value); }
+ public bool Connected { get => Get(); set => Set(value); }
+ public bool IsReadonly { get => Get(); set => Set(value); }
+ public string ErrorMessage { get => Get(); set => Set(value); }
+
+ public ClientConnectionViewModel(ACCUdpRemoteClient c, Action onClientConnectedCallback)
+ {
+ Client = c;
+ OnClientConnectedCallback = onClientConnectedCallback;
+ c.MessageHandler.OnConnectionStateChanged += ConnectionStateChanged;
+ }
+
+ private void ConnectionStateChanged(int connectionId, bool connectionSuccess, bool isReadonly, string error)
+ {
+ ConnectionId = connectionId;
+ Connected = connectionSuccess;
+ IsReadonly = IsReadonly;
+ ErrorMessage = error;
+
+ if (Connected)
+ OnClientConnectedCallback?.Invoke(Client);
+
+ }
+
+ public void Disconnect()
+ {
+ Client.MessageHandler.OnConnectionStateChanged -= ConnectionStateChanged;
+ Client.Shutdown();
+ }
+ }
+}
\ No newline at end of file
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/ClientConnections/ClientPanelView.xaml b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/ClientConnections/ClientPanelView.xaml
new file mode 100755
index 0000000..4eb3caa
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/ClientConnections/ClientPanelView.xaml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/ClientConnections/ClientPanelView.xaml.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/ClientConnections/ClientPanelView.xaml.cs
new file mode 100755
index 0000000..df0a085
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/ClientConnections/ClientPanelView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace ksBroadcastingTestClient.ClientConnections
+{
+ ///
+ /// Interaction logic for ClientPanel.xaml
+ ///
+ public partial class ClientPanel : UserControl
+ {
+ public ClientPanel()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/ClientConnections/ClientPanelViewModel.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/ClientConnections/ClientPanelViewModel.cs
new file mode 100755
index 0000000..d3db692
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/ClientConnections/ClientPanelViewModel.cs
@@ -0,0 +1,65 @@
+using ksBroadcastingNetwork;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ksBroadcastingTestClient.ClientConnections
+{
+ public class ClientPanelViewModel : KSObservableObject
+ {
+ public string IP { get => Get(); set => Set(value); }
+ public int Port { get => Get(); set => Set(value); }
+ public string DisplayName { get => Get(); set => Set(value); }
+ public string ConnectionPw { get => Get(); set => Set(value); }
+ public string CommandPw { get => Get(); set => Set(value); }
+ public int RealtimeUpdateIntervalMS { get => Get(); set => Set(value); }
+ public KSRelayCommand ConnectCmd { get; }
+ public KSRelayCommand DisconnectCmd { get; }
+
+ public ObservableCollection Clients { get; } = new ObservableCollection();
+ public Action OnClientConnectedCallback { get; }
+ public ClientConnectionViewModel SelectedClient { get => Get(); set => Set(value); }
+
+ public ClientPanelViewModel(Action onClientConnectedCallback)
+ {
+ ConnectCmd = new KSRelayCommand(DoConnect);
+ DisconnectCmd = new KSRelayCommand(DoDisconnect);
+
+ IP = "127.0.0.1";
+ Port = 9000;
+ DisplayName = "Your name";
+ ConnectionPw = "asd";
+ CommandPw = "";
+ RealtimeUpdateIntervalMS = 250;
+ OnClientConnectedCallback = onClientConnectedCallback;
+ }
+
+ public void DoConnect(object parameter = null)
+ {
+ var c = new ACCUdpRemoteClient(IP, Port, DisplayName, ConnectionPw, CommandPw, RealtimeUpdateIntervalMS);
+ Clients.Add(new ClientConnectionViewModel(c, OnClientConnectedCallback));
+ }
+
+ private void DoDisconnect(object obj)
+ {
+ if(SelectedClient != null)
+ {
+ SelectedClient.Disconnect();
+ Clients.Remove(SelectedClient);
+ SelectedClient = null;
+ }
+ }
+
+ internal void Shutdown()
+ {
+ foreach (var client in Clients)
+ {
+ client.Disconnect();
+ }
+ Clients.Clear();
+ }
+ }
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/KSObservableObject.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/KSObservableObject.cs
new file mode 100755
index 0000000..2706620
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/KSObservableObject.cs
@@ -0,0 +1,58 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ksBroadcastingTestClient
+{
+ ///
+ /// Just a cheap implementation of Viewmodels with auto-update capabilities - the laziest way to get this testclient doing it's job
+ ///
+ public abstract class KSObservableObject : INotifyPropertyChanged
+ {
+ #region Notification handling
+
+ private Dictionary _propertyDict = new Dictionary();
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ protected bool Set(T value, [CallerMemberName] string propertyName = null)
+ {
+ bool hasChanged = false;
+ if (!_propertyDict.ContainsKey(propertyName))
+ {
+ _propertyDict.Add(propertyName, value);
+ hasChanged = true;
+ }
+ else
+ {
+ hasChanged = !object.Equals(_propertyDict[propertyName], value);
+ _propertyDict[propertyName] = value;
+ }
+
+ if (hasChanged)
+ {
+ NotifyUpdate(propertyName);
+ }
+
+ return hasChanged;
+ }
+
+ protected void NotifyUpdate(string propertyName)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+
+ protected T Get([CallerMemberName] string propertyName = null)
+ {
+ if (!_propertyDict.ContainsKey(propertyName))
+ return default(T);
+ return (T)_propertyDict[propertyName];
+ }
+ #endregion
+ }
+
+}
diff --git a/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/KSRelayCommand.cs b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/KSRelayCommand.cs
new file mode 100755
index 0000000..609f42c
--- /dev/null
+++ b/acc-web/accserver/sdk/broadcasting/Sources/ksBroadcastingTestClient/KSRelayCommand.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Input;
+
+namespace ksBroadcastingTestClient
+{
+ public class KSRelayCommand : ICommand
+ {
+ private Action