Иконка ресурса

Smart Jail Doors v0.5.2-beta, 18 ноя 2015

Kailo

Участник
Сообщения
194
Реакции
896
  • Автор ресурса
  • #1
Smart Jail Doors (v0.5.2-beta, 18 ноя 2015)
Обзор Smart Jail Doors

Описание
Плагин создан для серверов в жанре Jailbreak. Он предоставляет API для создания плагинов, где надо Открывать/Закрывать двери джайлов.
Так же позволяет создавать на карте дополнительные кнопки для открытия джайлов (это полезно на картах, где далеко расположена кнопка или нету ни одной кнопки, к примеру ba_jail_alcatraz_redux_go).

Команды
sm_sjd — админ команда (рут флаг по-умолчанию), открывает меню плагина.
sm_sjddebug — выводит в консоль список карт где отсутствует конфигурация.
sm_sjdhm [<name>] — дамп списка объектов в консоль; ручной режим для выбранного объекта.

Cvars
sjd_buttons_sound_enable (def. "1") — переключатель звука использования кнопки.
sjd_buttons_sound (def. "buttons/button3.wav") — звук использования кнопки.
sjd_buttons_glow (def. "0") — переключатель свечения кнопки.
sjd_buttons_glow_color (def. "0 150 0") — цвет свечения кнопки.
sjd_buttons_filter (def. "0") — фильтр доступа для кнопки (0 — все, 1 — кт).

API
Нативы для создания плагинов вы можете найти в smartjaildoors.inc, который лежит в папке "addons/sourcemod/scripting/include".
PHP:
/**
 * Open jail's doors on current map saved in Smart Jail Doors config.
 * Открывает двери джайлов.
 *
 * @noreturn
 */
native void SJD_OpenDoors();

/**
 * Close jail's doors on current map saved in Smart Jail Doors config.
 * Закрывает двери джайлов.
 *
 * @noreturn
 */
native void SJD_CloseDoors();

/**
 * Toggle jail's doors on current map saved in Smart Jail Doors config.
 * If door can't be toggled - nothing.
 * Переключает двери джайлов: открывает если закрыты, закрывает если открыты.
 * Если нельзя переключить, то ничего.
 *
 * @noreturn
 */
native void SJD_ToggleDoors();

/**
 * Toggle jail's doors on current map saved in Smart Jail Doors config.
 * If door can't be toggled - open.
 * Переключает двери джайлов: открывает если закрыты, закрывает если открыты.
 * Если нельзя переключить, то открывает.
 *
 * @noreturn
 */
native void SJD_ToggleExDoors();

/**
 * Check if exist doors config for said map.
 * Возвращает true, если имеется конфиг на указанной карте, иначе false.
 *
 * @param mapName    String with map name for check.
 * @return
 */
native bool SJD_IsMapConfigured(const char[] mapName);

/**
 * Check if exist doors config for current map.
 * Возвращает true, если имеется конфиг на текущей карте, иначе false.
 */
stock bool SJD_IsCurrentMapConfigured();
Так же вы можете посмотреть пример плагина с использованием SJD.

Инструкция по установки
  • Загрузите последний релиз .
  • Распакуйте файлы в "<ваш сервер>/csgo" папку. (README.md и ChangeLog.txt необязательно)
  • Смените карту на сервере.
  • Настройте плагин на всех картах вашего сервера или скачайте подготовленный конфиг (подготовленный конфиг будет позже).
  • Готово.

Список изменений
2015-11-18 (v0.5.2-beta)
  • Исправлен баг, когда игроки могли использовать кнопку в то время, когда они мертвы или в команде спектаторов.
  • Дистанция использования кнопки увеличена с 64 до 80.
2015-09-24 (v0.5.1-beta)
  • Оптимизация.
