Skip to content

Latest commit

 

History

History
166 lines (154 loc) · 4.57 KB

update_modules.md

File metadata and controls

166 lines (154 loc) · 4.57 KB

Мануал по обновлению модулей

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

  1. Адекватная загрузка/выгрузка модуля средствами SourceMod (sm plugins load/reload/unload)
  2. Исправление события возрождения игрока:
    • Фатальная ошибка при запуске модуля: 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);
}
  1. Если уникальное имя ф-и выглядит так:
#define VIP_MODULE		"module1"

То меняем на

new const String:g_sFeature[] = "module1";

Или для нового синтаксиса

static const char g_sFeature[] = "module1";
  1. Затем заменяем все VIP_MODULE (может быть другим) на g_sFeature
  2. Ищем функцию
public OnPluginStart() 
{
	// код
}

И добавляем в её конце

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

Должно получиться так:

public OnPluginStart() 
{
	// код
	if(VIP_IsVIPLoaded())
	{
		VIP_OnVIPLoaded();
	}
}

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

public OnPluginStart() 
{
	if(VIP_IsVIPLoaded())
	{
		VIP_OnVIPLoaded();
	}
}
  1. Дальше ищем функцию
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);
}

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

  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:

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

и заменяем на

public VIP_OnPlayerSpawn(iClient, iTeam, bool:bIsVIP)