Адаптация

Обновление позволяет решить такие проблемы:

  1. Адекватная загрузка/выгрузка модуля средствами SourceMod (sm plugins load/reload/unload)
  2. Исправление события возрождения игрока:
    • (#1) Фатальная ошибка при запуске модуля: Native "VIP_HookClientSpawn" was not found
    • (#2) Предупреждение при компиляции модуля: warning 234: symbol "VIP_HookClientSpawn" is marked as deprecated: Use VIP_OnPlayerSpawn
    • (#3) Фатальная ошибка при компиляции модуля: error 017: undefined symbol "VIP_HookClientSpawn"

Примечание - ф-я сокращение от функция

Для примера будет использован следующий код:

// Это уникальное имя ф-и. Оно разное в каждом модуле
#define VIP_MODULE      "module1"
// Может выглядеть так
new const String:g_sFeature[] = "module1";

public OnPluginStart() 
{
    // код
}

public VIP_OnVIPLoaded()
{
    VIP_RegisterFeature(VIP_MODULE,     BOOL);
}

"module1" - Имя ф-и

VIP_MODULE - Псевдоним ф-и

  1. Если уникальное имя ф-и выглядит так:
#define VIP_MODULE      "module1"

То меняем на

// Для старого синтаксиса
static const String:g_sFeature[] = "module1";

// Для нового синтаксиса
static const char g_sFeature[] = "module1";
  1. Затем заменяем все VIP_MODULE на g_sFeature.

  2. Ищем функцию OnPluginStart() и добавляем в её конец

if(VIP_IsVIPLoaded())
{
    VIP_OnVIPLoaded();
}

Если же функции OnPluginStart() нет то дописываем её. Должно получиться так:

public OnPluginStart() 
{
    // Код (если он был)

    if(VIP_IsVIPLoaded())
    {
        VIP_OnVIPLoaded();
    }
}
  1. Дальше ищем функцию OnPluginEnd(). Чаще всего её нет поэтому её нужно будет добавить
public OnPluginEnd() 
{
    // Код (если он был)

    if(CanTestFeatures() && GetFeatureStatus(FeatureType_Native, "VIP_UnregisterFeature") == FeatureStatus_Available)
    {
        VIP_UnregisterFeature(g_sFeature);
    }
}

После этого проблема #1 будет решена.

Еще 1 пример для модулей с 2-я функциями (на подобии скинов, трейлов и т.д.):

  • Функция вкл/выкл
  • Функция настройки

Выглядят они примерно так:

#define VIP_SKINS           "Skins"
#define VIP_SKINS_MENU      "Skins_Menu"

public VIP_OnVIPLoaded()
{
    VIP_RegisterFeature(VIP_SKINS, STRING, _, OnToggleItem);
    VIP_RegisterFeature(VIP_SKINS_MENU, _, SELECTABLE, OnSelectItem, _, OnDrawItem);
}

Для обновления такого типа модулей делаем так:

  1. Заменяем объявление ф-й
#define VIP_SKINS           "Skins"
#define VIP_SKINS_MENU      "Skins_Menu"

на

// Для старого синтаксиса
static const String:g_sFeature[][] = {"Skins", "Skins_Menu"};

// Для нового синтаксиса
static const char g_sFeature[][] = {"Skins", "Skins_Menu"};
  1. Заменяем все VIP_SKINS на g_sFeature[0] и VIP_SKINS_MENU на g_sFeature[1]

  2. Изменяем/добавляем OnPluginStart()

public OnPluginStart() 
{
    // Код (если он был)

    if(VIP_IsVIPLoaded())
    {
        VIP_OnVIPLoaded();
    }
}
  1. Изменяем/добавляем OnPluginEnd()
public OnPluginEnd() 
{
    // Код (если он был)

    if(CanTestFeatures() && GetFeatureStatus(FeatureType_Native, "VIP_UnregisterFeature") == FeatureStatus_Available)
    {
        VIP_UnregisterFeature(g_sFeature[0]);
        VIP_UnregisterFeature(g_sFeature[1]);
    }
}

Главное соблюдать закономерность: Для каждой VIP_RegisterFeature в VIP_OnVIPLoaded() должна быть VIP_UnregisterFeature в OnPluginEnd()

Больше примеров можете посмотреть в уже обновлённых модулях.

Для решения проблем #2 и #3:

  1. В OnPluginStart() ищем VIP_HookClientSpawn(OnPlayerSpawn);
  2. Удаляем эту строку
  3. Далее ищем:
public OnPlayerSpawn(iClient, iTeam, bool:bIsVIP)

и заменяем на

// Для старого синтаксиса
public VIP_OnPlayerSpawn(iClient, iTeam, bool:bIsVIP)

// Для нового синтаксиса
public void VIP_OnPlayerSpawn(int iClient, int iTeam, boolbIsVIP)