2015-08-26 (v0.5.0-beta)
  • Добавлен звук использования кнопки.
  • Добавлен cvar sjd_buttons_sound_enable (def. "1").
  • Добавлен cvar sjd_buttons_sound (def. "buttons/button3.wav").
  • Добавлено свечение кнопки.
  • Добавлен cvar sjd_buttons_glow (def. "0").
  • Добавлен cvar sjd_buttons_glow_color (def. "0 150 0").
  • Добавлен ручной режим - Нужен для сохранение дверей с noclip, nodrow и похожими текстурами, т.к. их нельзя получить прицеливанием.
  • Добавлена команда sm_sjdhm.
  • Добавлено меню ручного режима.
  • Исправлен баг с некорректным отображением языка в меню.
  • Format заменены на FormatEx.
  • Исправлена вкл./выкл./перезагрузка плагина (Меню автоматически закрывается, кнопки убираются и появляются на карте).
  • Добавлен cvar sjd_buttons_filter (def. "0").
2015-08-20 (v0.4.1-beta)
  • Добавлен SJD_IsCurrentMapConfigured сток.
  • Исправлен баг с регистром названий объектов.
2015-06-24 (v0.4.0-beta)
  • Добавлен ToggleEx метод.
  • Добавлен 'SJD_ToggleExDoors' натив (см. описание выше).
  • Добавлена поддержка 'func_wall_toggle' класса объектов.
  • Добавлен русский перевод.
2015-06-12 (v0.3.0-beta)
  • Переделана use логика (теперь более похожа на source engine).
  • Добавлен 'SJD_IsMapConfigured' натив (см. описание выше).
  • Исправлен баг в 'IsMapConfigured' логике.
  • Исправлен баг в 'CheckMapsWithNoDoorsCfg' логике.
  • Оптимизация циклов.
2015-06-10 (v0.2.1-beta)
  • Исправление критических ошибок.
  • Оптимизация циклов.
2015-06-09 (v0.2.0-beta)
  • Добавлена команда sm_sjddebug — выводит в консоль список карт где отсутствует конфигурация.
  • Оптимизация циклов (Спасибо R1KO).
  • Улучшение некоторых функций.
  • Переименование глобальных переменных.
2015-06-09 (v0.1.0-beta)
  • Первый релиз.

Загрузка
Посмотреть вложение smartjaildoors.zip или https://github.com/Kailo97/smartjaildoors/releases.

Благодарности
Спасибо Фениксу за советвы по написанию плагина.
Спасибо s.t.v.o.l за помощь в тестах.
Так же спасибо всем кто ответил мне в этой теме.
Спасибо R1KO за совет о циклах.
 
Последнее редактирование:

Napas

Участник
Сообщения
832
Реакции
667
Re: Smart Jail Doors (v0.1.0-beta, 2015-06-09)

Полезная вещь) устоновлю на серевр себе.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #3
Re: Smart Jail Doors (v0.1.0-beta, 2015-06-09)

Плагин написан хорошо.
Но есть мелкие моменты.
Переменные называй понятней, а то не поймешь где глобальная, а где локальная (например kv, написал бы g_hKv или g_Kv уже было бы понятней) и какой у неё тип.

PHP:
do {
		char name[64], clsname[64];
		int result;
		kv.GetSectionName(name, sizeof(name));
		kv.GetString("class", clsname, sizeof(clsname));
		Call_StartFunction(null, handler);
		Call_PushString(name);
		Call_PushString(clsname);
		if (data != 0)
			Call_PushCell(data);
		Call_Finish(result);
	} while (kv.GotoNextKey());
Переменные нужно было создать до цикла.

PHP:
int doors[128], MaxEntities = GetMaxEntities();
	for (int i=MaxClients+1;i<MaxEntities;i++) {
		if (IsValidEntity(i)) {
			char entclsname[64];
			GetEntityClassname(i, entclsname, sizeof(entclsname));
			if (StrEqual(clsname, entclsname)) {
				char entname[64];
				GetEntityName(i, entname, sizeof(entname));
				if (StrEqual(name, entname)) {
					doors[doors[0]+1] = i;
					doors[0]++;
				}
			}
		}
	}
Тут тоже самое.

В принципе всё. Может я чего и не заметил но в целом всё отлично.

Еще помимо нативов советую создать форварды открытия и закрытия дверей. Мало ли)
 

White Wolf

🍉
Сообщения
2,382
Реакции
2,187
  • Команда форума
  • #4
Re: Smart Jail Doors (v0.1.0-beta, 2015-06-09)

Оффтоп
 

Kailo

Участник
Сообщения
194
Реакции
896
  • Автор ресурса
  • #5
