Система Лиг (League [CORE])

Ядро плагина Система Лиг (League [CORE]) 1.3.3

Поддерживаемые игры
  1. CS: Source (OrangeBox)
  2. CS: Source (v34)
  3. CS: GO
[ЯДРО] СИСТЕМА ЛИГ НА СЕРВЕР
Видеодемонстрация (YouTube)
Плагин позволяет проводить на сервере лиги (достигшие определенного прогресса за определенное время игроки награждаются привилегиями), что определенно увеличит число постоянных игроков.
У игроков имеется возможность получать очки за их активности в течении сезона, покупать на них различные плюшки, ограничивающиеся только Вашей фантазией, а также передавать их другим игрокам, если на сервере включена таковая возможность.

Модули для получения очков:
1. Получение наград за достигнутое на сервере звание

2. Получение наград за наигранное на сервере время


Модули:
1. Автоматическое завершение и начало лиги - старт/завершение лиги в соответствии с указанными датами. Сброс званий.
2. Выдача шприца - выдает шприц за серию убийств, а также при спавне игрока (будет переписан с обновлением ядра).
3. Автовыдача оружия - позволяет выбрать набор оружия и гранат, которые будут выданы в начале раунда.
4. Колесо чата - позволяет отправлять голосовые фразы, как в Dota2.
5. Chat Wheel Extented - аналог плагина "Колесо чата" с расширенными возможностями и удобствами
6. Бустер получения кредитов (новая версия с уровнями) - увеличивает кол-во получаемых кредитов в !shop.
7. Обмен: очки лиги -> кредиты - добавляет возможность обмена очков лиги на кредиты !shop.
8. Комментатор убийств - при стриках убийств воспроизводит звук и показывает красивое текстовое уведомление в центре экрана. Может выдавать кредиты (будет переписан с обновлением ядра).
9. Kill Bonus - восстанавливает определенное количество ХП при убийствах (будет переписан с обновлением ядра).
10. Покупка VIP - позволяет покупать VIP-статус за очки лиги.
11. Эффект при убийстве - приятное затемнение экрана при убийстве (переделанный под лиги модуль для VIP).
12. Эффект гранат - позволяет игроку установить себе эффект молнии определенного цвета при детонации гранат.
13. Покупка предметов !shop - позволяет покупать предметы из !shop за очки лиги.
14. Round Start & Kills Cash - добавляет в магазин дополнительные деньги в начале раунда и прибавку к полученным деньгам за убийства.


Настройка:

league.ini:
"league"[/CENTER]
{
    "reward_mode"    "1"        //1 - получение наград доступно. 0 - получение наград недоступно
    "open_menu_com"    "league"    //команда открытия меню
    "gift_enable"    "1"            //разрешить игрокам передавать привилегии
    "gift_feature_lim"    "2"        //сколько раз игрок может передать привилегию
    "admin_menu_points"    "-1000,-500,-100,100,500,1000" //пункты выдачи очков в админ меню (макс. 16)

    "shop_items"
    {
        "color_chat"                                //Название в бд, а также в самом модуле (обязательно должно совпадать)
        {
            "item"    "Право купить цветной чат"        //Название позиции
            "price"    "250"                            //цена позиции
            "hiden"    "1"                                //скрыта ли привилегия
        }
        "credits_mult"
        {
            "item"    "+20% к получаемому золоту"
            "price"    "400"
        }
        "healtshot4kills"
        {
            "feature_num"    "2"
            "description"    "Счётчик убийств сбрасывается при смерти"            //комментарий о привилегии в меню покупки (макс. 128 символов на кириллице)
            "item"    "Шприц за серии убийств"
            "levels"                                //привилегия имеет уровни
            {
                "1"
                {
                    "name"        "Шприц за каждые 5 убийств"
                    "price"        "150"
                    "count"        "5"
                }
                "2"
                {
                    "name"        "Шприц за каждые 4 убийства"
                    "price"        "300"
                    "count"        "4"
                }
                "3"
                {
                    "name"        "Шприц за каждые 3 убийства"
                    "price"        "500"
                    "count"        "3"
                }
            }
        }
        "weapon_giver"
        {
            "item"    "Автовыдача оружия"
            "price"    "800"
            "module_menu"    "1"                        //есть ли у модуля своё меню?!!
        }
        "nade_effect"
        {
            "item"    "Эффекты гранат"
            "price"    "300"
        }
        "kill_screen"
        {
            "item"    "Эффект при убийстве"
            "price"    "250"
        }
        "chat_wheel"
        {
            "item"    "Доп. фразы колеса чата"
            "price"    "250"
        }
        "kill_streak"
        {
            "item"    "Комментатор убийств"
            "description"    "Выдает кредиты и воспроизводит звук при убийствах"
            "price"    "500"
            "module_menu"    "1"
        }
        "healtshot_spawn"
        {
            "item"    "Шприц при спавне"
            "description"    "Выдает указанное количество шприцов при возрождении"            //комментарий о привилегии в меню покупки
            "receive"    "1"        //0 - добавлять к имеющимся, 1 - давать до указанного в уровне количества (уникальный параметр, принадлежащий данному модулю)
            "levels"
            {
                "1"
                {
                    "name"        "Один шприц"
                    "price"        "150"
                    "count"        "1"
                }
                "2"
                {
                    "name"        "Два шприца"
                    "price"        "250"
                    "count"        "2"
                }
                "3"
                {
                    "name"        "Три шприца"
                    "price"        "460"
                    "count"        "3"
                }
            }
        }
    }
    "other_items"
    {
        "buy_credits"
        {
            "item"    "Покупка SHOP кредитов"
        }
        "buy_vip"
        {
            "item"    "Покупка VIP"
        }
    }
}

