[SM] Competitive Server Manager

diller110

Добрая душа
Сообщения
353
Реакции
278
Competitive Server Manager или CoManger беда с названием...
По задумке плагин предназначается для полного управления сервером. Сервер тематически направлен на две ветки: Тренировочный (для клана) и Соревновательный или Турнирный (проводить турниры и кланвары).
Структура плагина:
  • CM-CORE: Ядро плагина, отвечает за загрузку файлов настройки, опции не зависящие от режима сервера, генерирует меню, к которому уже будут подключаться пункты настройки запущенного режима. Загружает файл players в котором будут хранится статистика, а также данные доступа к ядру. Напр.: "nickname" "cm-manager/cm-user/cm-clanowner/cm-compleader".
  • CM-CLANTNG: 1 режим/аддон к ядру. Плагин генерирует свой файл clantngmode.txt, с настройками установленными админом для данного мода. Также вставляет в главное меню пункт управления режимом, в котором и можно изменить настройки. Загружаются команды, мини-режимы(режим онлихэд, бесконечные гранаты и патроны для разбросов и прочее).
  • CM-COMPETITIONS: Аналогично с верхним, свои настройки, свое влияние на сервер.
  • CM-PUBLIC: Аналогично.
  • CM-IDLE: Аналогично.

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

Зачем я все это сюда написал.. Это не заказ, это общая концепция которую я постараюсь реализовать. Опыта нет, поэтому буду задавать много вопросов. Если кто-то заинтересовался CoMangerom:lol: я с удовольствием возьму в наставники.

Сам плагин:
Пока что сделано практически ничего. А что сделано, или не работает, или как у новичков всегда все чере..

Посмотреть вложение cm-core.sp Собственно ядро. Пока что сделана генерация файла Metainfo.txt, в которой выводит версию, и версию подключенных режимов. Также меню с 4 неактивными пунктами.

Посмотреть вложение cm-clantng.sp Первый модуль режима тренировки. Пока что ничего не делает.

Вопросы:
Да, возможно это очередной велосипед, однако, свой. Суть в опыте который я получу во время реализации. И конечно, будут возникать вопросы, которые могут быть полезны другим. Здесь я буду их задавать, если ответят, вставлять ссылки на пост с ответом:
--- --- ---
1. Вопрос: Как реализовать связь между плагинами? Варианты ответа: а) Includes, b) Глобальные функции Видел гайд, в котором для получения информации из одного плагина, в обоих создавали консольный cmd, один улавливал команду и читал аргументы, которые присылает другой. Но этот способ крайне громоздкий, да и не эффективный какой-то. Также можно записывать в файл одному и читать другому плагину. Уже что-то, но как реализовать пока не знаю. И наиболее правильный наверно вариант, использование include, и вызов соотвествующих функций. Но документация и гайды так криво объясняют, что без подробнейшего объяснения :rtfm: , боюсь не пойму.

--- --- ---
Конец вопросов.
Прошу профессионалов просмотреть что уже сделано(толком ничего), исправить уже существующие недочеты, подсказать с реализацией.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #2
Прошу профессионалов просмотреть что уже сделано(толком ничего), исправить уже существующие недочеты, подсказать с реализацией.
Ага, без исходников.


1. Вопрос: Как реализовать связь между плагинами? Варианты ответа: а) Includes, b) Глобальные функции Видел гайд, в котором для получения информации из одного плагина, в обоих создавали консольный cmd, один улавливал команду и читал аргументы, которые присылает другой. Но этот способ крайне громоздкий, да и не эффективный какой-то. Также можно записывать в файл одному и читать другому плагину. Уже что-то, но как реализовать пока не знаю. И наиболее правильный наверно вариант, использование include, и вызов соотвествующих функций. Но документация и гайды так криво объясняют, что без подробнейшего объяснения , боюсь не пойму.

Делай через нативы, форварды и функции.

Но документация и гайды так криво объясняют, что без подробнейшего объяснения , боюсь не пойму.
Нормально они объясняют, но очень сокращенно.

Если не ясно как что-то реализовать пиши или тут или мне.
 

diller110

Добрая душа
Сообщения
353
Реакции
278
Ага, без исходников.
Сглупил, закачал исходники.

