First and foremost, a warning: this feature description is based on initial game research, and may not be implementable the way described here, or even worthwhile at all.
The current game configuration system is somewhat of a mess. There’s a global per-system
settings.xml (which does not change names based on the computer name, this is fun when you’ve set OneDrive to synchronize your Documents folder), there’s also an encrypted set of
pc_settings.bin (renamed to
fivem_set.bin in the past) as well as control override XML files if setting any controls.
On top of that, this system is not extensible for our purposes, can’t be controlled by script resources (and if it could, it’d be allowing archived settings to be overwritten), and we have a perfectly fine Quake-style console system that could be used for expanding upon this.
A good first step would be replacing the entire configuration persistence system (settings.xml and ‘profile settings’ such as the non-graphical options in the game settings menu) with a few convars bound to the raw setting structures. These would then be saved to a Quake-style
config.cfg file automatically by means of implementing the
For those unfamiliar with Quake, imagine a configuration file like this:
// just a snippet, not a full example seta video_screenWidth 1920 seta video_screenHeight 1080 seta graphics_tessellation 2 seta profile_displayGps false
These would effectively be toggleable using the console on the client, the classical game settings menu, as well as a new settings menu implemented in NUI, probably.
It’s the current plan to replace the game keyboard/mouse-button input system with a custom system also inspired by Quake binds. This is the part that has been researched the least, as the input system in GTA is a monstrous overcomplicated… thing.
For the time being, controllers are out of scope and would still be handled by the original GTA input code.
Similar to Quake, ideally, a few commands would exist bound to specific game controls, such as
+vehMoveLeftOnly, with accompanying
- versions as well.
These would then be bound using a
bind command, which would also persist to configuration:
bind "r" "+reload" bind "v" "+nextCamera" # this is a good one to wonder about, should this be multiple bind commands? # should ; splitting be implemented for +/- detection? # should we implement +vstr? bind "a" "+vehMoveLeftOnly; +moveLeftOnly"
A frontend for these bindings will also exist, preferably keeping the existing game binding menu in place.
Of course, bindings in Quake don’t necessarily have to be directly related to a specific input. See these examples of things that would be possible for users to easily do:
Automating a menu
seta openMenu "+interactionMenu; wait 5; -interactionMenu" seta menuDown "+cellphoneDown; wait 5; -cellphoneDown" seta menuEnter "+cellphoneSelect; wait 5; -cellphoneSelect" bind "f5" "vstr openMenu; vstr menuDown; vstr menuDown; vstr menuEnter; vstr menuDown; vstr menuEnter"
Executing specific commands
bind w "+moveUpOnly; say I'm walking forward, watch out!" bind numMultiply "ooc pls help me i dont like rp"
Toggle toggle there’s a toggle
# holding f3 would disable the HUD option in game settings temporarily seta hudOn "profile_hudMode 1" seta hudOff "profile_hudMode 0" bind f3 "+vstr hudOff hudOn"
# or pressing, with a `toggle` command bind f6 "toggle profile_hudMode 1 0"
Now, we get into the hard part: resources should be able to specify a few defaults, which would either be saved in a per-server configuration (
gbind for global configuration?) or a resource-specific configuration (
rbind for resource-specific binds?) where if the user is on a server with that specific resource these persistent defaults will be loaded and potentially (temporarily!) override the user’s global game defaults.
However, there’s no easy way to tag a specific bind value as being specific to a resource - one option would be to always disallow
bind for server scripts, and make
rbind exist to create server/resource-specific overrides, both from user settings (
rbind chat t "+mpTextChatAll") and resource script defaults (
SetResourceBind('t', '+mpTextChatAll') from
chat, for example).
This also leaves the question of “what to do with the binding UI in game settings” somewhat unanswered.
Suggestions in this regard would be welcomed! It appears MTA:SA also redoes the game input system to support binds, maybe someone can chip in about how it works there?