[SM] Competitive Server Manager

Тема в разделе "Программирование / Скриптинг", создана пользователем diller110, 13 фев 2015.

  1. diller110

    diller110

    Сообщения:
    138
    Симпатии:
    48
    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: , боюсь не пойму.

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

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.992
    Ага, без исходников.


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

    Нормально они объясняют, но очень сокращенно.

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

    diller110

    Сообщения:
    138
    Симпатии:
    48
    Сглупил, закачал исходники.

    Насчет 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"
    }
    А вот с именем игрока проблема. Не хочет записывать. Ни ошибки, просто нету этого значения.
    Иногда происходит следующее: Оффтоп Или Оффтоп
     
  4. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.992
    diller110,
    PHP:
    GetClientName(client"clientname"sizeof(clientname)); // не верно
    GetClientName(clientclientnamesizeof(clientname)); // верно
    и строки создавай через decl
     
    Danyas и diller110 нравится это.
  5. Chaos_Engine

    Chaos_Engine TeamBiceps

    Сообщения:
    533
    Симпатии:
    42
    Писать что-то подобное на Sourcemod это такая глупость...
     
  6. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.574
    Симпатии:
    1.989
    PHP:
    decl String:clientname[MAX_NAME_LENGTH];
    GetClientName(clientclientnameMAX_NAME_LENGTH);
    Ещё можно до 2 строчки подставить if() - убедиться, что имя игрока удалось получить (возвращает true).
    Понаписывано много, но что этот менеджер делает - толком не ясно...
    Вот ты написал что-то о меню и о том, что можно менять там "режимы" на основе кваров и exec файлов, так? Такое уже написано на этом форуме) Только выбор я оставлял за самими игроками. :)
     
  7. diller110

    diller110

    Сообщения:
    138
    Симпатии:
    48
    Нет просто менять настройки сервера, конечно, я не собираюсь. Это реализовать более менее элементарно и уже сделано в том или ином виде.

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

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

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.574
    Симпатии:
    1.989
    В чате? Или скин окрашиваешь? Не понятно ничего. :D
    Не увлекайся #define - это приводит к созданию указанной переменной-константы. Занимает память сервера постоянно.
    У меня насмотрелся создавать массив для обычных переменных? Зря.
    То же самое + sizeof вообще ни к чему был.
    Поскольку меню со временем не меняется - создай его разово при старте плагина, а потом просто показывай.
     
    diller110 нравится это.
  9. diller110

    diller110

    Сообщения:
    138
    Симпатии:
    48
    Это просто идея. Представь 8 цветов радуги. В формате RGB. Трейлы еще сам не создавал, но в гайдах читал что они по RGB изменяюся, вот каждому игроку рандомно дается свой цвет.

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

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    [​IMG]
     
    diller110 нравится это.
  11. diller110

    diller110

    Сообщения:
    138
    Симпатии:
    48
    Хорошо, сейчас полностью все переписываю, хотя ничего и не сделал толкового. Учту твой код.

    Вопрос 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:
    А когда имя нельзя получить? Когда 0 - сервер. И...(возможно если функция выполняется после выхода игрока... Да что-то есть, но пока опущу это)

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

    diller110

    Сообщения:
    138
    Симпатии:
    48
    :tomato: Апну тему. Пожалуйста ответьте на вопросы, т.к. дальше продолжить не могу пока не разберусь с этим.
     
  13. R1KO

    R1KO Супер-модератор

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

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.992
    Primo, да. Только во втором меню кнопку назад еще нужно делать.
     
  15. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.574
    Симпатии:
    1.989
    Лучше тогда уж создать квар, а в модуле ловить его. Это близко по эффективности к нативам, причём, если информацию изменить (квар), то она тут же сама обновится во всех модулях. А в нативах - не в курсе, но вроде пока сам модуль не проверит состояние.
    Это весьма простой и не громоздкий приём.
     
  16. diller110

    diller110

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

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

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.992
    diller110,
    1. Нужно сначала создать inc. Читай API
    2.
    PHP:
    decl String:sAccess[255];
    GetPlayerAccess(clientsAccesssizeof(sAccess));



    public 
    bool:GetPlayerAccess(clientString:sAccess[], maxlen)
    {
        
    decl String:SID[30];
        
    GetClientAuthId(clientAuthId_Steam2SID30);
        
    KvRewind(playersFile);
        if(
    KvJumpToKey(playersFileSIDfalse))
        {
            
    KvGetString(playersFile"access"sAccessmaxlen"noaccess");
            return 
    true;
        } 
    ReplyToCommand(0"I don't know how, but I can't get client's \"access\" key.");
        
    KvRewind(playersFile);
        return 
    false;
    }
     
    diller110 нравится это.