Вот:
Ты что-то не так сделал.
Открой настройки plugin_vc, должно быть определение
_D3D_INCLUDE вот тут:
http://i.imgur.com/WyptPrQ.pngУ тебя проект plugin_vc сейчас скомпилирован без переменной _RwD3DDevice. Поэтому при попытке компилировать VC_DXFont ты получаешь ошибку с сообщением, что переменная не найдена.
1) При обновлении sdk как лучше обновить у себя? Достаточно ли будет копировать новые файлы с заменой старых и пересобрать плагин? Шаблон пересобирать надо или нет?
Можно и так. Скопировать, заменить, пересобрать plugin-sdk, пересобрать свои проекты. Шаблон менять не надо, если он не изменялся в репозитории.
Но я бы советовал использовать специальные утилиты для обновления/изменения:
Git for WindowsTortoiseGitКак с этим работать:Скачать Git, установить, скачать TortoiseGit, установить. После этого в контекстном меню Windows появятся новые элементы.
Открыть страницу plugin-sdk на github, нажать кнопку "Clone or Download", скопировать ссылку:

Зайти в папку своих проектов (если там уже есть папка plugin-sdk - удалить её), нажать ПКМ, далее "Git Clone":

Если ссылка правильно скопировалась, то программа сама всё настроит:

Нажать "ОК", после загрузки - "Close".
Теперь у тебя будет папка-репозитарий plugin-sdk.

Как с ней работать:Нажать ПКМ на папке (plugin-sdk), далее выбрать "Git Sync...":
Если надо обновить (перед этой процедурой желательно закрыть студию):Нажимаешь кл. Pull

После апдейтинга, ты увидишь список "коммитов", которые были загружены:

Нажать Close.
Если ты внес изменения (например, добавил какую-то функцию, класс, что-то поправил, или даже добавил свой пример) и хочешь внести их в репозиторий:Создать аккаунт на github.
Сообщить мне свой никнейм (мне нужно будет добавить его в список редакторов).Нажать кл. Commit

Далее в окне "коммита" дать ему какое-то название (обычно описание изменений) и выбрать все файлы, которые ты изменял (по дефолту, новодобобавленные файлы не отмаечаются автоматом):

Нажать Commit & Push (на кнопке Commit есть справа стрелка, открывающая доп. опции), после отправки нажать Close.
2) В SA_CreateCar CStreaming::RequestModel(modelId, 2);
цифра 2 что означает?
а в SA_PedSpawner стоит 0
CStreaming::RequestModel(modelID, 0);
Это флаги загрузки и стриминга модели. Честно скажу - сам пока что не очень разобрался, как правильно их использовать. Примерно я их наименовал так:
enum eStreamingFlags {
GAME_REQUIRED = 0x2, // Модель нужна игре? (Сохранять в памяти, пока не будет вызвана SetModelIsDeletable, дальше - пусть игра сама решает, когда удалить модель)
MISSION_REQUIRED = 0x4, // Модель нужна миссии? (Сохранять в памяти, пока не будет вызвана SetMissionDoesntRequireModel, дальше - пусть игра сама решает, когда удалить модель)
KEEP_IN_MEMORY = 0x8, // Сохранять в памяти, пока мы сами не выгрузим модель (RemoveModel)
PRIORITY_REQUEST = 0x10 // Особый приоритет загруки (в функции LoadAllRequestedModels есть параметр на загрузку только таких моделей)
};
Эти описания - примерные, я их только вчера составил, и не было времени всё проверить. Раньше этого перечисления я вообще нигде не находил

Вот здесь
void CVehicle::OpenDoor(CPed* ped, int componentId, eDoors door, float doorOpenRatio, bool playSound)
eDoors door - что ставить? В клео я ставил 0-5, а здесь пишет аргумент типа int несовместим с параметром типа "eDoors".
Типы, которые начинаются с "e" - это enumerations (перечисления).
Тип eDoors обьявлен, но он пустой (в CDamageManager.h):

