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