Обновление позволяет решить такие проблемы:
- Адекватная загрузка/выгрузка модуля средствами SourceMod (
sm plugins load/reload/unload
) - Исправление события возрождения игрока:
- Фатальная ошибка при запуске модуля:
Native "VIP_HookClientSpawn" was not found
- Предупреждение при компиляции модуля:
warning 234: symbol "VIP_HookClientSpawn" is marked as deprecated: Use VIP_OnPlayerSpawn
- Фатальная ошибка при компиляции модуля:
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);
}
- Если уникальное имя ф-и выглядит так:
#define VIP_MODULE "module1"
То меняем на
new const String:g_sFeature[] = "module1";
Или для нового синтаксиса
static const char g_sFeature[] = "module1";
- Затем заменяем все
VIP_MODULE
(может быть другим) наg_sFeature
- Ищем функцию
public OnPluginStart()
{
// код
}
И добавляем в её конце
if(VIP_IsVIPLoaded())
{
VIP_OnVIPLoaded();
}
Должно получиться так:
public OnPluginStart()
{
// код
if(VIP_IsVIPLoaded())
{
VIP_OnVIPLoaded();
}
}
Если же функции OnPluginStart()
нет то дописываем её:
public OnPluginStart()
{
if(VIP_IsVIPLoaded())
{
VIP_OnVIPLoaded();
}
}
- Дальше ищем функцию
public 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);
}
Для обновления такого типа модулей делаем так:
- Заменяем объявление ф-й
#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"};
- Заменяем все
VIP_SKINS
наg_sFeature[0]
иVIP_SKINS_MENU
наg_sFeature[1]
- Изменяем/добавляем
OnPluginStart()
public OnPluginStart()
{
// Код если был
if(VIP_IsVIPLoaded())
{
VIP_OnVIPLoaded();
}
}
- Изменяем/добавляем
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
:
- В
OnPluginStart()
ищемVIP_HookClientSpawn(OnPlayerSpawn);
- Удаляем эту строку
- Далее ищем:
public OnPlayerSpawn(iClient, iTeam, bool:bIsVIP)
и заменяем на
public VIP_OnPlayerSpawn(iClient, iTeam, bool:bIsVIP)