When maps are loaded from folders on the server, the same folders were used for demos but recording would usually fail due to the folders not existing in the demos folder.
Furthermore, the map name being written in the demo header also included the folder names, which causes the client to not find the map unless it also exists at that location.
Closes#9033.
Store the current map filename (without path) separately when loading a new map instead of determining it again each time that the `CServer::GetMapName` function is called.
Use the `fs_filename` function for this.
Avoid the usage of the `sv_map` config variable for this, which may have caused the returned map filename to be out-of-sync with the real map on the server due to the map specified by the config variable not being reloaded immediately.
- Add `CTeeRenderInfo::ApplyColors` function to reduce duplicate code.
- Use `CTeeRenderInfo::Apply` function in more cases.
- Use `CSkins::Find` function instead of implementing default skin handling manually with the `FindOrNullptr` function for chat settings preview.
- Remove redundant initialization of `CTeeRenderInfo::m_CustomColoredSkin` member.
- Replace empty client skin with `default` instead of checking for empty skin names later.
- Remove unnecessary check for empty skin name for ghost rendering. The `CSkins::Find` function will return the default skin for an empty skin name, which is more correct than invalidating the ghost skin render info.
If the sql statement does not contain placeholders
``NumParameters`` can be empty.
In that case accessing the first element will cause an asan error:
```
runtime error: reference binding to null pointer of type 'st_mysql_bind'
```
Add constant to replace the magic number `24` used for the size of skin names. Skin names in the server info/browser were sized `24 + 1` but the additional byte was unnecessary.
This now shows less errors:
```
valgrind --tool=memcheck --gen-suppressions=all --suppressions=../memcheck.supp --leak-check=full --show-leak-kinds=all ./DDNet-Server
```
There are still 3 errors that might not be false positives.
See #8943
When the datafile is closed, only the `CDataFileReader::Open` and `CDataFileReader::Close` functions may be called. All other functions will now assert instead of returning some default-values if no file is open. The `CDataFileReader::Open` function will now assert if the file is already open instead of implicitly closing the previous one.