Насчет KeyValues, загрузил я сам KV:
DB[1] = CreateKeyValues("Players");
Заполнил из файла FileToKeyValues(DB[1], FilePath[2]);
Получил SteamId, перешел к ключу SID KvJumpToKey(DB[1], SID, true).
Получил имя: new String:clientname[MAX_NAME_LENGTH];
GetClientName(client, "clientname", sizeof(clientname));
Пока все норм, дальше странность.
KvSetString(DB[1], "name", clientname);
KvSetString(DB[1], "access", "noaccess");
Значение access генерирует без проблем (+ connections)
"STEAM_1:1:81809170"
{
"access" "noaccess"
"connections" "1"
}
А вот с именем игрока проблема. Не хочет записывать. Ни ошибки, просто нету этого значения.
Иногда происходит следующее: Оффтоп Или Оффтоп
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #4
diller110,
PHP:
GetClientName(client, "clientname", sizeof(clientname)); // не верно
GetClientName(client, clientname, sizeof(clientname)); // верно

и строки создавай через decl
 

EaglEs

Гуру пробития усилений
Сообщения
926
Реакции
195
Писать что-то подобное на Sourcemod это такая глупость...
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
new String:clientname[MAX_NAME_LENGTH];
GetClientName(client, "clientname", sizeof(clientname));
PHP:
decl String:clientname[MAX_NAME_LENGTH];
GetClientName(client, clientname, MAX_NAME_LENGTH);
Ещё можно до 2 строчки подставить if() - убедиться, что имя игрока удалось получить (возвращает true).
Понаписывано много, но что этот менеджер делает - толком не ясно...
Вот ты написал что-то о меню и о том, что можно менять там "режимы" на основе кваров и exec файлов, так? Такое уже написано на этом форуме) Только выбор я оставлял за самими игроками. :)
 

diller110

Добрая душа
Сообщения
353
Реакции
278
"режимы" на основе кваров и exec файлов
Нет просто менять настройки сервера, конечно, я не собираюсь. Это реализовать более менее элементарно и уже сделано в том или ином виде.

Вот пример настройки модуля Clantrn.
Опция отработки тактики:
Каждый человек получает свой цвет. Глава в начале тренировки вводит команду например /tactic start. Начинается раунд, игроки сливаются или побеждают. Конец раунда объявляется но не заканчивается(Ну или в следующем можно). Командой /tactic finish, все воскрешаются, переходят в команду к Главе. Командой /tactic show - На карте выявляются трейлы цвета каждого игрока. Глава гуляет и анализирует действия бойцов.

Конечно до реализации этого далеко. Просто чтобы общую идею понять. Это не просто динамическое меню с конфигами.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Каждый человек получает свой цвет
В чате? Или скин окрашиваешь? Не понятно ничего. :D
Не увлекайся #define - это приводит к созданию указанной переменной-константы. Занимает память сервера постоянно.
diller110 написал(а):
У меня насмотрелся создавать массив для обычных переменных? Зря.
diller110 написал(а):
BuildPath(Path_SM, FilePath[0], PLATFORM_MAX_PATH, "data/comanger/metainfo.txt");
BuildPath(Path_SM, FilePath[1], PLATFORM_MAX_PATH, "data/comanger/currentoptions.txt");
То же самое + sizeof вообще ни к чему был.
diller110 написал(а):
new Handle:menu = CreateMenu(MenuHandler:menuHandler);
SetMenuTitle(menu, "CoManger меню:");
AddMenuItem(menu, "servermode", "Режим сервера", ITEMDRAW_DISABLED);
AddMenuItem(menu, "modeoption", "Настройки режима", ITEMDRAW_DISABLED);
AddMenuItem(menu, "coreoption", "Настройки ядра");
AddMenuItem(menu, "statistic", "Статистика");
SetMenuExitButton(menu, true);
DisplayMenu(menu, client, 60);
Поскольку меню со временем не меняется - создай его разово при старте плагина, а потом просто показывай.
 

diller110

Добрая душа
Сообщения
353
Реакции
278
В чате? Или скин окрашиваешь?
Это просто идея. Представь 8 цветов радуги. В формате RGB. Трейлы еще сам не создавал, но в гайдах читал что они по RGB изменяюся, вот каждому игроку рандомно дается свой цвет.

Игроки гуляют, каким-то образом, координаты передвижения, векторы, тоесть визуализация их пути за жизнь, вообщем она как-то сохраняется. А затем в конце, каждая координата превращается в trail. Получается как-бы карта передвижений за раунд. В воображении получается красиво.
 

