Подключение модулей плагина по очереди

alexfyodrv

Участник
Сообщения
24
Реакции
0
Здравствуйте. Подскажите как подключить a.smx, b.smx, c.smx по очереди, то есть чтобы c.smx не подключился раньше b.smx, а b.smx не подключился раньше a.smx. Требуется для реализации мода. Буду благодарен за помощь с кодом.

Не подумайте, что я не искал решение на alliedmods. Я не нашел информации как подключить плагин в плагине.
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #2
Воткнуть зависимые плагины как вариант. Ну или:
C-подобный:
ServerCommand("sm plugins load x");
 

alexfyodrv

Участник
Сообщения
24
Реакции
0
Воткнуть зависимые плагины как вариант. Ну или:
C-подобный:
ServerCommand("sm plugins load x");
Каким образом сделать, чтобы сервер не подключал эти плагины повторно. И как вызвать мой плагин первым чтобы он подключил остальные.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #4
Если заглядывал в инклюду СБ, например, мог увидеть такие строчки:
C-подобный:
public SharedPlugin:__pl_sourcebans =
{
   name = "sourcebans",
   file = "sourcebans.smx",
   #if defined REQUIRE_PLUGIN
   required = 1
   #else
   required = 0
   #endif
};

Воткни подобное в c.smx, чтобы он требовал наличие b.smx, а в b.smx - a.smx
 

White Wolf

🍉
Сообщения
2,382
Реакции
2,187
  • Команда форума
  • #5
Каким образом сделать, чтобы сервер не подключал эти плагины повторно.
Хранить в плагине Handle других плагинов и при загрузке проверять на соответствие. Если handle найден в массиве, то плагин уже загружен.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
подключить a.smx, b.smx, c.smx по очереди, то есть чтобы c.smx не подключился раньше b.smx, а b.smx не подключился раньше a.smx
Если смотреть тот же Shop, то всё реализуется вызовами и нативами.
Можно любительским методом, например: создаём, как положено, в каждом плагине квар выключения. Плагин c.smx проверяет квар на существование плагина b.smx: если он не найден (INVALID HANDLE), значит, плагин не запускаем, ничего не делаем. b.smx точно также проверяет a.smx. Когда же a.smx загрузился (остальные не нашли кваров и потому выключены), отсылаем консольную команду плагину b.smx и он включается, отсылая команду плагину c.smx. В итоге, все плагины загружены в нужном порядке. Оффтоп
Если хочешь, напишу пример, о чём речь, но едва ли такое стоит кому-либо использовать. :fie:
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Если смотреть тот же Shop, то всё реализуется вызовами и нативами.
Можно любительским методом, например: создаём, как положено, в каждом плагине квар выключения. Плагин c.smx проверяет квар на существование плагина b.smx: если он не найден (INVALID HANDLE), значит, плагин не запускаем, ничего не делаем. b.smx точно также проверяет a.smx. Когда же a.smx загрузился (остальные не нашли кваров и потому выключены), отсылаем консольную команду плагину b.smx и он включается, отсылая команду плагину c.smx. В итоге, все плагины загружены в нужном порядке. Оффтоп
Если хочешь, напишу пример, о чём речь, но едва ли такое стоит кому-либо использовать. :fie:

Лично я - понял, у меня такие вещи так и реализованы)
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
у меня такие вещи так и реализованы
PHP:
new bool:g_bCvarEnable;

public OnPluginStart()
{
	PrintToServer("Load plugin A!!!");
	decl Handle:cvar;
	cvar = CreateConVar("plugin_a_enable",		"1",	"1 - включение плагина 'a', 0 - выключение.", _, true, 0.0, true, 1.0);
	HookConVarChange(cvar, ChangeCvar_A_enable);
	g_bCvarEnable = GetConVarBool(cvar);
	if (FindConVar("plugin_b_enable")) ServerCommand("load_plugin_a");
}

public ChangeCvar_A_enable(Handle:cvar, const String:oldValue[], const String:newValue[]) g_bCvarEnable = GetConVarBool(cvar);
PHP:
new bool:g_bCvarEnable;
new bool:g_bLoadPluginA;
new bool:g_bFullEnable;

public OnPluginStart()
{
	PrintToServer("Load plugin B!!!");
	decl Handle:cvar;
	cvar = CreateConVar("plugin_b_enable",		"1",	"1 - включение плагина 'b', 0 - выключение.", _, true, 0.0, true, 1.0);
	HookConVarChange(cvar, ChangeCvar_B_enable);
	g_bCvarEnable = GetConVarBool(cvar);
	if (FindConVar("plugin_a_enable")) LoadPluginA(0);
	else RegServerCmd("load_plugin_a", LoadPluginA, "Команда статуса подключённости плагина 'a'.");
}

public ChangeCvar_B_enable(Handle:cvar, const String:oldValue[], const String:newValue[])
{
	if ((g_bFullEnable = (g_bCvarEnable = GetConVarBool(cvar)) && g_bLoadPluginA))
	{
		//Выполнение обычного кода.
	}
}