league_ranks.ini:
"ranks"
{
    "reward"
    {
        "11"    //номер ранга в серверной статистике
        {
            "rank_name"    "Магистр-Хранитель I"    //название в меню
            "points"    "500"    //получаемые очки
        }
        "12"
        {
            "rank_name"    "Магистр-Хранитель II"
            "points"    "300"
        }
        "13"
        {
            "rank_name"    "Магистр-Хранитель - Элита"
            "points"    "300"
        }
        "14"
        {
            "rank_name"    "Заслуженный Магистр-Хранитель"
            "points"    "300"
        }
        "15"
        {
            "rank_name"    "Легендарный Беркут"
            "points"    "350"
        }
        "16"
        {
            "rank_name"    "Легендарный Беркут - Магистр"
            "points"    "350"
        }
        "17"
        {
            "rank_name"    "Великий Магистр Высшего Ранга"
            "points"    "350"
        }
        "18"
        {
            "rank_name"    "Всемирная Элита"
            "points"    "350"
        }
    }
}






Наиболее логичные варианты использования:
Вариант 1.
Объявляем предстоящий сброс званий, даём игрокам возможность получить награды за достигнутые звания. По истечении определенного времени забираем возможность получать награды и сбрасываем звания, оставляя покупки игроков с предыдущей лиги на всю продолжительность следующей. По истечению лиги сбрасываем покупки. Повторяем по кругу (продолжительностью лиги ~месяц)
Вариант 2 (основной и наиболее актуальный).
Сбрасываем на сервере звания, оставляем игрокам возможность покупать привилегии на постоянку. По истечении определенного времени (в моем случае - месяц) вновь сбрасываем звания и покупки игроков.


danil253467 за подсказки и помощь
R1KO за уроки sp (делал в основном по ним)
AUTHTERN за иконки ресурсов:)
и всем остальным, кто отвечал на мои вопросы в теме "написание плагинов"

Простейший пример создания модулей:
Для большинства модулей понадобится лишь одна проверка при выполнении того или иного участка кода:

C-подобный:
if(League_GetClientFeatureStatus(iClient, "test_mod"))
{
    //здесь выполнится код, если у игрока с индексом iClient имеется и включена привилегия с названием в БД "test_mod"
}
Наипростейший модуль, использующий только одну проверку - Kill Bonus из списка модулей.