TolikCorp

Участник
Сообщения
874
Реакции
334
Комиксы-воображение-песочница-872883.jpeg
 

diller110

Добрая душа
Сообщения
353
Реакции
278
Хорошо, сейчас полностью все переписываю, хотя ничего и не сделал толкового. Учту твой код.

Вопрос 1:
Один из вопросов который мне ломает голову это меню. В документации и во всех гидах есть только одно. Создание одноуровневого меню, где при нажатии на пункт выполняется что-то. А как сделать многоуровневое. Вернее как правильно его сделать.

В одном плагине видел при нажатии на пункт, создается еще Handle:AnotherMenu, и собстна все. В нем такое же плоское меню. Это верное решение или есть другие способы?
Пример что хочу я:
Main menu:
1. Choise mode
- First mode
- One more mode
2. Mode's options
- Type of play
* HeadShootOnly
* Tactic type
где 1, -, * - разные уровни меню.

Вопрос 2:
Как сделать зависимость плагина режима к ядру.
В wiki следующая выдержка: Оффтоп, сразу говорится как отключить плагин от привязки. Учитывая что до этого написано о привязки extensions, меня удивляет, я не вижу половину строк или документация недоделана? Видимо как-то так #define REQUIRE_PLUGIN #include <что сюда?>

Вопрос 3:
if() - убедиться, что имя игрока удалось получить (возвращает true)
А когда имя нельзя получить? Когда 0 - сервер. И...(возможно если функция выполняется после выхода игрока... Да что-то есть, но пока опущу это)

Вопрос 4:
В файле с игроками есть строка access. Она никак не будет меняться автоматически, только командой от рут или суперадмина /cmsetplayeraccess
Собственно в плагине это и будет защита доступа, например открытие меню только по доступу.
Вот код получения информации доступа clienta, но эта простая public функция и в return жалуется на несоответсвие тегов(возвращаю string), и ясно что тут нужно применить что-то другое вроде include, но я без понятия как, направьте пожалуйста.
Сам код: Оффтоп, соответственно желаемый вызов new String:currentaccess[] = GetPlayerAccess(client);
 
Последнее редактирование:

diller110

Добрая душа
Сообщения
353
Реакции
278
:tomato: Апну тему. Пожалуйста ответьте на вопросы, т.к. дальше продолжить не могу пока не разберусь с этим.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #13
1. Да
2. Просто пишешь #include <библиотека>
3. Если 0 то получит "Console"
4. public Handle:GetPlayerAccess(client)
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #14
Primo, да. Только во втором меню кнопку назад еще нужно делать.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
для получения информации из одного плагина, в обоих создавали консольный cmd, один улавливал команду и читал аргументы, которые присылает другой.
Лучше тогда уж создать квар, а в модуле ловить его. Это близко по эффективности к нативам, причём, если информацию изменить (квар), то она тут же сама обновится во всех модулях. А в нативах - не в курсе, но вроде пока сам модуль не проверит состояние.
Это весьма простой и не громоздкий приём.
 

diller110

Добрая душа
Сообщения
353
Реакции
278
1. Да
2. Просто пишешь #include <библиотека>
3. Если 0 то получит "Console"
4. public Handle:GetPlayerAccess(client)

2. Например плагину cm-clantng нужно поставить зависимость к ядру cm-core, писать надо: #include <cm-core>? Мне выдает ошибку: cm-clantng.sp(2) : fatal error 120: cannot read from file: "cm-core"

4. Как заставить эту функцию возвращать string? Код Оффтоп
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #17
diller110,
1. Нужно сначала создать inc. Читай API
2.
PHP:
decl String:sAccess[255];
GetPlayerAccess(client, sAccess, sizeof(sAccess));



public bool:GetPlayerAccess(client, String:sAccess[], maxlen)
{
	decl String:SID[30];
	GetClientAuthId(client, AuthId_Steam2, SID, 30);
	KvRewind(playersFile);
	if(KvJumpToKey(playersFile, SID, false))
	{
		KvGetString(playersFile, "access", sAccess, maxlen, "noaccess");
		return true;
	} ReplyToCommand(0, "I don't know how, but I can't get client's \"access\" key.");
	KvRewind(playersFile);
	return false;
}
 
Сверху Снизу