public Action:LoadPluginA(args)
{
	g_bLoadPluginA = true;
	if (FindConVar("plugin_c_enable")) ServerCommand("load_plugin_b");
	PrintToServer("ENTER plugin B!!!");
	return Plugin_Handled;
}

//Пример проверки, что плагин загружен в верном порядке и включён кваром.
public OnClientPostAdminCheck(client)
{
	if (g_bFullEnable)
	{
		//Выполнение обычного кода.
	}
}
PHP:
new bool:g_bCvarEnable;
new bool:g_bLoadPluginB;
new bool:g_bFullEnable;

public OnPluginStart()
{
	PrintToServer("Load plugin C!!!");
	decl Handle:cvar;
	cvar = CreateConVar("plugin_c_enable",		"1",	"1 - включение плагина 'c', 0 - выключение.", _, true, 0.0, true, 1.0);
	HookConVarChange(cvar, ChangeCvar_C_enable);
	g_bCvarEnable = GetConVarBool(cvar);
	if (FindConVar("plugin_b_enable")) LoadPluginB(0);
	else RegServerCmd("load_plugin_b", LoadPluginB, "Команда статуса подключённости плагина 'b'.");
}

public ChangeCvar_C_enable(Handle:cvar, const String:oldValue[], const String:newValue[])
{
	if ((g_bFullEnable = (g_bCvarEnable = GetConVarBool(cvar)) && g_bLoadPluginB))
	{
		//Выполнение обычного кода.
	}
}

public Action:LoadPluginB(args)
{
	g_bLoadPluginB = true;
	if (FindConVar("plugin_e_enable")) ServerCommand("load_plugin_d");
	PrintToServer("ENTER plugin C!!!");
	return Plugin_Handled;
}

//Пример проверки, что плагин загружен в верном порядке и включён кваром.
public OnClientPostAdminCheck(client)
{
	if (g_bFullEnable)
	{
		//Выполнение обычного кода.
	}
}
В консоли сервера:
Load - порядок загрузки модуля самим SM;
ENTER - получаемая загрузка модулей.
Вот так?! Оффтоп
 
Последнее редактирование:

alexfyodrv

Участник
Сообщения
24
Реакции
0
Спасибо всем кто пытался мне помочь, но вряд ли это будет правильным решением. Возможно вы подскажите как это сделать по другому. Задача такая: Есть плагин sm:rpg все навыки подключаются как модули (по примеру vip riko) мне нужно сделать сортировку то есть установить свой порядок отображения их в меню. Я просмотрел все файлы исходников и пришел к выводу что подключается модули через функцию в инклуде так как каждый её вызывает. Как мне сделать так чтобы это меню можно было отсортировать в нужном мне порядке?

Оффтоп
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #10
У меня есть такой вариант реализации. Переместить все нужные модули в папку disabled и через server.cfg подгружать их. Но я не уверен, что SM вообще даёт подгружать плагины из disabled.

C-подобный:
sm plugins load disabled/MyModule1
sm plugins load disabled/MyModule2
 

alexfyodrv

Участник
Сообщения
24
Реакции
0
У меня есть такой вариант реализации. Переместить все нужные модули в папку disabled и через server.cfg подгружать их. Но я не уверен, что SM вообще даёт подгружать плагины из disabled.

C-подобный:
sm plugins load disabled/MyModule1
sm plugins load disabled/MyModule2
я попробую.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
1) Пользователи могут не выполнить это условие, закинув модули, как обычно.
2) Файлы могут переименовать и работать перестанет вовсе.
3) Плагины на серверах имеют свойство полностью перезагружаться заново с новой картой и, поскольку они уже не в папке disabled, то и вся последующая загрузка будет выполнена неверно.
Короче, даже не костыль, а заплатка к костылю.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #14
@AlmazON, а я и не говорю, что это решение.
@alexfyodrv, снова предложу этот вариант:
Если заглядывал в инклюду СБ, например, мог увидеть такие строчки:
C-подобный:
public SharedPlugin:__pl_sourcebans =
{
   name = "sourcebans",
   file = "sourcebans.smx",
   #if defined REQUIRE_PLUGIN
   required = 1
   #else
   required = 0
   #endif
};

Воткни подобное в c.smx, чтобы он требовал наличие b.smx, а в b.smx - a.smx
 

White Wolf

🍉
Сообщения
2,382
Реакции
2,187
  • Команда форума
  • #15
Последовательность загрузки можно регулировать сторонним плагином. Используйте ADT Array и для каждого элемента храните handle других плагинов. По handle плагина можно получить и имя плагина и прочую информацию о нём.
---- Пример на меню ----
Jail-Warden-Pro/jwpm_menu.sp at dev · TiBarification/Jail-Warden-Pro · GitHub
 
Сверху Снизу