Если же одной проверки недостаточно, модуль имеет своё меню или же нужно выполнить какую-либо функцию при выборе игроком данного пункта в инвентаре, необходимо заменить параметр "switch_mode" на "module_menu" и добавить проверку выбранного игроком пункта:
C-подобный:
public void League_OnPlayerSelectMenuItem(int iClient, int iFeatureNum) //игрок выбрал определенный пункт в меню
{
    if(League_IsSelectedFeature(iFeatureNum, "test_mod")) //если это наш модуль с названием "test_mod" в БД
    {
        //выполняем нужный код, открываем меню и делаем всё, что нужно
        PrintToChat(iClient, "Всё ОК!");
        PrintToChat(iClient, "Спасибо, что выбрал этот пункт!");
    }
}
Используем проверку на доступ игрока из первого примера при такой необходимости.
Для менее простецких целей используем прочие форварды и нативы.


C-подобный:
*[/CENTER]
    Библиотека Системы Лиг (League CORE)
    Автор: Miaka (Ice_Sochi)
    https://hlmod.ru/members/ice_sochi.81938/
*/

#if defined _league_included
    #endinput
#endif
#define _league_included

#define API_VERSION    133

/*
Получение указателя базы данных
*/
native Database League_GetDatabase();

/**
*    Вызывается, когда ядро загрузилось
*/
forward void League_OnCoreLoaded();

/**
*    Вызывается, когда данные игрока были загружены
*
*    @param iClient            Индекс игрока
*/
forward void League_OnClientLoaded(int iClient);

/**
*    Вызывается, когда игрок выбрал предмет с параметром "module_menu" в инвентаре
*
*    @param iClient            Индекс игрока
*    @param iFeatureNum        Номер (ID) привилегии
*/
forward void League_OnPlayerSelectMenuItem(int iClient, int iFeatureNum);

/**
*    Вызывается, когда игрок выбрал предмет с параметром "module_menu" в инвентаре, имеющий уровни
*
*    @param iClient            Индекс игрока
*    @param iFeatureNum        Номер (ID) привилегии
*    @param iLevel            Уровень выбранной привилегии
*/
forward void League_LevelledItemSelected(int iClient, int iFeatureNum, int iLevel);

/**
*    Вызывается, когда игрок выбрал пункт в разделе "прочее"
*
*    @param iClient            Индекс игрока
*    @param iFeatureNum        Номер (ID) пункта в разделе "прочее"
*/
forward void League_OnPlayerSelectOtherItem(int iClient, int iFeatureNum);

/**
*    Вызывается, когда игрок выбрал пункт в разделе "получение наград"
*
*    @param iClient            Индекс игрока
*    @param iFeatureNum        Номер (ID) пункта в разделе "получение наград"
*/
forward void League_OnPlayerSelectRewardMenuItem(int iClient, int iFeatureNum);

/**
*    Вызывается, когда игрок выбрал пункт в меню получения наград за звание
*
*    @param iClient            Индекс игрока
*    @param iRank            Номер ранга согласно серверной статистике
*    @param iPoints            Количество очков лиги, которые получил игрок
*    @param sRankName        Полное название ранга, за который получена награда
*/
forward void League_RewardItemSelected(int iClient, int iRank, int iPoints, char[] sRankName);

/**
*    Вызывается, когда игрок купил какую-либо привилегию
*
*    @param iClient            Индекс игрока
*    @param iFeatureNum        Номер (ID) привилегии
*    @param iLevel            Уровень привилегии (равняется 0, если привилегия не имеет уровней)
*    @param iPrice            Цена, за которую была куплена привилегия
*    @param sFeatureName        Полное название привилегии (если имеет уровни, включает в название категорию и подкатегорию)
*    @param sFeatureNameDB    Идентификатор привилегии в БД
*/
forward void League_OnClientBoughtItem(int iClient, int iFeatureNum, int iLevel, int iPrice, char[] sFeatureName, char[] sFeatureNameDB);

/**
*    Возвращает номер (ID) пункта из раздела "прочее"
*
*    @param sFeature            Идентификатор пункта в БД
*    @return iFeatureNum
*/
native int League_GetOtherItemNum(char[] sFeature);

/**
*    Возвращает номер (ID) привилегии
*
*    @param sFeature            Идентификатор привилегии в БД
*    @return iFeatureNum
*/
native int League_GetFeatureNum(char[] sFeature);

/**
*    Получает необходимую информацию о привилегии
*
*    @param sFeature            Идентификатор привилегии в БД
*    @param iLevel            Уровень привилегии
*    @param iInfo            0 - вернет ID привилегии, 1 - количество уровней привилегии, 2 - цену привилегии уровня iLevel (если привилегия не имеет уровней, значение iLevel можно указать любое)
*/
native int League_GetFeatureParams(char[] sFeature, int iInfo, int iLevel);

