Адаптация
Обновление позволяет решить такие проблемы:
- Адекватная загрузка/выгрузка модуля средствами 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)