Remove OOC-Client commands that are already replaced by UI elements that are easily accessible.
Debatable if /save_case and /load_case should stay as they seem unused by most users/servers.
* Maintain backwards compatability with older servers.
Co-authored-by: oldmud0 <oldmud0@users.noreply.github.com>
* user configurable timestamp format
* fix label making the entire settings window move jankily
* add a dropdown for sane timestamp formats
* streamline adding options to log timestamp format
According to profiling results, arup_append was being called around 90k times (!!) because it had been placed in the inner for loop. That's (tracks * areas)^2. Yikes!
By using hash tables, the algorithmic complexity of the case-insensitive
lookup has been reduced from O(n * k) to amortized O(k), where n is the
number of files in each level and k is the number of directory levels
that need to be traversed.
This massively improves performance on Linux when loading characters,
especially when there are many missing characters, since it is no longer
necessary to scan the entire character folder repeatedly.
To pull this one off, a new class called VPath was created that denotes
"virtual" paths that can exist anywhere among the list of mount points.
It is functionally identical to QString, except that implicit conversion
between QString and VPath is not allowed. This makes it easy to spot
errors in path resolution at compile time, since get_real_path must be
called to resolve a VPath into an absolute path that can be passed into
a Qt function as a QString.
Other functions, such as the get_*_suffix functions, also return an
absolute path QString for convenience.
As for the rest of the functions that return a VPath, you will need to
call get_real_path yourself.
Finally, a path resolution cache was added to try to avoid blowing
up what is already a massive lookup cost for assets. The cache
is invalidated when the mount path list is changed.
Currently, this cache isn't bounded. Might need to write an LRU cache
if issues arise.
Attempt Nr. 2 - Based on #548 and #501
+ Allows client to use a remote source as a last resort if the file can't be found locally.
+ Adds a check if the target file is missing.
This implementation assumed the streaming source to be structured like a webao content respository