/**
*    Вернет необходимый параметр привилегии указанного уровня
*
*    @param sFeature            Идентификатор привилегии в БД
*    @param sParam            Параметр, значение которого нужно вернуть
*    @param iLevel            Уровень привилегии (если привилегия не имеет уровней, значение iLevel можно указать любое)
*/
native int League_GetFeatureStatInt(char[] sFeature, char[] sParam, int iLevel);

/**
*    Вернет необходимый параметр позиции из раздела "прочее"
*
*    @param sFeature            Идентификатор позиции в конфиге
*    @param sParam            Параметр, значение которого нужно вернуть
*/
native int League_GetOtherItemStatInt(char[] sFeature, char[] sParam);

/**
*    Возвращает уровень включенной у игрока в инвентаре привилегии
*
*    @param iClient            Индекс игрока
*    @param sFeature            Идентификатор привилегии в БД
*    @return iLevel
*/
native int League_GetClientFeatureLevel(int iClient, char[] sFeature);

/**
*    Имеется ли у игрока доступ к привилегии
*
*    @param iClient            Индекс игрока
*    @param sFeature            Идентификатор привилегии в БД
*    @return true (если у игрока куплена и включена привилегия)
*/
native bool League_GetClientFeatureStatus(int iClient, char[] sFeature);

/**
*    Устанавливает игроку режим доступа к скрытой привилегии
*
*    @param iClient        Индекс игрока
*    @param sFeature        Идентификатор привилегии в БД
*    @param iMode        0 - скрыть полностью, 1 - разрешить использование в инвентаре, 2 - разрешить покупку и использование
*/
native void League_SetClientHidenFeature(int iClient, char[] sFeature, int iMode);

/**
*    Проверяет, является ли выбранный игроком пункт в инвентаре привилегией с указанным ID
*
*    @param iFeatureNum        ID выбранной игроком привилегии
*    @param sModule            Идентификатор проверяемой привилегии в БД
*    @return true (если iFeatureNum принадлежит sModule)
*/
native bool League_IsSelectedFeature(int iFeatureNum, char[] sModule);

/**
*    Проверяет, является ли выбранный игроком пункт в "прочее" пунктом с указанным ID
*
*    @param iFeatureNum        ID выбранного игроком пункта
*    @param sModule            Идентификатор проверяемого пункта в БД
*    @return true (если iFeatureNum принадлежит sModule)
*/
native bool League_IsSelectedOtherItem(int iFeatureNum, char[] sModule);

/**
*    Проверяет, является ли выбранный игроком пункт в "получение наград" пунктом с указанным ID
*
*    @param iFeatureNum        ID выбранного игроком пункта
*    @param sModule            Идентификатор проверяемого пункта в БД
*    @return true (если iFeatureNum принадлежит sModule)
*/
native bool League_IsSelectedRewardItem(int iFeatureNum, char[] sModule);

/**
*    Открывает главное меню игроку
*
*    @param iClient        Индекс игрока
*/
native void League_OpenMainMenuToClient(int iClient);

/**
*    Открывает инвентарь игроку
*
*    @param iClient        Индекс игрока
*/
native void League_OpenInventoryToClient(int iClient);

/**
*    Открывает игроку уровневую привилегию в инвентаре
*
*    @param iClient        Индекс игрока
*    @param sFeature        Идентификатор привилегии в БД
*/
native void League_OpenInventoryLevelled(int iClient, char[] sFeature);

/**
*    Устанавливает игроку статус привилегии, не внося изменений в БД
*
*    @param iClient        Индекс игрока
*    @param iFeatureNum    Номер (ID) привилегии
*    @param iStatus        Статус (1 - имеется, 0 - не имеется)
*/
native void League_SetClientFeatureStatus(int iClient, int iFeatureNum, int iStatus);

/**
*    Устанавливает игроку очки лиги
*
*    @param iClient        Индекс игрока
*    @param iPoints        Количество очков
*/
native void League_SetClientPts(int iClient, int iPoints);