Re: Smart Jail Doors (v0.2.0-beta, 2015-06-09)

Релиз v0.2.0-beta
  • Добавлена команда sm_sjddebug — выводит в консоль список карт где отсутствует конфигурация.
  • Оптимизация циклов (Спасибо R1KO).
  • Улучшение некоторых функций.
  • Переименование глобальных переменных.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #6
Re: Smart Jail Doors (v0.2.0-beta, 2015-06-09)

Kailo,
PHP:
do {
		char name[64], clsname[64];
		int result;
		g_kv.GetSectionName(name, sizeof(name));
		g_kv.GetString("class", clsname, sizeof(clsname));
		Call_StartFunction(null, handler);
		Call_PushString(name);
		Call_PushString(clsname);
		if (data != 0)
			Call_PushCell(data);
		Call_Finish(result);
	} while (g_kv.GotoNextKey());

...

do {
		char buffer[8];
		float origin[3];
		int result;
		g_kv.GetSectionName(buffer, sizeof(buffer));
		g_kv.GetVector("pos", origin);
		Call_StartFunction(null, handler);
		Call_PushCell(StringToInt(buffer));
		Call_PushArray(origin, 3);
		if (data != 0)
			Call_PushCell(data);
		Call_Finish(result);
	} while (g_kv.GotoNextKey());
А тут так и осталось))

PHP:
char buffer[16];
Format(buffer, sizeof(buffer), "%d", buttonid);
FormatEx быстрее
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #8
Re: Smart Jail Doors (v0.2.0-beta, 2015-06-09)

AlmazON, я скинул ток первую строку, которая попалась под руку и честно говоря даже не посмотрел что там форматируется.
 

Kailo

Участник
Сообщения
194
Реакции
896
  • Автор ресурса
  • #9
Re: Smart Jail Doors (v0.2.1-beta, 2015-06-10)

Релиз v0.2.1-beta
  • Исправление критических ошибок.
  • Оптимизация циклов.
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #10
Re: Smart Jail Doors (v0.2.1-beta, 2015-06-10)

Kailo,
PHP:
e[64];
	do {
		int result;
		g_kv.GetSectionName(name, sizeof(name));
		g_kv.GetString("class", clsname, sizeof(clsname));
		Call_StartFunction(null, handler);
		Call_PushString(name);
		Call_PushString(clsname);
		if (data != 0)
			Call_PushCell(data);
		Call_Finish(result);
	} while (g_kv.GotoNextKey());
int result; все ровно в цикле. Да и вообще зачем она если она нигде не используется?
Посмотрел что во всех ф-ях получаешь результат только не понятно зачем, он же нигде не используется.
 

Kailo

Участник
Сообщения
194
Реакции
896
  • Автор ресурса
  • #11
Re: Smart Jail Doors (v0.2.1-beta, 2015-06-10)

R1KO, я считал, что без него нельзя использовать Call_Finish(); спасибо за совет.
 

Kailo

Участник
Сообщения
194
Реакции
896
  • Автор ресурса
  • #12
Re: Smart Jail Doors (v0.3.0-beta, 12 июн 2015)

Релиз v0.3.0-beta
  • Переделана use логика (теперь более похожа на source engine).
  • Добавлен 'SJD_IsMapConfigured' натив (см. описание выше).
  • Исправлен баг в 'IsMapConfigured' логике.
  • Исправлен баг в 'CheckMapsWithNoDoorsCfg' логике.
  • Оптимизация циклов.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #13
Re: Smart Jail Doors (v0.3.0-beta, 12 июн 2015)

По коду замечаний нет. Плагин тестировался? Полет нормальный?

P.S.
PHP:
public int Native_SJD_IsMapConfigured(Handle plugin, int numParams)
{
	int len;
	GetNativeStringLength(1, len);
	
	if (len <= 0)
		return view_as<int>(false);
	
	char[] mapName = new char[len + 1];
	GetNativeString(1, mapName, len + 1);
	
	return view_as<int>(IsMapConfigured(mapName));
}

Тип ф-и int. А если просто вернуть false (без view_as<int>) будет ругаться на теги?
Просто заметил что на старом синтаксисе в каллбеках нативов что bool что int возвращаются нормально, но при других типах нужно опускать тип (_:). Вот интересно просто на новом так же или всё же нужно всё преобразовывать в int.
 