Если ты знаешь значения этого перечисления - можешь их добавить в файле CDamageManager.h, и далее использовать их при вызове (напр. DOOR_FRONT_LEFT).
Если нужно использовать integer вместо enum - нужно привести тип:
static_cast<eDoors>(5)
Вот код моего скрипта (для GTA3, но не суть), не пойму, как сделать такое в плагине (для SA). Цикл for в частности, как реализовать wait 0? Можно пример? Пожалуйста 
Wait вообще не нужен (есть аналог в виде Sleep(), но использовать его где-либо не желательно). Ты же внедряешь свой код в код игры. Сделаешь где-то задержку - и игра тоже её сделает.
Тебе нужно мыслить по-другому - ты "вклиниваешься" в процесс каждый фрейм. Твой код (функция) будет вызываться один раз за фрейм - допустим, где-то в CGame::Process (если используется gameProcessEvent). Что делать в такой ситуации? Тут есть несколько вариантов. Самое простое - разделить код на отдельные процессы (состояния) и создать переменную, которая будет хранить id поточного процесса (состояния) (и которой будем переключать процессы (состояния))
#include <plugin.h>
#include "game_sa\common.h"
#include "game_sa\CAutomobile.h"
#include "game_sa\CTimer.h"
#include "game_sa\CMessages.h"
using namespace plugin;
class OpenDoorExample {
public:
enum eOpenDoorState {
STATE_OPENING, // сейчас мы что-то открываем
STATE_CLOSING, // закрываем
STATE_WAITING // ждём указаний
};
static eOpenDoorState m_currentState; // наш статус
static CAutomobile *m_pCurrentCar; // авто, с которым сейчас что-то делаем
static float m_openingState; // статус открытия/закрытия
static int m_currentComponentId;
static eDoors m_currentDoorId;
static unsigned int m_nLastTimeWhenAnyActionWasEnabled;
static void OpenComponent(CAutomobile *automobile, int componentId, eDoors doorId) {
if (automobile->IsComponentPresent(componentId)) {
if (automobile->m_damageManager.GetDoorStatus(doorId) != 3) { // 3 - это тоже член какого-то перечисления, напр. STATUS_DAMAGED
m_pCurrentCar = automobile; // сохраняем все данные в переменные, чтобы потом заюзать при обработке STATE_OPENING/STATE_CLOSING (см. функцию Process)
m_currentComponentId = componentId;
m_currentDoorId = doorId;
if (!automobile->IsDoorFullyOpen(doorId)) {
m_currentState = STATE_OPENING; // переключаем статус
m_openingState = 0.0f; // и ресетим статус открытия
}
else {
m_currentState = STATE_CLOSING; // переключаем статус
m_openingState = 1.0f; // и ресетим статус открытия
}
m_nLastTimeWhenAnyActionWasEnabled = CTimer::m_snTimeInMilliseconds; // запоминаем время
}
}
}
static void Process() { // Обрабатываем поточное состояние - ждём нажатия клавиши ИЛИ открываем ИЛИ закрываем компонент
switch (m_currentState) {
case STATE_OPENING: // Что-то открываем. Обрати внимание, что ранее мы записали поточное авто и ид компонентов в статические переменные класса (по сути, это глобальные переменные)
m_pCurrentCar->OpenDoor(0, m_currentComponentId, m_currentDoorId, m_openingState, true);
m_openingState += 0.05f;
if (m_openingState > 1.0f) { // Если полностью открыли
m_currentState = STATE_WAITING; // Переключаем статус на "ожидание"
m_pCurrentCar->OpenDoor(0, m_currentComponentId, m_currentDoorId, 1.0f, true); // Полностью открываем
}
break;
case STATE_CLOSING: // Что-то закрываем
m_pCurrentCar->OpenDoor(0, m_currentComponentId, m_currentDoorId, m_openingState, true);
m_openingState -= 0.05f;
if (m_openingState < 0.0f) { // Если полностью закрыли
m_currentState = STATE_WAITING; // Переключаем статус на "ожидание"
m_pCurrentCar->OpenDoor(0, m_currentComponentId, m_currentDoorId, 0.0f, true); // Полностью закрываем
}
break;
case STATE_WAITING:
if (CTimer::m_snTimeInMilliseconds > (m_nLastTimeWhenAnyActionWasEnabled + 500)) { // если прошло 500 мс с того времени, как мы начали открывать/закрывать что-то
CVehicle *vehicle = FindPlayerVehicle(0, false);
if (vehicle && vehicle->m_dwVehicleClass == VEHICLE_AUTOMOBILE) {
CAutomobile *automobile = reinterpret_cast<CAutomobile *>(vehicle); // опять же, приведение типов. Т.к. мы будет юзать damageManager, нам нужно убедиться, что транспорт - это автомобиль (CAutomobile)
if (KeyPressed(219)) // [
OpenComponent(automobile, CAR_BONNET, static_cast<eDoors>(0)); // капот
else if (KeyPressed(221)) // ]
OpenComponent(automobile, CAR_BOOT, static_cast<eDoors>(1)); // багажник
else if (KeyPressed(186) && KeyPressed(187)) // ; =
OpenComponent(automobile, CAR_DOOR_LF, static_cast<eDoors>(2)); // левая передняя дверь
else if (KeyPressed(222) && KeyPressed(187)) // ' =
OpenComponent(automobile, CAR_DOOR_RF, static_cast<eDoors>(3)); // правая передняя дверь
else if (KeyPressed(186) && KeyPressed(189)) // ; -
OpenComponent(automobile, CAR_DOOR_LR, static_cast<eDoors>(4)); // левая задняя дверь
else if (KeyPressed(222) && KeyPressed(189)) // ' -
OpenComponent(automobile, CAR_DOOR_RR, static_cast<eDoors>(5)); // правая задняя дверь
}
}
}
switch (m_currentState) { // Для наглядности выведем поточный статус на экран
case STATE_OPENING:
CMessages::AddMessageJumpQ("State: OPENING", 100, 0, false);
break;
case STATE_CLOSING:
CMessages::AddMessageJumpQ("State: CLOSING", 100, 0, false);
break;
case STATE_WAITING:
CMessages::AddMessageJumpQ("State: WAITING", 100, 0, false);
break;
}
}
OpenDoorExample() {
Events::gameProcessEvent.Add(Process);
}
} example;
OpenDoorExample::eOpenDoorState OpenDoorExample::m_currentState = STATE_WAITING;
CAutomobile *OpenDoorExample::m_pCurrentCar;
float OpenDoorExample::m_openingState;
int OpenDoorExample::m_currentComponentId;
eDoors OpenDoorExample::m_currentDoorId;
unsigned int OpenDoorExample::m_nLastTimeWhenAnyActionWasEnabled = 0;
Не стал делать проверку нажатия/отжатия клавиши, чтобы не усложнять

Заметь, что и в твоём скрипте, и в этом примере есть небольшая проблема - это выполнение действий над авто в цикле, без доп. проверки на существование этого авто. Чисто теоретически - пока обрабатывается открытие/закрытие, с авто может что-то случиться

Но это уже мелочи.
Можно было бы вообще разделить процессы открытия/закрытия и обработки клавиш (чтобы эти процессы выполнялись одновременно). Но для базовой реализации подойдёт и так.
По for и другим циклам лучше найти какой-то урок/туториал по C++ (например
этот)