/**
*    Выдает игроку очки лиги
*
*    @param iClient        Индекс игрока
*    @param iPoints        Количество очков
*/
native void League_GiveClientPts(int iClient, int iPoints);

/**
*    Забирает у игрока очки лиги
*
*    @param iClient        Индекс игрока
*    @param iPoints        Количество очков
*/
native void League_TakeClientPts(int iClient, int iPoints);

/**
*    Получает количество очков лиги игрока
*
*    @param iClient        Индекс игрока
*    @return iPoints
*/
native int League_GetClientPts(int iClient);

/**
*    Выдает игроку привилегию
*
*    @param iClient        Индекс игрока
*    @param sFeature        Идентификатор привилегии в БД
*/
native void League_GiveClientFeature(int iClient, char[] sFeature);

/**
*    Забирает у игрока привилегию
*
*    @param iClient        Индекс игрока
*    @param sFeature        Идентификатор привилегии в БД
*/
native void League_TakeClientFeature(int iClient, char[] sFeature);

/**
*    Очищает статистику лиги и полученные награды за звания
*
*    @param iMode        0 - очищать только онлайн игроков, 1 (рекомендуется) - очищать вместе с БД
*/
native void League_ResetStats(int iMode);

/**
*    Очищает инвентарь
*
*    @param iMode        0 - очищать только онлайн игроков, 1 (рекомендуется) - очищать вместе с БД
*/
native void League_ResetItems(int iMode);

/**
*    Очищает все данные
*
*    @param iMode        0 - очищать только онлайн игроков, 1 (рекомендуется) - очищать вместе с БД
*/
native void League_ResetAll(int iMode);

/**
*    Вызывается, когда ДБ была очищена
*
*    @param iMode        1 - очищалась статистика и полученные награды, 2 - инвентарь, 3 - всё
*/
forward void League_OnDBCleared(int iMode);

/**
*    Выдает игроку награду за текущее звание
*
*    @param iClient        Индекс игрока
*    @param iRank        Номер звания в серверной статистике
*/
native void League_GiveClientRankReward(int iClient, int iRank);

/**
*    Делает награду за звание неполученной
*
*    @param iClient        Индекс игрока
*    @param iRank        Номер звания в серверной статистике
*/
native void League_TakeClientRankReward(int iClient, int iRank);

/**
*    Отправит игроку в чат указанное сообщение
*    Поддерживаются цвета из include csgo_colors (если игра CSGO) и colors (в случае любой другой игры)
*
*    @param iClient        Индекс игрока
*    @param sText        Текст
*/
[CENTER]native int League_PrintToChat(int iClient, char[] sText);


Обновлений плагина с 99% вероятностью более не будет, однако я продолжу поддерживать его работоспособное состояние с обновлениями СМ.
upd.
Кто-то вообще использует плагин?
Загрузки постоянно увеличиваются, а обратной связи ноль.
В мыслях сделать большую обнову плагина, чтоб он работал не на костылях, но если эти загрузки - реальные сервера, а не какой-то фантом.


Требования
SourceMod 1.10 и выше
Команды
league_reset_stats - очищает только статистику (таблица league, rank_rewards)
league_reset_items - очищает только предметы (таблица items)
league_reset_all - очищает всю бд
Установка
В databases добавить:
C-подобный:
    "league_core"
    {
        "driver"            "sqlite" //или mysql
        "database"          "league_core"
    }
Автор
Ice_Sochi
Скачивания
960
Просмотры
6,989
Первый выпуск
Обновление
Оценка
5.00 звёзд 4 оценок

Другие ресурсы пользователя Ice_Sochi

Последние обновления

  1. 1.3.3

    *Минимальные правки *Обновление API, в том числе для полноценной работы модуля наград за...
  2. 1.3.2

    *Исправлена недоработка, из-за которой при малом количестве привилегий плагин мог работать...
  3. 1.3.1

    Конфиги переехали в configs/league Добавлена возможность использования предмета командой ->...

Последние отзывы

Отличный плагин, всё нравится
Поставил, игроки радуются)
Плагин прикольный, но нехватает автоматического сброса статистики, после окончания сезона.
Ice_Sochi
Ice_Sochi
Обязательно будет;)
Что то новое на форуме, очень круто, молодец ;)
Сверху Снизу