Kailo

Участник
Сообщения
194
Реакции
896
  • Автор ресурса
  • #14
Re: Smart Jail Doors (v0.3.0-beta, 12 июн 2015)

По коду замечаний нет. Плагин тестировался? Полет нормальный?

P.S.
PHP:
public int Native_SJD_IsMapConfigured(Handle plugin, int numParams)
{
	int len;
	GetNativeStringLength(1, len);
	
	if (len <= 0)
		return view_as<int>(false);
	
	char[] mapName = new char[len + 1];
	GetNativeString(1, mapName, len + 1);
	
	return view_as<int>(IsMapConfigured(mapName));
}

Тип ф-и int. А если просто вернуть false (без view_as<int>) будет ругаться на теги?
Просто заметил что на старом синтаксисе в каллбеках нативов что bool что int возвращаются нормально, но при других типах нужно опускать тип (_:). Вот интересно просто на новом так же или всё же нужно всё преобразовывать в int.

Компилируется без замечаний, все нововведения протестировал, все работает как должно. Можно возвращать без преобразований типа.
 

Kailo

Участник
Сообщения
194
Реакции
896
  • Автор ресурса
  • #15
Re: Smart Jail Doors (v0.4.0-beta, 24 июн 2015)

Релиз v0.4.0-beta
  • Добавлен ToggleEx метод.
  • Добавлен 'SJD_ToggleExDoors' натив (см. описание выше).
  • Добавлена поддержка 'func_wall_toggle' класса объектов.
  • Добавлен русский перевод.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #16
Re: Smart Jail Doors (v0.4.0-beta, 24 июн 2015)

Утвердил.
 

Kailo

Участник
Сообщения
194
Реакции
896
  • Автор ресурса
  • #17
Re: Smart Jail Doors (v0.4.1-beta, 20 авг 2015)

Релиз v0.4.1-beta
  • Добавлен SJD_IsCurrentMapConfigured сток.
  • Исправлен баг с регистром названий объектов.
 

Kailo

Участник
Сообщения
194
Реакции
896
  • Автор ресурса
  • #18
Re: Smart Jail Doors (v0.5.0-beta, 26 авг 2015)

Релиз v0.5.0-beta
  • Добавлен звук использования кнопки.
  • Добавлен cvar sjd_buttons_sound_enable (def. "1").
  • Добавлен cvar sjd_buttons_sound (def. "buttons/button3.wav").
  • Добавлено свечение кнопки.
  • Добавлен cvar sjd_buttons_glow (def. "0").
  • Добавлен cvar sjd_buttons_glow_color (def. "0 150 0").
  • Добавлен ручной режим - Нужен для сохранение дверей с noclip, nodrow и похожими текстурами, т.к. их нельзя получить прицеливанием.
  • Добавлена команда sm_sjdhm.
  • Добавлено меню ручного режима.
  • Исправлен баг с некорректным отображением языка в меню.
  • Format заменены на FormatEx.
  • Исправлена вкл./выкл./перезагрузка плагина (Меню автоматически закрывается, кнопки убираются и появляются на карте).
  • Добавлен cvar sjd_buttons_filter (def. "0").
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #19
Re: Smart Jail Doors (v0.5.0-beta, 26 авг 2015)

PHP:
public void ConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue)
{
	char cvarname[64];
	convar.GetName(cvarname, sizeof(cvarname));
	if (StrEqual("sjd_buttons_glow", cvarname)) {
		...
	} else if (StrEqual("sjd_buttons_glow_color", cvarname)) {
		...
	}
}

У тебя же квары глобальные, проще проверить квары по хандлу чем работать со строками:
PHP:
public void ConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue)
{
	if (convar == cv_sjd_buttons_glow) {
		...
	} else {
		...
	}
}
А после else проверки вообще не нужно т.к. у тебя только 2 квара ссылаются на этот каллбек, следовательно если это не 1 квар то другой.

