v2.0.33 patch
Clothing photos that are no longer black, and appearances that survive a restart on qs-core
6changes

Clothing photos that are no longer black, and appearances that survive a restart on qs-core
6changes

[02] Release
Two photo bugs are fixed. Capture did not hold the time of day, so photographing at night produced a near-black silhouette, and every frame was uploaded as it came — including an empty one taken before the garment had streamed in, which was then written over the shipped photo. Empty frames are now detected, retried and never saved, and the run reports what it rejected. On qs-core, appearances were stored where qs-core never reads them, so characters came back with no clothes after a restart; they are now saved to and loaded from qs-core, and older skins are found and carried across on the first load. The outfit tables are also created for you now, so there is no SQL left to import by hand.
clothing_player_outfits and clothing_job_outfits. They used to need importing by hand. If you already imported them nothing happens — they are only created when missing, and your rows are left alone.Config.ClothingAI is now Config.ClothingTagger. If you keep your own config/main.lua, rename the block or your settings for the catalogue labelling tool stop applying. It ships disabled and is development-only, so most servers can ignore this.Config.ImageSaver gained four options, all with working defaults: forceCaptureLighting, captureClockHour, captureWeather and captureMaxAttempts. Copy them in only if you want to change them.While a photo run is going, the script now holds the in-game clock at midday and the weather clear, and hands both back to your weather resource when the run ends. If you would rather manage that yourself, set forceCaptureLighting = false.
A photo that comes out empty is retried up to captureMaxAttempts times and, if it still fails, is thrown away instead of saved. At the end of the run the console prints one line per session saying how many were rejected and why — a garment the game could not stream, or a camera pointing away from the green screen.
If a previous run already overwrote good photos with black or empty ones, re-run the capture for those slots with "Skip already captured photos" turned off so the bad ones are replaced.
Replace every file in the resource, except what you edited yourself:
config/ — main.lua changed (the renamed tagger block and the four new capture options). If you edited it, port those over rather than overwriting your file.locales/ — all 41 languages changed, for the Auto Fill rename. Re-apply any translation you edited.client/, server/, custom/, shared/, web/ — replace them. server/modules/clothing_ai.lua is now clothing_tagger.lua, and server/providers/qs-core.lua is new; delete the old file so it does not load twice.sql/schema.sql, types.lua and fxmanifest.lua — replace them.clothing_player_outfits and clothing_job_outfits are part of the schema the resource installs on its first start, so there is no SQL left to import by hand for players to save outfits. Existing tables and rows are left untouched.
The tool that fills in catalogue labels, colours and names is now called the tagger throughout the interface, and its config block is Config.ClothingTagger instead of Config.ClothingAI. Behaviour is unchanged; it is still development-only and ships disabled.
Capture never fixed the time of day or the weather, so a run started at night produced a near-black silhouette for every garment. The clock is now held at midday and the weather clear for the whole session, and both are handed back to your weather resource afterwards. Set Config.ImageSaver.forceCaptureLighting to false if you would rather manage it yourself.
Every captured frame was uploaded and saved as it arrived, including an empty one taken before the garment had streamed in — and that empty photo was written over the shipped one in the catalogue. Empty frames are now detected, retried up to Config.ImageSaver.captureMaxAttempts times, and discarded rather than saved if they still fail. The run prints one line saying how many it rejected and why. If an earlier run already spoiled some photos, re-capture those slots with Skip already captured photos turned off.
On qs-core every character lives in qs-core's own players table, but the appearance was being written to users.skin or playerskins, which qs-core never reads back. After a restart the character returned with an empty skin. Saving now also goes to qs-core, and loading reads qs-core first. Skins saved before this fix are still found in the old tables and copied across the first time that character loads, so nothing is lost.
The list of supported cores was an unordered table, so a server running two of them picked a winner at random from one start to the next. It is now an ordered list: es_extended, then qb-core, then qbx_core.