Адаптация
Обновление позволяет решить такие проблемы:
- Адекватная загрузка/выгрузка модуля средствами SourceMod (
sm plugins load/reload/unload
) -
Исправление события возрождения игрока:
- (
#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
- Псевдоним ф-и
- Если уникальное имя ф-и выглядит так:
#define VIP_MODULE "module1"
То меняем на
// Для старого синтаксиса
static const String:g_sFeature[] = "module1";
// Для нового синтаксиса
static const char g_sFeature[] = "module1";
-
Затем заменяем все
VIP_MODULE
наg_sFeature
. -
Ищем функцию
OnPluginStart()
и добавляем в её конец
if(VIP_IsVIPLoaded())
{
VIP_OnVIPLoaded();
}
Если же функции OnPluginStart()
нет то дописываем её. Должно получиться так:
public OnPluginStart()
{
// Код (если он был)
if(VIP_IsVIPLoaded())
{
VIP_OnVIPLoaded();
}
}
- Дальше ищем функцию
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
и #3
:
- В
OnPluginStart()
ищемVIP_HookClientSpawn(OnPlayerSpawn);
- Удаляем эту строку
- Далее ищем:
public OnPlayerSpawn(iClient, iTeam, bool:bIsVIP)
и заменяем на
// Для старого синтаксиса
public VIP_OnPlayerSpawn(iClient, iTeam, bool:bIsVIP)
// Для нового синтаксиса
public void VIP_OnPlayerSpawn(int iClient, int iTeam, boolbIsVIP)