PHP:
void InputToDoor(const char[] name, const char[] clsname, const char[] input)
{
	
	int doors[128], MaxEntities = GetMaxEntities();
	char entclsname[64], entname[64];
	for (int i=MaxClients+1;i<MaxEntities;i++) {
		...
	}
	
	...
	
	for (int i=1;i<=doors[0];i++)
		AcceptEntityInput(doors[i], input);
}
i создается 2 раза. Рациональнее было бы создать её 1 раз до циклов (вместе с doors и MaxEntities).

PHP:
void ShowSJDMenu2(int client)
{
	SetGlobalTransTarget(client);
	if (g_sjdclient != 0 && g_sjdclient != client) {
		PrintToChat(client, CHAT_PATTERN, "SJD menu denied - already opened");
		return;
	}
	
	Menu menu = new Menu(SJDMenu2);
	menu.SetTitle("Smart Jail Doors");
	char buffer[128];
	FormatEx(buffer, sizeof(buffer), "%t", "Doors");
	menu.AddItem("doors", buffer);
	FormatEx(buffer, sizeof(buffer), "%t", "Test");
	menu.AddItem("test", buffer);
	FormatEx(buffer, sizeof(buffer), "%t", "Buttons");
	menu.AddItem("buttons", buffer);
	g_SJDMenu2 = menu;
	menu.Display(client, MENU_TIME_FOREVER);
	g_sjdclient = client;
}

Не логичнее сделать SetGlobalTransTarget(client); после проверок.
PrintToChat(client всё ровно сам сделает SetGlobalTransTarget(client);


И зачем создавать menu если можно сразу работать с g_SJDMenu2.

PHP:
public int SJDMenu2(Menu menu, MenuAction action, int param1, int param2)
{
	switch (action) {
		case MenuAction_Select: {
			char info[64];
			menu.GetItem(param2, info, sizeof(info));
			if (StrEqual(info, "doors")) {
				SJDMenu2_ShowDoorsSubMenu(param1);
			} else if (StrEqual(info, "test")) {
				SJDMenu2_ShowTestSubMenu(param1);
			} else if (StrEqual(info, "buttons")) {
				SJDMenu2_ShowButtonsSubMenu(param1);
			}
		}
		case MenuAction_Cancel: CloseSJDMenu();
		case MenuAction_End: delete menu;
	}
}
Легче работать с номером пункта чем с его описанием. Ведь меню статическое, пункты в нем не изменяются. Так что оптимальнее проверять param2.

PHP:
void SJDMenu2_ShowDoorsSubMenu(int client, bool late = false)
{
	SetGlobalTransTarget(client);
	Menu menu = new Menu(SJDMenu2_DoorsSubMenu);
	menu.SetTitle("%t", "Doors title");
	char buffer[128];
	FormatEx(buffer, sizeof(buffer), "%t", "Save door");
	menu.AddItem("save", buffer);
	if (!ExecuteDoors(SJDMenu2_AddItemsToDoorsSubMenu, menu)) {
		FormatEx(buffer, sizeof(buffer), "%t", "No doors");
		menu.AddItem("nodoors", buffer, ITEMDRAW_DISABLED);
	}
	menu.OptionFlags |= MENUFLAG_BUTTON_EXITBACK;
	g_SJDMenu2 = menu;
	menu.Display(client, MENU_TIME_FOREVER);
	EnableLookAt(late);
}
Тут аналогично, сразу g_SJDMenu2 = new Menu(SJDMenu2_DoorsSubMenu);
И с каллбеком нажатия тоже так же.
Да и дальше вроде как во всех меню так же.

И кстати, зачем использовать глобальное меню? Чтобы закрывать в случае чего? Тогда меню нужно каждому игроку, т.к. если одновременно 2 игрока будут работать в меню то они будут перебивать меню друг друга. Хотя это маловероятно, но советую подумать об этом.

Ну и дальше по коду одни и те же, эм.. замечания, что ли...
 

Kailo

Участник
Сообщения
194
Реакции
896
  • Автор ресурса
  • #20
Re: Smart Jail Doors (v0.5.0-beta, 26 авг 2015)

У тебя же квары глобальные, проще проверить квары по хандлу чем работать со строками:
Не знаю почему, но у меня в голове сложился стереотип что Handle нельзя сравнивать, хорошенько подумав я понял что он сравнивает не значения, а просто адрес переменной. Поправим.
 

Похожие темы

Сверху Снизу