New Adjust FOV and squeese option improving the look of mirrors at grazing angles (enabled by default);
New Accurate option for correct mirrors projection;
A new tweak showing driver visor with high quality mirrors disabled, enabled by default;
OpenRGB integration replaced with a new RGB Control app available on App Shelf, with extended customization possibilities and its own Exchange platform to share presets;
CSP will try and track abrupt reportless crashes on subsequent launches, pointing out a crash report generated by Windows;
New menu:
Telemetry tab is recreated as well;
Ctrl+Tab to switch between tabs;
New option to hide pit crew of remote players only;
New tweak in GUI opening setup menu instead of session details when using those system bindings.
Fully dynamic pits option stopping cars with axles from moving fixed;
Crashes caused by binding turbo, glance and such to D-pads fixed (regression in 0.2.9);
CSP previews generation fixed;
Recent AC logging rewrite fixed, no longer causes AC to collapse when trying to output long strings;
Option to hide pit crew fully is working online;
Occasional dead freeze during loading fixed;
Autopilot no longer drivers into a wall on a session restart, if the car was in pits before that (and, in general, AIs will switch active pitlane on teleports again based on where they’re ending up);
Cars with missing soundbanks should still detect when camera is inside the car (for example, helps windscreen raindrops);
New KN5 loader reports missing DLCs properly again;
A bunch of bugs with advanced online features on servers with more than 127 cars caused by CSP mistakenly treating session ID as signed fixed;
Extra FX: TAA misbehaving on grass (or in other areas with color below 0) fixed;
New trees:
Tree definitions are reused when reloading settings and cache some things a bit more intensely, fixing memory leaks and performance issues when using Tree Planter app;
Sun shadows are a lot smoother, self-shadowing reduced;
Shadows and billboads of trees with width above 100% should look better;
Ambient shadow is much smaller and more subtle (for large-scale shadows, please use VAO);
New menu:
Holding Alt to drag mirrored sliders fixed (regression in 0.2.9);
Welcome message closes when clicked outside of popup as well;
Exporting lap times as CSV is working (previously was generating an empty CSV);
Sorting by indices fixed;
Voting cooldown no longer applies to kick vote, for both new menu and Lua apps API;
New car inputs: AUTO_SHIFTING, MANUAL_SPEED_LIMITER;
Emissive shaders, such as smGlass_emissive, are compatible with mask pass;
New [_EXTENSION] FORCE_DOUBLESIDED_RAYCASTS=1 for surfaces.ini allowing tracks to enable double-sided raycasts for cars without extended physics (recent fix of that messed up some of the tracks);
Custom AI:
New .v1 struct for car control allowing to set extra grip, stabilizer and custom ABS logic;
New field for activating or disabling input smoothing;
New [DEV] DISABLE_AI_SMOOTH_STEERING disabling smoothing for Kunos AIs entirely, for debugging purposes.
New fields: ac.getCar().anyFlamesActive, ac.getSim().bestLapTimeMs (global best time), ac.getSim().isMouseSteeringActive, ac.getSim().originShift;
New math.simplex(): a better alternative to math.perlin();
New ac.areShapesColliding() allowing to quickly check a couple of shapes (geometric and car colliders) for an intersection;
New ac.getUnreadChatMessages() to get the number of unread chat messages;
New ac.getCarBlindSpot() returning the distance to the nearest cars in blind zones;
New event listeners ac.onLapCompleted(), ac.onTrackPhysicsObjectCarCollision() and ac.onCarColorChanged();
ac.areCarsColliding() function has been moved to Common API;
Functions web.get, web.post and such now allow to pin HTTPS certificate or access its fingerprint (matches SHA-256 fingerprint in Firefox);
web.load… functions loading remote assets can set headers and pin HTTPS certificate;
Functions math.saturate() and math.clamp() (as well as …N versions) got a major performance boost, math.clamp() can handle a case where one of the limits is a vector and another is a number (an old bug);
Function table.same() no longer malfunctions with false values in associative tables;
Pass 'deep' as a second parameter to table.clone() to make copies of vectors and colors as well;
Old functions ac.store() / ac.load() rewritten to be a bit more efficient;
ac.setHighBeams() works when binding is in held mode;
Updating friend status with ac.DriverTags() and ac.tagAsFriend() fixed;
ac.getSunAngle() updates online;
ac.getSim().timeMultipler is no longer zero online with WeatherFX conditions or a dynamic weather plugin (if time is actually moving);
UI:
ui.setNextItemIcon() works with ui.beginMenu();
Integrated tab bar: takes window settings button into account, style for the dropdown button updated;
New ui.beginPointSampler() / ui.endPointSampler() functions to swap IMGUI shader for the one using point sampler;
ui.keyboardButtonDown() works with sided buttons, such as left control;
Scene API:
Raycasting now takes ray length into account (except for AABB raycasting);
Raycasting with NanoRT acceleration returns correct local position, UV, etc., builds accelerating structures in background;
Removing nodes actively used by ExtraFX emissives shouldn’t crash AC;
Physics API:
New physics.setAIStopCounter() stopping AIs for some time;
physics.RigidBody: collision callback returns car index, if any;
IO:
io.load() releases file instantly, allowing to delete it after reading, for example;
io.recycle() fixed, actually recycles things now;
New io.findFile() returning an absolute file path to a file;
Background and physics workers now support relative and absolute paths as well (working script directory will still be the same as the parent’s one);
Workers kept alive by Lua Debug app still release the things they hold, such as event subscriptions, immediately;
os.runConsoleProcess(): new terminateWithScript = 'disposable' option can be used to get back an ac.Disposable instead, also, with that one set to false and previously undocumented assignJob it’s now possible to get a process to stay alive after AC has been closed;
io.extractFromZipAsync(): extra parameter for a crucial file to ensure full extraction (it’ll be extracted last with a different name and then renamed, so your code could simply check the file existance: as long as file is present, it means archive has been extracted in full);
web.loadRemoteAssets(): option to specify a crucial file name similar to io.extractFromZipAsync(), scripts with full I/O access no longer have file type restrictions, plus a bunch of fixes;
Lua apps:
New ac.restartApp();
ac.exportLapTimesToCSV() is working, got an optional argument to specify filename;
New Modes: use [TWEAKS] HIDE_PITCREW to hide pit crews entirely;
New functions in shared/sim/cars for getting and altering base wheel positions for remote cars;
ac.onOpenMainMenu() can be receive other types of pages, for example, when ac.tryToOpenRaceMenu() is called;
Lua Debug app:
Option to use point sampler when viewing Lua textures;
App now remembers the selected setting for rendering vectors across script reloads;
Docs for some functions and fields updated, Lua plugin by sumneko now properly understands types of CSP’s table. functions;
LuaJIT synced with upstream (there were some small fixes).