1. Нет, first_kvd я использовал для подстраховки, т.к. теоретически я не могу быть уверен, что model key будет "пущен" вообще.
В общем случае, если мы уверены, что конкретная KVD "проскочит", то просто ждем ее и меняем: set_kvd(handle, KV_Value, val) - конечно же это проще, чем формировать свою KVD и подавлять оригинальную. Можно было сделать немного по-другому: ждать и менять KVD, а если не дождались (не была пущена), "пулять" свою в pre Spawn. Но в принципе - то же самое, за мельчайшим непринципиальным отличием. 2. Не обязательно. В моем случае должен быть 0. Если подавил текущий KVD, то, пуская свою KVD, можно использовать как оригинальный handle, так и 0 (global handle). Но я не вижу смысла подавлять и тут же пускать свою, вместо этого в подавляющем большинстве случаев можно будет просто изменить оригинальную KVD.
3. static - делает локальную переменную глобальной в своей локальной области.
Т.е. вызываешь функцию первый раз - переменная инициализируется, "нулится", присваиваешь ей значение, "выходишь" из функции, если вызываешь функцию второй, третий и т.д. раз - переменная все еще "жива" и хранит свое прежнее значение, не реинициализируется и не "нулится", следовательно, получаем прирост в производительности, если функция вызывается часто.
В данном случае использование static не особо оправдано, т.к. KeyValue hook будет вызываться только при старте карты. Я по привычке делаю static массивы во всех forward's hooks для увеличения производительности плагина. К примеру, в StartFrame и т.п. это будет наиболее значимо.
В глобальном пространстве static использовать не вижу смысла. Если необходимо запретить изменение переменной, нужно использовать const атрибут.
static key[sizeof g_model + 1] будет еще точнее в случае похожих key name, например, "models". ;]
4. static массив полностью "нулится" только при инициализации, только единожды.